# test **Repository Path**: alexchen_gf/test ## Basic Information - **Project Name**: test - **Description**: 用来测试远程仓库镜像功能 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-04 - **Last Updated**: 2026-09-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 穿透式监管平台 Vue3 + Element Plus 前端 / Spring Boot 3.5 (LTS) 后端,支持多环境(local / dev / test / prod)配置与打包。 *** ## 一、项目结构 ``` penetrating-supervision/ ├── backend/ # Spring Boot 3.5.16 + Java 17 │ ├── pom.xml # 父 POM,管理依赖版本 │ ├── api/ # API 模块(业务代码) │ │ ├── pom.xml │ │ └── src/main/ │ │ ├── java/com/mt/platform/ │ │ │ ├── controller/ # REST 接口 │ │ │ ├── service/ # 业务逻辑 │ │ │ ├── entity/ # 实体类 │ │ │ └── config/ # 配置类 │ │ └── resources/ │ │ ├── application.yml # 基础配置(所有环境共享) │ │ ├── application-local.yml # 本地环境(gitignore) │ │ ├── application-dev.yml # 开发环境 │ │ ├── application-test.yml # 测试环境 │ │ └── application-prod.yml # 生产环境 │ └── deploy/ # 部署模块(Liquibase 数据库变更) │ ├── frontend/ # Vue3 + Element Plus + Vite │ ├── package.json # 含 dev / build / build:dev / build:test │ ├── vite.config.ts # 从环境变量读取 proxy / base │ ├── .env.local # 本地开发(gitignore,连本地后端) │ ├── .env.development # 开发环境(连 dev 后端) │ ├── .env.test # 测试环境 │ ├── .env.production # 生产环境 │ └── src/ │ ├── api/ # 接口调用 │ ├── components/ # 组件 │ ├── views/ # 页面 │ └── router/ # 路由 │ └── README.md ``` *** ## 二、环境要求 | 工具 | 版本要求 | 用途 | | ------- | ---- | --------------------------- | | JDK | 17+ | 编译后端(推荐 JDK 21 以获得虚拟线程性能红利) | | Maven | 3.6+ | 后端构建(建议使用项目内 mvnw) | | Node.js | 18+ | 前端构建 | | MySQL | 8.0+ | 数据库 | | Redis | 6.0+ | 缓存 / Session | *** ## 三、多环境配置说明 ### 3.1 后端环境配置 后端通过 Spring Profiles 实现多环境配置隔离: | 配置文件 | 环境 | 用途 | 是否入库 | | ----------------------- | ----- | --------------------------- | ----------- | | `application.yml` | 所有 | 基础配置(端口、MyBatis、Sa-Token 等) | ✅ | | `application-local.yml` | local | 本地开发(localhost 数据库) | ❌ gitignore | | `application-dev.yml` | dev | 开发环境(dev 服务器数据库) | ✅ | | `application-test.yml` | test | 测试环境(test 服务器数据库) | ✅ | | `application-prod.yml` | prod | 生产环境(prod 数据库) | ✅ | **关键配置差异**: | 配置项 | local | dev | test | prod | | ----------- | ----------- | -------------- | ---------------- | ---------------- | | 数据库地址 | localhost | 172.30.112.197 | TODO\_TEST\_HOST | TODO\_PROD\_HOST | | Redis 地址 | localhost | 172.30.112.197 | TODO\_TEST\_HOST | TODO\_PROD\_HOST | | Actuator 端点 | 开放全部 | 开放全部 | 开放全部 | **关闭全部** | | 默认用户密码 | dev\@123456 | dev\@123456 | test\@123456 | Mt\@Prod#2026 | **Context Path**:所有环境统一为 `/api`,Controller 只写业务路径(如 `/auth/login`),对外 URL 为 `/api/auth/login`。 ### 3.2 默认数据(演示租户 & 登录账号) 后端启动后由 Liquibase 自动写入 `backend/deploy/src/main/resources/db/changelog/20260730-init-data.xml`,**每次全新部署都会重建下面这套演示数据**。 | 维度 | 租户 1(演示) | 租户 2(演示) | | ---------- | ------------------------ | ------------------------ | | 租户编码(code) | `tenant001` | `tenant002` | | 租户 ID | 1000 | 2000 | | 根集团 | id=1010 | id=2010 | | 超管用户名 | **admin001** | **admin002** | | 密码 | **admin123** | **admin123** | | 用户 ID | 100001 | 200001 | | 角色 | `super_admin`(全菜单 / 全数据) | `super_admin`(全菜单 / 全数据) | | 联系邮箱 | | | 补充说明: - 每个租户下另定义 4 个角色 `regulator`(监管员) / `company_admin`(企业管理员) / `disposer`(处置员) / `user`(普通用户),**初始无用户**,登录后由超管在「用户管理」页面分配。 - 表内"默认用户密码"(如 `dev@123456`)是 `application-{profile}.yml` 中 `user.default-password` 配置项,用于**新建用户**时的初始密码,不是 admin 登录密码,两者不要混用。 - 密码 hash 在变更集 `data-008-init-admin-user` 中为 bcrypt 值,两账号同 hash: `$2a$10$n2JGfUYremNUVfnLiun7G.hiOO4YGum//GF4EsWBdJXqvn/1IxogS` #### 3.2.1 数据权限测试账号(租户 2000 城投科技集团) 变更集 `20260803-init-dataperm-test-users.xml` 额外初始化 4 个「多部门 + 多角色」测试用户,用于登录后验证数据范围切换(GROUP / COMPANY / DEPT)以及业务数据过滤。**所有测试用户密码统一为** **`123456`**。 | 用户 ID | 用户名 | 真实姓名 | 角色(data\_scope) | 部门(\* 主部门) | 实际生效范围 | 典型场景 | | ------ | ---------- | ---- | ----------------------------------- | ----------------------------- | -------------- | ------------------------------ | | 200002 | `zhangwei` | 张维 | `group_exec`(1) + `regulator`(2) | 2000101\* / 2000203 / 2000303 | GROUP | 跨 3 家企业的集团高管,可切到集团/任意企业/任意自身部门 | | 200003 | `wangfang` | 王芳 | `company_admin`(2) + `disposer`(3) | 2000104\* / 2000105 / 2000106 | COMPANY(智能机器人) | 同公司内的企业管理员,在 3 个部门间切换 | | 200004 | `lijie` | 李杰 | `disposer`(3) + `user`(3) | 2000204\* / 2000205 | DEPT | 部门级处置员,仅能看到当前部门数据 | | 200005 | `zhaolei` | 赵磊 | `regulator`(2) + `company_admin`(2) | 2000302\* / 2000202 | COMPANY(随当前部门) | 跨企业兼任场景,验证「按当前工作空间锚定企业」 | 密码 hash(bcrypt rounds=10,4 个用户相同): `$2a$10$6MCYDvWKPGAIu3vVNKW1Tu1J/6xpTPXYMNRiAqaJag7x6pWxrahz6` > 角色说明:`group_exec`(集团高管,data\_scope=1)是本次新增的租户 2000 角色,专为「非超管路径下测试 GROUP 档数据范围」而设计(super\_admin 会绕过租户过滤,不适合做数据权限测试)。其菜单授权见变更集 `data-022b-init-group-exec-role-menu`(15 条业务菜单)。 **登录示例**: ```bash BASE="http://172.30.112.197:8080/api" curl -X POST "${BASE}/auth/login" \ -H 'Content-Type: application/json' \ -d '{"username":"zhangwei","password":"123456"}' ``` > ⚠️ 这 4 个测试用户仅用于开发/测试环境的数据权限验证,**生产环境前请删除变更集** `20260803-init-dataperm-test-users.xml` 并清空相关数据,或在 `application-prod.yml` 通过 `liquibase.contexts` 跳过。 **登录示例(dev 环境)**: ```bash BASE="http://172.30.112.197:8080/api" # 租户 1 curl -X POST "${BASE}/auth/login" \ -H 'Content-Type: application/json' \ -d '{"username":"admin001","password":"admin123"}' # 租户 2 curl -X POST "${BASE}/auth/login" \ -H 'Content-Type: application/json' \ -d '{"username":"admin002","password":"admin123"}' ``` > ⚠️ **生产部署前必须执行**: > > 1. 修改两个超管密码(首次登录后在「个人中心 → 修改密码」即可)。 > 2. 若不希望保留演示租户,可参考 `init-data.xml` 的 `rollback` 段,把 id=1000 / 2000 的租户、超管、角色、菜单数据清除后部署;并在 `application-prod.yml` 中覆盖 `liquibase.contexts=prod` 之类的环境标签,跳过演示数据变更集。 ### 3.3 前端环境配置 前端通过 Vite 的 `.env.[mode]` 文件实现多环境打包: | 配置文件 | 模式 | 用途 | VITE\_API\_BASE\_URL | 是否入库 | | ------------------------ | ----------- | -------------- | --------------------------- | ----------- | | `.env.development.local` | local | 本地开发(连本地后端) | `/api`(走 proxy) | ❌ gitignore | | `.env.development` | development | 开发环境(连 dev 后端) | `http://172.30.112.197/api` | ✅ | | `.env.test` | test | 测试环境 | `http://TODO_TEST_HOST/api` | ✅ | | `.env.production` | production | 生产环境 | `/api`(nginx 反代) | ✅ | **优先级**:`.env` → `.env.[mode]` → `.env.local` → `.env.[mode].local`(后者覆盖前者) **本地开发切回 localhost**:在 `frontend/` 目录创建 `.env.local`(已在 `.gitignore`): ```env VITE_API_BASE_URL=/api VITE_API_PROXY_TARGET=http://localhost:8080 ``` *** ## 四、后端启动与打包 ### 4.1 本地开发运行 ```bash cd backend # 方式 1:Maven 插件运行(推荐,热重载) mvn spring-boot:run -pl api # 方式 2:IDE 直接运行 api 模块的 Application 主类 ``` 默认激活 `dev` profile(来自 `application.yml`),直接连接开发环境数据库。如需本地调试,可创建 `application-local.yml`(已在 `.gitignore` 中),并通过 `--spring.profiles.active=local` 覆盖。 ### 4.2 打包与部署 ```bash cd backend # 清理后打包(生成可执行 jar) mvn clean package -DskipTests # 产物位置 ls api/target/ # supervision-api.jar <-- 可执行 Spring Boot jar ``` ### 4.3 不同环境启动命令 #### 本地环境(local) ```bash # 默认激活 dev profile(连开发环境数据库) java -jar api/target/supervision-api.jar # 显式指定 local profile(连本地数据库,需先创建 application-local.yml) java -jar api/target/supervision-api.jar --spring.profiles.active=local ``` #### 开发环境(dev) ```bash # 启动 dev 环境后端 java -jar api/target/supervision-api.jar --spring.profiles.active=dev # 后台运行 + 日志输出 nohup java -jar api/target/supervision-api.jar --spring.profiles.active=dev > app-dev.log 2>&1 & ``` #### 测试环境(test) ```bash # 启动 test 环境后端 java -jar api/target/supervision-api.jar --spring.profiles.active=test # 后台运行 nohup java -jar api/target/supervision-api.jar --spring.profiles.active=test > app-test.log 2>&1 & ``` #### 生产环境(prod) ```bash # 启动 prod 环境后端(建议配置 JVM 参数) java -Xms512m -Xmx1024m \ -jar api/target/supervision-api.jar \ --spring.profiles.active=prod # 后台运行 nohup java -Xms512m -Xmx1024m \ -jar api/target/supervision-api.jar \ --spring.profiles.active=prod > app-prod.log 2>&1 & ``` ### 4.4 验证后端启动 ```bash # 检查健康状态(local/dev/test 环境开放了 actuator) curl http://localhost:8080/api/actuator/health # 测试业务接口 curl http://localhost:8080/api/auth/login ``` *** ## 五、前端启动与打包 ### 5.1 本地开发运行 ```bash cd frontend # 1) 安装依赖(仅首次或依赖变更时需要) npm install # 2) 启动开发服务器(默认连 dev 后端) npm run dev # → http://localhost:3000 # 3) 如需连本地后端,先创建 .env.development.local(见 3.3 节),再启动 npm run dev ``` ### 5.2 不同环境打包 #### 开发环境(dev) ```bash cd frontend npm run build:dev # 等价于:vue-tsc -b && vite build --mode development # 产物:dist/ # API 地址:http://172.30.112.197/api(编译时硬编码) ``` #### 测试环境(test) ```bash cd frontend npm run build:test # 等价于:vue-tsc -b && vite build --mode test # 产物:dist/ # API 地址:http://TODO_TEST_HOST/api(需先在 .env.test 中替换占位符) ``` #### 生产环境(prod) ```bash cd frontend npm run build # 或:npm run build:prod # 等价于:vue-tsc -b && vite build # 产物:dist/ # API 地址:/api(相对路径,依赖 nginx 反代) ``` ### 5.3 打包产物 ``` frontend/dist/ ├── index.html ├── assets/ │ ├── index-.js # JS chunk │ └── index-.css # CSS └── ... ``` *** ## 六、典型发布流程 ### 6.1 部署到测试环境 ```bash # 1. 打包后端 cd backend mvn clean package -DskipTests # 产物:api/target/supervision-api.jar # 2. 打包前端 cd ../frontend npm install npm run build:test # 产物:dist/ # 3. 上传到测试服务器 scp api/target/supervision-api.jar user@172.30.112.197:/opt/app/ scp -r dist/* user@172.30.112.197:/opt/app/web/ # 4. 服务器上启动后端 ssh user@172.30.112.197 cd /opt/app nohup java -jar supervision-api.jar --spring.profiles.active=test > app-test.log 2>&1 & ``` ### 6.2 部署到生产环境 ```bash # 1. 打包后端 cd backend mvn clean package -DskipTests # 2. 打包前端 cd ../frontend npm install npm run build # 3. 上传到生产服务器(替换为实际生产服务器地址) scp api/target/supervision-api.jar user@prod-server:/opt/app/ scp -r dist/* user@prod-server:/opt/app/web/ # 4. 服务器上启动后端 ssh user@prod-server cd /opt/app nohup java -Xms512m -Xmx1024m \ -jar supervision-api.jar \ --spring.profiles.active=prod > app-prod.log 2>&1 & ``` ### 6.3 Nginx 配置示例 ```nginx server { listen 80; server_name your-domain.com; # 前端静态资源 root /opt/app/web; index index.html; location / { try_files $uri $uri/ /index.html; } # 后端 API 反向代理 location /api/ { proxy_pass http://127.0.0.1:8080/api/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } ``` *** ## 七、常用命令速查 ### 后端 | 用途 | 命令 | | -------------- | ------------------------------------------------------------------------- | | 本地运行 | `cd backend && mvn spring-boot:run -pl api` | | 打包 | `cd backend && mvn clean package -DskipTests` | | 启动 jar(默认 dev) | `java -jar api/target/supervision-api.jar` | | 启动 jar(local) | `java -jar api/target/supervision-api.jar --spring.profiles.active=local` | | 启动 jar(dev) | `java -jar api/target/supervision-api.jar --spring.profiles.active=dev` | | 启动 jar(test) | `java -jar api/target/supervision-api.jar --spring.profiles.active=test` | | 启动 jar(prod) | `java -jar api/target/supervision-api.jar --spring.profiles.active=prod` | | 运行测试 | `cd backend && mvn test` | ### 前端 | 用途 | 命令 | | ---------- | ---------------------------- | | 安装依赖 | `cd frontend && npm install` | | 本地开发 | `npm run dev` | | **开发环境打包** | **`npm run build:dev`** | | **测试环境打包** | **`npm run build:test`** | | 生产环境打包 | `npm run build` | | 预览构建产物 | `npm run preview` | | 代码检查 | `npm run lint` | | 代码格式化 | `npm run format` | *** ## 八、数据库变更管理(Liquibase) 所有数据库变更(DDL / DML)必须通过 Liquibase 变更集管理,禁止手动执行 SQL。 - **变更集位置**:`backend/deploy/src/main/resources/db/changelog/` - **命名规范**:`YYYYMMDD-{description}.xml`(如 `20260730-add-user-table.xml`) - **主文件**:`db.changelog-master.xml` 详见 [CLAUDE.md](./CLAUDE.md) 第 8 节。 *** ## 九、定时任务管理 平台支持**用户可配置**的定时任务:在前端页面配置任务(名称、调度规则、执行目标),由 Quartz 集群调度执行预置 Spring Bean 的指定方法。**所有 Liquibase 变更集只放在** **`deploy`** **模块**(项目通用规范,2026-08-04 由用户明确)。 ### 9.1 核心组件 | 组件 | 路径 | 职责 | | ------------- | -------------------------------------------------------------------------------- | ---------------------------------------- | | 后端 Controller | `backend/api/.../controller/ScheduledTaskController.java` | 13 个 REST 端点 | | 后端 Service | `backend/api/.../service/ScheduledTaskServiceImpl.java` | CRUD + 状态机 + Quartz 调度 | | 通用 JOB 接口 SPI | `backend/api/.../scheduler/spi/SchedulerJobHandler.java` + `@SchedulerJobMethod` | 业务方实现此接口标注可调度方法 | | 注册中心 | `backend/api/.../scheduler/spi/SchedulerJobHandlerRegistry.java` | 启动扫描所有 Handler 构建内存白名单 | | 反射执行器 | `backend/api/.../scheduler/task/BeanJobDispatcher.java` | 反射调用 + 异常四分类 + 日志写入 | | 隔离线程池 | `backend/api/.../scheduler/config/SchedulerConfig.java` | `beanInvokeExecutor`(默认 50 线程) | | Quartz 集成 | `backend/api/.../scheduler/config/QuartzConfig.java` | `SpringBeanJobFactory` + 11 张 `QRTZ_*` 表 | | 日志清理 | `backend/api/.../scheduler/LogRetentionScheduler.java` | 每天凌晨 3 点清理 90 天前日志(`@Scheduled`) | | 前端页面 | `frontend/src/views/model/TaskView.vue` | 列表 + KPI + 启停 + 立即执行 + 日志抽屉 | | 前端表单 | `frontend/src/views/model/components/TaskFormDialog.vue` | 新建/编辑任务(Tabs 形式) | ### 9.2 数据库表 | 表 | 用途 | | -------------------- | ----------------------------------------------------------------- | | `sys_scheduled_task` | 任务配置(含 `bean_code` / `method_code` / `parameter_json` / `status`) | | `sys_scheduled_log` | 执行历史(含 `uk_scheduled_log_task_running` 部分唯一索引防并发) | | `QRTZ_*`(11 张) | Quartz JDBC 集群表(与 `sys_*` 同库 `supervision`) | 变更集全部在 `backend/deploy/src/main/resources/db/changelog/20260804-*.xml`(Quartz 表 / 任务表 / 日志表)。 ### 9.3 业务方接入示例 ```java @Component("dataCleanupHandler") public class DataCleanupHandler implements SchedulerJobHandler { public String getHandlerCode() { return "dataCleanupHandler"; } public String getDescription() { return "数据清理"; } @SchedulerJobMethod(code = "cleanExpired", description = "清理过期记录", paramTypes = {"java.lang.Integer"}) public String cleanExpired(Integer days) { // 业务逻辑(可注入 Mapper,自动走 tenantId 过滤) return "ok"; } } ``` 前端「新建任务」时: 1. 选择 **JobHandler** = `dataCleanupHandler` 2. 选择 **方法** = `cleanExpired` 3. 填 **参数 JSON** = `[7]` 4. 选 **触发类型**(Cron 表达式 / 固定间隔秒数) 5. 保存 → 后端注册 Quartz JobDetail + Trigger → 到点自动调度 ### 9.4 API 端点速查 | 方法 | 路径 | 说明 | | ------ | ------------------------------------------------- | --------------------- | | GET | `/scheduled-task/summary` | KPI 统计(总数/启用/停用/最近失败) | | GET | `/scheduled-task/list` | 任务列表(后端分页 + 名称/状态搜索) | | GET | `/scheduled-task/{id}` | 任务详情 | | POST | `/scheduled-task/create` | 新建 | | PUT | `/scheduled-task/{id}` | 更新 | | DELETE | `/scheduled-task/{id}` | 删除(软删) | | POST | `/scheduled-task/{id}/enable` | 启用 | | POST | `/scheduled-task/{id}/disable` | 停用 | | POST | `/scheduled-task/{id}/execute` | 立即执行 | | GET | `/scheduled-task/{id}/logs` | 执行历史(分页) | | GET | `/scheduled-task/log/{logId}` | 单次执行详情 | | GET | `/scheduled-task/job-handlers` | JobHandler 白名单(下拉数据) | | GET | `/scheduled-task/job-handlers/{beanCode}/methods` | 某 handler 的方法列表 | ### 9.5 安全约束 - 反射调用走 `ApplicationContext.getBean` + `Method.invoke`,**禁用** `Class.forName` 调任意类 / `setAccessible(true)` / 反射字段 - 参数 JSON 解析走**程序化白名单**(`@SchedulerJobMethod.paramTypes` 强约束 + `convertType` 二次校验) - 同一任务同时刻**只允许一个执行实例**(`@DisallowConcurrentExecution` + 部分唯一索引 `uk_scheduled_log_task_running` 双保险) - 调用超时由隔离 `ExecutorService` + `Future.get(timeoutMs)` 控制(默认 30s) - 异常四分类:`BUSINESS_EXCEPTION`(业务异常)/ `TIMEOUT`(超时)/ `REFLECT_EXCEPTION`(反射异常) 详见 `.trellis/spec/backend/scheduled-jobs.md`。 *** ## 十、注意事项 1. **Context Path**:后端统一使用 `/api` 前缀,nginx 反代时需配置 `proxy_pass http://backend:8080/api/;` 2. **Actuator 端点**:生产环境关闭所有端点,其他环境开放(`/api/actuator/health` 等) 3. **环境变量占位符**:`application-test.yml` 和 `application-prod.yml` 中的数据库地址需要替换实际值 4. **前端 API 地址**:`build:test` 和 `build:dev` 会将 API 地址硬编码到 JS 中,部署前确认 `.env.test` / `.env.development` 配置正确 5. **本地覆盖**:个人开发配置放 `.env.local` / `application-local.yml`(均已 gitignore) *** ## 附录 A:Demo 测试用户 ### A.1 监管员(5 个,绑 regulator 角色) > 2026-09-02 用户决策:登录名由 `sup_001~sup_005` 改为真实姓名拼音;`sup_005`(钱七)暂未指派拼音名,沿用旧名。 | Username | 真实姓名 | role\_id | 部门(org\_id) | | ---------- | --------- | -------- | ------------------ | | `fangrenjie` | 监管员-方仁杰 | 3101 | 数据开发公司战略组(3000052) | | `leizhen` | 监管员-雷震 | 3101 | 数据开发公司战略组(3000052) | | `hejiexian` | 监管员-何界先 | 3101 | 数据开发公司战略组(3000052) | | `liping` | 监管员-黎萍 | 3101 | 数据开发公司战略组(3000052) | | `sup_005` | 监管员-钱七 | 3101 | 数据开发公司战略组(3000052) | ### A.2 处置员(5 个,绑 disposer 角色) > 2026-09-02 用户决策:登录名由 `dis_001~dis_005` 改为真实姓名拼音;`dis_004`(周四)/ `dis_005`(吴五)暂未指派拼音名,沿用旧名。 | Username | 真实姓名 | role\_id | 部门(org\_id) | | ------------ | --------- | -------- | ------------------ | | `yuyanxia` | 处置员-余艳霞 | 3103 | 数据开发公司战略组(3000052) | | `zhaocong` | 处置员-赵聪 | 3103 | 数据开发公司战略组(3000052) | | `jiangqingsong` | 处置员-姜青松 | 3103 | 数据开发公司战略组(3000052) | | `dis_004` | 处置员-周四 | 3103 | 数据开发公司战略组(3000052) | | `dis_005` | 处置员-吴五 | 3103 | 数据开发公司战略组(3000052) | ### A.3 默认密码(按环境) 密码明文取 `user.default-password` 配置项(每个环境 yml 独立配置),mock 数据初始化时由 `MockDataResetService` 用 `passwordEncoder.encode(...)` 加密后入库。 | 环境 | yml 文件 | default-password | | --------- | ------------------------------------------------------ | --------------------------------------------- | | 全局基础 | `backend/api/src/main/resources/application.yml` | `123456` | | local(本地) | `backend/api/src/main/resources/application-local.yml` | `123456`(继承 application.yml) | | dev(开发) | `backend/api/src/main/resources/application-dev.yml` | `dev@123456` | | test(测试) | `backend/api/src/main/resources/application-test.yml` | `test@123456` | | prod(生产) | `backend/api/src/main/resources/application-prod.yml` | `Mt@Prod#2026`(**prod 不存在 demo 用户**,仅真实管理员使用) | > 注:`application-local.yml` 在 `.gitignore` 中,**不入版本库**,本地默认密码随主仓库 `application.yml` 走(`123456`)。 ### A.4 登录示例 ```bash # local 环境 curl -X POST http://localhost:8080/api/auth/login \ -H "Content-Type: application/json" \ -d '{"username":"fangrenjie","password":"123456"}' # dev 环境(密码不同) curl -X POST http://dev-host/api/auth/login \ -H "Content-Type: application/json" \ -d '{"username":"fangrenjie","password":"dev@123456"}' # test 环境 curl -X POST https://ctjgdemo.hbdsjsk.com:1780/api/auth/login \ -H "Content-Type: application/json" \ -d '{"username":"yuyanxia","password":"test@123456"}' ``` ### A.5 清理机制(按钮拆分) AI 报告生成页 PageHeader「重置测试数据」是下拉菜单,提供 4 种重置范围(2026-08-28 用户决策:用户 + 模型 + 风险独立重置): | 下拉项 | 接口 | 清理 + 重建范围 | | -------- | ---------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | | **重置用户** | `POST /api/admin/mock-data/reset-users` | sys\_user / sys\_user\_role / sys\_user\_org(10 个 mock 用户,登录名为 `fangrenjie` 等真实姓名拼音) | | **重置模型** | `POST /api/admin/mock-data/reset-models` | model\_config / model\_alert\_config / model\_output\_field / model\_compare\_rule(8 模型 + 子表)ensureMockUsersExist():若 mock 用户不存在则补建 | | **重置风险** | `POST /api/admin/mock-data/reset-risks` | risk / risk\_output\_info / flow\_instance / flow\_task / flow\_his\_task(30 risk + 30 YJCL 流程实例)ensureMockUsersExist():同上 | | **全量重置** | `POST /api/admin/mock-data/reset` | 上述全部 + finance\_business / salary\_business mock 行 | **「重置用户」的副作用**:清空 sys\_user 会级联删 sys\_user\_role / sys\_user\_org;已存在 risk 的 `supervisionUserId` / `rectifyUserId` 会变成孤儿引用(risk 实体该字段非 FK,不影响查询)。后续点「重置风险」会重新指向新 `fangrenjie` / `yuyanxia`。 **事务保证**:每个入口都用 `@Transactional(rollbackFor = Exception.class)`,失败全量回滚。 **识别规则**: - 用户按 `MOCK_REGULATOR_USERNAMES` / `MOCK_DISPOSER_USERNAMES` 精确名单识别(与 prod 用户隔离,2026-09-02 起改为真实姓名拼音;`sup_005` / `dis_004` / `dis_005` 为兼容旧名沿用) - 模型按 model\_code 前缀 `MOCK_` 精确识别 - 业务表(`finance_business` / `salary_business`)按 `data_init_flag='MOCK'` 标记精确删除 - 风险按 `supervision_user_id` / `rectify_user_id` 引用 mock 用户反查 - 流程实例按 `business_id` 指向 mock 风险反查 **删除顺序**(外键倒序):`flow_his_task` → `flow_task` → `flow_instance` → `risk_output_info` → `risk` → `model_compare_rule` → `model_output_field` → `model_alert_config` → `model_config` → `sys_user_role` → `sys_user_org` → `sys_user` → `finance_business` / `salary_business`。 **重建范围**:8 个模型(5 财务 + 3 薪资,按 Excel「模型集市」sheet) + 30 条 risk(**监管人固定为** **`fangrenjie`,处置人固定为** **`yuyanxia`**——2026-08-28 用户决策,方便单一账号登录即可看到全部待办;2026-09-02 登录名改为真实姓名拼音) + 30 个 warm-flow YJCL 流程实例(risk.dispose\_status=PENDING\_CONFIRM,流程进入「待确定」节点)。