项目名称:软件项目资源登记平台(resource-platform)
项目定位:面向团队内部的云资源/服务套餐台账管理系统,用于登记每个项目使用了哪些资源、资源的到期时间、负责人信息,并在到期前自动发送邮件提醒,避免资源过期影响业务。
核心价值:
| 层次 | 技术选型 | 版本 |
|---|---|---|
| 前端框架 | Vue 3 (Composition API + <script setup>) |
3.4.21 |
| 构建工具 | Vite | 5.1.6 |
| UI 组件库 | Element Plus | 2.6.1 |
| 状态管理 | Pinia | 2.1.7 |
| HTTP 客户端 | Axios | 1.6.8 |
| 路由 | Vue Router 4 | 4.3.0 |
| 后端框架 | Spring Boot 3 | 3.2.5 |
| 编程语言 | Java | 17 |
| ORM 框架 | MyBatis-Plus | 3.5.5 |
| 安全框架 | Spring Security + JWT (jjwt) | 0.11.5 |
| 数据库 | MySQL | 8.0+ |
| 邮件 | Spring Boot Starter Mail | — |
| Excel导出 | Alibaba EasyExcel | 3.3.2 |
| 参数校验 | Jakarta Validation (Spring Boot Starter Validation) | — |
| 工具库 | Lombok、Day.js | — |
┌─────────────────────────────────────────────────────────────┐
│ 浏览器 (前端) │
│ Vue 3 + Element Plus + Pinia + Vue Router + Axios │
│ ┌──────────┬──────────┬──────────┬──────────┬───────────┐ │
│ │ 工作台 │ 资源管理 │ 项目管理 │ 费用统计 │ 系统管理 │ │
│ └──────────┴──────────┴──────────┴──────────┴───────────┘ │
└──────────────────────────┬──────────────────────────────────┘
│ HTTP (REST API + JWT)
▼
┌─────────────────────────────────────────────────────────────┐
│ Spring Boot 后端 (:8080/api) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Controller 层 (REST 接口) │ │
│ │ AuthController · ResourceController · ProjectController │
│ │ DashboardController · UserController · OperationLogController │
│ │ ResourceTypeController · ProviderController │ │
│ └──────────────────────┬───────────────────────────────┘ │
│ ┌──────────────────────▼───────────────────────────────┐ │
│ │ Service 层 (业务逻辑) │ │
│ │ ResourceService · ProjectService · DashboardService │ │
│ │ SysUserService · OperationLogService · EmailService │ │
│ │ ResourceTypeService · ProviderService │ │
│ └──────────────────────┬───────────────────────────────┘ │
│ ┌──────────────────────▼───────────────────────────────┐ │
│ │ Mapper 层 (MyBatis-Plus DAO) │ │
│ └──────────────────────┬───────────────────────────────┘ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Security: JwtAuthenticationFilter + SecurityConfig │ │
│ │ Task: ResourceExpireTask (定时到期扫描 + 邮件提醒) │ │
│ │ Common: Result / BusinessException / GlobalExceptionHandler │
│ └──────────────────────────────────────────────────────┘ │
└──────────────────────────┬──────────────────────────────────┘
│ JDBC
▼
┌─────────────────────────────────────────────────────────────┐
│ MySQL 8.0 数据库 │
│ resource_platform (8张表) │
└─────────────────────────────────────────────────────────────┘
/apilocalStorage,通过 Axios 拦截器自动附加到 Authorization: Bearer <token> 请求头{ code: 200, message: "success", data: ... }code !== 200 的业务错误和 HTTP 状态码错误responseType: 'blob' 直接下载前端 (Vite dev / dist 静态文件)
├── 开发环境: vite.config.js 代理 /api → localhost:8080
└── 生产环境: Nginx 反向代理
后端 (Spring Boot JAR)
├── 端口: 8080
├── 上下文路径: /api
└── 数据库: 阿里云 RDS MySQL
sys_user (用户表)
│
├──< project (项目表) [owner_id → sys_user.id]
│ │
│ └──< project_resource (关联表) [project_id → project.id]
│ │
│ └──> resource (资源表) [resource_id → resource.id]
│ │
│ ├──> resource_type (类型字典) [type_id → resource_type.id]
│ ├──> provider (服务商字典) [provider_id → provider.id]
│ └──< expire_notify_log (提醒记录) [resource_id → resource.id]
│
└──< operation_log (操作日志) [user_id → sys_user.id]
| 表名 | 说明 | 核心字段 | 特殊设计 |
|---|---|---|---|
sys_user |
系统用户表 | username(唯一), password(BCrypt加密), real_name, email, role(1管理员/2普通), status | 无逻辑删除 |
resource_type |
资源类型字典表 | name(唯一), sort(排序), remark | 可扩展字典,用户自行维护 |
provider |
服务商字典表 | name(唯一), remark | 可扩展字典 |
project |
项目表 | name, owner_id, status(1进行中/0已下线), remark | 逻辑删除(deleted字段) |
resource |
资源表(核心) | name, type_id, provider_id, account_info, start_date, expire_date, cost, cost_cycle, owner_id, status | 逻辑删除;status 自动刷新 |
project_resource |
项目资源关联表 | project_id, resource_id (联合唯一) | 多对多关系中间表 |
expire_notify_log |
到期提醒记录 | resource_id, notify_stage(1提前30天/2提前7天/3已过期), notify_email | resource_id+notify_stage 唯一约束,防重复发送 |
operation_log |
操作日志表 | user_id, module, action, target_id, content | 记录关键业务操作 |
admin / admin123(BCrypt 加密存储)security + AuthController)功能:
AuthenticationManager 校验账号密码,成功后生成 JWT Token 返回JwtUtil 负责生成和解析 Token,载荷存储 userId 和 usernameJwtAuthenticationFilter 拦截每个请求,从 Authorization 头提取并验证 Token,设置 SecurityContext/auth/me 接口,前端刷新页面后通过 Token 换取用户信息/auth/password 接口,校验原密码后更新权限控制(SecurityConfig):
/auth/login:公开访问,无需认证/user/enabled-list:所有已登录用户可访问(负责人下拉选择使用)/user/**:仅 ROLE_ADMIN(管理员)可访问ResourceController + ResourceServiceImpl)功能:
GET /resource/page:支持按名称模糊搜索、类型、服务商、负责人、状态、到期天数范围、关联项目 ID 多维度筛选GET /resource/{id}:返回资源完整信息,含关联项目列表POST /resource:保存资源基本信息,同时维护项目关联关系(先删后插策略保证数据一致性)DELETE /resource/{id}:逻辑删除资源,同时清理关联关系POST /resource/relate:从项目详情页批量关联资源DELETE /resource/unrelate:解除项目与资源的关联GET /resource/cost-stat/project 和 /cost-stat/type:按项目和按资源类型两个维度统计费用GET /resource/export:使用 EasyExcel 将查询结果导出为 .xlsx 文件核心设计:
assembleVOList),收集所有关联 ID 后批量查询类型/服务商/负责人/项目名称,避免 N+1 查询问题ProjectController + ProjectServiceImpl)功能:
GET /project/page:支持按名称、负责人、状态筛选,列表展示关联资源数量GET /project/{id}:返回项目信息及其关联的全部资源列表POST /projectDELETE /project/{id}:逻辑删除项目,同时清理关联关系GET /project/active-list:供资源表单中"关联项目"多选下拉使用DashboardController + DashboardServiceImpl)功能:
ResourceTypeController + ProviderController)功能:
UserController + SysUserServiceImpl)功能(仅管理员可操作):
GET /user/listGET /user/enabled-list(所有登录用户可用,用于负责人选择)POST /user:新增必须设置初始密码,编辑时密码非必填DELETE /user/{id}OperationLogController + OperationLogServiceImpl)功能:
GET /operation-log/page:按时间倒序ResourceExpireTask)功能:
refreshExpireStatus)
expire_notify_log 唯一约束确保每个资源每个阶段只发送一次common)| 类 | 功能 |
|---|---|
Result<T> |
统一 API 响应结构 {code, message, data} |
BusinessException |
业务异常,携带错误信息 |
GlobalExceptionHandler |
全局异常处理器,捕获 BusinessException、参数校验异常、认证异常等,统一返回错误响应 |
PageQuery |
分页查询基类 (pageNum, pageSize) |
| 路径 | 页面 | 说明 | 权限 |
|---|---|---|---|
/login |
Login.vue | 登录页 | 公开 |
/dashboard |
Dashboard.vue | 工作台(默认首页) | 登录用户 |
/resource |
ResourceList.vue | 资源列表 | 登录用户 |
/project |
ProjectList.vue | 项目列表 | 登录用户 |
/project/:id |
ProjectDetail.vue | 项目详情 | 登录用户 |
/cost-stat |
CostStat.vue | 费用统计 | 登录用户 |
/dict |
DictManage.vue | 字典管理(资源类型+服务商) | 登录用户 |
/user |
UserManage.vue | 用户管理 | 仅管理员 |
/log |
OperationLog.vue | 操作日志 | 登录用户 |
路由守卫:未登录用户自动跳转登录页(携带 redirect 参数),已登录用户访问登录页自动跳转工作台。
/auth/login 获取 TokenUser Store (store/user.js):
token:JWT Token(持久化到 localStorage)userInfo:当前用户信息(id, username, realName, role)login():登录并保存 TokenfetchMe():通过 Token 获取用户信息isAdmin():判断是否为管理员clearToken():清除登录状态| 文件 | 接口 |
|---|---|
api/auth.js |
loginApi, getMeApi, updatePasswordApi |
api/dashboard.js |
dashboardApi |
api/resource.js |
resourcePageApi, resourceDetailApi, resourceSaveApi, resourceDeleteApi, resourceRelateApi, resourceUnrelateApi, costStatByProjectApi, costStatByTypeApi, resourceExportApi |
api/project.js |
projectPageApi, projectDetailApi, projectSaveApi, projectDeleteApi, projectActiveListApi |
api/dict.js |
resourceTypeListApi, resourceTypeSaveApi, resourceTypeDeleteApi, providerListApi, providerSaveApi, providerDeleteApi |
api/user.js |
userListApi, userEnabledListApi, userSaveApi, userDeleteApi |
api/log.js |
operationLogPageApi |
| 方法 | 路径 | 说明 | 权限 |
|---|---|---|---|
| POST | /auth/login |
用户登录 | 公开 |
| PUT | /auth/password |
修改密码 | 登录用户 |
| GET | /auth/me |
获取当前用户信息 | 登录用户 |
| GET | /dashboard |
工作台数据 | 登录用户 |
| GET | /resource/page |
资源分页查询 | 登录用户 |
| GET | /resource/{id} |
资源详情 | 登录用户 |
| POST | /resource |
新增/编辑资源 | 登录用户 |
| DELETE | /resource/{id} |
删除资源 | 登录用户 |
| POST | /resource/relate |
关联资源到项目 | 登录用户 |
| DELETE | /resource/unrelate |
解除资源关联 | 登录用户 |
| GET | /resource/cost-stat/project |
按项目费用统计 | 登录用户 |
| GET | /resource/cost-stat/type |
按类型费用统计 | 登录用户 |
| GET | /resource/export |
导出 Excel | 登录用户 |
| GET | /project/page |
项目分页查询 | 登录用户 |
| GET | /project/{id} |
项目详情 | 登录用户 |
| POST | /project |
新增/编辑项目 | 登录用户 |
| DELETE | /project/{id} |
删除项目 | 登录用户 |
| GET | /project/active-list |
活跃项目列表 | 登录用户 |
| GET | /resource-type/list |
资源类型列表 | 登录用户 |
| POST | /resource-type |
新增/编辑类型 | 登录用户 |
| DELETE | /resource-type/{id} |
删除类型 | 登录用户 |
| GET | /provider/list |
服务商列表 | 登录用户 |
| POST | /provider |
新增/编辑服务商 | 登录用户 |
| DELETE | /provider/{id} |
删除服务商 | 登录用户 |
| GET | /user/list |
用户列表 | 管理员 |
| GET | /user/enabled-list |
启用用户列表 | 登录用户 |
| POST | /user |
新增/编辑用户 | 管理员 |
| DELETE | /user/{id} |
删除用户 | 管理员 |
| GET | /operation-log/page |
操作日志分页 | 登录用户 |