# novalon-manage-system

企业级后台管理系统

## 项目结构

```
novalon-manage-system/
├── novalon-manage-api/          # 后端 API 项目
│   ├── manage-gateway/          # API 网关服务
│   ├── manage-app/              # 主应用服务
│   ├── manage-sys/              # 系统管理模块
│   ├── manage-db/               # 数据库模块
│   ├── manage-common/           # 公共模块
│   ├── manage-audit/            # 审计模块
│   ├── manage-notify/           # 通知模块
│   └── manage-file/             # 文件管理模块
├── novalon-manage-web/          # 前端 Web 项目
├── api_integration_tests/       # API 集成测试
└── e2e-tests/                   # E2E 测试
```

## 技术栈

### 后端

- Java 21
- Spring Boot 3.5.13
- Spring Cloud Gateway
- Spring Security + JWT
- R2DBC (响应式数据库访问)
- PostgreSQL 15
- Flyway (数据库迁移)

### 前端

- Vue 3 + TypeScript
- Element Plus
- Pinia (状态管理)
- Vite (构建工具)
- Playwright (E2E 测试)

## 快速开始

### 方式一：Docker Compose（推荐）

使用 Docker Compose 可以一键启动所有服务，包括数据库、后端和前端。

#### 前置要求

- Docker 20.10+
- Docker Compose 2.0+

#### 启动步骤

1. **克隆项目**

```bash
git clone <repository-url>
cd novalon-manage-system
```

2. **启动所有服务**

```bash
docker-compose up -d
```

3. **查看服务状态**

```bash
docker-compose ps
```

4. **查看日志**

```bash
# 查看所有服务日志
docker-compose logs -f

# 查看特定服务日志
docker-compose logs -f postgres
docker-compose logs -f backend
docker-compose logs -f frontend
```

5. **访问应用**

- 前端应用: http://localhost:3001
- 后端 API: http://localhost:8084
- API 文档: http://localhost:8084/swagger-ui.html
- 健康检查: http://localhost:8084/actuator/health

#### 停止服务

```bash
docker-compose down
```

#### 清理数据（包括数据库数据）

```bash
docker-compose down -v
```

### 方式二：本地开发环境

#### 1. 环境准备要求

##### 必需软件

- **Java**: JDK 21 或更高版本
- **Maven**: 3.8+ (用于后端构建)
- **Node.js**: 18+ (用于前端构建)
- **pnpm**: 8+ (推荐) 或 npm
- **PostgreSQL**: 15+ (数据库)
- **Git**: 版本控制

##### 可选软件

- **Docker**: 用于容器化部署
- **IDE**: IntelliJ IDEA (推荐) 或 VS Code

##### 系统要求

- **操作系统**: macOS, Linux, Windows
- **内存**: 最低 4GB，推荐 8GB+
- **磁盘空间**: 最低 2GB 可用空间

#### 2. 依赖安装步骤

##### 2.1 安装 Java 和 Maven

**macOS (使用 Homebrew)**:

```bash
brew install openjdk@21
brew install maven

# 设置 JAVA_HOME
echo 'export JAVA_HOME=$(/usr/libexec/java_home -v21)' >> ~/.zshrc
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.zshrc
source ~/.zshrc

# 验证安装
java -version
mvn -version
```

**Linux (Ubuntu/Debian)**:

```bash
# 安装 OpenJDK 21
sudo apt update
sudo apt install openjdk-21-jdk

# 安装 Maven
sudo apt install maven

# 验证安装
java -version
mvn -version
```

**Windows**:

1. 下载并安装 JDK 21: https://adoptium.net/
2. 下载并安装 Maven: https://maven.apache.org/download.cgi
3. 设置环境变量:
   - `JAVA_HOME`: 指向 JDK 安装目录
   - `MAVEN_HOME`: 指向 Maven 安装目录
   - `PATH`: 添加 `%JAVA_HOME%\bin` 和 `%MAVEN_HOME%\bin`

##### 2.2 安装 Node.js 和 pnpm

**使用 nvm (推荐)**:

```bash
# 安装 nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash

# 重新加载 shell
source ~/.bashrc  # 或 source ~/.zshrc

# 安装 Node.js 18
nvm install 18
nvm use 18

# 安装 pnpm
npm install -g pnpm

# 验证安装
node -v
pnpm -v
```

**macOS (使用 Homebrew)**:

```bash
brew install node
npm install -g pnpm
```

**Windows**:

1. 下载并安装 Node.js: https://nodejs.org/
2. 安装 pnpm:

```powershell
npm install -g pnpm
```

##### 2.3 安装 PostgreSQL

**macOS (使用 Homebrew)**:

```bash
brew install postgresql@15
brew services start postgresql@15

# 创建数据库和用户
psql postgres
```

在 psql 中执行:

```sql
CREATE DATABASE manage_system;
CREATE USER novalon WITH PASSWORD 'novalon123';
GRANT ALL PRIVILEGES ON DATABASE manage_system TO novalon;
\q
```

**Linux (Ubuntu/Debian)**:

```bash
sudo apt install postgresql-15 postgresql-contrib-15
sudo systemctl start postgresql

# 创建数据库和用户
sudo -u postgres psql
```

在 psql 中执行:

```sql
CREATE DATABASE manage_system;
CREATE USER novalon WITH PASSWORD 'novalon123';
GRANT ALL PRIVILEGES ON DATABASE manage_system TO novalon;
\q
```

**Windows**:

1. 下载并安装 PostgreSQL: https://www.postgresql.org/download/windows/
2. 使用 pgAdmin 创建数据库和用户，或使用命令行工具

##### 2.4 验证环境

创建并运行环境检查脚本:

```bash
# 检查 Java
java -version
mvn -version

# 检查 Node.js
node -v
pnpm -v

# 检查 PostgreSQL
psql --version
```

#### 3. 数据库初始化

##### 3.1 配置数据库连接

后端使用 Flyway 自动管理数据库迁移，数据库表结构会在首次启动时自动创建。

**开发环境配置** (`novalon-manage-api/manage-app/src/main/resources/application-dev.yml`):

```yaml
spring:
  r2dbc:
    url: r2dbc:postgresql://localhost:55432/manage_system
    username: novalon
    password: novalon123
  flyway:
    enabled: true
```

**生产环境配置** (`novalon-manage-api/manage-app/src/main/resources/application-prod.yml`):

```yaml
spring:
  r2dbc:
    url: r2dbc:postgresql://postgres:5432/novalon_manage
    username: ${DB_USERNAME}
    password: ${DB_PASSWORD}
  flyway:
    enabled: true
```

##### 3.2 手动初始化数据库（可选）

如果需要手动初始化数据库，可以执行以下 SQL 脚本:

```bash
# 连接到数据库
psql -U novalon -d manage_system

# 执行初始化脚本
\i novalon-manage-api/manage-db/src/main/resources/db/migration/V1__Create_all_tables.sql
\i novalon-manage-api/manage-db/src/main/resources/db/migration/V2__Insert_initial_data.sql
\i novalon-manage-api/manage-db/src/main/resources/db/migration/V3__Create_indexes.sql
\i novalon-manage-api/manage-db/src/main/resources/db/migration/V4__Create_permission_tables.sql

# 退出
\q
```

##### 3.3 验证数据库连接

```bash
# 测试数据库连接
psql -U novalon -d manage_system -c "SELECT version();"

# 查看已创建的表
psql -U novalon -d manage_system -c "\dt"
```

#### 4. 后端网关服务配置说明

##### 4.1 网关服务概述

`manage-gateway` 是系统的 API 网关，负责:

- 请求路由和转发
- JWT 认证过滤
- RBAC 权限控制
- 请求重试机制
- 限流和熔断

##### 4.2 网关配置文件

**主配置** (`novalon-manage-api/manage-gateway/src/main/resources/application.yml`):

```yaml
server:
  port: 8080

spring:
  application:
    name: manage-gateway
  cloud:
    gateway:
      routes:
        - id: manage-app
          uri: http://localhost:8084
          predicates:
            - Path=/api/**
      default-filters:
        - name: JwtAuthentication
        - name: RbacAuthorization
        - name: Retry
          args:
            retries: 3
            statuses: BAD_GATEWAY,SERVICE_UNAVAILABLE
            methods: GET,POST
            backoff:
              firstBackoff: 10ms
              maxBackoff: 50ms
              factor: 2
              basedOnPreviousValue: false

jwt:
  secret: ${JWT_SECRET:mySecretKeyForNovalonManageSystem2024}
  expiration: ${JWT_EXPIRATION:86400000}

management:
  endpoints:
    web:
      exposure:
        include: health,info,metrics
      base-path: /actuator
  endpoint:
    health:
      show-details: always
  metrics:
    tags:
      application: ${spring.application.name}

logging:
  level:
    cn.novalon.manage: DEBUG
    org.springframework.cloud.gateway: DEBUG
```

##### 4.3 网关路由配置

网关将所有 `/api/**` 路径的请求转发到 `manage-app` 服务 (端口 8084)。

**路由规则**:

- 所有以 `/api/` 开头的请求都会被转发到后端服务
- 请求会经过 JWT 认证和 RBAC 权限验证
- 失败的请求会自动重试（最多 3 次）

##### 4.4 JWT 配置

**环境变量**:

- `JWT_SECRET`: JWT 密钥（生产环境必须设置强密钥）
- `JWT_EXPIRATION`: Token 过期时间（毫秒，默认 24 小时）

**示例**:

```bash
export JWT_SECRET="your-strong-secret-key-here"
export JWT_EXPIRATION="86400000"
```

##### 4.5 网关健康检查

```bash
# 检查网关健康状态
curl http://localhost:8080/actuator/health

# 查看网关信息
curl http://localhost:8080/actuator/info

# 查看网关指标
curl http://localhost:8080/actuator/metrics
```

#### 5. 完整的项目启动步骤

##### 5.1 启动后端服务

**步骤 1: 进入后端项目目录**

```bash
cd novalon-manage-api
```

**步骤 2: 编译项目**

```bash
mvn clean install -DskipTests
```

**步骤 3: 启动网关服务**

```bash
cd manage-gateway
mvn spring-boot:run
```

网关将在 `http://localhost:8080` 启动。

**步骤 4: 启动主应用服务**
打开新的终端窗口:

```bash
cd novalon-manage-api/manage-app
mvn spring-boot:run
```

主应用将在 `http://localhost:8084` 启动。

**步骤 5: 验证后端服务**

```bash
# 检查网关健康状态
curl http://localhost:8080/actuator/health

# 检查应用健康状态
curl http://localhost:8084/actuator/health

# 访问 API 文档
open http://localhost:8084/swagger-ui.html
```

##### 5.2 启动前端服务

**步骤 1: 进入前端项目目录**

```bash
cd novalon-manage-web
```

**步骤 2: 安装依赖**

```bash
pnpm install
```

**步骤 3: 配置环境变量**

创建 `.env.local` 文件（如果不存在）:

```env
VITE_API_BASE_URL=http://localhost:8080
VITE_APP_TITLE=Novalon管理系统
```

**步骤 4: 启动开发服务器**

```bash
pnpm dev
```

前端应用将在 `http://localhost:5173` 启动。

**步骤 5: 访问应用**
在浏览器中打开: http://localhost:5173

#### 6. 不同环境的启动命令和配置差异

##### 6.1 环境配置文件

后端支持多环境配置:

- `application.yml`: 主配置文件
- `application-dev.yml`: 开发环境配置
- `application-test.yml`: 测试环境配置
- `application-prod.yml`: 生产环境配置
- `application-metrics.yml`: 监控指标配置

##### 6.2 开发环境启动

**后端**:

```bash
cd novalon-manage-api/manage-app
mvn spring-boot:run -Dspring-boot.run.profiles=dev
```

**前端**:

```bash
cd novalon-manage-web
pnpm dev
```

**特点**:

- 使用本地数据库 (localhost:55432)
- DEBUG 日志级别
- 热重载启用
- Swagger UI 可用

##### 6.3 测试环境启动

**后端**:

```bash
cd novalon-manage-api/manage-app
mvn spring-boot:run -Dspring-boot.run.profiles=test
```

**前端**:

```bash
cd novalon-manage-web
pnpm dev:test
```

**特点**:

- 使用测试数据库
- INFO 日志级别
- 性能监控启用
- 测试数据可用

##### 6.4 生产环境启动

**后端**:

```bash
# 设置环境变量
export DB_USERNAME=your_prod_db_user
export DB_PASSWORD=your_prod_db_password
export JWT_SECRET=your_prod_jwt_secret

# 启动应用
cd novalon-manage-api/manage-app
mvn spring-boot:run -Dspring-boot.run.profiles=prod
```

**前端构建**:

```bash
cd novalon-manage-web
pnpm build:prod
```

**前端部署**:

```bash
# 使用 nginx 或其他静态文件服务器部署 dist 目录
pnpm preview
```

**特点**:

- 使用生产数据库
- INFO/WARN 日志级别
- 性能优化
- 安全加固
- Swagger UI 禁用

##### 6.5 Docker 环境启动

**使用 docker-compose**:

```bash
# 开发环境
docker-compose -f docker-compose.yml up -d

# 测试环境
docker-compose -f docker-compose.test.yml up -d
```

**特点**:

- 容器化部署
- 服务编排
- 健康检查
- 自动重启

#### 7. 常见启动问题的故障排除指南

##### 7.1 端口冲突问题

**症状**:

```
Port 8080 was already in use
```

**解决方案**:

```bash
# 查找占用端口的进程
lsof -i :8080  # macOS/Linux
netstat -ano | findstr :8080  # Windows

# 终止进程
kill -9 <PID>  # macOS/Linux
taskkill /PID <PID> /F  # Windows

# 或修改配置文件中的端口
# 在 application.yml 中修改 server.port
```

##### 7.2 数据库连接失败

**症状**:

```
Connection refused: localhost:55432
```

**解决方案**:

```bash
# 检查 PostgreSQL 服务状态
brew services list | grep postgresql  # macOS
systemctl status postgresql  # Linux

# 启动 PostgreSQL 服务
brew services start postgresql@15  # macOS
sudo systemctl start postgresql  # Linux

# 检查数据库连接
psql -U novalon -d manage_system -c "SELECT 1;"

# 检查防火墙设置
sudo ufw allow 5432  # Linux
```

##### 7.3 Maven 依赖下载失败

**症状**:

```
Could not resolve dependencies
```

**解决方案**:

```bash
# 清理 Maven 缓存
rm -rf ~/.m2/repository

# 使用国内镜像源
# 在 ~/.m2/settings.xml 中配置阿里云镜像
mvn clean install -U

# 检查网络连接
ping repo.maven.apache.org
```

##### 7.4 前端依赖安装失败

**症状**:

```
npm ERR! network request failed
```

**解决方案**:

```bash
# 清理缓存
pnpm store prune

# 使用国内镜像源
pnpm config set registry https://registry.npmmirror.com

# 重新安装
rm -rf node_modules
pnpm install
```

##### 7.5 JWT 认证失败

**症状**:

```
401 Unauthorized
Invalid JWT token
```

**解决方案**:

```bash
# 检查 JWT_SECRET 配置
echo $JWT_SECRET

# 确保前后端使用相同的 JWT 密钥
# 检查网关和应用的配置文件

# 重新生成 Token
# 使用登录接口获取新的 JWT Token
```

##### 7.6 Flyway 迁移失败

**症状**:

```
FlywayException: Validate failed
```

**解决方案**:

```bash
# 查看迁移历史
psql -U novalon -d manage_system -c "SELECT * FROM flyway_schema_history;"

# 修复失败的迁移
# 1. 备份数据库
# 2. 修复迁移脚本
# 3. 删除失败的迁移记录
# 4. 重新运行迁移

# 或手动修复
psql -U novalon -d manage_system
DELETE FROM flyway_schema_history WHERE success = false;
\q
```

##### 7.7 内存不足错误

**症状**:

```
Java heap space
OutOfMemoryError
```

**解决方案**:

```bash
# 增加 JVM 内存
export MAVEN_OPTS="-Xmx2g -Xms1g"

# 或在 pom.xml 中配置
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <argLine>-Xmx2g</argLine>
  </configuration>
</plugin>
```

##### 7.8 CORS 跨域问题

**症状**:

```
Access to XMLHttpRequest blocked by CORS policy
```

**解决方案**:

```bash
# 检查网关 CORS 配置
# 在 application.yml 中添加:
spring:
  cloud:
    gateway:
      globalcors:
        cors-configurations:
          '[/**]':
            allowedOrigins: "http://localhost:5173"
            allowedMethods:
              - GET
              - POST
              - PUT
              - DELETE
              - OPTIONS
            allowedHeaders: "*"
            allowCredentials: true
```

##### 7.9 日志查看和调试

**查看应用日志**:

```bash
# 后端日志
tail -f novalon-manage-api/manage-app/logs/application.log

# 网关日志
tail -f novalon-manage-api/manage-gateway/logs/application.log

# Docker 日志
docker-compose logs -f backend
docker-compose logs -f gateway
```

**启用 DEBUG 日志**:

```yaml
# 在 application.yml 中设置
logging:
  level:
    root: DEBUG
    cn.novalon.manage: DEBUG
    org.springframework: DEBUG
```

#### 8. 启动成功后的验证方法

##### 8.1 后端服务验证

**健康检查**:

```bash
# 网关健康检查
curl http://localhost:8080/actuator/health

# 应用健康检查
curl http://localhost:8084/actuator/health

# 预期输出:
# {"status":"UP"}
```

**API 文档访问**:

```bash
# 在浏览器中打开
open http://localhost:8084/swagger-ui.html

# 或使用 curl
curl http://localhost:8084/swagger-ui.html
```

**数据库连接验证**:

```bash
# 检查数据库表是否创建成功
psql -U novalon -d manage_system -c "\dt"

# 预期输出应包含以下表:
# users, roles, menus, sys_dict_type, sys_dict_data, etc.
```

**API 端点测试**:

```bash
# 测试登录接口
curl -X POST http://localhost:8080/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"admin123"}'

# 预期输出:
# {"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."}
```

##### 8.2 前端应用验证

**应用访问**:

```bash
# 在浏览器中打开
open http://localhost:5173
```

**功能验证清单**:

- [ ] 登录页面正常显示
- [ ] 能够成功登录（使用默认账号 admin/admin123）
- [ ] 主页面正常加载
- [ ] 菜单导航正常工作
- [ ] 用户管理功能可用
- [ ] 角色管理功能可用
- [ ] 系统配置功能可用

**浏览器控制台检查**:

```javascript
// 打开浏览器开发者工具 (F12)
// 检查 Console 标签页，确保没有错误信息
// 检查 Network 标签页，确认 API 请求正常
```

##### 8.3 集成测试验证

**运行 API 集成测试**:

```bash
cd api_integration_tests
pip install -r requirements.txt
pytest tests/ -v
```

**运行 E2E 测试**:

```bash
cd novalon-manage-web
pnpm test:e2e
```

##### 8.4 性能验证

**后端性能测试**:

```bash
# 使用 k6 进行性能测试
cd novalon-manage-api/manage-sys/src/test/k6
k6 run performance-test.js
```

**前端性能测试**:

```bash
cd novalon-manage-web
pnpm test:perf
```

##### 8.5 监控和日志

**查看应用指标**:

```bash
# 查看应用指标
curl http://localhost:8084/actuator/metrics

# 查看特定指标
curl http://localhost:8084/actuator/metrics/jvm.memory.used
```

**查看日志**:

```bash
# 查看应用日志
tail -f novalon-manage-api/manage-app/logs/application.log

# 查看错误日志
grep ERROR novalon-manage-api/manage-app/logs/application.log
```

##### 8.6 完整验证脚本

创建验证脚本 `verify-setup.sh`:

```bash
#!/bin/bash

echo "=== Novalon 管理系统启动验证 ==="

# 1. 检查后端服务
echo "1. 检查网关服务..."
if curl -s http://localhost:8080/actuator/health | grep -q "UP"; then
  echo "✓ 网关服务正常"
else
  echo "✗ 网关服务异常"
  exit 1
fi

echo "2. 检查应用服务..."
if curl -s http://localhost:8084/actuator/health | grep -q "UP"; then
  echo "✓ 应用服务正常"
else
  echo "✗ 应用服务异常"
  exit 1
fi

# 3. 检查数据库
echo "3. 检查数据库连接..."
if psql -U novalon -d manage_system -c "SELECT 1;" > /dev/null 2>&1; then
  echo "✓ 数据库连接正常"
else
  echo "✗ 数据库连接失败"
  exit 1
fi

# 4. 检查前端服务
echo "4. 检查前端服务..."
if curl -s http://localhost:5173 > /dev/null 2>&1; then
  echo "✓ 前端服务正常"
else
  echo "✗ 前端服务异常"
  exit 1
fi

echo "=== 所有服务验证通过 ==="
```

运行验证脚本:

```bash
chmod +x verify-setup.sh
./verify-setup.sh
```

## 功能模块

### 已完成功能

- ✅ 用户管理 - 完整的用户CRUD操作、角色分配、状态管理
- ✅ 角色管理 - 角色定义、权限配置、菜单关联
- ✅ 菜单管理 - 菜单树结构、路由配置、权限控制
- ✅ 权限管理 - 权限定义、角色授权、API权限控制
- ✅ 操作日志 - 登录日志、异常日志、操作记录
- ✅ 字典管理 - 字典类型管理、字典数据管理、数据字典
- ✅ 系统配置 - 系统参数配置、配置管理、缓存刷新
- ✅ 审计中心 - 审计日志、操作审计、安全审计
- ✅ 通知中心 - 通知公告、用户消息、消息推送
- ✅ 文件管理 - 文件上传、文件下载、文件预览
- ✅ WebSocket消息推送 - 实时通知、消息推送、在线状态

### 核心特性

- **响应式编程**: 基于Spring WebFlux的异步非阻塞架构
- **JWT认证**: 无状态Token认证，支持Token刷新
- **权限控制**: 基于角色的访问控制(RBAC)
- **实时通信**: WebSocket支持实时消息推送
- **文件预览**: 支持图片、PDF、文本文件的在线预览
- **逻辑删除**: 支持数据的软删除和恢复
- **审计日志**: 完整的操作审计和安全审计

## 开发指南

### 后端开发

```bash
cd novalon-manage-api
mvn clean install
mvn spring-boot:run
```

### 前端开发

```bash
cd novalon-manage-web
pnpm install
pnpm dev
```

### 测试

```bash
# 后端单元测试
cd novalon-manage-api
mvn test

# 前端单元测试
cd novalon-manage-web
pnpm test

# E2E 测试
cd novalon-manage-web
pnpm test:e2e

# API 集成测试
cd api_integration_tests
pytest tests/
```

## 部署

### Docker 部署

```bash
# 构建镜像
docker-compose build

# 启动服务
docker-compose up -d

# 查看日志
docker-compose logs -f
```

### 生产环境部署

详见部署文档 [DEPLOYMENT.md](./docs/DEPLOYMENT.md)

## 故障排除

### 常见问题

1. **端口冲突**: 修改 `application.yml` 中的端口配置
2. **数据库连接失败**: 检查 PostgreSQL 服务状态和连接配置
3. **JWT 认证失败**: 确认前后端使用相同的 JWT 密钥
4. **CORS 跨域问题**: 配置网关的 CORS 设置

详细故障排除指南请参考 [TROUBLESHOOTING.md](./docs/TROUBLESHOOTING.md)

## 贡献指南

欢迎贡献代码！请阅读 [CONTRIBUTING.md](./docs/CONTRIBUTING.md) 了解详细信息。

## License

MIT

## 项目规划

### 当前阶段：系统修复与优化

#### 短期目标（2026-04-02）
1. ✅ **服务重启与验证**
   - 重启Gateway、App、Frontend服务
   - 解决前端白屏问题（Vite进程挂起）
   - 验证服务健康状态

2. ⏳ **测试套件验证**
   - 运行后端单元测试
   - 运行后端集成测试
   - 运行E2E测试
   - 修复失败的测试

3. 📋 **命名规范统一**
   - Service接口: IXxxService
   - Service实现: XxxService
   - Repository接口: IXxxRepository
   - Repository实现: XxxRepository

#### 中期目标（2026-04）
1. 完善测试覆盖率
2. 优化性能和稳定性
3. 完善监控和告警
4. 文档完善

#### 长期目标（2026-Q2）
1. 微服务架构优化
2. 容器化部署完善
3. CI/CD流水线优化
4. 安全加固

## 项目进度

### 2026-04-02 进度更新

#### 已完成
- ✅ JWT密钥统一配置
- ✅ 签名验证修复
- ✅ Repository扫描修复
- ✅ JwtKeyService初始化修复
- ✅ 前端白屏问题修复
- ✅ 后端单元测试通过 (12/12)

#### 进行中
- ⏳ 后端集成测试修复
- ⏳ E2E测试验证
- ⏳ 登录功能调试

#### 待开始
- 📋 命名规范统一
- 📋 完整测试验证
- 📋 文档更新

### 技术债务

#### 高优先级
1. **登录功能异常** - 需要优先修复
2. **集成测试失败** - 缺少Spring Boot配置
3. **密钥管理** - 当前硬编码，存在安全风险

#### 中优先级
1. **命名规范不统一** - 影响代码可读性
2. **测试覆盖率不足** - 需要补充测试用例
3. **文档不完整** - 影响团队协作

#### 低优先级
1. **性能优化** - 当前性能可接受
2. **代码重构** - 可以逐步改进

### 关键决策记录

#### 2026-04-02: 前端服务启动方式
**问题**: 使用nohup启动Vite开发服务器时，进程被挂起导致白屏  
**根本原因**: Vite尝试从标准输入读取命令，在macOS上导致进程挂起  
**解决方案**: 将标准输入重定向到/dev/null  
**命令**: `nohup ./start-frontend.sh > /tmp/frontend.log 2>&1 </dev/null &`

#### 2026-04-02: JWT密钥管理
**问题**: manage-app和gateway使用不同的JWT密钥  
**解决方案**: 统一使用gateway的密钥配置  
**影响**: 所有已生成的Token将失效，用户需要重新登录

#### 2026-04-02: 签名验证实现
**问题**: 前端bodyString被硬编码为空字符串  
**解决方案**: 正确处理请求体 `body ? JSON.stringify(body) : ''`  
**影响**: POST请求现在可以正确签名验证

### 相关文档

- [调试与修复报告](docs/DEBUG_AND_FIX_REPORT.md)
- [任务总结报告](docs/TASK_SUMMARY_REPORT.md)
- [任务计划](task_plan.md)
- [发现记录](findings.md)
- [进度记录](progress.md)

---

**最后更新**: 2026-04-02  
**维护人员**: 张翔

## API响应格式修复记录 (2026-04-02)

### 问题描述

测试套件运行失败,多个API测试返回响应格式不符合预期:

```
AssertionError: assert "content" in data
Expected: {"content": [...], "totalElements": 5, "totalPages": 1, ...}
Actual: [...]
```

### 根因分析

**问题根源**: API路径与后端路由不匹配

| 测试调用 | 后端路由 | Handler方法 | 返回格式 |
|---------|---------|------------|---------|
| `/api/logs/login?page=0&size=10` | `/api/logs/login` | `getAllLoginLogs()` | 列表 `[]` |
| 应该调用 `/api/logs/login/page?page=0&size=10` | `/api/logs/login/page` | `getLoginLogsByPage()` | PageResponse `{}` |

**影响范围**:
- 用户API: `/api/users?page=0&size=10`
- 角色API: `/api/roles?page=0&size=10`
- 登录日志API: `/api/logs/login?page=0&size=10`
- 异常日志API: `/api/logs/exception?page=0&size=10`

### 修复方案

**方案选择**: 修改后端Handler,让 `getAllXxx()` 方法支持分页参数

**理由**:
1. 符合RESTful API最佳实践: `GET /resources` 应支持查询参数
2. 向后兼容: 无分页参数时返回列表,有分页参数时返回分页对象
3. 减少测试代码修改

### 修复内容

#### 1. SysLogHandler.java

修改 `getAllLoginLogs()` 和 `getAllExceptionLogs()` 方法:

```java
@Operation(summary = "获取所有登录日志", description = "获取系统中所有登录日志列表，支持分页参数")
public Mono<ServerResponse> getAllLoginLogs(ServerRequest request) {
    boolean hasPageParams = request.queryParam("page").isPresent() || request.queryParam("size").isPresent();
    
    if (hasPageParams) {
        // 返回分页对象
        int page = Integer.parseInt(request.queryParam("page").orElse("0"));
        int size = Integer.parseInt(request.queryParam("size").orElse("10"));
        // ... 构建PageRequest并调用分页服务
        return loginLogService.findLoginLogsByPage(pageRequest)
                .flatMap(response -> ServerResponse.ok().bodyValue(response));
    } else {
        // 返回列表
        return ServerResponse.ok()
                .body(loginLogService.findAll(), SysLoginLog.class);
    }
}
```

#### 2. SysUserHandler.java

修改 `getAllUsers()` 方法,支持分页参数。

#### 3. SysRoleHandler.java

修改 `getAllRoles()` 方法,支持分页参数。

### 修复效果

**修复前**:
- `/api/logs/login` → 返回列表 `[]`
- `/api/logs/login?page=0&size=10` → 返回列表 `[]` ❌

**修复后**:
- `/api/logs/login` → 返回列表 `[]` ✅
- `/api/logs/login?page=0&size=10` → 返回分页对象 `{}` ✅

### API设计原则

遵循RESTful API最佳实践:

1. **资源路径**: `/api/resources`
2. **查询参数**: 用于过滤、排序、分页
   - `?page=0&size=10` - 分页参数
   - `?keyword=admin` - 关键词搜索
   - `?sort=id&order=desc` - 排序参数
3. **响应格式**:
   - 无分页参数: 返回资源列表
   - 有分页参数: 返回分页对象

```json
{
  "content": [...],
  "totalElements": 100,
  "totalPages": 10,
  "currentPage": 0,
  "pageSize": 10,
  "first": true,
  "last": false
}
```

### 验证状态

- ✅ 代码编译通过
- ⏳ 集成测试验证 (需要数据库环境)
- ⏳ E2E测试验证 (需要完整环境)

### 相关文件

- [SysLogHandler.java](novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/log/SysLogHandler.java)
- [SysUserHandler.java](novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/user/SysUserHandler.java)
- [SysRoleHandler.java](novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/role/SysRoleHandler.java)
- [PageResponse.java](novalon-manage-api/manage-common/src/main/java/cn/novalon/manage/common/dto/PageResponse.java)
