【VUE_ruoyi-vue】基于ruoyi-vue框架实现简单的系统通用文件模块

基于ruoyi-vue框架,新增一个简单的系统通用文件模块,服务与各个模块涉及到文件上传信息的记录和相关展示

运行sql,创建数据库表

DROP TABLE IF EXISTS `sys_file_info`;
CREATE TABLE `sys_file_info` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',`link_obj_id` int(11) DEFAULT NULL COMMENT '关联对象id',`name` varchar(255) DEFAULT NULL COMMENT '文件名称',`file_type` varchar(255) DEFAULT NULL COMMENT '文件类型',`type` char(10) DEFAULT NULL COMMENT '归属类型(预留字段,比如归属某个模块)',`file_size` varchar(255) DEFAULT NULL COMMENT '文件大小',`file_path` varchar(255) DEFAULT NULL COMMENT '文件路径',`create_by` varchar(255) DEFAULT NULL COMMENT '创建人',`create_time` datetime DEFAULT NULL COMMENT '创建时间',PRIMARY KEY (`id`) USING BTREE,KEY `i_pof_type` (`link_obj_id`,`type`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='系统通用文件库';

生成代码

(按正常的若依分离版生成导入代码流程走)在系统工具生成代码,然后再编辑代码生成的内容,调整一下业务名,看自己的需求吧。
在这里插入图片描述
将生成后的后端代码加入系统模块相关位置,生成的前端代码内容如果不做台账管理则只用生成的api接口文件就行,后续要用到文件删除和请求。如果需要做台账则同样加到前端相应模块下,然后运行生成的sql文件(主要是生成相关路由菜单信息)即可,其他不多赘述。

java部分

1、在文件模块的controller层补充文件上传接口,代码如下:
重点:String linkObjId = map.get(“linkObjId”); String type = map.get(“type”); 获取前端组件额外传的参数,分别对应相关模块的数据id和模块类型,因为现在采用的id是1开始递增,不是全系统唯一uuid,因此可能不同模块会出现相同id,导致文件数据绑定异常,需要加上type来区分不同的模块。

    @PostMapping(value = "/uploadFile")@ResponseBodypublic AjaxResult uploadFile(SysFileInfo pdFile, MultipartFile[] file, @RequestParam Map<String,String> map) {String linkObjId = map.get("linkObjId");String type = map.get("type");try {System.out.println("文件上传进入方法!");List<SysFileInfo> list = new ArrayList<SysFileInfo>();for (MultipartFile f : file) {// 文件保存路径String loadPath = FileUploadUtils.upload(RuoYiConfig.getUploadSysFilePath(), f);pdFile.setFilePath(loadPath);// 保存文件名String f_name = f.getOriginalFilename();pdFile.setName(f_name);pdFile.setLinkObjId(Long.valueOf(linkObjId));pdFile.setType(type);pdFile.setFileSize(FileUtils.getFileSize(RuoYiConfig.getProfile() + loadPath.replace(Constants.RESOURCE_PREFIX, ""))+ " kb");sysFileInfoService.insertSysFileInfo(pdFile);list.add(pdFile);}return AjaxResult.success(list);} catch (Exception e) {e.printStackTrace();return AjaxResult.error("文件上传失败!" + e.getMessage());}}

2、RuoYiConfig.getUploadSysFilePath()爆红,为了和原来自带的上传路径(原来的是getUploadPath,按自己的需求调整,用原来的也行)做个区分,需要处理文件上传存储位置,在RuoYiConfig.java 补充以下代码。

/*** 系统文件* @return*/
public static String getUploadSysFilePath()
{return getProfile() + "/sysFile";
}

3、FileUtils.getFileSize()爆红,在FileUtils.java补充获取文件大小的方法, 没有这个需求就不用处理

/*** 计算文件大小* @param  filePath* @return 单位是byte*/
public static long getFileSize(String filePath) {long size = 0;FileInputStream fis= null;FileChannel fc= null;try {File f = new File(filePath);if (f.exists() && f.isFile()){fis= new FileInputStream(f);fc= fis.getChannel();size = fc.size();}else{// Constant.LOGGER.error("{},file doesn't exist or is not a file", filePath);}} catch (FileNotFoundException e) {//Constant.LOGGER.error("文件大小检查发生异常,{}", e.getMessage());e.getMessage();} catch (IOException e) {// Constant.LOGGER.error("文件大小检查发生异常,{}", e.getMessage());e.getMessage();} finally {if (null!=fc){try{fc.close();}catch(IOException e){e.getMessage();}}if (null!=fis){try{fis.close();}catch(IOException e){// Constant.LOGGER.error("FileInputStream资源关闭发生异常,{}", e.getMessage());e.getMessage();}}}return size/1024;
}

4、将原来的批量删除、和删除方法调整如下,实现先删除文件,再删除数据信息

/*** 批量删除系统通用文件库* * @param ids 需要删除的系统通用文件库主键* @return 结果*/
@Override
public int deleteSysFileInfoByIds(Long[] ids)
{for(Long id :ids){SysFileInfo sysFiles = selectSysFileInfoById(id);String path= RuoYiConfig.getProfile() + sysFiles.getFilePath().replace(Constants.RESOURCE_PREFIX, "");FileUtils.deleteFile(path);}return sysFileInfoMapper.deleteSysFileInfoByIds(ids);
}/*** 删除系统通用文件库信息* * @param id 系统通用文件库主键* @return 结果*/
@Override
public int deleteSysFileInfoById(Long id)
{//删除本地文件SysFileInfo sysFiles = selectSysFileInfoById(id);String path= RuoYiConfig.getProfile() + sysFiles.getFilePath().replace(Constants.RESOURCE_PREFIX, "");FileUtils.deleteFile(path);// 删除数据库文件记录return sysFileInfoMapper.deleteSysFileInfoById(id);
}

其他爆红导入相关类就行。

前端在需要文件上传的地方处理文件上传

1、组件引入

<el-form-item label="附件"><el-uploadclass="notice_upload"ref="upload":limit="7"accept=""multiple:data="upload.data":headers="upload.headers":action="upload.url":disabled="upload.isUploading":on-progress="handleFileUploadProgress":on-success="handleFileSuccess":on-preview="handleDownload":show-file-list="true":file-list="upload.fileList":auto-upload="false":before-remove="beforeRemove":on-remove="handleRemove"><em v-if="!upload.isUploading"><div:style="{width: '80px',height: '30px',lineHeight: '20px',color: theme,}"><i class="el-icon-link"></i> 点击上传</div></em></el-upload>
</el-form-item>

2、引入获取token

import { getToken } from "@/utils/auth";

3、引入api

import { listFileInfo,delFileInfo} from "@/api/system/fileInfo";

4、data中添加属性

upload: {// 是否禁用上传isUploading: false,// 设置上传的请求头部headers: { Authorization: "Bearer " + getToken() },// 上传的地址(接口就是上文的文件上传接口)url: process.env.VUE_APP_BASE_API + "/system/fileInfo/uploadFile",// 上传的文件列表fileList: [],//携带参数data: {linkObjId: null,type: 1,}
},

5、添加对应事件

   //文件提交处理submitUpload() {this.$refs.upload.submit();},// 文件上传中处理handleFileUploadProgress(event, file, fileList) {this.upload.isUploading = true;},// 文件上传成功处理handleFileSuccess(response, file, fileList) {this.upload.isUploading = false;},// 删除文件之前确认beforeRemove(file, fileList) {return this.$confirm(`是否确定永久移除文件 ${file.name}?`);},//文件删除handleRemove(file, fileList) {if (file.id) {delFileInfo(file.id).then((res) => {this.$message.success(res.msg);console.log("res", res);}).catch((err) => {this.$message.errer(err + "");console.log("err", err);});}},// 文件下载处理handleDownload(file) {var name = file.name;//先打印看文件信息再调整url构建var url = process.env.VUE_APP_BASE_API + file.filePath;const a = document.createElement("a");a.setAttribute("download", name);a.setAttribute("target", "_blank");a.setAttribute("href", url);a.click();},

6、在表单提交时,调用文件上传方法,注意id的获取,this.upload.data.linkObjId

  /** 提交按钮 */ 			submitForm(e) {this.$refs["form"].validate((valid) => {if (valid) {if (this.form.id != null) {updateWorkInfo(this.form).then((response) => {console.log("修改:" + response)this.$modal.msgSuccess("修改成功");this.upload.data.linkObjId=this.form.id;this.submitUpload()this.open = false;this.$emit("cancel")});} else {addWorkInfo(this.form).then((response) => {this.$modal.msgSuccess("新增成功");this.upload.data.linkObjId=response.id;this.submitUpload()this.open = false;this.$emit("cancel")});}}}); 			
},

补充,后端处理新增返回id的方式,需求表单的id会自增:

@PostMapping
public AjaxResult add(@RequestBody WorkInfo workInfo ) {workInfoService.insertWorkInfo (workInfo);AjaxResult ajaxResult = new AjaxResult();ajaxResult.put("id",workInfo.getId());return ajaxResult;
}

7、附件回显,再点击修改或者查看事件的方法内给this.upload.fileList赋值请求到的文件列表信息就行

//查看
handleView(row) {this.reset();const id = row.id || this.ids;getWorkInfo(id).then((response) => {this.form = response.data;//处理文件信息(可以在后端WorkInfo加个返回参数,也可以在这里请求文件信息数据再赋值,注意type和linkObjId的参数传值)this.upload.fileList=response.data.sysFileInfoListthis.seeOpen = true;this.title = "查看授权申请单";});
},

8、文件列表重置,不然会有缓存问题
在this.reset()方法里加上this.upload.fileList=[]

注意事项

1、会使用若依分离版的代码生成功能
2、注意接口是否对应得上

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/431965.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在虚幻引擎中实时显示帧率

引擎自带了显示帧率的功能 但是只能在编辑器中显示 , 在游戏发布后就没有了 , 所以我们要自己做一个 创建一个控件蓝图 创建画布和文本 , 修改文本 文本绑定函数 , 点击创建绑定 添加一个名为 FPS 的变量 格式化文本 用大括号把变量包起来 {FPS Int} FPS 然后转到事件图表…

机器学习算法与Python实战 | 三万字详解!GPT-5:你需要知道的一切(下)建议收藏!

本文来源公众号“机器学习算法与Python实战”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;三万字详解&#xff01;GPT-5&#xff1a;你需要知道的一切 作者&#xff1a;Alberto Romero &#xff08;青稞AI整理&#xff09; 原…

Go语言基础学习01-Liunx下Go开发环境配置;源码组织方式;go build/install/get详解

目录 Linux环境下配置安装VScode并配置Go语言开发环境Go语言源码的组织方式Go语言源码安装后的结果Go程序构建和安装的过程go build扩展go get 命令详解 之前学习过Go语言&#xff0c;学习的时候没有记录笔记&#xff0c;最近找了个极客时间的Go语言36讲&#xff0c;打算时间学…

第 1 章:Vue 核心

1. Vue 简介 1.1. 官网 英文官网: https://vuejs.org/中文官网: https://cn.vuejs.org/&#xff1a;中文官网里面【教程】和【API】是比较重要的。用到api就去查询&#xff0c;实践当中记忆更牢靠。 风格指南&#xff1a;官方推荐写的一个代码风格cookbook&#xff1a;编写v…

QT窗口无法激活弹出问题排查记录

问题背景 问题环境 操作系统: 银河麒麟V10SP1qt版本 : 5.12.12 碰见了一个问题应用最小化,然后激活程序窗口无法弹出 这里描述一下代码的逻辑,使用QLocalServer实现一个单例进程,具体的功能就是在已存在一个程序A进程时,再启动这个程序A,新的程序A进程会被杀死,然后激活已存…

视频汇聚EasyCVR视频监控平台调取接口提示“认证过期”是什么原因?

视频汇聚EasyCVR视频监控平台&#xff0c;作为一款智能视频监控综合管理平台&#xff0c;凭借其强大的视频融合汇聚能力和灵活的视频能力&#xff0c;在各行各业的应用中发挥着越来越重要的作用。EasyCVR平台具备强大的拓展性和灵活性&#xff0c;支持多种视频流的外部分发&…

Kolmogorov-Arnold——代替 MLP以提高模型的代表性和性能

前言 论文地址&#xff1a;https://arxiv.org/abs/2409.10594 源码地址&#xff1a;https://github.com/Adamdad/kat.git 传统的变压器模型使用多层感知器&#xff08;MLP&#xff09;来混合通道间的信息&#xff0c;而本文则使用了科尔莫哥罗德网络&#xff08;KAN&#xff0…

golang操作mysql利器-gorm

1、傻瓜示例 GORM通过将数据库表中的数据映射到面向对象的模型中&#xff0c;简化了数据库操作&#xff0c;使得开发者可以很方便的使用代码来操作数据库&#xff0c;而无需编写SQL语句。 目前有个mysql表&#xff1a;miniprogram_orders&#xff0c;其存储了所有用户对应的订…

Go容器化微服务系统实战

1-1 本课的go微服务有什么不同&#xff1f; 聚焦于容器化可观测的购物微服务系统实战&#xff0c;通过介绍Go语言的应用趋势、容器化优势及微服务适用性&#xff0c;旨在解决学习微服务过程中遇到的难点。课程内容涵盖微服务整体架构、技术工具框架及容器平台等关键技术&#…

GPT-4o在matlab编程中性能较好,与智谱清言相比

边标签由矩阵给出 s [1 2 3 3 3 3 4 5 6 7 8 9 9 9 10]; t [7 6 1 5 6 8 2 4 4 3 7 1 6 8 2]; G graph(s,t); plot(G) ------------------- GPT-4o给出的代码可用&#xff0c; clc;clear; % 定义边的起点和终点 s [1 2 3 3 3 3 4 5 6 7 8 9 9 9 10]; t [7 6 1 5 6 8 2 …

百度amis框架经验分享

百度amis框架经验分享 官方文档 amis - 低代码前端框架 这篇文章讲了amis的设计 为什么说百度AMIS框架是一个优秀的设计_百度前端框架-CSDN博客 学习方法&#xff1a; 最好的学习方法就是GPT官方文档 不要去很大力气通读官方文档&#xff0c;大概浏览一遍就行&#xff0c; 以你…

JS面试真题 part6

JS面试真题 part6 26、如何判断一个元素是否在可视区域中27、什么是单点登录&#xff1f;如何实现28、 如何实现上拉加载&#xff0c;下拉刷新29、说说你对正则表达式的理解&#xff1f;应用场景&#xff1f;30、说说你对函数式编程的理解&#xff1f;优缺点 26、如何判断一个元…

MySQL 主从复制部署与优化

文章目录 前言 在现代数据库管理中&#xff0c;MySQL 主从复制是一种关键技术&#xff0c;用于提高数据的可用性和性能。随着 Docker 容器技术的普及&#xff0c;利用 Docker 搭建 MySQL 主从复制环境已成为一种趋势&#xff0c;它提供了一种简便、高效且可扩展的解决方案。本…

某建筑市场爬虫数据采集逆向分析

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 目标网站 aHR0cHM6Ly9qenNjLm1vaHVyZC5nb3YuY24vZGF0YS9jb21wYW55P2NvbXBsZXhuYW1lPSVFNiVCMCVCNA 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面…

应用层 I(C/S模型、P2P模型、域名系统DNS)【★★】

&#xff08;★★&#xff09;代表非常重要的知识点&#xff0c;&#xff08;★&#xff09;代表重要的知识点。 一、网络应用模型 在网络边缘的端系统之间的通信方式通常可划分为两大类&#xff1a;客户 - 服务器方式&#xff08;C/S 方式 [Client/Server] &#xff09;和对等…

Linux:编译,调试和Makefile

一丶vim编译器 ### 基本概念 模式&#xff1a;Vim有几种不同的模式&#xff0c;包括&#xff1a; 命令/正常/普通模式&#xff1a;控制屏幕光标的移动&#xff0c;字符、字或行的删除&#xff0c;移动复制某区段及进入Insert mode下&#xff0c;或者到 last line mode 插入模…

【Vision Transformer】辅助理解笔记

注&#xff1a;本文主要是对 PPT 部分内容的补充与拓展&#xff0c;建议结合使用&#xff08;当然也完全可以单看&#xff09;。 一、基础知识 1、从向量表示到词嵌入 这部分主要是参考如下文章&#xff0c;大部分图片均来自此文&#xff1a;The Illustrated Word2vec – Jay…

visio 2021入门直通车(一天全搞定)

安装Visio 2021 (64bit)安装教程 1.1. 模板类型 1.2. 界面布局 1.3. 插入对象 1.4. 添加页面 1.5. 全屏演示|页面自适应|visio文件切换 1.6. 快捷键 快捷键说明 Shift 鼠标滚轮 按下shift&#xff0c;点击鼠标滚轮水平页面滚动 鼠标滚轮 垂直页面滚动 Ctrl 鼠标滚轮 按…

Shiro-550—漏洞分析(CVE-2016-4437)

文章目录 漏洞原理源码分析加密过程解密过程 漏洞复现 漏洞原理 Shiro-550(CVE-2016-4437)反序列化漏洞 在调试cookie加密过程的时候发现开发者将AES用来加密的密钥硬编码了&#xff0c;并且所以导致我们拿到密钥后可以精心构造恶意payload替换cookie&#xff0c;然后让后台最…

海康HIK IN客户端使用帮助说明

HIK IN客户端是海康威视推出的一款配套公司USB相机的工具客户端。该软件不仅可以轻松的帮助用户实现画面的实时预览&#xff0c;而且支持用户USB接口连接&#xff0c;同时拥有AI参数配置等功能。 HIK IN提供了丰富的相机参数设置选项&#xff0c;能够帮助摄影师优化相机的性能&…