狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

[轉(zhuǎn)帖]SpringBoot 實(shí)現(xiàn)審核功能~

liguoquan
2023年7月28日 16:50 本文熱度 1053
:SpringBoot 實(shí)現(xiàn)審核功能~


SpringBoot 實(shí)現(xiàn)審核功能~


一、審核功能實(shí)現(xiàn)的方式

1、普通

方案:經(jīng)辦時(shí)入A表,審核后從A表讀取數(shù)據(jù),然后操作目標(biāo)B表;

優(yōu)勢(shì):思路簡(jiǎn)單

劣勢(shì):對(duì)后端功能實(shí)行高度的嵌入;審核功能數(shù)據(jù)操作不統(tǒng)一

2、彈框式

方案:前臺(tái)實(shí)現(xiàn),操作時(shí)判斷是否需要權(quán)限控制,如果需要,則彈出框,由審核人員進(jìn)行審核,審核通過后,進(jìn)行后續(xù)操作。

優(yōu)勢(shì):對(duì)后臺(tái)功能無嵌入;可支持查詢、導(dǎo)出、操作等全部功能;

劣勢(shì):需要經(jīng)辦人和審核人同時(shí)在場(chǎng)操作

3、入?yún)⒕彌_時(shí)

方案:審核功能是獨(dú)立的功能,前臺(tái)發(fā)起業(yè)務(wù)后,入?yún)⒋嫒霐?shù)據(jù)庫(kù)。待審核通過后,后臺(tái)觸發(fā)調(diào)用相應(yīng)的接口,并將執(zhí)行結(jié)果通知到經(jīng)辦人。

優(yōu)勢(shì):對(duì)前后臺(tái)功能均無嵌入;支持導(dǎo)出及操作類;經(jīng)辦人和審核人可以異步操作;審核功能數(shù)據(jù)操作統(tǒng)一;

劣勢(shì):需要框架層支持;實(shí)現(xiàn)邏輯稍微復(fù)雜

4、臨時(shí)表

方案:所有需要審核功能涉及的表均增加相應(yīng)的表,該表比源表主要增加1個(gè)字段,即審核流水,其余字段命名完全一致;所有功能操作時(shí)先入該表,審核通過后,由后臺(tái)從該表將數(shù)據(jù)同步至正表。

優(yōu)勢(shì):無需要框架支持;支持導(dǎo)出及操作類;經(jīng)辦人和審核人可以異步操作;審核功能數(shù)據(jù)操作統(tǒng)一;

劣勢(shì):對(duì)后端功能實(shí)行高度的嵌入;

二、SpringBoot實(shí)現(xiàn)

1.創(chuàng)建數(shù)據(jù)庫(kù)表SQL

create TABLE `audit` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '報(bào)修名稱',
  `user` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '報(bào)修人',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '報(bào)修時(shí)間',
  `img` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '詳情圖片',
  `state` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT '待審核' COMMENT '待審核,審核通過,審核不通過',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

2.寫Java后端

圖片

其實(shí)審核功能最主要的就是我們的新增功能,用戶只有新增過后,我們的管理員才能去對(duì)你的申請(qǐng)進(jìn)行審核,最后實(shí)現(xiàn)效果。

AuditController

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.common.Result;
import com.example.demo.entity.Audit;
import com.example.demo.entity.Sanitation;
import com.example.demo.entity.User;
import com.example.demo.mapper.FileMapper;
import com.example.demo.service.IAuditService;
import com.example.demo.utils.TokenUtils;
import org.springframework.web.bind.annotation.*;
 
import javax.annotation.Resource;
import java.util.List;
 
@CrossOrigin
@RestController
@RequestMapping("/audit")
public class AuditController {
 
    @Resource
    private IAuditService auditService;
 
    @Resource
    private FileMapper fileMapper;
 
//    //新增或者更新
//    @PostMapping
//    public Result save(@RequestBody Audit audit) {
//        audit.setUser(TokenUtils.getCurrentUser().getUsername());
        audit.setImg(Files.url);
//        return Result.success(auditService.saveOrupdate(audit));
//    }
 
    // 新增或者更新
    @PostMapping
    public Result save(@RequestBody Audit audit) {
        if (audit.getId() == null) {
            // 新增
            audit.setUser(TokenUtils.getCurrentUser().getUsername());
 
        }
        auditService.saveOrupdate(audit);
        return Result.success();
    }
 
    //刪除
//    @deleteMapping("/{id}")
//    public Result delete(@PathVariable Integer id) {
//        return Result.success(userService.removeById(id));
//    }
 
    @PostMapping("/del/batch")
    public Result deleteBatch(@RequestBody List<Integer> ids) {//批量刪除
        return Result.success(auditService.removeByIds(ids));
    }
 
    //查詢所有數(shù)據(jù)
    @GetMapping
    public Result findAll() {
        return Result.success(auditService.list());
    }
 
//    @GetMapping("/role/{role}")
//    public Result findNames(@PathVariable String role) {
//        QueryWrapper<Audit> queryWrapper = new QueryWrapper<>();
//        queryWrapper.eq("role", role);
//        List<Audit> list = auditService.list(queryWrapper);
//        return Result.success(list);
//    }
 
    @GetMapping("/{id}")
    public Result findOne(@PathVariable Integer id) {
        return Result.success(auditService.getById(id));
    }
 
    @GetMapping("/username/{username}")
    public Result findByUsername(@PathVariable String username) {
        QueryWrapper<Audit> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("username", username);
        return Result.success(auditService.getOne(queryWrapper));
    }
 
    @GetMapping("/page")
    public Result findPage(@RequestParam Integer pageNum,
                           @RequestParam Integer pageSize,
                           @RequestParam(defaultValue = "") String name) {
        QueryWrapper<Audit> queryWrapper = new QueryWrapper<>();
        queryWrapper.orderByDesc("id");
        if (!"".equals(name)) {
            queryWrapper.like("name", name);
        }
        User currentUser = TokenUtils.getCurrentUser();
//        if (RoleEnum.ROLE_USER.toString().equals(currentUser.getRole())) {  // 角色是普通用戶
//            queryWrapper.eq("user", currentUser.getUsername());
//        }
        return Result.success(auditService.page(new Page<>(pageNum, pageSize), queryWrapper));
 
    }
}

三、前端調(diào)用

1.實(shí)現(xiàn)效果

圖片

2.核心代碼

圖片
<el-table-column label="審核" width="240">
  <template v-slot="scope">
    <el-button type="success" @click="changeState(scope.row, '審核通過...師傅正在趕來的路上')" :disabled="scope.row.state !== '待審核'">審核通過</el-button>
    <el-button type="danger" @click="changeState(scope.row, '審核不通過')" :disabled="scope.row.state !== '待審核'">審核不通過</el-button>
  </template>
</el-table-column>

3.后臺(tái)管理

圖片

4.后臺(tái)管理核心代碼

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.common.Result;
import com.example.demo.entity.Audit;
import com.example.demo.entity.User;
import com.example.demo.mapper.FileMapper;
import com.example.demo.service.IAuditService;
import com.example.demo.utils.TokenUtils;
import org.springframework.web.bind.annotation.*;
 
import javax.annotation.Resource;
import java.util.List;
 
@CrossOrigin
@RestController
@RequestMapping("/audit")
public class AuditController {
 
    @Resource
    private IAuditService auditService;
 
    @Resource
    private FileMapper fileMapper;
 
//    //新增或者更新
//    @PostMapping
//    public Result save(@RequestBody Audit audit) {
//        audit.setUser(TokenUtils.getCurrentUser().getUsername());
        audit.setImg(Files.url);
//        return Result.success(auditService.saveOrupdate(audit));
//    }
 
    // 新增或者更新
    @PostMapping
    public Result save(@RequestBody Audit audit) {
        if (audit.getId() == null) {
            // 新增
            audit.setUser(TokenUtils.getCurrentUser().getUsername());
        }
        auditService.saveOrupdate(audit);
        return Result.success();
    }
 
    //刪除
//    @deleteMapping("/{id}")
//    public Result delete(@PathVariable Integer id) {
//        return Result.success(userService.removeById(id));
//    }
 
    @PostMapping("/del/batch")
    public Result deleteBatch(@RequestBody List<Integer> ids) {//批量刪除
        return Result.success(auditService.removeByIds(ids));
    }
 
    //查詢所有數(shù)據(jù)
    @GetMapping
    public Result findAll() {
        return Result.success(auditService.list());
    }
 
    @GetMapping("/{id}")
    public Result findOne(@PathVariable Integer id) {
        return Result.success(auditService.getById(id));
    }
 
    @GetMapping("/username/{username}")
    public Result findByUsername(@PathVariable String username) {
        QueryWrapper<Audit> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("username", username);
        return Result.success(auditService.getOne(queryWrapper));
    }
 
    @GetMapping("/page")
    public Result findPage(@RequestParam Integer pageNum,
                           @RequestParam Integer pageSize,
                           @RequestParam(defaultValue = "") String name) {
        QueryWrapper<Audit> queryWrapper = new QueryWrapper<>();
        queryWrapper.orderByDesc("id");
        if (!"".equals(name)) {
            queryWrapper.like("name", name);
        }
        User currentUser = TokenUtils.getCurrentUser();
//        if (RoleEnum.ROLE_USER.toString().equals(currentUser.getRole())) {  // 角色是普通用戶
//            queryWrapper.eq("user", currentUser.getUsername());
//        }
        return Result.success(auditService.page(new Page<>(pageNum, pageSize), queryWrapper));
 
    }
}

5.vue前臺(tái)完整代碼

(1)、前臺(tái)功能頁(yè)面

前臺(tái)負(fù)責(zé)新增請(qǐng)求,然后保存請(qǐng)求之后,我們管理員審核通過之后就不可以編輯和刪除我們的請(qǐng)求,我們會(huì)保留數(shù)據(jù)在前臺(tái)頁(yè)面

<template>
  <div>
    <div style="margin: 10px 0">
      <el-input style="width: 200px; margin-left: 10px" placeholder="請(qǐng)輸入報(bào)修描述" clearable v-model="name" ></el-input>
      <el-button class="ml-5" type="primary" @click="load"><i class="el-icon-search" />搜索</el-button>
      <el-button type="warning" @click="reset"><i class="el-icon-refresh" />刷新</el-button>
    </div>
    <div style="margin: 10px 0">
      <el-button type="primary" @click="handleAdd" class="ml-10"><i class="el-icon-circle-plus-outline" />新增</el-button>
      <el-popconfirm
          class="ml-5"
          confirm-button-text='確認(rèn)'
          cancel-button-text='取消'
          icon="el-icon-info"
          icon-color="red"
          title="確定批量刪除這些信息嗎?"
          @confirm="delBatch">
        <el-button type="danger" slot="reference" ><i class="el-icon-remove-outline" />刪除</el-button>
      </el-popconfirm>
    </div>
    <el-table :data="tableData" border stripe :header-cell-class-name="headerBg"
              @selection-change="handleselectionChange">
      <el-table-column type="selection" width="55"></el-table-column>
      <el-table-column prop="name" label="報(bào)修描述" ></el-table-column>
      <el-table-column prop="user" label="用戶" ></el-table-column>
      <el-table-column prop="createTime" label="創(chuàng)建時(shí)間" ></el-table-column>
      <el-table-column label="圖片">
        <template slot-scope="scope">
          <el-image style="width: 100px; height: 100px" :src="scope.row.img" :preview-src-list="[scope.row.img]"></el-image>
        </template>
      </el-table-column>
      <el-table-column prop="state" label="進(jìn)度"></el-table-column>
      <el-table-column label="操作">
        <template slot-scope="scope">
          <el-button type="success" @click="handleEdit(scope.row)" :disabled="scope.row.state !== '待審核'"><i class="el-icon-edit-outline" />編輯</el-button>
        </template>
      </el-table-column>
    </el-table>
    <div style="padding: 10px 0">
      <el-pagination
          @size-change="handleSizeChange"
          @current-change="handleCurrentChange"
          :current-page="pageNum"
          :page-sizes="[ 5, 10, 15]"
          :page-size="pageSize"
          layout="total, sizes, prev, pager, next, jumper"
          :total="total">
      </el-pagination>
    </div>
    <el-dialog title="用戶信息" :visible.sync="dialogFormVisible" width="30%">
      <el-form label-width="100px" size="small">
        <el-form-item label="報(bào)修描述" >
          <el-input v-model="form.name" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="物品圖片">
          <el-upload action="http://localhost:9090/file/upload" ref="img" :on-success="handleImgUploadSuccess">
            <el-button size="small" type="primary">點(diǎn)擊上傳</el-button>
          </el-upload>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="dialogFormVisible = false">取 消</el-button>
        <el-button type="primary" @click="save">確 定</el-button>
      </div>
    </el-dialog>
  </div>
</template>
 
<script>
export default {
  name: "Audit",
  data() {
    return {
      tableData: [],
      total: 0,
      pageNum: 1,
      pageSize: 5,
      name: "",
      form: {},
      dialogFormVisible: false,
      multipleselection: [],
      headerBg: "headerBg",
      roles: [],
      user: localStorage.getItem("user") ? JSON.parse(localStorage.getItem("user")) : {}
    }
  },
  created() {
    this.load()
  },
  methods: {
    load: function () {
      this.request.get("/audit/page", {
        params: {
          pageNum: this.pageNum,
          pageSize: this.pageSize,
          name: this.name,
        }
      }).then(res => {
        this.tableData = res.data.records
        this.total = res.data.total
      })
      // this.request.get("/role").then(res => {
      //   this.roles = res.data
      // })
    },
    home() {
      this.$router.push("/")
    },
    save() {
      this.request.post("/audit", this.form).then(res => {
        if (res.code === '200') {
          this.$message.success("保存成功")
          this.dialogFormVisible = false
          this.load()
        } else {
          this.$message.error("保存失敗")
        }
      })
    },
    handleAdd() {
      this.dialogFormVisible = true
      this.form = {}
    },
    handleEdit(row) {
      this.form = row
      this.dialogFormVisible = true
    },
    handleselectionChange(val) {
      console.log(val)
      this.multipleselection = val;
    },
    delBatch() {
      let ids = this.multipleselection.map(v => v.id)  //[{}, {}, {}] => [1,2,3]
      this.request.post("/audit/del/batch", ids).then(res => {
        if (res.code === '200') {
          this.$message.success("刪除信息成功")
          this.load()
        } else {
          this.$message.error("刪除信息失敗")
        }
      })
    },
    reset() {
      this.name = ""
      this.load()
    },
    handleSizeChange(pageSize) {
      console.log(pageSize)
      this.pageSize = pageSize
      this.load()
    },
    handleCurrentChange(pageNum) {
      console.log(pageNum)
      this.pageNum = pageNum
      this.load()
    },
    handleImgUploadSuccess(res) {
      this.form.img = res
    },
  }
}
</script>
 
<style>
.headerBg {
  background: #eee!important;
}
</style>

(2)、后臺(tái)管理功能頁(yè)面

<template>
  <div>
<!--    <div style="margin: 10px 0">-->
<!--      <el-input style="width: 200px; margin-left: 10px" placeholder="請(qǐng)輸入用戶名" clearable suffix-icon="el-icon-user" v-model="username" ></el-input>-->
<!--      <el-button class="ml-5" type="primary" @click="load"><i class="el-icon-search" />搜索</el-button>-->
<!--      <el-button type="warning" @click="reset"><i class="el-icon-refresh" />刷新</el-button>-->
<!--    </div>-->
    <div style="margin: 10px 0">
<!--      <el-button type="primary" @click="handleAdd" class="ml-10"><i class="el-icon-circle-plus-outline" />新增</el-button>-->
      <el-popconfirm
          class="ml-5"
          confirm-button-text='確認(rèn)'
          cancel-button-text='取消'
          icon="el-icon-info"
          icon-color="red"
          title="確定批量刪除這些信息嗎?"
          @confirm="delBatch">
        <el-button type="danger" slot="reference" ><i class="el-icon-remove-outline" />刪除</el-button>
      </el-popconfirm>
    </div>
    <el-table :data="tableData" border stripe :header-cell-class-name="headerBg"
              @selection-change="handleselectionChange">
      <el-table-column type="selection" width="55"></el-table-column>
      <el-table-column prop="name" label="報(bào)修描述" ></el-table-column>
      <el-table-column prop="user" label="用戶" ></el-table-column>
      <el-table-column prop="createTime" label="創(chuàng)建時(shí)間" ></el-table-column>
      <el-table-column prop="img" label="詳情圖片" >
        <template slot-scope="scope">
          <el-image style="width: 100px; height: 100px" :src="scope.row.img" :preview-src-list="[scope.row.img]"></el-image>
        </template>
      </el-table-column>
      <el-table-column prop="state" label="進(jìn)度"></el-table-column>
      <el-table-column label="審核" width="240">
        <template v-slot="scope">
          <el-button type="success" @click="changeState(scope.row, '審核通過...師傅正在趕來的路上')" :disabled="scope.row.state !== '待審核'">審核通過</el-button>
          <el-button type="danger" @click="changeState(scope.row, '審核不通過')" :disabled="scope.row.state !== '待審核'">審核不通過</el-button>
        </template>
      </el-table-column>
    </el-table>
    <div style="padding: 10px 0">
      <el-pagination
          @size-change="handleSizeChange"
          @current-change="handleCurrentChange"
          :current-page="pageNum"
          :page-sizes="[ 5, 10, 15]"
          :page-size="pageSize"
          layout="total, sizes, prev, pager, next, jumper"
          :total="total">
      </el-pagination>
    </div>
 
  </div>
</template>
 
<script>
export default {
  name: "Audit",
  data() {
    return {
      tableData: [],
      total: 0,
      pageNum: 1,
      pageSize: 5,
      username: "",
      form: {},
      // dialogFormVisible: false,
      multipleselection: [],
      headerBg: "headerBg",
      roles: [],
      user: localStorage.getItem("user") ? JSON.parse(localStorage.getItem("user")) : {},
    }
  },
  created() {
    this.load()
  },
  methods: {
    load: function () {
      this.request.get("/audit/page", {
        params: {
          pageNum: this.pageNum,
          pageSize: this.pageSize,
          username: this.username,
        }
      }).then(res => {
        this.tableData = res.data.records
        this.total = res.data.total
      })
      this.request.get("/role").then(res => {
        this.roles = res.data
      })
    },
    home() {
      this.$router.push("/")
    },
    save() {
      this.request.post("/audit", this.form).then(res => {
        if (res.code === '200') {
          this.$message.success("保存成功")
          this.dialogFormVisible = false
          this.load()
        } else {
          this.$message.error("保存失敗")
        }
      })
    },
    handleAdd() {
      this.dialogFormVisible = true
      this.form = {}
    },
    handleEdit(row) {
      this.form = row
      this.dialogFormVisible = true
    },
    handleselectionChange(val) {
      console.log(val)
      this.multipleselection = val;
    },
    delBatch() {
      let ids = this.multipleselection.map(v => v.id)  //[{}, {}, {}] => [1,2,3]
      this.request.post("/audit/del/batch", ids).then(res => {
        if (res.code === '200') {
          this.$message.success("刪除信息成功")
          this.load()
        } else {
          this.$message.error("刪除信息失敗")
        }
      })
    },
    reset() {
      this.username = ""
      this.load()
    },
    handleSizeChange(pageSize) {
      console.log(pageSize)
      this.pageSize = pageSize
      this.load()
    },
    handleCurrentChange(pageNum) {
      console.log(pageNum)
      this.pageNum = pageNum
      this.load()
    },
    changeState(row, state) {
      this.form = JSON.parse(JSON.stringify(row))
      this.form.state = state;
      this.save();
    },
    // handleImgUploadSuccess() {
    //   this.$message.success("圖片上傳成功")
    //   this.load()
    // },
  }
}
</script>
 
<style>
.headerBg {
  background: #eee!important;
}
</style>

重點(diǎn)?。。。D片上傳

圖片

核心代碼

create TABLE `file` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '文件名稱',
  `type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '文件類型',
  `size` bigint DEFAULT NULL COMMENT '文件大小(kb)',
  `url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '下載鏈接',
  `md5` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '文件md5',
  `creat_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '時(shí)間',
  `is_delete` tinyint(1) DEFAULT '0' COMMENT '是否刪除',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=115 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.common.Constants;
import com.example.demo.common.Result;
import com.example.demo.entity.Files;
import com.example.demo.mapper.FileMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
 
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
 
@RestController
@RequestMapping("/file")
public class FileController {
 
    @Value("${files.upload.path}")
    private String fileUploadPath;
 
    @Value("${server.ip}")
    private String serverIp;
 
    @Resource
    private FileMapper fileMapper;
 
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
 
    @PostMapping("/upload")
    public String upload(@RequestParam MultipartFile file) throws IOException {
        String originalFilename = file.getOriginalFilename();
        String type = FileUtil.extName(originalFilename);
        long size = file.getSize();
 
        // 定義一個(gè)文件唯一的標(biāo)識(shí)碼
        String fileUUID = IdUtil.fastSimpleUUID() + StrUtil.DOT + type;
 
        File uploadFile = new File(fileUploadPath + fileUUID);
        // 判斷配置的文件目錄是否存在,若不存在則創(chuàng)建一個(gè)新的文件目錄
        File parentFile = uploadFile.getParentFile();
        //判斷目錄是否存在,不存在就新建
        if (!parentFile.exists()) {
             parentFile.mkdirs();
        }
        String url;
        // 獲取文件的md5
        String md5 = SecureUtil.md5(file.getInputStream());
        // 從數(shù)據(jù)庫(kù)查詢是否存在相同的記錄
        Files dbFiles = getFileByMd5(md5);
        if (dbFiles != null) {
            url = dbFiles.getUrl();
        } else {
            // 上傳文件到磁盤
            file.transferTo(uploadFile);
            // 數(shù)據(jù)庫(kù)若不存在重復(fù)文件,則不刪除剛才上傳的文件
            url = "http://" + serverIp + ":9090/file/" + fileUUID;
        }
        //存儲(chǔ)到數(shù)據(jù)庫(kù)
        Files saveFile = new Files();
        saveFile.setName(originalFilename);
        saveFile.setType(type);
        saveFile.setSize(size/1024);
        saveFile.setUrl(url);
        saveFile.setMd5(md5);
        fileMapper.insert(saveFile);
        return url;
 
//        String md5 = SecureUtil.md5(file.getInputStream());
//        Files files = getFileByMd5(md5);
//
//        String url;
//        if (files != null) {
//            url = files.getUrl();
//        } else {
//            file.transferTo(uploadFile);
//            url = "http://localhost:9090/file/" + fileUUID;
//        }
//        //存儲(chǔ)到數(shù)據(jù)庫(kù)
//        Files saveFile = new Files();
//        saveFile.setName(originalFilename);
//        saveFile.setType(type);
//        saveFile.setSize(size/1024);
//        saveFile.setUrl(url);
//        saveFile.setMd5(md5);
//        fileMapper.insert(saveFile);
//        return url;
    }
 
 
    @GetMapping("/{fileUUID}")
    public void download(@PathVariable String fileUUID, HttpServletResponse response) throws IOException {
        // 根據(jù)文件的唯一標(biāo)識(shí)碼獲取文件
        File uploadFile = new File(fileUploadPath + fileUUID);
        // 設(shè)置輸出流的格式
        ServletOutputStream os = response.getOutputStream();
        response.addHeader("Content-Disposition""attachment;filename=" + URLEncoder.encode(fileUUID, "UTF-8"));
        response.setContentType("application/octet-stream");
 
        // 讀取文件的字節(jié)流
        os.write(FileUtil.readBytes(uploadFile));
        os.flush();
        os.close();
    }
 
    /**
     * 通過文件的md5查詢文件
     * @param md5
     * @return
     */
    private Files getFileByMd5(String md5) {
        // 查詢文件的md5是否存在
        QueryWrapper<Files> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("md5", md5);
        List<Files> filesList = fileMapper.selectList(queryWrapper);
        return filesList.size() == 0 ? null : filesList.get(0);
    }
 
    //    @CachePut(value = "files", key = "'frontAll'")
    @PostMapping("/update")
    public Result update(@RequestBody Files files) {
        fileMapper.updateById(files);
        flushRedis(Constants.FILES_KEY);
        return Result.success();
    }
 
    @GetMapping("/detail/{id}")
    public Result getById(@PathVariable Integer id) {
        return Result.success(fileMapper.selectById(id));
    }
 
    //清除一條緩存,key為要清空的數(shù)據(jù)
//    @CacheEvict(value="files",key="'frontAll'")
    @deleteMapping("/{id}")
    public Result delete(@PathVariable Integer id) {
        Files files = fileMapper.selectById(id);
        files.setIsdelete(true);
        fileMapper.updateById(files);
        flushRedis(Constants.FILES_KEY);
        return Result.success();
    }
 
    @PostMapping("/del/batch")
    public Result deleteBatch(@RequestBody List<Integer> ids) {
        // select * from sys_file where id in (id,id,id...)
        QueryWrapper<Files> queryWrapper = new QueryWrapper<>();
        queryWrapper.in("id", ids);
        List<Files> files = fileMapper.selectList(queryWrapper);
        for (Files file : files) {
            file.setIsdelete(true);
            fileMapper.updateById(file);
        }
        return Result.success();
    }
 
    /**
     * 分頁(yè)查詢接口
     * @param pageNum
     * @param pageSize
     * @param name
     * @return
     */
    @GetMapping("/page")
    public Result findPage(@RequestParam Integer pageNum,
                           @RequestParam Integer pageSize,
                           @RequestParam(defaultValue = "") String name) {
 
        QueryWrapper<Files> queryWrapper = new QueryWrapper<>();
        // 查詢未刪除的記錄
        queryWrapper.eq("is_delete"false);
        queryWrapper.orderByDesc("id");
        if (!"".equals(name)) {
            queryWrapper.like("name", name);
        }
        return Result.success(fileMapper.selectPage(new Page<>(pageNum, pageSize), queryWrapper));
    }
 
    // 刪除緩存
    private void flushRedis(String key) {
        stringRedisTemplate.delete(key);
    }
}

小結(jié)

以上就是對(duì)怎么利用SpringBoot實(shí)現(xiàn)審核功能簡(jiǎn)單的概述,讓我們更加了解SpringBoot的作用,為我們的知識(shí)儲(chǔ)備又加上一筆。


該文章在 2023/7/28 16:50:28 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved