• JSD-2204-查询管理员列表-删除管理员-Day15


    1.查询管理员列表

    1.1持久层

    在根包下创建pojo.vo.AdminListItemVO类,在此类中添加属性:

    id, username, nickname, avatar, phone, email, description, enable, last_login_ip, login_count, gmt_last_login
    

    AdminMapper接口中添加抽象方法:

    List list();
    

    AdminMapper.xml中配置SQL语句:

    1. <select id="list" resultMap="ListResultMap">
    2. SELECT
    3. <include refid="ListQueryFields"/>
    4. FROM
    5. ams_admin
    6. ORDER BY
    7. id
    8. select>
    9. <sql id="ListQueryFields">
    10. <if test="true">
    11. id, username, nickname, avatar, phone,
    12. email, description, enable, last_login_ip, login_count,
    13. gmt_last_login
    14. if>
    15. sql>
    16. <resultMap id="ListResultMap" type="cn.tedu.csmall.passport.pojo.vo.AdminListItemVO">
    17. <id column="id" property="id"/>
    18. <result column="username" property="username" />
    19. <result column="nickname" property="nickname" />
    20. <result column="avatar" property="avatar" />
    21. <result column="phone" property="phone" />
    22. <result column="email" property="email" />
    23. <result column="description" property="description" />
    24. <result column="enable" property="enable" />
    25. <result column="last_login_ip" property="lastLoginIp" />
    26. <result column="login_count" property="loginCount" />
    27. <result column="gmt_last_login" property="gmtLastLogin" />
    28. resultMap>

    AdminMapperTests中编写并执行测试:

    1. @Test
    2. void testList() {
    3. List list = mapper.list();
    4. log.debug("查询管理员列表,结果集中的数据的数量:{}", list.size());
    5. for (Object item : list) {
    6. log.debug("{}", item);
    7. }
    8. }

    1.2业务逻辑层

    IAdminService接口中添加:

    List list();
    

    AdminServiceImpl中实现以上方法:

    1. public List list() {
    2. // 日志
    3. return adminMapper.list();
    4. }

    AdminServiceTests中编写并执行测试:

    1. @Test
    2. void testList() {
    3. List list = service.list();
    4. log.debug("查询管理员列表,结果集中的数据的数量:{}", list.size());
    5. for (Object item : list) {
    6. log.debug("{}", item);
    7. }
    8. }

    1.3控制器层

    AdminController中处理请求:

    1. @ApiOperation("查询管理员列表")
    2. @ApiOperationSupport(order = 400)
    3. @PreAuthorize("hasAuthority('/ams/admin/read')")
    4. @GetMapping("")
    5. public JsonResult> list() {
    6. log.debug("准备处理【查询管理员列表】的请求");
    7. List list = adminService.list();
    8. return JsonResult.ok(list);
    9. }

    2.删除管理员

    2.1持久层

    当需要删除管理员时,需要执行的SQL语句大致是:

    delete from ams_admin where id=?
    

    在执行删除之前,还应该检查此管理员的数据是否存在,可以通过“根据id查询管理员数据”来实现,需要执行的SQL语句大致是:

    select id, username, nickname …… from ams_admin where id=?
    

    另外,由于各管理员都存在与角色的关联,当确定删除管理员数据时,此管理员与角色的关联数据也应该删除,需要执行的SQL语句大致是:

    delete from ams_admin_role where admin_id=?
    

    则需要:

    • 在根包下创建pojo.vo.AdminStandardVO
    • AdminMapper接口中添加抽象方法:AdminStandardVO getStandardById(Long id);
    • AdminMapper接口中添加抽象方法:int deleteById(Long id);
    • AdminRoleMapper接口中添加抽象方法:int deleteByAdminId(Long adminId);

    2.1.1AdminMapper.java

    1. int deleteById(Long id);
    2. AdminStandardVO getStandardById(Long id);

    2.1.2AdminMapper.xml

    1. <select id="getStandardById" resultMap="StandardResultMap">
    2. SELECT
    3. <include refid="StandardQueryFields"/>
    4. FROM
    5. ams_admin
    6. WHERE
    7. id=#{id}
    8. select>
    9. <sql id="StandardQueryFields">
    10. <if test="true">
    11. id, username, password, nickname, avatar,
    12. phone, email, description, enable, last_login_ip,
    13. login_count, gmt_last_login
    14. if>
    15. sql>
    16. <resultMap id="StandardResultMap" type="cn.tedu.csmall.passport.pojo.vo.AdminStandardVO">
    17. <id column="id" property="id"/>
    18. <result column="username" property="username" />
    19. <result column="password" property="password" />
    20. <result column="nickname" property="nickname" />
    21. <result column="avatar" property="avatar" />
    22. <result column="phone" property="phone" />
    23. <result column="email" property="email" />
    24. <result column="description" property="description" />
    25. <result column="enable" property="enable" />
    26. <result column="last_login_ip" property="lastLoginIp" />
    27. <result column="login_count" property="loginCount" />
    28. <result column="gmt_last_login" property="gmtLastLogin" />
    29. resultMap>

    2.1.3AdminMapperTests.java

    1. @Test
    2. void testDeleteById() {
    3. Long id = 4L;
    4. int rows = mapper.deleteById(id);
    5. log.debug("根据id={}删除管理员成功,受影响的行数={}", id, rows);
    6. }
    7. @Test
    8. void testGetStandardById() {
    9. Long id = 6L;
    10. Object queryResult = mapper.getStandardById(id);
    11. log.debug("根据id={}查询管理员详情,查询结果={}", id, queryResult);
    12. }

    2.1.4AdminRoleMapper.java

    1. /**
    2. * 根据管理员id,删除管理员与角色的关联数据
    3. *
    4. * @param adminId 管理员id
    5. * @return 受影响的行数
    6. */
    7. int deleteByAdminId(Long adminId);

    2.1.5AdminRoleMapper.xml

    1. <delete id="deleteByAdminId">
    2. DELETE FROM
    3. ams_admin_role
    4. WHERE
    5. admin_id=#{adminId}
    6. delete>

    2.1.6AdminRoleMapperTests.java

    1. @Test
    2. void testDeleteByAdminId() {
    3. Long adminId = 24L;
    4. int rows = mapper.deleteByAdminId(adminId);
    5. log.debug("根据管理员id={}删除管理员与角色的关联数据,受影响的行数={}", adminId, rows);
    6. }

    2.2业务逻辑层

    IAdminService接口中添加抽象方法:

    void deleteById(Long id);
    

    AdminServiceImpl中实现以上方法:

    1. public void deleteById(Long id) {
    2. // 调用adminMapper根据参数id执行查询
    3. // 判断查询结果是否为null
    4. // 抛出ServiceException,业务状态码:40400
    5. // 调用adminMapper根据参数id删除管理员的数据,并获取返回值
    6. // 判断返回值是否不为1
    7. // 抛出ServiceException,业务状态码:DELETE对应的常量
    8. // 调用adminRoleMapper根据参数id删除关联数据,并获取返回值
    9. // 判断返回值是否小于1
    10. // 抛出ServiceException,业务状态码:DELETE对应的常量
    11. }

    具体实现为:

    1. @Override
    2. public void deleteById(Long id) {
    3. log.debug("开始处理【根据id删除管理员】的业务");
    4. // 调用adminMapper根据参数id执行查询
    5. AdminStandardVO queryResult = adminMapper.getStandardById(id);
    6. // 判断查询结果是否为null
    7. if (queryResult == null) {
    8. // 抛出ServiceException,业务状态码:40400
    9. String message = "删除管理员失败!尝试访问的数据不存在!";
    10. log.warn(message);
    11. throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
    12. }
    13. // 调用adminMapper根据参数id删除管理员的数据,并获取返回值
    14. int rows = adminMapper.deleteById(id);
    15. // 判断返回值是否不为1
    16. if (rows != 1) {
    17. // 抛出ServiceException,业务状态码:DELETE对应的常量
    18. String message = "删除管理员失败!服务器忙,请稍后再次尝试![错误代码:1]";
    19. log.warn(message);
    20. throw new ServiceException(ServiceCode.ERR_DELETE, message);
    21. }
    22. // 调用adminRoleMapper根据参数id删除关联数据,并获取返回值
    23. rows = adminRoleMapper.deleteByAdminId(id);
    24. // 判断返回值是否小于1
    25. if (rows < 1) {
    26. // 抛出ServiceException,业务状态码:DELETE对应的常量
    27. String message = "删除管理员失败!服务器忙,请稍后再次尝试![错误代码:2]";
    28. log.warn(message);
    29. throw new ServiceException(ServiceCode.ERR_DELETE, message);
    30. }
    31. }

    提示:以上方法必须是事务性的!

    提示:可能因为错误的测试数据,导致以上业务执行失败,属于正常现象,将这些错误的测试数据清除即可,或使用正确的测试数据来进行测试!

    最后,在AdminServiceTests中编写并执行测试:

    1. @Test
    2. void testDeleteById() {
    3. Long id = 10L;
    4. try {
    5. service.deleteById(id);
    6. log.debug("删除管理员成功!");
    7. } catch (ServiceException e) {
    8. log.debug(e.getMessage());
    9. }
    10. }

    2.3控制器层

    AdminController中添加处理请求的方法:

    1. @ApiOperation("根据id删除管理员")
    2. @ApiOperationSupport(order = 200)
    3. @ApiImplicitParam(name = "id", value = "管理员id", required = true, dataType = "long")
    4. @PreAuthorize("hasAuthority('/ams/admin/delete')")
    5. @PostMapping("/{id:[0-9]+}/delete")
    6. public JsonResult deleteById(@PathVariable Long id) {
    7. log.debug("准备处理【根据id删除管理员】的请求:id={}", id);
    8. adminService.deleteById(id);
    9. return JsonResult.ok();
    10. }

    3修改管理员账号的启用状态(作业)

    3.1持久层

    通常,在执行“修改数据”之前,应该对数据进行检查,例如数据是否存在等,此项检查可通过此前完成的查询来实现,本次不需要添加新的查询功能。

    关于修改数据,应该使用等相关标签,实现动态SQL的修改。此项修改功能的开发可以参考product项目中BrandMapper中的int update(Brand brand);的实现。

    3.2业务逻辑层

    IAdminService中添加抽象方法:

    1. // Admin admin = new Admin(); admin.setId(id); admin.setEnable(1);
    2. int setEnable(Long id);
    3. // Admin admin = new Admin(); admin.setId(id); admin.setEnable(0);
    4. int setDisable(Long id);

    AdminServiceImpl中实现:

    1. public int setEnable(Long id) {
    2. // 根据id查询管理员数据
    3. // 判断查询结果是否为null
    4. // 是:ServiceException:NOT_FOUND
    5. // 判断查询结果中的enable是否为1
    6. // 是:ServiceException:CONFLICT
    7. // Admin admin = new Admin(); admin.setId(id); admin.setEnable(1);
    8. // 执行更新,获取返回值
    9. // 判断返回值是否不为1
    10. // 是:ServiceException:UPDATE
    11. }
  • 相关阅读:
    【算法|动态规划No.28】leetcode1312. 让字符串成为回文串的最少插入次数
    golang redis lua脚本 和 lua function
    17条好用的 Python 技巧分享
    测试面经 | 从测试螺丝钉到大厂测试开发,三点成长心得和面试经验
    Apifox很难不爱
    MySQL8.0忘记密码
    启动服务报错:Command line is too long Shorten command line for xxx or also for Spri
    如何将IDEA项目上传到Gitee?IDAE如何导入Gitee上的文件?如何在IDEA中集成Git?如何在IDEA中进行版本控制?
    【OpenCV概念】 11— 对象检测
    深入解析:批处理文件中EOF命令的妙用
  • 原文地址:https://blog.csdn.net/TheNewSystrm/article/details/126292524