【机房报修管理系统】 后端篇(十九) Controller层开发——管理员相关接口

一、前情提要


    上一次我们对Controller层的开发做了一个问答Q&A,由于接近过年有比较多事情需要处理,所以拖了一点时间,隔了几天才更新,在这里先说一声抱歉。这一次我们来真正开发Controller层的管理员接口。


二、接口设计以及实现


1.创建一个管理员相关接口的接口类AdministratorController

com.repairsystem.web.controller创建类AdministratorController,注入管理员服务AdministratorService,其他的注解如有不明白可以查看上一期文章《【机房报修管理系统】后端篇(十八) Controller层开发——相关介绍Q&A》

@RestController
@Api(value = "管理员业务相关接口", tags = {"管理员业务相关接口",})
@RequestMapping("/admin")
public class AdministratorController {

    @Autowired
    private AdministratorService adminService;
}

2.设计一个实体类转为VO类的工具

在在com.repairsystem.utils创建工具类Entity2VO详情请查看我的上一篇博文
《【机房报修管理系统】后端篇(十八) Controller层开发——相关介绍Q&A》

3.在常量工具类ConstantUtils中填写分页参数

com.repairsystem.utils.ConstantUtils写下以下的内部类常量

 class Page{

        //一页展示多少条
        public static final Integer PAGESIZE = 10;

        //页码展示数量
        public static final Integer PAGESNUM = 4;
    }

4.创建分页工具类PageUtils

由于我们在返回JSON的时候需要返回一些参数,如:

  • 当前页page
  • 上一页prePage
  • 下一页nextPage
  • 总页数pages
  • 信息总数count
  • 显示可选页数pageList

其实不需要那么多参数,因为前端UI框架只需要你传信息总数total即可自动实现分页,这里是针对UI库没有分页功能的时候才使用的。

package com.repairsystem.utils;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

/**
 * @author CheungChingYin
 * @date 2018/11/7
 * @time 12:12
 */
public class PageUtils {

    public static Map<String, Object> pageHandler(String page, String count) {

        Integer tempPage = Integer.parseInt(page);
        Integer tempCount = Integer.parseInt(count);
        Map<String, Object> map = new HashMap<String, Object>();

        Integer prePage = prePageHandler(tempPage);
        Integer nextPage = nextPageHandler(tempPage,tempCount);
        List<Integer> pageList = pageHandler(tempPage,tempCount);
        Integer pages = pagesCount(tempCount);

        map.put("page",page);
        map.put("prePage",prePage);
        map.put("nextPage",nextPage);
        map.put("pages",pages);
        map.put("count",tempCount);
        map.put("pageList",pageList);
        return map;
    }

    /**
     * 上一页逻辑
     * @param page
     * @return
     */
    public static Integer prePageHandler(Integer page) {

        Integer prePage;
        if (page - 1 == 0) {
            prePage = 1;
        } else {
            prePage = page - 1;
        }
        return prePage;
    }

    /**
     * 下一页逻辑
     * @param page
     * @param count
     * @return
     */
    public static Integer nextPageHandler(Integer page, Integer count) {

        Integer PAGESIZE = ConstantUtils.Page.PAGESIZE;
        Integer pages = pagesCount(count);
        Integer nextPage;
        if (page == pages) {
            nextPage = pages;
        } else {
            nextPage = page + 1;
        }
        return nextPage;
    }

    /**
     * 展示出来的页码数
     * @param page
     * @param count
     * @return
     */
    public static List<Integer> pageHandler(Integer page,Integer count){

        List<Integer> list = new LinkedList<Integer>();
        Integer PAGENUM = ConstantUtils.Page.PAGESNUM;

        Integer pages = pagesCount(count);
        Integer minPages = (page - PAGENUM > 0) ? (page - PAGENUM) : (1);//和上一页同理
        Integer maxPages = (page + PAGENUM >= pages)?(pages):(page + PAGENUM);//与下一页同理

        for(int i = minPages;i<= maxPages;i++){
            list.add(i);//添加最小页到最大页之间的页码
        }
        return list;
    }

    /**
     * 页数总数
     * @param count
     * @return
     */
    public static Integer pagesCount(Integer count) {
        Integer PAGESIZE = ConstantUtils.Page.PAGESIZE;
        Integer pages = (count % PAGESIZE == 0) ? (count / PAGESIZE) : (count / PAGESIZE + 1);
        return pages;
    }

}

该工具类的用法只需要调用静态方法pageHandler即可,它会返回一个Map数据。

5.创建管理员的VO类AdministratorVO

com.repairsystem.entity.vo下创建VO类AdministratorVO
AdministratorVO类比Administrator实体类少了一个字段adminPassword,以免将管理员密码泄露出去。

package com.repairsystem.entity.vo;

/**
 * @author CheungChingYin
 * @date 2018/11/3
 * @time 20:07
 */
public class AdministratorVO {

    private Integer adminId;
    private String adminName;
    private String adminPhone;
    private Integer roleId;
    private String adminEmail;

    public Integer getAdminId() {
        return adminId;
    }

    public void setAdminId(Integer adminId) {
        this.adminId = adminId;
    }

    public String getAdminName() {
        return adminName;
    }

    public void setAdminName(String adminName) {
        this.adminName = adminName;
    }

    public String getAdminPhone() {
        return adminPhone;
    }

    public void setAdminPhone(String adminPhone) {
        this.adminPhone = adminPhone;
    }

    public Integer getRoleId() {
        return roleId;
    }

    public void setRoleId(Integer roleId) {
        this.roleId = roleId;
    }

    public String getAdminEmail() {
        return adminEmail;
    }

    public void setAdminEmail(String adminEmail) {
        this.adminEmail = adminEmail;
    }

    @Override
    public String toString() {
        return "AdministratorVO{" +
                "adminId=" + adminId +
                ", adminName='" + adminName + '\'' +
                ", adminPhone='" + adminPhone + '\'' +
                ", roleId=" + roleId +
                ", adminEmail='" + adminEmail + '\'' +
                '}';
    }
}

6.实现登录接口:login

  • URI:/admin/Login
  • 请求方式:POST
  • 参数:adminPhoneNum(管理员手机号)
  • 参数:adminPassword(管理员密码)
  • 返回值包含信息:状态码200(成功)
  • 返回值包含信息:管理员信息adminInfo
  • 实现方法:

1.检查传入的两个参数是否为空,若为空返回相应的JSON。
2.将管理员密码通过加密工具类PasswordEncryptionUtilsMD5加密
3.将管理员的手机号和密码交给Shiro进行验证,若出现异常则证明认证失败。
4.验证成功后返回管理员的信息和状态码。

@ApiOperation(value = "管理员登录", notes = "管理员登录验证")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "adminPhoneNum", value = "管理员手机", required = true, dataType = "String", paramType = "query"),
            @ApiImplicitParam(name = "adminPassword", value = "管理员密码", required = true, dataType = "String", paramType = "query")

    })
    @PostMapping("/login")
    public JsonResult login(String adminPhoneNum, String adminPassword) {
        if (StringUtils.isBlank(adminPhoneNum)) {
            return JsonResult.errorMsg("输入的管理员手机号不能为空");
        }
        if (StringUtils.isBlank(adminPassword)) {
            return JsonResult.errorMsg("输入的管理员密码不能为空");
        }
        adminPassword = PasswordEncryptionUtils.plainText2MD5Encrypt(adminPassword);
        //根据管理员手机号和密码创建token
        UsernamePasswordToken token = new UsernamePasswordToken(adminPhoneNum, adminPassword);
        Subject subject = SecurityUtils.getSubject();
        try {
            subject.login(token);
        }catch (AccountException e){
            return JsonResult.errorException(e.getMessage());
        }catch (IncorrectCredentialsException e1){
            return JsonResult.errorException(e1.getMessage());
        }
        Administrator admin = adminService.searchAdministratorByPhoneNum(adminPhoneNum);
        AdministratorVO adminVO = Entity2VO.entity2VO(admin,AdministratorVO.class);
        Map<String,Object> resultMap = new HashMap<String, Object>();
        resultMap.put("adminInfo",adminVO);
        return JsonResult.ok(resultMap);
    }

7.管理员登出:logout

  • URI:/admin/logout
  • 请求方式:POST
  • 参数:无
  • 返回值包含信息:状态码200(成功)
  • 实现方法:

1.向接口进行请求
2.触发在Shiro设定的拦截器
3.Shiro进行登出操作

@ApiOperation(value = "管理员登出")
    @PostMapping("/logout")
    public JsonResult logout(){
        return JsonResult.ok();
    }

我们在设置Shiro的时候曾经设置了一个登出拦截器MySignOutFilter,并且在ShiroConfig中设置了相关的拦截器,详情可以回看这篇文章《【机房报修管理系统】后端篇(十一) 配置权限管理器——Shiro》中的第3点和13点有提到。
在这里插入图片描述

8.获得全部管理员资料:getAllAdminInfo

  • URI:/admin/getAllAdminInfo
  • 请求方式:GET
  • 参数:page(当前页)
  • 返回值:状态码200(成功)
  • 返回值包含信息:pageMap(分页相关信息)
  • 返回值包含信息:Info(十条管理员信息)
  • 实现方法:

1.检查传入参数是否为空。
2.向数据库查询管理员总数。
3.使用PageHelper分页工具将即将查询管理员信息进行分页。
4.查询全部管理员信息。
5.将实体类转为VO类。
6.通过Map的形式将信息存储并且返回Map。

@ApiOperation(value = "获得全部管理员资料")
    @ApiImplicitParam(name = "page", value = "当前页", required = true, dataType = "String", paramType = "query")
    @GetMapping("/getAllAdminInfo")
    public JsonResult getAllAdminInfo(String page) {

        if (StringUtils.isBlank(page)) {
            throw new PageIsNullException();
        }

        String count = adminService.countAllAdministrator();

        PageHelper.startPage(Integer.parseInt(page), ConstantUtils.Page.PAGESIZE);
        List<Administrator> list = adminService.searchAllAdministrator();

        Map<String, Object> pageMap = PageUtils.pageHandler(page, count);
        List<AdministratorVO> listVO = Entity2VO.entityList2VOList(list, AdministratorVO.class);

        Map<String, Object> map = new HashMap<String, Object>();
        map.put("pageMap", pageMap);
        map.put("Info", listVO);

        return JsonResult.ok(map);
    }

9.通过管理员ID获得管理员信息:getAdminInfoById

  • URI:/admin/getAdminInfoById
  • 请求方式:GET
  • 参数:page(当前页)
  • 参数:id(管理员ID)
  • 返回值包含信息:pageMap(分页相关信息)
  • 返回值包含信息:Info(一条管理员信息,因为Id是唯一的)
  • 实现方法:

1.检查传入参数是否为空
2.调用searchAdministratorById服务获得管理员信息。
3.将实体类转为VO类。
4.使用分页工具生成分页信息
5.返回所有信息。

@ApiOperation(value = "通过管理员ID获得管理员信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "page", value = "当前页", required = true, dataType = "String", paramType = "query"),
            @ApiImplicitParam(name = "id", value = "管理员ID", required = true, dataType = "String", paramType = "query")
    })
    @GetMapping("/getAdminInfoById")
    public JsonResult getAdminInfoById(String page, Integer id) {
        if (StringUtils.isBlank(id.toString())) {
            throw new AdministratorIdIsNullException("传入的管理员ID为空");
        }
        if (StringUtils.isBlank(page)) {
            throw new PageIsNullException();
        }
        PageHelper.startPage(Integer.parseInt(page), ConstantUtils.Page.PAGESIZE);
        Administrator admin = adminService.searchAdministratorById(id);

        AdministratorVO adminVO = Entity2VO.entity2VO(admin, AdministratorVO.class);
        Map<String, Object> pageMap = PageUtils.pageHandler(page, "1");
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("pageMap", pageMap);
        map.put("Info", adminVO);
        return JsonResult.ok(map);
    }

10.通过管理员名称获得管理员信息:getAdminInfoByName

  • URI:/admin/getAdminInfoByName
  • 请求方式:GET
  • 参数:page(当前页)
  • 参数:adminName(管理员姓名)
  • 返回值包含信息:pageMap(分页相关信息)
  • 返回值包含信息:Info(若干条管理员信息,因为可能有同名出现)
  • 实现方法:

1.检查传入参数是否为空
2.调用服务searchAdministratorByName
3.使用分页工具生成分页信息
4.返回所有信息

@ApiOperation(value = "通过管理员名称获得管理员信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "page", value = "当前页", required = true, dataType = "String", paramType = "query"),
            @ApiImplicitParam(name = "adminName", value = "实训楼ID", required = true, dataType = "String", paramType = "query")
    })
    @GetMapping("/getAdminInfoByName")
    public JsonResult getAdminInfoByName(String page, String adminName) {
        if (StringUtils.isBlank(page)) {
            return JsonResult.errorMsg("传入当前页page参数不能为空");
        }
        if (StringUtils.isBlank(adminName)) {
            return JsonResult.errorMsg("传入管理员名称adminName参数不能为空");
        }
        PageHelper.startPage(Integer.parseInt(page), ConstantUtils.Page.PAGESIZE);
        List<Administrator> adminList = adminService.searchAdministratorByName(adminName);

        Map<String, Object> pageMap = PageUtils.pageHandler(page, adminList.size() + "");
        List<AdministratorVO> listVO = Entity2VO.entityList2VOList(adminList, AdministratorVO.class);

        Map<String, Object> map = new HashMap<String, Object>();
        map.put("pageMap", pageMap);
        map.put("Info", listVO);
        return JsonResult.ok(map);

    }

11.保存管理员信息:saveAdministratorInfo

  • URI:`/admin/saveAdministratorInfo``
  • 请求方式:POST
  • 参数:admin(管理员实体类,以JSON方式)
  • 返回值信息:状态码200(成功)
  • 实现方法:

1.检查参数是否为空。
2.调用保存管理员服务saveAdministrator

@ApiOperation(value = "保存管理员信息")
    @PostMapping("/saveAdministratorInfo")
    public JsonResult saveAdministratorInfo(@RequestBody Administrator admin) {

        if (StringUtils.isBlank(admin.getAdminId().toString())) {
            return JsonResult.errorMsg("管理员ID不能为空");
        }
        adminService.saveAdministrator(admin);
        return JsonResult.ok();
    }

12.修改管理员信息:updateAdministratorInfo

  • URI:`/admin/updateAdministratorInfo``
  • 请求方式:POST
  • 参数:admin(管理员实体类,以JSON方式)
  • 返回值信息:状态码200(成功)
  • 实现方法:

1.检查参数是否为空。
2.若管理员密码更新则需要重新将密码进行MD5加密。
2.调用保存管理员服务saveAdministrator

@ApiOperation(value = "修改管理员信息")
    @PostMapping("updateAdministratorInfo")
    public JsonResult updateAdministratorInfo(@RequestBody Administrator admin) {
        if (StringUtils.isBlank(admin.getAdminId().toString())) {
            return JsonResult.errorMsg("更新失败,传入的管理员ID不能为空");
        }
        if (StringUtils.isNotBlank(admin.getAdminPassword())) {
            String password = admin.getAdminPassword();
            admin.setAdminPassword(PasswordEncryptionUtils.plainText2MD5Encrypt(password));
        }
        adminService.updateAdministrator(admin);
        return JsonResult.ok();
    }

13.删除管理员信息:deleteAdministratorInfo

  • URI:`/admin/deleteAdministratorInfo``
  • 请求方式:POST
  • 参数:adminId(管理员ID)
  • 返回值信息:状态码200(成功)
  • 实现方法:

1.检查传入参数是否为空。
2.调用删除服务deleteAdministrator

@ApiOperation(value = "删除管理员信息")
    @GetMapping("deleteAdministratorInfo")
    @ApiImplicitParam(name = "adminId", value = "管理员ID", required = true, dataType = "String", paramType = "query")
    public JsonResult deleteAdministratorInfo(Integer adminId) {
        if (StringUtils.isBlank(adminId.toString())) {
            return JsonResult.errorMsg("删除失败,传入的管理员ID不能为空");
        }
        adminService.deleteAdministrator(adminId);
        return JsonResult.ok();
    }




    到这里,Controller层开发——管理员相关接口已经开发完成了。如果您对次篇文章有疑问,可以在文章下方留言,谢谢您的阅读。如对【机房报修管理系统】系列文章有兴趣,可以关注或收藏我的文章,您的支持是我最大的动力,我会尽快推出下一期内容,敬请期待。

你可能感兴趣的:(Controller层开发,管理员,分页工具,SpringBoot,机房报修管理系统,后端)