Commit e3884ee57f12bb2e884ff625118da364b520e769

Authored by YunaiV
1 parent 855327de

完成用户的添加和修改的逻辑

Showing 22 changed files with 479 additions and 449 deletions
ruoyi-ui/src/api/system/post.js
@@ -9,6 +9,14 @@ export function listPost(query) { @@ -9,6 +9,14 @@ export function listPost(query) {
9 }) 9 })
10 } 10 }
11 11
  12 +// 获取岗位精简信息列表
  13 +export function listSimplePosts() {
  14 + return request({
  15 + url: '/system/post/list-all-simple',
  16 + method: 'get'
  17 + })
  18 +}
  19 +
12 // 查询岗位详细 20 // 查询岗位详细
13 export function getPost(postId) { 21 export function getPost(postId) {
14 return request({ 22 return request({
@@ -50,4 +58,4 @@ export function exportPost(query) { @@ -50,4 +58,4 @@ export function exportPost(query) {
50 method: 'get', 58 method: 'get',
51 params: query 59 params: query
52 }) 60 })
53 -}  
54 \ No newline at end of file 61 \ No newline at end of file
  62 +}
ruoyi-ui/src/api/system/user.js
@@ -31,7 +31,7 @@ export function addUser(data) { @@ -31,7 +31,7 @@ export function addUser(data) {
31 export function updateUser(data) { 31 export function updateUser(data) {
32 return request({ 32 return request({
33 url: '/system/user/update', 33 url: '/system/user/update',
34 - method: 'put', 34 + method: 'post',
35 data: data 35 data: data
36 }) 36 })
37 } 37 }
ruoyi-ui/src/utils/dict.js
@@ -10,6 +10,7 @@ export const DICT_TYPE = { @@ -10,6 +10,7 @@ export const DICT_TYPE = {
10 SYS_MENU_TYPE: 'sys_menu_type', 10 SYS_MENU_TYPE: 'sys_menu_type',
11 SYS_ROLE_TYPE: 'sys_role_type', 11 SYS_ROLE_TYPE: 'sys_role_type',
12 SYS_DATA_SCOPE: 'sys_data_scope', 12 SYS_DATA_SCOPE: 'sys_data_scope',
  13 + SYS_USER_SEX: 'sys_user_sex',
13 } 14 }
14 15
15 /** 16 /**
ruoyi-ui/src/views/system/user/index.vue
@@ -188,7 +188,9 @@ @@ -188,7 +188,9 @@
188 </el-col> 188 </el-col>
189 <el-col :span="12"> 189 <el-col :span="12">
190 <el-form-item label="归属部门" prop="deptId"> 190 <el-form-item label="归属部门" prop="deptId">
191 - <treeselect v-model="form.deptId" :options="deptOptions" :show-count="true" placeholder="请选择归属部门" /> 191 + <treeselect v-model="form.deptId" :options="deptOptions" :show-count="true"
  192 + placeholder="请选择归属部门" :normalizer="normalizer"
  193 + />
192 </el-form-item> 194 </el-form-item>
193 </el-col> 195 </el-col>
194 </el-row> 196 </el-row>
@@ -221,49 +223,22 @@ @@ -221,49 +223,22 @@
221 <el-form-item label="用户性别"> 223 <el-form-item label="用户性别">
222 <el-select v-model="form.sex" placeholder="请选择"> 224 <el-select v-model="form.sex" placeholder="请选择">
223 <el-option 225 <el-option
224 - v-for="dict in sexOptions"  
225 - :key="dict.dictValue"  
226 - :label="dict.dictLabel"  
227 - :value="dict.dictValue" 226 + v-for="dict in sexDictDatas"
  227 + :key="parseInt(dict.value)"
  228 + :label="dict.label"
  229 + :value="parseInt(dict.value)"
228 ></el-option> 230 ></el-option>
229 </el-select> 231 </el-select>
230 </el-form-item> 232 </el-form-item>
231 </el-col> 233 </el-col>
232 <el-col :span="12"> 234 <el-col :span="12">
233 - <el-form-item label="状态">  
234 - <el-radio-group v-model="form.status">  
235 - <el-radio  
236 - v-for="dict in statusOptions"  
237 - :key="dict.dictValue"  
238 - :label="dict.dictValue"  
239 - >{{dict.dictLabel}}</el-radio>  
240 - </el-radio-group>  
241 - </el-form-item>  
242 - </el-col>  
243 - </el-row>  
244 - <el-row>  
245 - <el-col :span="12">  
246 <el-form-item label="岗位"> 235 <el-form-item label="岗位">
247 <el-select v-model="form.postIds" multiple placeholder="请选择"> 236 <el-select v-model="form.postIds" multiple placeholder="请选择">
248 <el-option 237 <el-option
249 - v-for="item in postOptions"  
250 - :key="item.postId"  
251 - :label="item.postName"  
252 - :value="item.postId"  
253 - :disabled="item.status == 1"  
254 - ></el-option>  
255 - </el-select>  
256 - </el-form-item>  
257 - </el-col>  
258 - <el-col :span="12">  
259 - <el-form-item label="角色">  
260 - <el-select v-model="form.roleIds" multiple placeholder="请选择">  
261 - <el-option  
262 - v-for="item in roleOptions"  
263 - :key="item.roleId"  
264 - :label="item.roleName"  
265 - :value="item.roleId"  
266 - :disabled="item.status == 1" 238 + v-for="item in postOptions"
  239 + :key="item.id"
  240 + :label="item.name"
  241 + :value="item.id"
267 ></el-option> 242 ></el-option>
268 </el-select> 243 </el-select>
269 </el-form-item> 244 </el-form-item>
@@ -313,17 +288,45 @@ @@ -313,17 +288,45 @@
313 <el-button @click="upload.open = false">取 消</el-button> 288 <el-button @click="upload.open = false">取 消</el-button>
314 </div> 289 </div>
315 </el-dialog> 290 </el-dialog>
  291 +
  292 + <!-- 分配角色 -->
  293 +<!-- <el-dialog title="分配角色" :visible.sync="openMenu" width="500px" append-to-body>-->
  294 +<!-- <el-form :model="form" label-width="80px">-->
  295 +<!-- <el-form-item label="用户名称">-->
  296 +<!-- <el-input v-model="form.username" :disabled="true" />-->
  297 +<!-- </el-form-item>-->
  298 +<!-- <el-form-item label="用户昵称">-->
  299 +<!-- <el-input v-model="form.nickname" :disabled="true" />-->
  300 +<!-- </el-form-item>-->
  301 +<!-- <el-form-item label="角色">-->
  302 +<!-- <el-select v-model="form.roleIds" multiple placeholder="请选择">-->
  303 +<!-- <el-option-->
  304 +<!-- v-for="item in roleOptions"-->
  305 +<!-- :key="item.roleId"-->
  306 +<!-- :label="item.roleName"-->
  307 +<!-- :value="item.roleId"-->
  308 +<!-- :disabled="item.status == 1"-->
  309 +<!-- ></el-option>-->
  310 +<!-- </el-select>-->
  311 +<!-- </el-form-item>-->
  312 +<!-- </el-form>-->
  313 +<!-- <div slot="footer" class="dialog-footer">-->
  314 +<!-- <el-button type="primary" @click="submitMenu">确 定</el-button>-->
  315 +<!-- <el-button @click="cancelMenu">取 消</el-button>-->
  316 +<!-- </div>-->
  317 +<!-- </el-dialog>-->
  318 +
316 </div> 319 </div>
317 </template> 320 </template>
318 321
319 <script> 322 <script>
320 import { listUser, getUser, delUser, addUser, updateUser, exportUser, resetUserPwd, changeUserStatus, importTemplate } from "@/api/system/user"; 323 import { listUser, getUser, delUser, addUser, updateUser, exportUser, resetUserPwd, changeUserStatus, importTemplate } from "@/api/system/user";
321 import { getToken } from "@/utils/auth"; 324 import { getToken } from "@/utils/auth";
322 -import { treeselect } from "@/api/system/dept";  
323 import Treeselect from "@riophae/vue-treeselect"; 325 import Treeselect from "@riophae/vue-treeselect";
324 import "@riophae/vue-treeselect/dist/vue-treeselect.css"; 326 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
325 327
326 import {listSimpleDepts} from "@/api/system/dept"; 328 import {listSimpleDepts} from "@/api/system/dept";
  329 +import {listSimplePosts} from "@/api/system/post";
327 330
328 import {SysCommonStatusEnum} from "@/utils/constants"; 331 import {SysCommonStatusEnum} from "@/utils/constants";
329 import {DICT_TYPE, getDictDatas} from "@/utils/dict"; 332 import {DICT_TYPE, getDictDatas} from "@/utils/dict";
@@ -422,6 +425,7 @@ export default { @@ -422,6 +425,7 @@ export default {
422 SysCommonStatusEnum: SysCommonStatusEnum, 425 SysCommonStatusEnum: SysCommonStatusEnum,
423 // 数据字典 426 // 数据字典
424 statusDictDatas: getDictDatas(DICT_TYPE.SYS_COMMON_STATUS), 427 statusDictDatas: getDictDatas(DICT_TYPE.SYS_COMMON_STATUS),
  428 + sexDictDatas: getDictDatas(DICT_TYPE.SYS_USER_SEX),
425 }; 429 };
426 }, 430 },
427 watch: { 431 watch: {
@@ -446,18 +450,23 @@ export default { @@ -446,18 +450,23 @@ export default {
446 this.dateRange[1] ? this.dateRange[1] + ' 23:59:59' : undefined, 450 this.dateRange[1] ? this.dateRange[1] + ' 23:59:59' : undefined,
447 ])).then(response => { 451 ])).then(response => {
448 this.userList = response.data.list; 452 this.userList = response.data.list;
449 - this.total = response.data.list; 453 + this.total = response.data.total;
450 this.loading = false; 454 this.loading = false;
451 } 455 }
452 ); 456 );
453 }, 457 },
454 - /** 查询部门下拉树结构 */ 458 + /** 查询部门下拉树结构 + 岗位下拉 */
455 getTreeselect() { 459 getTreeselect() {
456 listSimpleDepts().then(response => { 460 listSimpleDepts().then(response => {
457 - // 处理 menuOptions 参数 461 + // 处理 deptOptions 参数
458 this.deptOptions = []; 462 this.deptOptions = [];
459 this.deptOptions.push(...this.handleTree(response.data, "id")); 463 this.deptOptions.push(...this.handleTree(response.data, "id"));
460 }); 464 });
  465 + listSimplePosts().then(response => {
  466 + // 处理 postOptions 参数
  467 + this.postOptions = [];
  468 + this.postOptions.push(...response.data);
  469 + });
461 }, 470 },
462 // 筛选节点 471 // 筛选节点
463 filterNode(value, data) { 472 filterNode(value, data) {
@@ -521,14 +530,12 @@ export default { @@ -521,14 +530,12 @@ export default {
521 /** 新增按钮操作 */ 530 /** 新增按钮操作 */
522 handleAdd() { 531 handleAdd() {
523 this.reset(); 532 this.reset();
  533 + // 获得下拉数据
524 this.getTreeselect(); 534 this.getTreeselect();
525 - getUser().then(response => {  
526 - this.postOptions = response.posts;  
527 - this.roleOptions = response.roles;  
528 - this.open = true;  
529 - this.title = "添加用户";  
530 - this.form.password = this.initPassword;  
531 - }); 535 + // 打开表单,并设置初始化
  536 + this.open = true;
  537 + this.title = "添加用户";
  538 + this.form.password = this.initPassword;
532 }, 539 },
533 /** 修改按钮操作 */ 540 /** 修改按钮操作 */
534 handleUpdate(row) { 541 handleUpdate(row) {
@@ -537,10 +544,6 @@ export default { @@ -537,10 +544,6 @@ export default {
537 const id = row.id; 544 const id = row.id;
538 getUser(id).then(response => { 545 getUser(id).then(response => {
539 this.form = response.data; 546 this.form = response.data;
540 - this.postOptions = response.posts;  
541 - this.roleOptions = response.roles;  
542 - this.form.postIds = response.postIds;  
543 - this.form.roleIds = response.roleIds;  
544 this.open = true; 547 this.open = true;
545 this.title = "修改用户"; 548 this.title = "修改用户";
546 this.form.password = ""; 549 this.form.password = "";
@@ -561,7 +564,7 @@ export default { @@ -561,7 +564,7 @@ export default {
561 submitForm: function() { 564 submitForm: function() {
562 this.$refs["form"].validate(valid => { 565 this.$refs["form"].validate(valid => {
563 if (valid) { 566 if (valid) {
564 - if (this.form.id != undefined) { 567 + if (this.form.id !== undefined) {
565 updateUser(this.form).then(response => { 568 updateUser(this.form).then(response => {
566 this.msgSuccess("修改成功"); 569 this.msgSuccess("修改成功");
567 this.open = false; 570 this.open = false;
@@ -630,6 +633,14 @@ export default { @@ -630,6 +633,14 @@ export default {
630 // 提交上传文件 633 // 提交上传文件
631 submitFileForm() { 634 submitFileForm() {
632 this.$refs.upload.submit(); 635 this.$refs.upload.submit();
  636 + },
  637 + // 格式化部门的下拉框
  638 + normalizer(node) {
  639 + return {
  640 + id: node.id,
  641 + label: node.name,
  642 + children: node.children
  643 + }
633 } 644 }
634 } 645 }
635 }; 646 };
src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/SysDeptController.java
@@ -26,13 +26,13 @@ import static cn.iocoder.dashboard.common.pojo.CommonResult.success; @@ -26,13 +26,13 @@ import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
26 public class SysDeptController { 26 public class SysDeptController {
27 27
28 @Resource 28 @Resource
29 - private SysDeptService sysDeptService; 29 + private SysDeptService deptService;
30 30
31 @ApiOperation("获取部门列表") 31 @ApiOperation("获取部门列表")
32 // @PreAuthorize("@ss.hasPermi('system:dept:list')") 32 // @PreAuthorize("@ss.hasPermi('system:dept:list')")
33 @GetMapping("/list") 33 @GetMapping("/list")
34 public CommonResult<List<SysDeptRespVO>> listDepts(SysDeptListReqVO reqVO) { 34 public CommonResult<List<SysDeptRespVO>> listDepts(SysDeptListReqVO reqVO) {
35 - List<SysDeptDO> list = sysDeptService.listDepts(reqVO); 35 + List<SysDeptDO> list = deptService.listDepts(reqVO);
36 list.sort(Comparator.comparing(SysDeptDO::getSort)); 36 list.sort(Comparator.comparing(SysDeptDO::getSort));
37 return success(SysDeptConvert.INSTANCE.convertList(list)); 37 return success(SysDeptConvert.INSTANCE.convertList(list));
38 } 38 }
@@ -43,8 +43,8 @@ public class SysDeptController { @@ -43,8 +43,8 @@ public class SysDeptController {
43 // 获得部门列表,只要开启状态的 43 // 获得部门列表,只要开启状态的
44 SysDeptListReqVO reqVO = new SysDeptListReqVO(); 44 SysDeptListReqVO reqVO = new SysDeptListReqVO();
45 reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); 45 reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
46 - List<SysDeptDO> list = sysDeptService.listDepts(reqVO);  
47 - // 排序后,返回个诶前端 46 + List<SysDeptDO> list = deptService.listDepts(reqVO);
  47 + // 排序后,返回给前端
48 list.sort(Comparator.comparing(SysDeptDO::getSort)); 48 list.sort(Comparator.comparing(SysDeptDO::getSort));
49 return success(SysDeptConvert.INSTANCE.convertList02(list)); 49 return success(SysDeptConvert.INSTANCE.convertList02(list));
50 } 50 }
src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/SysPostController.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.dept;
  2 +
  3 +import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
  4 +import cn.iocoder.dashboard.common.pojo.CommonResult;
  5 +import cn.iocoder.dashboard.modules.system.controller.dept.vo.post.SysPostSimpleRespVO;
  6 +import cn.iocoder.dashboard.modules.system.convert.dept.SysPostConvert;
  7 +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysPostDO;
  8 +import cn.iocoder.dashboard.modules.system.service.dept.SysPostService;
  9 +import io.swagger.annotations.Api;
  10 +import io.swagger.annotations.ApiOperation;
  11 +import org.springframework.web.bind.annotation.GetMapping;
  12 +import org.springframework.web.bind.annotation.RequestMapping;
  13 +import org.springframework.web.bind.annotation.RestController;
  14 +
  15 +import javax.annotation.Resource;
  16 +import java.util.Collections;
  17 +import java.util.Comparator;
  18 +import java.util.List;
  19 +
  20 +import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
  21 +
  22 +@Api(tags = "岗位 API")
  23 +@RestController
  24 +@RequestMapping("/system/post")
  25 +public class SysPostController {
  26 +
  27 + @Resource
  28 + private SysPostService postService;
  29 +
  30 + @ApiOperation(value = "获取岗位精简信息列表", notes = "只包含被开启的岗位,主要用于前端的下拉选项")
  31 + @GetMapping("/list-all-simple")
  32 + public CommonResult<List<SysPostSimpleRespVO>> listSimplePosts() {
  33 + // 获得岗位列表,只要开启状态的
  34 + List<SysPostDO> list = postService.listPosts(null, Collections.singleton(CommonStatusEnum.ENABLE.getStatus()));
  35 + // 排序后,返回给前端
  36 + list.sort(Comparator.comparing(SysPostDO::getSort));
  37 + return success(SysPostConvert.INSTANCE.convertList02(list));
  38 + }
  39 +
  40 +}
src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserController.java
@@ -3,8 +3,7 @@ package cn.iocoder.dashboard.modules.system.controller.user; @@ -3,8 +3,7 @@ package cn.iocoder.dashboard.modules.system.controller.user;
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.iocoder.dashboard.common.pojo.CommonResult; 4 import cn.iocoder.dashboard.common.pojo.CommonResult;
5 import cn.iocoder.dashboard.common.pojo.PageResult; 5 import cn.iocoder.dashboard.common.pojo.PageResult;
6 -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageItemRespVO;  
7 -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageReqVO; 6 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.*;
8 import cn.iocoder.dashboard.modules.system.convert.user.SysUserConvert; 7 import cn.iocoder.dashboard.modules.system.convert.user.SysUserConvert;
9 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDeptDO; 8 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDeptDO;
10 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO; 9 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO;
@@ -12,10 +11,10 @@ import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService; @@ -12,10 +11,10 @@ import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService;
12 import cn.iocoder.dashboard.modules.system.service.user.SysUserService; 11 import cn.iocoder.dashboard.modules.system.service.user.SysUserService;
13 import cn.iocoder.dashboard.util.collection.CollectionUtils; 12 import cn.iocoder.dashboard.util.collection.CollectionUtils;
14 import io.swagger.annotations.Api; 13 import io.swagger.annotations.Api;
  14 +import io.swagger.annotations.ApiImplicitParam;
15 import io.swagger.annotations.ApiOperation; 15 import io.swagger.annotations.ApiOperation;
16 -import org.springframework.web.bind.annotation.GetMapping;  
17 -import org.springframework.web.bind.annotation.RequestMapping;  
18 -import org.springframework.web.bind.annotation.RestController; 16 +import org.springframework.validation.annotation.Validated;
  17 +import org.springframework.web.bind.annotation.*;
19 18
20 import javax.annotation.Resource; 19 import javax.annotation.Resource;
21 import java.util.*; 20 import java.util.*;
@@ -59,7 +58,36 @@ public class SysUserController { @@ -59,7 +58,36 @@ public class SysUserController {
59 }); 58 });
60 return success(new PageResult<>(userList, pageResult.getTotal())); 59 return success(new PageResult<>(userList, pageResult.getTotal()));
61 } 60 }
62 -// 61 +
  62 + /**
  63 + * 根据用户编号获取详细信息
  64 + */
  65 + @ApiOperation("获得用户详情")
  66 + @ApiImplicitParam(name = "id", value = "编号", readOnly = true, example = "1024")
  67 + @GetMapping("/get")
  68 +// @PreAuthorize("@ss.hasPermi('system:user:query')")
  69 + public CommonResult<SysUserRespVO> getInfo(@RequestParam("id") Long id) {
  70 + return success(SysUserConvert.INSTANCE.convert(userService.getUser(id)));
  71 + }
  72 +
  73 + @ApiOperation("新增用户")
  74 + @PostMapping("/create")
  75 +// @PreAuthorize("@ss.hasPermi('system:user:add')")
  76 +// @Log(title = "用户管理", businessType = BusinessType.INSERT)
  77 + public CommonResult<Long> createUser(@Validated @RequestBody SysUserCreateReqVO reqVO) {
  78 + Long id = userService.createUser(reqVO);
  79 + return success(id);
  80 + }
  81 +
  82 + @ApiOperation("修改用户")
  83 + @PostMapping("update")
  84 +// @PreAuthorize("@ss.hasPermi('system:user:edit')")
  85 +// @Log(title = "用户管理", businessType = BusinessType.UPDATE)
  86 + public CommonResult<Boolean> updateUser(@Validated @RequestBody SysUserUpdateReqVO reqVO) {
  87 + userService.updateUser(reqVO);
  88 + return success(true);
  89 + }
  90 +
63 // @Log(title = "用户管理", businessType = BusinessType.EXPORT) 91 // @Log(title = "用户管理", businessType = BusinessType.EXPORT)
64 // @PreAuthorize("@ss.hasPermi('system:user:export')") 92 // @PreAuthorize("@ss.hasPermi('system:user:export')")
65 // @GetMapping("/export") 93 // @GetMapping("/export")
@@ -90,76 +118,8 @@ public class SysUserController { @@ -90,76 +118,8 @@ public class SysUserController {
90 // return util.importTemplateExcel("用户数据"); 118 // return util.importTemplateExcel("用户数据");
91 // } 119 // }
92 // 120 //
93 -// /**  
94 -// * 根据用户编号获取详细信息  
95 -// */  
96 -// @PreAuthorize("@ss.hasPermi('system:user:query')")  
97 -// @GetMapping(value = { "/", "/{userId}" })  
98 -// public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId)  
99 -// {  
100 -// AjaxResult ajax = AjaxResult.success();  
101 -// List<SysRole> roles = roleService.selectRoleAll();  
102 -// ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));  
103 -// ajax.put("posts", postService.selectPostAll());  
104 -// if (StringUtils.isNotNull(userId))  
105 -// {  
106 -// ajax.put(AjaxResult.DATA_TAG, userService.selectUserById(userId));  
107 -// ajax.put("postIds", postService.selectPostListByUserId(userId));  
108 -// ajax.put("roleIds", roleService.selectRoleListByUserId(userId));  
109 -// }  
110 -// return ajax;  
111 -// }  
112 -//  
113 -// /**  
114 -// * 新增用户  
115 -// */  
116 -// @PreAuthorize("@ss.hasPermi('system:user:add')")  
117 -// @Log(title = "用户管理", businessType = BusinessType.INSERT)  
118 -// @PostMapping  
119 -// public AjaxResult add(@Validated @RequestBody SysUser user)  
120 -// {  
121 -// if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user.getUserName())))  
122 -// {  
123 -// return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,登录账号已存在");  
124 -// }  
125 -// else if (StringUtils.isNotEmpty(user.getPhonenumber())  
126 -// && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user)))  
127 -// {  
128 -// return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,手机号码已存在");  
129 -// }  
130 -// else if (StringUtils.isNotEmpty(user.getEmail())  
131 -// && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user)))  
132 -// {  
133 -// return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");  
134 -// }  
135 -// user.setCreateBy(SecurityUtils.getUsername());  
136 -// user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));  
137 -// return toAjax(userService.insertUser(user));  
138 -// }  
139 -//  
140 -// /**  
141 -// * 修改用户  
142 -// */  
143 -// @PreAuthorize("@ss.hasPermi('system:user:edit')")  
144 -// @Log(title = "用户管理", businessType = BusinessType.UPDATE)  
145 -// @PutMapping  
146 -// public AjaxResult edit(@Validated @RequestBody SysUser user)  
147 -// {  
148 -// userService.checkUserAllowed(user);  
149 -// if (StringUtils.isNotEmpty(user.getPhonenumber())  
150 -// && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user)))  
151 -// {  
152 -// return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,手机号码已存在");  
153 -// }  
154 -// else if (StringUtils.isNotEmpty(user.getEmail())  
155 -// && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user)))  
156 -// {  
157 -// return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");  
158 -// }  
159 -// user.setUpdateBy(SecurityUtils.getUsername());  
160 -// return toAjax(userService.updateUser(user));  
161 -// }  
162 -// 121 +
  122 +
163 // /** 123 // /**
164 // * 删除用户 124 // * 删除用户
165 // */ 125 // */
src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserCreateReqVO.java
@@ -2,11 +2,21 @@ package cn.iocoder.dashboard.modules.system.controller.user.vo.user; @@ -2,11 +2,21 @@ package cn.iocoder.dashboard.modules.system.controller.user.vo.user;
2 2
3 3
4 import io.swagger.annotations.ApiModel; 4 import io.swagger.annotations.ApiModel;
  5 +import io.swagger.annotations.ApiModelProperty;
5 import lombok.Data; 6 import lombok.Data;
6 import lombok.EqualsAndHashCode; 7 import lombok.EqualsAndHashCode;
  8 +import org.hibernate.validator.constraints.Length;
  9 +
  10 +import javax.validation.constraints.NotEmpty;
7 11
8 @ApiModel("用户创建 Request VO") 12 @ApiModel("用户创建 Request VO")
9 @Data 13 @Data
10 @EqualsAndHashCode(callSuper = true) 14 @EqualsAndHashCode(callSuper = true)
11 public class SysUserCreateReqVO extends SysUserBaseVO { 15 public class SysUserCreateReqVO extends SysUserBaseVO {
  16 +
  17 + @ApiModelProperty(value = "密码", required = true, example = "123456")
  18 + @NotEmpty(message = "密码不能为空")
  19 + @Length(min = 4, max = 16, message = "密码长度为 4-16 位")
  20 + private String password;
  21 +
12 } 22 }
src/main/java/cn/iocoder/dashboard/modules/system/convert/dept/SysPostConvert.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.convert.dept;
  2 +
  3 +import cn.iocoder.dashboard.modules.system.controller.dept.vo.post.SysPostSimpleRespVO;
  4 +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysPostDO;
  5 +import org.mapstruct.Mapper;
  6 +import org.mapstruct.factory.Mappers;
  7 +
  8 +import java.util.List;
  9 +
  10 +@Mapper
  11 +public interface SysPostConvert {
  12 +
  13 + SysPostConvert INSTANCE = Mappers.getMapper(SysPostConvert.class);
  14 +
  15 + List<SysPostSimpleRespVO> convertList02(List<SysPostDO> list);
  16 +
  17 +}
src/main/java/cn/iocoder/dashboard/modules/system/convert/user/SysUserConvert.java
1 package cn.iocoder.dashboard.modules.system.convert.user; 1 package cn.iocoder.dashboard.modules.system.convert.user;
2 2
3 import cn.iocoder.dashboard.common.pojo.PageResult; 3 import cn.iocoder.dashboard.common.pojo.PageResult;
  4 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserCreateReqVO;
4 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageItemRespVO; 5 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageItemRespVO;
  6 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO;
5 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDeptDO; 7 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDeptDO;
6 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO; 8 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO;
7 import com.baomidou.mybatisplus.core.metadata.IPage; 9 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -21,4 +23,8 @@ public interface SysUserConvert { @@ -21,4 +23,8 @@ public interface SysUserConvert {
21 @Mapping(source = "records", target = "list") 23 @Mapping(source = "records", target = "list")
22 PageResult<SysUserDO> convertPage(IPage<SysUserDO> page); 24 PageResult<SysUserDO> convertPage(IPage<SysUserDO> page);
23 25
  26 + SysUserDO convert(SysUserCreateReqVO bean);
  27 +
  28 + SysUserDO convert(SysUserUpdateReqVO bean);
  29 +
24 } 30 }
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/dept/SysPostMapper.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.dal.mysql.dao.dept;
  2 +
  3 +import cn.iocoder.dashboard.framework.mybatis.core.query.QueryWrapperX;
  4 +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysPostDO;
  5 +import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  6 +import org.apache.ibatis.annotations.Mapper;
  7 +
  8 +import java.util.Collection;
  9 +import java.util.List;
  10 +
  11 +@Mapper
  12 +public interface SysPostMapper extends BaseMapper<SysPostDO> {
  13 +
  14 + default List<SysPostDO> selectList(Collection<Long> ids, Collection<Integer> statuses) {
  15 + return selectList(new QueryWrapperX<SysPostDO>().inIfPresent("id", ids)
  16 + .inIfPresent("status", statuses));
  17 + }
  18 +
  19 +}
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/user/SysUserMapper.java
@@ -18,6 +18,14 @@ public interface SysUserMapper extends BaseMapper&lt;SysUserDO&gt; { @@ -18,6 +18,14 @@ public interface SysUserMapper extends BaseMapper&lt;SysUserDO&gt; {
18 return selectOne(new QueryWrapper<SysUserDO>().eq("username", username)); 18 return selectOne(new QueryWrapper<SysUserDO>().eq("username", username));
19 } 19 }
20 20
  21 + default SysUserDO selectByMobile(String mobile) {
  22 + return selectOne(new QueryWrapper<SysUserDO>().eq("mobile", mobile));
  23 + }
  24 +
  25 + default SysUserDO selectByEmail(String email) {
  26 + return selectOne(new QueryWrapper<SysUserDO>().eq("email", email));
  27 + }
  28 +
21 default IPage<SysUserDO> selectList(SysUserPageReqVO reqVO, List<Long> deptIds) { 29 default IPage<SysUserDO> selectList(SysUserPageReqVO reqVO, List<Long> deptIds) {
22 return selectPage(MyBatisUtils.buildPage(reqVO), 30 return selectPage(MyBatisUtils.buildPage(reqVO),
23 new QueryWrapperX<SysUserDO>().likeIfPresent("username", reqVO.getUsername()) 31 new QueryWrapperX<SysUserDO>().likeIfPresent("username", reqVO.getUsername())
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/dept/SysPostDO.java
@@ -40,7 +40,7 @@ public class SysPostDO extends BaseDO { @@ -40,7 +40,7 @@ public class SysPostDO extends BaseDO {
40 * 40 *
41 * 枚举 {@link CommonStatusEnum} 41 * 枚举 {@link CommonStatusEnum}
42 */ 42 */
43 - private String status; 43 + private Integer status;
44 /** 44 /**
45 * 备注 45 * 备注
46 */ 46 */
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/user/SysUserDO.java
@@ -19,7 +19,7 @@ import java.util.Set; @@ -19,7 +19,7 @@ import java.util.Set;
19 * 19 *
20 * @author ruoyi 20 * @author ruoyi
21 */ 21 */
22 -@TableName("sys_user") 22 +@TableName(value = "sys_user", autoResultMap = true)
23 @Data 23 @Data
24 @EqualsAndHashCode(callSuper = true) 24 @EqualsAndHashCode(callSuper = true)
25 public class SysUserDO extends BaseDO { 25 public class SysUserDO extends BaseDO {
src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java
@@ -32,4 +32,23 @@ public interface SysErrorCodeConstants { @@ -32,4 +32,23 @@ public interface SysErrorCodeConstants {
32 ErrorCode ROLE_CODE_DUPLICATE = new ErrorCode(1002003002, "已经存在编码为【{}}】的角色"); 32 ErrorCode ROLE_CODE_DUPLICATE = new ErrorCode(1002003002, "已经存在编码为【{}}】的角色");
33 ErrorCode ROLE_CAN_NOT_UPDATE_SYSTEM_TYPE_ROLE = new ErrorCode(1002003004, "不能操作类型为系统内置的角色"); 33 ErrorCode ROLE_CAN_NOT_UPDATE_SYSTEM_TYPE_ROLE = new ErrorCode(1002003004, "不能操作类型为系统内置的角色");
34 34
  35 + // ========== 用户模块 1002004000 ==========
  36 + ErrorCode USER_USERNAME_EXISTS = new ErrorCode(1002004000, "用户账号已经存在");
  37 + ErrorCode USER_MOBILE_EXISTS = new ErrorCode(1002004001, "手机号已经存在");
  38 + ErrorCode USER_EMAIL_EXISTS = new ErrorCode(1002004002, "邮箱已经存在");
  39 + ErrorCode USER_NOT_EXISTS = new ErrorCode(1002004003, "用户不存在");
  40 +
  41 + // ========== 部门模块 1002005000 ==========
  42 + ErrorCode DEPT_NAME_DUPLICATE = new ErrorCode(1002004001, "已经存在该名字的部门");
  43 + ErrorCode DEPT_PARENT_NOT_EXITS = new ErrorCode(1002004002,"父级部门不存在");
  44 + ErrorCode DEPT_NOT_FOUND = new ErrorCode(1002004003, "当前部门不存在");
  45 + ErrorCode DEPT_EXITS_CHILDREN = new ErrorCode(1002004004, "存在子部门,无法删除");
  46 + ErrorCode DEPT_PARENT_ERROR = new ErrorCode(1002004005, "不能设置自己为父资源");
  47 + ErrorCode DEPT_EXISTS_USER = new ErrorCode(1002004006, "部门中存在员工,无法删除");
  48 + ErrorCode DEPT_NOT_ENABLE = new ErrorCode(1002004007, "部门不处于开启状态,不允许选择");
  49 +
  50 + // ========== 岗位模块 1002005000 ==========
  51 + ErrorCode POST_NOT_FOUND = new ErrorCode(1002005001, "当前岗位不存在");
  52 + ErrorCode POST_NOT_ENABLE = new ErrorCode(1002005002, "岗位({}) 不处于开启状态,不允许选择");
  53 +
35 } 54 }
src/main/java/cn/iocoder/dashboard/modules/system/service/dept/SysDeptService.java
@@ -50,4 +50,12 @@ public interface SysDeptService { @@ -50,4 +50,12 @@ public interface SysDeptService {
50 */ 50 */
51 List<SysDeptDO> listDeptsByParentIdFromCache(Long parentId, boolean recursive); 51 List<SysDeptDO> listDeptsByParentIdFromCache(Long parentId, boolean recursive);
52 52
  53 + /**
  54 + * 获得部门信息
  55 + *
  56 + * @param id 部门编号
  57 + * @return 部门信息
  58 + */
  59 + SysDeptDO getDept(Long id);
  60 +
53 } 61 }
src/main/java/cn/iocoder/dashboard/modules/system/service/dept/SysPostService.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.service.dept;
  2 +
  3 +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysPostDO;
  4 +
  5 +import javax.annotation.Nullable;
  6 +import java.util.Collection;
  7 +import java.util.List;
  8 +
  9 +/**
  10 + * 岗位 Service 接口
  11 + *
  12 + * @author 芋道源码
  13 + */
  14 +public interface SysPostService {
  15 +
  16 + /**
  17 + * 获得所有岗位列表
  18 + *
  19 + * @param ids 岗位编号数组。如果为空,不进行筛选
  20 + * @param statuses 状态数组。如果为空,不进行筛选
  21 + * @return 部门列表
  22 + */
  23 + List<SysPostDO> listPosts(@Nullable Collection<Long> ids, @Nullable Collection<Integer> statuses);
  24 +
  25 +}
src/main/java/cn/iocoder/dashboard/modules/system/service/dept/impl/SysDeptServiceImpl.java
@@ -114,4 +114,9 @@ public class SysDeptServiceImpl implements SysDeptService { @@ -114,4 +114,9 @@ public class SysDeptServiceImpl implements SysDeptService {
114 recursiveCount - 1, parentDeptMap)); 114 recursiveCount - 1, parentDeptMap));
115 } 115 }
116 116
  117 + @Override
  118 + public SysDeptDO getDept(Long id) {
  119 + return deptMapper.selectById(id);
  120 + }
  121 +
117 } 122 }
src/main/java/cn/iocoder/dashboard/modules/system/service/dept/impl/SysPostServiceImpl.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.service.dept.impl;
  2 +
  3 +import cn.iocoder.dashboard.modules.system.dal.mysql.dao.dept.SysPostMapper;
  4 +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysPostDO;
  5 +import cn.iocoder.dashboard.modules.system.service.dept.SysPostService;
  6 +import org.springframework.stereotype.Service;
  7 +
  8 +import javax.annotation.Resource;
  9 +import java.util.Collection;
  10 +import java.util.List;
  11 +
  12 +/**
  13 + * 岗位 Service 实现类
  14 + *
  15 + * @author 芋道源码
  16 + */
  17 +@Service
  18 +public class SysPostServiceImpl implements SysPostService {
  19 +
  20 + @Resource
  21 + private SysPostMapper postMapper;
  22 +
  23 + @Override
  24 + public List<SysPostDO> listPosts(Collection<Long> ids, Collection<Integer> statuses) {
  25 + return postMapper.selectList(ids, statuses);
  26 + }
  27 +
  28 +}
src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysMenuServiceImpl.java
@@ -170,55 +170,6 @@ public class SysMenuServiceImpl implements SysMenuService { @@ -170,55 +170,6 @@ public class SysMenuServiceImpl implements SysMenuService {
170 return menuMapper.selectById(id); 170 return menuMapper.selectById(id);
171 } 171 }
172 172
173 -// /**  
174 -// * 获得菜单列表  
175 -// *  
176 -// * @param menuIds 菜单编号列表  
177 -// * @return 菜单列表  
178 -// */  
179 -// public List<ResourceBO> listResources(List<Integer> menuIds) {  
180 -// List<ResourceDO> menuDOs = menuMapper.selectBatchIds(menuIds);  
181 -// return ResourceConvert.INSTANCE.convertList(menuDOs);  
182 -// }  
183 -//  
184 -// /**  
185 -// * 获得菜单全列表  
186 -// *  
187 -// * @return 菜单全列表  
188 -// */  
189 -// public List<ResourceBO> listResources() {  
190 -// List<ResourceDO> menuDOs = menuMapper.selectList(null);  
191 -// return ResourceConvert.INSTANCE.convertList(menuDOs);  
192 -// }  
193 -//  
194 -// /**  
195 -// * 获得指定类型的菜单列表  
196 -// *  
197 -// * @param type 菜单类型,允许空  
198 -// * @return 菜单列表  
199 -// */  
200 -// public List<ResourceBO> listResourcesByType(Integer type) {  
201 -// List<ResourceDO> menuDOs = menuMapper.selectListByType(type);  
202 -// return ResourceConvert.INSTANCE.convertList(menuDOs);  
203 -// }  
204 -//  
205 -// /**  
206 -// * 获得角色拥有的菜单列表  
207 -// *  
208 -// * @param roleIds 角色编号  
209 -// * @param type 菜单类型,允许空  
210 -// * @return 菜单列表  
211 -// */  
212 -// public List<ResourceBO> listRoleResourcesByType(Collection<Integer> roleIds, Integer type) {  
213 -// List<RoleResourceDO> roleResourceDOs = roleResourceMapper.selectListByRoleIds(roleIds);  
214 -// if (CollectionUtils.isEmpty(roleResourceDOs)) {  
215 -// return Collections.emptyList();  
216 -// }  
217 -// List<ResourceDO> menuDOs = menuMapper.selectListByIdsAndType(  
218 -// CollectionUtils.convertSet(roleResourceDOs, RoleResourceDO::getResourceId), type);  
219 -// return ResourceConvert.INSTANCE.convertList(menuDOs);  
220 -// }  
221 -//  
222 /** 173 /**
223 * 校验父菜单是否合法 174 * 校验父菜单是否合法
224 * 175 *
@@ -263,7 +214,7 @@ public class SysMenuServiceImpl implements SysMenuService { @@ -263,7 +214,7 @@ public class SysMenuServiceImpl implements SysMenuService {
263 if (menu == null) { 214 if (menu == null) {
264 return; 215 return;
265 } 216 }
266 - // 如果 menuId 为空,说明不用比较是否为相同 menuId 的菜单 217 + // 如果 id 为空,说明不用比较是否为相同 id 的菜单
267 if (id == null) { 218 if (id == null) {
268 throw ServiceExceptionUtil.exception(MENU_NAME_DUPLICATE); 219 throw ServiceExceptionUtil.exception(MENU_NAME_DUPLICATE);
269 } 220 }
src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserService.java
1 package cn.iocoder.dashboard.modules.system.service.user; 1 package cn.iocoder.dashboard.modules.system.service.user;
2 2
3 import cn.iocoder.dashboard.common.pojo.PageResult; 3 import cn.iocoder.dashboard.common.pojo.PageResult;
  4 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserCreateReqVO;
4 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageReqVO; 5 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageReqVO;
  6 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO;
5 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO; 7 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO;
6 8
7 /** 9 /**
@@ -29,10 +31,10 @@ public interface SysUserService { @@ -29,10 +31,10 @@ public interface SysUserService {
29 /** 31 /**
30 * 通过用户 ID 查询用户 32 * 通过用户 ID 查询用户
31 * 33 *
32 - * @param userId 用户ID 34 + * @param id 用户ID
33 * @return 用户对象信息 35 * @return 用户对象信息
34 */ 36 */
35 - SysUserDO getUser(Long userId); 37 + SysUserDO getUser(Long id);
36 38
37 /** 39 /**
38 * 获得用户分页列表 40 * 获得用户分页列表
@@ -42,6 +44,21 @@ public interface SysUserService { @@ -42,6 +44,21 @@ public interface SysUserService {
42 */ 44 */
43 PageResult<SysUserDO> pageUsers(SysUserPageReqVO reqVO); 45 PageResult<SysUserDO> pageUsers(SysUserPageReqVO reqVO);
44 46
  47 + /**
  48 + * 创建用户
  49 + *
  50 + * @param reqVO 用户信息
  51 + * @return 用户编号
  52 + */
  53 + Long createUser(SysUserCreateReqVO reqVO);
  54 +
  55 + /**
  56 + * 修改用户
  57 + *
  58 + * @param reqVO 用户信息
  59 + */
  60 + void updateUser(SysUserUpdateReqVO reqVO);
  61 +
45 // 62 //
46 // /** 63 // /**
47 // * 根据用户ID查询用户所属角色组 64 // * 根据用户ID查询用户所属角色组
src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImpl.java
1 package cn.iocoder.dashboard.modules.system.service.user; 1 package cn.iocoder.dashboard.modules.system.service.user;
2 2
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.util.StrUtil;
  5 +import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
  6 +import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil;
3 import cn.iocoder.dashboard.common.pojo.PageResult; 7 import cn.iocoder.dashboard.common.pojo.PageResult;
  8 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserCreateReqVO;
4 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageReqVO; 9 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageReqVO;
  10 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO;
5 import cn.iocoder.dashboard.modules.system.convert.user.SysUserConvert; 11 import cn.iocoder.dashboard.modules.system.convert.user.SysUserConvert;
6 import cn.iocoder.dashboard.modules.system.dal.mysql.dao.user.SysUserMapper; 12 import cn.iocoder.dashboard.modules.system.dal.mysql.dao.user.SysUserMapper;
7 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDeptDO; 13 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDeptDO;
  14 +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysPostDO;
8 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO; 15 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO;
9 import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService; 16 import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService;
  17 +import cn.iocoder.dashboard.modules.system.service.dept.SysPostService;
10 import cn.iocoder.dashboard.util.collection.CollectionUtils; 18 import cn.iocoder.dashboard.util.collection.CollectionUtils;
11 import lombok.extern.slf4j.Slf4j; 19 import lombok.extern.slf4j.Slf4j;
  20 +import org.springframework.security.crypto.password.PasswordEncoder;
12 import org.springframework.stereotype.Service; 21 import org.springframework.stereotype.Service;
13 22
14 import javax.annotation.Resource; 23 import javax.annotation.Resource;
15 import java.util.Collections; 24 import java.util.Collections;
16 import java.util.List; 25 import java.util.List;
  26 +import java.util.Map;
  27 +import java.util.Set;
  28 +
  29 +import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*;
17 30
18 31
19 /** 32 /**
@@ -30,16 +43,12 @@ public class SysUserServiceImpl implements SysUserService { @@ -30,16 +43,12 @@ public class SysUserServiceImpl implements SysUserService {
30 43
31 @Resource 44 @Resource
32 private SysDeptService deptService; 45 private SysDeptService deptService;
  46 + @Resource
  47 + private SysPostService postService;
  48 +
  49 + @Resource
  50 + private PasswordEncoder passwordEncoder;
33 51
34 -// @Autowired  
35 -// private SysUserMapper userMapper;  
36 -//  
37 -// @Autowired  
38 -// private SysRoleMapper roleMapper;  
39 -//  
40 -// @Autowired  
41 -// private SysPostMapper postMapper;  
42 -//  
43 // @Autowired 52 // @Autowired
44 // private SysUserRoleMapper userRoleMapper; 53 // private SysUserRoleMapper userRoleMapper;
45 // 54 //
@@ -68,8 +77,8 @@ public class SysUserServiceImpl implements SysUserService { @@ -68,8 +77,8 @@ public class SysUserServiceImpl implements SysUserService {
68 } 77 }
69 78
70 @Override 79 @Override
71 - public SysUserDO getUser(Long userId) {  
72 - return userMapper.selectById(userId); 80 + public SysUserDO getUser(Long id) {
  81 + return userMapper.selectById(id);
73 } 82 }
74 83
75 @Override 84 @Override
@@ -77,240 +86,148 @@ public class SysUserServiceImpl implements SysUserService { @@ -77,240 +86,148 @@ public class SysUserServiceImpl implements SysUserService {
77 // 处理部门查询条件 86 // 处理部门查询条件
78 List<Long> deptIds = Collections.emptyList(); 87 List<Long> deptIds = Collections.emptyList();
79 if (reqVO.getDeptId() != null) { 88 if (reqVO.getDeptId() != null) {
80 - deptIds = CollectionUtils.convertList(deptService.listDeptsByParentIdFromCache(reqVO.getDeptId(), true),  
81 - SysDeptDO::getId); 89 + deptIds = CollectionUtils.convertList(deptService.listDeptsByParentIdFromCache(
  90 + reqVO.getDeptId(), true), SysDeptDO::getId);
82 deptIds.add(reqVO.getDeptId()); 91 deptIds.add(reqVO.getDeptId());
83 } 92 }
84 // 执行查询 93 // 执行查询
85 return SysUserConvert.INSTANCE.convertPage(userMapper.selectList(reqVO, deptIds)); 94 return SysUserConvert.INSTANCE.convertPage(userMapper.selectList(reqVO, deptIds));
86 } 95 }
87 96
88 -// /**  
89 -// * 通过用户ID查询用户  
90 -// *  
91 -// * @param userId 用户ID  
92 -// * @return 用户对象信息  
93 -// */  
94 -// @Override  
95 -// public SysUser selectUserById(Long userId)  
96 -// {  
97 -// return userMapper.selectUserById(userId);  
98 -// }  
99 -//  
100 -// /**  
101 -// * 查询用户所属角色组  
102 -// *  
103 -// * @param userName 用户名  
104 -// * @return 结果  
105 -// */  
106 -// @Override  
107 -// public String selectUserRoleGroup(String userName)  
108 -// {  
109 -// List<SysRole> list = roleMapper.selectRolesByUserName(userName);  
110 -// StringBuffer idsStr = new StringBuffer();  
111 -// for (SysRole role : list)  
112 -// {  
113 -// idsStr.append(role.getRoleName()).append(",");  
114 -// }  
115 -// if (StringUtils.isNotEmpty(idsStr.toString()))  
116 -// {  
117 -// return idsStr.substring(0, idsStr.length() - 1);  
118 -// }  
119 -// return idsStr.toString();  
120 -// }  
121 -//  
122 -// /**  
123 -// * 查询用户所属岗位组  
124 -// *  
125 -// * @param userName 用户名  
126 -// * @return 结果  
127 -// */  
128 -// @Override  
129 -// public String selectUserPostGroup(String userName)  
130 -// {  
131 -// List<SysPost> list = postMapper.selectPostsByUserName(userName);  
132 -// StringBuffer idsStr = new StringBuffer();  
133 -// for (SysPost post : list)  
134 -// {  
135 -// idsStr.append(post.getPostName()).append(",");  
136 -// }  
137 -// if (StringUtils.isNotEmpty(idsStr.toString()))  
138 -// {  
139 -// return idsStr.substring(0, idsStr.length() - 1);  
140 -// }  
141 -// return idsStr.toString();  
142 -// }  
143 -//  
144 -// /**  
145 -// * 校验用户名称是否唯一  
146 -// *  
147 -// * @param userName 用户名称  
148 -// * @return 结果  
149 -// */  
150 -// @Override  
151 -// public String checkUserNameUnique(String userName)  
152 -// {  
153 -// int count = userMapper.checkUserNameUnique(userName);  
154 -// if (count > 0)  
155 -// {  
156 -// return UserConstants.NOT_UNIQUE;  
157 -// }  
158 -// return UserConstants.UNIQUE;  
159 -// }  
160 -//  
161 -// /**  
162 -// * 校验用户名称是否唯一  
163 -// *  
164 -// * @param user 用户信息  
165 -// * @return  
166 -// */  
167 -// @Override  
168 -// public String checkPhoneUnique(SysUser user)  
169 -// {  
170 -// Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId();  
171 -// SysUser info = userMapper.checkPhoneUnique(user.getPhonenumber());  
172 -// if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue())  
173 -// {  
174 -// return UserConstants.NOT_UNIQUE;  
175 -// }  
176 -// return UserConstants.UNIQUE;  
177 -// }  
178 -//  
179 -// /**  
180 -// * 校验email是否唯一  
181 -// *  
182 -// * @param user 用户信息  
183 -// * @return  
184 -// */  
185 -// @Override  
186 -// public String checkEmailUnique(SysUser user)  
187 -// {  
188 -// Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId();  
189 -// SysUser info = userMapper.checkEmailUnique(user.getEmail());  
190 -// if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue())  
191 -// {  
192 -// return UserConstants.NOT_UNIQUE;  
193 -// }  
194 -// return UserConstants.UNIQUE;  
195 -// }  
196 -//  
197 -// /**  
198 -// * 校验用户是否允许操作  
199 -// *  
200 -// * @param user 用户信息  
201 -// */  
202 -// @Override  
203 -// public void checkUserAllowed(SysUser user)  
204 -// {  
205 -// if (StringUtils.isNotNull(user.getUserId()) && user.isAdmin())  
206 -// {  
207 -// throw new CustomException("不允许操作超级管理员用户");  
208 -// }  
209 -// }  
210 -//  
211 -// /**  
212 -// * 新增保存用户信息  
213 -// *  
214 -// * @param user 用户信息  
215 -// * @return 结果  
216 -// */  
217 -// @Override  
218 -// @Transactional  
219 -// public int insertUser(SysUser user)  
220 -// {  
221 -// // 新增用户信息  
222 -// int rows = userMapper.insertUser(user);  
223 -// // 新增用户岗位关联  
224 -// insertUserPost(user);  
225 -// // 新增用户与角色管理  
226 -// insertUserRole(user);  
227 -// return rows;  
228 -// }  
229 -//  
230 -// /**  
231 -// * 修改保存用户信息  
232 -// *  
233 -// * @param user 用户信息  
234 -// * @return 结果  
235 -// */  
236 -// @Override  
237 -// @Transactional  
238 -// public int updateUser(SysUser user)  
239 -// {  
240 -// Long userId = user.getUserId();  
241 -// // 删除用户与角色关联  
242 -// userRoleMapper.deleteUserRoleByUserId(userId);  
243 -// // 新增用户与角色管理  
244 -// insertUserRole(user);  
245 -// // 删除用户与岗位关联  
246 -// userPostMapper.deleteUserPostByUserId(userId);  
247 -// // 新增用户与岗位管理  
248 -// insertUserPost(user);  
249 -// return userMapper.updateUser(user);  
250 -// }  
251 -//  
252 -// /**  
253 -// * 修改用户状态  
254 -// *  
255 -// * @param user 用户信息  
256 -// * @return 结果  
257 -// */  
258 -// @Override  
259 -// public int updateUserStatus(SysUser user)  
260 -// {  
261 -// return userMapper.updateUser(user);  
262 -// }  
263 -//  
264 -// /**  
265 -// * 修改用户基本信息  
266 -// *  
267 -// * @param user 用户信息  
268 -// * @return 结果  
269 -// */  
270 -// @Override  
271 -// public int updateUserProfile(SysUser user)  
272 -// {  
273 -// return userMapper.updateUser(user);  
274 -// }  
275 -//  
276 -// /**  
277 -// * 修改用户头像  
278 -// *  
279 -// * @param userName 用户名  
280 -// * @param avatar 头像地址  
281 -// * @return 结果  
282 -// */  
283 -// @Override  
284 -// public boolean updateUserAvatar(String userName, String avatar)  
285 -// {  
286 -// return userMapper.updateUserAvatar(userName, avatar) > 0;  
287 -// }  
288 -//  
289 -// /**  
290 -// * 重置用户密码  
291 -// *  
292 -// * @param user 用户信息  
293 -// * @return 结果  
294 -// */  
295 -// @Override  
296 -// public int resetPwd(SysUser user)  
297 -// {  
298 -// return userMapper.updateUser(user);  
299 -// }  
300 -//  
301 -// /**  
302 -// * 重置用户密码  
303 -// *  
304 -// * @param userName 用户名  
305 -// * @param password 密码  
306 -// * @return 结果  
307 -// */  
308 -// @Override  
309 -// public int resetUserPwd(String userName, String password)  
310 -// {  
311 -// return userMapper.resetUserPwd(userName, password);  
312 -// }  
313 -// 97 + @Override
  98 + public Long createUser(SysUserCreateReqVO reqVO) {
  99 + // 校验正确性
  100 + this.checkCreateOrUpdate(null, reqVO.getUsername(), reqVO.getMobile(), reqVO.getEmail(),
  101 + reqVO.getDeptId(), reqVO.getPostIds());
  102 + // 插入用户
  103 + SysUserDO user = SysUserConvert.INSTANCE.convert(reqVO);
  104 + user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启
  105 + user.setPassword(passwordEncoder.encode(reqVO.getPassword())); // 加密密码
  106 + userMapper.insert(user);
  107 + return user.getId();
  108 + }
  109 +
  110 + @Override
  111 + public void updateUser(SysUserUpdateReqVO reqVO) {
  112 + // 校验正确性
  113 + this.checkCreateOrUpdate(reqVO.getId(), reqVO.getUsername(), reqVO.getMobile(), reqVO.getEmail(),
  114 + reqVO.getDeptId(), reqVO.getPostIds());
  115 + // 更新用户
  116 + SysUserDO updateObj = SysUserConvert.INSTANCE.convert(reqVO);
  117 + userMapper.updateById(updateObj);
  118 + }
  119 +
  120 + private void checkCreateOrUpdate(Long id, String username, String mobile, String email,
  121 + Long deptId, Set<Long> postIds) {
  122 + // 校验用户存在
  123 + this.checkUserExists(id);
  124 + // 校验用户名唯一
  125 + this.checkUsernameUnique(id, username);
  126 + // 校验手机号唯一
  127 + this.checkMobileUnique(id, mobile);
  128 + // 校验邮箱唯一
  129 + this.checkEmailUnique(id, email);
  130 + // 校验部门处于开启状态
  131 + this.checkDeptEnable(deptId);
  132 + // 校验岗位处于开启状态
  133 + this.checkPostEnable(postIds);
  134 + }
  135 +
  136 + private void checkUserExists(Long id) {
  137 + if (id == null) {
  138 + return;
  139 + }
  140 + SysUserDO user = userMapper.selectById(id);
  141 + if (user == null) {
  142 + throw ServiceExceptionUtil.exception(USER_NOT_EXISTS);
  143 + }
  144 + }
  145 +
  146 + private void checkUsernameUnique(Long id, String username) {
  147 + if (StrUtil.isNotBlank(username)) {
  148 + return;
  149 + }
  150 + SysUserDO user = userMapper.selectByUsername(username);
  151 + if (user == null) {
  152 + return;
  153 + }
  154 + // 如果 id 为空,说明不用比较是否为相同 id 的用户
  155 + if (id == null) {
  156 + throw ServiceExceptionUtil.exception(USER_USERNAME_EXISTS);
  157 + }
  158 + if (!user.getId().equals(id)) {
  159 + throw ServiceExceptionUtil.exception(USER_USERNAME_EXISTS);
  160 + }
  161 + }
  162 +
  163 + private void checkEmailUnique(Long id, String email) {
  164 + if (StrUtil.isNotBlank(email)) {
  165 + return;
  166 + }
  167 + SysUserDO user = userMapper.selectByEmail(email);
  168 + if (user == null) {
  169 + return;
  170 + }
  171 + // 如果 id 为空,说明不用比较是否为相同 id 的用户
  172 + if (id == null) {
  173 + throw ServiceExceptionUtil.exception(USER_EMAIL_EXISTS);
  174 + }
  175 + if (!user.getId().equals(id)) {
  176 + throw ServiceExceptionUtil.exception(USER_EMAIL_EXISTS);
  177 + }
  178 + }
  179 +
  180 + private void checkMobileUnique(Long id, String email) {
  181 + if (StrUtil.isNotBlank(email)) {
  182 + return;
  183 + }
  184 + SysUserDO user = userMapper.selectByMobile(email);
  185 + if (user == null) {
  186 + return;
  187 + }
  188 + // 如果 id 为空,说明不用比较是否为相同 id 的用户
  189 + if (id == null) {
  190 + throw ServiceExceptionUtil.exception(USER_MOBILE_EXISTS);
  191 + }
  192 + if (!user.getId().equals(id)) {
  193 + throw ServiceExceptionUtil.exception(USER_MOBILE_EXISTS);
  194 + }
  195 + }
  196 +
  197 + private void checkDeptEnable(Long deptId) {
  198 + if (deptId == null) { // 允许不选择
  199 + return;
  200 + }
  201 + SysDeptDO dept = deptService.getDept(deptId);
  202 + if (dept == null) {
  203 + throw ServiceExceptionUtil.exception(DEPT_NOT_FOUND);
  204 + }
  205 + if (!CommonStatusEnum.ENABLE.getStatus().equals(dept.getStatus())) {
  206 + throw ServiceExceptionUtil.exception(DEPT_NOT_ENABLE);
  207 + }
  208 + }
  209 +
  210 + private void checkPostEnable(Set<Long> postIds) {
  211 + if (CollUtil.isEmpty(postIds)) { // 允许不选择
  212 + return;
  213 + }
  214 + List<SysPostDO> posts = postService.listPosts(postIds, null);
  215 + if (CollUtil.isEmpty(posts)) {
  216 + throw ServiceExceptionUtil.exception(POST_NOT_FOUND);
  217 + }
  218 + Map<Long, SysPostDO> postMap = CollectionUtils.convertMap(posts, SysPostDO::getId);
  219 + postIds.forEach(postId -> {
  220 + SysPostDO post = postMap.get(postId);
  221 + if (post == null) {
  222 + throw ServiceExceptionUtil.exception(POST_NOT_FOUND);
  223 + }
  224 + if (!CommonStatusEnum.ENABLE.getStatus().equals(post.getStatus())) {
  225 + throw ServiceExceptionUtil.exception(POST_NOT_ENABLE, post.getName());
  226 + }
  227 + });
  228 + }
  229 +
  230 +
314 // /** 231 // /**
315 // * 新增用户角色信息 232 // * 新增用户角色信息
316 // * 233 // *
@@ -379,28 +296,8 @@ public class SysUserServiceImpl implements SysUserService { @@ -379,28 +296,8 @@ public class SysUserServiceImpl implements SysUserService {
379 // userPostMapper.deleteUserPostByUserId(userId); 296 // userPostMapper.deleteUserPostByUserId(userId);
380 // return userMapper.deleteUserById(userId); 297 // return userMapper.deleteUserById(userId);
381 // } 298 // }
382 -//  
383 -// /**  
384 -// * 批量删除用户信息  
385 -// *  
386 -// * @param userIds 需要删除的用户ID  
387 -// * @return 结果  
388 -// */  
389 -// @Override  
390 -// @Transactional  
391 -// public int deleteUserByIds(Long[] userIds)  
392 -// {  
393 -// for (Long userId : userIds)  
394 -// {  
395 -// checkUserAllowed(new SysUser(userId));  
396 -// }  
397 -// // 删除用户与角色关联  
398 -// userRoleMapper.deleteUserRole(userIds);  
399 -// // 删除用户与岗位关联  
400 -// userPostMapper.deleteUserPost(userIds);  
401 -// return userMapper.deleteUserByIds(userIds);  
402 -// }  
403 -// 299 +
  300 +
404 // /** 301 // /**
405 // * 导入用户数据 302 // * 导入用户数据
406 // * 303 // *