- 后端:重构 system 模块
This commit is contained in:
@@ -2,6 +2,7 @@ package cn.iocoder.mall.admin.config;
|
||||
|
||||
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
|
||||
import com.baomidou.mybatisplus.core.injector.ISqlInjector;
|
||||
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
|
||||
import org.mybatis.spring.annotation.MapperScan;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
@@ -19,4 +20,9 @@ public class DatabaseConfiguration {
|
||||
return new DefaultSqlInjector(); // MyBatis Plus 逻辑删除
|
||||
}
|
||||
|
||||
@Bean
|
||||
public PaginationInterceptor paginationInterceptor() {
|
||||
return new PaginationInterceptor(); // MyBatis Plus 分页插件
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package cn.iocoder.mall.admin.convert;
|
||||
|
||||
import cn.iocoder.mall.admin.api.dto.AccessLogAddDTO;
|
||||
import cn.iocoder.mall.admin.api.dto.ExceptionLogAddDTO;
|
||||
import cn.iocoder.mall.admin.api.dto.systemlog.AccessLogAddDTO;
|
||||
import cn.iocoder.mall.admin.api.dto.systemlog.ExceptionLogAddDTO;
|
||||
import cn.iocoder.mall.admin.dataobject.AccessLogDO;
|
||||
import cn.iocoder.mall.admin.dataobject.ExceptionLogDO;
|
||||
import org.mapstruct.Mapper;
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
package cn.iocoder.mall.admin.convert;
|
||||
|
||||
import cn.iocoder.common.framework.vo.PageResult;
|
||||
import cn.iocoder.mall.admin.api.bo.admin.AdminBO;
|
||||
import cn.iocoder.mall.admin.api.dto.admin.AdminAddDTO;
|
||||
import cn.iocoder.mall.admin.api.dto.admin.AdminUpdateDTO;
|
||||
import cn.iocoder.mall.admin.dataobject.AdminDO;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.Mapping;
|
||||
import org.mapstruct.Mappings;
|
||||
import org.mapstruct.factory.Mappers;
|
||||
|
||||
@@ -27,4 +30,9 @@ public interface AdminConvert {
|
||||
@Mappings({})
|
||||
List<AdminBO> convert(List<AdminDO> adminBOs);
|
||||
|
||||
@Mappings({
|
||||
@Mapping(source = "records", target = "list"),
|
||||
})
|
||||
PageResult<AdminBO> convert(IPage<AdminDO> page);
|
||||
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package cn.iocoder.mall.admin.convert;
|
||||
|
||||
import cn.iocoder.mall.admin.api.bo.DataDictBO;
|
||||
import cn.iocoder.mall.admin.api.dto.DataDictAddDTO;
|
||||
import cn.iocoder.mall.admin.api.dto.DataDictUpdateDTO;
|
||||
import cn.iocoder.mall.admin.api.bo.datadict.DataDictBO;
|
||||
import cn.iocoder.mall.admin.api.dto.datadict.DataDictAddDTO;
|
||||
import cn.iocoder.mall.admin.api.dto.datadict.DataDictUpdateDTO;
|
||||
import cn.iocoder.mall.admin.dataobject.DataDictDO;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.factory.Mappers;
|
||||
@@ -22,4 +22,4 @@ public interface DataDictConvert {
|
||||
|
||||
List<DataDictBO> convert(List<DataDictDO> dataDictDOs);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package cn.iocoder.mall.admin.convert;
|
||||
|
||||
import cn.iocoder.mall.admin.api.bo.OAuth2AccessTokenBO;
|
||||
import cn.iocoder.mall.admin.api.bo.OAuth2AuthenticationBO;
|
||||
import cn.iocoder.mall.admin.api.bo.oauth2.OAuth2AccessTokenBO;
|
||||
import cn.iocoder.mall.admin.api.bo.oauth2.OAuth2AuthenticationBO;
|
||||
import cn.iocoder.mall.admin.dataobject.AdminRoleDO;
|
||||
import cn.iocoder.mall.admin.dataobject.OAuth2AccessTokenDO;
|
||||
import org.mapstruct.Mapper;
|
||||
@@ -35,4 +35,4 @@ public interface OAuth2Convert {
|
||||
.setRoleIds(adminRoleDOs.stream().map(AdminRoleDO::getRoleId).collect(Collectors.toSet()));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,14 @@
|
||||
package cn.iocoder.mall.admin.convert;
|
||||
|
||||
import cn.iocoder.mall.admin.api.bo.ResourceBO;
|
||||
import cn.iocoder.mall.admin.api.dto.ResourceAddDTO;
|
||||
import cn.iocoder.mall.admin.api.dto.ResourceUpdateDTO;
|
||||
import cn.iocoder.common.framework.util.StringUtil;
|
||||
import cn.iocoder.mall.admin.api.bo.resource.ResourceBO;
|
||||
import cn.iocoder.mall.admin.api.dto.resource.ResourceAddDTO;
|
||||
import cn.iocoder.mall.admin.api.dto.resource.ResourceUpdateDTO;
|
||||
import cn.iocoder.mall.admin.dataobject.ResourceDO;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.Mapping;
|
||||
import org.mapstruct.Mappings;
|
||||
import org.mapstruct.Named;
|
||||
import org.mapstruct.factory.Mappers;
|
||||
|
||||
import java.util.List;
|
||||
@@ -15,7 +18,9 @@ public interface ResourceConvert {
|
||||
|
||||
ResourceConvert INSTANCE = Mappers.getMapper(ResourceConvert.class);
|
||||
|
||||
@Mappings({})
|
||||
@Mappings({
|
||||
@Mapping(source = "permissions", target = "permissions", qualifiedByName = "translateListFromString")
|
||||
})
|
||||
ResourceBO convert(ResourceDO resourceDO);
|
||||
|
||||
@Mappings({})
|
||||
@@ -27,4 +32,9 @@ public interface ResourceConvert {
|
||||
@Mappings({})
|
||||
ResourceDO convert(ResourceUpdateDTO resourceUpdateDTO);
|
||||
|
||||
}
|
||||
@Named("translateListFromString")
|
||||
default List<String> translateListFromString(String picUrls) {
|
||||
return StringUtil.split(picUrls, ",");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
package cn.iocoder.mall.admin.convert;
|
||||
|
||||
import cn.iocoder.mall.admin.api.bo.RoleBO;
|
||||
import cn.iocoder.mall.admin.api.dto.RoleAddDTO;
|
||||
import cn.iocoder.mall.admin.api.dto.RoleUpdateDTO;
|
||||
import cn.iocoder.common.framework.vo.PageResult;
|
||||
import cn.iocoder.mall.admin.api.bo.role.RoleBO;
|
||||
import cn.iocoder.mall.admin.api.dto.role.RoleAddDTO;
|
||||
import cn.iocoder.mall.admin.api.dto.role.RoleUpdateDTO;
|
||||
import cn.iocoder.mall.admin.dataobject.RoleDO;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.Mapping;
|
||||
import org.mapstruct.Mappings;
|
||||
import org.mapstruct.factory.Mappers;
|
||||
|
||||
@@ -27,4 +30,9 @@ public interface RoleConvert {
|
||||
@Mappings({})
|
||||
List<RoleBO> convert(List<RoleDO> roleDOs);
|
||||
|
||||
}
|
||||
@Mappings({
|
||||
@Mapping(source = "records", target = "list"),
|
||||
})
|
||||
PageResult<RoleBO> convert(IPage<RoleDO> page);
|
||||
|
||||
}
|
||||
|
||||
@@ -1,13 +1,15 @@
|
||||
package cn.iocoder.mall.admin.dao;
|
||||
|
||||
import cn.iocoder.common.framework.mybatis.QueryWrapperX;
|
||||
import cn.iocoder.mall.admin.api.dto.admin.AdminPageDTO;
|
||||
import cn.iocoder.mall.admin.dataobject.AdminDO;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Repository
|
||||
public interface AdminMapper extends BaseMapper<AdminDO> {
|
||||
|
||||
@@ -15,12 +17,9 @@ public interface AdminMapper extends BaseMapper<AdminDO> {
|
||||
return selectOne(new QueryWrapper<AdminDO>().eq("username", username));
|
||||
}
|
||||
|
||||
List<AdminDO> selectListByNicknameLike(@Param("nickname") String nickname,
|
||||
@Param("offset") Integer offset,
|
||||
@Param("limit") Integer limit);
|
||||
|
||||
Integer selectCountByNicknameLike(@Param("nickname") String nickname);
|
||||
|
||||
int update(AdminDO admin);
|
||||
default IPage<AdminDO> selectPage(AdminPageDTO adminPageDTO) {
|
||||
return selectPage(new Page<>(adminPageDTO.getPageNo(), adminPageDTO.getPageSize()),
|
||||
new QueryWrapperX<AdminDO>().likeIfPresent("nickname", adminPageDTO.getNickname()));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,20 +1,27 @@
|
||||
package cn.iocoder.mall.admin.dao;
|
||||
|
||||
import cn.iocoder.mall.admin.dataobject.AdminRoleDO;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
@Repository
|
||||
public interface AdminRoleMapper {
|
||||
public interface AdminRoleMapper extends BaseMapper<AdminRoleDO> {
|
||||
|
||||
List<AdminRoleDO> selectByAdminId(@Param("adminId") Integer adminId);
|
||||
|
||||
default List<AdminRoleDO> selectListByAdminIds(Collection<Integer> adminIds) {
|
||||
return selectList(new QueryWrapper<AdminRoleDO>().in("admin_id", adminIds));
|
||||
}
|
||||
|
||||
int updateToDeletedByAdminId(@Param("adminId") Integer adminId);
|
||||
|
||||
int updateToDeletedByRoleId(@Param("roleId") Integer roleId);
|
||||
|
||||
void insertList(@Param("adminRoleDOs") List<AdminRoleDO> adminRoleDOs);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,29 +1,31 @@
|
||||
package cn.iocoder.mall.admin.dao;
|
||||
|
||||
import cn.iocoder.common.framework.mybatis.QueryWrapperX;
|
||||
import cn.iocoder.mall.admin.api.dto.role.RolePageDTO;
|
||||
import cn.iocoder.mall.admin.dataobject.RoleDO;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
@Repository
|
||||
public interface RoleMapper {
|
||||
public interface RoleMapper extends BaseMapper<RoleDO> {
|
||||
|
||||
void insert(RoleDO roleDO);
|
||||
default List<RoleDO> selectListByIds(Collection<Integer> ids) {
|
||||
return selectList(new QueryWrapper<RoleDO>().in("id", ids));
|
||||
}
|
||||
|
||||
int update(RoleDO roleDO);
|
||||
default List<RoleDO> selectList() {
|
||||
return selectList(new QueryWrapper<>());
|
||||
}
|
||||
|
||||
RoleDO selectById(@Param("id") Integer id);
|
||||
default IPage<RoleDO> selectPage(RolePageDTO rolePageDTO) {
|
||||
return selectPage(new Page<>(rolePageDTO.getPageNo(), rolePageDTO.getPageSize()),
|
||||
new QueryWrapperX<RoleDO>().likeIfPresent("name", rolePageDTO.getName()));
|
||||
}
|
||||
|
||||
List<RoleDO> selectListByNameLike(@Param("name") String name,
|
||||
@Param("offset") Integer offset,
|
||||
@Param("limit") Integer limit);
|
||||
|
||||
Integer selectCountByNameLike(@Param("name") String name);
|
||||
|
||||
List<RoleDO> selectListByIds(@Param("ids") Set<Integer> ids);
|
||||
|
||||
List<RoleDO> selectList();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package cn.iocoder.mall.admin.dataobject;
|
||||
|
||||
import cn.iocoder.common.framework.dataobject.BaseDO;
|
||||
import cn.iocoder.common.framework.vo.CommonResult;
|
||||
import cn.iocoder.mall.admin.api.dto.systemlog.AccessLogAddDTO;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
@@ -29,7 +30,7 @@ public class AccessLogDO extends BaseDO {
|
||||
/**
|
||||
* 用户编号.
|
||||
*
|
||||
* 当管理员为空时,该值为 {@link cn.iocoder.mall.admin.api.dto.AccessLogAddDTO#USER_ID_NULL}
|
||||
* 当管理员为空时,该值为 {@link AccessLogAddDTO#USER_ID_NULL}
|
||||
*/
|
||||
private Integer userId;
|
||||
/**
|
||||
|
||||
@@ -1,12 +1,14 @@
|
||||
package cn.iocoder.mall.admin.dataobject;
|
||||
|
||||
import cn.iocoder.common.framework.dataobject.DeletableDO;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
/**
|
||||
* {@link AdminDO} 和 {@link RoleDO} 的关联表
|
||||
*/
|
||||
@TableName("admin_role")
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class AdminRoleDO extends DeletableDO {
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package cn.iocoder.mall.admin.dataobject;
|
||||
|
||||
import cn.iocoder.common.framework.dataobject.BaseDO;
|
||||
import cn.iocoder.mall.admin.api.dto.systemlog.AccessLogAddDTO;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
@@ -28,7 +29,7 @@ public class ExceptionLogDO extends BaseDO {
|
||||
/**
|
||||
* 用户编号.
|
||||
*
|
||||
* 当管理员为空时,该值为 {@link cn.iocoder.mall.admin.api.dto.AccessLogAddDTO#USER_ID_NULL}
|
||||
* 当管理员为空时,该值为 {@link AccessLogAddDTO#USER_ID_NULL}
|
||||
*/
|
||||
private Integer userId;
|
||||
/**
|
||||
|
||||
@@ -4,8 +4,6 @@ import cn.iocoder.common.framework.dataobject.DeletableDO;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 资源实体
|
||||
*/
|
||||
@@ -13,27 +11,10 @@ import java.util.Date;
|
||||
@Accessors(chain = true)
|
||||
public class ResourceDO extends DeletableDO {
|
||||
|
||||
/**
|
||||
* 资源类型 - 菜单
|
||||
*/
|
||||
@Deprecated
|
||||
public static final Integer TYPE_MENU = 1;
|
||||
/**
|
||||
* 资源类型 - 操作
|
||||
*
|
||||
* 例如,按钮。
|
||||
*/
|
||||
@Deprecated
|
||||
public static final Integer TYPE_OPERATION = 2;
|
||||
|
||||
/**
|
||||
* 资源编号
|
||||
*/
|
||||
private Integer id;
|
||||
/**
|
||||
* 资源名字(标识)
|
||||
*/
|
||||
private String name;
|
||||
/**
|
||||
* 资源类型
|
||||
*/
|
||||
@@ -46,10 +27,6 @@ public class ResourceDO extends DeletableDO {
|
||||
* 展示名
|
||||
*/
|
||||
private String displayName;
|
||||
/**
|
||||
* 添加时间
|
||||
*/
|
||||
private Date createTime;
|
||||
/**
|
||||
* 父级资源编号(外键:{@link ResourceDO#id})
|
||||
*/
|
||||
@@ -57,9 +34,21 @@ public class ResourceDO extends DeletableDO {
|
||||
/**
|
||||
* 操作
|
||||
*
|
||||
* 当资源类型为【菜单】时,handler 配置为界面 URL ,或者前端组件名
|
||||
* 当资源类型为【URL】时,handler 配置为后端 URL 。举个例子,如果有一个「创建管理员」的表单,那么前端界面上的按钮可以根据这个 url 判断是否展示,后端接收到该 url 的请求时会判断是否有权限。
|
||||
* 目前当且仅当资源类型为【菜单】时,才会生效,即 handler 配置为界面 URL ,或者前端组件名,或者前端的路由。
|
||||
*/
|
||||
private String handler;
|
||||
/**
|
||||
* 图表
|
||||
*
|
||||
* 目前当且仅当资源类型为【菜单】时,才会生效
|
||||
*/
|
||||
private String icon;
|
||||
/**
|
||||
* 权限标识数组,使用逗号分隔。
|
||||
*
|
||||
* 例如:system.admin.add 。
|
||||
* 推荐格式为 ${系统}.${模块}.${操作} 。
|
||||
*/
|
||||
private String permissions;
|
||||
|
||||
}
|
||||
|
||||
@@ -1,12 +1,14 @@
|
||||
package cn.iocoder.mall.admin.dataobject;
|
||||
|
||||
import cn.iocoder.common.framework.dataobject.DeletableDO;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
/**
|
||||
* 角色实体
|
||||
*/
|
||||
@TableName("role")
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class RoleDO extends DeletableDO {
|
||||
|
||||
@@ -2,30 +2,31 @@ package cn.iocoder.mall.admin.service;
|
||||
|
||||
import cn.iocoder.common.framework.constant.CommonStatusEnum;
|
||||
import cn.iocoder.common.framework.constant.DeletedStatusEnum;
|
||||
import cn.iocoder.common.framework.util.CollectionUtil;
|
||||
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
|
||||
import cn.iocoder.common.framework.vo.CommonResult;
|
||||
import cn.iocoder.common.framework.vo.PageResult;
|
||||
import cn.iocoder.mall.admin.api.AdminService;
|
||||
import cn.iocoder.mall.admin.api.bo.role.RoleBO;
|
||||
import cn.iocoder.mall.admin.api.bo.admin.AdminBO;
|
||||
import cn.iocoder.mall.admin.api.bo.admin.AdminPageBO;
|
||||
import cn.iocoder.mall.admin.api.constant.AdminConstants;
|
||||
import cn.iocoder.mall.admin.api.constant.AdminErrorCodeEnum;
|
||||
import cn.iocoder.mall.admin.api.dto.admin.AdminAddDTO;
|
||||
import cn.iocoder.mall.admin.api.dto.admin.AdminPageDTO;
|
||||
import cn.iocoder.mall.admin.api.dto.admin.AdminUpdateDTO;
|
||||
import cn.iocoder.mall.admin.api.dto.admin.*;
|
||||
import cn.iocoder.mall.admin.convert.AdminConvert;
|
||||
import cn.iocoder.mall.admin.dao.AdminMapper;
|
||||
import cn.iocoder.mall.admin.dao.AdminRoleMapper;
|
||||
import cn.iocoder.mall.admin.dataobject.AdminDO;
|
||||
import cn.iocoder.mall.admin.dataobject.AdminRoleDO;
|
||||
import cn.iocoder.mall.admin.dataobject.RoleDO;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.google.common.collect.ArrayListMultimap;
|
||||
import com.google.common.collect.Multimap;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.DigestUtils;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Service
|
||||
@@ -67,15 +68,9 @@ public class AdminServiceImpl implements AdminService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResult<AdminPageBO> getAdminPage(AdminPageDTO adminPageDTO) {
|
||||
AdminPageBO adminPage = new AdminPageBO();
|
||||
// 查询分页数据
|
||||
int offset = (adminPageDTO.getPageNo() - 1) * adminPageDTO.getPageSize();
|
||||
adminPage.setList(AdminConvert.INSTANCE.convert(adminMapper.selectListByNicknameLike(adminPageDTO.getNickname(),
|
||||
offset, adminPageDTO.getPageSize())));
|
||||
// 查询分页总数
|
||||
adminPage.setTotal(adminMapper.selectCountByNicknameLike(adminPageDTO.getNickname()));
|
||||
return CommonResult.success(adminPage);
|
||||
public PageResult<AdminBO> getAdminPage(AdminPageDTO adminPageDTO) {
|
||||
IPage<AdminDO> page = adminMapper.selectPage(adminPageDTO);
|
||||
return AdminConvert.INSTANCE.convert(page);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -97,94 +92,121 @@ public class AdminServiceImpl implements AdminService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResult<Boolean> updateAdmin(Integer adminId, AdminUpdateDTO adminUpdateDTO) {
|
||||
public Boolean updateAdmin(Integer adminId, AdminUpdateDTO adminUpdateDTO) {
|
||||
// 校验账号存在
|
||||
if (adminMapper.selectById(adminUpdateDTO.getId()) == null) {
|
||||
return ServiceExceptionUtil.error(AdminErrorCodeEnum.ADMIN_USERNAME_NOT_REGISTERED.getCode());
|
||||
throw ServiceExceptionUtil.exception(AdminErrorCodeEnum.ADMIN_USERNAME_NOT_REGISTERED.getCode());
|
||||
}
|
||||
// 校验账号唯一
|
||||
AdminDO usernameAdmin = adminMapper.selectByUsername(adminUpdateDTO.getUsername());
|
||||
if (usernameAdmin != null && !usernameAdmin.getId().equals(adminUpdateDTO.getId())) {
|
||||
return ServiceExceptionUtil.error(AdminErrorCodeEnum.ADMIN_USERNAME_EXISTS.getCode());
|
||||
throw ServiceExceptionUtil.exception(AdminErrorCodeEnum.ADMIN_USERNAME_EXISTS.getCode());
|
||||
}
|
||||
// 更新到数据库
|
||||
AdminDO updateAdmin = AdminConvert.INSTANCE.convert(adminUpdateDTO);
|
||||
adminMapper.update(updateAdmin);
|
||||
adminMapper.updateById(updateAdmin);
|
||||
// TODO 插入操作日志
|
||||
// 返回成功
|
||||
return CommonResult.success(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public CommonResult<Boolean> updateAdminStatus(Integer adminId, Integer updateAdminId, Integer status) {
|
||||
public Boolean updateAdminStatus(Integer adminId, AdminUpdateStatusDTO adminUpdateStatusDTO) {
|
||||
// 校验账号存在
|
||||
AdminDO admin = adminMapper.selectById(updateAdminId);
|
||||
AdminDO admin = adminMapper.selectById(adminUpdateStatusDTO.getId());
|
||||
if (admin == null) {
|
||||
return ServiceExceptionUtil.error(AdminErrorCodeEnum.ADMIN_USERNAME_NOT_REGISTERED.getCode());
|
||||
throw ServiceExceptionUtil.exception(AdminErrorCodeEnum.ADMIN_USERNAME_NOT_REGISTERED.getCode());
|
||||
}
|
||||
if (AdminConstants.USERNAME_ADMIN.equals(admin.getUsername())) {
|
||||
return ServiceExceptionUtil.error(AdminErrorCodeEnum.ADMIN_ADMIN_STATUS_CAN_NOT_UPDATE.getCode());
|
||||
throw ServiceExceptionUtil.exception(AdminErrorCodeEnum.ADMIN_ADMIN_STATUS_CAN_NOT_UPDATE.getCode());
|
||||
}
|
||||
// 如果状态相同,则返回错误
|
||||
if (status.equals(admin.getStatus())) {
|
||||
return ServiceExceptionUtil.error(AdminErrorCodeEnum.ADMIN_STATUS_EQUALS.getCode());
|
||||
if (adminUpdateStatusDTO.getStatus().equals(admin.getStatus())) {
|
||||
throw ServiceExceptionUtil.exception(AdminErrorCodeEnum.ADMIN_STATUS_EQUALS.getCode());
|
||||
}
|
||||
// 更新管理员状态
|
||||
AdminDO updateAdmin = new AdminDO().setId(updateAdminId).setStatus(status);
|
||||
adminMapper.update(updateAdmin);
|
||||
AdminDO updateAdmin = new AdminDO().setId(adminUpdateStatusDTO.getId()).setStatus(adminUpdateStatusDTO.getStatus());
|
||||
adminMapper.updateById(updateAdmin);
|
||||
// 如果是关闭管理员,则标记 token 失效。否则,管理员还可以继续蹦跶
|
||||
if (CommonStatusEnum.DISABLE.getValue().equals(status)) {
|
||||
oAuth2Service.removeToken(updateAdminId);
|
||||
if (CommonStatusEnum.DISABLE.getValue().equals(adminUpdateStatusDTO.getStatus())) {
|
||||
oAuth2Service.removeToken(adminUpdateStatusDTO.getId());
|
||||
}
|
||||
// TODO 插入操作日志
|
||||
// 返回成功
|
||||
return CommonResult.success(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public CommonResult<Boolean> deleteAdmin(Integer adminId, Integer updateAdminId) {
|
||||
public Boolean deleteAdmin(Integer adminId, Integer updateAdminId) {
|
||||
// 校验账号存在
|
||||
AdminDO admin = adminMapper.selectById(updateAdminId);
|
||||
if (admin == null) {
|
||||
return ServiceExceptionUtil.error(AdminErrorCodeEnum.ADMIN_USERNAME_NOT_REGISTERED.getCode());
|
||||
throw ServiceExceptionUtil.exception(AdminErrorCodeEnum.ADMIN_USERNAME_NOT_REGISTERED.getCode());
|
||||
}
|
||||
// 只有禁用的账号才可以删除
|
||||
if (CommonStatusEnum.ENABLE.getValue().equals(admin.getStatus())) {
|
||||
return ServiceExceptionUtil.error(AdminErrorCodeEnum.ADMIN_DELETE_ONLY_DISABLE.getCode());
|
||||
throw ServiceExceptionUtil.exception(AdminErrorCodeEnum.ADMIN_DELETE_ONLY_DISABLE.getCode());
|
||||
}
|
||||
// 标记删除 AdminDO
|
||||
AdminDO updateAdmin = new AdminDO().setId(updateAdminId);
|
||||
updateAdmin.setDeleted(DeletedStatusEnum.DELETED_YES.getValue());
|
||||
adminMapper.update(updateAdmin);
|
||||
adminMapper.deleteById(updateAdminId); // 标记删除
|
||||
// 标记删除 AdminRole
|
||||
adminRoleMapper.updateToDeletedByAdminId(updateAdminId);
|
||||
// TODO 插入操作日志
|
||||
// 返回成功
|
||||
return CommonResult.success(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<Integer, Collection<RoleBO>> getAdminRolesMap(Collection<Integer> adminIds) {
|
||||
// 查询管理员拥有的角色关联数据
|
||||
List<AdminRoleDO> adminRoleList = adminRoleMapper.selectListByAdminIds(adminIds);
|
||||
if (adminRoleList.isEmpty()) {
|
||||
return Collections.emptyMap();
|
||||
}
|
||||
// 查询角色数据
|
||||
List<RoleBO> roleList = roleService.getRoleList(CollectionUtil.convertSet(adminRoleList, AdminRoleDO::getRoleId));
|
||||
Map<Integer, RoleBO> roleMap = CollectionUtil.convertMap(roleList, RoleBO::getId);
|
||||
// 拼接数据
|
||||
Multimap<Integer, RoleBO> result = ArrayListMultimap.create();
|
||||
adminRoleList.forEach(adminRole -> result.put(adminRole.getAdminId(), roleMap.get(adminRole.getRoleId())));
|
||||
return result.asMap();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<RoleBO> getRoleList(Integer adminId) {
|
||||
// 查询管理员拥有的角色关联数据
|
||||
List<AdminRoleDO> adminRoleList = adminRoleMapper.selectByAdminId(adminId);
|
||||
if (adminRoleList.isEmpty()) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
// 查询角色数据
|
||||
return roleService.getRoleList(CollectionUtil.convertSet(adminRoleList, AdminRoleDO::getRoleId));
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public CommonResult<Boolean> assignRole(Integer adminId, Integer updateAdminId, Set<Integer> roleIds) {
|
||||
public Boolean assignAdminRole(Integer adminId, AdminAssignRoleDTO adminAssignRoleDTO) {
|
||||
// 校验账号存在
|
||||
AdminDO admin = adminMapper.selectById(updateAdminId);
|
||||
AdminDO admin = adminMapper.selectById(adminAssignRoleDTO.getId());
|
||||
if (admin == null) {
|
||||
return ServiceExceptionUtil.error(AdminErrorCodeEnum.ADMIN_USERNAME_NOT_REGISTERED.getCode());
|
||||
throw ServiceExceptionUtil.exception(AdminErrorCodeEnum.ADMIN_USERNAME_NOT_REGISTERED.getCode());
|
||||
}
|
||||
// 校验是否有不存在的角色
|
||||
List<RoleDO> roles = roleService.getRoles(roleIds);
|
||||
if (roles.size() != roleIds.size()) {
|
||||
return ServiceExceptionUtil.error(AdminErrorCodeEnum.ROLE_ASSIGN_RESOURCE_NOT_EXISTS.getCode());
|
||||
if (!CollectionUtil.isEmpty(adminAssignRoleDTO.getRoleIds())) {
|
||||
List<RoleDO> roles = roleService.getRoles(adminAssignRoleDTO.getRoleIds());
|
||||
if (roles.size() != adminAssignRoleDTO.getRoleIds().size()) {
|
||||
throw ServiceExceptionUtil.exception(AdminErrorCodeEnum.ADMIN_ASSIGN_ROLE_NOT_EXISTS.getCode());
|
||||
}
|
||||
}
|
||||
// TODO 芋艿,这里先简单实现。即方式是,删除老的分配的角色关系,然后添加新的分配的角色关系
|
||||
// 标记管理员角色源关系都为删除
|
||||
adminRoleMapper.updateToDeletedByAdminId(updateAdminId);
|
||||
adminRoleMapper.updateToDeletedByAdminId(adminAssignRoleDTO.getId());
|
||||
// 创建 RoleResourceDO 数组,并插入到数据库
|
||||
if (!roleIds.isEmpty()) {
|
||||
List<AdminRoleDO> adminRoleDOs = roleIds.stream().map(roleId -> {
|
||||
AdminRoleDO roleResource = new AdminRoleDO().setAdminId(updateAdminId).setRoleId(roleId);
|
||||
if (!CollectionUtil.isEmpty(adminAssignRoleDTO.getRoleIds())) {
|
||||
List<AdminRoleDO> adminRoleDOs = adminAssignRoleDTO.getRoleIds().stream().map(roleId -> {
|
||||
AdminRoleDO roleResource = new AdminRoleDO().setAdminId(adminAssignRoleDTO.getId()).setRoleId(roleId);
|
||||
roleResource.setCreateTime(new Date());
|
||||
roleResource.setDeleted(DeletedStatusEnum.DELETED_NO.getValue());
|
||||
return roleResource;
|
||||
@@ -193,7 +215,7 @@ public class AdminServiceImpl implements AdminService {
|
||||
}
|
||||
// TODO 插入操作日志
|
||||
// 返回成功
|
||||
return CommonResult.success(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
private String encodePassword(String password) {
|
||||
|
||||
@@ -4,10 +4,10 @@ import cn.iocoder.common.framework.constant.DeletedStatusEnum;
|
||||
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
|
||||
import cn.iocoder.common.framework.vo.CommonResult;
|
||||
import cn.iocoder.mall.admin.api.DataDictService;
|
||||
import cn.iocoder.mall.admin.api.bo.DataDictBO;
|
||||
import cn.iocoder.mall.admin.api.bo.datadict.DataDictBO;
|
||||
import cn.iocoder.mall.admin.api.constant.AdminErrorCodeEnum;
|
||||
import cn.iocoder.mall.admin.api.dto.DataDictAddDTO;
|
||||
import cn.iocoder.mall.admin.api.dto.DataDictUpdateDTO;
|
||||
import cn.iocoder.mall.admin.api.dto.datadict.DataDictAddDTO;
|
||||
import cn.iocoder.mall.admin.api.dto.datadict.DataDictUpdateDTO;
|
||||
import cn.iocoder.mall.admin.convert.DataDictConvert;
|
||||
import cn.iocoder.mall.admin.dao.DataDictMapper;
|
||||
import cn.iocoder.mall.admin.dataobject.DataDictDO;
|
||||
|
||||
@@ -3,8 +3,8 @@ package cn.iocoder.mall.admin.service;
|
||||
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
|
||||
import cn.iocoder.common.framework.vo.CommonResult;
|
||||
import cn.iocoder.mall.admin.api.OAuth2Service;
|
||||
import cn.iocoder.mall.admin.api.bo.OAuth2AccessTokenBO;
|
||||
import cn.iocoder.mall.admin.api.bo.OAuth2AuthenticationBO;
|
||||
import cn.iocoder.mall.admin.api.bo.oauth2.OAuth2AccessTokenBO;
|
||||
import cn.iocoder.mall.admin.api.bo.oauth2.OAuth2AuthenticationBO;
|
||||
import cn.iocoder.mall.admin.api.constant.AdminErrorCodeEnum;
|
||||
import cn.iocoder.mall.admin.convert.OAuth2Convert;
|
||||
import cn.iocoder.mall.admin.dao.OAuth2AccessTokenMapper;
|
||||
|
||||
@@ -3,13 +3,12 @@ package cn.iocoder.mall.admin.service;
|
||||
import cn.iocoder.common.framework.constant.DeletedStatusEnum;
|
||||
import cn.iocoder.common.framework.constant.SysErrorCodeEnum;
|
||||
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
|
||||
import cn.iocoder.common.framework.vo.CommonResult;
|
||||
import cn.iocoder.mall.admin.api.ResourceService;
|
||||
import cn.iocoder.mall.admin.api.bo.ResourceBO;
|
||||
import cn.iocoder.mall.admin.api.bo.resource.ResourceBO;
|
||||
import cn.iocoder.mall.admin.api.constant.AdminErrorCodeEnum;
|
||||
import cn.iocoder.mall.admin.api.constant.ResourceConstants;
|
||||
import cn.iocoder.mall.admin.api.dto.ResourceAddDTO;
|
||||
import cn.iocoder.mall.admin.api.dto.ResourceUpdateDTO;
|
||||
import cn.iocoder.mall.admin.api.dto.resource.ResourceAddDTO;
|
||||
import cn.iocoder.mall.admin.api.dto.resource.ResourceUpdateDTO;
|
||||
import cn.iocoder.mall.admin.convert.ResourceConvert;
|
||||
import cn.iocoder.mall.admin.dao.ResourceMapper;
|
||||
import cn.iocoder.mall.admin.dao.RoleResourceMapper;
|
||||
@@ -51,81 +50,52 @@ public class ResourceServiceImpl implements ResourceService {
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("Duplicates")
|
||||
public CommonResult<ResourceBO> addResource(Integer adminId, ResourceAddDTO resourceAddDTO) {
|
||||
public ResourceBO addResource(Integer adminId, ResourceAddDTO resourceAddDTO) {
|
||||
// 补充未在 Validation 中校验的参数校验
|
||||
if (!isValidResourceType(resourceAddDTO.getType())) {
|
||||
return CommonResult.error(SysErrorCodeEnum.VALIDATION_REQUEST_PARAM_ERROR.getCode(), "资源类型必须是菜单或 Url"); // TODO 有点搓
|
||||
}
|
||||
// 校验资源唯一性
|
||||
if (resourceMapper.selectByName(resourceAddDTO.getName()) != null) {
|
||||
return ServiceExceptionUtil.error(AdminErrorCodeEnum.RESOURCE_NAME_DUPLICATE.getCode());
|
||||
throw ServiceExceptionUtil.exception(SysErrorCodeEnum.VALIDATION_REQUEST_PARAM_ERROR.getCode(), "资源类型必须是菜单或 Url"); // TODO 有点搓
|
||||
}
|
||||
// 校验父资源存在
|
||||
if (resourceAddDTO.getPid() == null) {
|
||||
resourceAddDTO.setPid(ResourceConstants.PID_ROOT);
|
||||
}
|
||||
if (checkParentExists(resourceAddDTO.getPid())) {
|
||||
return ServiceExceptionUtil.error(AdminErrorCodeEnum.RESOURCE_PARENT_NOT_EXISTS.getCode());
|
||||
}
|
||||
checkParentResource(resourceAddDTO.getPid(), null);
|
||||
// 存储到数据库
|
||||
ResourceDO resource = ResourceConvert.INSTANCE.convert(resourceAddDTO);
|
||||
if (ResourceConstants.PID_ROOT.equals(resourceAddDTO.getPid())) { // 根节点,必须没有操作
|
||||
resource.setHandler(null);
|
||||
} else if (!resource.getHandler().startsWith("/")) {
|
||||
resource.setHandler("/" + resource.getHandler());
|
||||
}
|
||||
initResourceProperty(resource);
|
||||
resource.setCreateTime(new Date());
|
||||
resource.setDeleted(DeletedStatusEnum.DELETED_NO.getValue());
|
||||
resourceMapper.insert(resource);
|
||||
// TODO 操作日志
|
||||
// 返回成功
|
||||
return CommonResult.success(ResourceConvert.INSTANCE.convert(resource));
|
||||
return ResourceConvert.INSTANCE.convert(resource);
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("Duplicates")
|
||||
public CommonResult<Boolean> updateResource(Integer adminId, ResourceUpdateDTO resourceUpdateDTO) {
|
||||
public Boolean updateResource(Integer adminId, ResourceUpdateDTO resourceUpdateDTO) {
|
||||
// 校验更新的资源是否存在
|
||||
if (resourceMapper.selectById(resourceUpdateDTO.getId()) == null) {
|
||||
return ServiceExceptionUtil.error(AdminErrorCodeEnum.RESOURCE_NOT_EXISTS.getCode());
|
||||
}
|
||||
// 校验资源唯一性
|
||||
ResourceDO existNameResource = resourceMapper.selectByName(resourceUpdateDTO.getName());
|
||||
if (existNameResource != null && !existNameResource.getId().equals(resourceUpdateDTO.getId())) {
|
||||
return ServiceExceptionUtil.error(AdminErrorCodeEnum.RESOURCE_NAME_DUPLICATE.getCode());
|
||||
}
|
||||
// 不能设置自己为父资源
|
||||
if (resourceUpdateDTO.getId().equals(resourceUpdateDTO.getPid())) {
|
||||
return ServiceExceptionUtil.error(AdminErrorCodeEnum.RESOURCE_PARENT_ERROR.getCode());
|
||||
throw ServiceExceptionUtil.exception(AdminErrorCodeEnum.RESOURCE_NOT_EXISTS.getCode());
|
||||
}
|
||||
// 校验父资源存在
|
||||
if (resourceUpdateDTO.getPid() == null) {
|
||||
resourceUpdateDTO.setPid(ResourceConstants.PID_ROOT);
|
||||
}
|
||||
if (checkParentExists(resourceUpdateDTO.getPid())) {
|
||||
return ServiceExceptionUtil.error(AdminErrorCodeEnum.RESOURCE_PARENT_NOT_EXISTS.getCode());
|
||||
}
|
||||
checkParentResource(resourceUpdateDTO.getPid(), resourceUpdateDTO.getId());
|
||||
// 更新到数据库
|
||||
ResourceDO resource = ResourceConvert.INSTANCE.convert(resourceUpdateDTO);
|
||||
if (ResourceConstants.PID_ROOT.equals(resourceUpdateDTO.getPid())) { // 根节点,必须没有操作
|
||||
resource.setHandler(null);
|
||||
}
|
||||
initResourceProperty(resource);
|
||||
resourceMapper.update(resource);
|
||||
// TODO 操作日志
|
||||
// 返回成功
|
||||
return CommonResult.success(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public CommonResult<Boolean> deleteResource(Integer adminId, Integer resourceId) {
|
||||
public Boolean deleteResource(Integer adminId, Integer resourceId) {
|
||||
// 校验更新的资源是否存在
|
||||
if (resourceMapper.selectById(resourceId) == null) {
|
||||
return ServiceExceptionUtil.error(AdminErrorCodeEnum.RESOURCE_NOT_EXISTS.getCode());
|
||||
throw ServiceExceptionUtil.exception(AdminErrorCodeEnum.RESOURCE_NOT_EXISTS.getCode());
|
||||
}
|
||||
// 校验是否还有子资源
|
||||
if (resourceMapper.selectCountByPid(resourceId) > 0) {
|
||||
return ServiceExceptionUtil.error(AdminErrorCodeEnum.RESOURCE_EXISTS_CHILDREN.getCode());
|
||||
throw ServiceExceptionUtil.exception(AdminErrorCodeEnum.RESOURCE_EXISTS_CHILDREN.getCode());
|
||||
}
|
||||
// 更新到数据库
|
||||
ResourceDO resource = new ResourceDO().setId(resourceId);
|
||||
@@ -134,7 +104,7 @@ public class ResourceServiceImpl implements ResourceService {
|
||||
// 删除资源关联表
|
||||
roleResourceMapper.updateToDeletedByResourceId(resourceId);
|
||||
// 返回成功
|
||||
return CommonResult.success(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
public List<ResourceDO> getResources(Set<Integer> resourceIds) {
|
||||
@@ -146,7 +116,7 @@ public class ResourceServiceImpl implements ResourceService {
|
||||
|
||||
private boolean isValidResourceType(Integer type) {
|
||||
return ResourceConstants.TYPE_MENU.equals(type)
|
||||
|| ResourceConstants.TYPE_URL.equals(type);
|
||||
|| ResourceConstants.TYPE_BUTTON.equals(type);
|
||||
}
|
||||
|
||||
private boolean checkParentExists(Integer pid) {
|
||||
@@ -156,4 +126,37 @@ public class ResourceServiceImpl implements ResourceService {
|
||||
return false;
|
||||
}
|
||||
|
||||
private void checkParentResource(Integer pid, Integer childId) {
|
||||
if (pid == null || ResourceConstants.PID_ROOT.equals(pid)) {
|
||||
return;
|
||||
}
|
||||
if (pid.equals(childId)) { // 不能设置自己为父资源
|
||||
throw ServiceExceptionUtil.exception(AdminErrorCodeEnum.RESOURCE_PARENT_ERROR.getCode());
|
||||
}
|
||||
ResourceDO resource = resourceMapper.selectById(pid);
|
||||
if (resource == null) { // 父资源不存在
|
||||
throw ServiceExceptionUtil.exception(AdminErrorCodeEnum.RESOURCE_PARENT_NOT_EXISTS.getCode());
|
||||
}
|
||||
if (!ResourceConstants.TYPE_MENU.equals(resource.getType())) { // 父资源必须是菜单类型
|
||||
throw ServiceExceptionUtil.exception(AdminErrorCodeEnum.RESOURCE_PARENT_NOT_MENU.getCode());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化资源的通用属性。
|
||||
*
|
||||
* 例如说,只有菜单类型的资源,才设置 icon
|
||||
*
|
||||
* @param resource 资源
|
||||
*/
|
||||
private void initResourceProperty(ResourceDO resource) {
|
||||
if (resource.getPid() == null) {
|
||||
resource.setPid(ResourceConstants.PID_ROOT);
|
||||
}
|
||||
if (ResourceConstants.TYPE_BUTTON.equals(resource.getType())) {
|
||||
resource.setHandler(null);
|
||||
resource.setIcon(null);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -3,30 +3,27 @@ package cn.iocoder.mall.admin.service;
|
||||
import cn.iocoder.common.framework.constant.DeletedStatusEnum;
|
||||
import cn.iocoder.common.framework.util.CollectionUtil;
|
||||
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
|
||||
import cn.iocoder.common.framework.vo.CommonResult;
|
||||
import cn.iocoder.common.framework.vo.PageResult;
|
||||
import cn.iocoder.mall.admin.api.RoleService;
|
||||
import cn.iocoder.mall.admin.api.bo.RoleBO;
|
||||
import cn.iocoder.mall.admin.api.bo.RolePageBO;
|
||||
import cn.iocoder.mall.admin.api.bo.role.RoleBO;
|
||||
import cn.iocoder.mall.admin.api.constant.AdminErrorCodeEnum;
|
||||
import cn.iocoder.mall.admin.api.dto.RoleAddDTO;
|
||||
import cn.iocoder.mall.admin.api.dto.RolePageDTO;
|
||||
import cn.iocoder.mall.admin.api.dto.RoleUpdateDTO;
|
||||
import cn.iocoder.mall.admin.api.dto.role.RoleAddDTO;
|
||||
import cn.iocoder.mall.admin.api.dto.role.RoleAssignResourceDTO;
|
||||
import cn.iocoder.mall.admin.api.dto.role.RolePageDTO;
|
||||
import cn.iocoder.mall.admin.api.dto.role.RoleUpdateDTO;
|
||||
import cn.iocoder.mall.admin.convert.RoleConvert;
|
||||
import cn.iocoder.mall.admin.dao.AdminRoleMapper;
|
||||
import cn.iocoder.mall.admin.dao.RoleMapper;
|
||||
import cn.iocoder.mall.admin.dao.RoleResourceMapper;
|
||||
import cn.iocoder.mall.admin.dataobject.AdminRoleDO;
|
||||
import cn.iocoder.mall.admin.dataobject.ResourceDO;
|
||||
import cn.iocoder.mall.admin.dataobject.RoleDO;
|
||||
import cn.iocoder.mall.admin.dataobject.RoleResourceDO;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Service
|
||||
@@ -52,31 +49,25 @@ public class RoleServiceImpl implements RoleService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResult<RolePageBO> getRolePage(RolePageDTO rolePageDTO) {
|
||||
RolePageBO rolePage = new RolePageBO();
|
||||
// 查询分页数据
|
||||
int offset = rolePageDTO.getPageNo() * rolePageDTO.getPageSize();
|
||||
rolePage.setRoles(RoleConvert.INSTANCE.convert(roleMapper.selectListByNameLike(rolePageDTO.getName(),
|
||||
offset, rolePageDTO.getPageSize())));
|
||||
// 查询分页总数
|
||||
rolePage.setCount(roleMapper.selectCountByNameLike(rolePageDTO.getName()));
|
||||
return CommonResult.success(rolePage);
|
||||
public PageResult<RoleBO> getRolePage(RolePageDTO rolePageDTO) {
|
||||
IPage<RoleDO> page = roleMapper.selectPage(rolePageDTO);
|
||||
return RoleConvert.INSTANCE.convert(page);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResult<Set<Integer>> getRoleList(Integer adminId) {
|
||||
List<AdminRoleDO> adminRoleDOs = adminRoleMapper.selectByAdminId(adminId);
|
||||
return CommonResult.success(adminRoleDOs.stream().map(AdminRoleDO::getRoleId).collect(Collectors.toSet()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResult<List<RoleBO>> getRoleList() {
|
||||
public List<RoleBO> getRoleList() {
|
||||
List<RoleDO> roleList = roleMapper.selectList();
|
||||
return CommonResult.success(RoleConvert.INSTANCE.convert(roleList));
|
||||
return RoleConvert.INSTANCE.convert(roleList);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResult<RoleBO> addRole(Integer adminId, RoleAddDTO roleAddDTO) {
|
||||
public List<RoleBO> getRoleList(Collection<Integer> ids) {
|
||||
List<RoleDO> roles = roleMapper.selectListByIds(ids);
|
||||
return RoleConvert.INSTANCE.convert(roles);
|
||||
}
|
||||
|
||||
@Override
|
||||
public RoleBO addRole(Integer adminId, RoleAddDTO roleAddDTO) {
|
||||
// TODO 芋艿,角色名是否要唯一呢?貌似一般系统都是允许的。
|
||||
// 保存到数据库
|
||||
RoleDO role = RoleConvert.INSTANCE.convert(roleAddDTO);
|
||||
@@ -85,61 +76,63 @@ public class RoleServiceImpl implements RoleService {
|
||||
roleMapper.insert(role);
|
||||
// TODO 插入操作日志
|
||||
// 返回成功
|
||||
return CommonResult.success(RoleConvert.INSTANCE.convert(role));
|
||||
return RoleConvert.INSTANCE.convert(role);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResult<Boolean> updateRole(Integer adminId, RoleUpdateDTO roleUpdateDTO) {
|
||||
public Boolean updateRole(Integer adminId, RoleUpdateDTO roleUpdateDTO) {
|
||||
// TODO 芋艿,角色名是否要唯一呢?貌似一般系统都是允许的。
|
||||
// 校验角色是否存在
|
||||
if (roleMapper.selectById(roleUpdateDTO.getId()) == null) {
|
||||
return ServiceExceptionUtil.error(AdminErrorCodeEnum.RESOURCE_NOT_EXISTS.getCode());
|
||||
throw ServiceExceptionUtil.exception(AdminErrorCodeEnum.RESOURCE_NOT_EXISTS.getCode());
|
||||
}
|
||||
// 更新到数据库
|
||||
RoleDO roleDO = RoleConvert.INSTANCE.convert(roleUpdateDTO);
|
||||
roleMapper.update(roleDO);
|
||||
roleMapper.updateById(roleDO);
|
||||
// TODO 插入操作日志
|
||||
// 返回成功
|
||||
return CommonResult.success(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public CommonResult<Boolean> deleteRole(Integer adminId, Integer roleId) {
|
||||
public Boolean deleteRole(Integer adminId, Integer roleId) {
|
||||
// 校验角色是否存在
|
||||
if (roleMapper.selectById(roleId) == null) {
|
||||
return ServiceExceptionUtil.error(AdminErrorCodeEnum.RESOURCE_NOT_EXISTS.getCode());
|
||||
throw ServiceExceptionUtil.exception(AdminErrorCodeEnum.RESOURCE_NOT_EXISTS.getCode());
|
||||
}
|
||||
// 更新到数据库,标记删除
|
||||
RoleDO roleDO = new RoleDO().setId(roleId);
|
||||
roleDO.setDeleted(DeletedStatusEnum.DELETED_YES.getValue());
|
||||
roleMapper.update(roleDO);
|
||||
roleMapper.deleteById(roleId);
|
||||
// 标记删除 RoleResource
|
||||
roleResourceMapper.updateToDeletedByRoleId(roleId);
|
||||
// 标记删除 AdminRole
|
||||
adminRoleMapper.updateToDeletedByRoleId(roleId);
|
||||
// TODO 插入操作日志
|
||||
// 返回成功
|
||||
return CommonResult.success(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public CommonResult<Boolean> assignResource(Integer adminId, Integer roleId, Set<Integer> resourceIds) {
|
||||
public Boolean assignRoleResource(Integer adminId, RoleAssignResourceDTO roleAssignResourceDTO) {
|
||||
Integer roleId = roleAssignResourceDTO.getId();
|
||||
Set<Integer> resourceIds = roleAssignResourceDTO.getResourceIds();
|
||||
// 校验角色是否存在
|
||||
if (roleMapper.selectById(roleId) == null) {
|
||||
return ServiceExceptionUtil.error(AdminErrorCodeEnum.RESOURCE_NOT_EXISTS.getCode());
|
||||
if (roleMapper.selectById(roleAssignResourceDTO.getId()) == null) {
|
||||
throw ServiceExceptionUtil.exception(AdminErrorCodeEnum.RESOURCE_NOT_EXISTS.getCode());
|
||||
}
|
||||
// 校验是否有不存在的资源
|
||||
List<ResourceDO> resources = resourceService.getResources(resourceIds);
|
||||
if (resources.size() != resourceIds.size()) {
|
||||
return ServiceExceptionUtil.error(AdminErrorCodeEnum.ROLE_ASSIGN_RESOURCE_NOT_EXISTS.getCode());
|
||||
if (!CollectionUtil.isEmpty(resourceIds)) {
|
||||
List<ResourceDO> resources = resourceService.getResources(resourceIds);
|
||||
if (resources.size() != resourceIds.size()) {
|
||||
throw ServiceExceptionUtil.exception(AdminErrorCodeEnum.ROLE_ASSIGN_RESOURCE_NOT_EXISTS.getCode());
|
||||
}
|
||||
}
|
||||
// TODO 芋艿,这里先简单实现。即方式是,删除老的分配的资源关系,然后添加新的分配的资源关系
|
||||
// 标记角色原资源关系都为删除
|
||||
roleResourceMapper.updateToDeletedByRoleId(roleId);
|
||||
// 创建 RoleResourceDO 数组,并插入到数据库
|
||||
if (!resourceIds.isEmpty()) {
|
||||
if (!CollectionUtil.isEmpty(resourceIds)) {
|
||||
List<RoleResourceDO> roleResources = resourceIds.stream().map(resourceId -> {
|
||||
RoleResourceDO roleResource = new RoleResourceDO().setRoleId(roleId).setResourceId(resourceId);
|
||||
roleResource.setCreateTime(new Date());
|
||||
@@ -150,7 +143,7 @@ public class RoleServiceImpl implements RoleService {
|
||||
}
|
||||
// TODO 插入操作日志
|
||||
// 返回成功
|
||||
return CommonResult.success(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
public List<RoleDO> getRoles(Set<Integer> roleIds) {
|
||||
|
||||
@@ -2,8 +2,8 @@ package cn.iocoder.mall.admin.service;
|
||||
|
||||
import cn.iocoder.common.framework.util.StringUtil;
|
||||
import cn.iocoder.mall.admin.api.SystemLogService;
|
||||
import cn.iocoder.mall.admin.api.dto.AccessLogAddDTO;
|
||||
import cn.iocoder.mall.admin.api.dto.ExceptionLogAddDTO;
|
||||
import cn.iocoder.mall.admin.api.dto.systemlog.AccessLogAddDTO;
|
||||
import cn.iocoder.mall.admin.api.dto.systemlog.ExceptionLogAddDTO;
|
||||
import cn.iocoder.mall.admin.convert.AccessLogConvert;
|
||||
import cn.iocoder.mall.admin.dao.AccessLogMapper;
|
||||
import cn.iocoder.mall.admin.dao.ExceptionLogMapper;
|
||||
|
||||
@@ -49,3 +49,9 @@ dubbo:
|
||||
version: 1.0.0
|
||||
RoleService:
|
||||
version: 1.0.0
|
||||
|
||||
# logging
|
||||
logging:
|
||||
level:
|
||||
# dao 开启 debug 模式 mybatis 输入 sql
|
||||
cn.iocoder.mall.admin.dao: debug
|
||||
|
||||
@@ -1,65 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="cn.iocoder.mall.admin.dao.AdminMapper">
|
||||
|
||||
<sql id="FIELDS">
|
||||
id, username, nickname, password, status,
|
||||
create_time
|
||||
</sql>
|
||||
|
||||
<select id="selectListByNicknameLike" resultType="AdminDO">
|
||||
SELECT
|
||||
<include refid="FIELDS" />
|
||||
FROM admin
|
||||
<where>
|
||||
<if test="nickname != null">
|
||||
nickname LIKE "%"#{nickname}"%"
|
||||
</if>
|
||||
AND deleted = 0
|
||||
</where>
|
||||
LIMIT #{offset}, #{limit}
|
||||
</select>
|
||||
|
||||
<select id="selectCountByNicknameLike" resultType="Integer">
|
||||
SELECT
|
||||
COUNT(1)
|
||||
FROM admin
|
||||
<where>
|
||||
<if test="nickname != null">
|
||||
nickname LIKE "%"#{nickname}"%"
|
||||
</if>
|
||||
AND deleted = 0
|
||||
</where>
|
||||
</select>
|
||||
|
||||
<select id="selectById" parameterType="Integer" resultType="AdminDO">
|
||||
SELECT
|
||||
<include refid="FIELDS" />
|
||||
FROM admin
|
||||
WHERE id = #{id}
|
||||
AND deleted = 0
|
||||
</select>
|
||||
|
||||
<update id="update" parameterType="RoleDO">
|
||||
UPDATE admin
|
||||
<set>
|
||||
<if test="username != null">
|
||||
, username = #{username}
|
||||
</if>
|
||||
<if test="nickname != null">
|
||||
, nickname = #{nickname}
|
||||
</if>
|
||||
<if test="password != null">
|
||||
, password = #{password}
|
||||
</if>
|
||||
<if test="status != null">
|
||||
, status = #{status}
|
||||
</if>
|
||||
<if test="deleted != null">
|
||||
, deleted = #{deleted}
|
||||
</if>
|
||||
</set>
|
||||
WHERE id = #{id}
|
||||
</update>
|
||||
|
||||
</mapper>
|
||||
@@ -2,14 +2,6 @@
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="cn.iocoder.mall.admin.dao.ResourceMapper">
|
||||
|
||||
<!--<insert id="insert" parameterType="UserDO" useGeneratedKeys="true" keyProperty="id">-->
|
||||
<!--INSERT INTO users (-->
|
||||
<!--id, mobile, create_time-->
|
||||
<!--) VALUES (-->
|
||||
<!--#{id}, #{mobile}, #{createTime}-->
|
||||
<!--)-->
|
||||
<!--</insert>-->
|
||||
|
||||
<sql id="FIELDS">
|
||||
id, name, type, sort, display_name,
|
||||
create_time, pid, handler
|
||||
@@ -90,16 +82,6 @@
|
||||
AND deleted = 0
|
||||
</select>
|
||||
|
||||
<insert id="insert" parameterType="ResourceDO" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
|
||||
INSERT INTO resource (
|
||||
name, type, sort, display_name, handler,
|
||||
pid, create_time, deleted
|
||||
) VALUES (
|
||||
#{name}, #{type}, #{sort}, #{displayName}, #{handler},
|
||||
#{pid}, #{createTime}, #{deleted}
|
||||
)
|
||||
</insert>
|
||||
|
||||
<update id="update" parameterType="ResourceDO">
|
||||
UPDATE resource
|
||||
<set>
|
||||
@@ -125,4 +107,4 @@
|
||||
WHERE id = #{id}
|
||||
</update>
|
||||
|
||||
</mapper>
|
||||
</mapper>
|
||||
|
||||
@@ -1,81 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="cn.iocoder.mall.admin.dao.RoleMapper">
|
||||
|
||||
<sql id="FIELDS">
|
||||
id, name, create_time
|
||||
</sql>
|
||||
|
||||
<insert id="insert" parameterType="RoleDO" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
|
||||
INSERT INTO role (
|
||||
name, create_time, deleted
|
||||
) VALUES (
|
||||
#{name}, #{createTime}, #{deleted}
|
||||
)
|
||||
</insert>
|
||||
|
||||
<update id="update" parameterType="RoleDO">
|
||||
UPDATE role
|
||||
<set>
|
||||
<if test="name != null">
|
||||
, name = #{name}
|
||||
</if>
|
||||
<if test="deleted != null">
|
||||
, deleted = #{deleted}
|
||||
</if>
|
||||
</set>
|
||||
WHERE id = #{id}
|
||||
</update>
|
||||
|
||||
<select id="selectById" parameterType="Integer" resultType="RoleDO">
|
||||
SELECT
|
||||
<include refid="FIELDS"/>
|
||||
FROM role
|
||||
WHERE id = #{id}
|
||||
AND deleted = 0
|
||||
</select>
|
||||
|
||||
<select id="selectListByNameLike" resultType="RoleDO">
|
||||
SELECT
|
||||
<include refid="FIELDS"/>
|
||||
FROM role
|
||||
<where>
|
||||
<if test="name != null">
|
||||
name LIKE "%"#{name}"%"
|
||||
</if>
|
||||
AND deleted = 0
|
||||
</where>
|
||||
LIMIT #{offset}, #{limit}
|
||||
</select>
|
||||
|
||||
<select id="selectCountByNameLike" resultType="Integer">
|
||||
SELECT
|
||||
COUNT(1)
|
||||
FROM role
|
||||
<where>
|
||||
<if test="name != null">
|
||||
name LIKE "%"#{name}"%"
|
||||
</if>
|
||||
AND deleted = 0
|
||||
</where>
|
||||
</select>
|
||||
|
||||
<select id="selectListByIds" resultType="RoleDO">
|
||||
SELECT
|
||||
<include refid="FIELDS"/>
|
||||
FROM role
|
||||
WHERE id IN
|
||||
<foreach item="id" collection="ids" separator="," open="(" close=")" index="">
|
||||
#{id}
|
||||
</foreach>
|
||||
AND deleted = 0
|
||||
</select>
|
||||
|
||||
<select id="selectList" resultType="RoleDO">
|
||||
SELECT
|
||||
<include refid="FIELDS"/>
|
||||
FROM role
|
||||
WHERE deleted = 0
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
@@ -1,19 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
|
||||
<configuration>
|
||||
|
||||
<settings>
|
||||
<!-- 使用驼峰命名法转换字段。 -->
|
||||
<setting name="mapUnderscoreToCamelCase" value="true"/>
|
||||
</settings>
|
||||
|
||||
<typeAliases>
|
||||
<typeAlias alias="Integer" type="java.lang.Integer"/>
|
||||
<typeAlias alias="Long" type="java.lang.Long"/>
|
||||
<typeAlias alias="HashMap" type="java.util.HashMap"/>
|
||||
<typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap"/>
|
||||
<typeAlias alias="ArrayList" type="java.util.ArrayList"/>
|
||||
<typeAlias alias="LinkedList" type="java.util.LinkedList"/>
|
||||
</typeAliases>
|
||||
|
||||
</configuration>
|
||||
Reference in New Issue
Block a user