Skip to content

后端技术架构设计 ​

文档编号: SYS-DES-ARCH-BACKEND-001
版本: 1.0
创建日期: 2026-03-08
作者: 架构师
状态: 🔄 进行中


1. 概述 ​

1.1 目的 ​

本文档定义System平台后端技术架构设计,包括技术选型、项目结构、分层架构、服务设计、安全设计等。

1.2 适用范围 ​

  • System服务(用户/权限/组织)
  • Config服务(系统配置)
  • Audit服务(审计日志)
  • 通用组件和工具

1.3 设计原则 ​

  1. 分层架构:清晰的职责分离(Controller/Service/Mapper/Entity)
  2. 领域驱动:基于DDD的领域模型设计
  3. 可扩展性:支持水平扩展和服务拆分
  4. 安全性:认证授权、数据加密、防攻击

2. 技术选型 ​

2.1 核心技术栈 ​

技术版本用途选择理由
Spring Boot3.2.x基础框架自动配置,生态丰富,微服务支持
Spring Cloud2023.x微服务框架服务注册、配置中心、网关
Spring Security6.x安全框架认证授权,OAuth2支持
MyBatis Plus3.5.xORM框架简化CRUD,代码生成,分页插件
MySQL8.0关系数据库主从复制,性能优化
Redis7.x缓存数据库高性能缓存,分布式锁
Elasticsearch8.x搜索引擎全文检索,日志分析
RabbitMQ3.12.x消息队列异步消息,削峰填谷
JWT0.12.xToken认证无状态认证,跨域支持

2.2 微服务组件 ​

组件技术用途
服务注册Nacos服务发现与配置管理
服务网关Spring Cloud Gateway路由、限流、认证
负载均衡Spring Cloud LoadBalancer客户端负载均衡
熔断降级Sentinel流量控制,熔断降级
链路追踪Micrometer + Zipkin分布式链路追踪
监控告警Prometheus + Grafana指标监控和告警

2.3 技术栈架构图 ​

┌─────────────────────────────────────────────────────────────┐
│                      后端技术栈架构                          │
├─────────────────────────────────────────────────────────────┤
│  接入层                                                      │
│  ┌─────────────────────────────────────────────────────┐   │
│  │              Spring Cloud Gateway                    │   │
│  │         路由 / 限流 / 认证 / 日志 / 熔断             │   │
│  └─────────────────────────────────────────────────────┘   │
├─────────────────────────────────────────────────────────────┤
│  服务层                                                      │
│  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐           │
│  │   System    │ │   Config    │ │   Audit     │           │
│  │   Service   │ │   Service   │ │   Service   │           │
│  └─────────────┘ └─────────────┘ └─────────────┘           │
├─────────────────────────────────────────────────────────────┤
│  基础层                                                      │
│  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐           │
│  │ Spring Boot │ │Spring Security│ │Spring Cloud │          │
│  │  (基础框架)  │ │  (安全框架)   │ │ (微服务)    │           │
│  └─────────────┘ └─────────────┘ └─────────────┘           │
├─────────────────────────────────────────────────────────────┤
│  数据层                                                      │
│  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐           │
│  │    MySQL    │ │    Redis    │ │Elasticsearch│           │
│  │  (主数据)    │ │  (缓存)      │ │  (搜索)     │           │
│  └─────────────┘ └─────────────┘ └─────────────┘           │
├─────────────────────────────────────────────────────────────┤
│  中间件                                                      │
│  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐           │
│  │   Nacos     │ │  RabbitMQ   │ │  Sentinel   │           │
│  │ (注册配置)   │ │  (消息队列)  │ │ (熔断限流)  │           │
│  └─────────────┘ └─────────────┘ └─────────────┘           │
└─────────────────────────────────────────────────────────────┘

3. 项目结构 ​

3.1 多模块项目结构 ​

linsir-cloud-system/                   # 后端项目根目录
├── linsir-server/                     # 服务端实现
│   ├── linsir-server-common/          # 通用模块
│   │   ├── linsir-common-core/        # 核心工具
│   │   ├── linsir-common-mybatis/     # MyBatis封装
│   │   ├── linsir-common-security/    # 安全模块
│   │   ├── linsir-common-redis/       # Redis封装
│   │   └── linsir-common-log/         # 日志模块
│   │
│   ├── linsir-server-gateway/         # 网关服务(独立)
│   │   ├── src/main/java/com/linsir/gateway/
│   │   │   ├── config/                # 网关配置
│   │   │   ├── filter/                # 网关过滤器
│   │   │   └── handler/               # 异常处理器
│   │   └── pom.xml
│   │
│   └── linsir-server-system/          # System服务(唯一业务服务)
│       ├── src/main/java/com/linsir/system/
│       │   ├── module/                # 按模块划分
│       │   │   ├── auth/              # 认证模块
│       │   │   │   ├── controller/    # 认证控制器
│       │   │   │   ├── service/       # 认证服务
│       │   │   │   │   └── impl/
│       │   │   │   └── dto/           # 认证DTO
│       │   │   │
│       │   │   ├── user/              # 用户模块
│       │   │   │   ├── controller/    # 用户控制器
│       │   │   │   ├── service/       # 用户服务
│       │   │   │   │   └── impl/
│       │   │   │   ├── mapper/        # 用户Mapper
│       │   │   │   ├── entity/        # 用户实体
│       │   │   │   └── dto/           # 用户DTO
│       │   │   │
│       │   │   ├── role/              # 角色权限模块
│       │   │   │   ├── controller/
│       │   │   │   ├── service/
│       │   │   │   │   └── impl/
│       │   │   │   ├── mapper/
│       │   │   │   ├── entity/
│       │   │   │   └── dto/
│       │   │   │
│       │   │   ├── dept/              # 组织架构模块
│       │   │   │   ├── controller/
│       │   │   │   ├── service/
│       │   │   │   │   └── impl/
│       │   │   │   ├── mapper/
│       │   │   │   ├── entity/
│       │   │   │   └── dto/
│       │   │   │
│       │   │   └── config/            # 系统配置模块
│       │   │       ├── controller/
│       │   │       ├── service/
│       │   │       │   └── impl/
│       │   │       ├── mapper/
│       │   │       ├── entity/
│       │   │       └── dto/
│       │   │
│       │   ├── common/                # 模块内通用
│       │   │   ├── enums/             # 全局枚举
│       │   │   └── config/            # 全局配置
│       │   │
│       │   └── SystemApplication.java # 启动类
│       │
│       ├── src/main/resources/
│       │   ├── mapper/                # XML映射文件
│       │   │   ├── user/
│       │   │   ├── role/
│       │   │   ├── dept/
│       │   │   └── config/
│       │   └── application.yml
│       │
│       └── pom.xml
│
├── linsir-api/                        # API接口定义
│   └── linsir-api-system/             # System服务API
│       ├── src/main/java/com/linsir/api/system/
│       │   ├── dto/                   # 数据传输对象
│       │   │   ├── auth/              # 认证相关DTO
│       │   │   ├── user/              # 用户相关DTO
│       │   │   ├── role/              # 角色权限DTO
│       │   │   └── dept/              # 组织架构DTO
│       │   ├── feign/                 # Feign接口(供其他服务调用)
│       │   ├── constants/             # 常量
│       │   └── enums/                 # 枚举
│       └── pom.xml
│
└── pom.xml                            # 根父POM

3.2 模块依赖关系 ​

┌─────────────────────────────────────────────────────────────┐
│                        模块依赖图                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  linsir-cloud-system/                                       │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                                                     │   │
│  │  ┌─────────────────┐    ┌─────────────────┐        │   │
│  │  │  linsir-server  │    │   linsir-api    │        │   │
│  │  │                 │    │                 │        │   │
│  │  │  ┌───────────┐  │    │  ┌───────────┐  │        │   │
│  │  │  │  Gateway  │  │    │  │   DTO     │  │        │   │
│  │  │  │  (网关)   │  │    │  │  Feign    │  │        │   │
│  │  │  └───────────┘  │    │  │  常量     │  │        │   │
│  │  │                 │    │  └───────────┘  │        │   │
│  │  │  ┌───────────┐  │    │                 │        │   │
│  │  │  │  System   │  │    │  (供其他服务   │        │   │
│  │  │  │  (唯一    │◀─┼────┤   依赖调用)    │        │   │
│  │  │  │  服务)    │  │    │                 │        │   │
│  │  │  └─────┬─────┘  │    └─────────────────┘        │   │
│  │  │        │        │                                 │   │
│  │  │        │ 依赖   │                                 │   │
│  │  │        ▼        │                                 │   │
│  │  │  ┌───────────┐  │                                 │   │
│  │  │  │  Common   │  │                                 │   │
│  │  │  │ (通用模块)│  │                                 │   │
│  │  │  └───────────┘  │                                 │   │
│  │  │                 │                                 │   │
│  │  └─────────────────┘                                 │   │
│  │                                                     │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  说明:除网关外,只有一个System服务(包含认证/用户/权限/组织)│
│                                                             │
└─────────────────────────────────────────────────────────────┘

3.3 职责划分 ​

模块职责说明
Gateway网关服务路由、限流、认证、日志
System唯一业务服务认证、用户、角色权限、组织架构、系统配置
API接口定义DTO、Feign接口、常量、枚举(供其他服务调用)
Common通用模块Core、Mybatis、Security、Redis、Log

设计原则:

  • 单一服务:除网关外,只有一个System服务,避免微服务划分过小
  • 模块内聚:System服务内部按模块划分(auth/user/role/dept/config)
  • API独立:DTO和Feign接口单独维护,供其他服务依赖
  • 服务间调用:通过Feign调用System服务,依赖API模块

4. 分层架构 ​

4.1 分层设计 ​

┌─────────────────────────────────────────────────────────────┐
│                      分层架构设计                            │
├─────────────────────────────────────────────────────────────┤
│  Controller层                                                │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ • 接收请求参数                                       │   │
│  │ • 调用Service层                                      │   │
│  │ • 返回统一响应                                       │   │
│  │ • 参数校验(@Valid)                                 │   │
│  │ • 权限注解(@PreAuthorize)                          │   │
│  └─────────────────────────────────────────────────────┘   │
├─────────────────────────────────────────────────────────────┤
│  Service层                                                   │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ • 业务逻辑处理                                       │   │
│  │ • 事务管理(@Transactional)                         │   │
│  │ • 调用Mapper层                                       │   │
│  │ • 调用其他Service                                    │   │
│  │ • 数据转换(DTO/VO)                                 │   │
│  └─────────────────────────────────────────────────────┘   │
├─────────────────────────────────────────────────────────────┤
│  Mapper层                                                    │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ • 数据访问接口                                       │   │
│  │ • 继承BaseMapper                                     │   │
│  │ • 自定义SQL(XML或注解)                             │   │
│  │ • 分页查询                                           │   │
│  └─────────────────────────────────────────────────────┘   │
├─────────────────────────────────────────────────────────────┤
│  Entity层                                                    │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ • 数据库实体类                                       │   │
│  │ • 继承BaseEntity                                     │   │
│  │ • 字段映射(@TableField)                            │   │
│  │ • 逻辑删除(@TableLogic)                            │   │
│  └─────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘

4.2 代码示例 ​

Controller层 ​

java
@RestController
@RequestMapping("/system/user")
@Tag(name = "用户管理", description = "用户管理相关接口")
@RequiredArgsConstructor
public class UserController {

    private final UserService userService;

    @GetMapping("/list")
    @Operation(summary = "获取用户列表")
    @PreAuthorize("@ss.hasPermi('system:user:list')")
    public Result<PageResult<UserVO>> list(UserQuery query) {
        return Result.success(userService.list(query));
    }

    @GetMapping("/{id}")
    @Operation(summary = "获取用户详情")
    @PreAuthorize("@ss.hasPermi('system:user:query')")
    public Result<UserVO> getById(@PathVariable Long id) {
        return Result.success(userService.getById(id));
    }

    @PostMapping
    @Operation(summary = "新增用户")
    @PreAuthorize("@ss.hasPermi('system:user:create')")
    @Log(title = "用户管理", businessType = BusinessType.INSERT)
    public Result<Void> create(@Valid @RequestBody UserCreateDTO dto) {
        userService.create(dto);
        return Result.success();
    }

    @PutMapping("/{id}")
    @Operation(summary = "修改用户")
    @PreAuthorize("@ss.hasPermi('system:user:update')")
    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
    public Result<Void> update(@PathVariable Long id, @Valid @RequestBody UserUpdateDTO dto) {
        userService.update(id, dto);
        return Result.success();
    }

    @DeleteMapping("/{id}")
    @Operation(summary = "删除用户")
    @PreAuthorize("@ss.hasPermi('system:user:delete')")
    @Log(title = "用户管理", businessType = BusinessType.DELETE)
    public Result<Void> delete(@PathVariable Long id) {
        userService.delete(id);
        return Result.success();
    }
}

Service层 ​

java
@Service
@RequiredArgsConstructor
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    private final PasswordEncoder passwordEncoder;
    private final RoleService roleService;
    private final DeptService deptService;

    @Override
    public PageResult<UserVO> list(UserQuery query) {
        // 构建查询条件
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        wrapper.like(StringUtils.isNotBlank(query.getUsername()), User::getUsername, query.getUsername())
               .like(StringUtils.isNotBlank(query.getNickname()), User::getNickname, query.getNickname())
               .eq(query.getStatus() != null, User::getStatus, query.getStatus())
               .eq(query.getDeptId() != null, User::getDeptId, query.getDeptId())
               .orderByDesc(User::getCreateTime);
        
        // 执行分页查询
        Page<User> page = page(new Page<>(query.getPageNum(), query.getPageSize()), wrapper);
        
        // 转换为VO
        List<UserVO> voList = page.getRecords().stream()
                .map(this::convertToVO)
                .collect(Collectors.toList());
        
        return new PageResult<>(page.getTotal(), voList);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void create(UserCreateDTO dto) {
        // 校验用户名唯一性
        if (count(new LambdaQueryWrapper<User>().eq(User::getUsername, dto.getUsername())) > 0) {
            throw new BusinessException("用户名已存在");
        }
        
        // 创建用户
        User user = new User();
        BeanUtils.copyProperties(dto, user);
        user.setPassword(passwordEncoder.encode(dto.getPassword()));
        save(user);
        
        // 保存用户角色关联
        if (CollectionUtils.isNotEmpty(dto.getRoleIds())) {
            roleService.saveUserRoles(user.getId(), dto.getRoleIds());
        }
    }

    private UserVO convertToVO(User user) {
        UserVO vo = new UserVO();
        BeanUtils.copyProperties(user, vo);
        // 填充部门名称
        if (user.getDeptId() != null) {
            vo.setDeptName(deptService.getById(user.getDeptId()).getName());
        }
        return vo;
    }
}

Mapper层 ​

java
@Mapper
public interface UserMapper extends BaseMapper<User> {

    /**
     * 根据用户名查询用户
     */
    User selectByUsername(@Param("username") String username);

    /**
     * 查询用户角色列表
     */
    List<Role> selectRolesByUserId(@Param("userId") Long userId);

    /**
     * 查询用户权限列表
     */
    List<String> selectPermsByUserId(@Param("userId") Long userId);
}
xml
<!-- UserMapper.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.linsir.system.mapper.UserMapper">

    <select id="selectByUsername" resultType="com.linsir.system.entity.User">
        SELECT * FROM sys_user WHERE username = #{username} AND deleted = 0
    </select>

    <select id="selectRolesByUserId" resultType="com.linsir.system.entity.Role">
        SELECT r.* FROM sys_role r
        INNER JOIN sys_user_role ur ON r.id = ur.role_id
        WHERE ur.user_id = #{userId} AND r.deleted = 0
    </select>

    <select id="selectPermsByUserId" resultType="java.lang.String">
        SELECT m.perms FROM sys_menu m
        INNER JOIN sys_role_menu rm ON m.id = rm.menu_id
        INNER JOIN sys_user_role ur ON rm.role_id = ur.role_id
        WHERE ur.user_id = #{userId} AND m.perms IS NOT NULL AND m.deleted = 0
    </select>

</mapper>

Entity层 ​

java
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("sys_user")
public class User extends BaseEntity {

    private static final long serialVersionUID = 1L;

    /** 用户名 */
    @TableField("username")
    private String username;

    /** 密码 */
    @TableField("password")
    private String password;

    /** 昵称 */
    @TableField("nickname")
    private String nickname;

    /** 邮箱 */
    @TableField("email")
    private String email;

    /** 手机号 */
    @TableField("mobile")
    private String mobile;

    /** 头像 */
    @TableField("avatar")
    private String avatar;

    /** 部门ID */
    @TableField("dept_id")
    private Long deptId;

    /** 状态(0正常 1停用) */
    @TableField("status")
    private Integer status;

    /** 逻辑删除 */
    @TableLogic
    @TableField("deleted")
    private Integer deleted;
}

5. 安全设计 ​

5.1 认证授权架构 ​

┌─────────────────────────────────────────────────────────────┐
│                      认证授权架构                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌──────────────┐                                           │
│  │    客户端     │                                           │
│  └──────┬───────┘                                           │
│         │ 1. 登录请求(username/password)                   │
│         ▼                                                   │
│  ┌──────────────┐     ┌──────────────┐                     │
│  │    Auth      │────▶│    User      │                     │
│  │   Service    │     │   Service    │                     │
│  └──────┬───────┘     └──────────────┘                     │
│         │ 2. 生成JWT Token                                   │
│         ▼                                                   │
│  ┌──────────────┐                                           │
│  │    客户端     │◀─── Token                                  │
│  └──────┬───────┘                                           │
│         │ 3. 业务请求(Authorization: Bearer token)         │
│         ▼                                                   │
│  ┌──────────────┐     ┌──────────────┐     ┌──────────────┐│
│  │   Gateway    │────▶│ JWT Filter   │────▶│  Permission  ││
│  │              │     │  验证Token   │     │   鉴权       ││
│  └──────────────┘     └──────────────┘     └──────────────┘│
│                                                            │
└─────────────────────────────────────────────────────────────┘

5.2 JWT认证实现 ​

java
@Component
@RequiredArgsConstructor
public class JwtTokenProvider {

    @Value("${jwt.secret}")
    private String jwtSecret;

    @Value("${jwt.expiration}")
    private long jwtExpiration;

    private final RedisTemplate<String, String> redisTemplate;

    /**
     * 生成Token
     */
    public String generateToken(UserDetails userDetails) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("username", userDetails.getUsername());
        claims.put("roles", userDetails.getAuthorities().stream()
                .map(GrantedAuthority::getAuthority)
                .collect(Collectors.toList()));

        String token = Jwts.builder()
                .setClaims(claims)
                .setSubject(userDetails.getUsername())
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + jwtExpiration))
                .signWith(SignatureAlgorithm.HS512, jwtSecret)
                .compact();

        // 存储到Redis
        redisTemplate.opsForValue().set(
                RedisKey.TOKEN_PREFIX + userDetails.getUsername(),
                token,
                jwtExpiration,
                TimeUnit.MILLISECONDS
        );

        return token;
    }

    /**
     * 验证Token
     */
    public boolean validateToken(String token) {
        try {
            Jwts.parser().setSigningKey(jwtSecret).parseClaimsJws(token);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 从Token获取用户名
     */
    public String getUsernameFromToken(String token) {
        Claims claims = Jwts.parser()
                .setSigningKey(jwtSecret)
                .parseClaimsJws(token)
                .getBody();
        return claims.getSubject();
    }

    /**
     * 刷新Token
     */
    public String refreshToken(String token) {
        String username = getUsernameFromToken(token);
        // 重新生成Token
        // ...
        return newToken;
    }
}

5.3 权限控制 ​

java
@Component("ss")
@RequiredArgsConstructor
public class PermissionService {

    private final RedisTemplate<String, Object> redisTemplate;

    /**
     * 判断是否有权限
     */
    public boolean hasPermi(String permission) {
        if (StringUtils.isEmpty(permission)) {
            return false;
        }
        
        LoginUser loginUser = SecurityUtils.getLoginUser();
        if (loginUser == null || CollectionUtils.isEmpty(loginUser.getPermissions())) {
            return false;
        }
        
        return loginUser.getPermissions().contains(permission);
    }

    /**
     * 判断是否有任意权限
     */
    public boolean hasAnyPermi(String... permissions) {
        if (permissions == null || permissions.length == 0) {
            return false;
        }
        
        LoginUser loginUser = SecurityUtils.getLoginUser();
        if (loginUser == null || CollectionUtils.isEmpty(loginUser.getPermissions())) {
            return false;
        }
        
        return Arrays.stream(permissions)
                .anyMatch(p -> loginUser.getPermissions().contains(p));
    }

    /**
     * 判断是否有角色
     */
    public boolean hasRole(String role) {
        if (StringUtils.isEmpty(role)) {
            return false;
        }
        
        LoginUser loginUser = SecurityUtils.getLoginUser();
        if (loginUser == null || CollectionUtils.isEmpty(loginUser.getRoles())) {
            return false;
        }
        
        return loginUser.getRoles().contains(role);
    }
}

5.4 接口安全 ​

java
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {

    private final JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint;
    private final JwtAccessDeniedHandler jwtAccessDeniedHandler;
    private final JwtTokenFilter jwtTokenFilter;

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            // 禁用CSRF(使用JWT不需要)
            .csrf(csrf -> csrf.disable())
            
            // 配置异常处理
            .exceptionHandling(exception -> exception
                .authenticationEntryPoint(jwtAuthenticationEntryPoint)
                .accessDeniedHandler(jwtAccessDeniedHandler)
            )
            
            // 配置会话管理(无状态)
            .sessionManagement(session -> session
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            )
            
            // 配置请求授权
            .authorizeHttpRequests(auth -> auth
                // 放行登录接口
                .requestMatchers("/auth/login").permitAll()
                // 放行Swagger文档
                .requestMatchers("/swagger-ui/**", "/v3/api-docs/**").permitAll()
                // 其他请求需要认证
                .anyRequest().authenticated()
            )
            
            // 添加JWT过滤器
            .addFilterBefore(jwtTokenFilter, UsernamePasswordAuthenticationFilter.class);

        return http.build();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

6. 异常处理 ​

6.1 全局异常处理 ​

java
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public Result<Void> handleBusinessException(BusinessException e) {
        log.warn("业务异常: {}", e.getMessage());
        return Result.error(e.getCode(), e.getMessage());
    }

    /**
     * 参数校验异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result<Void> handleValidationException(MethodArgumentNotValidException e) {
        String message = e.getBindingResult().getFieldErrors().stream()
                .map(error -> error.getField() + ": " + error.getDefaultMessage())
                .collect(Collectors.joining(", "));
        log.warn("参数校验失败: {}", message);
        return Result.error(400, message);
    }

    /**
     * 权限不足异常
     */
    @ExceptionHandler(AccessDeniedException.class)
    public Result<Void> handleAccessDeniedException(AccessDeniedException e) {
        log.warn("权限不足: {}", e.getMessage());
        return Result.error(403, "权限不足,无法访问");
    }

    /**
     * 其他异常
     */
    @ExceptionHandler(Exception.class)
    public Result<Void> handleException(Exception e) {
        log.error("系统异常: ", e);
        return Result.error(500, "系统繁忙,请稍后重试");
    }
}

7. 日志设计 ​

7.1 操作日志 ​

java
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {
    /**
     * 模块
     */
    String title() default "";

    /**
     * 功能
     */
    BusinessType businessType() default BusinessType.OTHER;

    /**
     * 是否保存请求参数
     */
    boolean isSaveRequestData() default true;

    /**
     * 是否保存响应参数
     */
    boolean isSaveResponseData() default true;
}
java
@Aspect
@Component
@RequiredArgsConstructor
@Slf4j
public class LogAspect {

    private final AsyncLogService asyncLogService;

    @Around("@annotation(logAnnotation)")
    public Object around(ProceedingJoinPoint point, Log logAnnotation) throws Throwable {
        long startTime = System.currentTimeMillis();
        
        // 执行方法
        Object result = point.proceed();
        
        long costTime = System.currentTimeMillis() - startTime;
        
        // 异步保存日志
        asyncLogService.saveLog(point, logAnnotation, result, costTime);
        
        return result;
    }
}

8. 相关文档 ​


9. 修订记录 ​

版本日期作者变更内容
1.02026-03-08架构师初始版本,定义后端技术架构

Released under the MIT License.