实验室运维前端-web
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

499 lines
17 KiB

<template>
<basic-container>
<avue-crud :option="option" :table-loading="loading" :data="data" :page.sync="page" ref="crud" v-model="form"
:permission="permissionList" :before-open="beforeOpen" @search-change="searchChange" @search-reset="searchReset"
@selection-change="selectionChange" @current-change="currentChange" @size-change="sizeChange"
@refresh-change="refreshChange" @on-load="onLoad" :upload-after="uploadAfter">
<template slot-scope="{row}" slot="menu">
<el-button size="small" v-show="permission.knowledgeView" @click="$refs.crud.rowView(row, index)">查看</el-button>
<el-button size="small" v-show="permission.knowledgeEdit" @click="$refs.crud.rowEdit(row, index)">编辑</el-button>
<el-button size="small" v-show="permission.knowledgeDelete" @click="rowDel(row)">删除</el-button>
<el-button size="small" v-show="row.attach.length != 0 && permission.knowledgeDownload" @click="handlePreview(row)">下载</el-button>
</template>
<template slot-scope="{row}" slot="fileName">
{{ row.attach.length > 0 ? row.attach.map(item => item.attachName).join(',') : '' }}
</template>
<template slot-scope="{row}" slot="imgUrlForm">
<el-upload class="upload-demo" action="/api/blade-resource/oss/endpoint/put-file" :on-remove="handleRemove"
:on-success="handleSuccess" multiple :limit="3" :on-exceed="handleExceed" :file-list="imgList"
:headers="headers">
<el-button size="small" type="primary">点击上传</el-button>
<div slot="tip" class="el-upload__tip">最多只能上传3个文件</div>
</el-upload>
</template>
<!-- <template slot-scope="{row}" slot="searchValueSearch">
<el-input style="margin-left: -80px;width: 305px;" placeholder="请输入故障等关键词"
v-model="form.searchValue"></el-input>
</template> -->
<template slot-scope="{row}" slot="publishSta">
<el-tag size="small" :type="row.publishSta == 1 ? '' : row.publishSta == 2 ? 'danger' : 'info'">{{
row.publishSta == 1 ? '已发布' : row.publishSta == 2 ? '已取消'
: '已保存'
}}</el-tag>
</template>
<!-- 自定义弹窗按钮 -->
<template slot-scope="{row,index,type}" slot="menuForm">
<el-button @click="handleCancel"> 取消</el-button>
<el-button v-show="type == 'add'" type="primary" size="small" @click="addPublish()">提交</el-button>
<el-button v-show="type == 'edit'" type="primary" size="small" @click="updatePublish()">提交</el-button>
</template>
</avue-crud>
<el-dialog width="70%" :visible.sync="dialogVisible" :append-to-body="true" :close-on-click-modal="false"></el-dialog>
</basic-container>
</template>
<script>
// import { getKnowledgeList, remove, add, getDetail, doPublish, addPublish, queryArticleDetail } from "@/api/articlelist/article";
import website from '@/config/website';
import { getKnowledgeList, addKnowledge, getDetail, editKnowledge, insertKnowledgeContent, updateKnowledge, deleteKnowledge } from '@/api/knowledge/knowledge'
import {getToken, removeToken, removeRefreshToken} from '@/util/auth';
import { mapGetters } from "vuex";
import JSZip from 'jszip';
import { saveAs } from 'file-saver';
export default {
data() {
return {
form: {},
query: {},
loading: true,
page: {
pageSize: 10,
currentPage: 1,
total: 0
},
dialogVisible: false,
selectionList: [],
option: {
searchShowBtn: false,
refreshBtn: false,
columnBtn: false,
height: 'auto',
calcHeight: 30,
tip: false,
searchShow: true,
searchMenuSpan: 6,
border: true,
index: true,
addBtn:true,
viewBtn: false,
saveBtn: false,
delBtn: false,
editBtn: false,
updateBtn: false,
cancelBtn: false,
dialogType: 'dialog',
dialogClickModal: false,
column: [
{
label: "知识类别",
labelWidth: 120,
span: 24,
prop: "dictKey",
type: "select",
formslot: true,
dicUrl: '/api/blade-system/dict-biz/child-list?current=1&size=100&parentId=1854791470553329666',
dicFormatter: (res) => {
return res.data[0].children
},
props: {
label: "dictValue",
value: "dictKey",
},
search: true
},
{
label: '附件',
labelWidth: 120,
prop: 'fileName',
slot: true,
editDisplay: false,
addDisplay: false,
viewDisplay:false
},
{
label: "知识库内容",
labelWidth: 120,
prop: "content",
component: 'AvueUeditor',
overHidden: true,
options: {
customConfig: {
menus: ['head', 'bold', 'fontSize', 'fontName', 'italic', 'underline', 'strikeThrough', 'foreColor', 'backColor', 'link', 'list', 'justify', 'quote', 'emoticon', 'table', 'code', 'undo', 'redo']
},
action: '/api/blade-resource/oss/endpoint/put-file',
props: {
home: this.website.filePrex,
res: "data",
url: "link",
}
},
minRows: 12,
span: 24,
html: true,
formatter: (val) => {
if (val.content) {
return '<div style="max-height:80px;overflow:hidden;">' + decodeURIComponent(val.content) + '</div>';
} else {
return '<div style="max-height:80px;overflow:hidden;">' + '' + '</div>';
}
}
},
{
label: '附件',
prop: 'imgUrl',
type: 'upload',
labelWidth: 120,
hide: true,
span: 24,
multiple: true,
propsHttp: {
url: 'link',
name: 'originalName',
res: 'data'
},
action: '/api/blade-resource/oss/endpoint/put-file',
formslot: true
},
]
},
data: [],
fileList: [],
imgList: [],
previewList: [],
headers:{},
};
},
computed: {
...mapGetters(["userInfo","permission"]),
ids() {
let ids = [];
this.selectionList.forEach(ele => {
ids.push(ele.id);
});
return ids.join(",");
}
},
mounted() {
this.headers = {
"Authorization":`Basic ${Base64.encode(`${website.clientId}:${website.clientSecret}`)}`,
'Blade-Auth':'bearer ' + getToken(),
'Blade-Requested-With':'BladeHttpRequest'
}
console.log('permission----------->',this.permission.knowledgeView)
this.option.addBtn = this.permission.knowledgeAdd ? true :false
console.log('optipon===============>',this.option)
},
methods: {
// 存在附件的知识库可进行预览操作
handlePreview(row) {
getDetail({ id: row.id }).then(res => {
this.previewList = res.data.data.attach
if (this.previewList.length > 1) {
const zip = new JSZip();
// 下载后压缩包的名称
const blogTitle = 'file.zip'
const cache = {};
const promises = [];
this.previewList.forEach(item => {
if (item.attachUrl) {
const promise = this.getFile(item.attachUrl).then(data => {
// *下载文件, 并存成ArrayBuffer对象
const arr_name = item.attachName.split("/");
const file_name = arr_name[arr_name.length - 1]; // *获取文件名
zip.file(file_name, data, { binary: true }); // *逐个添加文件
cache[file_name] = data;
});
promises.push(promise);
}
});
Promise.all(promises).then(() => {
zip.generateAsync({
type: "blob", compression: 'DEFLATE', // *STORE: 默认不压缩; DEFLATE:需要压缩
compressionOptions: {
level: 9 // *压缩等级 1~9。1: 压缩速度最快,9: 最优压缩方式
}
}).then(content => {
saveAs(content, blogTitle); // *生成二进制流,利用file-saver保存文件,文件名自定义
});
});
} else if (this.previewList.length == 1) {
// var a = document.createElement("a");
// console.log(a, this.previewList);
// var event = new MouseEvent("click");
// a.target = "_blank";
// a.download = this.previewList[0].attachName;
// a.href = this.previewList[0].attachUrl;//路径前拼上前缀,完整路径
// a.dispatchEvent(event);
fetch(this.previewList[0].attachUrl, {
method: 'get',
heanders: {
'Content-Type': 'application/json;charset=UTF-8'
}
})
.then(res => res.blob())
.then(blob => {
const link = document.createElement('a')
link.style.display = 'none'
link.download = this.previewList[0].attachName// 设置下载属性 以及文件名
link.href = URL.createObjectURL(blob)
document.body.appendChild(link)
link.click()
// 释放的 URL 对象以及移除 a 标签
URL.revokeObjectURL(link.href)
document.body.removeChild(link)
})
}
})
},
getFile(url) {
return new Promise((resolve, reject) => {
//通过请求获取文件blob格式
let xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", url, true);
xmlhttp.responseType = "blob";
xmlhttp.onload = function () {
if (xmlhttp.status == 200) {
resolve(xmlhttp.response);
} else {
reject(xmlhttp.response);
}
};
xmlhttp.send();
});
},
// 文件上传成功钩子
handleSuccess(response, file, fileList) {
this.fileList.push({
attachName: response.data.originalName,
attachUrl: response.data.link
})
},
// 文件删除钩子
handleRemove(file, fileList) {
this.imgList = this.imgList.filter(item => item.link != file.link)
this.fileList = this.fileList.filter(item => item.attachUrl != file.link)
},
//富文本编辑器上传
uploadAfter(res, done) {
this.fileList.push({
attachUrl: res.link,
// 附件名称
attachName: res.originalName,
})
done();
},
//发布
rowPublish(row) {
this.$confirm("确定" + (row.publishSta == 1 ? "取消发布该条数据吗" : "发布该条数据吗") + "?", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
if (row.publishSta != 1) {
//发布之前判断是否已有发布
queryArticleDetail(this.userInfo.dept_id).then(res => {
if (JSON.stringify(res.data.data) != '{}') {
//一个医院只可以发布一条
this.$confirm("只可以发布一条须知,确认发布将会把已发布须知取消发布!", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
this.doSurePublish(row);
});
} else {
this.doSurePublish(row);
}
})
} else {
//取消发布不需要限制
this.doSurePublish(row);
}
});
},
//二次确认发布-取消发布
doSurePublish(row) {
doPublish(row.id, row.publishSta == 1 ? 0 : 1).then(res => {
this.onLoad(this.page);
this.$message({
type: "success",
message: "操作成功!"
});
})
},
rowUpdate(row, index, done, loading) {
row.content = encodeURIComponent(row.content);
add(row).then(() => {
this.onLoad(this.page);
this.$message({
type: "success",
message: "操作成功!"
});
done();
}, error => {
window.console.log(error);
loading();
});
},
// 取消
handleCancel() {
this.$refs.crud.closeDialog()
this.fileList = []
},
//知识库弹窗提交按钮
addPublish() {
let param = this.form;
param.createDept = this.userInfo.dept_id;
param.content = encodeURIComponent(param.content);
let query = {
dictKey: param.dictKey,
content: param.content,
userId: this.userInfo.user_id,
attach: this.fileList
}
insertKnowledgeContent(query).then(res => {
if (res.data.code == 200) {
this.$message.success('知识库新增成功')
this.$refs.crud.closeDialog()
this.fileList = []
this.imgList = []
this.onLoad(this.page)
}
})
},
updatePublish() {
let params = JSON.parse(JSON.stringify(this.form))
params.content = encodeURIComponent(params.content);
let query = {
id: params.id,
dictKey: params.dictKey,
content: params.content,
userId: this.userInfo.user_id,
attach: this.fileList
}
updateKnowledge(query).then(res => {
if (res.data.code == 200) {
this.$message.success('知识库编辑成功')
this.$refs.crud.closeDialog()
this.fileList = []
this.imgList = []
this.onLoad(this.page)
}
})
},
rowDel(row) {
this.$confirm("确定将选择数据删除?", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
return deleteKnowledge(row.id);
})
.then(() => {
this.onLoad(this.page);
this.$message({
type: "success",
message: "操作成功!"
});
});
},
searchReset() {
this.query = {};
this.onLoad(this.page);
},
searchChange(params, done) {
this.query = params;
this.page.currentPage = 1;
this.onLoad(this.page, params);
done();
},
selectionChange(list) {
this.selectionList = list;
},
selectionClear() {
this.selectionList = [];
this.$refs.crud.toggleSelection();
},
handleDelete() {
if (this.selectionList.length === 0) {
this.$message.warning("请选择至少一条数据");
return;
}
this.$confirm("确定将选择数据删除?", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
return remove(this.ids);
})
.then(() => {
this.onLoad(this.page);
this.$message({
type: "success",
message: "操作成功!"
});
this.$refs.crud.toggleSelection();
});
},
beforeOpen(done, type) {
console.log('type', type)
if (["edit", "view"].includes(type)) {
getDetail({ id: this.form.id }).then(res => {
res.data.data.content = decodeURIComponent(res.data.data.content);
this.form = res.data.data;
let imgData = []
this.fileList = []
res.data.data.attach.length > 0 && res.data.data.attach.map(item => {
imgData.push({
link: item.attachUrl,
name: item.attachName
})
this.fileList = res.data.data.attach
})
this.form = {
...this.form,
imgUrl: imgData
}
this.imgList = imgData
done();
});
} else if (['add'].includes(type)) {
this.imgList = []
this.fileList = []
done();
}
},
currentChange(currentPage) {
this.page.currentPage = currentPage;
},
sizeChange(pageSize) {
this.page.pageSize = pageSize;
},
refreshChange() {
this.onLoad(this.page, this.query);
},
onLoad(page, params = {}) {
// console.log(this.userInfo)
console.log('query--------->', this.query)
this.loading = true;
getKnowledgeList({ current: page.currentPage, size: page.pageSize, dictKey: this.query.dictKey ? this.query.dictKey : '' }).then(res => {
const data = res.data.data;
this.page.total = data.total;
this.data = data.records;
this.loading = false;
this.selectionClear();
});
}
}
};
</script>
<style></style>