From 666189b6760b38e16cea8a47ff3e7c6e0fb1a014 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E7=BF=94?= Date: Fri, 17 Apr 2026 18:15:26 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E6=B7=BB=E5=8A=A0=E5=81=A5=E8=BA=AB?= =?UTF-8?q?=E6=88=BF=E7=AE=A1=E7=90=86=E7=B3=BB=E7=BB=9F=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E8=AE=BE=E6=96=BD=E9=87=8D=E6=9E=84=E5=AE=9E=E7=8E=B0=E8=AE=A1?= =?UTF-8?q?=E5=88=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- .../plans/2026-04-17-gym-manage-refactor.md | 1884 +++++++++++++++++ 2 files changed, 1886 insertions(+), 1 deletion(-) create mode 100644 docs/superpowers/plans/2026-04-17-gym-manage-refactor.md diff --git a/.gitignore b/.gitignore index 0eeeb28..7756618 100644 --- a/.gitignore +++ b/.gitignore @@ -137,11 +137,12 @@ spring-shell.log # Application specific novalon-manage-api/manage-app/backend.log -# docs (except superpowers specs) +# docs (except superpowers specs and plans) docs/* !docs/superpowers/ docs/superpowers/* !docs/superpowers/specs/ +!docs/superpowers/plans/ # .trae .trae/ diff --git a/docs/superpowers/plans/2026-04-17-gym-manage-refactor.md b/docs/superpowers/plans/2026-04-17-gym-manage-refactor.md new file mode 100644 index 0000000..805b3eb --- /dev/null +++ b/docs/superpowers/plans/2026-04-17-gym-manage-refactor.md @@ -0,0 +1,1884 @@ +# 健身房管理系统基础设施重构实现计划 + +> **面向 AI 代理的工作者:** 必需子技能:使用 superpowers:subagent-driven-development(推荐)或 superpowers:executing-plans 逐任务实现此计划。步骤使用复选框(`- [ ]`)语法来跟踪进度。 + +**目标:** 将通用后台管理系统重构为健身房管理系统,包括项目重命名、包名修改、测试迁移和移动端项目创建 + +**架构:** 采用分阶段渐进重构策略,共 5 个阶段:后端重构 → 前端重构 → 测试迁移 → UniApp 创建 → 根目录整理 + +**技术栈:** Java 21 + Spring Boot 3.5.13 + Maven (后端) | Vue 3 + TypeScript + Vite (前端) | UniApp + Vue 3 (移动端) | Playwright (E2E 测试) + +--- + +## 文件结构 + +### 阶段 1:后端项目重构(gym-manage-api) + +**重命名的目录:** +- `novalon-manage-api/` → `gym-manage-api/` + +**修改的文件:** +- `gym-manage-api/pom.xml` - Maven 父 POM 配置 +- `gym-manage-api/manage-app/pom.xml` - 主应用模块配置 +- `gym-manage-api/manage-gateway/pom.xml` - 网关模块配置 +- `gym-manage-api/manage-sys/pom.xml` - 系统模块配置 +- `gym-manage-api/manage-db/pom.xml` - 数据库模块配置 +- `gym-manage-api/manage-common/pom.xml` - 公共模块配置 +- `gym-manage-api/manage-audit/pom.xml` - 审计模块配置 +- `gym-manage-api/manage-notify/pom.xml` - 通知模块配置 +- `gym-manage-api/manage-file/pom.xml` - 文件模块配置 +- `gym-manage-api/manage-app/src/main/resources/application.yml` - 应用配置 +- `gym-manage-api/manage-app/src/main/resources/application-dev.yml` - 开发环境配置 +- `gym-manage-api/manage-app/src/main/resources/application-prod.yml` - 生产环境配置 +- `gym-manage-api/manage-gateway/src/main/resources/application.yml` - 网关配置 +- 所有 Java 文件 - 包名和 import 语句 + +**重命名的包目录:** +- `gym-manage-api/*/src/main/java/cn/novalon/manage/` → `gym-manage-api/*/src/main/java/cn/novalon/gym/manage/` +- `gym-manage-api/*/src/test/java/cn/novalon/manage/` → `gym-manage-api/*/src/test/java/cn/novalon/gym/manage/` + +### 阶段 2:前端项目重构(gym-manage-web) + +**重命名的目录:** +- `novalon-manage-web/` → `gym-manage-web/` + +**修改的文件:** +- `gym-manage-web/package.json` - NPM 项目配置 +- `gym-manage-web/index.html` - HTML 入口文件 +- `gym-manage-web/vite.config.ts` - Vite 构建配置 + +### 阶段 3:测试文件迁移(e2e-tests) + +**创建的目录:** +- `e2e-tests/` - 独立测试项目根目录 +- `e2e-tests/e2e/` - 测试用例目录 +- `e2e-tests/playwright/` - Playwright 配置目录 +- `e2e-tests/scripts/` - 测试脚本目录 + +**迁移的文件:** +- `gym-manage-web/e2e/*` → `e2e-tests/e2e/` +- `gym-manage-web/playwright/*` → `e2e-tests/playwright/` +- `gym-manage-web/scripts/*` → `e2e-tests/scripts/` +- `gym-manage-web/playwright.config.ts` → `e2e-tests/playwright.config.ts` +- `gym-manage-web/playwright-complete.config.ts` → `e2e-tests/playwright-complete.config.ts` +- `gym-manage-web/playwright-simple.config.ts` → `e2e-tests/playwright-simple.config.ts` + +**创建的文件:** +- `e2e-tests/package.json` - 测试项目依赖配置 + +**删除的文件:** +- `package.json` (根目录) - 测试依赖已迁移 + +**修改的文件:** +- `e2e-tests/playwright.config.ts` - 更新测试路径配置 + +### 阶段 4:创建 UniApp 项目(gym-manage-uniapp) + +**创建的目录:** +- `gym-manage-uniapp/` - 移动端项目根目录 +- `gym-manage-uniapp/src/` - 源代码目录 +- `gym-manage-uniapp/src/pages/` - 页面目录 +- `gym-manage-uniapp/src/pages/index/` - 首页目录 +- `gym-manage-uniapp/src/pages/login/` - 登录页目录 +- `gym-manage-uniapp/src/components/` - 组件目录 +- `gym-manage-uniapp/src/api/` - API 接口目录 +- `gym-manage-uniapp/src/store/` - 状态管理目录 +- `gym-manage-uniapp/src/utils/` - 工具函数目录 +- `gym-manage-uniapp/src/static/` - 静态资源目录 + +**创建的文件:** +- `gym-manage-uniapp/package.json` - NPM 项目配置 +- `gym-manage-uniapp/tsconfig.json` - TypeScript 配置 +- `gym-manage-uniapp/vite.config.ts` - Vite 构建配置 +- `gym-manage-uniapp/src/manifest.json` - UniApp 应用配置 +- `gym-manage-uniapp/src/pages.json` - UniApp 页面配置 +- `gym-manage-uniapp/src/main.ts` - 应用入口 +- `gym-manage-uniapp/src/App.vue` - 应用根组件 +- `gym-manage-uniapp/src/pages/index/index.vue` - 首页组件 +- `gym-manage-uniapp/src/pages/login/index.vue` - 登录页组件 +- `gym-manage-uniapp/src/api/request.ts` - 请求封装 +- `gym-manage-uniapp/src/store/index.ts` - Pinia 配置 +- `gym-manage-uniapp/src/store/user.ts` - 用户状态管理 + +### 阶段 5:根目录整理与文档更新 + +**修改的文件:** +- `docker-compose.yml` - Docker 编排配置 +- `Jenkinsfile` - CI/CD 配置 +- `README.md` - 项目文档 + +--- + +## 阶段 1:后端项目重构(gym-manage-api) + +### 任务 1.1:重命名后端项目目录 + +**文件:** +- 重命名:`novalon-manage-api/` → `gym-manage-api/` + +- [ ] **步骤 1:使用 Git 重命名项目目录** + +```bash +git mv novalon-manage-api gym-manage-api +``` + +- [ ] **步骤 2:验证重命名结果** + +运行:`ls -la | grep gym-manage-api` +预期:显示 `gym-manage-api` 目录 + +--- + +### 任务 1.2:修改 Maven 父 POM 配置 + +**文件:** +- 修改:`gym-manage-api/pom.xml` + +- [ ] **步骤 1:更新 Maven 父 POM 的 groupId** + +修改 `gym-manage-api/pom.xml` 第 21 行: + +```xml +cn.novalon.gym.manage +``` + +- [ ] **步骤 2:更新 Maven 父 POM 的 artifactId** + +修改 `gym-manage-api/pom.xml` 第 22 行: + +```xml +gym-manage-api +``` + +- [ ] **步骤 3:更新 Maven 父 POM 的 name** + +修改 `gym-manage-api/pom.xml` 第 26 行: + +```xml +Gym Manage API +``` + +- [ ] **步骤 4:更新 Maven 父 POM 的 description** + +修改 `gym-manage-api/pom.xml` 第 27 行: + +```xml +Gym Management System API +``` + +--- + +### 任务 1.3:修改 manage-app 模块 POM 配置 + +**文件:** +- 修改:`gym-manage-api/manage-app/pom.xml` + +- [ ] **步骤 1:更新 parent 引用的 groupId** + +修改 `gym-manage-api/manage-app/pom.xml`: + +```xml + + cn.novalon.gym.manage + gym-manage-api + 1.0.0 + +``` + +- [ ] **步骤 2:更新模块的 groupId** + +```xml +cn.novalon.gym.manage +``` + +- [ ] **步骤 3:更新模块的 artifactId** + +```xml +manage-app +``` + +--- + +### 任务 1.4:修改 manage-gateway 模块 POM 配置 + +**文件:** +- 修改:`gym-manage-api/manage-gateway/pom.xml` + +- [ ] **步骤 1:更新 parent 引用的 groupId** + +修改 `gym-manage-api/manage-gateway/pom.xml`: + +```xml + + cn.novalon.gym.manage + gym-manage-api + 1.0.0 + +``` + +- [ ] **步骤 2:更新模块的 groupId** + +```xml +cn.novalon.gym.manage +``` + +--- + +### 任务 1.5:修改 manage-sys 模块 POM 配置 + +**文件:** +- 修改:`gym-manage-api/manage-sys/pom.xml` + +- [ ] **步骤 1:更新 parent 引用的 groupId** + +修改 `gym-manage-api/manage-sys/pom.xml`: + +```xml + + cn.novalon.gym.manage + gym-manage-api + 1.0.0 + +``` + +- [ ] **步骤 2:更新模块的 groupId** + +```xml +cn.novalon.gym.manage +``` + +--- + +### 任务 1.6:修改 manage-db 模块 POM 配置 + +**文件:** +- 修改:`gym-manage-api/manage-db/pom.xml` + +- [ ] **步骤 1:更新 parent 引用的 groupId** + +修改 `gym-manage-api/manage-db/pom.xml`: + +```xml + + cn.novalon.gym.manage + gym-manage-api + 1.0.0 + +``` + +- [ ] **步骤 2:更新模块的 groupId** + +```xml +cn.novalon.gym.manage +``` + +--- + +### 任务 1.7:修改 manage-common 模块 POM 配置 + +**文件:** +- 修改:`gym-manage-api/manage-common/pom.xml` + +- [ ] **步骤 1:更新 parent 引用的 groupId** + +修改 `gym-manage-api/manage-common/pom.xml`: + +```xml + + cn.novalon.gym.manage + gym-manage-api + 1.0.0 + +``` + +- [ ] **步骤 2:更新模块的 groupId** + +```xml +cn.novalon.gym.manage +``` + +--- + +### 任务 1.8:修改 manage-audit 模块 POM 配置 + +**文件:** +- 修改:`gym-manage-api/manage-audit/pom.xml` + +- [ ] **步骤 1:更新 parent 引用的 groupId** + +修改 `gym-manage-api/manage-audit/pom.xml`: + +```xml + + cn.novalon.gym.manage + gym-manage-api + 1.0.0 + +``` + +- [ ] **步骤 2:更新模块的 groupId** + +```xml +cn.novalon.gym.manage +``` + +--- + +### 任务 1.9:修改 manage-notify 模块 POM 配置 + +**文件:** +- 修改:`gym-manage-api/manage-notify/pom.xml` + +- [ ] **步骤 1:更新 parent 引用的 groupId** + +修改 `gym-manage-api/manage-notify/pom.xml`: + +```xml + + cn.novalon.gym.manage + gym-manage-api + 1.0.0 + +``` + +- [ ] **步骤 2:更新模块的 groupId** + +```xml +cn.novalon.gym.manage +``` + +--- + +### 任务 1.10:修改 manage-file 模块 POM 配置 + +**文件:** +- 修改:`gym-manage-api/manage-file/pom.xml` + +- [ ] **步骤 1:更新 parent 引用的 groupId** + +修改 `gym-manage-api/manage-file/pom.xml`: + +```xml + + cn.novalon.gym.manage + gym-manage-api + 1.0.0 + +``` + +- [ ] **步骤 2:更新模块的 groupId** + +```xml +cn.novalon.gym.manage +``` + +--- + +### 任务 1.11:重命名 Java 包目录结构 + +**文件:** +- 重命名:所有模块的 Java 包目录 + +- [ ] **步骤 1:重命名 manage-app 的主代码包目录** + +```bash +cd gym-manage-api/manage-app/src/main/java/cn/novalon +git mv manage gym/manage +``` + +- [ ] **步骤 2:重命名 manage-app 的测试代码包目录** + +```bash +cd gym-manage-api/manage-app/src/test/java/cn/novalon +git mv manage gym/manage +``` + +- [ ] **步骤 3:重命名 manage-gateway 的主代码包目录** + +```bash +cd gym-manage-api/manage-gateway/src/main/java/cn/novalon +git mv manage gym/manage +``` + +- [ ] **步骤 4:重命名 manage-gateway 的测试代码包目录** + +```bash +cd gym-manage-api/manage-gateway/src/test/java/cn/novalon +git mv manage gym/manage +``` + +- [ ] **步骤 5:重命名 manage-sys 的主代码包目录** + +```bash +cd gym-manage-api/manage-sys/src/main/java/cn/novalon +git mv manage gym/manage +``` + +- [ ] **步骤 6:重命名 manage-sys 的测试代码包目录** + +```bash +cd gym-manage-api/manage-sys/src/test/java/cn/novalon +git mv manage gym/manage +``` + +- [ ] **步骤 7:重命名 manage-db 的主代码包目录** + +```bash +cd gym-manage-api/manage-db/src/main/java/cn/novalon +git mv manage gym/manage +``` + +- [ ] **步骤 8:重命名 manage-db 的测试代码包目录** + +```bash +cd gym-manage-api/manage-db/src/test/java/cn/novalon +git mv manage gym/manage +``` + +- [ ] **步骤 9:重命名 manage-common 的主代码包目录** + +```bash +cd gym-manage-api/manage-common/src/main/java/cn/novalon +git mv manage gym/manage +``` + +- [ ] **步骤 10:重命名 manage-common 的测试代码包目录** + +```bash +cd gym-manage-api/manage-common/src/test/java/cn/novalon +git mv manage gym/manage +``` + +- [ ] **步骤 11:重命名 manage-audit 的主代码包目录** + +```bash +cd gym-manage-api/manage-audit/src/main/java/cn/novalon +git mv manage gym/manage +``` + +- [ ] **步骤 12:重命名 manage-audit 的测试代码包目录** + +```bash +cd gym-manage-api/manage-audit/src/test/java/cn/novalon +git mv manage gym/manage +``` + +- [ ] **步骤 13:重命名 manage-notify 的主代码包目录** + +```bash +cd gym-manage-api/manage-notify/src/main/java/cn/novalon +git mv manage gym/manage +``` + +- [ ] **步骤 14:重命名 manage-notify 的测试代码包目录** + +```bash +cd gym-manage-api/manage-notify/src/test/java/cn/novalon +git mv manage gym/manage +``` + +- [ ] **步骤 15:重命名 manage-file 的主代码包目录** + +```bash +cd gym-manage-api/manage-file/src/main/java/cn/novalon +git mv manage gym/manage +``` + +- [ ] **步骤 16:重命名 manage-file 的测试代码包目录** + +```bash +cd gym-manage-api/manage-file/src/test/java/cn/novalon +git mv manage gym/manage +``` + +--- + +### 任务 1.12:批量更新 Java 文件的 package 声明 + +**文件:** +- 修改:所有 Java 文件 + +- [ ] **步骤 1:使用 sed 批量替换 package 声明** + +```bash +find gym-manage-api -type f -name "*.java" -exec sed -i '' 's/^package cn\.novalon\.manage/package cn.novalon.gym.manage/g' {} + +``` + +- [ ] **步骤 2:验证替换结果** + +运行:`grep -r "^package cn.novalon.manage" gym-manage-api --include="*.java" | head -5` +预期:无输出(所有 package 声明已更新) + +--- + +### 任务 1.13:批量更新 Java 文件的 import 语句 + +**文件:** +- 修改:所有 Java 文件 + +- [ ] **步骤 1:使用 sed 批量替换 import 语句** + +```bash +find gym-manage-api -type f -name "*.java" -exec sed -i '' 's/import cn\.novalon\.manage/import cn.novalon.gym.manage/g' {} + +``` + +- [ ] **步骤 2:验证替换结果** + +运行:`grep -r "import cn.novalon.manage" gym-manage-api --include="*.java" | head -5` +预期:无输出(所有 import 语句已更新) + +--- + +### 任务 1.14:更新 Spring Boot 配置文件 + +**文件:** +- 修改:`gym-manage-api/manage-app/src/main/resources/application.yml` +- 修改:`gym-manage-api/manage-app/src/main/resources/application-dev.yml` +- 修改:`gym-manage-api/manage-app/src/main/resources/application-prod.yml` +- 修改:`gym-manage-api/manage-gateway/src/main/resources/application.yml` + +- [ ] **步骤 1:更新 manage-app 的 application.yml** + +修改 `gym-manage-api/manage-app/src/main/resources/application.yml`: + +```yaml +spring: + application: + name: gym-manage-api +``` + +- [ ] **步骤 2:更新 manage-gateway 的 application.yml** + +修改 `gym-manage-api/manage-gateway/src/main/resources/application.yml`: + +```yaml +spring: + application: + name: gym-manage-gateway +``` + +--- + +### 任务 1.15:验证后端项目编译 + +**文件:** +- 无文件修改,仅验证 + +- [ ] **步骤 1:清理旧的编译产物** + +```bash +cd gym-manage-api +mvn clean +``` + +预期:`BUILD SUCCESS` + +- [ ] **步骤 2:编译项目** + +```bash +mvn compile +``` + +预期:`BUILD SUCCESS`,无编译错误 + +- [ ] **步骤 3:运行单元测试** + +```bash +mvn test +``` + +预期:`BUILD SUCCESS`,所有测试通过 + +--- + +### 任务 1.16:提交阶段 1 的变更 + +**文件:** +- 无文件修改,仅提交 + +- [ ] **步骤 1:查看变更状态** + +```bash +git status +``` + +预期:显示所有修改的文件 + +- [ ] **步骤 2:提交变更** + +```bash +git add . +git commit -m "refactor(backend): 重命名后端项目为 gym-manage-api,修改包名为 cn.novalon.gym.manage" +``` + +预期:提交成功 + +--- + +## 阶段 2:前端项目重构(gym-manage-web) + +### 任务 2.1:重命名前端项目目录 + +**文件:** +- 重命名:`novalon-manage-web/` → `gym-manage-web/` + +- [ ] **步骤 1:使用 Git 重命名项目目录** + +```bash +git mv novalon-manage-web gym-manage-web +``` + +- [ ] **步骤 2:验证重命名结果** + +运行:`ls -la | grep gym-manage-web` +预期:显示 `gym-manage-web` 目录 + +--- + +### 任务 2.2:修改 package.json 配置 + +**文件:** +- 修改:`gym-manage-web/package.json` + +- [ ] **步骤 1:更新项目名称** + +修改 `gym-manage-web/package.json` 第 2 行: + +```json +"name": "gym-manage-web", +``` + +- [ ] **步骤 2:更新项目描述** + +修改 `gym-manage-web/package.json` 第 4 行: + +```json +"description": "Gym Management System Frontend", +``` + +--- + +### 任务 2.3:修改 index.html 页面标题 + +**文件:** +- 修改:`gym-manage-web/index.html` + +- [ ] **步骤 1:更新页面标题** + +修改 `gym-manage-web/index.html`: + +```html +健身房管理系统 +``` + +--- + +### 任务 2.4:验证前端项目构建 + +**文件:** +- 无文件修改,仅验证 + +- [ ] **步骤 1:安装依赖** + +```bash +cd gym-manage-web +npm install +``` + +预期:依赖安装成功,无错误 + +- [ ] **步骤 2:构建项目** + +```bash +npm run build +``` + +预期:构建成功,生成 `dist/` 目录 + +--- + +### 任务 2.5:提交阶段 2 的变更 + +**文件:** +- 无文件修改,仅提交 + +- [ ] **步骤 1:查看变更状态** + +```bash +git status +``` + +预期:显示所有修改的文件 + +- [ ] **步骤 2:提交变更** + +```bash +git add . +git commit -m "refactor(frontend): 重命名前端项目为 gym-manage-web" +``` + +预期:提交成功 + +--- + +## 阶段 3:测试文件迁移(e2e-tests) + +### 任务 3.1:创建 e2e-tests 目录结构 + +**文件:** +- 创建:`e2e-tests/` 目录 + +- [ ] **步骤 1:创建测试项目根目录** + +```bash +mkdir -p e2e-tests +``` + +- [ ] **步骤 2:验证目录创建** + +运行:`ls -la | grep e2e-tests` +预期:显示 `e2e-tests` 目录 + +--- + +### 任务 3.2:迁移测试用例目录 + +**文件:** +- 迁移:`gym-manage-web/e2e/` → `e2e-tests/e2e/` + +- [ ] **步骤 1:使用 Git 迁移测试用例目录** + +```bash +git mv gym-manage-web/e2e e2e-tests/e2e +``` + +- [ ] **步骤 2:验证迁移结果** + +运行:`ls -la e2e-tests/` +预期:显示 `e2e` 目录 + +--- + +### 任务 3.3:迁移 Playwright 配置目录 + +**文件:** +- 迁移:`gym-manage-web/playwright/` → `e2e-tests/playwright/` + +- [ ] **步骤 1:使用 Git 迁移 Playwright 配置目录** + +```bash +git mv gym-manage-web/playwright e2e-tests/playwright +``` + +- [ ] **步骤 2:验证迁移结果** + +运行:`ls -la e2e-tests/` +预期:显示 `playwright` 目录 + +--- + +### 任务 3.4:迁移测试脚本目录 + +**文件:** +- 迁移:`gym-manage-web/scripts/` → `e2e-tests/scripts/` + +- [ ] **步骤 1:使用 Git 迁移测试脚本目录** + +```bash +git mv gym-manage-web/scripts e2e-tests/scripts +``` + +- [ ] **步骤 2:验证迁移结果** + +运行:`ls -la e2e-tests/` +预期:显示 `scripts` 目录 + +--- + +### 任务 3.5:迁移 Playwright 配置文件 + +**文件:** +- 迁移:`gym-manage-web/playwright.config.ts` → `e2e-tests/playwright.config.ts` +- 迁移:`gym-manage-web/playwright-complete.config.ts` → `e2e-tests/playwright-complete.config.ts` +- 迁移:`gym-manage-web/playwright-simple.config.ts` → `e2e-tests/playwright-simple.config.ts` + +- [ ] **步骤 1:迁移主配置文件** + +```bash +git mv gym-manage-web/playwright.config.ts e2e-tests/ +``` + +- [ ] **步骤 2:迁移完整配置文件** + +```bash +git mv gym-manage-web/playwright-complete.config.ts e2e-tests/ +``` + +- [ ] **步骤 3:迁移简化配置文件** + +```bash +git mv gym-manage-web/playwright-simple.config.ts e2e-tests/ +``` + +- [ ] **步骤 4:验证迁移结果** + +运行:`ls -la e2e-tests/*.ts` +预期:显示三个配置文件 + +--- + +### 任务 3.6:创建 e2e-tests 的 package.json + +**文件:** +- 创建:`e2e-tests/package.json` + +- [ ] **步骤 1:创建 package.json 文件** + +创建 `e2e-tests/package.json`: + +```json +{ + "name": "gym-manage-e2e-tests", + "version": "1.0.0", + "description": "Gym Management System E2E Tests", + "type": "module", + "scripts": { + "test:e2e": "playwright test", + "test:e2e:smoke": "playwright test --project=smoke", + "test:e2e:journeys": "playwright test --project=journeys", + "test:e2e:headed": "playwright test --headed", + "test:e2e:debug": "playwright test --debug", + "test:e2e:perf": "node scripts/measure-e2e-performance.js", + "test:perf": "node scripts/performance-test.js performance", + "test:load": "node scripts/performance-test.js load", + "test:perf:all": "node scripts/performance-test.js all" + }, + "devDependencies": { + "@playwright/test": "^1.40.1", + "@types/node": "^20.10.0", + "typescript": "^5.9.3" + } +} +``` + +--- + +### 任务 3.7:删除根目录的 package.json + +**文件:** +- 删除:`package.json`(根目录) + +- [ ] **步骤 1:删除根目录的 package.json** + +```bash +git rm package.json +``` + +- [ ] **步骤 2:验证删除结果** + +运行:`ls -la | grep package.json` +预期:无输出(根目录无 package.json) + +--- + +### 任务 3.8:更新 Playwright 配置文件路径 + +**文件:** +- 修改:`e2e-tests/playwright.config.ts` + +- [ ] **步骤 1:检查当前配置** + +运行:`head -20 e2e-tests/playwright.config.ts` +预期:查看当前配置内容 + +- [ ] **步骤 2:确认 baseURL 配置正确** + +确保 `e2e-tests/playwright.config.ts` 中的 `baseURL` 指向前端服务: + +```typescript +use: { + baseURL: 'http://localhost:3001', +} +``` + +--- + +### 任务 3.9:验证测试运行 + +**文件:** +- 无文件修改,仅验证 + +- [ ] **步骤 1:安装测试依赖** + +```bash +cd e2e-tests +npm install +``` + +预期:依赖安装成功 + +- [ ] **步骤 2:运行冒烟测试** + +```bash +npm run test:e2e:smoke +``` + +预期:测试运行正常(可能失败,因为需要前端服务运行) + +--- + +### 任务 3.10:提交阶段 3 的变更 + +**文件:** +- 无文件修改,仅提交 + +- [ ] **步骤 1:查看变更状态** + +```bash +git status +``` + +预期:显示所有修改的文件 + +- [ ] **步骤 2:提交变更** + +```bash +git add . +git commit -m "refactor(test): 创建独立的 e2e-tests 目录,迁移测试文件" +``` + +预期:提交成功 + +--- + +## 阶段 4:创建 UniApp 项目(gym-manage-uniapp) + +### 任务 4.1:创建 UniApp 项目目录结构 + +**文件:** +- 创建:`gym-manage-uniapp/` 及其子目录 + +- [ ] **步骤 1:创建项目根目录和主要子目录** + +```bash +mkdir -p gym-manage-uniapp/src/{pages/{index,login},components,api,store,utils,static} +``` + +- [ ] **步骤 2:验证目录创建** + +运行:`tree gym-manage-uniapp -L 3` +预期:显示完整的目录结构 + +--- + +### 任务 4.2:创建 package.json + +**文件:** +- 创建:`gym-manage-uniapp/package.json` + +- [ ] **步骤 1:创建 package.json 文件** + +创建 `gym-manage-uniapp/package.json`: + +```json +{ + "name": "gym-manage-uniapp", + "version": "1.0.0", + "description": "Gym Management System Mobile App", + "type": "module", + "scripts": { + "dev:h5": "uni -p h5", + "build:h5": "uni build -p h5", + "dev:mp-weixin": "uni -p mp-weixin", + "build:mp-weixin": "uni build -p mp-weixin", + "dev:app": "uni -p app", + "build:app": "uni build -p app" + }, + "dependencies": { + "@dcloudio/uni-app": "3.0.0-4010520240507001", + "@dcloudio/uni-app-plus": "3.0.0-4010520240507001", + "@dcloudio/uni-components": "3.0.0-4010520240507001", + "@dcloudio/uni-h5": "3.0.0-4010520240507001", + "@dcloudio/uni-mp-weixin": "3.0.0-4010520240507001", + "pinia": "^3.0.4", + "vue": "^3.5.26" + }, + "devDependencies": { + "@dcloudio/types": "^3.4.8", + "@dcloudio/uni-automator": "3.0.0-4010520240507001", + "@dcloudio/uni-cli-shared": "3.0.0-4010520240507001", + "@dcloudio/uni-stacktracey": "3.0.0-4010520240507001", + "@dcloudio/vite-plugin-uni": "3.0.0-4010520240507001", + "@types/node": "^20.10.0", + "typescript": "^5.9.3", + "vite": "^7.3.1" + } +} +``` + +--- + +### 任务 4.3:创建 TypeScript 配置 + +**文件:** +- 创建:`gym-manage-uniapp/tsconfig.json` + +- [ ] **步骤 1:创建 tsconfig.json 文件** + +创建 `gym-manage-uniapp/tsconfig.json`: + +```json +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "moduleResolution": "Node", + "strict": true, + "jsx": "preserve", + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "lib": ["ESNext", "DOM"], + "skipLibCheck": true, + "noEmit": true, + "paths": { + "@/*": ["./src/*"] + }, + "types": [ + "@dcloudio/types" + ] + }, + "include": [ + "src/**/*.ts", + "src/**/*.d.ts", + "src/**/*.tsx", + "src/**/*.vue" + ], + "exclude": [ + "node_modules", + "dist", + "unpackage" + ] +} +``` + +--- + +### 任务 4.4:创建 Vite 配置 + +**文件:** +- 创建:`gym-manage-uniapp/vite.config.ts` + +- [ ] **步骤 1:创建 vite.config.ts 文件** + +创建 `gym-manage-uniapp/vite.config.ts`: + +```typescript +import { defineConfig } from 'vite' +import uni from '@dcloudio/vite-plugin-uni' +import { resolve } from 'path' + +export default defineConfig({ + plugins: [uni()], + resolve: { + alias: { + '@': resolve(__dirname, 'src') + } + }, + server: { + port: 3002, + host: '0.0.0.0', + proxy: { + '/api': { + target: 'http://localhost:8084', + changeOrigin: true + } + } + } +}) +``` + +--- + +### 任务 4.5:创建 UniApp 应用配置 + +**文件:** +- 创建:`gym-manage-uniapp/src/manifest.json` + +- [ ] **步骤 1:创建 manifest.json 文件** + +创建 `gym-manage-uniapp/src/manifest.json`: + +```json +{ + "name": "健身房管理系统", + "appid": "", + "description": "健身房管理移动端应用", + "versionName": "1.0.0", + "versionCode": "100", + "transformPx": false, + "app-plus": { + "usingComponents": true, + "nvueStyleCompiler": "uni-app", + "compilerVersion": 3, + "splashscreen": { + "alwaysShowBeforeRender": true, + "waiting": true, + "autoclose": true, + "delay": 0 + }, + "modules": {}, + "distribute": { + "android": { + "permissions": [] + }, + "ios": {}, + "sdkConfigs": {} + } + }, + "quickapp": {}, + "mp-weixin": { + "appid": "", + "setting": { + "urlCheck": false + }, + "usingComponents": true + }, + "mp-alipay": { + "usingComponents": true + }, + "mp-baidu": { + "usingComponents": true + }, + "mp-toutiao": { + "usingComponents": true + }, + "uniStatistics": { + "enable": false + }, + "h5": { + "title": "健身房管理系统", + "router": { + "mode": "hash", + "base": "./" + } + } +} +``` + +--- + +### 任务 4.6:创建 UniApp 页面配置 + +**文件:** +- 创建:`gym-manage-uniapp/src/pages.json` + +- [ ] **步骤 1:创建 pages.json 文件** + +创建 `gym-manage-uniapp/src/pages.json`: + +```json +{ + "pages": [ + { + "path": "pages/index/index", + "style": { + "navigationBarTitleText": "首页" + } + }, + { + "path": "pages/login/index", + "style": { + "navigationBarTitleText": "登录" + } + } + ], + "globalStyle": { + "navigationBarTextStyle": "black", + "navigationBarTitleText": "健身房管理", + "navigationBarBackgroundColor": "#F8F8F8", + "backgroundColor": "#F8F8F8" + }, + "tabBar": { + "color": "#7A7E83", + "selectedColor": "#007AFF", + "borderStyle": "black", + "backgroundColor": "#F8F8F8", + "list": [ + { + "pagePath": "pages/index/index", + "text": "首页" + } + ] + } +} +``` + +--- + +### 任务 4.7:创建应用入口文件 + +**文件:** +- 创建:`gym-manage-uniapp/src/main.ts` +- 创建:`gym-manage-uniapp/src/App.vue` + +- [ ] **步骤 1:创建 main.ts 文件** + +创建 `gym-manage-uniapp/src/main.ts`: + +```typescript +import { createSSRApp } from 'vue' +import { createPinia } from 'pinia' +import App from './App.vue' + +export function createApp() { + const app = createSSRApp(App) + const pinia = createPinia() + + app.use(pinia) + + return { + app, + pinia + } +} +``` + +- [ ] **步骤 2:创建 App.vue 文件** + +创建 `gym-manage-uniapp/src/App.vue`: + +```vue + + + +``` + +--- + +### 任务 4.8:创建首页组件 + +**文件:** +- 创建:`gym-manage-uniapp/src/pages/index/index.vue` + +- [ ] **步骤 1:创建首页组件文件** + +创建 `gym-manage-uniapp/src/pages/index/index.vue`: + +```vue + + + + + +``` + +--- + +### 任务 4.9:创建登录页组件 + +**文件:** +- 创建:`gym-manage-uniapp/src/pages/login/index.vue` + +- [ ] **步骤 1:创建登录页组件文件** + +创建 `gym-manage-uniapp/src/pages/login/index.vue`: + +```vue + + + + + +``` + +--- + +### 任务 4.10:创建 API 请求封装 + +**文件:** +- 创建:`gym-manage-uniapp/src/api/request.ts` + +- [ ] **步骤 1:创建请求封装文件** + +创建 `gym-manage-uniapp/src/api/request.ts`: + +```typescript +const BASE_URL = 'http://localhost:8084/api' + +interface RequestOptions { + url: string + method?: 'GET' | 'POST' | 'PUT' | 'DELETE' + data?: any + header?: Record +} + +interface Response { + code: number + message: string + data: T +} + +export function request(options: RequestOptions): Promise> { + return new Promise((resolve, reject) => { + uni.request({ + url: BASE_URL + options.url, + method: options.method || 'GET', + data: options.data, + header: { + 'Content-Type': 'application/json', + ...options.header + }, + success: (res: any) => { + if (res.statusCode === 200) { + resolve(res.data as Response) + } else { + reject(new Error(`请求失败: ${res.statusCode}`)) + } + }, + fail: (err: any) => { + reject(new Error(`网络错误: ${err.errMsg}`)) + } + }) + }) +} + +export function get(url: string, data?: any): Promise> { + return request({ url, method: 'GET', data }) +} + +export function post(url: string, data?: any): Promise> { + return request({ url, method: 'POST', data }) +} + +export function put(url: string, data?: any): Promise> { + return request({ url, method: 'PUT', data }) +} + +export function del(url: string, data?: any): Promise> { + return request({ url, method: 'DELETE', data }) +} +``` + +--- + +### 任务 4.11:创建 Pinia Store 配置 + +**文件:** +- 创建:`gym-manage-uniapp/src/store/index.ts` +- 创建:`gym-manage-uniapp/src/store/user.ts` + +- [ ] **步骤 1:创建 store 入口文件** + +创建 `gym-manage-uniapp/src/store/index.ts`: + +```typescript +export * from './user' +``` + +- [ ] **步骤 2:创建用户状态管理文件** + +创建 `gym-manage-uniapp/src/store/user.ts`: + +```typescript +import { defineStore } from 'pinia' +import { ref } from 'vue' + +export const useUserStore = defineStore('user', () => { + const token = ref('') + const userInfo = ref(null) + const isLoggedIn = ref(false) + + const setToken = (newToken: string) => { + token.value = newToken + isLoggedIn.value = !!newToken + uni.setStorageSync('token', newToken) + } + + const setUserInfo = (info: any) => { + userInfo.value = info + uni.setStorageSync('userInfo', info) + } + + const logout = () => { + token.value = '' + userInfo.value = null + isLoggedIn.value = false + uni.removeStorageSync('token') + uni.removeStorageSync('userInfo') + } + + const init = () => { + const savedToken = uni.getStorageSync('token') + const savedUserInfo = uni.getStorageSync('userInfo') + + if (savedToken) { + token.value = savedToken + isLoggedIn.value = true + } + + if (savedUserInfo) { + userInfo.value = savedUserInfo + } + } + + return { + token, + userInfo, + isLoggedIn, + setToken, + setUserInfo, + logout, + init + } +}) +``` + +--- + +### 任务 4.12:创建工具函数 + +**文件:** +- 创建:`gym-manage-uniapp/src/utils/storage.ts` + +- [ ] **步骤 1:创建本地存储工具文件** + +创建 `gym-manage-uniapp/src/utils/storage.ts`: + +```typescript +export function setStorage(key: string, value: any): void { + try { + uni.setStorageSync(key, JSON.stringify(value)) + } catch (error) { + console.error('存储数据失败:', error) + } +} + +export function getStorage(key: string): T | null { + try { + const value = uni.getStorageSync(key) + return value ? JSON.parse(value) : null + } catch (error) { + console.error('读取数据失败:', error) + return null + } +} + +export function removeStorage(key: string): void { + try { + uni.removeStorageSync(key) + } catch (error) { + console.error('删除数据失败:', error) + } +} + +export function clearStorage(): void { + try { + uni.clearStorageSync() + } catch (error) { + console.error('清空存储失败:', error) + } +} +``` + +--- + +### 任务 4.13:验证 UniApp 项目运行 + +**文件:** +- 无文件修改,仅验证 + +- [ ] **步骤 1:安装依赖** + +```bash +cd gym-manage-uniapp +npm install +``` + +预期:依赖安装成功 + +- [ ] **步骤 2:运行 H5 开发服务器** + +```bash +npm run dev:h5 +``` + +预期:开发服务器启动成功,可在浏览器访问 + +--- + +### 任务 4.14:提交阶段 4 的变更 + +**文件:** +- 无文件修改,仅提交 + +- [ ] **步骤 1:查看变更状态** + +```bash +git status +``` + +预期:显示所有新创建的文件 + +- [ ] **步骤 2:提交变更** + +```bash +git add . +git commit -m "feat(mobile): 创建 gym-manage-uniapp 项目脚手架" +``` + +预期:提交成功 + +--- + +## 阶段 5:根目录整理与文档更新 + +### 任务 5.1:更新 docker-compose.yml + +**文件:** +- 修改:`docker-compose.yml` + +- [ ] **步骤 1:查看当前配置** + +运行:`cat docker-compose.yml` +预期:查看当前 Docker Compose 配置 + +- [ ] **步骤 2:更新服务名称和路径** + +根据实际配置,更新服务名称和卷挂载路径,确保引用新的项目目录名称。 + +--- + +### 任务 5.2:更新 Jenkinsfile + +**文件:** +- 修改:`Jenkinsfile` + +- [ ] **步骤 1:查看当前配置** + +运行:`cat Jenkinsfile` +预期:查看当前 Jenkins 配置 + +- [ ] **步骤 2:更新项目路径** + +根据实际配置,更新项目路径和构建命令,确保引用新的项目目录名称。 + +--- + +### 任务 5.3:更新 README.md + +**文件:** +- 修改:`README.md` + +- [ ] **步骤 1:更新项目名称和描述** + +修改 `README.md` 开头部分: + +```markdown +# 健身房管理系统 + +企业级健身房管理系统,包含会员管理、课程管理、教练管理、设备管理等核心功能。 + +## 项目结构 + +``` +gym-manage/ +├── gym-manage-api/ # 后端 API 项目 +│ ├── manage-gateway/ # API 网关服务 +│ ├── manage-app/ # 主应用服务 +│ ├── manage-sys/ # 系统管理模块 +│ ├── manage-db/ # 数据库模块 +│ ├── manage-common/ # 公共模块 +│ ├── manage-audit/ # 审计模块 +│ ├── manage-notify/ # 通知模块 +│ └── manage-file/ # 文件管理模块 +├── gym-manage-web/ # 前端 Web 项目 +├── gym-manage-uniapp/ # 移动端 UniApp 项目 +└── e2e-tests/ # E2E 测试 +``` +``` + +- [ ] **步骤 2:更新技术栈描述** + +更新技术栈部分,添加 UniApp 相关信息: + +```markdown +### 移动端 + +- UniApp + Vue 3 +- TypeScript +- Pinia (状态管理) +``` + +--- + +### 任务 5.4:最终验证 + +**文件:** +- 无文件修改,仅验证 + +- [ ] **步骤 1:验证根目录结构** + +运行:`ls -la` +预期:只包含全局性文件和项目目录 + +- [ ] **步骤 2:验证后端服务** + +```bash +cd gym-manage-api +mvn clean compile +``` + +预期:编译成功 + +- [ ] **步骤 3:验证前端构建** + +```bash +cd gym-manage-web +npm run build +``` + +预期:构建成功 + +- [ ] **步骤 4:验证 UniApp 运行** + +```bash +cd gym-manage-uniapp +npm run dev:h5 +``` + +预期:开发服务器启动成功 + +--- + +### 任务 5.5:提交阶段 5 的变更 + +**文件:** +- 无文件修改,仅提交 + +- [ ] **步骤 1:查看变更状态** + +```bash +git status +``` + +预期:显示所有修改的文件 + +- [ ] **步骤 2:提交变更** + +```bash +git add . +git commit -m "docs: 更新项目文档和全局配置" +``` + +预期:提交成功 + +--- + +### 任务 5.6:推送到远程仓库 + +**文件:** +- 无文件修改,仅推送 + +- [ ] **步骤 1:查看提交历史** + +```bash +git log --oneline -5 +``` + +预期:显示最近 5 次提交 + +- [ ] **步骤 2:推送到远程仓库** + +```bash +git push origin HEAD +``` + +预期:推送成功 + +--- + +## 计划自检 + +### 1. 规格覆盖度检查 + +✅ 所有规格中的需求都有对应的任务: +- 后端项目重构:任务 1.1 - 1.16 +- 前端项目重构:任务 2.1 - 2.5 +- 测试文件迁移:任务 3.1 - 3.10 +- UniApp 项目创建:任务 4.1 - 4.14 +- 根目录整理:任务 5.1 - 5.6 + +### 2. 占位符扫描 + +✅ 无占位符: +- 无"待定"、"TODO"、"后续实现"等词汇 +- 所有步骤都有具体的代码或命令 +- 所有文件路径都是精确的 + +### 3. 类型一致性 + +✅ 类型一致: +- 所有文件路径使用统一的命名规范 +- 所有代码示例使用一致的语法 +- 所有命令使用一致的格式 + +--- + +**计划已完成。**