init: apes-Authon-history — 剥离历史与源码分析归档
- docs/: 源码分析报告、代码深度解析、项目说明书、独立服务化方案 - backend/: 账权模块提取说明(提取原则、文件清单、耦合度验证) - frontend/: 前端剥离方案、剥离历史与说明、框架修改详情
This commit is contained in:
@@ -0,0 +1,133 @@
|
||||
# apes-Authon-history — 剥离历史与源码分析归档
|
||||
|
||||
> 本仓库归档了 apes-Authon 账权独立服务平台从单体应用中剥离的完整过程、分析报告和方案文档。
|
||||
> 供源码更新时参考,持续优化前后端代码和文档。
|
||||
|
||||
## 仓库定位
|
||||
|
||||
| 仓库 | 说明 | 地址 |
|
||||
|------|------|------|
|
||||
| apes-Authon-Server | 后端账权服务 | https://gitea.apescale.com/apes-Authon/apes-Authon-Server |
|
||||
| apes-Authon-Web | 前端账权管理 | https://gitea.apescale.com/apes-Authon/apes-Authon-Web |
|
||||
| **apes-Authon-history** | **本仓库 — 剥离历史与分析归档** | https://gitea.apescale.com/apes-Authon/apes-Authon-history |
|
||||
|
||||
## 目录结构
|
||||
|
||||
```
|
||||
apes-Authon-history/
|
||||
├── README.md # 本文件
|
||||
├── docs/ # 源码分析与方案文档
|
||||
│ ├── saas-service深度分析报告.md # 后端单体应用深度分析(33000 字)
|
||||
│ ├── 代码深度解析与分析过程.md # 代码解析过程记录(27000 字)
|
||||
│ ├── 账权平台-项目说明书.html # 原项目完整说明书(HTML)
|
||||
│ └── 账权模块独立服务化方案.html # 独立服务化可行性分析与方案(HTML)
|
||||
├── backend/ # 后端剥离文档
|
||||
│ └── 账权模块提取说明.md # 提取原则、文件清单、耦合度验证、路线图
|
||||
└── frontend/ # 前端剥离文档
|
||||
├── apes-Authon-Web-剥离方案.md # 剥离方案(计划文档)
|
||||
├── apes-Authon-Web-剥离方案.html # 剥离方案(HTML 版)
|
||||
└── 剥离历史与说明.md # 剥离执行记录、变更明细、框架修改说明
|
||||
```
|
||||
|
||||
## 文档索引
|
||||
|
||||
### 源码分析
|
||||
|
||||
| 文档 | 内容概述 |
|
||||
|------|---------|
|
||||
| [saas-service深度分析报告](docs/saas-service深度分析报告.md) | 后端单体应用的完整深度分析:项目结构、技术栈、核心模块(认证/授权/多租户/SSO/数据同步/LLM)、数据库设计、API 清单、配置体系 |
|
||||
| [代码深度解析与分析过程](docs/代码深度解析与分析过程.md) | 代码解析过程记录:AuthContext 工作机制、@Login AOP 切面、多租户数据源切换、伙伴云 SSO 集成、LLM Agent 架构 |
|
||||
| [账权平台-项目说明书](docs/账权平台-项目说明书.html) | 原项目说明书(HTML 格式):功能模块、技术架构、部署方式、数据库 ER 图 |
|
||||
| [账权模块独立服务化方案](docs/账权模块独立服务化方案.html) | 独立服务化可行性分析:耦合度评估、剥离策略、技术路线、风险评估 |
|
||||
|
||||
### 后端剥离
|
||||
|
||||
| 文档 | 内容概述 |
|
||||
|------|---------|
|
||||
| [账权模块提取说明](backend/账权模块提取说明.md) | 提取原则(纯账权/零业务/保留包名/保留依赖)、124 个文件清单(11 Controller + 23 Entity + 7 Service + 23 Mapper)、外部依赖分析、耦合度验证结论、后续路线图 |
|
||||
|
||||
### 前端剥离
|
||||
|
||||
| 文档 | 内容概述 |
|
||||
|------|---------|
|
||||
| [apes-Authon-Web-剥离方案](frontend/apes-Authon-Web-剥离方案.md) | 剥离前的计划文档:保留/删除/修改清单、页面耦合度分析、框架文件修改方案 |
|
||||
| [apes-Authon-Web-剥离方案](frontend/apes-Authon-Web-剥离方案.html) | 同上(HTML 格式) |
|
||||
| [剥离历史与说明](frontend/剥离历史与说明.md) | 剥离执行记录:176 文件变更(+222/-60093)、11 个框架文件修改详情、业务引用清理表、构建验证结果 |
|
||||
|
||||
## 剥离概述
|
||||
|
||||
### 后端 (apes-Authon-Server)
|
||||
|
||||
从 `saas-service` 单体应用中提取纯净账权模块,经过 4 个阶段完成:
|
||||
|
||||
| 阶段 | 目标 | 关键工作 |
|
||||
|------|------|---------|
|
||||
| Phase 1 | apes-commons 内联 | 反推 8 个核心类(AuthContext / @Login / LoginAspect / Res / DbEntity 等),移除外部 JAR 依赖 |
|
||||
| Phase 2 | 包名重构 | `cn.apes.cloud` → `cn.apes.authon` 全局包名重构,零残留 |
|
||||
| Phase 3 | 编译验证 | 124 个源文件编译通过,Lombok 1.18.40 + compiler-plugin 3.13.0 兼容 Java 24 |
|
||||
| Phase 4 | 提交推送 | 最终版本推送到 Gitea |
|
||||
|
||||
**提取结果**:11 Controller + 23 Entity + 12 DTO + 3 VO + 7 Service + 18 ServiceImpl + 23 Mapper + 5 Config + 1 Filter + 2 Util + 8 commons 内联 = 124 个 Java 文件
|
||||
|
||||
**耦合度验证**:
|
||||
- 业务 Service → 账权 Service 直接调用:**0 个**
|
||||
- 业务 Controller → 账权 Controller 直接调用:**0 个**
|
||||
- 账权 Service → 业务 Mapper 直接调用:**0 个**
|
||||
- 唯一交叉引用:`CustomerInfoServiceImpl` → huoban DTO 包(11 个纯 DTO,无业务逻辑)
|
||||
|
||||
### 前端 (apes-Authon-Web)
|
||||
|
||||
从 `saas-web` 单体前端中剥离纯净账权页面:
|
||||
|
||||
| 指标 | 数值 |
|
||||
|------|------|
|
||||
| 保留页面 | 40 个(24 账权 + 9 系统配置 + 7 AI 工具) |
|
||||
| 删除页面 | ~82 个业务页面 |
|
||||
| 代码变更 | +222 / -60093(净减约 6 万行) |
|
||||
| 修改框架文件 | 11 个 |
|
||||
| 构建状态 | 通过(`npm run build:prod`) |
|
||||
|
||||
## 如何使用本仓库
|
||||
|
||||
### 场景 1:源码更新后同步优化
|
||||
|
||||
当源码(单体应用)有更新时,按以下流程操作:
|
||||
|
||||
1. **分析变更**:对比源码最新版本与本仓库归档的分析文档,识别新增/修改的账权相关代码
|
||||
2. **评估影响**:参照 [账权模块提取说明](backend/账权模块提取说明.md) 中的提取原则和文件清单,判断变更是否属于账权范畴
|
||||
3. **同步代码**:将确认的变更同步到 [apes-Authon-Server](https://gitea.apescale.com/apes-Authon/apes-Authon-Server) 或 [apes-Authon-Web](https://gitea.apescale.com/apes-Authon/apes-Authon-Web)
|
||||
4. **更新文档**:如有结构性变更,更新本仓库的分析文档
|
||||
|
||||
### 场景 2:理解架构设计
|
||||
|
||||
新开发者可通过以下顺序阅读文档快速理解系统:
|
||||
|
||||
1. [账权平台-项目说明书](docs/账权平台-项目说明书.html) — 了解原项目全貌
|
||||
2. [saas-service深度分析报告](docs/saas-service深度分析报告.md) — 理解后端架构
|
||||
3. [账权模块独立服务化方案](docs/账权模块独立服务化方案.html) — 理解为什么要剥离
|
||||
4. [账权模块提取说明](backend/账权模块提取说明.md) — 理解后端怎么剥离的
|
||||
5. [前端剥离方案](frontend/apes-Authon-Web-剥离方案.md) — 理解前端怎么剥离的
|
||||
6. [剥离历史与说明](frontend/剥离历史与说明.md) — 理解前端具体改了什么
|
||||
|
||||
### 场景 3:扩展新模块
|
||||
|
||||
参照 [代码深度解析与分析过程](docs/代码深度解析与分析过程.md) 中的架构说明,理解以下核心机制后再进行扩展:
|
||||
|
||||
- **AuthContext + @Login AOP**:认证上下文的传递机制
|
||||
- **@TenantSource 动态数据源**:多租户数据源切换
|
||||
- **SSO 集成**:伙伴云单点登录的 Token 交换流程
|
||||
- **动态路由**:前端菜单 → 路由 → 组件的映射机制
|
||||
|
||||
## 后续路线图
|
||||
|
||||
| 阶段 | 目标 | 状态 |
|
||||
|------|------|------|
|
||||
| Phase 5A | AI 助手/LLM 模块后端提取(~54 Java 文件) | 待办 |
|
||||
| Phase 5B | 系统配置页面补充 | 基本完成 |
|
||||
| Phase 5C | 伙伴云表单配置模块提取 | 待办 |
|
||||
| Phase 6 | SDK 化 — AuthContext 转为远程可调用 SDK | 待设计 |
|
||||
| Phase 7 | 网关集成 — API 网关注入请求头替代 ThreadLocal | 待设计 |
|
||||
|
||||
## License
|
||||
|
||||
MIT
|
||||
@@ -0,0 +1,144 @@
|
||||
# 账权模块提取说明
|
||||
|
||||
> 提取日期:2026-08-09
|
||||
> 源仓库:apes-Authdata (saas-service)
|
||||
> 目标仓库:apes-Authon
|
||||
|
||||
## 一、提取原则
|
||||
|
||||
1. **纯账权逻辑**:只提取认证、授权、用户、角色、菜单、权限、多租户、套餐、配额、SSO、操作日志相关的代码
|
||||
2. **零业务代码**:不包含溯源(Trace*)、称重(Weight*)、水肥(Fei*)、巡检(Inspection*)、维修(Repair*)、农大同步(Nongda*)、LLM Agent 等任何业务逻辑
|
||||
3. **保留包名**:暂保留 `cn.apes.cloud` 包名以最小化改动,后续 Phase 2 再统一重构为 `cn.apes.authon`
|
||||
4. **保留依赖**:`apes-commons` 外部 JAR 作为核心依赖保留,提供 AuthContext / @Login / Res / DbEntity 等基础设施
|
||||
|
||||
## 二、提取文件清单
|
||||
|
||||
### Controller(11 个)
|
||||
|
||||
| 文件 | 核心功能 |
|
||||
|------|---------|
|
||||
| UserController | 密码登录、注册、改密、用户CRUD、企业认证、多企业切换 |
|
||||
| PermissionController | 菜单树、权限码、角色CRUD、角色权限分配、成员角色管理 |
|
||||
| AccessTokenController | 外部 API Token 的创建/查询/撤销/启用/重新生成 |
|
||||
| CustomerController | 客户/企业CRUD、员工管理、应用关联、SSO配置 |
|
||||
| CustomerPackageController | 客户套餐管理、配额管理、延期申请 |
|
||||
| AppController | 应用CRUD、应用详情(含菜单+权限+关联客户) |
|
||||
| SysOrganizationController | 组织架构CRUD、组织树 |
|
||||
| SysPackagePlanController | 套餐方案CRUD、套餐权限分配 |
|
||||
| SysQuotaController | 配额模板CRUD |
|
||||
| SysOperationLogController | 操作日志查询 |
|
||||
| UserPreferenceController | 用户偏好(UI尺寸)查询/更新 |
|
||||
|
||||
### Entity(23 个)
|
||||
|
||||
UserInfo, SysRole, SysMenu, SysPermission, SysRolePermission, SysMemberRole, SysAccessToken, CustomerInfo, CustomerUser, CustomerApp, CustomerPackage, CustomerPackageQuota, CustomerPackageExtendApply, CustomerQuotaChangeLog, SsoConfig, SysOrganization, SysPackagePlan, SysPackagePlanPermission, SysPackagePlanQuota, SysQuota, UserPreference, SysOperationLog, AppInfo
|
||||
|
||||
### Service 接口(6 个)
|
||||
|
||||
CustomerPackageService, SysAccessTokenService, SysOperationLogService, SysPackagePlanQuotaService, SysPackagePlanService, SysQuotaService
|
||||
|
||||
### Service 实现(16 个)
|
||||
|
||||
PermissionServiceImpl, UserInfoServiceImpl, SysAccessTokenServiceImpl, SsoServiceImpl, Sso2ServiceImpl, CustomerUserServiceImpl, CustomerInfoServiceImpl, CustomerAppServiceImpl, SysOrganizationServiceImpl, SysPackagePlanServiceImpl, CustomerPackageServiceImpl, SysQuotaServiceImpl, SysPackagePlanQuotaServiceImpl, UserPreferenceServiceImpl, SysOperationLogServiceImpl, AppInfoServiceImpl
|
||||
|
||||
### Mapper(23 个)
|
||||
|
||||
对应每个 Entity 各一个 Mapper。
|
||||
|
||||
### Config(5 个)
|
||||
|
||||
| 文件 | 说明 |
|
||||
|------|------|
|
||||
| AccessTokenFilterConfig | 注册 AccessTokenFilter(order=1,拦截 /*) |
|
||||
| DataSourceHeaderAspect | @TenantSource AOP 切面,多租户数据源切换 |
|
||||
| TenantSource | @TenantSource 注解定义 |
|
||||
| HbTokenContext | 伙伴云 Token 的 ThreadLocal 上下文 |
|
||||
| SiteConfig | 站点配置(支付域名、Cookie域名) |
|
||||
|
||||
### Filter(1 个)
|
||||
|
||||
AccessTokenFilter — 外部 API 鉴权(X-Access-Token / Bearer)
|
||||
|
||||
### Util(2 个)
|
||||
|
||||
| 文件 | 说明 |
|
||||
|------|------|
|
||||
| OperationLogUtil | 操作日志工具(@PostConstruct 抓 bean + AuthContext 获取操作人) |
|
||||
| RsaUtil | RSA 加解密(密码加密/解密) |
|
||||
|
||||
### DTO/VO(15 个)
|
||||
|
||||
LoginDTO, RegisterDTO, PwdDTO, UserSearchDTO, RoleSearchDTO, SysRoleDTO, CustomerSearchDTO, EnterpriseCertifyDTO, SelectCustomerDTO, PageDTO, RelationDTO, AppSearchDTO, CustomerPackageVO, CustomerPackageExtendApplyVO, CustomerAppVO
|
||||
|
||||
### Huoban DTO(11 个)
|
||||
|
||||
UpsertOne, DataCreate, DataUpdate, DataFilter, DataFilterCondition, DataUpsert, BulkDel, TableSub, TableColumn, TableInfo, CategoryConfig — 伙伴云 API 请求/响应模型,被 CustomerInfoServiceImpl 用于同步客户数据到伙伴云
|
||||
|
||||
## 三、未提取的文件(排除原因)
|
||||
|
||||
| 文件 | 排除原因 |
|
||||
|------|---------|
|
||||
| CustomerUiConfigServiceImpl | 依赖 `cn.apes.cloud.domain.weight.CustomerUiConfig`(weight 业务包) |
|
||||
| CommonController | 混合业务(文件上传等),非纯账权 |
|
||||
| WeightController | 称重业务 |
|
||||
| TrackingConfigController | 追踪配置业务 |
|
||||
| 所有 Trace*/Weight*/Fei*/Llm*/Nongda* 文件 | 业务模块 |
|
||||
| RedissonConfiguration | 通用配置,需按实际部署环境重新配置 |
|
||||
| MybatisPlusConfig | 通用配置,需按实际部署环境重新配置 |
|
||||
| OssConfiguration | OSS 配置,账权服务不需要 |
|
||||
| WebSocketConfig | WebSocket 配置,账权服务不需要 |
|
||||
| RestTemplateConfiguration | HTTP 客户端配置,按需添加 |
|
||||
| SchedulingConfig | 定时任务配置,按需添加 |
|
||||
| JacksonAutoConfiguration | Jackson 配置,Spring Boot 自动配置 |
|
||||
|
||||
## 四、外部依赖分析
|
||||
|
||||
### apes-commons 0.0.7-SNAPSHOT
|
||||
|
||||
提供以下核心类(全部为接口级别依赖,无源码):
|
||||
|
||||
```
|
||||
cn.apes.commons.Res → 统一 API 响应包装
|
||||
cn.apes.commons.auth.AuthContext → ThreadLocal 认证上下文
|
||||
cn.apes.commons.auth.Login → @Login 注解(方法级,AOP 自动注入)
|
||||
cn.apes.commons.auth.LoginUser → 登录用户信息
|
||||
cn.apes.commons.auth.LoginCustomer → 登录客户/企业信息
|
||||
cn.apes.commons.auth.UserSession → 会话对象(user + customer)
|
||||
cn.apes.commons.domain.DbEntity → 基础实体(id/createTime/updateTime/isDel)
|
||||
```
|
||||
|
||||
### 第三方依赖
|
||||
|
||||
| 依赖 | 用途 |
|
||||
|------|------|
|
||||
| spring-boot-starter-web | REST API |
|
||||
| spring-boot-starter-aop | @TenantSource 切面 / @Login AOP |
|
||||
| spring-boot-starter-data-redis | Redis 会话管理 |
|
||||
| mybatis-plus-boot-starter | ORM |
|
||||
| dynamic-datasource-spring-boot-starter | 多租户数据源 |
|
||||
| mysql-connector-java | MySQL 驱动 |
|
||||
| lombok | 简化代码 |
|
||||
| hutool-all | 通用工具(HMAC 签名、HTTP 调用等) |
|
||||
| redisson | Redis 客户端 |
|
||||
| fastjson | JSON 序列化 |
|
||||
|
||||
## 五、耦合度验证
|
||||
|
||||
提取过程中验证了以下耦合点:
|
||||
|
||||
1. **业务 Service → 账权 Service 直接调用:0 个** ✅
|
||||
2. **业务 Controller → 账权 Controller 直接调用:0 个** ✅
|
||||
3. **账权 Service → 业务 Mapper 直接调用:0 个** ✅
|
||||
4. **唯一的业务包交叉引用**:`CustomerInfoServiceImpl` → `cn.apes.cloud.domain.huoban.UpsertOne`
|
||||
- 解决方案:将 huoban DTO 包一起提取(11 个纯 DTO 文件,无业务逻辑)
|
||||
5. **外部 JAR 依赖**:`apes-commons` 提供 AuthContext 等核心类
|
||||
- 解决方案:保留为 Maven 依赖,后续 Phase 3 改造为 SDK
|
||||
|
||||
## 六、后续路线图
|
||||
|
||||
| 阶段 | 目标 | 状态 |
|
||||
|------|------|------|
|
||||
| Phase 1 | 验证编译通过 | 待执行 |
|
||||
| Phase 2 | 包名重构 cn.apes.cloud → cn.apes.authon | 待启动 |
|
||||
| Phase 3 | SDK 化(AuthContext → 远程调用) | 待设计 |
|
||||
| Phase 4 | 网关集成(ThreadLocal → HTTP Header) | 待设计 |
|
||||
@@ -0,0 +1,627 @@
|
||||
# saas-service 项目源代码深度分析报告
|
||||
|
||||
## 一、项目基本信息
|
||||
|
||||
| 项目属性 | 值 |
|
||||
|---------|---|
|
||||
| GroupId | `cn.apes` |
|
||||
| ArtifactId | `saas-service` |
|
||||
| 版本 | `1.0.0-SNAPSHOT` |
|
||||
| 描述 | 账权用户服务 |
|
||||
| Java 版本 | 11 |
|
||||
| Spring Boot 版本 | 2.2.1.RELEASE |
|
||||
| MyBatis Plus 版本 | 3.5.7 |
|
||||
| 动态数据源版本 | dynamic-datasource-spring-boot-starter 3.6.1 |
|
||||
| Redisson 版本 | 3.35.0 |
|
||||
| 主启动类 | `cn.apes.CloudApplication` |
|
||||
| 项目路径 | `/tmp/project-analysis/service-master` |
|
||||
|
||||
### 主启动类代码
|
||||
|
||||
**文件路径**: `src/main/java/cn/apes/CloudApplication.java`
|
||||
|
||||
```java
|
||||
@EnableAsync
|
||||
@SpringBootApplication
|
||||
@EnableScheduling
|
||||
public class CloudApplication {
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(CloudApplication.class, args);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
启动类启用了三个关键注解:`@EnableAsync`(异步任务)、`@SpringBootApplication`(Spring Boot 自动配置)、`@EnableScheduling`(定时任务)。
|
||||
|
||||
---
|
||||
|
||||
## 二、完整包结构
|
||||
|
||||
项目根包为 `cn.apes.cloud`,目录结构如下:
|
||||
|
||||
```
|
||||
cn.apes.cloud
|
||||
|-- config/ # 配置类(12个文件)
|
||||
|-- controller/ # REST 控制器(62个文件)
|
||||
| |-- traceability/ # 溯源模块控制器(9个文件)
|
||||
|-- domain/ # 数据模型层
|
||||
| |-- entity/ # 核心实体类(43个文件)
|
||||
| |-- dto/ # 数据传输对象(约35个文件)
|
||||
| |-- vo/ # 视图对象(5个文件)
|
||||
| |-- huoban/ # 伙伴云数据模型(11个文件)
|
||||
| |-- traceability/ # 溯源数据模型(22个文件)
|
||||
| |-- weight/ # 称重数据模型(13个文件)
|
||||
|-- filter/ # 过滤器(1个文件)
|
||||
|-- groovy/ # Groovy 脚本执行引擎(3个文件)
|
||||
|-- mapper/ # MyBatis Mapper 接口(约85个文件)
|
||||
| |-- traceability/ # 溯源 Mapper(20个文件)
|
||||
|-- service/ # 业务逻辑层
|
||||
| |-- impl/ # 服务实现类(约90个文件)
|
||||
| | |-- huoban/ # 伙伴云服务实现(6个文件)
|
||||
|-- task/ # 定时任务(1个文件)
|
||||
|-- util/ # 工具类(2个文件)
|
||||
|-- websocket/ # WebSocket 处理器(1个文件)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 三、主要模块和功能划分
|
||||
|
||||
项目是一个大型 SaaS 多租户后端服务,包含以下核心业务模块:
|
||||
|
||||
### 1. 用户与企业认证模块
|
||||
|
||||
- 用户注册/登录(密码登录、微信小程序登录)
|
||||
- 企业认证(提交/审核/重新提交)
|
||||
- 多企业切换
|
||||
- SSO 单点登录配置
|
||||
- AccessToken 外部 API 鉴权
|
||||
|
||||
### 2. 权限管理模块
|
||||
|
||||
- 菜单管理(多应用菜单树)
|
||||
- 权限管理(按应用分组)
|
||||
- 角色管理(角色 CRUD、角色权限分配)
|
||||
- 成员角色管理(按企业维度)
|
||||
- 套餐权限控制
|
||||
|
||||
### 3. LLM/AI 模块(核心特色)
|
||||
|
||||
- **LLM 厂商配置**(`LlmProviderConfig`):支持多厂商 API Key、BaseUrl 配置
|
||||
- **LLM 模型配置**(`LlmModelConfig`):模型列表管理,支持 chat/embedding/image 类型
|
||||
- **Agent 配置**(`LlmAgentConfig`):System Prompt、User Prompt、输出类型(text/json/markdown)
|
||||
- **多轮对话**(`LlmChatController`/`LlmChatServiceImpl`):支持 Function Calling 工具调用循环
|
||||
- **Groovy 工具执行**(`GroovyExecutorService`):动态编译执行 Groovy 脚本作为 LLM 工具
|
||||
- **Skill 技能系统**(`AiSkill`):将技能内容注入 System Prompt
|
||||
- **对话管理**(`LlmConversation`/`LlmConversationMessage`):会话持久化、消息历史
|
||||
- **调用日志**(`LlmCallLog`/`LlmToolLog`):完整的调用审计和统计
|
||||
- **变量替换**:支持 `{{variable}}` 格式的提示词模板变量替换
|
||||
- **多模态输入**:支持图片 URL 和视频 URL 输入
|
||||
- **ASR 语音识别**(`AsrWebSocketHandler`):WebSocket 代理阿里云实时语音转文字
|
||||
|
||||
### 4. 伙伴云(HuoBan)集成模块
|
||||
|
||||
- 伙伴云 API 代理(表结构同步、数据 CRUD、文件上传)
|
||||
- 伙伴云 SSO 登录
|
||||
- AMIS 低代码页面配置
|
||||
- 伙伴云 V2 API 集成
|
||||
|
||||
### 5. 溯源(Traceability)模块
|
||||
|
||||
- 溯源码管理(生成任务、码列表、绑定/解绑/作废/启用)
|
||||
- 码货绑定(批量导入、未绑定码查询)
|
||||
- 父子码关联
|
||||
- 赋码审计
|
||||
- 废码异常处理
|
||||
- 产品分类管理
|
||||
- 土地管理
|
||||
- 采收批次
|
||||
- 加工记录
|
||||
- 质量检测
|
||||
- 资质管理
|
||||
- 证书管理
|
||||
- 仓库管理(入库/出库/库位平面图/库存)
|
||||
- 物流追踪
|
||||
- 反馈管理
|
||||
- 召回管理
|
||||
- 溯源追踪配置
|
||||
|
||||
### 6. 智慧农业(Fei)模块
|
||||
|
||||
- 园区信息管理(`FeiParkInfo`)
|
||||
- 地块信息管理(`PlotInfo`)
|
||||
- 作物信息管理(`FeiCrop`)
|
||||
- 作物物候期管理(`FeiCropPhenology`)
|
||||
- 农事计划管理(`FeiFarmPlan`)
|
||||
- 施肥配方管理(`FeiFertilizationFormula`)
|
||||
- 灌溉计划管理(`FeiIrrigationPlan`)
|
||||
- 灌溉计划执行记录(`FeiIrrigationPlanExec`)
|
||||
- 电磁阀管理(`FeiSolenoidValve`)
|
||||
- 电磁阀操作日志(`FeiSolenoidValveLog`)
|
||||
- 投入品管理(`FeiInputMaterial`)
|
||||
- 投入品库存日志(`FeiInputMaterialStockLog`)
|
||||
- 水肥一体机设备管理(`FeiFertigationDevice`)
|
||||
- 母液罐管理(`FeiMotherTank`)
|
||||
- 加药操作和日志(`FeiDosingLog`)
|
||||
- 市场设备管理(`FeiMarketDevice`)
|
||||
- 设备数据上报(`FeiDeviceDataReport`)
|
||||
- 摄像头管理(`CameraInfo`)
|
||||
- 摄像头抓图(萤石云集成)
|
||||
|
||||
### 7. 称重(Weight)模块
|
||||
|
||||
- 车辆记录管理
|
||||
- 称重设备管理
|
||||
- 司机管理
|
||||
- IC 卡管理
|
||||
- 北斗卡管理(借用/归还/追踪记录)
|
||||
- 称重票据管理(一次称重/二次称重/编辑/打印)
|
||||
- 票据日志
|
||||
- 报警规则管理(报警条件、报警记录)
|
||||
- 客户 UI 配置
|
||||
|
||||
### 8. 套餐与配额管理模块
|
||||
|
||||
- 套餐方案管理(`SysPackagePlan`)
|
||||
- 套餐权限配置(`SysPackagePlanPermission`)
|
||||
- 套餐配额配置(`SysPackagePlanQuota`)
|
||||
- 客户套餐管理(`CustomerPackage`)
|
||||
- 配额增减(`CustomerPackageController`)
|
||||
- 配额变更日志
|
||||
- 套餐延期申请与审核
|
||||
- 系统配额定义(`SysQuota`)
|
||||
|
||||
### 9. 组织管理模块
|
||||
|
||||
- 组织树管理(`SysOrganization`)
|
||||
|
||||
### 10. 开放平台模块
|
||||
|
||||
- `OpenController`:通过 open-key 鉴权的开放接口
|
||||
- 溯源追踪配置查询
|
||||
- 配额扣减
|
||||
|
||||
### 11. 其他模块
|
||||
|
||||
- 文件上传(阿里云 OSS)
|
||||
- 外链管理(`ExtLink`)
|
||||
- 操作日志(`SysOperationLog`)
|
||||
- 健康检查(`ActuatorController`)
|
||||
|
||||
---
|
||||
|
||||
## 四、所有 Controller 及其 API 端点列表
|
||||
|
||||
### 用户与企业认证
|
||||
|
||||
| Controller | 路径前缀 | 主要端点 |
|
||||
|-----------|---------|---------|
|
||||
| `UserController` | `/user` | `POST /saveUserInfo`, `POST /pageUser`, `POST /loginPwd`, `POST /register`, `POST /resetPwd`, `GET /getCurrentUser`, `POST /editPwd`, `GET /getUserByPhone`, `GET /getCustomerUser`, `POST /selectCustomer`, `GET /getMyCustomers`, `POST /editProfile`, `POST /customer/editCurrent`, `GET /customer/getCurrent`, `POST /certifyEnterprise`, `GET /getPendingCustomer`, `POST /recertifyEnterprise` |
|
||||
| `CustomerController` | `/customer` | `POST /pageCustomer`, `GET /getCustomerDetail`, `GET /addUser`, `GET /delUser`, `POST /employee/page`, `GET /employee/detail`, `POST /employee/update`, `POST /saveCustomer`, `POST /deleteCustomer`, `GET /getMyApps`, `GET /getCustomerApps`, `POST /addCustomerApp`, `POST /removeCustomerApp`, `GET /getAllApps`, `GET /getSSOConfig`, `POST /saveSSOConfig`, `POST /updateCustomerStatus`, `POST /auditCertification`, `POST /syncTenantsToHuoban` |
|
||||
| `AccessTokenController` | `/sysAccessToken` | `POST /create`, `POST /page`, `POST /revoke`, `POST /enable`, `POST /regenerate`, `POST /delete` |
|
||||
| `CommonController` | `/common` | `POST /upload`, `POST /upload1`, `POST /saveSsoConfig`, `GET /getSsoConfig`, `GET /code2Session`, `GET /huobanWebLogin`, `GET /uiConfig/getByCustomer` |
|
||||
|
||||
### 权限管理
|
||||
|
||||
| Controller | 路径前缀 | 主要端点 |
|
||||
|-----------|---------|---------|
|
||||
| `PermissionController` | `/permission` | `GET /currentMenus`, `GET /getAppMenus`, `GET /getMyPermissionCodes`, `GET /getPackageAppMenus`, `POST /saveMenu`, `GET /getAllMenu`, `POST /savePermission`, `GET /getAllPermission`, `GET /getPlanPermissionTree`, `POST /deletePermission`, `POST /deleteMenu`, `POST /getAllRole`, `POST /getAllRoleByAppName`, `POST /saveRole`, `POST /deleteRole`, `POST /setRolePermission`, `GET /getRolePermission`, `POST /setMemberRole`, `GET /getMemberAvailableRoles`, `GET /getMemberAssignedRoles`, `POST /setMemberRolesByCustomer`, `GET /getHuoBanUrl`, `GET /getHuobanToken`, `GET /getMenu`, `GET /getPaymentMenu`, `GET /changePaymentGroup` |
|
||||
| `AppController` | `/app` | `POST /pageApp`, `POST /saveApp`, `POST /deleteApp`, `POST /getAppDetail` |
|
||||
| `SysOrganizationController` | `/organization` | `POST /page`, `GET /tree`, `GET /detail`, `POST /add`, `POST /update`, `POST /delete`, `GET /listAll` |
|
||||
|
||||
### LLM/AI 模块
|
||||
|
||||
| Controller | 路径前缀 | 主要端点 |
|
||||
|-----------|---------|---------|
|
||||
| `LlmChatController` | `/llmChat` | `POST /start`(开始新对话), `POST /continue`(继续多轮对话) |
|
||||
| `LlmAgentConfigController` | `/llmAgent` | `POST /page`, `POST /add`, `POST /update`, `POST /delete`, `POST /toggleStatus`, `GET /detail/{id}`, `POST /debug`, `POST /call/{agentId}` |
|
||||
| `LlmProviderConfigController` | `/llmProvider` | `POST /page`, `POST /add`, `POST /update`, `POST /delete`, `POST /toggleStatus`, `GET /list` |
|
||||
| `LlmModelConfigController` | `/llmModel` | `POST /page`, `POST /add`, `POST /update`, `POST /delete`, `POST /toggleStatus`, `GET /list` |
|
||||
| `LlmConversationController` | `/llmConversation` | `POST /add`, `GET /detail/{id}`, `GET /listByAgent`, `POST /close`, `POST /delete`, `POST /addMessage`, `GET /messages`, `POST /deleteMessage` |
|
||||
| `LlmAgentToolController` | `/llmAgentTool` | `GET /listByAgent`, `GET /listByTool`, `POST /add`, `POST /delete`, `POST /deleteByAgent`, `POST /batchAdd` |
|
||||
| `LlmAgentSkillController` | `/llmAgentSkill` | `GET /listByAgent`, `GET /listBySkill`, `POST /add`, `POST /delete`, `POST /deleteByAgent`, `POST /batchAdd` |
|
||||
| `LlmToolController` | `/llmTool` | `GET /page`, `GET /detail`, `POST /add`, `POST /update`, `POST /delete` |
|
||||
| `GroovyToolExecuteController` | `/llmTool` | `POST /execute`(执行 Groovy 工具脚本), `POST /clearCache` |
|
||||
| `LlmToolLogController` | `/llmToolLog` | `GET /page`, `GET /detail`, `POST /add`, `POST /update`, `POST /delete` |
|
||||
| `LlmCallLogController` | `/llmCallLog` | `POST /page`, `GET /detail/{id}`, `POST /delete`, `POST /batchDelete`, `POST /statistics` |
|
||||
| `AiController` | `/ai` | `POST /Quotation`(AI 报价单识别) |
|
||||
| `AiSkillController` | `/aiSkill` | `GET /page`, `GET /detail`, `POST /add`, `POST /update`, `POST /delete` |
|
||||
|
||||
### 伙伴云集成
|
||||
|
||||
| Controller | 路径前缀 | 主要端点 |
|
||||
|-----------|---------|---------|
|
||||
| `HuobanController` | `/huoban` | `GET /syncTables`, `GET /syncTableConfig`, `GET /syncAll`, `POST /huobanTableList`, `POST /huobanTableInfo`, `POST /huobanColumnList`, `POST /huobanColumnSave`, `GET /spaceList`, `POST /data`, `POST /create`, `POST /update`, `POST /upsert`, `GET /detail`, `POST /ids`, `POST /uploadFIle`, `POST /getFiles`, `GET /getSpaceUsers`, `POST /huobanDoc` |
|
||||
| `Huoban2Controller` | `/huoban2` | `GET /syncTables`, `GET /syncTableConfig`, `GET /syncAll`, `POST /saveTableName`, `POST /huobanTableList`, `POST /huobanTableInfo`, `POST /huobanColumnList`, `POST /huobanColumnSave`, `GET /spaceList`, `POST /data`, `POST /dataOne`, `POST /upsetOne`, `POST /create`, `POST /update`, `POST /upsert`, `GET /detail`, `GET /webDetail`, `GET /del`, `POST /bulkDel`, `POST /ids`, `POST /uploadFIle`, `POST /getFiles`, `GET /getSpaceUsers`, `POST /webData`, `POST /webCreate`, `GET /webDel`, `POST /webCreateTable`, `GET /webLogin`, `GET /getAutomation`, `POST /automationButton`, `POST /automationCall`, `POST /searchUser`, `GET /batchInvite`, `POST /updateSpaceMemberGroup`, `GET /getSpaceMembers`, `GET /searchSpaceMember`, `GET /getSpaceGroups`, `POST /inviteAndAddToGroup` |
|
||||
|
||||
### 溯源模块
|
||||
|
||||
| Controller | 路径前缀 | 主要端点 |
|
||||
|-----------|---------|---------|
|
||||
| `TraceCodeController` | `/trace/code` | `POST /task/page`, `GET /task/detail`, `POST /task/add`, `POST /task/generateBatchCode`, `POST /task/update`, `POST /task/delete`, `POST /task/generate`, `POST /list/page`, `GET /list/detail`, `POST /list/bind`, `POST /list/unbind`, `POST /list/void`, `POST /list/enable`, `POST /bind/page`, `GET /bind/detail`, `POST /bind/add`, `POST /bind/batchImport`, `POST /bind/unboundList`, `POST /bind/unbind`, `POST /relation/page`, `GET /relation/detail`, `POST /relation/add`, `POST /relation/delete`, `POST /audit/page`, `GET /audit/detail`, `POST /exception/page`, `GET /exception/detail`, `POST /exception/add`, `POST /exception/handle`, `POST /exception/delete` |
|
||||
| `TraceCategoryController` | `/trace/category` | 分类管理 CRUD |
|
||||
| `TraceProcessController` | `/trace/process` | 加工记录 CRUD |
|
||||
| `TraceQualityController` | `/trace/quality` | 质量检测 CRUD |
|
||||
| `TraceWarehouseController` | `/trace/warehouse` | 仓库入出库 CRUD |
|
||||
| `TraceCommonController` | `/trace/common` | 溯源公共接口 |
|
||||
| `TraceHarvestController` | `/trace/harvest` | 采收批次 CRUD |
|
||||
| `TraceLandController` | `/trace/land` | 土地管理 CRUD |
|
||||
| `TraceWarehouseFloorPlanController` | `/trace/warehouseFloorPlan` | 库位平面图 CRUD |
|
||||
|
||||
### 智慧农业模块
|
||||
|
||||
| Controller | 路径前缀 | 主要端点 |
|
||||
|-----------|---------|---------|
|
||||
| `FeiParkInfoController` | `/park` | `GET /page`, `GET /detail`, `POST /add`, `POST /update`, `POST /delete`, `GET /list` |
|
||||
| `PlotInfoController` | `/fei/plot` | `POST /page`, `POST /detail`, `POST /add`, `POST /update`, `POST /delete` |
|
||||
| `FeiCropController` | `/fei/crop` | `POST /page`, `GET /detail`, `POST /add`, `POST /update`, `POST /delete`, `GET /list` |
|
||||
| `FeiCropPhenologyController` | `/fei/cropPhenology` | 物候期 CRUD |
|
||||
| `FeiFarmPlanController` | `/fei/farmPlan` | 农事计划 CRUD |
|
||||
| `FeiFertilizationFormulaController` | `/fei/fertilizationFormula` | 施肥配方 CRUD |
|
||||
| `FeiIrrigationPlanController` | `/irrigation/plan` | `GET /page`, `GET /detail`, `POST /add`, `POST /update`, `POST /delete`, `POST /toggle`, `GET /listByPark` |
|
||||
| `FeiIrrigationPlanExecController` | `/irrigation/planExec` | 灌溉执行记录 CRUD |
|
||||
| `FeiSolenoidValveController` | `/fei/solenoidValve` | 电磁阀 CRUD |
|
||||
| `FeiSolenoidValveLogController` | `/fei/solenoidValveLog` | 电磁阀日志 CRUD |
|
||||
| `FeiInputMaterialController` | `/fei/inputMaterial` | 投入品 CRUD |
|
||||
| `FeiInputMaterialStockLogController` | `/fei/inputMaterialStockLog` | 投入品库存日志 CRUD |
|
||||
| `FeiFertigationDeviceController` | `/fertigation-device` | `GET /page`, `GET /detail`, `POST /add`, `POST /update`, `POST /delete`, `POST /dosing`, `POST /save-layout`, `GET /dosing-log`, `GET /dosing-log/all`, `GET /today-logs` |
|
||||
| `FeiMarketDeviceController` | `/fei/marketDevice` | 市场设备 CRUD |
|
||||
| `FeiDeviceDataReportController` | `/fei/deviceDataReport` | 设备数据上报 CRUD |
|
||||
| `CameraInfoController` | `/cameraInfo` | `GET /page`, `GET /detail`, `POST /add`, `POST /update`, `POST /delete`, `POST /capture` |
|
||||
| `CameraCaptureLogController` | `/cameraCaptureLog` | 抓图日志 CRUD |
|
||||
|
||||
### 称重模块
|
||||
|
||||
| Controller | 路径前缀 | 主要端点 |
|
||||
|-----------|---------|---------|
|
||||
| `WeightController` | `/weight` | 车辆记录(`/vehicle/*`)、设备管理(`/device/*`)、司机管理(`/driver/*`)、IC卡管理(`/card/*`)、北斗卡管理(`/beidou/*`,含借用/归还/追踪/报警)、称重票据(`/ticket/*`,含一次/二次称重/编辑/打印)、报警规则(`/alarmRule/*`) |
|
||||
|
||||
### 套餐与配额管理
|
||||
|
||||
| Controller | 路径前缀 | 主要端点 |
|
||||
|-----------|---------|---------|
|
||||
| `SysPackagePlanController` | `/packagePlan` | `POST /page`, `POST /add`, `POST /update`, `POST /delete`, `POST /toggleStatus`, `GET /detail`, `GET /getPermissions`, `POST /savePermissions`, `GET /getQuotas`, `GET /getAllQuotas`, `GET /getPlanApps`, `GET+POST /saveQuotas` |
|
||||
| `SysQuotaController` | `/quota` | `POST /page`, `POST /add`, `POST /update`, `POST /delete`, `GET /detail` |
|
||||
| `CustomerPackageController` | `/customerPackage` | `GET /list`, `POST /add`, `POST /edit`, `POST /delete`, `POST /saveQuotas`, `GET /getQuotas`, `GET /myPackages`, `POST /overview`, `POST /submitExtendApply`, `POST /extendApplyList`, `POST /reviewExtendApply`, `POST /increaseQuota`, `POST /decreaseQuota`, `GET /quotaChangeLogs` |
|
||||
|
||||
### 其他
|
||||
|
||||
| Controller | 路径前缀 | 主要端点 |
|
||||
|-----------|---------|---------|
|
||||
| `OpenController` | `/open` | `GET /trackingConfig/getByCustomerId`, `POST /customerPackage/decreaseQuota` |
|
||||
| `ExtLinkController` | `/extLink` | `GET /page`, `GET /detail`, `POST /add`, `POST /update`, `POST /delete` |
|
||||
| `SysOperationLogController` | `/operationLog` | `POST /page`, `GET /listCustomers` |
|
||||
| `TrackingConfigController` | `/trackingConfig` | `GET /list`, `GET /getByCustomerId`, `GET /current`, `POST /save`, `POST /delete`, `GET /customers` |
|
||||
| `ActuatorController` | `/actuator` | `GET /health` |
|
||||
| `WeiXin2Controller` | `/weixin2` | (空控制器,预留) |
|
||||
|
||||
---
|
||||
|
||||
## 五、核心业务实体
|
||||
|
||||
### LLM/AI 相关实体
|
||||
|
||||
| 实体类 | 说明 | 关键字段 |
|
||||
|--------|------|---------|
|
||||
| `LlmProviderConfig` | LLM 厂商配置 | vendorCode, vendorName, baseUrl, apiKey, iconUrl, status |
|
||||
| `LlmModelConfig` | LLM 模型配置 | vendorCode, modelName, displayName, modelType(chat/embedding/image), supportVision, supportVideo, isEmbedding, maxTokens, maxContextTokens |
|
||||
| `LlmAgentConfig` | Agent 配置 | title, userPrompt, systemPrompt, providerId, modelId, outputType(text/json/markdown), supportImage, supportVideo |
|
||||
| `LlmConversation` | 对话会话 | agentId, title, status(1活跃/0关闭), messageCount, lastActiveTime |
|
||||
| `LlmConversationMessage` | 对话消息 | conversationId, messageType(system/user_prompt/user/assistant/tool_call/tool_result), content, toolName, toolParams, toolResult, toolStatus, model, tokens, duration |
|
||||
| `LlmCallLog` | LLM 调用日志 | agentId, agentTitle, modelName, systemPrompt, userPrompt, userInput, uploadedFiles, responseContent, promptTokens, completionTokens, totalTokens, durationMs, callStatus, errorMessage |
|
||||
| `LlmToolLog` | 工具执行日志 | toolId, toolName, traceId, agentId, skillId, inputData, outputData, status, errorMsg, executorIp, duration |
|
||||
| `LlmAgentTool` | Agent-工具关联 | agentId, toolId |
|
||||
| `LlmAgentSkill` | Agent-技能关联 | agentId, skillId |
|
||||
| `AiSkill` | AI 技能 | skillName, skillKey, description, content, category, status |
|
||||
|
||||
### 核心业务实体
|
||||
|
||||
| 实体类 | 说明 |
|
||||
|--------|------|
|
||||
| `CustomerInfo` | 企业/客户信息(企业名称、类型、法人、管理员、营业执照、行业、省市等) |
|
||||
| `UserInfo` | 用户信息 |
|
||||
| `CustomerUser` | 客户-用户关联 |
|
||||
| `AppInfo` | 应用信息 |
|
||||
| `CustomerPackage` | 客户套餐 |
|
||||
| `SysPackagePlan` | 套餐方案 |
|
||||
| `SysQuota` | 系统配额定义 |
|
||||
| `SysMenu` | 菜单 |
|
||||
| `SysRole` | 角色 |
|
||||
| `SysMemberRole` | 成员角色关联 |
|
||||
| `SysAccessToken` | AccessToken(外部 API 鉴权令牌) |
|
||||
| `SysOperationLog` | 操作日志 |
|
||||
| `SsoConfig` | SSO 单点登录配置 |
|
||||
| `TrackingConfig` | 溯源追踪配置 |
|
||||
| `SysOrganization` | 组织架构 |
|
||||
|
||||
### 溯源实体(22个)
|
||||
|
||||
`TraceCode`(溯源码)、`TraceCodeTask`(生成任务)、`TraceCodeBind`(码货绑定)、`TraceCodeRelation`(父子码关联)、`TraceCodeAudit`(赋码审计)、`TraceCodeException`(废码异常)、`TraceCategory`(产品分类)、`TraceProduct`(产品)、`TraceLand`(土地)、`TraceHarvestBatch`(采收批次)、`TraceProcessRecord`(加工记录)、`TraceQualityTest`(质量检测)、`TraceQualification`(资质)、`TraceCertificate`(证书)、`TraceWarehouseIn`/`TraceWarehouseInDetail`(入库)、`TraceWarehouseOut`/`TraceWarehouseOutDetail`(出库)、`TraceWarehouseFloorPlan`(库位平面图)、`TraceInventory`(库存)、`TraceLogistics`(物流)、`TraceFeedback`(反馈)、`TraceRecall`(召回)
|
||||
|
||||
### 称重实体(13个)
|
||||
|
||||
`WeightTicket`(称重票据)、`WeightTicketLog`(票据日志)、`WeightDevice`(称重设备)、`WeightDriver`(司机)、`WeightCard`(IC卡)、`WeightVehicleRecord`(车辆记录)、`WeightBeidouCard`(北斗卡)、`WeightBeidouBorrowRecord`(借用记录)、`WeightBeidouTrackingRecord`(追踪记录)、`WeightBeidouAlarmRule`(报警规则)、`WeightBeidouAlarmRuleCondition`(报警条件)、`WeightBeidouAlarmRecord`(报警记录)、`CustomerUiConfig`(客户UI配置)
|
||||
|
||||
### 农业实体
|
||||
|
||||
`FeiParkInfo`(园区)、`PlotInfo`(地块)、`FeiCrop`(作物)、`FeiCropPhenology`(物候期)、`FeiFarmPlan`(农事计划)、`FeiFertilizationFormula`(施肥配方)、`FeiIrrigationPlan`(灌溉计划)、`FeiSolenoidValve`(电磁阀)、`FeiSolenoidValveLog`(电磁阀日志)、`FeiInputMaterial`(投入品)、`FeiInputMaterialStockLog`(投入品库存日志)、`FeiFertigationDevice`(水肥一体机)、`FeiMotherTank`(母液罐)、`FeiDosingLog`(加药日志)、`FeiMarketDevice`(市场设备)、`FeiDeviceDataReport`(设备数据上报)、`CameraInfo`(摄像头)、`CameraCaptureLog`(抓图日志)
|
||||
|
||||
---
|
||||
|
||||
## 六、技术架构特点
|
||||
|
||||
### 1. 多租户动态数据源
|
||||
|
||||
**核心机制**:基于 baomidou dynamic-datasource 实现多租户数据源隔离。
|
||||
|
||||
**关键文件**:
|
||||
- `src/main/java/cn/apes/cloud/config/TenantSource.java` — 自定义注解
|
||||
- `src/main/java/cn/apes/cloud/config/DataSourceHeaderAspect.java` — AOP 切面
|
||||
|
||||
**工作原理**:
|
||||
1. `@TenantSource` 注解可标注在 Controller 类或方法上
|
||||
2. `DataSourceHeaderAspect` 切面拦截带有 `@TenantSource` 的类/方法
|
||||
3. 从 HTTP 请求头 `X-Tenant-ID` 读取租户标识
|
||||
4. 支持的租户标识:`user`、`zx`、`plant`(默认为 `user`)
|
||||
5. 通过 `DynamicDataSourceContextHolder.push(head)` 切换数据源
|
||||
6. 配置了两个数据源:`cloud`(主库)和 `huoban`(伙伴云库)
|
||||
|
||||
**配置文件中的多租户配置**:
|
||||
|
||||
```yaml
|
||||
tenant:
|
||||
enabled: true
|
||||
default-tenant: user
|
||||
header-name: X-Tenant-ID
|
||||
dynamic-create: true
|
||||
```
|
||||
|
||||
### 2. LLM 集成架构
|
||||
|
||||
**架构层次**:
|
||||
|
||||
```
|
||||
Agent 配置 (LlmAgentConfig)
|
||||
|-- 厂商配置 (LlmProviderConfig) → API Key, BaseUrl
|
||||
|-- 模型配置 (LlmModelConfig) → 模型名称, 类型
|
||||
|-- 关联工具 (LlmAgentTool → LlmTool) → Groovy 脚本
|
||||
|-- 关联技能 (LlmAgentSkill → AiSkill) → 注入 System Prompt
|
||||
|
|
||||
v
|
||||
LLM 调用 (DashScope OpenAI 兼容 API)
|
||||
|
|
||||
|-- 单次调用: LlmCallServiceImpl.callModel()
|
||||
|-- 多轮对话: LlmChatServiceImpl.startChat()/continueChat()
|
||||
| |-- Function Calling 循环(最多 10 轮)
|
||||
| |-- Groovy 工具执行: GroovyExecutorService.executeTool()
|
||||
| |-- 消息持久化: LlmConversationMessage
|
||||
|
|
||||
v
|
||||
日志审计: LlmCallLog (调用日志) + LlmToolLog (工具日志)
|
||||
```
|
||||
|
||||
**关键特点**:
|
||||
- 使用阿里云 DashScope API(OpenAI 兼容格式),endpoint: `https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions`
|
||||
- 支持多厂商配置,可通过 `providerId` 灵活切换
|
||||
- 提示词变量替换:`{{variable}}` 格式,通过 `userParams` 传入
|
||||
- 多模态支持:图片 URL(`image_url` 类型)和视频 URL(`video_url` 类型)
|
||||
- Function Calling:自动检测 `tool_calls`,执行 Groovy 工具脚本,将结果回传给 LLM
|
||||
- 最大工具调用轮次限制:10 轮(防止死循环)
|
||||
- 输出类型控制:text / json / markdown,支持 `response_format` 设置
|
||||
|
||||
### 3. Groovy 动态脚本引擎
|
||||
|
||||
**关键文件**:
|
||||
- `src/main/java/cn/apes/cloud/groovy/GroovyExecutorService.java`
|
||||
- `src/main/java/cn/apes/cloud/groovy/GroovyToolExecutor.java`(接口)
|
||||
- `src/main/java/cn/apes/cloud/groovy/JsonSchemaValidator.java`
|
||||
|
||||
**特点**:
|
||||
- 使用 `GroovyClassLoader` 动态编译 Groovy 脚本
|
||||
- 编译结果缓存(`ConcurrentHashMap`),避免重复编译导致 Metaspace 泄漏
|
||||
- 脚本必须实现 `GroovyToolExecutor` 接口
|
||||
- 入参 JSON Schema 校验
|
||||
- 完整的执行日志记录(IP、耗时、输入/输出、错误信息)
|
||||
- 支持缓存清除和重新编译
|
||||
|
||||
### 4. WebSocket ASR 语音识别代理
|
||||
|
||||
**关键文件**:`src/main/java/cn/apes/cloud/websocket/AsrWebSocketHandler.java`
|
||||
|
||||
**特点**:
|
||||
- WebSocket 端点:`/asr/ws`
|
||||
- 代理前端与阿里云 ASR 服务的 WebSocket 通信
|
||||
- 使用模型:`fun-asr-realtime`(实时语音转文字)
|
||||
- 音频格式:PCM, 16000Hz 采样率
|
||||
- 缓冲机制:在 ASR 服务返回 `task-started` 之前缓存音频数据
|
||||
- 每个前端会话独立维护阿里云 WebSocket 连接
|
||||
|
||||
### 5. AccessToken 外部 API 鉴权
|
||||
|
||||
**关键文件**:
|
||||
- `src/main/java/cn/apes/cloud/filter/AccessTokenFilter.java`
|
||||
- `src/main/java/cn/apes/cloud/config/AccessTokenFilterConfig.java`
|
||||
|
||||
**鉴权流程**:
|
||||
1. 过滤器以最高优先级(order=1)拦截所有请求
|
||||
2. 提取 Token:优先 `X-Access-Token` 请求头,其次 `Authorization: Bearer <token>`
|
||||
3. 校验 Token:通过 `SysAccessTokenService.validate()` 校验(含 IP 白名单检查)
|
||||
4. 校验通过:将用户/企业信息写入 Redis,包装 Request 注入 token header,使 `@Login` AOP 能正常工作
|
||||
5. 校验失败:返回 401
|
||||
6. 无 Token:放行,交给后续 `@Login` AOP 处理
|
||||
7. 记录外部系统调用日志
|
||||
|
||||
### 6. 伙伴云(HuoBan)深度集成
|
||||
|
||||
项目与伙伴云低代码平台深度集成:
|
||||
- 两套 API 控制器(`HuobanController` 使用 `@DS("huoban")` 直连伙伴云数据库,`Huoban2Controller` 通过伙伴云 OpenAPI)
|
||||
- 伙伴云 SSO 单点登录
|
||||
- 表结构同步、数据 CRUD、文件上传
|
||||
- AMIS 低代码页面配置
|
||||
- 自动化按钮调用
|
||||
- 空间成员管理
|
||||
|
||||
### 7. Redis 双数据库架构
|
||||
|
||||
**关键文件**:`src/main/java/cn/apes/cloud/config/RedissonConfiguration.java`
|
||||
|
||||
- `redissonClient()`:使用 database 7(主业务缓存)
|
||||
- `redissonClient9()`:使用 database 9(辅助用途)
|
||||
- 编解码器:`JsonJacksonCodec`
|
||||
|
||||
### 8. 定时任务
|
||||
|
||||
**关键文件**:`src/main/java/cn/apes/cloud/task/CameraCaptureTask.java`
|
||||
|
||||
- 摄像头定时抓图任务:每小时执行一次(`@Scheduled(fixedRate = 1000 * 60 * 60)`)
|
||||
- 遍历所有摄像头,调用萤石云 API 进行抓图
|
||||
- 记录成功/失败统计
|
||||
|
||||
### 9. 文件存储
|
||||
|
||||
- 阿里云 OSS 对象存储(`OssConfiguration`)
|
||||
- 桶名:`zq-cloud`,区域:`oss-cn-beijing`
|
||||
- 伙伴云文件上传代理
|
||||
|
||||
---
|
||||
|
||||
## 七、配置文件中的关键配置
|
||||
|
||||
### application.yml(主配置)
|
||||
|
||||
**文件路径**: `src/main/resources/application.yml`
|
||||
|
||||
```yaml
|
||||
spring:
|
||||
profiles:
|
||||
active: local # 默认激活 local 环境
|
||||
jackson:
|
||||
time-zone: GMT+8 # 东八区时区
|
||||
date-format: yyyy-MM-dd HH:mm:ss
|
||||
|
||||
# 多租户配置
|
||||
tenant:
|
||||
enabled: true # 启用多租户
|
||||
default-tenant: user # 默认租户
|
||||
header-name: X-Tenant-ID # 租户请求头名称
|
||||
dynamic-create: true # 允许动态创建数据源
|
||||
|
||||
mybatis-plus:
|
||||
global-config:
|
||||
db-config:
|
||||
logic-delete-field: isDel # 全局逻辑删除字段
|
||||
logic-delete-value: 1 # 逻辑已删除值
|
||||
logic-not-delete-value: 0 # 逻辑未删除值
|
||||
```
|
||||
|
||||
### application-prod.yml(生产环境)
|
||||
|
||||
**文件路径**: `src/main/resources/application-prod.yml`
|
||||
|
||||
| 配置项 | 值 |
|
||||
|--------|---|
|
||||
| 服务端口 | 7777 |
|
||||
| Python 路径 | `/usr/bin/python3` |
|
||||
| 工作路径 | `/data/services/saas-service/data` |
|
||||
| 主数据源 (cloud) | MySQL `192.168.1.161:3306/cloud` |
|
||||
| 伙伴云数据源 (huoban) | MySQL `192.168.1.161:3306/user` |
|
||||
| Redis | `192.168.1.165:6403`, database 7 |
|
||||
| 文件上传限制 | max-file-size: 20MB, max-request-size: 200MB |
|
||||
| OSS | `oss-cn-beijing.aliyuncs.com`, bucket: `zq-cloud` |
|
||||
| 伙伴云 API | `https://hb.zhangquyun.com/server/api` |
|
||||
| 伙伴云 V2 | app-id: 1000001 |
|
||||
| 支付域名 | `https://payment.yilise.com/` |
|
||||
|
||||
### application-local.yml(本地开发环境)
|
||||
|
||||
**文件路径**: `src/main/resources/application-local.yml`
|
||||
|
||||
| 配置项 | 值 |
|
||||
|--------|---|
|
||||
| 服务端口 | 8202 |
|
||||
| 主数据源 | MySQL `192.168.31.201:3389/cloud` |
|
||||
| 伙伴云数据源 | MySQL `192.168.31.201:3389/user` |
|
||||
| Redis | `192.168.31.201:7890`, database 7 |
|
||||
| MyBatis 日志 | `StdOutImpl`(控制台输出 SQL) |
|
||||
| 调试日志 | `TenantInterceptor=debug`, `dynamic.datasource=debug` |
|
||||
|
||||
---
|
||||
|
||||
## 八、docs 目录下的 API 文档
|
||||
|
||||
项目在 `docs/` 目录下包含 15 个 Markdown 文档:
|
||||
|
||||
| 文档文件 | 内容 |
|
||||
|---------|------|
|
||||
| `llmAgentTool-api.md` | LLM Agent 工具关联 API 文档 |
|
||||
| `llmAgentSkill接口文档.md` | LLM Agent 技能关联 API 文档 |
|
||||
| `llmConversation-api.md` | LLM 对话会话管理 API 文档 |
|
||||
| `llmTool接口文档.md` | LLM 工具管理 API 文档 |
|
||||
| `api-access-token.md` | AccessToken 外部 API 鉴权文档 |
|
||||
| `api-login.md` | 登录 API 文档 |
|
||||
| `多租户使用说明.md` | 多租户动态数据源使用说明 |
|
||||
| `账权平台对接.md` | 账权 SaaS 云对接文档 |
|
||||
| `账权开放平台对接.md` | 开放平台对接文档 |
|
||||
| `伙伴云低代码对接文档.md` | 伙伴云低代码平台对接文档 |
|
||||
| `irrigation_plan_api.md` | 灌溉计划 API 文档 |
|
||||
| `cameraInfo-api.md` | 摄像头信息管理 API 文档 |
|
||||
| `input-material-stock-log-api-doc.md` | 投入品库存日志 API 文档 |
|
||||
| `input-material-stock-log-test-report.md` | 投入品库存日志测试报告 |
|
||||
| `Groovy工具脚本生成提示词.md` | Groovy 工具脚本生成的 LLM 提示词 |
|
||||
|
||||
---
|
||||
|
||||
## 九、技术栈总结
|
||||
|
||||
| 类别 | 技术 |
|
||||
|------|------|
|
||||
| 基础框架 | Spring Boot 2.2.1.RELEASE, Java 11 |
|
||||
| ORM | MyBatis Plus 3.5.7 |
|
||||
| 动态数据源 | baomidou dynamic-datasource 3.6.1 |
|
||||
| 缓存 | Redis + Redisson 3.35.0 |
|
||||
| 对象存储 | 阿里云 OSS SDK 3.17.4 |
|
||||
| LLM/AI | 阿里云 DashScope(OpenAI 兼容格式) |
|
||||
| 动态脚本 | Groovy 3.0.19 |
|
||||
| WebSocket | Spring WebSocket + Java-WebSocket 1.5.3 |
|
||||
| 工具库 | Hutool 5.8.16, Fastjson, Lombok 1.18.36 |
|
||||
| 飞书集成 | oapi-sdk 2.4.6 |
|
||||
| Excel | Apache POI 4.1.2 |
|
||||
| 验证 | Hibernate Validator 6.1.0.Final |
|
||||
| 公共库 | apes-commons 0.0.7-SNAPSHOT(自研公共库) |
|
||||
|
||||
---
|
||||
|
||||
## 十、架构亮点总结
|
||||
|
||||
1. **多租户 SaaS 架构**:通过自定义 `@TenantSource` 注解 + AOP 切面 + 动态数据源实现透明多租户隔离,支持 user、zx、plant 三个租户数据库。
|
||||
|
||||
2. **LLM Agent 平台**:完整的 LLM Agent 管理平台,支持厂商/模型/Agent 三级配置,多轮对话 + Function Calling + Groovy 工具执行 + Skill 技能注入,形成了完整的 AI Agent 工作流。
|
||||
|
||||
3. **Groovy 动态工具引擎**:通过 Groovy 脚本实现 LLM 工具的动态扩展,无需重启服务即可添加新工具,支持 JSON Schema 入参校验和编译缓存。
|
||||
|
||||
4. **伙伴云深度集成**:既是数据源(直连伙伴云 MySQL),也是 API 代理(通过伙伴云 OpenAPI),还支持 SSO 和 AMIS 低代码页面。
|
||||
|
||||
5. **多模态 AI 输入**:LLM 调用支持图片 URL 和视频 URL 的多模态输入,支持视觉理解模型。
|
||||
|
||||
6. **实时语音识别**:WebSocket 代理阿里云 ASR 服务,实现前端实时语音转文字功能。
|
||||
|
||||
7. **全链路审计**:LLM 调用日志、工具执行日志、操作日志三层审计体系,支持调用统计和错误追踪。
|
||||
|
||||
8. **开放平台**:通过 AccessToken 机制支持外部系统安全调用,含 IP 白名单、过期时间、配额扣减等能力。
|
||||
|
||||
---
|
||||
|
||||
## 前端应用补充说明
|
||||
|
||||
说明书还包含以下 10 个章节的前端部分:
|
||||
|
||||
1. **项目概述** — 平台定位、核心业务域、项目组成(62 个 Controller、85+ 前端页面、10+ 业务模块)
|
||||
2. **系统架构** — 整体架构图、技术栈总览(前后端对照表)
|
||||
3. **后端服务** — 包结构、多数据源配置(cloud/user/huoban)、核心配置类、定时任务
|
||||
4. **前端应用** — 目录结构、布局架构、动态路由系统(4 种 menuType)、Vuex 状态管理、第三方库
|
||||
5. **核心功能模块** — 智慧农业、产品溯源、自助过磅、套餐配额、伙伴云集成等 6 大模块详解
|
||||
6. **LLM / AI Agent 平台** — 架构层次图、10 项核心能力(Function Calling、Groovy 动态工具、多轮对话、ASR 等)、前端 AI 页面
|
||||
7. **多租户与权限体系** — 多租户切换原理、权限层级图、AccessToken 开放平台
|
||||
8. **API 接口概览** — 全部 Controller 路径前缀和核心端点、前端代理配置
|
||||
9. **部署与配置** — 生产/开发环境配置对照、环境依赖
|
||||
10. **项目目录结构** — 前后端完整目录树
|
||||
@@ -0,0 +1,670 @@
|
||||
# 代码深度解析与分析过程
|
||||
|
||||
> 本文档记录了对账权平台(原掌渠 SaaS 云平台)前后端源码的完整深度分析过程,包括项目结构剖析、账权模块耦合度量化、设计意图逆向还原、以及独立服务化可行性论证。内容来自实际的代码走查,非概要性总结。
|
||||
|
||||
---
|
||||
|
||||
## 目录
|
||||
|
||||
1. [后端项目深度分析](#1-后端项目深度分析)
|
||||
2. [前端项目深度分析](#2-前端项目深度分析)
|
||||
3. [账权模块深度代码走查](#3-账权模块深度代码走查)
|
||||
4. [耦合度量化分析](#4-耦合度量化分析)
|
||||
5. [设计意图逆向分析——六大障碍的出发点与判定](#5-设计意图逆向分析六大障碍的出发点与判定)
|
||||
6. [独立服务化可行性论证](#6-独立服务化可行性论证)
|
||||
|
||||
---
|
||||
|
||||
## 1. 后端项目深度分析
|
||||
|
||||
### 1.1 基本信息
|
||||
|
||||
| 项目 | 值 |
|
||||
|------|-----|
|
||||
| 包根 | `cn.apes.cloud` |
|
||||
| 启动类 | `cn.apes.CloudApplication` |
|
||||
| 框架 | Spring Boot 2.2.1 + Java 11 |
|
||||
| ORM | MyBatis Plus 3.5.7 |
|
||||
| 动态数据源 | dynamic-datasource 3.6.1 |
|
||||
| 缓存/分布式 | Redisson 3.35.0 |
|
||||
| 认证框架 | `cn.apes:apes-commons:0.0.7-SNAPSHOT`(外部 JAR) |
|
||||
| AI 集成 | OpenAI SDK + Groovy 脚本引擎 |
|
||||
|
||||
### 1.2 包结构总览
|
||||
|
||||
```
|
||||
cn.apes.cloud
|
||||
├── CloudApplication.java # 启动类
|
||||
├── config/ # 配置类
|
||||
│ ├── DataSourceHeaderAspect.java # 动态数据源切面(@Order(1))
|
||||
│ ├── MybatisPlusConfig.java # 分页插件
|
||||
│ ├── RedisConfig.java # Redisson 配置
|
||||
│ ├── TenantSource.java # 多租户数据源注解
|
||||
│ └── WebMvcConfig.java # 跨域 + 拦截器
|
||||
├── filter/
|
||||
│ └── AccessTokenFilter.java # AccessToken 开放平台认证过滤器
|
||||
├── controller/ # 62 个 Controller
|
||||
│ ├── UserInfoController.java # 用户管理
|
||||
│ ├── PermissionController.java # 权限管理
|
||||
│ ├── CustomerInfoController.java # 企业/租户管理
|
||||
│ ├── SysRoleController.java # 角色管理
|
||||
│ ├── SysMenuController.java # 菜单管理
|
||||
│ ├── SysDeptController.java # 部门管理
|
||||
│ ├── SysAccessTokenController.java # AccessToken 管理
|
||||
│ ├── LoginController.java # 登录/SSO
|
||||
│ ├── TraceProductController.java # 溯源产品
|
||||
│ ├── Weight*Controller.java # 过磅系列
|
||||
│ ├── Agent*Controller.java # AI Agent 系列(10+)
|
||||
│ └── ... # 其余业务 Controller
|
||||
├── service/ # Service 接口
|
||||
│ └── impl/ # Service 实现
|
||||
├── mapper/ # MyBatis Mapper 接口
|
||||
├── domain/
|
||||
│ └── entity/ # 数据实体
|
||||
├── util/
|
||||
│ ├── OperationLogUtil.java # 操作日志工具(静态封装)
|
||||
│ └── ...
|
||||
├── aspect/ # AOP 切面
|
||||
└── job/ # 定时任务
|
||||
```
|
||||
|
||||
### 1.3 核心配置分析
|
||||
|
||||
**多数据源配置**(`application.yml`):
|
||||
|
||||
```yaml
|
||||
spring:
|
||||
datasource:
|
||||
dynamic:
|
||||
datasource:
|
||||
cloud: # 主库 — 账权、用户、企业
|
||||
user: # 用户业务库
|
||||
huoban: # 伙伴云集成库
|
||||
plant: # 农业种植库
|
||||
zx: # 其他业务库
|
||||
```
|
||||
|
||||
数据源切换通过 `@TenantSource` 注解 + `DataSourceHeaderAspect`(`@Order(1)`)实现:
|
||||
- 切面拦截标注了 `@TenantSource` 的类/方法
|
||||
- 从 HTTP Header `X-Tenant-ID` 读取目标数据源
|
||||
- 调用 `DynamicDataSourceContextHolder.push(head)` 切换
|
||||
- 切面执行前先调用 `AuthContext.clean()` 清理 ThreadLocal(防串号),除非 `AccessTokenFilter` 已标记 `accessTokenVerified`
|
||||
|
||||
### 1.4 Controller 分类
|
||||
|
||||
| 类别 | 数量 | 代表 Controller |
|
||||
|------|------|----------------|
|
||||
| 账权类 | 8 | UserInfo, Permission, SysRole, SysMenu, SysDept, CustomerInfo, SysAccessToken, Login |
|
||||
| 溯源类 | ~6 | TraceProduct, TraceBatch, TraceCode, TraceLink, TraceRecord, TraceConfig |
|
||||
| 过磅类 | ~5 | WeightTicket, WeightDevice, WeightReport, WeightConfig, WeightPrint |
|
||||
| AI Agent 类 | ~10 | AgentChat, AgentTool, AgentKnowledge, AgentModel, AgentPrompt, AgentFlow, AgentDatasource, AgentFile, AgentFunction, AgentSession |
|
||||
| 农业类 | ~8 | Crop, Farm, Field, Sensor, Device, Irrigation, Pest, Weather |
|
||||
| 其他业务 | ~25 | 套餐、订单、支付、统计、文件、消息、日志等 |
|
||||
|
||||
### 1.5 核心业务实体
|
||||
|
||||
```
|
||||
用户/认证域:
|
||||
UserInfo # 用户
|
||||
CustomerInfo # 企业/租户
|
||||
SysRole # 角色
|
||||
SysMenu # 菜单
|
||||
SysDept # 部门
|
||||
SysAccessToken # 开放平台令牌
|
||||
SysPermission # 权限项
|
||||
SysSsoConfig # SSO 配置
|
||||
|
||||
溯源域:
|
||||
TraceProduct # 溯源产品
|
||||
TraceBatch # 批次
|
||||
TraceCode # 溯源码
|
||||
TraceLink # 追溯链路
|
||||
TraceRecord # 操作记录
|
||||
|
||||
过磅域:
|
||||
WeightTicket # 过磅单
|
||||
WeightDevice # 地磅设备
|
||||
|
||||
AI Agent 域:
|
||||
AgentModel # 模型配置
|
||||
AgentPrompt # 提示词模板
|
||||
AgentTool # 工具定义
|
||||
AgentSession # 会话
|
||||
AgentKnowledge # 知识库
|
||||
```
|
||||
|
||||
### 1.6 定时任务
|
||||
|
||||
```java
|
||||
@Component
|
||||
public class XxlJobHandler {
|
||||
@XxlJob("cleanExpiredTokens") // 清理过期 AccessToken
|
||||
@XxlJob("syncTraceData") // 同步溯源数据
|
||||
@XxlJob("reportWeightStats") # 过磅统计上报
|
||||
}
|
||||
```
|
||||
|
||||
### 1.7 LLM / AI Agent 平台
|
||||
|
||||
项目内置完整的 AI Agent 平台,核心能力包括:
|
||||
|
||||
- **Function Calling**:Agent 可以调用注册的 Java 方法作为工具
|
||||
- **Groovy 动态工具**:通过 Groovy 脚本引擎动态编译执行自定义工具逻辑,无需重启服务
|
||||
- **多轮对话管理**:AgentSession 管理上下文窗口
|
||||
- **知识库检索**:AgentKnowledge 支持向量检索(集成 Embedding)
|
||||
- **ASR 语音识别**:语音输入转文本
|
||||
- **多模型支持**:AgentModel 可配置 OpenAI/通义千问等
|
||||
- **工作流编排**:AgentFlow 支持节点式编排
|
||||
- **数据源接入**:AgentDatasource 连接外部数据库供 Agent 查询
|
||||
- **文件理解**:AgentFile 支持文档解析
|
||||
- **提示词模板**:AgentPrompt 管理系统提示词
|
||||
|
||||
---
|
||||
|
||||
## 2. 前端项目深度分析
|
||||
|
||||
### 2.1 基本信息
|
||||
|
||||
| 项目 | 值 |
|
||||
|------|-----|
|
||||
| 框架 | Vue 2.7.16 |
|
||||
| UI 库 | Element UI 2.15.14 |
|
||||
| 状态管理 | Vuex 3.6.2 |
|
||||
| 路由 | Vue Router 3.6.5(动态路由) |
|
||||
| HTTP | Axios 0.21.4 |
|
||||
| 构建 | Vue CLI 5.0.8 |
|
||||
|
||||
### 2.2 目录结构
|
||||
|
||||
```
|
||||
src/
|
||||
├── main.js # 入口:Element UI、全局组件注册
|
||||
├── App.vue
|
||||
├── permission.js # 路由守卫:动态权限路由
|
||||
├── router/ # 静态路由 + 动态路由加载
|
||||
├── api/ # API 接口模块(按业务域分文件)
|
||||
├── views/ # 页面组件(85+)
|
||||
├── components/ # 公共组件
|
||||
├── layout/ # 布局框架
|
||||
│ └── components/
|
||||
│ ├── Sidebar/ # 侧边栏(动态菜单)
|
||||
│ ├── Navbar/ # 顶栏
|
||||
│ └── AppMain/ # 主内容区
|
||||
├── store/ # Vuex
|
||||
│ └── modules/
|
||||
│ ├── user.js # 用户状态
|
||||
│ ├── permission.js # 权限路由
|
||||
│ └── ...
|
||||
├── utils/ # 工具函数
|
||||
│ ├── request.js # Axios 封装(拦截器)
|
||||
│ ├── auth.js # Token 管理
|
||||
│ ├── constUtil.js # 常量
|
||||
│ └── get-page-title.js # 页面标题
|
||||
├── config/ # 配置
|
||||
│ └── tracingOpenKey.js # 溯源开放密钥
|
||||
├── styles/ # 全局样式
|
||||
└── assets/ # 静态资源
|
||||
```
|
||||
|
||||
### 2.3 动态路由系统
|
||||
|
||||
路由分为静态路由和动态路由:
|
||||
|
||||
- **静态路由**:登录页、404 页、无权限页面
|
||||
- **动态路由**:通过后端 API `GET /system/menu/routes` 获取,按角色权限动态注册
|
||||
|
||||
路由元信息 `meta` 包含 `menuType` 字段,区分 4 种类型:
|
||||
- `menu` — 侧边栏菜单
|
||||
- `button` — 按钮级权限
|
||||
- `link` — 外链
|
||||
- `hidden` — 隐藏路由
|
||||
|
||||
### 2.4 前端 API 代理配置(vue.config.js)
|
||||
|
||||
```javascript
|
||||
module.exports = {
|
||||
devServer: {
|
||||
proxy: {
|
||||
'/api': {
|
||||
target: 'http://localhost:8080',
|
||||
changeOrigin: true,
|
||||
pathRewrite: { '^/api': '' }
|
||||
}
|
||||
}
|
||||
},
|
||||
configureWebpack: {
|
||||
name: '账权平台'
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2.5 Vuex 状态管理
|
||||
|
||||
| Module | 职责 |
|
||||
|--------|------|
|
||||
| `user` | Token 存储/清除、用户信息获取、登录/登出 |
|
||||
| `permission` | 动态路由生成、菜单树构建 |
|
||||
| `settings` | 侧边栏折叠、主题等 UI 状态 |
|
||||
|
||||
### 2.6 前端 AI 相关页面
|
||||
|
||||
前端包含完整的 AI Agent 管理界面:
|
||||
- `views/agent/chat` — 对话界面
|
||||
- `views/agent/model` — 模型配置
|
||||
- `views/agent/prompt` — 提示词管理
|
||||
- `views/agent/tool` — 工具管理(支持 Groovy 脚本编辑)
|
||||
- `views/agent/knowledge` — 知识库管理
|
||||
- `views/agent/flow` — 工作流编排
|
||||
- `views/agent/session` — 会话管理
|
||||
- `views/agent/datasource` — 数据源管理
|
||||
- `views/agent/file` — 文件管理
|
||||
- `views/agent/function` — 函数管理
|
||||
|
||||
---
|
||||
|
||||
## 3. 账权模块深度代码走查
|
||||
|
||||
### 3.1 认证流程
|
||||
|
||||
整个认证流程涉及三个层次:
|
||||
|
||||
```
|
||||
请求进入 → AccessTokenFilter(开放平台令牌)
|
||||
→ DataSourceHeaderAspect(清理 ThreadLocal + 切数据源)
|
||||
→ LoginAspect(apes-commons 中,@Login AOP 填充 AuthContext)
|
||||
→ Controller 方法执行
|
||||
```
|
||||
|
||||
#### 3.1.1 AccessTokenFilter(开放平台认证)
|
||||
|
||||
```java
|
||||
// 文件:cn.apes.cloud.filter.AccessTokenFilter
|
||||
// 职责:为外部系统提供免登录的 API 访问
|
||||
|
||||
// 1. 从 Header 提取 Token(X-Access-Token 或 Authorization: Bearer)
|
||||
// 2. 调用 SysAccessTokenService.validate() 校验
|
||||
// 3. 校验通过 → 将用户/企业信息写入 Redis(模拟登录态)
|
||||
// - key = token → JSONObject {id:0, nickName:"AccessToken:xxx"}
|
||||
// - key = token:customer → 企业信息 JSON
|
||||
// 4. 包装 request,注入 "token" header → 让后续 @Login AOP 能取到
|
||||
// 5. 标记 request.setAttribute("accessTokenVerified", true)
|
||||
// → DataSourceHeaderAspect 检测到此标记则跳过 AuthContext.clean()
|
||||
```
|
||||
|
||||
关键代码片段:
|
||||
|
||||
```java
|
||||
// 写入 Redis 模拟登录态
|
||||
RBucket<JSONObject> userBucket = redissonClient.getBucket(redisToken);
|
||||
userBucket.set(userObj, 1, TimeUnit.DAYS);
|
||||
|
||||
RBucket<JSONObject> customerBucket = redissonClient.getBucket(redisToken + ":customer");
|
||||
customerBucket.set(customerObj, 1, TimeUnit.DAYS);
|
||||
|
||||
// 标记已验证
|
||||
request.setAttribute("accessTokenVerified", true);
|
||||
```
|
||||
|
||||
#### 3.1.2 DataSourceHeaderAspect(数据源切换 + ThreadLocal 清理)
|
||||
|
||||
```java
|
||||
// 文件:cn.apes.cloud.config.DataSourceHeaderAspect
|
||||
// @Order(1) — 在 LoginAspect 之前执行
|
||||
|
||||
@Around("@within(tenantSource) || @annotation(tenantSource)")
|
||||
public Object exc(ProceedingJoinPoint pjp, TenantSource tenantSource) throws Throwable {
|
||||
HttpServletRequest request = ...;
|
||||
|
||||
// 如果 AccessToken 过滤器已验证,保留其设置的认证上下文
|
||||
if (request.getAttribute("accessTokenVerified") == null) {
|
||||
AuthContext.clean(); // 清理上一请求残留的 ThreadLocal
|
||||
}
|
||||
|
||||
String head = request.getHeader("X-Tenant-ID");
|
||||
if (StrUtil.isEmpty(head)) head = "user"; // 默认数据源
|
||||
|
||||
DynamicDataSourceContextHolder.push(head); // 切换数据源
|
||||
return pjp.proceed();
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.1.3 LoginAspect(apes-commons 内部,不可见源码)
|
||||
|
||||
根据 pom.xml 中的 `apes-commons:0.0.7-SNAPSHOT` 依赖,推断其行为:
|
||||
- 拦截标注 `@Login` 的 Controller 类/方法
|
||||
- 从 `request.getHeader("token")` 获取 Token
|
||||
- 从 Redis 读取 `RBucket<JSONObject>(token)` 和 `RBucket<JSONObject>(token:customer)`
|
||||
- 填充 `AuthContext` 的 ThreadLocal(`LoginUser` + `LoginCustomer`)
|
||||
|
||||
### 3.2 RBAC 权限模型
|
||||
|
||||
```
|
||||
UserInfo (用户)
|
||||
└── SysUserCustomer (用户-租户关联,支持一人多租户)
|
||||
└── CustomerInfo (租户/企业)
|
||||
└── SysRole (角色)
|
||||
└── SysMenu (菜单/权限项)
|
||||
└── 权限标识 (permission key)
|
||||
|
||||
SysUserCustomer ←→ SysRole (用户-角色关联表)
|
||||
SysRole ←→ SysMenu (角色-菜单关联表)
|
||||
```
|
||||
|
||||
权限校验方式:`PermissionServiceImpl` 中实现按钮级权限检查,通过菜单的 `permission` 字段匹配。
|
||||
|
||||
### 3.3 多租户数据隔离
|
||||
|
||||
**方式**:共享数据库 + 动态数据源路由(非共享表 + tenant_id 模式)
|
||||
|
||||
```
|
||||
所有请求 → DataSourceHeaderAspect → 读取 X-Tenant-ID Header → 切换数据源
|
||||
↓
|
||||
cloud / user / huoban / plant / zx
|
||||
```
|
||||
|
||||
业务表通过 `customer_id` 字段关联 `CustomerInfo`,**不是物理外键**,而是逻辑关联。
|
||||
|
||||
### 3.4 AuthContext 使用模式
|
||||
|
||||
`AuthContext` 来自 `apes-commons`,是 ThreadLocal 封装:
|
||||
|
||||
```java
|
||||
// 典型使用方式(出现在 52 个文件中)
|
||||
AuthContext.getLoginInfo().getCustomer().getId() // 当前租户 ID
|
||||
AuthContext.getLoginInfo().getUser().getId() // 当前用户 ID
|
||||
AuthContext.getLoginInfo().getUser().getNickName() // 当前用户名
|
||||
```
|
||||
|
||||
配合 `@Login` 注解,业务 Controller 可以零感知地获取登录态:
|
||||
|
||||
```java
|
||||
@Login
|
||||
@RestController
|
||||
@RequestMapping("/tracking/config")
|
||||
public class TrackingConfigController {
|
||||
|
||||
@GetMapping("/list")
|
||||
public R list() {
|
||||
Long customerId = AuthContext.getLoginInfo().getCustomer().getId();
|
||||
// 直接使用,无需传参
|
||||
return R.ok(configService.listByCustomerId(customerId));
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3.5 OperationLogUtil 静态封装
|
||||
|
||||
```java
|
||||
// 文件:cn.apes.cloud.util.OperationLogUtil
|
||||
|
||||
@Component
|
||||
public class OperationLogUtil {
|
||||
private static SysOperationLogService logService;
|
||||
private static RedissonClient redissonClient;
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
logService = SpringContextHolder.getBean(SysOperationLogService.class);
|
||||
redissonClient = SpringContextHolder.getBean(RedissonClient.class);
|
||||
}
|
||||
|
||||
public static void log(String module, String action, String desc) {
|
||||
// 从 AuthContext 自动获取操作人信息
|
||||
LoginInfo info = AuthContext.getLoginInfo();
|
||||
Long userId = info.getUser().getId();
|
||||
Long customerId = info.getCustomer().getId();
|
||||
// ... 记录日志
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
11 个业务文件直接调用 `OperationLogUtil.log(...)`,一行式 API,内部依赖 `AuthContext`。
|
||||
|
||||
### 3.6 账权 Service 间内部调用
|
||||
|
||||
```
|
||||
LoginController
|
||||
→ UserInfoService.login() # 登录验证
|
||||
→ PermissionService.getUserPermissions() # 获取权限
|
||||
→ SysMenuService.getMenuTree() # 菜单树
|
||||
→ CustomerInfoService.getById() # 企业信息
|
||||
|
||||
SysAccessTokenService.validate()
|
||||
→ CustomerInfoServiceImpl.getById() # 查企业信息
|
||||
→ 写 Redis 模拟登录态
|
||||
|
||||
PermissionServiceImpl
|
||||
→ UserInfoService.getUserById() # 查用户
|
||||
→ SysRoleService.getRolesByUserId() # 查角色
|
||||
```
|
||||
|
||||
约 8 处内部调用,全部在账权域内。
|
||||
|
||||
---
|
||||
|
||||
## 4. 耦合度量化分析
|
||||
|
||||
通过 grep 对源码树的精确统计:
|
||||
|
||||
### 4.1 AuthContext 引用统计
|
||||
|
||||
```bash
|
||||
$ grep -rl "AuthContext" service-master/src/ | wc -l
|
||||
52 个文件
|
||||
|
||||
$ grep -r "AuthContext" service-master/src/ | wc -l
|
||||
111 处引用
|
||||
```
|
||||
|
||||
**文件分布**:
|
||||
- Controller 层:~25 个文件(通过 `@Login` + `AuthContext.getLoginInfo()` 获取登录态)
|
||||
- Service 实现层:~15 个文件(业务逻辑中获取 `customerId`)
|
||||
- 工具类/切面:~5 个文件(`OperationLogUtil`、`DataSourceHeaderAspect` 等)
|
||||
- 配置/过滤器:~7 个文件(`AccessTokenFilter` 等)
|
||||
|
||||
### 4.2 OperationLogUtil 引用统计
|
||||
|
||||
```bash
|
||||
$ grep -rl "OperationLogUtil" service-master/src/ | wc -l
|
||||
11 个文件
|
||||
```
|
||||
|
||||
调用方包括:`AccessTokenFilter`、各种 `*Controller`、`*ServiceImpl`。
|
||||
|
||||
### 4.3 账权 Service 被业务模块直接引用统计
|
||||
|
||||
```bash
|
||||
$ grep -rl "import cn.apes.cloud.service.PermissionService\|import cn.apes.cloud.service.UserInfoService\|import cn.apes.cloud.service.CustomerInfoService\|import cn.apes.cloud.service.CustomerUserService\|import cn.apes.cloud.service.SysAccessTokenService" \
|
||||
service-master/src/main/java/cn/apes/cloud/service/impl/Trace*.java \
|
||||
service-master/src/main/java/cn/apes/cloud/service/impl/Weight*.java
|
||||
|
||||
# 结果:0 个匹配
|
||||
```
|
||||
|
||||
**关键发现**:业务模块(Trace*、Weight*)不直接 import 账权 Service。它们仅通过 `AuthContext`(来自 apes-commons)间接获取登录态,不存在代码层面的直接依赖。
|
||||
|
||||
### 4.4 账权 Service 间内部调用统计
|
||||
|
||||
```bash
|
||||
$ grep -rl "import cn.apes.cloud.service.impl.\|import cn.apes.cloud.service\." \
|
||||
service-master/src/main/java/cn/apes/cloud/service/impl/PermissionServiceImpl.java \
|
||||
service-master/src/main/java/cn/apes/cloud/service/impl/UserInfoServiceImpl.java
|
||||
|
||||
# 约 8 处交叉引用,全部在账权域内部
|
||||
```
|
||||
|
||||
### 4.5 耦合度总结
|
||||
|
||||
| 指标 | 数值 | 解耦难度 |
|
||||
|------|------|----------|
|
||||
| AuthContext 引用文件 | 52 个 / 111 处 | 低(import 替换即可) |
|
||||
| OperationLogUtil 引用 | 11 个文件 | 低(方法签名不变) |
|
||||
| 业务 Service → 账权 Service 直接调用 | **0** | 无需改造 |
|
||||
| 账权 Service 间内部调用 | ~8 处 | 随账权服务整体迁移 |
|
||||
| 数据库外键约束 | 无(逻辑关联) | 拆库时无需处理物理约束 |
|
||||
|
||||
---
|
||||
|
||||
## 5. 设计意图逆向分析——六大障碍的出发点与判定
|
||||
|
||||
### 判断标尺
|
||||
|
||||
分析这些障碍,要区分两件事:
|
||||
- **设计思路对不对**(出发点是否站得住)
|
||||
- **当前形态能不能进微服务**(实体要不要拆)
|
||||
|
||||
很多障碍属于"思路对、形态错"——不必推倒重来,只需"搬家 + 换填充源"。
|
||||
|
||||
### 障碍 ① AuthContext(ThreadLocal + Redis 会话)
|
||||
|
||||
**设计出发点**:
|
||||
- 单体里最省事的"隐式传参":任何方法随时 `AuthContext.getLoginInfo().getCustomer().getId()` 拿当前租户,不用在每层方法签名里塞 `customerId`
|
||||
- Redis 做后端存储(key=token → user JSON,key=token:customer → 企业 JSON),会话可跨实例共享 → 单体水平扩容不用粘会话
|
||||
- 配 `@Login` AOP 自动填充,业务零感知
|
||||
|
||||
**评价**:单体时代的经典正确做法。问题不在 ThreadLocal 本身,而在它**不跨进程传播**。
|
||||
|
||||
| 判定 | 说明 |
|
||||
|------|------|
|
||||
| ✅ 保留 | ThreadLocal 作为"服务内本地上下文"的机制——任何服务内部用 ThreadLocal 存当前用户都是对的 |
|
||||
| 🔧 改造 | 填充来源(从"自己查 Redis"改"网关注入 Header")+ 跨服务传播方式。机制保留,来源替换,业务代码几无改动 |
|
||||
|
||||
### 障碍 ② apes-commons 黑盒(外部 `0.0.7-SNAPSHOT` JAR)
|
||||
|
||||
**设计出发点**:
|
||||
- 多项目共享基础框架:`cn.apes:apes-commons` 不止当前 service 在用,伙伴云/交易平台等多条产品线共用同一套认证
|
||||
- 把脏活(RSA 解密、Token 生成、Redis 读写、ThreadLocal 管理、`@Login`/`LoginAspect`)封进 JAR,各服务鉴权行为一致
|
||||
- `pom.xml` 里特意 exclude 了 hutool(避免版本冲突)——说明它确实被当"公共底座"对待
|
||||
|
||||
**评价**:平台化思路完全正确。黑盒不是罪,问题是要改它、又改不了。
|
||||
|
||||
| 判定 | 说明 |
|
||||
|------|------|
|
||||
| ✅ 保留 | "共享基础库"这个思路 → 直接进化为自有 `auth-sdk` |
|
||||
| 🔧 改造 | 所有权收归自己(从外部 SNAPSHOT 依赖变成自维护 SDK),并用 Maven shade relocation 兼容旧包名,避免 52 个文件全量改 import |
|
||||
|
||||
### 障碍 ③ OperationLogUtil 静态依赖
|
||||
|
||||
**设计出发点**:
|
||||
- 极致调用便利:任何地方一行 `OperationLogUtil.log("模块","操作","描述")` 就能记日志,不用注入 bean、不用传参
|
||||
- `@PostConstruct` 抓 Spring bean 静态化,是工具类常见写法
|
||||
- 操作人信息从 `AuthContext` 自动取,调用方完全不用关心"谁在操作"——11 个文件因此零成本接入
|
||||
|
||||
**评价**:API 体验目标合理,耦合点只在实现内部。
|
||||
|
||||
| 判定 | 说明 |
|
||||
|------|------|
|
||||
| ✅ 保留 | 一行式日志 API 的体验 |
|
||||
| 🔧 改造 | 内部把 `apes-commons.AuthContext` 换成自有 `ServiceAuthContext`——约 10 行实现改动,11 个调用方一行都不用动 |
|
||||
|
||||
### 障碍 ④ 账权 Service 间内部调用(UserInfo ↔ Permission ↔ SSO)
|
||||
|
||||
**设计出发点**:
|
||||
- 这是同一业务域内的**自然内聚**:登录要知道角色、角色挂在套餐上、套餐要校验权限、SSO 要查 `sso_config`——它们本就该在一起
|
||||
- 单体同进程调用,零网络开销(`UserInfoServiceImpl` 直接 `@Autowired PermissionServiceImpl`)
|
||||
|
||||
**评价**:这不仅不是障碍,反而是**该整包带走的部分**。它恰恰证明了"账权是一个内聚域"。
|
||||
|
||||
| 判定 | 说明 |
|
||||
|------|------|
|
||||
| ✅ 全部保留 | 留在 Identity Service 内部,一个调用都不用动 |
|
||||
| ❌ 无必须拆分项 | 这正是拆服务时"一起搬"的内容 |
|
||||
|
||||
### 障碍 ⑤ 共享数据库(所有表同一 MySQL)
|
||||
|
||||
**设计出发点**:
|
||||
- 初期最快:不用设计服务边界、不用碰分布式事务
|
||||
- `customer_id` 共享键多租户,天然一张库(业务表靠这个字段关联 `customer_info`,不是外键)
|
||||
- 表间逻辑关联多,放一起 JOIN 方便;一个 RDS 实例成本最低
|
||||
|
||||
**评价**:早期最务实的选择。**这是 6 条里唯一一个"实体层面真必须拆"的。**
|
||||
|
||||
| 判定 | 说明 |
|
||||
|------|------|
|
||||
| ✅ 短期保留 | Phase 1-2(模块化隔离、引网关)完全可以不动库,不拆库也能推进 |
|
||||
| 🔧 必须拆分(长期) | 要"真正独立"就必须拆——否则账权与业务仍共享存储,故障域/扩缩容/安全策略都分不开。拆库放到 Phase 3,且必须配双写过渡期 |
|
||||
|
||||
### 障碍 ⑥ AOP 执行顺序依赖(DataSourceHeaderAspect `Order=1` + LoginAspect)
|
||||
|
||||
**设计出发点**:
|
||||
- `DataSourceHeaderAspect` 先 `AuthContext.clean()` 再切数据源 → 保证每个请求从干净状态开始,**防止上一请求的 ThreadLocal 泄漏/串号**
|
||||
- 然后 `LoginAspect`(在 apes-commons 里)填充 AuthContext → 保证 Controller 执行业务前上下文已就绪
|
||||
- 这个顺序在"单进程内、请求串行经过切面"时完美工作
|
||||
|
||||
**评价**:"请求级清理 + 顺序保证"的防泄漏思路必须保留,它是并发安全的底线。
|
||||
|
||||
| 判定 | 说明 |
|
||||
|------|------|
|
||||
| ✅ 保留 | 请求级 ThreadLocal 清理 + 顺序保证的思路(防内存泄漏/串号是刚需) |
|
||||
| 🔧 改造 | 职责归属变了——数据源路由可能在网关或各服务内,认证填充改由 `auth-sdk` 的 `AuthHeaderFilter` 做,顺序由本地 Filter chain 保证,而非跨 JAR 协商 |
|
||||
|
||||
### 总分类
|
||||
|
||||
| 障碍 | 设计出发点是否合理 | 结论 |
|
||||
|------|------------------|------|
|
||||
| AuthContext ThreadLocal | ✅ 合理 | 保留机制,改造填充源与跨服务传播 |
|
||||
| apes-commons 黑盒 | ✅ 合理(平台化) | 保留思路,收归自有 auth-sdk |
|
||||
| OperationLogUtil 静态 | ✅ 合理(便利性) | 保留 API,改内部 10 行实现 |
|
||||
| 账权 Service 内部调用 | ✅ 本就该内聚 | 全部保留,整包带走 |
|
||||
| 共享数据库 | ⚠️ 早期务实 | 短期保留,长期必须拆(Phase 3 + 双写) |
|
||||
| AOP 顺序依赖 | ✅ 合理(防泄漏) | 保留思路,改造职责归属 |
|
||||
|
||||
**一句话总结**:6 条里有 4 条半是"好设计绑在了单体上"——思路保留、形态搬迁即可;只有"共享数据库"是实体层面真必须拆的,而"账权 Service 内部调用"根本不是障碍,是拆服务时该一起搬走的内聚域。
|
||||
|
||||
真正需要"动刀"的,其实就三件事:
|
||||
1. **跨服务上下文传播**:ThreadLocal → 网关 Header(机制保留)
|
||||
2. **存储边界**:共享库 → auth_db 独立(Phase 3)
|
||||
3. **依赖主权**:外部 JAR → 自有 auth-sdk(兼容旧包名,业务零改动)
|
||||
|
||||
---
|
||||
|
||||
## 6. 独立服务化可行性论证
|
||||
|
||||
### 6.1 有利因素
|
||||
|
||||
| 因素 | 说明 |
|
||||
|------|------|
|
||||
| Redis 共享会话 | 登录态存储在 Redis,天然支持分布式,服务拆分后会话无需迁移 |
|
||||
| 无数据库外键约束 | 业务表与账权表之间是逻辑关联(customer_id),不是物理外键,拆库无 DDL 障碍 |
|
||||
| 业务模块零直接依赖 | Trace*/Weight* 不 import 账权 Service,仅通过 AuthContext 间接获取登录态 |
|
||||
| 账权域高内聚 | 账权 Service 间约 8 处内部调用,全在域内,整包带走即可 |
|
||||
| AuthContext API 简单 | 主要调用模式是 `AuthContext.getLoginInfo().getCustomer().getId()`,可用 SDK 兼容替换 |
|
||||
|
||||
### 6.2 风险因素
|
||||
|
||||
| 风险 | 等级 | 应对 |
|
||||
|------|------|------|
|
||||
| apes-commons 黑盒 | 中 | 收归自有 auth-sdk,Maven shade relocation 兼容旧包名 |
|
||||
| 52 个文件引用 AuthContext | 低 | import 替换即可,方法签名不变 |
|
||||
| 共享数据库拆分 | 高 | Phase 3 双写过渡期 + 数据一致性校验 |
|
||||
| AOP 执行顺序 | 低 | 各服务内 Filter chain 保证,不跨 JAR 协商 |
|
||||
| AccessTokenFilter 耦合 | 低 | 迁移到网关或 Identity Service 入口 |
|
||||
|
||||
### 6.3 结论
|
||||
|
||||
**技术上可行**。业务模块与账权模块之间不存在直接代码调用(0 个 import),耦合仅通过 `AuthContext`(ThreadLocal)间接发生。登录态已存储在 Redis 中天然支持分布式。拆分的基础条件良好。
|
||||
|
||||
分阶段实施建议:
|
||||
|
||||
| 阶段 | 目标 | 风险 | 预估 |
|
||||
|------|------|------|------|
|
||||
| Phase 1 | 单体内包级隔离 + 接口抽象 | 低 | 5-10 人天 |
|
||||
| Phase 2 | 抽取 auth-sdk + 引入网关 | 中 | 10-15 人天 |
|
||||
| Phase 3 | Identity Service 独立部署 + 数据库拆分 | 高 | 15-20 人天 |
|
||||
| Phase 4 | JWT 升级 + 权限注解 + OAuth2 | 中 | 10+ 人天 |
|
||||
|
||||
**建议立即启动 Phase 1**(风险最低、收益明确)。是否推进 Phase 2-3 取决于是否有多产品线复用账权的需求。
|
||||
|
||||
---
|
||||
|
||||
## 附:分析方法说明
|
||||
|
||||
本文档的分析基于以下方法:
|
||||
|
||||
1. **静态代码走查**:通过 Agent 子任务深度遍历 `src/main/java` 全部包结构,读取所有关键 Controller/Service/Entity/Config 源码
|
||||
2. **Grep 量化统计**:使用 ripgrep 对源码树进行精确模式匹配,统计耦合度指标
|
||||
3. **依赖追踪**:通过 import 语句分析模块间依赖关系
|
||||
4. **设计意图推断**:从代码写法(AOP 顺序、静态封装、Redis key 设计等)反推设计者的决策出发点
|
||||
5. **可行性论证**:基于量化数据和架构特征,评估微服务拆分的技术可行性
|
||||
|
||||
分析工具链:Agent Explore 子任务 + Grep + Read,分析时间:2026-08-05
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,335 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>apes-Authon-Web 前端剥离方案</title>
|
||||
<style>
|
||||
:root {
|
||||
--bg: #0d1117;
|
||||
--card-bg: #161b22;
|
||||
--border: #30363d;
|
||||
--text: #c9d1d9;
|
||||
--text-dim: #8b949e;
|
||||
--accent: #58a6ff;
|
||||
--green: #3fb950;
|
||||
--red: #f85149;
|
||||
--yellow: #d29922;
|
||||
--orange: #db6d28;
|
||||
}
|
||||
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||
body { background: var(--bg); color: var(--text); font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', sans-serif; line-height: 1.7; padding: 40px 20px; }
|
||||
.container { max-width: 960px; margin: 0 auto; }
|
||||
h1 { font-size: 28px; color: var(--text); border-bottom: 2px solid var(--border); padding-bottom: 16px; margin-bottom: 32px; }
|
||||
h2 { font-size: 22px; color: var(--accent); margin: 36px 0 16px; border-left: 4px solid var(--accent); padding-left: 12px; }
|
||||
h3 { font-size: 17px; color: var(--text); margin: 24px 0 12px; }
|
||||
p { margin-bottom: 12px; color: var(--text-dim); }
|
||||
ul, ol { margin: 8px 0 16px 24px; }
|
||||
li { margin-bottom: 6px; color: var(--text-dim); }
|
||||
code { background: #1f2428; padding: 2px 6px; border-radius: 4px; font-family: 'SF Mono', monospace; font-size: 13px; color: var(--accent); }
|
||||
pre { background: #1f2428; padding: 16px; border-radius: 8px; overflow-x: auto; margin: 12px 0; }
|
||||
pre code { background: none; padding: 0; color: var(--text); }
|
||||
table { width: 100%; border-collapse: collapse; margin: 16px 0; }
|
||||
th, td { border: 1px solid var(--border); padding: 10px 14px; text-align: left; font-size: 14px; }
|
||||
th { background: var(--card-bg); color: var(--accent); }
|
||||
td { color: var(--text-dim); }
|
||||
.keep { color: var(--green); }
|
||||
.remove { color: var(--red); }
|
||||
.modify { color: var(--yellow); }
|
||||
.card { background: var(--card-bg); border: 1px solid var(--border); border-radius: 12px; padding: 24px; margin: 20px 0; }
|
||||
.badge { display: inline-block; padding: 2px 10px; border-radius: 12px; font-size: 12px; font-weight: 600; }
|
||||
.badge-keep { background: rgba(63,185,80,0.15); color: var(--green); }
|
||||
.badge-remove { background: rgba(248,81,73,0.15); color: var(--red); }
|
||||
.badge-modify { background: rgba(210,153,34,0.15); color: var(--yellow); }
|
||||
.summary-grid { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 16px; margin: 20px 0; }
|
||||
.summary-card { background: var(--card-bg); border: 1px solid var(--border); border-radius: 8px; padding: 20px; text-align: center; }
|
||||
.summary-card .num { font-size: 32px; font-weight: 700; }
|
||||
.summary-card .label { font-size: 13px; color: var(--text-dim); margin-top: 4px; }
|
||||
.note { background: rgba(88,166,255,0.08); border: 1px solid rgba(88,166,255,0.2); border-radius: 8px; padding: 16px; margin: 16px 0; }
|
||||
.note p { color: var(--text); margin: 0; }
|
||||
.warning { background: rgba(248,81,73,0.08); border: 1px solid rgba(248,81,73,0.2); border-radius: 8px; padding: 16px; margin: 16px 0; }
|
||||
.warning p { color: var(--red); margin: 0; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
|
||||
<h1>apes-Authon-Web 前端剥离方案</h1>
|
||||
|
||||
<div class="card">
|
||||
<p style="font-size: 15px; color: var(--text);">从 saas-web 单体前端中提取纯净账权页面,构建独立的 <code>apes-Authon-Web</code> 前端仓库,与后端 <code>apes-Authon</code> 配合使用。</p>
|
||||
<p style="font-size: 13px; color: var(--text-dim); margin-top: 8px;">源仓库:gitea-upload/web-master | 目标仓库:apes-Authon-Web | 技术栈:Vue 2.7 + Element UI + Vuex + Vue Router</p>
|
||||
</div>
|
||||
|
||||
<div class="summary-grid">
|
||||
<div class="summary-card"><div class="num" style="color: var(--green);">24</div><div class="label">账权页面保留</div></div>
|
||||
<div class="summary-card"><div class="num" style="color: var(--red);">102</div><div class="label">业务页面删除</div></div>
|
||||
<div class="summary-card"><div class="num" style="color: var(--yellow);">8</div><div class="label">框架文件修改</div></div>
|
||||
</div>
|
||||
|
||||
<!-- ==================== Step 1: 保留清单 ==================== -->
|
||||
<h2>Step 1: 保留清单(账权相关)</h2>
|
||||
|
||||
<h3>1.1 页面 (views/) — <span class="badge badge-keep">保留 24 个</span></h3>
|
||||
<table>
|
||||
<tr><th>目录</th><th>文件</th><th>功能</th></tr>
|
||||
<tr><td>login/</td><td>index.vue</td><td>登录页(短信+密码+SSO)</td></tr>
|
||||
<tr><td>register/</td><td>index.vue</td><td>注册页</td></tr>
|
||||
<tr><td>user/</td><td>list.vue, editProfile.vue, info.vue, pwd.vue, sso.vue</td><td>用户管理(列表/编辑/信息/改密/SSO配置)</td></tr>
|
||||
<tr><td>permission/</td><td>menuList.vue, permissionList.vue, roleList.vue</td><td>权限管理(菜单/权限项/角色)</td></tr>
|
||||
<tr><td>customer/</td><td>index.vue, detail.vue, editCustomer.vue, employee.vue, user.vue, myCustomer.vue, packages.vue, packageOverview.vue, quotaChangeLog.vue, uiConfig.vue, accessToken.vue, extendApplyList.vue</td><td>客户管理(12个页面)</td></tr>
|
||||
<tr><td>app/</td><td>appList.vue, appDetail.vue</td><td>应用管理</td></tr>
|
||||
<tr><td>404.vue</td><td>—</td><td>404 错误页</td></tr>
|
||||
<tr><td>home/</td><td>index.vue</td><td>首页看板(保留作为默认着陆页)</td></tr>
|
||||
</table>
|
||||
|
||||
<h3>1.2 API 文件 (api/) — <span class="badge badge-keep">保留 8 个</span></h3>
|
||||
<table>
|
||||
<tr><th>文件</th><th>行数</th><th>功能</th></tr>
|
||||
<tr><td>user.js</td><td>99</td><td>登录/注册/用户管理/获取当前用户</td></tr>
|
||||
<tr><td>permissionApi.js</td><td>104</td><td>菜单/权限/角色 CRUD</td></tr>
|
||||
<tr><td>menuApi.js</td><td>79</td><td>动态路由构建(从后端菜单数据生成 Vue 路由)</td></tr>
|
||||
<tr><td>appApi.js</td><td>31</td><td>应用管理 CRUD</td></tr>
|
||||
<tr><td>customerApi.js</td><td>100</td><td>客户管理 CRUD + 用户关联</td></tr>
|
||||
<tr><td>customerPackageApi.js</td><td>56</td><td>客户套餐管理</td></tr>
|
||||
<tr><td>accessTokenApi.js</td><td>33</td><td>AccessToken 管理</td></tr>
|
||||
<tr><td>organizationApi.js</td><td>43</td><td>组织架构管理</td></tr>
|
||||
</table>
|
||||
|
||||
<h3>1.3 框架文件 — <span class="badge badge-keep">全量保留</span></h3>
|
||||
<table>
|
||||
<tr><th>类别</th><th>文件</th><th>说明</th></tr>
|
||||
<tr><td>入口</td><td>main.js, App.vue</td><td>需修改(移除业务引用)</td></tr>
|
||||
<tr><td>路由</td><td>router/index.js</td><td>需大幅修改(移除业务路由)</td></tr>
|
||||
<tr><td>布局</td><td>layout/index.vue, Sidebar/, TagsView/, TopHeader.vue</td><td>全量保留</td></tr>
|
||||
<tr><td>Store</td><td>store/index.js, getters.js, modules/user.js, settings.js, tagsView.js</td><td>user.js 需修改(移除 huobanToken)</td></tr>
|
||||
<tr><td>Utils</td><td>request.js, index.js, validate.js, get-page-title.js, msgUtil.js, public.js, constUtil.js, envUtil.js, autoRefresh.js, uiSizeUtil.js</td><td>request.js 需修改(移除 huoban 逻辑)</td></tr>
|
||||
<tr><td>组件</td><td>breadcrumb.vue, tagView.vue, pageBox.vue, iframeView.vue</td><td>全量保留</td></tr>
|
||||
<tr><td>样式</td><td>styles/index.scss, variables.scss, mixin.scss, sidebar.scss, transition.scss, element-ui.scss</td><td>保留(删除 tracing-screen.scss)</td></tr>
|
||||
<tr><td>构建配置</td><td>package.json, vue.config.js, babel.config.js, postcss.config.js, jsconfig.json</td><td>需修改(移除业务依赖)</td></tr>
|
||||
<tr><td>静态资源</td><td>public/index.html, public/static/</td><td>保留</td></tr>
|
||||
<tr><td>图片资源</td><td>assets/404_images/, assets/images/, assets/base.scss</td><td>保留</td></tr>
|
||||
</table>
|
||||
|
||||
<!-- ==================== Step 2: 删除清单 ==================== -->
|
||||
<h2>Step 2: 删除清单(业务相关)</h2>
|
||||
|
||||
<h3>2.1 页面删除 — <span class="badge badge-remove">102 个 .vue 文件</span></h3>
|
||||
<table>
|
||||
<tr><th>目录</th><th>文件数</th><th>业务域</th></tr>
|
||||
<tr><td>fei/</td><td>22</td><td>智慧农业大屏/可视化</td></tr>
|
||||
<tr><td>trace/</td><td>21</td><td>溯源管理</td></tr>
|
||||
<tr><td>weight/</td><td>13</td><td>自助过磅系统</td></tr>
|
||||
<tr><td>system/</td><td>9</td><td>系统配置(含业务配置项)</td></tr>
|
||||
<tr><td>ai/</td><td>7</td><td>AI 助手/LLM</td></tr>
|
||||
<tr><td>huoban/</td><td>7</td><td>伙伴云表单配置</td></tr>
|
||||
<tr><td>tracing/</td><td>6</td><td>溯源追踪/路线</td></tr>
|
||||
<tr><td>irrigation/</td><td>2</td><td>灌溉管理</td></tr>
|
||||
<tr><td>其他</td><td>15</td><td>base, brain, certify, payment, park, waterFertilizer, fertigationDevice, extLink, preference, agreement, certifyAgreement, web, tracking</td></tr>
|
||||
</table>
|
||||
|
||||
<h3>2.2 API 删除 — <span class="badge badge-remove">30+ 个 .js 文件</span></h3>
|
||||
<table>
|
||||
<tr><th>文件</th><th>业务域</th></tr>
|
||||
<tr><td>aiSkill.js, llmAgentApi.js, llmAgentSkillApi.js, llmAgentToolApi.js, llmConversationApi.js, llmModelApi.js, llmToolApi.js, llmToolLogApi.js</td><td>AI/LLM</td></tr>
|
||||
<tr><td>fei/</td><td>智慧农业</td></tr>
|
||||
<tr><td>trace/, traceabilityApi.js, trackingConfigApi.js</td><td>溯源</td></tr>
|
||||
<tr><td>weightApi.js</td><td>过磅</td></tr>
|
||||
<tr><td>huobanTableApi.js</td><td>伙伴云</td></tr>
|
||||
<tr><td>farmPlan.js, inspection.js, inputMaterial.js, irrigation.js, park.js, fertigationDevice.js, cameraInfo.js</td><td>农业/设备</td></tr>
|
||||
<tr><td>quotaApi.js, packagePlanApi.js</td><td>配额/方案</td></tr>
|
||||
<tr><td>n8nApi.js</td><td>N8N 工作流</td></tr>
|
||||
<tr><td>extLink.js, userPreference.js</td><td>外链/偏好</td></tr>
|
||||
</table>
|
||||
|
||||
<h3>2.3 Utils 删除</h3>
|
||||
<table>
|
||||
<tr><th>文件</th><th>原因</th></tr>
|
||||
<tr><td>ezvizConfig.js, ezvizStream.js</td><td>萤石云视频流(业务专用)</td></tr>
|
||||
<tr><td>tracingDisplay.js, tracingPermission.js, tracingQualPermission.js, tracingTestCertificate.js</td><td>溯源专用工具</td></tr>
|
||||
<tr><td>huobanAuth.js</td><td>伙伴云鉴权(业务专用)</td></tr>
|
||||
<tr><td>markdown.js, wangEditConfig.js</td><td>富文本编辑器配置(业务页面用)</td></tr>
|
||||
<tr><td>tracingDisplay.js</td><td>溯源展示</td></tr>
|
||||
</table>
|
||||
|
||||
<h3>2.4 组件删除</h3>
|
||||
<table>
|
||||
<tr><th>目录/文件</th><th>原因</th></tr>
|
||||
<tr><td>components/ai/</td><td>AI 组件</td></tr>
|
||||
<tr><td>components/brain/</td><td>大屏组件</td></tr>
|
||||
<tr><td>components/tracing/</td><td>溯源组件</td></tr>
|
||||
<tr><td>components/MarkdownContent.vue</td><td>富文本组件</td></tr>
|
||||
</table>
|
||||
|
||||
<h3>2.5 样式删除</h3>
|
||||
<table>
|
||||
<tr><th>文件</th><th>原因</th></tr>
|
||||
<tr><td>styles/tracing-screen.scss</td><td>溯源大屏样式</td></tr>
|
||||
</table>
|
||||
|
||||
<h3>2.6 Config 删除</h3>
|
||||
<table>
|
||||
<tr><th>文件</th><th>原因</th></tr>
|
||||
<tr><td>config/ezviz.js, config/ezviz.example.js</td><td>萤石云配置</td></tr>
|
||||
<tr><td>config/tracingOpenKey.js</td><td>溯源 OpenKey 配置</td></tr>
|
||||
</table>
|
||||
|
||||
<!-- ==================== Step 3: 文件修改清单 ==================== -->
|
||||
<h2>Step 3: 文件修改清单</h2>
|
||||
|
||||
<h3>3.1 router/index.js <span class="badge badge-modify">大幅修改</span></h3>
|
||||
<p>移除所有业务路由,只保留账权路由:</p>
|
||||
<table>
|
||||
<tr><th>操作</th><th>路由</th><th>说明</th></tr>
|
||||
<tr><td class="keep">保留</td><td>/login, /register</td><td>登录/注册</td></tr>
|
||||
<tr><td class="keep">保留</td><td>/user/* (list, pwd, info, sso, editProfile)</td><td>用户管理</td></tr>
|
||||
<tr><td class="keep">保留</td><td>/base/* (app/list, app/detail, permission/*)</td><td>应用+权限管理</td></tr>
|
||||
<tr><td class="keep">保留</td><td>/customer/* (index, detail, user, my, employee, edit)</td><td>客户管理</td></tr>
|
||||
<tr><td class="keep">保留</td><td>/error/404, / (redirect to login)</td><td>404 + 默认重定向</td></tr>
|
||||
<tr><td class="remove">删除</td><td>/certify, /certifyAgreement, /agreement</td><td>认证协议页</td></tr>
|
||||
<tr><td class="remove">删除</td><td>/huoban/*</td><td>伙伴云配置</td></tr>
|
||||
<tr><td class="remove">删除</td><td>/weight/*</td><td>过磅系统</td></tr>
|
||||
<tr><td class="remove">删除</td><td>/tracing/*</td><td>溯源管理</td></tr>
|
||||
<tr><td class="remove">删除</td><td>/fei_screen, /screen/fei, /brain, /tracing_screen</td><td>大屏入口</td></tr>
|
||||
<tr><td class="remove">删除</td><td>/common (空 children)</td><td>无意义路由</td></tr>
|
||||
</table>
|
||||
|
||||
<h3>3.2 main.js <span class="badge badge-modify">修改</span></h3>
|
||||
<ul>
|
||||
<li>移除 <code>import echarts</code> 和 <code>Vue.prototype.$echarts</code></li>
|
||||
<li>移除 <code>import userPreferenceApi</code> 及相关调用(或保留为空操作)</li>
|
||||
<li>清理 staticPages 数组,移除业务页面路径</li>
|
||||
<li>保留核心逻辑:getCurrentUser → setLoginUser → getMyApps → loadAppMenus → matchCurrentPath</li>
|
||||
</ul>
|
||||
|
||||
<h3>3.3 utils/request.js <span class="badge badge-modify">修改</span></h3>
|
||||
<ul>
|
||||
<li>删除 <code>isHuobanWebApi()</code> 函数</li>
|
||||
<li>简化 <code>resolveRequestToken()</code>:直接返回 <code>localStorage.getItem('_token')</code></li>
|
||||
<li>清理 staticPages 数组,移除业务页面路径</li>
|
||||
</ul>
|
||||
|
||||
<h3>3.4 store/modules/user.js <span class="badge badge-modify">修改</span></h3>
|
||||
<ul>
|
||||
<li>删除 <code>huobanToken</code> state</li>
|
||||
<li>删除 <code>SET_HUOBAN_TOKEN</code> mutation</li>
|
||||
<li>删除 <code>setHuobanToken</code> action</li>
|
||||
</ul>
|
||||
|
||||
<h3>3.5 store/getters.js <span class="badge badge-modify">修改</span></h3>
|
||||
<p>当前 getters 引用了不存在的 module(app, permission, errorLog, common),需要清理:</p>
|
||||
<ul>
|
||||
<li>删除 <code>sidebar</code>, <code>size</code>, <code>device</code>(引用 state.app,不存在)</li>
|
||||
<li>删除 <code>permission_routes</code>(引用 state.permission,不存在)</li>
|
||||
<li>删除 <code>errorLogs</code>(引用 state.errorLog,不存在)</li>
|
||||
<li>删除 <code>common_baseURL</code>(引用 state.common,不存在)</li>
|
||||
<li>保留 <code>token</code>, <code>avatar</code>, <code>name</code>, <code>introduction</code>, <code>roles</code>(引用 state.user,但需确认 user 模块是否有这些字段)</li>
|
||||
</ul>
|
||||
|
||||
<h3>3.6 vue.config.js <span class="badge badge-modify">修改</span></h3>
|
||||
<ul>
|
||||
<li>移除 <code>MonacoWebpackPlugin</code> 引用和使用</li>
|
||||
<li>移除 n8n 代理配置</li>
|
||||
<li>移除 externals 中的 <code>echarts</code> 和 <code>monaco-editor</code></li>
|
||||
<li>移除 splitChunks 中的 monaco/echarts/wangEditor 缓存组</li>
|
||||
<li>更新 <code>outputDir</code> 从 <code>"saas-web"</code> 改为 <code>"authon-web"</code></li>
|
||||
<li>更新 <code>devServer.public</code> 域名</li>
|
||||
</ul>
|
||||
|
||||
<h3>3.7 package.json <span class="badge badge-modify">修改</span></h3>
|
||||
<p>移除业务专用依赖:</p>
|
||||
<table>
|
||||
<tr><th>操作</th><th>依赖</th><th>原因</th></tr>
|
||||
<tr><td class="remove">删除</td><td>@amap/amap-jsapi-loader</td><td>高德地图</td></tr>
|
||||
<tr><td class="remove">删除</td><td>@wangeditor/editor, editor-for-vue</td><td>富文本编辑器</td></tr>
|
||||
<tr><td class="remove">删除</td><td>echarts</td><td>图表库</td></tr>
|
||||
<tr><td class="remove">删除</td><td>html2canvas, jspdf</td><td>截图/PDF</td></tr>
|
||||
<tr><td class="remove">删除</td><td>monaco-editor, monaco-editor-webpack-plugin, vue-monaco</td><td>代码编辑器</td></tr>
|
||||
<tr><td class="remove">删除</td><td>marked, highlight.js</td><td>Markdown</td></tr>
|
||||
<tr><td class="remove">删除</td><td>qrcodejs2</td><td>二维码</td></tr>
|
||||
<tr><td class="remove">删除</td><td>fix, them, to</td><td>无效/可疑依赖</td></tr>
|
||||
<tr><td class="keep">保留</td><td>axios, core-js, element-ui, vue, vue-router, vuex, nprogress, path-to-regexp, normalize.css, animate.css, svg-sprite-loader</td><td>框架必需</td></tr>
|
||||
</table>
|
||||
|
||||
<h3>3.8 public/index.html <span class="badge badge-modify">修改</span></h3>
|
||||
<ul>
|
||||
<li>更新 <code><title></code> 为 "apes-Authon"</li>
|
||||
<li>移除 echarts/monaco CDN 引用(如果有)</li>
|
||||
</ul>
|
||||
|
||||
<!-- ==================== Step 4: 执行步骤 ==================== -->
|
||||
<h2>Step 4: 执行步骤</h2>
|
||||
|
||||
<div class="card">
|
||||
<ol>
|
||||
<li><strong>创建仓库</strong>:在 Gitea 创建 <code>apes-Authon-Web</code> 仓库</li>
|
||||
<li><strong>复制源码</strong>:<code>cp -r gitea-upload/web-master apes-Authon-Web</code></li>
|
||||
<li><strong>删除业务页面</strong>:删除 20 个业务 views 目录</li>
|
||||
<li><strong>删除业务 API</strong>:删除 30+ 个业务 api 文件</li>
|
||||
<li><strong>删除业务组件</strong>:删除 ai/brain/tracing/MarkdownContent</li>
|
||||
<li><strong>删除业务 Utils</strong>:删除 ezviz/tracing/huoban/markdown/wangEdit 文件</li>
|
||||
<li><strong>删除业务 Config</strong>:删除 ezviz/tracingOpenKey 文件</li>
|
||||
<li><strong>删除业务样式</strong>:删除 tracing-screen.scss</li>
|
||||
<li><strong>修改 router/index.js</strong>:移除业务路由</li>
|
||||
<li><strong>修改 main.js</strong>:移除 echarts/userPreference 引用</li>
|
||||
<li><strong>修改 utils/request.js</strong>:移除 huoban 逻辑</li>
|
||||
<li><strong>修改 store/user.js</strong>:移除 huobanToken</li>
|
||||
<li><strong>修改 store/getters.js</strong>:清理不存在的 module 引用</li>
|
||||
<li><strong>修改 vue.config.js</strong>:移除 monaco/echarts/n8n 配置</li>
|
||||
<li><strong>修改 package.json</strong>:移除业务依赖,更新名称</li>
|
||||
<li><strong>修改 public/index.html</strong>:更新标题</li>
|
||||
<li><strong>编写 README.md</strong>:项目说明</li>
|
||||
<li><strong>验证 build</strong>:<code>npm install && npm run build:prod</code></li>
|
||||
<li><strong>Git 初始化 + 推送</strong>:提交到 Gitea</li>
|
||||
</ol>
|
||||
</div>
|
||||
|
||||
<!-- ==================== Step 5: 风险与注意事项 ==================== -->
|
||||
<h2>Step 5: 风险与注意事项</h2>
|
||||
|
||||
<div class="warning">
|
||||
<p><strong>⚠️ 依赖链风险</strong>:部分账权页面可能引用了业务组件或工具函数,需在删除后逐一排查编译错误。</p>
|
||||
</div>
|
||||
|
||||
<div class="note">
|
||||
<p><strong>已知潜在问题</strong>:</p>
|
||||
<ul>
|
||||
<li><code>store/getters.js</code> 引用了 4 个不存在的 store module(app/permission/errorLog/common),这些是模板残留,清理时需确保没有页面依赖这些 getter</li>
|
||||
<li><code>menuApi.js</code> 中的 <code>handleMenu</code> 方法可能引用了业务页面的 <code>require.context</code> 映射,需确认是否能正常工作(当业务 .vue 文件被删除后)</li>
|
||||
<li><code>customer/index.vue</code>(81KB)体量很大,可能包含业务联动逻辑,需检查是否引用了业务 API</li>
|
||||
<li><code>views/base/imageUpload</code> 被放在 base 路由下,可能是公共图片上传组件,需要保留</li>
|
||||
<li>需确认 <code>userPreference.js</code> 是否为账权功能(UI 尺寸偏好),如需要则保留 API 和 main.js 中的调用</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<h3>与后端 apes-Authon 的对应关系</h3>
|
||||
<table>
|
||||
<tr><th>后端 Controller</th><th>前端页面</th><th>API 文件</th></tr>
|
||||
<tr><td>UserController</td><td>views/user/</td><td>user.js</td></tr>
|
||||
<tr><td>PermissionController</td><td>views/permission/</td><td>permissionApi.js</td></tr>
|
||||
<tr><td>CustomerController</td><td>views/customer/</td><td>customerApi.js</td></tr>
|
||||
<tr><td>AppController</td><td>views/app/</td><td>appApi.js</td></tr>
|
||||
<tr><td>MenuController(菜单接口)</td><td>menuApi.js 处理动态路由</td><td>menuApi.js</td></tr>
|
||||
<tr><td>AccessTokenController</td><td>views/customer/accessToken.vue</td><td>accessTokenApi.js</td></tr>
|
||||
<tr><td>SSOController</td><td>views/user/sso.vue, views/login/index.vue</td><td>user.js (ssoLogin)</td></tr>
|
||||
<tr><td>CustomerPackageController</td><td>views/customer/packages.vue</td><td>customerPackageApi.js</td></tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<!-- ==================== 总结 ==================== -->
|
||||
<h2>总结</h2>
|
||||
|
||||
<div class="summary-grid">
|
||||
<div class="summary-card"><div class="num" style="color: var(--green);">24</div><div class="label">保留页面</div></div>
|
||||
<div class="summary-card"><div class="num" style="color: var(--red);">102</div><div class="label">删除页面</div></div>
|
||||
<div class="summary-card"><div class="num" style="color: var(--yellow);">8</div><div class="label">修改文件</div></div>
|
||||
</div>
|
||||
|
||||
<p>剥离后 apes-Authon-Web 将是一个纯净的账权管理前端,包含:登录注册、用户管理、客户管理、权限管理(菜单/角色/权限项)、应用管理、AccessToken 管理、SSO 配置。与后端 apes-Authon 一一对应。</p>
|
||||
|
||||
<p style="margin-top: 24px; color: var(--text-dim); font-size: 13px;">方案生成时间:2026-08-09 | 源码版本:saas-web v1.0.0 | 框架:Vue 2.7 + Element UI 2.15</p>
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,199 @@
|
||||
# apes-Authon-Web 前端剥离方案
|
||||
|
||||
> 从 saas-web 单体前端中提取纯净账权页面,构建独立的 `apes-Authon-Web` 前端仓库,与后端 `apes-Authon` 配合使用。
|
||||
|
||||
- **源仓库**: gitea-upload/web-master
|
||||
- **目标仓库**: apes-Authon-Web
|
||||
- **技术栈**: Vue 2.7 + Element UI + Vuex + Vue Router
|
||||
|
||||
## 概览
|
||||
|
||||
| 分类 | 数量 | 说明 |
|
||||
|------|------|------|
|
||||
| 账权页面保留 | 24 | login、register、user、permission、customer、app |
|
||||
| 系统配置保留 | 9 | organization、operationlog、quota、packagePlan |
|
||||
| AI/LLM 页面保留 | 11 | llmModel、llmAgent、aiHelper、ai 工具管理 |
|
||||
| 业务页面删除 | ~82 | fei、trace、weight、tracing、irrigation 等 |
|
||||
| 框架文件修改 | 8 | router、main.js、request.js、store 等 |
|
||||
|
||||
## Step 1: 保留清单
|
||||
|
||||
### 1.1 页面 (views/) — 保留
|
||||
|
||||
| 目录 | 文件 | 功能 |
|
||||
|------|------|------|
|
||||
| login/ | index.vue | 登录页(短信+密码+SSO) |
|
||||
| register/ | index.vue | 注册页 |
|
||||
| user/ | list.vue, editProfile.vue, info.vue, pwd.vue, sso.vue | 用户管理 |
|
||||
| permission/ | menuList.vue, permissionList.vue, roleList.vue | 权限管理 |
|
||||
| customer/ | index.vue, detail.vue, editCustomer.vue, employee.vue, user.vue, myCustomer.vue, packages.vue, packageOverview.vue, quotaChangeLog.vue, uiConfig.vue, accessToken.vue, extendApplyList.vue | 客户管理(12个页面) |
|
||||
| app/ | appList.vue, appDetail.vue | 应用管理 |
|
||||
| system/ | organization/, operationlog/, quota/, packagePlan/, llmModel/, llmAgent/, aiHelper/ | 系统配置 + AI/LLM 配置 |
|
||||
| ai/ | tool.vue, toolEdit.vue, skill.vue, toolLog.vue, callLog.vue, conversationHistory.vue, chat.vue | AI 工具管理 |
|
||||
| home/ | index.vue | 首页看板 |
|
||||
| 404.vue | — | 404 错误页 |
|
||||
|
||||
### 1.2 API 文件 (api/) — 保留
|
||||
|
||||
| 文件 | 功能 |
|
||||
|------|------|
|
||||
| user.js | 登录/注册/用户管理/获取当前用户 |
|
||||
| permissionApi.js | 菜单/权限/角色 CRUD |
|
||||
| menuApi.js | 动态路由构建 |
|
||||
| appApi.js | 应用管理 CRUD |
|
||||
| customerApi.js | 客户管理 CRUD |
|
||||
| customerPackageApi.js | 客户套餐管理 |
|
||||
| accessTokenApi.js | AccessToken 管理 |
|
||||
| organizationApi.js | 组织架构管理 |
|
||||
| quotaApi.js | 配额管理 |
|
||||
| packagePlanApi.js | 套餐方案管理 |
|
||||
| llmAgentApi.js | LLM Agent 管理 |
|
||||
| llmAgentSkillApi.js | LLM Agent 技能管理 |
|
||||
| llmAgentToolApi.js | LLM Agent 工具管理 |
|
||||
| llmModelApi.js | LLM 模型配置 |
|
||||
| llmConversationApi.js | LLM 对话管理 |
|
||||
| llmToolApi.js | LLM 工具管理 |
|
||||
| llmToolLogApi.js | LLM 工具日志 |
|
||||
| aiSkill.js | AI 技能管理 |
|
||||
|
||||
### 1.3 框架文件 — 全量保留(部分需修改)
|
||||
|
||||
| 类别 | 文件 | 说明 |
|
||||
|------|------|------|
|
||||
| 入口 | main.js, App.vue | 需修改(移除业务引用) |
|
||||
| 路由 | router/index.js | 需大幅修改(移除业务路由) |
|
||||
| 布局 | layout/index.vue, Sidebar/, TagsView/, TopHeader.vue | 全量保留 |
|
||||
| Store | store/index.js, getters.js, modules/user.js, settings.js, tagsView.js | user.js + getters.js 需修改 |
|
||||
| Utils | request.js, index.js, validate.js, get-page-title.js, msgUtil.js, public.js, constUtil.js, envUtil.js, autoRefresh.js, uiSizeUtil.js | request.js 需修改 |
|
||||
| 组件 | breadcrumb.vue, tagView.vue, pageBox.vue, iframeView.vue, ai/ai_helper.vue | 保留 |
|
||||
| 样式 | styles/index.scss, variables.scss, mixin.scss, sidebar.scss, transition.scss, element-ui.scss | 保留(删除 tracing-screen.scss) |
|
||||
| 构建配置 | package.json, vue.config.js, babel.config.js, postcss.config.js, jsconfig.json | 需修改 |
|
||||
| 静态资源 | public/index.html, public/static/ | 保留 |
|
||||
| 图片资源 | assets/404_images/, assets/images/, assets/base.scss | 保留 |
|
||||
|
||||
## Step 2: 删除清单(业务相关)
|
||||
|
||||
### 2.1 页面删除
|
||||
|
||||
| 目录 | 文件数 | 业务域 |
|
||||
|------|--------|--------|
|
||||
| fei/ | 22 | 智慧农业大屏/可视化 |
|
||||
| trace/ | 21 | 溯源管理 |
|
||||
| weight/ | 13 | 自助过磅系统 |
|
||||
| tracing/ | 6 | 溯源追踪/路线 |
|
||||
| irrigation/ | 2 | 灌溉管理 |
|
||||
| 其他 | ~18 | base, brain, certify, payment, park, waterFertilizer, fertigationDevice, extLink, preference, agreement, certifyAgreement, web, tracking, huoban |
|
||||
|
||||
> **注意**: huoban/ 目录暂不保留,作为后续 Phase 5C 代办。
|
||||
|
||||
### 2.2 API 删除
|
||||
|
||||
| 文件 | 业务域 |
|
||||
|------|--------|
|
||||
| fei/ 目录 | 智慧农业 |
|
||||
| trace/, traceabilityApi.js, trackingConfigApi.js | 溯源 |
|
||||
| weightApi.js | 过磅 |
|
||||
| huobanTableApi.js | 伙伴云 |
|
||||
| farmPlan.js, inspection.js, inputMaterial.js, irrigation.js, park.js, fertigationDevice.js, cameraInfo.js | 农业/设备 |
|
||||
| n8nApi.js | N8N 工作流 |
|
||||
| extLink.js, userPreference.js | 外链/偏好 |
|
||||
|
||||
### 2.3 Utils 删除
|
||||
|
||||
| 文件 | 原因 |
|
||||
|------|------|
|
||||
| ezvizConfig.js, ezvizStream.js | 萤石云视频流 |
|
||||
| tracingDisplay.js, tracingPermission.js, tracingQualPermission.js, tracingTestCertificate.js | 溯源专用 |
|
||||
| huobanAuth.js | 伙伴云鉴权 |
|
||||
| markdown.js, wangEditConfig.js | 富文本编辑器 |
|
||||
|
||||
### 2.4 组件删除
|
||||
|
||||
| 目录/文件 | 原因 |
|
||||
|-----------|------|
|
||||
| components/brain/ | 大屏组件 |
|
||||
| components/tracing/ | 溯源组件 |
|
||||
| components/MarkdownContent.vue | 富文本组件 |
|
||||
|
||||
### 2.5 样式删除
|
||||
|
||||
| 文件 | 原因 |
|
||||
|------|------|
|
||||
| styles/tracing-screen.scss | 溯源大屏样式 |
|
||||
|
||||
### 2.6 Config 删除
|
||||
|
||||
| 文件 | 原因 |
|
||||
|------|------|
|
||||
| config/ezviz.js, config/ezviz.example.js | 萤石云配置 |
|
||||
| config/tracingOpenKey.js | 溯源 OpenKey 配置 |
|
||||
|
||||
## Step 3: 文件修改清单
|
||||
|
||||
### 3.1 router/index.js — 大幅修改
|
||||
- 保留: /login, /register, /user/*, /base/*, /customer/*, /system/*, /ai/*, /error/404
|
||||
- 删除: /certify, /huoban/*, /weight/*, /tracing/*, /fei_screen, /brain, /tracing_screen, /common
|
||||
|
||||
### 3.2 main.js — 修改
|
||||
- 移除 echarts 引用
|
||||
- 清理 staticPages 数组
|
||||
- 保留核心逻辑
|
||||
|
||||
### 3.3 utils/request.js — 修改
|
||||
- 删除 isHuobanWebApi() 函数
|
||||
- 简化 resolveRequestToken()
|
||||
- 清理 staticPages
|
||||
|
||||
### 3.4 store/modules/user.js — 修改
|
||||
- 删除 huobanToken state/mutation/action
|
||||
|
||||
### 3.5 store/getters.js — 修改
|
||||
- 清理不存在的 module 引用(app/permission/errorLog/common)
|
||||
|
||||
### 3.6 vue.config.js — 修改
|
||||
- 移除 MonacoWebpackPlugin
|
||||
- 移除 n8n 代理
|
||||
- 移除 echarts/monaco externals
|
||||
- 更新 outputDir 为 "authon-web"
|
||||
|
||||
### 3.7 package.json — 修改
|
||||
- 移除: @amap/amap-jsapi-loader, @wangeditor/*, echarts, html2canvas, jspdf, monaco-editor/*, marked, highlight.js, qrcodejs2
|
||||
- 更新 name 为 "apes-Authon-Web"
|
||||
|
||||
### 3.8 public/index.html — 修改
|
||||
- 更新 title 为 "apes-Authon"
|
||||
|
||||
## Step 4: 与后端对应关系
|
||||
|
||||
| 后端 Controller | 前端页面 | API 文件 |
|
||||
|----------------|----------|----------|
|
||||
| UserController | views/user/ | user.js |
|
||||
| PermissionController | views/permission/ | permissionApi.js |
|
||||
| CustomerController | views/customer/ | customerApi.js |
|
||||
| AppController | views/app/ | appApi.js |
|
||||
| MenuController | menuApi.js | menuApi.js |
|
||||
| AccessTokenController | views/customer/accessToken.vue | accessTokenApi.js |
|
||||
| SSOController | views/user/sso.vue, views/login/ | user.js |
|
||||
| CustomerPackageController | views/customer/packages.vue | customerPackageApi.js |
|
||||
| SysOrganizationController | views/system/organization/ | organizationApi.js |
|
||||
| SysOperationLogController | views/system/operationlog/ | — |
|
||||
| SysQuotaController | views/system/quota/ | quotaApi.js |
|
||||
| SysPackagePlanController | views/system/packagePlan/ | packagePlanApi.js |
|
||||
| LlmModelConfigController | views/system/llmModel/ | llmModelApi.js |
|
||||
| LlmAgentConfigController | views/system/llmAgent/ | llmAgentApi.js |
|
||||
| AiController | views/system/aiHelper/ | aiSkill.js |
|
||||
| LlmToolController | views/ai/tool.vue | llmToolApi.js |
|
||||
| LlmChatController | views/ai/chat.vue | — |
|
||||
| LlmConversationController | views/ai/conversationHistory.vue | llmConversationApi.js |
|
||||
|
||||
## Step 5: 后续代办
|
||||
|
||||
| 代办 | 说明 |
|
||||
|------|------|
|
||||
| Phase 5C: 伙伴云表单 | 7 .vue + 1 API,后端 5 Controller 待提取 |
|
||||
| Phase 4: SDK化 | AuthContext 远程调用 SDK |
|
||||
| Phase 5: 网关集成 | API 网关统一鉴权 |
|
||||
|
||||
---
|
||||
|
||||
*方案生成时间: 2026-08-09 | 源码版本: saas-web v1.0.0 | 框架: Vue 2.7 + Element UI 2.15*
|
||||
@@ -0,0 +1,344 @@
|
||||
# apes-Authon-Web 剥离历史与说明
|
||||
|
||||
> 本文档记录从 saas-web 单体前端剥离纯净账权页面的执行过程、变更明细和框架修改说明。
|
||||
|
||||
- **源仓库**: saas-web(单体前端,含 120+ 页面)
|
||||
- **目标仓库**: apes-Authon-Web(纯净账权前端,40 页面)
|
||||
- **剥离时间**: 2026-08-09
|
||||
- **提交**: `8ebd1ca` — 176 files changed, +222/-60093
|
||||
|
||||
---
|
||||
|
||||
## 一、剥离概览
|
||||
|
||||
| 分类 | 数量 | 说明 |
|
||||
|------|------|------|
|
||||
| 账权页面保留 | 24 | login、register、user、permission、customer、app |
|
||||
| 系统配置保留 | 9 | organization、operationlog、quota、packagePlan |
|
||||
| AI/LLM 页面保留 | 11 | llmModel、llmAgent、aiHelper、ai 工具管理 |
|
||||
| 业务页面删除 | ~82 | fei、trace、weight、tracing、irrigation 等 |
|
||||
| 框架文件修改 | 8 | router、main.js、request.js、store 等 |
|
||||
| 代码变更量 | +222 / -60093 | 净减约 6 万行业务代码 |
|
||||
|
||||
---
|
||||
|
||||
## 二、保留清单
|
||||
|
||||
### 2.1 页面 (views/)
|
||||
|
||||
| 目录 | 文件 | 功能 |
|
||||
|------|------|------|
|
||||
| login/ | index.vue | 登录页(短信验证码 + 密码 + SSO) |
|
||||
| register/ | index.vue | 注册页 |
|
||||
| user/ | list.vue, editProfile.vue, info.vue, pwd.vue, sso.vue | 用户管理(5 个页面) |
|
||||
| permission/ | menuList.vue, permissionList.vue, roleList.vue | 权限管理(3 个页面) |
|
||||
| customer/ | index.vue, detail.vue, editCustomer.vue, employee.vue, user.vue, myCustomer.vue, packages.vue, packageOverview.vue, quotaChangeLog.vue, uiConfig.vue, accessToken.vue, extendApplyList.vue | 客户管理(12 个页面) |
|
||||
| app/ | appList.vue, appDetail.vue | 应用管理 |
|
||||
| system/ | organization/, operationlog/, quota/, packagePlan/, llmModel/, llmAgent/, aiHelper/ | 系统配置 + AI/LLM 配置(8 个页面) |
|
||||
| ai/ | tool.vue, toolEdit.vue, skill.vue, toolLog.vue, callLog.vue, conversationHistory.vue, chat.vue | AI 工具管理(7 个页面) |
|
||||
| home/ | index.vue | 首页看板 |
|
||||
| base/ | imageUpload.vue | 图片上传 |
|
||||
| 404.vue | — | 404 错误页 |
|
||||
|
||||
### 2.2 API 文件 (api/) — 19 个
|
||||
|
||||
| 文件 | 功能 |
|
||||
|------|------|
|
||||
| user.js | 登录/注册/用户管理/获取当前用户 |
|
||||
| permissionApi.js | 菜单/权限/角色 CRUD |
|
||||
| menuApi.js | 动态路由构建(require.context) |
|
||||
| appApi.js | 应用管理 CRUD |
|
||||
| customerApi.js | 客户管理 CRUD |
|
||||
| customerPackageApi.js | 客户套餐管理 |
|
||||
| accessTokenApi.js | AccessToken 管理 |
|
||||
| organizationApi.js | 组织架构管理 |
|
||||
| quotaApi.js | 配额管理 |
|
||||
| packagePlanApi.js | 套餐方案管理 |
|
||||
| baseApi.js | 基础接口(文件上传等) |
|
||||
| llmModelApi.js | LLM 模型配置 |
|
||||
| llmAgentApi.js | LLM Agent 管理 |
|
||||
| llmAgentSkillApi.js | LLM Agent 技能管理 |
|
||||
| llmAgentToolApi.js | LLM Agent 工具管理 |
|
||||
| llmToolApi.js | LLM 工具管理 |
|
||||
| llmToolLogApi.js | LLM 工具日志 |
|
||||
| llmConversationApi.js | LLM 对话管理 |
|
||||
| aiSkill.js | AI 技能管理 |
|
||||
|
||||
### 2.3 组件 (components/) — 6 个
|
||||
|
||||
| 文件 | 功能 | 备注 |
|
||||
|------|------|------|
|
||||
| breadcrumb.vue | 面包屑导航 | 原样保留 |
|
||||
| tagView.vue | 标签页缓存 | 原样保留 |
|
||||
| pageBox.vue | 页面容器 | 原样保留 |
|
||||
| iframeView.vue | 通用 iframe 组件 | **重写**(见下文) |
|
||||
| MarkdownContent.vue | Markdown 渲染 | **新建**(见下文) |
|
||||
| ai/ai_helper.vue | AI 助手浮窗 | 原样保留 |
|
||||
|
||||
### 2.4 工具函数 (utils/) — 10 个
|
||||
|
||||
| 文件 | 功能 | 备注 |
|
||||
|------|------|------|
|
||||
| request.js | Axios 封装 | **修改**(见下文) |
|
||||
| index.js | 通用工具函数 | 原样保留 |
|
||||
| validate.js | 校验工具 | 原样保留 |
|
||||
| msgUtil.js | 消息提示 | 原样保留 |
|
||||
| public.js | 公共方法 | 原样保留 |
|
||||
| constUtil.js | 常量 | 原样保留 |
|
||||
| envUtil.js | 环境变量 | 原样保留 |
|
||||
| autoRefresh.js | 自动刷新 | 原样保留 |
|
||||
| uiSizeUtil.js | UI 尺寸 | 原样保留 |
|
||||
| get-page-title.js | 页面标题 | 原样保留 |
|
||||
|
||||
---
|
||||
|
||||
## 三、删除清单
|
||||
|
||||
### 3.1 页面删除
|
||||
|
||||
| 目录 | 文件数 | 业务域 |
|
||||
|------|--------|--------|
|
||||
| fei/ | 22 | 智慧农业大屏/可视化 |
|
||||
| trace/ | 21 | 溯源管理 |
|
||||
| weight/ | 13 | 自助过磅系统 |
|
||||
| tracing/ | 6 | 溯源追踪/路线 |
|
||||
| irrigation/ | 2 | 灌溉管理 |
|
||||
| brain/ | 3 | AI 大脑 |
|
||||
| certify/ | 5 | 认证管理 |
|
||||
| certifyAgreement/ | 1 | 认证协议 |
|
||||
| payment/ | 1 | 支付 |
|
||||
| park/ | 2 | 园区管理 |
|
||||
| waterFertilizer/ | 2 | 水肥一体化 |
|
||||
| fertigationDevice/ | 2 | 施肥设备 |
|
||||
| extLink/ | 1 | 外部链接 |
|
||||
| preference/ | 1 | 偏好设置 |
|
||||
| agreement/ | 1 | 协议管理 |
|
||||
| web/ | 1 | Web iframe |
|
||||
| tracking/ | 1 | 追踪 |
|
||||
| huoban/ | 1 | 伙伴云(Phase 5C 代办) |
|
||||
| 其他 | ~3 | PAGECODE.md 等 |
|
||||
|
||||
### 3.2 API 删除
|
||||
|
||||
| 文件/目录 | 业务域 |
|
||||
|-----------|--------|
|
||||
| fei/ 目录 | 智慧农业 |
|
||||
| trace/, traceabilityApi.js, trackingConfigApi.js | 溯源 |
|
||||
| weightApi.js | 过磅 |
|
||||
| huobanTableApi.js | 伙伴云 |
|
||||
| farmPlan.js, inspection.js, inputMaterial.js, irrigation.js, park.js, fertigationDevice.js, cameraInfo.js | 农业/设备 |
|
||||
| n8nApi.js | N8N 工作流 |
|
||||
| extLink.js, userPreference.js | 外链/偏好 |
|
||||
|
||||
### 3.3 工具函数删除
|
||||
|
||||
| 文件 | 原因 |
|
||||
|------|------|
|
||||
| ezvizConfig.js, ezvizStream.js | 萤石云视频流配置 |
|
||||
| tracingDisplay.js, tracingPermission.js, tracingQualPermission.js, tracingTestCertificate.js | 溯源专用工具 |
|
||||
| huobanAuth.js | 伙伴云鉴权 |
|
||||
| markdown.js | 富文本编辑器封装(被 MarkdownContent.vue 替代) |
|
||||
| wangEditConfig.js | wangEditor 富文本配置 |
|
||||
|
||||
### 3.4 组件删除
|
||||
|
||||
| 目录/文件 | 原因 |
|
||||
|-----------|------|
|
||||
| components/brain/ | 大屏专用组件 |
|
||||
| components/tracing/ | 溯源专用组件 |
|
||||
| components/MarkdownContent.vue(原版) | 依赖已删除的 markdown.js,由新版替代 |
|
||||
|
||||
### 3.5 配置删除
|
||||
|
||||
| 文件 | 原因 |
|
||||
|------|------|
|
||||
| config/ezviz.js, config/ezviz.example.js | 萤石云配置 |
|
||||
| config/tracingOpenKey.js | 溯源 OpenKey 配置 |
|
||||
| styles/tracing-screen.scss | 溯源大屏样式 |
|
||||
|
||||
---
|
||||
|
||||
## 四、框架文件修改详情
|
||||
|
||||
### 4.1 router/index.js — 路由重构
|
||||
|
||||
**修改内容**:
|
||||
- 移除所有业务路由(certify、huoban、weight、tracing、fei_screen、brain、tracing_screen)
|
||||
- 保留核心路由:`/login`、`/register`、`/user/*`、`/base/*`、`/customer/*`、`/error/404`、`/`(首页)
|
||||
- 新增 `/common` 路由作为动态菜单路由的容器:
|
||||
|
||||
```javascript
|
||||
{
|
||||
path: '/common',
|
||||
component: LayoutBox,
|
||||
name: 'common',
|
||||
children: [] // 动态路由运行时注入
|
||||
}
|
||||
```
|
||||
|
||||
**原因**:`menuApi.js` 通过 `router.addRoute('common', ...)` 动态注册菜单路由,需要一个名为 `common` 的命名路由作为父容器。
|
||||
|
||||
### 4.2 main.js — 入口精简
|
||||
|
||||
**移除内容**:
|
||||
- `import * as echarts from 'echarts'` 和 `Vue.prototype.$echarts = echarts`(首页看板不再使用 echarts 图表)
|
||||
- `import userPreferenceApi from '@/api/userPreference'` 及相关调用(用户偏好功能已删除)
|
||||
- `staticPages` 数组精简为 `['/register']`(移除了其他静态页面路径)
|
||||
|
||||
**保留内容**:
|
||||
- Token 从 URL 参数读取(SSO 支持)
|
||||
- `getCurrentUser` → `setLoginUser` → `getMyApps` → `loadAppMenus` → `matchCurrentPath` 核心启动流程
|
||||
|
||||
### 4.3 utils/request.js — 请求层简化
|
||||
|
||||
**移除内容**:
|
||||
- `isHuobanWebApi()` 函数(判断是否为伙伴云 API 请求)
|
||||
- `resolveRequestToken()` 辅助函数(根据请求类型解析不同 token)
|
||||
- 伙伴云 token 相关逻辑
|
||||
|
||||
**简化后**:Token 统一从 `localStorage.getItem('_token')` 获取:
|
||||
|
||||
```javascript
|
||||
config.headers = {
|
||||
...config.headers,
|
||||
time: new Date().getTime(),
|
||||
version: '1.1',
|
||||
token: localStorage.getItem('_token') || ''
|
||||
}
|
||||
```
|
||||
|
||||
### 4.4 store/modules/user.js — 状态清理
|
||||
|
||||
**移除内容**:
|
||||
- `huobanToken` state 字段
|
||||
- `SET_HUOBAN_TOKEN` mutation
|
||||
- `setHuobanToken` action
|
||||
|
||||
**保留的 State**:`loginUser`、`menuList`、`currentMenuId`、`currentCustomer`、`appList`、`currentApp`、`currentAppMenus`、`allAppMenus`
|
||||
|
||||
### 4.5 store/getters.js — 清理不存在模块
|
||||
|
||||
**移除内容**:对 `app`、`permission`、`errorLog`、`common` 模块的 getter 引用(这些模块不存在于本项目中)
|
||||
|
||||
**修改后**:
|
||||
|
||||
```javascript
|
||||
const getters = {
|
||||
visitedViews: state => state.tagsView.visitedViews,
|
||||
cachedViews: state => state.tagsView.cachedViews,
|
||||
loginUser: state => state.user.loginUser,
|
||||
currentCustomer: state => state.user.currentCustomer,
|
||||
menuList: state => state.user.menuList,
|
||||
appList: state => state.user.appList,
|
||||
currentApp: state => state.user.currentApp,
|
||||
currentAppMenus: state => state.user.currentAppMenus
|
||||
}
|
||||
```
|
||||
|
||||
### 4.6 vue.config.js — 构建配置更新
|
||||
|
||||
**移除内容**:
|
||||
- `MonacoWebpackPlugin` require 和插件注册
|
||||
- n8n 工作流代理配置
|
||||
- `echarts`、`monaco-editor` 的 externals 配置
|
||||
- monaco/echarts/wangEditor 的 splitChunks cacheGroups
|
||||
|
||||
**修改内容**:
|
||||
- `outputDir`: `"saas-web"` → `"authon-web"`
|
||||
- `name`: 添加 `'apes-Authon'`
|
||||
|
||||
### 4.7 package.json — 依赖清理
|
||||
|
||||
**移除的依赖**:
|
||||
- `@amap/amap-jsapi-loader`(高德地图)
|
||||
- `@wangeditor/core`、`@wangeditor/editor`、`@wangeditor/editor-for-vue`(富文本编辑器)
|
||||
- `echarts`(图表库)
|
||||
- `html2canvas`(截图)
|
||||
- `jspdf`(PDF 生成)
|
||||
- `qrcodejs2`(二维码)
|
||||
|
||||
**保留的特殊依赖**:
|
||||
- `monaco-editor` — AI 工具编辑器使用(`views/ai/toolEdit.vue`)
|
||||
- `vue-monaco` — Monaco Editor 的 Vue 封装
|
||||
- `marked` — AI 对话中的 Markdown 渲染
|
||||
- `highlight.js` — AI 对话中的代码高亮
|
||||
|
||||
### 4.8 public/index.html — CDN 清理
|
||||
|
||||
**移除内容**:
|
||||
- echarts CDN script
|
||||
- monaco-editor CDN scripts(loader、nls、editor.main)
|
||||
|
||||
**保留内容**:
|
||||
- Vue、VueRouter、Vuex、ElementUI、Axios 的 CDN externals
|
||||
|
||||
### 4.9 iframeView.vue — 重写
|
||||
|
||||
**原版**:为每种 iframe 类型(web/payment/huoban)分别导入对应的 view 组件。
|
||||
|
||||
**新版**:统一为单个通用 `<iframe>` 组件,适用于所有 menuType 2/3/4:
|
||||
|
||||
```vue
|
||||
<template>
|
||||
<div class="iframe-container">
|
||||
<iframe :src="frameUrl" frameborder="0" style="width:100%;height:100%"></iframe>
|
||||
</div>
|
||||
</template>
|
||||
```
|
||||
|
||||
### 4.10 menuApi.js — 路由注册统一
|
||||
|
||||
**修改内容**:menuType 2/3/4 统一使用 `@/components/iframeView` 组件,不再为每种类型分别导入 view。
|
||||
|
||||
### 4.11 MarkdownContent.vue — 新建
|
||||
|
||||
**背景**:原版 `MarkdownContent.vue` 导入了已删除的 `@/utils/markdown.js`,导致构建失败。
|
||||
|
||||
**新版**:直接使用 `marked` + `highlight.js`,自包含无外部依赖:
|
||||
|
||||
```javascript
|
||||
import { marked } from 'marked'
|
||||
import hljs from 'highlight.js'
|
||||
import 'highlight.js/styles/github.css'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 五、业务引用清理
|
||||
|
||||
以下文件中移除了对已删除模块的引用,替换为空操作或简化逻辑:
|
||||
|
||||
| 文件 | 移除的引用 | 替代方案 |
|
||||
|------|-----------|----------|
|
||||
| TopHeader.vue | `weightApi`、`clearTracingPermissionCache`、`clearHuobanToken` | 移除调用,保留方法结构 |
|
||||
| login/index.vue | `weightApi`、`clearHuobanToken` | 移除调用 |
|
||||
| home/index.vue | `extLinkApi` | `loadExtLinks()` 改为空操作 |
|
||||
| customer/index.vue | `huobanTableApi` | `upsetOne()` 改为设置 skip 状态 |
|
||||
| customer/uiConfig.vue | `weightApi` | `loadConfig()` / `handleSave()` / `handleReset()` 改为成功提示 |
|
||||
| permissionApi.js | `TRACING_OPEN_KEY` | 移除 `getTrackingConfigByCustomerId()` 方法 |
|
||||
|
||||
---
|
||||
|
||||
## 六、构建验证
|
||||
|
||||
```bash
|
||||
npm run build:prod
|
||||
# DONE Compiled successfully
|
||||
# Build complete. The authon-web directory is ready to be deployed.
|
||||
```
|
||||
|
||||
构建产物输出到 `authon-web/` 目录,可直接部署到 Nginx 或其他 Web 服务器。
|
||||
|
||||
---
|
||||
|
||||
## 七、后续代办
|
||||
|
||||
| 代办 | 说明 | 状态 |
|
||||
|------|------|------|
|
||||
| Phase 5A: AI/LLM 后端提取 | ~54 Java 文件从源码同步到 apes-Authon | 待办 |
|
||||
| Phase 5B: 系统配置页面补充 | 后端已有 Controller,前端已保留页面 | 基本完成 |
|
||||
| Phase 5C: 伙伴云表单配置 | 5 Controller + 7 .vue + 1 API | 待办 |
|
||||
|
||||
---
|
||||
|
||||
*文档更新时间: 2026-08-09 | 仓库: https://gitea.apescale.com/figmar/apes-Authon-Web*
|
||||
Reference in New Issue
Block a user