通知公告并修改富文本为v-html

This commit is contained in:
熊丽君
2021-08-10 17:15:42 +08:00
parent b00f6bba18
commit 18ccebcd39
6 changed files with 354 additions and 52 deletions

View File

@ -7,3 +7,30 @@ export function getDictListByStatus(params) {
params params
}); });
} }
// 通知公告标签
export function getLabel(params) {
return request({
url: '/mPolicy/getLabel',
params
});
}
// 获取通知公告列表
export function getPolicyList(data) {
const params = {
pageNum: data.pageNum,
pageSize: data.pageSize
};
return request({
url: '/mPolicy/getPolicyList',
method: 'post',
data,
params
});
}
// 初始化获取政策匹配
export function getPolicyMatch(params) {
return request({
url: '/mobile/getPolicyMatch',
params
});
}

View File

@ -121,6 +121,11 @@ export const constantRoutes = [
component: resolve => require(['@/views/result'], resolve), component: resolve => require(['@/views/result'], resolve),
name: 'result' name: 'result'
}, },
{
path: '/portrait',
component: resolve => require(['@/views/portrait'], resolve),
name: 'portrait'
},
{ {
path: '/404', path: '/404',
component: resolve => require(['@/views/error/404'], resolve), component: resolve => require(['@/views/error/404'], resolve),

View File

@ -1,12 +1,14 @@
export function formatRichText(url) { export function formatRichText(url) {
let src = document.querySelectorAll('#text .ql-editor img'); // let src = document.querySelectorAll('#text .ql-editor img');
let src = document.querySelectorAll('#text img');
console.log(src); console.log(src);
for (let i = 0; i < src.length; i++) { for (let i = 0; i < src.length; i++) {
const string = src[i].getAttribute('src'); const string = src[i].getAttribute('src');
const flag = string.includes('http://'); const flag = string.includes('http://');
if (!flag) src[i].setAttribute('src', url + string); if (!flag) src[i].setAttribute('src', url + string);
} }
let src2 = document.querySelectorAll('#text .ql-editor a'); // let src2 = document.querySelectorAll('#text .ql-editor a');
let src2 = document.querySelectorAll('#text a');
for (let i = 0; i < src2.length; i++) { for (let i = 0; i < src2.length; i++) {
const string = src2[i].getAttribute('href'); const string = src2[i].getAttribute('href');
const flag = string.includes('http://'); const flag = string.includes('http://');

View File

@ -4,8 +4,12 @@
<div class="search"> <div class="search">
<div class="search_input" style="display:flex"> <div class="search_input" style="display:flex">
<span>通知公告检索</span> <span>通知公告检索</span>
<el-input v-model="input" placeholder="请输入搜索关键字"></el-input> <el-input
<el-button type="warning">搜索</el-button> v-model="queryParams.title"
placeholder="请输入搜索关键字"
@keyup.enter.native="getList"
></el-input>
<el-button type="warning" @click="getList">搜索</el-button>
</div> </div>
<div class="tags"> <div class="tags">
<span class="txt">热门搜索</span> <span class="txt">热门搜索</span>
@ -24,7 +28,8 @@
<div class="screen_l_t"> <div class="screen_l_t">
<div class="screen_l_t_item"> <div class="screen_l_t_item">
<span class="text_col">级别</span> <span class="text_col">级别</span>
<el-radio-group v-model="queryParams.radio1" size="medium"> <el-radio-group v-model="city" size="medium">
<el-radio-button label="">不限</el-radio-button>
<el-radio-button <el-radio-button
:label="item.label" :label="item.label"
v-for="item in levelList" v-for="item in levelList"
@ -34,11 +39,8 @@
</el-radio-button> </el-radio-button>
</el-radio-group> </el-radio-group>
</div> </div>
<div <div class="screen_l_t_item" v-if="city == 2 || city == 3">
class="screen_l_t_item" <el-radio-group v-model="queryParams.city" size="medium">
v-if="queryParams.radio1 == 2 || queryParams.radio1 == 3"
>
<el-radio-group v-model="queryParams.radio1_1" size="medium">
<el-radio-button <el-radio-button
:label="item.id" :label="item.id"
v-for="item in levelList_2" v-for="item in levelList_2"
@ -50,7 +52,7 @@
</div> </div>
<div class="screen_l_t_item"> <div class="screen_l_t_item">
<span class="text_col">归口</span> <span class="text_col">归口</span>
<el-radio-group v-model="queryParams.radio2" size="medium"> <el-radio-group v-model="queryParams.attribute" size="medium">
<el-radio-button label="">不限</el-radio-button> <el-radio-button label="">不限</el-radio-button>
<el-radio-button <el-radio-button
:label="item.value" :label="item.value"
@ -61,34 +63,64 @@
</el-radio-button> </el-radio-button>
</el-radio-group> </el-radio-group>
</div> </div>
<div
class="screen_l_t_item"
v-for="(item, index) in labelList"
:key="item.id"
>
<span class="text_col">{{ item.name }}</span>
<el-radio-group v-model="queryParams.labelIds[index]" size="medium">
<el-radio-button label="">不限</el-radio-button>
<el-radio-button
:label="i.id"
v-for="i in item.mapList"
:key="i.id"
>
{{ i.name }}
</el-radio-button>
</el-radio-group>
</div>
</div> </div>
<!-- 检索列表 --> <!-- 检索列表 -->
<div class="screen_l_b" v-for="item in 10" :key="item"> <div class="screen_l_b" v-for="item in dataList" :key="item.id">
<div class="l"> <div class="l">
<div class="title text_hidden_one" style="width:500px"> <!-- <div class="title text_hidden_one pointer" style="width:700px">
安徽出台若干措施一安徽出台若干措施安徽出台若干措施一安徽出台若干措施安徽出台若干措施一安徽出台若干措施台若干措施安徽出台若干措施一安徽出台若干措施 {{ item.title }}
</div> -->
<div class="title text_hidden_one pointer" style="width:700px">
<router-link
target="_blank"
:to="{
path: '/result',
query: { key: 'policy', id: item.id }
}"
>
{{ item.title }}
</router-link>
</div> </div>
<div class="info"> <div class="info">
<span>来源:安徽省经济和信息化厅</span> <span>来源{{ item.source }}</span>
<span>发布2021-06-04</span> <span>发布{{ item.listDate }}</span>
</div> </div>
</div> </div>
<div class="r" style="min-width:310px"> <div class="r" style="min-width:120px">
<el-tag type="warning" effect="dark">截至到2021-08-20</el-tag> <el-tag type="warning" effect="dark" v-if="item.cutOffTime"
<span v-if="token"> >截至到{{ parseTime(item.cutOffTime, '{y}-{m}-{d}') }}</el-tag
>
<!-- <span v-if="token">
<el-button type="primary" size="mini"> <el-button type="primary" size="mini">
<i class="el-icon-star-on"></i><span>收藏</span> <i class="el-icon-star-on"></i><span>收藏</span>
</el-button> </el-button>
<el-button type="info" size="mini"> <el-button type="info" size="mini">
<i class="el-icon-star-on"></i><span>取消收藏</span> <i class="el-icon-star-on"></i><span>取消收藏</span>
</el-button> </el-button>
</span> </span> -->
</div> </div>
</div> </div>
<!-- 分页 --> <!-- 分页 -->
<pagination <pagination
v-show="10 > 0" v-show="total > 0"
:total="100" :total="total"
:page.sync="queryParams.pageNum" :page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize" :limit.sync="queryParams.pageSize"
@pagination="getList" @pagination="getList"
@ -99,21 +131,42 @@
<div class="tabs"> <div class="tabs">
<div class="tabs_row"> <div class="tabs_row">
<span class="span">企业画像</span> <span class="span">企业画像</span>
<el-tabs v-model="activeName" @tab-click="handleClick"> <span class="span" v-if="!portraitList.length">无数据</span>
<el-tab-pane label="制造业" name="1"></el-tab-pane> <el-tabs v-model="activeName" @tab-click="handleClick" v-else>
<el-tab-pane label="大型企业" name="2"></el-tab-pane> <el-tab-pane
<el-tab-pane label="生产业" name="3"></el-tab-pane> :label="item.name"
<el-tab-pane label="小型企业" name="4"></el-tab-pane> :name="item.id"
v-for="item in portraitList"
:key="item.id"
></el-tab-pane>
</el-tabs> </el-tabs>
</div> </div>
<div class="tabs_item" v-for="item in 4" :key="item"> <div class="tabs_item" v-for="item in portraitData" :key="item.id">
<div class="text_hidden_one"> <!-- <div class="text_hidden_one pointer">{{ item.title }}</div> -->
安徽出台若干措施一步优化营商安徽出台若干措施一步优化营商安徽出台若干措施一步优化营商 <div class="text_hidden_one pointer">
<router-link
target="_blank"
:to="{
path: '/result',
query: { key: 'policy', id: item.id }
}"
>
{{ item.title }}
</router-link>
</div> </div>
<div>来源安徽省经济和信息化厅</div> <div>来源{{ item.source }}</div>
</div> </div>
<div class="more"> <div class="more">
<el-button type="primary" size="mini">查看更多</el-button> <!-- query: { key: 'policy', id: item.id } -->
<router-link target="_blank" :to="{ path: '/portrait' }">
<el-button
type="primary"
size="mini"
v-show="portraitData.length >= 4"
>
查看更多
</el-button>
</router-link>
</div> </div>
</div> </div>
</div> </div>
@ -122,19 +175,29 @@
</template> </template>
<script> <script>
import { mapGetters } from 'vuex'; import { mapGetters } from 'vuex';
import { getDictListByStatus } from '@/api/home/notice'; import {
getDictListByStatus,
getLabel,
getPolicyList,
getPolicyMatch
} from '@/api/home/notice';
import { userInfo, getLabelSetting } from '@/api/home/info';
export default { export default {
data() { data() {
return { return {
activeName: '1', activeName: '',
input: '', city: '', // 临时城市
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
radio1: '', city: '',
radio1_1: '1417717740679987200', attribute: '',
radio2: '' labelId: [],
labelIds: [],
title: ''
}, },
total: 0,
dataList: [],
levelList: [ levelList: [
{ {
label: '1', label: '1',
@ -168,36 +231,87 @@ export default {
value: 'OTHER', value: 'OTHER',
label: '其他' label: '其他'
} }
] ],
labelList: [],
portraitList: [], // 企业画像
portraitData: [], // 企业画像绑定的政策列表
portraitTotal: 0
}; };
}, },
computed: { computed: {
...mapGetters(['token']) ...mapGetters(['token'])
}, },
watch: { watch: {
'queryParams.radio1'(a, b) { city(a, b) {
console.log(a, b); if (a == '' || a == 1) {
if (a == 2) { this.queryParams.city = this.city;
} else if (a == 2) {
getDictListByStatus({ type: 5 }).then(({ data }) => { getDictListByStatus({ type: 5 }).then(({ data }) => {
this.levelList_2 = data; this.levelList_2 = data;
this.queryParams.radio1_1 = '1417717740679987200'; this.queryParams.city = '1417717740679987200';
}); });
} else if (a == 3) { } else if (a == 3) {
getDictListByStatus({ type: 6 }).then(({ data }) => { getDictListByStatus({ type: 6 }).then(({ data }) => {
this.levelList_2 = data; this.levelList_2 = data;
this.queryParams.radio1_1 = '1417719159088742400'; this.queryParams.city = '1417719159088742400';
}); });
} }
} }
}, },
methods: { methods: {
getList() {}, getList() {
handleClick() {} this.queryParams.labelId = this.queryParams.labelIds.filter(item => {
return item !== '';
});
getPolicyList(this.queryParams).then(({ data }) => {
this.dataList = data.list;
this.total = data.total;
});
},
// 获取企业画像数据列表
getPortraitList() {
const query = {
labelId: this.activeName,
pageNum: 1,
pageSize: 4
};
getPolicyMatch(query).then(({ data }) => {
this.portraitData = data.list;
this.portraitTotal = data.total;
});
},
handleClick() {
this.getPortraitList();
}
}, },
created() { created() {
this.levelList.unshift({ // 企业画像
label: '', if (this.token) {
name: '不限' userInfo().then(({ data }) => {
if (data.companyId) {
getLabelSetting({ companyId: data.companyId }).then(({ data }) => {
if (data.length) {
this.portraitList = data.map(item =>
item.labelList
? item.labelList.filter(v => v.isHas)[0]
? item.labelList.filter(v => v.isHas)[0]
: ''
: undefined
);
this.activeName = this.portraitList[0].id;
this.getPortraitList();
}
});
}
});
}
// 获取标签
getLabel().then(({ data }) => {
this.labelList = data;
for (let i = 0; i < this.labelList.length; i++) {
this.queryParams.labelIds.push('');
}
this.getList();
}); });
} }
}; };
@ -287,6 +401,7 @@ export default {
font-size: 18px; font-size: 18px;
color: #333; color: #333;
margin-bottom: 16px; margin-bottom: 16px;
text-align: left;
} }
.info { .info {
font-size: 16px; font-size: 16px;
@ -317,10 +432,11 @@ export default {
border-radius: 6px 6px 0px 0px; border-radius: 6px 6px 0px 0px;
} }
.tabs { .tabs {
height: 551px; max-height: 551px;
background: #f8f8f8; background: #f8f8f8;
padding: 0px 14px; padding: 0px 14px 14px;
.tabs_row { .tabs_row {
height: 60px;
display: flex; display: flex;
align-items: center; align-items: center;
.span { .span {
@ -330,6 +446,9 @@ export default {
.el-tabs { .el-tabs {
// width: 240px; // width: 240px;
width: 70%; width: 70%;
/deep/.el-tabs__header {
margin: 0 0 8px;
}
/deep/.el-tabs__nav-wrap::after { /deep/.el-tabs__nav-wrap::after {
height: 0; height: 0;
} }
@ -356,6 +475,7 @@ export default {
} }
} }
.more { .more {
height: 40px;
text-align: center; text-align: center;
.el-button { .el-button {
margin-top: 12px; margin-top: 12px;

137
src/views/portrait.vue Normal file
View File

@ -0,0 +1,137 @@
<template>
<div class="portrait_page content">
<div class="header">
<span class="span">企业画像</span>
<el-tabs v-model="queryParams.labelId" @tab-click="handleClick">
<el-tab-pane
:label="item.name"
:name="item.id"
v-for="item in portraitList"
:key="item.id"
></el-tab-pane>
</el-tabs>
</div>
<div class="screen_l_b" v-for="item in portraitData" :key="item.id">
<div class="title text_hidden_one pointer">
<router-link
target="_blank"
:to="{
path: '/result',
query: { key: 'policy', id: item.id }
}"
>
{{ item.title }}
</router-link>
</div>
<div class="info">
<span>来源{{ item.source }}</span>
<span>发布{{ item.listDate }}</span>
</div>
</div>
<!-- 分页 -->
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getPortraitList"
/>
</div>
</template>
<script>
import { getPolicyMatch } from '@/api/home/notice';
import { mapGetters } from 'vuex';
import { userInfo, getLabelSetting } from '@/api/home/info';
export default {
data() {
return {
activeName: '',
queryParams: {
pageNum: 1,
pageSize: 10,
labelId: ''
},
total: 0,
portraitList: [], // 企业画像
portraitData: [], // 企业画像绑定的政策列表
portraitTotal: 0
};
},
computed: {
...mapGetters(['token'])
},
methods: {
// 获取企业画像数据列表
getPortraitList() {
getPolicyMatch(this.queryParams).then(({ data }) => {
this.portraitData = data.list;
this.total = data.total;
});
},
handleClick() {
this.getPortraitList();
}
},
created() {
if (this.token) {
userInfo().then(({ data }) => {
if (data.companyId) {
getLabelSetting({ companyId: data.companyId }).then(({ data }) => {
if (data.length) {
this.portraitList = data.map(item =>
item.labelList
? item.labelList.filter(v => v.isHas)[0]
? item.labelList.filter(v => v.isHas)[0]
: ''
: undefined
);
this.queryParams.labelId = this.portraitList[0].id;
this.getPortraitList();
}
});
}
});
} else {
this.msgSuccess('请先登录');
}
}
};
</script>
<style lang="scss" scoped>
.portrait_page {
margin-top: 30px;
.header {
display: flex;
align-items: center;
height: 90px;
padding: 30px;
background-color: #f5f5f5;
.el-tabs {
margin-left: 20px;
/deep/.el-tabs__nav-wrap::after {
height: 0;
}
}
}
.screen_l_b {
height: 110px;
line-height: 45px;
margin-top: 20px;
padding: 0 20px;
border-bottom: 1px solid #e3e3e3;
.title {
font-size: 18px;
color: #333;
// text-align: left;
}
.info {
font-size: 16px;
color: #999;
display: flex;
justify-content: space-between;
}
}
}
</style>

View File

@ -40,7 +40,8 @@
</div> </div>
<!-- <div v-html="formData.text"></div> --> <!-- <div v-html="formData.text"></div> -->
<div id="text"> <div id="text">
<editor v-model="formData.text" :min-height="192" /> <!-- <editor v-model="formData.text" :min-height="192" /> -->
<div v-html="formData.text" />
</div> </div>
</div> </div>
</template> </template>
@ -67,6 +68,16 @@ export default {
formData: {} formData: {}
}; };
}, },
watch: {
formData: {
handler: function() {
this.$nextTick(() => {
this.formatRichText(this.formData.downloadUrl);
});
}
},
deep: true
},
computed: { computed: {
...mapGetters(['token']) ...mapGetters(['token'])
}, },