[尚庭公寓]11-用户与系统管理

用户管理

用户管理共包含两个接口,分别是**根据条件分页查询用户列表**和**根据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>
  1. 知识点: `password`字段不要查询出来。
  2. 接口测试

根据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;
    }
}
  1. 知识点: `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;

    }

  2. 接口测试

保存或更新后台用户信息

复制代码
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();
    }
}

知识点

密码处理

  1. 用户的密码通常不会直接以明文的形式保存到数据库中,而是会先经过处理,然后将处理之后得到的"密文"保存到数据库,这样能够降低数据库泄漏导致的用户账号安全问题。
  2. 密码通常会使用一些单向函数进行处理,如下图所示
  1. 常用于处理密码的单向函数(算法)有MD5、SHA-256等,**Apache Commons**提供了一个工具类`DigestUtils`,其中就包含上述算法的实现。

  2. 使用该工具类需引入`commons-codec`依赖,在**common模块**的pom.xml中增加如下内容

    <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> </dependency>

Mybatis-Plus update strategy (MP框架的更新策略)

  1. 使用Mybatis-Plus提供的更新方法时,若实体中的字段为`null`,默认情况下,最终生成的update语句中,不会包含该字段。若想改变默认行为,可做以下配置。
  2. 全局配置

在`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`:从不进行更新,不管该字段为何值,都不更新
  1. 局部配置

在实体类中的具体字段通过`@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();
    }
}
相关推荐
NEXU52 小时前
Linux:套接字
linux·服务器·网络
艾伦~耶格尔3 小时前
【数据结构进阶】
java·开发语言·数据结构·学习·面试
爪洼传承人3 小时前
18- 网络编程
java·网络编程
smileNicky4 小时前
SpringBoot系列之从繁琐配置到一键启动之旅
java·spring boot·后端
祈祷苍天赐我java之术4 小时前
Java 迭代器(Iterator)详解
java·开发语言
FreeBuf_4 小时前
CERT/CC警告:新型HTTP/2漏洞“MadeYouReset“恐致全球服务器遭DDoS攻击瘫痪
服务器·http·ddos
David爱编程4 小时前
为什么必须学并发编程?一文带你看懂从单线程到多线程的演进史
java·后端
我命由我123454 小时前
软件开发 - 避免过多的 if-else 语句(使用策略模式、使用映射表、使用枚举、使用函数式编程)
java·开发语言·javascript·设计模式·java-ee·策略模式·js
long3165 小时前
java 策略模式 demo
java·开发语言·后端·spring·设计模式
摇滚侠5 小时前
HTML <iframe> 标签 如何把html写入iframe标签
java