You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

501 lines
13 KiB
Vue

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div class="big-screen-list-wrap">
<div class="internal-box">
<div class="top-search-wrap">
<el-input v-model="searchKey" class="bs-el-input bs-el-input-search"
:placeholder="type === 'bigScreenCatalog' ? '请输入大屏名称' : '请输入组件名称'" prefix-icon="el-icon-search" clearable
@clear="reSearch" @keyup.enter.native="reSearch" />
<el-button type="primary" @click="reSearch">
搜索
</el-button>
</div>
<div v-loading="loading" class="list-wrap bs-scrollbar" element-loading-text="加载中" :style="{
display: gridComputed ? 'grid' : 'flex',
justifyContent: gridComputed ? 'space-around' : 'flex-start'
}">
<!-- 第一个是新增大屏卡片 -->
<div class="big-screen-card-wrap" :style="{
width: gridComputed ? 'auto' : '290px'
}" @click="add">
<div class="big-screen-card-inner big-screen-card-inner-add">
<div class="add-big-screen-card">
<div class="add-big-screen-card-inner">
<div class="add-big-screen-card-text">
新建{{ type === 'bigScreenCatalog' ? '大屏' : '组件' }}
</div>
</div>
</div>
</div>
</div>
<!-- 后面遍历 list -->
<div v-for="screen in list" :key="screen.id" class="big-screen-card-wrap" :style="{
width: gridComputed ? 'auto' : '290px'
}">
<div class="big-screen-card-inner">
<div class="screen-card__hover">
<div class="screen-card__hover-box">
<div class="preview">
<div class="screen-card__oper-label circle" @click="preview(screen)">
<span>预览</span>
</div>
<div class="circle" @click="design(screen)">
<span>设计</span>
</div>
<div class="circle" @click="edit(screen)">
<span>编辑</span>
</div>
<div class="circle" @click="copy(screen)">
<span>复制</span>
</div>
<div class="circle" @click="del(screen)">
<span>删除</span>
</div>
</div>
</div>
</div>
<div class="big-screen-card-img">
<el-image :src="screen.coverPicture" fit="fill" style="width: 100%; height: 100%">
<div slot="placeholder" class="image-slot">
加载中···
</div>
<div slot="error" class="image-slot" style="font-size: 20px">
<div class="error-img-text">
{{ screen.name }}
</div>
</div>
</el-image>
</div>
<div class="big-screen-bottom">
<div class="left-bigscreen-title" :title="screen.name">
{{ screen.name }}
</div>
<!-- <div class="right-bigscreen-time-title">-->
<!-- {{ screen.updateDate || '-' }}-->
<!-- </div>-->
</div>
</div>
</div>
</div>
<div class="footer-pagination-wrap">
<!-- <div class="footer-pagination-wrap-text">
总共 {{ totalCount }} 个项目
</div> -->
<div class="bs-pagination">
<el-pagination class="bs-el-pagination" popper-class="bs-el-pagination" background
layout="total, prev, pager, next, sizes" :page-size="size" prev-text="" next-text="" :total="totalCount"
:page-sizes="[10, 20, 50, 100]" :current-page="current" @current-change="currentChangeHandle"
@size-change="sizeChangeHandle" />
</div>
</div>
</div>
<!-- 新增或编辑弹窗 -->
<EditForm ref="EditForm" :type="pageType" @refreshData="reSearch" />
</div>
</template>
<script>
import { get, post } from 'data-room-ui/js/utils/http'
import { pageMixins } from 'data-room-ui/js/mixins/page'
import EditForm from './EditForm.vue'
export default {
name: 'BigScreenList',
mixins: [pageMixins],
props: {
type: {
type: String,
default: 'bigScreenCatalog'
},
catalogInfo: {
type: Object,
default: () => { }
}
},
components: { EditForm },
data() {
return {
templateLoading: false,
searchKey: '',
list: [],
defaultImg: require('./images/defaultImg.png'),
loading: false
}
},
computed: {
hint() {
return this.pageType === 'bigScreen' ? '大屏' : '组件'
},
code() {
return this.catalogInfo?.page?.code
},
gridComputed() {
return this.list.length > 2
},
pageType() {
return this.type === 'bigScreenCatalog' ? 'bigScreen' : 'component'
}
},
watch: {
code(value) {
this.current = 1
this.getDataList()
}
},
mounted() {
this.getDataList()
},
methods: {
getDataList() {
this.loading = true
this.$dataRoomAxios.get('/bigScreen/design/page', {
parentCode: this.code || null,
current: this.current,
size: this.size,
searchKey: this.searchKey,
type: this.pageType
})
.then((data) => {
this.list = data.list
this.totalCount = data.totalCount
})
.finally(() => {
this.loading = false
})
},
preview(screen) {
const { href } = this.$router.resolve({
path: window.BS_CONFIG?.routers?.previewUrl || '/big-screen/preview', // 这里写的是要跳转的路由地址
query: {
code: screen.code
}
})
window.open(href, '_blank')
},
design(screen) {
const path = window.BS_CONFIG?.routers?.designUrl || '/big-screen/design'
const { href } = this.$router.resolve({
path,
query: {
code: screen.code
}
})
window.open(href, '_self')
},
add() {
const page = {
code: '',
type: 'bigScreen'
}
this.$refs.EditForm.init(page, this.catalogInfo.page)
},
edit(screen) {
this.$refs.EditForm.init(screen, this.catalogInfo.page)
},
del(screen) {
this.$confirm(`确定删除该${this.hint}`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
customClass: 'bs-el-message-box'
})
.then(async () => {
this.$dataRoomAxios.post(`/bigScreen/design/delete/${screen.code}`)
.then(() => {
this.$message({
type: 'success',
message: '删除成功'
})
this.getDataList()
})
.catch(() => {
this.$message({
type: 'error',
message: '删除失败!'
})
})
})
.catch()
},
copy(screen) {
this.$confirm(`确定复制该${this.hint}`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
customClass: 'bs-el-message-box'
})
.then(async () => {
this.$dataRoomAxios.post(`/bigScreen/design/copy/${screen.code}`)
.then(() => {
this.$message({
type: 'success',
message: '复制成功'
})
this.getDataList()
})
.catch(() => {
this.$message({
type: 'error',
message: '复制失败!'
})
})
})
.catch((e) => {
console.error(e)
})
}
}
}
</script>
<style lang="scss" scoped>
@import '../assets/style/bsTheme.scss';
.big-screen-list-wrap {
.el-select {
display: inline-block !important;
position: relative !important;
width: auto !important;
}
position: relative;
height: 100%;
// margin:0 16px;
margin-left: 16px;
// padding: 16px;
color: #9ea9b2;
background-color: var(--bs-background-2) !important;
.internal-box {
height: calc(100% - 32px);
padding: 16px;
}
.top-search-wrap {
display: flex;
align-items: center;
justify-content: flex-end;
margin-bottom: 16px;
.el-input {
width: 200px;
margin-right: 20px;
::v-deep.el-input__inner {
background-color: var(--bs-background-1) !important;
}
}
}
.list-wrap {
/* display: grid; */
overflow: auto;
padding-right: 5px;
// 间隙自适应
justify-content: space-around;
// max-height: calc(100vh - 304px);
max-height: calc(100% - 90px);
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
grid-gap: 15px;
padding-bottom: 10px;
// ::v-deep .el-loading-mask {
// display: flex;
// align-items: center;
// justify-content: center;
// height: calc(100vh - 260px) !important;
// z-index: 999;
// top: 50px;
// }
.big-screen-card-wrap {
position: relative;
height: 180px;
cursor: pointer;
&:hover {
.screen-card__hover {
height: 180px;
}
}
.screen-card__hover {
position: absolute;
z-index: 999;
top: 0;
right: 0;
left: 0;
display: flex;
overflow: hidden;
align-items: center;
justify-content: center;
height: 0;
transition: height 0.4s;
background: #00000099;
.screen-card__hover-box {
position: absolute;
width: 100%;
height: 100%;
background: #00000080;
display: flex;
overflow: hidden;
align-items: center;
justify-content: center;
}
.preview {
display: flex;
flex-direction: row;
justify-content: space-evenly;
width: 100%;
cursor: pointer;
color: var(--bs-el-color-primary);
.circle {
position: relative;
display: flex;
align-items: center;
justify-content: center;
width: 40px;
height: 40px;
border: 1px solid var(--bs-el-color-primary);
border-radius: 50%;
&:hover {
color: #fff;
background: var(--bs-el-color-primary);
}
span {
font-size: 12px;
}
}
}
}
.big-screen-card-inner {
overflow: hidden;
width: 100%;
height: 100%;
cursor: pointer;
background-color: var(--bs-background-2);
box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1);
color: var(--bs-el-title);
border: 1px solid var(--bs-background-1);
&:hover {
color: var(--bs-el-text);
border: 1px solid var(--bs-el-color-primary);
}
.add-big-screen-card-text {
color: var(--bs-el-color-primary);
font-size: 24px;
}
.big-screen-card-img {
width: 100%;
height: 150px;
img {
width: 100%;
height: 100%;
object-fit: cover;
}
::v-deep.image-slot {
height: 100%;
background-color: var(--bs-background-2);
display: flex;
align-items: center;
justify-content: center;
}
::v-deep.el-image__error {
background-color: #1d1d1d;
}
}
.big-screen-bottom {
display: flex;
align-items: center;
flex-direction: row;
justify-content: space-between;
box-sizing: border-box;
width: 100%;
/*height: 26px;*/
padding: 0 10px;
height: calc(100% - 150px);
color: var(--bs-el-title);
background-color: var(--bs-background-2);
.left-bigscreen-title {
font-size: 14px;
overflow: hidden;
width: 120px;
white-space: nowrap;
text-overflow: ellipsis;
}
.right-bigscreen-time-title {
font-size: 14px;
overflow: hidden;
width: 140px;
white-space: nowrap;
text-overflow: ellipsis;
}
}
.big-screen-card-text {
font-size: 14px;
padding: 10px;
text-align: center;
color: #333;
}
}
.big-screen-card-inner-add {
display: flex;
align-items: center;
justify-content: center;
}
}
.error-img-text {
overflow: hidden;
padding: 0 10px;
white-space: nowrap;
text-overflow: ellipsis;
-o-text-overflow: ellipsis;
}
}
.el-loading-parent--relative {
position: unset !important;
}
.footer-pagination-wrap {
// position: absolute;
// bottom: 16px;
// right: auto;
// display: flex;
// align-items: center;
// justify-content: flex-end;
width: 100%;
position: absolute;
bottom: 16px;
right: 12px;
// padding: 0 16px;
}
}
.bs-pagination {
::v-deep .el-input__inner {
width: 110px !important;
border: none;
background: var(--bs-el-background-1);
}
}
</style>