Prechádzať zdrojové kódy

docs(devrule): 添加安全规范文档

- 定义认证与授权机制,包括Token认证、角色权限控制
- 规范数据安全要求,如敏感信息存储和传输安全
- 明确输入验证标准,使用Spring Validation进行参数校验
- 制定异常处理规范,通过@RestControllerAdvice统一处理异常
- 确立日志安全策略,避免记录完整Token等敏感信息
- 规范数据库连接配置,使用HikariCP连接池并设置超时参数
- 设定API安全保护措施,排除特定路径的Token验证
- 描述部署安全要求,支持PEM格式SSL证书文件
- 建立监控与审计机制,记录认证失败和系统异常事件
- 提出合规性要求,保护用户个人信息并实施最小权限原则
mcbaiyun 2 mesiacov pred
rodič
commit
b52a35cca8

+ 148 - 0
docs/DevRule/01-代码风格指南.md

@@ -0,0 +1,148 @@
+# 01-代码风格指南
+
+## 1. 命名规范
+
+### 1.1 包名
+- 包名全部使用小写字母,使用点号分隔单词。
+- 示例:`work.baiyun.chronicdiseaseapp`
+
+### 1.2 类名和接口名
+- 使用驼峰命名法(CamelCase),首字母大写。
+- 示例:`SpringAPP`、`WeChatController`、`UserService`
+
+### 1.3 方法名
+- 使用驼峰命名法(camelCase),首字母小写。
+- 示例:`getOpenid`、`generateToken`、`addInterceptors`
+
+### 1.4 变量名和字段名
+- 使用驼峰命名法(camelCase),首字母小写。
+- 示例:`weChatService`、`username`、`authInterceptor`
+
+### 1.5 常量名
+- 全部大写,使用下划线分隔单词。
+- 示例:`TOKEN_TTL_HOURS`、`REFRESH_THRESHOLD_HOURS`
+
+### 1.6 枚举值
+- 全部大写,使用下划线分隔单词。
+- 示例:`MALE`、`FEMALE`
+
+## 2. 代码格式
+
+### 2.1 缩进
+- 使用4个空格进行缩进,不使用制表符(Tab)。
+
+### 2.2 花括号
+- 类和方法的花括号在声明行的末尾。
+- 示例:
+  ```java
+  public class Example {
+      public void method() {
+          // code
+      }
+  }
+  ```
+
+### 2.3 导入语句
+- 导入语句按以下顺序分组:
+  1. Java标准库(java.*)
+  2. 第三方库(com.*、org.*等)
+  3. 项目内部包(work.baiyun.*)
+- 组间用空行分隔。
+
+### 2.4 行长度
+- 单行代码不超过120个字符,超出时适当换行。
+
+### 2.5 空格
+- 运算符前后加空格,如 `a + b`。
+- 方法参数之间用逗号加空格分隔,如 `method(a, b, c)`。
+- 控制语句关键字后加空格,如 `if (condition)`。
+
+## 3. 注释规范
+
+### 3.1 类注释
+- 使用Javadoc注释 `/** */`。
+- 示例:
+  ```java
+  /**
+   * 性别枚举,数据库存储为整数:1=男, 2=女
+   */
+  public enum Gender {
+  ```
+
+### 3.2 方法注释
+- 公共方法使用Javadoc注释。
+- 示例:
+  ```java
+  /**
+   * 获取用户OpenID
+   */
+  public R<?> getOpenid(GetOpenidRequest req) {
+  ```
+
+### 3.3 字段注释
+- 使用 `/** */` 注释字段,描述字段含义。
+- 示例:
+  ```java
+  /** 用户名;用户名 */
+  @Schema(description = "用户名(可选)")
+  private String username;
+  ```
+
+### 3.4 代码内注释
+- 使用 `//` 进行单行注释,解释复杂逻辑。
+- 示例:
+  ```java
+  // role is required now
+  if (req.getRole() == null) {
+  ```
+
+## 4. 其他约定
+
+### 4.1 访问修饰符
+- 字段使用 `private`。
+- 方法根据需要使用 `public`、`private` 或 `protected`。
+
+### 4.2 构造函数
+- 使用 `@Autowired` 注解进行依赖注入。
+- 示例:
+  ```java
+  @Autowired
+  public WebMvcConfig(AuthInterceptor authInterceptor) {
+      this.authInterceptor = authInterceptor;
+  }
+  ```
+
+### 4.3 异常处理
+- 自定义异常继承 `Exception`。
+- 示例:
+  ```java
+  public class CustomException extends Exception {
+      public CustomException(String message) {
+          super(message);
+      }
+  }
+  ```
+
+### 4.4 常量定义
+- 常量使用 `public static final` 修饰。
+- 示例:
+  ```java
+  public static final long TOKEN_TTL_HOURS = 72L;
+  ```
+
+### 4.5 枚举定义
+- 使用 `@EnumValue` 注解指定数据库存储值。
+- 提供 `getCode()`、`getDescription()` 等方法。
+- 示例:
+  ```java
+  public enum Gender {
+      MALE(1, "男"),
+      FEMALE(2, "女");
+
+      @EnumValue
+      private final int code;
+      private final String description;
+
+      // constructor and methods
+  }
+  ```

+ 168 - 0
docs/DevRule/02-项目结构规范.md

@@ -0,0 +1,168 @@
+# 项目结构规范
+
+## 概述
+
+本项目采用Maven作为构建工具,遵循标准的Maven目录结构。项目基于Spring Boot框架开发,使用Java 17作为开发语言。项目包名为`work.baiyun.chronicdiseaseapp`。
+
+## 根目录结构
+
+```
+ChronicDiseaseApp/
+├── pom.xml                          # Maven项目配置文件
+├── src/                             # 源代码目录
+│   ├── main/                        # 主源代码
+│   │   ├── java/                    # Java源代码
+│   │   │   └── work/baiyun/chronicdiseaseapp/  # 主包
+│   │   │       ├── SpringAPP.java   # Spring Boot主启动类
+│   │   │       ├── common/          # 通用类
+│   │   │       │   ├── Page.java    # 分页类
+│   │   │       │   └── R.java       # 统一响应类
+│   │   │       ├── config/          # 配置类
+│   │   │       │   ├── AuthInterceptor.java      # 认证拦截器
+│   │   │       │   ├── CorsConfig.java           # CORS配置
+│   │   │       │   ├── Knife4jConfig.java        # Knife4j配置
+│   │   │       │   ├── MybatisPlusConfig.java    # MyBatis-Plus配置
+│   │   │       │   ├── RestTemplateConfig.java   # RestTemplate配置
+│   │   │       │   ├── WebMvcConfig.java         # Web MVC配置
+│   │   │       │   └── WeChatProperties.java     # 微信配置属性
+│   │   │       ├── controller/     # 控制器层
+│   │   │       │   ├── GeoController.java        # 地理位置控制器
+│   │   │       │   └── WeChatController.java     # 微信控制器
+│   │   │       ├── enums/          # 枚举类
+│   │   │       │   ├── ExceptionResultCode.java  # 异常结果码枚举
+│   │   │       │   ├── FailResultCode.java       # 失败结果码枚举
+│   │   │       │   ├── Gender.java               # 性别枚举
+│   │   │       │   ├── PermissionGroup.java      # 权限组枚举
+│   │   │       │   └── SuccessResultCode.java    # 成功结果码枚举
+│   │   │       ├── exception/     # 异常处理
+│   │   │       │   ├── CustomException.java      # 自定义异常
+│   │   │       │   └── CustomExceptionHandler.java # 异常处理器
+│   │   │       ├── handler/       # 处理器
+│   │   │       │   ├── CustomMetaObjectHandler.java  # MyBatis元对象处理器
+│   │   │       │   ├── GenderTypeHandler.java        # 性别类型处理器
+│   │   │       │   └── PermissionGroupTypeHandler.java # 权限组类型处理器
+│   │   │       ├── mapper/        # 数据访问层
+│   │   │       │   ├── SysUserMapper.java       # 系统用户Mapper
+│   │   │       │   ├── UserInfoMapper.java      # 用户信息Mapper
+│   │   │       │   └── UserTokenMapper.java     # 用户令牌Mapper
+│   │   │       ├── model/        # 数据模型
+│   │   │       │   ├── bo/       # 业务对象
+│   │   │       │   ├── po/       # 持久化对象
+│   │   │       │   │   ├── BaseEntity.java      # 基础实体
+│   │   │       │   │   ├── UserInfo.java        # 用户信息实体
+│   │   │       │   │   └── UserToken.java       # 用户令牌实体
+│   │   │       │   └── vo/       # 视图对象
+│   │   │       │       ├── GetOpenidRequest.java     # 获取OpenID请求
+│   │   │       │       ├── QueryUserRequest.java     # 查询用户请求
+│   │   │       │       ├── QueryUserResponse.java    # 查询用户响应
+│   │   │       │       └── UpdateUserInfoRequest.java # 更新用户信息请求
+│   │   │       ├── service/      # 服务层
+│   │   │       │   ├── TokenService.java       # 令牌服务接口
+│   │   │       │   ├── UserService.java        # 用户服务接口
+│   │   │       │   ├── WeChatService.java      # 微信服务接口
+│   │   │       │   └── impl/     # 服务实现
+│   │   │       │       ├── TokenServiceImpl.java   # 令牌服务实现
+│   │   │       │       ├── UserServiceImpl.java    # 用户服务实现
+│   │   │       │       └── ...                     # 其他服务实现
+│   │   │       └── util/         # 工具类
+│   │   │           └── TokenUtil.java           # 令牌工具类
+│   │   └── resources/            # 资源文件
+│   │       ├── application.yml   # 应用配置文件
+│   │       ├── logback-spring.xml # 日志配置文件
+│   │       └── cert/             # 证书文件
+│   │           ├── fullchain.pem  # 证书链
+│   │           └── privkey.pem    # 私钥
+│   └── test/                     # 测试代码
+│       └── java/                 # 测试Java代码(目前为空)
+├── target/                        # 编译输出目录
+│   ├── classes/                   # 编译后的类文件
+│   ├── generated-sources/         # 生成的源代码
+│   ├── generated-test-sources/    # 生成的测试源代码
+│   └── test-classes/              # 编译后的测试类文件
+├── docs/                          # 文档目录
+│   ├── ReadME.md                  # 项目说明文档
+│   └── DevRule/                   # 开发规范目录
+├── logs/                          # 日志目录
+└── cert/                          # 证书目录(根目录副本)
+```
+
+## 包结构说明
+
+### 主包 (work.baiyun.chronicdiseaseapp)
+
+- **SpringAPP.java**: Spring Boot应用程序的主启动类,包含@EnableKnife4j注解启用Knife4j接口文档。
+
+### common包
+
+存放通用工具类和基础类,如统一响应对象R、分页对象Page等。
+
+### config包
+
+存放Spring配置类,包括拦截器、CORS、MyBatis-Plus、Web MVC等配置。
+
+### controller包
+
+存放Spring MVC控制器类,处理HTTP请求和响应。
+
+### enums包
+
+存放枚举类,如结果码枚举、性别枚举、权限组枚举等。
+
+### exception包
+
+存放自定义异常类和全局异常处理器。
+
+### handler包
+
+存放MyBatis处理器,如元对象处理器、类型处理器等。
+
+### mapper包
+
+存放MyBatis Mapper接口,用于数据访问。
+
+### model包
+
+- **bo**: 业务对象包(目前为空)
+- **po**: 持久化对象包,存放数据库实体类
+- **vo**: 视图对象包,存放请求和响应对象
+
+### service包
+
+- **service**: 服务接口包
+- **service.impl**: 服务实现包
+
+### util包
+
+存放工具类,如令牌生成工具等。
+
+## 资源文件结构
+
+### src/main/resources
+
+- **application.yml**: Spring Boot应用配置文件,包含服务器、数据库、MyBatis-Plus等配置
+- **logback-spring.xml**: 日志配置文件
+- **cert/**: 证书文件目录,存放SSL证书相关文件
+
+## 测试结构
+
+### src/test/java
+
+存放单元测试和集成测试代码。目前项目中该目录为空。
+
+## 编译输出结构
+
+### target
+
+Maven编译后的输出目录,包含编译后的类文件、生成的源代码等。生产环境部署时通常不需要包含此目录。
+
+## 文档结构
+
+### docs
+
+- **ReadME.md**: 项目说明文档
+- **DevRule/**: 开发规范目录,包含各项开发规范文档
+
+## 日志和证书目录
+
+- **logs/**: 运行时日志文件存放目录
+- **cert/**: 证书文件存放目录(根目录副本,与resources下的cert目录内容相同)

+ 153 - 0
docs/DevRule/03-API设计规范.md

@@ -0,0 +1,153 @@
+# API设计规范
+
+## 概述
+本规范基于项目现有代码实现,定义了API接口的设计原则和标准。所有API必须遵循RESTful设计理念,确保接口的一致性、可维护性和易用性。
+
+## 基本原则
+1. **RESTful设计**:使用RESTful风格的URL路径,资源导向的设计理念。
+2. **统一响应格式**:所有API响应必须使用统一的`R<T>`格式。
+3. **状态码规范**:使用HTTP状态码和业务状态码相结合的方式。
+4. **认证授权**:采用Token-based认证机制。
+5. **错误处理**:统一的异常处理机制。
+
+## URL路径设计
+1. **路径结构**:
+   - 使用小写字母和连字符(-)分隔单词
+   - 路径格式:`/{resource}/{action}` 或 `/{resource}/{id}/{action}`
+   - 示例:`/geo/nearest`, `/get_openid`, `/user_info`
+
+2. **控制器映射**:
+   - 使用`@RequestMapping("/{module}")`定义模块路径
+   - 子路径使用`@GetMapping`, `@PostMapping`等注解
+
+## HTTP方法
+- **GET**:查询操作,用于获取资源
+- **POST**:创建或执行操作,用于提交数据或执行动作
+- **PUT**:更新操作(项目中暂未使用)
+- **DELETE**:删除操作(项目中暂未使用)
+
+## 请求格式
+1. **Content-Type**:
+   - JSON请求:`application/json`
+   - 使用`@RequestBody`注解接收JSON数据
+
+2. **参数传递**:
+   - 查询参数:使用`@RequestParam`
+   - 请求体:使用`@RequestBody`
+   - 路径参数:使用`@PathVariable`(项目中暂未使用)
+
+## 响应格式
+1. **统一响应类**:`R<T>`
+   ```java
+   {
+       "code": Integer,    // 状态码
+       "message": String,  // 响应消息
+       "data": T          // 响应数据,可为空
+   }
+   ```
+
+2. **成功响应**:
+   - 状态码:200
+   - 使用`R.success(code, message, data)`构造
+
+3. **失败响应**:
+   - 状态码:400(参数错误)、500(服务器错误)
+   - 使用`R.fail(code, message)`构造
+
+## 状态码规范
+1. **成功状态码**:
+   - 200:操作成功
+   - 具体业务成功码定义在`SuccessResultCode`枚举中
+
+2. **失败状态码**:
+   - 400:参数校验异常、请求参数错误
+   - 500:服务器内部错误
+   - 具体业务失败码定义在`FailResultCode`枚举中
+
+3. **异常状态码**:
+   - 定义在`ExceptionResultCode`枚举中
+   - 400:参数校验异常、系统异常
+
+## 认证与授权
+1. **认证方式**:
+   - 优先使用标准Authorization header:`Authorization: Bearer <token>`
+   - 向后兼容支持:`X-Token` 或 `token` header
+   - 支持POST body中的`token`字段
+
+2. **拦截器配置**:
+   - `AuthInterceptor`负责Token校验
+   - 排除路径:`/`、`/get_openid`、Swagger相关路径
+
+3. **Token管理**:
+   - 使用`TokenService`生成和校验Token
+   - 校验通过后将`userId`放入request属性
+
+## 错误处理
+1. **全局异常处理器**:`CustomExceptionHandler`
+   - 处理`BindException`:参数绑定异常
+   - 处理`ConstraintViolationException`:约束违反异常
+   - 处理`CustomException`:自定义业务异常
+   - 处理`Exception`:未知异常
+
+2. **异常响应**:
+   - 统一返回`R.fail(code, message)`格式
+   - 记录错误日志
+
+## 分页处理
+1. **分页类**:`Page<T>`
+   ```java
+   {
+       "pageNum": int,     // 当前页码
+       "pageSize": int,    // 每页大小
+       "total": long,      // 总记录数
+       "list": List<T>     // 数据列表
+   }
+   ```
+
+2. **分页插件**:使用`pagehelper`实现分页
+   - 配置在`application.yml`中
+   - 数据库方言:MySQL
+
+## 跨域配置
+1. **CORS配置**:`CorsConfig`
+   - 允许路径:`/api/**`
+   - 允许源:`http://localhost:3000`
+   - 允许方法:GET, POST, PUT, DELETE, OPTIONS
+   - 允许凭证:true
+
+## API文档
+1. **文档工具**:使用Knife4j(基于Swagger)
+   - 配置在`Knife4jConfig`中
+   - 访问路径:`/doc.html`
+
+2. **字段描述**:
+   - 使用`@Schema`注解描述请求/响应字段
+   - 示例:
+   ```java
+   @Schema(description = "更新用户信息请求")
+   public class UpdateUserInfoRequest {
+       @Schema(description = "头像(可选)")
+       private String avatar;
+   }
+   ```
+
+## 安全考虑
+1. **输入验证**:使用Bean Validation注解
+2. **SQL注入防护**:使用MyBatis-Plus预编译
+3. **XSS防护**:前端负责,API层不额外处理
+4. **敏感信息**:不在日志中记录Token等敏感信息
+
+## 版本控制
+- 当前API版本:v0
+- 版本信息在Swagger配置中定义
+- 未来版本升级时,可通过URL路径前缀区分(如`/v1/`、`/v2/`)
+
+## 性能优化
+1. **连接池**:使用HikariCP数据库连接池
+2. **缓存**:根据业务需要添加缓存机制(项目中暂未实现)
+3. **异步处理**:对于耗时操作可考虑异步处理(项目中暂未使用)
+
+## 测试规范
+- API接口应编写单元测试和集成测试
+- 测试应覆盖正常流程和异常情况
+- 使用Mock框架模拟依赖服务

+ 50 - 0
docs/DevRule/04-测试规范.md

@@ -0,0 +1,50 @@
+# 测试规范
+
+## 概述
+本规范基于项目现有代码实现,定义了单元测试和集成测试的设计原则和标准。项目目前尚未编写测试代码,本规范为未来测试开发提供指导。
+
+## 基本原则
+1. **测试驱动开发**:优先编写测试代码,再实现业务逻辑。
+2. **测试覆盖**:确保核心业务逻辑有足够的测试覆盖。
+3. **独立性**:每个测试用例应独立运行,不依赖其他测试。
+4. **可读性**:测试代码应清晰易懂,便于维护。
+
+## 测试框架
+- **单元测试**:使用JUnit 5作为测试框架。
+- **集成测试**:使用Spring Boot Test进行集成测试。
+- **Mock框架**:使用Mockito进行依赖注入的模拟。
+
+## 测试结构
+1. **测试类命名**:测试类以被测类名 + "Test" 命名,例如 `UserServiceTest`。
+2. **测试方法命名**:使用描述性名称,遵循 `should_When_Then` 或 `test_方法名_场景` 格式。
+3. **测试文件位置**:测试文件放置在 `src/test/java` 目录下,与主代码保持相同的包结构。
+
+## 单元测试规范
+1. **测试范围**:主要测试Service层、Util类等业务逻辑。
+2. **Mock依赖**:使用Mockito模拟外部依赖,如Mapper、外部服务。
+3. **断言**:使用AssertJ或JUnit的断言方法进行结果验证。
+
+## 集成测试规范
+1. **测试范围**:测试Controller层、数据库操作等。
+2. **测试环境**:使用@SpringBootTest注解启动完整应用上下文。
+3. **数据库测试**:使用H2内存数据库或Testcontainers进行数据库测试。
+
+## 测试数据
+1. **测试数据准备**:在测试方法中使用@BeforeEach准备测试数据。
+2. **数据清理**:在测试方法中使用@AfterEach清理测试数据。
+3. **数据隔离**:确保测试数据不影响其他测试。
+
+## 测试运行
+1. **Maven命令**:使用 `mvn test` 运行所有测试。
+2. **IDE集成**:在IDE中直接运行测试类或方法。
+3. **CI/CD集成**:在构建过程中自动运行测试。
+
+## 代码覆盖率
+1. **覆盖率工具**:使用JaCoCo生成测试覆盖率报告。
+2. **覆盖率目标**:核心业务代码覆盖率不低于80%。
+3. **覆盖率检查**:在CI/CD中设置覆盖率阈值检查。
+
+## 注意事项
+- 测试代码应与生产代码一同维护。
+- 避免在测试中使用硬编码的外部依赖。
+- 定期review测试代码,确保其有效性。

+ 118 - 0
docs/DevRule/05-依赖管理规范.md

@@ -0,0 +1,118 @@
+# 05-依赖管理规范.md
+
+## 概述
+
+本规范定义了项目中依赖管理的原则和实践,确保依赖项的选择、版本控制和更新符合项目需求,并维护代码的稳定性和安全性。
+
+## 依赖管理原则
+
+### 1. 版本统一管理
+- 在 `pom.xml` 的 `<properties>` 标签中定义依赖版本,避免在各依赖声明中硬编码版本号。
+- 示例:
+  ```xml
+  <properties>
+      <spring-boot.version>3.0.13</spring-boot.version>
+  </properties>
+  ```
+
+### 2. 使用 Spring Boot BOM
+- 通过 `<dependencyManagement>` 引入 `spring-boot-dependencies` BOM 来管理 Spring 生态相关依赖的版本。
+- 示例:
+  ```xml
+  <dependencyManagement>
+      <dependencies>
+          <dependency>
+              <groupId>org.springframework.boot</groupId>
+              <artifactId>spring-boot-dependencies</artifactId>
+              <version>${spring-boot.version}</version>
+              <type>pom</type>
+              <scope>import</scope>
+          </dependency>
+      </dependencies>
+  </dependencyManagement>
+  ```
+
+### 3. 依赖选择标准
+- 优先选择官方维护、社区活跃的库。
+- 选择与当前技术栈兼容的版本,特别是 Jakarta EE 兼容版本(如 Knife4j 的 Jakarta EE 版本)。
+- 避免引入过多依赖,优先使用 Spring Boot 内置功能。
+
+### 4. 版本稳定性
+- 选择稳定版本,避免使用 SNAPSHOT 或 alpha/beta 版本。
+- 定期检查并更新依赖版本,确保安全补丁和性能改进。
+
+## 主要依赖规范
+
+### 1. Spring Boot 生态
+- 使用 Spring Boot 3.x 版本,确保 Jakarta EE 兼容性。
+- 核心依赖包括:
+  - `spring-boot-starter`:基础启动器
+  - `spring-boot-starter-web`:Web 开发
+  - `spring-boot-starter-validation`:参数校验
+
+### 2. 数据访问层
+- MyBatis-Plus:使用 3.5.3 版本,提供 ORM 功能。
+- PageHelper:使用 1.4.2 版本,提供分页支持。
+- MySQL Connector:使用 5.1.49 版本,确保数据库连接兼容性。
+
+### 3. 工具库
+- Lombok:使用 1.18.24 版本,简化 Java 代码。
+- Hutool:使用 5.8.22 版本,提供通用工具方法。
+
+### 4. API 文档
+- Knife4j:使用 4.4.0 Jakarta EE 兼容版本,提供 API 文档生成。
+
+## 依赖更新策略
+
+### 1. 定期审查
+- 定期检查依赖版本,关注安全漏洞和兼容性问题。
+- 使用工具如 Maven Dependency Plugin 检查依赖树。
+
+### 2. 兼容性测试
+- 更新依赖后,进行全面测试,确保功能正常。
+- 特别注意 Spring Boot 版本升级时的 breaking changes。
+
+### 3. 版本锁定
+- 在生产环境中,使用 Maven 的 dependency locking 机制确保版本一致性。
+
+## 依赖冲突解决
+
+### 1. 排除冲突依赖
+- 使用 `<exclusions>` 标签排除不需要的传递依赖。
+- 示例:
+  ```xml
+  <dependency>
+      <groupId>com.example</groupId>
+      <artifactId>example</artifactId>
+      <exclusions>
+          <exclusion>
+              <groupId>org.unwanted</groupId>
+              <artifactId>unwanted-artifact</artifactId>
+          </exclusion>
+      </exclusions>
+  </dependency>
+  ```
+
+### 2. 依赖分析
+- 使用 `mvn dependency:tree` 分析依赖树,识别冲突。
+- 使用 `mvn dependency:analyze` 检查未使用的依赖。
+
+## 安全考虑
+
+### 1. 漏洞扫描
+- 定期使用安全扫描工具检查依赖中的已知漏洞。
+- 及时更新受影响的依赖版本。
+
+### 2. 最小权限原则
+- 只引入必要的依赖,避免过度依赖。
+- 使用 `<scope>` 限制依赖作用域,如 `provided` 用于编译时依赖。
+
+## 构建优化
+
+### 1. 依赖瘦身
+- 使用 Spring Boot 的 fat jar 打包,包含运行时依赖。
+- 排除测试依赖和开发工具依赖。
+
+### 2. 缓存管理
+- 配置 Maven 仓库缓存,提高构建速度。
+- 使用本地仓库镜像加速依赖下载。

+ 82 - 0
docs/DevRule/06-日志和错误处理规范.md

@@ -0,0 +1,82 @@
+# 06-日志和错误处理规范
+
+## 概述
+
+本规范基于项目现有代码实践,规定了日志记录和错误处理的统一标准。所有日志和错误处理必须遵循现有代码的实现方式,确保一致性和可维护性。
+
+## 日志规范
+
+### 日志框架
+
+- 项目统一使用 SLF4J (Simple Logging Facade for Java) 作为日志门面。
+- 底层实现使用 Logback。
+- 在类中声明 Logger 实例:
+  ```java
+  private static final Logger logger = LoggerFactory.getLogger(ClassName.class);
+  ```
+
+### 日志级别
+
+- **DEBUG**: 用于调试信息,如方法调用参数、API 请求响应等。
+- **INFO**: 用于重要业务逻辑信息,如令牌过期等。
+- **WARN**: 用于警告信息,如 API 未返回预期数据。
+- **ERROR**: 用于错误信息,如异常发生时。
+
+### 日志配置
+
+- 日志配置文件位于 `src/main/resources/logback-spring.xml`。
+- 输出到控制台和文件。
+- 文件日志路径:`${LOG_PATH}/app.log`,默认 `./logs/app.log`。
+- 日志轮转:按日期轮转,保留 30 天历史日志。
+- 日志格式:`%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n`。
+
+- 在 `application.yml` 中配置日志级别:
+  ```yaml
+  logging:
+    level:
+      root: info
+      work.baiyun.chronicdiseaseapp: debug
+  ```
+
+### 日志使用原则
+
+- 在服务实现类中使用 Logger 记录关键操作和异常。
+- 使用占位符记录变量值,如 `logger.debug("validateToken: token={}, userToken={}", token, ut)`。
+- 异常记录时包含异常对象,如 `logger.error("Error while calling Weixin API", e)`。
+
+## 错误处理规范
+
+### 全局异常处理器
+
+- 使用 `@RestControllerAdvice` 注解的 `CustomExceptionHandler` 类统一处理异常。
+- 返回统一响应格式 `R<T>`,包含错误码和消息。
+
+### 异常类型处理
+
+- **BindException**: 参数绑定异常,提取所有错误消息返回。
+- **ConstraintViolationException**: 参数校验异常,提取约束违反消息返回。
+- **CustomException**: 自定义异常,返回异常消息。
+- **Exception**: 未知异常,记录错误日志,返回通用错误信息。
+
+### 自定义异常
+
+- 继承 `Exception` 类,实现 `CustomException`。
+- 构造函数接受消息字符串:
+  ```java
+  public class CustomException extends Exception {
+      public CustomException(String message) {
+          super(message);
+      }
+  }
+  ```
+
+### 错误响应格式
+
+- 使用 `R.fail(code, message)` 返回错误响应。
+- 错误码定义在 `ExceptionResultCode` 枚举中。
+
+### 异常处理原则
+
+- 业务逻辑中的异常应抛出 `CustomException` 或记录日志后处理。
+- 全局异常处理器确保所有未捕获异常被统一处理。
+- 异常信息不应暴露敏感数据给客户端。

+ 84 - 0
docs/DevRule/07-数据库规范.md

@@ -0,0 +1,84 @@
+# 07-数据库规范
+
+## 概述
+本规范基于项目现有代码实现,规定了数据库设计、表结构、字段命名、数据类型映射等相关规范。所有规范必须与现有代码保持一致,不得引入未实现的设想。
+
+## 数据库选择
+- 使用 MySQL 数据库。
+- 连接配置支持 HikariCP 连接池。
+- 启用 `map-underscore-to-camel-case` 配置,实现数据库下划线字段与 Java 驼峰属性自动映射。
+
+## 表命名规范
+- 表名采用小写字母,以 `t_` 开头,后跟模块名和实体名,使用下划线分隔单词。
+- 示例:`t_user_info`、`t_user_token`。
+
+## 字段命名规范
+- 字段名采用小写字母,使用下划线分隔单词,与 Java 属性驼峰命名对应。
+- 示例:`user_id`、`create_time`、`wx_openid`。
+
+## 主键规范
+- 所有表使用 `id` 作为主键字段,类型为 `BIGINT`。
+- 使用 MyBatis-Plus 的 `ASSIGN_ID` 策略(雪花算法生成 ID)。
+- 在实体类中使用 `@TableId(value = "id", type = IdType.ASSIGN_ID)` 注解。
+
+## 公共字段规范
+- 所有实体类继承 `BaseEntity`,包含以下公共字段:
+  - `id`:主键,`BIGINT`。
+  - `version`:乐观锁版本号,`INT`,默认值为 0。
+  - `create_user`:创建者 ID,`BIGINT`。
+  - `create_time`:创建时间,`DATETIME`。
+  - `update_user`:更新者 ID,`BIGINT`。
+  - `update_time`:更新时间,`DATETIME`。
+- 公共字段通过 `@TableField` 注解指定字段名和填充策略。
+
+## 自动填充规范
+- 使用 `CustomMetaObjectHandler` 实现自动填充。
+- 插入时自动填充:`create_time`、`update_time`、`create_user`、`update_user`。
+- 更新时自动填充:`update_time`、`update_user`。
+- 默认创建者和更新者 ID 为 1(后续可从安全上下文中获取)。
+
+## 乐观锁规范
+- 使用 `version` 字段实现乐观锁。
+- 在实体类中使用 `@Version` 注解。
+- 配置 `OptimisticLockerInnerInterceptor` 插件。
+
+## 枚举处理规范
+- 枚举类使用 `@EnumValue` 注解标记存储值。
+- 自定义 `TypeHandler` 处理枚举与数据库的映射。
+- 枚举存储为 `INT` 类型,使用 code 值存储。
+- 示例:`Gender` 枚举存储为 1(男)、2(女)。
+
+## 数据类型映射
+- 遵循 MyBatis-Plus 默认映射规则。
+- 字符串类型:`VARCHAR`。
+- 整数类型:`INT` 或 `BIGINT`。
+- 日期时间:`DATETIME`,使用 `LocalDateTime`。
+- 布尔类型:根据需要映射为 `TINYINT` 或 `BIT`。
+
+## Mapper 规范
+- Mapper 接口继承 `BaseMapper<T>`。
+- 使用 `@Mapper` 注解标记。
+- 示例:
+  ```java
+  @Mapper
+  public interface UserInfoMapper extends BaseMapper<UserInfo> {
+  }
+  ```
+
+## 索引规范
+- 根据查询需求添加适当索引。
+- 主键自动创建索引。
+- 外键字段建议添加索引。
+
+## 约束规范
+- 根据业务需求添加必要的约束,如唯一约束、非空约束等。
+- 外键约束根据需要添加,但需注意性能影响。
+
+## 数据迁移
+- 使用 Flyway 或 Liquibase 等工具进行数据迁移(若有实现)。
+- 迁移脚本命名规范:`V{version}__{description}.sql`。
+
+## 注意事项
+- 所有规范基于现有代码实现,不得引入未实现的特性。
+- 数据库设计应遵循第三范式(3NF),但可根据性能需求适当冗余。
+- 定期备份数据库,确保数据安全。

+ 122 - 0
docs/DevRule/08-安全规范.md

@@ -0,0 +1,122 @@
+# 08-安全规范
+
+## 概述
+本规范基于项目现有代码实现,规定了慢病APP后端系统的安全要求和实现标准。所有安全措施必须与现有代码逻辑保持一致,不得引入与当前实现冲突的安全机制。
+
+## 认证与授权
+
+### 认证机制
+- **Token认证**:采用基于Token的认证机制,使用UUID生成的32位无符号字符串作为Token。
+- **Token存储**:Token及相关信息存储在数据库`t_user_token`表中,每个用户仅维护一个有效Token。
+- **Token有效期**:Token有效期为72小时,过期后自动失效。
+- **Token刷新**:当Token剩余有效期小于24小时时,自动延长至72小时。
+- **认证方式**:
+  - 首选:`Authorization: Bearer <token>` 标准HTTP头
+  - 兼容:`X-Token` 或 `token` HTTP头
+- **认证拦截**:所有API请求(除登录和文档相关路径外)均通过`AuthInterceptor`进行Token验证。
+
+### 授权机制
+- **角色权限**:基于用户角色进行权限控制,支持以下角色:
+  - 系统管理员(SYS_ADMIN)
+  - 医生(DOCTOR)
+  - 患者(PATIENT)
+  - 患者家属(PATIENT_FAMILY)
+- **角色存储**:用户角色信息存储在`t_user_info`表的`role`字段,使用枚举类型`PermissionGroup`。
+
+### 登录流程
+- **微信登录**:通过微信小程序授权码获取openid,结合角色信息完成用户注册/登录。
+- **Token生成**:登录成功后自动生成新的Token,覆盖旧Token。
+- **用户绑定**:用户通过`role + wx_openid`唯一标识。
+
+## 数据安全
+
+### 敏感信息存储
+- **配置信息**:微信小程序的`appid`和`secret`通过`WeChatProperties`类从配置文件加载。
+- **数据库密码**:数据库连接密码在`application.yml`中明文配置。
+- **Token信息**:Token明文存储在数据库中。
+
+### 数据传输
+- **HTTPS配置**:项目支持SSL证书配置(`fullchain.pem`和`privkey.pem`),但默认使用HTTP传输。
+- **CORS配置**:允许`http://localhost:3000`域名跨域访问,支持Credentials。
+
+## 输入验证
+
+### 参数校验
+- **框架校验**:使用Spring Validation进行参数校验。
+- **异常处理**:通过`CustomExceptionHandler`统一处理校验异常:
+  - `BindException`:表单绑定校验异常
+  - `ConstraintViolationException`:约束违反异常
+- **错误响应**:校验失败时返回统一的错误格式,包含错误码和错误信息。
+
+## 异常处理
+
+### 统一异常处理
+- **全局处理**:使用`@RestControllerAdvice`进行全局异常拦截。
+- **异常类型**:
+  - 自定义异常(`CustomException`)
+  - 参数校验异常
+  - 系统未知异常
+- **错误信息**:异常信息通过统一的`R.fail()`格式返回,不暴露系统内部敏感信息。
+- **日志记录**:系统异常记录详细错误日志。
+
+## 日志安全
+
+### 日志配置
+- **日志级别**:使用SLF4J日志框架,根日志级别为INFO,应用包级别为DEBUG。
+- **敏感信息**:日志中避免记录Token的完整内容,仅记录前8位字符。
+- **认证日志**:记录认证成功、失败及Token过期等关键事件。
+
+## 数据库安全
+
+### 连接配置
+- **连接池**:使用HikariCP连接池,配置最小空闲连接5,最大连接20。
+- **连接超时**:连接超时时间30秒,空闲超时60秒。
+- **SSL配置**:数据库连接默认禁用SSL(`useSSL=false`)。
+
+## API安全
+
+### 接口保护
+- **路径排除**:以下路径不进行Token验证:
+  - `/` (首页)
+  - `/get_openid` (获取openid接口)
+  - `/v3/api-docs/**` (API文档)
+  - `/swagger-ui/**` (Swagger UI)
+  - `/doc.html` (Knife4j文档)
+  - `/webjars/**` (静态资源)
+  - `/favicon.ico`
+
+### 请求处理
+- **OPTIONS请求**:CORS预检请求直接放行,无需认证。
+- **用户上下文**:认证通过后,将用户ID放入请求属性`currentUserId`,供后续业务逻辑使用。
+
+## 安全配置
+
+### Spring Security配置
+- 项目未使用Spring Security框架,安全通过自定义拦截器实现。
+
+### MyBatis Plus配置
+- **SQL日志**:开发环境开启SQL语句打印,便于调试。
+- **字段映射**:使用驼峰命名映射数据库字段。
+
+## 部署安全
+
+### 证书管理
+- **SSL证书**:支持PEM格式证书文件部署。
+- **证书路径**:证书文件存储在`classpath:cert/`目录下。
+
+## 监控与审计
+
+### 安全事件监控
+- **认证失败**:记录Token缺失、无效或过期的请求。
+- **异常监控**:记录系统异常,便于安全分析。
+
+## 合规要求
+
+### 数据保护
+- **个人信息**:妥善处理用户微信openid、昵称、头像等个人信息。
+- **数据最小化**:仅收集必要的数据字段。
+
+### 访问控制
+- **最小权限**:用户仅能访问与自己角色相关的功能。
+- **会话管理**:Token过期后自动失效,防止会话固定攻击。</content>
+<parameter name="filePath">d:\慢病APP\ChronicDiseaseApp\docs\DevRule\08-安全规范.md