一、审核功能实现的方式 1、普通 方案 :经办时入A表,审核后从A表读取数据,然后操作目标B表;
优势 :思路简单
劣势 :对后端功能实行高度的嵌入;审核功能数据操作不统一
2、弹框式 方案 :前台实现,操作时判断是否需要权限控制,如果需要,则弹出框,由审核人员进行审核,审核通过后,进行后续操作。
优势 :对后台功能无嵌入;可支持查询、导出、操作等全部功能;
劣势 :需要经办人和审核人同时在场操作
3、入参缓冲时 方案 :审核功能是独立的功能,前台发起业务后,入参存入数据库。待审核通过后,后台触发调用相应的接口,并将执行结果通知到经办人。
优势 :对前后台功能均无嵌入;支持导出及操作类;经办人和审核人可以异步操作;审核功能数据操作统一;
劣势 :需要框架层支持;实现逻辑稍微复杂
4、临时表 方案 :所有需要审核功能涉及的表均增加相应的表,该表比源表主要增加1个字段,即审核流水,其余字段命名完全一致;所有功能操作时先入该表,审核通过后,由后台从该表将数据同步至正表。
优势 :无需要框架支持;支持导出及操作类;经办人和审核人可以异步操作;审核功能数据操作统一;
劣势 :对后端功能实行高度的嵌入;
二、SpringBoot实现 1.创建数据库表SQL create TABLE `audit` ('ID' ,'报修名称' ,'报修人' ,'报修时间' ,'详情图片' ,'待审核'  COMMENT '待审核,审核通过,审核不通过' ,2.写Java后端 
图片 其实审核功能最主要的就是我们的新增功能,用户只有新增过后,我们的管理员才能去对你的申请进行审核,最后实现效果。
AuditController
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;"/audit" )return  Result.success(auditService.saveOrupdate(audit));if  (audit.getId() == null) {return  Result.success();"/{id}" )return  Result.success(userService.removeById(id));"/del/batch" )return  Result.success(auditService.removeByIds(ids));findAll return  Result.success(auditService.list());"/role/{role}" )"role" , role);return  Result.success(list);"/{id}" )return  Result.success(auditService.getById(id));"/username/{username}" )"username" , username);return  Result.success(auditService.getOne(queryWrapper));"/page" )"" ) String name) {"id" );if  (!"" .equals(name)) {"name" , name);if  (RoleEnum.ROLE_USER.toString().equals(currentUser.getRole())) {  // 角色是普通用户"user" , currentUser.getUsername());return  Result.success(auditService.page(new Page<>(pageNum, pageSize), queryWrapper));三、前端调用 1.实现效果 
图片 2.核心代码 
图片 <el-table-column label="审核"  width="240" >"scope" >type ="success"  @click="changeState(scope.row, '审核通过...师傅正在赶来的路上')"  :disabled="scope.row.state !== '待审核'" >审核通过</el-button>type ="danger"  @click="changeState(scope.row, '审核不通过')"  :disabled="scope.row.state !== '待审核'" >审核不通过</el-button>3.后台管理 
图片 4.后台管理核心代码 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;"/audit" )return  Result.success(auditService.saveOrupdate(audit));if  (audit.getId() == null) {return  Result.success();"/{id}" )return  Result.success(userService.removeById(id));"/del/batch" )return  Result.success(auditService.removeByIds(ids));findAll return  Result.success(auditService.list());"/{id}" )return  Result.success(auditService.getById(id));"/username/{username}" )"username" , username);return  Result.success(auditService.getOne(queryWrapper));"/page" )"" ) String name) {"id" );if  (!"" .equals(name)) {"name" , name);if  (RoleEnum.ROLE_USER.toString().equals(currentUser.getRole())) {  // 角色是普通用户"user" , currentUser.getUsername());return  Result.success(auditService.page(new Page<>(pageNum, pageSize), queryWrapper));5.vue前台完整代码 (1)、前台功能页面 
前台负责新增请求,然后保存请求之后,我们管理员审核通过之后就不可以编辑和删除我们的请求,我们会保留数据在前台页面
<template>"margin: 10px 0" >"width: 200px; margin-left: 10px"  placeholder="请输入报修描述"  clearable v-model="name"  ></el-input>"ml-5"  type ="primary"  @click="load" ><i class="el-icon-search"  />搜索</el-button>type ="warning"  @click="reset" ><i class="el-icon-refresh"  />刷新</el-button>"margin: 10px 0" >type ="primary"  @click="handleAdd"  class="ml-10" ><i class="el-icon-circle-plus-outline"  />新增</el-button>"ml-5" '确认' '取消' "el-icon-info" "red" "确定批量删除这些信息吗?" "delBatch" >type ="danger"  slot="reference"  ><i class="el-icon-remove-outline"  />删除</el-button>"tableData"  border stripe :header-cell-class-name="headerBg" "handleselectionChange" >type ="selection"  width="55" ></el-table-column>"name"  label="报修描述"  ></el-table-column>"user"  label="用户"  ></el-table-column>"createTime"  label="创建时间"  ></el-table-column>"图片" >"scope" >"width: 100px; height: 100px"  :src="scope.row.img"  :preview-src-list="[scope.row.img]" ></el-image>"state"  label="进度" ></el-table-column>"操作" >"scope" >type ="success"  @click="handleEdit(scope.row)"  :disabled="scope.row.state !== '待审核'" ><i class="el-icon-edit-outline"  />编辑</el-button>"padding: 10px 0" >"handleSizeChange" "handleCurrentChange" "pageNum" "[ 5, 10, 15]" "pageSize" "total, sizes, prev, pager, next, jumper" "total" >"用户信息"  :visible.sync="dialogFormVisible"  width="30%" >"100px"  size="small" >"报修描述"  >"form.name"  autocomplete="off" ></el-input>"物品图片" >"http://localhost:9090/file/upload"  ref="img"  :on-success="handleImgUploadSuccess" >"small"  type ="primary" >点击上传</el-button>"footer"  class="dialog-footer" >"dialogFormVisible = false" >取 消</el-button>type ="primary"  @click="save" >确 定</el-button>export  default {"Audit" ,data return  {"" ,false ,"headerBg" ,"user" ) ? JSON.parse(localStorage.getItem("user" )) : {}created function "/audit/page" , {then (res => {"/role" ).then (res => {home $router .push("/" )save "/audit" , this.form).then (res => {if  (res.code === '200' ) {$message .success("保存成功" )false else  {$message .error("保存失败" )handleAdd true true delBatch let  ids = this.multipleselection.map(v => v.id)  //[{}, {}, {}] => [1,2,3]"/audit/del/batch" , ids).then (res => {if  (res.code === '200' ) {$message .success("删除信息成功" )else  {$message .error("删除信息失败" )reset "" #eee!important; (2)、后台管理功能页面 
<template>"margin: 10px 0" >-->"width: 200px; margin-left: 10px"  placeholder="请输入用户名"  clearable suffix-icon="el-icon-user"  v-model="username"  ></el-input>-->"ml-5"  type ="primary"  @click="load" ><i class="el-icon-search"  />搜索</el-button>-->type ="warning"  @click="reset" ><i class="el-icon-refresh"  />刷新</el-button>-->"margin: 10px 0" >type ="primary"  @click="handleAdd"  class="ml-10" ><i class="el-icon-circle-plus-outline"  />新增</el-button>-->"ml-5" '确认' '取消' "el-icon-info" "red" "确定批量删除这些信息吗?" "delBatch" >type ="danger"  slot="reference"  ><i class="el-icon-remove-outline"  />删除</el-button>"tableData"  border stripe :header-cell-class-name="headerBg" "handleselectionChange" >type ="selection"  width="55" ></el-table-column>"name"  label="报修描述"  ></el-table-column>"user"  label="用户"  ></el-table-column>"createTime"  label="创建时间"  ></el-table-column>"img"  label="详情图片"  >"scope" >"width: 100px; height: 100px"  :src="scope.row.img"  :preview-src-list="[scope.row.img]" ></el-image>"state"  label="进度" ></el-table-column>"审核"  width="240" >"scope" >type ="success"  @click="changeState(scope.row, '审核通过...师傅正在赶来的路上')"  :disabled="scope.row.state !== '待审核'" >审核通过</el-button>type ="danger"  @click="changeState(scope.row, '审核不通过')"  :disabled="scope.row.state !== '待审核'" >审核不通过</el-button>"padding: 10px 0" >"handleSizeChange" "handleCurrentChange" "pageNum" "[ 5, 10, 15]" "pageSize" "total, sizes, prev, pager, next, jumper" "total" >export  default {"Audit" ,data return  {"" ,false ,"headerBg" ,"user" ) ? JSON.parse(localStorage.getItem("user" )) : {},created function "/audit/page" , {then (res => {"/role" ).then (res => {home $router .push("/" )save "/audit" , this.form).then (res => {if  (res.code === '200' ) {$message .success("保存成功" )false else  {$message .error("保存失败" )handleAdd true true delBatch let  ids = this.multipleselection.map(v => v.id)  //[{}, {}, {}] => [1,2,3]"/audit/del/batch" , ids).then (res => {if  (res.code === '200' ) {$message .success("删除信息成功" )else  {$message .error("删除信息失败" )reset "" handleImgUploadSuccess $message .success("图片上传成功" )#eee!important; 重点!!!!图片上传
图片 核心代码
create TABLE `file` ('ID' ,'文件名称' ,type ` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '文件类型' ,'文件大小(kb)' ,'下载链接' ,'文件md5' ,'时间' ,'0'  COMMENT '是否删除' ,"/file" )"${files.upload.path} " )"${server.ip} " )"/upload" )type  = FileUtil.extName(originalFilename);type ;if  (!parentFile.exists()) {if  (dbFiles != null) {else  {"http://"  + serverIp + ":9090/file/"  + fileUUID;type );return  url;if  (files != null) {else  {"http://localhost:9090/file/"  + fileUUID;type );return  url;"/{fileUUID}" )"Content-Disposition" , "attachment;filename="  + URLEncoder.encode(fileUUID, "UTF-8" ));"application/octet-stream" );return "md5" , md5);return  filesList.size() == 0 ? null : filesList.get(0);"files" , key = "'frontAll'" )"/update" )return  Result.success();"/detail/{id}" )return  Result.success(fileMapper.selectById(id));"files" ,key="'frontAll'" )"/{id}" )true );return  Result.success();"/del/batch" )where  id in  (id,id,id...)"id" , ids);for  (Files file : files) {true );return  Result.success();return "/page" )"" ) String name) {"is_delete" , false );"id" );if  (!"" .equals(name)) {"name" , name);return  Result.success(fileMapper.selectPage(new Page<>(pageNum, pageSize), queryWrapper));小结 以上就是对怎么利用SpringBoot实现审核功能简单的概述,让我们更加了解SpringBoot的作用,为我们的知识储备又加上一笔。