refactor(user): 调整用户昵称与登录名字段使用逻辑- 将用户昵称字段从 nickName 更改为 userName

- 将登录账号字段从 userName 更改为 loginName
- 更新了用户信息展示和表单输入相关组件
- 调整了状态管理和数据获取逻辑以匹配新的字段命名
- 修正了个人信息页面的字段绑定和校验规则
- 更新了角色授权相关页面的用户信息显示字段- 后端接口同步调整用户字段处理逻辑
master
chenhao 2025-11-11 16:32:01 +08:00
parent bbe760abf6
commit 7dcbffe211
10 changed files with 580 additions and 428 deletions

View File

@ -65,7 +65,10 @@ export function changeUserStatus(userId, status) {
} }
return request({ return request({
url: '/system/user/changeStatus', url: '/system/user/changeStatus',
method: 'put', method: 'post',
headers: {
'Content-Type': 'multipart/form-data'
},
data: data data: data
}) })
} }

View File

@ -28,7 +28,7 @@
<el-dropdown class="avatar-container right-menu-item hover-effect" trigger="hover"> <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="hover">
<div class="avatar-wrapper"> <div class="avatar-wrapper">
<img :src="avatar" class="user-avatar"> <img :src="avatar" class="user-avatar">
<span class="user-nickname"> {{ nickName }} </span> <span class="user-nickname"> {{ userName }} </span>
</div> </div>
<el-dropdown-menu slot="dropdown"> <el-dropdown-menu slot="dropdown">
<router-link to="/user/profile"> <router-link to="/user/profile">
@ -74,7 +74,7 @@ export default {
'sidebar', 'sidebar',
'avatar', 'avatar',
'device', 'device',
'nickName' 'userName'
]), ]),
setting: { setting: {
get() { get() {

View File

@ -9,7 +9,7 @@ const getters = {
avatar: state => state.user.avatar, avatar: state => state.user.avatar,
id: state => state.user.id, id: state => state.user.id,
name: state => state.user.name, name: state => state.user.name,
nickName: state => state.user.nickName, userName: state => state.user.userName,
introduction: state => state.user.introduction, introduction: state => state.user.introduction,
roles: state => state.user.roles, roles: state => state.user.roles,
permissions: state => state.user.permissions, permissions: state => state.user.permissions,

View File

@ -8,7 +8,7 @@ const user = {
state: { state: {
id: '', id: '',
name: '', name: '',
nickName: '', userName: '',
avatar: '', avatar: '',
roles: [], roles: [],
permissions: [] permissions: []
@ -21,8 +21,8 @@ const user = {
SET_NAME: (state, name) => { SET_NAME: (state, name) => {
state.name = name state.name = name
}, },
SET_NICK_NAME: (state, nickName) => { SET_NICK_NAME: (state, userName) => {
state.nickName = nickName state.userName = userName
}, },
SET_AVATAR: (state, avatar) => { SET_AVATAR: (state, avatar) => {
state.avatar = avatar state.avatar = avatar
@ -69,8 +69,8 @@ const user = {
commit('SET_ROLES', ['ROLE_DEFAULT']) commit('SET_ROLES', ['ROLE_DEFAULT'])
} }
commit('SET_ID', user.userId) commit('SET_ID', user.userId)
commit('SET_NAME', user.userName) commit('SET_NAME', user.loginName)
commit('SET_NICK_NAME', user.nickName) commit('SET_NICK_NAME', user.userName)
commit('SET_AVATAR', avatar) commit('SET_AVATAR', avatar)
/* 初始密码提示 */ /* 初始密码提示 */
if(data.isDefaultModifyPwd) { if(data.isDefaultModifyPwd) {

View File

@ -61,8 +61,8 @@
<el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange"> <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column label="用户名称" prop="userName" :show-overflow-tooltip="true" /> <el-table-column label="用户名称" prop="loginName" :show-overflow-tooltip="true" />
<el-table-column label="用户昵称" prop="nickName" :show-overflow-tooltip="true" /> <el-table-column label="用户昵称" prop="userName" :show-overflow-tooltip="true" />
<el-table-column label="邮箱" prop="email" :show-overflow-tooltip="true" /> <el-table-column label="邮箱" prop="email" :show-overflow-tooltip="true" />
<el-table-column label="手机" prop="phonenumber" :show-overflow-tooltip="true" /> <el-table-column label="手机" prop="phonenumber" :show-overflow-tooltip="true" />
<el-table-column label="状态" align="center" prop="status"> <el-table-column label="状态" align="center" prop="status">
@ -196,4 +196,4 @@ export default {
} }
} }
} }
</script> </script>

View File

@ -26,8 +26,8 @@
<el-row> <el-row>
<el-table @row-click="clickRow" ref="table" :data="userList" @selection-change="handleSelectionChange" height="260px"> <el-table @row-click="clickRow" ref="table" :data="userList" @selection-change="handleSelectionChange" height="260px">
<el-table-column type="selection" width="55"></el-table-column> <el-table-column type="selection" width="55"></el-table-column>
<el-table-column label="用户名称" prop="userName" :show-overflow-tooltip="true" /> <el-table-column label="用户名称" prop="loginName" :show-overflow-tooltip="true" />
<el-table-column label="用户昵称" prop="nickName" :show-overflow-tooltip="true" /> <el-table-column label="用户昵称" prop="userName" :show-overflow-tooltip="true" />
<el-table-column label="邮箱" prop="email" :show-overflow-tooltip="true" /> <el-table-column label="邮箱" prop="email" :show-overflow-tooltip="true" />
<el-table-column label="手机" prop="phonenumber" :show-overflow-tooltip="true" /> <el-table-column label="手机" prop="phonenumber" :show-overflow-tooltip="true" />
<el-table-column label="状态" align="center" prop="status"> <el-table-column label="状态" align="center" prop="status">
@ -129,7 +129,7 @@ export default {
this.$modal.msgSuccess(res.msg) this.$modal.msgSuccess(res.msg)
this.visible = false this.visible = false
this.$emit("ok") this.$emit("ok")
}) })
} }
} }
} }

View File

@ -4,13 +4,13 @@
<el-form ref="form" :model="form" label-width="80px"> <el-form ref="form" :model="form" label-width="80px">
<el-row> <el-row>
<el-col :span="8" :offset="2"> <el-col :span="8" :offset="2">
<el-form-item label="用户昵称" prop="nickName"> <el-form-item label="用户昵称" prop="userName">
<el-input v-model="form.nickName" disabled /> <el-input v-model="form.userName" disabled />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8" :offset="2"> <el-col :span="8" :offset="2">
<el-form-item label="登录账号" prop="userName"> <el-form-item label="登录账号" prop="loginName">
<el-input v-model="form.userName" disabled /> <el-input v-model="form.loginName" disabled />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -120,4 +120,4 @@ export default {
} }
} }
} }
</script> </script>

View File

@ -59,8 +59,8 @@
<el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange"> <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="50" align="center" /> <el-table-column type="selection" width="50" align="center" />
<el-table-column label="用户编号" align="center" key="userId" prop="userId" v-if="columns.userId.visible" /> <el-table-column label="用户编号" align="center" key="userId" prop="userId" v-if="columns.userId.visible" />
<el-table-column label="用户名称" align="center" key="userName" prop="userName" v-if="columns.userName.visible" :show-overflow-tooltip="true" /> <el-table-column label="用户名称" align="center" key="loginName" prop="loginName" v-if="columns.loginName.visible" :show-overflow-tooltip="true" />
<el-table-column label="用户昵称" align="center" key="nickName" prop="nickName" v-if="columns.nickName.visible" :show-overflow-tooltip="true" /> <el-table-column label="用户昵称" align="center" key="userName" prop="userName" v-if="columns.userName.visible" :show-overflow-tooltip="true" />
<el-table-column label="部门" align="center" key="deptName" prop="dept.deptName" v-if="columns.deptName.visible" :show-overflow-tooltip="true" /> <el-table-column label="部门" align="center" key="deptName" prop="dept.deptName" v-if="columns.deptName.visible" :show-overflow-tooltip="true" />
<el-table-column label="手机号码" align="center" key="phonenumber" prop="phonenumber" v-if="columns.phonenumber.visible" width="120" /> <el-table-column label="手机号码" align="center" key="phonenumber" prop="phonenumber" v-if="columns.phonenumber.visible" width="120" />
<el-table-column label="状态" align="center" key="status" v-if="columns.status.visible"> <el-table-column label="状态" align="center" key="status" v-if="columns.status.visible">
@ -99,8 +99,8 @@
<el-form ref="form" :model="form" :rules="rules" label-width="80px"> <el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="用户昵称" prop="nickName"> <el-form-item label="用户名称" prop="userName">
<el-input v-model="form.nickName" placeholder="请输入用户昵称" maxlength="30" /> <el-input v-model="form.userName" placeholder="请输入用户名称" maxlength="30" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
@ -123,8 +123,8 @@
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item v-if="form.userId == undefined" label="用户名称" prop="userName"> <el-form-item v-if="form.userId == undefined" label="用户名称" prop="loginName">
<el-input v-model="form.userName" placeholder="请输入用户名称" maxlength="30" /> <el-input v-model="form.loginName" placeholder="请输入用户名称" maxlength="30" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
@ -279,8 +279,8 @@ export default {
// //
columns: { columns: {
userId: { label: '用户编号', visible: true }, userId: { label: '用户编号', visible: true },
userName: { label: '用户名称', visible: true }, loginName: { label: '用户名称', visible: true },
nickName: { label: '用户昵称', visible: true }, userName: { label: '用户昵称', visible: true },
deptName: { label: '部门', visible: true }, deptName: { label: '部门', visible: true },
phonenumber: { label: '手机号码', visible: true }, phonenumber: { label: '手机号码', visible: true },
status: { label: '状态', visible: true }, status: { label: '状态', visible: true },
@ -288,11 +288,11 @@ export default {
}, },
// //
rules: { rules: {
userName: [ loginName: [
{ required: true, message: "用户名称不能为空", trigger: "blur" }, { required: true, message: "用户名称不能为空", trigger: "blur" },
{ min: 2, max: 20, message: '用户名称长度必须介于 2 和 20 之间', trigger: 'blur' } { min: 2, max: 20, message: '用户名称长度必须介于 2 和 20 之间', trigger: 'blur' }
], ],
nickName: [ userName: [
{ required: true, message: "用户昵称不能为空", trigger: "blur" } { required: true, message: "用户昵称不能为空", trigger: "blur" }
], ],
password: [ password: [
@ -392,7 +392,7 @@ export default {
userId: undefined, userId: undefined,
deptId: undefined, deptId: undefined,
userName: undefined, userName: undefined,
nickName: undefined, loginName: undefined,
password: undefined, password: undefined,
phonenumber: undefined, phonenumber: undefined,
email: undefined, email: undefined,

View File

@ -1,8 +1,8 @@
<template> <template>
<el-form ref="form" :model="form" :rules="rules" label-width="80px"> <el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="用户昵称" prop="nickName"> <el-form-item label="用户昵称" prop="userName">
<el-input v-model="form.nickName" maxlength="30" /> <el-input v-model="form.userName" maxlength="30" />
</el-form-item> </el-form-item>
<el-form-item label="手机号码" prop="phonenumber"> <el-form-item label="手机号码" prop="phonenumber">
<el-input v-model="form.phonenumber" maxlength="11" /> <el-input v-model="form.phonenumber" maxlength="11" />
</el-form-item> </el-form-item>
@ -36,7 +36,7 @@ export default {
form: {}, form: {},
// //
rules: { rules: {
nickName: [ userName: [
{ required: true, message: "用户昵称不能为空", trigger: "blur" } { required: true, message: "用户昵称不能为空", trigger: "blur" }
], ],
email: [ email: [
@ -62,7 +62,7 @@ export default {
user: { user: {
handler(user) { handler(user) {
if (user) { if (user) {
this.form = { nickName: user.nickName, phonenumber: user.phonenumber, email: user.email, sex: user.sex } this.form = { userName: user.userName, phonenumber: user.phonenumber, email: user.email, sex: user.sex }
} }
}, },
immediate: true immediate: true

View File

@ -1,393 +1,542 @@
package com.ruoyi.web.controller.system; package com.ruoyi.web.controller.system;
import java.util.Collections; import java.io.IOException;
import java.util.List; import java.util.Collections;
import java.util.stream.Collectors; import java.util.List;
import java.util.stream.Collectors;
import cn.hutool.core.lang.Dict;
import com.ruoyi.common.utils.mail.TemplateMailUtil; import cn.hutool.core.lang.Dict;
import org.apache.commons.lang3.ArrayUtils; import com.ruoyi.common.config.RuoYiConfig;
import org.apache.shiro.authz.annotation.RequiresPermissions; import com.ruoyi.common.utils.file.FileUploadUtils;
import org.springframework.beans.factory.annotation.Autowired; import com.ruoyi.common.utils.mail.TemplateMailUtil;
import org.springframework.stereotype.Controller; import com.ruoyi.system.domain.SysPost;
import org.springframework.ui.ModelMap; import org.apache.commons.lang3.ArrayUtils;
import org.springframework.validation.annotation.Validated; import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.bind.annotation.PathVariable;
import com.ruoyi.common.annotation.Log; import org.springframework.web.bind.annotation.PostMapping;
import com.ruoyi.common.core.controller.BaseController; import org.springframework.web.bind.annotation.PutMapping;
import com.ruoyi.common.core.domain.AjaxResult; import org.springframework.web.bind.annotation.RequestBody;
import com.ruoyi.common.core.domain.Ztree; import org.springframework.web.bind.annotation.RequestMapping;
import com.ruoyi.common.core.domain.entity.SysDept; import org.springframework.web.bind.annotation.RequestParam;
import com.ruoyi.common.core.domain.entity.SysRole; import org.springframework.web.bind.annotation.ResponseBody;
import com.ruoyi.common.core.domain.entity.SysUser; import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.core.domain.Ztree;
import com.ruoyi.common.utils.ShiroUtils; import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.framework.shiro.service.SysPasswordService; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.framework.shiro.util.AuthorizationUtils; import com.ruoyi.common.core.text.Convert;
import com.ruoyi.system.service.ISysDeptService; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.service.ISysPostService; import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.system.service.ISysRoleService; import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.system.service.ISysUserService; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
/** import com.ruoyi.framework.shiro.service.SysPasswordService;
* import com.ruoyi.framework.shiro.util.AuthorizationUtils;
* import com.ruoyi.system.service.ISysDeptService;
* @author ruoyi import com.ruoyi.system.service.ISysPostService;
*/ import com.ruoyi.system.service.ISysRoleService;
@Controller import com.ruoyi.system.service.ISysUserService;
@RequestMapping("/system/user")
public class SysUserController extends BaseController /**
{ *
private String prefix = "system/user"; *
* @author ruoyi
@Autowired */
private ISysUserService userService; @Controller
@RequestMapping("/system/user")
@Autowired public class SysUserController extends BaseController
private ISysRoleService roleService; {
private String prefix = "system/user";
@Autowired
private ISysDeptService deptService; @Autowired
private ISysUserService userService;
@Autowired
private ISysPostService postService; @Autowired
private ISysRoleService roleService;
@Autowired
private SysPasswordService passwordService; @Autowired
private ISysDeptService deptService;
@RequiresPermissions("system:user:view")
@GetMapping() @Autowired
public String user() private ISysPostService postService;
{
return prefix + "/user"; @Autowired
} private SysPasswordService passwordService;
@RequiresPermissions("system:user:list") @Autowired
@PostMapping("/list") private RuoYiConfig ruoYiConfig;
@ResponseBody
public TableDataInfo list(SysUser user) @RequiresPermissions("system:user:view")
{ @GetMapping()
startPage(); public String user()
List<SysUser> list = userService.selectUserList(user); {
return getDataTable(list); return prefix + "/user";
} }
@Log(title = "用户管理", businessType = BusinessType.EXPORT) @RequiresPermissions("system:user:list")
@RequiresPermissions("system:user:export") @PostMapping("/list")
@PostMapping("/export") @ResponseBody
@ResponseBody public TableDataInfo list(SysUser user)
public AjaxResult export(SysUser user) {
{ startPage();
List<SysUser> list = userService.selectUserList(user); List<SysUser> list = userService.selectUserList(user);
ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class); return getDataTable(list);
return util.exportExcel(list, "用户数据"); }
}
@Log(title = "用户管理", businessType = BusinessType.EXPORT)
@Log(title = "用户管理", businessType = BusinessType.IMPORT) @RequiresPermissions("system:user:export")
@RequiresPermissions("system:user:import") @PostMapping("/export")
@PostMapping("/importData") @ResponseBody
@ResponseBody public AjaxResult export(SysUser user)
public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception {
{ List<SysUser> list = userService.selectUserList(user);
ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class); ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
List<SysUser> userList = util.importExcel(file.getInputStream()); return util.exportExcel(list, "用户数据");
String message = userService.importUser(userList, updateSupport, getLoginName()); }
return AjaxResult.success(message);
} @Log(title = "用户管理", businessType = BusinessType.IMPORT)
@RequiresPermissions("system:user:import")
@RequiresPermissions("system:user:view") @PostMapping("/importData")
@GetMapping("/importTemplate") @ResponseBody
@ResponseBody public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
public AjaxResult importTemplate() {
{ ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class); List<SysUser> userList = util.importExcel(file.getInputStream());
return util.importTemplateExcel("用户数据"); String message = userService.importUser(userList, updateSupport, getLoginName());
} return AjaxResult.success(message);
}
/**
* @RequiresPermissions("system:user:view")
*/ @GetMapping("/importTemplate")
@RequiresPermissions("system:user:add") @ResponseBody
@GetMapping("/add") public AjaxResult importTemplate()
public String add(ModelMap mmap) {
{ ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
mmap.put("roles", roleService.selectRoleAll().stream().filter(r -> !r.isAdmin()).collect(Collectors.toList())); return util.importTemplateExcel("用户数据");
mmap.put("posts", postService.selectPostAll()); }
return prefix + "/add";
} /**
*
/** */
* @RequiresPermissions("system:user:add")
*/ @GetMapping("/add")
@RequiresPermissions("system:user:add") public String add(ModelMap mmap)
@Log(title = "用户管理", businessType = BusinessType.INSERT) {
@PostMapping("/add") mmap.put("roles", roleService.selectRoleAll().stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
@ResponseBody mmap.put("posts", postService.selectPostAll());
public AjaxResult addSave(@Validated SysUser user) return prefix + "/add";
{ }
deptService.checkDeptDataScope(user.getDeptId());
roleService.checkRoleDataScope(user.getRoleIds()); /**
if (!userService.checkLoginNameUnique(user)) *
{ */
return error("新增用户'" + user.getLoginName() + "'失败,登录账号已存在"); @RequiresPermissions("system:user:add")
} @Log(title = "用户管理", businessType = BusinessType.INSERT)
else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) @PostMapping("/add")
{ @ResponseBody
return error("新增用户'" + user.getLoginName() + "'失败,手机号码已存在"); public AjaxResult addSave(@Validated SysUser user)
} {
else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) deptService.checkDeptDataScope(user.getDeptId());
{ roleService.checkRoleDataScope(user.getRoleIds());
return error("新增用户'" + user.getLoginName() + "'失败,邮箱账号已存在"); if (!userService.checkLoginNameUnique(user))
} {
user.setSalt(ShiroUtils.randomSalt()); return error("新增用户'" + user.getLoginName() + "'失败,登录账号已存在");
user.setPassword(passwordService.encryptPassword(user.getLoginName(), user.getPassword(), user.getSalt())); }
user.setPwdUpdateDate(DateUtils.getNowDate()); else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
user.setCreateBy(getLoginName()); {
return toAjax(userService.insertUser(user)); return error("新增用户'" + user.getLoginName() + "'失败,手机号码已存在");
} }
else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
/** {
* return error("新增用户'" + user.getLoginName() + "'失败,邮箱账号已存在");
*/ }
@RequiresPermissions("system:user:edit") user.setSalt(ShiroUtils.randomSalt());
@GetMapping("/edit/{userId}") user.setPassword(passwordService.encryptPassword(user.getLoginName(), user.getPassword(), user.getSalt()));
public String edit(@PathVariable("userId") Long userId, ModelMap mmap) user.setPwdUpdateDate(DateUtils.getNowDate());
{ user.setCreateBy(getLoginName());
userService.checkUserDataScope(userId); return toAjax(userService.insertUser(user));
List<SysRole> roles = roleService.selectRolesByUserId(userId); }
mmap.put("user", userService.selectUserById(userId));
mmap.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList())); /**
mmap.put("posts", postService.selectPostsByUserId(userId)); *
return prefix + "/edit"; */
} @RequiresPermissions("system:user:edit")
@GetMapping("/edit/{userId}")
/** public String edit(@PathVariable("userId") Long userId, ModelMap mmap)
* {
*/ userService.checkUserDataScope(userId);
@RequiresPermissions("system:user:list") List<SysRole> roles = roleService.selectRolesByUserId(userId);
@GetMapping("/view/{userId}") mmap.put("user", userService.selectUserById(userId));
public String view(@PathVariable("userId") Long userId, ModelMap mmap) mmap.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
{ mmap.put("posts", postService.selectPostsByUserId(userId));
userService.checkUserDataScope(userId); return prefix + "/edit";
mmap.put("user", userService.selectUserById(userId)); }
mmap.put("roleGroup", userService.selectUserRoleGroup(userId));
mmap.put("postGroup", userService.selectUserPostGroup(userId)); /**
return prefix + "/view"; *
} */
@RequiresPermissions("system:user:list")
/** @GetMapping("/view/{userId}")
* public String view(@PathVariable("userId") Long userId, ModelMap mmap)
*/ {
@RequiresPermissions("system:user:edit") userService.checkUserDataScope(userId);
@Log(title = "用户管理", businessType = BusinessType.UPDATE) mmap.put("user", userService.selectUserById(userId));
@PostMapping("/edit") mmap.put("roleGroup", userService.selectUserRoleGroup(userId));
@ResponseBody mmap.put("postGroup", userService.selectUserPostGroup(userId));
public AjaxResult editSave(@Validated SysUser user) return prefix + "/view";
{ }
userService.checkUserAllowed(user);
userService.checkUserDataScope(user.getUserId()); /**
deptService.checkDeptDataScope(user.getDeptId()); *
roleService.checkRoleDataScope(user.getRoleIds()); */
if (!userService.checkLoginNameUnique(user)) @RequiresPermissions("system:user:edit")
{ @Log(title = "用户管理", businessType = BusinessType.UPDATE)
return error("修改用户'" + user.getLoginName() + "'失败,登录账号已存在"); @PostMapping("/edit")
} @ResponseBody
else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) public AjaxResult editSave(@Validated SysUser user)
{ {
return error("修改用户'" + user.getLoginName() + "'失败,手机号码已存在"); userService.checkUserAllowed(user);
} userService.checkUserDataScope(user.getUserId());
else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) deptService.checkDeptDataScope(user.getDeptId());
{ roleService.checkRoleDataScope(user.getRoleIds());
return error("修改用户'" + user.getLoginName() + "'失败,邮箱账号已存在"); if (!userService.checkLoginNameUnique(user))
} {
user.setUpdateBy(getLoginName()); return error("修改用户'" + user.getLoginName() + "'失败,登录账号已存在");
AuthorizationUtils.clearAllCachedAuthorizationInfo(); }
return toAjax(userService.updateUser(user)); else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
} {
return error("修改用户'" + user.getLoginName() + "'失败,手机号码已存在");
@RequiresPermissions("system:user:resetPwd") }
@GetMapping("/resetPwd/{userId}") else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
public String resetPwd(@PathVariable("userId") Long userId, ModelMap mmap) {
{ return error("修改用户'" + user.getLoginName() + "'失败,邮箱账号已存在");
mmap.put("user", userService.selectUserById(userId)); }
return prefix + "/resetPwd"; user.setUpdateBy(getLoginName());
} AuthorizationUtils.clearAllCachedAuthorizationInfo();
return toAjax(userService.updateUser(user));
@RequiresPermissions("system:user:resetPwd") }
@Log(title = "重置密码", businessType = BusinessType.UPDATE)
@PostMapping("/resetPwd") @RequiresPermissions("system:user:resetPwd")
@ResponseBody @GetMapping("/resetPwd/{userId}")
public AjaxResult resetPwdSave(SysUser user) public String resetPwd(@PathVariable("userId") Long userId, ModelMap mmap)
{ {
userService.checkUserAllowed(user); mmap.put("user", userService.selectUserById(userId));
userService.checkUserDataScope(user.getUserId()); return prefix + "/resetPwd";
user.setSalt(ShiroUtils.randomSalt()); }
String realPassword = user.getPassword();
user.setPassword(passwordService.encryptPassword(user.getLoginName(), realPassword, user.getSalt())); // TODO: The frontend expects a PUT request to '/resetPwd' with a JSON body. This endpoint uses POST and takes form data.
if (userService.resetUserPwd(user) > 0) @RequiresPermissions("system:user:resetPwd")
{ @Log(title = "重置密码", businessType = BusinessType.UPDATE)
SysUser dbUser = userService.selectUserById(user.getUserId()); @PostMapping("/resetPwd")
if (dbUser!=null && StringUtils.isNotEmpty(dbUser.getEmail())){ @ResponseBody
TemplateMailUtil.sendTemplateMail(Collections.singletonList(dbUser.getEmail()),"密码重置", TemplateMailUtil.MailTemplate.PASSWORD_RESET, Dict.of("password", realPassword)); public AjaxResult resetPwdSave(SysUser user)
} {
if (ShiroUtils.getUserId().longValue() == user.getUserId().longValue()) userService.checkUserAllowed(user);
{ userService.checkUserDataScope(user.getUserId());
setSysUser(dbUser); user.setSalt(ShiroUtils.randomSalt());
} String realPassword = user.getPassword();
user.setPassword(passwordService.encryptPassword(user.getLoginName(), realPassword, user.getSalt()));
return success(); if (userService.resetUserPwd(user) > 0)
} {
return error(); SysUser dbUser = userService.selectUserById(user.getUserId());
} if (dbUser!=null && StringUtils.isNotEmpty(dbUser.getEmail())){
TemplateMailUtil.sendTemplateMail(Collections.singletonList(dbUser.getEmail()),"密码重置", TemplateMailUtil.MailTemplate.PASSWORD_RESET, Dict.of("password", realPassword));
/** }
* if (ShiroUtils.getUserId().longValue() == user.getUserId().longValue())
*/ {
@RequiresPermissions("system:user:edit") setSysUser(dbUser);
@GetMapping("/authRole/{userId}") }
public String authRole(@PathVariable("userId") Long userId, ModelMap mmap)
{ return success();
SysUser user = userService.selectUserById(userId); }
// 获取用户所属的角色列表 return error();
List<SysRole> roles = roleService.selectRolesByUserId(userId); }
mmap.put("user", user);
mmap.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList())); /**
return prefix + "/authRole"; *
} */
// TODO: The frontend expects a GET request to this URL that returns JSON data (user and roles), not a view name.
/** @RequiresPermissions("system:user:edit")
* @GetMapping("/authRole/{userId}")
*/ public String authRole(@PathVariable("userId") Long userId, ModelMap mmap)
@RequiresPermissions("system:user:edit") {
@Log(title = "用户管理", businessType = BusinessType.GRANT) SysUser user = userService.selectUserById(userId);
@PostMapping("/authRole/insertAuthRole") // 获取用户所属的角色列表
@ResponseBody List<SysRole> roles = roleService.selectRolesByUserId(userId);
public AjaxResult insertAuthRole(Long userId, Long[] roleIds) mmap.put("user", user);
{ mmap.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
userService.checkUserDataScope(userId); return prefix + "/authRole";
roleService.checkRoleDataScope(roleIds); }
userService.insertUserAuth(userId, roleIds);
AuthorizationUtils.clearAllCachedAuthorizationInfo(); /**
return success(); *
} */
// TODO: The frontend expects a PUT request to '/system/user/authRole'. This endpoint is at '/authRole/insertAuthRole' and uses POST.
@RequiresPermissions("system:user:remove") @RequiresPermissions("system:user:edit")
@Log(title = "用户管理", businessType = BusinessType.DELETE) @Log(title = "用户管理", businessType = BusinessType.GRANT)
@PostMapping("/remove") @PostMapping("/authRole/insertAuthRole")
@ResponseBody @ResponseBody
public AjaxResult remove(String ids) public AjaxResult insertAuthRole(Long userId, Long[] roleIds)
{ {
if (ArrayUtils.contains(Convert.toLongArray(ids), getUserId())) userService.checkUserDataScope(userId);
{ roleService.checkRoleDataScope(roleIds);
return error("当前用户不能删除"); userService.insertUserAuth(userId, roleIds);
} AuthorizationUtils.clearAllCachedAuthorizationInfo();
return toAjax(userService.deleteUserByIds(ids)); return success();
} }
/** // TODO: The frontend expects a DELETE request to '/system/user/{userIds}'. This endpoint is at '/remove' and uses POST.
* @RequiresPermissions("system:user:remove")
*/ @Log(title = "用户管理", businessType = BusinessType.DELETE)
@PostMapping("/checkLoginNameUnique") @PostMapping("/remove")
@ResponseBody @ResponseBody
public boolean checkLoginNameUnique(SysUser user) public AjaxResult remove(String ids)
{ {
return userService.checkLoginNameUnique(user); if (ArrayUtils.contains(Convert.toLongArray(ids), getUserId()))
} {
return error("当前用户不能删除");
/** }
* return toAjax(userService.deleteUserByIds(ids));
*/ }
@PostMapping("/checkPhoneUnique")
@ResponseBody /**
public boolean checkPhoneUnique(SysUser user) *
{ */
return userService.checkPhoneUnique(user); @PostMapping("/checkLoginNameUnique")
} @ResponseBody
public boolean checkLoginNameUnique(SysUser user)
/** {
* email return userService.checkLoginNameUnique(user);
*/ }
@PostMapping("/checkEmailUnique")
@ResponseBody /**
public boolean checkEmailUnique(SysUser user) *
{ */
return userService.checkEmailUnique(user); @PostMapping("/checkPhoneUnique")
} @ResponseBody
public boolean checkPhoneUnique(SysUser user)
/** {
* return userService.checkPhoneUnique(user);
*/ }
@Log(title = "用户管理", businessType = BusinessType.UPDATE)
@RequiresPermissions("system:user:edit") /**
@PostMapping("/changeStatus") * email
@ResponseBody */
public AjaxResult changeStatus(SysUser user) @PostMapping("/checkEmailUnique")
{ @ResponseBody
userService.checkUserAllowed(user); public boolean checkEmailUnique(SysUser user)
userService.checkUserDataScope(user.getUserId()); {
return toAjax(userService.changeStatus(user)); return userService.checkEmailUnique(user);
} }
/** /**
* *
*/ */
@RequiresPermissions("system:user:list") @Log(title = "用户管理", businessType = BusinessType.UPDATE)
@GetMapping("/deptTreeData") @RequiresPermissions("system:user:edit")
@ResponseBody @PostMapping("/changeStatus")
public List<Ztree> deptTreeData() @ResponseBody
{ public AjaxResult changeStatus(SysUser user)
List<Ztree> ztrees = deptService.selectDeptTree(new SysDept()); {
return ztrees; userService.checkUserAllowed(user);
} userService.checkUserDataScope(user.getUserId());
return toAjax(userService.changeStatus(user));
/** }
*
* /**
* @param deptId ID *
*/ */
@RequiresPermissions("system:user:list") @RequiresPermissions("system:user:list")
@GetMapping("/selectDeptTree/{deptId}") @GetMapping("/deptTreeData")
public String selectDeptTree(@PathVariable("deptId") Long deptId, ModelMap mmap) @ResponseBody
{ public List<Ztree> deptTreeData()
SysDept value = deptService.selectDeptById(deptId); {
mmap.put("dept", value==null?new SysDept():value); List<Ztree> ztrees = deptService.selectDeptTree(new SysDept());
return prefix + "/deptTree"; return ztrees;
} }
/**
// ----------------------VUE页面使用--------------------------- *
@RequiresPermissions("system:user:list") *
@GetMapping("/list") * @param deptId ID
@ResponseBody */
public TableDataInfo listPage(SysUser user) { @RequiresPermissions("system:user:list")
startPage(); @GetMapping("/selectDeptTree/{deptId}")
List<SysUser> list = userService.selectUserList(user); public String selectDeptTree(@PathVariable("deptId") Long deptId, ModelMap mmap)
return getDataTable(list); {
} SysDept value = deptService.selectDeptById(deptId);
@RequiresPermissions("system:user:list") mmap.put("dept", value==null?new SysDept():value);
@GetMapping("/{userId}") return prefix + "/deptTree";
@ResponseBody }
public AjaxResult query(@PathVariable("userId") Long userId) {
return success(userService.selectUserById(userId));
} // ----------------------VUE页面使用---------------------------
@RequiresPermissions("system:user:list")
/** @GetMapping("/list")
* @ResponseBody
*/ public TableDataInfo listPage(SysUser user) {
@RequiresPermissions("system:user:list") startPage();
@GetMapping("/deptTree") List<SysUser> list = userService.selectUserList(user);
@ResponseBody return getDataTable(list);
public AjaxResult deptTree(SysDept dept) { }
return success(deptService.selectDeptTreeList(dept));
} // TODO: The frontend 'getUser' call expects this endpoint to return not just the user, but also 'posts', 'roles', 'postIds', and 'roleIds' for the add/edit dialog.
/**
*
*/
@GetMapping(value = { "/", "/{userId}" })
@ResponseBody
public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId)
{
AjaxResult ajax = AjaxResult.success();
if (StringUtils.isNotNull(userId))
{
userService.checkUserDataScope(userId);
SysUser sysUser = userService.selectUserById(userId);
ajax.put(AjaxResult.DATA_TAG, sysUser);
List<SysPost> postList = postService.selectPostsByUserId(userId);
ajax.put("postIds", postList.stream().filter(SysPost::isFlag).map(SysPost::getPostId).collect(Collectors.toList()));
ajax.put("roleIds", sysUser.getRoles().stream().map(SysRole::getRoleId).collect(Collectors.toList()));
}
List<SysRole> roles = roleService.selectRoleAll();
ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
ajax.put("posts", postService.selectPostAll());
return ajax;
}
/**
*
*/
@RequiresPermissions("system:user:list")
@GetMapping("/deptTree")
@ResponseBody
public AjaxResult deptTree(SysDept dept) {
return success(deptService.selectDeptTreeList(dept));
}
/**
*
*/
@RequiresPermissions("system:user:add")
@Log(title = "用户管理", businessType = BusinessType.INSERT)
@PostMapping()
@ResponseBody
public AjaxResult insertUser(@RequestBody @Validated SysUser user)
{
return addSave(user);
}
/**
*
*/
@RequiresPermissions("system:user:edit")
@Log(title = "用户管理", businessType = BusinessType.UPDATE)
@PutMapping()
@ResponseBody
public AjaxResult updateUser(@RequestBody @Validated SysUser user)
{
return editSave(user);
}
// ----------------------新增的个人信息 业务处理---------------------------
/**
*
*/
@GetMapping("/profile")
@ResponseBody
public AjaxResult profile()
{
SysUser user = getSysUser();
AjaxResult ajax = AjaxResult.success(user);
ajax.put("roleGroup", userService.selectUserRoleGroup(user.getUserId()));
ajax.put("postGroup", userService.selectUserPostGroup(user.getUserId()));
return ajax;
}
/**
*
*/
@Log(title = "个人信息", businessType = BusinessType.UPDATE)
@PutMapping("/profile")
@ResponseBody
public AjaxResult updateProfile(@RequestBody SysUser user)
{
SysUser currentUser = getSysUser();
currentUser.setUserName(user.getUserName());
currentUser.setEmail(user.getEmail());
currentUser.setPhonenumber(user.getPhonenumber());
currentUser.setSex(user.getSex());
if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(currentUser))
{
return error("修改用户'" + currentUser.getLoginName() + "'失败,手机号码已存在");
}
else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(currentUser))
{
return error("修改用户'" + currentUser.getLoginName() + "'失败,邮箱账号已存在");
}
if (userService.updateUserInfo(currentUser) > 0)
{
setSysUser(currentUser);
return success();
}
return error();
}
/**
*
*/
@Log(title = "个人信息", businessType = BusinessType.UPDATE)
@PutMapping("/profile/updatePwd")
@ResponseBody
public AjaxResult updatePwd(String oldPassword, String newPassword)
{
SysUser user = getSysUser();
if (!passwordService.matches(user, oldPassword))
{
return error("修改密码失败,旧密码错误");
}
if (passwordService.matches(user, newPassword))
{
return error("新密码不能与旧密码相同");
}
user.setSalt(ShiroUtils.randomSalt());
user.setPassword(passwordService.encryptPassword(user.getLoginName(), newPassword, user.getSalt()));
user.setPwdUpdateDate(DateUtils.getNowDate());
if (userService.resetUserPwd(user) > 0)
{
setSysUser(userService.selectUserById(user.getUserId()));
return success();
}
return error("修改密码异常,请联系管理员");
}
/**
*
*/
@Log(title = "用户头像", businessType = BusinessType.UPDATE)
@PostMapping("/profile/avatar")
@ResponseBody
public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws IOException
{
if (!file.isEmpty())
{
SysUser currentUser = getSysUser();
String avatar = FileUploadUtils.upload(ruoYiConfig.getAvatarPath(), file);
currentUser.setAvatar(avatar);
if (userService.updateUserInfo(currentUser) > 0)
{
setSysUser(currentUser);
return AjaxResult.success().put("imgUrl", avatar);
}
}
return error();
}
} }