作者 雷海东

文件模板上传

... ... @@ -38,6 +38,7 @@
"@babel/parser": "7.7.4",
"@riophae/vue-treeselect": "0.4.0",
"axios": "0.24.0",
"bpmn-js-token-simulation": "0.10.0",
"clipboard": "2.0.8",
"core-js": "3.25.3",
"echarts": "5.4.0",
... ... @@ -56,11 +57,11 @@
"vue-count-to": "1.0.13",
"vue-cropper": "0.5.5",
"vue-meta": "2.4.0",
"vue-pdf": "^4.3.0",
"vue-router": "3.4.9",
"vuedraggable": "2.24.3",
"vuex": "3.6.0",
"xml-js": "1.6.11",
"bpmn-js-token-simulation": "0.10.0"
"xml-js": "1.6.11"
},
"devDependencies": {
"@vue/cli-plugin-babel": "4.4.6",
... ... @@ -68,6 +69,9 @@
"@vue/cli-service": "4.4.6",
"babel-eslint": "10.1.0",
"babel-plugin-dynamic-import-node": "2.3.3",
"bpmn-js": "7.5.0",
"bpmn-js-properties-panel": "0.37.2",
"camunda-bpmn-moddle": "4.4.1",
"chalk": "4.1.0",
"compression-webpack-plugin": "5.0.2",
"connect": "3.6.6",
... ... @@ -79,10 +83,7 @@
"sass-loader": "10.1.1",
"script-ext-html-webpack-plugin": "2.1.5",
"svg-sprite-loader": "5.1.1",
"vue-template-compiler": "2.6.12",
"bpmn-js": "7.5.0",
"bpmn-js-properties-panel": "0.37.2",
"camunda-bpmn-moddle": "4.4.1"
"vue-template-compiler": "2.6.12"
},
"engines": {
"node": ">=8.9",
... ...
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form
:model="queryParams"
ref="queryForm"
size="small"
:inline="true"
v-show="showSearch"
label-width="68px"
>
<el-form-item label="模板编号" prop="templateno">
<el-input
v-model="queryParams.templateno"
... ... @@ -26,8 +33,16 @@
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
<el-button
type="primary"
icon="el-icon-search"
size="mini"
@click="handleQuery"
>搜索</el-button
>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
>重置</el-button
>
</el-form-item>
</el-form>
... ... @@ -40,7 +55,8 @@
size="mini"
@click="handleAdd"
v-hasPermi="['system:contracttemplate:add']"
>新增</el-button>
>新增</el-button
>
</el-col>
<el-col :span="1.5">
<el-button
... ... @@ -51,7 +67,8 @@
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:contracttemplate:edit']"
>修改</el-button>
>修改</el-button
>
</el-col>
<el-col :span="1.5">
<el-button
... ... @@ -62,7 +79,8 @@
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:contracttemplate:remove']"
>删除</el-button>
>删除</el-button
>
</el-col>
<el-col :span="1.5">
<el-button
... ... @@ -72,23 +90,41 @@
size="mini"
@click="handleExport"
v-hasPermi="['system:contracttemplate:export']"
>导出</el-button>
>导出</el-button
>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
<right-toolbar
:showSearch.sync="showSearch"
@queryTable="getList"
></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="contracttemplateList" @selection-change="handleSelectionChange">
<el-table
v-loading="loading"
:data="contracttemplateList"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="模板编号" align="center" prop="templateno" />
<el-table-column label="模板名称" align="center" prop="templatename" />
<el-table-column label="模板文件" align="center" prop="templatefile" >
<el-table-column label="模板文件" align="center" prop="templatefile">
<template slot-scope="scope">
<a href="#" @click="showImage(scope.row.templatefile)" style="color: blue;cursor: pointer;">{{ scope.row.templatefile }}</a>
<el-button type="text" icon="el-icon-document" @click="openFile(scope.row.templatefile)">
打开文件
</el-button>
</template>
</el-table-column>
<el-table-column label="模板类别" align="center" prop="templatecategory" />
<el-table-column
label="模板类别"
align="center"
prop="templatecategory"
/>
<!-- <el-table-column label="" align="center" prop="id" v-if="true"/> -->
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<el-table-column
label="操作"
align="center"
class-name="small-padding fixed-width"
>
<template slot-scope="scope">
<el-button
size="mini"
... ... @@ -96,29 +132,38 @@
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:contracttemplate:edit']"
>修改</el-button>
>修改</el-button
>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:contracttemplate:remove']"
>删除</el-button>
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<!-- 在页面外部定义弹窗组件 -->
<el-dialog :visible.sync="dialogVisible">
<img :src="dialogImageUrl" alt="图片预览" style="width: 100%;">
</el-dialog>
<img :src="dialogImageUrl" alt="图片预览" style="width: 100%" />
</el-dialog>
<pagination
v-show="total>0"
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<el-dialog :visible.sync="dialogVisible" title="文件预览" width="50%">
<vue-pdf :src="currentFile" />
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">关闭</el-button>
</span>
</el-dialog>
<!-- 添加或修改【请填写功能名称】对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
... ... @@ -129,14 +174,52 @@
<el-input v-model="form.templatename" placeholder="请输入模板名称" />
</el-form-item>
<el-form-item label="模板文件" prop="templatefile">
<file-upload v-model="form.templatefile"/>
<!-- <file-upload v-model="form.templatefile"/> -->
<el-upload
class="upload-demo"
ref="upload"
:accept="'application/pdf'"
:before-upload="beforeUpload"
:action="this.url"
:headers="this.headers"
:on-preview="handlePreview"
:on-remove="handleRemove"
:on-change="handleChange"
:file-list="this.fileList"
:auto-upload="false"
:limit="1"
:multiple="false"
:on-success="handleSuccess"
:before-remove="beforeRemove"
:on-exceed="handleExceed"
name="files"
>
<el-button slot="trigger" size="small" type="primary"
>选取文件</el-button
>
<el-button
style="margin-left: 10px"
size="small"
type="success"
@click="submitUpload"
>上传到服务器</el-button
>
<div slot="tip" class="el-upload__tip">
只能上传大小不超过 5MB 的 PDF 文件
</div>
</el-upload>
</el-form-item>
<el-form-item label="模板类别" prop="templatecategory">
<el-input v-model="form.templatecategory" placeholder="请输入模板类别" />
<el-input
v-model="form.templatecategory"
placeholder="请输入模板类别"
/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
<el-button :loading="buttonLoading" type="primary" @click="submitForm"
>确 定</el-button
>
<el-button @click="cancel">取 消</el-button>
</div>
</el-dialog>
... ... @@ -144,14 +227,32 @@
</template>
<script>
import { listContracttemplate, getContracttemplate, delContracttemplate, addContracttemplate, updateContracttemplate } from "@/api/compliancemanagement/contracttemplate";
import {
listContracttemplate,
getContracttemplate,
delContracttemplate,
addContracttemplate,
updateContracttemplate,
} from "@/api/compliancemanagement/contracttemplate";
import { getToken } from "@/utils/auth";
import VuePdf from 'vue-pdf';
import axios from "axios";
export default {
components: {
VuePdf
},
name: "Contracttemplate",
data() {
return {
dialogVisible: false,
dialogImageUrl: '',
currentFile: '',
// 设置上传的请求头部
headers: { Authorization: "Bearer " + getToken() },
// 上传的地址
url: process.env.VUE_APP_BASE_API + "/common/uploads",
fileList: [],
dialogVisible: false,
dialogImageUrl: "",
// 按钮loading
buttonLoading: false,
// 遮罩层
... ... @@ -182,31 +283,87 @@ export default {
templatecategory: undefined,
},
// 表单参数
form: {},
form: {
},
file: [],
// 表单校验
rules: {
templateno: [
{ required: true, message: "模板编号不能为空", trigger: "blur" }
{ required: true, message: "模板编号不能为空", trigger: "blur" },
],
templatename: [
{ required: true, message: "模板名称不能为空", trigger: "blur" }
{ required: true, message: "模板名称不能为空", trigger: "blur" },
],
templatefile: [
{ required: true, message: "模板文件不能为空", trigger: "blur" }
{ required: true, message: "模板文件不能为空,请上传", trigger: "blur" },
],
templatecategory: [
{ required: true, message: "模板类别不能为空", trigger: "blur" }
{ required: true, message: "模板类别不能为空", trigger: "blur" },
],
id: [
{ required: true, message: "不能为空", trigger: "blur" }
],
}
id: [{ required: true, message: "不能为空", trigger: "blur" }],
},
};
},
created() {
this.getList();
},
methods: {
openFile(filePath) {
console.log(filePath)
this.currentFile = filePath;
this.dialogVisible = true;
},
beforeUpload(file) {
const isPDF = file.type === 'application/pdf';
const isLt5M = file.size / 1024 / 1024 < 5;
if (!isPDF) {
this.$message.error('只能上传 PDF 文件');
return false;
}
if (!isLt5M) {
this.$message.error('上传文件大小不能超过 5MB');
return false;
}
// 如果需要其他处理,可以在这里添加
return true; // 返回 true 允许上传
},
handleChange(file, fileList) {
this.fileList = fileList;
},
handleSuccess(response, file, fileList) {
// response 是上传成功后的响应数据
// 可以从中获取文件地址或文件名
// 假设后端返回的数据结构中有一个字段 url 表示文件地址
const fileUrl = response.data.fileNames;
// 将文件地址或文件名赋值给表单的字段
this.form.templatefile =fileUrl;
},
handleRemove(file, fileList) {
this.form.templatefile=''
console.log(file, fileList);
},
handlePreview(file) {
console.log(file);
},
handleExceed(files, fileList) {
this.$message.warning(
`当前限制上传 1 个文件,本次选择了 ${files.length} 个文件,共选择了 ${
files.length + fileList.length
} 个文件`
);
},
beforeRemove(file, fileList) {
this.fileList = fileList;
if (file && file.status==="success") {
return this.$confirm(`确定移除 ${file.name}?`);
}
},
showImage(imageUrl) {
this.dialogImageUrl = imageUrl;
this.dialogVisible = true;
... ... @@ -214,7 +371,7 @@ export default {
/** 查询【请填写功能名称】列表 */
getList() {
this.loading = true;
listContracttemplate(this.queryParams).then(response => {
listContracttemplate(this.queryParams).then((response) => {
this.contracttemplateList = response.rows;
this.total = response.total;
this.loading = false;
... ... @@ -236,7 +393,7 @@ export default {
createBy: undefined,
createTime: undefined,
updateBy: undefined,
updateTime: undefined
updateTime: undefined,
};
this.resetForm("form");
},
... ... @@ -252,9 +409,9 @@ export default {
},
// 多选框选中数据
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
this.ids = selection.map((item) => item.id);
this.single = selection.length !== 1;
this.multiple = !selection.length;
},
/** 新增按钮操作 */
handleAdd() {
... ... @@ -266,33 +423,46 @@ export default {
handleUpdate(row) {
this.loading = true;
this.reset();
const id = row.id || this.ids
getContracttemplate(id).then(response => {
const id = row.id || this.ids;
getContracttemplate(id).then((response) => {
this.loading = false;
this.form = response.data;
this.open = true;
this.title = "修改";
});
},
submitUpload() {
// 手动触发上传操作
// this.$refs.upload.submit()
// 构建 FormData 对象
this.$refs.upload.submit()
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
console.log("文件名:", this.form.templatefile);
this.$refs["form"].validate((valid) => {
if (valid) {
this.buttonLoading = true;
if (this.form.id != null) {
updateContracttemplate(this.form).then(response => {
updateContracttemplate(this.form)
.then((response) => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.fileList = [];
this.getList();
}).finally(() => {
})
.finally(() => {
this.buttonLoading = false;
});
} else {
addContracttemplate(this.form).then(response => {
addContracttemplate(this.form)
.then((response) => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.fileList = [];
this.getList();
}).finally(() => {
})
.finally(() => {
this.buttonLoading = false;
});
}
... ... @@ -302,24 +472,32 @@ export default {
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
this.$modal.confirm('是否确认删除【请填写功能名称】编号为"' + ids + '"的数据项?').then(() => {
this.$modal
.confirm('是否确认删除【请填写功能名称】编号为"' + ids + '"的数据项?')
.then(() => {
this.loading = true;
return delContracttemplate(ids);
}).then(() => {
})
.then(() => {
this.loading = false;
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {
}).finally(() => {
})
.catch(() => {})
.finally(() => {
this.loading = false;
});
},
/** 导出按钮操作 */
handleExport() {
this.download('system/contracttemplate/export', {
...this.queryParams
}, `contracttemplate_${new Date().getTime()}.xlsx`)
}
}
this.download(
"system/contracttemplate/export",
{
...this.queryParams,
},
`contracttemplate_${new Date().getTime()}.xlsx`
);
},
},
};
</script>
... ...