上一次我们对Controller层的开发做了一个问答Q&A,由于接近过年有比较多事情需要处理,所以拖了一点时间,隔了几天才更新,在这里先说一声抱歉。这一次我们来真正开发Controller层的管理员接口。
AdministratorController
在com.repairsystem.web.controller
创建类AdministratorController
,注入管理员服务AdministratorService
,其他的注解如有不明白可以查看上一期文章《【机房报修管理系统】后端篇(十八) Controller层开发——相关介绍Q&A》
@RestController
@Api(value = "管理员业务相关接口", tags = {"管理员业务相关接口",})
@RequestMapping("/admin")
public class AdministratorController {
@Autowired
private AdministratorService adminService;
}
在在com.repairsystem.utils
创建工具类Entity2VO
详情请查看我的上一篇博文
《【机房报修管理系统】后端篇(十八) Controller层开发——相关介绍Q&A》
ConstantUtils
中填写分页参数在com.repairsystem.utils.ConstantUtils
写下以下的内部类常量
class Page{
//一页展示多少条
public static final Integer PAGESIZE = 10;
//页码展示数量
public static final Integer PAGESNUM = 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数据。
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 + '\'' +
'}';
}
}
login
/admin/Login
POST
adminPhoneNum
(管理员手机号)adminPassword
(管理员密码)adminInfo
1.检查传入的两个参数是否为空,若为空返回相应的JSON。
2.将管理员密码通过加密工具类PasswordEncryptionUtils
MD5加密
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);
}
logout
/admin/logout
POST
1.向接口进行请求
2.触发在Shiro设定的拦截器
3.Shiro进行登出操作
@ApiOperation(value = "管理员登出")
@PostMapping("/logout")
public JsonResult logout(){
return JsonResult.ok();
}
我们在设置Shiro的时候曾经设置了一个登出拦截器MySignOutFilter
,并且在ShiroConfig
中设置了相关的拦截器,详情可以回看这篇文章《【机房报修管理系统】后端篇(十一) 配置权限管理器——Shiro》中的第3点和13点有提到。
getAllAdminInfo
/admin/getAllAdminInfo
GET
page
(当前页)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);
}
getAdminInfoById
/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);
}
getAdminInfoByName
/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);
}
saveAdministratorInfo
POST
admin
(管理员实体类,以JSON方式)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();
}
updateAdministratorInfo
POST
admin
(管理员实体类,以JSON方式)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();
}
deleteAdministratorInfo
POST
adminId
(管理员ID)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层开发——管理员相关接口已经开发完成了。如果您对次篇文章有疑问,可以在文章下方留言,谢谢您的阅读。如对【机房报修管理系统】系列文章有兴趣,可以关注或收藏我的文章,您的支持是我最大的动力,我会尽快推出下一期内容,敬请期待。