后端代码结构
SurveyKing Pro 后端采用 Spring Boot 2.7.7 + MyBatis Plus 3.5.2 + Redis + Redisson 技术栈,基于模块化单体架构设计,提供企业级应用框架。
🛠️ 技术栈概览
基于实际项目配置的核心技术栈:
- 应用框架: Spring Boot 2.7.7
- 数据库: MySQL 5.7/8.0+、支持 Oracle、PostgreSQL、达梦 DM 等
- 数据访问: MyBatis Plus 3.5.2 + Druid 1.2.13
- 缓存方案: Redis 5.0 + Redisson 3.17.7
- 安全框架: Spring Security 5.6.5 + OAuth2 Token
- 定时任务: Quartz 2.3.2
- 接口文档: Knife4j 3.0.3 (Swagger 增强)
- 服务保障: Resilience4j 1.7.1 (限流、熔断)
- 监控系统: Spring Boot Admin 2.6.9 + SkyWalking 8.5.0
- 工具库: Hutool 5.8.8、MapStruct 1.5.5、Lombok 1.18.24
📁 项目目录结构
基于实际的项目模块结构:
server/
├── surveyking-dependencies/ # Maven 依赖版本管理
│ └── pom.xml # BOM 统一依赖版本 (577行)
├── surveyking-framework/ # 框架技术组件 (25个模块)
│ ├── surveyking-common/ # 通用组件
│ ├── surveyking-spring-boot-starter-web/ # Web 框架封装
│ ├── surveyking-spring-boot-starter-security/ # 安全认证框架
│ ├── surveyking-spring-boot-starter-mybatis/ # 数据库操作框架
│ ├── surveyking-spring-boot-starter-redis/ # Redis 缓存框架
│ ├── surveyking-spring-boot-starter-mq/ # 消息队列框架
│ ├── surveyking-spring-boot-starter-job/ # 定时任务框架
│ ├── surveyking-spring-boot-starter-file/ # 文件操作框架
│ ├── surveyking-spring-boot-starter-excel/ # Excel 处理框架
│ ├── surveyking-spring-boot-starter-captcha/ # 验证码框架
│ ├── surveyking-spring-boot-starter-monitor/ # 监控框架
│ ├── surveyking-spring-boot-starter-test/ # 测试框架
│ ├── surveyking-spring-boot-starter-banner/ # 启动横幅
│ ├── surveyking-spring-boot-starter-word/ # Word 文档处理
│ ├── surveyking-spring-boot-starter-spss/ # SPSS 数据处理
│ ├── surveyking-spring-boot-starter-elasticsearch/ # 搜索引擎
│ ├── surveyking-spring-boot-starter-ocr/ # OCR 识别
│ ├── surveyking-spring-boot-starter-translation/ # 翻译服务
│ └── surveyking-spring-boot-starter-biz-*/ # 业务组件库
│ ├── biz-operatelog/ # 操作日志
│ ├── biz-dict/ # 字典管理
│ ├── biz-sms/ # 短信服务
│ ├── biz-weixin/ # 微信集成
│ ├── biz-social/ # 社交登录
│ ├── biz-data-permission/ # 数据权限
│ └── biz-error-code/ # 错误码管理
├── surveyking-module-system/ # 系统功能模块
│ ├── surveyking-module-system-api/ # 系统模块API定义
│ └── surveyking-module-system-biz/ # 系统模块具体实现
├── surveyking-module-survey/ # 问卷功能模块
│ ├── surveyking-module-survey-api/ # 问卷模块API定义
│ └── surveyking-module-survey-biz/ # 问卷模块具体实现
├── surveyking-module-infra/ # 基础设施模块
│ ├── surveyking-module-infra-api/ # 基础设施API定义
│ └── surveyking-module-infra-biz/ # 基础设施具体实现
├── surveyking-module-report/ # 报表功能模块
│ ├── surveyking-module-report-api/ # 报表模块API定义
│ └── surveyking-module-report-biz/ # 报表模块具体实现
├── surveyking-module-wechat-enterprise/ # 企业微信模块
├── surveyking-module-ai/ # AI 功能模块
├── surveyking-module-poster/ # 海报生成模块
├── surveyking-module-dbsync/ # 数据同步模块
├── surveyking-server/ # 主应用服务器
│ ├── src/main/java/ # Java 源码
│ ├── src/main/resources/ # 配置资源
│ │ ├── application.yml # 应用配置
│ │ ├── application-dev.yml # 开发环境配置
│ │ └── application-prod.yml # 生产环境配置
│ ├── Dockerfile # Docker 构建文件
│ └── pom.xml # 服务器依赖配置
├── surveyking-example/ # 示例项目
│ ├── surveyking-sso-demo-by-code/ # SSO 授权码示例
│ └── surveyking-sso-demo-by-password/ # SSO 密码示例
├── sql/ # 数据库脚本
├── bin/ # 部署脚本
├── Jenkinsfile # Jenkins 持续集成
└── pom.xml # 父 POM 配置
🏗️ 模块化架构设计
📦 模块分层架构
1. Dependencies 层
- surveyking-dependencies: Maven BOM,统一管理所有依赖版本
- 避免依赖冲突,确保版本一致性
- 包含 Spring Boot、数据库、缓存、工具类等 40+ 个主要依赖
2. Framework 层 (25 个技术组件)
核心技术组件:
- web: Web 框架封装,全局异常处理、访问日志、跨域配置
- security: 认证授权框架,基于 Spring Security + JWT
- mybatis: 数据库操作框架,基于 MyBatis Plus + 多数据源
- redis: 缓存框架,基于 Redis + Redisson 分布式锁
- mq: 消息队列框架,基于 Redis Stream 实现
- job: 定时任务框架,基于 Quartz 集群调度
功 能技术组件:
- file: 文件服务,支持本地、MinIO、阿里云 OSS 等
- excel: Excel 处理,基于 EasyExcel 导入导出
- captcha: 验证码服务,支持图形、滑块验证
- monitor: 系统监控,集成 Spring Boot Admin
- word: Word 文档处理,支持模板生成
- spss: SPSS 数据分析集成
- elasticsearch: 搜索引擎集成
- ocr: OCR 文字识别服务
- translation: 翻译服务集成
业务技术组件:
- biz-operatelog: 操作日志记录
- biz-dict: 字典数据管理
- biz-sms: 短信服务,支持阿里云、腾讯云
- biz-weixin: 微信生态集成
- biz-social: 社交登录,支持第三方登录
- biz-data-permission: 数据权限控制
- biz-error-code: 统一错误码管理
3. Module 层 (业务模块)
每个业务模块采用 API + BIZ 分层设计:
// API 模块职责
- 定义接口契约 (Controller Interface)
- 定义数据传输对象 (DTO/VO)
- 定义业务异常
- 定义常量枚举
// BIZ 模块职责
- 具体业务实现 (Controller/Service/Mapper)
- 数据库实体定义 (Entity)
- 业务逻辑处理
- 数据访问层实现
核心业务模块:
- system: 系统管理(用户、角色、权限、字典等)
- survey: 问卷管理(问卷设计、数据收集、统计分析)
- infra: 基础设施(配置、文件、日志、监控等)
- report: 报表中心(数据报表、图形报表)
扩展业务模块:
- wechat-enterprise: 企业微信集成
- ai: AI 功能(智能分析、自动生成等)
- poster: 海报生成服务
- dbsync: 数据同步服务
4. Server 层
- surveyking-server: 主应用启动器,整合所有模块
- 提供统一的应用入口和配置管理
🔄 模块依赖关系
🏗️ 分层架构设计
控制器层 (Controller)
@RestController
@RequestMapping("/survey")
@Slf4j
public class ProjectController {
@Autowired
private ProjectService projectService;
@GetMapping("/page")
@Operation(summary = "获取项目列表")
public CommonResult<PageResult<ProjectRespVO>> getProjects(
@Valid ProjectPageReqVO pageReqVO) {
PageResult<Project> pageResult = projectService.getProjectPage(pageReqVO);
return success(ProjectConvert.INSTANCE.convertPage(pageResult));
}
@PostMapping("/create")
@Operation(summary = "创建项目")
public CommonResult<String> createProject(@Valid @RequestBody ProjectCreateReqVO createReqVO) {
return success(projectService.createProject(createReqVO));
}
}
服务层 (Service)
@Service
@Transactional(rollbackFor = Exception.class)
public class ProjectServiceImpl implements ProjectService {
@Resource
private ProjectMapper projectMapper;
@Override
public PageResult<Project> getProjectPage(ProjectPageReqVO pageReqVO) {
return projectMapper.selectPage(pageReqVO);
}
@Override
public String createProject(ProjectCreateReqVO createReqVO) {
// 数据校验
validateProjectForCreateOrUpdate(null, createReqVO.getName());
// 创建项目
Project project = ProjectConvert.INSTANCE.convert(createReqVO);
project.setStatus(ProjectStatusEnum.DRAFT.getStatus());
projectMapper.insert(project);
return project.getId();
}
}
数据访问层 (Mapper)
@Mapper
public interface ProjectMapper extends BaseMapperX<Project> {
default PageResult<Project> selectPage(ProjectPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<Project>()
.likeIfPresent(Project::getName, reqVO.getName())
.eqIfPresent(Project::getStatus, reqVO.getStatus())
.eqIfPresent(Project::getMode, reqVO.getMode())
.betweenIfPresent(Project::getCreateTime, reqVO.getCreateTime())
.orderByDesc(Project::getId));
}
default List<Project> selectListByUserId(String userId) {
return selectList(new LambdaQueryWrapperX<Project>()
.eq(Project::getCreator, userId)
.eq(Project::getDeleted, false));
}
}
🎯 核心实体设计
基础实体类
@Data
@TableName(value = "survey_project", autoResultMap = true)
@EqualsAndHashCode(callSuper = false)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Project extends BaseDO {
/**
* 项目ID
*/
private String id;
/**
* 项目名称
*/
private String name;
/**
* 语言环境
*/
private String locale;
/**
* 父项目ID,0表示不存在父项目
*/
private String parentId;
/**
* 项目模式:survey问卷 exam考试
*/
private ProjectModeEnum mode;
/**
* 问卷结构 JSON
*/
@TableField(typeHandler = JacksonTypeHandler.class, jdbcType = JdbcType.LONGVARCHAR)
private SurveySchema survey;
/**
* 项目配置 JSON
*/
@TableField(typeHandler = JacksonTypeHandler.class, jdbcType = JdbcType.LONGNVARCHAR)
private ProjectSetting setting;
/**
* 发布状态:1已发布 0未发布
*/
private Integer status;
/**
* 优先级,值越小优先级越高
*/
private Long priority;
}
@Data
public abstract class BaseDO {
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* 最后更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
/**
* 创建者
*/
@TableField(fill = FieldFill.INSERT)
private String creator;
/**
* 更 新者
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updater;
/**
* 是否删除
*/
@TableLogic
private Boolean deleted;
}
🔧 框架特性
1. 统一响应结构
@Data
public class CommonResult<T> {
/**
* 错误码
*/
private Integer code;
/**
* 返回数据
*/
private T data;
/**
* 错误提示
*/
private String msg;
public static <T> CommonResult<T> success(T data) {
CommonResult<T> result = new CommonResult<>();
result.code = GlobalErrorCodeConstants.SUCCESS.getCode();
result.data = data;
result.msg = "操作成功";
return result;
}
}
2. 分页查询支持
@Data
public class PageResult<T> {
/**
* 数据列表
*/
private List<T> list;
/**
* 总数量
*/
private Long total;
/**
* 当前页码
*/
private Long current;
/**
* 每页数量
*/
private Long size;
}
3. 数据权限控制
@DataPermission(
enable = true,
includeRoles = {"admin", "manager"},
excludeRoles = {"guest"}
)
public PageResult<Project> getProjectPage(ProjectPageReqVO pageReqVO) {
// 会自动注入数据权限 SQL
return projectMapper.selectPage(pageReqVO);
}
🚀 开发特性
1. 自动化代码生成
- 基于数据 库表结构生成完整的 CRUD 代码
- 包含 Controller、Service、Mapper、VO 等所有层次
- 支持单元测试代码生成
- 自动生成 Swagger 接口文档
2. 多数据源支持
spring:
datasource:
dynamic:
primary: master
datasource:
master:
url: jdbc:mysql://localhost:3306/surveyking
username: root
password: password
slave:
url: jdbc:mysql://localhost:3306/surveyking_read
username: readonly
password: readonly
3. 分布式锁
@RedissonLock(key = "project:create:#{#createReqVO.name}")
public String createProject(ProjectCreateReqVO createReqVO) {
// 业务逻辑,自动获取分布式锁
return projectService.create(createReqVO);
}
4. 操作日志
@OperateLog(type = PROJECT_CREATE, content = "创建项目:{{#project.name}}")
public String createProject(@LogRecordParam("project") ProjectCreateReqVO createReqVO) {
// 自动记录操作日志
return projectService.create(createReqVO);
}
📊 性能优化
1. 多级缓存
- 本地缓存: 使用 Caffeine 缓存热点数据
- 分布式缓存: 使用 Redis 共享缓存
- 数据库缓存: MyBatis Plus 二级缓存
2. 异步处理
- 基于 Redis Stream 的消息队列
- 异步处理文件上传、邮件发送等耗时操作
- 支持消息重试和死信队列
3. 数据库优化
- 读写分离支持
- 分页查询优化
- SQL 监控和慢查询分析
总结: SurveyKing Pro 后端采用了成熟的企业级架构设计,通过模块化拆分和丰富的技术组件,为复杂的问卷调研业务提供了强大的技 术支撑和开发效率。
下一步: 查看 系统配置 了解详细的配置说明。