Files
freedom-admin/docs/AI-开发接手指南.md
张家训 01464791f4
CI/CD Deploy (Admin) / 构建后端镜像并部署 (push) Successful in 10s
docs: add AI handover guide (env snapshot & module dev SOP)
2026-09-03 19:01:56 +08:00

236 lines
16 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Freedom(KPI 绩效考核系统)AI 开发接手指南
> - 生成/更新日期:2026-09-03(请留意后续变更,环境信息随时间会过期)
> - 存放位置:`freedom-admin/docs/AI-开发接手指南.md` 与 `freedom-web/docs/AI-开发接手指南.md`(两仓库同步维护同一份内容)
> - 用途:当新的 AI 编码代理(如小龙虾 / openclaw)接手本项目、开发新功能模块时,**先完整阅读本文件**即可快速建立上下文。第 1 节是可整体复制给代理的 Prompt 模板,第 2 节之后是明细资料。
---
## 1. 接手 Prompt(可直接复制给 openclaw / 任意编码 Agent)
```
你是 Freedom(KPI 绩效考核系统)项目的开发工程师。项目为前后端分离架构,由两个独立 git 仓库组成:
freedom-admin(Spring Boot 2.7.10 / Java 8 / MyBatis-Plus / MySQL)与 freedom-web(Vue2 + iView(view-design) 后台)。
请先阅读各仓库 docs/AI-开发接手指南.md,了解环境、目录结构与开发 SOP 后再动手。
本次任务要求:
1. 明确需求范围与验收标准,拆解为前后端改造点;涉及数据库变更必须先给出 SQL 脚本并说明执行方式。
2. 后端新增接口:仿照 freedom-admin 现有 TSysDept/TSysUser 模块的 entity→mapper→service→controller 分层;
注意 controller 不带 /api 前缀、POST 参数按表单(POJO)接收、统一返回 Result{code,message,data}。
3. 前端新增页面:在 src/view 下建 .vue,在 src/api 对应目录建请求封装;新菜单/按钮权限登记在后端权限树
(t_sys_permission / 系统-权限管理界面),component 字段填写相对 src/view 的路径(无 .vue、无前导斜杠)。
4. 提交与验证:本地构建通过(mvn package / npm run build),提交信息规范,push master 会自动触发
Gitea Actions 构建并 docker compose 部署到生产(无独立预览环境,涉及生产数据变更务必谨慎并在提交说明中提示)。
5. 禁止把数据库密码/邮箱授权码等敏感信息写入代码或文档;一律引用 /opt/freedom/deploy/.env 或询问部署人。
环境速记:页面入口(公网) http://124.221.214.237:8880,后端直连 http://124.221.214.237:8800;
仓库远端 gitlab.jiaxun.site/yiciheng/freedom-*;内网 Gitea 192.168.1.158:3000(yiciheng/freedom-*) 跑 Actions。
项目现状与缺口(后端仅 RBAC、KPI 前端页面存在但后端接口缺失、api/basic 为已删生成器残留)见指南第 4/8 节,
动手前先与需求方核对,不要凭假设补全业务规则。
```
---
## 2. 项目定位与总体架构
- 前后端分离的 **KPI 绩效考核管理系统**,目前生产可用的部分是「系统管理/RBAC」(用户、角色、部门、权限/菜单树),另有已写完前端但后端尚未落地的 KPI 业务页面。
- 一套源码同时维护 **2 个独立 git 仓库**(`freedom-admin`、`freedom-web`),根工作区同时还有辅助目录(`deploy/`、`docs/`、`_ci-test/`、`scripts/`、`act-runner-src-tmp/`、`logs/`),这些属于运维/CI 资产,不入业务仓库。
- 请求链路:
```
浏览器(Vue SPA, 端口 8880 对外)
↓ /api/xxx(nginx 去掉 /api 前缀)
freedom-web nginx 容器 (80) ──proxy_pass──▶ freedom-admin(Spring Boot, 8800) ──▶ MySQL freedom_db
页面静态资源由 nginx 直接托管;Excel 模板目录 /excelTemplate → nginx alias
```
---
## 3. 当前环境快照(2026-09-03 实测)
### 3.1 代码托管与 CI/CD
| 项 | 值 | 说明 |
|---|---|---|
| 工作区远端 remote(实测) | `http://gitlab.jiaxun.site/yiciheng/freedom-admin.git`、`freedom-web.git`(HTTPS,需凭据) | 日常工作 push 到此 |
| 内网 Gitea | `http://192.168.1.158:3000`,仓库 `yiciheng/freedom-admin`、`yiciheng/freedom-web` | **Gitea Actions 实际在此触发** |
| 域名与内网关系 | `gitlab.jiaxun.site` 在办公网可能走内网 DNS/hosts;在公网 DNS 下可能解析到失效的拦截页。**依赖 git remote 的操作请在办公网环境验证**,若线上未更新,优先到内网 Gitea 看仓库提交与 Actions 运行记录 | 环境差异,勿假设 |
| Gitea Actions Runner | `local-runner`(act_runner v0.6.1,labels `ubuntu-latest`,宿主 `/etc/act_runner/runner-config.yml`) | docker socket 自动挂载 |
| 部署卷白名单 | `/opt/freedom`(runner `container.valid_volumes`) | |
| 工作流 | 各仓库 `.gitea/workflows/deploy.yml`;触发 `push master`(支持手动 `workflow_dispatch`) | |
| CI 注意事项 | act_runner **不会自动 clone 代码**,workflow 里是手动 `git clone`(oauth2 token + `host.docker.internal:3000`),克隆目录 `/opt/freedom/workspace-admin|web` | |
### 3.2 生产服务器(部署拓扑)
- 部署目录:`/opt/freedom/deploy/`,内含 `docker-compose.yml` + `.env`(`DB_URL / DB_USERNAME / DB_PASSWORD / IMAGE_TAG`)
- 容器(网络 `freedom-net`):
| 容器 | 镜像 | 服务名 | 宿主端口 | 说明 |
|---|---|---|---|---|
| `freedom-web` | `freedom-web:latest` | nginx | `8880` | 页面入口;`/api` → 后端(nginx 去前缀);`/excelTemplate` alias |
| `freedom-admin` | `freedom-admin:latest` | Spring Boot | `8800` | 后端;日志 `/app/logs` 映射宿主 `deploy/logs/backend` |
- 公网访问:`http://124.221.214.237:8880`(frp 映射)。后端 8800 也映射了公网,一般不直接用。
- 数据库:MySQL,库 `freedom_db`;凭据由 `deploy/.env` 注入容器(后端 `application.yml` 中引用 `DB_URL` 等环境变量),**不要硬编码在镜像/代码里**。
- 容器内 `docker compose` 操作统一在 `/opt/freedom/deploy` 下执行。
### 3.3 本地开发环境
- 后端:JDK 8 + Maven(推荐 3.6.x);启动类 `com.freedom.admin.FreedomAdminApplication`;本地端口 `8800`;连库 `freedom_db`(DB 信息在 `application.yml` / 部署机 `.env`)。
- 前端:**Node 16**(高版本 Node 可能构建失败);建议 `npm config set registry https://registry.npmmirror.com`;`npm run serve` 默认 8080,dev `baseUrl = http://localhost:8800`(src/config/index.js)。
- 不想起后端时,可把 dev `baseUrl` 指到 `http://124.221.214.237:8800` 联调远程接口(接口不带 /api 前缀)。
---
## 4. 技术栈速览
### 后端 freedom-admin
- Spring Boot 2.7.10(Web / Security / Thymeleaf / Mail / Test)、**JDK 8**
- **MyBatis-Plus**(`BaseMapper`、`QueryWrapper`、`Page`)+ XML(`resources/mapper`)
- **Spring Security + JWT(jjwt)+ BCrypt**;自定义 `@PermitAll` 注解(忽略鉴权)
- Lombok、commons-lang3/collections4、beetl(历史遗留,谨慎使用)、guava、fastjson
- 登录/登出统一由 Security Handler 输出 JSON(已修复跨域重定向问题,见 §6)
### 前端 freedom-web
- Vue 2.x + vue-router + vuex + **iView4(`view-design`)** + less + echarts + mathjs + vue-particles(登录页粒子)
- 基于 iview-admin 模板改造;请求封装 `src/libs/axios.js` + `src/libs/api.request.js`
- **POST 请求体统一为表单编码**(axios `transformRequest` + `qs.stringify(data,{indices:false})`),后端按 POJO/form 绑定接收
- token:Cookie(`TOKEN_KEY`),`libs/util.js` 的 `getToken()`,每个请求放入 `Authorization` 头
---
## 5. 仓库结构(重要:先精读这些文件再动手)
### 5.1 后端(freedom-admin)
```
src/main/java/com/freedom/admin/
FreedomAdminApplication.java
common/ Result{code,message,data}+ok/error、ResultCode、MyException 等
base/ BaseController(含 getUsername() 取当前登录人)等
config/ WebSecurityConfig(Security/JWT 过滤器/CORS/permitAll 清单)、
MyAuthenticationSuccessHandler / MyAuthenticationFailureHandler(登录结果 JSON 化)
controller/ TSysUserController / TSysRoleController / TSysPermissionController / TSysDeptController
service/ TSysXxxService(接口)
service/impl/ TSysXxxServiceImpl(含用户-角色、角色-权限分配等事务)
entity/ TSysUser / TSysRole / TSysPermission / TSysDept / TSysUserRole / TSysRolePermission
mapper/ 接口 extends BaseMapper<TSysXxx>
src/main/resources/
application.yml 数据源/邮箱等(含敏感项,勿外泄)
mapper/*.xml 复杂 SQL
sql/init.sql 6 张 t_sys_* 建表 + 初始数据(默认管理员 admin)
Dockerfile maven3.6.3-jdk8(阿里云源) → openjdk8-jre
.gitea/workflows/deploy.yml
```
> ⚠️ `sql/init.sql` 可能滞后于生产库(尤其权限树数据),新建环境初始化后仍需要在「权限管理」界面补全菜单,或以生产库为准核对。
### 5.2 前端(freedom-web)
```
src/
config/index.js baseUrl:dev http://localhost:8800;prod /api
libs/ axios.js(拦截器/30s 超时/错误码)、api.request.js、util.js、router-util.js
router/routers.js 静态基础路由(/home /login 401 等);业务路由由后端权限树动态注册
store/module/user.js handleLogin / getUserInfo / 登出清 token
store/module/app.js updateMenuList:权限树 → 动态 addRoutes(业务路由)
api/ 按业务域组织:sys/、kpi/、basic/(basic 为已删除的代码生成器残留,勿用)
view/ login/、home/、sys/(sys-user|sys-role|sys-dept|sys-permission)、kpi/(7 个页面)
components/login-form/
nginx.conf /api 反代后端、history 路由 try_files、/excelTemplate alias
Dockerfile node16 + npmmirror → nginx
.gitea/workflows/deploy.yml
```
- **动态菜单机制**:登录后 `getUserInfo` 拉取权限树 → `app.js` 先重置 matcher 再 `addRoutes`;
页面组件映射规则 = `@/view` + `component` 字段 + `.vue`。所以新增页面三件事缺一不可:
① `view/.../xxx.vue` 文件必须存在且路径一致;② 权限树登记(url=前端路由 path,component=相对 view 路径,无 `.vue` 无前导斜杠);③ 给角色勾选后重新登录。
### 5.3 现状缺口(接手前务必与需求方核对)
1. 后端目前只有 **RBAC 系统管理**模块(4 个 TSysXxx controller、6 张表)。
2. 前端 **kpi/ 7 个页面 + api/kpi** 已存在,调用 `system/kpi-staff/*` 等接口,**后端无对应实现**(controller/mapper/表均无)——需确认是从零实现 KPI 后端,还是有现成实现待合入。
3. `api/basic/*` 三个文件是已被移除的「代码生成器」残留(freedom-web 历史提交 `ec2fc97 remove code generator module`),前端 view 中无对应页面。若后续要重启代码生成方向(多数据源/项目路径替换),属于**新开发**而非修复。
4. freedom-admin 本地有备份分支 `backup/pre-sync`,合入 master 前请先 diff 确认。
---
## 6. 如何新增一个功能模块(SOP)
### 6.1 后端
1. **建表**:字段风格参考 `t_sys_dept/t_sys_user`(逻辑删除 `del_flag`、审计字段 `create_by/create_time/update_by/update_time`);DDL 落成 `sql/*.sql` 并更新 init.sql,不要只改库不留脚本。
2. **entity** `TSysXxx.java`:Lombok `@Data`、`@TableName`、`@TableId`、`@TableLogic`(参考 TSysUser)。
3. **mapper** `TSysXxxMapper extends BaseMapper<TSysXxx>`;复杂 SQL 放 `resources/mapper/TSysXxxMapper.xml`。
4. **service / impl**:参考 `TSysDeptService(Impl)` 分层,事务 `@Transactional`。
5. **controller** `TSysXxxController`:`@RequestMapping("xxx")` **不带 /api 前缀**;POST 用 POJO/表单参数接收(不要 @RequestBody JSON);统一返回 `Result.ok()/Result.error()`;需免登录的接口加 `@PermitAll`,否则保持默认(走 JWT 鉴权)。
6. 权限粒度:若要做按钮级权限,参考现有 `@RequiresPermission` 或权限树 permissionType 用法,与现有代码保持一致。
### 6.2 前端
1. `src/view/<域>/<页面>.vue`:结构参考 `view/sys/sys-dept.vue`(Card + 查询表单 + Table + 分页 + Modal 编辑),组件直接用 `view-design`(全局注册,无需 import)。
2. `src/api/<域>/<api>.js`:仿照 `api/sys/sys-user.js`,如
`export const addXxx = data => axios.request({ url: 'xxx/add', headers: { Authorization: getToken() }, data, method: 'post' })`。
3. **登记菜单/按钮**:在系统「权限管理」中新增(或直接改 `t_sys_permission`,注意与前端字段对应):
- 目录级:`url` 一般为前端路由前缀、`component` 留空;
- 页面级:`url = /<域>/<页面>`(vue-router path)、`component = <域>/<页面>`(相对 src/view,无 .vue、无前导斜杠);
- 按钮级:作为页面子节点登记(permissionType/编码约定参考现网数据)。
4. **授权**:角色-权限勾选 → 重新登录生效。
5. 请求错误码统一走 axios 拦截器(见 §7),页面一般只需处理 `code === 200`。
### 6.3 联调与提交
- 本地:`mvn spring-boot:run` + `npm run serve`;远端联调改 `config/index.js` dev baseUrl。
- 验证闭环:登录态 → 菜单出现 → 增删改查 → 权限不足被拦。
- 提交规范:`feat: / fix: / docs: / style: / refactor: / ci:` 前缀 + 中文说明。
- push master 即自动构建部署生产(无预览环境);涉及 SQL/权限变更时,在提交说明里写明需要人工执行的 SQL 与执行顺序。
---
## 7. 全局约定与易踩坑清单(务必遵守)
| # | 约定/坑 | 说明 |
|---|---|---|
| 1 | URL 无 /api 前缀 | `/api` 是 nginx 层的路径,后端 controller 不要写 /api |
| 2 | POST 表单编码 | 前端统一 qs.stringify;后端 POJO 绑定,别用 @RequestBody |
| 3 | 返回结构 | `Result{code,message,data}`;code:200 成功 / 415 账号或密码错误 / 511,512,513 token 相关问题 / 500 异常;前端会据此自动跳登录页 |
| 4 | 登录/登出是 JSON 流程 | Spring Security handler 直接输出 JSON(/login、/logout),**严禁改回 redirect**(会导致 CORS/跨域 302 与前端报错,历史已踩坑修复) |
| 5 | 登录失败文案 | `MyAuthenticationFailureHandler` 返回 code 415 + “账号或密码错误” |
| 6 | 动态路由 | 页面文件路径必须与权限树 component 完全一致,否则菜单点击无路由(白屏/跳 home) |
| 7 | 敏感信息 | DB/邮箱密码一律走部署机 `.env` 注入容器;禁止写进代码/提交/文档 |
| 8 | init.sql 可能滞后 | 权限树/菜单以生产库与「权限管理」界面为准 |
| 9 | Node 版本 | 前端必须 Node 16 附近,高版本可能构建失败 |
| 10 | CI 无自动检出 | 改 workflow 时保留手动 clone 逻辑;不要假设 $GITHUB_WORKSPACE 已含代码 |
---
## 8. 常用命令速查
```bash
# 本地后端
cd freedom-admin && mvn spring-boot:run
# 本地前端
cd freedom-web && npm install && npm run serve
# 生产(SSH 到部署机后)
cd /opt/freedom/deploy
docker compose ps
docker compose logs -f backend web
docker compose up -d --force-recreate backend # 手工发布后端
docker compose up -d --force-recreate web # 手工发布前端
cat .env # 数据库凭据(勿外泄)
# CI 排查
docker logs -f act_runner # runner 日志
# Gitea Actions 页面:检查最近一次运行是否成功、失败步骤输出
```
---
## 9. 已知待办/需求池(开发前先确认)
1. (2026-09 完成)登录体验修复:登录错误 JSON 提示、登出 CORS/302 修复、登录页默认账号清空 + “海阔凭鱼跃,天高任鸟飞”诗句化、演示文案移除 —— 提交见 freedom-admin `59e796c/030916e`、freedom-web `7d07121/4223822`,**待线上验证**。
2. (口头需求,未开工)若重启代码生成方向:
- 系统内置多套 MyBatis 数据源信息(开发/SIT/生产等),生成时下拉选择,免手动填 `db_url/db_username/db_password`;
- 系统设置「项目管理」Tab 提供项目路径字符替换工具:快捷固定替换父目录(如 `D:/bestpay-srdcloud`)、替换账号(如 `srd17321104074`),支持对所有项目路径批量生效。
- 注意:旧代码生成模块曾存在后被移除(web `ec2fc97`),此需求属新建还是恢复需与用户确认。
3. (待确认)KPI 模块后端化:前端 7 个页面 + 6 个 API 已就绪,后端需补数据模型/表/接口,字段与业务流程请先访谈确认。
---
## 10. 附录:可参考的本地文档/文件
- `freedom-admin/docs/`:仓库内说明文档(含部署实录 CICD-DEPLOY 等)
- 工作区根 `docs/CICD-环境与进度.md`:环境与踩坑记录(含 runner、frp、镜像同步背景)
- `deploy/docker-compose.yml`、各仓库 `.gitea/workflows/deploy.yml`、`Dockerfile`、`nginx.conf`:发布链路一手配置