用户管理
用户管理共包含两个接口,分别是**根据条件分页查询用户列表**和**根据ID更新用户状态**,下面逐一实现

根据条件分页查询用户列表
package com.atguigu.lease.web.admin.controller.user;
@Tag(name = "用户信息管理")
@RestController
@RequestMapping("/admin/user")
public class UserInfoController {
@Autowired
UserInfoService userInfoService;
@Operation(summary = "分页查询用户信息")
@GetMapping("page")
public Result<IPage<UserInfo>> pageUserInfo(@RequestParam long current, @RequestParam long size, UserInfoQueryVo queryVo) {
IPage<UserInfo> page = new Page<>(current, size);
LambdaQueryWrapper<UserInfo> wrapper = new LambdaQueryWrapper<>();
wrapper.like(queryVo.getPhone() != null, UserInfo::getPhone, queryVo.getPhone());
wrapper.eq(queryVo.getStatus() != null, UserInfo::getStatus, queryVo.getStatus());
IPage<UserInfo> list = userInfoService.page(page, wrapper);
return Result.ok(list);
}
}
知识点:
`password`字段属于敏感信息,因此在查询时应过滤掉,可在`UserInfo`实体的`password`字段的`@TableField`注解中增加一个参数`select=false`来实现。
package com.atguigu.lease.model.entity;
@Schema(description = "用户信息表")
@TableName(value = "user_info")
@Data
public class UserInfo extends BaseEntity {
@Schema(description = "密码")
@TableField(value = "password", select = false)
private String password;
}
接口测试

根据ID更新用户状态
package com.atguigu.lease.web.admin.controller.user;
@Tag(name = "用户信息管理")
@RestController
@RequestMapping("/admin/user")
public class UserInfoController {
@Autowired
UserInfoService userInfoService;
@Operation(summary = "根据用户id更新账号状态")
@PostMapping("updateStatusById")
public Result updateStatusById(@RequestParam Long id, @RequestParam BaseStatus status) {
LambdaUpdateWrapper<UserInfo> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(UserInfo::getId, id);
wrapper.set(UserInfo::getStatus, status);
userInfoService.update(wrapper);
return Result.ok();
}
}
系统管理
后台用户岗位管理
后台用户岗位管理共有六个接口,下面逐一实现

代码实现
package com.atguigu.lease.web.admin.controller.system;
@RestController
@Tag(name = "后台用户岗位管理")
@RequestMapping("/admin/system/post")
public class SystemPostController {
@Autowired
private SystemPostService systemPostService;
@Operation(summary = "分页获取岗位信息")
@GetMapping("page")
private Result<IPage<SystemPost>> page(@RequestParam long current, @RequestParam long size) {
IPage<SystemPost> page = new Page<>(current,size);
IPage<SystemPost> res = systemPostService.page(page);
return Result.ok(res);
}
@Operation(summary = "保存或更新岗位信息")
@PostMapping("saveOrUpdate")
public Result saveOrUpdate(@RequestBody SystemPost systemPost) {
systemPostService.saveOrUpdate(systemPost);
return Result.ok();
}
@DeleteMapping("deleteById")
@Operation(summary = "根据id删除岗位")
public Result removeById(@RequestParam Long id) {
systemPostService.removeById(id);
return Result.ok();
}
@GetMapping("getById")
@Operation(summary = "根据id获取岗位信息")
public Result<SystemPost> getById(@RequestParam Long id) {
SystemPost res = systemPostService.getById(id);
return Result.ok(res);
}
@Operation(summary = "获取全部岗位列表")
@GetMapping("list")
public Result<List<SystemPost>> list() {
List<SystemPost> list = systemPostService.list();
return Result.ok(list);
}
@Operation(summary = "根据岗位id修改状态")
@PostMapping("updateStatusByPostId")
public Result updateStatusByPostId(@RequestParam Long id, @RequestParam BaseStatus status) {
LambdaUpdateWrapper<SystemPost> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(SystemPost::getId, id);
wrapper.set(SystemPost::getStatus, status);
systemPostService.update(wrapper);
return Result.ok();
}
}
代码测试



后台用户信息管理
后台用户信息管理共有六个接口,下面逐一实现

根据条件分页查询后台用户列表
package com.atguigu.lease.web.admin.controller.system;
@Tag(name = "后台用户信息管理")
@RestController
@RequestMapping("/admin/system/user")
public class SystemUserController {
@Autowired
private SystemUserService systemUserService;
@Operation(summary = "根据条件分页查询后台用户列表")
@GetMapping("page")
public Result<IPage<SystemUserItemVo>> page(@RequestParam long current, @RequestParam long size, SystemUserQueryVo queryVo) {
IPage<SystemUserItemVo> page = new Page<>(current, size);
IPage<SystemUserItemVo> res = systemUserService.pageSystemUserByQuery(page, queryVo);
return Result.ok(res);
}
}
package com.atguigu.lease.web.admin.service.impl;
/**
* @author liubo
* @description 针对表【system_user(员工信息表)】的数据库操作Service实现
* @createDate 2023-07-24 15:48:00
*/
@Service
public class SystemUserServiceImpl extends ServiceImpl<SystemUserMapper, SystemUser>
implements SystemUserService {
@Autowired
private SystemUserMapper systemUserMapper;
@Override
public IPage<SystemUserItemVo> pageSystemUserByQuery(IPage<SystemUserItemVo> page, SystemUserQueryVo queryVo) {
return systemUserMapper.pageSystemUserByQuery(page,queryVo);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.atguigu.lease.web.admin.mapper.SystemUserMapper">
<select id="pageSystemUserByQuery"
resultType="com.atguigu.lease.web.admin.vo.system.user.SystemUserItemVo">
select su.id,
su.username,
su.name,
su.type,
su.phone,
su.avatar_url,
su.additional_info,
su.post_id,
su.status,
sp.name as post_name
from system_user su
left join system_post sp on su.post_id = sp.id and sp.is_deleted = 0
<where>
su.is_deleted = 0
<if test="queryVo.name != null and queryVo.name != ''">
and su.name like concat('%', #{queryVo.name}, '%')
</if>
<if test="queryVo.phone != null and queryVo.phone != ''">
and su.phone like concat('%', #{queryVo.phone}, '%')
</if>
</where>
</select>
</mapper>
- 知识点: `password`字段不要查询出来。
- 接口测试

根据ID查询后台用户信息
package com.atguigu.lease.web.admin.controller.system;
@Tag(name = "后台用户信息管理")
@RestController
@RequestMapping("/admin/system/user")
public class SystemUserController {
@Autowired
private SystemUserService systemUserService;
@Operation(summary = "根据ID查询后台用户信息")
@GetMapping("getById")
public Result<SystemUserItemVo> getById(@RequestParam Long id) {
SystemUserItemVo vo = systemUserService.getSystemUserById(id);
return Result.ok(vo);
}
}
package com.atguigu.lease.web.admin.service.impl;
/**
* @author liubo
* @description 针对表【system_user(员工信息表)】的数据库操作Service实现
* @createDate 2023-07-24 15:48:00
*/
@Service
public class SystemUserServiceImpl extends ServiceImpl<SystemUserMapper, SystemUser>
implements SystemUserService {
@Autowired
private SystemUserMapper systemUserMapper;
@Autowired
private SystemPostMapper systemPostMapper;
@Override
public SystemUserItemVo getSystemUserById(Long id) {
SystemUser systemUser = systemUserMapper.selectById(id);
SystemPost systemPost = systemPostMapper.selectById(systemUser.getPostId());
SystemUserItemVo systemUserItemVo = new SystemUserItemVo();
BeanUtils.copyProperties(systemUser, systemUserItemVo);
systemUserItemVo.setPostName(systemPost.getName());
return systemUserItemVo;
}
}
-
知识点: `system_user`表中的`password`字段不应查询,需要在`SystemUser`的`password`字段的`@TableField`注解中增加`select=false`参数。
package com.atguigu.lease.model.entity;
@Schema(description = "员工信息")
@TableName(value = "system_user")
@Data
public class SystemUser extends BaseEntity {@Schema(description = "密码") @TableField(value = "password", select = false) private String password;
}
-
接口测试

保存或更新后台用户信息
package com.atguigu.lease.web.admin.controller.system;
@Tag(name = "后台用户信息管理")
@RestController
@RequestMapping("/admin/system/user")
public class SystemUserController {
@Autowired
private SystemUserService systemUserService;
@Operation(summary = "保存或更新后台用户信息")
@PostMapping("saveOrUpdate")
public Result saveOrUpdate(@RequestBody SystemUser systemUser) {
if (systemUser.getPassword() != null) {
systemUser.setPassword(DigestUtils.md5Hex(systemUser.getPassword()));
}
systemUserService.saveOrUpdate(systemUser);
return Result.ok();
}
}
知识点
密码处理
- 用户的密码通常不会直接以明文的形式保存到数据库中,而是会先经过处理,然后将处理之后得到的"密文"保存到数据库,这样能够降低数据库泄漏导致的用户账号安全问题。
- 密码通常会使用一些单向函数进行处理,如下图所示

-
常用于处理密码的单向函数(算法)有MD5、SHA-256等,**Apache Commons**提供了一个工具类`DigestUtils`,其中就包含上述算法的实现。
-
使用该工具类需引入`commons-codec`依赖,在**common模块**的pom.xml中增加如下内容
<dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> </dependency>
Mybatis-Plus update strategy (MP框架的更新策略)
- 使用Mybatis-Plus提供的更新方法时,若实体中的字段为`null`,默认情况下,最终生成的update语句中,不会包含该字段。若想改变默认行为,可做以下配置。
- 全局配置
在`application.yml`中配置如下参数
mybatis-plus:
global-config:
db-config:
update-strategy: <strategy>
上述`<strategy>`可选值有:`ignore`、`not_null`、`not_empty`、`never`,默认值为`not_null`
- `ignore`:忽略空值判断,不管字段是否为空,都会进行更新
- `not_null`:进行非空判断,字段非空才会进行判断
- `not_empty`:进行非空判断,并进行非空串("")判断,主要针对字符串类型
- `never`:从不进行更新,不管该字段为何值,都不更新
- 局部配置
在实体类中的具体字段通过`@TableField`注解进行配置,如下:
@Schema(description = "密码")
@TableField(value = "password", updateStrategy = FieldStrategy.NOT_EMPTY)
private String password;
判断后台用户名是否可用
package com.atguigu.lease.web.admin.controller.system;
@Tag(name = "后台用户信息管理")
@RestController
@RequestMapping("/admin/system/user")
public class SystemUserController {
@Autowired
private SystemUserService systemUserService;
@Operation(summary = "判断后台用户名是否可用")
@GetMapping("isUserNameAvailable")
public Result<Boolean> isUsernameExists(@RequestParam String username) {
LambdaQueryWrapper<SystemUser> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemUser::getUsername, username);
long count = systemUserService.count(wrapper);
return Result.ok(count == 0);
}
}
根据ID删除后台用户信息
package com.atguigu.lease.web.admin.controller.system;
@Tag(name = "后台用户信息管理")
@RestController
@RequestMapping("/admin/system/user")
public class SystemUserController {
@Autowired
private SystemUserService systemUserService;
@DeleteMapping("deleteById")
@Operation(summary = "根据ID删除后台用户信息")
public Result removeById(@RequestParam Long id) {
systemUserService.removeById(id);
return Result.ok();
}
}
根据ID修改后台用户状态
package com.atguigu.lease.web.admin.controller.system;
@Tag(name = "后台用户信息管理")
@RestController
@RequestMapping("/admin/system/user")
public class SystemUserController {
@Autowired
private SystemUserService systemUserService;
@Operation(summary = "根据ID修改后台用户状态")
@PostMapping("updateStatusByUserId")
public Result updateStatusByUserId(@RequestParam Long id, @RequestParam BaseStatus status) {
LambdaUpdateWrapper<SystemUser> wrapper = new LambdaUpdateWrapper<SystemUser>()
.eq(SystemUser::getId, id)
.set(SystemUser::getStatus, status);
systemUserService.update(wrapper);
return Result.ok();
}
}