一个基于 Spring Boot + Vue 3 + CNB 的家庭资产管理平台,支持资产扫描发现、端口监控和服务部署清单管理。
home-asset-manager/ ├── home-asset-manager-backend/ # Spring Boot 后端 │ ├── src/main/java/com/homeasset/ │ │ ├── controller/ # 控制器层 │ │ ├── service/ # 服务层 │ │ ├── mapper/ # 数据访问层 │ │ ├── entity/ # 实体类 │ │ ├── dto/ # 数据传输对象 │ │ ├── config/ # 配置类 │ │ ├── scanner/ # 扫描器 │ │ └── handler/ # 全局异常处理 │ ├── src/main/resources/ │ │ └── application.yml # 应用配置 │ ├── pom.xml # Maven 配置 │ └── Dockerfile # 后端镜像构建 │ ├── home-asset-manager-frontend/ # Vue 3 前端 │ ├── src/ │ │ ├── api/ # API 请求 │ │ ├── components/ # 公共组件 │ │ ├── views/ # 页面视图 │ │ ├── router/ # 路由配置 │ │ ├── stores/ # Pinia 状态管理 │ │ ├── types/ # TypeScript 类型 │ │ └── utils/ # 工具函数 │ ├── package.json # npm 配置 │ ├── vite.config.ts # Vite 配置 │ └── Dockerfile # 前端镜像构建 │ ├── docker-compose.yml # 本地开发环境 ├── .cnb.yml # CNB 构建配置 ├── schema.sql # 数据库初始化脚本 ├── .gitignore # Git 忽略规则 └── README.md # 项目文档
git clone <repository-url>
cd home-asset-manager
docker-compose up -d
mysql -u root -p < schema.sql
cd home-asset-manager-backend
修改配置文件 src/main/resources/application.yml(配置公共中间件地址)
运行后端:
mvn spring-boot:run
cd home-asset-manager-frontend
npm install
npm run dev
npm run build
项目使用以下公共中间件(需要配置访问权限):
| 中间件 | 地址 | 用途 |
|---|---|---|
| MySQL | 192.168.5.66:3306 | 关系型数据库 |
| Redis | 192.168.5.66:6379 | 缓存数据库 |
| MinIO | 192.168.5.66:9000 | 对象存储 |
在 application.yml 或环境变量中配置:
spring:
datasource:
url: jdbc:mysql://192.168.5.66:3306/home_asset_manager
username: root
password: password
redis:
host: 192.168.5.66
port: 6379
password: password
minio:
endpoint: http://192.168.5.66:9000
access-key: minioadmin
secret-key: minioadmin123
code-channelhome-asset-managergit config --local user.name cool.cnb
git config --local user.email "WyCMvfISebPSRhNfPflU92+cool.cnb@noreply.cnb.cool"
git remote add origin https://cnb.cool/code-channel/home-asset-manager.git
git add .
git commit -m "初始化项目"
git push -u origin master
CNB 会自动注入以下环境变量:
CNB_DOCKER_REGISTRY - Docker 仓库地址(docker.cnb.cool)CNB_REPO_SLUG_LOWERCASE - 仓库路径CI_COMMIT_SHORT_SHA - Git 提交短哈希在密钥仓库 code-channel/secret 创建配置文件:
kuboard-cicd-home-asset-manager.ymlPOST /api/assets/scan - 扫描网络资产GET /api/assets - 获取所有资产GET /api/assets/online - 获取在线资产GET /api/assets/offline - 获取离线资产PUT /api/assets/{id} - 更新资产信息DELETE /api/assets/{id} - 删除资产GET /api/assets/statistics - 获取资产统计POST /api/scan/ports/{ip} - 扫描指定 IP 的端口GET /api/scan/ports/{ip} - 获取指定 IP 的端口信息GET /api/scan/ports - 获取所有开放端口POST /api/scan/docker - 扫描 Docker 容器GET /api/scan/docker - 获取所有容器GET /api/scan/docker/running - 获取运行中的容器GET /api/services - 获取所有服务POST /api/services - 创建服务PUT /api/services/{id} - 更新服务DELETE /api/services/{id} - 删除服务GET /api/services/statistics - 获取服务统计分层结构
统一响应格式
Result<Asset> result = Result.success(asset);
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public Result<?> handleException(Exception e) {
return Result.error(500, e.getMessage());
}
}
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import { getAssets } from '@/api/asset'
const assets = ref<Asset[]>([])
onMounted(async () => {
assets.value = await getAssets()
})
</script>
import request from '@/utils/request'
export const getAssets = () => {
return request<Asset[]>({
url: '/assets',
method: 'get'
})
}
export const useAppStore = defineStore('app', () => {
const loading = ref(false)
const setLoading = (value: boolean) => {
loading.value = value
}
return { loading, setLoading }
})
MIT License