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

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

......@@ -2,23 +2,23 @@ import request from "@/api/request.js";
// 实体清单-制裁概况-获取实体清单基本信息
export function getEntityInfo(sanType) {
return request({
method: 'GET',
url: `/api/sanctionList/baseInfo/${sanType}`
})
return request({
method: "GET",
url: `/api/sanctionList/baseInfo/${sanType}`
});
}
// 实体清单-制裁概况-获取发布机构与重点人物
/**
* @param {sanTypeId}
* @param {sanTypeId}
* @header token
*/
export function getPublishInfo(params) {
return request({
method: 'GET',
url: `/api/sanctionList/getPublishedOrg`,
params,
})
return request({
method: "GET",
url: `/api/sanctionList/getPublishedOrg`,
params
});
}
// 实体清单-制裁概况-获取发布机构机构动态
......@@ -28,11 +28,11 @@ export function getPublishInfo(params) {
* @header token
*/
export function getPublishOrgInfo(data) {
return request({
method: 'POST',
url: `/api/organization/relate/news`,
data,
})
return request({
method: "POST",
url: `/api/organization/relate/news`,
data
});
}
// 实体清单-制裁概况-获取实体清单更新历史
......@@ -46,15 +46,13 @@ export function getPublishOrgInfo(data) {
* @header token
*/
export function getEntityUpdateInfo(data) {
return request({
method: 'POST',
url: `/api/entitiesDataCount/getSanctionProcess`,
data,
})
return request({
method: "POST",
url: `/api/entitiesDataCount/getSanctionProcess`,
data
});
}
/**
* 实体清单列表-制裁概况-获取实体清单列表
* @param {Object} data
......@@ -70,12 +68,12 @@ export function getEntityUpdateInfo(data) {
* @param {number} [data.pageSize=10] - 每页数量
*/
export function getExportControlList(data, options = {}) {
return request({
method: "POST",
url: "/api/sanctionList/pageQuery",
data,
...options
})
return request({
method: "POST",
url: "/api/sanctionList/pageQuery",
data,
...options
});
}
// 实体清单-制裁概况-50%规则涉及实体数
......@@ -92,32 +90,32 @@ export function getExportControlList(data, options = {}) {
* @header token
*/
export function get50PercentEntityCount(data) {
return request({
method: 'POST',
url: `/api/sanctionList/getRuleCount`,
data,
})
return request({
method: "POST",
url: `/api/sanctionList/getRuleCount`,
data
});
}
// 实体清单-数据统计-总量统计
export function getTotalCount() {
return request({
method: 'GET',
url: `/api/sanctionList/statistics/el/total`
})
return request({
method: "GET",
url: `/api/sanctionList/statistics/el/total`
});
}
// 实体清单-数据统计-制裁实体数量变化情况
/**
* @param {countType}
* @param {countType}
* @header token
*/
export function getSanctionCountChange(params) {
return request({
method: 'GET',
url: `/api/sanctionList/statistics/el/num`,
params,
})
return request({
method: "GET",
url: `/api/sanctionList/statistics/el/num`,
params
});
}
// 实体清单-数据统计-制裁实体地域分布情况
......@@ -128,11 +126,11 @@ export function getSanctionCountChange(params) {
* @header token
*/
export function getRegionCount(params) {
return request({
method: 'GET',
url: `/api/sanctionList/statistics/el/region`,
params,
})
return request({
method: "GET",
url: `/api/sanctionList/statistics/el/region`,
params
});
}
// 实体清单-数据统计-制裁实体领域分布情况
......@@ -143,11 +141,11 @@ export function getRegionCount(params) {
* @header token
*/
export function getTechDomainCount(params) {
return request({
method: 'GET',
url: `/api/sanctionList/statistics/el/domain`,
params,
})
return request({
method: "GET",
url: `/api/sanctionList/statistics/el/domain`,
params
});
}
// 实体清单-数据统计-制裁实体类型分布情况
......@@ -158,11 +156,11 @@ export function getTechDomainCount(params) {
* @header token
*/
export function getEntityTypeCount(params) {
return request({
method: 'GET',
url: `/api/sanctionList/statistics/el/entityType`,
params,
})
return request({
method: "GET",
url: `/api/sanctionList/statistics/el/entityType`,
params
});
}
// 实体清单-深度挖掘-选择制裁
......@@ -176,11 +174,11 @@ export function getEntityTypeCount(params) {
* @header token
*/
export function getDeepMiningSelect(data) {
return request({
method: 'POST',
url: `/api/entitiesDataCount/getSanctionProcess`,
data,
})
return request({
method: "POST",
url: `/api/entitiesDataCount/getSanctionProcess`,
data
});
}
// 实体清单-深度挖掘-产业链列表信息
......@@ -189,11 +187,11 @@ export function getDeepMiningSelect(data) {
* @header token
*/
export function getDeepMiningIndustry(params) {
return request({
method: 'GET',
url: `/api/chain/getChainInfo`,
params,
})
return request({
method: "GET",
url: `/api/chain/getChainInfo`,
params
});
}
// 实体清单-深度挖掘-产业链鱼骨图信息
......@@ -204,11 +202,11 @@ export function getDeepMiningIndustry(params) {
* @header token
*/
export function getDeepMiningIndustryFishbone(params) {
return request({
method: 'GET',
url: `/api/chain/getChainFishbone`,
params,
})
return request({
method: "GET",
url: `/api/chain/getChainFishbone`,
params
});
}
// 实体清单-深度挖掘-产业链中国企业实体信息查询
......@@ -219,14 +217,13 @@ export function getDeepMiningIndustryFishbone(params) {
* @header token
*/
export function getDeepMiningIndustryEntity(params) {
return request({
method: 'GET',
url: `/api/chain/getChainEntityStat`,
params,
})
return request({
method: "GET",
url: `/api/chain/getChainEntityStat`,
params
});
}
// 单次制裁-制裁概况-基本信息
/**
* @param {Object} params
......@@ -234,11 +231,11 @@ export function getDeepMiningIndustryEntity(params) {
* @header token
*/
export function getSingleSanctionOverview(params) {
return request({
method: 'GET',
url: `/api/sanctionList/record/getDetail`,
params,
})
return request({
method: "GET",
url: `/api/sanctionList/record/getDetail`,
params
});
}
// 单次制裁-制裁概况-制裁实体国家分布
......@@ -248,11 +245,11 @@ export function getSingleSanctionOverview(params) {
* @header token
*/
export function getSingleSanctionEntityCountry(params) {
return request({
method: 'GET',
url: `/api/sanctionList/statistics/el/countryRegion`,
params,
})
return request({
method: "GET",
url: `/api/sanctionList/statistics/el/countryRegion`,
params
});
}
// 单次制裁-制裁概况-制裁背景
......@@ -264,11 +261,11 @@ export function getSingleSanctionEntityCountry(params) {
* @header token
*/
export function getSingleSanctionBackground(data) {
return request({
method: 'POST',
url: `/api/sanctionList/record/background`,
data,
})
return request({
method: "POST",
url: `/api/sanctionList/record/background`,
data
});
}
// 单次制裁-制裁概况-制裁清单
......@@ -282,14 +279,13 @@ export function getSingleSanctionBackground(data) {
* @header token
*/
export function getSingleSanctionOverviewList(data) {
return request({
method: 'POST',
url: `/api/sanctionList/record/sanList`,
data,
})
return request({
method: "POST",
url: `/api/sanctionList/record/sanList`,
data
});
}
// 单次制裁-数据统计-总量统计
/**
* @param {Object} params
......@@ -297,11 +293,11 @@ export function getSingleSanctionOverviewList(data) {
* @header token
*/
export function getSingleSanctionTotalCount(params) {
return request({
method: 'GET',
url: `/api/sanctionList/statistics/el/total`,
params,
})
return request({
method: "GET",
url: `/api/sanctionList/statistics/el/total`,
params
});
}
// 单次制裁-数据统计-制裁实体领域分布情况
......@@ -313,11 +309,11 @@ export function getSingleSanctionTotalCount(params) {
* @header token
*/
export function getSingleSanctionDomainCount(params) {
return request({
method: 'GET',
url: `/api/sanctionList/statistics/el/domain`,
params,
})
return request({
method: "GET",
url: `/api/sanctionList/statistics/el/domain`,
params
});
}
// 单次制裁-数据统计-制裁实体类型分布情况
......@@ -329,14 +325,13 @@ export function getSingleSanctionDomainCount(params) {
* @header token
*/
export function getSingleSanctionEntityTypeCount(params) {
return request({
method: 'GET',
url: `/api/sanctionList/statistics/el/entityType`,
params,
})
return request({
method: "GET",
url: `/api/sanctionList/statistics/el/entityType`,
params
});
}
// 单次制裁-数据统计-制裁实体国家分布
/**
* @param {Object} params
......@@ -344,14 +339,13 @@ export function getSingleSanctionEntityTypeCount(params) {
* @header token
*/
export function getSingleSanctionEntityCountryCount(params) {
return request({
method: 'GET',
url: `/api/sanctionList/statistics/el/countryRegion`,
params,
})
return request({
method: "GET",
url: `/api/sanctionList/statistics/el/countryRegion`,
params
});
}
// 单次制裁-数据统计-制裁实体地域分布情况
/**
* @param {Object} params
......@@ -361,14 +355,13 @@ export function getSingleSanctionEntityCountryCount(params) {
* @header token
*/
export function getSingleSanctionEntityRegionCount(params) {
return request({
method: 'GET',
url: `/api/sanctionList/statistics/el/region`,
params,
})
return request({
method: "GET",
url: `/api/sanctionList/statistics/el/region`,
params
});
}
// 单次制裁-深度挖掘-本次制裁实体清单列表
/**
* @param {Object} params
......@@ -379,14 +372,13 @@ export function getSingleSanctionEntityRegionCount(params) {
* @header token
*/
export function getSingleSanctionEntityList(data) {
return request({
method: 'POST',
url: `/api/sanctionList/record/sanListByType`,
data,
})
return request({
method: "POST",
url: `/api/sanctionList/record/sanListByType`,
data
});
}
// 单次制裁-深度挖掘-制裁实体供应链信息
/**
* @param {Object} params
......@@ -394,11 +386,11 @@ export function getSingleSanctionEntityList(data) {
* @header token
*/
export function getSingleSanctionEntitySupplyChain(params) {
return request({
method: 'GET',
url: `/api/sanctionList/record/supplyChain`,
params,
})
return request({
method: "GET",
url: `/api/organization/supplyChain`,
params
});
}
// 单次制裁-深度挖掘-制裁实体股权信息
......@@ -409,14 +401,13 @@ export function getSingleSanctionEntitySupplyChain(params) {
* @header token
*/
export function getSingleSanctionEntityEquity(params) {
return request({
method: 'GET',
url: `/api/sanctionList/record/shareholding`,
params,
})
return request({
method: "GET",
url: `/api/organization/shareholding`,
params
});
}
// 单次制裁-影响分析-企业规模-营收
/**
* @param {Object} params
......@@ -424,14 +415,13 @@ export function getSingleSanctionEntityEquity(params) {
* @header token
*/
export function getSingleSanctionEntityRevenue(params) {
return request({
method: 'GET',
url: `/api/organization/scale/revenue`,
params,
})
return request({
method: "GET",
url: `/api/organization/scale/revenue`,
params
});
}
// 单次制裁-影响分析-企业规模-净利润
/**
* @param {Object} params
......@@ -439,14 +429,13 @@ export function getSingleSanctionEntityRevenue(params) {
* @header token
*/
export function getSingleSanctionEntityNetProfit(params) {
return request({
method: 'GET',
url: `/api/organization/scale/netProfit`,
params,
})
return request({
method: "GET",
url: `/api/organization/scale/netProfit`,
params
});
}
// 单次制裁-影响分析-企业规模-人员
/**
* @param {Object} params
......@@ -454,14 +443,13 @@ export function getSingleSanctionEntityNetProfit(params) {
* @header token
*/
export function getSingleSanctionEntityPersonnel(params) {
return request({
method: 'GET',
url: `/api/organization/scale/personnel`,
params,
})
return request({
method: "GET",
url: `/api/organization/scale/personnel`,
params
});
}
// 单次制裁-影响分析-企业市值变化
/**
* @param {Object} params
......@@ -469,14 +457,13 @@ export function getSingleSanctionEntityPersonnel(params) {
* @header token
*/
export function getSingleSanctionEntityMarketValue(params) {
return request({
method: 'GET',
url: `/api/organization/marketValue`,
params,
})
return request({
method: "GET",
url: `/api/organization/marketValue`,
params
});
}
// 单次制裁-影响分析-企业研发投入
/**
* @param {Object} params
......@@ -484,14 +471,13 @@ export function getSingleSanctionEntityMarketValue(params) {
* @header token
*/
export function getSingleSanctionEntityRDInvestment(params) {
return request({
method: 'GET',
url: `/api/organization/rdInvestment`,
params,
})
return request({
method: "GET",
url: `/api/organization/rdInvestment`,
params
});
}
// 单次制裁-影响分析-企业市场占比
/**
* @param {Object} params
......@@ -499,14 +485,13 @@ export function getSingleSanctionEntityRDInvestment(params) {
* @header token
*/
export function getSingleSanctionEntityMarketShare(params) {
return request({
method: 'GET',
url: `/api/organization/marketShare`,
params,
})
return request({
method: "GET",
url: `/api/organization/marketShare`,
params
});
}
// 单次制裁-影响分析-科研仪器对美依赖情况
/**
* @param {Object} params
......@@ -514,14 +499,13 @@ export function getSingleSanctionEntityMarketShare(params) {
* @header token
*/
export function getSingleSanctionEntityRDInstrumentDependency(params) {
return request({
method: 'GET',
url: `/api/organization/instrument/getDependencyUS`,
params,
})
return request({
method: "GET",
url: `/api/organization/instrument/getDependencyUS`,
params
});
}
// 单次制裁-影响分析-科研仪器进口国分布
/**
* @param {Object} params
......@@ -529,14 +513,13 @@ export function getSingleSanctionEntityRDInstrumentDependency(params) {
* @header token
*/
export function getSingleSanctionEntityRDInstrumentImportCountry(params) {
return request({
method: 'GET',
url: `/api/organization/instrument/getOriginCount`,
params,
})
return request({
method: "GET",
url: `/api/organization/instrument/getOriginCount`,
params
});
}
// 单次制裁-影响分析-新增国际合作项目
/**
* @param {Object} params
......@@ -545,14 +528,13 @@ export function getSingleSanctionEntityRDInstrumentImportCountry(params) {
* @header token
*/
export function getSingleSanctionEntityInternationalCooperation(params) {
return request({
method: 'GET',
url: `/api/organization/project/icCount`,
params,
})
return request({
method: "GET",
url: `/api/organization/project/icCount`,
params
});
}
// 单次制裁-影响分析-新增国际合作论文
/**
* @param {Object} params
......@@ -561,27 +543,27 @@ export function getSingleSanctionEntityInternationalCooperation(params) {
* @header token
*/
export function getSingleSanctionEntityInternationalPaper(params) {
return request({
method: 'GET',
url: `/api/organization/paper/icCount`,
params,
})
return request({
method: "GET",
url: `/api/organization/paper/icCount`,
params
});
}
// 商业管制清单-CCL清单简介-基本信息
export function getCCLInfo() {
return request({
method: 'GET',
url: `/api/sanctionList/baseInfo/ccl`
})
return request({
method: "GET",
url: `/api/sanctionList/baseInfo/ccl`
});
}
// 商业管制清单-CCL清单简介-出口管制分类编码
export function getECCN() {
return request({
method: 'GET',
url: `/api/ccl/eccn`
})
return request({
method: "GET",
url: `/api/ccl/eccn`
});
}
// 商业管制清单-CCL清单简介-出口管制分类编码信息列表
......@@ -591,35 +573,35 @@ export function getECCN() {
* @header token
*/
export function getECCNList(params) {
return request({
method: 'GET',
url: `/api/ccl/eccn/rank`,
params,
})
return request({
method: "GET",
url: `/api/ccl/eccn/rank`,
params
});
}
// 商业管制清单-CCL清单列表-类别字典
export function getECCNCategory() {
return request({
method: 'GET',
url: `/api/commonDict/ccl/eccnCategory`
})
return request({
method: "GET",
url: `/api/commonDict/ccl/eccnCategory`
});
}
// 商业管制清单-CCL清单列表-科技领域字典
export function getAreaType() {
return request({
method: 'GET',
url: `/api/commonDict/areaType`
})
return request({
method: "GET",
url: `/api/commonDict/areaType`
});
}
// 商业管制清单-CCL清单列表-管控原因字典
export function getControlReason() {
return request({
method: 'GET',
url: `/api/commonDict/ccl/controlReason`
})
return request({
method: "GET",
url: `/api/commonDict/ccl/controlReason`
});
}
// 商业管制清单-CCL清单简介-CCL清单查询
......@@ -633,9 +615,9 @@ export function getControlReason() {
* @header token
*/
export function getCclQuery(data) {
return request({
method: 'POST',
url: `/api/ccl/query`,
data,
})
}
\ No newline at end of file
return request({
method: "POST",
url: `/api/ccl/query`,
data
});
}
<template>
<div class="box4">
<div class="box4-header">
<div class="msg-bubble">
<div class="msg-bubble-header">
<div class="header-icon">
<!-- <img src="./image1.png" alt="" /> -->
<img src="./message-icon.svg" alt="" />
......@@ -10,7 +10,7 @@
</div>
<div class="more" @click="handleToMoreNews">{{ "更多 +" }}</div>
</div>
<div class="box4-main">
<div class="msg-bubble-main">
<div class="message-bubble" v-for="(item, index) in messageList" :key="index" @click="handleClickPerson(item)">
<div class="avatar-container">
<img :src="item[props.imageUrl] || avatarUser" :alt="item[props.name]" class="avatar" />
......@@ -38,7 +38,7 @@
<!-- <MessageBubble v-for="(item, index) in messageList" @click="handleClickPsserson(item)"
@info-click="handleMediaClick(item)" :key="index" :avatar="item.img ? item.img : DefaultIcon1" :name="item.name"
:time="item.time" :source="item.source" :content="item.content" /> -->
<!-- <div class="box4-main-item" v-for="(item, index) in messageList" :key="index">
<!-- <div class="msg-bubble-main-item" v-for="(item, index) in messageList" :key="index">
<div class="left" @click="handleClickPerson(item)">
<img :src="item.img ? item.img : DefaultIcon1" alt="" />
</div>
......@@ -121,7 +121,7 @@ const handleToMoreNews = item => {
</script>
<style lang="scss" scoped>
.box4 {
.msg-bubble {
width: 792px;
height: 450px;
border-radius: 10px;
......@@ -129,7 +129,7 @@ const handleToMoreNews = item => {
background: rgba(255, 255, 255, 1);
border: 1px solid rgb(234, 236, 238);
.box4-header {
.msg-bubble-header {
width: 792px;
height: 48px;
border-bottom: 1px solid rgb(234, 236, 238);
......@@ -178,7 +178,7 @@ const handleToMoreNews = item => {
}
}
.box4-main {
.msg-bubble-main {
height: 402px;
overflow-y: auto;
box-sizing: border-box;
......
......@@ -112,7 +112,7 @@ const handleToNewsAnalysis = (item, index) => {
}
.more {
width: 45px;
width: 54px;
height: 24px;
position: absolute;
top: 12px;
......@@ -134,7 +134,7 @@ const handleToNewsAnalysis = (item, index) => {
.news-item {
display: flex;
height: 78px;
height: 76px;
width: 749px;
margin-left: 21px;
border-bottom: 1px solid rgba(240, 242, 244, 1);
......
<!--今日风险-->
<template>
<div class="content-wrapper">
<div class="policy-monitoring">
<div class="header">
<div class="section" v-for="(section, index) in sectionTab" :key="index"
:style="sections[index].waveBall.length === 2 ? 'width: 350px' : 'width:503px'">
<img class="section-title" :src="`/public/icon/riskToday/btn-` + index + `.png`" />
<div class="stats">
<div v-for="value in sections[index].waveBall" @click="highLight(value)">
<div @click="highLight(value.title)" style="cursor: pointer;">
<WaveBall :percent="value.percent" :data="value" :color="section.waterColor" :size="128"
@click="highLight(value)" />
<div class="waveBall-text">{{ value.title }}</div>
</div>
</div>
</div>
<div class="bottm-box">
<img src="./icon/title-icon-1.png" />
<div style="width: 225px">
{{ sections[index].title }}
</div>
<div style="width: 50px; color: rgba(132, 136, 142, 1)">
{{ sections[index].date }}
</div>
</div>
</div>
</div>
<div class="content">
<div class="content-title">
<img class="section-title" src="./icon/title-icon-2.png" />
<div>风险信号3323</div>
<div class="num">12</div>
</div>
<div style="display: flex">
<div class="risk-signals">
<div class="risk-signals-item" v-for="(item, index) in warningList" :key="index"
@click="handleClickToDetailO(item)" :class="{ 'highlighted': item.eventType === highlightedEventType }">
<div class="item-left" :class="{
itemLeftStatus1: item.signalLevel === '特别重大',
itemLeftStatus2: item.signalLevel === '重大风险'
}">
{{ item.signalLevel ? item.signalLevel : "一般风险" }}
</div>
<div class="item-right">
<div class="text">
{{ item.signalTitle }}
</div>
<div class="time">{{ item.signalTime }}</div>
</div>
</div>
</div>
<div class="news">
<div class="box1-left" @click="handleSwithCurNews('left')">
<div class="icon">
<img src="./icon/box1-left.png" alt="" />
</div>
</div>
<div class="box1-right" @click="handleSwithCurNews('right')">
<div class="icon">
<img src="./icon/box1-right.png" alt="" />
</div>
</div>
<el-carousel ref="carouselRef" style="height: 412px; width: 736px" :autoplay="true" :interval="3000"
arrow="never" indicator-position="none" @change="handleCarouselChange">
<el-carousel-item v-for="(News, NewsIndex) in hotNewsList" :key="NewsIndex">
<div class="carousel-item">
<div class="carousel-title">
<div class="title-text">
{{ News.title }}
</div>
<div class="title-tag">
{{ News.category }}
</div>
</div>
<div style="/* 矩形 351 */ width: 664px; height: 1px; background: rgba(234, 236, 238, 1)"></div>
<div class="carousel-content">{{ News.content }}</div>
<div style="/* 矩形 351 */ width: 664px; height: 1px; background: rgba(234, 236, 238, 1)"></div>
<div class="carousel-bottom">
<div class="carousel-bottom">{{ News.date + News.source }}</div>
</div>
</div>
</el-carousel-item>
</el-carousel>
</div>
</div>
</div>
</div>
</div>
<div class="content-wrapper">
<div class="policy-monitoring">
<div class="header">
<div
class="section"
v-for="(section, index) in sectionTab"
:key="index"
:style="sections[index].waveBall.length === 2 ? 'width: 350px' : 'width:503px'"
>
<img class="section-title" :src="`/public/icon/riskToday/btn-` + index + `.png`" />
<div class="stats">
<div v-for="value in sections[index].waveBall" @click="highLight(value)">
<div @click="highLight(value.title)" style="cursor: pointer">
<WaveBall
:percent="value.percent"
:data="value"
:color="section.waterColor"
:size="128"
@click="highLight(value)"
/>
<div class="waveBall-text">{{ value.title }}</div>
</div>
</div>
</div>
<div class="bottm-box">
<img src="./icon/title-icon-1.png" />
<div style="width: 225px">
{{ sections[index].title }}
</div>
<div style="width: 50px; color: rgba(132, 136, 142, 1)">
{{ sections[index].date }}
</div>
</div>
</div>
</div>
<div class="content">
<div class="content-title">
<img class="section-title" src="./icon/title-icon-2.png" />
<div>风险信号3323</div>
<div class="num">12</div>
</div>
<div style="display: flex">
<div class="risk-signals">
<div
class="risk-signals-item"
v-for="(item, index) in warningList"
:key="index"
@click="handleClickToDetailO(item)"
:class="{ highlighted: item.eventType === highlightedEventType }"
>
<div
class="item-left"
:class="{
itemLeftStatus1: item.signalLevel === '特别重大',
itemLeftStatus2: item.signalLevel === '重大风险'
}"
>
{{ item.signalLevel ? item.signalLevel : "一般风险" }}
</div>
<div class="item-right">
<div class="text">
{{ item.signalTitle }}
</div>
<div class="time">{{ item.signalTime }}</div>
</div>
</div>
</div>
<div class="news">
<div class="box1-left" @click="handleSwithCurNews('left')">
<div class="icon">
<img src="./icon/box1-left.png" alt="" />
</div>
</div>
<div class="box1-right" @click="handleSwithCurNews('right')">
<div class="icon">
<img src="./icon/box1-right.png" alt="" />
</div>
</div>
<el-carousel
ref="carouselRef"
style="height: 412px; width: 736px"
:autoplay="true"
:interval="3000"
arrow="never"
indicator-position="none"
@change="handleCarouselChange"
>
<el-carousel-item v-for="(News, NewsIndex) in hotNewsList" :key="NewsIndex">
<div class="carousel-item">
<div class="carousel-title">
<div class="title-text">
{{ News.title }}
</div>
<div class="title-tag">
{{ News.category }}
</div>
</div>
<div
style="/* 矩形 351 */ width: 664px; height: 1px; background: rgba(234, 236, 238, 1)"
></div>
<div class="carousel-content">{{ News.content }}</div>
<div
style="/* 矩形 351 */ width: 664px; height: 1px; background: rgba(234, 236, 238, 1)"
></div>
<div class="carousel-bottom">
<div class="carousel-bottom">{{ News.date + News.source }}</div>
</div>
</div>
</el-carousel-item>
</el-carousel>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
......@@ -96,565 +124,565 @@ import { onMounted, ref, computed } from "vue";
import WaveBall from "./WaveBall.vue";
import { getBillRiskSignal } from "@/api/bill/billHome";
const sectionTab = [
{
textColor: "rgba(9, 88, 217, 1)",
borderColor: "rgba(186, 224, 255, 1)",
waterColor: ["#A6CCFF", "#C2DEFF", "#ECF7FF", "#0758D9"],
title: "政策法规"
},
{
textColor: "rgba(9, 88, 217, 1)",
borderColor: "rgba(186, 224, 255, 1)",
waterColor: ["#A6CCFF", "#C2DEFF", "#ECF7FF", "#0758D9"],
title: "出口管制"
},
{
textColor: "rgba(9, 88, 217, 1)",
borderColor: "rgba(186, 224, 255, 1)",
waterColor: ["#A6CCFF", "#C2DEFF", "#ECF7FF", "#0758D9"],
title: "投融资限制"
},
{
textColor: "rgba(9, 88, 217, 1)",
borderColor: "rgba(186, 224, 255, 1)",
waterColor: ["#A6CCFF", "#C2DEFF", "#ECF7FF", "#0758D9"],
title: "市场准入"
}
{
textColor: "rgba(9, 88, 217, 1)",
borderColor: "rgba(186, 224, 255, 1)",
waterColor: ["#A6CCFF", "#C2DEFF", "#ECF7FF", "#0758D9"],
title: "政策法规"
},
{
textColor: "rgba(9, 88, 217, 1)",
borderColor: "rgba(186, 224, 255, 1)",
waterColor: ["#A6CCFF", "#C2DEFF", "#ECF7FF", "#0758D9"],
title: "出口管制"
},
{
textColor: "rgba(9, 88, 217, 1)",
borderColor: "rgba(186, 224, 255, 1)",
waterColor: ["#A6CCFF", "#C2DEFF", "#ECF7FF", "#0758D9"],
title: "投融资限制"
},
{
textColor: "rgba(9, 88, 217, 1)",
borderColor: "rgba(186, 224, 255, 1)",
waterColor: ["#A6CCFF", "#C2DEFF", "#ECF7FF", "#0758D9"],
title: "市场准入"
}
];
// 模拟从后端获取的数据
const sections = ref([
{
title: "政令:确保美国太空优势",
date: "12-18",
waveBall: [
{
percent: 30, // 估算的百分比
count: 1626,
change: "+3",
unit: "项",
title: "法案(提出)"
},
{
percent: 20, // 估算的百分比
count: 69,
change: "+2",
unit: "个",
title: "政令"
}
]
},
{
title: "对实体清单的更新及修订",
date: "12-18",
waveBall: [
{
percent: 10, // 估算的百分比
count: 128,
change: "+1",
unit: "次",
title: "实体清单"
},
{
percent: 20, // 估算的百分比
count: 69,
change: "+1",
unit: "次",
title: "CCL"
}
]
},
{
title: "SDN清单更新",
waveBall: [
{
percent: 15, // 估算的百分比
count: 35,
change: "+1",
unit: "次",
title: "SDN"
},
{
percent: 5, // 估算的百分比
count: 28,
change: "+1",
unit: "家",
title: "涉军企业"
}
]
},
{
title: "232调查:商用飞机和喷气发动机进口对国家安全的...",
date: "12-18",
waveBall: [
{
percent: 3, // 估算的百分比
count: 215,
change: "+1",
unit: "次",
title: "337调查"
},
{
percent: 3, // 估算的百分比
count: 14,
change: "无新增",
unit: "次",
title: "230调查"
},
{
percent: 3, // 估算的百分比
count: 9,
change: "无新增",
unit: "次",
title: "301调查"
}
]
}
{
title: "政令:确保美国太空优势",
date: "12-18",
waveBall: [
{
percent: 30, // 估算的百分比
count: 1626,
change: "+3",
unit: "项",
title: "法案(提出)"
},
{
percent: 20, // 估算的百分比
count: 69,
change: "+2",
unit: "个",
title: "政令"
}
]
},
{
title: "对实体清单的更新及修订",
date: "12-18",
waveBall: [
{
percent: 10, // 估算的百分比
count: 128,
change: "+1",
unit: "次",
title: "实体清单"
},
{
percent: 20, // 估算的百分比
count: 69,
change: "+1",
unit: "次",
title: "CCL"
}
]
},
{
title: "SDN清单更新",
waveBall: [
{
percent: 15, // 估算的百分比
count: 35,
change: "+1",
unit: "次",
title: "SDN"
},
{
percent: 5, // 估算的百分比
count: 28,
change: "+1",
unit: "家",
title: "涉军企业"
}
]
},
{
title: "232调查:商用飞机和喷气发动机进口对国家安全的...",
date: "12-18",
waveBall: [
{
percent: 3, // 估算的百分比
count: 215,
change: "+1",
unit: "次",
title: "337调查"
},
{
percent: 3, // 估算的百分比
count: 14,
change: "无新增",
unit: "次",
title: "232调查"
},
{
percent: 3, // 估算的百分比
count: 9,
change: "无新增",
unit: "次",
title: "301调查"
}
]
}
]);
// 风险信号
const warningList = ref([]);
// 获取法案风险信号
const handlegetBillRiskSignal = async () => {
const params = {
moduleId: "0100"
};
try {
const res = await getBillRiskSignal(params);
console.log("法案风险信号", res);
if (res.code === 200) {
warningList.value = res.data;
}
} catch (error) { }
const params = {
moduleId: "0100"
};
try {
const res = await getBillRiskSignal(params);
console.log("法案风险信号", res);
if (res.code === 200) {
warningList.value = res.data;
}
} catch (error) {}
};
const hotNewsList = ref([
{
title: "美国白宫发布关于进一步延长TikTok执法宽限期的行政令",
category: "政策及立法打压风险",
content:
"2025年1月20日第14166号行政命令第2(a)条(《保护美国免受外国对抗者控制应用法案》对TikTok的适用)规定的执行延迟,并由2025年4月4日第14258号行政命令(延长TikTok执法延迟)和2025年6月19日第14310号行政命令(进一步延长TikTok执法延迟)所延长,进一步延长至2025年12月16日。在此期间,司法部不得采取任何行动执行《保护美国人免受外国对抗者控制应用法案》(以下简称“法案”)(公共法118-50,H部),也不得对任何违反该法案的实体处以任何处罚,包括分发、维护、更新(或促成分发,维护或更新任何外国对手控制的应用,如本法所定义。鉴于本指示,即使在上述规定期限届满后,司法部也应继续与相关部门合作,以确保美国国家安全和公民隐私权利不受威胁。",
date: "2025年9月16日",
source: "美国白宫·总统行政令"
},
{
title: "美国白宫发布关于进一步延长TikTok执法宽限期的行政令",
category: "政策及立法打压风险",
content:
"2025年1月20日第14166号行政命令第2(a)条(《保护美国免受外国对抗者控制应用法案》对TikTok的适用)规定的执行延迟,并由2025年4月4日第14258号行政命令(延长TikTok执法延迟)和2025年6月19日第14310号行政命令(进一步延长TikTok执法延迟)所延长,进一步延长至2025年12月16日。在此期间,司法部不得采取任何行动执行《保护美国人免受外国对抗者控制应用法案》(以下简称“法案”)(公共法118-50,H部),也不得对任何违反该法案的实体处以任何处罚,包括分发、维护、更新(或促成分发,维护或更新任何外国对手控制的应用,如本法所定义。鉴于本指示,即使在上述规定期限届满后,司法部也应继续与相关部门合作,以确保美国国家安全和公民隐私权利不受威胁。",
date: "2025年9月16日",
source: "美国白宫·总统行政令"
}
{
title: "美国白宫发布关于进一步延长TikTok执法宽限期的行政令",
category: "政策及立法打压风险",
content:
"2025年1月20日第14166号行政命令第2(a)条(《保护美国免受外国对抗者控制应用法案》对TikTok的适用)规定的执行延迟,并由2025年4月4日第14258号行政命令(延长TikTok执法延迟)和2025年6月19日第14310号行政命令(进一步延长TikTok执法延迟)所延长,进一步延长至2025年12月16日。在此期间,司法部不得采取任何行动执行《保护美国人免受外国对抗者控制应用法案》(以下简称“法案”)(公共法118-50,H部),也不得对任何违反该法案的实体处以任何处罚,包括分发、维护、更新(或促成分发,维护或更新任何外国对手控制的应用,如本法所定义。鉴于本指示,即使在上述规定期限届满后,司法部也应继续与相关部门合作,以确保美国国家安全和公民隐私权利不受威胁。",
date: "2025年9月16日",
source: "美国白宫·总统行政令"
},
{
title: "美国白宫发布关于进一步延长TikTok执法宽限期的行政令",
category: "政策及立法打压风险",
content:
"2025年1月20日第14166号行政命令第2(a)条(《保护美国免受外国对抗者控制应用法案》对TikTok的适用)规定的执行延迟,并由2025年4月4日第14258号行政命令(延长TikTok执法延迟)和2025年6月19日第14310号行政命令(进一步延长TikTok执法延迟)所延长,进一步延长至2025年12月16日。在此期间,司法部不得采取任何行动执行《保护美国人免受外国对抗者控制应用法案》(以下简称“法案”)(公共法118-50,H部),也不得对任何违反该法案的实体处以任何处罚,包括分发、维护、更新(或促成分发,维护或更新任何外国对手控制的应用,如本法所定义。鉴于本指示,即使在上述规定期限届满后,司法部也应继续与相关部门合作,以确保美国国家安全和公民隐私权利不受威胁。",
date: "2025年9月16日",
source: "美国白宫·总统行政令"
}
]);
const curNews = ref({});
const carouselRef = ref(null);
const curHotNewsListIndex = ref(0);
const handleCarouselChange = index => {
curHotNewsListIndex.value = index;
if (hotNewsList.value && hotNewsList.value.length > 0) {
curNews.value = hotNewsList.value[index];
}
curHotNewsListIndex.value = index;
if (hotNewsList.value && hotNewsList.value.length > 0) {
curNews.value = hotNewsList.value[index];
}
};
const handleSwithCurNews = name => {
if (name === "left") {
carouselRef.value.prev();
} else {
carouselRef.value.next();
}
if (name === "left") {
carouselRef.value.prev();
} else {
carouselRef.value.next();
}
};
// 查看详情 传递参数
const handleClickToDetailO = item => {
window.sessionStorage.setItem("billId", item.billId);
window.sessionStorage.setItem("curTabName", item.name || item.signalTitle);
const route = router.resolve("/billLayout?billId=" + item.billId);
window.open(route.href, "_blank");
window.sessionStorage.setItem("billId", item.billId);
window.sessionStorage.setItem("curTabName", item.name || item.signalTitle);
const route = router.resolve("/billLayout?billId=" + item.billId);
window.open(route.href, "_blank");
};
const highlightedEventType = ref('')
const highLight = (title) => {
console.log(title)
// 如果再次点击同一个,取消高亮
if (highlightedEventType.value === title) {
highlightedEventType.value = null;
} else {
highlightedEventType.value = title;
}
const highlightedEventType = ref("");
const highLight = title => {
console.log(title);
// 如果再次点击同一个,取消高亮
if (highlightedEventType.value === title) {
highlightedEventType.value = null;
} else {
highlightedEventType.value = title;
}
};
onMounted(() => {
// 这里可以添加从后端获取数据的代码
handlegetBillRiskSignal();
console.log("页面加载完成,可以获取数据了");
// 这里可以添加从后端获取数据的代码
handlegetBillRiskSignal();
console.log("页面加载完成,可以获取数据了");
});
</script>
<style lang="scss" scoped>
.content-wrapper {
width: 100%;
height: 100%;
.policy-monitoring {
font-family: Arial, sans-serif;
}
.header {
display: flex;
justify-content: space-around;
margin-bottom: 20px;
}
.content {
/* 容器 83 */
width: 1601px;
height: 495px;
box-sizing: border-box;
border: 1px solid rgba(255, 255, 255, 1);
border-radius: var(---10, 10px);
/* 业务系统/模块阴影 */
box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1);
background: rgba(255, 255, 255, 0.65);
.content-title {
/* 块级标题 */
width: 1602px;
height: 48px;
box-sizing: border-box;
border-bottom: 1px solid rgba(255, 255, 255, 1);
background: linear-gradient(180deg, rgba(255, 241, 240, 0.5), rgba(255, 241, 240, 0) 100%);
color: rgba(206, 79, 81, 1);
font-family: YouSheBiaoTiHei;
font-style: Regular;
font-size: 24px;
font-weight: 400;
line-height: 31px;
letter-spacing: 0px;
text-align: left;
display: flex;
img {
/* 矢量 347 */
width: 22px;
height: 18px;
}
.num {
/* 数据展示/Badge徽标数/亮色/数字 */
height: 22px;
/* 自动布局 */
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: flex-start;
gap: 10;
padding: 0px 8px 0px 8px;
border-radius: 100px;
background: rgba(206, 79, 81, 1);
color: rgba(255, 255, 255, 1);
margin: 12px;
font-family: Microsoft YaHei;
font-style: Regular;
font-size: 14px;
font-weight: 400;
line-height: 22px;
letter-spacing: 0px;
text-align: center;
}
}
}
.section {
/* 容器 535 */
width: 350px;
height: 320px;
box-sizing: border-box;
border: 1px solid rgba(255, 255, 255, 1);
border-radius: var(---10, 10px);
/* 业务系统/模块阴影 */
box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1);
background: rgba(255, 255, 255, 0.65);
}
.section-title {
margin: 8px 16px;
/* 容器 1559 */
width: 125px;
height: 31px;
}
.stats {
/* 容器 519 */
height: 210px;
display: flex;
justify-content: left;
margin-top: 10px;
padding: 0 39px;
.waveBall-text {
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-style: Bold;
font-size: 20px;
font-weight: 700;
line-height: 26px;
letter-spacing: 0px;
text-align: center;
}
}
.bottm-box {
/* 容器 1561 */
display: flex;
width: 350px;
height: 48px;
/* 自动布局 */
flex-direction: row;
justify-content: flex-start;
align-items: center;
// gap: 15;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-style: Regular;
font-size: 16px;
font-weight: 400;
line-height: 24px;
letter-spacing: 0px;
text-align: left;
img {
/* 矢量 1667 */
width: 12px;
height: 16px;
margin: 16px 20px;
}
}
.risk-signals {
width: 780px;
height: 330px;
overflow-y: auto;
overflow-x: hidden;
box-sizing: border-box;
padding-right: 20px;
.risk-signals-item {
margin-left: 23px;
height: 47px;
width: 780px;
display: flex;
cursor: pointer;
&:hover {
background: var(--color-bg-hover);
}
.itemLeftStatus1 {
color: rgba(245, 34, 45, 1) !important;
background: rgba(255, 241, 240) !important;
}
.itemLeftStatus2 {
color: rgba(250, 140, 22, 1) !important;
background: rgba(255, 247, 230, 1) !important;
}
.item-left {
margin-top: 4px;
margin-left: 2px;
width: 40px;
height: 40px;
border-radius: 20px;
color: rgba(82, 196, 26, 1);
background: rgba(246, 255, 237, 1);
font-family: Microsoft YaHei;
font-size: 12px;
font-weight: 400;
line-height: 14px;
box-sizing: border-box;
padding: 6px 4px;
text-align: center;
}
.item-right {
margin-left: 13px;
width: 722px;
height: 47px;
border-bottom: 1px solid rgba(240, 242, 244, 1);
display: flex;
.text {
width: 653px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 47px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.time {
width: 88px;
margin-left: 5px;
line-height: 47px;
color: rgba(132, 136, 142, 1);
font-family: Microsoft YaHei;
font-size: 14px;
font-weight: 400;
text-align: center;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
}
}
.news {
/* 容器 1567 */
width: 760px;
height: 491px;
/* 自动布局 */
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: flex-start;
gap: 16;
padding: 24px 48px 24px 48px;
box-sizing: border-box;
border: 1px solid rgba(234, 236, 238, 1);
border-radius: 10px;
background: rgba(255, 255, 255, 0.65);
position: relative;
.box1-left {
position: absolute;
left: 0;
top: 200px;
width: 24px;
height: 48px;
background: #e7f1ff;
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
z-index: 10;
.icon {
width: 11px;
height: 18px;
img {
width: 100%;
height: 100%;
}
}
}
.box1-right {
position: absolute;
right: 0;
top: 200px;
width: 24px;
height: 48px;
background: #e7f1ff;
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
z-index: 10;
.icon {
width: 11px;
height: 18px;
img {
width: 100%;
height: 100%;
}
}
}
.carousel-item {
height: 480px;
width: 736px;
.carousel-title {
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-style: Bold;
font-size: 20px;
font-weight: 700;
line-height: 26px;
letter-spacing: 0px;
text-align: justify;
.title-text {
/* 美国白宫发布关于进一步延长TikTok执法宽限期的行政令 */
width: 547px;
height: 26px;
}
.title-tag {
/* 容器 1563 */
width: 190px;
height: 30px;
/* 自动布局 */
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: flex-start;
gap: 10;
padding: 0px 12px 0px 12px;
border-radius: 20px;
background: rgba(206, 79, 81, 0.1);
color: rgba(206, 79, 81, 1);
font-family: Microsoft YaHei;
font-style: Regular;
font-size: 16px;
font-weight: 400;
line-height: 30px;
letter-spacing: 0px;
text-align: justify;
}
}
.carousel-content {
width: 664px;
color: rgba(95, 101, 108, 1);
font-family: Microsoft YaHei;
font-style: Regular;
font-size: 16px;
font-weight: 400;
line-height: 30px;
letter-spacing: 0px;
text-align: justify;
}
}
}
h3 {
margin-bottom: 10px;
}
ul {
list-style-type: none;
padding: 0;
}
li {
display: flex;
justify-content: space-between;
margin-bottom: 5px;
}
width: 100%;
height: 100%;
.policy-monitoring {
font-family: Arial, sans-serif;
}
.header {
display: flex;
justify-content: space-around;
margin-bottom: 20px;
}
.content {
/* 容器 83 */
width: 1601px;
height: 495px;
box-sizing: border-box;
border: 1px solid rgba(255, 255, 255, 1);
border-radius: var(---10, 10px);
/* 业务系统/模块阴影 */
box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1);
background: rgba(255, 255, 255, 0.65);
.content-title {
/* 块级标题 */
width: 1602px;
height: 48px;
box-sizing: border-box;
border-bottom: 1px solid rgba(255, 255, 255, 1);
background: linear-gradient(180deg, rgba(255, 241, 240, 0.5), rgba(255, 241, 240, 0) 100%);
color: rgba(206, 79, 81, 1);
font-family: YouSheBiaoTiHei;
font-style: Regular;
font-size: 24px;
font-weight: 400;
line-height: 31px;
letter-spacing: 0px;
text-align: left;
display: flex;
img {
/* 矢量 347 */
width: 22px;
height: 18px;
}
.num {
/* 数据展示/Badge徽标数/亮色/数字 */
height: 22px;
/* 自动布局 */
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: flex-start;
gap: 10;
padding: 0px 8px 0px 8px;
border-radius: 100px;
background: rgba(206, 79, 81, 1);
color: rgba(255, 255, 255, 1);
margin: 12px;
font-family: Microsoft YaHei;
font-style: Regular;
font-size: 14px;
font-weight: 400;
line-height: 22px;
letter-spacing: 0px;
text-align: center;
}
}
}
.section {
/* 容器 535 */
width: 350px;
height: 320px;
box-sizing: border-box;
border: 1px solid rgba(255, 255, 255, 1);
border-radius: var(---10, 10px);
/* 业务系统/模块阴影 */
box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1);
background: rgba(255, 255, 255, 0.65);
}
.section-title {
margin: 8px 16px;
/* 容器 1559 */
width: 125px;
height: 31px;
}
.stats {
/* 容器 519 */
height: 210px;
display: flex;
justify-content: left;
margin-top: 10px;
padding: 0 39px;
.waveBall-text {
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-style: Bold;
font-size: 20px;
font-weight: 700;
line-height: 26px;
letter-spacing: 0px;
text-align: center;
}
}
.bottm-box {
/* 容器 1561 */
display: flex;
width: 350px;
height: 48px;
/* 自动布局 */
flex-direction: row;
justify-content: flex-start;
align-items: center;
// gap: 15;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-style: Regular;
font-size: 16px;
font-weight: 400;
line-height: 24px;
letter-spacing: 0px;
text-align: left;
img {
/* 矢量 1667 */
width: 12px;
height: 16px;
margin: 16px 20px;
}
}
.risk-signals {
width: 780px;
height: 330px;
overflow-y: auto;
overflow-x: hidden;
box-sizing: border-box;
padding-right: 20px;
.risk-signals-item {
margin-left: 23px;
height: 47px;
width: 780px;
display: flex;
cursor: pointer;
&:hover {
background: var(--color-bg-hover);
}
.itemLeftStatus1 {
color: rgba(245, 34, 45, 1) !important;
background: rgba(255, 241, 240) !important;
}
.itemLeftStatus2 {
color: rgba(250, 140, 22, 1) !important;
background: rgba(255, 247, 230, 1) !important;
}
.item-left {
margin-top: 4px;
margin-left: 2px;
width: 40px;
height: 40px;
border-radius: 20px;
color: rgba(82, 196, 26, 1);
background: rgba(246, 255, 237, 1);
font-family: Microsoft YaHei;
font-size: 12px;
font-weight: 400;
line-height: 14px;
box-sizing: border-box;
padding: 6px 4px;
text-align: center;
}
.item-right {
margin-left: 13px;
width: 722px;
height: 47px;
border-bottom: 1px solid rgba(240, 242, 244, 1);
display: flex;
.text {
width: 653px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 47px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.time {
width: 88px;
margin-left: 5px;
line-height: 47px;
color: rgba(132, 136, 142, 1);
font-family: Microsoft YaHei;
font-size: 14px;
font-weight: 400;
text-align: center;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
}
}
.news {
/* 容器 1567 */
width: 760px;
height: 491px;
/* 自动布局 */
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: flex-start;
gap: 16;
padding: 24px 48px 24px 48px;
box-sizing: border-box;
border: 1px solid rgba(234, 236, 238, 1);
border-radius: 10px;
background: rgba(255, 255, 255, 0.65);
position: relative;
.box1-left {
position: absolute;
left: 0;
top: 200px;
width: 24px;
height: 48px;
background: #e7f1ff;
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
z-index: 10;
.icon {
width: 11px;
height: 18px;
img {
width: 100%;
height: 100%;
}
}
}
.box1-right {
position: absolute;
right: 0;
top: 200px;
width: 24px;
height: 48px;
background: #e7f1ff;
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
z-index: 10;
.icon {
width: 11px;
height: 18px;
img {
width: 100%;
height: 100%;
}
}
}
.carousel-item {
height: 480px;
width: 736px;
.carousel-title {
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-style: Bold;
font-size: 20px;
font-weight: 700;
line-height: 26px;
letter-spacing: 0px;
text-align: justify;
.title-text {
/* 美国白宫发布关于进一步延长TikTok执法宽限期的行政令 */
width: 547px;
height: 26px;
}
.title-tag {
/* 容器 1563 */
width: 190px;
height: 30px;
/* 自动布局 */
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: flex-start;
gap: 10;
padding: 0px 12px 0px 12px;
border-radius: 20px;
background: rgba(206, 79, 81, 0.1);
color: rgba(206, 79, 81, 1);
font-family: Microsoft YaHei;
font-style: Regular;
font-size: 16px;
font-weight: 400;
line-height: 30px;
letter-spacing: 0px;
text-align: justify;
}
}
.carousel-content {
width: 664px;
color: rgba(95, 101, 108, 1);
font-family: Microsoft YaHei;
font-style: Regular;
font-size: 16px;
font-weight: 400;
line-height: 30px;
letter-spacing: 0px;
text-align: justify;
}
}
}
h3 {
margin-bottom: 10px;
}
ul {
list-style-type: none;
padding: 0;
}
li {
display: flex;
justify-content: space-between;
margin-bottom: 5px;
}
}
</style>
......@@ -187,7 +187,7 @@
<div class="col-domain" style="color: rgb(59, 65, 75); font-weight: 700">所属领域</div>
<div class="col-date" style="color: rgb(59, 65, 75); font-weight: 700">制裁时间</div>
<div class="col-member" v-if="rankType !== 'school'" style="color: rgb(59, 65, 75); font-weight: 700">
关键人物
省份
</div>
</div>
<div class="table-list">
......@@ -210,7 +210,8 @@
</div>
</div>
<div class="col-date">{{ item.date }}</div>
<div class="col-member" v-if="rankType !== 'school'">{{ item.member }}</div>
<!-- <div class="col-member" v-if="rankType !== 'school'">{{ item.member }}</div> -->
<div class="col-member" v-if="rankType !== 'school'">{{ item.province }}</div>
</div>
</div>
</template>
......@@ -1108,6 +1109,7 @@ const handleGetDomainContainmentRanking = async () => {
// 处理返回的数据结构
const processedData = processRankingData(res.data);
rankList.value = processedData;
console.log("排行数据 =>", rankList.value);
}
} catch (error) {
console.error("获取美对华领域打压遏制排行失败:", error);
......
......@@ -89,7 +89,7 @@
<el-empty
v-if="box2DataList.length === 0"
style="padding-top: 80px"
description="暂无数据1"
description="暂无数据"
:image-size="100"
/>
<div
......
......@@ -45,28 +45,32 @@
</div>
<div class="tooltip-main">
<div class="tooltip-main-item" v-for="item, index in currentDetailList" :key="index">
<div class="item-header flex-display">
<div class="item-header-left flex-display">
<div class="logo">
<img style="width:100%; height: 100%" :src="item.orgLogoUrl" alt="logo">
</div>
<div class="name text-bold">{{ item.orgName }}</div>
<div class="status">
<div class="status-on text-tip-2" v-if="item.stauts === 2">{{ '已落实' }}</div>
<div class="status-off text-tip-2" v-else>{{ '未落实' }}</div>
</div>
</div>
<div class="item-header-right flex-display">
<AreaTag v-for="tag, idx in item.techDomainList.slice(0, 3)" :key="idx" :tagName="tag"></AreaTag>
</div>
</div>
<div class="item-content text-compact">{{ item.name }}</div>
<div class="item-footer color-bg-active flex-display" @click="handleToDetail(item)">
<div class="footer-text text-tip-2 main-color">{{ item.administrativeOrderInfoTitle }}</div>
<div class="footer-text text-tip-2 main-color">{{ item.name }}</div>
<div class="footer-arrow">
<img src="./right-arrow.svg" alt="">
</div>
</div>
<div class="item-list" v-for="val, idx in item.list" :key="idx">
<div class="item-header flex-display">
<div class="item-header-left flex-display">
<div class="logo">
<img style="width:100%; height: 100%" :src="val.orgLogoUrl" alt="logo">
</div>
<div class="name text-primary-80-clor text-bold">{{ val.orgName }}</div>
<div class="status">
<div class="status-on text-tip-2" v-if="val.stauts === 2">{{ '已落实' }}</div>
<div class="status-off text-tip-2" v-else>{{ '未落实' }}</div>
</div>
</div>
<div class="item-header-right flex-display">
<AreaTag v-for="tag, idxx in val.techDomainList.slice(0, 3)" :key="idxx" :tagName="tag"></AreaTag>
</div>
</div>
<div class="item-content text-compact">{{ val.name }}</div>
</div>
</div>
</div>
</el-dialog>
......@@ -282,7 +286,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} , 已落实 0 项}`:` {month|${month.format('M月')}} {stats| ${monthStats[index].total} , 已落实 0 项}`,
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: {
......@@ -447,7 +451,20 @@ onMounted(() => {
const list = params.data[1].raw
if (list.length > 0) {
currentDate.value = date
currentDetailList.value = list
// 按 administrativeOrderInfoTitle 分类
const grouped = [];
const map = new Map();
list.forEach(item => {
const key = item.administrativeOrderInfoTitle;
if (!map.has(key)) {
map.set(key, { name: key, list: [] });
grouped.push(map.get(key));
}
map.get(key).list.push(item);
});
currentDetailList.value = grouped;
console.log('currentDetailList', currentDetailList.value);
// 统计不同 orgName 的个数
const orgNames = new Set(list.map(item => item.orgName));
currentOrgNum.value = orgNames.size
......@@ -505,8 +522,9 @@ onBeforeUnmount(() => {
}
.tooltip-main-item {
padding: 10px 0;
width: 622px;
height: 144px;
/* height: 144px; */
border-bottom: 1px solid rgb(234, 236, 238);
}
......@@ -559,7 +577,7 @@ onBeforeUnmount(() => {
.item-footer {
width: 622px;
height: 30px;
height: 40px;
padding: 0 8px;
margin-top: 4px;
border-radius: 4px;
......
......@@ -195,7 +195,7 @@
<div class="bottom-item">
<div class="bottom-item-title">
<img :src="icon4" alt="" />
<span>美政府部门对华打压遏制历程</span>
<span>美政府部门对华工作日程表</span>
</div>
<div class="bottom-item-select">
<!-- <div class="select-btn" :class="{ active: measureType === 'history' }" @click="measureType = 'history'">
......
......@@ -119,6 +119,11 @@
placement="top"
:show-after="500"
>
<template #content>
<div class="item-tooltip">
{{ item.content }}
</div>
</template>
<div class="item-content">{{ item.content }}</div>
</el-tooltip>
<div class="item-bottom">
......@@ -133,11 +138,17 @@
</div>
</div>
</div>
<simple-pagination
v-model:current-page="warningCurrentPage"
:page-size="warningPageSize"
:total="allWarningList.length"
@page-change="handleWarningPageChange"
/>
</div>
<div class="warning">
<div class="warning-title">
<img src="./assets/warning.png" alt />
<span>新增排华联盟预警</span>
<span>新增排华联盟预警1</span>
</div>
<div class="warning-content">
<div class="content-item" v-for="(item, index) in warningList" :key="index">
......@@ -174,6 +185,12 @@
</div>
</div>
</div>
<simple-pagination
v-model:current-page="warningCurrentPage"
:page-size="warningPageSize"
:total="allWarningList.length"
@page-change="handleWarningPageChange"
/>
</div>
</div>
......@@ -185,13 +202,25 @@
<span>排华联盟领域分布</span>
</div>
<div class="left-content" ref="leftChartRef"></div>
<!-- <div style="padding-left: 15px; padding-right: 15px">
<Echarts :option="leftChartOptions" ref="leftChartRef" height="430px" />
</div> -->
<div class="anti-area-datasource">
<el-image :src="tipsIcon" class="tips-icon"></el-image>
数据来源:美国各政府机构官网,数据时间:2025.22025.3
</div>
</div>
<div class="area-right">
<div class="right-title">
<img src="./assets/circle1.png" alt />
<span>排华联盟国家紧密度</span>
</div>
<div class="right-content" ref="rightChartRef"></div>
<!-- <div class="right-content" ref="rightChartRef"></div> -->
<Echarts :option="rightChartOptions" height="430px" />
<div class="anti-area-datasource">
<el-image :src="tipsIcon" class="tips-icon"></el-image>
数据来源:美国各政府机构官网,数据时间:2025.22025.3
</div>
</div>
</div>
</div>
......@@ -205,6 +234,10 @@ import { getAllUnionList, getDynamic, getPrediction, getUnionCount, getIndustry,
import defaultImg from "../../../../assets/images/default-icon2.png";
import mapJson from "./assets/world.json";
import { ElMessage } from "element-plus";
import SimplePagination from "@/components/SimplePagination.vue";
import tipsIcon from "./assets/icon-tips.png";
import Echarts from "@/components/Chart/index.vue";
import { link } from "d3";
const currentPage = ref(1);
const pageSize = ref(10);
......@@ -826,6 +859,10 @@ function fetchGeoJSON() {
const newsList = ref([]);
const warningList = ref([]);
const warningCurrentPage = ref(1);
const warningPageSize = ref(5);
const allWarningList = ref([]);
const handleWarningPageChange = (page, pageSize) => {};
const getContent = countries => {
if (countries) {
......@@ -846,8 +883,142 @@ const getContent = countries => {
};
const leftChartRef = ref(null);
const leftChartOptions = ref({
tooltip: { trigger: "item", formatter: ({ name, value, percent }) => `${name}<br/>${value}项 ${percent}%` },
series: [
{
type: "pie",
radius: [96, 120],
center: ["50%", "50%"],
avoidLabelOverlap: true,
itemStyle: { borderWidth: 0 },
label: {
show: true,
position: "outside",
alignTo: "edge", // 与官网保持一致
formatter: ({ name, value, percent }) => `{name|${name}} \n\n{value|${value}} {percent|${percent}%}`,
minMargin: 5,
edgeDistance: 10,
lineHeight: 18,
rich: {
name: {
fontSize: 16,
fontFamily: "Microsoft YaHei",
fontWeight: 700,
lineHeight: 24,
color: "rgb(59, 65, 75)"
},
value: {
fontSize: 14,
fontFamily: "Microsoft YaHei",
fontWeight: 400,
lineHeight: 22,
color: "rgb(95, 101, 108)"
},
percent: {
fontSize: 14,
fontFamily: "Microsoft YaHei",
fontWeight: 400,
lineHeight: 22,
color: "rgb(95, 101, 108)"
}
}
},
labelLine: {
show: true,
length: 30, // 与官网length逻辑对齐
length2: 20, // 与官网length2逻辑对齐
maxSurfaceAngle: 80
},
labelLayout: function (params) {
// 完全复刻官网逻辑,仅修改X轴,不碰Y轴
const chartWidth = leftChartRef.value?.getWidth() || params.rect.width;
const isLeft = params.labelRect.x < chartWidth / 2;
const points = params.labelLinePoints;
// 仅修改引导线端点X坐标(核心:保留默认Y轴居中)
points[2][0] = isLeft ? params.labelRect.x : params.labelRect.x + params.labelRect.width;
return {
labelLinePoints: points
};
},
data: []
}
]
});
let leftChart;
const rightChartRef = ref(null);
const rightChartOptions = ref({
title: {
// text: 'Basic Graph'
},
tooltip: {
trigger: "item", // 针对Graph的节点/边触发(必配,否则弹框不生效)
triggerOn: "click",
formatter: function (params) {
// params.data 是当前点击节点的完整数据对象
const { name, value } = params.data;
// 返回HTML字符串,自由拼接展示内容(支持换行、标签、样式)
return `
<div style="text-align: center;">
<span style="font-size:16px; font-weight: bold; margin-bottom:8px;">${name}</span>
<span>:${value || 0}</span>
</div>
`;
}
},
animationDurationUpdate: 1500,
animationEasingUpdate: "quinticInOut",
dataZoom: [
{
type: "slider",
start: 10,
end: 10
}
],
series: [
{
type: "graph",
layout: "circular",
circular: {
rotateLabel: true
},
symbolSize: 50,
roam: true,
label: {
show: true
// position: "outside"
},
edgeSymbol: ["circle", ""],
edgeSymbolSize: [4, 60],
edgeLabel: {
fontSize: 20,
show: true
},
data: [],
links: [],
lineStyle: {
opacity: 0.9,
width: 2,
curveness: 0.3
},
emphasis: {
focus: "adjacency",
lineStyle: {
width: 4
},
label: {
show: true,
position: "outside",
fontWeight: "bold",
fontSize: 16,
distance: 10
}
}
}
]
});
let rightChart;
// 联盟领域分布
......@@ -878,6 +1049,11 @@ const initLeftDonut = async () => {
console.error("获取限制领域分布情况接口失败:", error);
}
leftChartOptions.value.series[0].data = data.map((d, i) => ({
...d,
labelLine: { lineStyle: { color: getColor(colors, d.name), width: 1 } }
}));
const option = {
tooltip: { trigger: "item", formatter: ({ name, value, percent }) => `${name}<br/>${value}项 ${percent}%` },
series: [
......@@ -891,10 +1067,10 @@ const initLeftDonut = async () => {
show: true,
position: "outside",
alignTo: "edge",
formatter: ({ name, value, percent }) => `{name|${name}} {value|${value}} {percent|${percent}%}`,
formatter: ({ name, value, percent }) => `{name|${name}} \n{value|${value}} {percent|${percent}%}`,
minMargin: 5,
edgeDistance: 10,
lineHeight: 15,
edgeDistance: 20,
lineHeight: 28,
rich: {
name: {
fontSize: 16,
......@@ -929,7 +1105,7 @@ const initLeftDonut = async () => {
const isLeft = params.labelRect.x < leftChart.getWidth() / 2;
const points = params.labelLinePoints;
// 导航线终点在标签下方
const lineY = params.labelRect.y + params.labelRect.height;
const lineY = params.labelRect.y + params.labelRect.height / 2;
points[2][0] = isLeft ? params.labelRect.x : params.labelRect.x + params.labelRect.width;
points[2][1] = lineY;
points[1][1] = lineY;
......@@ -948,9 +1124,9 @@ const initLeftDonut = async () => {
};
const initRightDonut = async () => {
if (!rightChartRef.value) return;
if (rightChart) rightChart.dispose();
rightChart = echarts.init(rightChartRef.value);
// if (!rightChartRef.value) return;
// if (rightChart) rightChart.dispose();
// rightChart = echarts.init(rightChartRef.value);
let data = [];
let links = [];
......@@ -1030,77 +1206,10 @@ const initRightDonut = async () => {
console.error("获取限制领域分布情况接口失败:", error);
}
let option = {
title: {
// text: 'Basic Graph'
},
tooltip: {
trigger: "item", // 针对Graph的节点/边触发(必配,否则弹框不生效)
triggerOn: "click",
formatter: function (params) {
// params.data 是当前点击节点的完整数据对象
const { name, value } = params.data;
// 返回HTML字符串,自由拼接展示内容(支持换行、标签、样式)
return `
<div style="text-align: center;">
<span style="font-size:16px; font-weight: bold; margin-bottom:8px;">${name}</span>
<span>:${value || 0}</span>
</div>
`;
}
},
animationDurationUpdate: 1500,
animationEasingUpdate: "quinticInOut",
dataZoom: [
{
type: "slider",
start: 10,
end: 10
}
],
series: [
{
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: true
},
data: data,
// links: [],
links: links,
lineStyle: {
opacity: 0.9,
width: 2,
curveness: 0.3
},
emphasis: {
focus: "adjacency",
lineStyle: {
width: 4
},
label: {
show: true,
position: "outside",
fontWeight: "bold",
fontSize: 16,
distance: 10
}
}
}
]
};
rightChartOptions.value.series[0].links = links;
rightChartOptions.value.series[0].data = data;
console.log("关系紧密图数据 =>", rightChartOptions.value);
// const option = {
// center: ["40%", "25%"],
// backgroundColor: "transparent",
......@@ -1119,7 +1228,7 @@ const initRightDonut = async () => {
// }
// ]
// };
rightChart.setOption(option);
// rightChart.setOption(option);
};
const getColor = (colors, name) => {
......@@ -1765,13 +1874,13 @@ watch(activeDate, async () => {
.news-content {
width: 100%;
height: calc(100% - 48px);
padding: 4px 28px 10px 27px;
height: calc(100% - 100px);
padding: 4px 28px 5px 27px;
overflow-y: auto;
.item {
width: 100%;
height: 126px;
height: 118px;
padding: 16px 0px;
display: flex;
flex-direction: column;
......@@ -1806,6 +1915,10 @@ watch(activeDate, async () => {
}
}
.item-tooltip {
color: red;
}
.item-content {
margin-left: 28px;
width: calc(100% - 28px);
......@@ -1887,6 +2000,9 @@ watch(activeDate, async () => {
background: rgba(255, 255, 255, 0.65);
width: 793px;
height: 700px;
display: flex;
flex-direction: column;
justify-content: space-between;
.warning-title {
width: 100%;
......@@ -1920,14 +2036,15 @@ watch(activeDate, async () => {
height: calc(100% - 48px);
padding: 4px 28px 25px 27px;
overflow-y: auto;
margin-bottom: auto;
.content-item {
width: 100%;
height: auto;
padding: 12px 24px;
box-sizing: border-box;
border: 1px solid rgba(234, 236, 238, 1);
border-radius: 10px;
border-bottom: 1px solid rgba(234, 236, 238, 1);
// border-radius: 10px;
margin-bottom: 12px;
.item-title {
......@@ -1983,6 +2100,7 @@ watch(activeDate, async () => {
.item-content {
width: 100%;
margin-top: 14px;
display: none;
.content-list {
display: flex;
......@@ -2100,9 +2218,24 @@ watch(activeDate, async () => {
.left-content {
width: 100%;
height: calc(100% - 48px);
height: calc(100% - 92px);
padding: 33px 48px 59px 50px;
}
.anti-area-datasource {
text-align: center;
font-family: Source Han Sans CN;
font-size: 14px;
font-weight: 400;
display: flex;
align-items: center;
justify-content: center;
gap: 5px;
.tips-icon {
margin-top: 2px;
width: 16px;
height: 16px;
}
}
}
.area-right {
......@@ -2143,9 +2276,24 @@ watch(activeDate, async () => {
.right-content {
width: 100%;
height: 450px;
height: 430px;
// padding: 33px 48px 59px 50px;
}
.anti-area-datasource {
text-align: center;
font-family: Source Han Sans CN;
font-size: 14px;
font-weight: 400;
display: flex;
align-items: center;
justify-content: center;
gap: 5px;
.tips-icon {
margin-top: 2px;
width: 16px;
height: 16px;
}
}
}
}
}
......
......@@ -49,7 +49,21 @@
</div>
</div>
<div style="width: 100%; height: 620px; padding-top: 24px" id="char"></div>
<div v-if="activeButtonId == 2" style="width: 100%; height: 520px; padding-top: 24px" id="char"></div>
<!-- <Echarts v-if="activeButtonId == 2" :option="lineOption" height="520px" /> -->
<div v-else>
<div class="content-line-chart-header">
<el-radio-group v-model="selectedIndicator" @change="handleIndicatorChange" size="default">
<el-radio
v-for="option in indicatorOptions"
:key="option.value"
:label="option.label"
:value="option.value"
/>
</el-radio-group>
</div>
<Echarts :option="lineOption" height="520px" />
</div>
</div>
<div style="width: 778px; height: 620px; overflow: auto">
<el-table
......@@ -128,7 +142,8 @@
<div class="card-box" style="margin-top: 16px" @mouseenter="stopAutoPlay" @mouseleave="startAutoPlay(true)">
<div class="card-title">
<img class="icon" src="../../assets/icons/title-icon2.png" />
<img class="text" src="../../assets/icons/title-text2.svg" />
<!-- <img class="text" src="../../assets/icons/title-text2.svg" /> -->
<span class="text-new">中美科技博弈历程</span>
</div>
<div class="card-main">
<!-- <Timeline :data="course" text-key="title" id-key="seq" /> -->
......@@ -218,6 +233,8 @@ import { ArrowRight, CaretBottom } from "@element-plus/icons-vue";
import Timeline from "./Timeline.vue";
import tableShow from "./tableShow.vue";
import ButtonList from "@/components/buttonList/buttonList.vue";
import Echarts from "@/components/Chart/index.vue";
import mockData from "./mock.json";
import radarChart from "./radarChart3.js";
import { getCompare, getChartDict, getTechnologyGameAnalysis } from "@/api/zmOverview/risk/index.js";
......@@ -242,8 +259,8 @@ import { ElMessage } from "element-plus";
const buttonList = ref([
{
id: 1,
text: "趋势变化",
disabled: true
text: "趋势变化"
// disabled: true
},
{
id: 2,
......@@ -253,6 +270,9 @@ const buttonList = ref([
const activeButtonId = ref(buttonList.value[1]?.id || 1);
const setActiveButtonId = id => {
activeButtonId.value = id;
if (id == 2) {
handleGetCompare();
}
};
const course = ref([
......@@ -390,6 +410,197 @@ onMounted(async () => {
// // setChart(option, "char7");
startAutoPlay();
processIndicatorOptions();
});
const chartColors = [
"rgba(8, 151, 156, 1)",
"#FF4D4F",
"#FF9900",
"#00CC99",
"#73c0de",
"#3ba272",
"#fc8452",
"#9a60b4",
"#ea7ccc"
];
// const series = {
// name: key,
// type: "line",
// symbolSize: 15,
// // stack: "Total",
// itemStyle: {
// color: chartColors[Math.floor(Math.random() * chartColors.length)]
// },
// data: []
// };
const indicatorOptions = ref([]);
const selectedIndicator = ref("");
// 整理指标选项
const processIndicatorOptions = () => {
const chinaData = mockData["中国"];
if (!chinaData) return;
indicatorOptions.value = Object.keys(chinaData).map(key => ({
label: key,
value: key
}));
if (indicatorOptions.value.length > 0) {
selectedIndicator.value = indicatorOptions.value[0].value;
handleIndicatorChange(selectedIndicator.value);
}
};
// 处理指标变化
const handleIndicatorChange = indicator => {
const chinaData = mockData["中国"]?.[indicator] || [];
const usaData = mockData["美国"]?.[indicator] || [];
const years = chinaData.map(item => item.year.toString());
const chinaValues = chinaData.map(item => item.value);
const usaValues = usaData.map(item => item.value);
lineOption.value.xAxis.data = years;
lineOption.value.series = [
{
name: "中国",
type: "line",
symbolSize: 10,
itemStyle: {
color: "#CE4F51"
},
areaStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "rgb(206, 79, 81, .8)"
},
{
offset: 1,
color: "rgb(206, 79, 81, .3)"
}
])
},
data: chinaValues
},
{
name: "美国",
type: "line",
symbolSize: 10,
itemStyle: {
color: "#055FC2"
},
areaStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "rgb(5, 95, 194,.8)"
},
{
offset: 1,
color: "rgb(5, 95, 194, .3)"
}
])
},
data: usaValues
}
];
};
const lineOption = ref({
title: {
text: ""
},
tooltip: {
trigger: "axis",
confine: true,
backgroundColor: "rgba(50, 50, 50, 0.7)",
borderColor: "#333",
borderWidth: 0,
padding: [5, 10],
textStyle: {
color: "#fff",
fontSize: 16
}
},
legend: {
show: false
},
grid: {
top: "5%",
left: "3%",
right: "4%",
bottom: "2%",
containLabel: true
},
xAxis: {
type: "category",
boundaryGap: false,
axisLine: {
lineStyle: {
color: "#ccc",
width: 1
}
},
axisTick: {
show: true,
lineStyle: {
color: "#ccc"
}
},
axisLabel: {
color: "#ccc",
fontSize: 16,
fontWeight: 400
},
data: ["2021", "2022", "2023", "2024", "2025"]
},
yAxis: {
type: "value",
// name: "指数",
nameLocation: "top",
nameGap: 35,
nameTextStyle: {
color: "#666",
fontSize: 13,
fontWeight: 600,
padding: [0, 0, 10, 0]
},
axisLine: {
show: false,
lineStyle: {
color: "#ccc",
width: 1
}
},
axisTick: {
show: false,
lineStyle: {
color: "#ccc"
}
},
axisLabel: {
color: "#ccc",
fontSize: 14,
fontWeight: 400,
formatter: value => {
return value.toFixed(0);
}
},
splitLine: {
lineStyle: {
width: 1,
type: "dashed",
color: "rgba(12, 78, 125, .3)"
}
},
splitNumber: 8
},
series: []
});
const tableData = ref([
......@@ -562,7 +773,7 @@ const handleClickBottomBtn = () => {
<style lang="scss" scoped>
.content-wrapper {
width: 1600px;
height: 1600px;
height: 1450px;
margin: 0 auto;
.card-box {
......@@ -585,6 +796,7 @@ const handleClickBottomBtn = () => {
// width: 100%;
height: 48px;
display: flex;
align-items: center;
.icon {
/* 合并 */
......@@ -599,6 +811,13 @@ const handleClickBottomBtn = () => {
height: 31px;
margin: 8px 0px;
}
.text-new {
font-family: YouSheBiaoTiHei;
font-size: 24px;
font-weight: 400;
line-height: 24px;
color: rgb(5, 95, 194);
}
}
.content-chart-header {
......@@ -608,6 +827,10 @@ const handleClickBottomBtn = () => {
// line-height: 32px;
align-items: center;
}
.content-line-chart-header {
margin-top: 15px;
margin-left: 48px;
}
.card-main {
height: 650px;
......@@ -1022,7 +1245,8 @@ const handleClickBottomBtn = () => {
width: 100%;
height: auto;
/* 高度自适应内容 */
display: flex;
// display: flex;
display: none;
flex-direction: row;
/* 行方向布局 */
flex-wrap: wrap;
......
{
"中国": {
"企业研发人才占比": [
{
"year": 2021,
"value": 79.8
},
{
"year": 2022,
"value": 80.1
},
{
"year": 2023,
"value": 82.7
},
{
"year": 2024,
"value": 81.3
},
{
"year": 2025,
"value": 82.1
}
],
"公共研发支出占比": [
{
"year": 2021,
"value": 72.6
},
{
"year": 2022,
"value": 72.6
},
{
"year": 2023,
"value": 73.7
},
{
"year": 2024,
"value": 72.7
},
{
"year": 2025,
"value": 73.5
}
],
"创新关联": [
{
"year": 2021,
"value": 78.2
},
{
"year": 2022,
"value": 78.1
},
{
"year": 2023,
"value": 77.0
},
{
"year": 2024,
"value": 78.5
},
{
"year": 2025,
"value": 77.0
}
],
"国内产业分布": [
{
"year": 2021,
"value": 99.4
},
{
"year": 2022,
"value": 99.9
},
{
"year": 2023,
"value": 100.4
},
{
"year": 2024,
"value": 100.9
},
{
"year": 2025,
"value": 101.4
}
],
"知识与技术产出": [
{
"year": 2021,
"value": 63.6
},
{
"year": 2022,
"value": 64.3
},
{
"year": 2023,
"value": 64.5
},
{
"year": 2024,
"value": 63.4
},
{
"year": 2025,
"value": 62.9
}
],
"知识工作者": [
{
"year": 2021,
"value": 79.5
},
{
"year": 2022,
"value": 79.7
},
{
"year": 2023,
"value": 78.1
},
{
"year": 2024,
"value": 78.9
},
{
"year": 2025,
"value": 79.4
}
]
},
"美国": {
"企业研发人才占比": [
{
"year": 2021,
"value": 81.1
},
{
"year": 2022,
"value": 81.8
},
{
"year": 2023,
"value": 82.8
},
{
"year": 2024,
"value": 81.3
},
{
"year": 2025,
"value": 82.5
}
],
"公共研发支出占比": [
{
"year": 2021,
"value": 73.8
},
{
"year": 2022,
"value": 71.6
},
{
"year": 2023,
"value": 72.1
},
{
"year": 2024,
"value": 72.6
},
{
"year": 2025,
"value": 71.9
}
],
"创新关联": [
{
"year": 2021,
"value": 77.4
},
{
"year": 2022,
"value": 77.3
},
{
"year": 2023,
"value": 77.2
},
{
"year": 2024,
"value": 77.1
},
{
"year": 2025,
"value": 77.0
}
],
"国内产业分布": [
{
"year": 2021,
"value": 98.5
},
{
"year": 2022,
"value": 101.1
},
{
"year": 2023,
"value": 98.4
},
{
"year": 2024,
"value": 99.8
},
{
"year": 2025,
"value": 98.2
}
],
"知识与技术产出": [
{
"year": 2021,
"value": 64.5
},
{
"year": 2022,
"value": 63.4
},
{
"year": 2023,
"value": 63.7
},
{
"year": 2024,
"value": 63.4
},
{
"year": 2025,
"value": 62.7
}
],
"知识工作者": [
{
"year": 2021,
"value": 66.8
},
{
"year": 2022,
"value": 71.8
},
{
"year": 2023,
"value": 76.8
},
{
"year": 2024,
"value": 81.8
},
{
"year": 2025,
"value": 86.8
}
]
}
}
\ No newline at end of file
......@@ -142,11 +142,11 @@
</div>
<div class="carousel-footer">
<div class="footer-left">
<div class="type">{{ News.hotspotType +'——' }}</div>
<div class="type">{{ News.hotspotType + "——" }}</div>
<div class="text">{{ News.eventTitle }}</div>
</div>
<div class="footer-right">
<img src="@/assets/icons/arrow-right.png" alt="">
<img src="@/assets/icons/arrow-right.png" alt="" />
</div>
</div>
</div>
......@@ -290,8 +290,8 @@ const sections = ref([
count: 0,
change: "无新增",
unit: "次",
title: "230调查",
type: "230调查"
title: "232调查",
type: "232调查"
},
{
percent: 0, // 估算的百分比
......@@ -436,8 +436,8 @@ const handleGetLatestRiskUpdates = async () => {
count: res.data["232Survey"].total,
change: res.data["232Survey"].dailyIncrement,
unit: "次",
title: "230调查",
type: "230调查"
title: "232调查",
type: "232调查"
},
{
percent: 3, // 估算的百分比
......@@ -1221,8 +1221,7 @@ onUnmounted(() => {
// .text{
// color:var(--color-main-active);
// }
// }
// }
......
......@@ -17,7 +17,7 @@
</div>
<el-input placeholder="新对话" v-model="newChatTitle" style="width: 220px" />
</div>
<div class="left-main">
<!-- <div class="left-main">
<div class="left-main-title">{{ "历史对话" }}</div>
<div class="left-list">
<div class="left-list-item" :class="{ itemActive: currentChatId === item.id }"
......@@ -25,7 +25,7 @@
{{ item.title }}
</div>
</div>
</div>
</div> -->
</div>
<div class="right">
<div class="right-header">{{ curChatTitle }}</div>
......@@ -929,7 +929,7 @@ const sendMessage = async () => {
};
const newChatTitle = ref(""); // 新对话
const curChatTitle = ref("美国对中国制裁实体清单");
const curChatTitle = ref("新对话");
const currentChatId = ref(1);
const chatList = ref([
{
......
......@@ -13,7 +13,6 @@
</template>
<script setup>
defineProps({
title: {
type: String,
......@@ -44,7 +43,8 @@ defineProps({
<style scoped lang="scss">
.info-card {
max-width: 388px;
flex: 1;
// max-width: 388px;
min-width: 200px;
height: 150px;
border-radius: 12px;
......@@ -53,7 +53,9 @@ defineProps({
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
position: relative;
overflow: hidden;
transition: transform 0.3s ease, box-shadow 0.3s ease;
transition:
transform 0.3s ease,
box-shadow 0.3s ease;
cursor: pointer;
}
......
......@@ -274,14 +274,14 @@
<el-row :gutter="20" style="width: 1600px; margin: 0 auto; height: 528px; margin-top: 64px">
<CustomTitle id="position3" title="数据总览" />
<el-col :span="24">
<custom-container title="发布频度" :titleIcon="box3Icon" height="450px">
<custom-container title="发布频度" :titleIcon="box3Icon" height="400px">
<template #default>
<div class="box3">
<div class="box3-content">
<div class="box3-content-title">实体清单发布频度</div>
<el-table :data="tableData1" stripe style="width: 100%">
<el-table-column prop="year" label="年份" width="150" />
<el-table-column label="发布次数" width="200">
<el-table-column prop="year" label="年份" width="200" />
<el-table-column label="发布次数" width="300">
<template #default="scope">
<div style="display: flex; align-items: center">
<span style="margin-right: 10px; width: 40px">{{ scope.row.num }}</span>
......@@ -293,7 +293,7 @@
</div>
</template>
</el-table-column>
<el-table-column label="重点领域" width="280" align="center">
<el-table-column label="重点领域" width="220" align="center">
<template #default="scope">
<div
style="display: flex; justify-content: center; align-items: center; gap: 5px"
......@@ -309,8 +309,8 @@
<div class="box3-content">
<div class="box3-content-title">商业管制清单(CCL)更新频度</div>
<el-table :data="tableData2" stripe style="width: 100%">
<el-table-column prop="year" label="年份" width="150" />
<el-table-column label="发布次数" width="200">
<el-table-column prop="year" label="年份" width="200" />
<el-table-column label="发布次数" width="300">
<template #default="scope">
<div style="display: flex; align-items: center">
<span style="margin-right: 10px; width: 40px">{{ scope.row.num }}</span>
......@@ -322,7 +322,7 @@
</div>
</template>
</el-table-column>
<el-table-column label="重点领域" width="280" align="center">
<el-table-column label="重点领域" width="220" align="center">
<template #default="scope">
<div
style="display: flex; justify-content: center; align-items: center; gap: 5px"
......@@ -2117,12 +2117,20 @@ const handleMediaClick = item => {
justify-content: center;
// align-items: flex-start;
gap: 100px;
flex: 1;
.box3-content {
display: flex;
flex-direction: column;
// gap: 20px;
flex: 1;
}
.box3-content-title {
font-size: 18px;
font-weight: 700;
font-family: Microsoft YaHei;
width: 640px;
// width: 640px;
width: 100%;
height: 36px;
display: flex;
align-items: center;
......@@ -2145,7 +2153,7 @@ const handleMediaClick = item => {
overflow: auto;
display: flex;
flex-direction: column;
justify-content: space-between;
// justify-content: space-between;
padding-top: 16px;
// padding-bottom: 50px;
position: relative;
......@@ -2379,7 +2387,8 @@ const handleMediaClick = item => {
.home-main-header-footer-link,
.home-main-header-footer-info {
width: 100%;
// width: 100%;
max-width: 1600px;
display: flex;
justify-content: center;
gap: 16px;
......
<template>
<div class="deep-mining" :class="{ deepMiningChartmode: isInChart }">
<div class="side-nav">
<div v-for="(item, index) in activeTab" :key="index" class="tab-item" :class="{ active: index === activeIndex }"
@click="activeIndex = index">
<div
v-for="(item, index) in activeTab"
:key="index"
class="tab-item"
:class="{ active: index === activeIndex }"
@click="activeIndex = index"
>
{{ item }}
<span v-if="index === activeIndex" class="arrow"></span>
</div>
......@@ -47,8 +52,13 @@
<span class="group-count">{{ group.count }}家</span>
</div>
<div class="group-children custom-scrollbar" v-show="group.expanded">
<div class="entity-item" v-for="item in group.children" :key="item.id"
:class="{ active: activeEntityId === item.id }" @click="selectEntity(item)">
<div
class="entity-item"
v-for="item in group.children"
:key="item.id"
:class="{ active: activeEntityId === item.id }"
@click="selectEntity(item)"
>
<div class="item-icon">
<img :src="defaultTitle" alt="" class="item-img" />
</div>
......@@ -63,12 +73,19 @@
<div class="right" @mouseenter="handleMouseEnter" @mouseleave="handleMouseLeave">
<div class="title-com custom-right-header">
<div class="toggle-group">
<div class="toggle-btn" :class="{ active: rightActiveTab === 'supplyChain' }"
@click="rightActiveTab = 'supplyChain'">
<div
class="toggle-btn"
:class="{ active: rightActiveTab === 'supplyChain' }"
@click="rightActiveTab = 'supplyChain'"
>
<img :src="rightActiveTab === 'supplyChain' ? icon01Active : icon01" alt="" />
<span>供应链</span>
</div>
<div class="toggle-btn" :class="{ active: rightActiveTab === 'equity' }" @click="rightActiveTab = 'equity'">
<div
class="toggle-btn"
:class="{ active: rightActiveTab === 'equity' }"
@click="rightActiveTab = 'equity'"
>
<img :src="rightActiveTab === 'equity' ? icon02Active : icon02" alt="" />
<span>股权</span>
</div>
......@@ -115,8 +132,8 @@ import {
getSingleSanctionEntitySupplyChain,
getSingleSanctionEntityEquity
} from "@/api/exportControlV2.0";
import RelationGraph from './components/RelationGraph.vue';
import AnalysisBox from '@/components/base/boxBackground/analysisBox.vue';
import RelationGraph from "./components/RelationGraph.vue";
import AnalysisBox from "@/components/base/boxBackground/analysisBox.vue";
const sanRecordId = ref("");
const activeTab = ref(["实体穿透分析"]);
......@@ -170,11 +187,11 @@ const handleMouseLeave = () => {
isInChart.value = false;
};
const handleNodeClick = (node) => {
const handleNodeClick = node => {
selectedNode.value = node;
};
const handleLayoutChange = (type) => {
const handleLayoutChange = type => {
controlActive.value = type;
if (type !== 2) {
isInChart.value = true;
......@@ -184,9 +201,8 @@ const handleLayoutChange = (type) => {
};
const updateGraphData = () => {
const data = rightActiveTab.value === 'supplyChain'
? singleSanctionEntitySupplyChainData.value
: singleSanctionEntityEquityData.value;
const data =
rightActiveTab.value === "supplyChain" ? singleSanctionEntitySupplyChainData.value : singleSanctionEntityEquityData.value;
if (!data) return;
......@@ -214,7 +230,7 @@ const updateGraphData = () => {
links.push({
source: `p-${item.id || index}`,
target: "0",
name: rightActiveTab.value === 'supplyChain' ? "供应商" : (item.type || "持股")
name: rightActiveTab.value === "supplyChain" ? "供应商" : item.type || "持股"
});
});
......@@ -231,14 +247,14 @@ const updateGraphData = () => {
links.push({
source: "0",
target: `c-${item.id || index}`,
name: rightActiveTab.value === 'supplyChain' ? "客户" : (item.type || "投资")
name: rightActiveTab.value === "supplyChain" ? "客户" : item.description || "投资"
});
});
graphData.value = { nodes, links };
};
const updateTreeData = (data) => {
const updateTreeData = data => {
if (!data) return;
treeData.value = {
......@@ -318,17 +334,17 @@ const getSingleSanctionEntityListRequest = async () => {
}
};
watch(rightActiveTab, async (newTab) => {
if (newTab === 'supplyChain') {
watch(rightActiveTab, async newTab => {
if (newTab === "supplyChain") {
await getSingleSanctionEntitySupplyChainRequest();
} else {
await getSingleSanctionEntityEquityRequest();
}
});
watch(activeEntityId, async (newId) => {
watch(activeEntityId, async newId => {
if (newId) {
if (rightActiveTab.value === 'supplyChain') {
if (rightActiveTab.value === "supplyChain") {
await getSingleSanctionEntitySupplyChainRequest();
} else {
await getSingleSanctionEntityEquityRequest();
......@@ -337,7 +353,7 @@ watch(activeEntityId, async (newId) => {
});
watch(is50PercentRule, async () => {
if (rightActiveTab.value === 'equity') {
if (rightActiveTab.value === "equity") {
await getSingleSanctionEntityEquityRequest();
}
});
......@@ -857,7 +873,6 @@ onMounted(async () => {
}
.title-com.custom-right-header {
.box,
.text {
display: none;
......
......@@ -12,8 +12,13 @@
<div class="home-top-bg"></div>
<div class="home-main-header">
<div class="home-main-header-center">
<SearchContainer style="margin-bottom: 0; height: fit-content" v-if="containerRef" placeholder="搜索投融资限制政策"
:containerRef="containerRef" areaName="" />
<SearchContainer
style="margin-bottom: 0; height: fit-content"
v-if="containerRef"
placeholder="搜索投融资限制政策"
:containerRef="containerRef"
areaName=""
/>
<!-- <el-input
v-model="searchKey"
style="width: 100%; height: 48px"
......@@ -110,9 +115,17 @@
</div>
<div class="box1-top-content-item">
<span class="box1-top-content-item-title">· 涉及领域:</span>
<div class="box1-top-content-item-tags" v-for="item in ['航空航天', '人工智能', '集成电路']" :key="item">
<el-tag :type="item === '航空航天' ? 'primary' : item === '人工智能' ? 'danger' : 'info'
">{{ item }}</el-tag>
<div
class="box1-top-content-item-tags"
v-for="item in ['航空航天', '人工智能', '集成电路']"
:key="item"
>
<el-tag
:type="
item === '航空航天' ? 'primary' : item === '人工智能' ? 'danger' : 'info'
"
>{{ item }}</el-tag
>
</div>
</div>
</div>
......@@ -170,8 +183,14 @@
</template>
</custom-container> -->
<RiskSignal :list="warningList" @item-click="handleToRiskSignalDetail" @more-click="handleToMoreRiskSignal"
riskLevel="status" postDate="time" name="title" />
<RiskSignal
:list="warningList"
@item-click="handleToRiskSignalDetail"
@more-click="handleToMoreRiskSignal"
riskLevel="status"
postDate="time"
name="title"
/>
</el-col>
</el-row>
<el-row :gutter="20" style="width: 1600px; margin: 0 auto">
......@@ -195,11 +214,22 @@
<div class="center-center">
<div class="center-center-news">
<NewsList :newsList="customNewsData" @item-click="handleNewsInfoClick" @more-click="handleToMoreNews"
from='from' content="description" title="title" img="image" />
<NewsList
:newsList="customNewsData"
@item-click="handleNewsInfoClick"
@more-click="handleToMoreNews"
from="from"
content="description"
title="title"
img="image"
/>
</div>
<MessageBubble :messageList="messageList" @person-click="handlePerClick" imageUrl="avatar"
@more-click="handleToSocialDetail" />
<MessageBubble
:messageList="messageList"
@person-click="handlePerClick"
imageUrl="avatar"
@more-click="handleToSocialDetail"
/>
<!-- <div class="boxs4">
<custom-container title="社交媒体" :titleIcon="dialogIcon" height="450px">
<template #default>
......@@ -225,7 +255,6 @@
</div> -->
</div>
<el-row :gutter="20" style="width: 1600px; margin: 0 auto">
<CustomTitle id="position3" title="数据总览" style="margin-top: 64px" />
<el-col :span="24">
......@@ -240,18 +269,27 @@
<template #default="scope">
<div style="display: flex; align-items: center">
<span style="margin-right: 10px; width: 40px">{{ scope.row.num }}</span>
<el-progress :percentage="scope.row.percent * 100" :show-text="false"
:status="getStatus(scope.row.percent)" />
<el-progress
:percentage="scope.row.percent * 100"
:show-text="false"
:status="getStatus(scope.row.percent)"
/>
</div>
</template>
</el-table-column>
<el-table-column label="重点领域" width="180">
<template #default="scope">
<div style="display: flex; align-items: center; gap: 5px">
<el-tag v-for="tag in scope.row.tags" :key="tag" :type="tag === '通信网络'
? 'primary'
: TAGTYPE[Math.floor(Math.random() * 5)]
">{{ tag }}</el-tag>
<el-tag
v-for="tag in scope.row.tags"
:key="tag"
:type="
tag === '通信网络'
? 'primary'
: TAGTYPE[Math.floor(Math.random() * 5)]
"
>{{ tag }}</el-tag
>
</div>
</template>
</el-table-column>
......@@ -265,18 +303,27 @@
<template #default="scope">
<div style="display: flex; align-items: center">
<span style="margin-right: 10px; width: 40px">{{ scope.row.num }}</span>
<el-progress :percentage="scope.row.percent * 100" :show-text="false"
:status="getStatus(scope.row.percent)" />
<el-progress
:percentage="scope.row.percent * 100"
:show-text="false"
:status="getStatus(scope.row.percent)"
/>
</div>
</template>
</el-table-column>
<el-table-column label="重点领域" width="180">
<template #default="scope">
<div style="display: flex; align-items: center; gap: 5px">
<el-tag v-for="tag in scope.row.tags" :key="tag" :type="tag === '通信网络'
? 'primary'
: TAGTYPE[Math.floor(Math.random() * 5)]
">{{ tag }}</el-tag>
<el-tag
v-for="tag in scope.row.tags"
:key="tag"
:type="
tag === '通信网络'
? 'primary'
: TAGTYPE[Math.floor(Math.random() * 5)]
"
>{{ tag }}</el-tag
>
</div>
</template>
</el-table-column>
......@@ -290,18 +337,27 @@
<template #default="scope">
<div style="display: flex; align-items: center">
<span style="margin-right: 10px; width: 40px">{{ scope.row.num }}</span>
<el-progress :percentage="scope.row.percent * 100" :show-text="false"
:status="getStatus(scope.row.percent)" />
<el-progress
:percentage="scope.row.percent * 100"
:show-text="false"
:status="getStatus(scope.row.percent)"
/>
</div>
</template>
</el-table-column>
<el-table-column label="重点领域" width="180">
<template #default="scope">
<div style="display: flex; align-items: center; gap: 5px">
<el-tag v-for="tag in scope.row.tags" :key="tag" :type="tag === '通信网络'
? 'primary'
: TAGTYPE[Math.floor(Math.random() * 5)]
">{{ tag }}</el-tag>
<el-tag
v-for="tag in scope.row.tags"
:key="tag"
:type="
tag === '通信网络'
? 'primary'
: TAGTYPE[Math.floor(Math.random() * 5)]
"
>{{ tag }}</el-tag
>
</div>
</template>
</el-table-column>
......@@ -358,7 +414,8 @@
</div>
</div>
<div class="box4-footer">
<el-button type="primary" link :icon="DownRight">查看更多
<el-button type="primary" link :icon="DownRight"
>查看更多
<el-icon>
<DArrowRight />
</el-icon>
......@@ -375,8 +432,15 @@
</template>
<template #default>
<div class="box5">
<el-table :data="paginatedData" class="sanction-table" stripe empty-text="暂无数据" height="700px"
header-row-class-name="table-header" row-class-name="table-row">
<el-table
:data="paginatedData"
class="sanction-table"
stripe
empty-text="暂无数据"
height="700px"
header-row-class-name="table-header"
row-class-name="table-row"
>
<!-- <el-table-column prop="index" label="序号" width="80" align="center">
<template #default="scope">
{{ scope.$index + 1 + (currentPage - 1) * pageSize }}
......@@ -385,12 +449,14 @@
<el-table-column prop="name" label="实体名称" min-width="200">
<template #default="scope">
<div style="
<div
style="
font-weight: 700;
font-size: 16px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
">
"
>
{{ scope.row.name }}
</div>
</template>
......@@ -399,8 +465,12 @@
<el-table-column prop="domains" label="涉及领域" min-width="180">
<template #default="scope">
<div class="domain-tags">
<el-tag v-for="tag in scope.row.domains" :key="tag"
:type="tag === '通信网络' ? 'primary' : 'danger'">{{ tag }}</el-tag>
<el-tag
v-for="tag in scope.row.domains"
:key="tag"
:type="tag === '通信网络' ? 'primary' : 'danger'"
>{{ tag }}</el-tag
>
</div>
</template>
</el-table-column>
......@@ -436,7 +506,9 @@
<el-table-column prop="revenue" label="50%规则子企业" width="140" align="right">
<template #default="scope">
<span :class="['revenue-cell', scope.row.revenue === '无营收数据' ? 'no-revenue' : '']">
<span
:class="['revenue-cell', scope.row.revenue === '无营收数据' ? 'no-revenue' : '']"
>
{{ scope.row.revenue }}
</span>
</template>
......@@ -447,8 +519,14 @@
<!-- <div class="pagination-info">
第{{ currentPage }}页,共{{ totalPages }}页
</div> -->
<el-pagination v-model:current-page="currentPage" :page-size="pageSize" :total="total"
:pager-count="5" layout="prev, pager, next" background />
<el-pagination
v-model:current-page="currentPage"
:page-size="pageSize"
:total="total"
:pager-count="5"
layout="prev, pager, next"
background
/>
</div>
</div>
</template>
......@@ -531,7 +609,8 @@ const messageList = ref([
name: "唐纳德·特朗普",
time: "2025-05-12 16:02:37",
source: "真实社交",
content: "埃隆·马斯克在强力支持我竞选总统之前,早就知道我强烈反对‘电动汽车强制令’。这太荒谬了,这一直是我竞选活动的主要部分。电动汽车没问题,但不应该强迫每个人都拥有一辆。埃隆获得的补贴可能远远超过历史上任何一个人。如果没有补贴,埃隆可能不得不关门大吉,回到南非老家。"
content:
"埃隆·马斯克在强力支持我竞选总统之前,早就知道我强烈反对‘电动汽车强制令’。这太荒谬了,这一直是我竞选活动的主要部分。电动汽车没问题,但不应该强迫每个人都拥有一辆。埃隆获得的补贴可能远远超过历史上任何一个人。如果没有补贴,埃隆可能不得不关门大吉,回到南非老家。"
},
{
avatar: elongAvatar,
......@@ -1218,7 +1297,7 @@ const handleGetHylyList = async () => {
hylymc: "全部分类"
};
categoryList.value = [obj, ...categoryList.value];
} catch (error) { }
} catch (error) {}
};
const chart1Data = ref({
......@@ -1264,7 +1343,7 @@ const handleGetBillsByType = async () => {
img: bill1
};
});
} catch (error) { }
} catch (error) {}
};
// 查看社交媒体详情
const handleToSocialDetail = item => {
......@@ -1805,7 +1884,9 @@ onMounted(async () => {
box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1);
background: rgba(255, 255, 255, 0.65);
position: relative;
transition: transform 0.3s ease, box-shadow 0.3s ease;
transition:
transform 0.3s ease,
box-shadow 0.3s ease;
cursor: pointer;
&:hover {
......
......@@ -39,7 +39,7 @@
<div class="box2-main">
<div class="box2-content" id="box2Chart"></div>
</div> -->
<AnalysisBox title="涉及科技领域" :showAllBtn="false">
<AnalysisBox title="关键词云" :showAllBtn="false">
<div class="box2-main">
<div class="box2-content" id="box2Chart"></div>
</div>
......@@ -58,8 +58,12 @@
<div class="center">
<div class="title">{{ item.content }}</div>
<div>
<img src="../images/image-open.png" alt="" class="center-image"
@click="handleOpenReportOriginal(item)">
<img
src="../images/image-open.png"
alt=""
class="center-image"
@click="handleOpenReportOriginal(item)"
/>
</div>
<!-- <div class="desc">{{ item.econtent }}</div> -->
</div>
......@@ -80,12 +84,17 @@
<div class="box3-main-footer">
<div class="info">{{ total }}条核心论点</div>
<div class="page-box">
<el-pagination :page-size="10" 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>
</AnalysisBox>
</div>
</div>
......@@ -102,9 +111,10 @@ import {
getThinkTankReportIndustry,
getThinkTankReportIndustryCloud
} from "@/api/thinkTank/overview";
import { getChartAnalysis } from '@/api/aiAnalysis/index'
import { getChartAnalysis } from "@/api/aiAnalysis/index";
import { useRouter } from "vue-router";
const router = useRouter();
import "echarts-wordcloud";
// 内容摘要
const box1Data =
......@@ -170,7 +180,7 @@ const box2Data = ref([
const handleGetThinkTankReportIndustryCloud = async () => {
try {
const params = {
id: router.currentRoute._value.params.id,
id: router.currentRoute._value.params.id
// industryId: activeArea.value
};
const res = await getThinkTankReportIndustryCloud(params);
......@@ -252,11 +262,11 @@ const tabActiveName = ref("报告分析");
const switchTab = name => {
tabActiveName.value = name;
}
};
// 处理页码改变事件
const currentPage = ref(1);
const pageSize = ref(10);
const total = ref(0)
const total = ref(0);
const handleCurrentChange = page => {
currentPage.value = page;
handleGetThinkTankReportContent();
......@@ -267,14 +277,14 @@ const handleGetThinkTankReportContent = async () => {
const params = {
id: router.currentRoute._value.params.id,
currentPage: currentPage.value - 1,
pageSize: pageSize.value,
pageSize: pageSize.value
};
const res = await getThinkTankReportContent(params);
console.log("主要观点", res.data);
if (res.code === 200 && res.data) {
majorOpinions.value = res.data.content || [];
handleGetBox3AnalysisContent(majorOpinions.value)
total.value = res.data.totalElements || 0
handleGetBox3AnalysisContent(majorOpinions.value);
total.value = res.data.totalElements || 0;
}
} catch (error) {
console.error("获取主要观点error", error);
......@@ -282,15 +292,14 @@ const handleGetThinkTankReportContent = async () => {
};
// 获取图表分析内容
const box3AnalysisContent = ref('')
const handleGetBox3AnalysisContent = async (textJson) => {
const box3AnalysisContent = ref("");
const handleGetBox3AnalysisContent = async textJson => {
const params = {
text: textJson
}
const res = await getChartAnalysis(params)
console.log('图表解析内容', res);
}
};
const res = await getChartAnalysis(params);
console.log("图表解析内容", res);
};
onMounted(() => {
handleGetThinkTankReportAbstract();
......@@ -576,12 +585,9 @@ onMounted(() => {
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.center-image {
width: 16px;
height: 24px;
margin-top: 12px;
......@@ -719,4 +725,4 @@ onMounted(() => {
}
}
}
</style>
\ No newline at end of file
</style>
......@@ -10,8 +10,13 @@
<!-- <div class="box-header-right">{{ "查看数据源 >" }}</div> -->
<div class="select-box">
<el-select v-model="box1SelectYear" placeholder="选择时间" style="width: 100px">
<el-option v-for="(item, index) in box1YearList" :key="index" :label="item.label + '年'"
:value="item.value" @click="handleGetThinkPolicyIndustry()" />
<el-option
v-for="(item, index) in box1YearList"
:key="index"
:label="item.label + '年'"
:value="item.value"
@click="handleGetThinkPolicyIndustry()"
/>
</el-select>
</div>
</div>
......@@ -28,8 +33,13 @@
<!-- <div class="box-header-right">{{ "查看数据源 >" }}</div> -->
<div class="select-box">
<el-select v-model="box1SelectYear" placeholder="选择时间" style="width: 100px">
<el-option v-for="(item, index) in box1YearList" :key="index" :label="item.label + '年'"
:value="item.value" @click="handleGetThinkPolicyIndustry()" />
<el-option
v-for="(item, index) in box1YearList"
:key="index"
:label="item.label + '年'"
:value="item.value"
@click="handleGetThinkPolicyIndustry()"
/>
</el-select>
</div>
</div>
......@@ -73,8 +83,13 @@
<!-- <div class="box-header-right">{{ "查看数据源 >" }}</div> -->
<div class="select-box">
<el-select v-model="box3SelectMonths" placeholder="选择时间" style="width: 100px">
<el-option v-for="item in box3MonthsList" :key="item.value" :label="item.label + '年'" :value="item.value"
@click="handleGetThinkPolicyIndustryChange()" />
<el-option
v-for="item in box3MonthsList"
:key="item.value"
:label="item.label + '年'"
:value="item.value"
@click="handleGetThinkPolicyIndustryChange()"
/>
</el-select>
</div>
</div>
......@@ -96,8 +111,14 @@
<el-select v-model="selectedYear" placeholder="选择时间" style="width: 120px" @click="handleGetThinkPolicy()">
<el-option v-for="item in yearList" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
<el-select class="select-box-sort" v-model="sort" placeholder="倒序" style="width: 120px;" :teleported="true"
:placement="'bottom-start'" :popper-options="{
<el-select
class="select-box-sort"
v-model="sort"
placeholder="倒序"
style="width: 120px"
:teleported="true"
:placement="'bottom-start'"
:popper-options="{
modifiers: [
{
name: 'preventOverflow',
......@@ -108,7 +129,8 @@
enabled: false
}
]
}">
}"
>
<template #prefix>
<img v-if="!sort" src="../thinkDynamics/images/image down.png" class="select-prefix-img" alt="" />
<img v-else src="../thinkDynamics/images/image up.png" class="select-prefix-img" alt="" />
......@@ -132,8 +154,13 @@
{{ item }}
</el-checkbox> -->
<el-checkbox class="filter-checkbox" label="全部领域"></el-checkbox>
<el-checkbox class="filter-checkbox" v-for="research in areaList" :key="research.id"
v-model="selectedAreaList" :label="research.id">
<el-checkbox
class="filter-checkbox"
v-for="research in areaList"
:key="research.id"
v-model="selectedAreaList"
:label="research.id"
>
{{ research.name }}
</el-checkbox>
</div>
......@@ -151,8 +178,13 @@
{{ item }}
</el-checkbox> -->
<el-checkbox class="filter-checkbox" label="全部领域"></el-checkbox>
<el-checkbox class="filter-checkbox" v-for="year in selectableYears" :key="year"
v-model="selectedAreaList" :label="year">
<el-checkbox
class="filter-checkbox"
v-for="year in selectableYears"
:key="year"
v-model="selectedAreaList"
:label="year"
>
{{ year }}
</el-checkbox>
</div>
......@@ -171,7 +203,10 @@
<div class="info">
{{ item.times }} · {{ item.name }}
<div class="more" @click="toDetail(item)">
<img src="@/views/thinkTank/ThinkTankDetail/thinkDynamics/images/image open.png" alt="" />
<img
src="@/views/thinkTank/ThinkTankDetail/thinkDynamics/images/image open.png"
alt=""
/>
</div>
</div>
<div class="tag-box">
......@@ -194,17 +229,21 @@
</div>
</div>
</div>
<div>
</div>
<div></div>
</div>
</div>
</div>
<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>
......@@ -272,8 +311,8 @@ const box1Data = ref([
// color: "#D6E4FF"
// }
]);
const relationBillsList = ref([{ billName: "2025《人工智能安全与评估法案》" }])
const relationAdList = ref([{ adName: "2025《人工智能安全与评估法案》" }])
const relationBillsList = ref([{ billName: "2025《人工智能安全与评估法案》" }]);
const relationAdList = ref([{ adName: "2025《人工智能安全与评估法案》" }]);
const box1SelectYear = ref("2025");
const box1YearList = ref([
{
......@@ -318,50 +357,7 @@ const handleGetThinkPolicyIndustry = async () => {
};
// 相关政策领域分布
const box2Data = ref([
// {
// name: "集成电路",
// value: 2,
// total: 10,
// per: 20,
// color: "#CE4F51"
// },
// {
// name: "人工智能",
// value: 1,
// total: 6,
// per: 17,
// color: "#055FC2"
// },
// {
// name: "通信网络",
// value: 2,
// total: 7,
// per: 26,
// color: "#13A8A8"
// },
// {
// name: "量子科技",
// value: 1,
// total: 2,
// per: 50,
// color: "#722ED1"
// },
// {
// name: "生物科技",
// value: 3,
// total: 7,
// per: 43,
// color: "#FA8C16"
// },
// {
// name: "能源",
// value: 11,
// total: 20,
// per: 55,
// color: "#69B1FF"
// }
]);
const box2Data = ref([]);
const box2ColorList = ref(["#CE4F51", "#055FC2", "#13A8A8", "#722ED1", "#FA8C16", "#69B1FF"]);
const box2SelectYear = ref("2025");
const box2YearList = ref([
......@@ -564,7 +560,6 @@ const policyList = ref([
// }
// ]
// },
]);
//获取当前时间x年前的日期
......@@ -593,8 +588,8 @@ function getDateMonthsAgo(months) {
return `${year}-${month}-${day}`;
}
const toDetail = (item) => {
window.sessionStorage.setItem("curTabName", item.content)
const toDetail = item => {
window.sessionStorage.setItem("curTabName", item.content);
const route = router.resolve({
name: "ReportDetail",
params: {
......@@ -602,13 +597,13 @@ const toDetail = (item) => {
}
});
window.open(route.href, "_blank");
}
};
const total = ref(0);
const sort = ref(false);
const handleSwithSort = () => {
sort.value = !sort.value;
handleGetThinkPolicy()()
handleGetThinkPolicy()();
};
const currentPage = ref(1);
......@@ -626,7 +621,7 @@ const handleGetThinkPolicy = async () => {
sortFun: sort.value,
currentPage: currentPage.value,
pageSize: 10,
researchTypeIds: selectedAreaList.value.join(',')
researchTypeIds: selectedAreaList.value.join(",")
};
const res = await getThinkPolicy(parmas);
console.log("智库政策", res);
......@@ -635,7 +630,6 @@ const handleGetThinkPolicy = async () => {
...item,
relationBillsList: relationBillsList.value,
relationAdList: relationAdList.value
}));
total.value = res.data.totalElements;
}
......@@ -665,7 +659,6 @@ onMounted(() => {
width: 100%;
height: 100%;
.top {
height: 420px;
width: 1600px;
......@@ -744,8 +737,6 @@ onMounted(() => {
height: 32px;
}
:deep(.el-select-dropdown) {
left: 0 !important;
/* 强制下拉框左对齐选择框 */
......@@ -826,8 +817,6 @@ onMounted(() => {
#box3Chart {
height: 360px;
}
}
}
}
......@@ -850,7 +839,6 @@ onMounted(() => {
background: rgba(255, 255, 255, 1);
position: relative;
.icon {
width: 16px;
height: 16px;
......@@ -1058,7 +1046,6 @@ onMounted(() => {
margin-top: 24px;
margin-bottom: 24px;
.select-box-header {
display: flex;
......@@ -1204,7 +1191,6 @@ onMounted(() => {
width: 57px;
height: 77px;
img {
width: 100%;
height: 100%;
......@@ -1320,8 +1306,6 @@ onMounted(() => {
height: 100%;
}
}
}
}
}
......@@ -1329,13 +1313,11 @@ onMounted(() => {
}
.right-footer {
height: 86px;
display: flex;
justify-content: space-between;
margin-top: 17px;
.info {
margin-top: 29px;
margin-left: 39px;
......@@ -1366,22 +1348,4 @@ onMounted(() => {
height: 8px !important;
margin-right: 4px;
}
/* PolicyTracking 分页按钮样式:1px 描边 + 白底 + 6px 圆角 */
:deep(.right-footer .el-pagination.is-background .btn-prev),
:deep(.right-footer .el-pagination.is-background .btn-next),
:deep(.right-footer .el-pagination.is-background .el-pager li) {
border: 1px solid rgba(0, 0, 0, 0.15) !important;
background-color: rgba(255, 255, 255, 1) !important;
border-radius: 6px !important;
box-sizing: border-box;
}
// 选中状态的页码样式(描边+文字颜色改为指定蓝色)
:deep(.right-footer .el-pagination.is-background .el-pager li.is-active) {
border-color: rgba(22, 119, 255, 1) !important; // 选中后描边颜色
color: rgba(22, 119, 255, 1) !important; // 选中后页码文字颜色
background-color: rgba(255, 255, 255, 1) !important; // 保持白色背景
font-weight: 400;
}
</style>
\ No newline at end of file
</style>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论