提交 88236308 authored 作者: 张伊明's avatar 张伊明

Merge branch 'master' of http://8.140.26.4:10003/caijian/risk-monitor into zym-dev

......@@ -2,7 +2,7 @@
<div id="app">
<div class="pro-wrapper">
<div class="home-page">
<ModuleHeader/>
<ModuleHeader />
<div class="main-container">
<router-view />
</div>
......@@ -22,8 +22,8 @@
</div>
</div>
<div class="tool-box" @click="handleClickToolBox">
<div class="tool-item">
<div class="tool-box">
<!-- <div class="tool-item">
<img src="@/assets/icons/tool-item-icon1.png" alt="" />
</div>
<div class="tool-item">
......@@ -34,7 +34,26 @@
</div>
<div class="tool-item">
<img src="@/assets/icons/tool-item-icon4.png" alt="" />
</div> -->
<el-tooltip content="智能写报" placement="left" :offset="10">
<div class="tool-item" @click="handleOpenPage('znxb')">
<img src="@/assets/icons/tool-item-icon1.png" alt="" />
</div>
</el-tooltip>
<el-tooltip content="智能翻译" placement="left" :offset="10">
<div class="tool-item" @click="handleClickToolBox">
<img src="@/assets/icons/tool-item-icon2.png" alt="" />
</div>
</el-tooltip>
<!-- <div class="tool-item">
<img src="@/assets/icons/tool-item-icon3.png" alt="" />
</div> -->
<el-tooltip content="智能问答" placement="left" :offset="10">
<div class="tool-item" @click="handleOpenPage('znwd')">
<img src="@/assets/icons/tool-item-icon4.png" alt="" />
</div>
</el-tooltip>
</div>
<!-- <div class="ai-btn" @click="openAiBox">
......@@ -121,7 +140,7 @@ const handleGetPersonType = async () => {
personTypeList.value = [];
}
window.sessionStorage.setItem("personTypeList", JSON.stringify(personTypeList.value));
} catch (error) { }
} catch (error) {}
};
const isCurrentOverview = computed(() => {
......@@ -252,6 +271,14 @@ const handleClickTitle = item => {
}
};
const handleOpenPage = page => {
const pageObj = {
znwd: "/chat",
znxb: "/writtingAsstaint"
};
window.open(pageObj[page], "_blank");
};
const handleClickToolBox = () => {
ElMessage.warning("当前功能正在开发中,敬请期待!");
};
......@@ -291,7 +318,7 @@ body {
text-align: justify;
}
.el-popper[data-popper-placement^="top"]>.el-popper__arrow:before {
.el-popper[data-popper-placement^="top"] > .el-popper__arrow:before {
display: none;
}
</style>
......@@ -640,7 +667,8 @@ body {
.right-btn {
position: absolute;
top: 132px;
// top: 132px;
top: 100px;
right: 0;
z-index: 10000000000000;
......
......@@ -129,3 +129,42 @@ export function getSupplyList(params) {
params,
})
}
// 企业市值:市值变化
export function getMarketCapList(params) {
return request({
method: 'GET',
url: `/api/enterprisePage/marketCap/${params}`,
})
}
// 企业发展:营收折线图
export function getRevenueList(params) {
return request({
method: 'GET',
url: `/api/enterprisePage/revenue/${params}`,
})
}
// 企业发展:净利润折线图
export function getNetProfitList(params) {
return request({
method: 'GET',
url: `/api/enterprisePage/netProfit/${params}`,
})
}
// 企业发展:人员情况折线图
export function getPersonnelList(params) {
return request({
method: 'GET',
url: `/api/enterprisePage/personnel/${params}`,
})
}
// 企业发展: 市场占比折线图
export function getMarketShareList(params) {
return request({
method: 'GET',
url: `/api/enterprisePage/marketShare/${params}`,
})
}
\ No newline at end of file
......@@ -17,10 +17,10 @@ export function getLatestDecree() {
}
// 风险信号
export function getDecreeRiskSignal() {
export function getDecreeRiskSignal(params) {
return request({
method: 'GET',
url: `/api/administrativeOrderOverview/riskSignal`,
url: `/api/commonFeature/riskSignal/${params.moduleId}`,
})
}
......
......@@ -36,7 +36,7 @@
<div class="name">{{ "管理员" }}</div>
</div>
</div>
<div class="menu-box" v-if="isShowMenu" @mouseenter="handleHoverMenu(true)" @mouseleave="handleHoverMenu(false)">
<div class="menu-box" v-show="isShowMenu" @mouseenter="handleHoverMenu(true)" @mouseleave="handleHoverMenu(false)">
<div class="menu-content">
<div class="menu-item" v-for="(item, index) in menuList" :key="index" @click="handleToModule(item)">
<div class="icon">
......@@ -372,11 +372,16 @@ onMounted(() => {
top: 52px;
left: 0;
box-sizing: border-box;
border: 1px solid rgba(255, 255, 255, 1);
border-radius: 10px;
backdrop-filter: blur(30px);
box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1);
background: rgba(255, 255, 255, 0.8);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
box-shadow: 0px 8px 32px 0px rgba(31, 38, 135, 0.15);
background: rgba(255, 255, 255, 0.25);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.3);
background: linear-gradient(135deg, rgba(255, 255, 255, 0.1) 0%, rgba(255, 255, 255, 0.2) 100%);
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.2);
.menu-content {
width: 562px;
......
......@@ -112,7 +112,7 @@ const handleToNewsAnalysis = (item, index) => {
}
.more {
width: 54px;
width: 45px;
height: 24px;
position: absolute;
top: 12px;
......@@ -141,7 +141,9 @@ const handleToNewsAnalysis = (item, index) => {
cursor: pointer;
&:hover {
background: var(--color-bg-hover);
.right-top .title {
text-decoration: underline;
color: rgb(5, 95, 194) !important;
font-weight: 700;
}
......
......@@ -83,6 +83,21 @@ const tableData = ref([
{ name: '2级提示文字-加粗', className: 'text-tip-2-bold' },
{ name: '3级提示文字', className: 'text-tip-3' },
{ name: '黑色', className: 'text-primary-clor'},
{ name: '黑色90% / 主标题文字颜色', className: 'text-primary-90-clor'},
{ name: '黑色80% / 小标题文字颜色', className: 'text-primary-80-clor'},
{ name: '黑色65% / 正文颜色', className: 'text-primary-65-clor'},
{ name: '黑色50%', className: 'text-primary-50-clor'},
{ name: '黑色10%', className: 'bg-black-10'},
{ name: '黑色5% / 分割线颜色', className: 'bg-black-5'},
{ name: '黑色2% / 灰色背景色', className: 'bg-black-2'},
{ name: '白色主色', className: 'bg-white-100'},
{name: '主色', className: 'main-color'},
{name: '高亮背景色', className: 'color-bg-active'}
])
</script>
......
......@@ -186,3 +186,48 @@
.color-bg-active{
background: rgb(246, 250, 255);
}
// 黑色
.text-primary-clor{
color: #0a121e;
}
// 黑色90% / 主标题文字颜色
.text-primary-90-clor{
color: #222934;
}
// 黑色80% / 小标题文字颜色
.text-primary-80-clor{
color: #3b414b;
}
// 黑色65% / 正文颜色
.text-primary-65-clor{
color: #5f656c;
}
// 黑色50%
.text-primary-50-clor{
color: #84888e;
}
// 黑色10%
.bg-black-10{
background: #E6E7E8;
}
// 黑色5%
.bg-black-5{
background: #EAECEE;
}
// 黑色2%
.bg-black-2{
background: #F7F8F9;
}
// 白色主色
.bg-white-100{
background: #FFFFFF;
}
\ No newline at end of file
@use '@/styles/common.scss';
.radio-group-as-gap-btn {
@extend .text-tip-1;
.el-radio-button {
--el-radio-button-checked-bg-color: var(--bg-white-100);
--el-radio-button-checked-border-color: var(--bg-black-10);
border-radius: 4px;
}
.el-radio-button.is-active {
--el-radio-button-checked-text-color: var(--color-primary-100);
--el-radio-button-checked-bg-color: var(--color-primary-10);
--el-radio-button-checked-border-color: var(--color-primary-5);
border-radius: 4px;
}
}
\ No newline at end of file
......@@ -417,6 +417,7 @@ const pageSize = ref(5); // 每页显示 5 条
const handleFieldChange = domainId => {
console.log("领域改变", domainId);
console.log("领域值 =>", selectedFieldForLatest.value);
newsCurrentPage.value = 1;
getUSGovernmentLatestDynamicData();
};
......
......@@ -712,7 +712,7 @@ onUnmounted(() => {
.main {
width: 1598px;
height: 884px;
// height: 884px;
margin: 0 auto;
margin-top: 14px;
display: flex;
......@@ -726,9 +726,9 @@ onUnmounted(() => {
background: rgba(255, 255, 255, 0.65);
}
.left {
& > .left {
width: 472px;
display: none;
.box1 {
width: 472px;
height: 884px;
......@@ -915,11 +915,12 @@ onUnmounted(() => {
}
.right {
width: 1110px;
width: 100%;
.box2 {
width: 1110px;
height: 434px;
width: 100%;
// height: 434px;
height: 700px;
.box2-header {
height: 48px;
......@@ -957,30 +958,34 @@ onUnmounted(() => {
}
.box2-main {
height: 386px;
// height: 386px;
height: 646px;
background: rgba(255, 255, 255, 0.65);
display: flex;
justify-content: center;
gap: 16px;
.inner-box1 {
width: 640px;
height: 368px;
width: 50%;
// height: 368px;
height: 100%;
overflow: hidden;
box-sizing: border-box;
border: 1px solid rgba(234, 236, 238, 1);
border-radius: 10px;
// border: 1px solid rgba(234, 236, 238, 1);
// border-radius: 10px;
display: flex;
.left {
width: 320px;
border-right: 1px solid rgba(234, 236, 238, 1);
// width: 320px;
width: 100%;
// border-right: 1px solid rgba(234, 236, 238, 1);
.left-main {
margin-top: 9px;
height: 270px;
// margin-top: 9px;
height: 600px;
.left-item {
width: 100%;
height: 54px;
border: 1px solid transparent;
display: flex;
......@@ -1009,7 +1014,7 @@ onUnmounted(() => {
}
.text {
width: 260px;
width: 95%;
height: 30px;
margin-left: 12px;
color: rgba(59, 65, 75, 1);
......@@ -1035,7 +1040,7 @@ onUnmounted(() => {
}
.left-footer {
margin-top: 30px;
// margin-top: 30px;
height: 60px;
display: flex;
justify-content: center;
......@@ -1049,7 +1054,7 @@ onUnmounted(() => {
overflow: hidden;
overflow-y: auto;
cursor: pointer;
display: none;
.title {
width: 283px;
min-height: 24px;
......@@ -1157,8 +1162,10 @@ onUnmounted(() => {
}
.inner-box2 {
width: 412px;
height: 368px;
// width: 412px;
width: 760px;
// height: 368px;
height: 617px;
box-sizing: border-box;
border: 1px solid rgba(234, 236, 238, 1);
border-radius: 10px;
......@@ -1185,8 +1192,8 @@ onUnmounted(() => {
}
.box2Chart {
width: 412px;
height: 368px;
width: 760px;
height: 617px;
}
}
}
......@@ -1194,8 +1201,9 @@ onUnmounted(() => {
.box3 {
margin-top: 16px;
width: 1110px;
height: 434px;
width: 100%;
// height: 434px;
height: 700px;
.box3-header {
height: 48px;
......@@ -1233,30 +1241,32 @@ onUnmounted(() => {
}
.box3-main {
height: 386px;
height: 646px;
background: rgba(255, 255, 255, 0.65);
display: flex;
justify-content: center;
gap: 16px;
.inner-box1 {
width: 640px;
height: 368px;
width: 50%;
// height: 368px;
height: 100%;
overflow: hidden;
box-sizing: border-box;
border: 1px solid rgba(234, 236, 238, 1);
border-radius: 10px;
// border: 1px solid rgba(234, 236, 238, 1);
// border-radius: 10px;
display: flex;
.left {
width: 320px;
border-right: 1px solid rgba(234, 236, 238, 1);
width: 100%;
// border-right: 1px solid rgba(234, 236, 238, 1);
.left-main {
margin-top: 9px;
height: 270px;
// margin-top: 9px;
height: 600px;
.left-item {
width: 100%;
height: 54px;
border: 1px solid transparent;
display: flex;
......@@ -1285,7 +1295,7 @@ onUnmounted(() => {
}
.text {
width: 260px;
width: 95%;
height: 30px;
margin-left: 12px;
color: rgba(59, 65, 75, 1);
......@@ -1311,7 +1321,7 @@ onUnmounted(() => {
}
.left-footer {
margin-top: 30px;
// margin-top: 30px;
height: 60px;
display: flex;
justify-content: center;
......@@ -1325,7 +1335,7 @@ onUnmounted(() => {
overflow: hidden;
overflow-y: auto;
cursor: pointer;
display: none;
.title {
width: 283px;
min-height: 24px;
......@@ -1433,8 +1443,8 @@ onUnmounted(() => {
}
.inner-box2 {
width: 412px;
height: 368px;
width: 760px;
height: 617px;
box-sizing: border-box;
border: 1px solid rgba(234, 236, 238, 1);
border-radius: 10px;
......@@ -1461,8 +1471,8 @@ onUnmounted(() => {
}
.box3Chart {
width: 412px;
height: 368px;
width: 760px;
height: 617px;
}
}
}
......
......@@ -164,7 +164,7 @@ function getOption() {
}));
const titles = months.map((month, index) => ({
text: `{month|${month.format('M月')}} {stats|共 ${monthStats[index].total} 项, 已落实 ${monthStats[index].resolved}}`,
text: `{month|${month.format('M月')}} {stats|共 ${monthStats[index].total} 项, 已落实 0}`,
left: `${gapPercent + index * (calendarWidthPercent + gapPercent)}%`,
top: 10,
textStyle: {
......
......@@ -282,7 +282,7 @@ function getOption() {
const titles = months.map((month, index) => ({
// text: `{month|${month.format('M月')}} {stats| ${monthStats[index].total} , 已落实 ${monthStats[index].resolved} 项}`,
text: index ===0 ?`{month|${month.format('M月')}} {stats| ${monthStats[index].total} , 已落实 ${monthStats[index].resolved} 项}`:` {month|${month.format('M月')}} {stats| ${monthStats[index].total} , 已落实 ${monthStats[index].resolved} 项}`,
text: index ===0 ?`{month|${month.format('M月')}} {stats| ${monthStats[index].total} , 已落实 0 项}`:` {month|${month.format('M月')}} {stats| ${monthStats[index].total} , 已落实 0 项}`,
left: `${gapPercent + index * (calendarWidthPercent + gapPercent)}%`,
top: 10,
textStyle: {
......
......@@ -320,13 +320,11 @@ const monthNum = computed(() => {
}
});
// 全政府-美政府部门对我打压遏制时间线
const loadingHistory = ref(false);
const timelineData = ref([])
const timelineData = ref([]);
const getUSGovernmentSanctionHistoryData = async () => {
timelineData.value = [] // 初始化数据
timelineData.value = []; // 初始化数据
loadingHistory.value = true;
try {
const params = {
......@@ -803,12 +801,17 @@ const handleGetSanList = async () => {
const res = await getSanTypeList(params);
console.log("制裁手段列表", res);
if (res.code === 200 && res.data) {
methodOptions.value = res.data.map(item => {
let _methodOptions = res.data.map(item => {
return {
label: item.name,
value: item.id
};
});
_methodOptions.unshift({
label: "全部制裁手段",
value: ""
});
methodOptions.value = _methodOptions;
methodValue.value = "";
}
} catch (error) {}
......
......@@ -972,7 +972,7 @@ const initRightDonut = async () => {
},
label: {
show: true,
position: "outside",
// position: "outside",
fontWeight: "bold",
fontSize: 14,
color: "#333",
......@@ -987,7 +987,7 @@ const initRightDonut = async () => {
symbolSize: res.data[i].amount * 9,
label: {
show: true,
position: "outside",
// position: "outside",
fontWeight: "bold",
fontSize: 14,
color: "#333",
......@@ -1062,16 +1062,20 @@ const initRightDonut = async () => {
{
type: "graph",
layout: "circular",
circular: {
rotateLabel: true
},
symbolSize: 80,
roam: true,
label: {
show: true
// position: "outside"
},
edgeSymbol: ["circle", ""],
edgeSymbolSize: [4, 80],
edgeLabel: {
fontSize: 20,
show: false
show: true
},
data: data,
// links: [],
......@@ -1232,7 +1236,12 @@ const getPredictionList = async () => {
const res = await getPrediction();
if (res && res.code === 200) {
console.log("----getPredictionList", res.data);
warningList.value = res.data;
warningList.value = res.data.map(item => {
return {
...item,
statementList: item.statementList.reverse()
};
});
}
} catch (error) {
console.error("获取联盟动态接口失败:", error);
......@@ -2046,7 +2055,7 @@ watch(activeDate, async () => {
}
.anti-area {
margin-top: 16px;
margin-top: 30px;
width: 1601px;
height: 500px;
display: flex;
......@@ -2055,7 +2064,7 @@ watch(activeDate, async () => {
.area-left {
width: 792px;
height: 500px;
height: 520px;
box-sizing: border-box;
border-radius: var(---10, 10px);
/* 业务系统/模块阴影 */
......@@ -2098,7 +2107,7 @@ watch(activeDate, async () => {
.area-right {
width: 792px;
height: 500px;
height: 520px;
box-sizing: border-box;
border-radius: var(---10, 10px);
/* 业务系统/模块阴影 */
......@@ -2134,8 +2143,8 @@ watch(activeDate, async () => {
.right-content {
width: 100%;
height: calc(100% - 48px);
padding: 33px 48px 59px 50px;
height: 450px;
// padding: 33px 48px 59px 50px;
}
}
}
......
......@@ -38,7 +38,7 @@
import AnalysisBox from '@/components/base/boxBackground/analysisBox.vue';
import { ref, watch } from 'vue';
import { getEnterpriseBranch, getEnterpriseKeyPerson } from '@/api/companyPages';
import PersonAvatar from '@/components/base/people/personAvatar.vue';
import PersonAvatar from '@/components/base/people/PersonAvatar.vue';
import { ElDescriptions, ElDescriptionsItem, ElDivider, ElImage, ElSpace } from 'element-plus';
import '@/styles/descriptions.scss'
......
<template>
<sanctions-situation :enterprise-info="enterpriseInfo" :line-data="lineData"></sanctions-situation>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue';
import { getNetProfitList, getPersonnelList, getRevenueList } from '@/api/companyPages';
import SanctionsSituation, { LineDataItem } from './SanctionsSituation.vue';
import { l } from 'vite/dist/node/types.d-aGj9QkWt';
// 定义组件属性
const props = defineProps({
enterpriseInfo: {
type: Object,
default: {}
}
});
const lineData = ref<LineDataItem[]>([])
onMounted(async () => {
await intData()
})
async function intData() {
let { data: revenue } = await getRevenueList(props.enterpriseInfo.id)
revenue = revenue?.map(item => ({
time: new Date(item.year, 1, 1),
value: item.value,
type: '营收',
unit: item.unit ?? '亿元'
})) ?? []
let { data: netProfit } = await getNetProfitList(props.enterpriseInfo.id)
netProfit = netProfit?.map(item => ({
time: new Date(item.year, 1, 1),
value: item.value,
type: '净利润',
unit: item.unit ?? '亿元'
})) ?? []
let { data: personnel } = await getPersonnelList(props.enterpriseInfo.id)
personnel = personnel?.map(item => ({
time: new Date(item.year, 1, 1),
value: item.value,
type: '人员',
unit: item.unit ?? '亿元'
})) ?? []
lineData.value = [...revenue, ...netProfit, ...personnel]
}
</script>
\ No newline at end of file
<template>
<sanctions-situation :enterprise-info="enterpriseInfo" :line-data="lineData"></sanctions-situation>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue';
import { getMarketShareList } from '@/api/companyPages';
import SanctionsSituation, { LineDataItem } from './SanctionsSituation.vue';
// 定义组件属性
const props = defineProps({
enterpriseInfo: {
type: Object,
default: {}
}
});
const lineData = ref<LineDataItem[]>([])
onMounted(async () => {
await intData()
})
async function intData() {
const { data } = await getMarketShareList(props.enterpriseInfo.id)
lineData.value = data?.map(item => ({
time: new Date(item.year, 1, 1),
value: item.value,
unit: item.unit ?? '亿元'
})) ?? []
}
</script>
\ No newline at end of file
<template>
<sanctions-situation :enterprise-info="enterpriseInfo" :line-data="lineData"></sanctions-situation>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue';
import { getMarketCapList } from '@/api/companyPages';
import SanctionsSituation, { LineDataItem } from './SanctionsSituation.vue';
// 定义组件属性
const props = defineProps({
enterpriseInfo: {
type: Object,
default: {}
}
});
const lineData = ref<LineDataItem[]>([])
onMounted(async () => {
await intData()
})
async function intData() {
const { data } = await getMarketCapList(props.enterpriseInfo.id)
lineData.value = data?.map(item => ({
time: new Date(item.year, 1, 1),
value: item.value,
type: '市值变化',
unit: item.unit ?? '亿元'
})) ?? []
}
</script>
\ No newline at end of file
<template>
<sanctions-situation :enterprise-info="enterpriseInfo" :line-data="lineData"></sanctions-situation>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue';
import { getMarketCapList, getStudyList } from '@/api/companyPages';
import SanctionsSituation, { LineDataItem } from './SanctionsSituation.vue';
// 定义组件属性
const props = defineProps({
enterpriseInfo: {
type: Object,
default: {}
}
});
const lineData = ref<LineDataItem[]>([])
onMounted(async () => {
await intData()
})
async function intData() {
const { data } = await getStudyList(props.enterpriseInfo.id)
lineData.value = data?.map(item => ({
time: new Date(item.year, 1, 1),
value: item.currentValue,
type: item.type,
unit: item.unit ?? '亿元'
})) ?? []
}
</script>
\ No newline at end of file
<script setup>
import { ref, onMounted, onUnmounted } from 'vue';
import { ElSpace, ElRadioGroup, ElRadio, ElRadioButton } from 'element-plus';
<script setup lang="ts">
import { ref, onMounted, onUnmounted, watch } from 'vue';
import { ElRadioGroup, ElRadioButton } from 'element-plus';
import * as echarts from 'echarts';
import { getStudyList, getSanctionList } from '@/api/companyPages';
import { getSanctionList } from '@/api/companyPages';
import AnalysisBox from '@/components/base/boxBackground/analysisBox.vue';
import AiTipPane from '@/components/base/panes/AiTipPane.vue'
export interface LineDataItem {
time: Date;
value: number;
type: string;
unit: string;
}
// 定义组件属性
const props = defineProps({
enterpriseInfo: {
type: Object,
default: {}
},
lineData: {
type: Array<LineDataItem>,
default: () => []
}
});
const studyList = ref([])
const sanctionList = ref([])
const studyTypes = ref([])
const studyType = ref()
const lineTypes = ref([])
const lineType = ref()
const chartDom = ref()
let myChart = null
......@@ -28,24 +38,26 @@ onMounted(async () => {
})
onUnmounted(() => myChart?.dispose())
watch(() => [props.lineData, sanctionList.value], async () => {
lineTypes.value = [...new Set(props.lineData.map(t => t.type))]
if (lineTypes.value.length > 0) {
lineType.value = lineTypes.value[0]
}
updateCharts(lineType.value, props.lineData, sanctionList.value)
})
async function intData() {
const { data } = await getStudyList(props.enterpriseInfo.id)
studyList.value = data ?? []
data.forEach(t => t.time = new Date(t.year, 1, 1))
studyTypes.value = [...new Set(data.map(t => t.type))]
const { data: sanctionData } = await getSanctionList(props.enterpriseInfo.id)
sanctionList.value = sanctionData ?? []
const { data } = await getSanctionList(props.enterpriseInfo.id)
sanctionList.value = data ?? []
sanctionList.value.forEach(t => t.time = new Date(t.sanctionDate))
if (studyTypes.value.length > 0) {
studyType.value = studyTypes.value[0]
}
updateCharts(studyType.value, studyList.value, sanctionList.value)
}
// 辅助函数:获取制裁年份对应的Y值
function getSanctionYValue(sanctionDate, filteredList, defaultYValue) {
function getSanctionYValue(sanctionDate: Date, filteredList: LineDataItem[], defaultYValue: number) {
const year = sanctionDate.getFullYear()
const yearData = filteredList.find(d => d.year === year)
return yearData ? yearData.currentValue : defaultYValue
const yearData = filteredList.find(d => d.time.getFullYear() === year)
return yearData ? yearData.value : defaultYValue
}
// 辅助函数:格式化文本内容,实现智能换行(考虑中英文混合)
......@@ -77,74 +89,10 @@ function formatContent(content, maxWidth = 26) {
return lines.join('\n')
}
function updateCharts(type, dataStudy, dataSanction) {
const filteredList = dataStudy.filter(t => t.type === type)
if (!filteredList.length) return
// 销毁现有图表实例
if (myChart) {
myChart.dispose()
}
myChart = echarts.init(chartDom.value)
// y轴单位
const unit = filteredList[0].unit
const yValue = Math.max(...filteredList.map(d => d.currentValue))
// 计算x轴范围,扩大活动空间
const allDates = [
...filteredList.map(t => t.time),
...dataSanction.map(t => t.time)
]
const minDate = new Date(Math.min(...allDates))
const maxDate = new Date(Math.max(...allDates))
// 向前扩展1年,向后扩展1年
minDate.setFullYear(minDate.getFullYear() - 1)
maxDate.setFullYear(maxDate.getFullYear() + 1)
myChart.setOption({
textStyle: {
fontSize: 14
},
grid: {
left: 60,
right: 110,
},
tooltip: {
trigger: 'axis',
position: function (pt) {
return [pt[0], '10%'];
},
},
dataZoom: [
{
type: 'inside',
start: 0,
end: 100
},
{
start: 0,
end: 100
}
],
xAxis: {
type: 'time',
boundaryGap: false,
min: minDate,
max: maxDate
},
yAxis: {
type: 'value',
boundaryGap: [0, '100%'],
// 显示y轴单位在顶部
name: unit,
nameLocation: 'end'
},
series: [
{
// 辅助函数:获取折线图数据
function getLineSeries(filteredList: LineDataItem[]) {
return {
type: 'line',
//从上到下填充颜色
areaStyle: {
......@@ -159,34 +107,42 @@ function updateCharts(type, dataStudy, dataSanction) {
}
])
},
data: filteredList.map(t => [t.time, t.currentValue])
},
{
type: 'scatter',
tooltip: { show: false },
data: dataSanction.map(t => {
color: '#80B5FF',
data: filteredList.map(t => [t.time, t.value])
}
}
// 辅助函数:获取散点图数据
function getScatterSeries(filteredList: LineDataItem[], dataSanction: LineDataItem[], yValue: number) {
// 计算散点图数据
const xyData = dataSanction.map(t => {
const currentYValue = getSanctionYValue(t.time, filteredList, yValue) + yValue / 3
return [t.time, currentYValue, t]
}),
})
return {
type: 'scatter',
tooltip: { show: false },
data: xyData,
// 绘制垂直虚线
markLine: {
lineStyle: {
color: '#ff4d4f',
type: 'dashed',
width: 1
},
data: dataSanction.map(t => {
const currentYValue = getSanctionYValue(t.time, filteredList, yValue) + yValue / 3
data: xyData.map(t => {
return [{
coord: [t.time, 0],
coord: [t[0], 0],
symbol: 'none'
}, {
coord: [t.time, currentYValue],
coord: [t[0], t[1]],
symbol: 'none',
}]
})
},
coordinateSystem: 'cartesian2d',
symbolSize: 1,
// 散点图标签
label: {
show: true,
position: 'insideBottomLeft',
......@@ -218,30 +174,110 @@ function updateCharts(type, dataStudy, dataSanction) {
distance: -1
}
}
}
// 辅助函数:更新图表数据
function updateCharts(type: string, dataStudy: LineDataItem[], dataSanction: LineDataItem[]) {
const filteredList = dataStudy.filter(t => t.type === type)
if (!filteredList.length) return
// 销毁现有图表实例
if (myChart) {
myChart.dispose()
}
myChart = echarts.init(chartDom.value)
// y轴单位
const unit = filteredList[0].unit
const yValue = Math.max(...filteredList.map(d => d.value))
// 计算x轴范围,扩大活动空间
const allDates = [
...filteredList.map(t => t.time.getTime()),
...dataSanction.map(t => t.time.getTime())
]
// 计算x轴范围,扩大活动空间
const minDate = new Date(Math.min(...allDates))
const maxDate = new Date(Math.max(...allDates))
// 向前扩展1年,向后扩展1年
minDate.setFullYear(minDate.getFullYear() - 1)
maxDate.setFullYear(maxDate.getFullYear() + 1)
myChart.setOption({
textStyle: {
fontSize: 14
},
grid: {
left: 60,
right: 110,
},
tooltip: {
trigger: 'axis',
position: function (pt) {
return [pt[0], '10%'];
},
},
dataZoom: [
{
type: 'inside',
start: 0,
end: 100
},
{
start: 0,
end: 100
}
],
xAxis: {
type: 'time',
boundaryGap: false,
min: minDate,
max: maxDate
},
yAxis: {
type: 'value',
boundaryGap: [0, '100%'],
// 显示y轴单位在顶部
name: unit,
nameLocation: 'end'
},
series: [
getScatterSeries(filteredList, dataSanction, yValue),
getLineSeries(filteredList),
]
})
}
// 辅助函数:处理研究类型改变事件
function handleStudyTypesChange() {
updateCharts(studyType.value, studyList.value, sanctionList.value)
updateCharts(lineType.value, props.lineData, sanctionList.value)
}
</script>
<template>
<analysis-box title="被制裁时间轴">
<template v-slot:header-btn>
<el-radio-group v-model="studyType" @change="handleStudyTypesChange">
<el-radio-button v-for="item in studyTypes" :key="item" :label="item">{{ item }}</el-radio-button>
<template v-if="lineTypes.length > 1" v-slot:header-btn>
<el-radio-group class="radio-group-as-gap-btn" v-model="lineType" @change="handleStudyTypesChange">
<el-radio-button v-for="item in lineTypes" :key="item" :label="item">{{ item }}</el-radio-button>
</el-radio-group>
</template>
<div class="flex-display content-box">
<div ref="chartDom" class="chart-container"></div>
<ai-tip-pane>123</ai-tip-pane>
<ai-tip-pane
v-if="enterpriseInfo.id === '914403001922038216'">近年来,华为遭遇了严峻的外部技术封锁,其核心源于某些国家的持续制裁。这主要包括被列入“实体清单”,禁止其未经许可从美国公司获取芯片等关键技术;以及遭受更严格的“外国直接产品规则”打击,旨在切断其利用美国工具、软件和技术设计或制造先进芯片的渠道。这些措施不仅限制了华为自身产品的设计与生产,也影响了其全球供应链,使其在获取先进半导体、移动操作系统生态(如GMS)及基础软件工具等方面面临巨大挑战,意图从根本上遏制其技术发展。</ai-tip-pane>
</div>
</analysis-box>
</template>
<style lang="scss" scoped>
@use '@/styles/radio.scss';
.content-box {
padding: 10px;
gap: 10px;
......
<script setup lang="ts">
import '@/styles/tabs.scss'
import { ElTabPane, ElTabs } from 'element-plus';
import SanctionsSituation from './SanctionsSituation.vue';
import EnterpriseScale from './EnterpriseScale.vue';
import MarketShare from './MarketShare.vue';
import MarketValue from './MarketValue.vue';
import ResearchAndDevelopment from './ResearchAndDevelopment.vue';
// 定义组件属性
const props = defineProps({
......@@ -15,12 +18,18 @@ const props = defineProps({
<template>
<div style="overflow: visible;">
<el-tabs tabPosition="left" class="disinheritance tabs-nav-no-wrap left-float-nav-tabs">
<el-tab-pane label="企业规模">
<sanctions-situation :enterprise-info="enterpriseInfo"></sanctions-situation>
<el-tab-pane label="企业规模" lazy>
<enterprise-scale :enterprise-info="enterpriseInfo"></enterprise-scale>
</el-tab-pane>
<el-tab-pane label="市值变化" lazy>
<market-value :enterprise-info="enterpriseInfo"></market-value>
</el-tab-pane>
<el-tab-pane label="研发投入" lazy>
<research-and-development :enterprise-info="enterpriseInfo"></research-and-development>
</el-tab-pane>
<el-tab-pane label="市场占比" lazy>
<market-share :enterprise-info="enterpriseInfo"></market-share>
</el-tab-pane>
<!-- <el-tab-pane label="市值变化"></el-tab-pane>
<el-tab-pane label="研发投入"></el-tab-pane>
<el-tab-pane label="市场占比"></el-tab-pane> -->
</el-tabs>
</div>
</template>
\ No newline at end of file
......@@ -30,7 +30,7 @@ import { getSupplyAreaList } from '@/api/companyPages';
import { ref, watch } from 'vue';
import { ElSpace } from 'element-plus';
// 导入自定义组件
import CapitalScale from './capitalScale.vue'
import CapitalScale from './CapitalScale.vue'
// 响应式数据
const areas = ref([]) // 供应区域列表
......
......@@ -29,10 +29,10 @@
import { ref, onMounted } from 'vue';
import { useRoute } from 'vue-router';
import { getEnterprisePageInfo } from '@/api/companyPages';
import TitlePane from './component/titlePane.vue';
import NewsPane from './component/detailsPages/newsPane.vue';
import BaseInfo from './component/detailsPages/baseInfo.vue';
import OperatingPages from './component/operatingPages/index.vue';
import TitlePane from './component/TitlePane.vue';
import NewsPane from './component/DetailsPages/NewsPane.vue';
import BaseInfo from './component/DetailsPages/BaseInfo.vue';
import OperatingPages from './component/OperatingPages/index.vue';
import '@/styles/tabs.scss'
import '@/styles/container.scss'
import { ElScrollbar, ElSpace, ElTabs, ElTabPane } from 'element-plus';
......
......@@ -115,13 +115,15 @@
{{ item.name }}
</div>
<div class="box1-main-right-info">
<div class="tag" :class="{
<!-- <div class="tag" :class="{
tag1: tag.status == 1,
tag2: tag.status == 2,
tag3: tag.status == 3
}" v-for="(tag, index) in item.industryList" :key="index">
{{ tag.industryName }}
</div>
</div> -->
<AreaTag v-for="(tag, index) in item.industryList" :key="index" :tagName="tag.industryName">
</AreaTag>
</div>
<div class="box1-main-right-center">
{{ item.describe }}
......@@ -183,13 +185,14 @@
<div class="text">{{ "查看更多" }}</div>
</div>
</div> -->
<RiskSignal :list="warningList" @item-click="handleClickToDetail" @more-click="handleToMoreRiskSignal">
<RiskSignal :list="warningList" @item-click="handleClickToDetail" @more-click="handleToMoreRiskSignal"
riskLevel="signalLevel" postDate="signalTime" name="signalTitle">
</RiskSignal>
</div>
<DivideHeader id="position2" class="divide2" :titleText="'资讯要闻'"></DivideHeader>
<div class="center-center">
<!-- <NewsList :newsList="newsList" @item-click="handleToNewsAnalysis" @more-click="handleToMoreNews" /> -->
<NewsList :list="newsList" />
<NewsList :newsList="newsList" @item-click="handleToNewsAnalysis" @more-click="handleToMoreNews" />
<!-- <NewsList :newsList="newsList" /> -->
<MessageBubble :messageList="messageList" @person-click="handleClickPerson" @info-click="handleGetMessage"
imageUrl="img" @more-click="handleToSocialDetail" />
</div>
......@@ -410,7 +413,7 @@
</template>
<script setup>
// import NewsList from "@/components/base/NewsList/index.vue";
import NewsList from "@/components/base/NewsList/index.vue";
import { onMounted, ref, computed, watch, nextTick } from "vue";
import router from "@/router";
import {
......@@ -426,6 +429,7 @@ import {
getDecreeTypeList
} from "@/api/decree/home";
import RiskSignal from "@/components/RiskSignal/RiskSignal.vue";
// import RiskSignal from "@/components/base/RiskSignal/index.vue";
import { getPersonSummaryInfo } from "@/api/common/index";
import { getNews, getSocialMedia } from "@/api/general/index";
import DivideHeader from "@/components/DivideHeader.vue";
......@@ -637,8 +641,11 @@ const warningList = ref([
// }
]);
const handlegetDecreeRiskSignal = async () => {
const params = {
moduleId: "0101"
};
try {
const res = await getDecreeRiskSignal();
const res = await getDecreeRiskSignal(params);
console.log("风险信号", res);
if (res.code === 200 && res.data) {
warningList.value = res.data;
......@@ -1760,6 +1767,7 @@ onMounted(async () => {
margin-top: 14px;
display: flex;
height: 24px;
gap: 8px;
.tag {
height: 24px;
......
import 'echarts-wordcloud';
const getWordCloudChart = (data) => {
const option = {
......
......@@ -4,19 +4,9 @@
<AnalysisBox title="相关政令关联分析" :showAllBtn="false">
<div class="box1-main">
<div class="left">
<el-empty
v-if="siderList.length === 0"
style="padding-top: 240px"
description="暂无数据"
:image-size="100"
/>
<div
class="left-item"
:class="{ leftItemActive: siderActiveIndex === index }"
v-for="(item, index) in siderList"
:key="index"
@click="handleClickSider(index)"
>
<el-empty v-if="siderList.length === 0" style="padding-top: 240px" description="暂无数据" :image-size="100" />
<div class="left-item" :class="{ leftItemActive: siderActiveIndex === index }"
v-for="(item, index) in siderList" :key="index" @click="handleClickSider(index)">
<div class="time">{{ item.time }}</div>
<div class="title">{{ item.title }}</div>
</div>
......@@ -25,7 +15,11 @@
<div class="right">
<div class="info-box">
<div class="info-left">
<img :src="decreeInfo.img" alt="" />
<img v-if="decreeInfo.img" :src="decreeInfo.img" alt="" />
<div v-else class="box1-main-left-img-mock">
<img class="img-mock-badge-img" src="./assets/icons/badge.png" />
<div class="img-mock-badge-title">{{ decreeInfo.eTotalTitle }}</div>
</div>
</div>
<div class="info-right">
<div class="info-item">
......@@ -34,11 +28,7 @@
<div class="item-right-text">
{{ decreeInfo.totalTitle }}
</div>
<div
class="item-right-icon"
v-if="decreeInfo.totalTitle"
@click="handleToDecreeDetail(decreeInfo)"
>
<div class="item-right-icon" v-if="decreeInfo.totalTitle" @click="handleToDecreeDetail(decreeInfo)">
<img src="./assets/icons/open-icon.png" alt="" />
</div>
</div>
......@@ -71,12 +61,8 @@
<div class="title">{{ "政令主要内容" }}</div>
</div>
<div class="list-main">
<el-empty
v-if="showList.length === 0"
style="padding-top: 150px"
description="暂无数据"
:image-size="100"
/>
<el-empty v-if="showList.length === 0" style="padding-top: 150px" description="暂无数据"
:image-size="100" />
<div class="list-item" v-for="(val, idx) in showList" :key="idx">
<div class="id">{{ idx + 1 }}</div>
<div class="title">{{ val.content }}</div>
......@@ -91,14 +77,8 @@
{{ `共 ${decreeInfo.list.length} 项` }}
</div>
<div class="footer-right">
<el-pagination
@current-change="handleCurrentChange"
:pageSize="pageSize"
:current-page="currentPage"
background
layout="prev, pager, next"
:total="decreeInfo.list.length"
/>
<el-pagination @current-change="handleCurrentChange" :pageSize="pageSize" :current-page="currentPage"
background layout="prev, pager, next" :total="decreeInfo.list.length" />
</div>
</div>
</div>
......@@ -181,7 +161,7 @@ const handleClickSider = async index => {
} else {
decreeInfo.value.list = [];
}
} catch (error) {}
} catch (error) { }
};
const decreeInfo = ref({
......@@ -240,7 +220,7 @@ const handleGetRelateOrder = async () => {
} else {
decreeInfo.value.list = [];
}
} catch (error) {}
} catch (error) { }
} else {
allData.value = [];
siderList.value = [];
......@@ -286,10 +266,12 @@ onMounted(() => {
.wrap {
height: 100%;
overflow: hidden;
.box-header {
height: 56px;
display: flex;
position: relative;
.header-left {
margin-top: 18px;
width: 8px;
......@@ -297,6 +279,7 @@ onMounted(() => {
border-radius: 0 4px 4px 0;
background: var(--color-main-active);
}
.title {
margin-left: 14px;
margin-top: 14px;
......@@ -307,15 +290,18 @@ onMounted(() => {
font-size: 20px;
font-weight: 700;
}
.header-btn-box {
position: absolute;
top: 14px;
right: 52px;
display: flex;
.btn {
margin-left: 8px;
}
}
.header-right {
position: absolute;
top: 14px;
......@@ -323,9 +309,11 @@ onMounted(() => {
height: 28px;
display: flex;
gap: 4px;
.icon {
width: 28px;
height: 28px;
img {
width: 100%;
height: 100%;
......@@ -333,18 +321,22 @@ onMounted(() => {
}
}
}
.box1 {
margin: 16px auto;
width: 1600px;
max-height: 898px;
min-height: 788px;
.box1-main {
display: flex;
margin-top: 5px;
margin-bottom: 10px;
.left {
margin-left: 21px;
width: 300px;
.left-item {
width: 300px;
height: 64px;
......@@ -355,9 +347,11 @@ onMounted(() => {
font-size: 18px;
font-weight: 400;
cursor: pointer;
&:hover {
background: rgba(246, 250, 255, 1);
}
.time {
width: 45px;
height: 24px;
......@@ -365,6 +359,7 @@ onMounted(() => {
margin-left: 18px;
margin-top: 20px;
}
.title {
width: 200px;
margin-left: 17px;
......@@ -381,10 +376,12 @@ onMounted(() => {
white-space: nowrap;
}
}
.leftItemActive {
color: var(--color-main-active);
font-weight: 700;
background: rgba(246, 250, 255, 1);
&::after {
position: relative;
content: "";
......@@ -396,8 +393,10 @@ onMounted(() => {
}
}
}
.right {
margin-left: 36px;
.info-box {
margin-left: 28px;
width: 1180px;
......@@ -406,24 +405,73 @@ onMounted(() => {
border: 1px solid rgba(231, 243, 255, 1);
background: rgba(246, 250, 255, 1);
display: flex;
.info-left {
width: 242px;
height: 136px;
margin-top: 25px;
margin-left: 28px;
img {
// width: 100%;
height: 100%;
}
.box1-main-left-img-mock {
width: 100%;
height: 100%;
border-radius: 4px;
background-color: #0b1932;
display: flex;
align-items: center;
flex-direction: column;
justify-content: space-around;
padding: 15px;
.img-mock-badge-img {
width: 50px;
height: 50px;
}
.img-mock-badge-title {
text-align: center;
font-size: 14px;
line-height: 20px;
color: #fff;
height: 40px;
display: -webkit-box;
/* 2. 设置排列方向为垂直 */
-webkit-box-orient: vertical;
/* 3. 设置显示的行数(这里设为2行) */
-webkit-line-clamp: 2;
/* 4. 处理溢出和换行 */
overflow: hidden;
text-overflow: ellipsis;
word-break: break-word;
}
// .img-mock-badge-org {
// text-align: center;
// font-size: 14px;
// color: #fff;
// }
}
}
.info-right {
margin-left: 20px;
margin-top: 22px;
.info-item {
display: flex;
min-height: 30px;
max-height: 60px;
margin-bottom: 8px;
.item-left {
// margin-top: 3px;
width: 100px;
......@@ -434,6 +482,7 @@ onMounted(() => {
font-weight: 700;
line-height: 24px;
}
.item-right {
width: 769px;
// height: 30px;
......@@ -443,8 +492,10 @@ onMounted(() => {
font-weight: 400;
line-height: 25px;
}
.item-right1 {
display: flex;
.item-right-text {
height: 30px;
color: var(--color-main-active);
......@@ -453,12 +504,14 @@ onMounted(() => {
font-weight: 700;
line-height: 30px;
}
.item-right-icon {
margin-left: 13px;
margin-top: 7px;
width: 16px;
height: 16px;
cursor: pointer;
img {
width: 100%;
height: 100%;
......@@ -468,22 +521,27 @@ onMounted(() => {
}
}
}
.list-box {
margin-left: 36px;
.list-header {
display: flex;
height: 56px;
border-bottom: 1px solid rgba(234, 236, 238, 1);
.icon {
margin-top: 21px;
margin-left: 17px;
width: 19px;
height: 19px;
img {
width: 100%;
height: 100%;
}
}
.title {
margin-top: 16px;
margin-left: 16px;
......@@ -495,11 +553,13 @@ onMounted(() => {
line-height: 30px;
}
}
.list-main {
min-height: 420px;
max-height: 540px;
overflow-x: hidden;
overflow-y: auto;
.list-item {
width: 1180px;
min-height: 65px;
......@@ -509,9 +569,11 @@ onMounted(() => {
border-bottom: 1px solid rgba(234, 236, 238, 1);
display: flex;
cursor: pointer;
&:hover {
background: var(--color-bg-hover);
}
.id {
width: 24px;
height: 24px;
......@@ -523,6 +585,7 @@ onMounted(() => {
line-height: 24px;
color: #0a57a6;
}
.title {
margin-left: 13px;
margin-top: 12px;
......@@ -535,10 +598,12 @@ onMounted(() => {
font-weight: 400;
line-height: 25px;
}
.open {
width: 16px;
height: 16px;
margin-top: 20px;
img {
width: 100%;
height: 100%;
......@@ -547,12 +612,14 @@ onMounted(() => {
}
}
}
.list-footer {
margin-left: 35px;
height: 32px;
margin-top: 10px;
display: flex;
justify-content: space-between;
.footer-left {
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
......
......@@ -756,6 +756,10 @@ import {
getExportControlList
} from "@/api/exportControl";
import { getMultipleBarChart_m } from "./utils/charts";
import { formatAnyDateToChinese } from "./utils";
import _ from "lodash";
const currentRuleCompany = ref("");
const currentRuleCount = ref(0);
const currentRuleList = ref([]);
......@@ -858,10 +862,6 @@ const handleTitleClick = item => {
window.open(route.href, "_blank");
};
import { getMultipleBarChart_m } from "./utils/charts";
import { formatAnyDateToChinese } from "./utils";
import _ from "lodash";
const handleCompClick = item => {
// console.log("item", item);
// if (item.entityType != 2) return;
......@@ -943,25 +943,33 @@ onMounted(async () => {
return { name: entityNameZh, enName: entityName };
});
entitiesDataInfoList.value = entitiesDataInfo || [];
const list = _.chain(industryCountByYear).filter("year").orderBy("year", "desc").value();
const cclList1 = _.chain(cclList).filter("year").orderBy("year", "desc").value();
const list = _.chain(industryCountByYear).filter("year").orderBy("year", "desc").value().slice(0, 5);
const cclList1 = _.chain(cclList).filter("year").orderBy("year", "desc").value().slice(0, 5);
const total = _.sumBy(list, "count");
const maxCountItem = _.maxBy(list, "count");
const maxCountForList = maxCountItem ? maxCountItem.count : 0;
const maxCountItem1 = _.maxBy(cclList1, "count");
const maxCountForList1 = maxCountItem1 ? maxCountItem1.count : 0;
console.log("shuju list", list);
console.log("shuju total", total);
tableData1.value = _.map(list, item => {
return {
year: item.year,
num: item.count,
percent: item.count / total,
percent: item.count / maxCountForList,
tags: item.domain
};
}).slice(0, 5);
});
tableData2.value = _.map(cclList1, item => {
return {
year: item.year,
num: item.count,
percent: item.count / total,
percent: item.count / maxCountForList1,
tags: item.domain
};
}).slice(0, 5);
});
// 获取趋势图数据
await fetchTrendData();
......@@ -2132,94 +2140,94 @@ const handleMediaClick = item => {
}
}
// .box4 {
// height: 786px;
// overflow: auto;
// display: flex;
// flex-direction: column;
// justify-content: space-between;
// padding-top: 16px;
// // padding-bottom: 50px;
// position: relative;
// .box4-item {
// display: flex;
// gap: 10px;
// align-items: flex-start;
// padding-bottom: 35px;
// position: relative;
// .box4-item-left {
// display: flex;
// flex-direction: column;
// align-items: center;
// .box4-item-left-icon {
// width: 10px;
// height: 10px;
// }
.box4 {
height: 786px;
overflow: auto;
display: flex;
flex-direction: column;
justify-content: space-between;
padding-top: 16px;
// padding-bottom: 50px;
position: relative;
// .box4-item-left-line {
// width: 1px;
// height: 100%;
// position: absolute;
// border-left: 1px solid rgba(10, 87, 166, 0.3);
// }
// }
.box4-item {
display: flex;
gap: 10px;
align-items: flex-start;
padding-bottom: 35px;
position: relative;
// .box4-item-right {
// display: flex;
// flex-direction: column;
// .box4-item-right-header {
// display: flex;
// justify-content: space-between;
// align-items: center;
// border-bottom: 1px solid rgba(234, 236, 238, 1);
// position: relative;
// top: -7.5px;
// padding-bottom: 8px;
// cursor: pointer;
// &-title {
// font-size: 18px;
// color: $base-color;
// font-weight: 700;
// }
.box4-item-left {
display: flex;
flex-direction: column;
align-items: center;
// &-desc {
// font-size: 16px;
// font-weight: 700;
// color: rgba(59, 65, 75, 1);
// }
// }
.box4-item-left-icon {
width: 10px;
height: 10px;
}
// .box4-item-right-content {
// font-size: 16px;
// font-weight: 400;
// color: rgba(95, 101, 108, 1);
// overflow: hidden;
// display: -webkit-box;
// -webkit-line-clamp: 3;
// -webkit-box-orient: vertical;
// text-overflow: ellipsis;
// line-height: 25px;
// }
// }
// }
.box4-item-left-line {
width: 1px;
height: 100%;
position: absolute;
border-left: 1px solid rgba(10, 87, 166, 0.3);
}
}
// .box4-footer {
// position: absolute;
// // margin-top: auto;
// display: flex;
// justify-content: center;
// align-items: center;
// bottom: 30px;
// left: 50%;
// margin-left: -30px;
// // margin-bottom: 30px;
// }
// }
.box4-item-right {
display: flex;
flex-direction: column;
.box4-item-right-header {
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1px solid rgba(234, 236, 238, 1);
position: relative;
top: -7.5px;
padding-bottom: 8px;
cursor: pointer;
&-title {
font-size: 18px;
color: $base-color;
font-weight: 700;
}
&-desc {
font-size: 16px;
font-weight: 700;
color: rgba(59, 65, 75, 1);
}
}
.box4-item-right-content {
font-size: 16px;
font-weight: 400;
color: rgba(95, 101, 108, 1);
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
text-overflow: ellipsis;
line-height: 25px;
}
}
}
.box4-footer {
position: absolute;
// margin-top: auto;
display: flex;
justify-content: center;
align-items: center;
bottom: 30px;
left: 50%;
margin-left: -30px;
// margin-bottom: 30px;
}
}
.box5 {
height: 115%;
......
......@@ -1024,16 +1024,19 @@ export const getMultipleBarChart_m = object => {
type: "value",
splitNumber: 5,
alignTicks: false,
name: "个",
nameLocation: "end",
nameGap: 10,
nameTextStyle: {
color: "rgba(95, 101, 108, 1)",
fontSize: 14,
fontWeight: 400,
fontFamily: "Microsoft YaHei",
padding: [0, 0, 0, 0]
}
axisLabel: {
formatter: "{value} 个"
}
// name: "个",
// nameLocation: "end",
// nameGap: 10,
// nameTextStyle: {
// color: "rgba(95, 101, 108, 1)",
// fontSize: 14,
// fontWeight: 400,
// fontFamily: "Microsoft YaHei",
// padding: [0, 0, 0, 0]
// }
},
series: datas
};
......
......@@ -13,8 +13,13 @@
</div> -->
<div class="home-main-header-center">
<SearchContainer style="margin-bottom: 0; margin-top: 51px; height: fit-content" v-if="containerRef"
placeholder="搜索智库报告" :containerRef="containerRef" areaName="智库" />
<SearchContainer
style="margin-bottom: 0; margin-top: 51px; height: fit-content"
v-if="containerRef"
placeholder="搜索智库报告"
:containerRef="containerRef"
areaName="智库"
/>
<!-- <el-input v-model="searchThinktankText" @keyup.enter="handleSearch"
style="width: 838px; height: 100%" placeholder="搜索智库报告" />
<div class="search">
......@@ -49,8 +54,11 @@
<div class="icon">
<img :src="item.logo" alt="" />
</div>
<div class="rank" :class="{ rank1: item.rank === 1, rank2: item.rank === 2, rank3: item.rank === 3 }">
<!-- <div class="rank" :class="{ rank1: item.rank === 1, rank2: item.rank === 2, rank3: item.rank === 3 }">
{{ "No." + (index + 1) }}
</div> -->
<div class="rank">
{{ item.reportNumber + "篇报告" }}
</div>
</div>
<div class="card-title">
......@@ -99,8 +107,14 @@
</div>
<div class="box1-header-right" @click="handleClickToDetail">查看详情 ></div>
</div>
<el-carousel ref="carouselRef" height="395px" :autoplay="true" :interval="3000" arrow="never"
indicator-position="none">
<el-carousel
ref="carouselRef"
height="395px"
:autoplay="true"
:interval="3000"
arrow="never"
indicator-position="none"
>
<el-carousel-item v-for="(itemData, index) in box1Data" :key="index">
<div class="box1-main">
<div class="box1-main-left">
......@@ -112,7 +126,11 @@
<!-- <div class="tag" v-for="(item, index) in itemData?.industryVOList" :key="index">
{{ item.industryName }}
</div> -->
<AreaTag v-for="(item, index) in itemData?.industryVOList" :key="index" :tagName="item.industryName" ></AreaTag>
<AreaTag
v-for="(item, index) in itemData?.industryVOList"
:key="index"
:tagName="item.industryName"
></AreaTag>
</div>
<div class="content">{{ itemData?.summary }}</div>
<div class="box1-right-footer">
......@@ -130,15 +148,34 @@
</el-carousel-item>
</el-carousel>
</div>
<RiskSignal :list="warningList" @more-click="handleToMoreRiskSignal" postDate="time" name="title"
@item-click="handleClickToDetail" />
<RiskSignal
:list="warningList"
@more-click="handleToMoreRiskSignal"
postDate="time"
name="title"
@item-click="handleClickToDetail"
/>
</div>
<DivideHeader id="position2" class="divide-header" :titleText="'资讯要闻'"></DivideHeader>
<div class="center-center">
<NewsList :newsList="newsList" @item-click="handleToNewsAnalysis" @more-click="handleToMoreNews"
img="newsImage" title="newsTitle" content="newsContent" from="from" />
<MessageBubble :messageList="messageList" imageUrl="personImage" @more-click="handleToSocialDetail"
@person-click="handleClickPerson" name="personName" content="remarks" source="orgName" />
<NewsList
:newsList="newsList"
@item-click="handleToNewsAnalysis"
@more-click="handleToMoreNews"
img="newsImage"
title="newsTitle"
content="newsContent"
from="from"
/>
<MessageBubble
:messageList="messageList"
imageUrl="personImage"
@more-click="handleToSocialDetail"
@person-click="handleClickPerson"
name="personName"
content="remarks"
source="orgName"
/>
</div>
<DivideHeader id="position3" class="divide-header" :titleText="'数据总览'"></DivideHeader>
<div class="center-footer">
......@@ -152,8 +189,13 @@
</div>
<div class="box5-select-box">
<el-select v-model="box5selectetedMonths" placeholder="选择时间" style="width: 120px">
<el-option v-for="item in box5MonthsList" :key="item.value" :label="item.label" :value="item.value"
@click="changeBox5Data(item.value)" />
<el-option
v-for="item in box5MonthsList"
:key="item.value"
:label="item.label"
:value="item.value"
@click="changeBox5Data(item.value)"
/>
</el-select>
</div>
</div>
......@@ -167,8 +209,13 @@
<div class="header-title">{{ "政策建议领域分布" }}</div>
<div class="box6-select-box">
<el-select v-model="box6selectetedYear" placeholder="选择时间" style="width: 120px">
<el-option v-for="item in box6YearList" :key="item.value" :label="item.label" :value="item.value"
@click="handleBox6()" />
<el-option
v-for="item in box6YearList"
:key="item.value"
:label="item.label"
:value="item.value"
@click="handleBox6()"
/>
</el-select>
</div>
</div>
......@@ -197,21 +244,30 @@
</div>
<div class="box8-select-box">
<el-select v-model="box8selectetedYear" placeholder="选择时间" style="width: 120px">
<el-option v-for="item in box8YearList" :key="item.value" :label="item.label" :value="item.value"
@click="changeBox8Data(item.value)" />
<el-option
v-for="item in box8YearList"
:key="item.value"
:label="item.label"
:value="item.value"
@click="changeBox8Data(item.value)"
/>
</el-select>
</div>
</div>
<div class="box8-main">
<div class="box8-item" v-for="(item, index) in box8Data" :key="index">
<div class="item-left"
:class="{ itemBold1: index === 0, itemBold2: index === 1, itemBold3: index === 2 }">
<div
class="item-left"
:class="{ itemBold1: index === 0, itemBold2: index === 1, itemBold3: index === 2 }"
>
{{ index + 1 }}
</div>
<!-- <el-popover effect="dark" :content="item.clause" placement="top-start">
<template #reference> -->
<div class="item-center"
:class="{ itemBold1: index === 0, itemBold2: index === 1, itemBold3: index === 2 }">
<div
class="item-center"
:class="{ itemBold1: index === 0, itemBold2: index === 1, itemBold3: index === 2 }"
>
{{ item.clause }}
</div>
<!-- </template>
......@@ -229,8 +285,13 @@
<div class="home-main-footer-header">
<div class="btn-box">
<div class="btn" :class="{ btnActive: activeCate === cate }" v-for="(cate, index) in categoryList"
:key="index" @click="handleClickCate(cate)">
<div
class="btn"
:class="{ btnActive: activeCate === cate }"
v-for="(cate, index) in categoryList"
:key="index"
@click="handleClickCate(cate)"
>
{{ cate }}
</div>
</div>
......@@ -261,12 +322,22 @@
</div>
<div class="select-main">
<div class="checkbox-group">
<el-checkbox v-model="checkAll" :indeterminate="isIndeterminate" class="all-checkbox"
@change="handleCheckAllChange">
<el-checkbox
v-model="checkAll"
:indeterminate="isIndeterminate"
class="all-checkbox"
@change="handleCheckAllChange"
>
全部领域
</el-checkbox>
<el-checkbox v-for="research in areaList" :key="research.id" v-model="selectedAreaList"
:label="research.id" @change="handleCheckedAreaChange()" class="filter-checkbox">
<el-checkbox
v-for="research in areaList"
:key="research.id"
v-model="selectedAreaList"
:label="research.id"
@change="handleCheckedAreaChange()"
class="filter-checkbox"
>
{{ research.name }}
</el-checkbox>
</div>
......@@ -280,13 +351,22 @@
</div>
<div class="select-main">
<div class="checkbox-group">
<el-checkbox v-model="checkAllTime" class="all-checkbox" :indeterminate="isIndeterminateTime"
@change="handleCheckAllChangeTime">
<el-checkbox
v-model="checkAllTime"
class="all-checkbox"
:indeterminate="isIndeterminateTime"
@change="handleCheckAllChangeTime"
>
全部时间
</el-checkbox>
<el-checkbox-group v-model="selectedPubTimeList">
<el-checkbox v-for="time in pubTimeList" :key="time.id" :label="time.id" class="filter-checkbox"
@change="handleCheckedAreaChangeTime()">
<el-checkbox
v-for="time in pubTimeList"
:key="time.id"
:label="time.id"
class="filter-checkbox"
@change="handleCheckedAreaChangeTime()"
>
{{ time.name }}
</el-checkbox>
</el-checkbox-group>
......@@ -296,8 +376,12 @@
</div>
<div class="right">
<div class="card-box">
<div class="footer-card" v-for="(item, index) in curFooterList" :key="index"
@click="handleToReportDetail(item)">
<div
class="footer-card"
v-for="(item, index) in curFooterList"
:key="index"
@click="handleToReportDetail(item)"
>
<div class="footer-card-top">
<img :src="item.imageUrl" alt="" />
</div>
......@@ -320,8 +404,14 @@
<div class="right-footer">
<div class="info">共 {{ total }} 项</div>
<div class="page-box">
<el-pagination :page-size="12" background layout="prev, pager, next" :total="total"
@current-change="handleCurrentChange" :current-page="currentPage" />
<el-pagination
:page-size="12"
background
layout="prev, pager, next"
:total="total"
@current-change="handleCurrentChange"
:current-page="currentPage"
/>
</div>
</div>
</div>
......@@ -394,8 +484,6 @@ import { setCanvasCreator } from "echarts/core";
import { ElMessage } from "element-plus";
const containerRef = ref(null);
const searchThinktankText = ref(""); //搜索科技人物及观点
// 智库列表
const cardList = ref([
......@@ -450,7 +538,8 @@ const handleGetThinkTankList = async () => {
tagList: item.tags,
country: item.country,
desc: item.describe,
rank: item.id
rank: item.id,
reportNumber: item.reportNumber
};
});
}
......@@ -1415,7 +1504,7 @@ const handleClickPerson = async item => {
ElMessage.warning("找不到当前人员的类型值!");
return;
}
} catch (error) { }
} catch (error) {}
};
// 点击新闻条目,跳转到新闻分析页
......@@ -1635,8 +1724,6 @@ onMounted(async () => {
padding: 0 160px;
}
.home-main-header-footer {
margin-top: 38px;
width: 688px;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论