【机房报修管理系统】后端篇(十八) Controller层开发——相关介绍Q&A

一、前情提要


    上一次我们完成了角色权限的服务开发,这里我们先不进行Controller层的开发,先谈一下一写开发前的准备工作和相关介绍。


二、Q&A


注意:在这里我会在这里介绍如何生成接口文档以及相关注解的使用,一些自己编写的工具类使用方法,常见问题的答疑,下面的实践操作环节中就不会再提及。

1.为什么需要Controller层?

答: 在我们实现完Service层后,前端是不能调用这些服务的,因为没有相应的接口进行调用。所以我们需要写一些接口,当前端调用接口方法的时候,执行相关的Service服务(业务逻辑),最后以JSON的形式返回相应的数据,也就是说Controller层是业务逻辑实现的一层。

2.如何才能生成JSON格式的数据?

在这里插入图片描述
答: 你只需要做到这几部:

  1. 在controller类的开头添加注解@RestController
  2. 返回一个自定义的JSON类

@RestController这个注解是@ResponseBody@Controller功能合在一起,是SpringBoot独有的注解。而自定义JSON类你可以查看前面的文章《【机房报修管理系统】后端篇(七) 配置自定义JSON类及解决JSON的值空时不出现Null》

3.如何做到返回JSON的时候屏蔽一些不需要的字段?

答: 在返回JSON信息的时候,有一些字段是我们不像返回的,例如管理员类中,我们有管理员密码这个字段,但是我们不能够将密码这个字段返回给前端,那样就会暴露我们的管理员密码。如果想解决这个问题有两种方法,一个就是:

  • 在数据库取出所有字段的数据
  • 通过对象把不想暴露的字段设置为空
  • 返回给JsonResult(自定义JSON类)

示例代码:

//在数据库取出所有字段的数据
List<Administrator> list = adminService.searchAllAdministrator();
//遍历列表
for(Administrator admin : list){

//通过对象把不想暴露的字段设置为空
admin.password = ""
}
//返回给JsonResult(自定义JSON类)
return JsonResult.ok(list);

这样做就意味着我们需要手动地去对每个对象设置屏蔽的关键字为NULL,做起来比较麻烦,因为我们之后还有许多的接口都需要屏蔽一些关键字,手动费时费力,所以我们得做一个“轮子”,也就是工具类,每次遇到需要屏蔽相关字段的时候调用这个工具类即可,这就是第二种方法:POJO类转为VO类。

4.什么是VO类,它和实体类(POJO)有什么不一样?

答: 在制作这个工具类之前我们需要了解什么是VO类。VO类通常用于业务层之间的数据传递,就是负责给前端看的,在上面我们曾经提到过有一些字段是不能够展示的,如果改动实体类,那样实体类和数据库的字段不一致,导致不能正常对数据库进行查询,所以我们需要创建一个VO类,VO类的要求:

  • VO类只能等于或少于实体类的字段
  • VO类和实体类的字段名称必须相同
  • VO类需要像POJO类那样成员变量需要为私有,提供Getter/Setter方法。

5.实体类(POJO)如何转变为VO类?

答: 当我们做好了VO类,过滤了不需要的字段,现在我们需要制作一个转换器,将实体类转为VO类,这里就需要了解一些反射的知识了。
工具类需要有两个方法:

  • 实体类列表转为VO类列表:entityList2VOList
  • 实体类转为VO类:entity2VO

实现过程:

  1. 遍历实体类List,获得实体类对象
  2. vo对象初始化
  3. 使用Spring自带的BeanUtils.copyProperties()将实体类的属性复制到VO类中
  4. 添加到VOList中即可

相关代码:
com.repairsystem.utils创建工具类Entity2VO
注意BeanUtils是属于org.springframework.beans.BeanUtils的,不是Apache那个BeanUtils

package com.repairsystem.utils;

import org.springframework.beans.BeanUtils;

import java.util.LinkedList;
import java.util.List;

/**
 * @author CheungChingYin
 * @date 2018/11/7
 * @time 10:17
 */
public class Entity2VO {

    /**
     * 实体类列表转换为 VO类列表
     * @param entityList
     * @param voClass
     * @return
     */
    public static List entityList2VOList(List<? extends Object> entityList, Class voClass){
        List voList = new LinkedList();
        Object voObj = null;
        for(Object entityObj:entityList){
            try {
                voObj = voClass.newInstance();

            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            BeanUtils.copyProperties(entityObj,voObj);
            voList.add(voObj);
        }
        return voList;
    }

    /**
     * 实体类转换为 VO类
     * @param entity
     * @param voClass
     * @param <T>
     * @return
     */
    public static <T> T entity2VO(Object entity,Class<T> voClass){
        T vo = null;
        try {
            vo = voClass.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        BeanUtils.copyProperties(entity,vo);
        return vo;
    }
}

转换的时候您只需要这样调用:

		//向数据库查询信息
		Administrator admin = adminService.searchAdministratorByPhoneNum(adminPhoneNum);
		List<Administrator> list = adminService.searchAllAdministrator();
		
		//使用工具类进行转换(实体类转为VO类)
        AdministratorVO adminVO = Entity2VO.entity2VO(admin,AdministratorVO.class);
        //实体列表转为VO列表
        List<AdministratorVO> listVO = Entity2VO.entityList2VOList(list, AdministratorVO.class);
         
        //返回给JsonResult(自定义JSON类)
        return JsonResult.ok(resultMap);

6.Swagger2中如何显示接口信息和参数?

在这里插入图片描述
在这里插入图片描述
答: 需要实现显示接口地址和功能信息,接口分类其实很简单,只需要在Controller类中写好以下注解即可:

  • 接口分类:@Api
  • 接口功能信息:@ApiOperation
  • 接口参数(拥有多个参数时使用):@ApiImplicitParams
  • 接口参数(单个参数):@ApiImplicitParam
  • POST方法请求:@PostMapping
  • Get方法请求:@GetMapping

在这里插入图片描述
在类的开头使用@Api进行接口分类,@RequestMapping("/admin")如果在类上面声明,就意味着下面方法需要通过访问/admin才能请求类下面的方法,关于@RequestMapping的使用方法可以查看我博客以往的文章:
《【SpringMVC】4. 获取Http的请求信息或请求头》
在这里插入图片描述
@PostMapping@GetMapping的使用方法很简单,您只需要按照接口的请求方法在接口方法上面填上相应的注解即可,Get请求使用@GetMapping,POST请求使用@PostMapping,除此之外还有PUT请求和DELETE请求等等的RESTful相关的请求注解,在此不在介绍,请自行查找,一旦指定了注解,在Swagger2文档中就会将接口显示为相应的请求方法,如下图
在这里插入图片描述

@ApiOperation注解的使用方法很简单,只需要在接口方法上添加注解,写上这个接口实现了什么功能即可。
在这里插入图片描述
在这里插入图片描述
@ApiImplicitParam@ApiImplicitParams注解是用于对接口记录需要什么参数,当只有一个参数的时候可以直接使用@ApiImplicitParam,而拥有兑个参数的时候需要使用@ApiImplicitParams注解包裹全部的@ApiImplicitParam注解即可
在这里插入图片描述
在这里插入图片描述

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

网上报修系统B8.0,适用于企业、高等院校、政府部门、中小学校等物品、设备报修管理与维修登记。 一、前台部分 用户报修报修内容包括故障部门、故障具体地点、报修型、联系人及联系电话、故障主题、故障描述等。其中故障部门和地点,通过三级选项选出,不必填写。若要自定义填写可通过后台功能配置中设置。 报修单管理:⒈工单管理:用户提交报修单后,在未派单前,可在报修管理中进行修改或删除。⒉未完成工单:便于了解派单情况和维修进程。⒊用户评价:用户对已完成的维修工作进行评价。 派单管理:派单管理员对不同的报修单委派相应型的维修人员。若维修人员不及时受理,派单管理员可以改派。 维修管理:⒈报修单受理:可以单个受理,也可批量受理。⒉维修登记:在未完成状态下,可以填写维修进程报告;在完成状态下,填写维修记录。⒊已完成工单,提供查询与统计功能。 用户中心:显示用户个人信息,修改密码、修改资料、报修统计(报修总数、已完成数、未完成数)。 公告信息:用于公布本系统使用过程中各种注意事项、通知、公告信息。 二、后台管理部分 报修信息的管理与查询: ⒈综合管理:可以查询各报修信息,可删除或批量删除报修信息,可修改全部报修和维修信息。 ⒉分管理: 未派单:显示全部未派单的报修信息及总数。可以修改、删除报修信息,给各报修单指派维修人员。 未受理:显示全部未受理的报修信息及总数。可单个受理和批量受理。可改派维修人员。 未完成:显示全部未完成维修的报修信息及总数。可进行维修登记,填写维修进程和维修记录。 已完成:显示全部已完成的报修单信息及总数。可分未评价、满意、不满意来显示。 综合统计:包括报修统计、维修统计、型统计。 可以统计某时间段各位报修人员的报修总数、未派单数、已派单数、未完成数、已完成数;维修人员维修总数、已完成维修数、未完成维修数、已完成率、用户满意数、不满意数、未评价数、满意率;故障型总数、未派单数、已派单数、已完成维修数、未完成维修数、已完成率。时间段可由管理员自由选择。 用户管理:超级管理员密码修改、添加单个用户、自定量添加用户(添加个数由管理员定)、从Excel导入用户(先下载excel模块,按要求填写用户信息上传到本系统,提交数据)。 用户管理实行分管理:目前分为超级管理员、派单人员、维修人员、报修人员,除超级管理员不能删除外,其它型人员均可删除或批量删除,各人员的信息均可修改和查询。 系统设置: ⒈系统设置:可修改系统名称、网站地址、联系地址、联系电话等,可修改页脚代码及内容以及页头右侧代码及内容。 ⒉功能配置:主要包括是否禁止使用本系统;是否执行注册审核;是否执行自动派单;在用户报修时,故障部门和地点,是否执行自定义填写。 ⒊系统通知:添加、修改或删除通知、公告信息。 ⒋报修型:添加、修改或删除报修型。 ⒌故障部门:添加、修改、删除一、二、三级故障部门。便于报修时选择。 ⒍故障地点:添加、修改、删除一、二、二级故障地点。便于报修时选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值