Files
campus-activity-system/server/docs/后端开发规范.md

8.7 KiB
Raw Blame History

校园活动组织与报名系统 - 后端开发规范

1. 技术选型

1.1 核心框架

技术 版本 说明
Java 21 LTS版本支持现代语法特性
Spring Boot 3.2.x 主框架
Spring Security 6.x 安全认证框架
MyBatis-Plus 3.5.x ORM框架简化CRUD操作
MySQL 8.0+ 关系型数据库

1.2 工具库

技术 版本 说明
JWT 0.12.x (jjwt) Token认证
ZXing 3.5.x 二维码生成与解析
iText 7.x PDF电子票生成
EasyExcel 3.3.x Excel导出
Knife4j 4.x API文档(基于OpenAPI 3)
Hutool 5.8.x 工具类库
Lombok 1.18.x 简化实体类代码

1.3 项目结构

campus-activity-system/
├── src/main/java/com/campus/activity/
│   ├── CampusActivityApplication.java    # 启动类
│   ├── config/                           # 配置类
│   │   ├── SecurityConfig.java
│   │   ├── MybatisPlusConfig.java
│   │   ├── CorsConfig.java
│   │   └── Knife4jConfig.java
│   ├── controller/                       # 控制器层
│   │   ├── AuthController.java
│   │   ├── ActivityController.java
│   │   ├── RegistrationController.java
│   │   ├── CheckInController.java
│   │   ├── ReviewController.java
│   │   └── StatisticsController.java
│   ├── service/                          # 服务层
│   │   ├── impl/
│   │   └── ...Service.java
│   ├── mapper/                           # 数据访问层
│   ├── entity/                           # 实体类
│   ├── dto/                              # 数据传输对象
│   │   ├── request/                      # 请求DTO
│   │   └── response/                     # 响应DTO
│   ├── vo/                               # 视图对象
│   ├── common/                           # 公共模块
│   │   ├── Result.java                   # 统一响应
│   │   ├── ResultCode.java               # 状态码枚举
│   │   └── PageResult.java               # 分页响应
│   ├── exception/                        # 异常处理
│   │   ├── BusinessException.java
│   │   └── GlobalExceptionHandler.java
│   ├── security/                         # 安全模块
│   │   ├── JwtTokenProvider.java
│   │   ├── JwtAuthenticationFilter.java
│   │   └── UserDetailsServiceImpl.java
│   └── util/                             # 工具类
│       ├── QrCodeUtil.java
│       ├── PdfUtil.java
│       └── ExcelUtil.java
├── src/main/resources/
│   ├── application.yml
│   ├── application-dev.yml
│   ├── application-prod.yml
│   └── mapper/                           # MyBatis XML映射文件
└── pom.xml

2. 编码规范

2.1 命名规范

类命名

  • Controller类XxxController
  • Service接口XxxService
  • Service实现XxxServiceImpl
  • Mapper接口XxxMapper
  • Entity实体Xxx(与表名对应,驼峰命名)
  • DTO类XxxDTOXxxRequest/XxxResponse
  • VO类XxxVO

方法命名

操作 命名规范 示例
新增 save/add/create saveActivity()
删除 remove/delete removeActivity()
修改 update/modify updateActivity()
查询单个 get/find getActivityById()
查询列表 list/find listActivities()
分页查询 page pageActivities()

2.2 统一响应格式

@Data
public class Result<T> {
    private Integer code;
    private String message;
    private T data;
    private Long timestamp;

    public static <T> Result<T> success(T data) {
        Result<T> result = new Result<>();
        result.setCode(200);
        result.setMessage("success");
        result.setData(data);
        result.setTimestamp(System.currentTimeMillis());
        return result;
    }

    public static <T> Result<T> error(Integer code, String message) {
        Result<T> result = new Result<>();
        result.setCode(code);
        result.setMessage(message);
        result.setTimestamp(System.currentTimeMillis());
        return result;
    }
}

2.3 状态码定义

状态码 说明
200 成功
400 请求参数错误
401 未认证
403 无权限
404 资源不存在
409 业务冲突(如已报名、时间冲突)
500 服务器内部错误

2.4 分页响应格式

@Data
public class PageResult<T> {
    private List<T> records;
    private Long total;
    private Long pages;
    private Long current;
    private Long size;
}

3. 安全规范

3.1 JWT Token设计

  • Access Token有效期2小时
  • Refresh Token有效期7天
  • Token存储位置前端localStorage或Cookie(httpOnly)

3.2 接口权限控制

// 使用注解控制接口权限
@PreAuthorize("hasRole('ADMIN')")      // 仅管理员
@PreAuthorize("hasRole('STUDENT')")    // 仅学生
@PreAuthorize("isAuthenticated()")     // 已登录用户

3.3 密码安全

  • 使用BCrypt加密存储
  • 密码强度至少8位包含字母和数字

4. 接口设计规范

4.1 RESTful API规范

操作 HTTP方法 URL示例
创建 POST /api/activities
查询 GET /api/activities/{id}
更新 PUT /api/activities/{id}
删除 DELETE /api/activities/{id}
列表 GET /api/activities

4.2 URL命名规范

  • 使用小写字母和连字符
  • 使用复数名词表示资源集合
  • 版本号放在URL中/api/v1/...

4.3 请求参数规范

查询参数示例

GET /api/activities?status=1&page=1&size=10&keyword=运动

请求体示例

{
    "name": "校园篮球赛",
    "description": "年度篮球比赛",
    "startTime": "2025-06-01 09:00:00",
    "endTime": "2025-06-01 17:00:00",
    "location": "体育馆",
    "maxParticipants": 100
}

5. 日志规范

5.1 日志级别使用

  • ERROR系统错误需要立即处理
  • WARN警告信息潜在问题
  • INFO重要业务操作日志
  • DEBUG调试信息生产环境关闭

5.2 日志格式

logging:
  pattern:
    console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"

6. 数据校验规范

使用Jakarta Validation进行参数校验

@Data
public class ActivityCreateRequest {
    @NotBlank(message = "活动名称不能为空")
    @Size(max = 100, message = "活动名称不能超过100个字符")
    private String name;

    @NotNull(message = "开始时间不能为空")
    @Future(message = "开始时间必须是未来时间")
    private LocalDateTime startTime;

    @NotNull(message = "结束时间不能为空")
    private LocalDateTime endTime;

    @Min(value = 1, message = "人数上限至少为1")
    @Max(value = 10000, message = "人数上限不能超过10000")
    private Integer maxParticipants;
}

7. 异常处理规范

7.1 自定义业务异常

@Getter
public class BusinessException extends RuntimeException {
    private final Integer code;

    public BusinessException(Integer code, String message) {
        super(message);
        this.code = code;
    }
}

7.2 全局异常处理

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(BusinessException.class)
    public Result<?> handleBusinessException(BusinessException e) {
        return Result.error(e.getCode(), e.getMessage());
    }

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result<?> handleValidationException(MethodArgumentNotValidException e) {
        String message = e.getBindingResult().getFieldErrors().stream()
            .map(FieldError::getDefaultMessage)
            .collect(Collectors.joining(", "));
        return Result.error(400, message);
    }
}

8. 开发环境配置

8.1 application.yml 示例

server:
  port: 8080

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/campus_activity?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: root
    password: ${DB_PASSWORD}

  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: Asia/Shanghai

mybatis-plus:
  mapper-locations: classpath:/mapper/**/*.xml
  global-config:
    db-config:
      id-type: auto
      logic-delete-field: deleted
      logic-delete-value: 1
      logic-not-delete-value: 0
  configuration:
    map-underscore-to-camel-case: true

jwt:
  secret: ${JWT_SECRET}
  expiration: 7200000
  refresh-expiration: 604800000