package com.yf.exam.modules.sys.user.service.impl; // 导入阿里巴巴的 FastJSON 库,用于 JSON 数据的序列化和反序列化 import com.alibaba.fastjson.JSON; // 导入 FastJSON 的 TypeReference 类,用于处理泛型类型的 JSON 反序列化 import com.alibaba.fastjson.TypeReference; // 导入 MyBatis-Plus 的查询条件构造器类,用于构建数据库查询条件 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; // 导入 MyBatis-Plus 的分页元数据接口,用于表示分页查询的结果 import com.baomidou.mybatisplus.core.metadata.IPage; // 导入 MyBatis-Plus 的分页实现类,用于创建分页对象 import com.baomidou.mybatisplus.extension.plugins.pagination.Page; // 导入 MyBatis-Plus 的服务实现基类,提供了通用的服务层方法实现 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; // 导入系统用户角色数据传输对象类,用于在不同层之间传输用户角色相关的数据 import com.yf.exam.modules.sys.user.dto.SysUserRoleDTO; // 导入系统用户角色实体类,用于映射数据库中的用户角色表 import com.yf.exam.modules.sys.user.entity.SysUserRole; // 导入系统用户角色数据访问接口,用于与数据库进行用户角色数据的交互 import com.yf.exam.modules.sys.user.mapper.SysUserRoleMapper; // 导入系统用户角色服务接口,定义了用户角色相关的业务方法 import com.yf.exam.modules.sys.user.service.SysUserRoleService; // 导入分页请求数据传输对象类,用于封装分页查询的请求参数 import com.yf.exam.core.api.dto.PagingReqDTO; // 导入 Spring 的服务注解,将该类标记为一个服务组件,由 Spring 容器进行管理 import org.springframework.stereotype.Service; // 导入 Spring 的集合工具类,用于判断集合是否为空 import org.springframework.util.CollectionUtils; // 导入 Spring 的字符串工具类,用于判断字符串是否为空 import org.springframework.util.StringUtils; import java.util.ArrayList; import java.util.List; /** *

* 用户角色 服务实现类,实现了用户角色相关的业务逻辑。 * 继承自 MyBatis-Plus 的 ServiceImpl 类,使用 SysUserRoleMapper 操作 SysUserRole 实体。 *

* * @author 聪明笨狗 * @since 2020-04-13 16:57 */ @Service public class SysUserRoleServiceImpl extends ServiceImpl implements SysUserRoleService { /** * 分页查询用户角色信息。 * * @param reqDTO 分页请求数据传输对象,包含分页查询的当前页码、每页记录数等信息 * @return 分页查询结果,包含用户角色数据传输对象列表 */ @Override public IPage paging(PagingReqDTO reqDTO) { // 创建分页对象,根据请求中的当前页码和每页记录数初始化 IPage query = new Page<>(reqDTO.getCurrent(), reqDTO.getSize()); // 创建查询条件构造器,用于构建数据库查询条件,当前未添加具体查询条件 QueryWrapper wrapper = new QueryWrapper<>(); // 调用父类的 page 方法进行分页查询,获取包含 SysUserRole 实体的分页结果 IPage page = this.page(query, wrapper); // 将包含 SysUserRole 实体的分页结果转换为 JSON 字符串,再反序列化为包含 SysUserRoleDTO 的分页结果 IPage pageData = JSON.parseObject(JSON.toJSONString(page), new TypeReference>(){}); return pageData; } /** * 根据用户 ID 查询用户的角色列表。 * * @param userId 用户的唯一标识 * @return 用户的角色 ID 列表 */ @Override public List listRoles(String userId) { // 创建查询条件构造器,添加用户 ID 作为查询条件 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(SysUserRole::getUserId, userId); // 调用父类的 list 方法进行查询,获取符合条件的用户角色实体列表 List list = this.list(wrapper); // 初始化一个空的角色 ID 列表 List roles = new ArrayList<>(); // 判断查询结果列表是否不为空 if(!CollectionUtils.isEmpty(list)){ // 遍历用户角色实体列表,将每个实体的角色 ID 添加到角色 ID 列表中 for(SysUserRole item: list){ roles.add(item.getRoleId()); } } return roles; } /** * 保存用户的角色信息,先删除用户原有的所有角色,再添加新的角色。 * * @param userId 用户的唯一标识 * @param ids 新的角色 ID 列表 * @return 保存的角色 ID 以逗号连接的字符串 */ @Override public String saveRoles(String userId, List ids) { // 创建查询条件构造器,添加用户 ID 作为查询条件,用于删除用户原有的所有角色 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(SysUserRole::getUserId, userId); // 调用父类的 remove 方法删除符合条件的用户角色记录 this.remove(wrapper); // 判断新的角色 ID 列表是否不为空 if(!CollectionUtils.isEmpty(ids)){ // 初始化一个空的用户角色实体列表 List list = new ArrayList<>(); // 用于存储以逗号连接的角色 ID 字符串 String roleIds = null; // 遍历新的角色 ID 列表 for(String item: ids){ // 创建一个新的用户角色实体对象 SysUserRole role = new SysUserRole(); // 设置角色 ID role.setRoleId(item); // 设置用户 ID role.setUserId(userId); // 将用户角色实体对象添加到列表中 list.add(role); // 判断 roleIds 是否为空 if(StringUtils.isEmpty(roleIds)){ // 若为空,则直接赋值为当前角色 ID roleIds = item; }else{ // 若不为空,则将当前角色 ID 追加到 roleIds 后面,用逗号分隔 roleIds+=","+item; } } // 调用父类的 saveBatch 方法批量保存用户角色实体列表 this.saveBatch(list); return roleIds; } return ""; } /** * 判断用户是否具有学生角色。 * * @param userId 用户的唯一标识 * @return 若用户具有学生角色返回 true,否则返回 false */ @Override public boolean isStudent(String userId) { // 创建查询条件构造器,添加用户 ID 和角色 ID(student)作为查询条件 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(SysUserRole::getUserId, userId) .eq(SysUserRole::getRoleId, "student"); // 调用父类的 count 方法统计符合条件的记录数,若大于 0 则表示用户具有学生角色 return this.count(wrapper) > 0; } /** * 判断用户是否具有教师角色。 * * @param userId 用户的唯一标识 * @return 若用户具有教师角色返回 true,否则返回 false */ @Override public boolean isTeacher(String userId) { // 创建查询条件构造器,添加用户 ID 和角色 ID(teacher)作为查询条件 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(SysUserRole::getUserId, userId) .eq(SysUserRole::getRoleId, "teacher"); // 调用父类的 count 方法统计符合条件的记录数,若大于 0 则表示用户具有教师角色 return this.count(wrapper) > 0; } /** * 判断用户是否具有管理员角色。 * * @param userId 用户的唯一标识 * @return 若用户具有管理员角色返回 true,否则返回 false */ @Override public boolean isAdmin(String userId) { // 创建查询条件构造器,添加用户 ID 和角色 ID(sa)作为查询条件 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(SysUserRole::getUserId, userId) .eq(SysUserRole::getRoleId, "sa"); // 调用父类的 count 方法统计符合条件的记录数,若大于 0 则表示用户具有管理员角色 return this.count(wrapper) > 0; } }