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. 类型一致性
+
+✅ 类型一致:
+- 所有文件路径使用统一的命名规范
+- 所有代码示例使用一致的语法
+- 所有命令使用一致的格式
+
+---
+
+**计划已完成。**