在使用 MyBatis-Flex 进行项目开发时,合理地处理用户日志相关操作对于系统的监控、管理和分析至关重要。本文将详细介绍如何在 MyBatis-Flex 项目中实现用户日志的关联查询功能,包括创建数据结构、编写业务逻辑以及进行测试等环节。
(一)创建关联数据结构
(1)创建 UserinfoHaveLogsVO
为了实现一个管理员对应多个操作日志的关联查询,首先创建了 UserHaveLogsVo 类。该类使用了 Lombok 的 @Data 注解来自动生成 getters 和 setters 方法,简化代码编写。
一个用户对应多个操作日志,所以需要用list列表来装userinfolog
具体代码:
package com.qzimp.fujiancuo.entity.vo;
import com.qzimp.fujiancuo.entity.UserinfoLog;
import lombok.Data;
import java.util.List;
@Data
public class UserinfoHaveLogsVo {
private String loginName;
private List<UserinfoLog> userinfoLogList;
}
(2)创建实体类Userinfo和UserinfoLog
Userinfo.java
具体代码:
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("")
@Table(value = "tb_userinfo")
public class Userinfo implements Serializable {
private static final long serialVersionUID = 1L;
@Id(keyType = KeyType.Auto)
@ApiModelProperty("")
private Integer id;
@ApiModelProperty("")
private String loginName;
@ApiModelProperty("")
private String password;
@ApiModelProperty("")
private String email;
@ApiModelProperty("")
private String salt;
@ApiModelProperty("")
private String headerPic;
@ApiModelProperty("")
private String token;
}
UserinfoLog.java
具体代码:
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("")
@Table(value = "tb_userinfo_log")
public class UserinfoLog implements Serializable {
private static final long serialVersionUID = 1L;
@Id(keyType = KeyType.Auto)
@ApiModelProperty("")
private Integer id;
@ApiModelProperty("")
private String log;
@ApiModelProperty("")
private Integer userinfoId;
@ApiModelProperty("")
private LocalDateTime createTime;
}
两个实体类的数据库表
CREATE TABLE `tb_userinfo` (
`id` int(0) NOT NULL AUTO_INCREMENT,
`login_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`password` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`salt` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`header_pic` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`token` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `ak_login_name`(`login_name`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
CREATE TABLE `tb_userinfo_log` (
`id` int(0) NOT NULL AUTO_INCREMENT,
`log` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`userinfo_id` int(0) NULL DEFAULT NULL,
`create_time` datetime(0) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
(二)实现业务逻辑
(1)controller层
在 UserinfoController类中创建了getUserHaveLogs方法,该方法接收一个LoginName参数,用于指定要查询的用户名。方法内部直接调用userinfoService的queryUserHaveLogs方法,并返回查询结果。
具体代码:
@GetMapping("getUserinfoHaveLogs")
public UserinfoHaveLogsVo getUserinfoHaveLogs(String loginName){
return userinfoService.queryUserinfoHaveLogs(loginName);
}
(2)service层
在 UserinfoService 接口中定义了 queryUserHaveLogs 方法,用于实现根据用户登录名查询相关用户日志信息的业务逻辑。
具体代码:
public interface UserinfoService extends IService<Userinfo> {
/**
* 通过账户获取用户实例
* @return 用户实例
*/
UserinfoHaveLogsVo queryUserinfoHaveLogs(String loginName);
Userinfo queryUserinfoByName(String loginName);
}
在 UserinfoLogService接口中定义了 queryUserinfoLogs 方法获取与该用户相关的日志信息列表。
具体代码:
public interface UserinfoLogService extends IService<UserinfoLog> {
List<UserinfoLog> queryUserinfoLogs(Integer userinfoId);
}
(3)service的实现方法(imp)
在 UserinfoServiceImpl 类中实现 queryUserHaveLogs 方法。首先,通过调用 queryUserinfoByName 方法,根据传入的 LoginName 获取用户信息。如果获取到的用户信息为空,则抛出一个自定义异常,表示用户账户不存在。
具体代码:
@Service
public class UserinfoServiceImpl extends ServiceImpl<UserinfoMapper, Userinfo> implements UserinfoService {
@Autowired
private UserinfoMapper userinfoMapper;
@Autowired
private UserinfoLogService userinfoLogService;
@Override
public UserinfoHaveLogsVo queryUserinfoHaveLogs(String loginName) {
//获取用户信息通过用户账号
Userinfo userinfo=this.queryUserinfoByName(loginName);
if (userinfo==null){
throw new ApiException(ResultCode.CUSTOM_ERROR,"用户信息账号不存在");
}
//通过用户编号获取日志信息
List<UserinfoLog> logList=userinfoLogService.queryUserinfoLogs(userinfo.getId());
//把所有的信息放在包装.setUserinfoName
UserinfoHaveLogsVo userinfoHaveLogsVo=new UserinfoHaveLogsVo();
userinfoHaveLogsVo.setLoginName(loginName);
userinfoHaveLogsVo.setUserinfoLogList(logList);
return userinfoHaveLogsVo;
}
@Override
public Userinfo queryUserinfoByName(String loginName) {
QueryWrapper queryWrapper=new QueryWrapper();
queryWrapper.eq("login_name",loginName);
return userinfoMapper.selectOneByQuery(queryWrapper);
}
}
创建 UserinfoLogServiceImpl 类并实现了 queryUserinfoLogs 方法,根据用户编号查询对应的用户日志信息,并将结果封装为列表返回。
具体代码:
@Service
public class UserinfoLogServiceImpl extends ServiceImpl<UserinfoLogMapper, UserinfoLog> implements UserinfoLogService {
@Autowired
private UserinfoLogMapper userinfoLogMapper;
@Override
public List<UserinfoLog> queryUserinfoLogs(Integer userinfoId) {
QueryWrapper queryWrapper=new QueryWrapper();
queryWrapper.eq("userinfo_id",userinfoId);
return userinfoLogMapper.selectListByQuery(queryWrapper);
}
}
(三)进行测试
数据库要有数据
通过用户名查询该用户日志信息
当用户名不存在:
(四)总结
通过以上步骤,成功实现了 MyBatis-Flex 项目中的用户日志关联查询功能。这种功能在实际应用中可以帮助管理员或系统运维人员快速了解特定用户的操作历史,便于监控系统使用情况、排查问题以及进行数据分析等工作。在后续的开发中,可以进一步优化查询性能、完善日志记录内容以及增强系统的安全性和稳定性等方面的工作。