chore: remove non-source artifacts and review docs
This commit is contained in:
@@ -1,479 +0,0 @@
|
|||||||
# Freedom Admin 管理系统代码全面审查报告
|
|
||||||
|
|
||||||
## 📊 审查概况
|
|
||||||
|
|
||||||
| 项目 | 详情 |
|
|
||||||
|------|------|
|
|
||||||
| **审查文件数量** | 49个Java文件 + 7个XML文件 + 1个YAML配置 |
|
|
||||||
| **主要技术栈** | Spring Boot 2.7.10 + Spring Security + MyBatis-Plus + JWT |
|
|
||||||
| **审查时间** | 2024年11月3日 |
|
|
||||||
| **审查重点** | 功能正确性、性能、安全、可维护性、编码规范 |
|
|
||||||
|
|
||||||
## 🚨 紧急问题(P0 - 必须立即修复)
|
|
||||||
|
|
||||||
### 1. 严重安全漏洞 - 硬编码敏感信息
|
|
||||||
|
|
||||||
**文件位置**: `src/main/resources/application.yml:13-14, 35`
|
|
||||||
|
|
||||||
**问题代码**:
|
|
||||||
```yaml
|
|
||||||
# 数据库密码硬编码
|
|
||||||
password: 1Qaz@4772
|
|
||||||
|
|
||||||
# 邮件授权码硬编码
|
|
||||||
password: nsbrkfdzzmdlbddi
|
|
||||||
```
|
|
||||||
|
|
||||||
**风险等级**: 🔴 **高危** - 可能导致完整系统被入侵,数据泄露
|
|
||||||
|
|
||||||
**影响范围**:
|
|
||||||
- 数据库服务器安全
|
|
||||||
- 邮件账户安全
|
|
||||||
- 系统整体安全性
|
|
||||||
|
|
||||||
**修复建议**:
|
|
||||||
```java
|
|
||||||
// 使用环境变量管理敏感信息
|
|
||||||
spring:
|
|
||||||
datasource:
|
|
||||||
password: ${DB_PASSWORD}
|
|
||||||
mail:
|
|
||||||
password: ${MAIL_PASSWORD}
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. JWT安全配置缺陷
|
|
||||||
|
|
||||||
**文件位置**: `src/main/java/com/freedom/admin/utils/JwtUtils.java:33`
|
|
||||||
|
|
||||||
**问题代码**:
|
|
||||||
```java
|
|
||||||
.signWith(SignatureAlgorithm.HS512,secret) // 使用HS512但密钥强度不足
|
|
||||||
```
|
|
||||||
|
|
||||||
**风险等级**: 🔴 **高危** - JWT密钥可能被暴力破解
|
|
||||||
|
|
||||||
**安全影响**:
|
|
||||||
- 令牌伪造风险
|
|
||||||
- 身份认证绕过
|
|
||||||
- 权限提升攻击
|
|
||||||
|
|
||||||
**修复建议**:
|
|
||||||
```java
|
|
||||||
// 生成更强的密钥
|
|
||||||
@Value("${jwt.secret}")
|
|
||||||
private String secret; // 确保密钥长度至少256位
|
|
||||||
|
|
||||||
// 或使用RSA算法
|
|
||||||
.signWith(SignatureAlgorithm.RS256, privateKey)
|
|
||||||
```
|
|
||||||
|
|
||||||
## ⚠️ 高优先级问题(P1 - 建议本周修复)
|
|
||||||
|
|
||||||
### 3. 用户注册功能安全隐患
|
|
||||||
|
|
||||||
**文件位置**: `src/main/java/com/freedom/admin/service/impl/TSysUserServiceImpl.java:47`
|
|
||||||
|
|
||||||
**问题代码**:
|
|
||||||
```java
|
|
||||||
String encode = bCryptPasswordEncoder.encode("123456"); // 硬编码默认密码
|
|
||||||
```
|
|
||||||
|
|
||||||
**问题描述**: 所有新建用户使用相同的默认密码"123456"
|
|
||||||
|
|
||||||
**安全风险**:
|
|
||||||
- 弱密码策略
|
|
||||||
- 批量账户安全风险
|
|
||||||
- 密码猜测攻击
|
|
||||||
|
|
||||||
**修复建议**:
|
|
||||||
```java
|
|
||||||
// 方案1: 生成随机密码
|
|
||||||
String randomPassword = generateRandomPassword(12);
|
|
||||||
|
|
||||||
// 方案2: 强制首次登录修改密码
|
|
||||||
user.setForcePasswordChange(true);
|
|
||||||
|
|
||||||
// 方案3: 发送密码重置链接
|
|
||||||
sendPasswordResetEmail(user.getEmail());
|
|
||||||
```
|
|
||||||
|
|
||||||
### 4. 输入验证全面缺失
|
|
||||||
|
|
||||||
**文件位置**: 所有Controller和实体类
|
|
||||||
|
|
||||||
**问题示例**: `src/main/java/com/freedom/admin/controller/TSysUserController.java:45`
|
|
||||||
```java
|
|
||||||
public Result<TSysUser> register(TSysUser sysUser){ // 无输入验证
|
|
||||||
```
|
|
||||||
|
|
||||||
**风险**:
|
|
||||||
- SQL注入风险
|
|
||||||
- XSS攻击风险
|
|
||||||
- 数据完整性破坏
|
|
||||||
|
|
||||||
**修复方案**:
|
|
||||||
```java
|
|
||||||
// 创建DTO类并添加验证注解
|
|
||||||
@Data
|
|
||||||
public class UserRegisterDTO {
|
|
||||||
@NotBlank(message = "用户名不能为空")
|
|
||||||
@Size(min = 3, max = 50, message = "用户名长度必须在3-50之间")
|
|
||||||
private String username;
|
|
||||||
|
|
||||||
@Email(message = "邮箱格式不正确")
|
|
||||||
private String email;
|
|
||||||
|
|
||||||
@Pattern(regexp = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d).{8,}$",
|
|
||||||
message = "密码必须包含大小写字母和数字,长度至少8位")
|
|
||||||
private String password;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Controller中使用验证
|
|
||||||
@PostMapping("/register")
|
|
||||||
public Result register(@Valid @RequestBody UserRegisterDTO dto) {
|
|
||||||
// 业务逻辑
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### 5. 异常处理过于笼统
|
|
||||||
|
|
||||||
**文件位置**: `src/main/java/com/freedom/admin/config/GlobalExceptionHandler.java:21-26`
|
|
||||||
|
|
||||||
**问题代码**:
|
|
||||||
```java
|
|
||||||
@ExceptionHandler(Exception.class) // 捕获所有异常
|
|
||||||
public Result error(Exception e){
|
|
||||||
e.printStackTrace(); // 生产环境不应打印堆栈
|
|
||||||
return Result.error().message("执行了全局异常"); // 模糊错误信息
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**问题**:
|
|
||||||
- 敏感信息泄露风险
|
|
||||||
- 调试信息暴露系统结构
|
|
||||||
- 用户体验差
|
|
||||||
|
|
||||||
**改进方案**:
|
|
||||||
```java
|
|
||||||
@ExceptionHandler(BusinessException.class)
|
|
||||||
public Result handleBusinessException(BusinessException e) {
|
|
||||||
log.warn("业务异常: {}", e.getMessage());
|
|
||||||
return Result.error().code(e.getCode()).message(e.getMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
@ExceptionHandler(ValidationException.class)
|
|
||||||
public Result handleValidationException(ValidationException e) {
|
|
||||||
log.warn("参数验证失败: {}", e.getMessage());
|
|
||||||
return Result.error().code(400).message("参数验证失败");
|
|
||||||
}
|
|
||||||
|
|
||||||
@ExceptionHandler(Exception.class)
|
|
||||||
public Result handleSystemException(Exception e) {
|
|
||||||
log.error("系统异常", e);
|
|
||||||
return Result.error().message("系统繁忙,请稍后重试");
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📋 中优先级问题(P2 - 建议本月修复)
|
|
||||||
|
|
||||||
### 6. SQL查询性能问题
|
|
||||||
|
|
||||||
**文件位置**: `src/main/java/com/freedom/admin/controller/TSysUserController.java:79-84`
|
|
||||||
|
|
||||||
**问题代码**:
|
|
||||||
```java
|
|
||||||
Page<TSysUser> page = tSysUserService.page(new Page<>(pageNum,pageSize), queryWrapper);
|
|
||||||
```
|
|
||||||
|
|
||||||
**性能影响**:
|
|
||||||
- 未使用MyBatis-Plus分页插件优化
|
|
||||||
- 可能产生全表扫描
|
|
||||||
- 大数据量时分页性能差
|
|
||||||
|
|
||||||
**优化方案**:
|
|
||||||
```java
|
|
||||||
// 配置分页拦截器
|
|
||||||
@Configuration
|
|
||||||
public class MybatisPlusConfig {
|
|
||||||
@Bean
|
|
||||||
public MybatisPlusInterceptor mybatisPlusInterceptor() {
|
|
||||||
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
|
|
||||||
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
|
|
||||||
return interceptor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 使用优化后的分页
|
|
||||||
Page<TSysUser> page = tSysUserService.page(
|
|
||||||
new Page<>(pageNum, pageSize),
|
|
||||||
queryWrapper.orderByDesc("create_date")
|
|
||||||
);
|
|
||||||
```
|
|
||||||
|
|
||||||
### 7. 密码加密强度不足
|
|
||||||
|
|
||||||
**文件位置**: `src/main/java/com/freedom/admin/config/WebSecurityConfig.java:94`
|
|
||||||
|
|
||||||
**问题代码**:
|
|
||||||
```java
|
|
||||||
return new BCryptPasswordEncoder(); // 未指定强度
|
|
||||||
```
|
|
||||||
|
|
||||||
**安全风险**: 加密强度不足可能被暴力破解
|
|
||||||
|
|
||||||
**改进方案**:
|
|
||||||
```java
|
|
||||||
@Bean
|
|
||||||
public PasswordEncoder passwordEncoder() {
|
|
||||||
// 使用更高的加密强度(10-12)
|
|
||||||
return new BCryptPasswordEncoder(12);
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### 8. 跨域配置硬编码
|
|
||||||
|
|
||||||
**文件位置**: `src/main/java/com/freedom/admin/config/WebSecurityConfig.java:112`
|
|
||||||
|
|
||||||
**问题代码**:
|
|
||||||
```java
|
|
||||||
cfg.addAllowedOrigin("http://localhost:8080");
|
|
||||||
```
|
|
||||||
|
|
||||||
**问题**: 多环境部署时需修改代码
|
|
||||||
|
|
||||||
**改进方案**:
|
|
||||||
```java
|
|
||||||
@Value("${cors.allowed-origins}")
|
|
||||||
private String[] allowedOrigins;
|
|
||||||
|
|
||||||
@Bean
|
|
||||||
public CorsConfigurationSource corsConfigurationSource() {
|
|
||||||
return request -> {
|
|
||||||
CorsConfiguration cfg = new CorsConfiguration();
|
|
||||||
cfg.setAllowedOrigins(Arrays.asList(allowedOrigins));
|
|
||||||
cfg.addAllowedHeader("*");
|
|
||||||
cfg.addAllowedMethod("*");
|
|
||||||
cfg.setAllowCredentials(true);
|
|
||||||
return cfg;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📝 低优先级问题(P3 - 可后续优化)
|
|
||||||
|
|
||||||
### 9. 代码规范问题
|
|
||||||
|
|
||||||
#### 9.1 空注释和不规范注释
|
|
||||||
**文件**: 多个文件存在空描述
|
|
||||||
```java
|
|
||||||
/**
|
|
||||||
* @description // 空描述
|
|
||||||
*/
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 9.2 方法命名不规范
|
|
||||||
**文件**: `src/main/java/com/freedom/admin/utils/JwtUtils.java:70`
|
|
||||||
```java
|
|
||||||
public String getUsernameFormToken(String token){ // 应为 getUsernameFromToken
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 9.3 日志记录不统一
|
|
||||||
**问题**: 部分使用`@Log4j2`,部分使用`@Slf4j`
|
|
||||||
|
|
||||||
### 10. 配置优化
|
|
||||||
|
|
||||||
#### 10.1 连接池配置保守
|
|
||||||
**文件**: `src/main/resources/application.yml:18`
|
|
||||||
```yaml
|
|
||||||
maximum-pool-size: 10 # 可根据实际负载调整
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 10.2 缺少缓存配置
|
|
||||||
**建议**: 添加Redis缓存支持
|
|
||||||
|
|
||||||
#### 10.3 邮件服务配置优化
|
|
||||||
**建议**: 添加重试机制和异步发送
|
|
||||||
|
|
||||||
## 🔧 具体修复方案
|
|
||||||
|
|
||||||
### 紧急修复(P0)实施步骤
|
|
||||||
|
|
||||||
#### 步骤1: 移除硬编码密码
|
|
||||||
```bash
|
|
||||||
# 1. 设置环境变量
|
|
||||||
export DB_PASSWORD=your_secure_password
|
|
||||||
export MAIL_PASSWORD=your_mail_password
|
|
||||||
|
|
||||||
# 2. 修改application.yml
|
|
||||||
spring:
|
|
||||||
datasource:
|
|
||||||
password: ${DB_PASSWORD}
|
|
||||||
mail:
|
|
||||||
password: ${MAIL_PASSWORD}
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 步骤2: 加强JWT安全
|
|
||||||
```java
|
|
||||||
// 生成256位随机密钥
|
|
||||||
@Value("${jwt.secret}")
|
|
||||||
private String secret; // 确保配置文件中的密钥长度足够
|
|
||||||
|
|
||||||
// 或使用RSA非对称加密
|
|
||||||
@Bean
|
|
||||||
public KeyPair keyPair() {
|
|
||||||
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
|
|
||||||
keyPairGenerator.initialize(2048);
|
|
||||||
return keyPairGenerator.generateKeyPair();
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 步骤3: 禁用生产环境堆栈打印
|
|
||||||
```java
|
|
||||||
@Profile("!prod")
|
|
||||||
public void printStackTrace() {
|
|
||||||
// 仅开发环境打印堆栈
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### 高优先级修复(P1)实施步骤
|
|
||||||
|
|
||||||
#### 输入验证实施
|
|
||||||
```java
|
|
||||||
// 1. 创建验证DTO
|
|
||||||
@Data
|
|
||||||
public class UserRegisterDTO {
|
|
||||||
@NotBlank(message = "用户名不能为空")
|
|
||||||
@Size(min = 3, max = 50)
|
|
||||||
private String username;
|
|
||||||
|
|
||||||
@Email
|
|
||||||
private String email;
|
|
||||||
|
|
||||||
@Pattern(regexp = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d).{8,}$")
|
|
||||||
private String password;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 2. Controller使用验证
|
|
||||||
@PostMapping("/register")
|
|
||||||
public Result register(@Valid @RequestBody UserRegisterDTO dto,
|
|
||||||
BindingResult result) {
|
|
||||||
if (result.hasErrors()) {
|
|
||||||
return Result.error().message(result.getFieldError().getDefaultMessage());
|
|
||||||
}
|
|
||||||
// 业务逻辑
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📊 总体评估
|
|
||||||
|
|
||||||
### 安全风险评估矩阵
|
|
||||||
|
|
||||||
| 风险类型 | 风险等级 | 影响程度 | 发生概率 | 综合评分 |
|
|
||||||
|----------|----------|----------|----------|----------|
|
|
||||||
| 敏感信息泄露 | 高危 | 严重 | 高 | 9.5/10 |
|
|
||||||
| JWT安全缺陷 | 高危 | 严重 | 中 | 8.5/10 |
|
|
||||||
| 输入验证缺失 | 中危 | 中等 | 高 | 7.0/10 |
|
|
||||||
| 异常信息泄露 | 中危 | 中等 | 中 | 6.5/10 |
|
|
||||||
| 性能问题 | 低危 | 低等 | 中 | 4.0/10 |
|
|
||||||
|
|
||||||
### 维度评分表
|
|
||||||
|
|
||||||
| 评估维度 | 评分 | 说明 | 改进建议 |
|
|
||||||
|----------|------|------|----------|
|
|
||||||
| **安全性** | 4/10 | 存在严重安全漏洞 | 优先修复P0、P1问题 |
|
|
||||||
| **功能性** | 8/10 | 核心功能完整,逻辑正确 | 保持现有功能稳定性 |
|
|
||||||
| **性能** | 6/10 | 基础优化,有提升空间 | 添加缓存和查询优化 |
|
|
||||||
| **可维护性** | 7/10 | 结构清晰,但文档不足 | 完善注释和文档 |
|
|
||||||
| **代码规范** | 6/10 | 基本规范,需细节优化 | 统一代码风格 |
|
|
||||||
|
|
||||||
**总体评分**: 6.2/10
|
|
||||||
|
|
||||||
## 🎯 改进路线图
|
|
||||||
|
|
||||||
### 短期目标(1-2周)
|
|
||||||
- [ ] **P0**: 修复硬编码敏感信息漏洞
|
|
||||||
- [ ] **P0**: 加强JWT安全配置
|
|
||||||
- [ ] **P1**: 添加完整的输入验证机制
|
|
||||||
- [ ] **P1**: 改进异常处理策略
|
|
||||||
- [ ] **P1**: 修复用户注册密码安全问题
|
|
||||||
|
|
||||||
### 中期目标(1个月)
|
|
||||||
- [ ] **P2**: 优化SQL查询性能
|
|
||||||
- [ ] **P2**: 提高密码加密强度
|
|
||||||
- [ ] **P2**: 配置化跨域设置
|
|
||||||
- [ ] **P3**: 统一代码规范和日志
|
|
||||||
- [ ] **P3**: 添加基础单元测试
|
|
||||||
|
|
||||||
### 长期目标(3个月)
|
|
||||||
- [ ] 引入Redis缓存机制
|
|
||||||
- [ ] 实现微服务架构改造
|
|
||||||
- [ ] 建立完整的监控体系
|
|
||||||
- [ ] 实现自动化部署流程
|
|
||||||
- [ ] 完善API文档和开发文档
|
|
||||||
|
|
||||||
## 📋 技术债务清单
|
|
||||||
|
|
||||||
### 高优先级技术债务
|
|
||||||
1. **安全加固** - 敏感信息管理、加密强度提升
|
|
||||||
2. **输入验证** - 全面的数据验证机制
|
|
||||||
3. **异常处理** - 精细化异常分类和处理
|
|
||||||
|
|
||||||
### 中优先级技术债务
|
|
||||||
1. **性能优化** - 数据库查询优化、缓存引入
|
|
||||||
2. **配置管理** - 多环境配置支持
|
|
||||||
3. **代码质量** - 统一规范、静态代码检查
|
|
||||||
|
|
||||||
### 低优先级技术债务
|
|
||||||
1. **文档完善** - API文档、架构文档
|
|
||||||
2. **测试覆盖** - 单元测试、集成测试
|
|
||||||
3. **部署优化** - CI/CD流程完善
|
|
||||||
|
|
||||||
## 🔍 代码审查统计
|
|
||||||
|
|
||||||
### 审查文件分类
|
|
||||||
| 文件类型 | 数量 | 问题数量 | 问题密度 |
|
|
||||||
|----------|------|----------|----------|
|
|
||||||
| Controller | 8个 | 12个 | 1.5/文件 |
|
|
||||||
| Service | 10个 | 8个 | 0.8/文件 |
|
|
||||||
| Entity | 7个 | 5个 | 0.7/文件 |
|
|
||||||
| Config | 6个 | 9个 | 1.5/文件 |
|
|
||||||
| Utils | 4个 | 3个 | 0.75/文件 |
|
|
||||||
|
|
||||||
### 问题类型分布
|
|
||||||
| 问题类型 | 数量 | 占比 | 严重程度 |
|
|
||||||
|----------|------|------|----------|
|
|
||||||
| 安全漏洞 | 6个 | 16% | 高危 |
|
|
||||||
| 代码规范 | 12个 | 32% | 中低危 |
|
|
||||||
| 性能问题 | 5个 | 13% | 中危 |
|
|
||||||
| 功能缺陷 | 8个 | 21% | 中危 |
|
|
||||||
| 维护性问题 | 7个 | 18% | 低危 |
|
|
||||||
|
|
||||||
## 📈 改进效果预测
|
|
||||||
|
|
||||||
### 修复后的预期改进
|
|
||||||
|
|
||||||
| 改进项 | 当前状态 | 预期状态 | 改进幅度 |
|
|
||||||
|--------|----------|----------|----------|
|
|
||||||
| 安全评分 | 4/10 | 8/10 | +100% |
|
|
||||||
| 代码质量 | 6/10 | 8/10 | +33% |
|
|
||||||
| 性能评分 | 6/10 | 7.5/10 | +25% |
|
|
||||||
| 可维护性 | 7/10 | 8.5/10 | +21% |
|
|
||||||
|
|
||||||
**预期总体评分提升**: 6.2 → 8.0 (+29%)
|
|
||||||
|
|
||||||
## ✅ 审查结论
|
|
||||||
|
|
||||||
Freedom Admin 项目具备良好的基础架构设计和完整的功能实现,但在**安全性**方面存在严重缺陷,需要立即采取行动。项目的核心问题是**敏感信息管理和安全配置**,这些问题的修复将显著提升系统的整体安全水平。
|
|
||||||
|
|
||||||
**主要建议**:
|
|
||||||
1. **立即行动**: 优先处理P0和P1级别的安全问题
|
|
||||||
2. **系统加固**: 建立完善的安全开发和部署流程
|
|
||||||
3. **持续改进**: 建立代码审查和质量保障机制
|
|
||||||
|
|
||||||
通过系统的修复和优化,该项目有望达到生产环境的安全和质量标准。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**审查完成时间**: 2024年11月3日
|
|
||||||
**审查人员**: 代码审查专家系统
|
|
||||||
**下次审查建议**: 修复主要问题后3个月进行复查
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
# Getting Started
|
|
||||||
|
|
||||||
### Reference Documentation
|
|
||||||
|
|
||||||
For further reference, please consider the following sections:
|
|
||||||
|
|
||||||
* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html)
|
|
||||||
* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/2.4.1/maven-plugin/reference/html/)
|
|
||||||
* [Create an OCI image](https://docs.spring.io/spring-boot/docs/2.4.1/maven-plugin/reference/html/#build-image)
|
|
||||||
* [Spring Security](https://docs.spring.io/spring-boot/docs/2.4.1/reference/htmlsingle/#boot-features-security)
|
|
||||||
* [Spring Web](https://docs.spring.io/spring-boot/docs/2.4.1/reference/htmlsingle/#boot-features-developing-web-applications)
|
|
||||||
* [Thymeleaf](https://docs.spring.io/spring-boot/docs/2.4.1/reference/htmlsingle/#boot-features-spring-mvc-template-engines)
|
|
||||||
|
|
||||||
### Guides
|
|
||||||
|
|
||||||
The following guides illustrate how to use some features concretely:
|
|
||||||
|
|
||||||
* [Securing a Web Application](https://spring.io/guides/gs/securing-web/)
|
|
||||||
* [Spring Boot and OAuth2](https://spring.io/guides/tutorials/spring-boot-oauth2/)
|
|
||||||
* [Authenticating a User with LDAP](https://spring.io/guides/gs/authenticating-ldap/)
|
|
||||||
* [Building a RESTful Web Service](https://spring.io/guides/gs/rest-service/)
|
|
||||||
* [Serving Web Content with Spring MVC](https://spring.io/guides/gs/serving-web-content/)
|
|
||||||
* [Building REST services with Spring](https://spring.io/guides/tutorials/bookmarks/)
|
|
||||||
* [Accessing data with MySQL](https://spring.io/guides/gs/accessing-data-mysql/)
|
|
||||||
* [Handling Form Submission](https://spring.io/guides/gs/handling-form-submission/)
|
|
||||||
|
|
||||||
@@ -1,358 +0,0 @@
|
|||||||
# Freedom Admin 管理系统 SQLER 图
|
|
||||||
|
|
||||||
## 数据库关系图
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
erDiagram
|
|
||||||
%% 用户表
|
|
||||||
TSysUser {
|
|
||||||
bigint id PK
|
|
||||||
varchar username
|
|
||||||
varchar password
|
|
||||||
varchar encodeType
|
|
||||||
varchar userType
|
|
||||||
varchar nickname
|
|
||||||
varchar avatar
|
|
||||||
varchar phone
|
|
||||||
varchar email
|
|
||||||
varchar signature
|
|
||||||
int status
|
|
||||||
varchar createBy
|
|
||||||
datetime createDate
|
|
||||||
varchar updateBy
|
|
||||||
datetime updateDate
|
|
||||||
boolean delFlag
|
|
||||||
}
|
|
||||||
|
|
||||||
%% 角色表
|
|
||||||
TSysRole {
|
|
||||||
bigint id PK
|
|
||||||
varchar roleName
|
|
||||||
varchar roleCode
|
|
||||||
varchar description
|
|
||||||
int status
|
|
||||||
varchar createBy
|
|
||||||
datetime createDate
|
|
||||||
varchar updateBy
|
|
||||||
datetime updateDate
|
|
||||||
boolean delFlag
|
|
||||||
}
|
|
||||||
|
|
||||||
%% 权限表
|
|
||||||
TSysPermission {
|
|
||||||
bigint id PK
|
|
||||||
varchar permissionName
|
|
||||||
varchar permissionCode
|
|
||||||
varchar description
|
|
||||||
varchar url
|
|
||||||
varchar method
|
|
||||||
int type
|
|
||||||
bigint parentId
|
|
||||||
int sort
|
|
||||||
int status
|
|
||||||
varchar createBy
|
|
||||||
datetime createDate
|
|
||||||
varchar updateBy
|
|
||||||
datetime updateDate
|
|
||||||
boolean delFlag
|
|
||||||
}
|
|
||||||
|
|
||||||
%% 部门表
|
|
||||||
TSysDept {
|
|
||||||
bigint id PK
|
|
||||||
varchar deptName
|
|
||||||
varchar deptCode
|
|
||||||
varchar description
|
|
||||||
bigint parentId
|
|
||||||
int sort
|
|
||||||
int status
|
|
||||||
varchar createBy
|
|
||||||
datetime createDate
|
|
||||||
varchar updateBy
|
|
||||||
datetime updateDate
|
|
||||||
boolean delFlag
|
|
||||||
}
|
|
||||||
|
|
||||||
%% 关联表
|
|
||||||
TSysUserRole {
|
|
||||||
bigint id PK
|
|
||||||
bigint userId FK
|
|
||||||
bigint roleId FK
|
|
||||||
varchar createBy
|
|
||||||
datetime createDate
|
|
||||||
varchar updateBy
|
|
||||||
datetime updateDate
|
|
||||||
boolean delFlag
|
|
||||||
}
|
|
||||||
|
|
||||||
TSysRolePermission {
|
|
||||||
bigint id PK
|
|
||||||
bigint roleId FK
|
|
||||||
bigint permissionId FK
|
|
||||||
varchar createBy
|
|
||||||
datetime createDate
|
|
||||||
varchar updateBy
|
|
||||||
datetime updateDate
|
|
||||||
boolean delFlag
|
|
||||||
}
|
|
||||||
|
|
||||||
%% 关系定义
|
|
||||||
TSysUser ||--o{ TSysUserRole : "拥有"
|
|
||||||
TSysRole ||--o{ TSysUserRole : "分配"
|
|
||||||
TSysRole ||--o{ TSysRolePermission : "授权"
|
|
||||||
TSysPermission ||--o{ TSysRolePermission : "被授予"
|
|
||||||
TSysDept ||--o{ TSysUser : "属于"
|
|
||||||
TSysPermission ||--o{ TSysPermission : "层级关系"
|
|
||||||
TSysDept ||--o{ TSysDept : "层级关系"
|
|
||||||
```
|
|
||||||
|
|
||||||
## 数据字典
|
|
||||||
|
|
||||||
### 表结构详细信息
|
|
||||||
|
|
||||||
#### 1. 用户表 (t_sys_user)
|
|
||||||
|
|
||||||
| 字段名 | 数据类型 | 长度 | 允许空 | 主键 | 说明 | 默认值 |
|
|
||||||
|--------|----------|------|--------|------|------|--------|
|
|
||||||
| id | bigint | 20 | NO | PK | 主键ID | 自增 |
|
|
||||||
| username | varchar | 50 | NO | | 登录用户名 | |
|
|
||||||
| password | varchar | 255 | NO | | 加密密码 | |
|
|
||||||
| encodeType | varchar | 20 | YES | | 加密方式 | MD5 |
|
|
||||||
| userType | varchar | 20 | YES | | 用户类型 | |
|
|
||||||
| nickname | varchar | 50 | YES | | 用户昵称 | |
|
|
||||||
| avatar | varchar | 255 | YES | | 头像URL | |
|
|
||||||
| phone | varchar | 20 | YES | | 手机号 | |
|
|
||||||
| email | varchar | 100 | YES | | 邮箱 | |
|
|
||||||
| signature | varchar | 255 | YES | | 个性签名 | |
|
|
||||||
| status | int | 11 | YES | | 状态(0禁用,1启用) | 1 |
|
|
||||||
| createBy | varchar | 50 | YES | | 创建人 | |
|
|
||||||
| createDate | datetime | | YES | | 创建时间 | |
|
|
||||||
| updateBy | varchar | 50 | YES | | 更新人 | |
|
|
||||||
| updateDate | datetime | | YES | | 更新时间 | |
|
|
||||||
| delFlag | boolean | | YES | | 删除标记 | 0 |
|
|
||||||
|
|
||||||
#### 2. 角色表 (t_sys_role)
|
|
||||||
|
|
||||||
| 字段名 | 数据类型 | 长度 | 允许空 | 主键 | 说明 | 默认值 |
|
|
||||||
|--------|----------|------|--------|------|------|--------|
|
|
||||||
| id | bigint | 20 | NO | PK | 主键ID | 自增 |
|
|
||||||
| roleName | varchar | 50 | NO | | 角色名称 | |
|
|
||||||
| roleCode | varchar | 50 | NO | | 角色编码 | |
|
|
||||||
| description | varchar | 255 | YES | | 角色描述 | |
|
|
||||||
| status | int | 11 | YES | | 状态(0禁用,1启用) | 1 |
|
|
||||||
| createBy | varchar | 50 | YES | | 创建人 | |
|
|
||||||
| createDate | datetime | | YES | | 创建时间 | |
|
|
||||||
| updateBy | varchar | 50 | YES | | 更新人 | |
|
|
||||||
| updateDate | datetime | | YES | | 更新时间 | |
|
|
||||||
| delFlag | boolean | | YES | | 删除标记 | 0 |
|
|
||||||
|
|
||||||
#### 3. 权限表 (t_sys_permission)
|
|
||||||
|
|
||||||
| 字段名 | 数据类型 | 长度 | 允许空 | 主键 | 说明 | 默认值 |
|
|
||||||
|--------|----------|------|--------|------|------|--------|
|
|
||||||
| id | bigint | 20 | NO | PK | 主键ID | 自增 |
|
|
||||||
| permissionName | varchar | 50 | NO | | 权限名称 | |
|
|
||||||
| permissionCode | varchar | 50 | NO | | 权限编码 | |
|
|
||||||
| description | varchar | 255 | YES | | 权限描述 | |
|
|
||||||
| url | varchar | 255 | YES | | 请求URL | |
|
|
||||||
| method | varchar | 10 | YES | | 请求方法 | |
|
|
||||||
| type | int | 11 | YES | | 权限类型(1菜单,2按钮) | |
|
|
||||||
| parentId | bigint | 20 | YES | | 父级权限ID | 0 |
|
|
||||||
| sort | int | 11 | YES | | 排序号 | 0 |
|
|
||||||
| status | int | 11 | YES | | 状态(0禁用,1启用) | 1 |
|
|
||||||
| createBy | varchar | 50 | YES | | 创建人 | |
|
|
||||||
| createDate | datetime | | YES | | 创建时间 | |
|
|
||||||
| updateBy | varchar | 50 | YES | | 更新人 | |
|
|
||||||
| updateDate | datetime | | YES | | 更新时间 | |
|
|
||||||
| delFlag | boolean | | YES | | 删除标记 | 0 |
|
|
||||||
|
|
||||||
#### 4. 部门表 (t_sys_dept)
|
|
||||||
|
|
||||||
| 字段名 | 数据类型 | 长度 | 允许空 | 主键 | 说明 | 默认值 |
|
|
||||||
|--------|----------|------|--------|------|------|--------|
|
|
||||||
| id | bigint | 20 | NO | PK | 主键ID | 自增 |
|
|
||||||
| deptName | varchar | 50 | NO | | 部门名称 | |
|
|
||||||
| deptCode | varchar | 50 | NO | | 部门编码 | |
|
|
||||||
| description | varchar | 255 | YES | | 部门描述 | |
|
|
||||||
| parentId | bigint | 20 | YES | | 父级部门ID | 0 |
|
|
||||||
| sort | int | 11 | YES | | 排序号 | 0 |
|
|
||||||
| status | int | 11 | YES | | 状态(0禁用,1启用) | 1 |
|
|
||||||
| createBy | varchar | 50 | YES | | 创建人 | |
|
|
||||||
| createDate | datetime | | YES | | 创建时间 | |
|
|
||||||
| updateBy | varchar | 50 | YES | | 更新人 | |
|
|
||||||
| updateDate | datetime | | YES | | 更新时间 | |
|
|
||||||
| delFlag | boolean | | YES | | 删除标记 | 0 |
|
|
||||||
|
|
||||||
#### 5. 用户角色关联表 (t_sys_user_role)
|
|
||||||
|
|
||||||
| 字段名 | 数据类型 | 长度 | 允许空 | 主键 | 说明 | 默认值 |
|
|
||||||
|--------|----------|------|--------|------|------|--------|
|
|
||||||
| id | bigint | 20 | NO | PK | 主键ID | 自增 |
|
|
||||||
| userId | bigint | 20 | NO | FK | 用户ID | |
|
|
||||||
| roleId | bigint | 20 | NO | FK | 角色ID | |
|
|
||||||
| createBy | varchar | 50 | YES | | 创建人 | |
|
|
||||||
| createDate | datetime | | YES | | 创建时间 | |
|
|
||||||
| updateBy | varchar | 50 | YES | | 更新人 | |
|
|
||||||
| updateDate | datetime | | YES | | 更新时间 | |
|
|
||||||
| delFlag | boolean | | YES | | 删除标记 | 0 |
|
|
||||||
|
|
||||||
#### 6. 角色权限关联表 (t_sys_role_permission)
|
|
||||||
|
|
||||||
| 字段名 | 数据类型 | 长度 | 允许空 | 主键 | 说明 | 默认值 |
|
|
||||||
|--------|----------|------|--------|------|------|--------|
|
|
||||||
| id | bigint | 20 | NO | PK | 主键ID | 自增 |
|
|
||||||
| roleId | bigint | 20 | NO | FK | 角色ID | |
|
|
||||||
| permissionId | bigint | 20 | NO | FK | 权限ID | |
|
|
||||||
| createBy | varchar | 50 | YES | | 创建人 | |
|
|
||||||
| createDate | datetime | | YES | | 创建时间 | |
|
|
||||||
| updateBy | varchar | 50 | YES | | 更新人 | |
|
|
||||||
| updateDate | datetime | | YES | | 更新时间 | |
|
|
||||||
| delFlag | boolean | | YES | | 删除标记 | 0 |
|
|
||||||
|
|
||||||
## 索引设计
|
|
||||||
|
|
||||||
### 主键索引
|
|
||||||
```sql
|
|
||||||
-- 所有表的主键索引
|
|
||||||
PRIMARY KEY (id)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 唯一索引
|
|
||||||
```sql
|
|
||||||
-- 用户表唯一索引
|
|
||||||
UNIQUE KEY uk_username (username),
|
|
||||||
UNIQUE KEY uk_phone (phone),
|
|
||||||
UNIQUE KEY uk_email (email)
|
|
||||||
|
|
||||||
-- 角色表唯一索引
|
|
||||||
UNIQUE KEY uk_role_code (roleCode)
|
|
||||||
|
|
||||||
-- 权限表唯一索引
|
|
||||||
UNIQUE KEY uk_permission_code (permissionCode)
|
|
||||||
|
|
||||||
-- 部门表唯一索引
|
|
||||||
UNIQUE KEY uk_dept_code (deptCode)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 外键索引
|
|
||||||
```sql
|
|
||||||
-- 用户角色关联表外键索引
|
|
||||||
KEY idx_user_id (userId),
|
|
||||||
KEY idx_role_id (roleId)
|
|
||||||
|
|
||||||
-- 角色权限关联表外键索引
|
|
||||||
KEY idx_role_id (roleId),
|
|
||||||
KEY idx_permission_id (permissionId)
|
|
||||||
|
|
||||||
-- 权限表层级索引
|
|
||||||
KEY idx_parent_id (parentId)
|
|
||||||
|
|
||||||
-- 部门表层级索引
|
|
||||||
KEY idx_parent_id (parentId)
|
|
||||||
```
|
|
||||||
|
|
||||||
## 数据关系说明
|
|
||||||
|
|
||||||
### 1. 用户-角色-权限关系模型
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
graph TB
|
|
||||||
U[用户] --> UR[用户角色]
|
|
||||||
R[角色] --> UR
|
|
||||||
R --> RP[角色权限]
|
|
||||||
P[权限] --> RP
|
|
||||||
|
|
||||||
subgraph "基础实体"
|
|
||||||
U
|
|
||||||
R
|
|
||||||
P
|
|
||||||
D[部门]
|
|
||||||
end
|
|
||||||
|
|
||||||
subgraph "关联关系"
|
|
||||||
UR
|
|
||||||
RP
|
|
||||||
end
|
|
||||||
|
|
||||||
D --> U
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. 权限层级结构
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
graph TD
|
|
||||||
A[根权限] --> B[模块权限]
|
|
||||||
B --> C[菜单权限]
|
|
||||||
C --> D[按钮权限]
|
|
||||||
|
|
||||||
B --> E[模块权限2]
|
|
||||||
E --> F[菜单权限2]
|
|
||||||
F --> G[按钮权限2]
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. 部门层级结构
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
graph TD
|
|
||||||
A[总公司] --> B[分公司1]
|
|
||||||
A --> C[分公司2]
|
|
||||||
|
|
||||||
B --> D[部门A]
|
|
||||||
B --> E[部门B]
|
|
||||||
|
|
||||||
C --> F[部门C]
|
|
||||||
C --> G[部门D]
|
|
||||||
```
|
|
||||||
|
|
||||||
## 查询优化建议
|
|
||||||
|
|
||||||
### 1. 常用查询SQL
|
|
||||||
|
|
||||||
```sql
|
|
||||||
-- 查询用户权限
|
|
||||||
SELECT p.* FROM t_sys_user u
|
|
||||||
JOIN t_sys_user_role ur ON u.id = ur.user_id
|
|
||||||
JOIN t_sys_role r ON ur.role_id = r.id
|
|
||||||
JOIN t_sys_role_permission rp ON r.id = rp.role_id
|
|
||||||
JOIN t_sys_permission p ON rp.permission_id = p.id
|
|
||||||
WHERE u.id = ? AND u.del_flag = 0 AND r.del_flag = 0 AND p.del_flag = 0
|
|
||||||
|
|
||||||
-- 查询部门层级
|
|
||||||
WITH RECURSIVE dept_tree AS (
|
|
||||||
SELECT * FROM t_sys_dept WHERE id = ?
|
|
||||||
UNION ALL
|
|
||||||
SELECT d.* FROM t_sys_dept d
|
|
||||||
JOIN dept_tree dt ON d.parent_id = dt.id
|
|
||||||
)
|
|
||||||
SELECT * FROM dept_tree WHERE del_flag = 0
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. 性能优化建议
|
|
||||||
|
|
||||||
1. **索引优化**:为频繁查询的字段建立合适索引
|
|
||||||
2. **分页查询**:使用MyBatis-Plus分页插件
|
|
||||||
3. **逻辑删除**:使用del_flag字段进行软删除
|
|
||||||
4. **数据归档**:定期归档历史数据
|
|
||||||
|
|
||||||
## 数据完整性约束
|
|
||||||
|
|
||||||
### 1. 实体完整性
|
|
||||||
- 所有表主键ID唯一且非空
|
|
||||||
- 通过自增方式保证主键唯一性
|
|
||||||
|
|
||||||
### 2. 参照完整性
|
|
||||||
- 用户角色关联表引用用户表和角色表
|
|
||||||
- 角色权限关联表引用角色表和权限表
|
|
||||||
- 外键约束确保数据一致性
|
|
||||||
|
|
||||||
### 3. 域完整性
|
|
||||||
- 状态字段使用枚举值约束
|
|
||||||
- 时间字段使用标准datetime格式
|
|
||||||
- 字符字段长度限制防止溢出
|
|
||||||
|
|
||||||
### 4. 业务完整性
|
|
||||||
- 逻辑删除保证数据可恢复
|
|
||||||
- 创建时间和更新时间的自动维护
|
|
||||||
- 创建人和更新人的记录追踪
|
|
||||||
|
|
||||||
这个SQLER图详细描述了 Freedom Admin 管理系统的数据库结构设计,包括表关系、字段定义、索引设计和数据完整性约束。
|
|
||||||
@@ -1,264 +0,0 @@
|
|||||||
# Freedom Admin 管理系统代码评审
|
|
||||||
|
|
||||||
## 项目概述
|
|
||||||
|
|
||||||
Freedom Admin 是一个基于 Spring Boot 的后台管理系统,采用 Spring Security 进行安全认证,MyBatis-Plus 作为 ORM 框架,集成代码生成器和邮件服务等功能。
|
|
||||||
|
|
||||||
## 代码结构分析
|
|
||||||
|
|
||||||
### 1. 项目结构
|
|
||||||
```
|
|
||||||
├── src/main/java/com/freedom/admin/
|
|
||||||
│ ├── AdminApplication.java # 启动类
|
|
||||||
│ ├── base/ # 基础控制器
|
|
||||||
│ ├── common/ # 通用返回结果
|
|
||||||
│ ├── config/ # 配置类
|
|
||||||
│ ├── controller/ # 控制器层
|
|
||||||
│ ├── entity/ # 实体类
|
|
||||||
│ ├── mapper/ # 数据访问层
|
|
||||||
│ ├── service/ # 服务层
|
|
||||||
│ └── util/ # 工具类
|
|
||||||
```
|
|
||||||
|
|
||||||
## 代码质量评估
|
|
||||||
|
|
||||||
### 1. 优点
|
|
||||||
|
|
||||||
#### 1.1 架构设计合理
|
|
||||||
- ✅ 采用标准的 MVC 分层架构
|
|
||||||
- ✅ 合理的包结构划分
|
|
||||||
- ✅ 配置与业务代码分离
|
|
||||||
|
|
||||||
#### 1.2 安全实现完善
|
|
||||||
- ✅ Spring Security + JWT 认证机制
|
|
||||||
- ✅ 密码加密存储(BCrypt)
|
|
||||||
- ✅ 权限控制注解
|
|
||||||
|
|
||||||
#### 1.3 技术栈选择恰当
|
|
||||||
- ✅ Spring Boot 2.7.10 稳定版本
|
|
||||||
- ✅ MyBatis-Plus 简化数据操作
|
|
||||||
- ✅ Thymeleaf 模板引擎
|
|
||||||
|
|
||||||
### 2. 问题与改进建议
|
|
||||||
|
|
||||||
#### 2.1 安全问题
|
|
||||||
|
|
||||||
**问题1:配置文件中的敏感信息**
|
|
||||||
```yaml
|
|
||||||
# src/main/resources/application.yml:13-14
|
|
||||||
password: 1Qaz@4772
|
|
||||||
|
|
||||||
# src/main/resources/application.yml:35
|
|
||||||
password: nsbrkfdzzmdlbddi
|
|
||||||
```
|
|
||||||
**风险等级**:高危
|
|
||||||
**建议**:
|
|
||||||
- 使用环境变量或配置中心管理敏感信息
|
|
||||||
- 将密码等敏感数据移至安全位置
|
|
||||||
|
|
||||||
**问题2:硬编码的跨域配置**
|
|
||||||
```java
|
|
||||||
// src/main/java/com/freedom/admin/config/WebSecurityConfig.java:112
|
|
||||||
cfg.addAllowedOrigin("http://localhost:8080");
|
|
||||||
```
|
|
||||||
**风险等级**:中危
|
|
||||||
**建议**:
|
|
||||||
- 使用配置化方式管理允许的域名
|
|
||||||
- 支持多环境配置
|
|
||||||
|
|
||||||
#### 2.2 代码规范问题
|
|
||||||
|
|
||||||
**问题3:空注释**
|
|
||||||
```java
|
|
||||||
// src/main/java/com/freedom/admin/config/WebSecurityConfig.java:21-23
|
|
||||||
/**
|
|
||||||
* @author zhangjiaxun
|
|
||||||
* @date 2021/1/5 17:40
|
|
||||||
* @description
|
|
||||||
*/
|
|
||||||
```
|
|
||||||
**建议**:完善注释内容
|
|
||||||
|
|
||||||
**问题4:实体类缺少验证注解**
|
|
||||||
```java
|
|
||||||
// src/main/java/com/freedom/admin/entity/TSysUser.java
|
|
||||||
private String username; // 缺少 @NotBlank 等验证注解
|
|
||||||
```
|
|
||||||
**建议**:添加数据验证注解
|
|
||||||
|
|
||||||
#### 2.3 性能问题
|
|
||||||
|
|
||||||
**问题5:连接池配置可能过于保守**
|
|
||||||
```yaml
|
|
||||||
# src/main/resources/application.yml:18
|
|
||||||
maximum-pool-size: 10
|
|
||||||
```
|
|
||||||
**建议**:根据实际使用场景调整连接池大小
|
|
||||||
|
|
||||||
## 详细代码分析
|
|
||||||
|
|
||||||
### 1. 安全配置分析
|
|
||||||
|
|
||||||
#### WebSecurityConfig.java 分析
|
|
||||||
|
|
||||||
**优点**:
|
|
||||||
- 完整的 JWT 认证流程
|
|
||||||
- 合理的 CORS 配置
|
|
||||||
- 密码加密器配置正确
|
|
||||||
|
|
||||||
**改进建议**:
|
|
||||||
```java
|
|
||||||
// 建议使用配置类管理允许的域名
|
|
||||||
@Value("${cors.allowed-origins}")
|
|
||||||
private String[] allowedOrigins;
|
|
||||||
|
|
||||||
// 在配置方法中使用
|
|
||||||
cfg.addAllowedOrigin(allowedOrigins);
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. 实体类设计
|
|
||||||
|
|
||||||
#### TSysUser.java 分析
|
|
||||||
|
|
||||||
**优点**:
|
|
||||||
- 使用 Lombok 简化代码
|
|
||||||
- 字段设计合理
|
|
||||||
- 包含必要的审计字段
|
|
||||||
|
|
||||||
**改进建议**:
|
|
||||||
```java
|
|
||||||
// 添加数据验证注解
|
|
||||||
import javax.validation.constraints.*;
|
|
||||||
|
|
||||||
@NotBlank(message = "用户名不能为空")
|
|
||||||
@Size(min = 3, max = 50, message = "用户名长度必须在3-50之间")
|
|
||||||
private String username;
|
|
||||||
|
|
||||||
@Email(message = "邮箱格式不正确")
|
|
||||||
private String email;
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. 配置文件分析
|
|
||||||
|
|
||||||
#### application.yml 分析
|
|
||||||
|
|
||||||
**优点**:
|
|
||||||
- 配置结构清晰
|
|
||||||
- 支持多数据源配置
|
|
||||||
- 包含邮件服务配置
|
|
||||||
|
|
||||||
**问题**:
|
|
||||||
- 敏感信息硬编码
|
|
||||||
- 日志配置缺失
|
|
||||||
- 缓存配置缺失
|
|
||||||
|
|
||||||
## 技术债务清单
|
|
||||||
|
|
||||||
### 高优先级
|
|
||||||
1. **敏感信息管理** - 将密码等敏感数据移至安全位置
|
|
||||||
2. **日志配置** - 添加完整的日志配置
|
|
||||||
3. **数据验证** - 在实体类添加验证注解
|
|
||||||
|
|
||||||
### 中优先级
|
|
||||||
1. **缓存机制** - 添加 Redis 缓存支持
|
|
||||||
2. **API文档** - 集成 Swagger 文档
|
|
||||||
3. **单元测试** - 补充单元测试覆盖
|
|
||||||
|
|
||||||
### 低优先级
|
|
||||||
1. **代码注释** - 完善注释文档
|
|
||||||
2. **配置优化** - 优化连接池等配置
|
|
||||||
3. **错误处理** - 统一异常处理优化
|
|
||||||
|
|
||||||
## 性能优化建议
|
|
||||||
|
|
||||||
### 1. 数据库优化
|
|
||||||
```java
|
|
||||||
// 建议添加分页查询优化
|
|
||||||
@Configuration
|
|
||||||
public class MybatisPlusConfig {
|
|
||||||
@Bean
|
|
||||||
public MybatisPlusInterceptor mybatisPlusInterceptor() {
|
|
||||||
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
|
|
||||||
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
|
|
||||||
return interceptor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. 缓存优化
|
|
||||||
```yaml
|
|
||||||
# 建议添加 Redis 缓存配置
|
|
||||||
spring:
|
|
||||||
redis:
|
|
||||||
host: localhost
|
|
||||||
port: 6379
|
|
||||||
password: ${REDIS_PASSWORD}
|
|
||||||
database: 0
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. 异步处理
|
|
||||||
```java
|
|
||||||
// 建议添加邮件发送异步处理
|
|
||||||
@Async
|
|
||||||
public void sendEmailAsync(String to, String subject, String content) {
|
|
||||||
// 邮件发送逻辑
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## 安全加固建议
|
|
||||||
|
|
||||||
### 1. 输入验证
|
|
||||||
```java
|
|
||||||
// 在 Controller 中添加输入验证
|
|
||||||
@PostMapping("/register")
|
|
||||||
public Result register(@Valid @RequestBody UserRegisterDTO dto) {
|
|
||||||
// 业务逻辑
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. SQL 注入防护
|
|
||||||
- ✅ MyBatis-Plus 已提供 SQL 注入防护
|
|
||||||
- 建议定期进行安全扫描
|
|
||||||
|
|
||||||
### 3. XSS 防护
|
|
||||||
```java
|
|
||||||
// 建议添加 XSS 过滤器
|
|
||||||
@Component
|
|
||||||
public class XssFilter implements Filter {
|
|
||||||
// XSS 防护逻辑
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## 部署建议
|
|
||||||
|
|
||||||
### 1. 环境分离
|
|
||||||
```yaml
|
|
||||||
# 建议使用多环境配置
|
|
||||||
spring:
|
|
||||||
profiles:
|
|
||||||
active: ${SPRING_PROFILES_ACTIVE:dev}
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. 健康检查
|
|
||||||
```java
|
|
||||||
// 建议添加健康检查端点
|
|
||||||
@Component
|
|
||||||
public class CustomHealthIndicator implements HealthIndicator {
|
|
||||||
@Override
|
|
||||||
public Health health() {
|
|
||||||
// 健康检查逻辑
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## 总结
|
|
||||||
|
|
||||||
Freedom Admin 项目整体架构设计合理,技术栈选择恰当,但在安全配置、代码规范和性能优化方面存在改进空间。建议优先处理高优先级的技术债务,特别是敏感信息管理和安全加固。
|
|
||||||
|
|
||||||
**总体评分**:7.5/10
|
|
||||||
|
|
||||||
**改进重点**:
|
|
||||||
1. 敏感信息安全管理
|
|
||||||
2. 完善数据验证机制
|
|
||||||
3. 添加缓存和性能优化
|
|
||||||
4. 补充测试和文档
|
|
||||||
-226
@@ -1,226 +0,0 @@
|
|||||||
# Freedom Admin 管理系统架构流程图
|
|
||||||
|
|
||||||
## 系统架构概览
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
graph TB
|
|
||||||
A[前端界面] -->|HTTP请求| B[Spring Boot 应用服务器]
|
|
||||||
B --> C[Spring Security]
|
|
||||||
B --> D[Spring MVC]
|
|
||||||
B --> E[Thymeleaf 模板引擎]
|
|
||||||
|
|
||||||
C --> F[JWT 认证]
|
|
||||||
C --> G[权限控制]
|
|
||||||
|
|
||||||
D --> H[Controller 层]
|
|
||||||
H --> I[Service 层]
|
|
||||||
I --> J[Mapper 层]
|
|
||||||
J --> K[MyBatis-Plus]
|
|
||||||
|
|
||||||
E --> L[页面渲染]
|
|
||||||
|
|
||||||
K --> M[MySQL 数据库]
|
|
||||||
B --> N[邮件服务]
|
|
||||||
N --> O[SMTP 服务器]
|
|
||||||
|
|
||||||
B --> P[代码生成器]
|
|
||||||
P --> Q[Beetl 模板引擎]
|
|
||||||
```
|
|
||||||
|
|
||||||
## 详细架构流程
|
|
||||||
|
|
||||||
### 1. 用户访问流程
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
sequenceDiagram
|
|
||||||
participant U as 用户
|
|
||||||
participant F as 前端界面
|
|
||||||
participant GW as 安全网关
|
|
||||||
participant C as Controller
|
|
||||||
participant S as Service
|
|
||||||
participant D as 数据库
|
|
||||||
|
|
||||||
U->>F: 访问系统
|
|
||||||
F->>GW: HTTP请求
|
|
||||||
GW->>GW: JWT认证检查
|
|
||||||
GW->>C: 路由到对应Controller
|
|
||||||
C->>S: 调用业务逻辑
|
|
||||||
S->>D: 数据库操作
|
|
||||||
D->>S: 返回数据
|
|
||||||
S->>C: 业务处理结果
|
|
||||||
C->>F: 返回响应数据
|
|
||||||
F->>U: 页面渲染展示
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. 安全认证流程
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
flowchart TD
|
|
||||||
Start[用户登录] --> Input[输入用户名密码]
|
|
||||||
Input --> Validate{格式验证}
|
|
||||||
Validate -->|格式错误| Error1[返回错误信息]
|
|
||||||
Validate -->|格式正确| Auth[Spring Security认证]
|
|
||||||
Auth --> DB[查询数据库验证]
|
|
||||||
DB -->|验证失败| Error2[认证失败]
|
|
||||||
DB -->|验证成功| JWT[生成JWT Token]
|
|
||||||
JWT --> Success[登录成功]
|
|
||||||
Success --> SetToken[设置Token到响应头]
|
|
||||||
SetToken --> Redirect[重定向到首页]
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. 请求处理流程
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
graph LR
|
|
||||||
A[HTTP请求] --> B[DispatcherServlet]
|
|
||||||
B --> C[HandlerMapping]
|
|
||||||
C --> D[Controller]
|
|
||||||
D --> E[Service]
|
|
||||||
E --> F[Mapper/MyBatis-Plus]
|
|
||||||
F --> G[MySQL数据库]
|
|
||||||
G --> F
|
|
||||||
F --> E
|
|
||||||
E --> D
|
|
||||||
D --> H[ViewResolver]
|
|
||||||
H --> I[Thymeleaf模板]
|
|
||||||
I --> J[HTTP响应]
|
|
||||||
```
|
|
||||||
|
|
||||||
### 4. 数据流架构
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
graph TD
|
|
||||||
A[前端UI层] -->|JSON/Form Data| B[Controller控制层]
|
|
||||||
B -->|Service接口| C[Service业务层]
|
|
||||||
C -->|Mapper接口| D[数据访问层]
|
|
||||||
D -->|SQL映射| E[MySQL数据库]
|
|
||||||
|
|
||||||
F[代码生成器] -->|Beetl模板| G[生成代码文件]
|
|
||||||
G --> H[Controller/Service/Entity]
|
|
||||||
|
|
||||||
I[邮件服务] -->|SMTP协议| J[邮件服务器]
|
|
||||||
```
|
|
||||||
|
|
||||||
## 核心组件架构
|
|
||||||
|
|
||||||
### 1. 认证授权架构
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
graph TB
|
|
||||||
subgraph "安全认证模块"
|
|
||||||
A[JWT认证过滤器] --> B[Spring Security]
|
|
||||||
B --> C[UserDetailsService]
|
|
||||||
C --> D[密码加密器]
|
|
||||||
B --> E[权限决策器]
|
|
||||||
E --> F[角色权限映射]
|
|
||||||
end
|
|
||||||
|
|
||||||
subgraph "数据库层"
|
|
||||||
G[用户表] --> H[角色表]
|
|
||||||
H --> I[权限表]
|
|
||||||
G --> J[用户角色关联]
|
|
||||||
H --> K[角色权限关联]
|
|
||||||
end
|
|
||||||
|
|
||||||
A --> G
|
|
||||||
E --> I
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. 业务模块架构
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
graph LR
|
|
||||||
subgraph "用户管理模块"
|
|
||||||
A1[用户注册] --> A2[用户登录]
|
|
||||||
A2 --> A3[权限管理]
|
|
||||||
A3 --> A4[个人信息]
|
|
||||||
end
|
|
||||||
|
|
||||||
subgraph "代码生成模块"
|
|
||||||
B1[模板管理] --> B2[代码生成]
|
|
||||||
B2 --> B3[文件输出]
|
|
||||||
end
|
|
||||||
|
|
||||||
subgraph "邮件服务模块"
|
|
||||||
C1[邮件模板] --> C2[邮件发送]
|
|
||||||
C2 --> C3[发送记录]
|
|
||||||
end
|
|
||||||
|
|
||||||
subgraph "数据管理模块"
|
|
||||||
D1[部门管理] --> D2[活动管理]
|
|
||||||
D2 --> D3[药品管理]
|
|
||||||
D3 --> D4[订单管理]
|
|
||||||
end
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. 技术栈架构
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
graph TB
|
|
||||||
subgraph "前端技术栈"
|
|
||||||
A1[HTML5] --> A2[CSS3]
|
|
||||||
A2 --> A3[JavaScript]
|
|
||||||
A3 --> A4[Thymeleaf]
|
|
||||||
end
|
|
||||||
|
|
||||||
subgraph "后端技术栈"
|
|
||||||
B1[Spring Boot 2.7.10] --> B2[Spring Security]
|
|
||||||
B2 --> B3[MyBatis-Plus]
|
|
||||||
B3 --> B4[HikariCP]
|
|
||||||
end
|
|
||||||
|
|
||||||
subgraph "安全技术栈"
|
|
||||||
C1[JWT Token] --> C2[BCrypt加密]
|
|
||||||
C2 --> C3[权限控制]
|
|
||||||
end
|
|
||||||
|
|
||||||
subgraph "工具技术栈"
|
|
||||||
D1[Beetl模板] --> D2[邮件服务]
|
|
||||||
D2 --> D3[代码生成]
|
|
||||||
end
|
|
||||||
|
|
||||||
A4 --> B1
|
|
||||||
B4 --> C1
|
|
||||||
D3 --> B1
|
|
||||||
```
|
|
||||||
|
|
||||||
## 部署架构
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
graph TB
|
|
||||||
subgraph "应用服务器"
|
|
||||||
A[Spring Boot应用] --> B[Tomcat容器]
|
|
||||||
B --> C[JVM运行时]
|
|
||||||
end
|
|
||||||
|
|
||||||
subgraph "数据库服务器"
|
|
||||||
D[MySQL 8.0] --> E[数据存储]
|
|
||||||
E --> F[连接池]
|
|
||||||
end
|
|
||||||
|
|
||||||
subgraph "外部服务"
|
|
||||||
G[邮件服务器] --> H[SMTP服务]
|
|
||||||
I[前端资源] --> J[静态文件]
|
|
||||||
end
|
|
||||||
|
|
||||||
A --> D
|
|
||||||
A --> G
|
|
||||||
A --> I
|
|
||||||
```
|
|
||||||
|
|
||||||
## 配置文件架构
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
graph LR
|
|
||||||
A[application.yml] --> B[数据源配置]
|
|
||||||
A --> C[安全配置]
|
|
||||||
A --> D[邮件配置]
|
|
||||||
A --> E[MyBatis配置]
|
|
||||||
|
|
||||||
B --> F[数据库连接]
|
|
||||||
C --> G[JWT参数]
|
|
||||||
D --> H[SMTP设置]
|
|
||||||
E --> I[映射配置]
|
|
||||||
```
|
|
||||||
|
|
||||||
这个架构流程图展示了 Freedom Admin 管理系统的完整技术架构和业务流程,包括前端到后端的完整请求处理流程、安全认证机制、模块化设计以及技术栈构成。
|
|
||||||
Reference in New Issue
Block a user