Files
gym-manage/docs/superpowers/plans/2026-04-17-gym-manage-refactor.md
T

1885 lines
38 KiB
Markdown
Raw 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.
# 健身房管理系统基础设施重构实现计划
> **面向 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
<groupId>cn.novalon.gym.manage</groupId>
```
- [ ] **步骤 2:更新 Maven 父 POM 的 artifactId**
修改 `gym-manage-api/pom.xml` 第 22 行:
```xml
<artifactId>gym-manage-api</artifactId>
```
- [ ] **步骤 3:更新 Maven 父 POM 的 name**
修改 `gym-manage-api/pom.xml` 第 26 行:
```xml
<name>Gym Manage API</name>
```
- [ ] **步骤 4:更新 Maven 父 POM 的 description**
修改 `gym-manage-api/pom.xml` 第 27 行:
```xml
<description>Gym Management System API</description>
```
---
### 任务 1.3:修改 manage-app 模块 POM 配置
**文件:**
- 修改:`gym-manage-api/manage-app/pom.xml`
- [ ] **步骤 1:更新 parent 引用的 groupId**
修改 `gym-manage-api/manage-app/pom.xml`
```xml
<parent>
<groupId>cn.novalon.gym.manage</groupId>
<artifactId>gym-manage-api</artifactId>
<version>1.0.0</version>
</parent>
```
- [ ] **步骤 2:更新模块的 groupId**
```xml
<groupId>cn.novalon.gym.manage</groupId>
```
- [ ] **步骤 3:更新模块的 artifactId**
```xml
<artifactId>manage-app</artifactId>
```
---
### 任务 1.4:修改 manage-gateway 模块 POM 配置
**文件:**
- 修改:`gym-manage-api/manage-gateway/pom.xml`
- [ ] **步骤 1:更新 parent 引用的 groupId**
修改 `gym-manage-api/manage-gateway/pom.xml`
```xml
<parent>
<groupId>cn.novalon.gym.manage</groupId>
<artifactId>gym-manage-api</artifactId>
<version>1.0.0</version>
</parent>
```
- [ ] **步骤 2:更新模块的 groupId**
```xml
<groupId>cn.novalon.gym.manage</groupId>
```
---
### 任务 1.5:修改 manage-sys 模块 POM 配置
**文件:**
- 修改:`gym-manage-api/manage-sys/pom.xml`
- [ ] **步骤 1:更新 parent 引用的 groupId**
修改 `gym-manage-api/manage-sys/pom.xml`
```xml
<parent>
<groupId>cn.novalon.gym.manage</groupId>
<artifactId>gym-manage-api</artifactId>
<version>1.0.0</version>
</parent>
```
- [ ] **步骤 2:更新模块的 groupId**
```xml
<groupId>cn.novalon.gym.manage</groupId>
```
---
### 任务 1.6:修改 manage-db 模块 POM 配置
**文件:**
- 修改:`gym-manage-api/manage-db/pom.xml`
- [ ] **步骤 1:更新 parent 引用的 groupId**
修改 `gym-manage-api/manage-db/pom.xml`
```xml
<parent>
<groupId>cn.novalon.gym.manage</groupId>
<artifactId>gym-manage-api</artifactId>
<version>1.0.0</version>
</parent>
```
- [ ] **步骤 2:更新模块的 groupId**
```xml
<groupId>cn.novalon.gym.manage</groupId>
```
---
### 任务 1.7:修改 manage-common 模块 POM 配置
**文件:**
- 修改:`gym-manage-api/manage-common/pom.xml`
- [ ] **步骤 1:更新 parent 引用的 groupId**
修改 `gym-manage-api/manage-common/pom.xml`
```xml
<parent>
<groupId>cn.novalon.gym.manage</groupId>
<artifactId>gym-manage-api</artifactId>
<version>1.0.0</version>
</parent>
```
- [ ] **步骤 2:更新模块的 groupId**
```xml
<groupId>cn.novalon.gym.manage</groupId>
```
---
### 任务 1.8:修改 manage-audit 模块 POM 配置
**文件:**
- 修改:`gym-manage-api/manage-audit/pom.xml`
- [ ] **步骤 1:更新 parent 引用的 groupId**
修改 `gym-manage-api/manage-audit/pom.xml`
```xml
<parent>
<groupId>cn.novalon.gym.manage</groupId>
<artifactId>gym-manage-api</artifactId>
<version>1.0.0</version>
</parent>
```
- [ ] **步骤 2:更新模块的 groupId**
```xml
<groupId>cn.novalon.gym.manage</groupId>
```
---
### 任务 1.9:修改 manage-notify 模块 POM 配置
**文件:**
- 修改:`gym-manage-api/manage-notify/pom.xml`
- [ ] **步骤 1:更新 parent 引用的 groupId**
修改 `gym-manage-api/manage-notify/pom.xml`
```xml
<parent>
<groupId>cn.novalon.gym.manage</groupId>
<artifactId>gym-manage-api</artifactId>
<version>1.0.0</version>
</parent>
```
- [ ] **步骤 2:更新模块的 groupId**
```xml
<groupId>cn.novalon.gym.manage</groupId>
```
---
### 任务 1.10:修改 manage-file 模块 POM 配置
**文件:**
- 修改:`gym-manage-api/manage-file/pom.xml`
- [ ] **步骤 1:更新 parent 引用的 groupId**
修改 `gym-manage-api/manage-file/pom.xml`
```xml
<parent>
<groupId>cn.novalon.gym.manage</groupId>
<artifactId>gym-manage-api</artifactId>
<version>1.0.0</version>
</parent>
```
- [ ] **步骤 2:更新模块的 groupId**
```xml
<groupId>cn.novalon.gym.manage</groupId>
```
---
### 任务 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
<title>健身房管理系统</title>
```
---
### 任务 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
<script setup lang="ts">
import { onLaunch, onShow, onHide } from '@dcloudio/uni-app'
onLaunch(() => {
console.log('App Launch')
})
onShow(() => {
console.log('App Show')
})
onHide(() => {
console.log('App Hide')
})
</script>
<style>
/* 全局样式 */
page {
background-color: #f8f8f8;
}
</style>
```
---
### 任务 4.8:创建首页组件
**文件:**
- 创建:`gym-manage-uniapp/src/pages/index/index.vue`
- [ ] **步骤 1:创建首页组件文件**
创建 `gym-manage-uniapp/src/pages/index/index.vue`
```vue
<template>
<view class="container">
<view class="header">
<text class="title">健身房管理系统</text>
<text class="subtitle">移动端应用</text>
</view>
<view class="content">
<text class="description">欢迎使用健身房管理系统移动端应用</text>
</view>
</view>
</template>
<script setup lang="ts">
import { ref } from 'vue'
const title = ref('健身房管理系统')
</script>
<style scoped>
.container {
display: flex;
flex-direction: column;
align-items: center;
padding: 40rpx;
}
.header {
text-align: center;
margin-bottom: 60rpx;
}
.title {
font-size: 48rpx;
font-weight: bold;
color: #333;
display: block;
margin-bottom: 20rpx;
}
.subtitle {
font-size: 28rpx;
color: #666;
display: block;
}
.content {
text-align: center;
}
.description {
font-size: 32rpx;
color: #999;
}
</style>
```
---
### 任务 4.9:创建登录页组件
**文件:**
- 创建:`gym-manage-uniapp/src/pages/login/index.vue`
- [ ] **步骤 1:创建登录页组件文件**
创建 `gym-manage-uniapp/src/pages/login/index.vue`
```vue
<template>
<view class="login-container">
<view class="login-header">
<text class="login-title">健身房管理系统</text>
</view>
<view class="login-form">
<view class="form-item">
<input
class="input"
type="text"
v-model="username"
placeholder="请输入用户名"
/>
</view>
<view class="form-item">
<input
class="input"
type="password"
v-model="password"
placeholder="请输入密码"
/>
</view>
<button class="login-btn" @click="handleLogin">登录</button>
</view>
</view>
</template>
<script setup lang="ts">
import { ref } from 'vue'
const username = ref('')
const password = ref('')
const handleLogin = () => {
console.log('登录:', username.value, password.value)
uni.showToast({
title: '功能待实现',
icon: 'none'
})
}
</script>
<style scoped>
.login-container {
display: flex;
flex-direction: column;
align-items: center;
padding: 80rpx 40rpx;
}
.login-header {
margin-bottom: 80rpx;
}
.login-title {
font-size: 48rpx;
font-weight: bold;
color: #333;
}
.login-form {
width: 100%;
}
.form-item {
margin-bottom: 40rpx;
}
.input {
width: 100%;
height: 88rpx;
padding: 0 30rpx;
border: 1rpx solid #ddd;
border-radius: 8rpx;
font-size: 32rpx;
}
.login-btn {
width: 100%;
height: 88rpx;
line-height: 88rpx;
background-color: #007AFF;
color: #fff;
border: none;
border-radius: 8rpx;
font-size: 32rpx;
}
</style>
```
---
### 任务 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<string, string>
}
interface Response<T = any> {
code: number
message: string
data: T
}
export function request<T = any>(options: RequestOptions): Promise<Response<T>> {
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<T>)
} else {
reject(new Error(`请求失败: ${res.statusCode}`))
}
},
fail: (err: any) => {
reject(new Error(`网络错误: ${err.errMsg}`))
}
})
})
}
export function get<T = any>(url: string, data?: any): Promise<Response<T>> {
return request<T>({ url, method: 'GET', data })
}
export function post<T = any>(url: string, data?: any): Promise<Response<T>> {
return request<T>({ url, method: 'POST', data })
}
export function put<T = any>(url: string, data?: any): Promise<Response<T>> {
return request<T>({ url, method: 'PUT', data })
}
export function del<T = any>(url: string, data?: any): Promise<Response<T>> {
return request<T>({ 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<string>('')
const userInfo = ref<any>(null)
const isLoggedIn = ref<boolean>(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<T = any>(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. 类型一致性
✅ 类型一致:
- 所有文件路径使用统一的命名规范
- 所有代码示例使用一致的语法
- 所有命令使用一致的格式
---
**计划已完成。**