新增:部门管理对接用户信息(新增所属部门),并完善查看部门详情(增加上级部门显示)

This commit is contained in:
Charles7c 2023-02-07 22:04:22 +08:00
parent 908af28235
commit c44503b7ea
17 changed files with 77 additions and 19 deletions

View File

@ -79,6 +79,16 @@ public class LoginUser implements Serializable {
*/ */
private LocalDateTime pwdResetTime; private LocalDateTime pwdResetTime;
/**
* 部门 ID
*/
private Long deptId;
/**
* 部门名称
*/
private String deptName;
/** /**
* 创建时间 * 创建时间
*/ */

View File

@ -110,6 +110,18 @@ public class UserInfoVO implements Serializable {
@Schema(description = "注册日期") @Schema(description = "注册日期")
private LocalDate registrationDate; private LocalDate registrationDate;
/**
* 部门ID
*/
@Schema(description = "部门ID")
private Long deptId;
/**
* 所属部门
*/
@Schema(description = "所属名称")
private String deptName;
/** /**
* 用户角色临时 mock 写完角色体系后移除 * 用户角色临时 mock 写完角色体系后移除
*/ */

View File

@ -26,10 +26,12 @@ import cn.hutool.core.bean.BeanUtil;
import top.charles7c.cnadmin.auth.service.LoginService; import top.charles7c.cnadmin.auth.service.LoginService;
import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum; import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum;
import top.charles7c.cnadmin.common.model.dto.LoginUser; import top.charles7c.cnadmin.common.model.dto.LoginUser;
import top.charles7c.cnadmin.common.util.ExceptionUtils;
import top.charles7c.cnadmin.common.util.SecureUtils; import top.charles7c.cnadmin.common.util.SecureUtils;
import top.charles7c.cnadmin.common.util.helper.LoginHelper; import top.charles7c.cnadmin.common.util.helper.LoginHelper;
import top.charles7c.cnadmin.common.util.validate.CheckUtils; import top.charles7c.cnadmin.common.util.validate.CheckUtils;
import top.charles7c.cnadmin.system.model.entity.UserDO; import top.charles7c.cnadmin.system.model.entity.UserDO;
import top.charles7c.cnadmin.system.service.DeptService;
import top.charles7c.cnadmin.system.service.UserService; import top.charles7c.cnadmin.system.service.UserService;
/** /**
@ -43,6 +45,7 @@ import top.charles7c.cnadmin.system.service.UserService;
public class LoginServiceImpl implements LoginService { public class LoginServiceImpl implements LoginService {
private final UserService userService; private final UserService userService;
private final DeptService deptService;
@Override @Override
public String login(String username, String password) { public String login(String username, String password) {
@ -54,6 +57,7 @@ public class LoginServiceImpl implements LoginService {
// 登录 // 登录
LoginUser loginUser = BeanUtil.copyProperties(userDO, LoginUser.class); LoginUser loginUser = BeanUtil.copyProperties(userDO, LoginUser.class);
loginUser.setDeptName(ExceptionUtils.exToNull(() -> deptService.get(loginUser.getDeptId()).getDeptName()));
LoginHelper.login(loginUser); LoginHelper.login(loginUser);
// 返回令牌 // 返回令牌

View File

@ -94,4 +94,9 @@ public class UserDO extends BaseDO {
* 最后一次修改密码的时间 * 最后一次修改密码的时间
*/ */
private LocalDateTime pwdResetTime; private LocalDateTime pwdResetTime;
/**
* 部门 ID
*/
private Long deptId;
} }

View File

@ -22,6 +22,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.TableField;
import top.charles7c.cnadmin.common.base.BaseDetailVO; import top.charles7c.cnadmin.common.base.BaseDetailVO;
import top.charles7c.cnadmin.common.config.easyexcel.ExcelBaseEnumConverter; import top.charles7c.cnadmin.common.config.easyexcel.ExcelBaseEnumConverter;
@ -79,4 +80,11 @@ public class DeptDetailVO extends BaseDetailVO {
@Schema(description = "状态1启用 2禁用") @Schema(description = "状态1启用 2禁用")
@ExcelProperty(value = "状态", converter = ExcelBaseEnumConverter.class) @ExcelProperty(value = "状态", converter = ExcelBaseEnumConverter.class)
private DisEnableStatusEnum status; private DisEnableStatusEnum status;
/**
* 上级部门
*/
@Schema(description = "上级部门")
@TableField(exist = false)
private String parentName;
} }

View File

@ -36,7 +36,6 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.tree.Tree; import cn.hutool.core.lang.tree.Tree;
import top.charles7c.cnadmin.common.base.BaseDetailVO;
import top.charles7c.cnadmin.common.base.BaseServiceImpl; import top.charles7c.cnadmin.common.base.BaseServiceImpl;
import top.charles7c.cnadmin.common.base.BaseVO; import top.charles7c.cnadmin.common.base.BaseVO;
import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum; import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum;
@ -211,16 +210,17 @@ public class DeptServiceImpl extends BaseServiceImpl<DeptMapper, DeptDO, DeptVO,
/** /**
* 填充详情数据 * 填充详情数据
* *
* @param baseDetailVO * @param detailVO
* 待填充详情信息 * 待填充详情信息
*/ */
private void fillDetail(BaseDetailVO baseDetailVO) { private void fillDetail(DeptDetailVO detailVO) {
this.fill(baseDetailVO); this.fill(detailVO);
Long updateUser = baseDetailVO.getUpdateUser(); Long updateUser = detailVO.getUpdateUser();
if (updateUser == null) { if (updateUser == null) {
return; return;
} }
baseDetailVO.setUpdateUserString(ExceptionUtils.exToNull(() -> userService.getById(updateUser)).getNickname()); detailVO.setUpdateUserString(ExceptionUtils.exToNull(() -> userService.getById(updateUser)).getNickname());
detailVO.setParentName(ExceptionUtils.exToNull(() -> this.get(detailVO.getParentId()).getDeptName()));
} }
} }

View File

@ -65,7 +65,7 @@ export interface OperationLogParam extends Partial<OperationLogRecord> {
page: number; page: number;
size: number; size: number;
sort: Array<string>; sort: Array<string>;
uid?: string; uid?: number;
} }
export interface OperationLogListRes { export interface OperationLogListRes {

View File

@ -14,7 +14,8 @@ export interface DeptRecord {
createTime?: string; createTime?: string;
updateUserString?: string; updateUserString?: string;
updateTime?: string; updateTime?: string;
children?: Array<DeptRecord>, children?: Array<DeptRecord>;
parentName?: string;
} }
export interface DeptParam { export interface DeptParam {

View File

@ -67,7 +67,7 @@ body {
.header { .header {
margin-bottom: 16px; margin-bottom: 16px;
&-query { &-query {
margin-bottom: 8px; margin-bottom: 10px;
} }
&-operation { &-operation {
&-right { &-right {

View File

@ -13,7 +13,7 @@ import useAppStore from '../app';
const useLoginStore = defineStore('user', { const useLoginStore = defineStore('user', {
state: (): UserState => ({ state: (): UserState => ({
userId: '', userId: 0,
username: '', username: '',
nickname: '', nickname: '',
gender: 0, gender: 0,
@ -23,11 +23,11 @@ const useLoginStore = defineStore('user', {
description: undefined, description: undefined,
pwdResetTime: undefined, pwdResetTime: undefined,
registrationDate: undefined, registrationDate: undefined,
deptId: 0,
deptName: '',
job: 'backend', job: 'backend',
jobName: '后端艺术家', jobName: '后端艺术家',
organization: 'Backend',
organizationName: '后端',
location: 'beijing', location: 'beijing',
locationName: '北京', locationName: '北京',
introduction: '低调星人', introduction: '低调星人',

View File

@ -1,6 +1,6 @@
export type RoleType = '' | '*' | 'admin' | 'user'; export type RoleType = '' | '*' | 'admin' | 'user';
export interface UserState { export interface UserState {
userId: string; userId: number;
username: string; username: string;
nickname: string; nickname: string;
gender: number; gender: number;
@ -10,11 +10,11 @@ export interface UserState {
description?: string; description?: string;
pwdResetTime?: string; pwdResetTime?: string;
registrationDate?: string; registrationDate?: string;
deptId?: number;
deptName?: string;
job?: string; job?: string;
jobName?: string; jobName?: string;
organization?: string;
organizationName?: string;
location?: string; location?: string;
locationName?: string; locationName?: string;
introduction?: string; introduction?: string;

View File

@ -5,8 +5,8 @@
<!-- 头部区域 --> <!-- 头部区域 -->
<div class="header"> <div class="header">
<!-- 搜索栏 --> <!-- 搜索栏 -->
<div class="header-query"> <div class="header-query" v-if="showQuery">
<a-form ref="queryRef" :model="queryParams" layout="inline" v-show="showQuery"> <a-form ref="queryRef" :model="queryParams" layout="inline">
<a-form-item field="deptName" hide-label> <a-form-item field="deptName" hide-label>
<a-input <a-input
v-model="queryParams.deptName" v-model="queryParams.deptName"
@ -190,6 +190,12 @@
</a-skeleton> </a-skeleton>
<span v-else>{{ dept.deptName }}</span> <span v-else>{{ dept.deptName }}</span>
</a-descriptions-item> </a-descriptions-item>
<a-descriptions-item label="上级部门">
<a-skeleton v-if="detailLoading" :animation="true">
<a-skeleton-line :rows="1" />
</a-skeleton>
<span v-else>{{ dept.parentName || '' }}</span>
</a-descriptions-item>
<a-descriptions-item label="状态"> <a-descriptions-item label="状态">
<a-skeleton v-if="detailLoading" :animation="true"> <a-skeleton v-if="detailLoading" :animation="true">
<a-skeleton-line :rows="1" /> <a-skeleton-line :rows="1" />
@ -199,6 +205,12 @@
<a-tag v-else color="red"><span class="circle fail"></span>禁用</a-tag> <a-tag v-else color="red"><span class="circle fail"></span>禁用</a-tag>
</span> </span>
</a-descriptions-item> </a-descriptions-item>
<a-descriptions-item label="部门排序">
<a-skeleton v-if="detailLoading" :animation="true">
<a-skeleton-line :rows="1" />
</a-skeleton>
<span v-else>{{ dept.deptSort }}</span>
</a-descriptions-item>
<a-descriptions-item label="创建人"> <a-descriptions-item label="创建人">
<a-skeleton v-if="detailLoading" :animation="true"> <a-skeleton v-if="detailLoading" :animation="true">
<a-skeleton-line :rows="1" /> <a-skeleton-line :rows="1" />
@ -262,6 +274,7 @@
createTime: '', createTime: '',
updateUserString: '', updateUserString: '',
updateTime: '', updateTime: '',
parentName: '',
}); });
const ids = ref<Array<number>>([]); const ids = ref<Array<number>>([]);
const title = ref(''); const title = ref('');

View File

@ -46,6 +46,7 @@
</a-descriptions-item> </a-descriptions-item>
<a-descriptions-item :label="$t('userCenter.panel.label.phone')">{{ loginStore.phone }}</a-descriptions-item> <a-descriptions-item :label="$t('userCenter.panel.label.phone')">{{ loginStore.phone }}</a-descriptions-item>
<a-descriptions-item :label="$t('userCenter.panel.label.email')">{{ loginStore.email }}</a-descriptions-item> <a-descriptions-item :label="$t('userCenter.panel.label.email')">{{ loginStore.email }}</a-descriptions-item>
<a-descriptions-item :label="$t('userCenter.panel.label.deptName')">{{ loginStore.deptName }}</a-descriptions-item>
<a-descriptions-item :label="$t('userCenter.panel.label.registrationDate')">{{ loginStore.registrationDate }}</a-descriptions-item> <a-descriptions-item :label="$t('userCenter.panel.label.registrationDate')">{{ loginStore.registrationDate }}</a-descriptions-item>
</a-descriptions> </a-descriptions>
</a-space> </a-space>

View File

@ -10,6 +10,7 @@ export default {
'userCenter.panel.label.gender': 'Gender :', 'userCenter.panel.label.gender': 'Gender :',
'userCenter.panel.label.phone': 'Phone :', 'userCenter.panel.label.phone': 'Phone :',
'userCenter.panel.label.email': 'Email :', 'userCenter.panel.label.email': 'Email :',
'userCenter.panel.label.deptName': 'Dept Name :',
'userCenter.panel.label.registrationDate': 'Registration Date :', 'userCenter.panel.label.registrationDate': 'Registration Date :',
'userCenter.panel.male': 'male', 'userCenter.panel.male': 'male',
'userCenter.panel.female': 'female', 'userCenter.panel.female': 'female',

View File

@ -10,6 +10,7 @@ export default {
'userCenter.panel.label.gender': '性别 :', 'userCenter.panel.label.gender': '性别 :',
'userCenter.panel.label.phone': '手机号码 :', 'userCenter.panel.label.phone': '手机号码 :',
'userCenter.panel.label.email': '邮箱 :', 'userCenter.panel.label.email': '邮箱 :',
'userCenter.panel.label.deptName': '所属部门 :',
'userCenter.panel.label.registrationDate': '注册日期 :', 'userCenter.panel.label.registrationDate': '注册日期 :',
'userCenter.panel.male': '男', 'userCenter.panel.male': '男',
'userCenter.panel.female': '女', 'userCenter.panel.female': '女',

View File

@ -12,5 +12,5 @@ INSERT IGNORE INTO `sys_dept` VALUES (7, '研发一组', 3, 1, NULL, 1, 1, NOW()
INSERT IGNORE INTO `sys_dept` VALUES (8, '研发二组', 3, 2, NULL, 2, 1, NOW(), 1, NOW()); INSERT IGNORE INTO `sys_dept` VALUES (8, '研发二组', 3, 2, NULL, 2, 1, NOW(), 1, NOW());
-- 初始化默认用户admin/admin123test/123456 -- 初始化默认用户admin/admin123test/123456
INSERT IGNORE INTO `sys_user` VALUES (1, 'admin', '超级管理员', '9802815bcc5baae7feb1ae0d0566baf2', 1, '18888888888', 'charles7c@126.com', NULL, NULL, 1, NOW(), 1, NOW(), 1, NOW()); INSERT IGNORE INTO `sys_user` VALUES (1, 'admin', '超级管理员', '9802815bcc5baae7feb1ae0d0566baf2', 1, '18888888888', 'charles7c@126.com', NULL, NULL, 1, NOW(), 1, 1, NOW(), 1, NOW());
INSERT IGNORE INTO `sys_user` VALUES (2, 'test', '测试员', '8e114197e1b33783a00542ad67e80516', 0, NULL, NULL, NULL, NULL, 2, NOW(), 1, NOW(), 1, NOW()); INSERT IGNORE INTO `sys_user` VALUES (2, 'test', '测试员', '8e114197e1b33783a00542ad67e80516', 0, NULL, NULL, NULL, NULL, 2, NOW(), 2, 1, NOW(), 1, NOW());

View File

@ -30,6 +30,7 @@ CREATE TABLE IF NOT EXISTS `sys_user` (
`description` varchar(512) DEFAULT NULL COMMENT '描述', `description` varchar(512) DEFAULT NULL COMMENT '描述',
`status` tinyint(1) unsigned DEFAULT 1 COMMENT '状态1启用 2禁用', `status` tinyint(1) unsigned DEFAULT 1 COMMENT '状态1启用 2禁用',
`pwd_reset_time` datetime DEFAULT NULL COMMENT '最后一次修改密码的时间', `pwd_reset_time` datetime DEFAULT NULL COMMENT '最后一次修改密码的时间',
`dept_id` bigint(20) unsigned DEFAULT NULL COMMENT '部门ID',
`create_user` bigint(20) unsigned NOT NULL COMMENT '创建人', `create_user` bigint(20) unsigned NOT NULL COMMENT '创建人',
`create_time` datetime NOT NULL COMMENT '创建时间', `create_time` datetime NOT NULL COMMENT '创建时间',
`update_user` bigint(20) unsigned NOT NULL COMMENT '修改人', `update_user` bigint(20) unsigned NOT NULL COMMENT '修改人',
@ -38,6 +39,7 @@ CREATE TABLE IF NOT EXISTS `sys_user` (
UNIQUE INDEX `uk_username`(`username`) USING BTREE, UNIQUE INDEX `uk_username`(`username`) USING BTREE,
UNIQUE INDEX `uk_email`(`email`) USING BTREE, UNIQUE INDEX `uk_email`(`email`) USING BTREE,
INDEX `idx_create_user`(`create_user`) USING BTREE, INDEX `idx_create_user`(`create_user`) USING BTREE,
INDEX `idx_dept_id`(`dept_id`) USING BTREE,
INDEX `idx_update_user`(`update_user`) USING BTREE INDEX `idx_update_user`(`update_user`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';