From 157b166435fbaf3fd278d2d16214352f47afc3bf Mon Sep 17 00:00:00 2001
From: YunaiV <>
Date: Fri, 1 May 2020 11:04:16 +0800
Subject: [PATCH] =?UTF-8?q?=E8=BF=81=E7=A7=BB=20system=20=E6=9C=8D?=
=?UTF-8?q?=E5=8A=A1=EF=BC=8Cadmin=20=E9=80=BB=E8=BE=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
admin-web/src/models/admin/adminList.js | 10 +-
admin-web/src/pages/Admin/AdminList.js | 61 ++++--------
admin-web/src/pages/Admin/RoleList.js | 24 ++++-
admin-web/src/services/system.js | 8 ++
.../common/framework/util/CollectionUtil.java | 6 ++
system/pom.xml | 4 +-
.../system/biz/enums/SystemErrorCodeEnum.java | 5 +
.../biz/enums/admin/AdminStatusEnum.java | 41 ++++++++
.../enums/authorization/ResourceIdEnum.java | 6 ++
.../enums/authorization/ResourceTypeEnum.java | 2 +-
.../mall/system/biz/bo/admin/AdminBO.java | 18 ++++
.../system/biz/bo/authorization/RoleBO.java | 4 +
.../biz/convert/admin/AdminConvert.java | 6 ++
.../biz/convert/oauth2/OAuth2Convert.java | 2 +
.../system/biz/dao/admin/AdminMapper.java | 10 ++
.../biz/dao/authorization/RoleMapper.java | 10 +-
.../system/biz/dataobject/admin/AdminDO.java | 9 +-
.../system/biz/dto/admin/AdminPageDTO.java | 26 +++++
...uthorizationGetRoleMapByAccountIdsDTO.java | 19 ++++
.../dto/authorization/ResourceGetListDTO.java | 2 +
.../biz/dto/authorization/RoleGetListDTO.java | 22 +++++
.../OAuth2AccessTokenAuthenticateDTO.java | 10 +-
.../OAuth2RefreshTokenAuthenticateDTO.java | 20 ++++
.../oatuh2/OAuth2UsernameAuthenticateDTO.java | 9 +-
.../biz/service/admin/AdminService.java | 18 +++-
.../biz/service/admin/AdminServiceImpl.java | 14 ++-
.../authorization/AuthorizationService.java | 15 ++-
.../AuthorizationServiceImpl.java | 20 ++++
.../service/authorization/RoleService.java | 3 +-
.../authorization/RoleServiceImpl.java | 62 ++++++------
.../biz/service/oauth2/OAuth2Service.java | 3 +
.../biz/service/oauth2/OAuth2ServiceImpl.java | 35 +++++--
.../admin/AdminsAdminController.java | 94 +++++++++++++++++++
.../AdminsAuthorizationController.java | 28 ++++++
.../convert/admin/AdminsAdminConvert.java | 9 ++
.../convert/oauth2/AdminsOAuth2Convert.java | 2 +-
.../convert/oauth2/UsersOAuth2Convert.java | 2 -
.../request/admin/AdminsAdminPageRequest.java | 22 +++++
.../admin/AdminsAdminPageResponse.java | 79 ++++++++++++++++
.../authorization/AdminsRolePageResponse.java | 2 +
.../iocoder/mall/system/api/AdminService.java | 22 -----
.../mall/system/api/OAuth2Service.java | 29 ------
.../iocoder/mall/system/api/RoleService.java | 10 --
.../api/dto/admin/AdminAuthenticationDTO.java | 28 ------
.../iocoder/mall/admin/dao/AdminMapper.java | 32 -------
.../mall/admin/dataobject/AdminDO.java | 50 ----------
.../mall/admin/service/OAuth2ServiceImpl.java | 93 ------------------
.../controller/admins/AdminController.java | 21 -----
48 files changed, 627 insertions(+), 400 deletions(-)
create mode 100644 system/system-biz-api/src/main/java/cn/iocoder/mall/system/biz/enums/admin/AdminStatusEnum.java
create mode 100644 system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dto/admin/AdminPageDTO.java
create mode 100644 system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dto/authorization/AuthorizationGetRoleMapByAccountIdsDTO.java
create mode 100644 system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dto/authorization/RoleGetListDTO.java
create mode 100644 system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dto/oatuh2/OAuth2RefreshTokenAuthenticateDTO.java
create mode 100644 system/system-rest/src/main/java/cn/iocoder/mall/system/rest/request/admin/AdminsAdminPageRequest.java
create mode 100644 system/system-rest/src/main/java/cn/iocoder/mall/system/rest/response/admin/AdminsAdminPageResponse.java
delete mode 100644 system/system-service-api/src/main/java/cn/iocoder/mall/system/api/dto/admin/AdminAuthenticationDTO.java
delete mode 100644 system/system-service-impl/src/main/java/cn/iocoder/mall/admin/dao/AdminMapper.java
delete mode 100644 system/system-service-impl/src/main/java/cn/iocoder/mall/admin/dataobject/AdminDO.java
diff --git a/admin-web/src/models/admin/adminList.js b/admin-web/src/models/admin/adminList.js
index 95025b69f..cade26268 100644
--- a/admin-web/src/models/admin/adminList.js
+++ b/admin-web/src/models/admin/adminList.js
@@ -4,17 +4,19 @@ import {
addAdmin,
adminRoleAssign,
deleteAdmin,
- queryAdmin,
queryAdminRoleList,
updateAdmin,
updateAdminStatus,
deptTreeAll,
} from '../../services/admin';
+import {
+ adminPage
+} from '../../services/system';
import { arrayToStringParams } from '../../utils/request.qs';
import PaginationHelper from '../../../helpers/PaginationHelper';
const SEARCH_PARAMS_DEFAULT = {
- nickname: '',
+ name: '',
};
const buildSelectTree = list => {
@@ -76,7 +78,7 @@ export default {
});
// 请求
- const response = yield call(queryAdmin, payload);
+ const response = yield call(adminPage, payload);
// 响应
yield put({
type: 'setAll',
@@ -84,7 +86,7 @@ export default {
list: response.data.list,
pagination: PaginationHelper.formatPagination(response.data, payload),
searchParams: {
- nickname: payload.nickname || '',
+ name: payload.name || '',
},
},
});
diff --git a/admin-web/src/pages/Admin/AdminList.js b/admin-web/src/pages/Admin/AdminList.js
index 1866cfad8..a78de6e75 100644
--- a/admin-web/src/pages/Admin/AdminList.js
+++ b/admin-web/src/pages/Admin/AdminList.js
@@ -28,7 +28,7 @@ import PaginationHelper from '../../../helpers/PaginationHelper';
const FormItem = Form.Item;
const { TreeNode } = Tree;
-const status = ['未知', '正常', '禁用'];
+const status = ['未知', '在职', '离职'];
// 列表
function List({
@@ -52,23 +52,6 @@ function List({
});
}
- function handleStatus(record) {
- Modal.confirm({
- title: record.status === 1 ? '确认禁用' : '取消禁用',
- content: `${record.username}`,
- onOk() {
- dispatch({
- type: 'adminList/updateStatus',
- payload: {
- id: record.id,
- status: record.status === 1 ? 2 : 1,
- },
- });
- },
- onCancel() {},
- });
- }
-
function handleDelete(record) {
Modal.confirm({
title: `确认删除?`,
@@ -92,7 +75,7 @@ function List({
},
{
title: '员工姓名',
- dataIndex: 'nickname',
+ dataIndex: 'name',
},
{
title: '部门',
@@ -115,7 +98,7 @@ function List({
},
},
{
- title: '状态',
+ title: '在职状态',
dataIndex: 'status',
render(val) {
return {status[val]}; // TODO 芋艿,此处要改
@@ -130,16 +113,12 @@ function List({
title: '操作',
width: 360,
render: (text, record) => {
- const statusText = record.status === 1 ? '禁用' : '开启'; // TODO 芋艿,此处要改
return (
handleModalVisible(true, 'update', record)}>编辑
handleRoleAssign(record)}>角色分配
- handleStatus(record)}>
- {statusText}
-
{record.status === 2 ? (
@@ -223,7 +202,7 @@ const SearchForm = Form.create()(props => {
- {getFieldDecorator('nickname')()}
+ {getFieldDecorator('name')()}
@@ -233,7 +212,7 @@ const SearchForm = Form.create()(props => {
})(
{
okText="保存"
onCancel={() => handleModalVisible()}
>
-
- {form.getFieldDecorator('username', {
- rules: [
- { required: true, message: '请输入账号!' },
- { max: 16, min: 6, message: '长度为 6-16 位' },
- {
- validator: (rule, value, callback) =>
- checkTypeWithEnglishAndNumbers(rule, value, callback, '数字以及字母'),
- },
- ],
- initialValue: formVals.username,
- })()}
-
- {form.getFieldDecorator('nickname', {
+ {form.getFieldDecorator('name', {
rules: [
{ required: true, message: '请输入员工姓名!' },
{ max: 10, message: '姓名最大长度为 10' },
],
- initialValue: formVals.nickname,
+ initialValue: formVals.name,
})()}
@@ -364,6 +330,19 @@ const AddOrUpdateForm = Form.create()(props => {
/>
)}
+
+ {form.getFieldDecorator('username', {
+ rules: [
+ { required: true, message: '请输入账号!' },
+ { max: 16, min: 6, message: '长度为 6-16 位' },
+ {
+ validator: (rule, value, callback) =>
+ checkTypeWithEnglishAndNumbers(rule, value, callback, '数字以及字母'),
+ },
+ ],
+ initialValue: formVals.username,
+ })()}
+
{form.getFieldDecorator('password', {
rules: [
diff --git a/admin-web/src/pages/Admin/RoleList.js b/admin-web/src/pages/Admin/RoleList.js
index 8cd9df096..0befe716f 100644
--- a/admin-web/src/pages/Admin/RoleList.js
+++ b/admin-web/src/pages/Admin/RoleList.js
@@ -10,6 +10,7 @@ import styles from './RoleList.less';
const FormItem = Form.Item;
const { TreeNode } = Tree;
+const types = ['未知', '系统角色', '自定义角色'];
// 添加 form 表单
const CreateForm = Form.create()(props => {
@@ -296,6 +297,13 @@ class RoleList extends PureComponent {
title: '编码',
dataIndex: 'code',
},
+ {
+ title: '类型',
+ dataIndex: 'type',
+ render(val) {
+ return {types[val]};
+ },
+ },
{
title: '创建时间',
dataIndex: 'createTime',
@@ -307,13 +315,21 @@ class RoleList extends PureComponent {
width: 200,
render: (text, record) => (
- this.handleModalVisible(true, 'update', record)}>更新
+ {record.type === 2 ? (
+
+ this.handleModalVisible(true, 'update', record)}>更新
+
+ ) : null}
this.handleAssignModalVisible(true, record)}>分配权限
- this.handleDelete(record)}>
- 删除
-
+ {record.type === 2 ? (
+
+ this.handleDelete(record)}>
+ 删除
+
+
+ ) : null}
),
},
diff --git a/admin-web/src/services/system.js b/admin-web/src/services/system.js
index 3b4453630..06a524339 100644
--- a/admin-web/src/services/system.js
+++ b/admin-web/src/services/system.js
@@ -89,3 +89,11 @@ export async function roleUpdate(params) {
body: {},
});
}
+
+// ========== Admin 模块 ==========
+
+export async function adminPage(params) {
+ return request(`/system-api/admins/admin/page?${stringify(params)}`, {
+ method: 'GET',
+ });
+}
diff --git a/common/common-framework/src/main/java/cn/iocoder/common/framework/util/CollectionUtil.java b/common/common-framework/src/main/java/cn/iocoder/common/framework/util/CollectionUtil.java
index 21ca16efb..2a737e87c 100644
--- a/common/common-framework/src/main/java/cn/iocoder/common/framework/util/CollectionUtil.java
+++ b/common/common-framework/src/main/java/cn/iocoder/common/framework/util/CollectionUtil.java
@@ -41,6 +41,12 @@ public class CollectionUtil {
Collectors.mapping(valueFunc, Collectors.toList())));
}
+ // 暂时没想好名字,先以 2 结尾噶
+ public static Map> convertMultiMap2(List from, Function keyFunc, Function valueFunc) {
+ return from.stream().collect(Collectors.groupingBy(keyFunc,
+ Collectors.mapping(valueFunc, Collectors.toSet())));
+ }
+
public static boolean containsAny(Collection> source, Collection> candidates) {
return CollectionUtils.containsAny(source, candidates);
}
diff --git a/system/pom.xml b/system/pom.xml
index ce815a2d3..f6cd2d90a 100644
--- a/system/pom.xml
+++ b/system/pom.xml
@@ -16,8 +16,8 @@
system-application
- system-service-api
- system-service-impl
+
+
system-rpc-api
system-rpc
system-rest
diff --git a/system/system-biz-api/src/main/java/cn/iocoder/mall/system/biz/enums/SystemErrorCodeEnum.java b/system/system-biz-api/src/main/java/cn/iocoder/mall/system/biz/enums/SystemErrorCodeEnum.java
index e150c32f0..9fac37acd 100644
--- a/system/system-biz-api/src/main/java/cn/iocoder/mall/system/biz/enums/SystemErrorCodeEnum.java
+++ b/system/system-biz-api/src/main/java/cn/iocoder/mall/system/biz/enums/SystemErrorCodeEnum.java
@@ -16,6 +16,9 @@ public enum SystemErrorCodeEnum implements ServiceExceptionUtil.Enumerable {
OAUTH2_ACCESS_TOKEN_TOKEN_EXPIRED(1001001002, "访问令牌已过期"),
OAUTH2_ACCESS_TOKEN_INVALID(1001001003, "访问令牌已失效"),
OAUTH2_NOT_AUTHENTICATE(1001001004, "账号未登陆"),
+ OAUTH2_REFRESH_TOKEN_NOT_FOUND(1001001005, "刷新令牌不存在"),
+ OAUTH_REFRESH_TOKEN_EXPIRED(1001001006, "访问令牌已过期"),
+ OAUTH_REFRESH_TOKEN_INVALID(1001001007, "刷新令牌已失效"),
// 其它 1001001100 开始
OAUTH2_ACCOUNT_NOT_FOUND(1001001100, "账号不存在"),
OAUTH2_ACCOUNT_PASSWORD_ERROR(1001001101, "密码不正确"),
@@ -52,6 +55,8 @@ public enum SystemErrorCodeEnum implements ServiceExceptionUtil.Enumerable {
ROLE_NOT_EXISTS(1002004000, "角色不存在"),
ROLE_NAME_DUPLICATE(1002004001, "已经存在名为【{}}】的角色"),
ROLE_CODE_DUPLICATE(1002004002, "已经存在编码为【{}}】的角色"),
+ ROLE_CAN_NOT_UPDATE_SYSTEM_TYPE_ROLE(1002004004, "不能修改类型为系统内置的角色"),
+ ROLE_CAN_NOT_DELETE_SYSTEM_TYPE_ROLE(1002004005, "不能删除类型为系统内置的角色"),
// ========== 数据字典模块 1002005000 ==========
// DATA_DICT_EXISTS(1002005000, "该数据字典已经存在"),
diff --git a/system/system-biz-api/src/main/java/cn/iocoder/mall/system/biz/enums/admin/AdminStatusEnum.java b/system/system-biz-api/src/main/java/cn/iocoder/mall/system/biz/enums/admin/AdminStatusEnum.java
new file mode 100644
index 000000000..1f6281a79
--- /dev/null
+++ b/system/system-biz-api/src/main/java/cn/iocoder/mall/system/biz/enums/admin/AdminStatusEnum.java
@@ -0,0 +1,41 @@
+package cn.iocoder.mall.system.biz.enums.admin;
+
+import cn.iocoder.common.framework.core.IntArrayValuable;
+
+import java.util.Arrays;
+
+public enum AdminStatusEnum implements IntArrayValuable {
+
+ ACTIVE(1, "在职"),
+ INACTIVE(2, "离职");
+
+ public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(AdminStatusEnum::getStatus).toArray();
+
+ /**
+ * 在职状态
+ */
+ private final Integer status;
+ /**
+ * 描述
+ */
+ private final String name;
+
+ AdminStatusEnum(Integer status, String name) {
+ this.status = status;
+ this.name = name;
+ }
+
+ public Integer getStatus() {
+ return status;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public int[] array() {
+ return ARRAYS;
+ }
+
+}
diff --git a/system/system-biz-api/src/main/java/cn/iocoder/mall/system/biz/enums/authorization/ResourceIdEnum.java b/system/system-biz-api/src/main/java/cn/iocoder/mall/system/biz/enums/authorization/ResourceIdEnum.java
index b1475603d..c6199e344 100644
--- a/system/system-biz-api/src/main/java/cn/iocoder/mall/system/biz/enums/authorization/ResourceIdEnum.java
+++ b/system/system-biz-api/src/main/java/cn/iocoder/mall/system/biz/enums/authorization/ResourceIdEnum.java
@@ -1,7 +1,13 @@
package cn.iocoder.mall.system.biz.enums.authorization;
+/**
+ * Resource 编号枚举
+ */
public enum ResourceIdEnum {
+ /**
+ * 根节点
+ */
ROOT(0);
private final Integer id;
diff --git a/system/system-biz-api/src/main/java/cn/iocoder/mall/system/biz/enums/authorization/ResourceTypeEnum.java b/system/system-biz-api/src/main/java/cn/iocoder/mall/system/biz/enums/authorization/ResourceTypeEnum.java
index 851452f40..64511c872 100644
--- a/system/system-biz-api/src/main/java/cn/iocoder/mall/system/biz/enums/authorization/ResourceTypeEnum.java
+++ b/system/system-biz-api/src/main/java/cn/iocoder/mall/system/biz/enums/authorization/ResourceTypeEnum.java
@@ -5,7 +5,7 @@ import cn.iocoder.common.framework.core.IntArrayValuable;
import java.util.Arrays;
/**
- * 资源类型枚举
+ * Resource 类型枚举
*/
public enum ResourceTypeEnum implements IntArrayValuable {
diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/bo/admin/AdminBO.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/bo/admin/AdminBO.java
index 27900eef2..6a8c03da6 100644
--- a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/bo/admin/AdminBO.java
+++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/bo/admin/AdminBO.java
@@ -3,6 +3,8 @@ package cn.iocoder.mall.system.biz.bo.admin;
import lombok.Data;
import lombok.experimental.Accessors;
+import java.util.Date;
+
/**
* 管理员模块 - 账号信息 BO
*/
@@ -14,9 +16,25 @@ public class AdminBO {
* 管理员编号
*/
private Integer id;
+ /**
+ * 账号编号
+ */
+ private Integer accountId;
/**
* 真实名字
*/
private String name;
+ /**
+ * 部门编号
+ */
+ private Integer departmentId;
+ /**
+ * 在职状态
+ */
+ private Integer status;
+ /**
+ * 创建时间
+ */
+ private Date createTime;
}
diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/bo/authorization/RoleBO.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/bo/authorization/RoleBO.java
index 9d4b3cb69..50e8d1974 100644
--- a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/bo/authorization/RoleBO.java
+++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/bo/authorization/RoleBO.java
@@ -24,6 +24,10 @@ public class RoleBO {
* 角色编码
*/
private String code;
+ /**
+ * 角色类型
+ */
+ private Integer type;
/**
* 添加时间
*/
diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/convert/admin/AdminConvert.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/convert/admin/AdminConvert.java
index 0bddb49eb..f7cfb0d45 100644
--- a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/convert/admin/AdminConvert.java
+++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/convert/admin/AdminConvert.java
@@ -1,8 +1,11 @@
package cn.iocoder.mall.system.biz.convert.admin;
+import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.system.biz.bo.admin.AdminBO;
import cn.iocoder.mall.system.biz.dataobject.admin.AdminDO;
+import com.baomidou.mybatisplus.core.metadata.IPage;
import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
@Mapper
@@ -12,4 +15,7 @@ public interface AdminConvert {
AdminBO convert(AdminDO bean);
+ @Mapping(source = "records", target = "list")
+ PageResult convertPage(IPage bean);
+
}
diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/convert/oauth2/OAuth2Convert.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/convert/oauth2/OAuth2Convert.java
index c5c8dc22b..08845a6dc 100644
--- a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/convert/oauth2/OAuth2Convert.java
+++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/convert/oauth2/OAuth2Convert.java
@@ -3,6 +3,7 @@ package cn.iocoder.mall.system.biz.convert.oauth2;
import cn.iocoder.mall.system.biz.bo.ouath2.OAuth2AuthenticateBO;
import cn.iocoder.mall.system.biz.dataobject.oauth2.OAuth2AccessTokenDO;
import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
@Mapper
@@ -10,6 +11,7 @@ public interface OAuth2Convert {
OAuth2Convert INSTANCE = Mappers.getMapper(OAuth2Convert.class);
+ @Mapping(source = "id", target = "accessToken")
OAuth2AuthenticateBO convert(OAuth2AccessTokenDO bean);
}
diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dao/admin/AdminMapper.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dao/admin/AdminMapper.java
index b8bce40b1..f9b1a8e3b 100644
--- a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dao/admin/AdminMapper.java
+++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dao/admin/AdminMapper.java
@@ -1,8 +1,12 @@
package cn.iocoder.mall.system.biz.dao.admin;
+import cn.iocoder.mall.mybatis.query.QueryWrapperX;
import cn.iocoder.mall.system.biz.dataobject.admin.AdminDO;
+import cn.iocoder.mall.system.biz.dto.admin.AdminPageDTO;
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;
@Repository
@@ -14,4 +18,10 @@ public interface AdminMapper extends BaseMapper {
);
}
+ default IPage selectPage(AdminPageDTO adminPageDTO) {
+ return selectPage(new Page<>(adminPageDTO.getPageNo(), adminPageDTO.getPageSize()),
+ new QueryWrapperX().likeIfPresent("name", adminPageDTO.getName())
+ .eqIfPresent("department_id", adminPageDTO.getDepartmentId()));
+ }
+
}
diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dao/authorization/RoleMapper.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dao/authorization/RoleMapper.java
index b3ac325fc..12073f075 100644
--- a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dao/authorization/RoleMapper.java
+++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dao/authorization/RoleMapper.java
@@ -3,26 +3,26 @@ package cn.iocoder.mall.system.biz.dao.authorization;
import cn.iocoder.mall.mybatis.query.QueryWrapperX;
import cn.iocoder.mall.system.biz.dataobject.authorization.RoleDO;
import cn.iocoder.mall.system.biz.dto.authorization.RolePageDTO;
-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;
@Repository
public interface RoleMapper extends BaseMapper {
- default List selectList() {
- return selectList(new QueryWrapper<>());
- }
-
default IPage selectPage(RolePageDTO rolePageDTO) {
return selectPage(new Page<>(rolePageDTO.getPageNo(), rolePageDTO.getPageSize()),
new QueryWrapperX().likeIfPresent("name", rolePageDTO.getName()));
}
+ default List selectListByIds(Collection ids) {
+ return selectList(new QueryWrapperX().inIfPresent("id", ids));
+ }
+
default RoleDO selectByName(String name) {
return selectOne(new QueryWrapperX().eqIfPresent("name", name));
}
diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dataobject/admin/AdminDO.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dataobject/admin/AdminDO.java
index e43d329ef..6b3478430 100644
--- a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dataobject/admin/AdminDO.java
+++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dataobject/admin/AdminDO.java
@@ -2,6 +2,7 @@ package cn.iocoder.mall.system.biz.dataobject.admin;
import cn.iocoder.mall.mybatis.dataobject.DeletableDO;
import cn.iocoder.mall.system.biz.dataobject.account.AccountDO;
+import cn.iocoder.mall.system.biz.enums.admin.AdminStatusEnum;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -31,10 +32,16 @@ public class AdminDO extends DeletableDO {
*/
private String name;
/**
- * 科室编号
+ * 部门编号
*
* 关联 {@link DepartmentDO#getId()}
*/
private Integer departmentId;
+ /**
+ * 在职状态
+ *
+ * 枚举 {@link AdminStatusEnum}
+ */
+ private Integer status;
}
diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dto/admin/AdminPageDTO.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dto/admin/AdminPageDTO.java
new file mode 100644
index 000000000..24d6fdb2f
--- /dev/null
+++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dto/admin/AdminPageDTO.java
@@ -0,0 +1,26 @@
+package cn.iocoder.mall.system.biz.dto.admin;
+
+import cn.iocoder.common.framework.vo.PageParam;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * 管理员模块 - 管理员分页 DTO
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = true)
+public class AdminPageDTO extends PageParam {
+
+ /**
+ * 真实名字,模糊匹配
+ */
+ private String name;
+
+ /**
+ * 部门编号
+ */
+ private Integer departmentId;
+
+}
diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dto/authorization/AuthorizationGetRoleMapByAccountIdsDTO.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dto/authorization/AuthorizationGetRoleMapByAccountIdsDTO.java
new file mode 100644
index 000000000..d846de709
--- /dev/null
+++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dto/authorization/AuthorizationGetRoleMapByAccountIdsDTO.java
@@ -0,0 +1,19 @@
+package cn.iocoder.mall.system.biz.dto.authorization;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotNull;
+import java.util.Collection;
+
+/**
+ * 授权模块 - 获得每个账号所拥有的角色 DTO
+ */
+@Data
+@Accessors(chain = true)
+public class AuthorizationGetRoleMapByAccountIdsDTO {
+
+ @NotNull(message = "账号编号数组不能为空")
+ private Collection accountIds;
+
+}
diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dto/authorization/ResourceGetListDTO.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dto/authorization/ResourceGetListDTO.java
index 53a7ac806..1538c862e 100644
--- a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dto/authorization/ResourceGetListDTO.java
+++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dto/authorization/ResourceGetListDTO.java
@@ -14,6 +14,8 @@ public class ResourceGetListDTO {
/**
* 资源编号数组
+ *
+ * 如果传入空,则不进行资源编号的过滤
*/
private Collection ids;
diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dto/authorization/RoleGetListDTO.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dto/authorization/RoleGetListDTO.java
new file mode 100644
index 000000000..7c6655121
--- /dev/null
+++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dto/authorization/RoleGetListDTO.java
@@ -0,0 +1,22 @@
+package cn.iocoder.mall.system.biz.dto.authorization;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.Collection;
+
+/**
+ * 角色模块 - 获得角色列表 DTO
+ */
+@Data
+@Accessors(chain = true)
+public class RoleGetListDTO {
+
+ /**
+ * 角色编号数组
+ *
+ * 如果传入空,则不进行角色编号的过滤
+ */
+ private Collection ids;
+
+}
diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dto/oatuh2/OAuth2AccessTokenAuthenticateDTO.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dto/oatuh2/OAuth2AccessTokenAuthenticateDTO.java
index cb0b98bca..e146d12fc 100644
--- a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dto/oatuh2/OAuth2AccessTokenAuthenticateDTO.java
+++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dto/oatuh2/OAuth2AccessTokenAuthenticateDTO.java
@@ -3,16 +3,18 @@ package cn.iocoder.mall.system.biz.dto.oatuh2;
import lombok.Data;
import lombok.experimental.Accessors;
-import javax.validation.constraints.NotNull;
+import javax.validation.constraints.NotEmpty;
-// TODO 注释
+/**
+ * 认证模块 - 访问令牌认证 DTO
+ */
@Data
@Accessors(chain = true)
public class OAuth2AccessTokenAuthenticateDTO {
- @NotNull(message = "访问令牌不能为空")
+ @NotEmpty(message = "访问令牌不能为空")
private String accessToken;
- @NotNull(message = "IP 不能为空")
+ @NotEmpty(message = "IP 不能为空")
private String ip;
}
diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dto/oatuh2/OAuth2RefreshTokenAuthenticateDTO.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dto/oatuh2/OAuth2RefreshTokenAuthenticateDTO.java
new file mode 100644
index 000000000..095149c73
--- /dev/null
+++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dto/oatuh2/OAuth2RefreshTokenAuthenticateDTO.java
@@ -0,0 +1,20 @@
+package cn.iocoder.mall.system.biz.dto.oatuh2;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotEmpty;
+
+/**
+ * 认证模块 - 访问令牌认证 DTO
+ */
+@Data
+@Accessors(chain = true)
+public class OAuth2RefreshTokenAuthenticateDTO {
+
+ @NotEmpty(message = "访问令牌不能为空")
+ private String refreshToken;
+ @NotEmpty(message = "IP 不能为空")
+ private String ip;
+
+}
diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dto/oatuh2/OAuth2UsernameAuthenticateDTO.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dto/oatuh2/OAuth2UsernameAuthenticateDTO.java
index c132c4118..aebd947f1 100644
--- a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dto/oatuh2/OAuth2UsernameAuthenticateDTO.java
+++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/dto/oatuh2/OAuth2UsernameAuthenticateDTO.java
@@ -3,12 +3,19 @@ package cn.iocoder.mall.system.biz.dto.oatuh2;
import lombok.Data;
import lombok.experimental.Accessors;
-// TODO 注释
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 认证模块 - 账号 + 密码认证 DTO
+ */
@Data
@Accessors(chain = true)
public class OAuth2UsernameAuthenticateDTO {
+ @NotEmpty(message = "账号不能为空")
private String username;
+ @NotNull(message = "密码不能为空")
private String password;
}
diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/admin/AdminService.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/admin/AdminService.java
index 60e35e53d..04023af38 100644
--- a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/admin/AdminService.java
+++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/admin/AdminService.java
@@ -1,14 +1,30 @@
package cn.iocoder.mall.system.biz.service.admin;
+import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.system.biz.bo.admin.AdminBO;
+import cn.iocoder.mall.system.biz.dto.admin.AdminPageDTO;
/**
- * 管理员 Service 接口
+ * 管理员模块 - Service 接口
*/
public interface AdminService {
+ /**
+ * 根据编号获得管理员信息
+ *
+ * @param id 编号
+ * @return 管理员
+ */
AdminBO getAdmin(Integer id);
+ /**
+ * 获得账号编号获得管理员信息
+ *
+ * @param accountId 账号编号
+ * @return 管理员
+ */
AdminBO getAdminByAccountId(Integer accountId);
+ PageResult getAdminPage(AdminPageDTO pageDTO);
+
}
diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/admin/AdminServiceImpl.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/admin/AdminServiceImpl.java
index 616c2ceb4..a6c02e803 100644
--- a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/admin/AdminServiceImpl.java
+++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/admin/AdminServiceImpl.java
@@ -1,9 +1,10 @@
package cn.iocoder.mall.system.biz.service.admin;
+import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.system.biz.bo.admin.AdminBO;
import cn.iocoder.mall.system.biz.convert.admin.AdminConvert;
import cn.iocoder.mall.system.biz.dao.admin.AdminMapper;
-import cn.iocoder.mall.system.biz.dataobject.admin.AdminDO;
+import cn.iocoder.mall.system.biz.dto.admin.AdminPageDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -15,14 +16,17 @@ public class AdminServiceImpl implements AdminService {
@Override
public AdminBO getAdmin(Integer id) {
- AdminDO adminDO = adminMapper.selectById(id);
- return AdminConvert.INSTANCE.convert(adminDO);
+ return AdminConvert.INSTANCE.convert(adminMapper.selectById(id));
}
@Override
public AdminBO getAdminByAccountId(Integer accountId) {
- AdminDO adminDO = adminMapper.selectByAccountId(accountId);
- return AdminConvert.INSTANCE.convert(adminDO);
+ return AdminConvert.INSTANCE.convert(adminMapper.selectByAccountId(accountId));
+ }
+
+ @Override
+ public PageResult getAdminPage(AdminPageDTO pageDTO) {
+ return AdminConvert.INSTANCE.convertPage(adminMapper.selectPage(pageDTO));
}
}
diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/authorization/AuthorizationService.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/authorization/AuthorizationService.java
index 35845effb..080d8c96c 100644
--- a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/authorization/AuthorizationService.java
+++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/authorization/AuthorizationService.java
@@ -3,12 +3,11 @@ package cn.iocoder.mall.system.biz.service.authorization;
import cn.iocoder.common.framework.exception.ServiceException;
import cn.iocoder.mall.system.biz.bo.authorization.ResourceBO;
import cn.iocoder.mall.system.biz.bo.authorization.ResourceTreeNodeBO;
-import cn.iocoder.mall.system.biz.dto.authorization.AuthorizationAssignRoleResourceDTO;
-import cn.iocoder.mall.system.biz.dto.authorization.AuthorizationCheckPermissionsDTO;
-import cn.iocoder.mall.system.biz.dto.authorization.AuthorizationGetResourcesByAccountIdDTO;
-import cn.iocoder.mall.system.biz.dto.authorization.AuthorizationGetRoleResourcesDTO;
+import cn.iocoder.mall.system.biz.bo.authorization.RoleBO;
+import cn.iocoder.mall.system.biz.dto.authorization.*;
import java.util.List;
+import java.util.Map;
import java.util.Set;
/**
@@ -33,6 +32,14 @@ public interface AuthorizationService {
*/
List getResourcesByAccountId(AuthorizationGetResourcesByAccountIdDTO getResourcesByAccountIdDTO);
+ /**
+ * 获得每个账号拥有的角色集合
+ *
+ * @param getRoleMapByAccountIdsDTO 查询条件 DTO
+ * @return <账号编号, >
+ */
+ Map> getRoleMapByAccountIds(AuthorizationGetRoleMapByAccountIdsDTO getRoleMapByAccountIdsDTO);
+
/**
* 获得指定账号的资源树
*
diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/authorization/AuthorizationServiceImpl.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/authorization/AuthorizationServiceImpl.java
index 44f11aead..d45b244a2 100644
--- a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/authorization/AuthorizationServiceImpl.java
+++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/authorization/AuthorizationServiceImpl.java
@@ -5,6 +5,7 @@ import cn.iocoder.common.framework.util.ServiceExceptionUtil;
import cn.iocoder.mall.mybatis.enums.DeletedStatusEnum;
import cn.iocoder.mall.system.biz.bo.authorization.ResourceBO;
import cn.iocoder.mall.system.biz.bo.authorization.ResourceTreeNodeBO;
+import cn.iocoder.mall.system.biz.bo.authorization.RoleBO;
import cn.iocoder.mall.system.biz.dao.authorization.AccountRoleMapper;
import cn.iocoder.mall.system.biz.dao.authorization.RoleResourceMapper;
import cn.iocoder.mall.system.biz.dataobject.authorization.AccountRoleDO;
@@ -94,6 +95,25 @@ public class AuthorizationServiceImpl implements AuthorizationService {
return resourceService.getResources(new ResourceGetListDTO().setIds(resourceIds).setType(getResourcesByAccountIdDTO.getType()));
}
+ @Override
+ public Map> getRoleMapByAccountIds(AuthorizationGetRoleMapByAccountIdsDTO getRoleMapByAccountIdsDTO) {
+ return null;
+ }
+
+// @Override
+// public Map> getRoleIdMapByAccountIds(AuthorizationGetRoleMapByAccountIdsDTO getRoleMapByAccountIdsDTO) {
+// // 查询管理员拥有的角色关联数据
+// List accountRoleDOs = accountRoleMapper.selectListByAccountIds(getRoleMapByAccountIdsDTO.getAccountIds());
+// if (CollectionUtil.isEmpty(accountRoleDOs)) {
+// return Collections.emptyMap();
+// }
+// // 构建结果
+// Map> accountRoleMap = CollectionUtil.convertMultiMap2(accountRoleDOs,
+// AccountRoleDO::getAccountId, AccountRoleDO::getRoleId);
+// getRoleMapByAccountIdsDTO.getAccountIds().forEach(accountId -> accountRoleMap.putIfAbsent(accountId, Collections.emptySet()));
+// return accountRoleMap;
+// }
+
@Override
public List getResourceTreeByAccountId(AuthorizationGetResourcesByAccountIdDTO getResourcesByAccountIdDTO) {
// 查询管理员拥有的角色关联数据
diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/authorization/RoleService.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/authorization/RoleService.java
index 95588f6fa..cb7cfcf4b 100644
--- a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/authorization/RoleService.java
+++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/authorization/RoleService.java
@@ -6,6 +6,7 @@ import cn.iocoder.mall.system.biz.dto.authorization.RoleAddDTO;
import cn.iocoder.mall.system.biz.dto.authorization.RoleDeleteDTO;
import cn.iocoder.mall.system.biz.dto.authorization.RolePageDTO;
import cn.iocoder.mall.system.biz.dto.authorization.RoleUpdateDTO;
+import cn.iocoder.mall.system.biz.dto.authorization.RoleGetListDTO;
import java.util.Collection;
import java.util.List;
@@ -17,7 +18,7 @@ public interface RoleService {
RoleBO getRole(Integer id);
- List getRoleList(Collection ids);
+ List getRoleList(RoleGetListDTO getListDTO);
PageResult getRolePage(RolePageDTO pageDTO);
diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/authorization/RoleServiceImpl.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/authorization/RoleServiceImpl.java
index 534d28704..f3f1da4c8 100644
--- a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/authorization/RoleServiceImpl.java
+++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/authorization/RoleServiceImpl.java
@@ -8,12 +8,10 @@ import cn.iocoder.mall.system.biz.bo.authorization.RoleBO;
import cn.iocoder.mall.system.biz.convert.authorization.RoleConvert;
import cn.iocoder.mall.system.biz.dao.authorization.RoleMapper;
import cn.iocoder.mall.system.biz.dataobject.authorization.RoleDO;
-import cn.iocoder.mall.system.biz.dto.authorization.RoleAddDTO;
-import cn.iocoder.mall.system.biz.dto.authorization.RoleDeleteDTO;
-import cn.iocoder.mall.system.biz.dto.authorization.RolePageDTO;
-import cn.iocoder.mall.system.biz.dto.authorization.RoleUpdateDTO;
+import cn.iocoder.mall.system.biz.dto.authorization.*;
import cn.iocoder.mall.system.biz.enums.SystemErrorCodeEnum;
import cn.iocoder.mall.system.biz.enums.authorization.RoleCodeEnum;
+import cn.iocoder.mall.system.biz.enums.authorization.RoleTypeEnum;
import cn.iocoder.mall.system.biz.event.authorization.ResourceDeleteEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
@@ -39,8 +37,8 @@ public class RoleServiceImpl implements RoleService {
}
@Override
- public List getRoleList(Collection ids) {
- return RoleConvert.INSTANCE.convertList(roleMapper.selectBatchIds(ids));
+ public List getRoleList(RoleGetListDTO getListDTO) {
+ return RoleConvert.INSTANCE.convertList(roleMapper.selectListByIds(getListDTO.getIds()));
}
@Override
@@ -62,9 +60,10 @@ public class RoleServiceImpl implements RoleService {
@Override
public Integer addRole(RoleAddDTO roleAddDTO) {
// 校验角色
- checkRole(roleAddDTO.getName(), roleAddDTO.getCode(), null);
+ checkDuplicateRole(roleAddDTO.getName(), roleAddDTO.getCode(), null);
// 保存到数据库
RoleDO role = RoleConvert.INSTANCE.convert(roleAddDTO);
+ role.setType(RoleTypeEnum.CUSTOM.getType());
role.setCreateTime(new Date());
role.setDeleted(DeletedStatusEnum.DELETED_NO.getValue());
roleMapper.insert(role);
@@ -76,14 +75,19 @@ public class RoleServiceImpl implements RoleService {
@Override
public void updateRole(RoleUpdateDTO roleUpdateDTO) {
// 校验角色是否存在
- if (roleMapper.selectById(roleUpdateDTO.getId()) == null) {
+ RoleDO roleDO = roleMapper.selectById(roleUpdateDTO.getId());
+ if (roleDO == null) {
throw ServiceExceptionUtil.exception(SystemErrorCodeEnum.ROLE_NOT_EXISTS);
}
- // 校验角色
- checkRole(roleUpdateDTO.getName(), roleUpdateDTO.getCode(), roleUpdateDTO.getId());
+ // 内置角色,不允许修改
+ if (RoleTypeEnum.SYSTEM.getType().equals(roleDO.getType())) {
+ throw ServiceExceptionUtil.exception(SystemErrorCodeEnum.ROLE_CAN_NOT_UPDATE_SYSTEM_TYPE_ROLE);
+ }
+ // 校验角色的唯一字段是否重复
+ checkDuplicateRole(roleUpdateDTO.getName(), roleUpdateDTO.getCode(), roleUpdateDTO.getId());
// 更新到数据库
- RoleDO roleDO = RoleConvert.INSTANCE.convert(roleUpdateDTO);
- roleMapper.updateById(roleDO);
+ RoleDO updateRole = RoleConvert.INSTANCE.convert(roleUpdateDTO);
+ roleMapper.updateById(updateRole);
// TODO 插入操作日志
}
@@ -91,9 +95,14 @@ public class RoleServiceImpl implements RoleService {
@Transactional
public void deleteRole(RoleDeleteDTO roleDeleteDTO) {
// 校验角色是否存在
- if (roleMapper.selectById(roleDeleteDTO.getId()) == null) {
+ RoleDO roleDO = roleMapper.selectById(roleDeleteDTO.getId());
+ if (roleDO == null) {
throw ServiceExceptionUtil.exception(SystemErrorCodeEnum.ROLE_NOT_EXISTS);
}
+ // 内置角色,不允许删除
+ if (RoleTypeEnum.SYSTEM.getType().equals(roleDO.getType())) {
+ throw ServiceExceptionUtil.exception(SystemErrorCodeEnum.ROLE_CAN_NOT_DELETE_SYSTEM_TYPE_ROLE);
+ }
// 更新到数据库,标记删除
roleMapper.deleteById(roleDeleteDTO.getId());
// 发布角色删除事件,方便清理关联表
@@ -102,7 +111,7 @@ public class RoleServiceImpl implements RoleService {
}
/**
- * 校验角色是否合法
+ * 校验角色的唯一字段是否重复
*
* 1. 是否存在相同名字的角色
* 2. 是否存在相同编码的角色
@@ -111,31 +120,20 @@ public class RoleServiceImpl implements RoleService {
* @param code 角色额编码
* @param id 角色编号
*/
- private void checkRole(String name, String code, Integer id) {
- // 1. 是否存在相同名字的角色
+ private void checkDuplicateRole(String name, String code, Integer id) {
+ // 1. 该 name 名字被其它角色所使用
RoleDO role = roleMapper.selectByName(name);
- if (role != null) {
- // 如果 id 为空,说明不用比较是否为相同 id 的资源
- if (id == null) {
- throw ServiceExceptionUtil.exception(SystemErrorCodeEnum.ROLE_NAME_DUPLICATE, name);
- }
- if (!role.getId().equals(id)) {
- throw ServiceExceptionUtil.exception(SystemErrorCodeEnum.ROLE_NAME_DUPLICATE, name);
- }
+ if (role != null && !role.getId().equals(id)) {
+ throw ServiceExceptionUtil.exception(SystemErrorCodeEnum.ROLE_NAME_DUPLICATE, name);
}
// 2. 是否存在相同编码的角色
if (!StringUtil.hasText(code)) {
return;
}
+ // 该 code 编码被其它角色所使用
role = roleMapper.selectByCode(code);
- if (role != null) {
- // 如果 id 为空,说明不用比较是否为相同 id 的资源
- if (id == null) {
- throw ServiceExceptionUtil.exception(SystemErrorCodeEnum.ROLE_CODE_DUPLICATE, name);
- }
- if (!role.getId().equals(id)) {
- throw ServiceExceptionUtil.exception(SystemErrorCodeEnum.ROLE_CODE_DUPLICATE, name);
- }
+ if (role != null && !role.getId().equals(id)) {
+ throw ServiceExceptionUtil.exception(SystemErrorCodeEnum.ROLE_CODE_DUPLICATE, name);
}
}
diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/oauth2/OAuth2Service.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/oauth2/OAuth2Service.java
index 8387089ee..ec081b784 100644
--- a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/oauth2/OAuth2Service.java
+++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/oauth2/OAuth2Service.java
@@ -3,6 +3,7 @@ package cn.iocoder.mall.system.biz.service.oauth2;
import cn.iocoder.mall.system.biz.bo.ouath2.OAuth2AuthenticateBO;
import cn.iocoder.mall.system.biz.dto.oatuh2.OAuth2AccessTokenAuthenticateDTO;
import cn.iocoder.mall.system.biz.dto.oatuh2.OAuth2MobileCodeAuthenticateDTO;
+import cn.iocoder.mall.system.biz.dto.oatuh2.OAuth2RefreshTokenAuthenticateDTO;
import cn.iocoder.mall.system.biz.dto.oatuh2.OAuth2UsernameAuthenticateDTO;
/**
@@ -16,4 +17,6 @@ public interface OAuth2Service {
OAuth2AuthenticateBO authenticate(OAuth2AccessTokenAuthenticateDTO authenticateDTO);
+ OAuth2AuthenticateBO authenticate(OAuth2RefreshTokenAuthenticateDTO authenticateDTO);
+
}
diff --git a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/oauth2/OAuth2ServiceImpl.java b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/oauth2/OAuth2ServiceImpl.java
index 0e0d4f6d4..d19e7d5be 100644
--- a/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/oauth2/OAuth2ServiceImpl.java
+++ b/system/system-biz/src/main/java/cn/iocoder/mall/system/biz/service/oauth2/OAuth2ServiceImpl.java
@@ -13,8 +13,8 @@ import cn.iocoder.mall.system.biz.dataobject.oauth2.OAuth2RefreshTokenDO;
import cn.iocoder.mall.system.biz.dto.account.AccountCreateDTO;
import cn.iocoder.mall.system.biz.dto.oatuh2.OAuth2AccessTokenAuthenticateDTO;
import cn.iocoder.mall.system.biz.dto.oatuh2.OAuth2MobileCodeAuthenticateDTO;
+import cn.iocoder.mall.system.biz.dto.oatuh2.OAuth2RefreshTokenAuthenticateDTO;
import cn.iocoder.mall.system.biz.dto.oatuh2.OAuth2UsernameAuthenticateDTO;
-import cn.iocoder.mall.system.biz.enums.SystemErrorCodeEnum;
import cn.iocoder.mall.system.biz.service.account.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@@ -24,8 +24,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.UUID;
-import static cn.iocoder.mall.system.biz.enums.SystemErrorCodeEnum.OAUTH2_ACCOUNT_NOT_FOUND;
-import static cn.iocoder.mall.system.biz.enums.SystemErrorCodeEnum.OAUTH2_ACCOUNT_PASSWORD_ERROR;
+import static cn.iocoder.mall.system.biz.enums.SystemErrorCodeEnum.*;
@Service
public class OAuth2ServiceImpl implements OAuth2Service {
@@ -101,18 +100,42 @@ public class OAuth2ServiceImpl implements OAuth2Service {
public OAuth2AuthenticateBO authenticate(OAuth2AccessTokenAuthenticateDTO authenticateDTO) {
OAuth2AccessTokenDO oauth2AccessTokenDO = oauth2AccessTokenMapper.selectById(authenticateDTO.getAccessToken());
if (oauth2AccessTokenDO == null) { // 不存在
- throw ServiceExceptionUtil.exception(SystemErrorCodeEnum.OAUTH2_ACCESS_TOKEN_NOT_FOUND.getCode());
+ throw ServiceExceptionUtil.exception(OAUTH2_ACCESS_TOKEN_NOT_FOUND);
}
if (oauth2AccessTokenDO.getExpiresTime().getTime() < System.currentTimeMillis()) { // 已过期
- throw ServiceExceptionUtil.exception(SystemErrorCodeEnum.OAUTH2_ACCESS_TOKEN_TOKEN_EXPIRED.getCode());
+ throw ServiceExceptionUtil.exception(OAUTH2_ACCESS_TOKEN_TOKEN_EXPIRED);
}
if (!oauth2AccessTokenDO.getValid()) { // 无效
- throw ServiceExceptionUtil.exception(SystemErrorCodeEnum.OAUTH2_ACCESS_TOKEN_INVALID.getCode());
+ throw ServiceExceptionUtil.exception(OAUTH2_ACCESS_TOKEN_INVALID);
}
// 转换返回
return OAuth2Convert.INSTANCE.convert(oauth2AccessTokenDO);
}
+ @Override
+ @Transactional
+ public OAuth2AuthenticateBO authenticate(OAuth2RefreshTokenAuthenticateDTO authenticateDTO) {
+ OAuth2RefreshTokenDO refreshTokenDO = oauth2RefreshTokenMapper.selectById(authenticateDTO.getRefreshToken());
+ // 校验刷新令牌是否合法
+ if (refreshTokenDO == null) { // 不存在
+ throw ServiceExceptionUtil.exception(OAUTH2_REFRESH_TOKEN_NOT_FOUND);
+ }
+ if (refreshTokenDO.getExpiresTime().getTime() < System.currentTimeMillis()) { // 已过期
+ throw ServiceExceptionUtil.exception(OAUTH_REFRESH_TOKEN_EXPIRED);
+ }
+ if (!refreshTokenDO.getValid()) { // 无效
+ throw ServiceExceptionUtil.exception(OAUTH_REFRESH_TOKEN_INVALID);
+ }
+ // 标记 refreshToken 对应的 accessToken 都不合法
+ // 这块的实现,参考了 Spring Security OAuth2 的代码
+ oauth2AccessTokenMapper.updateToInvalidByRefreshToken(authenticateDTO.getRefreshToken());
+ // 创建访问令牌
+ OAuth2AccessTokenDO oauth2AccessTokenDO = createOAuth2AccessToken(refreshTokenDO.getAccountId(),
+ refreshTokenDO.getId());
+ // 转换返回
+ return OAuth2Convert.INSTANCE.convert(oauth2AccessTokenDO);
+ }
+
private OAuth2AccessTokenDO createOAuth2AccessToken(Integer accountId, String refreshToken) {
OAuth2AccessTokenDO accessToken = new OAuth2AccessTokenDO()
.setId(generateAccessToken())
diff --git a/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/controller/admin/AdminsAdminController.java b/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/controller/admin/AdminsAdminController.java
index 7e61566bf..b3fb5df36 100644
--- a/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/controller/admin/AdminsAdminController.java
+++ b/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/controller/admin/AdminsAdminController.java
@@ -1,7 +1,19 @@
package cn.iocoder.mall.system.rest.controller.admin;
import cn.iocoder.common.framework.constant.MallConstants;
+import cn.iocoder.common.framework.vo.CommonResult;
+import cn.iocoder.common.framework.vo.PageResult;
+import cn.iocoder.mall.security.core.annotation.RequiresPermissions;
+import cn.iocoder.mall.system.biz.bo.admin.AdminBO;
+import cn.iocoder.mall.system.biz.dto.admin.AdminPageDTO;
+import cn.iocoder.mall.system.biz.service.admin.AdminService;
+import cn.iocoder.mall.system.rest.convert.admin.AdminsAdminConvert;
+import cn.iocoder.mall.system.rest.request.admin.AdminsAdminPageRequest;
+import cn.iocoder.mall.system.rest.response.admin.AdminsAdminPageResponse;
import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@@ -10,6 +22,88 @@ import org.springframework.web.bind.annotation.RestController;
@Api(tags = "管理员 - 管理员 API")
public class AdminsAdminController {
+ @Autowired
+ private AdminService adminService;
+ @GetMapping("/page")
+ @RequiresPermissions("system:admin:page")
+ @ApiOperation(value = "管理员分页")
+ public CommonResult> page(AdminsAdminPageRequest request) {
+ // 查询管理员分页
+ AdminPageDTO pageDTO = AdminsAdminConvert.INSTANCE.convert(request);
+ PageResult adminPageBO = adminService.getAdminPage(pageDTO);
+ PageResult adminPageResponse = AdminsAdminConvert.INSTANCE.convertPage(adminPageBO);
+ if (adminPageResponse.getList().isEmpty()) {
+ return CommonResult.success(adminPageResponse);
+ }
+ // 拼接角色数据
+
+
+ // TODO 拼接部门数据
+
+ // 拼接结果
+// if (!resultPage.getList().isEmpty()) {
+// // 查询角色数组
+// Map> roleMap = adminService.getAdminRolesMap(CollectionUtil.convertList(resultPage.getList(), AdminBO::getId));
+// resultPage.getList().forEach(admin -> admin.setRoles(AdminConvert.INSTANCE.convertAdminVORoleList(roleMap.get(admin.getId()))));
+//
+// // 查询对应部门
+// List deptmentBOS = deptmentService.getAllDeptments();
+// Map deptNameMap = deptmentBOS.stream().collect(Collectors.toMap(d->d.getId(), d->d.getName()));
+// //管理员所在部门被删后,变成未分配状态
+// deptNameMap.put(0, "未分配");
+// resultPage.getList().forEach(admin->{
+// admin.setDeptment(new AdminVO.Deptment(admin.getDeptmentId(), deptNameMap.get(admin.getDeptmentId())));
+// });
+// }
+
+ return CommonResult.success(adminPageResponse);
+ }
+
+// @PostMapping("/add")
+// @ApiOperation(value = "创建管理员")
+// public CommonResult add(AdminAddDTO adminAddDTO) {
+// return success(adminService.addAdmin(AdminSecurityContextHolder.getContext().getAdminId(), adminAddDTO));
+// }
+//
+// @PostMapping("/update")
+// @ApiOperation(value = "更新管理员")
+// public CommonResult update(AdminUpdateDTO adminUpdateDTO) {
+// return success(adminService.updateAdmin(AdminSecurityContextHolder.getContext().getAdminId(), adminUpdateDTO));
+// }
+//
+// @PostMapping("/update_status")
+// @ApiOperation(value = "更新管理员状态")
+// public CommonResult updateStatus(AdminUpdateStatusDTO adminUpdateStatusDTO) {
+// return success(adminService.updateAdminStatus(AdminSecurityContextHolder.getContext().getAdminId(), adminUpdateStatusDTO));
+// }
+//
+// @PostMapping("/delete")
+// @ApiOperation(value = "删除管理员")
+// @ApiImplicitParam(name = "id", value = "管理员编号", required = true, example = "1")
+// public CommonResult delete(@RequestParam("id") Integer id) {
+// return success(adminService.deleteAdmin(AdminSecurityContextHolder.getContext().getAdminId(), id));
+// }
+//
+// @GetMapping("/role_list")
+// @ApiOperation(value = "指定管理员拥有的角色列表")
+// @ApiImplicitParam(name = "id", value = "管理员编号", required = true, example = "1")
+// public CommonResult> roleList(@RequestParam("id") Integer id) {
+// // 获得所有角色列表
+// List allRoleList = roleService.getRoleList();
+// // 获得管理员的角色数组
+// Set adminRoleIdSet = CollectionUtil.convertSet(adminService.getRoleList(id), RoleBO::getId);
+// // 转换出返回结果
+// List result = AdminConvert.INSTANCE.convert(allRoleList);
+// // 设置每个角色是否赋予给改管理员
+// result.forEach(adminRoleVO -> adminRoleVO.setAssigned(adminRoleIdSet.contains(adminRoleVO.getId())));
+// return success(result);
+// }
+//
+// @PostMapping("/assign_role")
+// @ApiOperation(value = "分配给管理员角色")
+// public CommonResult assignRole(AdminAssignRoleDTO adminAssignRoleDTO) {
+// return success(adminService.assignAdminRole(AdminSecurityContextHolder.getContext().getAdminId(), adminAssignRoleDTO));
+// }
}
diff --git a/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/controller/authorization/AdminsAuthorizationController.java b/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/controller/authorization/AdminsAuthorizationController.java
index 4864c952c..35f94ec0f 100644
--- a/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/controller/authorization/AdminsAuthorizationController.java
+++ b/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/controller/authorization/AdminsAuthorizationController.java
@@ -2,6 +2,7 @@ package cn.iocoder.mall.system.rest.controller.authorization;
import cn.iocoder.common.framework.constant.MallConstants;
import cn.iocoder.common.framework.vo.CommonResult;
+import cn.iocoder.mall.security.core.annotation.RequiresPermissions;
import cn.iocoder.mall.security.core.context.AdminSecurityContextHolder;
import cn.iocoder.mall.system.biz.bo.authorization.ResourceBO;
import cn.iocoder.mall.system.biz.bo.authorization.ResourceTreeNodeBO;
@@ -12,6 +13,7 @@ import cn.iocoder.mall.system.biz.dto.authorization.ResourceGetTreeDTO;
import cn.iocoder.mall.system.biz.enums.authorization.ResourceTypeEnum;
import cn.iocoder.mall.system.biz.service.authorization.AuthorizationService;
import cn.iocoder.mall.system.biz.service.authorization.ResourceService;
+import cn.iocoder.mall.system.biz.service.authorization.RoleService;
import cn.iocoder.mall.system.rest.convert.authorization.AdminsAuthorizationConvert;
import cn.iocoder.mall.system.rest.request.authorization.AdminsAuthorizationAssignRoleResourceRequest;
import cn.iocoder.mall.system.rest.response.authorization.AdminsAuthorizationMenuTreeResponse;
@@ -37,6 +39,8 @@ public class AdminsAuthorizationController {
private AuthorizationService authorizationService;
@Autowired
private ResourceService resourceService;
+ @Autowired
+ private RoleService roleService;
@GetMapping("/menu-resource-tree")
@ApiOperation(value = "获得当前账号的菜单资源树", notes = "以树结构返回")
@@ -57,6 +61,7 @@ public class AdminsAuthorizationController {
@GetMapping("/role_resource_tree")
@ApiOperation(value = "获得角色拥有的菜单权限", notes = "以树结构返回。注意,返回的资源树是完整的结构,会标记每个资源节点是否被角色所拥有")
@ApiImplicitParam(name = "roleId", value = "角色编号", required = true, example = "1")
+ @RequiresPermissions("system:authorization:assign_role_resource")
public CommonResult> roleResourceTree(@RequestParam("roleId") Integer roleId) {
// 1. 获得完整的资源树
List resourceTreeNodeBOs = resourceService.getResourceTree(new ResourceGetTreeDTO());
@@ -68,6 +73,7 @@ public class AdminsAuthorizationController {
@PostMapping("/assign_role_resource")
@ApiOperation(value = "分配角色资源")
+ @RequiresPermissions("system:authorization:assign_role_resource")
public CommonResult assignRoleResource(AdminsAuthorizationAssignRoleResourceRequest request) {
AuthorizationAssignRoleResourceDTO authorizationAssignRoleResourceDTO = AdminsAuthorizationConvert.INSTANCE.convert(request)
.setAdminId(AdminSecurityContextHolder.getAdminId());
@@ -75,4 +81,26 @@ public class AdminsAuthorizationController {
return CommonResult.success(true);
}
+// @GetMapping("/role_list")
+// @ApiOperation(value = "指定账号拥有的角色列表")
+// @ApiImplicitParam(name = "accountId", value = "账号编号", required = true, example = "1")
+// public CommonResult> roleList(@RequestParam("accountId") Integer accountId) {
+// // 获得所有角色列表
+// List allRoleList = roleService.getRoleList();
+// // 获得管理员的角色数组
+// Set adminRoleIdSet = CollectionUtil.convertSet(adminService.getRoleList(id), RoleBO::getId);
+// // 转换出返回结果
+// List result = AdminConvert.INSTANCE.convert(allRoleList);
+// // 设置每个角色是否赋予给改管理员
+// result.forEach(adminRoleVO -> adminRoleVO.setAssigned(adminRoleIdSet.contains(adminRoleVO.getId())));
+// return success(result);
+// }
+//
+// @PostMapping("/assign_role")
+// @ApiOperation(value = "分配给管理员角色")
+// public CommonResult assignRole(AdminAssignRoleDTO adminAssignRoleDTO) {
+// return success(adminService.assignAdminRole(AdminSecurityContextHolder.getContext().getAdminId(), adminAssignRoleDTO));
+// }
+
+
}
diff --git a/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/convert/admin/AdminsAdminConvert.java b/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/convert/admin/AdminsAdminConvert.java
index cddb939d9..7e3fae0fb 100644
--- a/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/convert/admin/AdminsAdminConvert.java
+++ b/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/convert/admin/AdminsAdminConvert.java
@@ -1,7 +1,12 @@
package cn.iocoder.mall.system.rest.convert.admin;
+import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.system.biz.bo.account.AccountUsernameAuthorizeBO;
+import cn.iocoder.mall.system.biz.bo.admin.AdminBO;
+import cn.iocoder.mall.system.biz.dto.admin.AdminPageDTO;
+import cn.iocoder.mall.system.rest.request.admin.AdminsAdminPageRequest;
import cn.iocoder.mall.system.rest.request.oauth2.AdminsOAuth2UsernameAuthenticateRequest;
+import cn.iocoder.mall.system.rest.response.admin.AdminsAdminPageResponse;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@@ -12,4 +17,8 @@ public interface AdminsAdminConvert {
AccountUsernameAuthorizeBO convert(AdminsOAuth2UsernameAuthenticateRequest bean);
+ AdminPageDTO convert(AdminsAdminPageRequest bean);
+
+ PageResult convertPage(PageResult bean);
+
}
diff --git a/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/convert/oauth2/AdminsOAuth2Convert.java b/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/convert/oauth2/AdminsOAuth2Convert.java
index f65427e13..2279151e2 100644
--- a/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/convert/oauth2/AdminsOAuth2Convert.java
+++ b/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/convert/oauth2/AdminsOAuth2Convert.java
@@ -17,7 +17,7 @@ public interface AdminsOAuth2Convert {
OAuth2UsernameAuthenticateDTO convert(AdminsOAuth2UsernameAuthenticateRequest bean);
@Mapping(source = "adminBO", target = "admin")
- @Mapping(source = "accessTokenBO.id", target = "token.accessToken")
+ @Mapping(source = "accessTokenBO.accessToken", target = "token.accessToken")
@Mapping(source = "accessTokenBO.refreshToken", target = "token.refreshToken")
@Mapping(source = "accessTokenBO.expiresTime", target = "token.expiresTime")
AdminsOAuth2AuthenticateResponse convert(AdminBO adminBO, OAuth2AuthenticateBO accessTokenBO);
diff --git a/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/convert/oauth2/UsersOAuth2Convert.java b/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/convert/oauth2/UsersOAuth2Convert.java
index 3ca01f3da..4afec0287 100644
--- a/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/convert/oauth2/UsersOAuth2Convert.java
+++ b/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/convert/oauth2/UsersOAuth2Convert.java
@@ -5,7 +5,6 @@ import cn.iocoder.mall.system.biz.dto.oatuh2.OAuth2MobileCodeAuthenticateDTO;
import cn.iocoder.mall.system.rest.request.oauth2.UsersOAuth2MobileCodeAuthenticateRequest;
import cn.iocoder.mall.system.rest.response.user.UsersOAuth2AuthenticateResponse;
import org.mapstruct.Mapper;
-import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
@Mapper
@@ -15,7 +14,6 @@ public interface UsersOAuth2Convert {
OAuth2MobileCodeAuthenticateDTO convert(UsersOAuth2MobileCodeAuthenticateRequest bean);
- @Mapping(source = "token.id", target = "token.accessToken")
UsersOAuth2AuthenticateResponse convert(UserAuthenticateBO bean);
}
diff --git a/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/request/admin/AdminsAdminPageRequest.java b/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/request/admin/AdminsAdminPageRequest.java
new file mode 100644
index 000000000..d89773056
--- /dev/null
+++ b/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/request/admin/AdminsAdminPageRequest.java
@@ -0,0 +1,22 @@
+package cn.iocoder.mall.system.rest.request.admin;
+
+import cn.iocoder.common.framework.vo.PageParam;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+@ApiModel("管理员 - 管理员模块 - 管理员分页信息 Request")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+public class AdminsAdminPageRequest extends PageParam {
+
+ @ApiModelProperty(value = "真实名字,模糊匹配", example = "小王")
+ private String name;
+
+ @ApiModelProperty(value = "部门编号")
+ private Integer departmentId;
+
+}
diff --git a/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/response/admin/AdminsAdminPageResponse.java b/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/response/admin/AdminsAdminPageResponse.java
new file mode 100644
index 000000000..978287942
--- /dev/null
+++ b/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/response/admin/AdminsAdminPageResponse.java
@@ -0,0 +1,79 @@
+package cn.iocoder.mall.system.rest.response.admin;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.Date;
+import java.util.List;
+
+@ApiModel("管理员 - 管理员模块 - 管理员分页信息 Response")
+@Data
+@Accessors(chain = true)
+public class AdminsAdminPageResponse {
+
+ @ApiModel("角色")
+ @Data
+ @Accessors(chain = true)
+ public static class Role {
+
+ @ApiModelProperty(value = "角色编号", required = true, example = "1")
+ private Integer id;
+
+ @ApiModelProperty(value = "角色名", required = true, example = "码神")
+ private String name;
+
+ }
+
+ @ApiModel("部门")
+ @Data
+ @Accessors(chain = true)
+ public static class Department {
+
+ @ApiModelProperty(value = "部门编号", required = true, example = "1")
+ private Integer id;
+
+ @ApiModelProperty(value = "部门名称", required = true, example = "研发部")
+ private String name;
+
+ }
+
+ @ApiModel("账号")
+ @Data
+ @Accessors(chain = true)
+ public static class Account {
+
+ @ApiModelProperty(value = "账号编号", required = true, example = "1")
+ private Integer id;
+
+ @ApiModelProperty(value = "登陆账号", required = true, example = "15601691300")
+ private String username;
+
+ }
+
+ @ApiModelProperty(value = "管理员编号", required = true, example = "1")
+ private Integer id;
+ @ApiModelProperty(value = "真实名字", required = true, example = "小王")
+ private String name;
+ @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式")
+ private Date createTime;
+ @ApiModelProperty(value = "在职状态", required = true, example = "1", notes = "见 AdminStatusEnum 枚举")
+ private Integer status;
+
+ /**
+ * 账号
+ */
+ private Account account;
+
+ /**
+ * 角色列表
+ */
+ private List roles;
+
+ /**
+ * 所在部门
+ */
+ private Department department;
+
+}
diff --git a/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/response/authorization/AdminsRolePageResponse.java b/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/response/authorization/AdminsRolePageResponse.java
index e5bc4a62d..90b3d6d6b 100644
--- a/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/response/authorization/AdminsRolePageResponse.java
+++ b/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/response/authorization/AdminsRolePageResponse.java
@@ -18,6 +18,8 @@ public class AdminsRolePageResponse {
private String name;
@ApiModelProperty(value = "角色编码", example = "SUPER_ADMIN")
private String code;
+ @ApiModelProperty(value = "角色类型", required = true, example = "1-系统角色; 2-内置角色")
+ private Integer type;
@ApiModelProperty(value = "创建时间", required = true)
private Date createTime;
diff --git a/system/system-service-api/src/main/java/cn/iocoder/mall/system/api/AdminService.java b/system/system-service-api/src/main/java/cn/iocoder/mall/system/api/AdminService.java
index 90dcdbc44..14ddfcc60 100644
--- a/system/system-service-api/src/main/java/cn/iocoder/mall/system/api/AdminService.java
+++ b/system/system-service-api/src/main/java/cn/iocoder/mall/system/api/AdminService.java
@@ -1,11 +1,8 @@
package cn.iocoder.mall.system.api;
import cn.iocoder.common.framework.vo.PageResult;
-import cn.iocoder.mall.system.api.bo.admin.AdminAuthenticationBO;
-import cn.iocoder.mall.system.api.bo.admin.AdminAuthorizationBO;
import cn.iocoder.mall.system.api.bo.admin.AdminBO;
import cn.iocoder.mall.system.api.bo.role.RoleBO;
-import cn.iocoder.mall.admin.api.dto.admin.*;
import cn.iocoder.mall.system.api.dto.admin.*;
import java.util.Collection;
@@ -17,16 +14,6 @@ import java.util.Map;
*/
public interface AdminService {
- /**
- * 管理员认证。认证成功后,返回认证信息
- *
- * 实际上,就是用户名 + 密码登陆
- *
- * @param adminAuthenticationDTO 用户认证信息
- * @return 认证信息
- */
- AdminAuthenticationBO authentication(AdminAuthenticationDTO adminAuthenticationDTO);
-
PageResult getAdminPage(AdminPageDTO adminPageDTO);
AdminBO addAdmin(Integer adminId, AdminAddDTO adminAddDTO);
@@ -62,13 +49,4 @@ public interface AdminService {
*/
Boolean assignAdminRole(Integer adminId, AdminAssignRoleDTO adminAssignRoleDTO);
- /**
- * 判断管理员是否有指定权限
- *
- * @param adminId 管理员
- * @param permissions 权限数组
- * @return 管理员授权信息
- */
- AdminAuthorizationBO checkPermissions(Integer adminId, List permissions);
-
}
diff --git a/system/system-service-api/src/main/java/cn/iocoder/mall/system/api/OAuth2Service.java b/system/system-service-api/src/main/java/cn/iocoder/mall/system/api/OAuth2Service.java
index 1065ce71b..693943a16 100644
--- a/system/system-service-api/src/main/java/cn/iocoder/mall/system/api/OAuth2Service.java
+++ b/system/system-service-api/src/main/java/cn/iocoder/mall/system/api/OAuth2Service.java
@@ -1,10 +1,5 @@
package cn.iocoder.mall.system.api;
-import cn.iocoder.mall.system.api.bo.oauth2.OAuth2AccessTokenBO;
-import cn.iocoder.mall.system.api.bo.oauth2.OAuth2AuthenticationBO;
-import cn.iocoder.mall.system.api.dto.oauth2.OAuth2CreateTokenDTO;
-import cn.iocoder.mall.system.api.dto.oauth2.OAuth2GetTokenDTO;
-import cn.iocoder.mall.system.api.dto.oauth2.OAuth2RefreshTokenDTO;
import cn.iocoder.mall.system.api.dto.oauth2.OAuth2RemoveTokenByUserDTO;
/**
@@ -12,14 +7,6 @@ import cn.iocoder.mall.system.api.dto.oauth2.OAuth2RemoveTokenByUserDTO;
*/
public interface OAuth2Service {
- /**
- * 根据身份信息,创建 accessToken 信息
- *
- * @param oauth2CreateTokenDTO 身份信息 DTO
- * @return accessToken 信息
- */
- OAuth2AccessTokenBO createToken(OAuth2CreateTokenDTO oauth2CreateTokenDTO);
-
/**
* 基于用户移除 accessToken
*
@@ -27,20 +14,4 @@ public interface OAuth2Service {
*/
void removeToken(OAuth2RemoveTokenByUserDTO oauth2RemoveTokenDTO);
- /**
- * 刷新令牌,获得新的 accessToken 信息
- *
- * @param oauth2RefreshTokenDTO refreshToken 信息
- * @return accessToken 信息
- */
- OAuth2AccessTokenBO refreshToken(OAuth2RefreshTokenDTO oauth2RefreshTokenDTO);
-
- /**
- * 通过 accessToken 获得身份信息
- *
- * @param oauth2GetTokenDTO accessToken 信息
- * @return 身份信息
- */
- OAuth2AuthenticationBO getAuthentication(OAuth2GetTokenDTO oauth2GetTokenDTO);
-
}
diff --git a/system/system-service-api/src/main/java/cn/iocoder/mall/system/api/RoleService.java b/system/system-service-api/src/main/java/cn/iocoder/mall/system/api/RoleService.java
index 787441ae5..503d1d375 100644
--- a/system/system-service-api/src/main/java/cn/iocoder/mall/system/api/RoleService.java
+++ b/system/system-service-api/src/main/java/cn/iocoder/mall/system/api/RoleService.java
@@ -1,24 +1,14 @@
package cn.iocoder.mall.system.api;
-import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.system.api.bo.role.RoleBO;
-import cn.iocoder.mall.system.api.dto.role.RoleAddDTO;
-import cn.iocoder.mall.system.api.dto.role.RoleAssignResourceDTO;
-import cn.iocoder.mall.system.api.dto.role.RolePageDTO;
-import cn.iocoder.mall.system.api.dto.role.RoleUpdateDTO;
-import java.util.Collection;
import java.util.List;
public interface RoleService {
- PageResult getRolePage(RolePageDTO rolePageDTO);
-
/**
* @return 返回角色列表
*/
List getRoleList();
- Boolean assignRoleResource(Integer adminId, RoleAssignResourceDTO roleAssignResourceDTO);
-
}
diff --git a/system/system-service-api/src/main/java/cn/iocoder/mall/system/api/dto/admin/AdminAuthenticationDTO.java b/system/system-service-api/src/main/java/cn/iocoder/mall/system/api/dto/admin/AdminAuthenticationDTO.java
deleted file mode 100644
index 8f273dfd5..000000000
--- a/system/system-service-api/src/main/java/cn/iocoder/mall/system/api/dto/admin/AdminAuthenticationDTO.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package cn.iocoder.mall.system.api.dto.admin;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-import lombok.experimental.Accessors;
-import org.hibernate.validator.constraints.Length;
-
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.Pattern;
-
-@ApiModel("管理员认证 DTO")
-@Data
-@Accessors(chain = true)
-public class AdminAuthenticationDTO {
-
- @ApiModelProperty(value = "登陆账号", required = true, example = "15601691300")
- @NotEmpty(message = "登陆账号不能为空")
- @Length(min = 5, max = 16, message = "账号长度为 5-16 位")
- @Pattern(regexp = "^[A-Za-z0-9]+$", message = "账号格式为数字以及字母")
- private String username;
-
- @ApiModelProperty(value = "密码", required = true, example = "buzhidao")
- @NotEmpty(message = "密码不能为空")
- @Length(min = 4, max = 16, message = "密码长度为 4-16 位")
- private String password;
-
-}
diff --git a/system/system-service-impl/src/main/java/cn/iocoder/mall/admin/dao/AdminMapper.java b/system/system-service-impl/src/main/java/cn/iocoder/mall/admin/dao/AdminMapper.java
deleted file mode 100644
index ec5395808..000000000
--- a/system/system-service-impl/src/main/java/cn/iocoder/mall/admin/dao/AdminMapper.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package cn.iocoder.mall.admin.dao;
-
-import cn.iocoder.common.framework.mybatis.QueryWrapperX;
-import cn.iocoder.mall.system.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;
-
-@Repository
-public interface AdminMapper extends BaseMapper {
-
- default AdminDO selectByUsername(@Param("username") String username) {
- return selectOne(new QueryWrapper().eq("username", username));
- }
-
- default IPage selectPage(AdminPageDTO adminPageDTO) {
- return selectPage(new Page<>(adminPageDTO.getPageNo(), adminPageDTO.getPageSize()),
- new QueryWrapperX().likeIfPresent("nickname", adminPageDTO.getNickname())
- .eqIfPresent("deptment_id", adminPageDTO.getDeptmentId()));
- }
-
- default int updateDeptByDeptId(@Param("fromDeptId")Integer fromDeptId, @Param("toDeptId")Integer toDeptId){
- QueryWrapper query = new QueryWrapper()
- .eq("deptment_id", fromDeptId);
- return update(new AdminDO().setDeptmentId(toDeptId), query);
- }
-
-}
diff --git a/system/system-service-impl/src/main/java/cn/iocoder/mall/admin/dataobject/AdminDO.java b/system/system-service-impl/src/main/java/cn/iocoder/mall/admin/dataobject/AdminDO.java
deleted file mode 100644
index fd644c72c..000000000
--- a/system/system-service-impl/src/main/java/cn/iocoder/mall/admin/dataobject/AdminDO.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package cn.iocoder.mall.admin.dataobject;
-
-import cn.iocoder.common.framework.dataobject.DeletableDO;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.experimental.Accessors;
-
-/**
- * 管理员实体
- */
-@TableName(value = "admin")
-@Data
-@EqualsAndHashCode(callSuper = true)
-@Accessors(chain = true)
-public class AdminDO extends DeletableDO {
-
- /**
- * 管理员编号
- */
- private Integer id;
- /**
- * 登陆账号
- */
- private String username;
- /**
- * 昵称
- */
- private String nickname;
- /**
- * 密码
- *
- * TODO 芋艿 暂时最简单的 MD5
- */
- private String password;
- /**
- * 账号状态
- */
- private Integer status;
-
- /**
- * 管理员部门id
- */
- private Integer deptmentId;
-
-
- // TODO 芋艿,最后登陆时间、最后登陆 IP
- // TODO 芋艿,登陆日志
-
-}
diff --git a/system/system-service-impl/src/main/java/cn/iocoder/mall/admin/service/OAuth2ServiceImpl.java b/system/system-service-impl/src/main/java/cn/iocoder/mall/admin/service/OAuth2ServiceImpl.java
index e6c83d143..4cccbbbc5 100644
--- a/system/system-service-impl/src/main/java/cn/iocoder/mall/admin/service/OAuth2ServiceImpl.java
+++ b/system/system-service-impl/src/main/java/cn/iocoder/mall/admin/service/OAuth2ServiceImpl.java
@@ -39,27 +39,6 @@ public class OAuth2ServiceImpl implements OAuth2Service {
@Autowired
private AdminServiceImpl adminService;
- @Autowired
- private OAuth2AccessTokenMapper oauth2AccessTokenMapper;
- @Autowired
- private OAuth2RefreshTokenMapper oauth2RefreshTokenMapper;
- @Autowired
- private RoleServiceImpl roleService;
- @Autowired
- private ResourceServiceImpl resourceService;
-
- @Override
- @Transactional
- public OAuth2AccessTokenBO createToken(OAuth2CreateTokenDTO oauth2CreateTokenDTO) {
- Integer userId = oauth2CreateTokenDTO.getUserId();
- Integer userType = oauth2CreateTokenDTO.getUserType();
- // 创建刷新令牌
- OAuth2RefreshTokenDO oauth2RefreshTokenDO = createOAuth2RefreshToken(userId, userType);
- // 创建访问令牌
- OAuth2AccessTokenDO oauth2AccessTokenDO = createOAuth2AccessToken(userId, userType, oauth2RefreshTokenDO.getId());
- // 转换返回
- return OAuth2Convert.INSTANCE.convertToAccessTokenWithExpiresIn(oauth2AccessTokenDO);
- }
@Override
@Transactional
@@ -72,76 +51,4 @@ public class OAuth2ServiceImpl implements OAuth2Service {
oauth2RefreshTokenMapper.updateToInvalid(userId, userType);
}
- @Override
- public OAuth2AccessTokenBO refreshToken(OAuth2RefreshTokenDTO oauth2RefreshTokenDTO) {
- OAuth2RefreshTokenDO refreshTokenDO = oauth2RefreshTokenMapper.selectById(oauth2RefreshTokenDTO.getRefreshToken());
- // 校验刷新令牌是否合法
- if (refreshTokenDO == null) { // 不存在
- throw ServiceExceptionUtil.exception(AdminErrorCodeEnum.OAUTH_INVALID_REFRESH_TOKEN_NOT_FOUND.getCode());
- }
- if (refreshTokenDO.getExpiresTime().getTime() < System.currentTimeMillis()) { // 已过期
- throw ServiceExceptionUtil.exception(AdminErrorCodeEnum.OAUTH_INVALID_REFRESH_TOKEN_EXPIRED.getCode());
- }
- if (!refreshTokenDO.getValid()) { // 无效
- throw ServiceExceptionUtil.exception(AdminErrorCodeEnum.OAUTH_INVALID_REFRESH_TOKEN_INVALID.getCode());
- }
- // 标记 refreshToken 对应的 accessToken 都不合法
- oauth2AccessTokenMapper.updateToInvalidByRefreshToken(oauth2RefreshTokenDTO.getRefreshToken());
- // 创建访问令牌
- OAuth2AccessTokenDO oauth2AccessTokenDO = createOAuth2AccessToken(refreshTokenDO.getUserId(), refreshTokenDO.getUserType(),
- refreshTokenDO.getId());
- // 转换返回
- return OAuth2Convert.INSTANCE.convertToAccessTokenWithExpiresIn(oauth2AccessTokenDO);
- }
-
- @Override
- public OAuth2AuthenticationBO getAuthentication(OAuth2GetTokenDTO oauth2GetTokenDTO) {
- OAuth2AccessTokenDO accessTokenDO = oauth2AccessTokenMapper.selectById(oauth2GetTokenDTO.getAccessToken());
- if (accessTokenDO == null) { // 不存在
- throw ServiceExceptionUtil.exception(AdminErrorCodeEnum.OAUTH2_INVALID_TOKEN_NOT_FOUND.getCode());
- }
- if (accessTokenDO.getExpiresTime().getTime() < System.currentTimeMillis()) { // 已过期
- throw ServiceExceptionUtil.exception(AdminErrorCodeEnum.OAUTH2_INVALID_TOKEN_EXPIRED.getCode());
- }
- if (!accessTokenDO.getValid()) { // 无效
- throw ServiceExceptionUtil.exception(AdminErrorCodeEnum.OAUTH2_INVALID_TOKEN_INVALID.getCode());
- }
- if (!oauth2GetTokenDTO.getUserType().equals(accessTokenDO.getUserType())) {
- throw ServiceExceptionUtil.exception(AdminErrorCodeEnum.OAUTH2_INVALID_TOKEN_INVALID.getCode());
- }
- // 转换返回
- return OAuth2Convert.INSTANCE.convertToAuthentication(accessTokenDO);
- }
-
- private OAuth2AccessTokenDO createOAuth2AccessToken(Integer userId, Integer userType, String refreshToken) {
- OAuth2AccessTokenDO accessToken
- = new OAuth2AccessTokenDO()
- .setId(generateAccessToken())
- .setRefreshToken(refreshToken)
- .setUserId(userId).setUserType(userType)
- .setExpiresTime(new Date(System.currentTimeMillis() + accessTokenExpireTimeMillis))
- .setValid(true);
- oauth2AccessTokenMapper.insert(accessToken);
- return accessToken;
- }
-
- private OAuth2RefreshTokenDO createOAuth2RefreshToken(Integer userId, Integer userType) {
- OAuth2RefreshTokenDO refreshToken
- = new OAuth2RefreshTokenDO()
- .setId(generateRefreshToken())
- .setUserId(userId).setUserType(userType)
- .setExpiresTime(new Date(System.currentTimeMillis() + refreshTokenExpireTimeMillis))
- .setValid(true);
- oauth2RefreshTokenMapper.insert(refreshToken);
- return refreshToken;
- }
-
- private String generateAccessToken() {
- return UUID.randomUUID().toString().replaceAll("-", "");
- }
-
- private String generateRefreshToken() {
- return UUID.randomUUID().toString().replaceAll("-", "");
- }
-
}
diff --git a/system/system-start/src/main/java/cn/iocoder/mall/system/application/controller/admins/AdminController.java b/system/system-start/src/main/java/cn/iocoder/mall/system/application/controller/admins/AdminController.java
index 0e6345987..86151f6d2 100644
--- a/system/system-start/src/main/java/cn/iocoder/mall/system/application/controller/admins/AdminController.java
+++ b/system/system-start/src/main/java/cn/iocoder/mall/system/application/controller/admins/AdminController.java
@@ -102,25 +102,4 @@ public class AdminController {
return success(adminService.deleteAdmin(AdminSecurityContextHolder.getContext().getAdminId(), id));
}
- @GetMapping("/role_list")
- @ApiOperation(value = "指定管理员拥有的角色列表")
- @ApiImplicitParam(name = "id", value = "管理员编号", required = true, example = "1")
- public CommonResult> roleList(@RequestParam("id") Integer id) {
- // 获得所有角色列表
- List allRoleList = roleService.getRoleList();
- // 获得管理员的角色数组
- Set adminRoleIdSet = CollectionUtil.convertSet(adminService.getRoleList(id), RoleBO::getId);
- // 转换出返回结果
- List result = AdminConvert.INSTANCE.convert(allRoleList);
- // 设置每个角色是否赋予给改管理员
- result.forEach(adminRoleVO -> adminRoleVO.setAssigned(adminRoleIdSet.contains(adminRoleVO.getId())));
- return success(result);
- }
-
- @PostMapping("/assign_role")
- @ApiOperation(value = "分配给管理员角色")
- public CommonResult assignRole(AdminAssignRoleDTO adminAssignRoleDTO) {
- return success(adminService.assignAdminRole(AdminSecurityContextHolder.getContext().getAdminId(), adminAssignRoleDTO));
- }
-
}