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

布展模板

上级 c606f2ae
<template>
<audio
ref="audio"
@pause="onPause"
@play="onPlay"
@timeupdate="onTimeupdate"
@loadedmetadata="onLoadedmetadata"
:src="url"
controls="controls"
></audio>
</template>
<script>
// 将整数转换成 时:分:秒的格式
function realFormatSecond(second) {
var secondType = typeof second;
if (secondType === "number" || secondType === "string") {
second = parseInt(second);
var hours = Math.floor(second / 3600);
second = second - hours * 3600;
var mimute = Math.floor(second / 60);
second = second - mimute * 60;
return (
hours + ":" + ("0" + mimute).slice(-2) + ":" + ("0" + second).slice(-2)
);
} else {
return "0:00:00";
}
}
export default {
name: "AudioPlayer",
props: {
url: String,
},
data() {
return {
audio: {
// 该字段是音频是否处于播放状态的属性
playing: false,
// 音频当前播放时长
currentTime: 0,
// 音频最大播放时长
maxTime: 0,
},
};
},
methods: {
// 控制音频的播放与暂停
startPlayOrPause() {
return this.audio.playing ? this.pause() : this.play();
},
// 播放音频
play() {
this.$refs.audio.play();
},
// 暂停音频
pause() {
this.$refs.audio.pause();
},
// 当音频播放
onPlay() {
this.audio.playing = true;
},
// 当音频暂停
onPause() {
this.audio.playing = false;
},
// 当timeupdate事件大概每秒一次,用来更新音频流的当前播放时间
onTimeupdate(res) {
this.audio.currentTime = res.target.currentTime;
},
// 当加载语音流元数据完成后,会触发该事件的回调函数
// 语音元数据主要是语音的长度之类的数据
onLoadedmetadata(res) {
console.log("loadedmetadata");
console.log(res);
this.audio.maxTime = parseInt(res.target.duration);
},
},
};
</script>
<style>
</style>
<template>
<div
class="container wow animate__animated animate__fadeInUp"
v-if="url"
>
<div class="img">
<img
:src="url"
v-if="url"
width="100%"
class="img"
lazy
/>
<img
v-else
src="@/assets/404_images/no-pic.png"
alt=""
width="100%"
height="100%"
class="img"
/>
</div>
<div class="desc">
<span class="name">{{ title }}</span>
</div>
</div>
</template>
<script>
export default {
name: "CulturalRelicCard",
props: {
url: {
type: String,
default: "",
},
title: {
type: String,
default: "",
},
},
methods: {},
};
</script>
<style lang='scss' scoped>
$blue: #2069c4;
.container {
border: 1px solid #f1f1f1;
height: 300px;
position: relative;
display: flex;
flex-direction: column;
cursor: pointer;
&:hover {
// img {
// transform: scale(1.2);
// }
.desc {
background-color: $blue;
color: #fff;
}
}
.img {
background-color: #f8f8f8;
height: 240px;
cursor: pointer;
transition: all 0.5s ease;
overflow: hidden;
img {
height: 100%;
object-fit: contain;
// width: auto;
}
}
.desc {
padding: 16px;
display: flex;
justify-content: center;
transition: all 0.5s ease;
flex: 1;
}
}
</style>
\ No newline at end of file
<template>
<audio
ref="audio"
@pause="onPause"
@play="onPlay"
@timeupdate="onTimeupdate"
@loadedmetadata="onLoadedmetadata"
:src="url"
controls="controls"
></audio>
</template>
<script>
// 将整数转换成 时:分:秒的格式
function realFormatSecond(second) {
var secondType = typeof second;
if (secondType === "number" || secondType === "string") {
second = parseInt(second);
var hours = Math.floor(second / 3600);
second = second - hours * 3600;
var mimute = Math.floor(second / 60);
second = second - mimute * 60;
return (
hours + ":" + ("0" + mimute).slice(-2) + ":" + ("0" + second).slice(-2)
);
} else {
return "0:00:00";
}
}
export default {
name: "AudioPlayer",
props: {
url: String,
},
data() {
return {
audio: {
// 该字段是音频是否处于播放状态的属性
playing: false,
// 音频当前播放时长
currentTime: 0,
// 音频最大播放时长
maxTime: 0,
},
};
},
methods: {
// 控制音频的播放与暂停
startPlayOrPause() {
return this.audio.playing ? this.pause() : this.play();
},
// 播放音频
play() {
this.$refs.audio.play();
},
// 暂停音频
pause() {
this.$refs.audio.pause();
},
// 当音频播放
onPlay() {
this.audio.playing = true;
},
// 当音频暂停
onPause() {
this.audio.playing = false;
},
// 当timeupdate事件大概每秒一次,用来更新音频流的当前播放时间
onTimeupdate(res) {
this.audio.currentTime = res.target.currentTime;
},
// 当加载语音流元数据完成后,会触发该事件的回调函数
// 语音元数据主要是语音的长度之类的数据
onLoadedmetadata(res) {
console.log("loadedmetadata");
console.log(res);
this.audio.maxTime = parseInt(res.target.duration);
},
},
};
</script>
<style>
</style>
<!-- -->
<template>
<div class="custom-title">
{{ text }}
</div>
</template>
<script>
export default {
name: "CustomTitle",
props: {
text: {
type: String,
default: "标题",
},
},
data() {
return {};
},
mounted() {},
methods: {},
};
</script>
<style lang="scss" scoped>
.custom-title {
width: 100%;
padding: 8px;
font-size: 18px;
border-bottom: 1px solid rgba($color: #000000, $alpha: 0.3);
margin-bottom: 32px;
}
</style>
<!-- -->
<template>
<div class="footer">
<span>贵州省文化和旅游厅博物馆处版权所有</span>
<span>中国知网提供技术支持</span>
</div>
</template>
<script>
export default {
name: "Footer",
};
</script>
<style lang="scss" scoped>
.footer{
display: flex;
height: 200px;
padding: 0 24px;
justify-content: center;
align-items: center;
background-color: #2069C4;
color: #fff;
// position: fixed;
// bottom: 0;
// left: 0;
// right: 0;
span{
margin-right: 16px;
}
}
</style>
<!-- -->
<template>
<el-menu
class="sidebar-el-menu"
default-active=""
@open="handleOpen"
@close="handleClose"
:default-openeds="[items[0].euId]"
>
<!-- 遍历菜单 -->
<template v-for="(item) in items">
<!-- 含有子菜单 -->
<template v-if="item.children">
<!-- 第一层 含有子菜单菜单 -->
<el-submenu :index="item.euId" :key="item.title">
<template slot="title">
<div slot="title" @click="handleClick(item)">{{ item.title }}</div>
</template>
<menu-list :items="item.children" v-bind="$attrs" v-on="$listeners"></menu-list
><!--递归调用-->
</el-submenu>
</template>
<!-- 第一层 不含子菜单 -->
<template v-else>
<el-menu-item :index="item.euId" :key="item.title">
<div slot="title" @click="handleClick(item)">{{ item.title }}</div>
</el-menu-item>
</template>
</template>
</el-menu>
</template>
<script>
export default {
name: "MenuList",
props: {
items: Array,
isCollapse: Boolean,
},
inheritAttrs:false,
methods: {
handleOpen(key, keyPath) {
},
handleClose(key, keyPath) {
// console.log(key, keyPath);
},
handleClick(item){
// console.log(item.title);
this.$emit('open',item)
}
},
};
</script>
<style lang="scss" scoped>
</style>
<template>
<div class="nav" id="navbar">
<div class="container">
<div class="logo-container">
<img src="@/assets/imgs/home/logo.png" />
</div>
<div class="right">
<div class="tabs">
<div class="tab-item" v-for="(item, index) in pages" :key="index">
<a>{{ item.name }} </a>
</div>
</div>
<div class="tools">
<div class="wrapper">
<el-button round>
<i class="el-icon-user"></i>
<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "NavBar",
data() {
return {
pages: [
{
name: "首页",
path: "/",
},
{
name: "精品展",
path: "/boutique",
},
{
name: "虚拟展厅",
path: "/virtual",
},
{
name: "展览",
path: "/display",
},
{
name: "文物展",
path: "/culturalRelic",
},
{
name: "博物馆",
path: "/museum",
},
],
};
},
};
</script>
<style lang="scss" scoped>
.tab-item {
a {
color: #fff;
text-decoration: none;
}
}
.home-nav {
position: absolute;
top: 0;
left: 0;
z-index: 9;
background-color: rgba(#000, 0.25) !important;
}
.header-fixed {
position: fixed !important;
background-color: #2069c4 !important;
z-index: 99;
top: 0;
}
.nav {
height: 100px;
width: 100%;
transition: all 0.5s ease;
background-color: #2069c4;
box-shadow: rgba(0, 0, 0, 0.3) 0 1px 5px 0px;
.container {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 70px 0 100px;
overflow: hidden;
.logo-container {
width: 380px;
height: 74px;
}
.right {
display: flex;
height: 100%;
align-items: center;
.tabs {
display: flex;
margin-right: 80px;
min-width: 512px;
height: 100%;
.tab-item {
margin-right: 70px;
color: #fff;
display: flex;
align-items: center;
font-family: "Alibaba-PuHuiTi";
position: relative;
height: 100%;
text-align: center;
a {
font-size: 18px;
white-space: nowrap;
transition: all 0.5s ease;
}
&:hover {
a {
// color: #182f68;
color: #fff8a3;
text-shadow: 0 1px 2px #9fafcb, 1px 0px 2px #9fafcb;
}
}
.router-link-exact-active {
// color: #182f68;
color: #fff8a3;
text-shadow: 0 1px 2px #9fafcb, 1px 0px 2px #9fafcb;
}
}
}
}
}
}
::v-deep .tools {
.el-button {
background: transparent;
border-color: #fff;
color: #fff;
i {
font-size: 16px;
}
}
}
</style>
<template>
<div>
<div class="operations">
<span class="operation-item" v-if="like">
<svg-icon
icon-class="like"
:class="loveCountStatus ? 'like' : ''"
></svg-icon>
<span>{{ loveCount }}</span>
</span>
<span class="operation-item" v-if="collect">
<svg-icon
icon-class="collect"
:class="collectCountStatus ? 'collect' : ''"
></svg-icon>
<span>{{ collectCount }}</span>
</span>
<span v-if="share" class="operation-item">
<svg-icon icon-class="share"></svg-icon>
</span>
</div>
</div>
</template>
<script>
export default {
name: "ReaderOperations",
props: {
// 是否需要点赞,默认需要
like: {
type: Boolean,
default: true,
},
// 是否需要收藏,默认需要
collect: {
type: Boolean,
default: true,
},
// 是否需要分享,默认需要
share: {
type: Boolean,
default: true,
},
// 点赞数量
loveCount: {
type: String,
default: "0",
},
// 收藏数量
collectCount: {
type: String,
default: "0",
},
// 点赞状态
loveCountStatus: {
type: Boolean,
default: false,
},
// 收藏状态
collectCountStatus: {
type: Boolean,
default: false,
},
sourceId: {
type: String,
default: "",
},
// 来源类型 biz_cultural_relic-文物;biz_exhibition-布展;biz_elite_exhibition-精品展
sourceType: {
type: String,
default: "",
},
title: {
type: String,
default: "",
},
},
data() {
return {
loginDialogVisible: false,
shareDialogVisible: false,
curLink: "", //当前地址栏的链接
};
},
};
</script>
<style lang="scss" scoped>
.operations {
margin-top: 22px;
display: flex;
// justify-content: space-between;
.operation-item {
display: flex;
align-items: center;
margin-right: 32px;
cursor: pointer;
}
.svg-icon {
margin-right: 16px;
font-size: 36px;
color: #61666d;
}
.like {
color: #d4237a;
}
.collect {
color: #2069c4;
}
}
</style>
\ No newline at end of file
...@@ -59,6 +59,9 @@ ...@@ -59,6 +59,9 @@
<template v-else-if="item.prop == 'fileSize'"> <template v-else-if="item.prop == 'fileSize'">
<slot name="fileSize" :scope="scope.row"></slot> <slot name="fileSize" :scope="scope.row"></slot>
</template> </template>
<template v-else-if="item.prop == 'themeType'">
<slot name="themeType" :scope="scope.row"></slot>
</template>
<span v-else>{{ scope.row[item.prop] }}</span> <span v-else>{{ scope.row[item.prop] }}</span>
</template> </template>
</el-table-column> </el-table-column>
......
<template>
<div class="video-container" @click="hanleClick">
<video :src="url" class="video-dom" ref="video"></video>
<div class="modal" :style="{ opacity: opacity }">
<div class="play-btn">
<i class="el-icon-caret-right"></i>
</div>
<div class="blur"></div>
</div>
</div>
</template>
<script>
export default {
name: "Video",
props: {
url: {
default: "",
type: String,
},
},
data() {
return {
isPlaying: false,
opacity: 1,
};
},
methods: {
// 播放视频
play() {
this.$refs.video.play();
},
// 暂停视频
pause() {
this.$refs.video.pause();
},
hanleClick() {
this.isPlaying = !this.isPlaying;
if (this.isPlaying) {
this.play();
this.opacity = 0;
} else {
this.pause();
this.opacity = 1;
}
},
},
};
</script>
<style scoped lang='scss'>
.video-container {
position: relative;
height: 100%;
.video-dom {
height: auto;
width: 100%;
}
.modal {
width: 100%;
height: 100%;
background-color: rgba($color: #000000, $alpha: 0.5);
display: flex;
justify-content: center;
align-items: center;
position: absolute;
left: 0;
bottom: 0;
transition: all 0.5s ease;
position: absolute;
z-index: 9;
.play-btn {
width: 100px;
height: 70px;
border: 2px solid #892325;
// background-color: #fff;
border-radius: 20px;
display: flex;
justify-content: center;
align-items: center;
color: #892325;
position: absolute;
z-index: 1;
i {
font-size: 50px;
z-index: 1;
}
}
}
.blur {
width: 100px;
height: 70px;
background-color: #fff;
position: absolute;
left: 50%;
bottom: 50%;
transform: translate(-50%, 50%);
filter: blur(26px);
z-index: 0;
}
}
</style>
\ No newline at end of file
...@@ -297,15 +297,9 @@ export default { ...@@ -297,15 +297,9 @@ export default {
}, },
]; ];
} }
if (this.dialogForm.imagesVo) { this.images = this.dialogForm.imagesVo || [];
this.images = this.dialogForm.imagesVo; this.videos = this.dialogForm.videosVo || [];
} this.audios = this.dialogForm.audiosVo || [];
if (this.dialogForm.videosVo) {
this.videos = this.dialogForm.videosVo;
}
if (this.dialogForm.audiosVo) {
this.audios = this.dialogForm.audiosVo;
}
// 编辑 // 编辑
// 回填状态 // 回填状态
...@@ -479,7 +473,7 @@ export default { ...@@ -479,7 +473,7 @@ export default {
}); });
} }
}); });
// return // return
let unitIds = []; let unitIds = [];
let unitData = [...this.$refs["exhibitionUnits"].getUnitData()]; let unitData = [...this.$refs["exhibitionUnits"].getUnitData()];
// debugger // debugger
......
<template> <template>
<el-dialog <el-dialog
:visible.sync="dialogVisible" :visible.sync="dialogVisible"
width="50%" width="90%"
style="height: 98%" style="height: 98%"
:before-close="handleClose" :before-close="handleClose"
top="5vh" top="5vh"
...@@ -12,47 +12,12 @@ ...@@ -12,47 +12,12 @@
<div class="label">{{ title }}</div> <div class="label">{{ title }}</div>
</div> </div>
<div class="dialog-content"> <div class="dialog-content">
<el-main style="height: 100%"> <NormalStyle
<el-row v-if="videos.length == 1" style="height: 100%"> :displayDetail="displayDetail"
<el-col :span="24" style="height: 100%" class="video-container"> v-if="displayDetail.themeType == '1'"
<video />
:src="videos[0]" <div v-else-if="displayDetail.themeType == '2'">中国风主题</div>
style="height: auto; width: 100%" <div v-else-if="displayDetail.themeType == '3'">红色主题</div>
controls
muted
loop
></video>
</el-col>
</el-row>
<el-row v-if="videos.length > 1" style="height: 100%" :gutter="16">
<template v-for="(item, index) in videos">
<el-col
:span="16"
:key="item"
v-if="index == 0"
style="height: 100%"
class="video-container"
>
<video
:src="videos[0]"
style="height: auto; width: 100%"
controls
loop
></video>
</el-col>
<el-col :span="8" :key="item" v-else>
<video
:src="videos[index]"
style="height: auto; width: 100%"
class="video-container"
controls
loop
></video>
</el-col>
</template>
</el-row>
</el-main>
<div class="dialog-footer"> <div class="dialog-footer">
<el-button type="primary" @click="handleClose">关闭</el-button> <el-button type="primary" @click="handleClose">关闭</el-button>
</div> </div>
...@@ -61,43 +26,45 @@ ...@@ -61,43 +26,45 @@
</template> </template>
<script> <script>
import NormalStyle from "./templates/NormalStyle.vue";
import ChStyle from "./templates/ChStyle.vue";
export default { export default {
name: "PreviewDialog", name: "PreviewDialog",
components: {}, components: {
NormalStyle,
ChStyle,
},
props: { props: {
visible: { visible: {
type: Boolean, type: Boolean,
default: false, default: false,
}, },
videos: { displayDetail: {
type: Array, type: Object,
default: () => [], default: () => ({}),
}, },
}, },
computed: { computed: {
dialogVisible: {
get: function () {
return this.visible;
},
set: function () {},
},
title() { title() {
return "查看视频"; return "预览——" + this.displayDetail.title;
}, },
}, },
dicts: [], watch: {
data() { visible: {
return {}; handler: function (value) {
this.dialogVisible = value;
},
immediate: true,
deep: true,
},
}, },
async created() { data() {
// console.log(this.videos); return {
dialogVisible: false,
};
}, },
methods: {
// 取消编辑
cancelForm() {
this.$emit("handleClose");
},
methods: {
handleClose(done) { handleClose(done) {
this.$emit("handleClose"); this.$emit("handleClose");
}, },
......
export const themeTypeOptions = [{ export const themeTypeOptions = [{
label: "中国风", label: "默认主题",
value: "1" value: "1"
}, },
{ {
label: "模板主题二", label: "中国风",
value: "2" value: "2"
}, },
{ {
label: "模板主题三", label: "红色主题",
value: "3" value: "3"
}, },
] ]
export const themeTypeCode = {
1: '默认主题',
2: '中国风',
3: '红色主题'
}
...@@ -32,36 +32,21 @@ ...@@ -32,36 +32,21 @@
</template> </template>
<template v-slot:faceImageUrl="data"> <template v-slot:faceImageUrl="data">
<img <img
:src="$getFullUrl(data.scope.faceImagePressUrl || data.scope.faceImageUrl)" :src="
$getFullUrl(data.scope.faceImagePressUrl || data.scope.faceImageUrl)
"
alt="查看大图" alt="查看大图"
v-if="$getFullUrl(data.scope.faceImagePressUrl || data.scope.faceImageUrl)" v-if="
$getFullUrl(data.scope.faceImagePressUrl || data.scope.faceImageUrl)
"
style="cursor: pointer" style="cursor: pointer"
width="100px" width="100px"
@click="handelPreviewImages(data.scope.faceImageUrl)" @click="handelPreviewImages(data.scope.faceImageUrl)"
/> />
</template> </template>
<template v-slot:images="data"> <template v-slot:themeType="data">
<span {{ themeTypeCode(data.scope.themeType) }}
v-if="$getFullUrl(data.scope.images)"
style="color: #409eff; cursor: pointer"
@click="handelPreviewImages($getFullUrl(data.scope.images))"
>查看大图</span
>
</template>
<template v-slot:videos="data">
<span
v-if="$getFullUrl(data.scope.videos)"
style="color: #409eff; cursor: pointer"
@click="handelPreviewVideos($getFullUrl(data.scope.videos))"
>查看视频</span
>
</template> </template>
<template v-slot:audios="data">
<span v-if="data.scope.videos" style="color: #409eff; cursor: pointer"
>查看音频</span
>
</template>
<template v-slot:operates="scope"> <template v-slot:operates="scope">
<TableOperation <TableOperation
:operations="tableOperations" :operations="tableOperations"
...@@ -89,9 +74,10 @@ ...@@ -89,9 +74,10 @@
@refresh="loadData" @refresh="loadData"
/> />
<PreviewDialog <PreviewDialog
v-if="Object.keys(curPreviewObj).length > 0"
:visible="previewDialogVisible" :visible="previewDialogVisible"
:displayDetail="curPreviewObj"
@handleClose="handleClosePreviewDialog" @handleClose="handleClosePreviewDialog"
:videos="previewVideos"
/> />
<CopyDialog <CopyDialog
:visible="copyDialogVisible" :visible="copyDialogVisible"
...@@ -117,6 +103,7 @@ import PreviewDialog from "./components/PreviewDialog"; ...@@ -117,6 +103,7 @@ import PreviewDialog from "./components/PreviewDialog";
import CopyDialog from "./components/CopyDialog"; import CopyDialog from "./components/CopyDialog";
import SearchBar from "@/components/SearchBar"; import SearchBar from "@/components/SearchBar";
import { mapGetters } from "vuex"; import { mapGetters } from "vuex";
import { themeTypeCode } from "./contants";
export default { export default {
components: { components: {
TablePage, TablePage,
...@@ -167,7 +154,7 @@ export default { ...@@ -167,7 +154,7 @@ export default {
form: { form: {
title: "", //标题 title: "", //标题
type: "", // 类别(待定)--枚举值(社会、生活等) type: "", // 类别(待定)--枚举值(社会、生活等)
displayCharacter: '1', //展览性质(精品展2、布展1、文物展3)--此处填写布展类别 displayCharacter: "1", //展览性质(精品展2、布展1、文物展3)--此处填写布展类别
keyword: "", // 关键词 keyword: "", // 关键词
deptId: "", //展览单位id--暂填入用户自己的单位 deptId: "", //展览单位id--暂填入用户自己的单位
regionCode: "", // 所在地域--暂填入用户自己的地区 regionCode: "", // 所在地域--暂填入用户自己的地区
...@@ -179,8 +166,8 @@ export default { ...@@ -179,8 +166,8 @@ export default {
faceImage: "", // 封面(图片1张) faceImage: "", // 封面(图片1张)
images: "", //展览图片 images: "", //展览图片
videos: "", //展览视频 videos: "", //展览视频
audios: "",//展览音频 audios: "", //展览音频
exhibitionUnits:[]//布展单元 exhibitionUnits: [], //布展单元
}, },
loading: false, loading: false,
imgViewerVisible: false, imgViewerVisible: false,
...@@ -188,6 +175,7 @@ export default { ...@@ -188,6 +175,7 @@ export default {
copyDialogVisible: false, copyDialogVisible: false,
previewVideos: [], previewVideos: [],
displayTypes: {}, displayTypes: {},
curPreviewObj: {}, //当前预览的对象
}; };
}, },
computed: { computed: {
...@@ -236,7 +224,7 @@ export default { ...@@ -236,7 +224,7 @@ export default {
console.log("reset"); console.log("reset");
}, },
// 加载表格数据 // 加载表格数据
async loadData() { async loadData() {
var params = { var params = {
page: this.list.current, page: this.list.current,
...@@ -249,11 +237,12 @@ export default { ...@@ -249,11 +237,12 @@ export default {
} }
}, },
async handleOperation(value, row) { async handleOperation(value, row) {
// console.log("handleOperation", value, row);
switch (value.type) { switch (value.type) {
case "add": case "add":
this.editDialogVisible = true; this.editDialogVisible = true;
case "view": case "view":
this.previewDialogVisible = true;
this.curPreviewObj = row;
break; break;
case "edit": case "edit":
const { exhibitionId } = row; const { exhibitionId } = row;
...@@ -314,15 +303,6 @@ export default { ...@@ -314,15 +303,6 @@ export default {
this.imgList = [images]; this.imgList = [images];
} }
}, },
// 预览视频和音频
handelPreviewVideos(videos) {
this.previewDialogVisible = true;
if (videos.indexOf(",") != -1) {
this.previewVideos = videos.split(",");
} else {
this.previewVideos = [videos];
}
},
handleClosePreviewDialog() { handleClosePreviewDialog() {
this.previewDialogVisible = false; this.previewDialogVisible = false;
...@@ -342,6 +322,10 @@ export default { ...@@ -342,6 +322,10 @@ export default {
this.editDialogVisible = true; this.editDialogVisible = true;
console.log("this.form", this.form); console.log("this.form", this.form);
}, },
themeTypeCode(code) {
return themeTypeCode[code];
},
}, },
}; };
</script> </script>
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论