diff --git a/acs/nladmin-system/src/main/java/org/nl/modules/security/rest/AuthorizationController.java b/acs/nladmin-system/src/main/java/org/nl/modules/security/rest/AuthorizationController.java index 7b1ced2..d4325e2 100644 --- a/acs/nladmin-system/src/main/java/org/nl/modules/security/rest/AuthorizationController.java +++ b/acs/nladmin-system/src/main/java/org/nl/modules/security/rest/AuthorizationController.java @@ -92,6 +92,9 @@ public class AuthorizationController { throw new BadRequestException("账号或密码错误"); } + // 判断是否被锁 + if (!userDto.getEnabled()) throw new BadRequestException("账号未激活"); + // 获取权限列表 - 登录查找权限 List<String> permissionList = roleService.getPermissionList(userDto); diff --git a/acs/nladmin-system/src/main/java/org/nl/modules/system/rest/UserController.java b/acs/nladmin-system/src/main/java/org/nl/modules/system/rest/UserController.java index 95e2b74..672e2ef 100644 --- a/acs/nladmin-system/src/main/java/org/nl/modules/system/rest/UserController.java +++ b/acs/nladmin-system/src/main/java/org/nl/modules/system/rest/UserController.java @@ -19,12 +19,14 @@ import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.secure.SaSecureUtil; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.nl.modules.common.config.RsaProperties; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.common.utils.PageUtil; +import org.nl.modules.common.utils.RedisUtils; import org.nl.modules.common.utils.RsaUtils; import org.nl.modules.common.utils.SecurityUtils; import org.nl.modules.logging.annotation.Log; @@ -37,7 +39,9 @@ import org.nl.modules.system.service.UserService; import org.nl.modules.system.service.dto.RoleSmallDto; import org.nl.modules.system.service.dto.UserDto; import org.nl.modules.system.service.dto.UserQueryCriteria; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Pageable; +import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.util.CollectionUtils; @@ -67,6 +71,7 @@ public class UserController { private final DataService dataService; private final DeptService deptService; private final RoleService roleService; + private final RedisUtils redisUtils; @ApiOperation("导出用户数据") @GetMapping(value = "/download") @@ -107,7 +112,10 @@ public class UserController { public ResponseEntity<Object> create(@Validated @RequestBody User resources){ checkLevel(resources); // 默认密码 123456 - resources.setPassword(SaSecureUtil.md5BySalt("123456", "salt")); + if (ObjectUtil.isEmpty(resources.getPassword())) + resources.setPassword(SaSecureUtil.md5BySalt("123456", "salt")); + else + resources.setPassword(SaSecureUtil.md5BySalt(resources.getPassword(), "salt")); userService.create(resources); return new ResponseEntity<>(HttpStatus.CREATED); } @@ -144,6 +152,12 @@ public class UserController { if (currentLevel > optLevel) { throw new BadRequestException("角色权限不足,不能删除:" + userService.findById(id).getUsername()); } + // 删除缓存信息 + UserDto userDto = userService.findById(id); + redisUtils.del("data::user:" + userDto.getId()); + redisUtils.del("menu::user:" + userDto.getId()); + redisUtils.del("role::auth:" + userDto.getId()); + redisUtils.del("user::username:" + userDto.getUsername()); } userService.delete(ids); return new ResponseEntity<>(HttpStatus.OK); diff --git a/acs/nladmin-system/src/main/java/org/nl/modules/system/service/impl/UserServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/modules/system/service/impl/UserServiceImpl.java index 23c5723..6ec7033 100644 --- a/acs/nladmin-system/src/main/java/org/nl/modules/system/service/impl/UserServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/modules/system/service/impl/UserServiceImpl.java @@ -15,6 +15,8 @@ */ package org.nl.modules.system.service.impl; +import cn.dev33.satoken.secure.SaSecureUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; import org.nl.modules.common.config.FileProperties; @@ -89,9 +91,6 @@ public class UserServiceImpl implements UserService { if (userRepository.findByUsername(resources.getUsername()) != null) { throw new EntityExistException(User.class, "username", resources.getUsername()); } - if (userRepository.findByEmail(resources.getEmail()) != null) { - throw new EntityExistException(User.class, "email", resources.getEmail()); - } resources.setCreateBy(SecurityUtils.getCurrentUsername()); userRepository.save(resources); } @@ -102,45 +101,36 @@ public class UserServiceImpl implements UserService { User user = userRepository.findById(resources.getId()).orElseGet(User::new); ValidationUtil.isNull(user.getId(), "User", "id", resources.getId()); User user1 = userRepository.findByUsername(resources.getUsername()); - User user2 = userRepository.findByEmail(resources.getEmail()); if (user1 != null && !user.getId().equals(user1.getId())) { throw new EntityExistException(User.class, "username", resources.getUsername()); } - - if (user2 != null && !user.getId().equals(user2.getId())) { - throw new EntityExistException(User.class, "email", resources.getEmail()); - } // 如果用户的角色改变 if (!resources.getRoles().equals(user.getRoles())) { redisUtils.del(CacheKey.DATA_USER + resources.getId()); redisUtils.del(CacheKey.MENU_USER + resources.getId()); redisUtils.del(CacheKey.ROLE_AUTH + resources.getId()); } - // 如果用户名称修改 - if(!resources.getUsername().equals(user.getUsername())){ - redisUtils.del("user::username:" + user.getUsername()); - } + redisUtils.del("user::username:" + user.getUsername()); // 如果用户被禁用,则清除用户登录信息 if(!resources.getEnabled()){ onlineUserService.kickOutForUsername(resources.getUsername()); } - User clone = new User(); // jpa 多表问题,需要用新的类来进行修改 - clone.setId(resources.getId()); - clone.setUsername(resources.getUsername()); - clone.setEmail(resources.getEmail()); - clone.setEnabled(resources.getEnabled()); - clone.setRoles(resources.getRoles()); - clone.setDept(resources.getDept()); - clone.setPhone(resources.getPhone()); - clone.setNickName(resources.getNickName()); - clone.setGender(resources.getGender()); - - userRepository.save(clone); + user.setId(resources.getId()); + user.setUsername(resources.getUsername()); + user.setEmail(resources.getEmail()); + user.setEnabled(resources.getEnabled()); + user.setRoles(resources.getRoles()); + user.setDept(resources.getDept()); + user.setPhone(resources.getPhone()); + user.setNickName(resources.getNickName()); + user.setGender(resources.getGender()); + if (ObjectUtil.isNotEmpty(resources.getPassword())) + user.setPassword(SaSecureUtil.md5BySalt(resources.getPassword(), "salt")); + + userRepository.save(user); // 清除缓存 delCaches(user.getId(), user.getUsername()); - // 修改session -// flushSession(user); } @Override @@ -153,8 +143,6 @@ public class UserServiceImpl implements UserService { userRepository.save(user); // 清理缓存 delCaches(user.getId(), user.getUsername()); - // 修改session -// flushSession(user); } @Override @@ -184,7 +172,6 @@ public class UserServiceImpl implements UserService { public void updatePass(String username, String pass) { userRepository.updatePass(username, pass, new Date()); redisUtils.del("user::username:" + username); -// flushSession(userRepository.findByUsername(username)); } @Override @@ -200,7 +187,6 @@ public class UserServiceImpl implements UserService { FileUtil.del(oldPath); } @NotBlank String username = user.getUsername(); -// flushSession(user); return new HashMap<String, String>(1) {{ put("avatar", file.getName()); }}; @@ -210,7 +196,6 @@ public class UserServiceImpl implements UserService { @Transactional(rollbackFor = Exception.class) public void updateEmail(String username, String email) { userRepository.updateEmail(username, email); -// flushSession(userRepository.findByUsername(username)); } @Override @@ -239,17 +224,6 @@ public class UserServiceImpl implements UserService { */ public void delCaches(Long id, String username) { redisUtils.del(CacheKey.USER_ID + id); -// flushCache(username); } - /** - * 清理 登陆时 用户缓存信息 - * - * @param user / - */ -// private void flushSession(User user) { -// UserDto userDto = this.findByName(user.getUsername()); -// List<String> permissionList = roleService.getPermissionList(userDto.getId().toString()); -// flushSessionUtil.flushSessionInfo(userDto, permissionList); -// } } diff --git a/acs/nladmin-ui/src/views/login.vue b/acs/nladmin-ui/src/views/login.vue index 976355e..a2092fe 100644 --- a/acs/nladmin-ui/src/views/login.vue +++ b/acs/nladmin-ui/src/views/login.vue @@ -2,7 +2,7 @@ <div class="login" :style="'background-image:url('+ Background +');'"> <el-form ref="loginForm" :model="loginForm" :rules="loginRules" label-position="left" label-width="0px" class="login-form"> <h3 class="title"> - {{title}}</h3> + {{ title }}</h3> <el-form-item prop="username"> <el-input v-model="loginForm.username" type="text" auto-complete="off" placeholder="账号"> <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" /> @@ -120,14 +120,12 @@ export default { code: this.loginForm.code, uuid: this.loginForm.uuid } - if (user.password !== this.cookiePass) { - user.password = encrypt(user.password) - } + user.password = encrypt(user.password) if (valid) { this.loading = true if (user.rememberMe) { Cookies.set('username', user.username, { expires: Config.passCookieExpires }) - Cookies.set('password', user.password, { expires: Config.passCookieExpires }) + Cookies.set('password', this.loginForm.password, { expires: Config.passCookieExpires }) Cookies.set('rememberMe', user.rememberMe, { expires: Config.passCookieExpires }) } else { Cookies.remove('username') diff --git a/acs/nladmin-ui/src/views/system/user/index.vue b/acs/nladmin-ui/src/views/system/user/index.vue index 9db56a5..595ac2d 100644 --- a/acs/nladmin-ui/src/views/system/user/index.vue +++ b/acs/nladmin-ui/src/views/system/user/index.vue @@ -80,7 +80,7 @@ <el-form-item label="邮箱" prop="email"> <el-input v-model="form.email" style="width: 200px;" /> </el-form-item> - <el-form-item label="部门" prop="dept.id"> + <el-form-item label="部门" prop="dept.id" :rules="[{ required: true, message: '请选择部门', trigger: 'change' }]"> <treeselect v-model="form.dept.id" :options="depts" @@ -89,7 +89,10 @@ placeholder="选择部门" /> </el-form-item> - + <br v-if="!crud.status.add"> + <el-form-item v-if="crud.status.add" label="密码" prop="password"> + <el-input v-model="form.password" style="width: 200px;" show-password auto-complete="new-password" /> + </el-form-item> <el-form-item label="性别"> <el-radio-group v-model="form.gender" style="width: 178px"> <el-radio label="男">男</el-radio> @@ -168,16 +171,26 @@ <el-table-column v-permission="['admin','user:edit','user:del']" label="操作" - width="115" + width="200" align="center" fixed="right" > <template slot-scope="scope"> <udOperation + style="display:inline;" :data="scope.row" :permission="permission" :disabled-dle="scope.row.id === user.id" /> + <el-button + slot="left" + v-permission="permission.edit" + type="text" + icon="el-icon-refresh-left" + @click="resetPassword(scope.row)" + > + 重置密码 + </el-button> </template> </el-table-column> </el-table> @@ -212,7 +225,8 @@ const defaultForm = { enabled: 'true', roles: [], dept: { id: null }, - phone: null + phone: null, + password: null } export default { name: 'User', @@ -256,7 +270,7 @@ export default { ]) }, created() { - this.crud.msg.add = '新增成功,默认密码:123456' + this.crud.msg.add = '新增成功' }, mounted: function() { const that = this @@ -292,6 +306,7 @@ export default { }, // 新增前将多选的值设置为空 [CRUD.HOOK.beforeToAdd]() { + this.form.password = '123456' this.roleDatas = [] }, // 初始化编辑时候的角色与岗位 @@ -435,14 +450,36 @@ export default { }, checkboxT(row, rowIndex) { return row.id !== this.user.id + }, + resetPassword(row) { + row.password = null + this.$prompt('', '重置密码', { + confirmButtonText: '确定', + cancelButtonText: '取消', + inputPlaceholder: '请输入新的密码', + inputPattern: /^[A-Z|a-z|0-9|(._~!@#$^&*)]{6,20}$/, + inputErrorMessage: '密码格式不正确,只能是6-20位密码', + closeOnClickModal: false + }).then(({ value }) => { + row.password = value + crudUser.edit(row).then(res => { + this.crud.toQuery() + this.crud.notify('密码重置成功', CRUD.NOTIFICATION_TYPE.SUCCESS) + }) + }).catch(() => { + this.$message({ + type: 'info', + message: '取消输入' + }) + }) } } } </script> <style rel="stylesheet/scss" lang="scss" scoped> -::v-deep .vue-treeselect__control, ::v-deep .vue-treeselect__placeholder, ::v-deep .vue-treeselect__single-value { - height: 30px; - line-height: 30px; -} + ::v-deep .vue-treeselect__control, ::v-deep .vue-treeselect__placeholder, ::v-deep .vue-treeselect__single-value { + height: 30px; + line-height: 30px; + } </style>