You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
exam/sys/user/service/impl/SysUserRoleServiceImpl.java

201 lines
8.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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;
/**
* <p>
* 用户角色 服务实现类,实现了用户角色相关的业务逻辑。
* 继承自 MyBatis-Plus 的 ServiceImpl 类,使用 SysUserRoleMapper 操作 SysUserRole 实体。
* </p>
*
* @author 聪明笨狗
* @since 2020-04-13 16:57
*/
@Service
public class SysUserRoleServiceImpl extends ServiceImpl<SysUserRoleMapper, SysUserRole> implements SysUserRoleService {
/**
* 分页查询用户角色信息。
*
* @param reqDTO 分页请求数据传输对象,包含分页查询的当前页码、每页记录数等信息
* @return 分页查询结果,包含用户角色数据传输对象列表
*/
@Override
public IPage<SysUserRoleDTO> paging(PagingReqDTO<SysUserRoleDTO> reqDTO) {
// 创建分页对象,根据请求中的当前页码和每页记录数初始化
IPage<SysUserRole> query = new Page<>(reqDTO.getCurrent(), reqDTO.getSize());
// 创建查询条件构造器,用于构建数据库查询条件,当前未添加具体查询条件
QueryWrapper<SysUserRole> wrapper = new QueryWrapper<>();
// 调用父类的 page 方法进行分页查询,获取包含 SysUserRole 实体的分页结果
IPage<SysUserRole> page = this.page(query, wrapper);
// 将包含 SysUserRole 实体的分页结果转换为 JSON 字符串,再反序列化为包含 SysUserRoleDTO 的分页结果
IPage<SysUserRoleDTO> pageData = JSON.parseObject(JSON.toJSONString(page), new TypeReference<Page<SysUserRoleDTO>>(){});
return pageData;
}
/**
* 根据用户 ID 查询用户的角色列表。
*
* @param userId 用户的唯一标识
* @return 用户的角色 ID 列表
*/
@Override
public List<String> listRoles(String userId) {
// 创建查询条件构造器,添加用户 ID 作为查询条件
QueryWrapper<SysUserRole> wrapper = new QueryWrapper<>();
wrapper.lambda().eq(SysUserRole::getUserId, userId);
// 调用父类的 list 方法进行查询,获取符合条件的用户角色实体列表
List<SysUserRole> list = this.list(wrapper);
// 初始化一个空的角色 ID 列表
List<String> 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<String> ids) {
// 创建查询条件构造器,添加用户 ID 作为查询条件,用于删除用户原有的所有角色
QueryWrapper<SysUserRole> wrapper = new QueryWrapper<>();
wrapper.lambda().eq(SysUserRole::getUserId, userId);
// 调用父类的 remove 方法删除符合条件的用户角色记录
this.remove(wrapper);
// 判断新的角色 ID 列表是否不为空
if(!CollectionUtils.isEmpty(ids)){
// 初始化一个空的用户角色实体列表
List<SysUserRole> 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 和角色 IDstudent作为查询条件
QueryWrapper<SysUserRole> 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 和角色 IDteacher作为查询条件
QueryWrapper<SysUserRole> 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 和角色 IDsa作为查询条件
QueryWrapper<SysUserRole> wrapper = new QueryWrapper<>();
wrapper.lambda().eq(SysUserRole::getUserId, userId)
.eq(SysUserRole::getRoleId, "sa");
// 调用父类的 count 方法统计符合条件的记录数,若大于 0 则表示用户具有管理员角色
return this.count(wrapper) > 0;
}
}