增加管理员模块的增删改查~

This commit is contained in:
YunaiV
2019-03-02 17:19:37 +08:00
parent ffeb866b91
commit 36f62b2459
25 changed files with 422 additions and 31 deletions

View File

@@ -1,6 +1,8 @@
package cn.iocoder.mall.admin.convert;
import cn.iocoder.mall.admin.api.bo.AdminBO;
import cn.iocoder.mall.admin.api.dto.AdminAddDTO;
import cn.iocoder.mall.admin.api.dto.AdminUpdateDTO;
import cn.iocoder.mall.admin.dataobject.AdminDO;
import org.mapstruct.Mapper;
import org.mapstruct.Mappings;
@@ -16,6 +18,12 @@ public interface AdminConvert {
@Mappings({})
AdminBO convert(AdminDO adminDO);
@Mappings({})
AdminDO convert(AdminAddDTO adminAddDTO);
@Mappings({})
AdminDO convert(AdminUpdateDTO adminUpdateDTO);
@Mappings({})
List<AdminBO> convert(List<AdminDO> adminBOs);

View File

@@ -9,6 +9,8 @@ import java.util.List;
@Repository
public interface AdminMapper {
AdminDO selectById(@Param("id") Integer id);
AdminDO selectByUsername(@Param("username") String username);
List<AdminDO> selectListByNicknameLike(@Param("nickname") String nickname,
@@ -17,4 +19,8 @@ public interface AdminMapper {
Integer selectCountByNicknameLike(@Param("nickname") String nickname);
void insert(AdminDO admin);
int update(AdminDO admin);
}

View File

@@ -11,4 +11,8 @@ public interface AdminRoleMapper {
List<AdminRoleDO> selectByAdminId(@Param("adminId") Integer adminId);
int updateToDeletedByAdminId(@Param("adminId") Integer adminId);
int updateToDeletedByRoleId(@Param("roleId") Integer roleId);
}

View File

@@ -1,6 +1,7 @@
package cn.iocoder.mall.admin.dao;
import cn.iocoder.mall.admin.dataobject.OAuth2AccessTokenDO;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
@Repository
@@ -8,6 +9,8 @@ public interface OAuth2AccessTokenMapper {
void insert(OAuth2AccessTokenDO entity);
OAuth2AccessTokenDO selectByTokenId(String tokenId);
OAuth2AccessTokenDO selectByTokenId(@Param("id") String id);
int updateToInvalidByAdminId(@Param("adminId") Integer adminId);
}

View File

@@ -1,6 +1,7 @@
package cn.iocoder.mall.admin.dao;
import cn.iocoder.mall.admin.dataobject.OAuth2RefreshTokenDO;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
@Repository
@@ -8,4 +9,6 @@ public interface OAuth2RefreshTokenMapper {
void insert(OAuth2RefreshTokenDO entity);
int updateToInvalidByAdminId(@Param("adminId") Integer adminId);
}

View File

@@ -1,11 +1,11 @@
package cn.iocoder.mall.admin.dataobject;
import java.util.Date;
import cn.iocoder.common.framework.dataobject.BaseDO;
/**
* {@link AdminDO} 和 {@link RoleDO} 的关联表
*/
public class AdminRoleDO {
public class AdminRoleDO extends BaseDO {
/**
* 编号
@@ -19,12 +19,6 @@ public class AdminRoleDO {
* 角色编号(外键:{@link RoleDO}
*/
private Integer roleId;
/**
* 创建时间
*/
private Date createTime;
// TODO 芋艿 删除状态
public Integer getId() {
return id;
@@ -53,13 +47,4 @@ public class AdminRoleDO {
return this;
}
public Date getCreateTime() {
return createTime;
}
public AdminRoleDO setCreateTime(Date createTime) {
this.createTime = createTime;
return this;
}
}

View File

@@ -1,20 +1,27 @@
package cn.iocoder.mall.admin.service;
import cn.iocoder.common.framework.constant.SysErrorCodeEnum;
import cn.iocoder.common.framework.dataobject.BaseDO;
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.admin.api.AdminService;
import cn.iocoder.mall.admin.api.bo.AdminBO;
import cn.iocoder.mall.admin.api.bo.AdminPageBO;
import cn.iocoder.mall.admin.api.constant.AdminErrorCodeEnum;
import cn.iocoder.mall.admin.api.dto.AdminAddDTO;
import cn.iocoder.mall.admin.api.dto.AdminPageDTO;
import cn.iocoder.mall.admin.api.dto.AdminUpdateDTO;
import cn.iocoder.mall.admin.convert.AdminConvert;
import cn.iocoder.mall.admin.dataobject.AdminDO;
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 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;
@Service
@@ -25,6 +32,8 @@ public class AdminServiceImpl implements AdminService {
private AdminMapper adminMapper;
@Autowired
private AdminRoleMapper adminRoleMapper;
@Autowired
private OAuth2ServiceImpl oAuth2Service;
public CommonResult<AdminDO> validAdmin(String username, String password) {
AdminDO admin = adminMapper.selectByUsername(username);
@@ -33,7 +42,7 @@ public class AdminServiceImpl implements AdminService {
return ServiceExceptionUtil.error(AdminErrorCodeEnum.ADMIN_USERNAME_NOT_REGISTERED.getCode());
}
// 密码不正确
if (DigestUtils.md5DigestAsHex(password.getBytes()).equals(admin.getPassword())) {
if (encodePassword(password).equals(admin.getPassword())) {
return ServiceExceptionUtil.error(AdminErrorCodeEnum.ADMIN_PASSWORD_ERROR.getCode());
}
// 账号被禁用
@@ -62,4 +71,98 @@ public class AdminServiceImpl implements AdminService {
return CommonResult.success(adminPage);
}
@Override
public CommonResult<AdminBO> addAdmin(Integer adminId, AdminAddDTO adminAddDTO) {
// 校验账号唯一
if (adminMapper.selectByUsername(adminAddDTO.getUsername()) != null) {
return ServiceExceptionUtil.error(AdminErrorCodeEnum.ADMIN_USERNAME_EXISTS.getCode());
}
// 保存到数据库
AdminDO admin = AdminConvert.INSTANCE.convert(adminAddDTO)
.setPassword(encodePassword(adminAddDTO.getPassword())) // 加密密码
.setStatus(AdminDO.STATUS_ENABLE);
admin.setCreateTime(new Date()).setDeleted(BaseDO.DELETED_NO);
adminMapper.insert(admin);
// TODO 插入操作日志
// 返回成功
return CommonResult.success(AdminConvert.INSTANCE.convert(admin));
}
@Override
public CommonResult<Boolean> updateAdmin(Integer adminId, AdminUpdateDTO adminUpdateDTO) {
// 校验账号存在
if (adminMapper.selectById(adminUpdateDTO.getId()) == null) {
return ServiceExceptionUtil.error(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());
}
// 更新到数据库
AdminDO updateAdmin = AdminConvert.INSTANCE.convert(adminUpdateDTO);
adminMapper.update(updateAdmin);
// TODO 插入操作日志
// 返回成功
return CommonResult.success(true);
}
@Override
@Transactional
public CommonResult<Boolean> updateAdminStatus(Integer adminId, Integer updateAdminId, Integer status) {
// 校验参数
if (!isValidStatus(status)) {
return CommonResult.error(SysErrorCodeEnum.VALIDATION_REQUEST_PARAM_ERROR.getCode(), "变更状态必须是开启1或关闭2"); // TODO 有点搓
}
// 校验账号存在
AdminDO admin = adminMapper.selectById(updateAdminId);
if (admin == null) {
return ServiceExceptionUtil.error(AdminErrorCodeEnum.ADMIN_USERNAME_NOT_REGISTERED.getCode());
}
// 如果状态相同,则返回错误
if (status.equals(admin.getStatus())) {
return ServiceExceptionUtil.error(AdminErrorCodeEnum.ADMIN_STATUS_EQUALS.getCode());
}
// 更新管理员状态
AdminDO updateAdmin = new AdminDO().setId(updateAdminId).setStatus(status);
adminMapper.update(updateAdmin);
// 如果是关闭管理员,则标记 token 失效。否则,管理员还可以继续蹦跶
if (AdminDO.STATUS_DISABLE.equals(status)) {
oAuth2Service.removeToken(updateAdminId);
}
// TODO 插入操作日志
// 返回成功
return CommonResult.success(true);
}
@Override
@Transactional
public CommonResult<Boolean> deleteAdmin(Integer adminId, Integer updateAdminId) {
// 校验账号存在
AdminDO admin = adminMapper.selectById(updateAdminId);
if (admin == null) {
return ServiceExceptionUtil.error(AdminErrorCodeEnum.ADMIN_USERNAME_NOT_REGISTERED.getCode());
}
if (AdminDO.STATUS_ENABLE.equals(admin.getStatus())) {
return ServiceExceptionUtil.error(AdminErrorCodeEnum.ADMIN_DELETE_ONLY_DISABLE.getCode());
}
// 只有禁用的账号才可以删除
AdminDO updateAdmin = new AdminDO().setId(updateAdminId);
updateAdmin.setDeleted(BaseDO.DELETED_YES);
adminMapper.update(updateAdmin);
// 标记删除 AdminRole
adminRoleMapper.updateToDeletedByAdminId(updateAdminId);
// TODO 插入操作日志
// 返回成功
return CommonResult.success(true);
}
private String encodePassword(String password) {
return DigestUtils.md5DigestAsHex(password.getBytes());
}
private boolean isValidStatus(Integer status) {
return AdminDO.STATUS_ENABLE.equals(status)
|| AdminDO.STATUS_DISABLE.equals(status);
}
}

View File

@@ -13,6 +13,7 @@ import cn.iocoder.mall.admin.dataobject.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
@@ -46,6 +47,7 @@ public class OAuth2ServiceImpl implements OAuth2Service {
private ResourceServiceImpl resourceService;
@Override
@Transactional
public CommonResult<OAuth2AccessTokenBO> getAccessToken(String username, String password) {
CommonResult<AdminDO> adminResult = adminService.validAdmin(username, password);
// 校验失败,返回错误结果
@@ -79,6 +81,19 @@ public class OAuth2ServiceImpl implements OAuth2Service {
return CommonResult.success(OAuth2Convert.INSTANCE.convertToAuthentication(accessTokenDO, adminRoleDOs));
}
/**
* 移除管理员对应的 Token
*
* @param adminId 管理员编号
*/
@Transactional
public void removeToken(Integer adminId) {
// 设置 access token 失效
oauth2AccessTokenMapper.updateToInvalidByAdminId(adminId);
// 设置 refresh token 失效
oauth2RefreshTokenMapper.updateToInvalidByAdminId(adminId);
}
@Override
public CommonResult<Boolean> checkPermission(Integer adminId, Set<Integer> roleIds, String url) {
// 如果未配置该资源,说明无需权限控制。

View File

@@ -16,6 +16,7 @@ import cn.iocoder.mall.admin.dao.RoleResourceMapper;
import cn.iocoder.mall.admin.dataobject.ResourceDO;
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;
@@ -116,6 +117,7 @@ public class ResourceServiceImpl implements ResourceService {
}
@Override
@Transactional
public CommonResult<Boolean> deleteResource(Integer adminId, Integer resourceId) {
// 校验更新的资源是否存在
if (resourceMapper.selectById(resourceId) == null) {

View File

@@ -11,6 +11,7 @@ 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.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.ResourceDO;
@@ -18,6 +19,7 @@ import cn.iocoder.mall.admin.dataobject.RoleDO;
import cn.iocoder.mall.admin.dataobject.RoleResourceDO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
@@ -31,6 +33,8 @@ public class RoleServiceImpl implements RoleService {
@Autowired
private RoleResourceMapper roleResourceMapper;
@Autowired
private AdminRoleMapper adminRoleMapper;
@Autowired
private RoleMapper roleMapper;
@Autowired
@@ -84,6 +88,7 @@ public class RoleServiceImpl implements RoleService {
}
@Override
@Transactional
public CommonResult<Boolean> deleteRole(Integer adminId, Integer roleId) {
// 校验角色是否存在
if (roleMapper.selectById(roleId) == null) {
@@ -93,12 +98,17 @@ public class RoleServiceImpl implements RoleService {
RoleDO roleDO = new RoleDO().setId(roleId);
roleDO.setDeleted(RoleDO.DELETED_YES);
roleMapper.update(roleDO);
// 标记删除 RoleResource
roleResourceMapper.updateToDeletedByRoleId(roleId);
// 标记删除 AdminRole
adminRoleMapper.updateToDeletedByRoleId(roleId);
// TODO 插入操作日志
// 返回成功
return CommonResult.success(true);
}
@Override
@Transactional
public CommonResult<Boolean> assignResource(Integer adminId, Integer roleId, Set<Integer> resourceIds) {
// 校验角色是否存在
if (roleMapper.selectById(roleId) == null) {