diff --git a/awardBE/src/main/java/edu/ncst/award/common/constant/UserConstants.java b/awardBE/src/main/java/edu/ncst/award/common/constant/UserConstants.java new file mode 100644 index 0000000..25ea2c4 --- /dev/null +++ b/awardBE/src/main/java/edu/ncst/award/common/constant/UserConstants.java @@ -0,0 +1,118 @@ +package edu.ncst.award.common.constant; + +/** + * 用户常量信息 + * + * @author ruoyi + */ +public interface UserConstants { + + /** + * 平台内系统用户的唯一标志 + */ + String SYS_USER = "SYS_USER"; + + /** + * 正常状态 + */ + String NORMAL = "0"; + + /** + * 异常状态 + */ + String EXCEPTION = "1"; + + /** + * 用户封禁状态 + */ + String USER_DISABLE = "1"; + + /** + * 角色封禁状态 + */ + String ROLE_DISABLE = "1"; + + /** + * 部门正常状态 + */ + String DEPT_NORMAL = "0"; + + /** + * 部门停用状态 + */ + String DEPT_DISABLE = "1"; + + /** + * 字典正常状态 + */ + String DICT_NORMAL = "0"; + + /** + * 是否为系统默认(是) + */ + String YES = "Y"; + + /** + * 是否菜单外链(是) + */ + String YES_FRAME = "0"; + + /** + * 是否菜单外链(否) + */ + String NO_FRAME = "1"; + + /** + * 菜单类型(目录) + */ + String TYPE_DIR = "M"; + + /** + * 菜单类型(菜单) + */ + String TYPE_MENU = "C"; + + /** + * 菜单类型(按钮) + */ + String TYPE_BUTTON = "F"; + + /** + * Layout组件标识 + */ + String LAYOUT = "Layout"; + + /** + * ParentView组件标识 + */ + String PARENT_VIEW = "ParentView"; + + /** + * InnerLink组件标识 + */ + String INNER_LINK = "InnerLink"; + + /** + * 校验返回结果码 + */ + String UNIQUE = "0"; + String NOT_UNIQUE = "1"; + + /** + * 用户名长度限制 + */ + int USERNAME_MIN_LENGTH = 2; + int USERNAME_MAX_LENGTH = 20; + + /** + * 密码长度限制 + */ + int PASSWORD_MIN_LENGTH = 5; + int PASSWORD_MAX_LENGTH = 20; + + /** + * 管理员ID + */ + Long ADMIN_ID = 1L; + +} diff --git a/awardBE/src/main/java/edu/ncst/award/controller/UserController.java b/awardBE/src/main/java/edu/ncst/award/controller/UserController.java index f9267eb..f827977 100644 --- a/awardBE/src/main/java/edu/ncst/award/controller/UserController.java +++ b/awardBE/src/main/java/edu/ncst/award/controller/UserController.java @@ -1,49 +1,116 @@ package edu.ncst.award.controller; +import cn.hutool.core.util.ObjectUtil; +import edu.ncst.award.common.constant.UserConstants; +import edu.ncst.award.common.core.controller.BaseController; +import edu.ncst.award.common.core.page.TableDataInfo; +import edu.ncst.award.model.system.Role; import edu.ncst.award.model.system.User; +import edu.ncst.award.service.ISysRoleService; import edu.ncst.award.service.IUserService; import edu.ncst.award.utils.ResponseUtils; import edu.ncst.award.utils.ResultUtils; -import edu.ncst.award.vo.ListResultVO; +import edu.ncst.award.utils.StringUtils; import edu.ncst.award.vo.ResultVO; import edu.ncst.award.vo.param.CurrentUserDTO; -import edu.ncst.award.vo.param.query.UserQuery; -import io.swagger.annotations.Api; +import edu.ncst.award.vo.param.query.PageQuery; import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; -import org.springframework.validation.BindingResult; +import org.springframework.security.crypto.bcrypt.BCrypt; +import org.springframework.stereotype.Controller; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.HashMap; import java.util.List; - -; +import java.util.Map; +import java.util.stream.Collectors; /** * 用户 控制器 */ -@Api(description = "用户管理", tags = "UserController") @Slf4j @RestController +@Controller +@RequiredArgsConstructor @RequestMapping("/api/user") -public class UserController { +public class UserController extends BaseController { private final IUserService userService; + private final ISysRoleService roleService; - public UserController(IUserService userService) { - this.userService = userService; - } + /** + * 获取用户列表 + */ @ApiOperation("获取用户列表") @GetMapping("/list") - public ResultVO> getUserList(UserQuery query) { - ListResultVO userList = userService.getUserList(query); + public TableDataInfo list(User user, PageQuery pageQuery) { + return userService.selectPageUserList(user, pageQuery); + } - return ResultUtils.success("ok", userList); + /** + * 根据用户编号获取详细信息 + */ + @ApiOperation("根据用户编号获取详细信息") + @GetMapping(value = {"/", "/{id}"}) + public ResultVO> getInfo(@ApiParam("用户ID") @PathVariable(value = "id", required = false) Long userId) { + // admin 具有超级权限你不能修改他 + Map ajax = new HashMap<>(); + List roles = roleService.selectRoleAll(); + ajax.put("roles", UserConstants.ADMIN_ID.equals(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList())); + if (ObjectUtil.isNotNull(userId)) { + User sysUser = userService.selectUserById(userId); + ajax.put("user", sysUser); + ajax.put("roleIds", sysUser.getRoles().stream().map(Role::getRoleId).collect(Collectors.toList())); + } + return ResultUtils.success(ajax); } + /** + * 处理新增用户请求 + */ + @ApiOperation("处理新增用户请求") + @PostMapping + public ResultVO list(@RequestBody User user) { + if (StringUtils.isNotEmpty(user.getUsername()) && UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user))) { + return ResultUtils.error("新增用户" + user.getUsername() + "失败,账号已存在"); + } else if (StringUtils.isNotEmpty(user.getMobilePhone()) + && UserConstants.NOT_UNIQUE.equals(userService.checkUserMobilePhoneUnique(user))) { + return ResultUtils.error("新增用户" + user.getUsername() + "失败,用户手机号已存在"); + } else if (StringUtils.isNotEmpty(user.getEmail()) + && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) { + return ResultUtils.error("新增用户" + user.getUsername() + "失败,用户邮箱邮箱已存在"); + } + if (StringUtils.isEmpty(user.getPassword())) { + user.setPassword(BCrypt.hashpw(user.getPassword(), BCrypt.gensalt("$2a"))); + } + log.info("新增{}用户成功", user.getUsername()); + return userService.insertUser(user) > 0 ? ResultUtils.success() : ResultUtils.error(); + } + + /** + * 修改用户 + */ + @ApiOperation("修改用户") + @PutMapping + public ResultVO edit(@Validated @RequestBody User user) { + userService.checkUserAllowed(user); + if (StringUtils.isNotEmpty(user.getMobilePhone()) + && UserConstants.NOT_UNIQUE.equals(userService.checkUserMobilePhoneUnique(user))) { + return ResultUtils.error("修改用户'" + user.getUsername() + "'失败,手机号码已存在"); + } else if (StringUtils.isNotEmpty(user.getEmail()) + && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) { + return ResultUtils.error("修改用户'" + user.getUsername() + "'失败,邮箱账号已存在"); + } + return toAjax(userService.updateUser(user)); + } + @ApiOperation("获取当前用户信息") @GetMapping("/current") public ResponseEntity getCurrentUser() { diff --git a/awardBE/src/main/java/edu/ncst/award/mapper/system/UserMapper.java b/awardBE/src/main/java/edu/ncst/award/mapper/system/UserMapper.java index 9c93e65..74787a1 100644 --- a/awardBE/src/main/java/edu/ncst/award/mapper/system/UserMapper.java +++ b/awardBE/src/main/java/edu/ncst/award/mapper/system/UserMapper.java @@ -1,10 +1,14 @@ package edu.ncst.award.mapper.system; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import edu.ncst.award.model.system.Role; import edu.ncst.award.model.system.User; +import io.swagger.models.auth.In; +import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Update; import org.springframework.stereotype.Repository; @@ -15,37 +19,50 @@ import java.util.List; /** * 用户 Mapper 接口 */ -@Repository +@Mapper public interface UserMapper extends BaseMapper { - Page getUserPage( - @Param("pageRequest") Page pageRequest, - @Param(Constants.WRAPPER) QueryWrapper queryWrapper - ); +// Page getUserPage( +// @Param("pageRequest") Page pageRequest, +// @Param(Constants.WRAPPER) QueryWrapper queryWrapper +// ); +// +// List getUserList( @Param(Constants.WRAPPER) QueryWrapper queryWrapper); - List getUserList( @Param(Constants.WRAPPER) QueryWrapper queryWrapper); + + List getUserRolesById(long id); - User getUserDetail(Integer userId); +// User getUserDetail(Integer userId); +// +// User getUserByAccount(String account); +// +// User getUserByOpenId(String openId); +// +// @Update("UPDATE sys_user SET enable = #{ enable } WHERE id = #{ userId }") +// int setUserEnable(Integer userId, Boolean enable); +// +// // 更新用户的最后登录记录 +// int updateUserLastLoginRecord( +// @Param("userId") Integer userId, +// @Param("lastLoginIp") String lastLoginIp, +// @Param("lastLoginTime") Date lastLoginTime +// ); +// +// // 绑定用户微信号 +// int bindUserOpenId(Integer userId, String openId); +// +// int getUserByUnitID(Integer unitID); +// +// void batchUpdatePassword(List newuser); - User getUserByAccount(String account); + Page selectPageUserList(@Param("page") Page page, @Param("user") User user); - User getUserByOpenId(String openId); - - @Update("UPDATE sys_user SET enable = #{ enable } WHERE id = #{ userId }") - int setUserEnable(Integer userId, Boolean enable); - - // 更新用户的最后登录记录 - int updateUserLastLoginRecord( - @Param("userId") Integer userId, - @Param("lastLoginIp") String lastLoginIp, - @Param("lastLoginTime") Date lastLoginTime - ); - - // 绑定用户微信号 - int bindUserOpenId(Integer userId, String openId); - - int getUserByUnitID(Integer unitID); - - void batchUpdatePassword(List newuser); + /** + * 通过用户ID查询用户 + * + * @param userId 用户ID + * @return 用户对象信息 + */ + User selectUserById(Long userId); } diff --git a/awardBE/src/main/java/edu/ncst/award/model/system/User.java b/awardBE/src/main/java/edu/ncst/award/model/system/User.java index 2f06873..9e05a21 100644 --- a/awardBE/src/main/java/edu/ncst/award/model/system/User.java +++ b/awardBE/src/main/java/edu/ncst/award/model/system/User.java @@ -1,8 +1,11 @@ package edu.ncst.award.model.system; +import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonIgnore; +import edu.ncst.award.common.constant.UserConstants; import edu.ncst.award.model.BaseEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -13,37 +16,143 @@ import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import java.io.Serializable; +import java.time.LocalDate; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.stream.Collectors; -@ApiModel(value="User", description="用户") -@Data +@ApiModel(value = "User", description = "用户") +@SuppressWarnings("all") @EqualsAndHashCode(callSuper = false) +@Data @TableName("sys_user") public class User extends BaseEntity implements Serializable, UserDetails { - @ApiModelProperty(value = "用户id") - private Integer id; - @ApiModelProperty(value = "用户密码") - private String password; - @ApiModelProperty(value = "用户名") + private static final long serialVersionUID = 1L; + + @ApiModelProperty("用户ID") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty("用户名") + @TableField("username") private String username; - @ApiModelProperty(value = "用户真实名") + + @ApiModelProperty("用户昵称") + @TableField("nickname") + private String nickname; + + @ApiModelProperty("密码") + @TableField("password") + private String password; + + @ApiModelProperty("电子邮箱") + @TableField("email") + private String email; + + @ApiModelProperty("手机号") + @TableField("mobile_phone") + private String mobilePhone; + + @ApiModelProperty("工作单位ID") + @TableField("unit_id") + private Integer unitId; + + @ApiModelProperty("二级单位(部门)ID") + @TableField("dept_id") + private Integer deptId; + + @ApiModelProperty("行政职务") + @TableField("position") + private String position; + + @ApiModelProperty("办公电话") + @TableField("office_phone") + private String officePhone; + + @ApiModelProperty("真实姓名") + @TableField("full_name") private String fullName; - @ApiModelProperty(value = "地址信息") + + @ApiModelProperty("通讯地址") + @TableField("address") private String address; - @ApiModelProperty(value = "手机号") - private String phone; - @ApiModelProperty(value = "所属单位") - private Integer unitId; + + @ApiModelProperty("邮编") + @TableField("postal") + private String postal; + + @ApiModelProperty("性别") + @TableField("sex") + private String sex; + + @ApiModelProperty("国籍") + @TableField("country") + private String country; + + @ApiModelProperty("民族") + @TableField("nation") + private String nation; + + @ApiModelProperty("党派") + @TableField("party") + private String party; + + @ApiModelProperty("出生日期") + @TableField("birth_date") + private LocalDate birthDate; + + @ApiModelProperty("出生地") + @TableField("birth_area") + private String birthArea; + + @ApiModelProperty("身份证号") + @TableField("ID_card") + private String idCard; + + @ApiModelProperty("技术职称") + @TableField("title") + private String title; + + @ApiModelProperty("最高学位{0:博士;1:硕士;2:学士;3:专科;4:其他}") + @TableField("degree") + private String degree; + + @ApiModelProperty("最高学历{0:研究生;1:本科;2:专科;3:其他}") + @TableField("education") + private String education; + + @ApiModelProperty("毕业学校") + @TableField("college") + private String college; + + @ApiModelProperty("所学专业") + @TableField("major") + private String major; + + @ApiModelProperty("毕业日期") + @TableField("graduate_date") + private LocalDate graduateDate; + + @ApiModelProperty("是否归国人员") + @TableField("is_abroad") + private Boolean isAbroad; + + @ApiModelProperty("归国日期") + @TableField("return_date") + private LocalDate returnDate; + + @ApiModelProperty("个人签名图片id") + @TableField("sign") + private Integer sign; + @ApiModelProperty(value = "角色列表") @TableField(exist = false) private List roles; - @ApiModelProperty(value = "是否启用 1:启用 0:禁用") - private Boolean enable; - + @ApiModelProperty(value = "是否启用 1:启用 0:禁用") + @TableField("enable") + private String enable; @Override @@ -79,6 +188,12 @@ public class User extends BaseEntity implements Serializable, UserDetails { @Override public boolean isEnabled() { - return this.enable; + return enable.equals("1"); }//是否启用 + + @ApiModelProperty(value = "是否超级管理员") + public boolean isAdmin() { + return UserConstants.ADMIN_ID.equals(this.id); + } } + diff --git a/awardBE/src/main/java/edu/ncst/award/service/impl/system/UserServiceImpl.java b/awardBE/src/main/java/edu/ncst/award/service/impl/system/UserServiceImpl.java index 37818b5..bcd3699 100644 --- a/awardBE/src/main/java/edu/ncst/award/service/impl/system/UserServiceImpl.java +++ b/awardBE/src/main/java/edu/ncst/award/service/impl/system/UserServiceImpl.java @@ -1,24 +1,39 @@ package edu.ncst.award.service.impl.system; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import edu.ncst.award.common.constant.UserConstants; +import edu.ncst.award.common.core.exception.ServiceException; +import edu.ncst.award.common.core.page.TableDataInfo; import edu.ncst.award.mapper.system.UserMapper; import edu.ncst.award.model.system.Role; import edu.ncst.award.model.system.User; import edu.ncst.award.service.IUserService; import edu.ncst.award.vo.ListResultVO; import edu.ncst.award.vo.param.CurrentUserDTO; +import edu.ncst.award.vo.param.query.PageQuery; import edu.ncst.award.vo.param.query.UserQuery; import edu.ncst.award.vo.result.UserInfoVO; +import lombok.RequiredArgsConstructor; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestParam; import java.util.ArrayList; import java.util.List; +@RequiredArgsConstructor @Service public class UserServiceImpl extends ServiceImpl implements IUserService, UserDetailsService { + + private final UserMapper baseMapper; + @Override public UserInfoVO getUserInfo(UserQuery query) { UserInfoVO vo = new UserInfoVO(); @@ -28,19 +43,19 @@ public class UserServiceImpl extends ServiceImpl implements IU return vo; } + @Override - public ListResultVO getUserList(UserQuery query) { - User user = new User(); - user.setPassword("$2a$10$1cDN8G8bEpqkvOHZUxrAk.qvnZzP8IAuCWzezPXCdZYOL4jKVgEb."); - user.setAddress("address 1111111"); - user.setUsername("zhangsan"); - user.setFullName("张三"); - user.setEnable(true); - ListResultVO listResultVO = new ListResultVO(); - List list = new ArrayList<>(); - list.add(user); - listResultVO.setList(list); - return listResultVO; + public TableDataInfo selectPageUserList(@RequestParam User user, PageQuery pageQuery) { + Page page = baseMapper.selectPageUserList(pageQuery.build(), user); + return TableDataInfo.build(page); + } + + @Override + public ListResultVO getUserList() { + list(); +// baseMapper.getUserPage() +// return listResultVO; + return new ListResultVO<>(); } @Override @@ -51,19 +66,122 @@ public class UserServiceImpl extends ServiceImpl implements IU return user; } + + @Override + public List getRoles() { + final ArrayList roles = new ArrayList<>(); + return roles; + } + + /** + * 新增保存用户信息 + * + * @param user 用户 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int insertUser(User user) { + // 新增用户信息 + // 新增用户与角色管理 +// insertUserRole(user); + return baseMapper.insert(user); + } + + /** + * 校验用户名称是否唯一 + * + * @param user 用户 + * @return 结果 + */ + @Override + public String checkUserNameUnique(User user) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper().eq(User::getUsername, user.getUsername()) + .ne(ObjectUtil.isNotNull(user.getId()), User::getId, user.getId())); + if (exist) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验用户手机号是否唯一 + * + * @param user@return 结果 + */ + @Override + public String checkUserMobilePhoneUnique(User user) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper().eq(User::getMobilePhone, user.getMobilePhone()) + .ne(ObjectUtil.isNotNull(user.getId()), User::getId, user.getId())); + if (exist) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 检查用户邮箱是否存在 + * + * @param user 用户 + * @return 结果 + */ + @Override + public String checkEmailUnique(User user) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper().eq(User::getEmail, user.getEmail()) + .ne(ObjectUtil.isNotNull(user.getId()), User::getId, user.getId())); + if (exist) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + /** + * 校验用户是否允许操作 + * + * @param user 用户信息 + */ + @Override + public void checkUserAllowed(User user) { + if (ObjectUtil.isNotNull(user.getId()) && user.isAdmin()) { + throw new ServiceException("不允许操作超级管理员用户"); + } + } + + /** + * 修改保存用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int updateUser(User user) { +// Long userId = user.getId(); + // 删除用户与角色关联 +// userRoleMapper.delete(new LambdaQueryWrapper().eq(SysUserRole::getUserId, userId)); + // 新增用户与角色管理 +// insertUserRole(user); + return baseMapper.updateById(user); + } + + /** + * 通过用户ID查询用户 + * + * @param userId 用户ID + * @return 用户对象信息 + */ + @Override + public User selectUserById(Long userId) { + return baseMapper.selectUserById(userId); + } + + @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - User user = new User(); - user.setPassword("$2a$10$1cDN8G8bEpqkvOHZUxrAk.qvnZzP8IAuCWzezPXCdZYOL4jKVgEb."); - user.setAddress("address 1111111"); - user.setUsername("zhangsan"); - user.setFullName("张三"); - Role role=new Role(); - role.setName("NORMAL"); - List roles = new ArrayList<>(); - roles.add(role); - user.setRoles(roles); - user.setEnable(true); + User user = getOne(new QueryWrapper().lambda().eq(User::getUsername, username)); + if (user == null) { + throw new UsernameNotFoundException("用户名不存在!"); + } + user.setRoles(baseMapper.getUserRolesById(user.getId())); return user; } } diff --git a/awardBE/src/main/resources/mapper/UserMapper.xml b/awardBE/src/main/resources/mapper/UserMapper.xml new file mode 100644 index 0000000..307c4c7 --- /dev/null +++ b/awardBE/src/main/resources/mapper/UserMapper.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT u.`id`, + u.`dept_id`, + u.`username`, + u.`nickname`, + u.`email`, + u.`mobile_phone`, + u.`password`, + u.`sex`, + u.`enable`, + u.`create_user_id`, + u.`create_time`, + u.`sign`, + d.`parent_id`, + d.`enable` AS dept_status, + r.`id`, + r.`name`, + r.`enable` AS role_status + FROM sys_user u + LEFT JOIN sys_dept d ON u.`dept_id` = d.`id` + LEFT JOIN sys_user_role ur ON u.`id` = ur.`user_id` + LEFT JOIN sys_role r ON r.`id` = ur.role_id + + + + + + + \ No newline at end of file