提交 6187ea81 authored 作者: 龙菲's avatar 龙菲

对接待审核文物列表接口、优化文物上传和修改的逻辑处理

上级 7a27ee63
import request from '@/utils/request'
// 带权限查询审核分页数据
export function getFlowListPagePer(data) {
return request({
url: '/bizFlow/listByPagePer',
method: 'post',
data
})
}
// 通过流程id查询流程详情
export function getFlowDetailById(params) {
return request({
url: '/bizFlow/detailById',
method: 'get',
params
})
}
// 查询流程关联的文物详情(手动添加的文物详情)
export function getFlowCulturalRelicDetail(params) {
return request({
url: '/bizFlow/flowCulturalRelicDetail',
method: 'get',
params
})
}
// 查询流程关联的展览详情(手动添加的展览详情)
export function getFlowExhibitionDetail(params) {
return request({
url: '/bizFlow/flowExhibitionDetail',
method: 'get',
params
})
}
// 带权限分页查询流程关联的文物信息
export function getListFlowCulturalRelicByPage(data) {
return request({
url: '/bizFlow/listFlowCulturalRelicByPage',
method: 'post',
data
})
}
// 带权限查询审核分页数据
export function getListByPagePer(data) {
return request({
url: '/bizFlow/delete',
method: 'post',
data
})
}
\ No newline at end of file
// 目前文物存在2张表,一张临时表和中间表,只有审核通过的在最终表,未审核和审核驳回等在临时表
// 新增和修改也只是存在临时表
// 最终表的数据不能修改
import request from '@/utils/request'
export function getCulturalRelicList(data) {
......@@ -8,6 +12,7 @@ export function getCulturalRelicList(data) {
})
}
// 获取带权限的文物列表分页(最终表)
export function getCulturalRelicListPer(data) {
return request({
url: '/bizCulturalRelic/listByPagePer',
......@@ -16,7 +21,27 @@ export function getCulturalRelicListPer(data) {
})
}
// 获取带权限的文物列表分页(临时表)
export function getCulturalRelicListPerTemp(data) {
return request({
url: '/bizCulturalRelicTemp/listByPagePer',
method: 'post',
data
})
}
// 文物新增和修改(临时表)
export function addOrUpdateCulturalRelic(data) {
return request({
url: '/bizCulturalRelicTemp/addOrUpdate',
method: 'post',
data
})
}
// 新增文物(最终表),因为多了临时表暂时废弃
export function addCulturalRelic(data) {
return request({
url: '/bizCulturalRelic/add',
......@@ -25,6 +50,7 @@ export function addCulturalRelic(data) {
})
}
// 修改文物(最终表),因为多了临时表暂时废弃
export function editCulturalRelic(data) {
return request({
url: '/bizCulturalRelic/update',
......@@ -33,7 +59,7 @@ export function editCulturalRelic(data) {
})
}
// 根据文物id查询详情
// 根据文物id查询详情(最终表)
export function getRCDetailById(params) {
return request({
url: '/bizCulturalRelic/listById',
......@@ -42,6 +68,17 @@ export function getRCDetailById(params) {
})
}
// 根据文物id查询详情(临时表)
export function getRCDetailByIdTemp(params) {
return request({
url: '/bizCulturalRelicTemp/detailById',
method: 'get',
params
})
}
// 删除文物(最终表)
export function deleteCultralRelic(data) {
return request({
url: '/bizCulturalRelic/delete',
......@@ -50,6 +87,15 @@ export function deleteCultralRelic(data) {
})
}
// 删除文物(临时表)
export function deleteCultralRelicTemp(data) {
return request({
url: '/bizCulturalRelicTemp/delete',
method: 'delete',
data
})
}
// 获取文物数量统计
export function getCulturalRelicStatistic(params) {
return request({
......
// 目前展览存在2张表,一张临时表和中间表,只有审核通过的在最终表,未审核和审核驳回等在临时表
// 新增和修改也只是存在临时表
// 最终表的数据不能修改
import request from '@/utils/request'
// 获取布展列表
......@@ -9,7 +13,7 @@ export function getList(data) {
})
}
// 获取布展列表
// 获取布展列表(最终表)
export function getListPer(data) {
return request({
url: '/bizExhibition/listByPagePer',
......@@ -18,7 +22,27 @@ export function getListPer(data) {
})
}
// 新增
// 获取布展列表(临时表)
export function getListPerTemp(data) {
return request({
url: '/bizExhibitionTemp/listByPagePer',
method: 'post',
data
})
}
// 新增修改(临时表)
export function addOrUpdateDisplayTemp(data) {
return request({
url: '/bizExhibitionTemp/addOrUpdate',
method: 'post',
data
})
}
// 新增(最终表),因为最终表不允许修改所以废弃
export function addDisplay(data) {
return request({
url: '/bizExhibition/add',
......@@ -26,6 +50,7 @@ export function addDisplay(data) {
data
})
}
// 修改(最终表),因为最终表不允许修改所以废弃
export function editDisplay(data) {
return request({
url: '/bizExhibition/update',
......@@ -34,6 +59,7 @@ export function editDisplay(data) {
})
}
// 修改展览(最终表)
export function getDisplayById(params) {
return request({
url: '/bizExhibition/listById',
......@@ -42,6 +68,16 @@ export function getDisplayById(params) {
})
}
// 修改展览(临时表)
export function getDisplayByIdTemp(params) {
return request({
url: '/bizExhibitionTemp/detailById',
method: 'get',
params
})
}
// 删除展览(最终表)
export function deleteDisplay(data) {
return request({
url: '/bizExhibition/delete',
......@@ -49,6 +85,15 @@ export function deleteDisplay(data) {
data
})
}
// 删除展览(临时表)
export function deleteDisplayTemp(data) {
return request({
url: '/bizExhibitionTemp/delete',
method: 'delete',
data
})
}
// 获取展览数量统计
export function getExhibitionStatistic(params) {
......@@ -59,14 +104,6 @@ export function getExhibitionStatistic(params) {
})
}
// 获取展览审核列表
// export function getDisplayChecklist(data) {
// return request({
// url: '/bizExhibition/checklistByPagePer',
// method: 'post',
// data
// })
// }
// 查询审批结果
export function getDisplayCheckById(params) {
......
......@@ -8,6 +8,7 @@
<script>
import { mapGetters } from "vuex";
export default {
name: "DictText",
props: {
// 字典名称,必填
name: {
......
### 全局组件注册操作说明
注册在全局的组件无需引入即可直接使用
1.在 index.js 中引入需要导入的组件
2.并在数组中添加该组件
#### 注意事项
必须保证组件的 name 和组件本身名称一致,否则无法注册成功
......@@ -5,6 +5,7 @@
<script>
export default {
name: "RichTextShow",
props: {
richText: {
type: String,
......
......@@ -7,14 +7,14 @@
>
<el-input
v-if="item.type == 'input'"
v-model="searchData[item.prop]"
v-model="searchForm[item.prop]"
:placeholder="`请输入${item.placeholder || item.label}`"
@keyup.enter.native="handleSearch"
clearable
></el-input>
<el-select
v-if="item.type == 'select'"
v-model="searchData[item.prop]"
v-model="searchForm[item.prop]"
:placeholder="`请选择${item.placeholder || item.label}`"
clearable
filterable
......@@ -25,12 +25,11 @@
:value="option.value"
v-for="option in item.selectOptions"
:key="option.value"
></el-option>
</el-select>
<el-date-picker
v-if="item.type == 'dateTimeRange'"
v-model="searchData[item.prop]"
v-model="searchForm[item.prop]"
type="datetimerange"
align="right"
start-placeholder="开始日期"
......@@ -40,9 +39,12 @@
:value-format="'yyyy-MM-dd HH:mm:ss'"
>
</el-date-picker>
<el-checkbox v-if="item.type=='checkbox'" v-model="searchData[item.prop]"></el-checkbox>
<el-checkbox
v-if="item.type == 'checkbox'"
v-model="searchForm[item.prop]"
></el-checkbox>
</el-form-item>
<el-form-item style="margin-left:26px">
<el-form-item style="margin-left: 26px">
<el-button
type="primary"
icon="el-icon-search"
......@@ -73,49 +75,12 @@ export default {
type: Array,
default: () => [],
},
/**
*
* form:{
name:'',
status:''
}
config: [
{
prop: "name",
type: "input",
label: "展览名称",
},
{
prop: "status",
type: "select",
label: "状态",
selectOptions: [
{
label: "在线",
value: "true",
},
{
label: "离线",
value: "false",
},
],
},
],
*
*
*/
},
watch: {
config: {
handler: function (value) {
if (value) {
var obj = {};
this.config.map((item) => {
obj[item.prop] = "";
});
this.searchData = JSON.parse(JSON.stringify(obj));
this.searchForm = this.getSearchFormInitialValue(value);
}
},
immediate: true,
......@@ -124,7 +89,7 @@ export default {
},
data() {
return {
searchData: {},
searchForm: {},
pickerOptions: {
shortcuts: [
{
......@@ -159,11 +124,23 @@ export default {
};
},
methods: {
// 获取searchForm初始值
getSearchFormInitialValue(config) {
let form = {};
config.map((item) => {
if (item.type == "checkbox") {
form[item.prop] = false;
} else {
form[item.prop] = "";
}
});
return JSON.parse(JSON.stringify(form));
},
handleSearch() {
this.$emit("search", this.searchData);
this.$emit("search", this.searchForm);
},
handleReset() {
this.searchData = {};
this.searchForm = this.getSearchFormInitialValue(this.config);
this.$emit("reset");
},
handleSelectChange() {
......@@ -177,8 +154,7 @@ export default {
</script>
<style lang="scss" scoped>
::v-deep .el-form-item{
::v-deep .el-form-item {
margin-bottom: 0;
}
</style>
\ No newline at end of file
</style>
......@@ -42,7 +42,7 @@
<script>
export default {
name: "TableComponent",
name: "TableOperation",
props: {
operations: {
type: Array,
......
<template>
<div class="images-list">
<!-- <el-upload :disabled="onlyRead" action="#" :on-remove="handleRemove" :on-exceed="handleExceed" :on-change="handleChange"
:file-list="fileList" :multiple="fileLimit > 1" :limit="fileLimit" :list-type="listType" :accept="fileAccept"
:auto-upload="false" ref="ManualUploader" :class="{ disabled: uploadDisabled || onlyRead }">
<i v-if="listType === 'picture-card'" class="el-icon-plus" slot="trigger" ></i>
<el-button size="small" type="primary" v-else-if="!onlyRead">点击上传</el-button>
<div v-if="(showTip && !onlyRead)" slot="tip" class="el-upload__tip">
<div v-if="advice" style="color: #f56c6c">建议:{{ advice }}</div>
提示:只能上传{{ fileTypeName || "jpg/png" }}文件,且不超过
{{ fileSize }}MB,最多上传{{ fileLimit }}个文件
</div>
</el-upload> -->
<el-upload
action="#"
:on-remove="handleRemove"
......
import DictText from './DictText/index.vue'//字典文字显示
import TextShow from './TextShow/index.vue'//富文本文字显示
import RichTextShow from './RichTextShow/index.vue'//富文本文字显示
import SearchBar from './SearchBar/index.vue'//富文本文字显示
import TablePage from "./Table/TablePage.vue";//分页
import TableOperation from "./Table/TableOperation.vue";//分页操作
import ManualUploader from "./Uploader/ManualUploader.vue";//上传文件组件
import VueQuillEditor from "@/components/VueQuillEditor";//富文本编辑器
import ElImageViewer from "element-ui/packages/image/src/image-viewer"
export default {
const components = [DictText, RichTextShow, SearchBar, TablePage, TableOperation, ElImageViewer, ManualUploader, VueQuillEditor]
const plugins = {
install(Vue) {
//注册全局组件
Vue.component('DictText', DictText)
Vue.component('TextShow', TextShow)
components.forEach((component) => {
Vue.component(component.name, component)
})
}
}
\ No newline at end of file
}
export default plugins
\ No newline at end of file
......@@ -12,17 +12,14 @@ import '@/permission' // permission control
import VideoPlayer from 'vue-video-player'
import 'video.js/dist/video-js.css'
import 'vue-video-player/src/custom-theme.css'
import {
getFullUrl
} from '@/utils/index'
import { file } from '@/utils/file'
import * as echarts from 'echarts';
import Components from '@/components'
Vue.use(Components)
Vue.prototype.$getFullUrl = getFullUrl
Vue.prototype.$echarts = echarts
Vue.prototype.$file = file
// 导入批量注册的组件
import plugins from './components'
import '@/utils/globalFunctions'
// 注册导入的插件
Vue.use(plugins)
Vue.use(ElementUI)
Vue.use(VideoPlayer)
Vue.config.productionTip = false
......
// 本文件放置一些全局使用的方法,统一管理方便修改
import Vue from 'vue'
import {
getFullUrl
} from '@/utils/index'
import { file } from '@/utils/file'
import * as echarts from 'echarts';
Vue.prototype.$getFullUrl = getFullUrl //获取文件的完整链接
Vue.prototype.$echarts = echarts //Echarts
Vue.prototype.$file = file //文件操作
\ No newline at end of file
......@@ -61,30 +61,24 @@
</el-pagination>
</div>
<div class="dialog-footer">
<el-button type="primary" size="mini" @click.native="handleClose">关闭</el-button>
<el-button type="primary" size="mini" @click.native="handleClose"
>关闭</el-button
>
</div>
</el-dialog>
</template>
<script>
import TablePage from "@/components/Table/TablePage.vue";
import TableOperation from "@/components/Table/TableOperation.vue";
import {
importRecordsTitle,
importOperates,
importOperations,
} from "../config";
import { parseTime, getYestoday ,renderSize} from "@/utils/index";
} from "../configs/import";
import { parseTime, getYestoday, renderSize } from "@/utils/index";
import { getImportListPage, deleteByBatchNum } from "@/api/file";
import SearchBar from "@/components/SearchBar";
export default {
name: "ImportRecordDialog",
components: {
TablePage,
TableOperation,
SearchBar,
},
props: {
visible: {
type: Boolean,
......@@ -100,7 +94,7 @@ export default {
handler: function (value) {
this.dialogVisible = value;
if (value) {
this.loadData()
this.loadData();
}
},
deep: true,
......@@ -121,9 +115,9 @@ export default {
// return (fileSize) => {
// return (Number(fileSize) / 1024 / 1024).toFixed(2) + "M";
// };
return (fileSize)=>{
return renderSize(Number(fileSize))
}
return (fileSize) => {
return renderSize(Number(fileSize));
};
},
isToday(time) {
......@@ -187,7 +181,7 @@ export default {
var params = {
page: this.list.current,
limit: this.list.size,
type:"biz_cultural_relic",
type: "biz_cultural_relic",
...form,
};
let res = await getImportListPage(params);
......@@ -205,7 +199,7 @@ export default {
var params = {
page: this.list.current,
limit: this.list.size,
type:'biz_cultural_relic'
type: "biz_cultural_relic",
};
let res = await getImportListPage(params);
if (res.code == 0) {
......@@ -245,7 +239,7 @@ export default {
};
</script>
<style lang='scss' scoped>
<style lang="scss" scoped>
.title {
display: flex;
.divider {
......@@ -282,4 +276,4 @@ export default {
.pagination {
margin: 16px;
}
</style>
\ No newline at end of file
</style>
......@@ -277,19 +277,13 @@
<script>
import { getLiteratureList } from "@/api/literature";
import { addCulturalRelic, editCulturalRelic } from "@/api/culturalRelic";
import ManualUploader from "@/components/Uploader/ManualUploader.vue";
import { addOrUpdateCulturalRelic } from "@/api/culturalRelic";
import { mapGetters } from "vuex";
import { uploadV1 } from "@/utils/file";
import { deleteFiles } from "@/api/file";
import VueQuillEditor from "@/components/VueQuillEditor";
import fileUploadFunctions from "./fileUploadFuctions";
export default {
name: "InfoEditDialog",
components: {
ManualUploader,
VueQuillEditor,
},
props: {
visible: {
type: Boolean,
......@@ -428,19 +422,12 @@ export default {
},
rules: {
name: [{ required: true, message: "请输入文物名称", trigger: "blur" }],
// faceImage: [
// { required: true, message: "请上传封面", trigger: "change" },
// ],
// faceImage: [
// { required: true, validator: checkFaceImage, trigger: "change" },
// ],
deptId: [
{ required: true, message: "请填写馆藏单位", trigger: "change" },
],
// intro: [{ required: true, message: "请输入馆藏介绍", trigger: "blur" }],
intro: [{ required: true, validator: checkIntro, trigger: "blur" }],
},
mediaKeys: ["faceImage", "images", "videos", "audios"], //表单中的媒体
};
},
async created() {
......@@ -501,112 +488,14 @@ export default {
handleSubmit() {
this.$refs.form.validate(async (valid, err) => {
if (valid) {
var that = this;
const that = this;
this.submitLoading = true;
let formData = new FormData();
// 已存在的文件的对象
let successFilesObj = [];
// 需要被删除的文件Id
let deleteFileArr = [];
// debugger
// 添加布展本身的媒体文件至formData
const mediaArr = ["faceImage", "images", "videos", "audios"];
let newFiles = {};
// debugger;
mediaArr.map((media) => {
let files = [...this.$refs[media].getFiles()];
let fileIds = [];
files.map((f) => {
// switch (f.status) {
// case "ready":
// formData.append(media, f.raw);
// break;
// case "success":
// if (successFilesObj[media]) {
// successFilesObj[media].push(f);
// } else {
// successFilesObj[media] = [f];
// }
// fileIds.push(f.fileId);
// break;
// }
if (f.status && f.status == "ready") {
console.log(media, "---", f.raw);
formData.append(media, f.raw);
} else {
if (successFilesObj[media]) {
successFilesObj[media].push(f);
} else {
successFilesObj[media] = [f];
}
fileIds.push(f.fileId);
}
});
newFiles[media] = fileIds;
});
mediaArr.map((media) => {
if (this.dialogForm[media]) {
let oldFileIdArr = this.dialogForm[media].split(",");
oldFileIdArr.map((oldId) => {
if (newFiles[media].indexOf(oldId) == -1) {
console.log(oldId + "将被删除");
deleteFileArr.push(oldId);
}
});
}
});
// return;
// 上传所有媒体文件
let filesObj = {};
var formDataArr = Array.from(formData.entries(), ([key, prop]) => ({
[key]: {
ContentLength: typeof prop === "string" ? prop.length : prop.size,
},
}));
// formData有长度时再进行上传
if (formDataArr.length > 0) {
this.loadingText = "正在上传文件...请耐心等待";
let upLoadRes = await uploadV1(formData);
if (upLoadRes.code == 0) {
upLoadRes.data.map((resFile) => {
if (filesObj[resFile.fileKey]) {
filesObj[resFile.fileKey].push(resFile.fileId);
} else {
filesObj[resFile.fileKey] = [resFile.fileId];
}
});
}
}
// 1、回填之前先获取已存在的文件
for (const key in successFilesObj) {
// 如果文件id中含有已上传成功的某个key,如images,则将已上传成功的images推入文件id集合
if (filesObj[key]) {
successFilesObj[key].map((sf) => {
filesObj[key].push(sf.fileId);
});
} else {
let ids = [];
successFilesObj[key].map((sf) => {
ids.push(sf.fileId);
});
filesObj[key] = ids;
}
}
// return;
// 2、回填布展自带的媒体文件
mediaArr.forEach((media) => {
if (filesObj[media]) {
this.dialogForm[media] = filesObj[media].join(",");
} else {
this.dialogForm[media] = "";
}
});
this.uploadMediaFiles(this.mediaKeys);
return;
if (!that.dialogForm.crId) {
this.loadingText = "正在处理文物数据...请耐心等待";
// const { deptId, regionCode } = this.userInfo;
const params = { ...this.dialogForm };
const params = Object.assign(this.dialogForm, uploadedObj);
params.literature = this.literatureValues.join(",");
params.status = this.dialogForm.status ? 1 : 0;
// 处理年份
......@@ -637,12 +526,8 @@ export default {
} else {
this.loadingText = "正在处理文物数据...请耐心等待";
const params = { ...this.dialogForm };
// debugger
// return
params.literature = this.literatureValues.join(",");
params.status = this.dialogForm.status ? 1 : 0;
// return;
// 处理年份
if (params.years instanceof Array) {
params.years = params.years[params.years.length - 1];
}
......@@ -656,9 +541,7 @@ export default {
if (params.deptId instanceof Array) {
params.deptId = params.deptId[params.deptId.length - 1];
}
if (deleteFileArr.length > 0) {
await deleteFiles(deleteFileArr);
}
// return;
editCulturalRelic(params)
.then((res) => {
......@@ -681,6 +564,93 @@ export default {
}
});
},
/**
* @param {array} fileArr 需要被删除的文件ID数组
*/
async handleDeleteFiles(fileArr) {
if (fileArr.length == 0) {
return;
}
await deleteFiles(fileArr);
},
async uploadMediaFiles(mediaKeys) {
const {
getNeedUploadFormData,
getNewIdsObj,
getOldIdsObj,
getMergedIdsObj,
getDeleteFileArr,
} = fileUploadFunctions;
// formData有长度时再进行上传
const formData = getNeedUploadFormData(this, mediaKeys);
if (isFormDataHasData(formData)) {
this.loadingText = "正在上传文件...请耐心等待";
let upLoadRes = await uploadV1(formData);
if (upLoadRes.code == 0) {
// 新的已上传的文件ID对象
const newIdObj = getNewIdsObj(upLoadRes.data);
// 已存在的的文件ID对象
const oldIdObj = getOldIdsObj(mediaKeys);
const mergedIdObj = getMergedIdsObj(oldIdObj, newIdObj, mediaKeys);
// 需要被删除的文件ID对象
const deleteIdArr = getDeleteFileArr(oldIdObj, newIdObj, mediaKeys);
console.log("mergedFileIdsObj", mergedIdObj);
console.log("deleteFiles", deleteIdArr);
}
}
},
/**
* 上传对应的媒体文件,并获取媒体文件的id字符串合集
* @param {array} dialogForm 当前需要提交的表单
* @param {array} mediaKeys 媒体keys数组
* @returns {object} 传入的媒体key对应的id字符串,多个以逗号隔开
*/
async getMediaUploadedIdsObj(mediaKeys, dialogForm) {
// 上传新的媒体
// // 获取未上传之前的所有文件id合集,包括已存在的ID和刚添加但未上传至后台的ID
// // 用于判断文件是否被删除
// function getAllFileIdsObj(mediaKeys) {
// let allFileIdsObj = {};
// mediaKeys.map((media) => {
// let files = [...this.$refs[media].getFiles()];
// let fileIds = [];
// files.map((f) => {
// if (!isFileRaw(f)) {
// fileIds.push(f.fileId);
// }
// });
// allFileIdsObj[media] = fileIds;
// return allFileIdsObj;
// });
// }
// // 1、回填之前先获取已存在的文件
// for (const key in successFilesObj) {
// // 如果文件id中含有已上传成功的某个key,如images,则将已上传成功的images推入文件id集合
// if (filesObj[key]) {
// successFilesObj[key].map((sf) => {
// filesObj[key].push(sf.fileId);
// });
// } else {
// let ids = [];
// successFilesObj[key].map((sf) => {
// ids.push(sf.fileId);
// });
// filesObj[key] = ids;
// }
// }
// // return;
// // 2、回填布展自带的媒体文件
// mediaKeys.forEach((media) => {
// if (filesObj[media]) {
// this.dialogForm[media] = filesObj[media].join(",");
// } else {
// this.dialogForm[media] = "";
// }
// });
},
handleClose(done) {
this.$confirm("确认关闭?")
......
const fileUploadFuctions = {
name: '123',
/**
* 判断文件是否上传过
* @param {File | Object} file 文件对象,可能是File可能就是普通对象
* @returns {Boolean} 文件是否上传过
*/
isFileRaw(file) {
let isFileRaw = false;
isFileRaw = file.status && file.status == "ready";
return isFileRaw;
},
/**
* 判断formData中是否有数据
* @param {FormData} formData 文件对象,可能是File可能就是普通对象
* @returns {Boolean} formData中是否有数据
*/
isFormDataHasData(formData) {
const formDataArr = Array.from(formData.entries(), ([key, prop]) => ({
[key]: {
ContentLength: typeof prop === "string" ? prop.length : prop.size,
},
}));
return formDataArr.length > 0;
},
/**
* 获取对应媒体下的文件
* @param {string} mediaKey 媒体key
* @returns {Array} 媒体对应的文件
*/
getMediaFile($el, mediaKey) {
return $el.$refs[mediaKey].getFiles();
},
/**
* 获取需要上传的FormData
* @param {Array} mediaKeys 媒体keys数组
* @returns {FormData} formData 需要上传的formdata
*/
getNeedUploadFormData($el, mediaKeys) {
const formData = new FormData();
const self = this; // 保存正确的 this
mediaKeys.map((mediaKey) => {
const currentFileList = self.getMediaFile($el, mediaKey);
currentFileList.map((file) => {
if (self.isFileRaw(file)) {
formData.append(mediaKey, file.raw);
}
});
});
return formData;
},
/**
* 获取需要已经存在(数据库已存储的)文件ID对象
* @param {Array} mediaKeys 媒体keys数组
* @returns {Object} 已经存在(数据库已存储的)文件ID对象
*/
getOldIdsObj(mediaKeys, dialogForm) {
let oldFileIdsObj = {};
mediaKeys.forEach((key) => {
if (dialogForm[key]) {
oldFileIdsObj[key] = dialogForm[key];
} else {
oldFileIdsObj[key] = "";
}
});
return oldFileIdsObj;
},
/**
* 获取返回结果中的文件id对象
* @param {Array} mediaKeys 媒体keys数组
* @param {Object} requestRes 上传返回的数据对象
* @returns {Object} 新上传的文件id对象
*/
getNewIdsObj(mediaKeys, requestRes) {
let newUploadedFileIdsObj = {};
mediaKeys.forEach((key) => {
newUploadedFileIdsObj[key] = this.getResIdStrByMedia(key, requestRes);
});
return newUploadedFileIdsObj;
},
/**
* 获取上传返回结果中的id字符串
* @param {Array} mediaKeys 媒体keys数组
* @param {Object} requestRes 上传返回的数据对象
* @returns {string} 新上传的文件id字符串
*/
getResIdStrByMedia(mediaKey, requestRes) {
const arr = [];
requestRes.data.forEach((item) => {
if (item.fileKey == mediaKey) {
arr.push(item.fileId);
}
});
const str = arr.length > 0 ? arr.join(",") : "";
return str;
},
/**
* 获取新旧合并的文件id对象
* @param {Array} mediaKeys 媒体keys数组
* @param {Object} oldObj 已经存在的
* @param {Object} newObj 新上传的
* @returns {string} 新上传的文件id字符串
*/
getMergedIdsObj(oldObj, newObj, mediaKeys) {
const obj = {};
mediaKeys.forEach((key) => {
newArr = newObj[key].split(",");
oldArr = oldObj[key].split(",");
let fullArr = new Set([...newArr, ...oldArr]);
let fullStr = fullArr.join(",");
obj[key] = fullStr;
});
return obj;
},
/**
* 获取需要被删除的文件ID合集
* @param {Array} mediaKeys 媒体keys数组
* @param {Object} dialogForm 表单对象
* @param {Object} newUploadedFileIdsObj 最新上传之后的
* @returns {Object} 新上传的文件id对象
*/
getDeleteFileArr(oldObj, newObj, mediaKeys) {
const arr = [];
mediaKeys.forEach((key) => {
newArr = newObj[key].split(",");
oldArr = oldObj[key].split(",");
let fullArr = new Set([...newArr, ...oldArr]);
oldArr.forEach((oldId) => {
if (!fullArr.includes(oldId)) {
arr.push(oldId);
}
});
});
return arr;
}
}
export default fileUploadFuctions
\ No newline at end of file
// 文物导入的配置文件
export const importRecordsTitle = [{
prop: "createTime",
label: "导入时间",
columnAlign: "left",
needTimeTag: true,
},
{
prop: "batchNum",
label: "导入批次",
columnAlign: "center",
},
{
prop: "fileName",
label: "文件名称",
columnAlign: "center",
width: 300
},
{
prop: "fileSize",
label: "文件大小",
columnAlign: "center",
},
{
prop: "remark",
label: "备注",
columnAlign: "center",
width: "60px",
},
]
export const importOperates = {
operate: true,
label: "操作",
width: "220px",
minwidth: "220px",
titleAlign: "center",
columnAlign: "center",
}
export const importOperations = [{
type: 'delete',
title: '删除记录及文物'
},]
\ No newline at end of file
// 文物分页的配置
export const passedTitle = [{
prop: "name",
label: "名称",
......@@ -254,14 +255,11 @@ export const operates = {
label: "操作",
titleAlign: "center",
columnAlign: "center",
width: "280px",
width: "180px",
}
export const operations = [
{
type: 'view3D',
title: '查看3D文物'
},
// 操作(临时表)
export const operationsTemp = [
{
type: 'edit',
title: '编辑'
......@@ -270,50 +268,44 @@ export const operations = [
type: 'delete',
title: '删除'
},
]
export const importRecordsTitle = [{
prop: "createTime",
label: "导入时间",
columnAlign: "left",
needTimeTag: true,
},
{
prop: "batchNum",
label: "导入批次",
columnAlign: "center",
},
{
prop: "fileName",
label: "文件名称",
columnAlign: "center",
width: 300
},
{
prop: "fileSize",
label: "文件大小",
columnAlign: "center",
},
{
prop: "remark",
label: "备注",
columnAlign: "center",
width: "60px",
},
// 操作(最终表)
export const operations = [
{
type: 'delete',
title: '删除'
},
]
export const importOperates = {
operate: true,
label: "操作",
width: "220px",
minwidth: "220px",
titleAlign: "center",
columnAlign: "center",
}
// 搜索配置
export const searchConfig = [
{
prop: "name",
type: "input",
label: "文物名称",
},
{
prop: "status",
type: "select",
label: "状态",
selectOptions: [
{
label: "已上架",
value: "1",
},
{
label: "已下架",
value: "0",
},
],
},
// 是否只看3D
{
prop: "upload3dFlag",
type: "checkbox",
label: "只看3D",
},
]
export const importOperations = [{
type: 'delete',
title: '删除记录及文物'
},]
\ No newline at end of file
......@@ -53,7 +53,7 @@
<el-tab-pane label="已审核通过" name="passed"></el-tab-pane>
</el-tabs>
<TablePage
:data="list.records"
:data="getCurrentList().records"
:tableTitle="passedTitle"
:operates="operates"
>
......@@ -87,7 +87,7 @@
</template>
<template v-slot:operates="scope">
<TableOperation
:operations="operations"
:operations="getOperations"
:rawData="scope.scope.row"
@handleOperation="handleOperation"
></TableOperation>
......@@ -97,11 +97,11 @@
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="Number(list.current)"
:current-page="Number(getCurrentList().current)"
:page-sizes="[10, 20, 40, 50]"
:page-size="Number(list.size)"
:page-size="Number(getCurrentList().size)"
layout="total, sizes, prev, pager, next, jumper"
:total="Number(list.total)"
:total="Number(getCurrentList().total)"
class="pagination"
>
</el-pagination>
......@@ -113,7 +113,7 @@
@handleClose="handleEditClose"
@refresh="loadData"
/>
<UploadDialog ref="UploadDialog" @update="loadData"/>
<UploadDialog ref="UploadDialog" @update="loadData" />
<ImportRecordDialog
:visible="importRecordVisible"
......@@ -136,12 +136,18 @@
</template>
<script>
import TablePage from "@/components/Table/TablePage.vue";
import TableOperation from "@/components/Table/TableOperation.vue";
import SearchBar from "@/components/SearchBar";
import { passedTitle, unPassedTitle, operates, operations } from "./config";
import {
passedTitle,
unPassedTitle,
operates,
operations,
operationsTemp,
searchConfig,
} from "./configs/list";
import {
getCulturalRelicListPerTemp,
getCulturalRelicListPer,
getRCDetailByIdTemp,
getRCDetailById,
deleteCultralRelic,
editCulturalRelic,
......@@ -153,58 +159,30 @@ import View3dDialog from "./components/View3dDialog";
export default {
components: {
TablePage,
TableOperation,
InfoEditDialog,
SearchBar,
ImportRecordDialog,
UploadDialog,
View3dDialog,
"el-image-viewer": () =>
import("element-ui/packages/image/src/image-viewer"),
},
data() {
return {
// (存放两份数据的目的是为了防止切换的时候分页被重置)
//最终表
list: {
records: [],
size: 10,
current: 1,
total: 0,
},
searchForm: {
name: "",
status: "",
// 临时表
listTemp: {
records: [],
size: 10,
current: 1,
total: 0,
},
searchConfig: [
{
prop: "name",
type: "input",
label: "文物名称",
},
{
prop: "status",
type: "select",
label: "状态",
selectOptions: [
{
label: "已上架",
value: "1",
},
{
label: "已下架",
value: "0",
},
],
},
// 是否只看3D
{
prop: "onlyShow3d",
type: "checkbox",
label: "只看3D",
},
],
searchConfig,
editVisible: false, //编辑
isAdd: true,
form: {
name: "", //名称
type: "", //类别(字典值)
......@@ -233,39 +211,20 @@ export default {
imgViewerVisible: false,
importRecordVisible: false, //上传记录
imgList: [],
isUpLoading: false,
view3dDialogVisible: false, //3D文件在线浏览弹窗可见性
passedTitle,
unPassedTitle,
operates,
operations,
operationsTemp,
tabActive: "unPassed",
};
},
//watch部分
watch: {
// //监听弹窗变化
// multiUploadVisible(val) {
// //弹窗关闭记得清空,开启执行批量上传
// if (val) {
// for (let i = 0; i < this.filesList.length; i++) {
// this.uploadSelf(this.filesList[i].file, i); //弹窗显示的时候,就根据文件队列的数量调用上传接口
// }
// } else {
// //弹窗关闭,还原数据到初始位置
// this.filesList = [];
// this.uploadCount = 0;
// this.cancelUploadArr = [];
// }
// },
// 监听Tab值不同调取不同的接口
tabActive(value) {
if (value == "passed") {
console.log("passed to do");
} else {
console.log("unPassed to do");
}
this.resetPage();
this.loadData();
},
},
computed: {
......@@ -278,15 +237,31 @@ export default {
}
};
},
getOperations() {
return this.tabActive == "passed" ? this.operations : this.operationsTemp;
},
},
async created() {
this.loadData();
},
methods: {
async search(form) {
this.resetPage();
this.loadData(form);
},
// 清除分页到初始状态
resetPage() {
this.getCurrentList().current = 1;
},
reset() {
this.loadData();
},
// 加载表格数据
async loadData(form) {
const { current, size } = this.getCurrentList();
var params = {
page: 1,
limit: this.list.size,
page: current,
limit: size,
...form,
};
if (!params.level) {
......@@ -295,30 +270,37 @@ export default {
if (params.status == "") {
delete params.status;
}
let res = await getCulturalRelicListPer(params);
const currentRequest = this.getCurrentRequest();
const res = await currentRequest(params);
if (res.code == 0) {
this.list = res.data;
this.setList(res.data);
}
},
reset() {
this.loadData();
// 获取当前请求方法
getCurrentRequest() {
const currentRequest =
this.tabActive == "passed"
? getCulturalRelicListPer
: getCulturalRelicListPerTemp;
return currentRequest;
},
// 加载表格数据
async loadData() {
var params = {
page: this.list.current,
limit: this.list.size,
};
let res = await getCulturalRelicListPer(params);
if (res.code == 0) {
// debugger
this.list = res.data;
// 设置两张表的数据
setList(data) {
if (this.tabActive === "passed") {
this.list = data;
} else {
this.listTemp = data;
}
},
// 获取当前加载的list
getCurrentList() {
const currentList =
this.tabActive == "passed" ? this.list : this.listTemp;
return currentList;
},
async handleOperation(value, row) {
console.log(value, row);
switch (value.type) {
case "add":
this.editVisible = true;
......@@ -328,7 +310,7 @@ export default {
this.$refs.View3dDialog.visible = true;
break;
case "edit":
let detailRes = await getRCDetailById({ crId: row.crId });
let detailRes = await getRCDetailByIdTemp({ crId: row.crId });
if (detailRes.code == 0) {
this.form = detailRes.data;
this.editVisible = true;
......@@ -342,9 +324,7 @@ export default {
}
break;
case "multiAdd":
// debugger
this.$refs.UploadDialog.visible = true;
// console.log("this.multiUploadVisible", this.multiUploadVisible);
break;
case "downloadTemplate":
......@@ -399,13 +379,13 @@ export default {
// 改变页容量
handleSizeChange(value) {
this.list.size = value;
this.getCurrentList().size = value;
this.loadData();
},
// 改变当前显示页
handleCurrentChange(value) {
this.list.current = value;
this.getCurrentList().current = value;
this.loadData();
},
// 关闭Dialog
......
<template>
<el-dialog v-loading="submitLoading" element-loading-background="rgba(0, 0, 0, 0.5)"
:element-loading-text="loadingText" :visible.sync="dialogVisible" width="80%" :before-close="handleClose" top="2vh"
lock-scroll>
<el-dialog
v-loading="submitLoading"
element-loading-background="rgba(0, 0, 0, 0.5)"
:element-loading-text="loadingText"
:visible.sync="dialogVisible"
width="80%"
:before-close="handleClose"
top="2vh"
lock-scroll
>
<div class="title" slot="title">
<div class="divider"></div>
<div class="label">
{{ title }}
<span v-if="dialogForm.exhibitionId" style="font-size: 12px; margin-left: 10px; font-weight: 500">
<i class="el-icon-warning-outline"></i>点击左右切换按钮可切换展览。<span style="color: #f56c6c">
<span
v-if="dialogForm.exhibitionId"
style="font-size: 12px; margin-left: 10px; font-weight: 500"
>
<i class="el-icon-warning-outline"></i
>点击左右切换按钮可切换展览。<span style="color: #f56c6c">
注意:切换前请注意保存当前展览信息
</span>
</span>
......@@ -15,53 +26,143 @@
</div>
<div class="el-dialog-div">
<div class="dialog-content" v-if="dialogVisible" id="dialog-content">
<el-form size="mini" :model="dialogForm" class="basic-info" :rules="rules" ref="form">
<el-form
size="mini"
:model="dialogForm"
class="basic-info"
:rules="rules"
ref="form"
>
<el-row :gutter="50">
<el-col :span="12">
<el-form-item label="展览标题" :label-width="formLabelWidth" prop="title">
<el-input v-model="dialogForm.title" autocomplete="off" placeholder="请输入展览标题" clearable></el-input>
<el-form-item
label="展览标题"
:label-width="formLabelWidth"
prop="title"
>
<el-input
v-model="dialogForm.title"
autocomplete="off"
placeholder="请输入展览标题"
clearable
></el-input>
</el-form-item>
<el-form-item label="展览单位" :label-width="formLabelWidth" prop="deptId">
<el-cascader style="width: 100%" v-model="dialogForm.deptId" :options="orgTreeData" :props="optionProps"
placeholder="请选择展览单位" clearable>
<el-form-item
label="展览单位"
:label-width="formLabelWidth"
prop="deptId"
>
<el-cascader
style="width: 100%"
v-model="dialogForm.deptId"
:options="orgTreeData"
:props="optionProps"
placeholder="请选择展览单位"
clearable
>
</el-cascader>
</el-form-item>
<el-form-item label="展览地区" :label-width="formLabelWidth">
<el-cascader class="years item" style="width: 100%" v-model="dialogForm.regionCode"
:options="regionTree" :props="culturalRegionProps" placeholder="请选择所属地区" filterable clearable>
<el-cascader
class="years item"
style="width: 100%"
v-model="dialogForm.regionCode"
:options="regionTree"
:props="culturalRegionProps"
placeholder="请选择所属地区"
filterable
clearable
>
</el-cascader>
</el-form-item>
<el-form-item label="展览类型" :label-width="formLabelWidth">
<el-select v-model="dialogForm.type" placeholder="请选择展览类型" style="width: 100%" clearable>
<el-option v-for="(value, key) in dicts.displayType" :key="key" :label="value" :value="key">
<el-select
v-model="dialogForm.type"
placeholder="请选择展览类型"
style="width: 100%"
clearable
>
<el-option
v-for="(value, key) in dicts.displayType"
:key="key"
:label="value"
:value="key"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="展览性质" :label-width="formLabelWidth" style="display: none">
<el-select v-model="dialogForm.displayCharacter" placeholder="请选择展览性质" style="width: 100%" clearable>
<el-option v-for="(value, key) in dicts.displayCharacter" :key="key" :label="value" :value="key">
<el-form-item
label="展览性质"
:label-width="formLabelWidth"
style="display: none"
>
<el-select
v-model="dialogForm.displayCharacter"
placeholder="请选择展览性质"
style="width: 100%"
clearable
>
<el-option
v-for="(value, key) in dicts.displayCharacter"
:key="key"
:label="value"
:value="key"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="模板主题" :label-width="formLabelWidth">
<el-select v-model="dialogForm.themeType" placeholder="请选择模板主题" style="width: 100%" clearable>
<el-option v-for="item in themeTypeOptions" :key="item.value" :label="item.label" :value="item.value">
<el-select
v-model="dialogForm.themeType"
placeholder="请选择模板主题"
style="width: 100%"
clearable
>
<el-option
v-for="item in themeTypeOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="展览介绍" :label-width="formLabelWidth">
<VueQuillEditor v-model="dialogForm.intro" placeholder="请输入展览介绍" />
<VueQuillEditor
v-model="dialogForm.intro"
placeholder="请输入展览介绍"
/>
</el-form-item>
<el-form-item label="关键词" :label-width="formLabelWidth">
<el-input v-model="dialogForm.keyword" autocomplete="off" placeholder="请输入关键词" clearable></el-input>
<el-input
v-model="dialogForm.keyword"
autocomplete="off"
placeholder="请输入关键词"
clearable
></el-input>
</el-form-item>
<el-form-item label="展览文物" :label-width="formLabelWidth">
<el-select v-model="crIds" multiple filterable remote reserve-keyword placeholder="请输入关键词搜索文物"
:remote-method="searchCR" :loading="loading" style="width: 100%" clearable>
<el-option v-for="item in crList" :key="item.crId" :label="item.name" :value="item.crId">
<el-select
v-model="crIds"
multiple
filterable
remote
reserve-keyword
placeholder="请输入关键词搜索文物"
:remote-method="searchCR"
:loading="loading"
style="width: 100%"
clearable
>
<el-option
v-for="item in crList"
:key="item.crId"
:label="item.name"
:value="item.crId"
>
</el-option>
</el-select>
<!-- <PageSelect
......@@ -75,18 +176,48 @@
</el-form-item>
<el-form-item label="关联文献" :label-width="formLabelWidth">
<el-select v-model="literatureValues" multiple filterable remote reserve-keyword
placeholder="请输入关键词搜索文献" :remote-method="searchLiterature" :loading="loading" style="width: 100%"
ref="literatureSelect" clearable>
<el-option v-for="item in literatureList" :key="item.literatureId" :label="item.name"
:value="item.literatureId">
<el-select
v-model="literatureValues"
multiple
filterable
remote
reserve-keyword
placeholder="请输入关键词搜索文献"
:remote-method="searchLiterature"
:loading="loading"
style="width: 100%"
ref="literatureSelect"
clearable
>
<el-option
v-for="item in literatureList"
:key="item.literatureId"
:label="item.name"
:value="item.literatureId"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="关联虚拟展厅" :label-width="formLabelWidth">
<el-select v-model="vrIds" multiple filterable remote reserve-keyword placeholder="请输入关键词搜索虚拟展厅"
:remote-method="searchVirtual" :loading="loading" style="width: 100%" ref="virtualSelect" clearable>
<el-option v-for="item in vrList" :key="item.bvId" :label="item.name" :value="item.bvId">
<el-select
v-model="vrIds"
multiple
filterable
remote
reserve-keyword
placeholder="请输入关键词搜索虚拟展厅"
:remote-method="searchVirtual"
:loading="loading"
style="width: 100%"
ref="virtualSelect"
clearable
>
<el-option
v-for="item in vrList"
:key="item.bvId"
:label="item.name"
:value="item.bvId"
>
</el-option>
</el-select>
</el-form-item>
......@@ -94,56 +225,129 @@
<el-switch v-model="dialogForm.status"> </el-switch>
</el-form-item>
<el-form-item label="备注" :label-width="formLabelWidth">
<el-input type="textarea" placeholder="请输入备注" v-model="dialogForm.remark" maxlength="100"
show-word-limit clearable>
<el-input
type="textarea"
placeholder="请输入备注"
v-model="dialogForm.remark"
maxlength="100"
show-word-limit
clearable
>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="展览封面" :label-width="formLabelWidth">
<ManualUploader :fileLimit="1" listType="picture-card" :fileType="['png', 'jpeg', 'jpg']"
:files="faceImage" ref="faceImage" />
<ManualUploader
:fileLimit="1"
listType="picture-card"
:fileType="['png', 'jpeg', 'jpg']"
:files="faceImage"
ref="faceImage"
/>
</el-form-item>
<el-form-item label="展览图片" :label-width="formLabelWidth">
<ManualUploader :files="images" :fileLimit="20" :fileSize="50" listType="picture-card"
:fileType="['png', 'jpeg', 'jpg']" ref="images" :advice="imagesAdvice" />
<ManualUploader
:files="images"
:fileLimit="20"
:fileSize="50"
listType="picture-card"
:fileType="['png', 'jpeg', 'jpg']"
ref="images"
:advice="imagesAdvice"
/>
</el-form-item>
<el-form-item label="展览音频" :label-width="formLabelWidth">
<ManualUploader :files="audios" :fileLimit="1" :fileSize="50" :fileType="['mp3']" listType="card"
ref="audios" />
<ManualUploader
:files="audios"
:fileLimit="1"
:fileSize="50"
:fileType="['mp3']"
listType="card"
ref="audios"
/>
</el-form-item>
<el-form-item label="展览视频" :label-width="formLabelWidth">
<ManualUploader :files="videos" :fileLimit="6" :fileSize="500" :fileType="['mp4']" listType="card"
ref="videos" />
<ManualUploader
:files="videos"
:fileLimit="6"
:fileSize="500"
:fileType="['mp4']"
listType="card"
ref="videos"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-form-item label="展览单元" :label-width="formLabelWidth">
<ExhibitionUnit :exhibitionUnits="dialogForm.exhibitionUnits" ref="exhibitionUnits" />
<ExhibitionUnit
:exhibitionUnits="dialogForm.exhibitionUnits"
ref="exhibitionUnits"
/>
</el-form-item>
</el-row>
</el-form>
</div>
<div class="dialog-footer">
<el-button size="mini" icon="el-icon-top" @click.native="handleToTop"></el-button>
<el-button size="mini" @click="cancelForm" icon="el-icon-circle-close" type="warning">取 消</el-button>
<el-button size="mini" type="primary" @click="handleSubmit(0)" :disabled="loading" icon="el-icon-document-checked">
<el-button
size="mini"
icon="el-icon-top"
@click.native="handleToTop"
></el-button>
<el-button
size="mini"
@click="cancelForm"
icon="el-icon-circle-close"
type="warning"
>取 消</el-button
>
<el-button
size="mini"
type="primary"
@click="handleSubmit(0)"
:disabled="loading"
icon="el-icon-document-checked"
>
只保存
</el-button>
<!-- <el-button @click="handlePreview">预 览</el-button> -->
<el-button size="mini" type="primary" @click="handleSubmit(1)" icon="el-icon-circle-check" :disabled="loading">保存并提交审核
<el-button
size="mini"
type="primary"
@click="handleSubmit(1)"
icon="el-icon-circle-check"
:disabled="loading"
>保存并提交审核
</el-button>
</div>
</div>
<el-tooltip class="item" effect="dark" content="下一展览" placement="top-start">
<div class="next btn" v-if="dialogForm.exhibitionId" @click="handleChangeDisplay('next')">
<el-tooltip
class="item"
effect="dark"
content="下一展览"
placement="top-start"
>
<div
class="next btn"
v-if="dialogForm.exhibitionId"
@click="handleChangeDisplay('next')"
>
<i class="el-icon-arrow-right"></i>
</div>
</el-tooltip>
<el-tooltip class="item" effect="dark" content="上一展览" placement="top-start">
<div class="prev btn" v-if="dialogForm.exhibitionId" @click="handleChangeDisplay('prev')">
<el-tooltip
class="item"
effect="dark"
content="上一展览"
placement="top-start"
>
<div
class="prev btn"
v-if="dialogForm.exhibitionId"
@click="handleChangeDisplay('prev')"
>
<i class="el-icon-arrow-left"></i>
</div>
</el-tooltip>
......@@ -153,21 +357,16 @@
<script>
import { addDisplay, editDisplay } from "@/api/display";
import { mapGetters } from "vuex";
import ManualUploader from "@/components/Uploader/ManualUploader.vue";
import ExhibitionUnit from "./ExhibitionUnit.vue";
import { uploadV1 } from "@/utils/file";
import { themeTypeOptions } from "../contants";
import { deleteFiles } from "@/api/file";
import VueQuillEditor from "@/components/VueQuillEditor";
import { getVirtualListPer } from "@/api/vitual";
export default {
name: "InfoEditDialog",
components: {
ManualUploader,
ExhibitionUnit,
VueQuillEditor,
// PageSelect,
},
props: {
visible: {
......@@ -371,7 +570,6 @@ export default {
label: "name",
children: "children",
checkStrictly: true,
},
culturalRegionProps: {
value: "code",
......@@ -734,7 +932,7 @@ export default {
params.crIds = this.crIds.join(",");
params.bvIds = this.vrIds.join(",");
params.displayCharacter = 1; //传布展
params.submitFlag = submitFlag
params.submitFlag = submitFlag;
addDisplay(params)
.then((res) => {
if (res.code == 0) {
......@@ -804,7 +1002,7 @@ export default {
if (deleteFileArr.length > 0) {
await deleteFiles(deleteFileArr);
}
params.submitFlag = submitFlag
params.submitFlag = submitFlag;
editDisplay(params)
.then(async (res) => {
......@@ -866,7 +1064,7 @@ export default {
this.reload();
this.submitLoading = false;
})
.catch((_) => { });
.catch((_) => {});
},
refresh() {
this.$emit("refresh");
......@@ -875,7 +1073,7 @@ export default {
};
</script>
<style lang='scss' scoped>
<style lang="scss" scoped>
.title {
display: flex;
margin-bottom: 16px;
......@@ -951,4 +1149,4 @@ export default {
.next {
right: -8%;
}
</style>
\ No newline at end of file
</style>
<template>
<div class="base-info">
<el-form :model="displayDetail" class="basic-info" ref="form" size="mini">
<el-row :gutter="50">
<el-col :span="10">
<el-form-item label="展览标题" :label-width="formLabelWidth">
<el-input disabled v-model="displayDetail.title" autocomplete="off" placeholder="无"
clearable></el-input>
</el-form-item>
<el-form-item label="展览介绍" :label-width="formLabelWidth">
<div v-if="(displayDetail.intro.length > 0)" class="intro" v-html="displayDetail.intro"></div>
<div v-else class="intro">暂无</div>
</el-form-item>
<el-form-item label="展览单位" :label-width="formLabelWidth">
<el-cascader disabled style="width: 100%" v-model="displayDetail.deptId" :options="orgTreeData"
:props="optionProps" placeholder="无" clearable>
</el-cascader>
</el-form-item>
<el-form-item label="展览地区" :label-width="formLabelWidth">
<el-cascader disabled class="years item" style="width: 100%" v-model="displayDetail.regionCode"
:options="regionTree" :props="culturalRegionProps" placeholder="无" filterable clearable>
</el-cascader>
</el-form-item>
<el-form-item label="展览类型" :label-width="formLabelWidth">
<el-select disabled v-model="displayDetail.type" placeholder="无" style="width: 100%" clearable>
<el-option v-for="(value, key) in dicts.displayType" :key="key" :label="value" :value="key">
</el-option>
</el-select>
</el-form-item>
<div class="base-info">
<el-form :model="displayDetail" class="basic-info" ref="form" size="mini">
<el-row :gutter="50">
<el-col :span="10">
<el-form-item label="展览标题" :label-width="formLabelWidth">
<el-input
disabled
v-model="displayDetail.title"
autocomplete="off"
placeholder="无"
clearable
></el-input>
</el-form-item>
<el-form-item label="展览介绍" :label-width="formLabelWidth">
<div
v-if="displayDetail.intro.length > 0"
class="intro"
v-html="displayDetail.intro"
></div>
<div v-else class="intro">暂无</div>
</el-form-item>
<el-form-item label="展览单位" :label-width="formLabelWidth">
<el-cascader
disabled
style="width: 100%"
v-model="displayDetail.deptId"
:options="orgTreeData"
:props="optionProps"
placeholder="无"
clearable
>
</el-cascader>
</el-form-item>
<el-form-item label="展览地区" :label-width="formLabelWidth">
<el-cascader
disabled
class="years item"
style="width: 100%"
v-model="displayDetail.regionCode"
:options="regionTree"
:props="culturalRegionProps"
placeholder="无"
filterable
clearable
>
</el-cascader>
</el-form-item>
<el-form-item label="展览类型" :label-width="formLabelWidth">
<el-select
disabled
v-model="displayDetail.type"
placeholder="无"
style="width: 100%"
clearable
>
<el-option
v-for="(value, key) in dicts.displayType"
:key="key"
:label="value"
:value="key"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="展览性质" :label-width="formLabelWidth" style="display: none">
<el-select disabled v-model="displayDetail.displayCharacter" placeholder="无" style="width: 100%"
clearable>
<el-option v-for="(value, key) in dicts.displayCharacter" :key="key" :label="value"
:value="key">
</el-option>
</el-select>
</el-form-item>
<el-form-item
label="展览性质"
:label-width="formLabelWidth"
style="display: none"
>
<el-select
disabled
v-model="displayDetail.displayCharacter"
placeholder="无"
style="width: 100%"
clearable
>
<el-option
v-for="(value, key) in dicts.displayCharacter"
:key="key"
:label="value"
:value="key"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="模板主题" :label-width="formLabelWidth">
<el-select disabled v-model="displayDetail.themeType" placeholder="无" style="width: 100%"
clearable>
<el-option v-for="item in themeTypeOptions" :key="item.value" :label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="模板主题" :label-width="formLabelWidth">
<el-select
disabled
v-model="displayDetail.themeType"
placeholder="无"
style="width: 100%"
clearable
>
<el-option
v-for="item in themeTypeOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="关键词" :label-width="formLabelWidth">
<el-input
disabled
v-model="displayDetail.keyword"
autocomplete="off"
placeholder="无"
clearable
></el-input>
</el-form-item>
<el-form-item label="关键词" :label-width="formLabelWidth">
<el-input disabled v-model="displayDetail.keyword" autocomplete="off" placeholder="无"
clearable></el-input>
</el-form-item>
<el-form-item label="展览文物" :label-width="formLabelWidth">
<el-select disabled v-model="crIds" multiple filterable remote reserve-keyword placeholder="无"
style="width: 100%" clearable>
<el-option v-for="item in crList" :key="item.crId" :label="item.name" :value="item.crId">
</el-option>
</el-select>
<!-- <PageSelect
<el-form-item label="展览文物" :label-width="formLabelWidth">
<el-select
disabled
v-model="crIds"
multiple
filterable
remote
reserve-keyword
placeholder="无"
style="width: 100%"
clearable
>
<el-option
v-for="item in crList"
:key="item.crId"
:label="item.name"
:value="item.crId"
>
</el-option>
</el-select>
<!-- <PageSelect
ref="PageSelect"
label="name"
value="crId"
......@@ -66,281 +142,336 @@
:url="pageSelectUrl"
filter-key="name"
/> -->
</el-form-item>
</el-form-item>
<el-form-item label="关联文献" :label-width="formLabelWidth">
<el-select disabled v-model="literatureValues" multiple filterable remote reserve-keyword
placeholder="无" style="width: 100%" ref="literatureSelect" clearable>
<el-option v-for="item in literatureList" :key="item.literatureId" :label="item.name"
:value="item.literatureId">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="关联虚拟展厅" :label-width="formLabelWidth">
<el-select disabled v-model="vrIds" multiple filterable remote reserve-keyword placeholder="无"
style="width: 100%" ref="virtualSelect" clearable>
<el-option v-for="item in vrList" :key="item.bvId" :label="item.name" :value="item.bvId">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="是否上架" :label-width="formLabelWidth">
<el-switch v-model="displayDetail.status" disabled> </el-switch>
</el-form-item>
<el-form-item label="备注" :label-width="formLabelWidth">
<el-input disabled type="textarea" placeholder="无" v-model="displayDetail.remark"
maxlength="100" show-word-limit clearable>
</el-input>
</el-form-item>
</el-col>
<el-col :span="14">
<el-form-item label="展览封面" :label-width="formLabelWidth">
<div v-if="displayDetail.faceImagePressUrl" class="img-container">
<ManualUploader :fileLimit="1" listType="picture-card" :fileType="['png', 'jpeg', 'jpg']"
:files="faceImage" ref="faceImage" onlyRead />
</div>
<div v-else>
</div>
</el-form-item>
<el-form-item label="关联文献" :label-width="formLabelWidth">
<el-select
disabled
v-model="literatureValues"
multiple
filterable
remote
reserve-keyword
placeholder="无"
style="width: 100%"
ref="literatureSelect"
clearable
>
<el-option
v-for="item in literatureList"
:key="item.literatureId"
:label="item.name"
:value="item.literatureId"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="关联虚拟展厅" :label-width="formLabelWidth">
<el-select
disabled
v-model="vrIds"
multiple
filterable
remote
reserve-keyword
placeholder="无"
style="width: 100%"
ref="virtualSelect"
clearable
>
<el-option
v-for="item in vrList"
:key="item.bvId"
:label="item.name"
:value="item.bvId"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="是否上架" :label-width="formLabelWidth">
<el-switch v-model="displayDetail.status" disabled> </el-switch>
</el-form-item>
<el-form-item label="备注" :label-width="formLabelWidth">
<el-input
disabled
type="textarea"
placeholder="无"
v-model="displayDetail.remark"
maxlength="100"
show-word-limit
clearable
>
</el-input>
</el-form-item>
</el-col>
<el-col :span="14">
<el-form-item label="展览封面" :label-width="formLabelWidth">
<div v-if="displayDetail.faceImagePressUrl" class="img-container">
<ManualUploader
:fileLimit="1"
listType="picture-card"
:fileType="['png', 'jpeg', 'jpg']"
:files="faceImage"
ref="faceImage"
onlyRead
/>
</div>
<div v-else></div>
</el-form-item>
<el-form-item label="展览图片" :label-width="formLabelWidth">
<div class="images-group" v-if="displayDetail.imagesVo.length > 0">
<ManualUploader :files="images" :fileLimit="20" :fileSize="50" listType="picture-card"
:fileType="['png', 'jpeg', 'jpg']" ref="images" onlyRead />
</div>
<div v-else>
</div>
</el-form-item>
<el-form-item label="展览音频" :label-width="formLabelWidth">
<div class="images-group" v-if="displayDetail.audiosVo.length > 0">
<ManualUploader :files="audios" :fileLimit="1" :fileSize="50" :fileType="['mp3']"
listType="card" ref="audios" onlyRead />
</div>
<div v-else>
</div>
</el-form-item>
<el-form-item label="展览视频" :label-width="formLabelWidth">
<div class="images-group" v-if="displayDetail.videosVo.length > 0">
<ManualUploader :files="videos" :fileLimit="6" :fileSize="500" :fileType="['mp4']"
listType="card" ref="videos" onlyRead />
</div>
<div v-else>
</div>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-form-item label="展览单元" :label-width="formLabelWidth">
<ExhibitionUnit :exhibitionUnits="displayDetail.exhibitionUnits" :isDisableEvent="true"
ref="exhibitionUnits" />
</el-form-item>
</el-row>
</el-form>
</div>
<el-form-item label="展览图片" :label-width="formLabelWidth">
<div class="images-group" v-if="displayDetail.imagesVo.length > 0">
<ManualUploader
:files="images"
:fileLimit="20"
:fileSize="50"
listType="picture-card"
:fileType="['png', 'jpeg', 'jpg']"
ref="images"
onlyRead
/>
</div>
<div v-else></div>
</el-form-item>
<el-form-item label="展览音频" :label-width="formLabelWidth">
<div class="images-group" v-if="displayDetail.audiosVo.length > 0">
<ManualUploader
:files="audios"
:fileLimit="1"
:fileSize="50"
:fileType="['mp3']"
listType="card"
ref="audios"
onlyRead
/>
</div>
<div v-else></div>
</el-form-item>
<el-form-item label="展览视频" :label-width="formLabelWidth">
<div class="images-group" v-if="displayDetail.videosVo.length > 0">
<ManualUploader
:files="videos"
:fileLimit="6"
:fileSize="500"
:fileType="['mp4']"
listType="card"
ref="videos"
onlyRead
/>
</div>
<div v-else></div>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-form-item label="展览单元" :label-width="formLabelWidth">
<ExhibitionUnit
:exhibitionUnits="displayDetail.exhibitionUnits"
:isDisableEvent="true"
ref="exhibitionUnits"
/>
</el-form-item>
</el-row>
</el-form>
</div>
</template>
<script>
import { themeTypeOptions } from "@/views/display/contants";
import ManualUploader from "@/components/Uploader/ManualUploader.vue";
import ExhibitionUnit from "@/views/display/components/ExhibitionUnit.vue";
export default {
name: 'BaseInfo',
components: {
ExhibitionUnit,
ManualUploader
name: "BaseInfo",
components: {
ExhibitionUnit,
},
props: {
displayDetail: {
type: Object,
default: () => ({}),
},
props: {
displayDetail: {
type: Object,
default: () => ({})
},
dicts: {
type: Object,
default: () => ({})
},
dicts: {
type: Object,
default: () => ({}),
},
computed: {
themeTypeOptions() {
return themeTypeOptions;
},
},
computed: {
themeTypeOptions() {
return themeTypeOptions;
},
watch: {
displayDetail: {
handler: function (value) {
if (Object.keys(value).length == 0) {
return
}
// 回填媒体资源
if (
this.displayDetail.faceImageUrl ||
this.displayDetail.faceImagePressUrl
) {
this.faceImage = [
{
name: "",
url: this.displayDetail.faceImageUrl || "",
pressUrl:
this.displayDetail.faceImagePressUrl ||
this.displayDetail.faceImageUrl ||
"",
fileId: this.displayDetail.faceImage || "",
},
];
} else {
this.faceImage = [];
}
this.images = this.displayDetail.imagesVo || [];
this.videos = this.displayDetail.videosVo || [];
this.audios = this.displayDetail.audiosVo || [];
// 回填状态
this.displayDetail.status = Boolean(Number(this.displayDetail.status));
// 回填文献
this.literatureValues = [];
if (
this.displayDetail.literatureVo &&
this.displayDetail.literatureVo.length > 0
) {
this.literatureList = this.displayDetail.literatureVo;
this.displayDetail.literatureVo.forEach((lt) => {
if (this.literatureValues) {
this.literatureValues.push(lt.literatureId);
}
});
}
// 回填文物
this.crIds = [];
if (
this.displayDetail.culturalRelicVo &&
this.displayDetail.culturalRelicVo.length > 0
) {
this.crList = this.displayDetail.culturalRelicVo;
this.displayDetail.culturalRelicVo.forEach((cr) => {
if (this.crIds) {
this.crIds.push(cr.crId);
}
});
}
// 回填虚拟展厅
this.vrIds = [];
if (
this.displayDetail.virtualVo &&
this.displayDetail.virtualVo.length > 0
) {
this.vrList = this.displayDetail.virtualVo;
this.displayDetail.virtualVo.forEach((vr) => {
if (this.vrIds) {
this.vrIds.push(vr.bvId);
}
});
}
},
watch: {
displayDetail: {
handler: function (value) {
if (Object.keys(value).length == 0) {
return;
}
// 回填媒体资源
if (
this.displayDetail.faceImageUrl ||
this.displayDetail.faceImagePressUrl
) {
this.faceImage = [
{
name: "",
url: this.displayDetail.faceImageUrl || "",
pressUrl:
this.displayDetail.faceImagePressUrl ||
this.displayDetail.faceImageUrl ||
"",
fileId: this.displayDetail.faceImage || "",
},
deep: true,
immediate: true
];
} else {
this.faceImage = [];
}
this.images = this.displayDetail.imagesVo || [];
this.videos = this.displayDetail.videosVo || [];
this.audios = this.displayDetail.audiosVo || [];
// 回填状态
this.displayDetail.status = Boolean(Number(this.displayDetail.status));
// 回填文献
this.literatureValues = [];
if (
this.displayDetail.literatureVo &&
this.displayDetail.literatureVo.length > 0
) {
this.literatureList = this.displayDetail.literatureVo;
this.displayDetail.literatureVo.forEach((lt) => {
if (this.literatureValues) {
this.literatureValues.push(lt.literatureId);
}
});
}
},
data() {
return {
formLabelWidth: "100px",
orgTreeData: [],
regionTree: [],
optionProps: {
value: "id",
label: "name",
children: "children",
checkStrictly: true,
},
culturalRegionProps: {
value: "code",
label: "name",
children: "children",
checkStrictly: true,
},
faceImage: [],
images: [],
videos: [],
audios: [],
literatureList: [], //文献列表
literatureValues: [], //选中的文献列表
crList: [], //文物列表
crIds: [], //选中的文物列表
vrList: [], //虚拟展厅列表
vrIds: [],
// 回填文物
this.crIds = [];
if (
this.displayDetail.culturalRelicVo &&
this.displayDetail.culturalRelicVo.length > 0
) {
this.crList = this.displayDetail.culturalRelicVo;
this.displayDetail.culturalRelicVo.forEach((cr) => {
if (this.crIds) {
this.crIds.push(cr.crId);
}
});
}
// 回填虚拟展厅
this.vrIds = [];
if (
this.displayDetail.virtualVo &&
this.displayDetail.virtualVo.length > 0
) {
this.vrList = this.displayDetail.virtualVo;
this.displayDetail.virtualVo.forEach((vr) => {
if (this.vrIds) {
this.vrIds.push(vr.bvId);
}
});
}
},
deep: true,
immediate: true,
},
async created() {
await this.$store.dispatch("dict/getDictList", [
"displayType",
"displayCharacter",
]);
this.$store.dispatch("org/getMuseumTreeData", false).then((res) => {
// this.orgTreeData = res[0].children; //去掉根节点的文旅厅
this.orgTreeData = res;
});
},
data() {
return {
formLabelWidth: "100px",
orgTreeData: [],
regionTree: [],
optionProps: {
value: "id",
label: "name",
children: "children",
checkStrictly: true,
},
culturalRegionProps: {
value: "code",
label: "name",
children: "children",
checkStrictly: true,
},
faceImage: [],
images: [],
videos: [],
audios: [],
literatureList: [], //文献列表
literatureValues: [], //选中的文献列表
crList: [], //文物列表
crIds: [], //选中的文物列表
vrList: [], //虚拟展厅列表
vrIds: [],
};
},
async created() {
await this.$store.dispatch("dict/getDictList", [
"displayType",
"displayCharacter",
]);
this.$store.dispatch("org/getMuseumTreeData", false).then((res) => {
// this.orgTreeData = res[0].children; //去掉根节点的文旅厅
this.orgTreeData = res;
});
this.loadRegionTree();
},
methods: {
loadRegionTree() {
let parentId = "";
this.$store.dispatch("org/getSysRegionTreeData", parentId).then((res) => {
this.regionTree = res;
loopTree(this.regionTree);
function loopTree(arr) {
if (arr && arr.length > 0) {
arr.forEach((item) => {
if (item.children && item.children.length == 0) {
delete item.children;
} else {
loopTree(item.children);
}
});
}
}
this.loadRegionTree();
},
methods: {
loadRegionTree() {
let parentId = "";
this.$store.dispatch("org/getSysRegionTreeData", parentId).then((res) => {
this.regionTree = res;
loopTree(this.regionTree);
function loopTree(arr) {
if (arr && arr.length > 0) {
arr.forEach((item) => {
if (item.children && item.children.length == 0) {
delete item.children;
} else {
loopTree(item.children);
}
});
},
}
}
}
}
});
},
},
};
</script>
<style lang="scss" scoped>
.img-container {
background-color: #fbfdff;
border: 1px dashed #c0ccda;
border-radius: 6px;
box-sizing: border-box;
width: 148px;
height: 148px;
cursor: pointer;
margin-right: 2px;
background-color: #fbfdff;
border: 1px dashed #c0ccda;
border-radius: 6px;
box-sizing: border-box;
width: 148px;
height: 148px;
cursor: pointer;
margin-right: 2px;
img {
width: 100%;
height: 100%;
object-fit: cover;
}
img {
width: 100%;
height: 100%;
object-fit: cover;
}
}
.images-group {
// width: 450px;
// display: flex;
// flex-wrap: wrap;
// padding-top: 10px;
// width: 450px;
// display: flex;
// flex-wrap: wrap;
// padding-top: 10px;
}
.intro {
background-color: #F5F7FA;
border: 1px solid #E4E7ED;
color: #C0C4CC;
padding: 0 10px;
border-radius: 4px;
background-color: #f5f7fa;
border: 1px solid #e4e7ed;
color: #c0c4cc;
padding: 0 10px;
border-radius: 4px;
}
.base-info {
overflow-x: hidden;
overflow-x: hidden;
}
</style>
\ No newline at end of file
</style>
......@@ -67,10 +67,10 @@
</div>
<span v-else>暂无文献</span>
</div>
<TextShow
<RichTextShow
v-else-if="item.prop === 'intro'"
:richText="info['intro']"
></TextShow>
></RichTextShow>
<div v-else-if="item.prop === 'type'">
<DictText name="displayType" :dictValue="info['type']" />
</div>
......
<template>
<el-dialog :visible="dialogVisible" width="40%" :before-close="handleClose" top="5vh" lock-scroll v-loading="loading" element-loading-background="rgba(0, 0, 0, 0.5)">
<el-dialog
:visible="dialogVisible"
width="40%"
:before-close="handleClose"
top="5vh"
lock-scroll
v-loading="loading"
element-loading-background="rgba(0, 0, 0, 0.5)"
>
<div class="title" slot="title">
<div class="divider"></div>
<div class="label">{{ title }}</div>
</div>
<div class="el-dialog-div">
<div class="dialog-content">
<el-form :model="dialogForm" class="basic-info" ref="form" :rules="rules" size="mini">
<el-form
:model="dialogForm"
class="basic-info"
ref="form"
:rules="rules"
size="mini"
>
<el-form-item label="名称" :label-width="formLabelWidth" prop="name">
<el-input v-model="dialogForm.name" autocomplete="off" placeholder="请输入文献名称"></el-input>
<el-input
v-model="dialogForm.name"
autocomplete="off"
placeholder="请输入文献名称"
></el-input>
</el-form-item>
<el-form-item label="作者" :label-width="formLabelWidth">
<el-input v-model="dialogForm.authors" autocomplete="off" placeholder="请输入作者"></el-input>
<el-input
v-model="dialogForm.authors"
autocomplete="off"
placeholder="请输入作者"
></el-input>
</el-form-item>
<el-form-item label="文献来源" :label-width="formLabelWidth">
<el-input v-model="dialogForm.source" autocomplete="off" placeholder="请输入文献来源"></el-input>
<el-input
v-model="dialogForm.source"
autocomplete="off"
placeholder="请输入文献来源"
></el-input>
</el-form-item>
<el-form-item label="出版/发布日期" :label-width="formLabelWidth">
<el-date-picker style="width: 100%" v-model="dialogForm.date" type="date" placeholder="请选择出版/发布日期"
value-format="yyyy-MM-dd">
<el-date-picker
style="width: 100%"
v-model="dialogForm.date"
type="date"
placeholder="请选择出版/发布日期"
value-format="yyyy-MM-dd"
>
</el-date-picker>
</el-form-item>
......@@ -26,19 +57,32 @@
<el-switch v-model="status"> </el-switch>
</el-form-item>
<el-form-item label="文件" :label-width="formLabelWidth">
<ManualUploader :files="files" :fileLimit="1" :fileSize="50" listType="text" :fileType="['pdf']"
ref="pdf" />
<ManualUploader
:files="files"
:fileLimit="1"
:fileSize="50"
listType="text"
:fileType="['pdf']"
ref="pdf"
/>
</el-form-item>
<el-form-item label="备注" :label-width="formLabelWidth">
<el-input type="textarea" placeholder="请输入备注" v-model="dialogForm.remark" maxlength="600" show-word-limit>
<el-input
type="textarea"
placeholder="请输入备注"
v-model="dialogForm.remark"
maxlength="600"
show-word-limit
>
</el-input>
</el-form-item>
</el-form>
</div>
<div class="dialog-footer">
<el-button size="mini" @click="cancelForm">取 消</el-button>
<el-button size="mini" type="primary" @click="handleSubmit">确定<i class="el-icon-circle-check"
style="margin-left: 5px"></i></el-button>
<el-button size="mini" type="primary" @click="handleSubmit"
>确定<i class="el-icon-circle-check" style="margin-left: 5px"></i
></el-button>
</div>
</div>
</el-dialog>
......@@ -46,14 +90,10 @@
<script>
import { addLiterature, editLiterature } from "@/api/literature";
import ManualUploader from "@/components/Uploader/ManualUploader.vue";
import { mapGetters } from "vuex";
import { uploadFile } from "@/utils/file";
export default {
name: "InfoEditDialog",
components: {
ManualUploader,
},
props: {
visible: {
type: Boolean,
......@@ -117,7 +157,7 @@ export default {
},
],
},
loading: false
loading: false,
};
},
methods: {
......@@ -140,7 +180,7 @@ export default {
},
handleSubmit() {
let that = this;
this.loading = true
this.loading = true;
this.$refs.form.validate(async (valid) => {
if (valid) {
let params = JSON.parse(JSON.stringify(that.dialogForm));
......@@ -172,7 +212,7 @@ export default {
that.reloadParent();
that.resetChildData();
}
this.loading = false
this.loading = false;
} else {
let res = await addLiterature(params);
if (res.code == 0) {
......@@ -180,8 +220,7 @@ export default {
that.reloadParent();
that.resetChildData();
}
this.loading = false
this.loading = false;
}
}
});
......@@ -194,13 +233,13 @@ export default {
this.reloadParent();
this.resetChildData();
})
.catch((_) => { });
.catch((_) => {});
},
},
};
</script>
<style lang='scss' scoped>
<style lang="scss" scoped>
.title {
display: flex;
margin-bottom: 16px;
......@@ -240,4 +279,4 @@ export default {
justify-content: flex-end;
padding: 20px 40px;
}
</style>
\ No newline at end of file
</style>
......@@ -98,18 +98,12 @@
<script>
import { addMuseum, editMuseum } from "@/api/org";
import ManualUploader from "@/components/Uploader/ManualUploader.vue";
import { mapGetters } from "vuex";
import { uploadV1 } from "@/utils/file";
import { deleteFiles } from "@/api/file";
import VueQuillEditor from "@/components/VueQuillEditor";
export default {
name: "InfoEditDialog",
components: {
ManualUploader,
VueQuillEditor,
},
props: {
visible: {
type: Boolean,
......
......@@ -73,8 +73,8 @@
</el-form>
</div>
<div class="dialog-footer">
<el-button size="mini" @click="cancelForm">取 消</el-button>
<el-button size="mini" type="primary" @click="handleSubmit"
<el-button size="mini" @click="cancelForm">取 消</el-button>
<el-button size="mini" type="primary" @click="handleSubmit"
>确定<i class="el-icon-circle-check" style="margin-left: 5px"></i
></el-button>
</div>
......@@ -84,17 +84,12 @@
<script>
import { addCcProduct, updateCcProduct } from "@/api/literature";
import ManualUploader from "@/components/Uploader/ManualUploader.vue";
import { mapGetters } from "vuex";
import { uploadV1 } from "@/utils/file";
import VueQuillEditor from "@/components/VueQuillEditor";
import { deleteFiles } from "@/api/file";
export default {
name: "InfoEditDialog",
components: {
ManualUploader,
VueQuillEditor,
},
components: {},
props: {
visible: {
type: Boolean,
......@@ -334,7 +329,7 @@ export default {
};
</script>
<style lang='scss' scoped>
<style lang="scss" scoped>
.title {
display: flex;
margin-bottom: 16px;
......@@ -363,13 +358,12 @@ export default {
.relate {
flex: 1;
}
}
.dialog-footer {
display: flex;
justify-content: flex-end;
margin: 20px;
}
display: flex;
justify-content: flex-end;
margin: 20px;
}
.upload-box {
background-color: #fbfdff;
border: 1px dashed #c0ccda;
......@@ -387,4 +381,4 @@ export default {
color: #8c939d;
}
}
</style>
\ No newline at end of file
</style>
......@@ -14,7 +14,13 @@
<div class="label">{{ title }}</div>
</div>
<div class="dialog-content">
<el-form :model="dialogForm" class="basic-info" :rules="rules" ref="form" size="mini">
<el-form
:model="dialogForm"
class="basic-info"
:rules="rules"
ref="form"
size="mini"
>
<el-form-item
label="账号"
:label-width="formLabelWidth"
......@@ -113,14 +119,10 @@
<script>
import { addUser, upadateUser } from "@/api/user";
import ManualUploader from "@/components/Uploader/ManualUploader.vue";
import { mapGetters } from "vuex";
import md5 from "js-md5";
export default {
name: "InfoEditDialog",
components: {
ManualUploader,
},
props: {
visible: {
type: Boolean,
......
<template>
<el-dialog :visible.sync="dialogVisible" width="40%" style="height: 98%" :before-close="handleClose" top="5vh"
lock-scroll v-loading="loading" element-loading-background="rgba(0, 0, 0, 0.5)">
<el-dialog
:visible.sync="dialogVisible"
width="40%"
style="height: 98%"
:before-close="handleClose"
top="5vh"
lock-scroll
v-loading="loading"
element-loading-background="rgba(0, 0, 0, 0.5)"
>
<div class="title" slot="title">
<div class="divider"></div>
<div class="label">{{ title }}</div>
</div>
<div class="dialog-content">
<el-form :model="dialogForm" class="basic-info" ref="form" :rules="rules" size="mini">
<el-form
:model="dialogForm"
class="basic-info"
ref="form"
:rules="rules"
size="mini"
>
<el-form-item label="名称" :label-width="formLabelWidth" prop="name">
<el-input v-model="dialogForm.name" autocomplete="off" placeholder="请输入名称"></el-input>
<el-input
v-model="dialogForm.name"
autocomplete="off"
placeholder="请输入名称"
></el-input>
</el-form-item>
<el-form-item label="所属博物馆" :label-width="formLabelWidth">
<el-cascader style="width: 100%" v-model="dialogForm.deptId" :options="orgTreeData" :props="optionProps"
placeholder="请选择所属博物馆" :key="pidModalKey" filterable>
<el-cascader
style="width: 100%"
v-model="dialogForm.deptId"
:options="orgTreeData"
:props="optionProps"
placeholder="请选择所属博物馆"
:key="pidModalKey"
filterable
>
</el-cascader>
</el-form-item>
<el-form-item label="所属地" :label-width="formLabelWidth">
<el-cascader style="width: 100%" v-model="dialogForm.regionCode" :options="regionTree"
:props="regionOptionProps" placeholder="请选择所属地" :key="regionCodeModalKey" filterable>
<el-cascader
style="width: 100%"
v-model="dialogForm.regionCode"
:options="regionTree"
:props="regionOptionProps"
placeholder="请选择所属地"
:key="regionCodeModalKey"
filterable
>
</el-cascader>
</el-form-item>
<el-form-item label="简介" :label-width="formLabelWidth">
<el-input type="textarea" placeholder="请输入展厅简介" v-model="dialogForm.intro" maxlength="600" show-word-limit>
<el-input
type="textarea"
placeholder="请输入展厅简介"
v-model="dialogForm.intro"
maxlength="600"
show-word-limit
>
</el-input>
</el-form-item>
<el-form-item label="状态" :label-width="formLabelWidth">
......@@ -30,33 +68,40 @@
<el-form-item label="链接" :label-width="formLabelWidth" prop="url">
<!-- <el-switch v-model="dialogForm.url"> </el-switch> -->
<el-input v-model="dialogForm.url" autocomplete="off" placeholder="请输入链接"></el-input>
<el-input
v-model="dialogForm.url"
autocomplete="off"
placeholder="请输入链接"
></el-input>
</el-form-item>
<el-form-item label="展览封面" :label-width="formLabelWidth">
<ManualUploader :files="faceImage" :fileLimit="1" :fileSize="50" listType="picture-card"
:fileType="['png', 'jpeg', 'jpg']" ref="faceImage" />
<ManualUploader
:files="faceImage"
:fileLimit="1"
:fileSize="50"
listType="picture-card"
:fileType="['png', 'jpeg', 'jpg']"
ref="faceImage"
/>
</el-form-item>
</el-form>
</div>
<div class="dialog-footer">
<el-button size="mini" @click="cancelForm">取 消</el-button>
<el-button size="mini" type="primary" @click="handleSubmit">确定<i class="el-icon-circle-check"
style="margin-left: 5px"></i></el-button>
<el-button size="mini" type="primary" @click="handleSubmit"
>确定<i class="el-icon-circle-check" style="margin-left: 5px"></i
></el-button>
</div>
</el-dialog>
</template>
<script>
import { addVirtual, editVirtual } from "@/api/vitual";
import ManualUploader from "@/components/Uploader/ManualUploader.vue";
import { mapGetters } from "vuex";
import { uploadV1 } from "@/utils/file";
export default {
name: "InfoEditDialog",
components: {
ManualUploader,
},
props: {
visible: {
type: Boolean,
......@@ -77,7 +122,7 @@ export default {
get: function () {
return this.visible;
},
set: function () { },
set: function () {},
},
title() {
if (this.dialogForm.bvId) {
......@@ -170,7 +215,7 @@ export default {
name: [{ required: true, message: "请输入名称", trigger: "blur" }],
url: [{ required: true, message: "请输入链接", trigger: "blur" }],
},
loading: false
loading: false,
};
},
methods: {
......@@ -206,9 +251,8 @@ export default {
},
handleSubmit() {
this.$refs.form.validate(async (valid) => {
this.loading = true
this.loading = true;
if (valid) {
let params = { ...this.dialogForm };
// // 回填图片
// if (this.faceImage.length > 0) {
......@@ -256,7 +300,7 @@ export default {
this.$message.success("修改成功!");
this.reload();
}
this.loading = false
this.loading = false;
} else {
// let params = { ...this.dialogForm };
// // // 回填图片
......@@ -275,7 +319,7 @@ export default {
this.$message.success("添加成功!");
this.reload();
}
this.loading = false
this.loading = false;
}
}
});
......@@ -292,13 +336,13 @@ export default {
this.$emit("handleClose");
this.faceImage = [];
})
.catch((_) => { });
.catch((_) => {});
},
},
};
</script>
<style lang='scss' scoped>
<style lang="scss" scoped>
.title {
display: flex;
margin-bottom: 16px;
......@@ -355,4 +399,4 @@ export default {
.video-lists {
display: flex;
}
</style>
\ No newline at end of file
</style>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论