Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
R
risk-monitor
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
蔡建
risk-monitor
Commits
6de917f9
提交
6de917f9
authored
1月 17, 2026
作者:
coderBryanFu
浏览文件
操作
浏览文件
下载
差异文件
update
上级
64e851b8
dff9b452
显示空白字符变更
内嵌
并排
正在显示
15 个修改的文件
包含
1777 行增加
和
190 行删除
+1777
-190
package-lock.json
package-lock.json
+2
-2
allGovernment.js
src/api/allGovernment.js
+68
-0
index.js
src/api/zmOverview/allDomains/index.js
+20
-19
index.js
src/api/zmOverview/risk/index.js
+69
-0
news.js
src/router/modules/news.js
+4
-6
index.vue
...ew/components/fourSuppress/components/addDomain/index.vue
+184
-4
mockdata.json
...omponents/fourSuppress/components/addDomain/mockdata.json
+204
-0
index.vue
...omponents/fourSuppress/components/allGovernment/index.vue
+498
-78
Timeline.vue
src/views/ZMOverView/components/gameProfile/Timeline.vue
+29
-9
index.vue
src/views/ZMOverView/components/gameProfile/index.vue
+91
-20
WaveBall.vue
src/views/ZMOverView/components/newRisk/WaveBall.vue
+3
-3
index.vue
src/views/ZMOverView/components/newRisk/index.vue
+165
-42
influencePanel1.vue
...ews/exportControl/analysis/components/influencePanel1.vue
+18
-1
overview.vue
src/views/exportControl/analysis/content/overview.vue
+2
-6
概览页全领域.md
概览页全领域.md
+420
-0
没有找到文件。
package-lock.json
浏览文件 @
6de917f9
{
{
"name"
:
"
think-tank
"
,
"name"
:
"
zm-system
"
,
"version"
:
"1.0.0"
,
"version"
:
"1.0.0"
,
"lockfileVersion"
:
3
,
"lockfileVersion"
:
3
,
"requires"
:
true
,
"requires"
:
true
,
"packages"
:
{
"packages"
:
{
""
:
{
""
:
{
"name"
:
"
think-tank
"
,
"name"
:
"
zm-system
"
,
"version"
:
"1.0.0"
,
"version"
:
"1.0.0"
,
"license"
:
"MIT"
,
"license"
:
"MIT"
,
"dependencies"
:
{
"dependencies"
:
{
...
...
src/api/allGovernment.js
0 → 100644
浏览文件 @
6de917f9
import
request
from
"@/api/request.js"
;
// 全政府-获取美国政府部门制裁数据
/**
* @header token
*/
export
function
getAllGovernmentList
()
{
return
request
({
method
:
'GET'
,
url
:
`/api/rivalryIndex/governmentSanctionsData`
})
}
// 全政府-获取美对华制裁措施数量趋势
/**
* @header token
* @param {Object} params
* @param {String} params.field // 领域
* @param {String} params.monthNum = 12 // 月份数
* @param {String} params.orgId // 机构ID
* @param {String} params.sanType // 制裁手段
*/
export
function
getUSChinaSanctionTrend
(
params
)
{
return
request
({
method
:
'GET'
,
url
:
`/api/rivalryIndex/sanctionsQuantitativeTrend`
,
params
})
}
// 全政府-美政府部门打压遏制最新动态
/**
* @header token
*/
export
function
getUSGovernmentLatestDynamic
()
{
return
request
({
method
:
'GET'
,
url
:
`/api/rivalryIndex/governmentSanctionsDynamics`
})
}
// 全政府-美政府部门联合制裁排行
/**
* @header token
*/
export
function
getUSGovernmentJointSanctionRank
()
{
return
request
({
method
:
'GET'
,
url
:
`/api/rivalryIndex/governmentJointSanctionsRanking`
})
}
// 全政府-美政府部门对我打压遏制时间线
/**
* @header token
* @param {Object} params
* @param {String} params.currentPage = 1 // 当前页
* @param {String} params.pageSize = 1000 // 每页数量
*/
export
function
getUSGovernmentSanctionHistory
(
params
)
{
return
request
({
method
:
'GET'
,
url
:
`/api/rivalryIndex/getSanctionProcess`
,
params
})
}
src/api/zmOverview/allDomains/index.js
浏览文件 @
6de917f9
...
@@ -4,36 +4,38 @@ import request from "@/api/request.js";
...
@@ -4,36 +4,38 @@ import request from "@/api/request.js";
// 全领域统计
// 全领域统计
export
function
getAllDomainCount
()
{
export
function
getAllDomainCount
()
{
return
request
({
return
request
({
method
:
'GET'
,
method
:
"GET"
,
url
:
`/api/rivalryIndexV2/AllDomainCount`
,
url
:
`/api/rivalryIndexV2/AllDomainCount`
})
});
}
}
// 美对华制裁措施数量趋势
// 美对华制裁措施数量趋势
export
function
getDomainContainmentTrend
()
{
export
function
getDomainContainmentTrend
(
byYOrM
=
"按月统计"
)
{
return
request
({
return
request
({
method
:
'GET'
,
method
:
"GET"
,
url
:
`/api/rivalryIndexV2/DomainContainmentTrend`
,
url
:
`/api/rivalryIndexV2/DomainContainmentTrend?byYOrM=
${
byYOrM
}
`
})
});
}
}
//
最新动态
//
中美科技博弈分析
export
function
getTechnologyGameAnalysis
()
{
export
function
getTechnologyGameAnalysis
(
domain
=
1
)
{
return
request
({
return
request
({
method
:
'GET'
,
method
:
"GET"
,
url
:
`/api/rivalryIndexV2/TechnologyGameAnalysis`
,
url
:
`/api/rivalryIndexV2/TechnologyGameAnalysis?domain=
${
domain
}
`
})
});
}
}
// 领域打压遏制排行
// 领域打压遏制排行
/**
/**
* @param {currentPage, pageSize}
* @param {currentPage, pageSize}
*/
*/
export
function
getDomainContainmentRanking
()
{
export
function
getDomainContainmentRanking
(
ContainmentOrg
=
"对我打压机构"
,
Domains
=
""
)
{
return
request
({
return
request
({
method
:
'GET'
,
method
:
"GET"
,
url
:
`/api/rivalryIndexV2/DomainContainmentRanking`
,
url
:
!!
Domains
})
?
`/api/rivalryIndexV2/DomainContainmentRanking?ContainmentOrg=
${
ContainmentOrg
}
&Domains=
${
Domains
}
`
:
`/api/rivalryIndexV2/DomainContainmentRanking?ContainmentOrg=
${
ContainmentOrg
}
`
});
}
}
// 领域打压遏制时间线
// 领域打压遏制时间线
...
@@ -42,9 +44,8 @@ export function getDomainContainmentRanking() {
...
@@ -42,9 +44,8 @@ export function getDomainContainmentRanking() {
*/
*/
export
function
getDomainContainmentTimeline
(
params
)
{
export
function
getDomainContainmentTimeline
(
params
)
{
return
request
({
return
request
({
method
:
'GET'
,
method
:
"GET"
,
url
:
`/api/rivalryIndexV2/DomainContainmentTimeline`
,
url
:
`/api/rivalryIndexV2/DomainContainmentTimeline`
,
params
params
})
});
}
}
src/api/zmOverview/risk/index.js
0 → 100644
浏览文件 @
6de917f9
import
request
from
"@/api/request.js"
;
// 中美博弈概览V2:最新风险动态统计
export
function
getLatestRiskUpdates
(
params
)
{
return
request
({
method
:
'GET'
,
url
:
`/api/rivalryIndexV2/LatestRiskUpdates`
,
params
:
params
})
}
// 中美博弈概览V2:最新风险信号
export
function
getLatestRisks
()
{
return
request
({
method
:
'GET'
,
url
:
`/api/rivalryIndexV2/LatestRisks`
,
})
}
// 中美博弈概览V2:美对华制裁措施数量趋势
export
function
geDomainContainmentTrend
(
params
)
{
return
request
({
method
:
'GET'
,
url
:
`/api/rivalryIndexV2/DomainContainmentTrend`
,
params
:
params
})
}
// 中美博弈概况:获取榜单字典
export
function
getChartDict
()
{
return
request
({
method
:
'GET'
,
url
:
`/api/union/summary/chartDict`
,
})
}
// 中美博弈概况:中美科技实力对比
export
function
getCompare
(
id
)
{
return
request
({
method
:
'GET'
,
url
:
`/api/union/summary/compare/
${
id
}
`
,
})
}
// 中美博弈分析
export
function
getTechnologyGameAnalysis
()
{
return
request
({
method
:
'GET'
,
url
:
`/api/rivalryIndexV2/TechnologyGameAnalysis`
,
})
}
//中美博弈概览V7:美国政府部门对华制裁最新动态
export
function
getGovernmentSanctionsDynamics
()
{
return
request
({
method
:
'GET'
,
url
:
`/api/rivalryIndex/governmentSanctionsDynamics`
,
})
}
\ No newline at end of file
src/router/modules/news.js
浏览文件 @
6de917f9
//新闻速览
//新闻速览
import
newsBrief
from
"@/views/newsBrief/index.vue"
import
newsBrief
from
"@/views/newsBrief/index.vue"
;
// 新闻事件分析
// 新闻事件分析
import
NewsAnalysis
from
"@/views/newsAnalysis/index.vue"
;
import
NewsAnalysis
from
"@/views/newsAnalysis/index.vue"
;
...
@@ -22,8 +22,7 @@ const newsRoutes = [
...
@@ -22,8 +22,7 @@ const newsRoutes = [
meta
:
{
meta
:
{
title
:
"新闻事件分析"
title
:
"新闻事件分析"
}
}
},
}
];
]
export
default
newsRoutes
export
default
newsRoutes
;
\ No newline at end of file
src/views/ZMOverView/components/fourSuppress/components/addDomain/index.vue
浏览文件 @
6de917f9
...
@@ -199,7 +199,7 @@
...
@@ -199,7 +199,7 @@
</
template
>
</
template
>
<
script
setup
>
<
script
setup
>
import
{
ref
,
computed
,
onMounted
}
from
"vue"
;
import
{
ref
,
computed
,
onMounted
,
watch
}
from
"vue"
;
import
setChart
from
"@/utils/setChart"
;
import
setChart
from
"@/utils/setChart"
;
import
getMultiLineChart
from
"./multiLineChart"
;
import
getMultiLineChart
from
"./multiLineChart"
;
import
leftBtn
from
"../../assets/left-btn.png"
;
import
leftBtn
from
"../../assets/left-btn.png"
;
...
@@ -289,6 +289,61 @@ const timelineList = ref([
...
@@ -289,6 +289,61 @@ const timelineList = ref([
}
}
]);
]);
// 处理时间线数据的方法
const
processTimelineData
=
rawData
=>
{
if
(
!
rawData
||
!
Array
.
isArray
(
rawData
)
||
rawData
.
length
===
0
)
{
return
[];
}
return
rawData
.
map
(
item
=>
{
// 将日期格式转换为 "YYYY年 M月" 格式
const
eventDate
=
item
.
eventDate
?
new
Date
(
item
.
eventDate
)
:
null
;
const
formattedDate
=
eventDate
?
`
${
eventDate
.
getFullYear
()}
年
${
eventDate
.
getMonth
()
+
1
}
月`
:
""
;
// 提取领域标签
const
tags
=
[];
if
(
item
.
eventDomainList
&&
Array
.
isArray
(
item
.
eventDomainList
))
{
item
.
eventDomainList
.
forEach
(
domain
=>
{
if
(
domain
.
domainName
)
{
tags
.
push
(
domain
.
domainName
);
}
});
}
return
{
date
:
formattedDate
,
tags
:
tags
,
title
:
item
.
eventName
||
""
,
content
:
item
.
eventDesc
||
""
,
info
:
`
${
item
.
eventDate
||
""
}
·
${
item
.
eventType
||
""
}
`
,
// 保留原始数据字段
eventId
:
item
.
eventId
,
eventOrg
:
item
.
eventOrg
,
eventType
:
item
.
eventType
,
eventCountryImg
:
item
.
eventCountryImg
,
eventDomainList
:
item
.
eventDomainList
};
});
};
// 获取领域遏制时间线数据
const
handleGetDomainContainmentTimeline
=
async
()
=>
{
try
{
const
res
=
await
getDomainContainmentTimeline
();
console
.
log
(
"美对我领域打压遏制时间线"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
// 处理返回的数据结构
const
processedData
=
processTimelineData
(
res
.
data
);
timelineList
.
value
=
processedData
.
length
>
9
?
processedData
.
slice
(
0
,
9
)
:
processedData
;
}
}
catch
(
error
)
{
console
.
error
(
"获取美对我领域打压遏制时间线失败:"
,
error
);
// 设置默认空数组
timelineList
.
value
=
[];
}
};
const
maxPerRow
=
3
;
const
maxPerRow
=
3
;
const
nodeGapX
=
450
;
const
nodeGapX
=
450
;
const
rowHeight
=
215
;
const
rowHeight
=
215
;
...
@@ -419,6 +474,7 @@ const svgWidth = computed(() => {
...
@@ -419,6 +474,7 @@ const svgWidth = computed(() => {
const
svgHeight
=
computed
(()
=>
{
const
svgHeight
=
computed
(()
=>
{
const
rows
=
Math
.
ceil
(
timelineList
.
value
.
length
/
maxPerRow
);
const
rows
=
Math
.
ceil
(
timelineList
.
value
.
length
/
maxPerRow
);
console
.
log
(
"看下高度"
,
rows
);
return
startY
+
rows
*
rowHeight
;
return
startY
+
rows
*
rowHeight
;
});
});
...
@@ -606,6 +662,77 @@ const box5Data = ref({
...
@@ -606,6 +662,77 @@ const box5Data = ref({
]
]
});
});
const
handleGetDomainContainmentTrend
=
async
()
=>
{
try
{
const
res
=
await
getDomainContainmentTrend
();
console
.
log
(
"美对华领域打压遏制数量趋势"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
// 处理返回的数据结构,按照 mockdata.json 中的格式
const
processedData
=
processDomainTrendData
(
res
.
data
);
box5Data
.
value
=
processedData
;
// 更新图表
let
Chart
=
getMultiLineChart
(
box5Data
.
value
);
setChart
(
Chart
,
"chartRef"
);
}
}
catch
(
error
)
{
console
.
error
(
"获取美对华领域打压遏制数量趋势失败:"
,
error
);
}
};
// 处理领域趋势数据的方法
const
processDomainTrendData
=
rawData
=>
{
// 提取所有的月份作为标题
const
titles
=
rawData
.
map
(
item
=>
item
.
yearOrMonth
);
// 收集所有不重复的领域名称
const
domainNamesSet
=
new
Set
();
rawData
.
forEach
(
item
=>
{
item
.
domainList
.
forEach
(
domain
=>
{
domainNamesSet
.
add
(
domain
.
domainName
);
});
});
const
domainNames
=
Array
.
from
(
domainNamesSet
);
// 定义颜色映射
const
colorMap
=
{
人工智能
:
"#E34D59"
,
新一代通信网络
:
"#FF9F1C"
,
核
:
"#FFB3B3"
,
生物科技
:
"#00A79D"
,
量子科技
:
"#7B61FF"
,
先进制造
:
"#363B42"
,
新能源
:
"#2BA471"
,
太空
:
"#3762F0"
,
集成电路
:
"#0052D9"
,
新材料
:
"#FFD900"
,
航空航天
:
"#3762F0"
,
海洋
:
"#76D1FF"
,
深海
:
"#002060"
,
其他
:
"#A6A6A6"
};
// 生成数据系列
const
dataSeries
=
domainNames
.
map
(
domainName
=>
{
const
values
=
rawData
.
map
(
monthData
=>
{
const
domainItem
=
monthData
.
domainList
.
find
(
d
=>
d
.
domainName
===
domainName
);
return
domainItem
?
domainItem
.
domainNum
:
0
;
});
return
{
name
:
domainName
,
color
:
colorMap
[
domainName
]
||
`#
${
Math
.
floor
(
Math
.
random
()
*
16777215
).
toString
(
16
)}
`
,
// 如果没有预定义颜色,则随机生成
value
:
values
};
});
return
{
title
:
titles
,
data
:
dataSeries
};
};
const
newsList
=
ref
([
const
newsList
=
ref
([
{
{
tags
:
[
"航空航天"
,
"能源"
],
tags
:
[
"航空航天"
,
"能源"
],
...
@@ -700,6 +827,57 @@ const getProgressWidth = count => {
...
@@ -700,6 +827,57 @@ const getProgressWidth = count => {
return
(
count
/
maxCount
)
*
100
+
"%"
;
return
(
count
/
maxCount
)
*
100
+
"%"
;
};
};
// 处理排名数据的方法
const
processRankingData
=
rawData
=>
{
if
(
!
rawData
||
!
Array
.
isArray
(
rawData
)
||
rawData
.
length
===
0
)
{
return
[];
}
return
rawData
.
map
(
item
=>
{
return
{
name
:
item
.
orgName
||
""
,
count
:
item
.
orgCount
||
0
,
orgPicture
:
item
.
orgPicture
// 保留原始图片字段,以防后续需要使用
};
});
};
const
rankTypeMap
=
{
institution
:
"对我打压机构"
,
enterprise
:
"受打压企业"
,
school
:
"受打压院校"
};
// 获取领域遏制排名数据
const
handleGetDomainContainmentRanking
=
async
()
=>
{
try
{
console
.
log
(
"获取领域遏制排名数据"
,
rankTypeMap
[
rankType
.
value
],
selectedField
.
value
);
const
res
=
await
getDomainContainmentRanking
(
rankTypeMap
[
rankType
.
value
],
!!
selectedField
.
value
?
selectedField
.
value
:
""
);
console
.
log
(
"获取领域遏制排名数据"
,
rankTypeMap
[
rankType
.
value
],
selectedField
.
value
);
console
.
log
(
"美对华领域打压遏制排行"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
// 处理返回的数据结构
const
processedData
=
processRankingData
(
res
.
data
);
rankList
.
value
=
processedData
;
}
}
catch
(
error
)
{
console
.
error
(
"获取美对华领域打压遏制排行失败:"
,
error
);
// 设置默认空数组
rankList
.
value
=
[];
}
};
// 监听rankType变化, 调用获取领域遏制排名数据方法
watch
(
rankType
,
handleGetDomainContainmentRanking
);
// 监听selectedField变化, 调用获取领域遏制排名数据方法
watch
(
selectedField
,
handleGetDomainContainmentRanking
);
const
currentIndex
=
ref
(
0
);
const
currentIndex
=
ref
(
0
);
const
next
=
()
=>
{
const
next
=
()
=>
{
if
(
currentIndex
.
value
<
buttonsData
.
value
.
length
-
5
)
{
if
(
currentIndex
.
value
<
buttonsData
.
value
.
length
-
5
)
{
...
@@ -714,10 +892,13 @@ const prev = () => {
...
@@ -714,10 +892,13 @@ const prev = () => {
};
};
onMounted
(()
=>
{
onMounted
(()
=>
{
let
Chart
=
getMultiLineChart
(
box5Data
.
value
);
// let Chart = getMultiLineChart(box5Data.value);
setChart
(
Chart
,
"chartRef"
);
// setChart(Chart, "chartRef");
handleGetDomainContainmentTrend
();
handleGetAllDomainCount
();
handleGetAllDomainCount
();
handleGetDomainContainmentRanking
();
handleGetDomainContainmentTimeline
();
});
});
</
script
>
</
script
>
...
@@ -1461,4 +1642,3 @@ onMounted(() => {
...
@@ -1461,4 +1642,3 @@ onMounted(() => {
border-color
:
rgb
(
59
,
65
,
75
)
!important
;
border-color
:
rgb
(
59
,
65
,
75
)
!important
;
}
}
</
style
>
</
style
>
src/views/ZMOverView/components/fourSuppress/components/addDomain/mockdata.json
0 → 100644
浏览文件 @
6de917f9
{
"code"
:
200
,
"message"
:
"操作成功"
,
"success"
:
true
,
"data"
:
[
{
"eventType"
:
"行政令"
,
"eventName"
:
"为了美国和委内瑞拉人民的利益保障委内瑞拉的石油收入"
,
"eventDesc"
:
null
,
"eventId"
:
"248914"
,
"eventDomainList"
:
[
{
"domainId"
:
"1"
,
"domainName"
:
"人工智能"
},
{
"domainId"
:
"3"
,
"domainName"
:
"新一代通信网络"
}
],
"eventOrgName"
:
null
,
"eventDate"
:
"2026-01-10"
},
{
"eventType"
:
"行政令"
,
"eventName"
:
null
,
"eventDesc"
:
null
,
"eventId"
:
"248863"
,
"eventDomainList"
:
[
{
"domainId"
:
"8"
,
"domainName"
:
"先进制造"
},
{
"domainId"
:
"9"
,
"domainName"
:
"新材料"
}
],
"eventOrgName"
:
null
,
"eventDate"
:
"2026-01-09"
},
{
"eventType"
:
"行政令"
,
"eventName"
:
"使美国退出与美国利益相悖的国际组织、公约、条约"
,
"eventDesc"
:
null
,
"eventId"
:
"249004"
,
"eventDomainList"
:
[
{
"domainId"
:
"2"
,
"domainName"
:
"生物科技"
},
{
"domainId"
:
"4"
,
"domainName"
:
"量子科技"
},
{
"domainId"
:
"5"
,
"domainName"
:
"新能源"
},
{
"domainId"
:
"3"
,
"domainName"
:
"新一代通信网络"
}
],
"eventOrgName"
:
null
,
"eventDate"
:
"2026-01-08"
},
{
"eventType"
:
"行政令"
,
"eventName"
:
"在国防合同中优先考虑作战人员"
,
"eventDesc"
:
null
,
"eventId"
:
"248915"
,
"eventDomainList"
:
[
{
"domainId"
:
"99"
,
"domainName"
:
"其他"
},
{
"domainId"
:
"8"
,
"domainName"
:
"先进制造"
},
{
"domainId"
:
"10"
,
"domainName"
:
"航空航天"
}
],
"eventOrgName"
:
null
,
"eventDate"
:
"2026-01-08"
},
{
"eventType"
:
"行政令"
,
"eventName"
:
"大西洋高度洄游物种;商业性大西洋黑鼻鲨和娱乐性大西洋鲨鱼渔业管理措施的修订"
,
"eventDesc"
:
"NMFS提议对商业和休闲大西洋鲨鱼渔业进行几项改革。具体来说,NMFS正在考虑取消大西洋地区黑鼻鲨管理边界,修改商业保留限额..."
,
"eventId"
:
"163447"
,
"eventDomainList"
:
[
{
"domainId"
:
"14"
,
"domainName"
:
"核"
},
{
"domainId"
:
"7"
,
"domainName"
:
"海洋"
}
],
"eventOrgName"
:
null
,
"eventDate"
:
"2026-01-05"
},
{
"eventType"
:
"行政令"
,
"eventName"
:
"关于Hiefo Corporation收购Emcore Corporation部分资产"
,
"eventDesc"
:
null
,
"eventId"
:
"248916"
,
"eventDomainList"
:
[
{
"domainId"
:
"3"
,
"domainName"
:
"新一代通信网络"
},
{
"domainId"
:
"8"
,
"domainName"
:
"先进制造"
},
{
"domainId"
:
"6"
,
"domainName"
:
"集成电路"
}
],
"eventOrgName"
:
null
,
"eventDate"
:
"2026-01-03"
},
{
"eventType"
:
"行政令"
,
"eventName"
:
"汽车贷款利息扣除"
,
"eventDesc"
:
"本文件包含关于某些纳税人扣除高达10,000美元的合格乘用车贷款利息的拟议法规。本文件还包含关于新信息报告的拟议法规..."
,
"eventId"
:
"163443"
,
"eventDomainList"
:
[
{
"domainId"
:
"13"
,
"domainName"
:
"太空"
},
{
"domainId"
:
"14"
,
"domainName"
:
"核"
}
],
"eventOrgName"
:
null
,
"eventDate"
:
"2026-01-02"
},
{
"eventType"
:
"行政令"
,
"eventName"
:
"品牌处方药费用法规的法定更新"
,
"eventDesc"
:
"本文件建议修订有关对从事制造或进口某些品牌处方药业务的相关实体征收年费的法规。为了应对覆盖缺口折扣的替代..."
,
"eventId"
:
"163444"
,
"eventDomainList"
:
[
{
"domainId"
:
"2"
,
"domainName"
:
"生物科技"
},
{
"domainId"
:
"3"
,
"domainName"
:
"新一代通信网络"
}
],
"eventOrgName"
:
null
,
"eventDate"
:
"2026-01-02"
},
{
"eventType"
:
"337"
,
"eventName"
:
"外国制造的半导体器件及其下游产品和组件"
,
"eventDesc"
:
"美国ITC发布对外国制造的半导体器件及其下游产品和组件的337部分终裁"
,
"eventId"
:
"111"
,
"eventDomainList"
:
[
{
"domainId"
:
"1"
,
"domainName"
:
"人工智能"
},
{
"domainId"
:
"5"
,
"domainName"
:
"新能源"
}
],
"eventOrgName"
:
"美国商务部"
,
"eventDate"
:
"2026-01-01"
},
{
"eventType"
:
"行政令"
,
"eventName"
:
"美国东北部的渔业;大西洋冲浪蛤和海洋圆蛤渔业管理计划修正案21"
,
"eventDesc"
:
"NMFS宣布,中大西洋渔业管理委员会已提交大西洋冲浪蛤和海洋圆蛤渔业管理计划第21号修正案,供商务部长审查和批准。我们正在征求意见..."
,
"eventId"
:
"163426"
,
"eventDomainList"
:
[
{
"domainId"
:
"7"
,
"domainName"
:
"海洋"
},
{
"domainId"
:
"3"
,
"domainName"
:
"新一代通信网络"
}
],
"eventOrgName"
:
null
,
"eventDate"
:
"2025-12-29"
}
]
}
\ No newline at end of file
src/views/ZMOverView/components/fourSuppress/components/allGovernment/index.vue
浏览文件 @
6de917f9
...
@@ -4,7 +4,7 @@
...
@@ -4,7 +4,7 @@
<div
class=
"main-content"
>
<div
class=
"main-content"
>
<div
class=
"cards-mask"
>
<div
class=
"cards-mask"
>
<div
class=
"cards-container"
:style=
"
{ transform: `translateX(-${currentIndex * (307 + 16)}px)` }">
<div
class=
"cards-container"
:style=
"
{ transform: `translateX(-${currentIndex * (307 + 16)}px)` }">
<div
v-for=
"(card, index) in cardList"
:key=
"index"
class=
"government-card"
>
<div
v-for=
"(card, index) in cardList"
:key=
"index"
class=
"government-card"
@
click=
"handleCardClick(card)"
>
<div
class=
"card-bg"
:style=
"
{ backgroundImage: `url(${card.icon || defaultIcon})` }">
</div>
<div
class=
"card-bg"
:style=
"
{ backgroundImage: `url(${card.icon || defaultIcon})` }">
</div>
<div
class=
"card-header"
>
<div
class=
"card-header"
>
<span
class=
"card-title"
>
{{
card
.
title
}}
</span>
<span
class=
"card-title"
>
{{
card
.
title
}}
</span>
...
@@ -20,13 +20,8 @@
...
@@ -20,13 +20,8 @@
</div>
</div>
</div>
</div>
<img
:src=
"leftBtn"
alt=
""
class=
"left-btn"
@
click=
"prev"
:class=
"
{ disabled: currentIndex === 0 }" />
<img
:src=
"leftBtn"
alt=
""
class=
"left-btn"
@
click=
"prev"
:class=
"
{ disabled: currentIndex === 0 }" />
<img
<img
:src=
"rightBtn"
alt=
""
class=
"right-btn"
@
click=
"next"
:src=
"rightBtn"
:class=
"
{ disabled: currentIndex >= cardList.length - 5 }" />
alt=
""
class=
"right-btn"
@
click=
"next"
:class=
"
{ disabled: currentIndex >= cardList.length - 5 }"
/>
</div>
</div>
<div
class=
"main-charts"
>
<div
class=
"main-charts"
>
<div
class=
"charts-title"
>
<div
class=
"charts-title"
>
...
@@ -35,14 +30,16 @@
...
@@ -35,14 +30,16 @@
<span>
美对华制裁措施数量趋势
</span>
<span>
美对华制裁措施数量趋势
</span>
</div>
</div>
<div
class=
"title-right"
>
<div
class=
"title-right"
>
<el-select
v-model=
"fieldValue"
placeholder=
"全部领域"
class=
"custom-select"
>
<el-select
v-model=
"fieldValue"
placeholder=
"全部领域"
class=
"custom-select"
<el-option
label=
"全部领域"
value=
""
/>
@
change=
"getUSChinaSanctionTrendData"
>
<el-option
v-for=
"item in fieldOptions"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
</el-select>
</el-select>
<el-select
v-model=
"deptValue"
placeholder=
"全部部门"
class=
"custom-select"
>
<el-select
v-model=
"deptValue"
placeholder=
"全部部门"
class=
"custom-select"
@
change=
"getUSChinaSanctionTrendData"
>
<el-option
label=
"全部部门"
value=
""
/>
<el-option
label=
"全部部门"
value=
""
/>
</el-select>
</el-select>
<el-select
v-model=
"methodValue"
placeholder=
"全部制裁手段"
class=
"custom-select"
>
<el-select
v-model=
"methodValue"
placeholder=
"全部制裁手段"
class=
"custom-select"
<el-option
label=
"全部制裁手段"
value=
""
/>
@
change=
"getUSChinaSanctionTrendData"
>
<el-option
v-for=
"item in methodOptions"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
</el-select>
</el-select>
</div>
</div>
</div>
</div>
...
@@ -61,16 +58,11 @@
...
@@ -61,16 +58,11 @@
<img
:src=
"defaultImg"
alt=
""
class=
"item-icon"
/>
<img
:src=
"defaultImg"
alt=
""
class=
"item-icon"
/>
<div
class=
"item-right"
>
<div
class=
"item-right"
>
<div
class=
"dynamic-item-header"
>
<div
class=
"dynamic-item-header"
>
<span
class=
"item-title"
>
{{
item
.
title
}}
</span>
<span
class=
"item-title"
@
click=
"handleNewsClick(item)"
>
{{
item
.
title
}}
</span>
<span
class=
"item-date"
>
{{
item
.
date
}}
·
{{
item
.
type
}}
</span>
<span
class=
"item-date"
>
{{
item
.
date
}}
·
{{
item
.
type
}}
</span>
</div>
</div>
<el-tooltip
<el-tooltip
effect=
"dark"
:content=
"item.content"
popper-class=
"common-prompt-popper"
placement=
"top"
effect=
"dark"
:show-after=
"500"
>
:content=
"item.content"
popper-class=
"common-prompt-popper"
placement=
"top"
:show-after=
"500"
>
<div
class=
"dynamic-item-body"
>
<div
class=
"dynamic-item-body"
>
{{
item
.
content
}}
{{
item
.
content
}}
</div>
</div>
...
@@ -94,13 +86,7 @@
...
@@ -94,13 +86,7 @@
<div
class=
"ranking-header"
>
<div
class=
"ranking-header"
>
<div
class=
"header-left"
>
<div
class=
"header-left"
>
<div
class=
"dept-icons"
>
<div
class=
"dept-icons"
>
<img
<img
v-for=
"(dept, dIndex) in rank.depts"
:key=
"dIndex"
:src=
"defaultImg"
alt=
""
class=
"dept-icon"
/>
v-for=
"(dept, dIndex) in rank.depts"
:key=
"dIndex"
:src=
"defaultImg"
alt=
""
class=
"dept-icon"
/>
</div>
</div>
<span
class=
"dept-names"
>
{{
rank
.
depts
.
join
(
" / "
)
}}
</span>
<span
class=
"dept-names"
>
{{
rank
.
depts
.
join
(
" / "
)
}}
</span>
</div>
</div>
...
@@ -114,13 +100,8 @@
...
@@ -114,13 +100,8 @@
<span
class=
"item-type"
:class=
"item.type === '法案' ? 'type-bill' : 'type-order'"
>
{{
<span
class=
"item-type"
:class=
"item.type === '法案' ? 'type-bill' : 'type-order'"
>
{{
item
.
type
item
.
type
}}
</span>
}}
</span>
<el-tooltip
<el-tooltip
effect=
"dark"
:content=
"item.title"
popper-class=
"common-prompt-popper"
placement=
"top"
effect=
"dark"
:show-after=
"500"
>
:content=
"item.title"
popper-class=
"common-prompt-popper"
placement=
"top"
:show-after=
"500"
>
<span
class=
"item-title"
>
{{
item
.
title
}}
</span>
<span
class=
"item-title"
>
{{
item
.
title
}}
</span>
</el-tooltip>
</el-tooltip>
</div>
</div>
...
@@ -154,7 +135,7 @@
...
@@ -154,7 +135,7 @@
<div
class=
"timeline-list"
>
<div
class=
"timeline-list"
>
<div
v-for=
"(dept, index) in filteredTimelineList"
:key=
"index"
class=
"dept-row"
>
<div
v-for=
"(dept, index) in filteredTimelineList"
:key=
"index"
class=
"dept-row"
>
<div
class=
"dept-info"
>
<div
class=
"dept-info"
>
<img
:src=
"defaultImg"
alt=
""
class=
"dept-icon"
/>
<img
:src=
"de
pt.icon || de
faultImg"
alt=
""
class=
"dept-icon"
/>
<div
class=
"dept-text"
>
<div
class=
"dept-text"
>
<div
class=
"dept-name"
>
{{
dept
.
name
}}
</div>
<div
class=
"dept-name"
>
{{
dept
.
name
}}
</div>
<div
class=
"dept-count"
>
{{
dept
.
count
}}
次
</div>
<div
class=
"dept-count"
>
{{
dept
.
count
}}
次
</div>
...
@@ -171,13 +152,8 @@
...
@@ -171,13 +152,8 @@
<div
class=
"light"
:class=
"
{ active: event.level === 'red', red: true }">
</div>
<div
class=
"light"
:class=
"
{ active: event.level === 'red', red: true }">
</div>
</div>
</div>
</div>
</div>
<el-tooltip
<el-tooltip
effect=
"dark"
:content=
"event.content"
popper-class=
"common-prompt-popper"
placement=
"top"
effect=
"dark"
:show-after=
"500"
>
:content=
"event.content"
popper-class=
"common-prompt-popper"
placement=
"top"
:show-after=
"500"
>
<div
class=
"event-content"
>
{{
event
.
content
}}
</div>
<div
class=
"event-content"
>
{{
event
.
content
}}
</div>
</el-tooltip>
</el-tooltip>
<div
class=
"event-tags"
>
<div
class=
"event-tags"
>
...
@@ -200,6 +176,7 @@
...
@@ -200,6 +176,7 @@
<
script
setup
>
<
script
setup
>
import
{
onMounted
,
ref
,
computed
}
from
"vue"
;
import
{
onMounted
,
ref
,
computed
}
from
"vue"
;
import
{
useRouter
}
from
"vue-router"
;
import
*
as
echarts
from
"echarts"
;
import
*
as
echarts
from
"echarts"
;
import
defaultIcon
from
"../../assets/defaultIcon.png"
;
import
defaultIcon
from
"../../assets/defaultIcon.png"
;
import
leftBtn
from
"../../assets/left-btn.png"
;
import
leftBtn
from
"../../assets/left-btn.png"
;
...
@@ -210,6 +187,275 @@ import icon3 from "../../assets/icon3.png";
...
@@ -210,6 +187,275 @@ import icon3 from "../../assets/icon3.png";
import
icon4
from
"../../assets/icon4.png"
;
import
icon4
from
"../../assets/icon4.png"
;
import
timelineBg
from
"../../assets/timeline.png"
;
import
timelineBg
from
"../../assets/timeline.png"
;
import
defaultImg
from
"../../../../assets/images/default-icon2.png"
;
import
defaultImg
from
"../../../../assets/images/default-icon2.png"
;
// 传递接口
import
{
getAllGovernmentList
,
getUSChinaSanctionTrend
,
getUSGovernmentLatestDynamic
,
getUSGovernmentJointSanctionRank
,
getUSGovernmentSanctionHistory
}
from
"@/api/allGovernment.js"
;
const
router
=
useRouter
();
// 全政府-美政府部门对我打压遏制时间线
const
loadingHistory
=
ref
(
false
);
const
getUSGovernmentSanctionHistoryData
=
async
()
=>
{
loadingHistory
.
value
=
true
;
try
{
const
res
=
await
getUSGovernmentSanctionHistory
({
currentPage
:
1
,
pageSize
:
1000
});
if
(
res
.
code
===
200
&&
res
.
data
&&
res
.
data
.
content
)
{
const
rawList
=
res
.
data
.
content
;
const
orgMap
=
{};
if
(
governmentList
.
value
&&
governmentList
.
value
.
length
)
{
governmentList
.
value
.
forEach
(
g
=>
{
if
(
g
.
departId
)
{
orgMap
[
g
.
departId
]
=
g
.
title
;
}
});
}
const
grouped
=
{};
rawList
.
forEach
(
item
=>
{
// 尝试获取部门名称
let
deptName
=
'未知部门'
;
if
(
item
.
orgName
)
{
deptName
=
item
.
orgName
;
}
else
if
(
item
.
orgId
&&
orgMap
[
item
.
orgId
])
{
deptName
=
orgMap
[
item
.
orgId
];
}
else
if
(
item
.
orgId
)
{
if
(
item
.
orgId
===
'241'
)
deptName
=
'商务部工业与安全局'
;
else
if
(
item
.
orgId
===
'203'
)
deptName
=
'海外资产控制办公室'
;
else
deptName
=
'部门 '
+
item
.
orgId
;
}
if
(
!
grouped
[
deptName
])
{
grouped
[
deptName
]
=
{
name
:
deptName
,
icon
:
item
.
orgLogoUrl
,
count
:
0
,
events
:
[]
};
}
grouped
[
deptName
].
count
++
;
grouped
[
deptName
].
events
.
push
({
date
:
item
.
postDate
?
item
.
postDate
.
replace
(
/^
(\d{4})
-
(\d{2})
-
(\d{2})
$/
,
'$1年$2月$3日'
)
:
''
,
content
:
item
.
name
||
item
.
summary
,
tags
:
item
.
techDomainList
?
item
.
techDomainList
.
slice
(
0
,
2
)
:
[],
level
:
getLevelByCount
(
item
.
cnEntityCount
)
});
});
timelineList
.
value
=
Object
.
values
(
grouped
);
initSlider
();
}
}
catch
(
error
)
{
console
.
error
(
"获取制裁历程失败:"
,
error
);
}
finally
{
loadingHistory
.
value
=
false
;
}
};
// 辅助函数:根据受影响实体数量生成level
const
getLevelByCount
=
(
count
)
=>
{
const
c
=
count
||
0
;
if
(
c
===
0
)
return
'green'
;
// 0 或空 绿色
if
(
c
<=
10
)
return
'yellow'
;
// 1-10 黄色
return
'red'
;
// >10 红色
};
// 全政府-美政府部门联合制裁排行
const
loadingJointRank
=
ref
(
false
);
const
getUSGovernmentJointSanctionRankData
=
async
()
=>
{
loadingJointRank
.
value
=
true
;
try
{
const
res
=
await
getUSGovernmentJointSanctionRank
();
if
(
res
.
code
===
200
&&
res
.
data
)
{
const
rawData
=
res
.
data
||
[];
// 按 orderId 分组
const
groupedData
=
{};
rawData
.
forEach
(
item
=>
{
if
(
!
groupedData
[
item
.
orderId
])
{
groupedData
[
item
.
orderId
]
=
{
depts
:
item
.
org
?
item
.
org
.
map
(
o
=>
o
.
orgName
)
:
[],
count
:
item
.
jointCount
,
items
:
[]
};
}
groupedData
[
item
.
orderId
].
items
.
push
({
type
:
item
.
sanTypeName
||
'其他'
,
title
:
item
.
sanName
,
date
:
item
.
postDate
?
item
.
postDate
.
replace
(
/^
(\d{4})
-
(\d{2})
-
(\d{2})
$/
,
'$1年$2月$3日'
)
:
''
});
});
rankingList
.
value
=
Object
.
values
(
groupedData
);
}
}
catch
(
error
)
{
console
.
error
(
"获取美政府部门联合制裁排行失败:"
,
error
);
}
finally
{
loadingJointRank
.
value
=
false
;
}
};
// 全政府-美政府部门打压遏制最新动态
const
loadingLatestDynamic
=
ref
(
false
);
const
getUSGovernmentLatestDynamicData
=
async
()
=>
{
loadingLatestDynamic
.
value
=
true
;
try
{
const
res
=
await
getUSGovernmentLatestDynamic
();
if
(
res
.
code
===
200
&&
res
.
data
)
{
dynamicList
.
value
=
res
.
data
.
map
(
item
=>
({
title
:
item
.
orgName
?
`
${
item
.
orgName
}
:
${
item
.
title
}
`
:
item
.
title
,
date
:
item
.
time
?
item
.
time
.
replace
(
/^
(\d{4})
-
(\d{2})
-
(\d{2})
$/
,
'$1年$2月$3日'
)
:
''
,
type
:
item
.
sanTypeName
||
''
,
content
:
item
.
content
||
item
.
title
,
tags
:
item
.
industrylist
||
[],
id
:
item
.
id
}));
}
}
catch
(
error
)
{
console
.
error
(
"获取美政府部门打压遏制最新动态失败:"
,
error
);
}
finally
{
loadingLatestDynamic
.
value
=
false
;
}
};
// 点击科技要闻-跳转详情页
const
handleNewsClick
=
(
item
)
=>
{
if
(
!
item
||
!
item
.
id
)
return
;
// 打开新标签页
const
{
href
}
=
router
.
resolve
({
path
:
"/newsAnalysis"
,
query
:
{
newsId
:
item
.
id
}
});
window
.
open
(
href
,
'_blank'
);
};
// 全政府-获取美对华制裁措施数量趋势
const
usChinaSanctionTrend
=
ref
([]);
const
loadingTrend
=
ref
(
false
);
const
getUSChinaSanctionTrendData
=
async
()
=>
{
loadingTrend
.
value
=
true
;
try
{
const
params
=
{
monthNum
:
12
};
if
(
fieldValue
.
value
)
{
params
.
field
=
fieldValue
.
value
;
}
if
(
deptValue
.
value
)
{
params
.
orgId
=
deptValue
.
value
;
}
if
(
methodValue
.
value
)
{
params
.
sanType
=
methodValue
.
value
;
}
const
res
=
await
getUSChinaSanctionTrend
(
params
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
usChinaSanctionTrend
.
value
=
res
.
data
;
// 更新图表
const
xAxisData
=
res
.
data
.
map
((
item
)
=>
`
${
item
.
year
}
-
${
item
.
month
}
`
);
const
seriesData
=
res
.
data
.
map
((
item
)
=>
item
.
sanctionCount
);
initChart
(
xAxisData
,
seriesData
);
}
}
catch
(
error
)
{
console
.
error
(
"获取美对华制裁措施数量趋势失败:"
,
error
);
}
finally
{
loadingTrend
.
value
=
false
;
}
};
// 全政府-获取美国政府部门制裁数据
const
governmentList
=
ref
([]);
const
loadingGovernment
=
ref
(
false
);
const
getGovernmentList
=
async
()
=>
{
loadingGovernment
.
value
=
true
;
try
{
const
res
=
await
getAllGovernmentList
();
if
(
res
.
code
===
200
&&
res
.
data
)
{
governmentList
.
value
=
res
.
data
;
// 如果后端返回了数据,则更新 cardList
if
(
Array
.
isArray
(
res
.
data
)
&&
res
.
data
.
length
>
0
)
{
cardList
.
value
=
res
.
data
.
map
((
item
)
=>
{
const
stats
=
[];
if
(
item
.
parliament
)
{
// 议会类型
if
(
item
.
billCount
)
{
stats
.
push
({
label
:
"法案(提出)"
,
value
:
(
item
.
billCount
.
proposedBillCount
||
0
)
+
"项"
});
stats
.
push
({
label
:
"法案(通过)"
,
value
:
(
item
.
billCount
.
passedBillCount
||
0
)
+
"项"
});
}
}
else
{
// 非议会类型
// 1. 处理制裁清单
if
(
item
.
sanctionCountList
&&
item
.
sanctionCountList
.
length
>
0
)
{
item
.
sanctionCountList
.
forEach
((
sanction
)
=>
{
stats
.
push
({
label
:
sanction
.
nameZh
||
sanction
.
name
,
value
:
(
sanction
.
postCount
||
0
)
+
"次"
});
});
}
// 2. 处理政令
stats
.
push
({
label
:
"政令"
,
value
:
(
item
.
administrativeOrderCount
||
0
)
+
"项"
});
}
return
{
title
:
item
.
departName
||
"未知部门"
,
icon
:
defaultIcon
,
// 暂时使用默认图标
stats
:
stats
,
departId
:
item
.
departId
};
});
}
}
}
catch
(
error
)
{
console
.
error
(
"获取美国政府部门制裁数据失败:"
,
error
);
}
finally
{
loadingGovernment
.
value
=
false
;
}
};
// 跳转到机构页面
const
handleCardClick
=
(
card
)
=>
{
if
(
!
card
||
!
card
.
departId
)
return
;
// 打开新标签页
const
{
href
}
=
router
.
resolve
({
path
:
"/institution"
,
query
:
{
id
:
card
.
departId
}
});
window
.
open
(
href
,
'_blank'
);
};
const
cardList
=
ref
([
const
cardList
=
ref
([
{
{
...
@@ -277,8 +523,30 @@ const deptValue = ref("");
...
@@ -277,8 +523,30 @@ const deptValue = ref("");
const
methodValue
=
ref
(
""
);
const
methodValue
=
ref
(
""
);
const
measureType
=
ref
(
"history"
);
const
measureType
=
ref
(
"history"
);
const
selectedField
=
ref
(
"all"
);
const
selectedField
=
ref
(
""
);
const
fieldOptions
=
ref
([{
label
:
"全部领域"
,
value
:
"all"
}]);
const
fieldOptions
=
ref
([
{
label
:
"全部领域"
,
value
:
""
},
{
label
:
"人工智能"
,
value
:
"1"
},
{
label
:
"生物科技"
,
value
:
"2"
},
{
label
:
"新一代信息技术"
,
value
:
"3"
},
{
label
:
"量子科技"
,
value
:
"4"
},
{
label
:
"新能源"
,
value
:
"5"
},
{
label
:
"集成电路"
,
value
:
"6"
},
{
label
:
"海洋"
,
value
:
"7"
},
{
label
:
"先进制造"
,
value
:
"8"
},
{
label
:
"新材料"
,
value
:
"9"
},
{
label
:
"航空航天"
,
value
:
"10"
},
{
label
:
"深海"
,
value
:
"11"
},
{
label
:
"极地"
,
value
:
"12"
},
{
label
:
"太空"
,
value
:
"13"
},
{
label
:
"核"
,
value
:
"14"
}
]);
const
methodOptions
=
ref
([
{
label
:
"全部制裁手段"
,
value
:
""
},
{
label
:
"法案"
,
value
:
"-1"
},
{
label
:
"行政令"
,
value
:
"-2"
}
]);
const
dynamicList
=
ref
([
const
dynamicList
=
ref
([
{
{
...
@@ -686,7 +954,7 @@ const initSlider = () => {
...
@@ -686,7 +954,7 @@ const initSlider = () => {
});
});
};
};
const
initChart
=
()
=>
{
const
initChart
=
(
xAxisData
=
[],
seriesData
=
[]
)
=>
{
if
(
!
chartRef
.
value
)
return
;
if
(
!
chartRef
.
value
)
return
;
myChart
=
echarts
.
init
(
chartRef
.
value
);
myChart
=
echarts
.
init
(
chartRef
.
value
);
const
option
=
{
const
option
=
{
...
@@ -714,20 +982,7 @@ const initChart = () => {
...
@@ -714,20 +982,7 @@ const initChart = () => {
xAxis
:
{
xAxis
:
{
type
:
"category"
,
type
:
"category"
,
boundaryGap
:
false
,
boundaryGap
:
false
,
data
:
[
data
:
xAxisData
,
"2024-12"
,
"2025-1"
,
"2025-2"
,
"2025-3"
,
"2025-4"
,
"2025-5"
,
"2025-6"
,
"2025-7"
,
"2025-8"
,
"2025-9"
,
"2025-10"
,
"2025-11"
],
axisLine
:
{
axisLine
:
{
lineStyle
:
{
lineStyle
:
{
color
:
"#f0f0f0"
color
:
"#f0f0f0"
...
@@ -744,8 +999,7 @@ const initChart = () => {
...
@@ -744,8 +999,7 @@ const initChart = () => {
yAxis
:
{
yAxis
:
{
type
:
"value"
,
type
:
"value"
,
min
:
0
,
min
:
0
,
max
:
100
,
minInterval
:
1
,
// 保证最小间隔为1,避免小数
interval
:
20
,
axisLine
:
{
axisLine
:
{
show
:
false
show
:
false
},
},
...
@@ -762,7 +1016,7 @@ const initChart = () => {
...
@@ -762,7 +1016,7 @@ const initChart = () => {
},
},
series
:
[
series
:
[
{
{
data
:
[
45
,
52
,
62
,
62
,
62
,
65
,
52
,
75
,
75
,
75
,
82
,
92
]
,
data
:
seriesData
,
type
:
"line"
,
type
:
"line"
,
symbol
:
"circle"
,
symbol
:
"circle"
,
symbolSize
:
8
,
symbolSize
:
8
,
...
@@ -796,6 +1050,11 @@ const initChart = () => {
...
@@ -796,6 +1050,11 @@ const initChart = () => {
onMounted
(()
=>
{
onMounted
(()
=>
{
initChart
();
initChart
();
initSlider
();
initSlider
();
getGovernmentList
();
getUSChinaSanctionTrendData
();
getUSGovernmentLatestDynamicData
();
getUSGovernmentJointSanctionRankData
();
getUSGovernmentSanctionHistoryData
();
window
.
addEventListener
(
"resize"
,
()
=>
{
window
.
addEventListener
(
"resize"
,
()
=>
{
myChart
&&
myChart
.
resize
();
myChart
&&
myChart
.
resize
();
sliderChart
&&
sliderChart
.
resize
();
sliderChart
&&
sliderChart
.
resize
();
...
@@ -819,10 +1078,12 @@ const prev = () => {
...
@@ -819,10 +1078,12 @@ const prev = () => {
.content-wrapper
{
.content-wrapper
{
width
:
1666px
;
width
:
1666px
;
height
:
2132px
;
height
:
2132px
;
.main-content
{
.main-content
{
width
:
100%
;
width
:
100%
;
position
:
relative
;
position
:
relative
;
margin-bottom
:
16px
;
margin-bottom
:
16px
;
.cards-mask
{
.cards-mask
{
width
:
100%
;
width
:
100%
;
overflow
:
hidden
;
// 仅在这里隐藏超出部分,不影响外层的按钮
overflow
:
hidden
;
// 仅在这里隐藏超出部分,不影响外层的按钮
...
@@ -848,6 +1109,7 @@ const prev = () => {
...
@@ -848,6 +1109,7 @@ const prev = () => {
border
:
1px
solid
rgba
(
255
,
255
,
255
,
0
.1
);
border
:
1px
solid
rgba
(
255
,
255
,
255
,
0
.1
);
box-shadow
:
0
0
20px
rgba
(
25
,
69
,
130
,
0
.1
);
box-shadow
:
0
0
20px
rgba
(
25
,
69
,
130
,
0
.1
);
cursor
:
pointer
;
cursor
:
pointer
;
.card-bg
{
.card-bg
{
position
:
absolute
;
position
:
absolute
;
top
:
0
;
top
:
0
;
...
@@ -861,6 +1123,7 @@ const prev = () => {
...
@@ -861,6 +1123,7 @@ const prev = () => {
z-index
:
0
;
z-index
:
0
;
opacity
:
0
.8
;
opacity
:
0
.8
;
background-color
:
rgba
(
5
,
33
,
77
,
0
.7
);
// 调整为更明显的深蓝色
background-color
:
rgba
(
5
,
33
,
77
,
0
.7
);
// 调整为更明显的深蓝色
&
:
:
after
{
&
:
:
after
{
content
:
""
;
content
:
""
;
position
:
absolute
;
position
:
absolute
;
...
@@ -931,11 +1194,13 @@ const prev = () => {
...
@@ -931,11 +1194,13 @@ const prev = () => {
cursor
:
pointer
;
cursor
:
pointer
;
z-index
:
10
;
z-index
:
10
;
transition
:
opacity
0
.3s
;
transition
:
opacity
0
.3s
;
&
.disabled
{
&
.disabled
{
opacity
:
0
.3
;
opacity
:
0
.3
;
cursor
:
not
-
allowed
;
cursor
:
not
-
allowed
;
}
}
}
}
.right-btn
{
.right-btn
{
width
:
24px
;
width
:
24px
;
height
:
48px
;
height
:
48px
;
...
@@ -946,12 +1211,14 @@ const prev = () => {
...
@@ -946,12 +1211,14 @@ const prev = () => {
cursor
:
pointer
;
cursor
:
pointer
;
z-index
:
10
;
z-index
:
10
;
transition
:
opacity
0
.3s
;
transition
:
opacity
0
.3s
;
&
.disabled
{
&
.disabled
{
opacity
:
0
.3
;
opacity
:
0
.3
;
cursor
:
not
-
allowed
;
cursor
:
not
-
allowed
;
}
}
}
}
}
}
.main-charts
{
.main-charts
{
width
:
1601px
;
width
:
1601px
;
height
:
500px
;
height
:
500px
;
...
@@ -961,6 +1228,7 @@ const prev = () => {
...
@@ -961,6 +1228,7 @@ const prev = () => {
display
:
flex
;
display
:
flex
;
flex-direction
:
column
;
flex-direction
:
column
;
margin-bottom
:
22px
;
margin-bottom
:
22px
;
.charts-title
{
.charts-title
{
width
:
100%
;
width
:
100%
;
height
:
48px
;
height
:
48px
;
...
@@ -971,14 +1239,17 @@ const prev = () => {
...
@@ -971,14 +1239,17 @@ const prev = () => {
padding-right
:
35px
;
padding-right
:
35px
;
box-sizing
:
border-box
;
box-sizing
:
border-box
;
background
:
linear-gradient
(
180deg
,
rgba
(
231
,
243
,
255
,
1
)
0%
,
rgba
(
231
,
243
,
255
,
0
)
100%
);
background
:
linear-gradient
(
180deg
,
rgba
(
231
,
243
,
255
,
1
)
0%
,
rgba
(
231
,
243
,
255
,
0
)
100%
);
.title-left
{
.title-left
{
display
:
flex
;
display
:
flex
;
align-items
:
center
;
align-items
:
center
;
img
{
img
{
width
:
18px
;
width
:
18px
;
height
:
18px
;
height
:
18px
;
margin-right
:
14px
;
margin-right
:
14px
;
}
}
span
{
span
{
font-family
:
YouSheBiaoTiHei
;
font-family
:
YouSheBiaoTiHei
;
font-size
:
24px
;
font-size
:
24px
;
...
@@ -987,29 +1258,36 @@ const prev = () => {
...
@@ -987,29 +1258,36 @@ const prev = () => {
color
:
rgb
(
5
,
95
,
194
);
color
:
rgb
(
5
,
95
,
194
);
}
}
}
}
.title-right
{
.title-right
{
display
:
flex
;
display
:
flex
;
height
:
48px
;
height
:
48px
;
align-items
:
end
;
align-items
:
end
;
gap
:
12px
;
gap
:
12px
;
padding-right
:
17px
;
padding-right
:
17px
;
.custom-select
{
.custom-select
{
width
:
160px
;
width
:
160px
;
:deep
(
.el-input
)
{
:deep
(
.el-input
)
{
height
:
32px
;
height
:
32px
;
.el-input__wrapper
{
.el-input__wrapper
{
background-color
:
#fff
;
background-color
:
#fff
;
box-shadow
:
0
0
0
1px
#dcdfe6
inset
;
box-shadow
:
0
0
0
1px
#dcdfe6
inset
;
border-radius
:
4px
;
border-radius
:
4px
;
padding
:
0
12px
;
padding
:
0
12px
;
height
:
32px
;
height
:
32px
;
&
:hover
{
&
:hover
{
box-shadow
:
0
0
0
1px
#c0c4cc
inset
;
box-shadow
:
0
0
0
1px
#c0c4cc
inset
;
}
}
&
.is-focus
{
&
.is-focus
{
box-shadow
:
0
0
0
1px
#409eff
inset
;
box-shadow
:
0
0
0
1px
#409eff
inset
;
}
}
}
}
.el-input__inner
{
.el-input__inner
{
font-family
:
"Microsoft YaHei"
;
font-family
:
"Microsoft YaHei"
;
font-size
:
16px
;
font-size
:
16px
;
...
@@ -1017,6 +1295,7 @@ const prev = () => {
...
@@ -1017,6 +1295,7 @@ const prev = () => {
color
:
rgb
(
95
,
101
,
108
);
color
:
rgb
(
95
,
101
,
108
);
height
:
32px
;
height
:
32px
;
line-height
:
24px
;
line-height
:
24px
;
&
:
:
placeholder
{
&
:
:
placeholder
{
color
:
rgb
(
95
,
101
,
108
);
color
:
rgb
(
95
,
101
,
108
);
}
}
...
@@ -1025,29 +1304,34 @@ const prev = () => {
...
@@ -1025,29 +1304,34 @@ const prev = () => {
}
}
}
}
}
}
.charts-content
{
.charts-content
{
flex
:
1
;
flex
:
1
;
width
:
100%
;
width
:
100%
;
padding
:
20px
40px
20px
40px
;
padding
:
20px
40px
20px
40px
;
box-sizing
:
border-box
;
box-sizing
:
border-box
;
.chart-container
{
.chart-container
{
width
:
100%
;
width
:
100%
;
height
:
100%
;
height
:
100%
;
}
}
}
}
}
}
.main-text
{
.main-text
{
width
:
1601px
;
width
:
1601px
;
height
:
700px
;
height
:
700px
;
display
:
flex
;
display
:
flex
;
justify-content
:
space-between
;
justify-content
:
space-between
;
margin-bottom
:
16px
;
margin-bottom
:
16px
;
.text-item
{
.text-item
{
width
:
792px
;
width
:
792px
;
height
:
700px
;
height
:
700px
;
border-radius
:
10px
;
border-radius
:
10px
;
background-color
:
rgba
(
255
,
255
,
255
,
0
.65
);
background-color
:
rgba
(
255
,
255
,
255
,
0
.65
);
box-shadow
:
0
0
20px
rgba
(
25
,
69
,
130
,
0
.1
);
box-shadow
:
0
0
20px
rgba
(
25
,
69
,
130
,
0
.1
);
.text-item-title
{
.text-item-title
{
width
:
100%
;
width
:
100%
;
height
:
48px
;
height
:
48px
;
...
@@ -1057,11 +1341,13 @@ const prev = () => {
...
@@ -1057,11 +1341,13 @@ const prev = () => {
padding-left
:
17px
;
padding-left
:
17px
;
box-sizing
:
border-box
;
box-sizing
:
border-box
;
background
:
linear-gradient
(
180deg
,
rgba
(
231
,
243
,
255
,
1
)
0%
,
rgba
(
231
,
243
,
255
,
0
)
100%
);
background
:
linear-gradient
(
180deg
,
rgba
(
231
,
243
,
255
,
1
)
0%
,
rgba
(
231
,
243
,
255
,
0
)
100%
);
img
{
img
{
width
:
18px
;
width
:
18px
;
height
:
18px
;
height
:
18px
;
margin-right
:
14px
;
margin-right
:
14px
;
}
}
span
{
span
{
font-family
:
YouSheBiaoTiHei
;
font-family
:
YouSheBiaoTiHei
;
font-size
:
24px
;
font-size
:
24px
;
...
@@ -1070,32 +1356,40 @@ const prev = () => {
...
@@ -1070,32 +1356,40 @@ const prev = () => {
color
:
rgb
(
5
,
95
,
194
);
color
:
rgb
(
5
,
95
,
194
);
}
}
}
}
.text-item-content
{
.text-item-content
{
width
:
100%
;
width
:
100%
;
height
:
652px
;
height
:
652px
;
padding
:
6px
27px
22px
27px
;
padding
:
6px
27px
22px
27px
;
box-sizing
:
border-box
;
box-sizing
:
border-box
;
overflow-y
:
auto
;
overflow-y
:
auto
;
.dynamic-item
{
.dynamic-item
{
display
:
flex
;
display
:
flex
;
padding
:
16px
0
;
padding
:
16px
0
;
border-bottom
:
1px
solid
rgba
(
0
,
0
,
0
,
0
.05
);
border-bottom
:
1px
solid
rgba
(
0
,
0
,
0
,
0
.05
);
&
:last-child
{
&
:last-child
{
border-bottom
:
none
;
border-bottom
:
none
;
}
}
.item-icon
{
.item-icon
{
width
:
24px
;
width
:
24px
;
height
:
24px
;
height
:
24px
;
margin-right
:
12px
;
margin-right
:
12px
;
margin-top
:
3px
;
margin-top
:
3px
;
}
}
.item-right
{
.item-right
{
flex
:
1
;
flex
:
1
;
.dynamic-item-header
{
.dynamic-item-header
{
display
:
flex
;
display
:
flex
;
justify-content
:
space-between
;
justify-content
:
space-between
;
align-items
:
flex-start
;
align-items
:
flex-start
;
.item-title
{
.item-title
{
cursor
:
pointer
;
font-family
:
"Microsoft YaHei"
;
font-family
:
"Microsoft YaHei"
;
font-size
:
16px
;
font-size
:
16px
;
font-weight
:
700
;
font-weight
:
700
;
...
@@ -1104,16 +1398,22 @@ const prev = () => {
...
@@ -1104,16 +1398,22 @@ const prev = () => {
overflow
:
hidden
;
overflow
:
hidden
;
text-overflow
:
ellipsis
;
text-overflow
:
ellipsis
;
white-space
:
nowrap
;
white-space
:
nowrap
;
max-width
:
500px
;
flex
:
1
;
min-width
:
0
;
margin-right
:
12px
;
}
}
.item-date
{
.item-date
{
font-family
:
"Microsoft YaHei"
;
font-family
:
"Microsoft YaHei"
;
font-size
:
16px
;
font-size
:
16px
;
font-weight
:
400
;
font-weight
:
400
;
line-height
:
30px
;
line-height
:
30px
;
color
:
rgb
(
95
,
101
,
108
);
color
:
rgb
(
95
,
101
,
108
);
flex-shrink
:
0
;
white-space
:
nowrap
;
}
}
}
}
.dynamic-item-body
{
.dynamic-item-body
{
font-family
:
"Microsoft YaHei"
;
font-family
:
"Microsoft YaHei"
;
font-size
:
16px
;
font-size
:
16px
;
...
@@ -1127,10 +1427,12 @@ const prev = () => {
...
@@ -1127,10 +1427,12 @@ const prev = () => {
white-space
:
nowrap
;
white-space
:
nowrap
;
cursor
:
pointer
;
cursor
:
pointer
;
}
}
.dynamic-item-tags
{
.dynamic-item-tags
{
display
:
flex
;
display
:
flex
;
gap
:
8px
;
gap
:
8px
;
margin-top
:
5px
;
margin-top
:
5px
;
.tag
{
.tag
{
padding
:
2px
8px
;
padding
:
2px
8px
;
border-radius
:
4px
;
border-radius
:
4px
;
...
@@ -1138,32 +1440,55 @@ const prev = () => {
...
@@ -1138,32 +1440,55 @@ const prev = () => {
font-size
:
14px
;
font-size
:
14px
;
font-weight
:
400
;
font-weight
:
400
;
line-height
:
20px
;
line-height
:
20px
;
&
.tag-blue
{
&
.tag-blue
{
color
:
#2f79c4
;
color
:
#2f79c4
;
background
:
rgba
(
47
,
121
,
196
,
0
.1
);
background
:
rgba
(
47
,
121
,
196
,
0
.1
);
border
:
1px
solid
rgba
(
47
,
121
,
196
,
0
.3
);
border
:
1px
solid
rgba
(
47
,
121
,
196
,
0
.3
);
}
}
&
.tag-green
{
&
.tag-green
{
color
:
#52c41a
;
color
:
#52c41a
;
background
:
rgba
(
82
,
196
,
26
,
0
.1
);
background
:
rgba
(
82
,
196
,
26
,
0
.1
);
border
:
1px
solid
rgba
(
82
,
196
,
26
,
0
.3
);
border
:
1px
solid
rgba
(
82
,
196
,
26
,
0
.3
);
}
}
&
.tag-red
{
&
.tag-red
{
color
:
#fa541c
;
color
:
#fa541c
;
background
:
rgba
(
250
,
84
,
28
,
0
.1
);
background
:
rgba
(
250
,
84
,
28
,
0
.1
);
border
:
1px
solid
rgba
(
250
,
84
,
28
,
0
.3
);
border
:
1px
solid
rgba
(
250
,
84
,
28
,
0
.3
);
}
}
&
.tag-orange
{
color
:
#fa8c16
;
background
:
rgba
(
250
,
140
,
22
,
0
.1
);
border
:
1px
solid
rgba
(
250
,
140
,
22
,
0
.3
);
}
&
.tag-purple
{
color
:
#722ed1
;
background
:
rgba
(
114
,
46
,
209
,
0
.1
);
border
:
1px
solid
rgba
(
114
,
46
,
209
,
0
.3
);
}
&
.tag-cyan
{
color
:
#13c2c2
;
background
:
rgba
(
19
,
194
,
194
,
0
.1
);
border
:
1px
solid
rgba
(
19
,
194
,
194
,
0
.3
);
}
}
}
}
}
}
}
}
}
}
}
.text-item-contentOther
{
.text-item-contentOther
{
width
:
100%
;
width
:
100%
;
height
:
652px
;
height
:
652px
;
padding
:
10px
30px
22px
27px
;
padding
:
10px
30px
22px
27px
;
box-sizing
:
border-box
;
box-sizing
:
border-box
;
overflow-y
:
auto
;
overflow-y
:
auto
;
.ranking-card
{
.ranking-card
{
width
:
100%
;
width
:
100%
;
border-radius
:
10px
;
border-radius
:
10px
;
...
@@ -1171,29 +1496,36 @@ const prev = () => {
...
@@ -1171,29 +1496,36 @@ const prev = () => {
padding
:
12px
24px
;
padding
:
12px
24px
;
margin-bottom
:
12px
;
margin-bottom
:
12px
;
box-sizing
:
border-box
;
box-sizing
:
border-box
;
&
:last-child
{
&
:last-child
{
margin-bottom
:
0
;
margin-bottom
:
0
;
}
}
.ranking-header
{
.ranking-header
{
display
:
flex
;
display
:
flex
;
justify-content
:
space-between
;
justify-content
:
space-between
;
align-items
:
center
;
align-items
:
center
;
margin-bottom
:
12px
;
margin-bottom
:
12px
;
.header-left
{
.header-left
{
display
:
flex
;
display
:
flex
;
align-items
:
center
;
align-items
:
center
;
.dept-icons
{
.dept-icons
{
display
:
flex
;
display
:
flex
;
margin-right
:
12px
;
margin-right
:
12px
;
.dept-icon
{
.dept-icon
{
width
:
24px
;
width
:
24px
;
height
:
24px
;
height
:
24px
;
margin-right
:
-8px
;
// 图标叠加效果
margin-right
:
-8px
;
// 图标叠加效果
&
:last-child
{
&
:last-child
{
margin-right
:
0
;
margin-right
:
0
;
}
}
}
}
}
}
.dept-names
{
.dept-names
{
font-family
:
"Microsoft YaHei"
;
font-family
:
"Microsoft YaHei"
;
font-size
:
16px
;
font-size
:
16px
;
...
@@ -1202,6 +1534,7 @@ const prev = () => {
...
@@ -1202,6 +1534,7 @@ const prev = () => {
color
:
rgb
(
59
,
65
,
75
);
color
:
rgb
(
59
,
65
,
75
);
}
}
}
}
.header-right
{
.header-right
{
.joint-count
{
.joint-count
{
font-family
:
"Microsoft YaHei"
;
font-family
:
"Microsoft YaHei"
;
...
@@ -1212,19 +1545,23 @@ const prev = () => {
...
@@ -1212,19 +1545,23 @@ const prev = () => {
}
}
}
}
}
}
.ranking-body
{
.ranking-body
{
display
:
flex
;
display
:
flex
;
flex-direction
:
column
;
flex-direction
:
column
;
gap
:
8px
;
gap
:
8px
;
.ranking-item
{
.ranking-item
{
display
:
flex
;
display
:
flex
;
justify-content
:
space-between
;
justify-content
:
space-between
;
align-items
:
center
;
align-items
:
center
;
.item-left
{
.item-left
{
display
:
flex
;
display
:
flex
;
align-items
:
center
;
align-items
:
center
;
flex
:
1
;
flex
:
1
;
overflow
:
hidden
;
overflow
:
hidden
;
.item-type
{
.item-type
{
padding
:
2px
8px
;
padding
:
2px
8px
;
border-radius
:
4px
;
border-radius
:
4px
;
...
@@ -1233,17 +1570,22 @@ const prev = () => {
...
@@ -1233,17 +1570,22 @@ const prev = () => {
font-weight
:
400
;
font-weight
:
400
;
line-height
:
20px
;
line-height
:
20px
;
margin-right
:
13px
;
margin-right
:
13px
;
white-space
:
nowrap
;
flex-shrink
:
0
;
&
.type-bill
{
&
.type-bill
{
color
:
#2f79c4
;
color
:
#2f79c4
;
background
:
rgba
(
47
,
121
,
196
,
0
.1
);
background
:
rgba
(
47
,
121
,
196
,
0
.1
);
// border: 1px solid rgba(47, 121, 196, 0.3);
// border: 1px solid rgba(47, 121, 196, 0.3);
}
}
&
.type-order
{
&
.type-order
{
color
:
#2f79c4
;
color
:
#2f79c4
;
background
:
rgba
(
47
,
121
,
196
,
0
.1
);
background
:
rgba
(
47
,
121
,
196
,
0
.1
);
// border: 1px solid rgba(47, 121, 196, 0.3);
// border: 1px solid rgba(47, 121, 196, 0.3);
}
}
}
}
.item-title
{
.item-title
{
font-family
:
"Microsoft YaHei"
;
font-family
:
"Microsoft YaHei"
;
font-size
:
16px
;
font-size
:
16px
;
...
@@ -1256,6 +1598,7 @@ const prev = () => {
...
@@ -1256,6 +1598,7 @@ const prev = () => {
cursor
:
pointer
;
cursor
:
pointer
;
}
}
}
}
.item-date
{
.item-date
{
font-family
:
"Microsoft YaHei"
;
font-family
:
"Microsoft YaHei"
;
font-size
:
16px
;
font-size
:
16px
;
...
@@ -1269,13 +1612,19 @@ const prev = () => {
...
@@ -1269,13 +1612,19 @@ const prev = () => {
}
}
}
}
}
}
.text-item
:last-child
{
padding-bottom
:
22px
;
}
}
}
.main-bottom
{
.main-bottom
{
width
:
100%
;
width
:
100%
;
height
:
700px
;
height
:
700px
;
border-radius
:
10px
;
border-radius
:
10px
;
background-color
:
rgba
(
255
,
255
,
255
,
0
.65
);
background-color
:
rgba
(
255
,
255
,
255
,
0
.65
);
box-shadow
:
0
0
20px
rgba
(
25
,
69
,
130
,
0
.1
);
box-shadow
:
0
0
20px
rgba
(
25
,
69
,
130
,
0
.1
);
.bottom-item
{
.bottom-item
{
width
:
100%
;
width
:
100%
;
height
:
48px
;
height
:
48px
;
...
@@ -1286,14 +1635,17 @@ const prev = () => {
...
@@ -1286,14 +1635,17 @@ const prev = () => {
padding-right
:
35px
;
padding-right
:
35px
;
box-sizing
:
border-box
;
box-sizing
:
border-box
;
background
:
linear-gradient
(
180deg
,
rgba
(
231
,
243
,
255
,
1
)
0%
,
rgba
(
231
,
243
,
255
,
0
)
100%
);
background
:
linear-gradient
(
180deg
,
rgba
(
231
,
243
,
255
,
1
)
0%
,
rgba
(
231
,
243
,
255
,
0
)
100%
);
.bottom-item-title
{
.bottom-item-title
{
display
:
flex
;
display
:
flex
;
align-items
:
center
;
align-items
:
center
;
img
{
img
{
width
:
18px
;
width
:
18px
;
height
:
18px
;
height
:
18px
;
margin-right
:
14px
;
margin-right
:
14px
;
}
}
span
{
span
{
font-family
:
YouSheBiaoTiHei
;
font-family
:
YouSheBiaoTiHei
;
font-size
:
24px
;
font-size
:
24px
;
...
@@ -1302,11 +1654,13 @@ const prev = () => {
...
@@ -1302,11 +1654,13 @@ const prev = () => {
color
:
rgb
(
5
,
95
,
194
);
color
:
rgb
(
5
,
95
,
194
);
}
}
}
}
.bottom-item-select
{
.bottom-item-select
{
display
:
flex
;
display
:
flex
;
height
:
48px
;
height
:
48px
;
align-items
:
end
;
align-items
:
end
;
gap
:
8px
;
gap
:
8px
;
.select-btn
{
.select-btn
{
padding
:
4px
16px
;
padding
:
4px
16px
;
border-radius
:
4px
;
border-radius
:
4px
;
...
@@ -1318,6 +1672,7 @@ const prev = () => {
...
@@ -1318,6 +1672,7 @@ const prev = () => {
color
:
rgb
(
95
,
101
,
108
);
color
:
rgb
(
95
,
101
,
108
);
cursor
:
pointer
;
cursor
:
pointer
;
background-color
:
#fff
;
background-color
:
#fff
;
// transition: all 0.3s;
// transition: all 0.3s;
&
.active
{
&
.active
{
color
:
rgb
(
5
,
95
,
194
);
color
:
rgb
(
5
,
95
,
194
);
...
@@ -1325,8 +1680,10 @@ const prev = () => {
...
@@ -1325,8 +1680,10 @@ const prev = () => {
background-color
:
rgba
(
231
,
243
,
255
,
1
);
background-color
:
rgba
(
231
,
243
,
255
,
1
);
}
}
}
}
.field-select
{
.field-select
{
width
:
160px
;
width
:
160px
;
:deep
(
.el-input
)
{
:deep
(
.el-input
)
{
.el-input__wrapper
{
.el-input__wrapper
{
height
:
32px
;
height
:
32px
;
...
@@ -1334,6 +1691,7 @@ const prev = () => {
...
@@ -1334,6 +1691,7 @@ const prev = () => {
box-sizing
:
border-box
;
box-sizing
:
border-box
;
background-color
:
transparent
;
background-color
:
transparent
;
border-radius
:
4px
;
border-radius
:
4px
;
.el-input__inner
{
.el-input__inner
{
height
:
32px
;
height
:
32px
;
line-height
:
32px
;
line-height
:
32px
;
...
@@ -1341,6 +1699,7 @@ const prev = () => {
...
@@ -1341,6 +1699,7 @@ const prev = () => {
font-size
:
16px
;
font-size
:
16px
;
font-weight
:
400
;
font-weight
:
400
;
color
:
rgb
(
95
,
101
,
108
);
color
:
rgb
(
95
,
101
,
108
);
&
:
:
placeholder
{
&
:
:
placeholder
{
color
:
rgb
(
95
,
101
,
108
);
color
:
rgb
(
95
,
101
,
108
);
}
}
...
@@ -1350,11 +1709,13 @@ const prev = () => {
...
@@ -1350,11 +1709,13 @@ const prev = () => {
}
}
}
}
}
}
.bottom-content
{
.bottom-content
{
width
:
100%
;
width
:
100%
;
height
:
calc
(
100%
-
48px
);
height
:
calc
(
100%
-
48px
);
padding
:
14px
23px
19px
23px
;
padding
:
14px
23px
19px
23px
;
box-sizing
:
border-box
;
box-sizing
:
border-box
;
.timeline-container
{
.timeline-container
{
width
:
100%
;
width
:
100%
;
height
:
100%
;
height
:
100%
;
...
@@ -1367,12 +1728,14 @@ const prev = () => {
...
@@ -1367,12 +1728,14 @@ const prev = () => {
.timeline-list
{
.timeline-list
{
flex
:
1
;
flex
:
1
;
overflow
-y
:
auto
;
overflow
:
auto
;
padding-right
:
8px
;
padding-right
:
8px
;
padding-bottom
:
8px
;
padding-bottom
:
8px
;
.dept-row
{
.dept-row
{
display
:
flex
;
display
:
flex
;
margin-bottom
:
8px
;
margin-bottom
:
8px
;
&
:last-child
{
&
:last-child
{
margin-bottom
:
0
;
margin-bottom
:
0
;
}
}
...
@@ -1403,6 +1766,7 @@ const prev = () => {
...
@@ -1403,6 +1766,7 @@ const prev = () => {
color
:
rgb
(
59
,
65
,
75
);
color
:
rgb
(
59
,
65
,
75
);
line-height
:
24px
;
line-height
:
24px
;
}
}
.dept-count
{
.dept-count
{
font-family
:
"Microsoft YaHei"
;
font-family
:
"Microsoft YaHei"
;
font-size
:
16px
;
font-size
:
16px
;
...
@@ -1419,11 +1783,27 @@ const prev = () => {
...
@@ -1419,11 +1783,27 @@ const prev = () => {
align-items
:
center
;
align-items
:
center
;
gap
:
8px
;
gap
:
8px
;
overflow-x
:
auto
;
overflow-x
:
auto
;
// 隐藏滚动条
// 启用滚动条
&
:
:-
webkit-scrollbar
{
&
:
:-
webkit-scrollbar
{
display
:
none
;
height
:
6px
;
/* 横向滚动条高度 */
display
:
block
;
}
}
&
:
:-
webkit-scrollbar-thumb
{
background
:
rgba
(
0
,
0
,
0
,
0
.2
);
border-radius
:
3px
;
}
&
:
:-
webkit-scrollbar-track
{
background
:
transparent
;
}
scrollbar-width
:
thin
;
scrollbar-color
:
rgba
(
0
,
0
,
0
,
0
.2
)
transparent
;
padding-bottom
:
4px
;
// 给滚动条留出空间
.event-card
{
.event-card
{
min-width
:
240px
;
min-width
:
240px
;
max-width
:
240px
;
max-width
:
240px
;
...
@@ -1444,14 +1824,38 @@ const prev = () => {
...
@@ -1444,14 +1824,38 @@ const prev = () => {
left
:
0
;
left
:
0
;
width
:
100%
;
width
:
100%
;
height
:
3px
;
height
:
3px
;
&
.line-blue
{
background-color
:
#2f79c4
;
}
&
.line-green
{
background-color
:
rgb
(
33
,
129
,
57
);
}
&
.line-blue
{
&
.line-red
{
background-color
:
rgb
(
206
,
79
,
81
);
}
background-color
:
#2f79c4
;
&
.line-orange
{
background-color
:
#fa8c16
;
}
}
&
.line-yellow
{
background-color
:
rgb
(
232
,
189
,
11
);
}
&
.line-purple
{
background-color
:
#722ed1
;
}
&
.line-green
{
&
.line-cyan
{
background-color
:
#13c2c2
;
}
background-color
:
rgb
(
33
,
129
,
57
);
&
.line-default
{
background-color
:
rgb
(
234
,
236
,
238
);
}
}
&
.line-red
{
background-color
:
rgb
(
206
,
79
,
81
);
}
&
.line-orange
{
background-color
:
#fa8c16
;
}
&
.line-yellow
{
background-color
:
rgb
(
232
,
189
,
11
);
}
&
.line-purple
{
background-color
:
#722ed1
;
}
&
.line-cyan
{
background-color
:
#13c2c2
;
}
&
.line-default
{
background-color
:
rgb
(
234
,
236
,
238
);
}
}
}
.event-header
{
.event-header
{
...
@@ -1484,9 +1888,11 @@ const prev = () => {
...
@@ -1484,9 +1888,11 @@ const prev = () => {
&
.green.active
{
&
.green.active
{
background-color
:
rgb
(
33
,
129
,
57
);
background-color
:
rgb
(
33
,
129
,
57
);
}
}
&
.yellow.active
{
&
.yellow.active
{
background-color
:
rgb
(
232
,
189
,
11
);
background-color
:
rgb
(
232
,
189
,
11
);
}
}
&
.red.active
{
&
.red.active
{
background-color
:
rgb
(
206
,
79
,
81
);
background-color
:
rgb
(
206
,
79
,
81
);
}
}
...
@@ -1500,6 +1906,8 @@ const prev = () => {
...
@@ -1500,6 +1906,8 @@ const prev = () => {
font-weight
:
400
;
font-weight
:
400
;
color
:
rgb
(
59
,
65
,
75
);
color
:
rgb
(
59
,
65
,
75
);
line-height
:
24px
;
line-height
:
24px
;
min-height
:
48px
;
// 强制最小高度为两行 (24px * 2)
height
:
48px
;
// 固定高度为两行
// margin-bottom: auto;
// margin-bottom: auto;
display
:
-
webkit-box
;
display
:
-
webkit-box
;
-webkit-line-clamp
:
2
;
-webkit-line-clamp
:
2
;
...
@@ -1510,43 +1918,52 @@ const prev = () => {
...
@@ -1510,43 +1918,52 @@ const prev = () => {
.event-tags
{
.event-tags
{
display
:
flex
;
display
:
flex
;
gap
:
8px
;
gap
:
8px
;
flex-wrap
:
wrap
;
margin-top
:
4px
;
margin-top
:
4px
;
white-space
:
nowrap
;
.tag
{
.tag
{
padding
:
2px
8px
;
padding
:
0
8px
;
height
:
22px
;
line-height
:
20px
;
border-radius
:
4px
;
border-radius
:
4px
;
font-size
:
14px
;
font-size
:
14px
;
font-weight
:
400
;
font-weight
:
400
;
font-family
:
"Microsoft YaHei"
;
font-family
:
"Microsoft YaHei"
;
line-height
:
20px
;
border
:
1px
solid
;
border
:
1px
solid
;
flex-shrink
:
0
;
display
:
flex
;
align-items
:
center
;
&
.tag-blue
{
&
.tag-blue
{
color
:
rgba
(
9
,
88
,
217
,
1
);
color
:
rgba
(
9
,
88
,
217
,
1
);
background
:
rgba
(
230
,
244
,
255
,
1
);
background
:
rgba
(
230
,
244
,
255
,
1
);
border-color
:
rgba
(
186
,
224
,
255
,
1
);
border-color
:
rgba
(
186
,
224
,
255
,
1
);
}
}
&
.tag-green
{
&
.tag-green
{
color
:
rgba
(
56
,
158
,
13
,
1
);
color
:
rgba
(
56
,
158
,
13
,
1
);
background
:
rgba
(
246
,
255
,
237
,
1
);
background
:
rgba
(
246
,
255
,
237
,
1
);
border-color
:
rgba
(
217
,
247
,
190
,
1
);
border-color
:
rgba
(
217
,
247
,
190
,
1
);
}
}
&
.tag-red
{
&
.tag-red
{
color
:
rgba
(
245
,
34
,
45
,
1
);
color
:
rgba
(
245
,
34
,
45
,
1
);
background
:
rgba
(
255
,
241
,
240
,
1
);
background
:
rgba
(
255
,
241
,
240
,
1
);
border-color
:
rgba
(
255
,
163
,
158
,
1
);
border-color
:
rgba
(
255
,
163
,
158
,
1
);
}
}
&
.tag-orange
{
&
.tag-orange
{
color
:
rgba
(
250
,
140
,
22
,
1
);
color
:
rgba
(
250
,
140
,
22
,
1
);
background
:
rgba
(
255
,
247
,
230
,
1
);
background
:
rgba
(
255
,
247
,
230
,
1
);
border-color
:
rgba
(
255
,
213
,
145
,
1
);
border-color
:
rgba
(
255
,
213
,
145
,
1
);
}
}
&
.tag-purple
{
&
.tag-purple
{
color
:
rgba
(
114
,
46
,
209
,
1
);
color
:
rgba
(
114
,
46
,
209
,
1
);
background
:
rgba
(
249
,
240
,
255
,
1
);
background
:
rgba
(
249
,
240
,
255
,
1
);
border-color
:
rgba
(
211
,
173
,
247
,
1
);
border-color
:
rgba
(
211
,
173
,
247
,
1
);
}
}
&
.tag-cyan
{
&
.tag-cyan
{
color
:
rgba
(
19
,
194
,
194
,
1
);
color
:
rgba
(
19
,
194
,
194
,
1
);
background
:
rgba
(
230
,
255
,
251
,
1
);
background
:
rgba
(
230
,
255
,
251
,
1
);
...
@@ -1563,10 +1980,12 @@ const prev = () => {
...
@@ -1563,10 +1980,12 @@ const prev = () => {
width
:
100%
;
width
:
100%
;
height
:
552px
;
height
:
552px
;
overflow-y
:
auto
;
overflow-y
:
auto
;
&
:
:-
webkit-scrollbar
{
&
:
:-
webkit-scrollbar
{
display
:
none
;
display
:
none
;
}
}
}
}
.timelineBar
{
.timelineBar
{
width
:
100%
;
width
:
100%
;
height
:
51px
;
height
:
51px
;
...
@@ -1592,6 +2011,7 @@ const prev = () => {
...
@@ -1592,6 +2011,7 @@ const prev = () => {
line-height
:
30px
!
important
;
line-height
:
30px
!
important
;
color
:
#fff
!
important
;
color
:
#fff
!
important
;
border
:
none
!
important
;
border
:
none
!
important
;
.
el-popper__arrow
:
:
before
{
.
el-popper__arrow
:
:
before
{
background-color
:
rgb
(
59
,
65
,
75
)
!
important
;
background-color
:
rgb
(
59
,
65
,
75
)
!
important
;
border-color
:
rgb
(
59
,
65
,
75
)
!
important
;
border-color
:
rgb
(
59
,
65
,
75
)
!
important
;
...
...
src/views/ZMOverView/components/gameProfile/Timeline.vue
浏览文件 @
6de917f9
...
@@ -5,7 +5,7 @@
...
@@ -5,7 +5,7 @@
<div
class=
"timeline-box"
>
<div
class=
"timeline-box"
>
<div
class=
"line"
style=
"width:100vw ;"
/>
<div
class=
"line"
style=
"width:100vw ;"
/>
<!-- 一次性渲染全部节点 -->
<!-- 一次性渲染全部节点 -->
<div
v-for=
"(item, i) in
data
"
:key=
"item[idKey]"
class=
"node"
:style=
"leftStyle(i)"
>
<div
v-for=
"(item, i) in
showList
"
:key=
"item[idKey]"
class=
"node"
:style=
"leftStyle(i)"
>
<!-- 圆环 -->
<!-- 圆环 -->
<div
class=
"dot"
:class=
"linePos(item)"
:style=
"
{ '--i': item.unit === '中国' ? ' #E29697' : '#69A0DA' }" />
<div
class=
"dot"
:class=
"linePos(item)"
:style=
"
{ '--i': item.unit === '中国' ? ' #E29697' : '#69A0DA' }" />
...
@@ -22,20 +22,21 @@
...
@@ -22,20 +22,21 @@
<!-- 卡片 -->
<!-- 卡片 -->
<div
class=
"card"
:class=
"[cardPos(item), 'right-side']"
@
click=
"$emit('click-card', item)"
>
<div
class=
"card"
:class=
"[cardPos(item), 'right-side']"
@
click=
"$emit('click-card', item)"
>
<div
style=
"justify-content: space-between;display: flex;width: 300px;"
>
<div
style=
"justify-content: space-between;display: flex;width: 300px;"
>
<div
class=
"tag"
>
{{
item
.
tag
}}
</div>
<div
class=
"tag"
>
{{
item
.
eventStrategy
}}
</div>
<img
:src=
"`/icon/$
{item.unit}.png`" class="icon">
</img>
<img
:src=
"item.eventCountryImg"
class=
"icon"
style=
"border-radius: 14px;height: 28px;width: 28px;;"
></img>
</div>
</div>
<div
class=
"title"
:style=
"
{
<div
class=
"title"
:style=
"
{
}">
{{
item
.
titl
e
}}
</div>
}">
{{
item
.
eventNam
e
}}
</div>
<div
class=
"time"
>
{{
item
.
tim
e
}}
</div>
<div
class=
"time"
>
{{
item
.
eventDat
e
}}
</div>
<!--
<div
class=
"title"
:style=
"
{
<!--
<div
class=
"title"
:style=
"
{
color: item.unit === '中国' ? ' #CF4F51' : ''
color: item.unit === '中国' ? ' #CF4F51' : ''
}">
{{
item
.
title
}}
</div>
}">
{{
item
.
title
}}
</div>
<div
class=
"time"
>
{{
item
.
time
}}
</div>
-->
<div
class=
"time"
>
{{
item
.
time
}}
</div>
-->
<div
class=
"content"
>
{{
item
.
content
}}
</div>
<div
class=
"content"
>
{{
item
.
eventDesc
}}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
...
@@ -85,7 +86,7 @@ export default {
...
@@ -85,7 +86,7 @@ export default {
},
},
/* 卡片上下位置:unit=0 -> 下侧,其余 -> 上侧 */
/* 卡片上下位置:unit=0 -> 下侧,其余 -> 上侧 */
cardPos
(
item
)
{
cardPos
(
item
)
{
return
item
.
unit
===
'中国
'
?
'down'
:
'up'
;
return
item
.
eventType
===
'反制措施
'
?
'down'
:
'up'
;
},
},
/* 延伸线方向 = 卡片方向 */
/* 延伸线方向 = 卡片方向 */
linePos
(
item
)
{
linePos
(
item
)
{
...
@@ -278,7 +279,7 @@ export default {
...
@@ -278,7 +279,7 @@ export default {
width
:
120px
;
width
:
120px
;
height
:
28px
;
height
:
28px
;
/* 自动布局 */
/* 自动布局 */
display
:
flex
;
/* display: flex; */
flex-direction
:
row
;
flex-direction
:
row
;
justify-content
:
flex-start
;
justify-content
:
flex-start
;
align-items
:
flex-start
;
align-items
:
flex-start
;
...
@@ -303,7 +304,7 @@ export default {
...
@@ -303,7 +304,7 @@ export default {
width
:
120px
;
width
:
120px
;
height
:
28px
;
height
:
28px
;
/* 自动布局 */
/* 自动布局 */
display
:
flex
;
/* display: flex; */
flex-direction
:
row
;
flex-direction
:
row
;
justify-content
:
flex-start
;
justify-content
:
flex-start
;
align-items
:
flex-start
;
align-items
:
flex-start
;
...
@@ -346,5 +347,23 @@ export default {
...
@@ -346,5 +347,23 @@ export default {
line-height
:
24px
;
line-height
:
24px
;
letter-spacing
:
0px
;
letter-spacing
:
0px
;
text-align
:
justify
;
text-align
:
justify
;
width
:
300px
;
/* 设置一个固定的宽度 */
height
:
100px
;
/* 设置一个固定的高度,确保只显示 5 行 */
font-size
:
16px
;
/* 设置字体大小 */
line-height
:
20px
;
/* 设置行高 */
overflow
:
hidden
;
/* 隐藏超出部分 */
display
:
-webkit-box
;
/* 使用 Webkit 的 box 模型 */
-webkit-line-clamp
:
3
;
/* 限制为 5 行 */
-webkit-box-orient
:
vertical
;
/* 垂直排列内容 */
text-overflow
:
ellipsis
;
/* 超出部分显示省略号 */
}
}
</
style
>
</
style
>
\ No newline at end of file
src/views/ZMOverView/components/gameProfile/index.vue
浏览文件 @
6de917f9
...
@@ -8,11 +8,13 @@
...
@@ -8,11 +8,13 @@
</div>
</div>
<div
style=
"display: flex; height: 650px; width: 100%"
>
<div
style=
"display: flex; height: 650px; width: 100%"
>
<div
style=
"width: 50%"
>
<div
style=
"width: 50%"
>
<div
style=
"display: flex; justify-content: space-between; margin-right: 50px; line-height: 32px;align-items: center;"
>
<div
style=
"display: flex; justify-content: space-between; margin-right: 50px; line-height: 32px;align-items: center;"
>
<div
style=
"display: flex; margin-left: 50px"
>
<div
style=
"display: flex; margin-left: 50px"
>
数据来源:
数据来源:
<el-select
class=
"select-item"
size=
"default"
style=
"margin-left: 15px; width: 240px; height: 32px"
>
<el-select
class=
"select-item"
size=
"default"
style=
"margin-left: 15px; width: 240px; height: 32px"
<el-option
label=
"国家创新指数报告"
value=
"last_year"
/>
v-model=
"origin"
@
change=
"handleGetCompare()"
>
<el-option
:value=
"value.id"
:label=
"value.name"
v-for=
"value in originList"
/>
</el-select>
</el-select>
</div>
</div>
<div
style=
"display: flex"
>
<div
style=
"display: flex"
>
...
@@ -25,21 +27,21 @@
...
@@ -25,21 +27,21 @@
<div
style=
"width: 672px; height: 486px; padding-top: 50px"
id=
"char"
></div>
<div
style=
"width: 672px; height: 486px; padding-top: 50px"
id=
"char"
></div>
</div>
</div>
<div
style=
"width: 50%"
>
<div
style=
"width: 50%
; height: 620px;overflow: auto;
"
>
<el-table
:data=
"tableData"
style=
"width: 100%; margin-bottom: 20px"
row-key=
"id"
border
default-expand-all
>
<el-table
:data=
"tableData"
style=
"width: 100%; margin-bottom: 20px"
row-key=
"id"
border
default-expand-all
>
<el-table-column
prop=
"
n
ame"
label=
"指标名称"
sortable
width=
"350"
/>
<el-table-column
prop=
"
targetN
ame"
label=
"指标名称"
sortable
width=
"350"
/>
<el-table-column
prop=
"
percent
"
label=
"中国"
>
<el-table-column
prop=
"
chinaScore
"
label=
"中国"
>
<template
#
default=
"scope"
>
<template
#
default=
"scope"
>
<div
class=
"progress-wrapper left"
:style=
"
{ '--i': '40px', '--j': '-20px', marginLeft: '20px' }">
<div
class=
"progress-wrapper left"
:style=
"
{ '--i': '40px', '--j': '-20px', marginLeft: '20px' }">
<el-progress
:percentage=
"scope.row.
percent[0]
"
:stroke-width=
"20"
class=
"left-progress"
<el-progress
:percentage=
"scope.row.
chinaScore
"
:stroke-width=
"20"
class=
"left-progress"
:show-text=
"false"
/>
:show-text=
"false"
/>
</div>
</div>
</
template
>
</
template
>
</el-table-column>
</el-table-column>
<el-table-column
prop=
"
percent
"
label=
"美国"
>
<el-table-column
prop=
"
usScore
"
label=
"美国"
>
<
template
#
default=
"scope"
>
<
template
#
default=
"scope"
>
<div
class=
"progress-wrapper right"
:style=
"
{ '--i': '40px', marginRight: '20px' }">
<div
class=
"progress-wrapper right"
:style=
"
{ '--i': '40px', marginRight: '20px' }">
<el-progress
:percentage=
"scope.row.
percent[0]
"
:stroke-width=
"20"
class=
"right-progress"
<el-progress
:percentage=
"scope.row.
usScore
"
:stroke-width=
"20"
class=
"right-progress"
:show-text=
"false"
/>
:show-text=
"false"
/>
</div>
</div>
</
template
>
</
template
>
...
@@ -63,7 +65,8 @@
...
@@ -63,7 +65,8 @@
}"
>
}"
>
<img
:src=
"`/public/icon/ZM/btn-icon-${index}.png`"
style=
"width: 22px; height: 19px; margin: 0 22px"
/>
<img
:src=
"`/public/icon/ZM/btn-icon-${index}.png`"
style=
"width: 22px; height: 19px; margin: 0 22px"
/>
{{ value.text }}
{{ value.text }}
<img
:src=
"`/public/icon/ZM/btn-icon-arrow.png`"
style=
"margin-left: auto; margin-right: 22px; width: 13px; height: 12px"
/>
<img
:src=
"`/public/icon/ZM/btn-icon-arrow.png`"
style=
"margin-left: auto; margin-right: 22px; width: 13px; height: 12px"
/>
</div>
</div>
</div>
</div>
</div>
</div>
...
@@ -74,7 +77,10 @@ import { onMounted, ref, computed } from "vue";
...
@@ -74,7 +77,10 @@ import { onMounted, ref, computed } from "vue";
import
*
as
echarts
from
"echarts"
;
import
*
as
echarts
from
"echarts"
;
import
Timeline
from
"./Timeline.vue"
;
import
Timeline
from
"./Timeline.vue"
;
import
tableShow
from
"./tableShow.vue"
;
import
tableShow
from
"./tableShow.vue"
;
import
radarChart
from
"./radarChart3.js"
;
import
radarChart
from
"./radarChart3.js"
;
import
{
getCompare
,
getChartDict
,
getTechnologyGameAnalysis
}
from
'@/api/zmOverview/risk/index.js'
const
course
=
ref
([
const
course
=
ref
([
{
{
time
:
"2025-01-15"
,
time
:
"2025-01-15"
,
...
@@ -129,22 +135,86 @@ const course = ref([
...
@@ -129,22 +135,86 @@ const course = ref([
}
}
]);
]);
onMounted
(()
=>
{
const
originList
=
ref
([])
const
origin
=
ref
(
''
)
//数据来源
const
handleGetChartDict
=
async
()
=>
{
try
{
const
res
=
await
getChartDict
();
console
.
log
(
"数据来源"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
originList
.
value
=
res
.
data
origin
.
value
=
res
.
data
[
0
].
id
}
}
catch
(
error
)
{
console
.
error
(
"获取数据来源error"
,
error
);
}
};
//中美科技实力对比
const
handleGetCompare
=
async
()
=>
{
try
{
const
res
=
await
getCompare
(
origin
.
value
);
console
.
log
(
"中美科技实力对比"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
tableData
.
value
=
res
.
data
const
secondLevelData
=
res
.
data
[
0
].
children
;
const
indicatorNames
=
secondLevelData
.
map
(
item
=>
item
.
targetName
);
const
chinaScores
=
secondLevelData
.
map
(
item
=>
item
.
chinaScore
);
const
usScores
=
secondLevelData
.
map
(
item
=>
item
.
usScore
);
const
dom
=
document
.
getElementById
(
"char"
);
const
dom
=
document
.
getElementById
(
"char"
);
const
myChart
=
echarts
.
init
(
dom
);
const
myChart
=
echarts
.
init
(
dom
);
const
radarOption
=
{
// 2. 传入容器,生成配置
indicatorNames
:
indicatorNames
,
const
option
=
radarChart
(
data
:
[
[
"创新资源"
,
"知识创造"
,
"企业创新"
,
"创新绩效"
,
"创新环境"
],
chinaScores
,
[
usScores
[
4200
,
3000
,
20000
,
35000
,
50000
,
18000
],
[
1000
,
42000
,
32000
,
35000
,
50000
,
18000
]
]
]
};
const
option
=
radarChart
(
radarOption
.
indicatorNames
,
radarOption
.
data
);
);
myChart
.
setOption
(
option
);
myChart
.
setOption
(
option
);
console
.
log
(
radarOption
)
}
}
catch
(
error
)
{
console
.
error
(
"获取中美科技实力对比error"
,
error
);
}
};
//中美博弈概览V2:领域打压遏制时间线
const
handlegetTechnologyGameAnalysis
=
async
()
=>
{
try
{
const
res
=
await
getTechnologyGameAnalysis
();
console
.
log
(
"中美科技博弈分析"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
course
.
value
=
res
.
data
}
}
catch
(
error
)
{
console
.
error
(
"获取中美科技博弈分析error"
,
error
);
}
};
onMounted
(
async
()
=>
{
await
handleGetChartDict
()
await
handleGetCompare
()
await
handlegetTechnologyGameAnalysis
()
// const dom = document.getElementById("char");
// const myChart = echarts.init(dom);
// // 2. 传入容器,生成配置
// const option = radarChart(
// ["创新资源", "知识创造", "企业创新", "创新绩效", "创新环境"],
// [
// [4200, 3000, 20000, 35000, 50000, 18000],
// [1000, 42000, 32000, 35000, 50000, 18000]
// ]
// );
// setChart(option, "char7");
// myChart.setOption(option);
// // setChart(option, "char7");
});
});
const
tableData
=
ref
([
const
tableData
=
ref
([
...
@@ -266,6 +336,7 @@ const btnList = ref([
...
@@ -266,6 +336,7 @@ const btnList = ref([
width
:
1600px
;
width
:
1600px
;
height
:
1600px
;
height
:
1600px
;
margin
:
0
auto
;
margin
:
0
auto
;
.card-box
{
.card-box
{
width
:
1600px
;
width
:
1600px
;
height
:
700px
;
height
:
700px
;
...
...
src/views/ZMOverView/components/newRisk/WaveBall.vue
浏览文件 @
6de917f9
...
@@ -34,7 +34,7 @@ let instance = null
...
@@ -34,7 +34,7 @@ let instance = null
/* 配置项 */
/* 配置项 */
const
makeOption
=
()
=>
{
const
makeOption
=
()
=>
{
const
p
=
Math
.
min
(
100
,
Math
.
max
(
0
,
props
.
percent
))
/
100
const
p
=
Math
.
min
(
100
,
Math
.
max
(
0
,
props
.
percent
))
/
100
console
.
log
(
props
.
color
,
'colorcolorcolor'
)
// console.log(props
, 'colorcolorcolor')
return
{
return
{
series
:
[{
series
:
[{
type
:
'liquidFill'
,
type
:
'liquidFill'
,
...
@@ -73,8 +73,8 @@ const makeOption = () => {
...
@@ -73,8 +73,8 @@ const makeOption = () => {
formatter
:
function
()
{
formatter
:
function
()
{
const
change
=
props
.
data
.
change
;
const
change
=
props
.
data
.
change
;
const
unit
=
props
.
data
.
unit
;
const
unit
=
props
.
data
.
unit
;
if
(
change
===
'无新增'
)
{
if
(
change
===
0
)
{
return
`{n
oChange|
${
change
}
}\n{b|共
${
props
.
data
.
count
}${
unit
}
}`
return
`{n
um|
${
'无新增'
}
}`
}
}
return
`{num|
${
change
}
}{unit|
${
unit
}
}\n{b|共
${
props
.
data
.
count
}${
unit
}
}`
return
`{num|
${
change
}
}{unit|
${
unit
}
}\n{b|共
${
props
.
data
.
count
}${
unit
}
}`
},
},
...
...
src/views/ZMOverView/components/newRisk/index.vue
浏览文件 @
6de917f9
...
@@ -23,7 +23,7 @@
...
@@ -23,7 +23,7 @@
{{
sections
[
index
].
title
}}
{{
sections
[
index
].
title
}}
</div>
</div>
<div
style=
"width: 50px; color: #ffffff"
>
<div
style=
"width: 50px; color: #ffffff"
>
{{
sections
[
index
].
date
}}
{{
sections
[
index
].
date
.
slice
(
-
5
)
}}
</div>
</div>
</div>
</div>
</div>
</div>
...
@@ -33,7 +33,7 @@
...
@@ -33,7 +33,7 @@
<img
class=
"section-title"
src=
"./icon/title-icon-2.png"
/>
<img
class=
"section-title"
src=
"./icon/title-icon-2.png"
/>
<div>
风险信号
</div>
<div>
风险信号
</div>
<div
class=
"num"
>
12
</div>
<div
class=
"num"
>
{{
riskTotal
}}
</div>
<div
class=
"manage-btn"
@
click=
"handleToRiskManage"
>
<div
class=
"manage-btn"
@
click=
"handleToRiskManage"
>
风险信号管理 >
风险信号管理 >
</div>
</div>
...
@@ -74,22 +74,22 @@
...
@@ -74,22 +74,22 @@
<div
class=
"carousel-title"
>
<div
class=
"carousel-title"
>
<div>
<div>
<div
class=
"title-text"
>
<div
class=
"title-text"
>
{{
News
.
t
itle
}}
{{
News
.
hotspotT
itle
}}
</div>
</div>
<div
class=
"title-tag"
>
<div
class=
"title-tag"
>
{{
News
.
category
}}
{{
News
.
hotspotType
}}
</div>
</div>
</div>
</div>
<img
src=
"./icon/矩形 295.png
"
style=
"width: 96px; height: 96px"
/>
<img
:src=
"News.hotspotPicture
"
style=
"width: 96px; height: 96px"
/>
</div>
</div>
<div
style=
"/* 矩形 351 */ width: 664px; height: 1px; background: rgba(234, 236, 238, 1)"
></div>
<div
style=
"/* 矩形 351 */ width: 664px; height: 1px; background: rgba(234, 236, 238, 1)"
></div>
<div
class=
"news-carousel-content"
>
{{
News
.
content
}}
</div>
<div
class=
"news-carousel-content"
>
{{
News
.
hotspotDesc
}}
</div>
<div
class=
"carousel-bottom"
>
<div
class=
"carousel-bottom"
>
<div
class=
"left"
>
{{
News
.
date
+
News
.
sourc
e
}}
</div>
<div
class=
"left"
>
{{
News
.
hotspotDate
+
News
.
hotspotOrgNam
e
}}
</div>
<div
class=
"right"
>
<div
class=
"right"
>
<div
v-for=
"tag in News.
tags
"
class=
"tag"
>
<div
v-for=
"tag in News.
domainList
"
class=
"tag"
>
{{
tag
}}
{{
tag
.
name
}}
</div>
</div>
</div>
</div>
</div>
</div>
...
@@ -105,9 +105,10 @@
...
@@ -105,9 +105,10 @@
<
script
setup
>
<
script
setup
>
import
{
color
}
from
"echarts"
;
import
{
color
}
from
"echarts"
;
import
{
onMounted
,
ref
,
computed
}
from
"vue"
;
import
{
onMounted
,
ref
,
computed
,
onBeforeUnmount
}
from
"vue"
;
import
WaveBall
from
"./WaveBall.vue"
;
import
WaveBall
from
"./WaveBall.vue"
;
import
{
getBillRiskSignal
}
from
"@/api/bill/billHome"
;
import
{
getBillRiskSignal
}
from
"@/api/bill/billHome"
;
import
{
getLatestRiskUpdates
,
getLatestRisks
}
from
'@/api/zmOverview/risk/index.js'
const
sectionTab
=
[
const
sectionTab
=
[
{
{
textColor
:
"rgba(9, 88, 217, 1)"
,
textColor
:
"rgba(9, 88, 217, 1)"
,
...
@@ -148,14 +149,14 @@ const sections = ref([
...
@@ -148,14 +149,14 @@ const sections = ref([
date
:
"12-18"
,
date
:
"12-18"
,
waveBall
:
[
waveBall
:
[
{
{
percent
:
3
0
,
// 估算的百分比
percent
:
0
,
// 估算的百分比
count
:
1626
,
count
:
1626
,
change
:
"+3"
,
change
:
"+3"
,
unit
:
"项"
,
unit
:
"项"
,
title
:
"法案(提出)"
title
:
"法案(提出)"
},
},
{
{
percent
:
2
0
,
// 估算的百分比
percent
:
0
,
// 估算的百分比
count
:
69
,
count
:
69
,
change
:
"+2"
,
change
:
"+2"
,
unit
:
"个"
,
unit
:
"个"
,
...
@@ -168,14 +169,14 @@ const sections = ref([
...
@@ -168,14 +169,14 @@ const sections = ref([
date
:
"12-19"
,
date
:
"12-19"
,
waveBall
:
[
waveBall
:
[
{
{
percent
:
1
0
,
// 估算的百分比
percent
:
0
,
// 估算的百分比
count
:
128
,
count
:
128
,
change
:
"+1"
,
change
:
"+1"
,
unit
:
"次"
,
unit
:
"次"
,
title
:
"实体清单"
title
:
"实体清单"
},
},
{
{
percent
:
2
0
,
// 估算的百分比
percent
:
0
,
// 估算的百分比
count
:
69
,
count
:
69
,
change
:
"+1"
,
change
:
"+1"
,
unit
:
"次"
,
unit
:
"次"
,
...
@@ -188,15 +189,15 @@ const sections = ref([
...
@@ -188,15 +189,15 @@ const sections = ref([
date
:
"12-15"
,
date
:
"12-15"
,
waveBall
:
[
waveBall
:
[
{
{
percent
:
15
,
// 估算的百分比
percent
:
0
,
// 估算的百分比
count
:
35
,
count
:
0
,
change
:
"+1"
,
change
:
"+1"
,
unit
:
"次"
,
unit
:
"次"
,
title
:
"SDN"
title
:
"SDN"
},
},
{
{
percent
:
5
,
// 估算的百分比
percent
:
0
,
// 估算的百分比
count
:
28
,
count
:
0
,
change
:
"+1"
,
change
:
"+1"
,
unit
:
"家"
,
unit
:
"家"
,
title
:
"涉军企业"
title
:
"涉军企业"
...
@@ -208,22 +209,22 @@ const sections = ref([
...
@@ -208,22 +209,22 @@ const sections = ref([
date
:
"12-15"
,
date
:
"12-15"
,
waveBall
:
[
waveBall
:
[
{
{
percent
:
3
,
// 估算的百分比
percent
:
0
,
// 估算的百分比
count
:
215
,
count
:
0
,
change
:
"+1"
,
change
:
"+1"
,
unit
:
"次"
,
unit
:
"次"
,
title
:
"337调查"
title
:
"337调查"
},
},
{
{
percent
:
3
,
// 估算的百分比
percent
:
0
,
// 估算的百分比
count
:
14
,
count
:
0
,
change
:
"无新增"
,
change
:
"无新增"
,
unit
:
"次"
,
unit
:
"次"
,
title
:
"230调查"
title
:
"230调查"
},
},
{
{
percent
:
3
,
// 估算的百分比
percent
:
0
,
// 估算的百分比
count
:
9
,
count
:
0
,
change
:
"无新增"
,
change
:
"无新增"
,
unit
:
"次"
,
unit
:
"次"
,
title
:
"301调查"
title
:
"301调查"
...
@@ -231,21 +232,117 @@ const sections = ref([
...
@@ -231,21 +232,117 @@ const sections = ref([
]
]
}
}
]);
]);
// 风险信号
const
warningList
=
ref
([]);
// 最新风险动态统计
// 获取法案风险信号
const
handleGetLatestRiskUpdates
=
async
()
=>
{
const
handlegetBillRiskSignal
=
async
()
=>
{
const
params
=
{
moduleId
:
"0100"
};
try
{
try
{
const
res
=
await
getBillRiskSignal
(
params
);
const
params
=
{
console
.
log
(
"法案风险信号"
,
res
);
currentDate
:
'本周'
if
(
res
.
code
===
200
)
{
}
warningList
.
value
=
res
.
data
;
const
res
=
await
getLatestRiskUpdates
(
params
);
console
.
log
(
"最新风险动态统计"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
sections
.
value
=
[
{
title
:
res
.
data
.
policiesRegulations
.
hotspotTitle
,
date
:
res
.
data
.
policiesRegulations
.
hotspotDate
,
waveBall
:
[
{
percent
:
30
,
// 估算的百分比
count
:
res
.
data
.
bill
.
total
,
change
:
res
.
data
.
bill
.
dailyIncrement
,
unit
:
"项"
,
title
:
"法案(提出)"
},
{
percent
:
20
,
// 估算的百分比
count
:
res
.
data
.
administrativeOrder
.
total
,
change
:
res
.
data
.
administrativeOrder
.
dailyIncrement
,
unit
:
"个"
,
title
:
"政令"
}
]
},
{
title
:
res
.
data
.
exportControl
.
hotspotTitle
,
date
:
res
.
data
.
exportControl
.
hotspotDate
,
waveBall
:
[
{
percent
:
10
,
// 估算的百分比
count
:
res
.
data
.
Entities
.
total
,
change
:
res
.
data
.
Entities
.
dailyIncrement
,
unit
:
"次"
,
title
:
"实体清单"
},
{
percent
:
20
,
// 估算的百分比
count
:
res
.
data
.
CCL
.
total
,
change
:
res
.
data
.
CCL
.
dailyIncrement
,
unit
:
"次"
,
title
:
"CCL"
}
]
},
{
title
:
res
.
data
.
investmentFinancingRestrictions
.
hotspotTitle
,
date
:
res
.
data
.
investmentFinancingRestrictions
.
hotspotDate
,
waveBall
:
[
{
percent
:
15
,
// 估算的百分比
count
:
res
.
data
.
SDN
.
total
,
change
:
res
.
data
.
SDN
.
dailyIncrement
,
unit
:
"次"
,
title
:
"SDN"
},
{
percent
:
5
,
// 估算的百分比
count
:
res
.
data
.
militaryInvolvement
.
total
,
change
:
res
.
data
.
militaryInvolvement
.
dailyIncrement
,
unit
:
"家"
,
title
:
"涉军企业"
}
]
},
{
title
:
res
.
data
.
marketAccess
.
hotspotTitle
,
date
:
res
.
data
.
marketAccess
.
hotspotDate
,
waveBall
:
[
{
percent
:
3
,
// 估算的百分比
count
:
res
.
data
[
'337Survey'
].
total
,
change
:
res
.
data
[
'337Survey'
].
dailyIncrement
,
unit
:
"次"
,
title
:
"337调查"
},
{
percent
:
3
,
// 估算的百分比
count
:
res
.
data
[
'232Survey'
].
total
,
change
:
res
.
data
[
'232Survey'
].
dailyIncrement
,
unit
:
"次"
,
title
:
"230调查"
},
{
percent
:
3
,
// 估算的百分比
count
:
res
.
data
[
'301Survey'
].
total
,
change
:
res
.
data
[
'301Survey'
].
dailyIncrement
,
unit
:
"次"
,
title
:
"301调查"
}
]
}
]
console
.
log
(
sections
.
value
,
'sections.value'
)
}
}
catch
(
error
)
{
console
.
error
(
"获取最新风险动态统计error"
,
error
);
}
}
}
catch
(
error
)
{
}
};
};
// 风险信号
const
warningList
=
ref
([]);
const
riskTotal
=
ref
(
0
)
const
hotNewsList
=
ref
([
const
hotNewsList
=
ref
([
{
{
title
:
"美国白宫发布关于进一步延长TikTok执法宽限期的行政令"
,
title
:
"美国白宫发布关于进一步延长TikTok执法宽限期的行政令"
,
...
@@ -266,6 +363,24 @@ const hotNewsList = ref([
...
@@ -266,6 +363,24 @@ const hotNewsList = ref([
tags
:
[
'人工智能'
,
'通信网络'
]
tags
:
[
'人工智能'
,
'通信网络'
]
}
}
]);
]);
//最新风险信号
const
handleGetLatestRisks
=
async
()
=>
{
try
{
const
res
=
await
getLatestRisks
();
console
.
log
(
"最新风险信号"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
warningList
.
value
=
res
.
data
.
riskVOS
hotNewsList
.
value
=
res
.
data
.
hotspotVOS
riskTotal
.
value
=
res
.
data
.
riskCount
console
.
log
(
hotNewsList
.
value
,
'hotNewsList.value'
)
}
}
catch
(
error
)
{
console
.
error
(
"获取最新风险信号error"
,
error
);
}
};
const
curNews
=
ref
({});
const
curNews
=
ref
({});
const
carouselRef
=
ref
(
null
);
const
carouselRef
=
ref
(
null
);
const
curHotNewsListIndex
=
ref
(
0
);
const
curHotNewsListIndex
=
ref
(
0
);
...
@@ -289,11 +404,16 @@ const handleSwithCurNews = name => {
...
@@ -289,11 +404,16 @@ const handleSwithCurNews = name => {
carouselRef
.
value
.
next
();
carouselRef
.
value
.
next
();
}
}
};
};
onMounted
(()
=>
{
onMounted
(
async
()
=>
{
// 这里可以添加从后端获取数据的代码
handlegetBillRiskSignal
();
await
handleGetLatestRiskUpdates
()
await
handleGetLatestRisks
()
console
.
log
(
"页面加载完成,可以获取数据了"
);
console
.
log
(
"页面加载完成,可以获取数据了"
);
});
});
// onBeforeUnmount(() => {
// andleGetLatestRiskUpdates()
// });
</
script
>
</
script
>
<
style
lang=
"scss"
scoped
>
<
style
lang=
"scss"
scoped
>
...
@@ -344,6 +464,7 @@ onMounted(() => {
...
@@ -344,6 +464,7 @@ onMounted(() => {
text-align
:
left
;
text-align
:
left
;
display
:
flex
;
display
:
flex
;
align-items
:
center
;
align-items
:
center
;
img
{
img
{
/* 矢量 347 */
/* 矢量 347 */
width
:
22px
;
width
:
22px
;
...
@@ -375,8 +496,10 @@ onMounted(() => {
...
@@ -375,8 +496,10 @@ onMounted(() => {
}
}
.manage-btn
{
.manage-btn
{
margin-left
:
auto
;
/* 推到最右侧 */
margin-left
:
auto
;
margin-right
:
16px
;
/* 适当的右边距 */
/* 推到最右侧 */
margin-right
:
16px
;
/* 适当的右边距 */
padding
:
4px
12px
;
padding
:
4px
12px
;
border-radius
:
20px
;
border-radius
:
20px
;
background-color
:
rgba
(
206
,
79
,
81
,
0
.1
);
background-color
:
rgba
(
206
,
79
,
81
,
0
.1
);
...
@@ -430,7 +553,7 @@ onMounted(() => {
...
@@ -430,7 +553,7 @@ onMounted(() => {
font-style
:
Bold
;
font-style
:
Bold
;
font-size
:
20px
;
font-size
:
20px
;
font-weight
:
700
;
font-weight
:
700
;
line-height
:
26px
;
//
line-height: 26px;
letter-spacing
:
0px
;
letter-spacing
:
0px
;
text-align
:
center
;
text-align
:
center
;
display
:
flex
;
display
:
flex
;
...
...
src/views/exportControl/analysis/components/influencePanel1.vue
浏览文件 @
6de917f9
...
@@ -9,7 +9,7 @@
...
@@ -9,7 +9,7 @@
</
template
>
</
template
>
<div
class=
"tableWrap"
>
<div
class=
"tableWrap"
>
<el-table
<el-table
:data=
"panel5
Mock
Data"
:data=
"panel5Data"
class=
"sanction-table"
class=
"sanction-table"
stripe
stripe
empty-text=
"暂无数据"
empty-text=
"暂无数据"
...
@@ -116,6 +116,7 @@ const selectedId = ref(selectOptions[0].value);
...
@@ -116,6 +116,7 @@ const selectedId = ref(selectOptions[0].value);
const
indexMethod
=
index
=>
{
const
indexMethod
=
index
=>
{
return
index
+
1
;
return
index
+
1
;
};
};
const
panel5Data
=
ref
([]);
const
panel5MockData
=
[
const
panel5MockData
=
[
{
{
name
:
"科大讯飞股份有限公司"
,
name
:
"科大讯飞股份有限公司"
,
...
@@ -283,6 +284,20 @@ const fetchOriginCountData = async () => {
...
@@ -283,6 +284,20 @@ const fetchOriginCountData = async () => {
}
}
};
};
const
fetchScientificImpactEntityList
=
async
()
=>
{
try
{
const
data
=
await
getScientificImpactEntityList
(
router
.
query
.
startTime
);
if
(
data
&&
Array
.
isArray
(
data
))
{
panel5Data
.
value
=
data
.
map
(
item
=>
({
name
:
item
.
name
,
number
:
item
.
count
}));
}
}
catch
(
error
)
{
console
.
error
(
"获取影响实体分析数据失败:"
,
error
);
}
};
onMounted
(
async
()
=>
{
onMounted
(
async
()
=>
{
// horizontalBarOptions.value = getHorizontalBarChart1(
// horizontalBarOptions.value = getHorizontalBarChart1(
// ["地球探测仪器", "计算机及其配套设备", "天文仪器", "分析仪器", "核仪器", "物理性能测试仪器", "医学科研仪器"],
// ["地球探测仪器", "计算机及其配套设备", "天文仪器", "分析仪器", "核仪器", "物理性能测试仪器", "医学科研仪器"],
...
@@ -316,6 +331,8 @@ onMounted(async () => {
...
@@ -316,6 +331,8 @@ onMounted(async () => {
// { name: "核仪器", value: [48, 38, 28, 28, 28, 18, 18, 18, 28, 28] }
// { name: "核仪器", value: [48, 38, 28, 28, 28, 18, 18, 18, 28, 28] }
// ]
// ]
// });
// });
// 科研机构
await
fetchScientificImpactEntityList
();
// 获取各类别仪器对美依赖情况数据
// 获取各类别仪器对美依赖情况数据
await
fetchDependencyCountData
();
await
fetchDependencyCountData
();
// 获取仪器进口国可替代性分析数据
// 获取仪器进口国可替代性分析数据
...
...
src/views/exportControl/analysis/content/overview.vue
浏览文件 @
6de917f9
...
@@ -88,13 +88,9 @@
...
@@ -88,13 +88,9 @@
<div
class=
"hintWrap"
>
<div
class=
"hintWrap"
>
<div
class=
"title"
>
<div
class=
"title"
>
共计
共计
<span
class=
"text1"
>
{{ entit
yTotal
}}
</span>
<span
class=
"text1"
>
{{ entit
iesCountBy50PercentRules?.totalCount
}}
</span>
家,其中50%规则涉及
家,其中50%规则涉及
<span
class=
"text2"
>
{{
<span
class=
"text2"
>
{{ entitiesCountBy50PercentRules?.ruleCount }}
</span>
panel5IsChecked
? entitiesCountBy50PercentRules?.ruleCount
: entitiesCountBy50PercentRules?.totalCount
}}
</span>
家
家
</div>
</div>
</div>
</div>
...
...
概览页全领域.md
0 → 100644
浏览文件 @
6de917f9
# 交互消息类
## ApiResult
```
java
public
class
ApiResult
<
T
>
{
@ApiModelProperty
(
"响应码"
)
private
int
code
;
@ApiModelProperty
(
"响应消息"
)
private
String
message
;
@ApiModelProperty
(
"是否成功"
)
private
boolean
success
;
@ApiModelProperty
(
"响应数据"
)
private
T
data
;
}
```
## LatestRiskUpdatesVO
```
java
public
class
LatestRiskUpdatesVO
{
@Data
public
static
class
ItemVO
{
//统计总数
private
long
total
;
//增加数
private
long
dailyIncrement
;
}
@Data
public
static
class
HotspotVO
{
//最热事件id
private
String
HotspotID
;
//最热事件类型
private
String
HotspotType
;
//最热事件日期
private
String
HotspotDate
;
//最热事件标题
private
String
HotspotTitle
;
}
}
```
## LatestRisksVO
```
java
public
class
LatestRisksVO
{
//风险信号列表
private
List
<
RiskVO
>
riskVOS
;
//风险关联事件列表
private
List
<
HotspotVO
>
hotspotVOS
;
//所有风险数
private
Long
RiskCount
;
@Data
@NoArgsConstructor
public
static
class
HotspotVO
{
@ApiModelProperty
(
"id"
)
private
String
HotspotID
;
@ApiModelProperty
(
"标题"
)
private
String
HotspotTitle
;
@ApiModelProperty
(
"描述"
)
private
String
HotspotDesc
;
@ApiModelProperty
(
"时间"
)
private
Date
HotspotDate
;
@ApiModelProperty
(
"图片"
)
private
String
HotspotPicture
;
@ApiModelProperty
(
"发布机构名称"
)
private
String
HotspotOrgName
;
@ApiModelProperty
(
"类型"
)
private
String
HotspotType
;
@ApiModelProperty
(
"领域列表"
)
private
List
<
BaseInfo
>
DomainList
;
}
}
@Data
public
static
class
RiskVO
{
@ApiModelProperty
(
"风险信号id"
)
private
Long
signalId
;
@ApiModelProperty
(
"风险信号标题"
)
private
String
signalTitle
;
@ApiModelProperty
(
"风险信号时间"
)
private
Date
signalTime
;
@ApiModelProperty
(
"风险信号等级"
)
private
String
signalLevel
;
}
}
```
## AllDomainCountVO
```
public class AllDomainCountVO {
@ApiModelProperty(value = "统计名称")
private String countName;
@ApiModelProperty(value = "统计数量")
private Long countNum;
}
```
## DomainContainmentRankingVO
```
public class DomainContainmentRankingVO {
@ApiModelProperty(value = "机构名称")
private String orgName;
@ApiModelProperty(value = "机构图片")
private String orgPicture;
@ApiModelProperty(value = "机构打压次数")
private Long orgCount;
}
```
## DomainContainmentTrendVO
```
public class DomainContainmentTrendVO {
@ApiModelProperty(value = "年度/月份")
private String YearOrMonth;
@ApiModelProperty(value = "领域列表")
private List<DomainVO> DomainList;
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class DomainVO {
@ApiModelProperty(value = "统计名称")
private String DomainName;
@ApiModelProperty(value = "统计数量")
private Long DomainNum;
}
}
```
## DomainContainmentTimelineVO
```
public class DomainContainmentTimelineVO {
@ApiModelProperty(value = "打压名称")
private String EventName;
@ApiModelProperty(value = "打压描述")
private String EventDesc;
@ApiModelProperty(value = "打压时间")
private Date EventDate;
@ApiModelProperty(value = "打压类别")
private String EventType;
@ApiModelProperty(value = "打压发起机构")
private String EventOrgName;
@ApiModelProperty(value = "打压事件id")
private String EventId;
@ApiModelProperty(value = "领域列表")
private List<DomainContainmentTimelineVO.DomainVO> EventDomainList;
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class DomainVO {
@ApiModelProperty(value = "领域id")
private String DomainId;
@ApiModelProperty(value = "领域名称")
private String DomainName;
}
}
```
## TechnologyGameAnalysisVO
```
public class TechnologyGameAnalysisVO {
@ApiModelProperty(value = "事件id")
private String eventId;
@ApiModelProperty(value = "事件名称")
private String eventName;
@ApiModelProperty(value = "事件摘要")
private String eventDesc;
@ApiModelProperty(value = "事件发布机构")
private String eventOrg;
@ApiModelProperty(value = "事件时间")
private Date eventDate;
@ApiModelProperty(value = "事件策略")
private String eventStrategy;
@ApiModelProperty(value = "事件类型")
private String eventType;
@ApiModelProperty(value = "事件国旗图片")
private String eventCountryImg;
}
```
# 中美博弈概览
## **最新风险动态统计**
请求地址:/rivalryIndexV2/LatestRiskUpdates
请求类型:GET
输入参数:
参数:无输入
```
java
@ApiParam
(
value
=
"日期"
,
defaultValue
=
"本周"
)
@RequestParam
(
value
=
"currentDate"
)
String
currentDate
```
请求头:携带token,内容为:
```
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiIsImlzcyI6ImRhdGEtY2VudGVyIiwiZXhwIjozODI1ODM1NTkxLCJpYXQiOjE2NzgzNTE5NTMsImp0aSI6IjI4YmY1NTZjMTc0MDQ3YjJiNTExNWM3NzVhYjhlNWRmIiwidXNlcm5hbWUiOiJzdXBlcl91c2VyIn0.zHyVzsleX2lEqjDBYRpwluu_wy2nZKGl0dw3IUGnKNw
```
输出结果:ApiResult
<LatestRiskUpdatesVO>
```
"data": {
"bill": { -法案
"total": 167258,
"dailyIncrement": 91
},
"administrativeOrder": {-政令
"total": 215763,
"dailyIncrement": 27
},
"Entities": {-实体清单
"total": 141,
"dailyIncrement": 0
},
"CCL": {-ccl
"total": 3,
"dailyIncrement": 0
},
"SDN": {-sdn
"total": 3,
"dailyIncrement": 0
},
"militaryInvolvement": {-涉军企业
"total": 0,
"dailyIncrement": 0
},
"337Survey": {-337调查
"total": 2881,
"dailyIncrement": 1
},
"232Survey": {-232调查
"total": 35,
"dailyIncrement": 0
},
"301Survey": {-301调查
"total": 5,
"dailyIncrement": 0
},
"policiesRegulations": {-最热政策法规
"hotspotID": "119_HR_7065",
"hotspotDate": "2026-01-14",
"hotspotType": "法案",
"hotspotTitle": "塞尼卡民族执法效率法案 (Seneca Nation Law Enforcement Efficiency Act)"
},
"exportControl": {-最热出口管制
"hotspotID": "138",
"hotspotDate": "2025-10-08",
"hotspotType": "实体清单",
"hotspotTitle": "实体清单的增补与修订"
},
"investmentFinancingRestrictions": {-最热投融资限制
"hotspotID": "147",
"hotspotDate": "2025-06-30",
"hotspotType": "SDN",
"hotspotTitle": "《出口管理条例》修订:商业管制清单新增条目"
},
"marketAccess": {-最热市场准入
"hotspotID": "111",
"hotspotDate": "2026-01-01",
"hotspotType": "337",
"hotspotTitle": "外国制造的半导体器件及其下游产品和组件"
}
}
```
## **最新风险信号**
请求地址:/rivalryIndexV2/LatestRisks
请求类型:GET
输入参数:
参数:无输入
请求头:携带token
输出结果:ApiResult
<LatestRisksVO>
## **全领域统计**
请求地址:/rivalryIndexV2/AllDomainCount
请求类型:GET
输入参数:
参数:无输入
请求头:携带token
输出结果:ApiResult
<List
<
AllDomainCountVO
>
>
## 领域打压遏制排行
请求地址:/rivalryIndexV2/DomainContainmentRanking
请求类型:GET
输入参数:
参数:
```
java
@ApiParam
(
value
=
"对我打压机构"
,
defaultValue
=
"对我打压机构"
)
@RequestParam
(
value
=
"ContainmentOrg"
)
String
ContainmentOrg
,
@ApiParam
(
value
=
"领域"
,
defaultValue
=
""
)
//传空值为查询全部领域
@RequestParam
(
value
=
"Domains"
,
required
=
false
)
String
Domain
```
请求头:携带token
输出结果:ApiResult
<List
<
DomainContainmentRankingVO
>
>
## 美对华制裁措施数量趋势
请求地址:/rivalryIndexV2/DomainContainmentTrend
请求类型:GET
输入参数:
参数:required = false为非必传
```
java
@ApiParam
(
value
=
"日期"
,
defaultValue
=
"按月统计"
)
@RequestParam
(
value
=
"byYOrM"
)
String
byYOrM
```
请求头:携带token
输出结果:ApiResult
<List
<
DomainContainmentTrendVO
>
>
## 领域打压遏制时间线
请求地址:/rivalryIndexV2/DomainContainmentTimeline
请求类型:GET
输入参数:
参数:required = false为非必传
```
JAVA
//传空值为查询全部领域
@ApiParam(value = "领域", defaultValue = "1")
@RequestParam(value = "domain",required = false) String domain
```
请求头:携带token
输出结果: ApiResult
<List
<
DomainContainmentTimelineVO
>
>
## 中美科技博弈分析
请求地址:/rivalryIndexV2/TechnologyGameAnalysis
请求类型:GET
输入参数:
参数:required = false为非必传
```
java
//传空值为查询全部领域
@ApiParam
(
value
=
"领域"
,
defaultValue
=
"1"
)
@RequestParam
(
value
=
"domain"
,
required
=
false
)
String
domain
```
输出结果:ApiResult
<List
<
TechnologyGameAnalysisVO
>
>
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论