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

496 lines
12 KiB

<template>
<div class="list1">
<el-page-header
class="header"
@back="$router.replace('/index')"
:content="type + ':共搜索到' + total + '条'"
>
</el-page-header>
<div class="container">
<el-skeleton animated :loading="loading">
<template #template>
<div class="list">
<div class="list__item" v-for="i in 8" :key="i">
<el-skeleton-item
class="list__item--name"
variant="text"
style="height: 36px; margin-right: 40px"
></el-skeleton-item>
<div class="list__item--btn">预览</div>
</div>
</div>
</template>
<template>
<div>
<div class="list" v-if="list.length > 0">
<div class="list__item" v-for="i in list" :key="i.id">
<div
class="list__item--pre"
v-if="i.leixing == 5"
>
{{ i.wenjian }}【{{ i.nianfen }}】{{ i.bianhao }}号
</div>
<div class="list__item--name">{{ i.biaoti }}</div>
<div class="list__item--type" :style="{'background': ['#a8f35f','#407cbe','#bf6865','#5d53cf','#7d7e4d'][i.leixing-1]}">{{ typeFormat(i.leixing) }}</div>
<div class="list__item--date">
{{ $moment(new Date(i.created_at)).format("YYYY-MM-DD") }}
</div>
<el-dropdown
trigger="click"
placement="bottom-start"
@command="open"
>
<div class="list__item--btn" @click="getDetail(i)">预览</div>
<template #dropdown>
<el-dropdown-menu v-if="load">
<div
style="width: 100px; position: relative; height: 60px"
>
<Spin fix></Spin>
</div>
</el-dropdown-menu>
<el-dropdown-menu v-else>
<template v-if="uploadsList.length > 0">
<el-dropdown-item
:command="item"
v-for="item in uploadsList"
>
{{ item.name }}
</el-dropdown-item>
</template>
<template v-else>
<el-dropdown-item disabled> 暂无内容 </el-dropdown-item>
</template>
</el-dropdown-menu>
</template>
</el-dropdown>
<div class="list__item--download">
<el-dropdown
trigger="click"
placement="bottom-start"
@command="down"
>
<i class="el-icon-download" @click="getDetail(i)"></i>
<template #dropdown>
<el-dropdown-menu v-if="load">
<div
style="width: 100px; position: relative; height: 60px"
>
<Spin fix></Spin>
</div>
</el-dropdown-menu>
<el-dropdown-menu v-else>
<template v-if="uploadsList.length > 0">
<el-dropdown-item
:command="item"
v-for="item in uploadsList"
>
{{ item.name }}
</el-dropdown-item>
</template>
<template v-else>
<el-dropdown-item disabled>
暂无内容
</el-dropdown-item>
</template>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
</div>
</div>
<el-empty v-else :image-size="200"></el-empty>
</div>
</template>
</el-skeleton>
<el-pagination
class="page"
background
layout="prev, pager, next"
:page-size.sync="$store.state.reception.select.page_size"
:total="total"
:current-page.sync="$store.state.reception.select.page"
@current-change="
(e) => {
$store.commit('reception/SET_SELECTED', { key: 'page', value: e });
getMaterial();
}
"
>
</el-pagination>
</div>
<Modal
:width="76"
transfer
:z-index="6000"
v-model="showModal"
:footer-hide="true"
title="预览"
>
<template>
<iframe
style="width: 100%; height: 57vh"
:src="codeUri"
border="0"
></iframe>
</template>
</Modal>
<div
class="type-select"
:class="{ 'type-select-hidden': !isTypeSelectShow }"
>
<div
v-for="item in formType"
class="type-select__item"
:class="{ 'type-select__item-active': isSelectedType(item) }"
@click="typeSelect(item)"
>
{{ item.label }}
</div>
<p class="close" @click="isTypeSelectShow = !isTypeSelectShow">
<i
:class="
isTypeSelectShow ? 'el-icon-d-arrow-left' : 'el-icon-d-arrow-right'
"
></i>
</p>
</div>
</div>
</template>
<script>
import formType from "@/const/formType";
import { download } from "@/utils/downloadRequest";
import { materials, detail } from "@/api/reception";
export default {
data() {
return {
formType,
isTypeSelectShow: true,
codeUri: "",
showModal: false,
loading: false,
list: [],
total: 0,
load: false,
uploadsList: [],
};
},
methods: {
typeSelect({ value }) {
let leixing = this.$store.state.reception.select.leixing
? this.$store.state.reception.select.leixing.split(",")
: [];
if (leixing.find((i) => i == value)) {
leixing.splice(leixing.indexOf(leixing.find((i) => i == value)), 1);
this.$store.commit("reception/SET_SELECTED", {
key: "leixing",
value: leixing.toString(),
});
} else {
leixing.push(value);
this.$store.commit("reception/SET_SELECTED", {
key: "leixing",
value: leixing.toString(),
});
}
this.getMaterial();
},
async getMaterial() {
this.loading = true;
const res = await materials(this.$store.state.reception.select);
this.total = res.tags.total;
this.list = res.tags.data;
this.loading = false;
},
async getDetail(i) {
this.load = true;
const res = await detail({
table_name: "materials",
id: i.id,
});
this.uploadsList =
res.detail?.id_material_fujian_uploads_material_id_relation || [];
this.load = false;
},
open(e) {
this.codeUri = `http://view.ali251.langye.net:8012/onlinePreview?url=${encodeURIComponent(
new Buffer(e.url).toString("base64")
)}`;
this.showModal = true;
//window.open(`http://view.ali251.langye.net:8012/onlinePreview?url=${codeUri}`)
},
down(e) {
download(e.url, "get", {}, e.name);
},
},
computed: {
isSelectedType() {
return function ({ value }) {
let leixing = this.$store.state.reception.select.leixing
? this.$store.state.reception.select.leixing.split(",")
: [];
return leixing.find((i) => i == value);
};
},
type() {
return this.formType
.filter((i) =>
(this.$store.state.reception.select.leixing
? this.$store.state.reception.select.leixing.split(",")
: []
).find((j) => j == i.value)
)
.map((i) => i.label)
.toString() || '全部文件';
},
typeFormat () {
return function (leixing) {
return this.formType.find(i => i.value === leixing)?.label
}
}
},
mounted() {
this.getMaterial();
},
created() {
window.getMaterial = this.getMaterial;
},
beforeRouteEnter(to, from, next) {
next((vm) => {
vm.getMaterial();
});
},
};
</script>
<style scoped lang="scss">
.type-select {
border-radius: 4px;
background: #fff;
text-align: center;
filter: drop-shadow(0 0 6px rgba(0, 0, 0, 0.04));
line-height: 3.5;
cursor: pointer;
transition: all 0.3s;
transform: translateY(-50%);
position: fixed;
top: 50%;
left: 16px;
&-hidden {
transform: translate(calc(-100% - 16px), -50%);
}
&__item {
color: #333;
font-size: 13.5px;
font-weight: 600;
transition: all 0.3s;
padding: 0 4px;
position: relative;
&::after {
content: "";
height: 1px;
background: rgba(160, 160, 160, 0.3);
position: absolute;
left: 8px;
right: 8px;
top: -0.5px;
}
&:hover {
color: #fff;
background: #4398da;
}
&-active {
color: #fff;
background: #247ec3;
}
}
& > div:nth-child(1) {
border-radius: 4px 4px 0 0;
&::after {
display: none;
}
}
& > div:nth-last-child(2) {
border-radius: 0 0 4px 4px;
}
.close {
width: 20px;
cursor: pointer;
background: #fff;
color: #333;
box-sizing: border-box;
font-size: 12px;
line-height: 2;
border-radius: 0 4px 4px 0;
transition: all 0.3s;
padding: 10px 4px 10px 2px;
transform: translate(100%, -50%);
position: absolute;
top: 50%;
right: 0%;
&:hover {
color: #fff;
background: #247ec3;
}
}
}
::v-deep .el-page-header__content {
font-size: 15px;
}
.list1 {
background: #f8f8f8;
padding: 31px 18.75%;
position: relative;
}
.header {
background: #fff;
box-shadow: 0 0 15px 0 rgba(130, 127, 126, 0.1);
padding: 16px 23px 16px 22px;
margin-bottom: 20px;
}
.container {
background: #fff;
border-radius: 2px;
box-shadow: 0 0 15px 0 rgba(130, 127, 126, 0.1);
padding: 24px 23px 44px 22px;
}
.list {
&__item {
display: flex;
align-items: center;
border-bottom: 1px solid #f8f8f8;
padding: 11px 9px 11px 27px;
position: relative;
&--pre {
font-size: 13px;
font-weight: 500;
color: #398ac9;
padding-right: 10px;
margin-right: 10px;
position: relative;
&::after {
content: "";
width: 2px;
background: #398ac9;
position: absolute;
top: 2px;
bottom: 2px;
right: -1px;
}
}
&::before {
content: "";
height: 6px;
width: 6px;
border-radius: 6px;
background: #cad8e4;
transform: translateY(-50%);
position: absolute;
left: 0;
top: 50%;
}
&--name {
font-size: 13px;
color: #333;
flex: 1;
//padding-left: 10px;
}
&--type {
font-size: 12px;
padding: 2px 6px;
color: #fff;
border-radius: 20px;
margin: 0 10px;
}
&--date {
font-size: 13px;
color: #999999;
margin-right: 42px;
}
&--btn {
cursor: pointer;
font-size: 13px;
color: #247ec3;
border-radius: 30px;
border: 1px solid #247ec3;
transition: all 0.2s;
padding: 7px 17px;
margin-right: 23px;
&:hover {
color: #fff;
background: #247ec3;
}
}
&--download {
cursor: pointer;
& > i {
font-size: 16px;
color: #247ec3;
}
padding-right: 9px;
}
}
}
.page {
display: flex;
justify-content: center;
margin-top: 30px;
& ::v-deep .btn-prev,
::v-deep .btn-next,
::v-deep .el-pager > li {
width: 39px;
height: 39px;
line-height: 39px;
text-align: center;
border-radius: 100px;
background: #fff;
transition: all 0.2s;
}
& ::v-deep .btn-prev,
::v-deep .btn-next {
background: #fff;
border: 1px solid #e7e7e7;
}
}
</style>