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;
}
}