提交 52986b37 authored 作者: 龙菲's avatar 龙菲

增加预览3D文物的弹窗

上级 b86916cc
......@@ -2,7 +2,7 @@
## Project setup
```
npm install
cnpm install 或者npm install 推荐使用cnpm 因为会存在vue-video-player版本问题
```
### Compiles and hot-reloads for development
......
module.exports = {
presets: [
// https://github.com/vuejs/vue-cli/tree/master/packages/@vue/babel-preset-app
'@vue/cli-plugin-babel/preset'
'@vue/cli-plugin-babel/preset',
],
'env': {
'development': {
......
......@@ -15,7 +15,7 @@
},
"dependencies": {
"axios": "0.18.1",
"core-js": "3.6.5",
"core-js": "^3.32.2",
"echarts": "^5.4.0",
"el-tree-transfer": "^2.4.7",
"element-ui": "^2.15.6",
......@@ -23,6 +23,7 @@
"js-md5": "^0.7.3",
"normalize.css": "7.0.0",
"nprogress": "0.2.0",
"online-3d-viewer": "^0.10.0",
"path-to-regexp": "2.4.0",
"vue": "2.6.10",
"vue-awesome-swiper": "^3.1.3",
......
......@@ -17,8 +17,14 @@
>
</el-popconfirm>
</span>
<span class="view-3d" v-else-if="op.type == 'view3D'" >
<svg-icon icon-class="three"></svg-icon>{{ op.title }}</span
<span
class="view-3d"
v-else-if="op.type == 'view3D'"
@click="clickOperation(op)"
>
<el-link type="primary">
<svg-icon icon-class="three"></svg-icon>{{ op.title }}</el-link
></span
>
<el-link
size="mini"
......
<template>
<!-- online_3d_viewer -->
<div
class="online_3d_viewer"
model="/static/3d/yshl.FBX"
:backgroundcolor="backgroundcolor"
></div>
</template>
<script>
import * as ThreeEngine from "online-3d-viewer";
export default {
props: {
// 预览的3D文件的地址
url: {
type: String,
default: "",
},
// 模型背景颜色
backgroundcolor: {
type: String,
default: "0,0,0,80%",
},
},
mounted() {
this.init();
},
methods: {
// 初始化3D查看器
init() {
// tell the engine where to find the libs folder
ThreeEngine.SetExternalLibLocation("libs");
// init all viewers on the page
ThreeEngine.Init3DViewerElements();
},
},
};
</script>
<style lang="scss" scoped>
.online_3d_viewer {
width: 100%;
height: 100%;
min-height: 300px;
min-width: 300px;
}
</style>
......@@ -8,9 +8,9 @@ import getPageTitle from '@/utils/get-page-title'
import { getMenu } from "./api/user";
import { addRouter } from "./utils/addRouter";
import user from "./store/modules/user";
// NProgress.configure({
// showSpinner: false
// }) // NProgress Configuration
NProgress.configure({
showSpinner: false
}) // NProgress Configuration
const whiteList = ['/login'] // no redirect whitelist
......@@ -58,16 +58,13 @@ router.afterEach((to, from) => {
function gotoRouter(to, next) {
getMenu() // 获取动态路由的方法
.then(res => {
console.log(res.data.menus);
// console.log(res.data.menus);
const asyncRouter = addRouter(res.data.menus); // 进行递归解析
return asyncRouter;
//TODO:前端暂时写死
// const asyncRouter = addRouter(); // 进行递归解析
// return asyncRouter;
// store.dispatch("user/setroles", res.data.permit);
})
.then(asyncRouter => {
// 后置添加404页面,防止刷新404
......
......@@ -141,11 +141,9 @@ const actions = {
menus
} = res.data
let menuObj = getMenuObj(menus)
function getMenuObj(menu) {
let obj = {}
traverseMenuList(menu || []);
function traverseMenuList(arr) {
if (arr.length > 0) {
arr.map((item) => {
......
......@@ -62,6 +62,7 @@
</template>
<script>
import { dialogMixins } from "./dialogMixins";
export default {
name: "PreviewDialog",
components: {},
......@@ -90,9 +91,6 @@ export default {
data() {
return {};
},
async created() {
// console.log(this.videos);
},
methods: {
// 取消编辑
cancelForm() {
......
<template>
<el-dialog
:visible="visible"
width="70%"
style="height: 50vh"
:before-close="handleClose"
top="5vh"
lock-scroll
>
<Viewer3d />
</el-dialog>
</template>
<script>
import Viewer3d from "@/components/Viewer3d";
export default {
components: {
Viewer3d,
},
data() {
return {
visible: false,
};
},
methods: {
handleClose() {
this.visible = false;
},
},
};
</script>
<style></style>
......@@ -140,6 +140,12 @@
@handleClose="handleImportRecordClose"
/>
<View3dDialog
ref="View3dDialog"
:visible="view3dDialogVisible"
@handleClose="handleView3dDialogClose"
/>
<el-image-viewer
v-if="imgViewerVisible"
:on-close="closeImgViewer"
......@@ -162,7 +168,7 @@ import {
import InfoEditDialog from "./components/InfoEditDialog";
import UploadListDialog from "./components/UploadListDialog";
import ImportRecordDialog from "./components/ImportRecordDialog";
import View3dDialog from "./components/View3dDialog";
import { importZip } from "@/utils/file";
import { getToken } from "@/utils/auth";
export default {
......@@ -173,6 +179,7 @@ export default {
SearchBar,
ImportRecordDialog,
UploadListDialog,
View3dDialog,
"el-image-viewer": () =>
import("element-ui/packages/image/src/image-viewer"),
},
......@@ -255,6 +262,7 @@ export default {
filesList: [], //上传当中的文件队列
uploadCount: 0, //处于上传中的文件数量,当等于fileList的时候就关闭弹窗,请求完毕一个就++
cancelUploadArr: [], //保存每个文件上传接口对应的取消请求的函数[fn,fn,fn...],点叉叉关闭弹窗就遍历这个全部执行一遍就取消了所以请求
view3dDialogVisible: false, //3D文件在线浏览弹窗可见性
};
},
......@@ -337,11 +345,14 @@ export default {
}
},
async handleOperation(value, row) {
console.log(value, row);
switch (value.type) {
case "add":
this.editVisible = true;
break;
case "view":
case "view3D":
console.log(value, row);
this.$refs.View3dDialog.visible = true;
break;
case "edit":
let detailRes = await getRCDetailById({ crId: row.crId });
......@@ -361,7 +372,6 @@ export default {
// debugger
// this.multiUploadVisible = true;
// console.log("this.multiUploadVisible", this.multiUploadVisible);
break;
case "downloadTemplate":
......@@ -536,10 +546,14 @@ export default {
num: 1,
};
},
// 关闭导入记录弹窗
handleImportRecordClose() {
this.importRecordVisible = false;
},
// 关闭预览3D弹窗
handleView3dDialogClose() {
this.view3dDialogVisible = false;
},
},
};
</script>
......
<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>
<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-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
ref="PageSelect"
label="name"
value="crId"
:select.sync="value"
:url="pageSelectUrl"
filter-key="name"
/> -->
</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>
</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
},
props: {
displayDetail: {
type: Object,
default: () => ({})
},
dicts: {
type: Object,
default: () => ({})
},
},
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);
}
});
}
},
deep: true,
immediate: true
}
},
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);
}
});
}
}
});
},
}
}
</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;
img {
width: 100%;
height: 100%;
object-fit: cover;
}
}
.images-group {
// 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;
}
.base-info {
overflow-x: hidden;
}
</style>
\ No newline at end of file
<template>
<el-dialog
:visible.sync="dialogVisible"
width="80%"
:before-close="handleClose"
top="5vh"
lock-scroll
>
<div class="title" slot="title">
<div class="divider"></div>
<div class="label">{{ title }}</div>
</div>
<div class="dialog-content">
<el-tabs v-model="activeName" v-loading="dialogLoading">
<!-- <el-tab-pane label="基本信息" name="info">
<div class="container">
<BaseInfo :displayDetail="displayDetail" :dicts="dicts" />
</div>
</el-tab-pane> -->
<el-tab-pane label="效果预览" name="page" v-if="!isBoutique">
<div
class="container"
v-if="dicts && Object.keys(displayDetail).length > 0"
>
<NavBar />
<NormalStyle
v-if="displayDetail.themeType == '1'"
:displayDetail="displayDetail"
:dicts="dicts"
/>
<ChStyle
v-if="displayDetail.themeType == '2'"
:displayDetail="displayDetail"
:dicts="dicts"
/>
<RedStyle
v-if="displayDetail.themeType == '3'"
:displayDetail="displayDetail"
:dicts="dicts"
/>
<Footer />
</div>
</el-tab-pane>
<el-tab-pane label="审批历史记录" name="history">
<div class="container">
<el-steps :active="displayDetail.historyChecks.length">
<el-step
v-for="(item, index) in displayDetail.historyChecks"
:title="getStepTitle(item)"
:key="index"
:icon="getStepIcon(item)"
>
<div slot="description">
<div class="name">{{ item.createName }}</div>
<div class="time">{{ item.createTime }}</div>
<div class="desc">{{ item.remark }}</div>
</div>
</el-step>
</el-steps>
</div>
</el-tab-pane>
</el-tabs>
<div class="dialog-footer">
<span v-if="displayDetail.checkStatus == 0">
<el-button
size="mini"
@click.native="handleCancel"
style="margin-right: 6px"
>取消</el-button
>
<el-popover
placement="top-end"
width="400"
trigger="manual"
v-model="popoverVisible"
>
<div>
<el-form
size="mini"
:model="dialogForm"
prop="remark"
:rules="rules"
ref="form"
>
<el-form-item label="驳回意见" prop="remark">
<el-input
type="textarea"
placeholder="驳回意见"
v-model="dialogForm.remark"
size="mini"
:rows="4"
>
</el-input>
<el-button
size="mini"
type="primary"
style="float: right; margin-top: 16px"
@click.native="handleCheck(-2)"
>确定</el-button
>
</el-form-item>
</el-form>
</div>
<el-button
size="mini"
slot="reference"
type="danger"
icon="el-icon-close"
@click.native="handleShowPopover"
>驳回</el-button
>
</el-popover>
<el-button
size="mini"
style="margin-left: 6px"
type="primary"
icon="el-icon-check"
@click.native="handleCheck(1)"
>同意</el-button
>
</span>
<span v-else>
<el-button size="mini" type="primary" @click.native="handleClose">关闭</el-button>
</span>
</div>
</div>
</el-dialog>
</template>
<script>
import NormalStyle from "@/views/display/components/templates/NormalStyle.vue";
// import NormalStyle from "./components/NormalStyle.vue";
import ChStyle from "@/views/display/components/templates/ChStyle.vue";
import RedStyle from "@/views/display/components/templates/RedStyle.vue";
import BaseInfo from "./BaseInfo";
import { mapGetters } from "vuex";
import { postCheck } from "@/api/display";
import NavBar from "@/components/NavBar";
import Footer from "@/components/Footer";
import { titles } from "@/utils/boutiqueTitles";
export default {
name: "PreviewDialog",
components: {
NormalStyle,
ChStyle,
RedStyle,
BaseInfo,
NavBar,
Footer,
},
props: {
visible: {
type: Boolean,
default: false,
},
displayDetail: {
type: Object,
default: () => ({}),
},
loading: {
type: Boolean,
default: false,
},
},
computed: {
...mapGetters(["dicts"]),
title() {
return "审批——" + this.displayDetail.title;
},
getStepTitle(item) {
return (item) => {
switch (item.checkStatus) {
case 0:
return "发起审核";
case 1:
return "审核通过";
case -2:
return "驳回";
}
};
},
getStepIcon(item) {
return (item) => {
switch (item.checkStatus) {
case 0:
return "el-icon-s-promotion";
case 1:
return "el-icon-s-claim";
case -2:
return "el-icon-circle-close";
}
};
},
isBoutique() {
this.activeName = titles.includes(this.displayDetail.title)
? "history"
: "page";
return titles.includes(this.displayDetail.title);
},
},
watch: {
visible: {
handler: function (value) {
this.dialogVisible = value;
},
immediate: true,
deep: true,
},
loading(value) {
this.dialogLoading = value;
},
},
data() {
return {
dialogVisible: false,
dialogForm: {
remark: "", //驳回意见
},
activeName: "page",
historyChecks: [],
dialogLoading: false,
rules: {
remark: [
{
required: true,
message: "请输入驳回意见",
trigger: "blur",
},
],
},
popoverVisible: false,
};
},
async mounted() {
await this.$store.dispatch("dict/getDictList", [
"displayType",
"displayCharacter",
]);
},
methods: {
handleClose(done) {
this.$emit("handleClose");
this.activeName = titles.includes(this.displayDetail.title)
? "history"
: "page";
},
async handleCheck(checkStatus) {
if (checkStatus == -2) {
this.$refs.form.validate(async (valid) => {
if (valid) {
this.dialogLoading = true;
const params = {
sourceId: this.displayDetail.exhibitionId,
checkStatus,
remark: this.dialogForm.remark,
sourceType: "biz_exhibition",
sourceName: this.displayDetail.title,
};
let res = await postCheck(params);
if (res.code == 0) {
this.$message.success("操作成功!");
this.handleClose();
this.$emit("refresh");
this.$refs.form.resetFields();
}
this.dialogLoading = false;
this.popoverVisible = false;
}
});
} else {
this.dialogLoading = true;
const params = {
sourceId: this.displayDetail.exhibitionId,
checkStatus,
remark: this.dialogForm.remark,
sourceType: "biz_exhibition",
sourceName: this.displayDetail.title,
};
let res = await postCheck(params);
if (res.code == 0) {
this.$message.success("操作成功!");
this.handleClose();
this.$emit("refresh");
this.$refs.form.resetFields();
}
this.dialogLoading = false;
this.popoverVisible = false;
}
},
handleShowPopover() {
this.popoverVisible = true;
},
handleCancel() {
this.handleClose();
this.$emit("refresh");
this.$refs.form.resetFields();
this.popoverVisible = false;
this.dialogLoading = false;
},
},
};
</script>
<style lang="scss" scoped>
::v-deep .el-step.is-horizontal {
max-width: 300px !important;
}
.title {
display: flex;
margin-bottom: 16px;
.divider {
width: 8px;
border-left: 4px solid #409eff;
margin-right: 8px;
}
.label {
font-weight: bold;
}
}
.dialog-content {
padding: 0 32px;
.container {
border: 1px dashed #409eff;
height: calc(64vh);
overflow: auto;
padding: 46px;
.desc {
color: #666 !important;
}
.name {
color: #333 !important;
}
.time {
color: #999 !important;
}
}
}
::v-deep .el-dialog__wrapper {
overflow: hidden !important;
}
::v-deep .el-step__title {
color: #333;
font-weight: bold;
}
// ::v-deep .el-dialog__body {
// position: relative;
// }
.dialog-footer {
display: flex;
justify-content: flex-end;
margin-top: 40px;
// position: absolute;
// width:100%;
bottom: 0;
position: sticky;
// height: 100px;
}
// ::v-deep .el-dialog__footer {
// position: sticky !important;
// }
.video-container {
background-color: #000;
display: flex;
justify-content: center;
}
.el-dialog__body {
padding: 0 20px 30px 20px;
}
</style>
export const displayTabletitle = [{
prop: "title",
label: "标题",
columnAlign: 'center',
showOverFlowToolTip: true,
},
// {
// prop: "keyword",
// label: "关键词",
// columnAlign: 'center',
// showOverFlowToolTip: true,
// },
{
prop: "deptName",
label: "展览单位",
columnAlign: 'center',
showOverFlowToolTip: true,
},
{
prop: "type",
label: "展览类型",
columnAlign: 'center',
isDisplayType: true,
showOverFlowToolTip: true,
},
{
prop: "faceImageUrl",
label: "封面",
columnAlign: 'center',
isFaceImage: true,
width: 130
},
{
prop: "checkStatus",
label: "状态",
columnAlign: 'center',
},
{
prop: "checkRemark",
label: "备注",
columnAlign: 'center',
showOverFlowToolTip: true,
},
]
export const operates = {
operate: true,
label: "操作",
width: "260px",
minwidth: "220px",
titleAlign: "center",
columnAlign: "center",
}
export const approvalOperations = [{
type: 'approval',
title: '审批'
}
]
export const viewOperations = [{
type: 'view',
title: '查看详情'
}
]
export const crTabletitle = [{
prop: "name",
label: "名称",
columnAlign: 'center',
showOverFlowToolTip: true,
},
// {
// prop: "level",
// label: "文物级别",
// columnAlign: 'center',
// },
// {
// prop: "detailSize",
// label: "尺寸",
// columnAlign: 'center',
// },
// {
// prop: "textureType",
// label: "质地",
// columnAlign: 'center',
// },
// {
// prop: "type",
// label: "类别",
// width: 100,
// columnAlign: 'center',
// isCulturalRelicType:true
// },
// {
// prop: "createId",
// label: "创建人",
// columnAlign: 'center',
// },
// {
// prop: "createTime",
// label: "创建时间",
// columnAlign: 'center',
// },
{
prop: "deptName",
label: "馆藏单位",
columnAlign: 'center',
showOverFlowToolTip: true,
},
{
prop: "regionName",
label: "所属地",
columnAlign: 'center',
showOverFlowToolTip: true,
},
// {
// prop: "intro",
// label: "馆藏介绍",
// columnAlign: 'center',
// showOverFlowToolTip: true,
// width: 120,
// },
{
prop: "themeWord",
label: "主题词",
columnAlign: 'center',
showOverFlowToolTip: true,
},
{
prop: "faceImageUrl",
label: "封面",
columnAlign: 'center',
isFaceImage: true,
},
{
prop: "status",
label: "上下架状态",
width: 100,
columnAlign: 'center',
isStatus: true
},
{
prop: "num",
label: "数量",
columnAlign: 'center',
},
{
prop: "sourceWay",
label: "来源方式",
columnAlign: 'center',
showOverFlowToolTip: true,
},
{
prop: "remark",
label: "备注",
columnAlign: 'center',
},
// directory 文件夹
// flag3d 是否有3d图片
// updateId 更新人
]
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
<template>
<div class="app-container">
<div class="top-bar">
<SearchBar :config="searchConfig" @search="search" @reset="reset" />
<!-- <el-button
type="primary"
@click.native="handleOperation({ type: 'add' })"
icon="el-icon-plus"
>
发布</el-button
>
</div> -->
</div>
<el-tabs v-model="activeName" type="border-card" ref="tabs">
<el-tab-pane :label="item.label" :name="item.name" v-for="(item, tabIndex) in tabs" :key="tabIndex">
<TablePage :data="dataList[tabIndex].records" :tableTitle="tableTitle" :operates="tableOperates" v-loading="loading">
<template v-slot:checkStatus="data">
<!-- {{ data.scope.checkStatus }} -->
<el-tag type="primary" v-if="data.scope.checkStatus == 0">
待审核
</el-tag>
<el-tag type="success" v-if="data.scope.checkStatus == 1">
已通过
</el-tag>
<el-tag type="danger" v-if="data.scope.checkStatus == -2">
已驳回
</el-tag>
</template>
<template v-slot:displayType="data">
{{ dicts.displayType[data.scope.type] }}
</template>
<template v-slot:faceImageUrl="data">
<img :src="
$getFullUrl(data.scope.faceImagePressUrl || data.scope.faceImageUrl)
" alt="暂无图片" v-if="$getFullUrl(data.scope.faceImagePressUrl || data.scope.faceImageUrl)"
style="cursor: pointer" width="100px" @click="handelPreviewImages(data.scope.faceImageUrl)" />
</template>
<template v-slot:operates="scope">
<TableOperation :operations="tableOperations" :rawData="scope.scope.row" @handleOperation="handleOperation">
</TableOperation>
</template>
</TablePage>
<el-pagination style="margin: 16px 0" @size-change="handleSizeChange" @current-change="handleCurrentChange"
:current-page="Number(dataList[currentTabIndex].current)" :page-sizes="[10, 20, 50, 100]"
:page-size="Number(dataList[currentTabIndex].size)" layout="total, sizes, prev, pager, next, jumper"
:total="Number(dataList[currentTabIndex].total)" class="pagination">
</el-pagination>
</el-tab-pane>
</el-tabs>
<PreviewDisplayDialog v-if="Object.keys(curPreviewObj).length > 0"
:visible="previewDialogVisible"
:displayDetail="curPreviewObj"
:loading="previewLoading"
@handleClose="handleClosePreviewDialog"
@refresh="loadData" />
<el-image-viewer v-if="imgViewerVisible" :on-close="closeImgViewer" :url-list="imgList" />
</div>
</template>
<script>
import TablePage from "@/components/Table/TablePage.vue";
import TableOperation from "@/components/Table/TableOperation.vue";
import PreviewDisplayDialog from './components/PreviewDisplayDialog.vue'
import { displayTabletitle, operates, approvalOperations, viewOperations } from "./config";
import {
getListPer,
getDisplayCheckById,
} from "@/api/display";
import SearchBar from "@/components/SearchBar";
import { mapGetters } from "vuex";
export default {
components: {
TablePage,
TableOperation,
SearchBar,
PreviewDisplayDialog,
"el-image-viewer": () =>
import("element-ui/packages/image/src/image-viewer"),
},
data() {
let that = this;
return {
dataList: [
{
record: [],
size: 10,
current: 1,
total: 0,
},
{
record: [],
size: 10,
current: 1,
total: 0,
},
{
record: [],
size: 10,
current: 1,
total: 0,
}
],
searchConfig: [
{
prop: "title",
type: "input",
label: "展览名称",
},
],
loading: false,
imgViewerVisible: false,
previewDialogVisible: false,
curPreviewObj: {}, //当前预览的对象
currentPageIds: [], //当前的id数组,用于给详情页切换用
tabs: [{
name: '0',
label: '待审核'
}, {
name: '1',
label: '已通过'
},
{
name: '-2',
label: '已驳回'
}
],
activeName: '0',
currentTabIndex: 0,
dialogLoading:false
};
},
computed: {
...mapGetters(["dicts"]),
tableTitle() {
return displayTabletitle;
},
tableOperates() {
return operates;
},
tableOperations() {
if (this.activeName == '0') {
return approvalOperations
} else {
return viewOperations
}
}
},
watch: {
activeName(value) {
this.currentTabIndex = Number(Math.abs(value)) //当前索引正好对应状态的绝对值
this.loadData()
}
},
async created() {
await this.$store.dispatch("dict/getDictList", ["displayType"]);
this.loadData();
},
methods: {
async search(form) {
var params = {
page: 1,
limit: this.dataList[this.currentTabIndex].size,
...form,
};
if (params.status == "") {
delete params.status;
}
let res = await getListPer(params);
if (res.code == 0) {
this.$set(this.dataList, this.currentTabIndex, res.data)
// this.dataList[this.currentTabIndex] = res.data
// this.currentPageIds = this.dataList[this.currentTabIndex].records.map((item) => {
// return item.exhibitionId;
// });
}
},
reset() {
this.loadData();
},
// 加载表格数据
async loadData() {
this.loading = true
var params = {
page: this.dataList[this.currentTabIndex].current,
limit: this.dataList[this.currentTabIndex].size,
checkStatus: Number(this.activeName)
};
let res = await getListPer(params);
if (res.code == 0) {
this.$set(this.dataList, this.currentTabIndex, res.data)
// this.currentPageIds = this.dataList[this.currentTabIndex].records.map((item) => {
// return item.exhibitionId;
// });
}
this.loading = false
},
async handleOperation(value, row) {
console.log(value, row);
// debugger
if (value.type == 'approval' || value.type == 'view') {
this.previewLoading = true
if (row) {
this.previewDialogVisible = true;
let res = await getDisplayCheckById({ exhibitionId: row.exhibitionId });
this.curPreviewObj = res.data;
this.previewLoading = false;
}
}
},
// 多选
handleSelectionChange(val) {
this.multipleSelection = val;
},
// 改变页容量
handleSizeChange(value) {
this.dataList[this.currentTabIndex].size = value;
this.loadData();
},
// 改变当前显示页
handleCurrentChange(value) {
this.dataList[this.currentTabIndex].current = value;
this.loadData();
},
// 关闭Dialog
handleClose() {
this.editDialogVisible = false;
this.form = {
status: 1,
faceImage: "", // 封面(图片1张)
images: "", //展览图片
videos: "", //展览视频
audios: "", //展览音频
exhibitionUnits: [], //布展单元
};
},
// 关闭预览图片
closeImgViewer() {
this.imgViewerVisible = false;
},
// 预览图片
handelPreviewImages(images) {
this.imgViewerVisible = true;
this.imgList = [images];
},
handleClosePreviewDialog() {
this.previewDialogVisible = false;
}
},
};
</script>
<style lang="scss" scoped>
.top-bar {
display: flex;
justify-content: space-between;
flex-direction: column;
height: 68px;
}
.tools {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 14px;
.tools-item {
display: flex;
&:last-child {
justify-content: flex-end;
}
}
}
</style>
\ No newline at end of file
export const data = {
size: 10,
current: 1,
records: [
{
"audios": "",
"browseCount": "30",
"checkRemark": "",
"checkStatus": 1,
"collectCount": "0",
"collectCountStatus": 0,
"crIds": "",
"deptId": "1534803328939085826",
"deptName": "贵州省博物馆",
"displayCharacter": "0",
"endDate": "2023-11-21 00:00:00",
"exhibitionId": "8c383d8fb63649d0bc36279940e52de9",
"faceImage": "9ce20dbfdc96491b9eadbd105d1cb506",
"faceImageMiddleUrl": "http://222.85.214.245:9604/files/exhibitionImport/2022-12-12-7e1827a974b74fcb86aa39617bf46d15/贵州省博物馆-百年征程 贵州故事展览修改版22/faceImage/middle/展览序厅效果图.jpg",
"faceImagePressUrl": "http://222.85.214.245:9604/files/exhibitionImport/2022-12-12-7e1827a974b74fcb86aa39617bf46d15/贵州省博物馆-百年征程 贵州故事展览修改版22/faceImage/low/展览序厅效果图.jpg",
"faceImageUrl": "http://222.85.214.245:9604/files/exhibitionImport/2022-12-12-7e1827a974b74fcb86aa39617bf46d15/贵州省博物馆-百年征程 贵州故事展览修改版22/faceImage/展览序厅效果图.jpg",
"images": "84c6d50c92524c638e7e364728e2b3a4,236263f975e444c9a12f4b799f6dcbf4,696872c6266648d391aff712ffe309d8,1b777199b937412dbebf0dd53d731bde,f7a2362944854ebab80d92f7e1343a48,4d89caf53b5d4b848b5722f17bce9f40,fa3d837f2ffc4f1699a9a177ff769411,8c212b024e69452e8a3fdfbc08c71edb,a3a13ca8d068448eba9e8528e0e0b8f9,969eee9d622042799cfd19700208bd55,7decedfd4fa1437588e6d7976001a680,51f6d61a445b4d35be35a55c87180d28,e11bab0b581a49548df2308291d769aa,a144d796a6224adc8ce2142b5c6d6109,48c99f4394d44e9cb2112681a3b85de5,9913b492d9dc4ac5bd474a6e78fcc995,1780f39735b2427998b056e9ee4b4f17,a982db7325f642039e6913734dbb2f46,a9974697e08a4aedb68faa9483b4b748,4f3162e069f64f6d96e2e93fcace2a53,bb93dd7aad2f49f0927235a865e0c163,f993139e02704a1ca4bb7de0413493f3,33002251f7e047e7b79756e029ac84ef,6b593d7cd7d5428b9cc32778443393e2,bddd65bbb54049c88472f780680d5cbb,a827983dfde44f75ae80bac3917baafb,f70501d320694751b7a43b2fa87b0569,5cacc4365fa846b8b08937f3efdfd982,f866039169b748ffa8d7dd5d7621c633,76efb70884074a678e791b53b427ccef,5870f889555646b78f05d7e7939e7350,3ceba43b47864fa4817fb30c79936a3c",
"intro": "展览分为四个部分。第一部分主要讲述新民主主义革命时期的贵州为中国革命做出的重要贡献;第二部分主要展示贵州在社会主义革命及建设时期的成就;第三部分展现贵州在改革开放和社会主义现代化建设时期的成就;第四部分主要展示中国特色社会主义新时代时期的贵州的主要成就和贡献。整个展览用史料和文物还原重大历史事件,直观而浓缩地展现了在贵州这片土地上,中国共产党自成立以来领导中国人民推动革命、建设和改革事业不断取得胜利的伟大历程。",
"keyword": "",
"literature": "",
"loveCount": "0",
"loveCountStatus": 0,
"regionCode": "520115000000",
"regionName": "观山湖区",
"remark": "",
"shareCount": "0",
"startDate": "2022-10-20 00:00:00",
"status": "1",
"themeType": "3",
"title": "百年征程 贵州故事",
"type": "5",
"videos": "9cfa851b-2765-421a-b33b-a972fc643113"
},
{
"audios": "",
"browseCount": "612",
"checkRemark": "",
"checkStatus": 1,
"collectCount": "1",
"collectCountStatus": 0,
"crIds": "b059cce7a7454d3aabacbfef34ce4b95,3a2e8d702e3245bc8c0bcc42d8f18d33,dac1984d5ca74f48b6183ff4525f180c,3151a4da11e24807b088d52ce008a491",
"deptId": "1547938320995581954",
"deptName": "贵州省地质博物馆",
"displayCharacter": "1",
"endDate": null,
"exhibitionId": "f15d665f-d9ba-4e4b-bb45-344aeaf100e5",
"faceImage": "8c3c80aa-532f-4eb6-82a9-f461a7704ba6",
"faceImageMiddleUrl": "",
"faceImagePressUrl": "http://222.85.214.245:9604/files/2022-09-29-18afbd95-8a6e-48de-af09-73f87460adad/low/3、第一单元 沉积巨著3.png",
"faceImageUrl": "http://222.85.214.245:9604/files/2022-09-29-18afbd95-8a6e-48de-af09-73f87460adad/3、第一单元 沉积巨著3.png",
"images": "fb7fc4ba-7faf-48cd-b5d6-7fb11e1ab618,ba5026e5-6a0a-45fc-803f-c8488c99a379,f993f40c-918d-4c4b-98b6-bfa606be23aa,b0b9185d-a3bf-4bda-be51-9685f179e785,44bf9aa6-85db-4b9a-b37c-7deb098535ab,ce6be196-62d0-453c-922f-c6342ca4e875,9c266a9e-7fd2-43be-8396-fb21abe9470c,8dd964cb-b8ed-469c-9168-97c60c115982,b04f7a47-a458-4878-99f5-9cca3ca412a2,65b4790d-bb83-4d26-9c37-5114ec2003b3,acdec23d-00b0-4301-bbfd-44b76e3494b6,19538037-1b9c-4a37-b4ca-ea28017b5a3a,1bab0c9c-4677-4453-8de8-854ed4194ef6,f571c9f3-09fb-4099-93c8-efbe3a585cee,7801872a-69ab-46cc-a0fc-9fe31cc1652b,2f07820a-27ef-4f48-a1f4-6d418c9f4696,642bbf1b-5401-44f2-bc2b-4749ca497ba8,bc6122be-bd61-4d6b-ac3b-03faa23d25b6,89bb9ae2-5471-45b7-89a1-86ef53b401b7,ffdd5f75-6a8f-4217-8f62-4035db913fda",
"intro": "<p>\t贵州具有悠久的地质历史,经历了复杂多样的地质环境,不同的地质环境造就了形形色色的生物面貌。贵州的地层完好地保存了这些地质历史中匆匆的时间过客,为多彩贵州增添了大量丰富多彩的精美化石,讲述着贵州地质历史中轰轰烈烈的远古故事,记录了生命进行曲中的精彩乐章。其中有很多化石群已经进入了国际古生物化石的宝典,成为世界知名的古生物群落。</p>",
"keyword": "",
"literature": "e265d9d26dc941539d715d3bd78c25c4",
"loveCount": "1",
"loveCountStatus": 0,
"regionCode": "520000000000",
"regionName": "贵州省",
"remark": "",
"shareCount": "0",
"startDate": null,
"status": "1",
"themeType": "2",
"title": "神秘贵州",
"type": "1",
"videos": "38757ab8-9525-4a46-af3a-8568fe255c8f,b6479257-8b1b-44d3-bae6-88ea32b9eed4"
},
{
"audios": "",
"browseCount": "1178",
"checkRemark": "",
"checkStatus": 1,
"collectCount": "1",
"collectCountStatus": 0,
"crIds": "b059cce7a7454d3aabacbfef34ce4b95,3a2e8d702e3245bc8c0bcc42d8f18d33,dac1984d5ca74f48b6183ff4525f180c,3151a4da11e24807b088d52ce008a491,95702d901d274bda9304fdd2feada9d1,030fdcf2-98d5-46a8-81c4-2c2f47c5097d,bd772b17-6e7c-4d34-9fca-96ddd473d73e,2511fd05-8ad1-4e55-9b27-99aaa266c869",
"deptId": "1544860909990707201",
"deptName": "贵州省民族博物馆",
"displayCharacter": "1",
"endDate": null,
"exhibitionId": "9e337c57-ec8f-455e-9c91-12a4f7384475",
"faceImage": "bc82ed47-3a48-49d9-a9a6-4261e4492f49",
"faceImageMiddleUrl": "",
"faceImagePressUrl": "http://222.85.214.245:9604/files/2022-09-29-0bf1a936-d60c-4f54-9186-11afabe32bdb/low/1 世居展千年之行 序厅.JPG",
"faceImageUrl": "http://222.85.214.245:9604/files/2022-09-29-0bf1a936-d60c-4f54-9186-11afabe32bdb/1 世居展千年之行 序厅.JPG",
"images": "099e0e50-1d46-42ec-816f-93bd239fae8f,3e62ea23-3a59-4654-8cd5-d4e69fa2d318,740f77b2-b817-4e71-99be-21af6c86b602,2a87b07c-c787-46d6-a6bb-3ee84f0daa6b,5ebd4926-cd27-495b-8a47-badfaf019a77,e350ee51-00ea-452a-a107-c3b2ab13a01b,46477d7b-a006-4b5c-9583-c3ad14034f7b,a4c87b45-df2c-4634-ac32-cd952169f89a,8e17058f-fc9a-4ec4-99d9-b9aeddee7056,7b1d27fa-6ce0-4478-81ec-70585b6efa26,acc9ca0e-9c8d-4ce3-959f-3097d2db3cef,d16d5d8a-7db0-45c5-a3be-a79533e4f8eb,5ae4742d-23d1-4df3-8e09-bda361574fae,40da09bf-efbd-4f7c-a2f2-00b2f76ea3b6,b7082e01-e746-44a3-9406-d48fc3eef775",
"intro": "<p><strong>\t</strong>展览分历史、文化2部分,分别展示贵州各世居民族历史源流脉络和各类丰富多彩的民族文化风情。</p><p>\t经田野调查和广泛征求意见,深入村寨筛选征集各民族代表性文物,通过57组1191件文物,以主题选定和组织各类精美文物,以文物关联和变迁展示历史脉络,以文物工艺展现文化魅力,掌握展陈节奏,有效诠释主题。</p><p>\t千年之行——从历史角度,按苗、布依、侗、土家等18个世居民族独立章节深挖各民族源流和发展脉络,讲述“贵州民族团结典范”的故事,解答贵州各民族和谐共处的因由。</p><p>\t大美不言——介绍了“你中有我、我中有你”的多彩贵州民族文化,通过“寻耕牧人家”“看百彩千辉”“探礼俗民风”“赏歌舞曲艺”四大章节,分类介绍农林、建筑、药食、织绣、服饰、风俗、节庆和歌戏等风情,在林业中见生态、在苗绣中见精彩、在服饰中见时尚、在歌舞中见幸福。</p>",
"keyword": "",
"literature": "1e01dca3-5c78-4fdf-9a92-9e2041335bfd,e265d9d26dc941539d715d3bd78c25c4",
"loveCount": "3",
"loveCountStatus": 0,
"regionCode": "520102000000",
"regionName": "南明区",
"remark": "",
"shareCount": "0",
"startDate": null,
"status": "1",
"themeType": "2",
"title": "记忆与传承 ——贵州世居民族历史文化展",
"type": "1",
"videos": "7529a541-adfe-4e33-b595-f77ec4bbfbf9"
},
{
"audios": "",
"browseCount": "284",
"checkRemark": "",
"checkStatus": 1,
"collectCount": "1",
"collectCountStatus": 0,
"crIds": "",
"deptId": "1572772619448086530",
"deptName": "贵州三线建设博物馆",
"displayCharacter": "1",
"endDate": null,
"exhibitionId": "d1c59d10-98dc-47e3-990a-f2299b8cfbc1",
"faceImage": "7304ee9c-d0be-4519-9aff-44e648938805",
"faceImageMiddleUrl": "",
"faceImagePressUrl": "http://222.85.214.245:9604/files/2022-09-06-106e64ca-d0f8-4f35-bfc5-03b89cd8a634/low/焦作矿区选送人员支援六盘水矿区..jpg",
"faceImageUrl": "http://222.85.214.245:9604/files/2022-09-06-106e64ca-d0f8-4f35-bfc5-03b89cd8a634/焦作矿区选送人员支援六盘水矿区..jpg",
"images": "051ccce6-81b7-4376-8af3-35810c48fa77,065d8d49-d46d-4f29-ac68-4c1b7daef2c8,66f45ccd-9a02-499b-83e5-6fdaad6aded2",
"intro": "二十世纪六十年代中期,由于国际局势紧张,中国大陆所处的地缘环境十分恶劣。严峻的战争形势,迅速引起了党中央和毛泽东同志的高度重视。在1964年5月的中央工作会议上,中共中央果断作出了三线建设的战略决策。从国家安全的角度,把全国按地域划分为一、二、三线的战略布局,即沿海、东北地区为一线;中部地区为二线;西部包括贵州在内涉及13个省、区的纵深地带为三线。\n三线建设战略决策的实施,实质上是我国在战备条件下的工业大迁移和工业大开发,是我国国防建设、经济建设和社会建设的一项伟大创举",
"keyword": "",
"literature": "a3ec3901550c48c786b7c4e5db1c4abf",
"loveCount": "0",
"loveCountStatus": 0,
"regionCode": "520000000000",
"regionName": "贵州省",
"remark": "",
"shareCount": "0",
"startDate": null,
"status": "1",
"themeType": "3",
"title": "贵州三线建设",
"type": "2",
"videos": ""
}
]
}
......@@ -181,8 +181,6 @@ export default {
this.$store
.dispatch("user/login", params)
.then(async () => {
// debugger
// await this.$store.dispatch('user/getMenuList')
this.$router.push({ path: this.redirect || "/" });
this.loading = false;
})
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论