提交 ba3882c5 authored 作者: 龙菲's avatar 龙菲

增加审核管理

上级 afa6208a
...@@ -18,14 +18,16 @@ ...@@ -18,14 +18,16 @@
"core-js": "3.6.5", "core-js": "3.6.5",
"echarts": "^5.4.0", "echarts": "^5.4.0",
"el-tree-transfer": "^2.4.7", "el-tree-transfer": "^2.4.7",
"element-ui": "2.13.2", "element-ui": "^2.15.6",
"js-cookie": "2.2.0", "js-cookie": "2.2.0",
"normalize.css": "7.0.0", "normalize.css": "7.0.0",
"nprogress": "0.2.0", "nprogress": "0.2.0",
"path-to-regexp": "2.4.0", "path-to-regexp": "2.4.0",
"vue": "2.6.10", "vue": "2.6.10",
"vue-awesome-swiper": "^3.1.3",
"vue-quill-editor": "^3.0.6", "vue-quill-editor": "^3.0.6",
"vue-router": "3.0.6", "vue-router": "3.0.6",
"vue-video-player": "^5.0.2",
"vuex": "3.1.0" "vuex": "3.1.0"
}, },
"devDependencies": { "devDependencies": {
......
...@@ -59,3 +59,12 @@ export function getCulturalRelicStatistic(params) { ...@@ -59,3 +59,12 @@ export function getCulturalRelicStatistic(params) {
}) })
} }
// 获取文物审核列表
export function getCrChecklist(data) {
return request({
url: '/bizCulturalRelic/checklistByPagePer',
method: 'post',
data
})
}
...@@ -57,4 +57,32 @@ export function getExhibitionStatistic(params) { ...@@ -57,4 +57,32 @@ export function getExhibitionStatistic(params) {
method: 'get', method: 'get',
params params
}) })
} }
\ No newline at end of file
// 获取展览审核列表
// export function getDisplayChecklist(data) {
// return request({
// url: '/bizExhibition/checklistByPagePer',
// method: 'post',
// data
// })
// }
// 查询审批结果
export function getDisplayCheckById(params) {
return request({
url: '/bizExhibition/getCheckById',
method: 'get',
params
})
}
// 查询审批结果
export function postCheck(data) {
return request({
url: '/bizCheck/check',
method: 'post',
data
})
}
<template> <template>
<div> <div class="reader-operations">
<div class="operations"> <span class="operations">
<span class="operation-item" v-if="like"> <span class="operation-item" v-if="like">
<svg-icon <!-- <svg-icon @click="handleLike" icon-class="like-s" :style="{
:icon-class="loveCountStatus ? 'mz-like-s' : 'mz-like'" fontSize: iconSize + 'px',
:style="{ color: loveCountStatus ? selectColor : '#61666d',
fontSize: iconSize + 'px', }"></svg-icon> -->
color: loveCountStatus ? selectColor : '#61666d', <span>{{
}" formatNum(loveCount) == 0 ? "点赞" : formatNum(loveCount)
></svg-icon> }}</span>
<span>{{ formatNum(loveCount)?formatNum(loveCount):'点赞' }}</span>
</span> </span>
<span class="operation-item" v-if="collect"> <span class="operation-item" v-if="collect">
<svg-icon <!-- <svg-icon icon-class="collect-s-2" :style="{
:icon-class="collectCountStatus ? 'collect-s' : 'collect'" fontSize: iconSize + 'px',
:style="{ color: collectCountStatus ? selectColor : '#61666d',
fontSize: iconSize + 'px', }"></svg-icon> -->
color: collectCountStatus ? selectColor : '#61666d', <span>{{
}" formatNum(collectCount) == 0 ? "收藏" : formatNum(collectCount)
></svg-icon> }}</span>
<span>{{ formatNum(collectCount) }}</span>
</span> </span>
<span v-if="share" class="operation-item"> <span v-if="share" class="operation-item">
<svg-icon <!-- <svg-icon icon-class="share2" :style="{
icon-class="mz-fx" fontSize: iconSize + 'px',
class="collect" }"></svg-icon> -->
:style="{
fontSize: iconSize + 'px',
color: selectColor,
}"
></svg-icon>
<span>分享</span> <span>分享</span>
</span> </span>
</div> </span>
</div> </div>
</template> </template>
<script> <script>
import { formatNum } from "@/utils/index"; import { mapGetters } from "vuex";
import { debounce, formatNum } from "@/utils/index";
export default { export default {
name: "ReaderOperations", name: "ReaderOperations",
props: { props: {
...@@ -92,11 +86,11 @@ export default { ...@@ -92,11 +86,11 @@ export default {
}, },
iconSize: { iconSize: {
type: [Number, String], type: [Number, String],
default:40, default: 28,
}, },
selectColor: { selectColor: {
type: String, type: String,
default: "#2069c4", default: "$themeColor",
}, },
}, },
data() { data() {
...@@ -106,7 +100,11 @@ export default { ...@@ -106,7 +100,11 @@ export default {
curLink: "", //当前地址栏的链接 curLink: "", //当前地址栏的链接
}; };
}, },
computed: {
...mapGetters(["token", "showLoginDialog"]),
},
methods: { methods: {
formatNum(num) { formatNum(num) {
return formatNum(num); return formatNum(num);
}, },
...@@ -115,47 +113,76 @@ export default { ...@@ -115,47 +113,76 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
$themeColor: #132c33;
.reader-operations {
width: 100%;
max-width: 300px;
}
.operations { .operations {
// margin-top: 22px; // margin-top: 22px;
width: 100%;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
.operation-item { .operation-item {
display: flex; display: flex;
align-items: center; align-items: center;
// margin-right: 32px; // margin-right: 32px;
cursor: pointer; cursor: pointer;
font-size: 14px;
} }
.svg-icon { .svg-icon {
margin-right: 10px; margin-right: 10px;
font-size: 36px; font-size: 24px;
color: #61666d; color: #61666d;
} }
.like { .like {
color: #831122; color: #831122;
} }
.collect { .collect {
color: #831122; color: #831122;
} }
} }
.el-button--text { .el-button--text {
color: #2069c4; color: $themeColor;
} }
.qrcode,
.copy { .copy {
display: flex; display: flex;
// justify-content: space-between;
align-items: center; align-items: center;
height: 180px;
} }
.qrcode { .qrcode {
.img-container { .img-container {
width: 200px; width: 200px;
height: 200px; height: 200px;
img { img {
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
} }
} }
::v-deep .el-input-group__append {
padding: 0 40px;
}
::v-deep .dialog-footer {
.el-button {
border-radius: 0;
}
.el-button--primary {
border: none;
background-color: $themeColor;
}
}
</style> </style>
\ No newline at end of file
<template>
<div class="firstDiv">
<div class="centerDiv">
<div class="thumb-example">
<!-- 大轮播图 -->
<swiper
class="swiper gallery-top"
:options="swiperOptionTop"
ref="swiperTop"
>
<swiper-slide
class="slide-item"
v-for="(item, index) in imgList"
:key="index"
>
<img :src="$getFullUrl(item.pressUrl)" alt="" />
<div class="enlarge" @click="handelPreviewImages(imgList)">
<img src="@/assets/imgs/enlarge-s.png" alt="" />
</div>
</swiper-slide>
<div
class="swiper-button-next swiper-button-white"
slot="button-next"
></div>
<div
class="swiper-button-prev swiper-button-white"
slot="button-prev"
></div>
</swiper>
<!-- 小缩略图 -->
<swiper
class="swiper gallery-thumbs"
:options="swiperOptionThumbs"
ref="swiperThumbs"
>
<swiper-slide
class="slide-item"
v-for="(item, index) in imgList"
:key="index"
>
<img :src="$getFullUrl(item.pressUrl)" alt="" />
</swiper-slide>
</swiper>
</div>
</div>
<el-image-viewer
v-if="imgViewerVisible"
:on-close="closeImgViewer"
:url-list="previewList"
/>
</div>
</template>
<script>
import { swiper, swiperSlide } from "vue-awesome-swiper";
import "swiper/dist/css/swiper.css";
export default {
name: "SlideImage",
components: {
swiper,
swiperSlide,
"el-image-viewer": () =>
import("element-ui/packages/image/src/image-viewer"),
},
props: {
imgKey: {
type: String,
default: "pressUrl",
},
imgList: {
type: Array,
default: () => [],
},
},
data() {
return {
swiperOptionTop: {
loop: false,
loopedSlides: 8, // looped slides should be the same
spaceBetween: 10,
navigation: {
nextEl: ".swiper-button-next",
prevEl: ".swiper-button-prev",
},
},
swiperOptionThumbs: {
loop: false,
loopedSlides: 8, // looped slides should be the same
spaceBetween: 10,
centeredSlides: true,
slidesPerView: "auto",
touchRatio: 0.2,
slideToClickedSlide: true,
},
imgViewerVisible: false,
};
},
mounted() {
this.$nextTick(() => {
const swiperTop = this.$refs.swiperTop.swiper;
const swiperThumbs = this.$refs.swiperThumbs.swiper;
swiperTop.controller.control = swiperThumbs;
swiperThumbs.controller.control = swiperTop;
});
},
methods: {
handelPreviewImages(items) {
this.imgViewerVisible = true;
this.previewList = items.map((item) => this.$getFullUrl(item.url));
},
closeImgViewer() {
this.imgViewerVisible = false;
},
},
};
</script>
<style scoped lang="scss">
.firstDiv {
/* width: 1920px; */
/* height: 1080px; */
width: 100%;
height: 100%;
position: relative;
}
.centerDiv {
width: 100%;
height: 100%;
background-color: #f5f5f9;
/* width: 900px; */
/* height: 800px; */
/* position: absolute; */
/* left: 510px; */
/* top: 200px; */
}
.thumb-example {
height: 100%;
background-color: transparent;
}
.swiper-slide {
background-size: cover;
background-position: center;
}
.slide-item {
background: #f5f5f9;
position: relative;
img {
width: 100%;
height: 100%;
object-fit: contain;
}
}
.enlarge {
position: absolute;
bottom: 30px;
right: 30px;
display: flex;
z-index: 9;
background-color: #c1925b;
width: 40px;
height: 40px;
border-radius: 12px;
display: flex;
justify-content: center;
align-items: center;
margin-right: 10px;
cursor: pointer;
img {
width: 24px;
height: 24px;
}
}
.gallery-top {
height: 80%;
width: 100%;
}
.gallery-thumbs {
height: 20%;
box-sizing: border-box;
padding: 10px 0;
}
.gallery-thumbs .swiper-slide {
width: 20%;
height: 100%;
opacity: 0.4;
}
.gallery-thumbs .swiper-slide-active {
opacity: 1;
}
</style>
\ No newline at end of file
<template>
<div class="card-slider">
<div class="swiper">
<swiper
class="swiper gallery-top"
:options="swiperOptionTop"
ref="swiperTop"
>
<swiper-slide
class="slide-item"
v-for="(item, index) in imgList"
:key="index"
>
<img :src="item.pressUrl" alt="" />
<!-- <div class="enlarge" @click="handelPreviewImages(imgList)">
<img src="@/assets/imgs/enlarge-s.png" alt="" />
</div> -->
</swiper-slide>
<div
class="swiper-button-next swiper-button-white"
slot="button-next"
></div>
<div
class="swiper-button-prev swiper-button-white"
slot="button-prev"
></div>
</swiper>
</div>
<!-- <el-image-viewer
v-if="imgViewerVisible"
:on-close="closeImgViewer"
:url-list="previewList"
/> -->
</div>
</template>
<script>
import { swiper, swiperSlide } from "vue-awesome-swiper";
import "swiper/dist/css/swiper.css";
export default {
name: "SlideImage",
components: {
swiper,
swiperSlide,
/* "el-image-viewer": () =>
import("element-ui/packages/image/src/image-viewer"), */
},
props: {
imgKey: {
type: String,
default: "pressUrl",
},
imgList: {
type: Array,
default: () => [],
},
},
data() {
return {
swiperOptionTop: {
loop: true,
loopedSlides: 8, // looped slides should be the same
spaceBetween: 10,
navigation: {
nextEl: ".swiper-button-next",
prevEl: ".swiper-button-prev",
},
},
imgViewerVisible: false,
};
},
/* mounted() {
this.$nextTick(() => {
const swiperTop = this.$refs.swiperTop.swiper;
const swiperThumbs = this.$refs.swiperThumbs.swiper;
swiperTop.controller.control = swiperThumbs;
swiperThumbs.controller.control = swiperTop;
});
}, */
methods: {
handelPreviewImages(items) {
this.imgViewerVisible = true;
this.previewList = items.map((item) => this.$getFullUrl(item.url));
},
closeImgViewer() {
this.imgViewerVisible = false;
},
},
};
</script>
<style lang="scss" scoped>
.card-slider {
width: 100%;
height: 100%;
.slide-item {
background: transparent;
position: relative;
img {
width: 100%;
height: 100%;
object-fit: contain;
}
}
}
</style>
<template>
<div class="slide-img-group">
<div class="list">
<swiper
class="swiper gallery-thumbs"
:options="swiperOptionThumbs"
ref="swiperThumbs"
>
<swiper-slide
class="slide-item"
v-for="(item, index) in imgList"
:key="index"
@click="handleClickItem(item)"
>
<!-- <img :src="item.pressUrl || item.faceImagePressUrl" alt="" /> -->
<div class="img-container" @click="handelPreviewImages(imgList)">
<slot name="img" :item="item"></slot>
</div>
<slot name="info" :item="item" />
<!-- <div
class="enlarge"
@click="handelPreviewImages(imgList)"
v-if="needEnlarge"
>
<img src="@/assets/imgs/enlarge-s.png" alt="" />
<span>查看大图</span>
</div> -->
</swiper-slide>
<div class="swiper-pagination" slot="pagination"></div>
<div class="swiper-button-next swiper-button-white" slot="button-next">
<i class="el-icon-arrow-right"></i>
</div>
<div class="swiper-button-prev swiper-button-white" slot="button-prev">
<i class="el-icon-arrow-left"></i>
</div>
<!--分页器。如果放置在swiper外面,需要自定义样式。-->
</swiper>
</div>
<el-image-viewer
v-if="imgViewerVisible"
:on-close="closeImgViewer"
:url-list="previewList"
/>
</div>
</template>
<script>
import { swiper, swiperSlide } from "vue-awesome-swiper";
import "swiper/dist/css/swiper.css";
export default {
name: "SlideImageGroup",
components: {
swiper,
swiperSlide,
"el-image-viewer": () =>
import("element-ui/packages/image/src/image-viewer"),
},
props: {
imgKey: {
type: String,
default: "pressUrl",
},
imgList: {
type: Array,
default: () => [],
},
needEnlarge: {
type: Boolean,
default: false,
},
},
data() {
return {
swiperOptionThumbs: {
loop: false,
loopedSlides: 8, // looped slides should be the same
spaceBetween: 10,
slidesPerView: 4,
navigation: {
nextEl: ".swiper-button-next",
prevEl: ".swiper-button-prev",
},
pagination: {
el: ".swiper-pagination",
clickable: true,
},
},
imgViewerVisible: false,
};
},
mounted() {},
methods: {
handelPreviewImages(items) {
this.imgViewerVisible = true;
this.previewList = items.map((item) => this.$getFullUrl(item.url));
},
closeImgViewer() {
this.imgViewerVisible = false;
},
handleClickItem(item) {
debugger;
this.$emit("handleClickItem", item);
},
},
};
</script>
<style scoped lang="scss">
$themeColor:#132c33;
.slide-img-group {
height: 100%;
}
.swiper-container {
// padding: 0 60px;
::v-deep .swiper-wrapper {
display: flex;
// justify-content: center;
}
}
.list,
.swiper,
.swiper-wrapper {
height: 100%;
}
.swiper-slide {
background-size: cover;
background-position: center;
}
.slide-item {
position: relative;
height: 100%;
display: flex;
flex-direction: column;
padding-bottom: 10px;
.img-container {
width: 100%;
// height: 100%;
background: #f5f5f9;
height: 200px;
cursor: pointer;
img {
width: 100%;
height: 100%;
object-fit: fill;
}
}
}
.swiper-button-next,
.swiper-button-prev {
background-image: none;
width: 60px;
height: 60px;
display: flex;
justify-content: center;
align-items: center;
color: $themeColor;
font-weight: bolder;
font-size: 28px;
transform: translateY(-20px);
}
.enlarge {
position: absolute;
bottom: 19px;
right: -7px;
display: flex;
z-index: 9;
display: flex;
justify-content: center;
align-items: center;
margin-right: 10px;
background: rgba($color: #000000, $alpha: 0.3);
cursor: pointer;
color: #fff;
font-size: 12px;
padding: 4px 8px;
img {
width: 12px;
height: 12px;
margin-right: 4px;
}
}
::v-deep .swiper-pagination-bullets{
bottom: 0;
}
</style>
\ No newline at end of file
...@@ -41,9 +41,12 @@ ...@@ -41,9 +41,12 @@
<template v-else-if="item.isStatus"> <template v-else-if="item.isStatus">
<slot name="status" :scope="scope.row"></slot> <slot name="status" :scope="scope.row"></slot>
</template> </template>
<template v-else-if="item.prop=='checkStatus'">
<slot name="checkStatus" :scope="scope.row"></slot>
</template>
<template v-else-if="item.prop == 'years'"> <template v-else-if="item.prop == 'years'">
<slot name="years" :scope="scope.row"></slot> <slot name="years" :scope="scope.row"></slot>
</template> </template>
<template v-else-if="item.prop == 'level'"> <template v-else-if="item.prop == 'level'">
<slot name="level" :scope="scope.row"></slot> <slot name="level" :scope="scope.row"></slot>
......
<template> <template>
<div class="images-list"> <div class="images-list">
<el-upload <el-upload :disabled="onlyRead" action="#" :on-remove="handleRemove" :on-exceed="handleExceed" :on-change="handleChange"
action="#" :file-list="fileList" :multiple="fileLimit > 1" :limit="fileLimit" :list-type="listType" :accept="fileAccept"
:on-remove="handleRemove" :auto-upload="false" ref="ManualUploader" :class="{ disabled: uploadDisabled }">
:on-exceed="handleExceed" <i v-if="listType === 'picture-card'" class="el-icon-plus" slot="trigger"></i>
:on-change="handleChange" <el-button v-else size="small" type="primary" >点击上传</el-button>
:file-list="fileList"
:multiple="fileLimit > 1"
:limit="fileLimit"
:list-type="listType"
:accept="fileAccept"
:auto-upload="false"
ref="ManualUploader"
:class="{ disabled: uploadDisabled }"
>
<i
v-if="listType === 'picture-card'"
class="el-icon-plus"
slot="trigger"
></i>
<el-button v-else size="small" type="primary">点击上传</el-button>
<div v-if="showTip" slot="tip" class="el-upload__tip"> <div v-if="showTip" slot="tip" class="el-upload__tip">
<div v-if="advice" style="color: #f56c6c">建议:{{ advice }}</div> <div v-if="advice" style="color: #f56c6c">建议:{{ advice }}</div>
...@@ -67,6 +52,10 @@ export default { ...@@ -67,6 +52,10 @@ export default {
advice: { advice: {
type: String, type: String,
}, },
onlyRead: {
type: Boolean,
default: false
}
}, },
data() { data() {
return { return {
...@@ -144,7 +133,7 @@ export default { ...@@ -144,7 +133,7 @@ export default {
} }
}); });
return newFileList; return newFileList;
}else{ } else {
return this.fileList; return this.fileList;
} }
}, },
...@@ -224,6 +213,7 @@ export default { ...@@ -224,6 +213,7 @@ export default {
.disabled .el-upload--picture-card { .disabled .el-upload--picture-card {
display: none !important; display: none !important;
} }
.el-upload-list__item { .el-upload-list__item {
transition: none !important; transition: none !important;
} }
......
<template>
<div class="m-video">
<video-player ref="videoPlayer" @play="autoIncrement" @timeupdate="onPlayerTimeupdate($event)"
@ready="playerReadied" :playsinline="true" :options="playerOptions">
</video-player>
</div>
</template>
<script>
export default {
props: {
src: {
type: String,
default: "",
},
},
computed: {
player() {
return this.$refs.videoPlayer.player
},
},
watch:{
src(newSrc){
console.log('newSrc',newSrc);
this.toggle(newSrc)
}
},
data() {
return {
playerOptions: {
playbackRates: [0.7, 1.0, 1.5, 2.0], // 播放速度
autoplay: false, // 如果true,浏览器准备好时开始回放。
muted: false, // 默认情况下将会消除任何音频。
loop: false, // 导致视频一结束就重新开始。
preload: "auto", // 建议浏览器在<video>加载元素后是否应该开始下载视频数据。auto浏览器选择最佳行为,立即开始加载视频(如果浏览器支持)
language: "zh-CN",
// aspectRatio: '16:9', // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。值应该代表一个比例 - 用冒号分隔的两个数字(例如'16:9'或'4:3')
fluid: true, // 当true时,Video.js player将拥有流体大小。换句话说,它将按比例缩放以适应其容器。
sources: [
{
// type: '',// 这里的种类支持很多种:基本视频格式、直播、流媒体等,具体可以参看git网址项目
type: "video/mp4",
src: this.src, // url地址
},
],
// poster: '../../static/images/test.jpg', // 你的封面地址
// width: document.documentElement.clientWidth, // 播放器宽度
notSupportedMessage: "此视频暂无法播放,请稍后再试", // 允许覆盖Video.js无法播放媒体源时显示的默认信息。
controlBar: {
timeDivider: true,
durationDisplay: true,
remainingTimeDisplay: false,
fullscreenToggle: true, // 全屏按钮
playbackRateMenuButton: true,
chaptersButton: {},
audioTrackButton: true,
descriptionsButton: true,
},
controls: true,
},
};
},
methods: {
// ------------- 当播放时 ---------------
autoIncrement(player) {
/* this.$emit('autoIncrement', player)
this.player = player */
// player.currentTime(this.playTime)
},
// ----------- 当前播放进度更新时 ---------
onPlayerTimeupdate(player) {
// console.log('当前时间', player)
// this.playTime = player.cache_.currentTime // 获取当前播放进度(时间)
},
onPlayerCanplay() {
let player = this.$refs.videoPlayer.player;
player.play();
},
playerReadied(player) { },
toggle(newSrc){
this.player.src(newSrc)
}
},
};
</script>
<style lang="scss" scoped>
.m-video {
height: 100%;
::v-deep .video-player {
height: 100%;
.video-js {
video {
// object-fit: fill;
}
&.vjs-fluid {
height: 100% !important;
padding-top: 0;
}
.vjs-big-play-button {
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
.vjs-control-bar {
.vjs-icon-custombutton {
font-family: VideoJS;
font-weight: normal;
font-style: normal;
}
.vjs-icon-custombutton:before {
content: "\f108";
font-size: 1.8em;
line-height: 1.67;
}
}
}
}
}
</style>
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1669855676059" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2024" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48"><path d="M810.96 872.17H219.11c-28.38 0-51.48-23.09-51.48-51.48V675.26c0-28.39 23.1-51.48 51.48-51.48h591.85c28.38 0 51.48 23.09 51.48 51.48v145.43c0 28.39-23.1 51.48-51.48 51.48z m-591.85-201.1c-2.27 0-4.19 1.92-4.19 4.19v145.43c0 2.23 1.96 4.19 4.19 4.19h591.85c2.23 0 4.19-1.96 4.19-4.19V675.26c0-2.27-1.92-4.19-4.19-4.19H219.11zM191.28 900.27h647.51v47.29H191.28zM515.04 533.28c-126.56 0-229.53-102.97-229.53-229.53S388.47 74.21 515.04 74.21s229.53 102.97 229.53 229.53S641.6 533.28 515.04 533.28z m0-411.78c-100.49 0-182.24 81.76-182.24 182.24s81.75 182.24 182.24 182.24 182.24-81.76 182.24-182.24S615.53 121.5 515.04 121.5z" p-id="2025"></path><path d="M348.378 650.824l11.836-194.958 47.195 2.865-11.836 194.959zM622.721 458.752l47.195-2.86 11.816 194.958-47.195 2.86z" p-id="2026"></path></svg>
\ No newline at end of file
...@@ -12,7 +12,7 @@ import Layout from '@/layout' ...@@ -12,7 +12,7 @@ import Layout from '@/layout'
// let e_new = { // let e_new = {
// path: e.path, // path: e.path,
// name: e.menuName, // name: e.menuName,
// component: resolve => e.component === Layout ? require([`@/layout`], resolve) : require([`@/views/${e.component}/index`], resolve) // component: resolve => e.component === 'Layout' ? require([`@/layout`], resolve) : require([`@/views/${e.component}/index`], resolve)
// } // }
// if (e.children) { // if (e.children) {
// const children = addRouter(e.children) // const children = addRouter(e.children)
...@@ -124,27 +124,27 @@ export function addRouter() { ...@@ -124,27 +124,27 @@ export function addRouter() {
path: 'approval', path: 'approval',
name: 'Approval', name: 'Approval',
component: () => import('@/views/approval/index'), component: () => import('@/views/approval/index'),
redirect: '/crApproval', // redirect: '/crApproval',
meta: { meta: {
title: '审批管理', title: '审批管理',
icon: 'approval' icon: 'approval'
}, },
children: [ children: [
{ // {
path: 'crApproval', // path: 'crApproval',
name: 'CrApproval', // name: 'CrApproval',
component: () => import('@/views/approval/culturalRelic.vue'), // component: () => import('@/views/approval/culturalRelic.vue'),
meta: { // meta: {
title: '文物', // title: '文物',
icon: 'culturalRelic' // icon: 'culturalRelic'
} // }
}, // },
{ {
path: 'displayApproval', path: 'displayApproval',
name: 'DisplayApproval', name: 'DisplayApproval',
component: () => import('@/views/approval/display.vue'), component: () => import('@/views/approval/display.vue'),
meta: { meta: {
title: '展览', title: '展览审批',
icon: 'display' icon: 'display'
} }
} }
......
...@@ -234,3 +234,17 @@ export function renderSize(value) { ...@@ -234,3 +234,17 @@ export function renderSize(value) {
size = size.toFixed(2);//保留的小数位数 size = size.toFixed(2);//保留的小数位数
return size + unitArr[index]; return size + unitArr[index];
} }
// 监听某元素是否在可视区,使用getBoundingClientRect
export const isElementInViewport2 = function (content) {
let scrollTop =
window.pageYOffset ||
document.documentElement.scrollTop ||
document.body.scrollTop;
let clientHeight =
document.documentElement.clientHeight || window.innerHeight;
if (content) {
return (content.offsetTop + content.offsetHeight > scrollTop &&
content.offsetTop < scrollTop + clientHeight)
}
};
差异被折叠。
<template>
<el-dialog :visible.sync="dialogVisible" width="80%" style="height: 98%" :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-descriptions class="margin-top" title="文物详情" :column="3" :size="size" border>
<template slot="extra">
<el-button type="primary" size="small">同意</el-button>
<el-button type="danger" size="small">驳回</el-button>
</template>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-user"></i>
文物名称
</template>
{{crDetail.name}}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-mobile-phone"></i>
馆藏介绍
</template>
18100000000
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-mobile-phone"></i>
文物封面
</template>
18100000000
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-mobile-phone"></i>
文物图片
</template>
18100000000
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-mobile-phone"></i>
文物视频
</template>
18100000000
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-mobile-phone"></i>
文物音频
</template>
18100000000
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-mobile-phone"></i>
馆藏单位
</template>
18100000000
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-location-outline"></i>
文物类别
</template>
苏州市
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-tickets"></i>
文物质地
</template>
<el-tag size="small">学校</el-tag>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-office-building"></i>
文物年代
</template>
江苏省苏州市吴中区吴中大道 1188 号
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-office-building"></i>
文物级别
</template>
江苏省苏州市吴中区吴中大道 1188 号
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-office-building"></i>
文物数量
</template>
江苏省苏州市吴中区吴中大道 1188 号
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-office-building"></i>
关联文献
</template>
江苏省苏州市吴中区吴中大道 1188 号
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-office-building"></i>
主题词
</template>
江苏省苏州市吴中区吴中大道 1188 号
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-office-building"></i>
3durl链接
</template>
江苏省苏州市吴中区吴中大道 1188 号
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
<i class="el-icon-office-building"></i>
备注
</template>
江苏省苏州市吴中区吴中大道 1188 号
</el-descriptions-item>
</el-descriptions>
<div class="dialog-footer">
<el-button type="primary" @click="handleClose">关闭</el-button>
</div>
</div>
</el-dialog>
</template>
<script>
import { mapGetters } from "vuex";
export default {
name: "PreviewDialog",
components: {
},
props: {
visible: {
type: Boolean,
default: false,
},
crDetail: {
type: Object,
default: () => ({}),
},
},
computed: {
...mapGetters(["dicts"]),
title() {
return "预览——" + this.crDetail.name;
},
},
watch: {
visible: {
handler: function (value) {
this.dialogVisible = value;
},
immediate: true,
deep: true,
},
},
data() {
return {
dialogVisible: false,
};
},
async mounted() {
await this.$store.dispatch("dict/getDictList", [
"displayType",
"displayCharacter",
]);
},
methods: {
handleClose(done) {
this.$emit("handleClose");
},
},
};
</script>
<style lang='scss' scoped>
.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;
display: flex;
flex-direction: column;
.relate {
flex: 1;
}
.dialog-footer {
display: flex;
justify-content: flex-end;
margin-top: 40px;
}
}
.video-container {
background-color: #000;
display: flex;
justify-content: center;
}
.el-dialog__body {
padding: 0 20px 30px 20px;
}
</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">
<el-tab-pane label="基本信息" name="info">
<BaseInfo :displayDetail="displayDetail" :dicts="dicts" />
</el-tab-pane>
<el-tab-pane label="效果预览" name="page">
<div class="container" v-if="dicts">
<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" />
</div>
</el-tab-pane>
<el-tab-pane label="审批历史记录" name="history">
<div class="container">
<el-steps :active="displayDetail.historyChecks.length" align-center>
<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">
<el-button @click="handleClose" style="margin-right:6px">取消</el-button>
<el-popover placement="top-end" width="400" trigger="click">
<div>
<el-form :model="dialogForm">
<el-form-item label="驳回意见" prop="remark">
<el-input placeholder="驳回意见" v-model="dialogForm.remark" size="small">
<el-button type="primary" slot="append" @click.native="handleCheck(-2)">确定</el-button>
</el-input>
</el-form-item>
</el-form>
</div>
<el-button slot="reference" type="danger" icon="el-icon-close">驳回</el-button>
</el-popover>
<el-button style="margin-left:6px" type="primary" icon="el-icon-check"
@click.native="handleCheck(1)">同意</el-button>
</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'
export default {
name: "PreviewDialog",
components: {
NormalStyle,
ChStyle,
RedStyle,
BaseInfo
},
props: {
visible: {
type: Boolean,
default: false,
},
displayDetail: {
type: Object,
default: () => ({}),
},
},
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-check'
case 1:
return 'el-icon-s-claim'
case -2:
return 'el-icon-circle-close'
}
}
},
},
watch: {
visible: {
handler: function (value) {
this.dialogVisible = value;
},
immediate: true,
deep: true,
},
},
data() {
return {
dialogVisible: false,
dialogForm: {
remark: '',//驳回意见
},
activeName: 'info'
};
},
async mounted() {
await this.$store.dispatch("dict/getDictList", [
"displayType",
"displayCharacter",
]);
console.log('this.dicts',this.dicts);
},
methods: {
handleClose(done) {
this.$emit("handleClose");
},
handleCheck(checkStatus) {
console.log('checkStatus', checkStatus);
// postCheck()
}
},
};
</script>
<style lang='scss' scoped>
.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: 16px 0;
.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>
\ No newline at end of file
export const title = [{ export const displayTabletitle = [{
prop: "title", prop: "title",
label: "标题", label: "标题",
columnAlign: 'center', columnAlign: 'center',
width: 120, width: 120,
showOverFlowToolTip: true, showOverFlowToolTip: true,
}, },
// {
// prop: "keyword",
// label: "关键词",
// columnAlign: 'center',
// showOverFlowToolTip: true,
// },
{ {
prop: "keyword", prop: "deptName",
label: "关键词", label: "展览单位",
columnAlign: 'center', columnAlign: 'center', showOverFlowToolTip: true,
showOverFlowToolTip: true,
}, },
{ {
prop: "type", prop: "type",
...@@ -19,7 +24,6 @@ export const title = [{ ...@@ -19,7 +24,6 @@ export const title = [{
showOverFlowToolTip: true, showOverFlowToolTip: true,
}, },
{ {
prop: "faceImageUrl", prop: "faceImageUrl",
label: "封面", label: "封面",
...@@ -28,19 +32,17 @@ export const title = [{ ...@@ -28,19 +32,17 @@ export const title = [{
width: 130 width: 130
}, },
{ {
prop: "remark", prop: "checkStatus",
label: "备注", label: "状态",
columnAlign: 'center', showOverFlowToolTip: true, columnAlign: 'center',
}, },
{ {
prop: "status", prop: "checkRemark",
label: "状态", label: "备注",
columnAlign: 'center', columnAlign: 'center',
isStatus: true showOverFlowToolTip: true,
}, },
] ]
export const operates = { export const operates = {
...@@ -52,10 +54,137 @@ export const operates = { ...@@ -52,10 +54,137 @@ export const operates = {
columnAlign: "center", columnAlign: "center",
} }
export const operations = [{ export const approvalOperations = [{
type: 'approval', type: 'approval',
title: '审批' 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>
<router-view />
</template>
<script>
export default {
}
</script>
<style>
</style>
\ No newline at end of file
...@@ -81,14 +81,14 @@ ...@@ -81,14 +81,14 @@
<svg-icon icon-class="keyword"></svg-icon> <svg-icon icon-class="keyword"></svg-icon>
关键词:</span 关键词:</span
> >
<span class="value">{{ displayDetail.keyword }}</span> <span class="value">{{ displayDetail.keyword || '暂无'}}</span>
</div> </div>
<div class="body-item"> <div class="body-item">
<span class="label"> <span class="label">
<svg-icon icon-class="zllx"></svg-icon>展览类型:</span <svg-icon icon-class="zllx"></svg-icon>展览类型:</span
> >
<span class="value">{{ <span class="value">{{
dicts.displayType[displayDetail.type] dicts.displayType[displayDetail.type] || '暂无'
}}</span> }}</span>
</div> </div>
<div class="body-item"> <div class="body-item">
...@@ -96,20 +96,20 @@ ...@@ -96,20 +96,20 @@
<svg-icon icon-class="zlxz"></svg-icon>展览性质:</span <svg-icon icon-class="zlxz"></svg-icon>展览性质:</span
> >
<span class="value">{{ <span class="value">{{
dicts.displayCharacter[displayDetail.displayCharacter] dicts.displayCharacter[displayDetail.displayCharacter]|| '暂无'
}}</span> }}</span>
</div> </div>
<div class="body-item"> <div class="body-item">
<span class="label" <span class="label"
><svg-icon icon-class="zldw"></svg-icon>展览单位:</span ><svg-icon icon-class="zldw"></svg-icon>展览单位:</span
> >
<span class="value">{{ displayDetail.deptName }}</span> <span class="value">{{ displayDetail.deptName|| '暂无' }}</span>
</div> </div>
<div class="body-item"> <div class="body-item">
<span class="label" <span class="label"
><svg-icon icon-class="zldq"></svg-icon>展览地区:</span ><svg-icon icon-class="zldq"></svg-icon>展览地区:</span
> >
<span class="value">{{ displayDetail.regionName }}</span> <span class="value">{{ displayDetail.regionName || '暂无'}}</span>
</div> </div>
</div> </div>
</el-col> </el-col>
...@@ -279,25 +279,6 @@ ...@@ -279,25 +279,6 @@
</div> </div>
</el-carousel-item> </el-carousel-item>
</el-carousel> </el-carousel>
<!-- <el-col
:span="24 / curUnit.imagesVo.length"
v-for="item in curUnit.imagesVo"
:key="item.euId"
class="margin-bottom-32 unit-content_images_container"
>
<img :src="$getFullUrl(item.pressUrl)" width="100%" />
<div
class="enlarge"
@click="handelPreviewImages(curUnit.imagesVo)"
>
<img src="@/assets/imgs/enlarge-s.png" alt="" />
</div>
<div class="unit-content_images_desc">
{{ item.name }}
</div>
</el-col> -->
</div> </div>
<div <div
class="unit-content_videos" class="unit-content_videos"
......
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
<el-row> <el-row>
<el-col class="item"> <el-col class="item">
<div class="label">关键词:</div> <div class="label">关键词:</div>
<div class="value">{{ displayDetail.keyword }}</div> <div class="value">{{ displayDetail.keyword ||'暂无' }}</div>
</el-col> </el-col>
<el-col class="item" v-if="dicts.displayType"> <el-col class="item" v-if="dicts.displayType">
<div class="label">展览类型:</div> <div class="label">展览类型:</div>
...@@ -55,7 +55,7 @@ ...@@ -55,7 +55,7 @@
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col class="item" v-if="dicts.displayCharacter"> <el-col class="item" v-if="(dicts.displayCharacter && displayDetail.displayCharacter)">
<div class="label">展览性质:</div> <div class="label">展览性质:</div>
<div class="value"> <div class="value">
{{ {{
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论