一、核心模块与接口概览
1. 议题审核模块
路径前缀:/deliberation/review
核心功能:议题审核流程管理
接口列表:
java
查询待审核列表
GET /deliberation/review/list
获取提议详情
GET /deliberation/review/{proposalId}
审核议题
POST /deliberation/review/audit
2. 议程管理模块
路径:/deliberation/agenda
核心功能:议程全生命周期管理
接口列表:
java
创建议程
POST /deliberation/agenda/add
更新议程
PUT /deliberation/agenda/{agendaId}
删除议程
DELETE /deliberation/agenda/{agendaId}
3. 日志管理模块
java
操作日志
/monitor/operlog
登录日志
/monitor/logininfor
调度日志
/monitor/jobLog
二、RESTful API设计知识点
1. 资源命名规范
使用名词作为资源名称,如proposal(议题)、agenda(议程)、review(审核)
示例:/deliberation/review(审核资源)、/deliberation/agenda(议程资源)
2. HTTP方法与CRUD对应
GET:查询操作,如GET /deliberation/review/list查询待审核列表
POST:新增操作,如POST /deliberation/agenda/add创建议程
PUT:更新操作,如PUT /deliberation/agenda/{id}更新议程
DELETE:删除操作,如DELETE /deliberation/agenda/{id}删除议程
3. 路径参数与查询参数
路径参数:用于标识唯一资源,如/deliberation/review/{proposalId}中的proposalId
查询参数:用于筛选和分页,如/deliberation/review/list?page=1&size=10
三、接口详细说明
1. 议题审核接口
GET /deliberation/review/list:查询待审核列表,支持分页和条件筛选
参数 :page(页码)、size(每页条数)、proposalTitle(标题筛选)
返回:分页后的待审核提议列表
GET /deliberation/review/{proposalId}:获取提议详情
参数 :proposalId(路径参数,议题ID)
返回:议题详细信息,包括标题、内容、提议人、提交时间等
POST /deliberation/review/audit:执行审核操作
请求体 :{ "proposalId": 1, "status": "01", "opinion": "审核通过" }
返回:审核结果
2. 议程管理接口
POST /deliberation/agenda/add:创建议程
请求体 :{ "agendaTitle": "村民大会", "meetingTime": "2026-06-01 14:00:00", "endTime": "2026-06-01 16:00:00", "meetingLocation": "村委会" }
返回:创建的议程信息
PUT /deliberation/agenda/{agendaId}:更新议程
参数 :agendaId(路径参数)
请求体 :包含需要更新的议程字段
返回:更新后的议程信息
DELETE /deliberation/agenda/{agendaId}:删除议程
参数 :agendaId(路径参数)
返回:删除结果
四、Spring Security权限控制知识点
1. @PreAuthorize注解使用
作用:在方法执行前进行权限校验
示例:
java
@PreAuthorize("@ss.hasPermi('deliberation:review:list')")
public AjaxResult list() {
// 查询待审核列表
}
2. 权限校验流程
- 用户请求到达Controller方法
- Spring Security拦截请求
- 执行@PreAuthorize表达式
- 权限通过则执行方法,否则返回403错误
3. 权限配置示例
在SecurityConfig中配置权限规则
使用Ant风格路径匹配,如"/deliberation/review/**"需要审核权限
五、MyBatis数据库操作知识点
1. Mapper接口定义
示例:
java
public interface BizMeetingAgendaMapper {
BizMeetingAgenda selectByPrimaryKey(Long agendaId);
int insert(BizMeetingAgenda record);
int updateByPrimaryKeySelective(BizMeetingAgenda record);
int deleteByPrimaryKey(Long agendaId);
}
2. 动态SQL示例
使用if标签进行条件判断:
XML
<select id="selectList" resultType="BizMeetingAgenda">
SELECT * FROM biz_meeting_agenda
<where>
<if test="agendaTitle != null">AND agenda_title LIKE CONCAT('%', #{agendaTitle}, '%')</if>
<if test="agendaStatus != null">AND agenda_status = #{agendaStatus}</if>
</where>
</select>
3. 分页查询实现
使用PageHelper插件:
java
PageHelper.startPage(pageNum, pageSize);
List<BizMeetingAgenda> list = agendaMapper.selectList(condition);
PageInfo<BizMeetingAgenda> pageInfo = new PageInfo<>(list);
六、状态机模式应用知识点
1. 状态流转设计
议题状态:待审核(00) → 审核通过(01) / 审核驳回(02)
议程状态:草稿(00) → 已发布(01) → 进行中(02) → 已结束(03)
2. 状态校验示例
在审核方法中校验状态:
java
public void audit(Long proposalId, String status) {
BizMeetingProposal proposal = proposalMapper.selectByPrimaryKey(proposalId);
if (!"00".equals(proposal.getProposalStatus())) {
throw new BusinessException("该议题当前状态不允许审核");
}
// 执行审核逻辑
}
3. 状态转换工具方法
前端状态转数据库状态码:
java
public String statusToDb(String frontStatus) {
Map<String, String> mapping = new HashMap<>();
mapping.put("draft", "00");
mapping.put("published", "01");
return mapping.getOrDefault(frontStatus, "00");
}
七、AOP日志切面知识点
1. @Log注解定义
自定义注解用于标记需要记录日志的方法:
java
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {
String title() default "";
String businessType() default "";
}
2. 日志切面实现
使用AOP环绕通知记录操作日志:
java
@Aspect
@Component
public class LogAspect {
@Around("@annotation(com.example.common.annotation.Log)")
public Object around(ProceedingJoinPoint point) throws Throwable {
long beginTime = System.currentTimeMillis();
Object result = point.proceed();
long endTime = System.currentTimeMillis();
saveLog(point, endTime - beginTime);
return result;
}
}
3. 使用示例
java
@Log(title = "审核议题", businessType = "审核")
@PostMapping("/audit")
public AjaxResult audit(@RequestBody AuditDTO dto) {
// 审核逻辑
}
八、事务管理知识点
1. @Transactional注解使用
java
@Transactional(rollbackFor = Exception.class)
public void auditProposal(Long proposalId, String status) {
proposalMapper.updateStatus(proposalId, status);
auditLogMapper.insertLog(proposalId, status);
}
2. 事务回滚示例
java
@Transactional
public void updateAgenda(BizMeetingAgenda agenda) {
agendaMapper.updateByPrimaryKey(agenda);
if (agenda.getEndTime().before(agenda.getMeetingTime())) {
throw new BusinessException("结束时间不能早于开始时间");
}
}
九、统一响应格式知识点
1. AjaxResult封装
java
public class AjaxResult {
private int code;
private String msg;
private Object data;
public static AjaxResult success(Object data) {
return new AjaxResult(200, "操作成功", data);
}
public static AjaxResult error(String msg) {
return new AjaxResult(500, msg, null);
}
}
2. 响应示例
java
{
"code": 200,
"msg": "操作成功",
"data": {
"agendaId": 1,
"agendaTitle": "村民代表大会",
"meetingTime": "2026-06-01 14:00:00"
}
}
十、异常处理知识点
1. 全局异常处理器
java
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BusinessException.class)
public AjaxResult handleBusinessException(BusinessException e) {
return AjaxResult.error(e.getMessage());
}
@ExceptionHandler(Exception.class)
public AjaxResult handleException(Exception e) {
log.error("系统异常", e);
return AjaxResult.error("系统内部错误");
}
}
2. 自定义业务异常
java
public class BusinessException extends RuntimeException {
public BusinessException(String message) {
super(message);
}
}
十一、状态码映射
1. 议题状态
00 - 待审核:议题提交后等待管理员审核
01 - 审核通过:可进入会议讨论环节
02 - 审核驳回:未通过审核
2. 议程状态
00 - 草稿:创建后未发布
01 - 已发布:对外公开可见
02 - 进行中:会议正在召开
03 - 已结束:会议正常结束
04 - 已取消:会议被取消
十二、技术要点总结
1. 分层架构
Controller层:处理HTTP请求,参数校验
Service层:业务逻辑处理,事务管理
Mapper层:数据访问,SQL执行
2. 权限控制
RBAC(基于角色的访问控制)
@PreAuthorize方法级权限校验
3. 状态管理
状态机模式管理状态转换
操作前校验当前状态
4. 日志与监控
AOP统一记录操作日志
定时任务日志监控
5. 异常处理
统一异常响应格式
区分业务异常和系统异常