活动日志系统集成指南
1. 系统概述
活动日志系统用于记录用户在系统中的所有操作行为,包括成功操作和失败操作,便于系统审计、问题排查和用户行为分析。
2. 已创建的文件
2.1 后端文件
entity/ActivityLog.java
- 活动日志实体类
mapper/ActivityLogMapper.java
- 数据访问层接口
service/ActivityLogService.java
- 业务层接口
service/impl/ActivityLogServiceImpl.java
- 业务层实现
controller/ActivityLogController.java
- 控制器层
utils/ActivityLogUtil.java
- 工具类
sql/activity_log.sql
- 数据库建表脚本
2.2 数据库表结构
CREATE TABLE `activity_log` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',`user_id` varchar(50) DEFAULT NULL COMMENT '用户ID',`username` varchar(100) DEFAULT NULL COMMENT '用户名',`module` varchar(50) NOT NULL COMMENT '操作模块',`action` varchar(50) NOT NULL COMMENT '操作动作',`description` varchar(500) DEFAULT NULL COMMENT '操作描述',`target_id` varchar(50) DEFAULT NULL COMMENT '操作对象ID',`target_type` varchar(50) DEFAULT NULL COMMENT '操作对象类型',`old_data` text COMMENT '操作前数据',`new_data` text COMMENT '操作后数据',`ip_address` varchar(50) DEFAULT NULL COMMENT 'IP地址',`user_agent` varchar(500) DEFAULT NULL COMMENT '浏览器信息',`status` varchar(20) DEFAULT 'success' COMMENT '操作状态',`error_message` text COMMENT '错误信息',`created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间',`duration` bigint(20) DEFAULT NULL COMMENT '操作耗时(毫秒)',`remark` varchar(500) DEFAULT NULL COMMENT '备注',PRIMARY KEY (`id`),-- 索引省略...
);
3. 使用方法
3.1 在现有Controller中集成日志记录
示例1:OwnerinfoController中添加日志记录
import com.parkingmanage.utils.ActivityLogUtil;@RestController
@RequestMapping("/parking/ownerinfo")
public class OwnerinfoController {@PostMapping("/add")public Result addOwnerinfo(@RequestBody Ownerinfo ownerinfo, HttpServletRequest request) {try {// 获取当前用户信息(从session或token中获取)String userId = getCurrentUserId(request);String username = getCurrentUsername(request);// 执行业务操作boolean success = ownerinfoService.save(ownerinfo);if (success) {// 记录成功日志ActivityLogUtil.logOwnerOperation(userId, username, "添加", "添加车主信息:" + ownerinfo.getOwnername(), ownerinfo.getId().toString());return Result.success("添加成功");} else {// 记录失败日志ActivityLogUtil.logError(userId, username, "车主管理", "添加", "添加车主信息失败:" + ownerinfo.getOwnername(),"数据保存失败");return Result.error("添加失败");}} catch (Exception e) {// 记录异常日志ActivityLogUtil.logError(getCurrentUserId(request), getCurrentUsername(request), "车主管理", "添加", "添加车主信息异常:" + ownerinfo.getOwnername(),e.getMessage());return Result.error("系统异常:" + e.getMessage());}}@PutMapping("/update")public Result updateOwnerinfo(@RequestBody Ownerinfo ownerinfo, HttpServletRequest request) {try {String userId = getCurrentUserId(request);String username = getCurrentUsername(request);// 获取更新前的数据Ownerinfo oldOwnerinfo = ownerinfoService.getById(ownerinfo.getId());// 执行更新操作boolean success = ownerinfoService.updateById(ownerinfo);if (success) {// 记录成功日志(包含操作前后数据对比)ActivityLogUtil.logSuccess(userId, username, "车主管理", "修改", "修改车主信息:" + ownerinfo.getOwnername(),ownerinfo.getId().toString(),"ownerinfo",JSON.toJSONString(oldOwnerinfo), // 操作前数据JSON.toJSONString(ownerinfo) // 操作后数据);return Result.success("修改成功");} else {return Result.error("修改失败");}} catch (Exception e) {ActivityLogUtil.logError(getCurrentUserId(request), getCurrentUsername(request), "车主管理", "修改", "修改车主信息异常",e.getMessage());return Result.error("系统异常:" + e.getMessage());}}@DeleteMapping("/{id}")public Result deleteOwnerinfo(@PathVariable Integer id, HttpServletRequest request) {try {String userId = getCurrentUserId(request);String username = getCurrentUsername(request);// 获取要删除的数据Ownerinfo ownerinfo = ownerinfoService.getById(id);if (ownerinfo == null) {return Result.error("数据不存在");}// 执行删除操作boolean success = ownerinfoService.removeById(id);if (success) {// 记录删除日志ActivityLogUtil.logOwnerOperation(userId, username, "删除", "删除车主信息:" + ownerinfo.getOwnername(), id.toString());return Result.success("删除成功");} else {return Result.error("删除失败");}} catch (Exception e) {ActivityLogUtil.logError(getCurrentUserId(request), getCurrentUsername(request), "车主管理", "删除", "删除车主信息异常",e.getMessage());return Result.error("系统异常:" + e.getMessage());}}// 工具方法:获取当前用户IDprivate String getCurrentUserId(HttpServletRequest request) {// 这里需要根据实际的认证机制来获取用户ID// 可能从session、JWT token、或其他方式获取return "current_user_id"; // 示例值}// 工具方法:获取当前用户名private String getCurrentUsername(HttpServletRequest request) {// 这里需要根据实际的认证机制来获取用户名return "current_username"; // 示例值}
}
3.2 使用工具类的便捷方法
// 记录车主管理操作
ActivityLogUtil.logOwnerOperation(userId, username, "添加", "添加车主", ownerId);// 记录预约管理操作
ActivityLogUtil.logAppointmentOperation(userId, username, "创建", "创建预约", appointmentId);// 记录违规管理操作
ActivityLogUtil.logViolationOperation(userId, username, "处理", "处理违规记录", violationId);// 记录用户管理操作
ActivityLogUtil.logUserOperation(userId, username, "登录", "用户登录", userId);// 记录系统操作
ActivityLogUtil.logSystemOperation(userId, username, "备份", "数据库备份");
4. API接口使用
4.1 查询活动日志
GET /parking/activity-log/page?pageNum=1&pageSize=20&userId=user1&module=车主管理
4.2 统计数据
GET /parking/activity-log/statistics?startTime=2024-01-01 00:00:00&endTime=2024-12-31 23:59:59
4.3 清理过期日志
DELETE /parking/activity-log/clean-expired?days=90
5. 集成步骤
- 执行SQL脚本:在数据库中执行
sql/activity_log.sql
创建表
- 配置依赖:确保项目中有MyBatis-Plus相关依赖
- 集成到现有Controller:按照上述示例在现有Controller中添加日志记录
- 配置用户信息获取:实现获取当前用户ID和用户名的方法
- 测试验证:测试各种操作是否正确记录日志
6. 注意事项
- 性能考虑:日志记录是异步的,不会影响主要业务流程
- 数据量控制:定期清理过期日志,避免表数据过大
- 敏感信息:避免在日志中记录密码等敏感信息
- 异常处理:日志记录失败不应影响主要业务流程
- 索引优化:根据查询需求优化数据库索引