当前位置: 首页 > news >正文

三、前后端分离通用权限系统(3)

🌻🌻目录

  • 一、角色管理
    • 1.1、测试 controller 层
    • 1.2、整合 Swagger2
      • 1.2.1、Swagger 介绍
      • 1.2.2、集成 knife4j
        • 1.2.2.1 添加依赖
        • 1.2.2.2 添加 knife4j 配置类
        • 1.2.2.3 Controller 层添加注解
        • 1.2.2.4、测试
    • 1.3、定义统一返回结果对象
      • 1.3.1、定义统一返回结果对象
      • 1.3.2、改造 controller 方法
    • 1.4、分页查询
      • 1.4.1、配置分页插件
      • 1.4.2、分页 controller
      • 1.4.3、service
      • 1.4.4、mapper
      • 1.4.5、xml
    • 1.5、其他 controller 方法
      • 1.5.1 添加角色接口
      • 1.5.2 根据id查询,修改,批量删除角色接口
    • 1.6、统一异常处理
      • 1.6.1、制造异常
      • 1.6.2、全局异常处理
      • 1.6.3、特定异常处理
      • 1.6.4、自定义异常类

一、角色管理

在这里插入图片描述

1.1、测试 controller 层

service-system下面创建包:com.gansu.system.controller,并创建类 SysRoleController

① 查询接口

在这里插入图片描述

package com.gansu.system.controller;import com.gansu.model.system.SysRole;
import com.gansu.system.service.SysRoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
@RequestMapping("/admin/system/sysrole")
public class SysRoleController {@Autowiredprivate SysRoleService sysRoleService;@GetMapping("findAll")  //localhost:8800/admin/system/sysrole/findAllpublic List<SysRole>  findAll(){//调用serviceList<SysRole> list = sysRoleService.list();return list;}
}

测试:http://localhost:8800/admin/system/sysrole/findAll

在这里插入图片描述

② 逻辑删除接口

在这里插入图片描述

//2.逻辑删除接口
@DeleteMapping("remove/{id}")
public boolean remove(@PathVariable  Long id){boolean isRemove = sysRoleService.removeById(id);return  isRemove;
}

测试:http://localhost:8800/admin/system/sysrole/remove/1

问题:

在这里插入图片描述

分析:浏览器目前只支持get提交,其它的暂且不支持,所以得采用第三方测试接口。

idea中也可以测试,这个我前面总结中还没提到过:

在这里插入图片描述
在这里插入图片描述

1.2、整合 Swagger2

1.2.1、Swagger 介绍

前后端分离开发模式中,api文档是最好的沟通方式。

  • Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。
  • 1、及时性 (接口变更后,能够及时准确地通知相关前后端开发人员)
  • 2、规范性 (并且保证接口的规范性,如接口的地址,请求方式,参数及响应格式和错误信息)
  • 3、一致性 (接口信息一致,不会出现因开发人员拿到的文档版本不一致,而出现分歧)
  • 4、可测性 (直接在接口文档上进行测试,以方便理解业务)

1.2.2、集成 knife4j

文档地址:https://doc.xiaominfo.com/

knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案。

knife4j属于service模块公共资源,因此我们集成到service-uitl模块

1.2.2.1 添加依赖

操作模块:service-uitl

① 引入依赖

在这里插入图片描述

<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId>
</dependency>

说明:gansu-auth-parent已加入版本管理

1.2.2.2 添加 knife4j 配置类

操作模块:service-uitl

创建包:com.gansu.system.config 创建类 :Knife4jConfig并导入如下配置:

在这里插入图片描述

package com.gansu.system.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;import java.util.ArrayList;
import java.util.List;/*** knife4j配置信息*/
@Configuration
@EnableSwagger2WebMvc
public class Knife4jConfig {@Beanpublic Docket adminApiConfig(){List<Parameter> pars = new ArrayList<>();ParameterBuilder tokenPar = new ParameterBuilder();tokenPar.name("token").description("用户token").defaultValue("").modelRef(new ModelRef("string")).parameterType("header").required(false).build();pars.add(tokenPar.build());//添加head参数endDocket adminApi = new Docket(DocumentationType.SWAGGER_2).groupName("adminApi").apiInfo(adminApiInfo()).select()//只显示admin路径下的页面.apis(RequestHandlerSelectors.basePackage("com.gansu")).paths(PathSelectors.regex("/admin/.*")).build().globalOperationParameters(pars);return adminApi;}private ApiInfo adminApiInfo(){return new ApiInfoBuilder().title("后台管理系统-API文档").description("本文档描述了后台管理系统微服务接口定义").version("1.0").contact(new Contact("gansu", "http://gansu.com", "gansu@qq.com")).build();}
}
1.2.2.3 Controller 层添加注解

在这里插入图片描述

package com.gansu.system.controller;import com.gansu.model.system.SysRole;
import com.gansu.system.service.SysRoleService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;@Api(tags = "角色管理")
@RestController
@RequestMapping("/admin/system/sysrole")
public class SysRoleController {@Autowiredprivate SysRoleService sysRoleService;//2.逻辑删除接口@ApiOperation(value = "逻辑删除")@DeleteMapping("remove/{id}")public boolean remove(@PathVariable  Long id){boolean isRemove = sysRoleService.removeById(id);return  isRemove;}//1.查询所有记录@ApiOperation(value = "获取全部角色列表")@GetMapping("findAll")  //localhost:8800/admin/system/sysrole/findAllpublic List<SysRole>  findAll(){//调用serviceList<SysRole> list = sysRoleService.list();return list;}
}
1.2.2.4、测试

http://localhost:8800/doc.html

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

1.3、定义统一返回结果对象

  • 项目中我们会将响应封装成json返回,一般我们会将所有接口的数据格式统一, 使前端(iOS Android, Web)对数据的操作更一致、轻松。
  • 一般情况下,统一返回数据格式没有固定的格式,只要能描述清楚返回的数据状态以及要返回的具体数据就可以。但是一般会包含状态码、返回消息、数据这几部分内容

例如,我们的系统要求返回的基本数据格式如下:

列表:

{"code": 200,"message": "成功","data": [{"id": 2,"roleName": "系统管理员"}],"ok": true
}

分页:

{"code": 200,"message": "成功","data": {"records": [{"id": 2,"roleName": "系统管理员"},{"id": 3,"name": "普通管理员"}],"total": 10,"size": 3,"current": 1,"orders": [],"hitCount": false,"searchCount": true,"pages": 2},"ok": true
}

没有返回数据:

{"code": 200,"message": "成功","data": null,"ok": true
}

失败:

{"code": 201,"message": "失败","data": null,"ok": false
}

1.3.1、定义统一返回结果对象

操作模块:common-util

后续其他模块也会用到,故抽取到common-util模块

在模块 common-util 下面创建包 com.gansu.common.result 再分别创建工具类 ResultCodeEnumResult 并分导入下面代码:

在这里插入图片描述

ResultCodeEnum

统一返回结果状态信息类

下面的状态后续都会用到,所以直接引入了

package com.gansu.common.result;import lombok.Getter;/*** 统一返回结果状态信息类**/
@Getter
public enum ResultCodeEnum {SUCCESS(200,"成功"),FAIL(201, "失败"),SERVICE_ERROR(2012, "服务异常"),DATA_ERROR(204, "数据异常"),ILLEGAL_REQUEST(205, "非法请求"),REPEAT_SUBMIT(206, "重复提交"),ARGUMENT_VALID_ERROR(210, "参数校验异常"),LOGIN_AUTH(208, "未登陆"),PERMISSION(209, "没有权限"),ACCOUNT_ERROR(214, "账号不正确"),PASSWORD_ERROR(215, "密码不正确"),LOGIN_MOBLE_ERROR( 216, "账号不正确"),ACCOUNT_STOP( 217, "账号已停用"),NODE_ERROR( 218, "该节点下有子节点,不可以删除");private Integer code;private String message;private ResultCodeEnum(Integer code, String message) {this.code = code;this.message = message;}
}

Result

package com.gansu.common.result;import lombok.Data;/*** 全局统一返回结果类**/
@Data
public class Result<T> {//返回码private Integer code;//返回消息private String message;//返回数据private T data;public Result(){}// 返回数据protected static <T> Result<T> build(T data) {Result<T> result = new Result<T>();if (data != null)result.setData(data);return result;}public static <T> Result<T> build(T body, Integer code, String message) {Result<T> result = build(body);result.setCode(code);result.setMessage(message);return result;}public static <T> Result<T> build(T body, ResultCodeEnum resultCodeEnum) {Result<T> result = build(body);result.setCode(resultCodeEnum.getCode());result.setMessage(resultCodeEnum.getMessage());return result;}public static<T> Result<T> ok(){return Result.ok(null);}/*** 操作成功* @param data  baseCategory1List* @param <T>* @return*/public static<T> Result<T> ok(T data){Result<T> result = build(data);return build(data, ResultCodeEnum.SUCCESS);}public static<T> Result<T> fail(){return Result.fail(null);}/*** 操作失败* @param data* @param <T>* @return*/public static<T> Result<T> fail(T data){Result<T> result = build(data);return build(data, ResultCodeEnum.FAIL);}public Result<T> message(String msg){this.setMessage(msg);return this;}public Result<T> code(Integer code){this.setCode(code);return this;}
}

1.3.2、改造 controller 方法

可以手动引入 工具类common-util

在这里插入图片描述

遇到如下问题:idea右边maven模块是灰色的

在这里插入图片描述

解决:三、idea识别不出来项目中某些Maven模块,显示模块为“灰色”

在这里插入图片描述

package com.gansu.system.controller;import com.gansu.common.result.Result;
import com.gansu.model.system.SysRole;
import com.gansu.system.service.SysRoleService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;@Api(tags = "角色管理")
@RestController
@RequestMapping("/admin/system/sysrole")
public class SysRoleController {@Autowiredprivate SysRoleService sysRoleService;//2.逻辑删除接口@ApiOperation(value = "逻辑删除")@DeleteMapping("remove/{id}")public Result remove(@PathVariable  Long id){boolean isRemove = sysRoleService.removeById(id);if (isRemove) {return Result.ok();} else {return Result.fail();}}//1.查询所有记录@ApiOperation(value = "获取全部角色列表")@GetMapping("findAll")  //localhost:8800/admin/system/sysrole/findAllpublic Result<List<SysRole>> findAll(){//调用serviceList<SysRole> roleList = sysRoleService.list();return Result.ok(roleList);}
}

再次启动主启动类测试:

在这里插入图片描述

删除测试:

在这里插入图片描述
在这里插入图片描述

1.4、分页查询

1.4.1、配置分页插件

操作模块:service-uitlservice公共资源

分页插件

条件分页查询步骤:

  • 第一步 配置分页插件,通过配置类实现
  • 第二步 创建controller方法,:,创建service方法,创建mapper方法
  • 第三步 创建mapper的xml配置文件,编写sql语句实现

说明:我们将@MapperScan("com.gansu.system.mapper")提取到该配置类上面,统一管理,启动类就不需要了。

官网复制分页配置类:

在这里插入图片描述

在这里插入图片描述

package com.gansu.system.config;import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@MapperScan("com.gansu.system.mapper")
public class MybatisPlusConfig {/*** 添加分页插件*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));// 如果配置多个插件, 切记分页最后添加// 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbTypereturn interceptor;}
}

1.4.2、分页 controller

在这里插入图片描述

//3.条件分页查询  pageNum 当前页 limit 每页显示的条数  SysRoleQueryVo 封装条件的
@ApiOperation(value = "条件分页查询")
@GetMapping("{pageNum}/{limit}")
public Result findSysRoleByLimitPage(@ApiParam(name = "pageNum", value = "当前页码", required = true)@PathVariable Long pageNum,@ApiParam(name = "limit", value = "每页记录数", required = true)@PathVariable Long limit,@ApiParam(name = "roleQueryVo", value = "查询对象", required = true)SysRoleQueryVo roleQueryVo){Page<SysRole> pageParam = new Page<>(pageNum,limit);IPage<SysRole> pageModel = sysRoleService.selectByPageSysRole(pageParam,roleQueryVo);return Result.ok(pageModel);
}

1.4.3、service

在这里插入图片描述

/*条件分页查询*/
IPage<SysRole> selectByPageSysRole(Page<SysRole> pageParam, SysRoleQueryVo roleQueryVo);

在这里插入图片描述

@Override /*条件分页查询*/
public IPage<SysRole> selectByPageSysRole(Page<SysRole> pageParam, SysRoleQueryVo roleQueryVo) {IPage<SysRole> selectByPageSysRole =  baseMapper.selectByPageSysRole(pageParam,roleQueryVo);return selectByPageSysRole;
}

1.4.4、mapper

在这里插入图片描述

/*条件分页查询*/
IPage<SysRole> selectByPageSysRole(Page<SysRole> pageParam, @Param("vo") SysRoleQueryVo roleQueryVo);

1.4.5、xml

resources目录下创建mapper/SysRoleMapper.xml文件

  • 说明:分页我们统一定义到xml文件中,更方便直观

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gansu.system.mapper.SysRoleMapper"><sql id="columns">role_name,role_code,description,create_time,update_time,is_deleted</sql><resultMap id="sysRoleMap" type="com.gansu.model.system.SysRole" autoMapping="true"></resultMap><select id="selectByPageSysRole" resultMap="sysRoleMap">SELECT <include  refid="columns"></include> FROM sys_role<where><if test="vo.roleName != null and vo.roleName != ''">and  role_name like CONCAT('%',#{vo.roleName},'%')</if>and is_deleted = 0</where>order by id desc</select>
</mapper>

启动主程序进行测试:

在这里插入图片描述

1.5、其他 controller 方法

1.5.1 添加角色接口

在这里插入图片描述

//4.添加角色的接口
@ApiOperation(value = "添加角色")
@PostMapping("addSysRole")
// @RequestBody 不能使用get提交方式 传递json格式数据,把json格式数据封装到对象里面{...}
public Result addSysRole(@RequestBody SysRole sysRole){boolean isSuccess = sysRoleService.save(sysRole);if (isSuccess){return Result.ok(sysRole);}else {return Result.fail(sysRole);}
}

在这里插入图片描述

在这里插入图片描述

1.5.2 根据id查询,修改,批量删除角色接口

在这里插入图片描述

//7.批量删除
@ApiOperation(value = "批量删除")
@DeleteMapping("batchDeleteById")
public Result batchDeleteById(@RequestBody  List<Long> ids){sysRoleService.removeByIds(ids);return Result.ok();
}//6.根据id修改
@ApiOperation(value = "根据id修改")
@PutMapping("updateById")
public Result updateById(SysRole sysRole){boolean isSuccess = sysRoleService.updateById(sysRole);if (isSuccess){return Result.ok(sysRole);}else {return Result.fail(sysRole);}}//5.根据id查询
@ApiOperation(value = "根据id查询")
@GetMapping("findSysRoleById/{id}")
public Result findSysRoleById(@PathVariable long id){sysRoleService.getById(id);return Result.ok();
}

修改接口测试:

在这里插入图片描述

修改前:

在这里插入图片描述

修改后:

在这里插入图片描述

批量删除前后:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

1.6、统一异常处理

在这里插入图片描述

1.6.1、制造异常

除以0

我们想让异常结果也显示为统一的返回结果对象,并且统一处理系统的异常信息,那么需要统一异常处理。

① 制造异常

在这里插入图片描述

1.6.2、全局异常处理

操作模块:service-util

② 全局异常处理:

在这里插入图片描述

package com.gansu.system.exception;import com.gansu.common.result.Result;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)@ResponseBodypublic Result error(Exception e){e.printStackTrace();return Result.fail().message("执行了全局异常");}
}

测试:

在这里插入图片描述

1.6.3、特定异常处理

③ 特定异常处理:

在这里插入图片描述

@ExceptionHandler(ArithmeticException.class)
@ResponseBody
public Result error(ArithmeticException e){System.out.println("特定异常执行了。。。。。。。。。");e.printStackTrace();return Result.fail().message("执行了特定异常");
}

启动主程序进行测试:

在这里插入图片描述

在这里插入图片描述

1.6.4、自定义异常类

① 创建类 GansuException

在这里插入图片描述

package com.gansu.system.exception;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
public class GansuException extends RuntimeException {private Integer code; //异常状态码private String msg; //抛出异常的信息
}

② 添加自定义异常类,异常处理方法

在这里插入图片描述

@ExceptionHandler(GansuException.class)
@ResponseBody
public Result error(GansuException e){System.out.println("自定义异常执行了。。。。。。。。。");e.printStackTrace();return Result.fail().message(e.getMsg()).code(e.getCode());
}

③ 修改 controller,业务中需要位置抛出

在这里插入图片描述

//1.查询所有记录
@ApiOperation(value = "获取全部角色列表")
@GetMapping("findAll")  //localhost:8800/admin/system/sysrole/findAll
public Result<List<SysRole>> findAll(){try {int i = 9/0;}catch (Exception e){e.printStackTrace();throw new GansuException(200001,"执行了自定义异常");}//调用serviceList<SysRole> roleList = sysRoleService.list();return Result.ok(roleList);
}

④ 启动主启动类进行测试

在这里插入图片描述

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • vue中未能及时获取到props?
  • docker入门之cgroups
  • Linux的chmod指令
  • 电测量数据交换DLMS∕COSEM组件第62部分:COSEM接口类(2)
  • 14.3 Matplotlib与Seaborn数据可视化
  • 基于web网上村委会业务办理系统pf
  • Linux中的锁
  • 预计下半年业务将反弹回升,亚信科技的底气源自哪里?
  • MySQL——单表查询(二)按条件查询(4)空值查询
  • 《深入浅出多模态》(八)多模态经典模型:MiniGPT4
  • qt-16可扩展对话框--隐藏和展现
  • 【硬件模块】震动传感器模块
  • Python做统计图之美
  • 注意!美国跨境选品风向变动,低价产品反成抢手货!
  • vos3000怎样对接voip落地语音网关呢?卡机和O口网关的配置技巧有哪些?
  • Centos6.8 使用rpm安装mysql5.7
  • es6要点
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • java8-模拟hadoop
  • Median of Two Sorted Arrays
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 高度不固定时垂直居中
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 力扣(LeetCode)22
  • 区块链共识机制优缺点对比都是什么
  • 日剧·日综资源集合(建议收藏)
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 算法---两个栈实现一个队列
  • 学习笔记:对象,原型和继承(1)
  • Linux权限管理(week1_day5)--技术流ken
  • #NOIP 2014#Day.2 T3 解方程
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  • (三)elasticsearch 源码之启动流程分析
  • (四)js前端开发中设计模式之工厂方法模式
  • (五)c52学习之旅-静态数码管
  • (译)计算距离、方位和更多经纬度之间的点
  • (源码分析)springsecurity认证授权
  • (自用)gtest单元测试
  • ***检测工具之RKHunter AIDE
  • **《Linux/Unix系统编程手册》读书笔记24章**
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET开源纪元:穿越封闭的迷雾,拥抱开放的星辰
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .NET中GET与SET的用法
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • @Value读取properties中文乱码解决方案
  • [12] 使用 CUDA 进行图像处理