提交 20ebbfed authored 作者: 朱政's avatar 朱政

Merge branch 'master' into zz-dev

...@@ -321,6 +321,13 @@ body { ...@@ -321,6 +321,13 @@ body {
.el-popper[data-popper-placement^="top"] > .el-popper__arrow:before { .el-popper[data-popper-placement^="top"] > .el-popper__arrow:before {
display: none; display: none;
} }
/* 单行文本溢出隐藏显示省略号 */
.one-line-ellipsis {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
</style> </style>
<style lang="scss" scoped> <style lang="scss" scoped>
......
...@@ -12,6 +12,18 @@ export function getDecreeBackground(params) { ...@@ -12,6 +12,18 @@ export function getDecreeBackground(params) {
}) })
} }
// 前序政令
/**
* @param {id}
*/
export function getDecreePrev(params) {
return request({
method: 'GET',
url: `/api/administrativeOrderInfo/prev/${params.id}`,
params
})
}
// 相关事件 // 相关事件
/** /**
* @param { id } * @param { id }
...@@ -34,4 +46,28 @@ export function getDecreeDepend(params) { ...@@ -34,4 +46,28 @@ export function getDecreeDepend(params) {
url: `/api/administrativeOrderInfo/depend/${params.id}`, url: `/api/administrativeOrderInfo/depend/${params.id}`,
params params
}) })
}
// 主要指令
/**
* @param { id }
*/
export function getDecreeMainContent(params) {
return request({
method: 'GET',
url: `/api/administrativeOrderInfo/mainContent/${params.id}`,
params
})
}
// 相关实体
/**
* @param { id }
*/
export function getDecreeRelatedEntity(params) {
return request({
method: 'GET',
url: `/api/administrativeOrderInfo/relatedEntity/${params.id}`,
params
})
} }
\ No newline at end of file
import request from "@/api/request.js"; import request from "@/api/request.js";
// 获取相关政令
/**
* @param { id }
*/
export function getDecreeRelatedOrder(params) {
return request({
method: 'GET',
url: `/api/administrativeOrderInfo/relatedOrder/${params.id}`,
params
})
}
// 根据政令ID获取领域公司信息 // 根据政令ID获取领域公司信息
/** /**
* @param {cRelated, id} * @param {cRelated, id}
......
...@@ -60,16 +60,17 @@ export function getDecreeSummary(params) { ...@@ -60,16 +60,17 @@ export function getDecreeSummary(params) {
}) })
} }
// 获取报告原文 // 获取风险信号
/** /**
* @param {id} * @param {id}
*/ */
// export function getDecreeReport(params) { export function getDecreeRiskSignal(params) {
// return request({ return request({
// method: 'GET', method: 'GET',
// url: `/api/administrativeOrderInfo/contentUrl/${params.id}`, url: `/api/administrativeOrderInfo/riskSignal/${params.id}`,
// }) params
// } })
}
export function getDecreeReport(params) { export function getDecreeReport(params) {
return request({ return request({
......
export const TAGTYPE = ["primary", "success", "warning", "danger", "info"]; export const TAGTYPE = ["primary", "success", "warning", "danger", "info"];
// 双色图表
export const DOUBLECHARTCOLORS = [
'#055FC2',
'#CE4F51'
]
// 多色图表预设颜色列表 20种
export const MUTICHARTCOLORS = [
"#69B1FF",
"#FF7875",
"#B37FEB",
"#FFC069",
"#1677FF",
"#87E8DE",
"#ADC6FF",
"#FFBB96",
"#BAE0FF",
"#FFD591",
"#6691FF",
"#FFB2AF",
"#81D0FF",
"#D8E5FB",
"#7981F1",
"#FF9696",
"#6678A1",
"#273C57",
"#E8B8FF",
"#DF812E"
];
...@@ -41,6 +41,7 @@ const classObject = computed(() => ({ ...@@ -41,6 +41,7 @@ const classObject = computed(() => ({
height: 24px; height: 24px;
padding: 0 8px; padding: 0 8px;
line-height: 24px; line-height: 24px;
width: fit-content;
text-align: center; text-align: center;
font-family: Microsoft YaHei; font-family: Microsoft YaHei;
font-style: Regular; font-style: Regular;
......
<template>
<div class="wordcloud-wrapper" :style="{ width: width ? width : '520px', height: height ? height : '400px' }">
<div class="chart-box" id="wordcloud-chart">
</div>
</div>
</template>
<script setup>
import { onMounted } from 'vue';
import setChart from '@/utils/setChart';
import getWordCloudChart from './wordCloudChart';
const props = defineProps(({
width: {
type: String,
default: ''
},
height: {
type: String,
default: ''
},
data: {
type: Array,
default: [
// { name: "与马斯克公开冲突", value: 100 },
// { name: "传统能源", value: 5 },
// { name: "共和党财政鹰派", value: 77 },
// { name: "未实现赤字控制目标", value: 35 },
// { name: "得克萨斯州", value: 88 },
// { name: "选举压力", value: 57 },
// { name: "主张财政紧缩", value: 72 },
// { name: "财政保守", value: 18 },
]
}
}))
onMounted(() => {
let chart = getWordCloudChart(props.data);
setChart(chart, "wordcloud-chart");
})
</script>
<style lang="scss">
.chart-box {
width: 100%;
height: 100%;
}
</style>
\ No newline at end of file
import 'echarts-wordcloud';
const getWordCloudChart = (data) => {
const option = {
grid: {
left: 5,
top: 5,
right: 5,
bottom: 5,
},
series: [
{
type: "wordCloud",
shape: 'circle',
width: '100%',
height: '100%',
// 其他形状你可以使用形状路径
// shape: 'circle', // 示例
// 或者自定义路径
gridSize: 35, // 网格大小,影响词间距。
sizeRange: [16, 36], // 定义词云中文字大小的范围
rotationRange: [0, 0],
rotationStep: 0,
drawOutOfBound: false, // 是否超出画布
shrinkToFit: true, // 是否自动缩小以适应容器
// 字体
textStyle: {
// normal: {
// color: function () {
// return 'rgb(' + [
// Math.round(Math.random() * 160),
// Math.round(Math.random() * 160),
// Math.round(Math.random() * 160)
// ].join(',') + ')';
// }
// },
color: function () {
let colors = [
"rgba(189, 33, 33, 1)",
"rgba(232, 151, 21, 1)",
"rgba(220, 190, 68, 1)",
"rgba(96, 58, 186, 1)",
"rgba(32, 121, 69, 1)",
"rgba(22, 119, 255, 1)",
];
return colors[parseInt(Math.random() * colors.length)];
},
emphasis: {
shadowBlur: 5,
shadowColor: "#333",
},
},
// 设置词云数据
data: data,
},
],
};
return option
}
export default getWordCloudChart
\ No newline at end of file
...@@ -2,7 +2,10 @@ ...@@ -2,7 +2,10 @@
<div class="analysis-box-wrapper" :style="{ width: width ? width : '100%', height: height ? height : '100%' }"> <div class="analysis-box-wrapper" :style="{ width: width ? width : '100%', height: height ? height : '100%' }">
<div class="wrapper-header"> <div class="wrapper-header">
<div class="header-icon"></div> <div class="header-icon"></div>
<div class="header-title">{{ title }}</div> <div class="header-title">
<div v-if="title">{{ title }}</div>
<slot v-else name="custom-title"></slot>
</div>
<div class="header-btn" v-if="!showAllBtn"> <div class="header-btn" v-if="!showAllBtn">
<slot name="header-btn"></slot> <slot name="header-btn"></slot>
</div> </div>
...@@ -98,54 +101,51 @@ const emit = defineEmits(['save', 'download', 'collect']) ...@@ -98,54 +101,51 @@ const emit = defineEmits(['save', 'download', 'collect'])
.wrapper-header { .wrapper-header {
height: 45px; height: 45px;
display: flex; display: flex;
padding-right: 14px;
align-items: center;
box-sizing: border-box; box-sizing: border-box;
position: relative;
.header-icon { .header-icon {
margin-top: 18px;
width: 8px; width: 8px;
height: 20px; height: 20px;
background: var(--color-main-active); background: var(--color-main-active);
border-radius: 0 4px 4px 0; border-radius: 0 4px 4px 0;
margin-right: 14px;
} }
.header-title { .header-title {
margin-left: 14px; flex: auto;
margin-top: 14px; width: 20px;
height: 26px;
// color: var(--color-main-active); // color: var(--color-main-active);
// font-family: Source Han Sans CN; // font-family: Source Han Sans CN;
// font-size: 20px; // font-size: 20px;
// font-weight: 700; // font-weight: 700;
// line-height: 26px; // line-height: 26px;
// letter-spacing: 0px; // letter-spacing: 0px;
height: 26px; height: 100%;
color: var(--color-main-active); &>div {
font-family: Microsoft YaHei; height: 100%;
font-size: 20px; color: var(--color-main-active);
font-weight: 700; font-family: Microsoft YaHei;
line-height: 26px; font-size: 20px;
line-height: 45px;
font-weight: 700;
}
} }
.header-btn { // .header-btn {
position: absolute; // display: flex;
top: 14px; // justify-content: flex-end;
right: 84px; // gap: 8px;
// display: flex; // }
// justify-content: flex-end;
// gap: 8px;
}
.header-btn1 { // .header-btn1 {
position: absolute; // position: absolute;
top: 14px; // top: 14px;
right: 116px; // right: 116px;
} // }
.header-right { .header-right {
position: absolute;
top: 14px;
right: 14px;
height: 28px; height: 28px;
display: flex; display: flex;
justify-content: flex-end; justify-content: flex-end;
......
...@@ -323,10 +323,12 @@ onMounted(() => { ...@@ -323,10 +323,12 @@ onMounted(() => {
.nav-right { .nav-right {
display: flex; display: flex;
align-items: center;
justify-content: flex-end; justify-content: flex-end;
gap: 21px; gap: 21px;
.info-box { .info-box {
height: 40px;
display: flex; display: flex;
justify-content: flex-end; justify-content: flex-end;
align-items: center; align-items: center;
......
<template> <template>
<el-space alignment="flex-start" :size="10"> <el-space alignment="flex-start" :size="10">
<img :width="64" :height="52" :src="news ?? DefaultIconNews" alt="" /> <img :width="97" :height="72" :src="img ?? DefaultIconNews" alt="" />
<el-space direction="vertical" alignment="flex-start" :size="0"> <el-space direction="vertical" alignment="flex-start" :size="0" fill>
<common-text :line-limit="1" class="text-regular text-hover" color="var(--text-primary-80-color)"> <div class="full-width flex-display">
{{ title }} <common-text :line-limit="1" class="text-title-3-bold text-hover flex-fill"
</common-text> color="var(--text-primary-80-color)">
<common-text :line-limit="1" class="text-tip-1" color="var(--text-primary-65-color)"> {{ title }}
{{ from }} </common-text>
<common-text class="text-tip-2" color="var(--text-primary-65-color)">
{{ from }}
</common-text>
</div>
<common-text :line-limit="contentLineLimit" class="text-compact" color="var(--text-primary-65-color)">
{{ content }}
</common-text> </common-text>
</el-space> </el-space>
</el-space> </el-space>
...@@ -20,7 +26,7 @@ import CommonText from "../texts/CommonText.vue"; ...@@ -20,7 +26,7 @@ import CommonText from "../texts/CommonText.vue";
const props = defineProps({ const props = defineProps({
img: { img: {
type: String, type: String,
default: '' default: null,
}, },
title: { title: {
type: String, type: String,
...@@ -34,14 +40,13 @@ const props = defineProps({ ...@@ -34,14 +40,13 @@ const props = defineProps({
type: String, type: String,
default: "" default: ""
}, },
contentLineLimit: {
type: Number,
default: 2
}
}); });
const emit = defineEmits(['item-click', 'more-click']);
const handleToNewsAnalysis = (item, index) => {
emit('item-click', item, index)
};
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@use '@/styles/common.scss'; @use '@/styles/common.scss';
@use '@/styles/container.scss';
</style> </style>
\ No newline at end of file
<template>
<el-space alignment="flex-start" :size="10">
<img :width="64" :height="52" :src="img ?? DefaultIconNews" alt="" />
<el-space direction="vertical" alignment="flex-start" :size="0">
<common-text :line-limit="1" class="text-regular text-hover" color="var(--text-primary-80-color)">
{{ title }}
</common-text>
<common-text :line-limit="1" class="text-tip-1" color="var(--text-primary-65-color)">
{{ from }}
</common-text>
</el-space>
</el-space>
</template>
<script setup>
import DefaultIconNews from "@/assets/icons/default-icon-news.png";
import { ElSpace } from "element-plus";
import CommonText from "../texts/CommonText.vue";
const props = defineProps({
img: {
type: String,
default: null
},
title: {
type: String,
default: ""
},
from: {
type: String,
default: ""
}
});
</script>
<style lang="scss" scoped>
@use '@/styles/common.scss';
</style>
\ No newline at end of file
<template> <template>
<div class="news-item"> <div class="news-item">
<el-space direction="vertical" class="flex-fill" alignment='flex-start'> <el-space direction="vertical" class="flex-fill" alignment='flex-start'>
<common-text :lineLimit="1" class="text-bold" color="var(--text-primary-80-color)">{{ <common-text :lineLimit="1" class="text-bold text-hover" color="var(--text-primary-80-color)">{{
props.title props.title
}}</common-text> }}</common-text>
<common-text class="text-tip-2" color="var(--text-primary-65-color)"> <common-text class="text-tip-2" color="var(--text-primary-65-color)">
...@@ -11,8 +11,7 @@ ...@@ -11,8 +11,7 @@
<area-tag v-for="(tag, index) in props.aeraTags" :key="index" :tagName="tag" /> <area-tag v-for="(tag, index) in props.aeraTags" :key="index" :tagName="tag" />
</el-space> </el-space>
</el-space> </el-space>
<img style="width: 122px; height: 82px" :src="props.img"> <img style="width: 122px; height: 82px" :src="props.img ? props.img : DefaultIconNews">
<!-- <img v-else style="width: 122px; height: 82px" :src="DefaultIconNews"> -->
</div> </div>
</template> </template>
...@@ -27,7 +26,7 @@ const props = defineProps({ ...@@ -27,7 +26,7 @@ const props = defineProps({
img: { img: {
type: String, type: String,
default: 'img' default: null
}, },
title: { title: {
type: String, type: String,
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
.left-btn-wrapper { .left-btn-wrapper {
width: 24px; width: 24px;
height: 48px; height: 48px;
cursor: pointer
img { img {
width: 100%; width: 100%;
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
.right-btn-wrapper { .right-btn-wrapper {
width: 24px; width: 24px;
height: 48px; height: 48px;
cursor: pointer
img { img {
width: 100%; width: 100%;
height: 100%; height: 100%;
......
...@@ -26,8 +26,8 @@ const props = defineProps({ ...@@ -26,8 +26,8 @@ const props = defineProps({
text: { text: {
type: String, type: String,
default: '' default: ''
} },
, entities: { entities: {
type: Array<TextEntity>, type: Array<TextEntity>,
default: () => [] default: () => []
} }
...@@ -37,8 +37,9 @@ const props = defineProps({ ...@@ -37,8 +37,9 @@ const props = defineProps({
const processedText = ref<ProcessedTextSegment[]>([]) const processedText = ref<ProcessedTextSegment[]>([])
// 处理文本,识别并替换实体 // 处理文本,识别并替换实体
const processText = () => { const processText = () => {
console.log('props.entities.length', props.entities.length)
if (!props.text || !props.entities) { if (!props.text || !props.entities) {
console.log('props.text', props.entities.length) // console.log('props.text', props.entities.length)
processedText.value = [{ text: '', isEntity: false }] processedText.value = [{ text: '', isEntity: false }]
return return
} }
...@@ -120,5 +121,6 @@ onMounted(processText) ...@@ -120,5 +121,6 @@ onMounted(processText)
.p-regular-rereg { .p-regular-rereg {
text-indent: 2em; text-indent: 2em;
margin: 4px 0;
} }
</style> </style>
\ No newline at end of file
<template>
<div class="full-width">
<div class="flex-display" style="align-items: center;">
<common-text class="text-title-3-bold" color="var(--text-primary-80-color)">{{ isOpenTranslation
? '中文' : '原文' }}</common-text>
<div class="flex-fill" style="margin: 0 10px;">
<el-divider></el-divider>
</div>
<el-button v-if="showMoreVisible" @click="() => { showMore = !showMore; updateText() }">
{{ showMore ? '收起' : '展开' }}
<el-icon>
<arrow-up v-if="showMore" />
<arrow-down v-else />
</el-icon>
</el-button>
</div>
<el-row :gutter="32">
<el-col :span="textColSpan" v-for="(item, index) in allTexts" :key="index">
<!-- <p class="p-news-content"> {{ item }}</p> -->
<intelligent-entity-text :text="item"
:entities="isHighlightEntity ? textEntities : []"></intelligent-entity-text>
</el-col>
</el-row>
</div>
</template>
<script lang="ts" setup>
import '@/styles/container.scss';
import '@/styles/common.scss';
import { ref, watch, onMounted } from 'vue';
import { TextEntity } from '@/api/intelligent';
import IntelligentEntityText from '@/components/base/texts/IntelligentEntityText.vue';
import { ElIcon, ElButton, ElDivider, ElRow, ElCol } from 'element-plus';
import CommonText from './CommonText.vue';
const allTexts = ref([]);
const textColSpan = ref(12);
const hasTranslation = ref(false);
const showMore = ref(false);
const showMoreVisible = ref(false);
const props = defineProps({
//段落列表: 原始文本
textsRaw: {
type: Array<String>,
default: () => []
},
//段落列表: 翻译文本
textsTranslate: {
type: Array<String>,
default: () => []
},
//是否显示翻译
isOpenTranslation: {
type: Boolean,
default: true
},
//是否高亮实体
isHighlightEntity: {
type: Boolean,
default: true
},
//实体列表
textEntities: {
type: Array<TextEntity>,
default: () => []
}
})
function updateText() {
const tempTexts = []
const tempRaws = props.textsRaw ?? []
const tempTranslates = props.textsTranslate ?? []
hasTranslation.value = tempTranslates.length > 0
if (hasTranslation.value && props.isOpenTranslation) {
// 遍历原始文本和翻译文本,将它们交替添加到 tempTexts 中,并保持原始文本和翻译文本的的数量一致
const maxCount = Math.max(tempRaws.length, tempTranslates.length)
for (let i = 0; i < maxCount; i++) {
if (i < tempTranslates.length) {
tempTexts.push(tempTranslates[i]);
} else {
tempTexts.push('');
}
if (i < tempRaws.length) {
tempTexts.push(tempRaws[i]);
} else {
tempTexts.push('');
}
}
console.log(tempTexts.length)
textColSpan.value = 12;
showMoreVisible.value = tempTexts.length > 6;
allTexts.value = showMore.value ? tempTexts : tempTexts.slice(0, 6);
} else {
textColSpan.value = 24;
showMoreVisible.value = tempRaws.length > 3;
allTexts.value = showMore.value ? tempRaws : tempRaws.slice(0, 3);
}
}
watch(() => [props.textsRaw, props.textsTranslate, props.isOpenTranslation], () => {
updateText();
})
onMounted(() => {
updateText();
})
</script>
\ No newline at end of file
import { useRouter } from "vue-router"; import { useRouter } from "vue-router";
export function useGotoPage() { export function useGotoPage() {
const router = useRouter(); const router = useRouter();
return (path, data, isNewTabs = true) => { return (path, data, isNewTabs = true) => {
console.log('path', path); console.log("path", path);
if (isNewTabs) { if (isNewTabs) {
// 打开新页面 // 打开新页面
const url = new URL(window.location.origin + path); const url = new URL(window.location.origin + path);
if (data) { if (data) {
Object.entries(data).forEach(([key, value]) => { Object.entries(data).forEach(([key, value]) => {
url.searchParams.append(key, value); url.searchParams.append(key, value);
}); });
} }
window.open(url.toString(), '_blank'); window.open(url.toString(), "_blank");
} else { } else {
// 当前页面打开 // 当前页面打开
router.push({ path, query: data }); router.push({ path, query: data });
} }
} };
} }
\ No newline at end of file // 滚动到指定元素
export function scrollToElement(elementId) {
document.getElementById(elementId).scrollIntoView({
behavior: "smooth", // 平滑滚动
block: "start" // 滚动到元素顶部
});
}
...@@ -33,4 +33,15 @@ const comprehensiveSearchRoutes = [ ...@@ -33,4 +33,15 @@ const comprehensiveSearchRoutes = [
] ]
import { useGotoPage } from "../common.js";
export function useGotoComprehensiveSearch() {
const gotoPage = useGotoPage();
return (isNewTabs = true) => gotoPage("/comprehensiveSearch/", {}, isNewTabs)
}
export function useGotoSearchResults() {
const gotoPage = useGotoPage();
return (isNewTabs = true) => gotoPage("/searchResults/", {searchText, areaName}, isNewTabs)
}
export default comprehensiveSearchRoutes export default comprehensiveSearchRoutes
\ No newline at end of file
...@@ -4,6 +4,7 @@ const DecreeLayoutContainer = () => import('@/views/decree/decreeLayout/index.vu ...@@ -4,6 +4,7 @@ const DecreeLayoutContainer = () => import('@/views/decree/decreeLayout/index.vu
const DecreeOverviewLayout = () => import('@/views/decree/decreeLayout/overview/index.vue') const DecreeOverviewLayout = () => import('@/views/decree/decreeLayout/overview/index.vue')
const DecreeIntroduction = () => import('@/views/decree/decreeLayout/overview/introduction/index.vue') const DecreeIntroduction = () => import('@/views/decree/decreeLayout/overview/introduction/index.vue')
const DecreeBackground = () => import('@/views/decree/decreeLayout/overview/background/index.vue') const DecreeBackground = () => import('@/views/decree/decreeLayout/overview/background/index.vue')
const DecreeMeasures = () => import('@/views/decree/decreeLayout/overview/measures/index.vue')
const DecreeDeepDig = () => import('@/views/decree/decreeLayout/deepdig/index.vue') const DecreeDeepDig = () => import('@/views/decree/decreeLayout/deepdig/index.vue')
const DecreeInfluence = () => import('@/views/decree/decreeLayout/influence/index.vue') const DecreeInfluence = () => import('@/views/decree/decreeLayout/influence/index.vue')
const Institution = () => import('@/views/decree/institution/index.vue') const Institution = () => import('@/views/decree/institution/index.vue')
...@@ -50,7 +51,13 @@ const decreeRoutes = [ ...@@ -50,7 +51,13 @@ const decreeRoutes = [
name: "DecreeBackground", name: "DecreeBackground",
component: DecreeBackground, component: DecreeBackground,
// meta: { title: "政令背景" } // meta: { title: "政令背景" }
} },
{
path: "measures",
name: "DecreeMeasures",
component: DecreeMeasures,
// meta: { title: "政令举措" }
},
] ]
}, },
// 深度挖掘路由 // 深度挖掘路由
......
...@@ -75,6 +75,7 @@ ...@@ -75,6 +75,7 @@
&:hover { &:hover {
color: rgb(5, 95, 194) !important; color: rgb(5, 95, 194) !important;
font-weight: 700; font-weight: 700;
cursor: pointer;
} }
} }
......
<template>
<el-row class="wrapper layout-grid-line">
<el-col :span="span">
<pre>
{{
`
import ActionButton from '@/components/base/ActionButton/index.vue'
<ActionButton name="全部选项" type="active" />
<ActionButton name="选项A" type="normal" />
<ActionButton name="选项B" type="normal" />
<ActionButton name="选项C" type="normal" />
选项按钮
`
}}
</pre>
<div class="button-box">
<ActionButton name="全部选项" type="active" />
<ActionButton name="选项A" type="normal" />
<ActionButton name="选项B" type="normal" />
<ActionButton name="选项C" type="normal" />
</div>
</el-col>
<el-col :span="span">
<pre>
{{
`
import LeftBtn from '@/components/base/PageBtn/LeftBtn.vue'
import RightBtn from '@/components/base/PageBtn/RightBtn.vue'
<LeftBtn />
<RightBtn />
左右按钮
`
}}
</pre>
<div class="button-box1">
<LeftBtn />
<RightBtn />
</div>
</el-col>
</el-row>
</template>
<script setup>
import '@/styles/common.scss'
import LeftBtn from '@/components/base/pageBtn/leftBtn.vue'
import RightBtn from '@/components/base/pageBtn/rightBtn.vue'
const span = 12
</script>
<style lang="scss" scoped>
.button-box {
margin-left: 40px;
;
display: flex;
gap: 8px
}
.button-box1 {
width: 200px;
display: flex;
justify-content: space-between;
margin-left: 40px;
margin-bottom: 10px;
gap: 8px
}
</style>
\ No newline at end of file
<template>
<el-row class="wrapper layout-grid-line">
<el-col :span="span">
<pre>
{{
`
import AreaTag from '@/components/base/AreaTag/index.vue'
<AreaTag tagName="人工智能" />
<AreaTag tagName="生物科技" />
<AreaTag tagName="新一代通信网络" />
<AreaTag tagName="量子科技" />
<AreaTag tagName="新能源" />
`
}}
</pre>
<div class="tag-box">
<AreaTag tagName="人工智能" />
<AreaTag tagName="生物科技" />
<AreaTag tagName="新一代通信网络" />
<AreaTag tagName="量子科技" />
<AreaTag tagName="新能源" />
</div>
</el-col>
</el-row>
</template>
<script setup>
import '@/styles/common.scss'
import AreaTag from '@/components/base/AreaTag/index.vue'
const span = 12
</script>
<style lang="scss" scoped>
.tag-box{
display: flex;
gap: 8px
}
</style>
\ No newline at end of file
...@@ -38,6 +38,14 @@ const span = 12 ...@@ -38,6 +38,14 @@ const span = 12
</pre> </pre>
<div class="mouse-hover">鼠标悬停</div> <div class="mouse-hover">鼠标悬停</div>
</el-col> </el-col>
<el-col :span="span">
<pre>{{ `import '@/styles/common.scss';\n<template>
<div class="text-hover"></div>
</template>
`}}
</pre>
<div class="text-hover">文字悬停</div>
</el-col>
</el-row> </el-row>
</template> </template>
......
<script setup lang="ts">
import { ElRow, ElCol } from 'element-plus';
import '@/styles/common.scss'
import NewsItemMini from '@/components/base/newsList/NewsItemMini.vue'
import NewsItem from '@/components/base/newsList/NewsItem.vue'
import NewsItemWithTag from '@/components/base/newsList/NewsItemWithTag.vue'
const span = 12
const news = {
title: '新闻标题-老长了老长了老长了老长了老长了老长长了老长了',
content: '新闻内容-老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了',
from: "2025.1.1 · 来源:中国",
aeraTags: ['人工智能', '深海']
}
</script>
<template>
<el-row class="wrapper layout-grid-line">
<el-col :span="span">
<pre>
{{ `import NewsItem from '@/components/base/newsList/NewsItem.vue'` }}
</pre>
<news-item class="common-padding" :title="news.title" :content="news.content" :from="news.from"></news-item>
</el-col>
<el-col :span="span">
<pre>
{{ `import NewsItemMini from '@/components/base/newsList/NewsItemMini.vue'` }}
</pre>
<news-item-mini class="common-padding" :title="news.title" :content="news.content"
:from="news.from"></news-item-mini>
</el-col>
<el-col :span="span">
<pre>
{{ `import NewsItemWithTag from '@/components/base/newsList/NewsItemWithTag.vue'` }}
</pre>
<news-item-with-tag class="common-padding" :title="news.title" :content="news.content" :from="news.from"
:aeraTags="news.aeraTags"></news-item-with-tag>
</el-col>
</el-row>
</template>
<style lang="scss" scoped></style>
\ No newline at end of file
<script setup lang="ts"> <script setup lang="ts">
import { ElRadioGroup, ElRadioButton, ElRow, ElCol } from 'element-plus'; import { ElRadioGroup, ElRadioButton, ElRow, ElCol, ElSpace } from 'element-plus';
import { ref } from 'vue'; import { ref } from 'vue';
import '@/styles/radio.scss'; import '@/styles/radio.scss';
...@@ -13,16 +13,36 @@ const span = 12 ...@@ -13,16 +13,36 @@ const span = 12
<pre> <pre>
{{ `import '@/styles/radio.scss'; {{ `import '@/styles/radio.scss';
<template> <template>
<el-radio-group class="radio-group-as-gap-btn"> <el-radio-group v-model="radio" class="radio-group-as-gap-btn">
<el-radio-button :value="1">选项1</el-radio-button>
<el-radio-button :value="2">选项2</el-radio-button>
<el-radio-button :value="3">选项3</el-radio-button>
</el-radio-group>
<el-radio-group v-model="radio" class="radio-group-as-gap-btn">
<el-space :size="24">
<el-radio-button :value="1">选项1</el-radio-button>
<el-radio-button :value="2">选项2</el-radio-button>
<el-radio-button :value="3">选项3</el-radio-button>
</el-space>
</el-radio-group> </el-radio-group>
</template> </template>
`}} `}}
</pre> </pre>
<el-radio-group v-model="radio" class="radio-group-as-gap-btn"> <el-space direction="vertical" fill>
<el-radio-button :value="1">选项1</el-radio-button> <el-radio-group v-model="radio" class="radio-group-as-gap-btn">
<el-radio-button :value="2">选项2</el-radio-button> <el-radio-button :value="1">选项1</el-radio-button>
<el-radio-button :value="3">选项3</el-radio-button> <el-radio-button :value="2">选项2</el-radio-button>
</el-radio-group> <el-radio-button :value="3">选项3</el-radio-button>
</el-radio-group>
<el-radio-group v-model="radio" class="radio-group-as-gap-btn">
<el-space :size="24">
<el-radio-button :value="1">选项1</el-radio-button>
<el-radio-button :value="2">选项2</el-radio-button>
<el-radio-button :value="3">选项3</el-radio-button>
</el-space>
</el-radio-group>
</el-space>
</el-col> </el-col>
<el-col :span="span"> <el-col :span="span">
<pre>{{ `import '@/styles/radio.scss';\n <template> <pre>{{ `import '@/styles/radio.scss';\n <template>
......
<template>
<el-space direction="vertical" class="common-padding" fill alignment="flex-start">
<el-space>
<el-switch v-model="isHightLightEntity" active-text="高亮实体" @change="console.log(isHightLightEntity)" />
<el-switch v-model="isOpenTranslation" active-text="译文" />
</el-space>
<text-translate-pane :texts-raw="textEns" :texts-translate="textZns" :text-entities="textEntities"
:is-open-translation="isOpenTranslation" :is-highlight-entity="isHightLightEntity">
</text-translate-pane>
</el-space>
</template>
<script lang="ts" setup>
import { ref, onMounted } from 'vue'
import TextTranslatePane from '@/components/base/texts/TextTranslatePane.vue'
import { ElSwitch, ElButton, ElSpace } from 'element-plus'
const isOpenTranslation = ref(true);
const isHightLightEntity = ref(true);
const textEntities = ref([{
text_span: '美国',
type: '国家'
},
{
text_span: 'U.S.',
type: '国家'
}]);
const textZns = ref(['华盛顿当地时间2024年7月2日,美国商务部产业与安全局(BIS)',
'发布一项最终规则,宣布修订《出口管理条例》(EAR) ,',
'以违反美国国家安全或外交政策利益为由在实体清单中增列来自四个国家的6个实体,其中包括2家中国企业。[1]',
'多余段落-测试']);
const textEns = ref(['Washington local time on July 2, 2024, the U.S. Department of Commerce, Industry and Security (BIS) released a final rule, announcing the revision of the Export Administration Regulations (EAR) ,',
'Violating the U.S. national security or diplomatic policy interests, BIS increased the list of 6 entities from four countries, including 2 Chinese companies, on the entity list. [1]',
'Your company has a large amount of money in the U.S.',
]);
</script>
<style scoped>
:deep(.el-col) {
border: 0px !important;
}
</style>
...@@ -4,6 +4,9 @@ import '@/styles/tabs.scss' ...@@ -4,6 +4,9 @@ import '@/styles/tabs.scss'
import ColorPrefixTitle from '@/components/base/texts/ColorPrefixTitle.vue'; import ColorPrefixTitle from '@/components/base/texts/ColorPrefixTitle.vue';
import AiTipPane from '@/components/base/panes/AiTipPane.vue'; import AiTipPane from '@/components/base/panes/AiTipPane.vue';
import CommonText from '@/components/base/texts/CommonText.vue'; import CommonText from '@/components/base/texts/CommonText.vue';
import IntelligentEntityText from '@/components/base/texts/IntelligentEntityText.vue';
import TranslateExample from './TranslateExample.vue';
const span = 12 const span = 12
</script> </script>
...@@ -50,6 +53,40 @@ const span = 12 ...@@ -50,6 +53,40 @@ const span = 12
</pre> </pre>
<ai-tip-pane>huidadadadadasda</ai-tip-pane> <ai-tip-pane>huidadadadadasda</ai-tip-pane>
</el-col> </el-col>
<el-col :span="span">
<pre>{{ `import IntelligentEntityText from '@/components/base/texts/IntelligentEntityText.vue';\n<template>
<intelligent-entity-text
text="华盛顿当地时间2024年7月2日,美国商务部产业与安全局(BIS) 发布一项最终规则,宣布修订《出口管理条例》(EAR) ,以违反美国国家安全或外交政策利益为由在实体清单 中增列来自四个国家的6个实体,其中包括2家中国企业。[1]"
:entities="[{
text_span: '华盛顿',
type: 'location'
}, {
text_span: '美国商务部产业与安全局',
type: 'organization'
}]">
</intelligent-entity-text>
</template>
`}}
</pre>
<intelligent-entity-text
text="华盛顿当地时间2024年7月2日,美国商务部产业与安全局(BIS) 发布一项最终规则,宣布修订《出口管理条例》(EAR) ,以违反美国国家安全或外交政策利益为由在实体清单 中增列来自四个国家的6个实体,其中包括2家中国企业。[1]"
:entities="[{
text_span: '华盛顿',
type: 'location'
}, {
text_span: '美国商务部产业与安全局',
type: 'organization'
}]">
</intelligent-entity-text>
</el-col>
<el-col :span="span">
<pre>{{ `参考src/styles/components/TextPage/TranslateExample.vue` }}
</pre>
<translate-example>
</translate-example>
</el-col>
</el-row> </el-row>
</template> </template>
......
<template>
<el-row class="wrapper layout-grid-line">
<el-col :span="span">
<pre>
{{
`
import WordCloudChart from "@/components/base/WordCloundChart/index.vue"
<div class="chart-box">
<WordCloudChart :data="data" />
</div>
`
}}
</pre>
<div class="chart-box">
<WordCloudChart :data="data" />
</div>
</el-col>
</el-row>
</template>
<script setup>
import {ref} from 'vue'
import '@/styles/common.scss'
import WordCloudChart from "@/components/base/WordCloundChart/index.vue"
const span = 12
const data = ref([
{ name: "与马斯克公开冲突", value: 100 },
{ name: "传统能源", value: 5 },
{ name: "共和党财政鹰派", value: 77 },
{ name: "未实现赤字控制目标", value: 35 },
{ name: "得克萨斯州", value: 88 },
{ name: "选举压力", value: 57 },
{ name: "主张财政紧缩", value: 72 },
{ name: "财政保守", value: 18 },
])
</script>
<style lang="scss" scoped>
.chart-box {
width: 520px;
height: 400px;
border: 1px solid var(--bg-black-5);
}
</style>
\ No newline at end of file
.layout-grid-line { .layout-grid-line {
.el-col { .el-col:not(disinheritance) {
border: 1px double var(--bg-black-5); border: 1px double var(--bg-black-5);
} }
......
...@@ -28,15 +28,27 @@ ...@@ -28,15 +28,27 @@
<el-tab-pane label="人物" lazy> <el-tab-pane label="人物" lazy>
<people-page /> <people-page />
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="新闻" lazy>
<news-page />
</el-tab-pane>
<el-tab-pane label="预警面板" lazy> <el-tab-pane label="预警面板" lazy>
<WarnningPane /> <WarnningPane />
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="领域标签" lazy>
<AreaTag />
</el-tab-pane>
<el-tab-pane label="按钮" lazy>
<ActionButton />
</el-tab-pane>
<el-tab-pane label="层级关系图" lazy> <el-tab-pane label="层级关系图" lazy>
<GraphChart /> <GraphChart />
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="引力关系图" lazy> <el-tab-pane label="引力关系图" lazy>
<GraphTreeChart /> <GraphTreeChart />
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="词云图" lazy>
<WordCloudChart />
</el-tab-pane>
</el-tabs> </el-tabs>
</div> </div>
</el-space> </el-space>
...@@ -59,6 +71,10 @@ import PeoplePage from './People/index.vue'; ...@@ -59,6 +71,10 @@ import PeoplePage from './People/index.vue';
import WarnningPane from './WarnningPane/index.vue' import WarnningPane from './WarnningPane/index.vue'
import GraphChart from './GraphChart/index.vue' import GraphChart from './GraphChart/index.vue'
import GraphTreeChart from './GraphTreeChart/index.vue' import GraphTreeChart from './GraphTreeChart/index.vue'
import AreaTag from './AreaTag/index.vue'
import ActionButton from './ActionButton/index.vue'
import WordCloudChart from './WordCloudChart/index.vue'
import NewsPage from './News/index.vue'
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
......
...@@ -16,4 +16,12 @@ ...@@ -16,4 +16,12 @@
.common-padding { .common-padding {
padding: 20px 24px; padding: 20px 24px;
}
.common-padding-h {
padding: 0px 24px;
}
.common-padding-v {
padding: 20px 0px;
} }
\ No newline at end of file
...@@ -3,23 +3,14 @@ ...@@ -3,23 +3,14 @@
<div class="content-wrapper"> <div class="content-wrapper">
<div class="policy-monitoring"> <div class="policy-monitoring">
<div class="header"> <div class="header">
<div <div class="section" v-for="(section, index) in sectionTab" :key="index" :style="{
class="section" width: sections[index].waveBall.length === 2 ? '350px' : '503px',
v-for="(section, index) in sectionTab" background: section.background
:key="index" }">
:style="{
width: sections[index].waveBall.length === 2 ? '350px' : '503px',
background: section.background
}"
>
<img class="section-title" :src="section.title" /> <img class="section-title" :src="section.title" />
<div class="stats"> <div class="stats">
<div <div class="ball-item" v-for="(value, idx) in sections[index].waveBall" :key="idx"
class="ball-item" @click="highLight(value.type)">
v-for="(value, idx) in sections[index].waveBall"
:key="idx"
@click="highLight(value.type)"
>
<WaveBall :percent="value.percent" :data="value" :color="section.waterColor" :size="128" /> <WaveBall :percent="value.percent" :data="value" :color="section.waterColor" :size="128" />
<div class="text-box"> <div class="text-box">
<div class="waveBall-text"> <div class="waveBall-text">
...@@ -29,16 +20,10 @@ ...@@ -29,16 +20,10 @@
</div> </div>
</div> </div>
</div> </div>
<div <div class="bottm-box" :style="sections[index].waveBall.length === 2 ? 'width: 350px' : 'width:503px'"
class="bottm-box" @click="handleClickCardBottomInfo(cardBottomInfo[index])">
:style="sections[index].waveBall.length === 2 ? 'width: 350px' : 'width:503px'"
@click="handleClickCardBottomInfo(cardBottomInfo[index])"
>
<img src="./icon/title-icon-1.png" /> <img src="./icon/title-icon-1.png" />
<div <div class="bottm-box-text" :style="sections[index].waveBall.length === 2 ? 'width: 225px' : 'width:378px'">
class="bottm-box-text"
:style="sections[index].waveBall.length === 2 ? 'width: 225px' : 'width:378px'"
>
{{ cardBottomInfo[index]?.title || "暂无新增数据" }} {{ cardBottomInfo[index]?.title || "暂无新增数据" }}
</div> </div>
<div style="width: 115px; color: #ffffff"> <div style="width: 115px; color: #ffffff">
...@@ -58,24 +43,16 @@ ...@@ -58,24 +43,16 @@
<div style="display: flex"> <div style="display: flex">
<!-- 风险信号列表 --> <!-- 风险信号列表 -->
<div class="risk-signals" ref="riskSignalsRef"> <div class="risk-signals" ref="riskSignalsRef">
<div <div class="risk-signals-item" v-for="(item, index) in warningList" :key="index"
class="risk-signals-item" @mouseenter="onMouseEnter(item, index)" @mouseleave="onMouseLeave"
v-for="(item, index) in warningList" :class="['risk-signals-item', { 'risk-signals-item-hightLight': riskSignalActiveIndex === index }]">
:key="index" <div class="item-left" :class="{
@mouseenter="onMouseEnter(item, index)" 'item-status-1': item.signalLevel === '特别重大',
@mouseleave="onMouseLeave" 'item-status-2': item.signalLevel === '重大风险',
:class="['risk-signals-item', { 'risk-signals-item-hightLight': riskSignalActiveIndex === index }]" 'item-status-3': item.signalLevel === '较大风险',
> 'item-status-4': item.signalLevel === '一般风险',
<div 'item-status-5': item.signalLevel === '低风险'
class="item-left" }">
:class="{
'item-status-1': item.signalLevel === '特别重大',
'item-status-2': item.signalLevel === '重大风险',
'item-status-3': item.signalLevel === '较大风险',
'item-status-4': item.signalLevel === '一般风险',
'item-status-5': item.signalLevel === '低风险'
}"
>
{{ item.signalLevel ? item.signalLevel : "一般风险" }} {{ item.signalLevel ? item.signalLevel : "一般风险" }}
</div> </div>
<div class="item-right"> <div class="item-right">
...@@ -87,31 +64,16 @@ ...@@ -87,31 +64,16 @@
</div> </div>
</div> </div>
<div class="news"> <div class="news">
<div <div class="box1-left" @click="handleSwithCurNews('left')" @mouseenter="handleInBtn"
class="box1-left" @mouseleave="handleOutBtn">
@click="handleSwithCurNews('left')"
@mouseenter="handleInBtn"
@mouseleave="handleOutBtn"
>
<img :src="leftBtn" alt="" /> <img :src="leftBtn" alt="" />
</div> </div>
<div <div class="box1-right" @click="handleSwithCurNews('right')" @mouseenter="handleInBtn"
class="box1-right" @mouseleave="handleOutBtn">
@click="handleSwithCurNews('right')"
@mouseenter="handleInBtn"
@mouseleave="handleOutBtn"
>
<img :src="rightBtn" alt="" /> <img :src="rightBtn" alt="" />
</div> </div>
<el-carousel <el-carousel ref="carouselRef" style="height: 443px; width: 664px" :autoplay="true" :interval="30000"
ref="carouselRef" arrow="never" indicator-position="none" @change="handleCarouselChange">
style="height: 443px; width: 664px"
:autoplay="true"
:interval="30000"
arrow="never"
indicator-position="none"
@change="handleCarouselChange"
>
<el-carousel-item v-for="(News, NewsIndex) in filteredHotNewsList" :key="NewsIndex"> <el-carousel-item v-for="(News, NewsIndex) in filteredHotNewsList" :key="NewsIndex">
<div class="carousel-item" @click="toDetaile(News.hotspotID, News.hotspotType)"> <div class="carousel-item" @click="toDetaile(News.hotspotID, News.hotspotType)">
<div class="carousel-title"> <div class="carousel-title">
...@@ -128,9 +90,7 @@ ...@@ -128,9 +90,7 @@
style="width: 96px; height: 96px" style="width: 96px; height: 96px"
/> --> /> -->
</div> </div>
<div <div style="/* 矩形 351 */ width: 664px; height: 1px; background: rgba(234, 236, 238, 1)"></div>
style="/* 矩形 351 */ width: 664px; height: 1px; background: rgba(234, 236, 238, 1)"
></div>
<div class="news-carousel-content">{{ News.hotspotDesc }}</div> <div class="news-carousel-content">{{ News.hotspotDesc }}</div>
<div class="carousel-bottom"> <div class="carousel-bottom">
...@@ -1146,6 +1106,7 @@ onUnmounted(() => { ...@@ -1146,6 +1106,7 @@ onUnmounted(() => {
align-items: center; align-items: center;
position: relative; position: relative;
position: relative; position: relative;
.red-dot { .red-dot {
position: absolute; position: absolute;
right: -15px; right: -15px;
...@@ -1233,21 +1194,21 @@ onUnmounted(() => { ...@@ -1233,21 +1194,21 @@ onUnmounted(() => {
} }
.item-status-2 { .item-status-2 {
color: var(--color-orange-100) !important; color: #FA8C16 !important;
background: var(--color-orange-10) !important; background: #FFF7E6 !important;
} }
.item-status-3 { .item-status-3 {
color: var(--color-yellow-100) !important; color: var(--color-yellow-100) !important;
background: var(--color-yellow-10) !important; background: var(--color-yellow-10) !important;
} }
.item-status-4 { .item-status-4 {
color: var(--color-green-100) !important; color: #52C41A !important;
background: var(--color-green-10) !important; background: #F6FFED !important;
} }
.item-status-5 { .item-status-5 {
color: var(--color-primary-100) !important; color: var(--color-primary-100) !important;
background: var(--color-primary-10) !important; background: var(--color-primary-10) !important;
} }
...@@ -1286,6 +1247,7 @@ onUnmounted(() => { ...@@ -1286,6 +1247,7 @@ onUnmounted(() => {
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
&:hover { &:hover {
color: var(--color-main-active); color: var(--color-main-active);
font-weight: bold; font-weight: bold;
...@@ -1410,6 +1372,7 @@ onUnmounted(() => { ...@@ -1410,6 +1372,7 @@ onUnmounted(() => {
width: 24px; width: 24px;
height: 48px; height: 48px;
cursor: pointer; cursor: pointer;
img { img {
width: 100%; width: 100%;
height: 100%; height: 100%;
...@@ -1423,6 +1386,7 @@ onUnmounted(() => { ...@@ -1423,6 +1386,7 @@ onUnmounted(() => {
width: 24px; width: 24px;
height: 48px; height: 48px;
cursor: pointer; cursor: pointer;
img { img {
width: 100%; width: 100%;
height: 100%; height: 100%;
...@@ -1448,6 +1412,7 @@ onUnmounted(() => { ...@@ -1448,6 +1412,7 @@ onUnmounted(() => {
text-align: justify; text-align: justify;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
.title-text { .title-text {
/* 美国白宫发布关于进一步延长TikTok执法宽限期的行政令 */ /* 美国白宫发布关于进一步延长TikTok执法宽限期的行政令 */
width: 660px; width: 660px;
...@@ -1513,6 +1478,7 @@ onUnmounted(() => { ...@@ -1513,6 +1478,7 @@ onUnmounted(() => {
display: flex; display: flex;
gap: 8px; gap: 8px;
justify-content: flex-end; justify-content: flex-end;
.tag { .tag {
/* 数据展示/Tag标签/亮色/绿 */ /* 数据展示/Tag标签/亮色/绿 */
height: 24px; height: 24px;
...@@ -1538,6 +1504,7 @@ onUnmounted(() => { ...@@ -1538,6 +1504,7 @@ onUnmounted(() => {
} }
} }
} }
.carousel-footer { .carousel-footer {
margin-top: 10px; margin-top: 10px;
width: 664px; width: 664px;
...@@ -1551,8 +1518,10 @@ onUnmounted(() => { ...@@ -1551,8 +1518,10 @@ onUnmounted(() => {
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
cursor: pointer; cursor: pointer;
.footer-left { .footer-left {
display: flex; display: flex;
.type { .type {
color: var(--color-main-active); color: var(--color-main-active);
font-family: Source Han Sans CN; font-family: Source Han Sans CN;
...@@ -1563,6 +1532,7 @@ onUnmounted(() => { ...@@ -1563,6 +1532,7 @@ onUnmounted(() => {
letter-spacing: 0px; letter-spacing: 0px;
text-align: left; text-align: left;
} }
.text { .text {
width: 500px; width: 500px;
color: var(--color-main-active); color: var(--color-main-active);
...@@ -1578,9 +1548,11 @@ onUnmounted(() => { ...@@ -1578,9 +1548,11 @@ onUnmounted(() => {
white-space: nowrap; white-space: nowrap;
} }
} }
.footer-right { .footer-right {
width: 12px; width: 12px;
height: 11px; height: 11px;
img { img {
width: 100%; width: 100%;
height: 100%; height: 100%;
......
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
<script setup> <script setup>
// 导入组件 // 导入组件
import AnalysisBox from '@/components/base/BoxBackground/AnalysisBox.vue'; import AnalysisBox from '@/components/base/boxBackground/analysisBox.vue';
import { ref, watch } from 'vue'; import { ref, watch } from 'vue';
import { getEnterpriseBranch, getEnterpriseKeyPerson } from '@/api/companyPages'; import { getEnterpriseBranch, getEnterpriseKeyPerson } from '@/api/companyPages';
import PersonAvatar from '@/components/base/people/PersonAvatar.vue'; import PersonAvatar from '@/components/base/people/PersonAvatar.vue';
......
...@@ -5,8 +5,9 @@ ...@@ -5,8 +5,9 @@
<el-divider></el-divider> <el-divider></el-divider>
<!-- 新闻列表 --> <!-- 新闻列表 -->
<el-space :size="0" direction="vertical"> <el-space class="full-width" :size="0" direction="vertical" fill alignment="flex-start">
<news-item class="list-item" v-for="(t, i) in newsPage.content" :key="i" :news="t"></news-item> <news-item class="list-item" v-for="(t, i) in newsPage.content" :key="i.id" :title="t.title" :from="t.from"
:content="t.content" @click="gotoNewsDetail(t.id)"></news-item>
</el-space> </el-space>
<!-- 底部分隔线 --> <!-- 底部分隔线 -->
...@@ -20,14 +21,17 @@ ...@@ -20,14 +21,17 @@
</template> </template>
<script setup> <script setup>
import { ref, watch } from 'vue';
// 导入API // 导入API
import { getEnterpriseNewDynamicPage } from '@/api/companyPages'; import { getEnterpriseNewDynamicPage } from '@/api/companyPages';
// 导入组件 // 导入组件
import AnalysisBox from '@/components/base/BoxBackground/AnalysisBox.vue'; import AnalysisBox from '@/components/base/boxBackground/analysisBox.vue';
import NewsItem from '@/components/base/newsList/NewsItem.vue'; import NewsItem from '@/components/base/newsList/NewsItem.vue';
import { useGotoNewsDetail } from '@/router/modules/news';
import { ElDivider, ElSpace, ElPagination } from 'element-plus'; import { ElDivider, ElSpace, ElPagination } from 'element-plus';
const gotoNewsDetail = useGotoNewsDetail()
// 导入Vue组合式API // 导入Vue组合式API
import { ref, watch } from 'vue';
// 响应式数据 // 响应式数据
const newsPage = ref({}) // 新闻分页数据 const newsPage = ref({}) // 新闻分页数据
...@@ -78,7 +82,11 @@ const onCurrentChange = e => { ...@@ -78,7 +82,11 @@ const onCurrentChange = e => {
<style lang="css" scoped> <style lang="css" scoped>
/* 新闻列表项样式 */ /* 新闻列表项样式 */
.list-item { .list-item {
margin-bottom: 20px; width: 100%;
padding-bottom: 25px;
margin-bottom: 25px;
margin-left: 25px;
margin-right: 25px;
/* 底部外边距 */ /* 底部外边距 */
border-bottom: 1px solid rgba(240, 242, 244, 1); border-bottom: 1px solid rgba(240, 242, 244, 1);
/* 底部边框 */ /* 底部边框 */
......
...@@ -3,7 +3,7 @@ import { ref, onMounted, onUnmounted, watch } from 'vue'; ...@@ -3,7 +3,7 @@ import { ref, onMounted, onUnmounted, watch } from 'vue';
import { ElRadioGroup, ElRadioButton, ElSpace } from 'element-plus'; import { ElRadioGroup, ElRadioButton, ElSpace } from 'element-plus';
import * as echarts from 'echarts'; import * as echarts from 'echarts';
import { getSanctionList } from '@/api/companyPages'; import { getSanctionList } from '@/api/companyPages';
import AnalysisBox from '@/components/base/BoxBackground/AnalysisBox.vue'; import AnalysisBox from '@/components/base/boxBackground/analysisBox.vue';
import AiTipPane from '@/components/base/panes/AiTipPane.vue' import AiTipPane from '@/components/base/panes/AiTipPane.vue'
export interface LineDataItem { export interface LineDataItem {
......
...@@ -17,8 +17,8 @@ const getWordCloudChart = (data) => { ...@@ -17,8 +17,8 @@ const getWordCloudChart = (data) => {
// 其他形状你可以使用形状路径 // 其他形状你可以使用形状路径
// shape: 'circle', // 示例 // shape: 'circle', // 示例
// 或者自定义路径 // 或者自定义路径
gridSize: 30, // 网格大小,影响词间距。 gridSize: 35, // 网格大小,影响词间距。
sizeRange: [15, 40], // 定义词云中文字大小的范围 sizeRange: [16, 36], // 定义词云中文字大小的范围
rotationRange: [0, 0], rotationRange: [0, 0],
rotationStep: 0, rotationStep: 0,
drawOutOfBound: false, // 是否超出画布 drawOutOfBound: false, // 是否超出画布
......
...@@ -19,14 +19,11 @@ ...@@ -19,14 +19,11 @@
<div class="info"> <div class="info">
<div class="info-box1">{{ summaryInfo.name }}</div> <div class="info-box1">{{ summaryInfo.name }}</div>
<div class="info-box2"> <div class="info-box2">
<div class="info-box2-item item1" v-if="summaryInfo.order"> <div class="info-box2-item item1">{{ summaryInfo.postDate }}</div>
{{ summaryInfo.order + " | " }} |
</div> <div class="info-box2-item item2">{{ summaryInfo.orgName }}</div>
|
<div class="info-box2-item item2" v-if="summaryInfo.orgName"> <div class="info-box2-item item3">{{ summaryInfo.ename }}</div>
{{ summaryInfo.orgName + " | " }}
</div>
<div class="info-box2-item item3" v-if="summaryInfo.ename">{{ summaryInfo.ename }}</div>
</div> </div>
</div> </div>
</div> </div>
...@@ -60,6 +57,12 @@ ...@@ -60,6 +57,12 @@
</div> </div>
<div class="text">{{ "政令原文" }}</div> <div class="text">{{ "政令原文" }}</div>
</div> </div>
<!-- <div class="btn" @click="handleToInstitution">
<div class="icon">
<img src="./assets/icons/link-icon.png" alt="" />
</div>
<div class="text">{{ "查看官网" }}</div>
</div> -->
<div class="btn-active" @click="handleAnalysisClick"> <div class="btn-active" @click="handleAnalysisClick">
<div class="icon-active"> <div class="icon-active">
<img src="./assets/icons/edit-icon.png" alt="" /> <img src="./assets/icons/edit-icon.png" alt="" />
...@@ -77,7 +80,7 @@ ...@@ -77,7 +80,7 @@
<router-view /> <router-view />
</div> </div>
</div> </div>
<div class="layout-report-box" v-if="activeName === '法案原文'"> <!-- <div class="layout-report-box" v-if="activeName === '法案原文'">
<div class="report-close" @click="handleSwitchActiveName('分析报告')"> <div class="report-close" @click="handleSwitchActiveName('分析报告')">
<img src="./assets/images/report-close-icon.png" alt="" /> <img src="./assets/images/report-close-icon.png" alt="" />
</div> </div>
...@@ -127,8 +130,8 @@ ...@@ -127,8 +130,8 @@
</div> </div>
</div> </div>
</div> </div>
</div> </div> -->
<div class="report" v-if="isShowReport"> <!-- <div class="report" v-if="isShowReport">
<div class="report-close" @click="handleCloseReport"> <div class="report-close" @click="handleCloseReport">
<img src="@/assets/icons/close.png" alt="" /> <img src="@/assets/icons/close.png" alt="" />
</div> </div>
...@@ -145,7 +148,7 @@ ...@@ -145,7 +148,7 @@
<iframe v-else :src="reportUrlEn" style="border: none" width="100%" height="100%"> </iframe> <iframe v-else :src="reportUrlEn" style="border: none" width="100%" height="100%"> </iframe>
</div> </div>
</div> </div>
</div> </div> -->
</div> </div>
</template> </template>
...@@ -170,30 +173,22 @@ const route = useRoute(); ...@@ -170,30 +173,22 @@ const route = useRoute();
const decreeId = ref(route.query.id); const decreeId = ref(route.query.id);
const isShowReport = ref(false); // const activeName = ref("分析报告");
const reportUrl = ref(""); // const handleSwitchActiveName = name => {
const reportUrlEn = ref(""); // activeName.value = name;
// };
const activeName = ref("分析报告"); // const curBill = ref("公法(2025年7月4日)");
// const billList = ref([
const summaryInfo = ref({}); // {
// label: "公法(2025年7月4日)",
const handleSwitchActiveName = name => { // value: "公法(2025年7月4日)"
activeName.value = name; // },
}; // {
// label: "公法(2025年7月2日)",
const curBill = ref("公法(2025年7月4日)"); // value: "公法(2025年7月2日)"
// }
const billList = ref([ // ]);
{
label: "公法(2025年7月4日)",
value: "公法(2025年7月4日)"
},
{
label: "公法(2025年7月2日)",
value: "公法(2025年7月2日)"
}
]);
const mainHeaderBtnList = ref([ const mainHeaderBtnList = ref([
{ {
...@@ -207,17 +202,16 @@ const mainHeaderBtnList = ref([ ...@@ -207,17 +202,16 @@ const mainHeaderBtnList = ref([
activeIcon: icon2Active, activeIcon: icon2Active,
name: "深度挖掘", name: "深度挖掘",
path: "/decreeLayout/deepDig" path: "/decreeLayout/deepDig"
} },
// { // {
// icon: icon3, // icon: icon3,
// activeIcon: icon3Active, // activeIcon: icon3Active,
// name: "影响分析", // name: "影响分析",
// path: "/decreeLayout/influence" // path: "/decreeLayout/influence"
// } // },
]); ]);
const activeTitle = ref("政令概况"); const activeTitle = ref("政令概况");
const handleClickMainHeaderBtn = item => { const handleClickMainHeaderBtn = item => {
activeTitle.value = item.name; activeTitle.value = item.name;
router.push({ router.push({
...@@ -229,12 +223,10 @@ const handleClickMainHeaderBtn = item => { ...@@ -229,12 +223,10 @@ const handleClickMainHeaderBtn = item => {
}; };
// 获取全局信息 // 获取全局信息
const summaryInfo = ref({});
const handleGetSummary = async () => { const handleGetSummary = async () => {
const params = {
id: route.query.id
};
try { try {
const res = await getDecreeSummary(params); const res = await getDecreeSummary({id: route.query.id});
console.log("全局信息", res); console.log("全局信息", res);
if (res.code === 200 && res.data) { if (res.code === 200 && res.data) {
summaryInfo.value = res.data; summaryInfo.value = res.data;
...@@ -243,24 +235,24 @@ const handleGetSummary = async () => { ...@@ -243,24 +235,24 @@ const handleGetSummary = async () => {
}; };
// 获取报告原文 // 获取报告原文
const handleGetReport = async () => { // const reportUrl = ref("");
const params = { // const reportUrlEn = ref("");
id: route.query.id // const handleGetReport = async () => {
}; // try {
// const res = await getDecreeReport({id: route.query.id});
// console.log("报告原文", res);
// if (res.code === 200 && res.data) {
// reportUrl.value = res.data.content;
// reportUrlEn.value = res.data.contentEn;
// }
// } catch (error) {}
// };
try { // const isShowReport = ref(false);
const res = await getDecreeReport(params); // const handleCloseReport = () => {
console.log("报告原文", res); // isShowReport.value = false;
if (res.code === 200 && res.data) { // };
reportUrl.value = res.data.content;
reportUrlEn.value = res.data.contentEn;
}
} catch (error) {}
};
const handleCloseReport = () => {
isShowReport.value = false;
};
const handleShowReport = () => { const handleShowReport = () => {
const curRoute = router.resolve({ const curRoute = router.resolve({
path: "/decree/decreeOriginal", path: "/decree/decreeOriginal",
...@@ -271,6 +263,16 @@ const handleShowReport = () => { ...@@ -271,6 +263,16 @@ const handleShowReport = () => {
window.open(curRoute.href, "_blank"); window.open(curRoute.href, "_blank");
}; };
const handleToInstitution = () => {
// const curRoute = router.resolve({
// path: "/institution",
// query: {
// id: route.query.id
// }
// });
// window.open(curRoute.href, "_blank");
};
const handleAnalysisClick = () => { const handleAnalysisClick = () => {
router.push({ router.push({
path: "/writtingAsstaint", path: "/writtingAsstaint",
...@@ -284,14 +286,14 @@ const handleAnalysisClick = () => { ...@@ -284,14 +286,14 @@ const handleAnalysisClick = () => {
onMounted(() => { onMounted(() => {
handleGetSummary(); handleGetSummary();
console.log(route.path); console.log(route.path);
if (route.path === "/decreeLayout/overview/introduction" || route.path === "/decreeLayout/overview/background") { if (route.path === "/decreeLayout/overview/introduction" || route.path === "/decreeLayout/overview/background" || route.path === "/decreeLayout/overview/measures") {
activeTitle.value = "政令概况"; activeTitle.value = "政令概况";
} else if (route.path === "/decreeLayout/deepDig") { } else if (route.path === "/decreeLayout/deepDig") {
activeTitle.value = "深度挖掘"; activeTitle.value = "深度挖掘";
} else { } else if (route.path === "/decreeLayout/influence") {
activeTitle.value = "影响分析"; activeTitle.value = "影响分析";
} }
handleGetReport(); // handleGetReport();
}); });
</script> </script>
...@@ -370,11 +372,10 @@ onMounted(() => { ...@@ -370,11 +372,10 @@ onMounted(() => {
} }
.layout-main { .layout-main {
width: 100%; width: 100%;
overflow-y: auto; height: 100%;
display: flex;
flex-direction: column;
.header-main { .header-main {
position: sticky;
top: 0;
z-index: 1000;
width: 100%; width: 100%;
background-color: #fff; background-color: #fff;
box-shadow: 0px 4px 10px 0px rgba(0, 0, 0, 0.05); box-shadow: 0px 4px 10px 0px rgba(0, 0, 0, 0.05);
...@@ -447,18 +448,6 @@ onMounted(() => { ...@@ -447,18 +448,6 @@ onMounted(() => {
.info-box2-item { .info-box2-item {
padding: 0 10px; padding: 0 10px;
} }
.item1 {
max-width: 100px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.item2 {
max-width: 180px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.item3 { .item3 {
max-width: 420px; max-width: 420px;
overflow: hidden; overflow: hidden;
...@@ -509,7 +498,7 @@ onMounted(() => { ...@@ -509,7 +498,7 @@ onMounted(() => {
} }
} }
.layout-main-header-right-box { .layout-main-header-right-box {
width: 300px; width: 450px;
margin-top: 19px; margin-top: 19px;
.right-box-top { .right-box-top {
.time { .time {
...@@ -609,6 +598,9 @@ onMounted(() => { ...@@ -609,6 +598,9 @@ onMounted(() => {
} }
} }
.layout-main-center { .layout-main-center {
height: 20px;
flex: auto;
background-color: #f7f8f9;
} }
} }
.layout-report-box { .layout-report-box {
......
差异被折叠。
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论