Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
R
risk-monitor
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
1
合并请求
1
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
蔡建
risk-monitor
Commits
01a8b2b3
提交
01a8b2b3
authored
3月 24, 2026
作者:
张伊明
1
浏览文件
操作
浏览文件
下载
差异文件
合并分支 'zym-dev' 到 'pre'
Zym dev 查看合并请求
!212
上级
3586f01e
aa3a13f1
流水线
#13
已失败 于阶段
in 58 秒
变更
7
流水线
1
显示空白字符变更
内嵌
并排
正在显示
7 个修改的文件
包含
414 行增加
和
414 行删除
+414
-414
index.vue
src/views/coopRestriction/components/dataNew/index.vue
+19
-19
index.vue
src/views/exportControl/index.vue
+117
-117
index.vue
src/views/finance/index.vue
+144
-144
index.vue
...views/marketAccessRestrictions/marketAccessHome/index.vue
+43
-43
index.vue
src/views/ruleRestriction/components/dataNew/index.vue
+17
-17
index.vue
src/views/scientificFunding/components/dataNew/index.vue
+17
-17
index.vue
src/views/technologyFigures/index.vue
+57
-57
没有找到文件。
src/views/coopRestriction/components/dataNew/index.vue
浏览文件 @
01a8b2b3
...
...
@@ -5,7 +5,7 @@
<img
src=
"./assets/rightbtn.png"
alt=
""
class=
"right-btn"
@
click=
"handleNext"
/>
<div
class=
"left-top"
>
<img
src=
"./assets/icon01.png"
alt=
""
/>
<div
class=
"left-top-title"
>
合作限制动
态
<
/div>
<div
class=
"left-top-title"
>
?/div
>
<div
class=
"more"
@
click=
"handleClickToDetail"
>
祕 >
</div>
</div>
...
...
@@ -16,23 +16,23 @@
<div
class=
"left-center"
>
<img
:src=
"item.IMAGEURL || defaultImg"
alt=
""
/>
<div
class=
"left-center-main"
>
<div
class=
"left-center-main-title"
>
{{
item
.
LIMITNAME
||
"暂无动
态"
}}
</div>
<div
class=
"left-center-main-title"
>
{{
item
.
LIMITNAME
||
"?
}
}
</div>
<div
class=
"left-center-main-ul"
>
<ul>
<li>
<span
class=
"ul-title"
>
数据来源
:
<
/span>
<span
class=
"ul-title"
>
皞?/s
p
an>
<span
class=
"ul-content"
>
{{
item
.
ORGNAME
||
""
}}
</span>
</li>
<li>
<span
class=
"ul-title"
>
合作限制类型
:
<
/span>
<span
class=
"ul-title"
>
蝐餃?/sp
a
n>
<span
class=
"ul-content"
>
{{
item
.
LIMITTYPE
||
""
}}
</span>
</li>
<li>
<span
class=
"ul-title"
>
发布日期
:
<
/span>
<span
class=
"ul-title"
>
?/sp
a
n>
<span
class=
"ul-content"
>
{{
item
.
LIMITDATE
||
""
}}
</span>
</li>
<li>
<span
class=
"ul-title"
>
涉及领域
:
<
/span>
<span
class=
"ul-title"
>
瘨?/s
p
an>
<div
class=
"ul-tags"
v-if=
"item.AREA"
>
<span
v-for=
"(field, fIndex) in typeof item.AREA === 'string'
? item.AREA.split(',')
...
...
@@ -49,7 +49,7 @@
</div>
<div
class=
"left-bottom"
>
<ul>
<li
class=
"left-bottom-li"
>
内容摘要
:
<
/li>
<li
class=
"left-bottom-li"
>
捆?/l
i
>
</ul>
<div
class=
"left-bottom-content"
>
{{
item
.
INTRODUCTION
||
"捆"
}}
...
...
@@ -58,18 +58,18 @@
</div>
</el-carousel-item>
<!-- 无数据时的占位展
示
-->
<!-- ?-->
<el-carousel-item
v-if=
"coopRestrictionTrends.length === 0"
>
<div
class=
"carousel-item-content"
>
<div
class=
"left-center"
>
<img
:src=
"defaultImg"
alt=
""
/>
<div
class=
"left-center-main"
>
<div
class=
"left-center-main-title"
>
暂无合作限制动
态
<
/div>
<div
class=
"left-center-main-title"
>
?/div>
<div
class=
"left-center-main-ul"
>
<ul>
<li><span
class=
"ul-title"
>
数据来源
:
<
/span><span
class=
"ul-content"
>
未知
</span></li>
<li><span
class=
"ul-title"
>
合作限制类型
:
<
/span><span
class=
"ul-content"
>
未知
</span></li>
<li><span
class=
"ul-title"
>
发布日期
:
<
/span><span
class=
"ul-content"
>
未知
</span></li>
<li><span
class=
"ul-title"
>
皞?/s
p
an>
<span
class=
"ul-content"
></span></li>
<li><span
class=
"ul-title"
>
蝐餃?/sp
a
n>
<span
class=
"ul-content"
></span></li>
<li><span
class=
"ul-title"
>
?/sp
a
n>
<span
class=
"ul-content"
></span></li>
<li><span
class=
"ul-title"
>
瘨
</span><span
class=
"ul-content"
></span></li>
</ul>
</div>
...
...
@@ -90,7 +90,7 @@
<div
style=
"margin: 6px 34px 0 23px"
>
<div
v-for=
"item in riskSignals"
:key=
"item.id"
class=
"right-main"
@
click=
"handleToRiskDetail(item)"
>
<div
class=
"main-left"
:class=
"
{ cl4: item.title === '特别重大', cl5: item.title === '重大风险', cl6: item.title === '一般风
险'
}">
:class=
"
{ cl4: item.title === '之', cl5: item.title === '之憌', cl6: item.title === '銝憌? }">
{{
item
.
title
}}
</div>
<div
class=
"item-right"
>
...
...
@@ -114,7 +114,7 @@
</
template
>
<
script
setup
>
import
RiskSignal
from
"@/components/base/
R
iskSignal/index.vue"
;
import
RiskSignal
from
"@/components/base/
r
iskSignal/index.vue"
;
import
{
ref
,
onMounted
,
computed
}
from
"vue"
;
import
router
from
"@/router"
;
import
{
getCoopRestrictionTrends
,
getCoopRestrictionSignals
}
from
"@/api/coopRestriction/coopRestriction.js"
;
...
...
@@ -144,7 +144,7 @@ const coopRestrictionTrends = ref([]);
const
carouselRef
=
ref
(
null
);
const
activeIndex
=
ref
(
0
);
// 获取合作限制-最新动态数
据
// -?
const
getCoopRestrictionTrendsData
=
async
()
=>
{
try
{
const
res
=
await
getCoopRestrictionTrends
();
...
...
@@ -152,11 +152,11 @@ const getCoopRestrictionTrendsData = async () => {
coopRestrictionTrends
.
value
=
res
.
data
||
[];
}
}
catch
(
error
)
{
console
.
error
(
"获取合作限制最新动态数据失
败:
"
,
error
);
console
.
error
(
"憭梯?"
,
error
);
}
};
// 轮播图手动切
换
// 頧格?
const
handlePrev
=
()
=>
{
if
(
carouselRef
.
value
)
{
carouselRef
.
value
.
prev
();
...
...
@@ -173,7 +173,7 @@ const handleCarouselChange = index => {
activeIndex
.
value
=
index
;
};
// 左侧展示的主动
态
// 撌虫儒撅內蜓?
const
mainTrend
=
computed
(()
=>
{
if
(
coopRestrictionTrends
.
value
.
length
===
0
)
return
null
;
return
coopRestrictionTrends
.
value
[
activeIndex
.
value
]
||
coopRestrictionTrends
.
value
[
0
];
...
...
@@ -212,7 +212,7 @@ const handleToMoreRiskSignal = () => {
};
onMounted
(()
=>
{
// 合作限制-最新动态数
据-
获取数据
// -?
getCoopRestrictionTrendsData
();
// -憌靽∪-
getCoopRestrictionSignalsData
();
...
...
src/views/exportControl/index.vue
浏览文件 @
01a8b2b3
...
...
@@ -13,7 +13,7 @@
</div>
<div
class=
"home-main-header-btn-box"
>
<div
class=
"btn"
@
click=
"handleToPosi('position1')"
>
<div
class=
"btn-text"
>
{{
"最新动
态"
}}
</div>
<div
class=
"btn-text"
>
{{
"最新动
?
}}
</div>
<div
class=
"btn-icon"
>
<img
src=
"@/assets/icons/arrow-right-icon.png"
alt=
""
/>
</div>
...
...
@@ -31,7 +31,7 @@
</div>
</div>
<div
class=
"btn"
@
click=
"handleToPosi('position4')"
>
<div
class=
"btn-text"
>
{{
"资源
库"
}}
</div>
<div
class=
"btn-text"
>
{{
"资源
?
}}
</div>
<div
class=
"btn-icon"
>
<img
src=
"@/assets/icons/arrow-right-icon.png"
alt=
""
/>
</div>
...
...
@@ -65,7 +65,7 @@
:subtitle=
"item.nameAbbr"
:description=
"item.description"
:quantity=
"item.postCount"
unit=
"
次"
unit=
"
?
:color="
infoListColor
[
index
]"
@
click=
"handleToEntityListNoId(item)"
/>
...
...
@@ -73,9 +73,9 @@
</div>
<el-row
:gutter=
"15"
style=
"width: 1600px; margin: 0 auto; height: 528px; margin-top: 64px"
>
<CustomTitle
id=
"position1"
title=
"最新动
态"
/>
<CustomTitle
id=
"position1"
title=
"最新动
?
/>
<el-col
:span=
"16"
>
<custom-container
titleType=
"primary"
title=
"最新出口管制政
策"
:titleIcon=
"houseIcon"
height=
"450px"
>
<custom-container
titleType=
"primary"
title=
"最新出口管制政
?
:titleIcon="
houseIcon
"
height=
"450px"
>
<template
#
header-right
>
<el-button
type=
"primary"
@
click=
"handleToEntityList()"
link
>
{{
"查看详情 >"
}}
...
...
@@ -107,19 +107,19 @@
<div>
<div
class=
"box1-top"
>
<div
class=
"box1-top-title"
>
{{
item
.
postDate
}}
——BIS《实体清单增列与修订条目
》
{{
item
.
postDate
}}
——BIS《实体清单增列与修订条目
?
</div>
<div
class=
"box1-top-content"
>
<div
class=
"box1-top-content-item"
>
<span
class=
"box1-top-content-item-title"
>
· 发布机构
:
<
/span>
<span
class=
"box1-top-content-item-title"
>
· 发布机构
?
/span>
<span
class=
"box1-top-content-item-content"
>
{{
item
.
postOrgName
}}
</span>
</div>
<div
class=
"box1-top-content-item"
>
<span
class=
"box1-top-content-item-title"
>
· 生效日期
:
<
/span>
<span
class=
"box1-top-content-item-title"
>
· 生效日期
?
/span>
<span
class=
"box1-top-content-item-content"
>
{{
item
.
postDate
}}
</span>
</div>
<div
class=
"box1-top-content-item"
>
<span
class=
"box1-top-content-item-title"
>
· 涉及领域
:
<
/span>
<span
class=
"box1-top-content-item-title"
>
· 涉及领域
?
/span>
<div
class=
"box1-top-content-item-tags"
v-for=
"(domainItem, index) in item.domains"
...
...
@@ -131,7 +131,7 @@
</div>
</div>
<div
class=
"box1-bottom"
>
<div
class=
"box1-bottom-title"
>
· 涉及主要实体
:
<
/div>
<div
class=
"box1-bottom-title"
>
· 涉及主要实体
?
/div>
<div
class=
"box1-bottom-content"
>
<div
class=
"box1-bottom-content-item"
...
...
@@ -165,7 +165,7 @@
</el-icon>
<span>
新增中国实体
</span>
</div>
<div
class=
"box1-absolute-num"
>
{{
item
.
cnEntityCount
}}
家
<
/div>
<div
class=
"box1-absolute-num"
>
{{
item
.
cnEntityCount
}}
?
/div>
</div>
</div>
</el-carousel-item>
...
...
@@ -193,7 +193,7 @@
<div
class="item-left"
:class="{
itemLeftStatus1: item.status === '一般风
险'
,
itemLeftStatus1: item.status === '一般风
?
,
itemLeftStatus2: item.status === '重大风险'
}"
>
...
...
@@ -284,7 +284,7 @@
<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>
<span
style=
"margin-right: 10px; width: 40px"
>
{{
scope
.
row
.
num
}}
?
/span>
<el-progress
:percentage=
"scope.row.percent * 100"
:show-text=
"false"
...
...
@@ -313,7 +313,7 @@
<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>
<span
style=
"margin-right: 10px; width: 40px"
>
{{
scope
.
row
.
num
}}
?
/span>
<el-progress
:percentage=
"scope.row.percent * 100"
:show-text=
"false"
...
...
@@ -336,13 +336,13 @@
</el-table>
</div>
<div
class=
"box3-content"
style=
"display: none"
>
<div
class=
"box3-content-title"
>
关键与新兴技术清
单(
CETs)
</div>
<div
class=
"box3-content-title"
>
关键与新兴技术清
?
CETs)
</div>
<el-table
:data=
"tableData1"
stripe
style=
"width: 100%"
>
<el-table-column
prop=
"year"
label=
"年份"
width=
"100"
/>
<el-table-column
label=
"发布次数"
width=
"180"
>
<
template
#
default=
"scope"
>
<div
style=
"display: flex; align-items: center"
>
<span
style=
"margin-right: 10px; width: 40px"
>
{{
scope
.
row
.
num
}}
次
<
/span>
<span
style=
"margin-right: 10px; width: 40px"
>
{{
scope
.
row
.
num
}}
?
/span>
<el-progress
:percentage=
"scope.row.percent * 100"
:show-text=
"false"
...
...
@@ -397,7 +397,7 @@
</el-row>
<el-row
:gutter=
"20"
style=
"width: 1600px; margin: 0 auto; margin-top: 39px"
>
<CustomTitle
id=
"position4"
title=
"资源
库"
style=
"margin-top: 0px"
/>
<CustomTitle
id=
"position4"
title=
"资源
?
style="
margin-top:
0px
"
/>
<div
class=
"resource-tabs"
>
<div
v-for=
"tab in resourceTabs"
...
...
@@ -462,7 +462,7 @@
<el-col
:span=
"16"
>
<custom-container
title=
"制裁实体清单"
:titleIcon=
"entityIcon"
height=
"845px"
>
<
template
#
header-right
>
<div
class=
"box5-header-right"
>
共
{{
total
}}
家实
体
<
/div>
<div
class=
"box5-header-right"
>
共
{{
total
}}
家实
?
/div>
</
template
>
<
template
#
default
>
<div
class=
"box5"
>
...
...
@@ -530,30 +530,30 @@
<!-- <el-table-column prop="revenue" label="营收(亿元)" width="140" align="right">
<template #default="scope">
<span
:class="['revenue-cell', scope.row.revenue === '无营收数
据'
? 'no-revenue' : '']"
:class="['revenue-cell', scope.row.revenue === '无营收数
?
? 'no-revenue' : '']"
>
{{ scope.row.revenue }}
</span>
</template>
</el-table-column> -->
<el-table-column
prop=
"revenue"
label=
"50%规则子企
业"
width=
"280"
align=
"right"
>
<el-table-column
prop=
"revenue"
label=
"50%规则子企
?
width="
280
"
align=
"right"
>
<
template
#
default=
"scope"
>
<div
class=
"num-item"
v-if=
"scope.row.ruleOrgCount > 0"
>
<div
class=
"name-item"
:class=
"[
'revenue-cell',
scope.row.revenue === '无营收数
据'
? 'no-revenue' : ''
scope.row.revenue === '无营收数
?
? 'no-revenue' : ''
]"
>
{{
scope
.
row
.
ruleOrgList
[
0
].
orgName
}}
...
等
{{
scope
.
row
.
ruleOrgList
[
0
].
orgName
}}
...
?
</div>
<div
style=
"width: 50px; color: #409eff; cursor: pointer"
@
click=
"handleOrgClick(scope.row)"
>
{{
scope
.
row
.
ruleOrgCount
}}
家>
{{
scope
.
row
.
ruleOrgCount
}}
?
</div>
</div>
</
template
>
...
...
@@ -562,7 +562,7 @@
<div
class=
"table-footer"
>
<!-- <div class="pagination-info">
第{{ currentPage }}页,共{{ totalPages }}
页
第{{ currentPage }}页,共{{ totalPages }}
?
</div> -->
<el-pagination
v-model:current-page=
"currentPage"
...
...
@@ -637,7 +637,7 @@
</div>
</div>
<div
class=
"right-footer"
>
<div
class=
"total-count"
>
共
{{
totalAll
}}
项
<
/div>
<div
class=
"total-count"
>
?
{{
totalAll
}}
?
/div>
<el-pagination
v-model:current-page=
"currentPageAll"
:page-size=
"pageSizeAll"
...
...
@@ -655,7 +655,7 @@
</div>
<!-- <el-dialog v-model="dialogVisible" width="800" :before-close="handleClose">
<template #title>
<div class="dialog-title">50%规则子企
业<
/div>
<div class="dialog-title">50%规则子企
?
/div>
</template>
<div class="dialog-ett-wrpper">
<div
...
...
@@ -701,9 +701,9 @@
</template>
<
script
setup
>
//这是一个备
注
//这是一个备
?
import
NewsList
from
"@/components/base/newsList/index.vue"
;
import
RiskSignal
from
"@/components/base/
R
iskSignal/index.vue"
;
import
RiskSignal
from
"@/components/base/
r
iskSignal/index.vue"
;
import
{
onMounted
,
ref
,
computed
,
reactive
,
shallowRef
,
watch
,
nextTick
}
from
"vue"
;
import
{
useContainerScroll
}
from
"@/hooks/useScrollShow"
;
const
homeMainRef
=
ref
(
null
);
...
...
@@ -773,7 +773,7 @@ const handleToPosi = id => {
isShow
.
value
=
true
;
}
// 2. 使用 nextTick 等待 DOM 布局(如高度切换)完成后再进行坐标计
算
// 2. 使用 nextTick 等待 DOM 布局(如高度切换)完成后再进行坐标计
?
nextTick
(()
=>
{
const
containerRect
=
homeMainRef
.
value
.
getBoundingClientRect
();
const
elementRect
=
element
.
getBoundingClientRect
();
...
...
@@ -788,7 +788,7 @@ const handleToPosi = id => {
}
};
// 跳转到单项制裁页
面
// 跳转到单项制裁页
?
const
handleToRiskSignalDetail
=
item
=>
{
window
.
sessionStorage
.
setItem
(
"curTabName"
,
item
.
title
);
const
routeData
=
router
.
resolve
({
...
...
@@ -797,7 +797,7 @@ const handleToRiskSignalDetail = item => {
id
:
item
.
sanId
}
});
// 打开新页
面
// 打开新页
?
window
.
open
(
routeData
.
href
,
"_blank"
);
};
...
...
@@ -807,53 +807,53 @@ const techOptions = [
{
label
:
"全部领域"
,
value
:
0
},
{
label
:
"人工智能"
,
value
:
1
},
{
label
:
"生物科技"
,
value
:
2
},
{
label
:
"新一代信息技
术"
,
value
:
3
},
{
label
:
"新一代信息技
?
, value: 3 },
{ label: "
量子科技
", value: 4 },
{
label
:
"新能
源"
,
value
:
5
},
{ label: "
新能
?
,
value
:
5
},
{
label
:
"集成电路"
,
value
:
6
},
{
label
:
"海洋"
,
value
:
7
},
{
label
:
"先进制
造"
,
value
:
8
},
{
label
:
"新材
料"
,
value
:
9
},
{
label
:
"先进制
?
, value: 8 },
{ label: "
新材
?
,
value
:
9
},
{
label
:
"航空航天"
,
value
:
10
},
{
label
:
"深海"
,
value
:
11
},
{
label
:
"极地"
,
value
:
12
},
{
label
:
"太空"
,
value
:
13
},
{
label
:
"
核"
,
value
:
14
}
{
label
:
"
?
, value: 14 }
];
const timeOptions = [
"
全部时间
",
"2025
年"
,
"2024
年"
,
"2023
年"
,
"2022
年"
,
"2021
年"
,
"2020
年"
,
"2019
年"
,
"2018
年"
,
"2017
年"
,
"2016
年"
,
"2015
年"
,
"2014
年"
,
"2013
年"
,
"2012
年"
,
"2011
年"
,
"2010
年"
,
"2009
年"
,
"2008
年"
,
"2007
年"
,
"2006
年"
,
"2005
年"
,
"2004
年"
,
"2003
年"
,
"2002
年"
,
"2001
年"
"
2025
?
,
"2024
?
,
"
2023
?
,
"2022
?
,
"
2021
?
,
"2020
?
,
"
2019
?
,
"2018
?
,
"
2017
?
,
"2016
?
,
"
2015
?
,
"2014
?
,
"
2013
?
,
"2012
?
,
"
2011
?
,
"2010
?
,
"
2009
?
,
"2008
?
,
"
2007
?
,
"2006
?
,
"
2005
?
,
"2004
?
,
"
2003
?
,
"2002
?
,
"
2001
?
];
const
checkedTech
=
ref
([
0
]);
const
checkedTime
=
ref
([
"全部时间"
]);
// 跳转到单条制裁页面,单独打开一个新页面
const
handleTitleClick
=
item
=>
{
window
.
sessionStorage
.
setItem
(
"curTabName"
,
`
${
item
.
year
}
-
${
item
.
dateStr
}
《
$
{
item
.
title
}
》`
);
window
.
sessionStorage
.
setItem
(
"curTabName"
,
`
${
item
.
year
}
-
${
item
.
dateStr
}
?
{item.title}》`
);
const
route
=
router
.
resolve
({
path
:
"/exportControl/singleSanction"
,
query
:
{
...
...
@@ -888,16 +888,16 @@ const getTagType = tag => {
人工智能
:
"danger"
,
集成电路
:
"warning"
,
量子科技
:
"success"
,
生物技
术
:
"info"
,
新一代信息技
术
:
"primary"
,
新能
源
:
"success"
,
生物技
?
"info"
,
新一代信息技
?
"primary"
,
新能
?
"success"
,
航空航天
:
"primary"
,
先进制
造
:
"warning"
,
先进制
?
"warning"
,
海洋
:
"info"
,
新材
料
:
"danger"
,
新材
?
"danger"
,
深海
:
"primary"
,
极地
:
"info"
,
核
:
"danger"
,
?
"danger"
,
其他
:
"info"
};
if
(
tagColorMap
[
strTag
])
{
...
...
@@ -909,7 +909,7 @@ const getTagType = tag => {
//数据定义
const
entitiesDataInfoList
=
shallowRef
([]);
// 趋势
图
// 趋势
?
const
trendOption
=
ref
({});
const
trendChecked
=
ref
(
false
);
const
selectedEntityId
=
ref
(
1
);
...
...
@@ -938,7 +938,7 @@ onMounted(async () => {
getIndustryCountByYear
(
1
),
getIndustryCountByYear
(
13
)
]);
// 交换第二个和第三个元
素
// 交换第二个和第三个元
?
[
dataCount
[
1
],
dataCount
[
2
]]
=
[
dataCount
[
2
],
dataCount
[
1
]];
infoList
.
value
=
dataCount
.
slice
(
0
,
2
);
allSanTypeIds
.
value
=
infoList
.
value
.
map
(
item
=>
item
.
id
);
...
...
@@ -946,10 +946,10 @@ onMounted(async () => {
label
:
item
.
nameZh
,
value
:
tabMap
[
item
.
id
],
id
:
[
item
.
id
],
disabled
:
item
.
id
==
"13"
// 商业管制清单不展
示
disabled
:
item
.
id
==
"13"
// 商业管制清单不展
?
}));
resourceTabs
.
value
.
unshift
({
label
:
"全部制裁"
,
value
:
"all"
,
id
:
""
,
disabled
:
false
});
console
.
log
(
"返回的数据结
构 infoList =》"
,
infoList
.
value
);
console
.
log
(
"返回的数据结
?infoList =?
, infoList.value);
const entityList = _.map(entitiesDataInfo?.sanEntities ?? [], ({ entityNameZh, entityName }) => {
return { name: entityNameZh, enName: entityName };
});
...
...
@@ -982,7 +982,7 @@ onMounted(async () => {
};
});
// 获取趋势图数
据
// 获取趋势图数
?
await fetchTrendData();
await fetchRiskSignals("
0103
");
...
...
@@ -992,7 +992,7 @@ onMounted(async () => {
await fetchNewsInfo();
await fetchEntitiesList(currentPage.value, pageSize.value);
await fetchSanctionProcess(sanctionPage.value, 10);
// 获取雷达图数
据
// 获取雷达图数
?
await fetchRadarData(domainChecked.value);
// 获取出口管制制裁措施
await fetchSanctionList();
...
...
@@ -1010,7 +1010,7 @@ const handleToSocialDetail = item => {
});
window.open(route.href, "
_blank
");
};
// 获取趋势图数
据
// 获取趋势图数
?
const fetchTrendData = async () => {
try {
const res = await getCountDomainByYear({
...
...
@@ -1023,7 +1023,7 @@ const fetchTrendData = async () => {
trendOption.value = processYearDomainCountData(res[0].yearDomainCount);
}
} catch (error) {
console
.
error
(
"获取趋势图数据失
败:
"
,
error
);
console.error("
获取趋势图数据失
?
", error);
}
};
...
...
@@ -1034,22 +1034,22 @@ watch(
}
);
// 新增函数:处
理 yearDomainCount 数据并使用
getMultipleBarChart_m 方法生成图表配置
// 新增函数:处
?yearDomainCount 数据并使?
getMultipleBarChart_m 方法生成图表配置
const processYearDomainCountData = yearDomainCountData => {
// 提取所有年份并排序
const years = [...new Set(yearDomainCountData.map(item => item.year))].sort();
// 提取所有领域名
称
// 提取所有领域名
?
const allDomains = [...new Set(yearDomainCountData.flatMap(item => item.domainCountInfo.map(domain => domain.name)))];
// 构
造 getMultipleBarChart_m 所需的数据结构
// 构
?getMultipleBarChart_m 所需的数据结?
const chartData = {
domains: allDomains,
data: years.map(year => {
const yearData = yearDomainCountData.find(item => item.year === year);
const domainCounts = {};
// 初始化所有领域的计数
为0
// 初始化所有领域的计数
?
allDomains.forEach(domain => {
domainCounts[domain] = 0;
});
...
...
@@ -1092,9 +1092,9 @@ const carouselRef = ref(null);
// activeIndex = carouselRef.value.activeIndex;
// }
// console.log("当前 Carousel 激活索
引:
", activeIndex);
// console.log("
当前
Carousel
激活索
?
", activeIndex);
// // 使用当前激活项的数
据
// // 使用当前激活项的数
?
// const currentItem = entitiesDataInfoList.value[activeIndex];
// if (currentItem) {
// const route = router.resolve({
...
...
@@ -1120,7 +1120,7 @@ const handleToEntityList = item => {
}
window.sessionStorage.setItem(
"
curTabName
",
entitiesDataInfoList
.
value
[
currentCarouselIndex
.
value
].
postDate
+
" 《实体清单新增条目
》"
entitiesDataInfoList.value[currentCarouselIndex.value].postDate + "
《实体清单新增条目
?
);
const
routeData
=
router
.
resolve
({
path
:
"/exportControl/singleSanction"
,
...
...
@@ -1134,7 +1134,7 @@ const handleToEntityList = item => {
// 跳转到V2.0实体清单无ID
const
handleToEntityListNoId
=
item
=>
{
console
.
log
(
"这是什么数
据
=>"
,
item
);
console
.
log
(
"这是什么数
?
=>"
,
item
);
if
(
item
.
nameZh
==
"实体清单"
)
{
const
routeData
=
router
.
resolve
({
path
:
"/exportControl/entityList"
,
...
...
@@ -1166,7 +1166,7 @@ const infoListColor = ref(["rgba(206, 79, 81, 1)", "rgba(114, 46, 209, 1)", "rgb
const
infoList
=
ref
([]);
const
allSanTypeIds
=
ref
([
"1"
,
"13"
]);
// 雷达
图
// 雷达
?
const
domainChecked
=
ref
(
false
);
const
radarOption
=
ref
({
title
:
{
...
...
@@ -1219,7 +1219,7 @@ const radarOption = ref({
]
});
// 获取雷达图数
据
// 获取雷达图数
?
const
fetchRadarData
=
async
checked
=>
{
try
{
const
data
=
await
getSanDomainCount
(
checked
,
"export"
);
...
...
@@ -1236,7 +1236,7 @@ const fetchRadarData = async checked => {
const
domainNames
=
Array
.
from
(
allDomains
);
// 为每个制裁类型准备数
据
// 为每个制裁类型准备数
?
const
radarColors
=
[
"rgba(45, 123, 248, 1)"
,
"rgba(206, 79, 81, 1)"
,
...
...
@@ -1255,7 +1255,7 @@ const fetchRadarData = async checked => {
});
}
// 按照统一的领域顺序创建值数
组
// 按照统一的领域顺序创建值数
?
const
values
=
domainNames
.
map
(
name
=>
domainMap
[
name
]
||
0
);
// 确定颜色
...
...
@@ -1270,17 +1270,17 @@ const fetchRadarData = async checked => {
};
});
// 更新雷达图指
标
// 更新雷达图指
?
let
maxValue
=
Math
.
max
(...
seriesData
.
flatMap
(
item
=>
item
.
value
))
*
1.2
;
// 向上取整到最近的100的倍数,避免小数导
致 ticks 不可读警告
// 向上取整到最近的100的倍数,避免小数导
?ticks 不可读警?
maxValue
=
Math
.
ceil
(
maxValue
/
100
)
*
100
;
const
indicators
=
domainNames
.
map
(
name
=>
({
name
:
name
,
max
:
maxValue
||
100
// 防止max
为0的情况
max
:
maxValue
||
100
// 防止max
?的情?
}));
// 更新雷达图配
置
// 更新雷达图配
?
radarOption
.
value
.
radar
.
indicator
=
indicators
;
radarOption
.
value
.
series
[
0
].
data
=
seriesData
;
radarOption
.
value
.
legend
.
data
=
seriesData
.
map
(
item
=>
{
...
...
@@ -1293,7 +1293,7 @@ const fetchRadarData = async checked => {
});
}
}
catch
(
error
)
{
console
.
error
(
"获取雷达图数据失
败:
"
,
error
);
console
.
error
(
"获取雷达图数据失
?
"
,
error
);
}
};
...
...
@@ -1302,7 +1302,7 @@ watch(
()
=>
fetchRadarData
(
domainChecked
.
value
)
);
// 进度条状
态
// 进度条状
?
const
getStatus
=
_percent
=>
{
const
percent
=
_percent
*
100
;
if
(
percent
>=
90
)
{
...
...
@@ -1314,7 +1314,7 @@ const getStatus = _percent => {
}
};
// 制裁实体
const
currentPage
=
ref
(
1
);
// 默认显示
第5页
const
currentPage
=
ref
(
1
);
// 默认显示
??
const
pageSize
=
ref
(
10
);
const
total
=
ref
(
0
);
...
...
@@ -1362,8 +1362,8 @@ const fetchSanctionList = async () => {
let
year
=
""
;
let
dateStr
=
fullTime
;
if
(
typeof
fullTime
===
"string"
)
{
if
(
fullTime
.
includes
(
"
年"
))
{
const
parts
=
fullTime
.
split
(
"
年"
);
if
(
fullTime
.
includes
(
"
?
)) {
const parts = fullTime.split("
?
);
year
=
parts
[
0
];
dateStr
=
parts
[
1
].
replace
(
/
\s
+/g
,
""
);
}
else
if
(
fullTime
.
includes
(
"-"
))
{
...
...
@@ -1465,7 +1465,7 @@ const fetchEntitiesList = async (page = 1, size = 10) => {
sanctionDate
:
item
.
startTime
}));
total
.
value
=
res
.
totalElements
;
currentPage
.
value
=
res
.
number
+
1
;
// API返回的页码从0开始,前端
从1开始
currentPage
.
value
=
res
.
number
+
1
;
// API返回的页码从0开始,前端
?开?
}
}
catch
(
err
)
{
console
.
error
(
err
);
...
...
@@ -1485,7 +1485,7 @@ const handleGetMore = async () => {
desc
:
`
${
item
.
cnEntityCount
}
家中国实体`
,
content
:
item
.
summary
||
"2025
年3月25日,美国商务部工业与安全局以从事有悖于美国国家安全和外交政策利益的活动为由,宣布将来自中国的54家实体新增至“实体清单”。"
"2025
??5日,美国商务部工业与安全局以从事有悖于美国国家安全和外交政策利益的活动为由,宣布将来自中国?4家实体新增至“实体清单”?
}));
// 合并新数据到现有列表
...
...
@@ -1514,7 +1514,7 @@ const fetchSanctionProcess = async (page = 1, size = 10) => {
desc: `${item.cnEntityCount} 家中国实体`,
content:
item.summary ||
"2025
年3月25日,美国商务部工业与安全局以从事有悖于美国国家安全和外交政策利益的活动为由,宣布将来自中国的54家实体新增至“实体清单”。"
"
2025
??
5
日,美国商务部工业与安全局以从事有悖于美国国家安全和外交政策利益的活动为由,宣布将来自中国
?
4
家实体新增至“实体清单”
?
}));
}
}
catch
(
err
)
{
...
...
@@ -1530,17 +1530,17 @@ const handlePageChange = page => {
const
searchKeyword
=
ref
(
""
);
// 资源
库
Tab 数据
// 资源
?
Tab 数据
const
resourceTabs
=
ref
([
// { label: "全部制裁", value: "all", disabled: false },
// { label: "实体清单", value: "entity", disabled: false },
// { label: "商业管制清单", value: "commerce", disabled: true }
// { label: "关键与新兴技术清
单"
, value: "tech", disabled: true },
// { label: "军事最终用户清
单"
, value: "military", disabled: true }
// { label: "关键与新兴技术清
?
, value: "tech", disabled: true },
// { label: "军事最终用户清
?
, value: "military", disabled: true }
]);
const
activeResourceTab
=
ref
(
"all"
);
const
activeResourceTabItem
=
ref
({});
// 数据对应,便宜行
事
// 数据对应,便宜行
?
const
tabMap
=
{
1
:
"entity"
,
13
:
"commerce"
...
...
@@ -1558,10 +1558,10 @@ const handleResourceTabClick = tab => {
};
const
strengthLabels
=
{
strong
:
"
强"
,
medium
:
"
中"
,
weak
:
"
弱"
,
none
:
"
无"
strong
:
"
?
,
medium: "
?
,
weak
:
"
?
,
none: "
?
};
// 获取风险信号数据
...
...
@@ -1584,7 +1584,7 @@ const fetchRiskSignals = async () => {
}
};
// 添加获取社交媒体信息的方
法
// 添加获取社交媒体信息的方
?
const
fetchSocialMediaInfo
=
async
()
=>
{
try
{
const
data
=
await
getSocialMediaInfo
();
...
...
@@ -1604,7 +1604,7 @@ const fetchSocialMediaInfo = async () => {
}
};
// 添加获取新闻资讯的方
法
// 添加获取新闻资讯的方
?
const
fetchNewsInfo
=
async
()
=>
{
try
{
const
data
=
await
getNewsInfo
();
...
...
@@ -1623,7 +1623,7 @@ const fetchNewsInfo = async () => {
};
const
handlePerClick
=
item
=>
{
// console.log("点击了社交媒体消
息:
", item);
// console.log("点击了社交媒体消
?
", item);
window
.
sessionStorage
.
setItem
(
"curTabName"
,
item
.
name
);
const
route
=
router
.
resolve
({
path
:
"/characterPage"
,
...
...
@@ -1634,7 +1634,7 @@ const handlePerClick = item => {
});
window
.
open
(
route
.
href
,
"_blank"
);
};
// 处理点击社交媒体消息的方
法
// 处理点击社交媒体消息的方
?
// const handleInfoClick = item => {
// console.log("点击了社交媒体消息的更多信息:", item);
// // 这里可以添加打开详情页的逻辑
...
...
@@ -1653,7 +1653,7 @@ const handlePerClick = item => {
const
formatTime
=
timeStr
=>
{
// 空值兜底,避免报错
if
(
!
timeStr
)
return
"暂无时间"
;
// 核心:替换T为空
格
// 核心:替换T为空
?
return
timeStr
.
replace
(
"T"
,
" "
);
};
...
...
@@ -1661,7 +1661,7 @@ const warningList = ref([]);
const
curBillList
=
ref
([]);
const
releaseTime
=
ref
(
"近一年发
布"
);
const
releaseTime
=
ref
(
"近一年发
?
);
const categoryList = ref([]);
...
...
@@ -1713,7 +1713,7 @@ const chart1Data = ref({
const handleSanc = item => {
console.log(item);
window
.
sessionStorage
.
setItem
(
"curTabName"
,
`
${
item
.
postDate
}
《
$
{
item
.
title
}
》`
);
window.sessionStorage.setItem("
curTabName
", `${item.postDate}
?
{item.title}》`);
const route = router.resolve({
path: "
/
exportControl
/
singleSanction
",
query: {
...
...
@@ -1964,7 +1964,7 @@ const handleMediaClick = item => {
align-items
:
center
;
justify-content
:
flex-start
;
width
:
48%
;
/* 留出2%的间
距
*/
/* 留出2%的间
?
*/
// margin-bottom: 6px;
box-sizing
:
border-box
;
gap
:
10px
;
...
...
@@ -3113,7 +3113,7 @@ const handleMediaClick = item => {
// align-items: center;
justify-content
:
flex-start
;
width
:
48%
;
/* 留出2%的间
距
*/
/* 留出2%的间
?
*/
// margin-bottom: 6px;
box-sizing
:
border-box
;
gap
:
10px
;
...
...
src/views/finance/index.vue
浏览文件 @
01a8b2b3
...
...
@@ -5,14 +5,14 @@
<HeaderMenu></HeaderMenu>
</div>
<div
class=
"header-right"
>
<headerInfo
curTitleName=
"投融资限
制"
></headerInfo>
<headerInfo
curTitleName=
"投融资限
?
>
</headerInfo>
</div>
</div>
-->
<div
class=
"home-main"
ref=
"containerRef"
>
<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=
"搜索投融资限制政
策"
<SearchContainer
style=
"margin-bottom: 0; height: fit-content"
v-if=
"containerRef"
placeholder=
"搜索投融资限制政
?
:containerRef="
containerRef
"
areaName=
""
/>
<!--
<el-input
v-model=
"searchKey"
...
...
@@ -40,12 +40,12 @@
</div>
<div
class=
"home-main-header-footer-item"
>
<div
class=
"item-top"
>
326
</div>
<div
class=
"item-footer"
>
关键和新型技术清
单
<
/div>
<div
class=
"item-footer"
>
关键和新型技术清
?
/div>
</div>
</div>
-->
<!--
<div
class=
"home-main-header-btn-box"
>
<div
class=
"btn"
@
click=
"scrollToTop('position1')"
>
<div
class=
"btn-text"
>
{{
"最新动
态"
}}
</div>
<div
class=
"btn-text"
>
{{
"最新动
?
}}
</div>
<div
class=
"btn-icon"
>
<img
src=
"@/assets/icons/arrow-right-icon.png"
alt=
""
/>
</div>
...
...
@@ -63,30 +63,30 @@
</div>
</div>
<div
class=
"btn"
@
click=
"scrollToTop('position4')"
>
<div
class=
"btn-text"
>
{{
"资源
库"
}}
</div>
<div
class=
"btn-text"
>
{{
"资源
?
}}
</div>
<div
class=
"btn-icon"
>
<img
src=
"@/assets/icons/arrow-right-icon.png"
alt=
""
/>
</div>
</div>
</div>
-->
<!--
<div
class=
"home-main-header-footer-link"
>
<ClickableCard
text=
"最新动
态"
@
click=
"scrollToTop('position1')"
target=
"_blank"
/>
<ClickableCard
text=
"最新动
?
@click="
scrollToTop
('
position1
')"
target=
"_blank"
/>
<ClickableCard
text=
"资讯要闻"
@
click=
"scrollToTop('position2')"
target=
"_blank"
/>
<ClickableCard
text=
"数据总览"
@
click=
"scrollToTop('position3')"
target=
"_blank"
/>
<ClickableCard
text=
"资源
库"
@
click=
"scrollToTop('position4')"
target=
"_blank"
/>
<ClickableCard
text=
"资源
?
@click="
scrollToTop
('
position4
')"
target=
"_blank"
/>
</div>
-->
<div
class=
"home-main-header-footer-info"
>
<div
class=
"card"
v-for=
"(item, index) in infoList"
:key=
"index"
>
<div
class=
"icon"
:style=
"
{ background: item.color }">
</div>
<div
class=
"title"
>
{{
item
.
title
}}
</div>
<div
class=
"content"
>
{{
item
.
des
}}
</div>
<div
class=
"num"
:style=
"
{ color: item.color }">
{{
item
.
num
+
"
项"
}}
</div>
<div
class=
"num"
:style=
"
{ color: item.color }">
{{
item
.
num
+
"
?
}}
</div>
</div>
</div>
</div>
<el-row
:gutter=
"20"
style=
"width: 1600px; margin: 0 auto"
>
<CustomTitle
id=
"position1"
title=
"最新动
态"
style=
"margin-top: 24px"
/>
<CustomTitle
id=
"position1"
title=
"最新动
?
style="
margin-top:
24px
"
/>
<el-col
:span=
"16"
>
<custom-container
titleType=
"primary"
title=
"最新投融资限制政策"
:titleIcon=
"houseIcon"
height=
"450px"
>
<template
#
header-right
>
...
...
@@ -98,18 +98,18 @@
<
template
#
default
>
<div
class=
"box1"
>
<div
class=
"box1-top"
>
<div
class=
"box1-top-title"
>
2025
年9月12日——BIS《实体清单增列与修订条目》
<
/div>
<div
class=
"box1-top-title"
>
2025
??2日——BIS《实体清单增列与修订条目?
/div>
<div
class=
"box1-top-content"
>
<div
class=
"box1-top-content-item"
>
<span
class=
"box1-top-content-item-title"
>
· 发布机构
:
<
/span>
<span
class=
"box1-top-content-item-title"
>
· 发布机构
?
/span>
<span
class=
"box1-top-content-item-content"
>
美国商务部工业与安全局
</span>
</div>
<div
class=
"box1-top-content-item"
>
<span
class=
"box1-top-content-item-title"
>
· 生效日期
:
<
/span>
<span
class=
"box1-top-content-item-content"
>
2025
年9月12日
<
/span>
<span
class=
"box1-top-content-item-title"
>
· 生效日期
?
/span>
<span
class=
"box1-top-content-item-content"
>
2025
??2?
/span>
</div>
<div
class=
"box1-top-content-item"
>
<span
class=
"box1-top-content-item-title"
>
· 涉及领域
:
<
/span>
<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>
...
...
@@ -118,7 +118,7 @@
</div>
</div>
<div
class=
"box1-bottom"
>
<div
class=
"box1-bottom-title"
>
· 涉及主要实体
:
<
/div>
<div
class=
"box1-bottom-title"
>
· 涉及主要实体
?
/div>
<div
class=
"box1-bottom-content"
>
<div
class=
"box1-bottom-content-item"
v-for=
"(item, index) in entityList"
:key=
"index"
>
<el-image
class=
"box1-bottom-content-item-img"
:src=
"item.img"
alt=
""
></el-image>
...
...
@@ -133,7 +133,7 @@
</el-icon>
<span>
新增中国实体
</span>
</div>
<div
class=
"box1-absolute-num"
>
23
家
<
/div>
<div
class=
"box1-absolute-num"
>
23
?
/div>
</div>
</div>
</
template
>
...
...
@@ -147,7 +147,7 @@
<div
class="item-left"
:class="{
itemLeftStatus1: item.status === '一般风
险'
,
itemLeftStatus1: item.status === '一般风
?
,
itemLeftStatus2: item.status === '重大风险'
}"
>
...
...
@@ -211,14 +211,14 @@
:source="customMessage.source"
:content="customMessage.content"
/> --
<MessageBubble :avatar="trumpAvatar" name="唐纳德·特朗普" time="16:02" source="发布于真实社
交"
content="埃隆·马斯克在强力支持我竞选总统之前,早就知道我强烈反对‘电动汽车强制令’。这太荒谬了,这一直是我竞选活动的主要部分。电动汽车没问题,但不应该强迫每个人都拥有一辆。埃隆获得的补贴可能远远超过历史上任何一个人。如果没有补贴,埃隆可能不得不关门大吉,回到南非老家
。"
/>
<MessageBubble :avatar="trumpAvatar" name="唐纳德·特朗普" time="16:02" source="发布于真实社
?
content="埃隆·马斯克在强力支持我竞选总统之前,早就知道我强烈反对‘电动汽车强制令’。这太荒谬了,这一直是我竞选活动的主要部分。电动汽车没问题,但不应该强迫每个人都拥有一辆。埃隆获得的补贴可能远远超过历史上任何一个人。如果没有补贴,埃隆可能不得不关门大吉,回到南非老家
?
/>
<MessageBubble :avatar="elongAvatar" name="埃隆·马斯
克" time="16:02" source="发布于真实社交"
content="如果这个疯狂的支出法案获得通过,‘美国党’将在第二天成立
。"
/>
<MessageBubble :avatar="elongAvatar" name="埃隆·马斯
? time="16:02" source="发布于真实社?
content="如果这个疯狂的支出法案获得通过,‘美国党’将在第二天成立
?
/>
<MessageBubble :avatar="elongAvatar" name="埃隆·马斯
克" time="16:02" source="发布于真实社交"
content="提出特朗普政府的AI政策强调技术开放与快速应用,但可能以牺牲安全防范为代价,开启了“潘多拉魔盒”
。"
/>
<MessageBubble :avatar="elongAvatar" name="埃隆·马斯
? time="16:02" source="发布于真实社?
content="提出特朗普政府的AI政策强调技术开放与快速应用,但可能以牺牲安全防范为代价,开启了“潘多拉魔盒”
?
/>
</div>
</template>
</custom-container>
...
...
@@ -238,7 +238,7 @@
<el-table-column
label=
"发布次数"
width=
"180"
>
<template
#
default=
"scope"
>
<div
style=
"display: flex; align-items: center"
>
<span
style=
"margin-right: 10px; width: 40px"
>
{{
scope
.
row
.
num
}}
次
<
/span>
<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)"
/>
</div>
...
...
@@ -263,7 +263,7 @@
<el-table-column
label=
"发布次数"
width=
"180"
>
<
template
#
default=
"scope"
>
<div
style=
"display: flex; align-items: center"
>
<span
style=
"margin-right: 10px; width: 40px"
>
{{
scope
.
row
.
num
}}
次
<
/span>
<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)"
/>
</div>
...
...
@@ -282,13 +282,13 @@
</el-table>
</div>
<div
class=
"box3-content"
>
<div
class=
"box3-content-title"
>
关键与新兴技术清
单(
CETs)
</div>
<div
class=
"box3-content-title"
>
关键与新兴技术清
?
CETs)
</div>
<el-table
:data=
"tableData1"
stripe
style=
"width: 100%"
>
<el-table-column
prop=
"year"
label=
"年份"
width=
"100"
/>
<el-table-column
label=
"发布次数"
width=
"180"
>
<
template
#
default=
"scope"
>
<div
style=
"display: flex; align-items: center"
>
<span
style=
"margin-right: 10px; width: 40px"
>
{{
scope
.
row
.
num
}}
次
<
/span>
<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)"
/>
</div>
...
...
@@ -336,7 +336,7 @@
</el-row>
<el-row
:gutter=
"20"
style=
"width: 1600px; margin: 0 auto"
>
<CustomTitle
id=
"position4"
title=
"资源
库"
style=
"margin-top: 54px"
/>
<CustomTitle
id=
"position4"
title=
"资源
?
style="
margin-top:
54px
"
/>
<el-col
:span=
"8"
>
<custom-container
title=
"制裁历程"
:titleIcon=
"listIcon"
height=
"845px"
>
<
template
#
default
>
...
...
@@ -370,7 +370,7 @@
<el-col
:span=
"16"
>
<custom-container
title=
"制裁实体清单"
:titleIcon=
"entityIcon"
height=
"845px"
>
<
template
#
header-right
>
<div
class=
"box5-header-right"
>
共1329家实体
<
/div>
<div
class=
"box5-header-right"
>
?329家实?
/div>
</
template
>
<
template
#
default
>
<div
class=
"box5"
>
...
...
@@ -426,16 +426,16 @@
<!-- <el-table-column prop="revenue" label="营收(亿元)" width="140" align="right">
<template #default="scope">
<span
:class="['revenue-cell', scope.row.revenue === '无营收数
据'
? 'no-revenue' : '']"
:class="['revenue-cell', scope.row.revenue === '无营收数
?
? 'no-revenue' : '']"
>
{{ scope.row.revenue }}
</span>
</template>
</el-table-column> -->
<el-table-column
prop=
"revenue"
label=
"50%规则子企
业"
width=
"140"
align=
"right"
>
<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
>
...
...
@@ -444,7 +444,7 @@
<div
class=
"table-footer"
>
<!-- <div class="pagination-info">
第{{ currentPage }}页,共{{ totalPages }}
页
第{{ currentPage }}页,共{{ totalPages }}
?
</div> -->
<el-pagination
v-model:current-page=
"currentPage"
:page-size=
"pageSize"
:total=
"total"
:pager-count=
"5"
layout=
"prev, pager, next"
background
/>
...
...
@@ -459,7 +459,7 @@
</template>
<
script
setup
>
import
RiskSignal
from
"@/components/base/
R
iskSignal/index.vue"
;
import
RiskSignal
from
"@/components/base/
r
iskSignal/index.vue"
;
import
{
onMounted
,
ref
,
computed
}
from
"vue"
;
import
scrollToTop
from
"@/utils/scrollToTop"
;
import
setChart
from
"@/utils/setChart"
;
...
...
@@ -523,7 +523,7 @@ import shenggongIcon from "./assets/images/shenggong.png";
import
shoushiIcon
from
"./assets/images/shoushi.png"
;
import
tianyiIcon
from
"./assets/images/tianyi.png"
;
import
aircasIcon
from
"./assets/images/aircas.png"
;
// 父组件中定义 messageList 数据(avatar 对应子组
件 imageUrl 字段,需用
import 的图片才能正确显示)
// 父组件中定义 messageList 数据(avatar 对应子组
?imageUrl 字段,需?
import 的图片才能正确显示)
const
messageList
=
ref
([
{
avatar
:
trumpAvatar
,
...
...
@@ -531,21 +531,21 @@ const messageList = ref([
time
:
"2025-05-12 16:02:37"
,
source
:
"真实社交"
,
content
:
"埃隆·马斯克在强力支持我竞选总统之前,早就知道我强烈反对‘电动汽车强制令’。这太荒谬了,这一直是我竞选活动的主要部分。电动汽车没问题,但不应该强迫每个人都拥有一辆。埃隆获得的补贴可能远远超过历史上任何一个人。如果没有补贴,埃隆可能不得不关门大吉,回到南非老家
。"
"埃隆·马斯克在强力支持我竞选总统之前,早就知道我强烈反对‘电动汽车强制令’。这太荒谬了,这一直是我竞选活动的主要部分。电动汽车没问题,但不应该强迫每个人都拥有一辆。埃隆获得的补贴可能远远超过历史上任何一个人。如果没有补贴,埃隆可能不得不关门大吉,回到南非老家
?
},
{
avatar: elongAvatar,
name
:
"埃隆·马斯
克"
,
name: "
埃隆·马斯
?
,
time
:
"2025-05-12 16:02:37"
,
source
:
"真实社交"
,
content
:
"如果这个疯狂的支出法案获得通过,‘美国党’将在第二天成立
。"
content
:
"如果这个疯狂的支出法案获得通过,‘美国党’将在第二天成立
?
},
{
avatar: elongAvatar,
name
:
"埃隆·马斯
克"
,
name: "
埃隆·马斯
?
,
time
:
"2025-05-12 16:02:37"
,
source
:
"真实社交"
,
content
:
"提出特朗普政府的AI政策强调技术开放与快速应用,但可能以牺牲安全防范为代价,开启了“潘多拉魔盒”
。"
content
:
"提出特朗普政府的AI政策强调技术开放与快速应用,但可能以牺牲安全防范为代价,开启了“潘多拉魔盒”
?
}
]);
// 查看更多风险信号
...
...
@@ -568,13 +568,13 @@ const searchKey = ref("");
const infoList = ref([
{
title: "
SDN
清单
",
des
:
"由美国财政部海外资产控制办公室(OFAC)管理,通过切断目标实体或个人与美国金融体系的联系,以实现美国的外交政策和国家安全目标
。"
,
des: "
由美国财政部海外资产控制办公室(
OFAC
)管理,通过切断目标实体或个人与美国金融体系的联系,以实现美国的外交政策和国家安全目标
?
,
num
:
87
,
color
:
"rgba(5, 95, 194, 1)"
},
{
title
:
"CMIC清单"
,
des
:
"由美国财政部海外资产控制办公室(OFAC)管理,通过切断目标实体或个人与美国金融体系的联系,以实现美国的外交政策和国家安全目标
。"
,
des
:
"由美国财政部海外资产控制办公室(OFAC)管理,通过切断目标实体或个人与美国金融体系的联系,以实现美国的外交政策和国家安全目标
?
,
num: 3,
color: "
rgba
(
114
,
46
,
209
,
1
)
"
}
...
...
@@ -582,15 +582,15 @@ const infoList = ref([
const entityList = ref([
{
name
:
"北京复旦微电子技术有限公
司"
,
name: "
北京复旦微电子技术有限公
?
,
img
:
fudanIcon
},
{
name
:
"北京福康微电子技术有限公
司"
,
name
:
"北京福康微电子技术有限公
?
,
img: fukongIcon
},
{
name
:
"北京华岭微电子技术有限公
司"
,
name: "
北京华岭微电子技术有限公
?
,
img
:
hualingIcon
},
{
...
...
@@ -598,15 +598,15 @@ const entityList = ref([
img
:
jimuxiIcon
},
{
name
:
"北京盛工微电子技术有限公
司"
,
name
:
"北京盛工微电子技术有限公
?
,
img: shenggongIcon
},
{
name
:
"北京首时微电子技术有限公
司"
,
name: "
北京首时微电子技术有限公
?
,
img
:
shoushiIcon
},
{
name
:
"北京天易微电子技术有限公
司"
,
name
:
"北京天易微电子技术有限公
?
,
img: tianyiIcon
},
{
...
...
@@ -618,42 +618,42 @@ const entityList = ref([
const customNewsData = ref([
{
newsImage: newsImg,
title
:
"美国智库激辩人工智能监管路
径"
,
title: "
美国智库激辩人工智能监管路
?
,
time
:
"11-4"
,
source
:
"华盛顿邮
报"
,
from
:
"11-4 · 华盛顿邮
报"
,
source
:
"华盛顿邮
?
,
from: "
11
-
4
·
华盛顿邮
?
,
description
:
"各方就AI监管模式展开讨论。有观点认为碎片化州级监管比全面联邦法规更灵活,也有分析..."
},
{
newsImage
:
newsImg
,
title
:
"美国智库激辩人工智能监管路
径"
,
title
:
"美国智库激辩人工智能监管路
?
,
time: "
11
-
4
",
source
:
"华盛顿邮
报"
,
from
:
"11-4 · 华盛顿邮
报"
,
source: "
华盛顿邮
?
,
from
:
"11-4 · 华盛顿邮
?
,
description: "
各方就
AI
监管模式展开讨论。有观点认为碎片化州级监管比全面联邦法规更灵活,也有分析
...
"
},
{
newsImage: newsImg,
title
:
"美国智库激辩人工智能监管路
径"
,
title: "
美国智库激辩人工智能监管路
?
,
time
:
"11-4"
,
source
:
"华盛顿邮
报"
,
from
:
"11-4 · 华盛顿邮
报"
,
source
:
"华盛顿邮
?
,
from: "
11
-
4
·
华盛顿邮
?
,
description
:
"各方就AI监管模式展开讨论。有观点认为碎片化州级监管比全面联邦法规更灵活,也有分析..."
},
{
newsImage
:
newsImg
,
title
:
"美国智库激辩人工智能监管路
径"
,
title
:
"美国智库激辩人工智能监管路
?
,
time: "
11
-
4
",
source
:
"华盛顿邮
报"
,
from
:
"11-4 · 华盛顿邮
报"
,
source: "
华盛顿邮
?
,
from
:
"11-4 · 华盛顿邮
?
,
description: "
各方就
AI
监管模式展开讨论。有观点认为碎片化州级监管比全面联邦法规更灵活,也有分析
...
"
},
{
newsImage: newsImg,
title
:
"美国智库激辩人工智能监管路
径"
,
title: "
美国智库激辩人工智能监管路
?
,
time
:
"11-4"
,
source
:
"华盛顿邮
报"
,
from
:
"11-4 · 华盛顿邮
报"
,
source
:
"华盛顿邮
?
,
from: "
11
-
4
·
华盛顿邮
?
,
description
:
"各方就AI监管模式展开讨论。有观点认为碎片化州级监管比全面联邦法规更灵活,也有分析..."
}
]);
...
...
@@ -692,7 +692,7 @@ const tableData1 = ref([
}
]);
// 雷达
图
// 雷达
?
const
radarOption
=
ref
({
title
:
{
text
:
""
...
...
@@ -703,7 +703,7 @@ const radarOption = ref({
legend
:
{
top
:
0
,
icon
:
"circle"
,
data
:
[
"实体清单"
,
"商业管制清单"
,
"关键和新型技术清
单"
]
data
:
[
"实体清单"
,
"商业管制清单"
,
"关键和新型技术清
?
]
},
radar: {
// shape: 'circle',
...
...
@@ -743,7 +743,7 @@ const radarOption = ref({
},
{
value: [4000, 14000, 18000, 21000, 32000, 10000],
name
:
"关键和新型技术清
单"
,
name: "
关键和新型技术清
?
,
areaStyle
:
{
color
:
"rgba(250, 140, 22, 0.2)"
}
...
...
@@ -753,7 +753,7 @@ const radarOption = ref({
]
});
// 趋势
图
// 趋势
?
const
trendOption
=
ref
({
tooltip
:
{
trigger
:
"axis"
,
...
...
@@ -873,36 +873,36 @@ const trendOption = ref({
// 历次制裁过程
const
sanctionProcessList
=
ref
([
{
title
:
"2025
年3
月—SDN清单"
,
desc
:
"54家中国实
体"
,
title
:
"2025
?
月—SDN清单"
,
desc
:
"54家中国实
?
,
content:
"2025
年3月25日,美国商务部工业与安全局以从事有悖于美国国家安全和外交政策利益的活动为由,宣布将来自中国的54家实体新增至“实体清单”。"
"
2025
??
5
日,美国商务部工业与安全局以从事有悖于美国国家安全和外交政策利益的活动为由,宣布将来自中国
?
4
家实体新增至“实体清单”
?
},
{
title
:
"2025
年1
月—SDN清单"
,
desc
:
"25家中国实
体"
,
title
:
"2025
?
月—SDN清单"
,
desc
:
"25家中国实
?
,
content:
"2025
年1月15日,美国商务部工业和安全局宣布更新《出口管理条例》(EAR),并发布两项最终规则,将25家中国企业及其相关实体列入实体清单。"
"
2025
??
5
日,美国商务部工业和安全局宣布更新《出口管理条例》(
EAR
),并发布两项最终规则,
?
5
家中国企业及其相关实体列入实体清单
?
},
{
title
:
"2025
年1
2月—SDN清单"
,
desc
:
"12家中国实
体"
,
title
:
"2025
?
2月—SDN清单"
,
desc
:
"12家中国实
?
,
content:
"2024
年12月20日,美国商务部工业与安全局以从事有悖于美国国家安全和外交政策利益的活动为由,宣布将来自中国的12家实体新增至“商业管制清单”。"
"
2024
?
2
?
0
日,美国商务部工业与安全局以从事有悖于美国国家安全和外交政策利益的活动为由,宣布将来自中国
?
2
家实体新增至“商业管制清单”
?
},
{
title
:
"2024
年1
0月—CMIC清单"
,
desc
:
"6家中国实
体"
,
content
:
"2024
年10月21日,美国商务部将6个中国实体加入其“实体清单”,同时将 1 个中国实体移出该清单。"
title
:
"2024
?
0月—CMIC清单"
,
desc
:
"6家中国实
?
,
content: "
2024
?
0
?
1
日,美国商务部将
6
个中国实体加入其“实体清单”,同时
?
1
个中国实体移出该清单
?
},
{
title
:
"2024
年8
月—SDN清单"
,
desc
:
"39家中国实
体"
,
content
:
"2024
年8月23日,美国商务部工业安全局发布公告,将多个外国实体加入其“实体清单”,其中包括39个中国实体。"
title
:
"2024
?
月—SDN清单"
,
desc
:
"39家中国实
?
,
content: "
2024
??
3
日,美国商务部工业安全局发布公告,将多个外国实体加入其“实体清单”,其中包括
39
个中国实体
?
}
]);
// 进度条状
态
// 进度条状
?
const
getStatus
=
_percent
=>
{
const
percent
=
_percent
*
100
;
if
(
percent
>=
90
)
{
...
...
@@ -914,29 +914,29 @@ const getStatus = _percent => {
}
};
// 制裁实体
const
currentPage
=
ref
(
1
);
// 默认显示
第5页
const
currentPage
=
ref
(
1
);
// 默认显示
??
const
pageSize
=
ref
(
10
);
const
searchKeyword
=
ref
(
""
);
const
strengthLabels
=
{
strong
:
"
强"
,
medium
:
"
中"
,
weak
:
"
弱"
,
none
:
"
无"
strong
:
"
?
,
medium: "
?
,
weak
:
"
?
,
none: "
?
};
// 模拟数据
const
mockData
=
[
{
name
:
"科大讯飞股份有限公司"
,
domains
:
[
"人工智能"
],
sanctionDate
:
"2025
年9月"
,
sanctionDate
:
"2025
??
,
strength: "
strong
",
revenue: "
325
",
listingLocation: "
深圳
"
},
{
name
:
"华为技术有限公
司"
,
name: "
华为技术有限公
?
,
domains
:
[
"通信网络"
,
"集成电路"
],
sanctionDate
:
"2025
年9月"
,
sanctionDate
:
"2025
??
,
strength: "
medium
",
revenue: "
290
",
listingLocation: ""
...
...
@@ -944,15 +944,15 @@ const mockData = [
{
name: "
中国航空工业集团
",
domains: ["
航空航天
"],
sanctionDate
:
"2025
年9月"
,
sanctionDate: "
2025
??
,
strength
:
"medium"
,
revenue
:
"288"
,
listingLocation
:
""
},
{
name
:
"杭州海康威视数字技术股份有限公
司"
,
name
:
"杭州海康威视数字技术股份有限公
?
,
domains: ["
人工智能
"],
sanctionDate
:
"2025
年9月"
,
sanctionDate: "
2025
??
,
strength
:
"weak"
,
revenue
:
"203"
,
listingLocation
:
"深圳"
...
...
@@ -960,39 +960,39 @@ const mockData = [
{
name
:
"浪潮集团有限公司"
,
domains
:
[
"人工智能"
],
sanctionDate
:
"2025
年9月"
,
sanctionDate
:
"2025
??
,
strength: "
medium
",
revenue: "
195
",
listingLocation: "
香港
"
},
{
name
:
"中芯国际集成电路制造有限公
司"
,
name: "
中芯国际集成电路制造有限公
?
,
domains
:
[
"集成电路"
],
sanctionDate
:
"2025
年9月"
,
sanctionDate
:
"2025
??
,
strength: "
medium
",
revenue: "
190
",
listingLocation: ""
},
{
name
:
"北京复旦微电子技术有限公
司"
,
name: "
北京复旦微电子技术有限公
?
,
domains
:
[
"集成电路"
],
sanctionDate
:
"2025
年9月"
,
sanctionDate
:
"2025
??
,
strength: "
medium
",
revenue: "
184
",
listingLocation: ""
},
{
name
:
"哈尔滨工业大
学"
,
name: "
哈尔滨工业大
?
,
domains
:
[
"人工智能"
,
"集成电路"
],
sanctionDate
:
"2025
年9月"
,
sanctionDate
:
"2025
??
,
strength: "
medium
",
revenue
:
"无营收数
据"
,
revenue: "
无营收数
?
,
listingLocation
:
""
},
{
name
:
"中兴通讯股份有限公司"
,
domains
:
[
"通信网络"
,
"集成电路"
],
sanctionDate
:
"2025
年9月"
,
sanctionDate
:
"2025
??
,
strength: "
medium
",
revenue: "
117
",
listingLocation: "
上海
"
...
...
@@ -1000,17 +1000,17 @@ const mockData = [
{
name: "
大疆创新科技有限公司
",
domains: ["
航空航天
"],
sanctionDate
:
"2025
年9月"
,
sanctionDate: "
2025
??
,
strength
:
"medium"
,
revenue
:
"1"
,
listingLocation
:
"纽约"
}
];
// 生成更多数据以模
拟1329家实体
// 生成更多数据以模
?329家实?
const
generateMoreData
=
()
=>
{
const
moreData
=
[];
const
companySuffixes
=
[
"有限公司"
,
"集团"
,
"股份有限公司"
,
"技术有限公
司"
,
"研究所"
];
const
companySuffixes
=
[
"有限公司"
,
"集团"
,
"股份有限公司"
,
"技术有限公
?
, "
研究所
"];
const domainsList = [
["
人工智能
"],
["
通信网络
"],
...
...
@@ -1032,7 +1032,7 @@ const generateMoreData = () => {
moreData.push({
name: companyName,
domains: domains,
sanctionDate
:
"2025
年9月"
,
sanctionDate: "
2025
??
,
strength
:
strength
,
revenue
:
revenue
.
toString
()
});
...
...
@@ -1043,7 +1043,7 @@ const generateMoreData = () => {
const
allData
=
[...
mockData
,
...
generateMoreData
()];
// 计算属
性
// 计算属
?
const
total
=
computed
(()
=>
allData
.
length
);
const
totalPages
=
computed
(()
=>
Math
.
ceil
(
total
.
value
/
pageSize
.
value
));
...
...
@@ -1085,7 +1085,7 @@ const warningList = ref([
status
:
"特别重大"
},
{
title
:
"首次提出“限制外国敏感实体获取补
贴"
,
title
:
"首次提出“限制外国敏感实体获取补
?
,
time: "
一天前
",
status: "
重大风险
"
},
...
...
@@ -1095,97 +1095,97 @@ const warningList = ref([
status: "
重大风险
"
},
{
title
:
"H.R.8333《生物安全法案》将华大基因
等.
.."
,
title: "
H
.
R
.
8333
《生物安全法案》将华大基因
?
..
",
time: "
一天前
",
status
:
"一般风
险"
status: "
一般风
?
}
]);
const
curBillList
=
ref
([
{
billName
:
"大而美法案"
,
introductionDate
:
"2025
年7月4日"
,
introductionDate
:
"2025
???
,
img: bill1
},
{
billName
:
"GENIUS稳定币法
案"
,
introductionDate
:
"2025
年7月5日"
,
billName: "
GENIUS
稳定币法
?
,
introductionDate
:
"2025
???
,
img: bill2
},
{
billName: "
美越贸易协议
",
introductionDate
:
"2025
年7月6日"
,
introductionDate: "
2025
???
,
img
:
bill3
},
{
billName
:
"美越贸易协议"
,
introductionDate
:
"2025
年7月7日"
,
introductionDate
:
"2025
???
,
img: bill4
},
{
billName
:
"汽车零部
件2
5%关税实施规则"
,
introductionDate
:
"2025
年7月10日"
,
billName: "
汽车零部
?
5
%
关税实施规则
",
introductionDate: "
2025
??
0
?
,
img
:
bill5
},
{
billName
:
"汽车零部
件2
5%关税实施规则"
,
introductionDate
:
"2025
年7月12日"
,
billName
:
"汽车零部
?
5%关税实施规则"
,
introductionDate
:
"2025
??2?
,
img: bill6
},
{
billName: "
小额豁免包裹政策调整
",
introductionDate
:
"2025
年7月14日"
,
introductionDate: "
2025
??
4
?
,
img
:
bill7
},
{
billName
:
"NIH预算否决
案"
,
introductionDate
:
"2025
年7月15日"
,
billName
:
"NIH预算否决
?
,
introductionDate: "
2025
??
5
?
,
img
:
bill8
},
{
billName
:
"得州国会选区重划法案"
,
introductionDate
:
"2025
年7月17日"
,
introductionDate
:
"2025
??7?
,
img: bill9
},
{
billName: "
美越贸易协议
",
introductionDate
:
"2025
年7月24日"
,
introductionDate: "
2025
??
4
?
,
img
:
bill10
},
{
billName
:
"美越贸易协议"
,
introductionDate
:
"2025
年8月4日"
,
introductionDate
:
"2025
???
,
img: bill11
},
{
billName: "
美越贸易协议
",
introductionDate
:
"2025
年8月8日"
,
introductionDate: "
2025
???
,
img
:
bill12
}
]);
const
releaseTime
=
ref
(
"近一年发
布"
);
const
releaseTime
=
ref
(
"近一年发
?
);
const releaseTimeList = ref([
{
label
:
"近半年发
布"
,
value
:
"近半年发
布"
label: "
近半年发
?
,
value
:
"近半年发
?
},
{
label
:
"近一年发
布"
,
value
:
"近一年发
布"
label: "
近一年发
?
,
value
:
"近一年发
?
},
{
label
:
"近两年发
布"
,
value
:
"近两年发
布"
label: "
近两年发
?
,
value
:
"近两年发
?
},
{
label
:
"近三年发
布"
,
value
:
"近三年发
布"
label: "
近三年发
?
,
value
:
"近三年发
?
},
{
label
:
"近五年发
布"
,
value
:
"近五年发
布"
label: "
近五年发
?
,
value
:
"近五年发
?
}
]);
...
...
@@ -1195,11 +1195,11 @@ const categoryList = ref([
// "
集成电路
",
// "
通信网络
",
// "
量子科技
",
// "新能
源"
,
// "新一代信息技
术"
,
// "
新能
?
,
// "新一代信息技
?
,
// "海洋",
// "先进制
造"
,
// "新材
料"
,
// "先进制
?
,
// "新材
?
,
// "航空航天",
]);
...
...
@@ -1392,7 +1392,7 @@ onMounted(async () => {
align-items
:
center
;
justify-content
:
flex-start
;
width
:
48%
;
/* 留出2%的间
距
*/
/* 留出2%的间
?
*/
// margin-bottom: 6px;
box-sizing
:
border-box
;
gap
:
10px
;
...
...
@@ -2558,7 +2558,7 @@ onMounted(async () => {
.center-center-news
{
flex-shrink
:
0
;
/* 保证内部 NewsList 的滚动条与外
层
box3 右侧对齐 */
/* 保证内部 NewsList 的滚动条与外
?
box3 右侧对齐 */
:deep
(
.box3-main
)
{
width
:
100%
;
box-sizing
:
border-box
;
...
...
src/views/marketAccessRestrictions/marketAccessHome/index.vue
浏览文件 @
01a8b2b3
...
...
@@ -50,7 +50,7 @@
<
/div
>
<
/div
>
<
div
class
=
"home-main-center"
>
<
DivideHeader
id
=
"position1"
class
=
"divide-header"
:
titleText
=
"'最新动
态'
"
><
/DivideHeader
>
<
DivideHeader
id
=
"position1"
class
=
"divide-header"
:
titleText
=
"'最新动
?
"
><
/DivideHeader
>
<
div
class
=
"center-top"
>
<
div
class
=
"box1"
>
<
overviewMainBox
title
=
"调查进展"
@
toDetail
=
"handleClickToDetail()"
>
...
...
@@ -91,33 +91,33 @@
<
div
class
=
"list-box"
>
<
div
class
=
"list-item"
>
<
div
class
=
"icon"
><
/div
>
<
div
class
=
"list-left"
>
{{
"调查案号
:"
}}
<
/div
>
<
div
class
=
"list-left"
>
{{
"调查案号
?
}}
</div>
<div class="
list
-
right
">{{ item.searchnum
}}
</div>
</div>
<div class="
list
-
item
">
<div class="
icon
"></div>
<
div
class
=
"list-left"
>
{{
"涉及产品
:"
}}
<
/div
>
<div class="
list
-
left
">{{ "
涉及产品
?
}}
<
/div
>
<
div
class
=
"list-right"
>
{{
item
.
product
}}
<
/div
>
<
/div
>
<
div
class
=
"list-item"
>
<
div
class
=
"icon"
><
/div
>
<
div
class
=
"list-left"
>
{{
"原告
:"
}}
<
/div
>
<
div
class
=
"list-left"
>
{{
"原告
?
}}
</div>
<div class="
list
-
right
">
{{ item.plaintiff
}}
</div>
</div>
<div class="
list
-
item
">
<div class="
icon
"></div>
<
div
class
=
"list-left"
>
{{
"被告
:"
}}
<
/div
>
<div class="
list
-
left
">{{ "
被告
?
}}
<
/div
>
<
div
class
=
"list-right"
>
{{
item
.
defendant
}}
<
/div
>
<
/div
>
<
div
class
=
"list-item"
>
<
div
class
=
"icon"
><
/div
>
<
div
class
=
"list-left"
>
{{
"涉案专利
:"
}}
<
/div
>
<
div
class
=
"list-left"
>
{{
"涉案专利
?
}}
</div>
<div class="
list
-
right
">
{{ item.patent
}}
</div>
...
...
@@ -189,7 +189,7 @@
</div>
<div class="
center
-
footer1
">
<div class="
box7
">
<
OverviewNormalBox
title
=
"受调查国家分
布"
width
=
"1064px"
>
<OverviewNormalBox title="
受调查国家分
?
width
=
"1064px"
>
<
template
#
header
-
icon
>
<
img
style
=
"width: 100%; height: 100%;"
src
=
"./assets/icons/icon4.svg"
alt
=
""
/>
<
/template
>
...
...
@@ -242,7 +242,7 @@
<
/div
>
<
/div
>
<
div
class
=
"home-main-footer"
>
<
DivideHeader
id
=
"position4"
class
=
"divide-header"
:
titleText
=
"'资源
库'
"
><
/DivideHeader
>
<
DivideHeader
id
=
"position4"
class
=
"divide-header"
:
titleText
=
"'资源
?
"
><
/DivideHeader
>
<
div
class
=
"home-main-footer-header"
>
<
SourceTabList
:
sourceTabList
=
"categoryList"
:
activeSouceTabId
=
"activeCateId"
@
clickTab
=
"handleClickCate"
>
<
/SourceTabList
>
...
...
@@ -306,7 +306,7 @@
<
div
class
=
"left-box2"
>
<
div
class
=
"left-box2-header"
>
<
div
class
=
"icon"
><
/div
>
<
div
class
=
"title"
>
{{
"受调查国
家/
地区"
}}
<
/div
>
<
div
class
=
"title"
>
{{
"受调查国
?
地区"
}}
<
/div
>
<
/div
>
<
div
class
=
"left-box2-main"
>
<
el
-
checkbox
-
group
class
=
"checkbox-group"
v
-
model
=
"checkedCountryList"
...
...
@@ -328,7 +328,7 @@
<
/div
>
<
div
class
=
"right-main"
>
<
el
-
empty
v
-
if
=
"surveyInfoList.length === 0"
description
=
"当前条件下暂无数
据"
:
image
-
size
=
"200"
/>
<
el
-
empty
v
-
if
=
"surveyInfoList.length === 0"
description
=
"当前条件下暂无数
?
:image-size="
200
" />
<div v-else class="
right
-
main
-
item
" v-for="
(
item
,
index
)
in
surveyInfoList
" :key="
index
"
@click="
handleClickToSurveyDetail
(
item
.
sortcode
)
">
<div class="
item
-
left
">
...
...
@@ -375,7 +375,7 @@
</div>
<div class="
right
-
footer
">
<div class="
footer
-
left
">
{{
`
共
${totalDiscussNum
}
项`
}}
{{ `
?
${totalDiscussNum
}
项`
}}
</div>
<div class="
footer
-
right
">
<el-pagination @current-change="
handleCurrentChange
" :pageSize="
pageSize
" :current-page="
currentPage
"
...
...
@@ -394,7 +394,7 @@ import { onMounted, ref, nextTick } from "vue";
import LeftBtn from "
@
/components/
base
/
PageBtn
/
LeftBtn
.
vue
";
import RightBtn from "
@
/components/
base
/
PageBtn
/
RightBtn
.
vue
";
import
RiskSignal
from
"@/components/base/
R
iskSignal/index.vue"
;
import RiskSignal from "
@
/components/
base
/
r
iskSignal
/
index
.
vue
";
import TipTab from "
@
/components/
base
/
TipTab
/
index
.
vue
"
import MessageBubble from "
@
/components/
base
/
MessageBubble
/
index
.
vue
"
import NewsList from "
@
/components/
base
/
NewsList
/
index
.
vue
";
...
...
@@ -434,7 +434,7 @@ const handleToPosi = id => {
// isShow.value = true;
//
}
// 2. 使用 nextTick 等待 DOM 布局(如高度切换)完成后再进行坐标计
算
// 2. 使用 nextTick 等待 DOM 布局(如高度切换)完成后再进行坐标计
?
nextTick
(()
=>
{
const
containerRect
=
containerRef
.
value
.
getBoundingClientRect
();
const
elementRect
=
element
.
getBoundingClientRect
();
...
...
@@ -459,9 +459,9 @@ const formatDate = (dateStr, dateType) => {
if
(
dateType
===
'year'
)
{
return
year
}
else
{
return
`${month.toString().padStart(2, "0")
}
月$
{day.toString().padStart(2, "0")
}
日`
return
`${month.toString().padStart(2, "0")
}
?
{day.toString().padStart(2, "0")
}
日`
}
// return `$
{
year
}
年
$
{
month
.
toString
().
padStart
(
2
,
"0"
)
}月
$
{
day
.
toString
().
padStart
(
2
,
"0"
)
}日
`;
// return `$
{
year
}
?{
month
.
toString
().
padStart
(
2
,
"0"
)
}
?
{
day
.
toString
().
padStart
(
2
,
"0"
)
}日
`;
}
let containerRef = ref(null);
...
...
@@ -495,7 +495,7 @@ const handleClickToDetail = () => {
activeIndex = carouselRef.value.activeIndex;
}
console.log("当前 Carousel 激活索
引:
", activeIndex);
console.log("当前 Carousel 激活索
?
", activeIndex);
const id = box1DataList.value[activeIndex].SEARCHSORT;
window.sessionStorage.setItem("curTabName", id + "调查概览");
...
...
@@ -567,7 +567,7 @@ const handleGetBox3Data = async () => {
}
}
catch (error) {
}
}
;
// 点击新闻条目,跳转到新闻分析
页
// 点击新闻条目,跳转到新闻分析
?
const handleToNewsAnalysis = news => {
const route = router.resolve({
path: "/newsAnalysis",
...
...
@@ -644,7 +644,7 @@ const handleClickPerson = async item => {
const route = router.resolve({
path: "/characterPage",
query: {
type: type, // type=1为科技企业领袖
,2为国会议员,3为智库研究人员
type: type, // type=1为科技企业领袖
?为国会议员,3为智库研究人?
personId: item.personId
}
}
);
...
...
@@ -664,11 +664,11 @@ const handleClickPerson = async item => {
// 调查数量
const box5BtnList = ref([
{
name: "按月
度"
,
name: "按月
?
,
value: 1
}
,
{
name: "按年
度"
,
name: "按年
?
,
value: 12
}
]);
...
...
@@ -688,14 +688,14 @@ function transformAllData(originalData) {
// 2. 获取所有调查类型并去重
const allCategories = [...new Set(originalData.map(item => item.sortName))];
// 3. 为每个类别创建值数
组
// 3. 为每个类别创建值数
?
const categoryData = allCategories.map(category => {
// 对于每个年份,查找对应的数据
const values = allYears.map(year => {
// 查找匹配当前类别和年份的数据
const matchingItem = originalData.find(item => item.sortName === category && String(item.searchYorM) === year);
// 如果找到则返回searchCount,否则返
回0
// 如果找到则返回searchCount,否则返
?
return matchingItem ? matchingItem.searchCount : 0;
}
);
...
...
@@ -705,7 +705,7 @@ function transformAllData(originalData) {
}
;
}
);
// 4. 构建最终结
果
// 4. 构建最终结
?
return {
title: allYears,
data: categoryData
...
...
@@ -726,7 +726,7 @@ function transformAllData1(originalData) {
const [year, month] = dateStr.split("-").map(Number);
return { year, month: month || 0
}
;
}
else {
// 处理纯年份格
式
// 处理纯年份格
?
return { year: Number(dateStr), month: 0
}
;
}
}
;
...
...
@@ -734,7 +734,7 @@ function transformAllData1(originalData) {
const dateA = parseDate(a);
const dateB = parseDate(b);
// 先比较年份,再比较月
份
// 先比较年份,再比较月
?
if (dateA.year !== dateB.year) {
return dateA.year - dateB.year;
}
...
...
@@ -744,14 +744,14 @@ function transformAllData1(originalData) {
// 2. 获取所有调查类型并去重
const allCategories = [...new Set(originalData.map(item => item.sortName))];
// 3. 为每个类别创建值数
组
// 3. 为每个类别创建值数
?
const categoryData = allCategories.map(category => {
// 对于每个日期,查找对应的数据
const values = allDates.map(date => {
// 查找匹配当前类别和日期的数据
const matchingItem = originalData.find(item => item.sortName === category && String(item.searchYorM) === date);
// 如果找到则返回searchCount,否则返
回0
// 如果找到则返回searchCount,否则返
?
return matchingItem ? matchingItem.searchCount : 0;
}
);
...
...
@@ -761,7 +761,7 @@ function transformAllData1(originalData) {
}
;
}
);
// 4. 构建最终结
果
// 4. 构建最终结
?
return {
title: allDates,
data: categoryData
...
...
@@ -787,7 +787,7 @@ const box5ChartData = ref({
}
);
const hadleGetStatNum = async () => {
const params = {
byYorM: box5BtnActive.value // 月度
:1 年度:1
2
byYorM: box5BtnActive.value // 月度
? 年度?
2
}
;
try {
const res = await getStatNum(params);
...
...
@@ -930,7 +930,7 @@ const handleBox6 = async () => {
setChart(chart2, "chart2");
}
;
// 受调查国家分
布
// 受调查国家分
?
const box7SurveyList = ref([
{
label: "337调查",
...
...
@@ -994,7 +994,7 @@ const handleGetBox7Data = async () => {
}
;
try {
const res = await getSearchCountry(params);
console.log("受调查国家分
布"
, res);
console.log("受调查国家分
?
, res);
if (res.code === 200 && res.data) {
box7Data.value.title = res.data.map(item => {
return {
...
...
@@ -1070,7 +1070,7 @@ const handleChangeBox8Survey = () => {
handleBox8();
}
;
// 资源
库
// 资源
?
const pageSize = ref(10);
const currentPage = ref(1);
const totalDiscussNum = ref(0);
...
...
@@ -1114,7 +1114,7 @@ const releaseTimeList = ref([
value: true
}
,
{
label: "按发布时间升
序"
,
label: "按发布时间升
?
,
value: false
}
]);
...
...
@@ -1130,23 +1130,23 @@ const handlePxChange = val => {
const surveyYearList = ref([
{
name: "2025
年"
,
name: "2025
?
,
id: "2025"
}
,
{
name: "2024
年"
,
name: "2024
?
,
id: "2024"
}
,
{
name: "2023
年"
,
name: "2023
?
,
id: "2023"
}
,
{
name: "2022
年"
,
name: "2022
?
,
id: "2022"
}
,
{
name: "2021
年"
,
name: "2021
?
,
id: "2021"
}
]);
...
...
@@ -1201,15 +1201,15 @@ const handleChangeCheckedAreas = (val) => {
// 发布机构
const insList = ref([
{
name: "商务
部"
,
name: "商务
?
,
id: "54"
}
,
{
name: "国际贸易委员
会"
,
name: "国际贸易委员
?
,
id: "262"
}
,
{
name: "贸易代表办公
室"
,
name: "贸易代表办公
?
,
id: "491"
}
]);
...
...
@@ -1251,7 +1251,7 @@ const handleChangeCheckedIns = (val) => {
handleGetSurveyList();
}
;
// 受调查国
家/
地区
// 受调查国
?
地区
const countryList = ref([
]);
const checkedCountryList = ref(['全部']);
...
...
@@ -1259,7 +1259,7 @@ const handleGetAllSearchCountry = async () => {
try {
const res = await getSearchAllCountry()
console.log('受调查国
家/
地区', res);
console.log('受调查国
?
地区', res);
if (res.code && res.data) {
countryList.value = res.data.map(item => {
return {
...
...
src/views/ruleRestriction/components/dataNew/index.vue
浏览文件 @
01a8b2b3
...
...
@@ -5,7 +5,7 @@
<img
src=
"./assets/rightbtn.png"
alt
class=
"right-btn"
@
click=
"changeIndex(1)"
/>
<div
class=
"left-top"
>
<img
src=
"./assets/icon01.png"
alt
/>
<div
class=
"left-top-title"
>
规
则
限制动态
</div>
<div
class=
"left-top-title"
>
閫
?
/div>
<div
class=
"more"
@
click=
"handleClickToDetail"
>
祕 >
</div>
</div>
<div
class=
"left-center"
>
...
...
@@ -15,22 +15,22 @@
<div
class=
"left-center-main-ul"
>
<ul>
<li>
<span
class=
"ul-title"
>
发
布机构:
</span>
<span
class=
"ul-title"
>
?
/span>
<span
class=
"ul-content"
>
{{
latestUpdateList
[
latestUpdateIndex
].
PUBLISHORGNAME
}}
</span>
</li>
<li>
<span
class=
"ul-title"
>
发
布日期:
</span>
<span
class=
"ul-title"
>
?
/span>
<span
class=
"ul-content"
>
{{
latestUpdateList
[
latestUpdateIndex
].
PUBLISHDATE
}}
</span>
</li>
<li>
<span
class=
"ul-title"
>
涉
及
领域:
</span>
<span
class=
"ul-title"
>
瘨
?
/span>
<span
class=
"ul-pie cl1"
v-for=
"item in latestUpdateList[latestUpdateIndex].ruleAreas"
>
{{
item
}}
</span>
<!--
<span
class=
"ul-pie cl2"
>
頝
</span>
<span
class=
"ul-pie cl3"
>
新
材料
</span>
<span
class=
"ul-pie cl3"
>
?
/span>
<span
class=
"ul-pie cl4"
>
蝘
</span>
-->
</li>
<li>
<span
class=
"ul-title"
>
限
制
实体:
</span>
<span
class=
"ul-title"
>
摰
?
/span>
<span
class=
"ul-content"
v-for=
"item in latestUpdateList[latestUpdateIndex].ruleEntities"
>
{{
item
.
ORGNAME
}}
</span>
</li>
...
...
@@ -41,7 +41,7 @@
</div>
<div
class=
"left-bottom"
>
<ul>
<li
class=
"left-bottom-li"
>
内
容
摘要:
</li>
<li
class=
"left-bottom-li"
>
捆
?
/li>
</ul>
<div
class=
"left-bottom-content"
>
{{
latestUpdateList
[
latestUpdateIndex
].
RULEINTRODUCTION
}}
</div>
</div>
...
...
@@ -58,7 +58,7 @@
<div
v-for=
"(item, index) in list"
:key=
"index"
class=
"right-main"
>
<div
class=
"main-left"
:class=
"
{ cl4: item.signalLevel === '特别重大', cl5: item.signalLevel === '重大风险', cl6: item.signalLevel ==
=
'一般风险'}"
:class=
"
{ cl4: item.signalLevel === '之', cl5: item.signalLevel === '之憌', cl6: item.signalLevel === '銝憌
?
}"
>
{{
item
.
signalLevel
}}
</div>
<div
class=
"main-center"
>
{{
item
.
signalTitle
}}
</div>
<div
class=
"main-right"
>
{{
item
.
signalTime
}}
</div>
...
...
@@ -75,7 +75,7 @@
</
template
>
<
script
setup
>
import
RiskSignal
from
"@/components/base/
R
iskSignal/index.vue"
;
import
RiskSignal
from
"@/components/base/
r
iskSignal/index.vue"
;
import
{
ref
,
onBeforeMount
,
computed
}
from
"vue"
;
import
router
from
"@/router"
;
import
{
getLatestUpdates
,
getRiskSignal
}
from
'@/api/ruleRestriction/index.js'
...
...
@@ -84,7 +84,7 @@ const list = ref([
{
id
:
1
,
title
:
"之"
,
content
:
"保护美国资金与
专
业知识免受敌对研究利用法案"
,
content
:
"靽蝢韏霂笆弦瘜
?
,
time: "
銝憭拙
"
},
{
...
...
@@ -96,7 +96,7 @@ const list = ref([
{
id: 3,
title: "
之憌
",
content
:
"众议院“美中
战
略竞争特别委员会”向国会提..."
,
content: "
隡悅葉蝡憪隡
?
..
",
time: "
銝憭拙
"
},
{
...
...
@@ -107,7 +107,7 @@ const list = ref([
}
]);
//
最
新动态列表
//
?
const latestUpdateList = ref([{}])
// 敶蝷箸
const latestUpdateIndex = ref(0)
...
...
@@ -115,14 +115,14 @@ const latestUpdateIndex = ref(0)
//
const changeIndex = (num) => {
if (num === -1) {
// 判断当前是否是第一个,是的话则将序号设置为最后一个
// 敶蝚砌銝迎霈曄蔭銝箸銝
?
if (latestUpdateIndex.value === 0) {
latestUpdateIndex.value = latestUpdateList.value.length - 1
} else {
latestUpdateIndex.value--
}
} else {
// 判断当前是否是最后一个,是的话则将序号设置为第一个
// 敶銝迎霈曄蔭銝箇洵銝銝
?
if (latestUpdateIndex.value === latestUpdateList.value.length - 1) {
latestUpdateIndex.value = 0
} else {
...
...
@@ -141,7 +141,7 @@ const getLatestUpdateInfo = async () => {
latestUpdateList.value = res.data
}
} catch (error) {
console
.
error
(
"获取
最新
动态接口失败:"
,
error
);
console.error("
憭梯
?
", error);
}
}
...
...
@@ -165,7 +165,7 @@ const handleClickToDetail = () => {
window.open(`/ruleRestrictions/detail?id=${latestUpdateList.value[latestUpdateIndex.value].RULEID}`, "
_blank
");
};
// 左侧展示的主动态
// 撌虫儒撅內蜓
?
const mainTrend = computed(() => {
if (riskSignalList.value.length === 0) return null;
return riskSignalList.value[activeIndex.value] || riskSignalList.value[0];
...
...
@@ -194,7 +194,7 @@ const handleToRiskDetail = (item) => {
// window.open(curRoute.href, "
_blank
");
// };
// 查看更多动态
// 憭
?
const handleToMoreRiskSignal = () => {
const route = router.resolve("
/
viewRiskSignal
");
window.open(route.href, "
_blank
");
...
...
src/views/scientificFunding/components/dataNew/index.vue
浏览文件 @
01a8b2b3
...
...
@@ -5,7 +5,7 @@
<img
src=
"./assets/rightbtn.png"
alt=
""
class=
"right-btn"
@
click=
"handleSwithCurDecree('right')"
/>
<div
class=
"left-top"
>
<img
src=
"./assets/icon01.png"
alt=
""
/>
<div
class=
"left-top-title"
>
最新资助项
目
<
/div>
<div
class=
"left-top-title"
>
韏憿寧?/
d
iv>
<span>
祕 >
</span>
</div>
<el-carousel
ref=
"carouselRef"
height=
"395px"
:autoplay=
"true"
:interval=
"3000"
arrow=
"never"
...
...
@@ -21,24 +21,24 @@
<div
class=
"left-center-main-ul"
>
<ul>
<li>
<span
class=
"ul-title"
>
投资主体
:
<
/span>
<span
class=
"ul-content"
>
美国国家科学基金
会
<
/span>
<span
class=
"ul-title"
>
蜓雿?/
s
pan>
<span
class=
"ul-content"
>
蝢摰嗥郎?/sp
a
n>
</li>
<li>
<span
class=
"ul-title"
>
发布日期
:
<
/span>
<span
class=
"ul-title"
>
?/sp
a
n>
<span
class=
"ul-content"
>
{{
itemData
.
publicationDate
}}
</span>
</li>
<li>
<span
class=
"ul-title"
>
资助经费
:
<
/span>
<span
class=
"ul-title"
>
韏蝏晶嚗
?
/span>
<span
class=
"ul-content"
>
{{
itemData
.
amount
}}
</span>
</li>
<li>
<span
class=
"ul-title"
>
涉及领域
:
<
/span>
<span
class=
"ul-title"
>
瘨?/s
p
an>
<span
class=
"ul-pie cl1"
v-for=
"value in itemData.toOrgNameList"
>
{{
value
}}
</span>
</li>
<li>
<span
class=
"ul-title"
>
资助对象
:
<
/span>
<span
class=
"ul-title"
>
韏撖寡情
嚗
?/span>
<span
class=
"ul-content"
>
{{
itemData
.
fromOrgNameList
.
join
(
','
)
}}
</span>
</li>
</ul>
...
...
@@ -48,7 +48,7 @@
</div>
<div
class=
"left-bottom"
>
<ul>
<li
class=
"left-bottom-li"
>
内容摘要
:
<
/li>
<li
class=
"left-bottom-li"
>
捆?/l
i
>
</ul>
<div
class=
"left-bottom-content"
>
{{
itemData
.
abstractContent
}}
</div>
...
...
@@ -70,7 +70,7 @@
<div
class=
"main-left"
:class=
"
{
cl4: item.signalLevel === '之',
cl5: item.signalLevel === '之憌',
cl6: item.signalLevel === '一般风
险'
cl6: item.signalLevel === '銝憌?
}">
{{
item
.
signalLevel
}}
</div>
...
...
@@ -89,7 +89,7 @@
</
template
>
<
script
setup
>
import
RiskSignal
from
"@/components/base/
R
iskSignal/index.vue"
;
import
RiskSignal
from
"@/components/base/
r
iskSignal/index.vue"
;
import
{
ref
,
onMounted
}
from
"vue"
;
import
{
getNewProject
,
getRiskSignal
...
...
@@ -105,14 +105,14 @@ const list = ref([
},
{
id
:
2
,
title
:
"一般风
险"
,
content
:
"美国NASA公布NIAC计划2025年度第一轮资
助"
,
title
:
"銝憌?
,
content: "
蝢
NASA
撣
IAC
霈∪
2025
撟游漲蝚砌頧株
?,
time
:
"銝憭拙"
},
{
id
:
3
,
title
:
"之"
,
content
:
"美国NASA公布“早期创新计划
”2026年资助.
.."
,
content
:
"蝢NASA撣霈∪?026撟渲?
.."
,
time
:
"銝憭拙"
},
{
...
...
@@ -130,7 +130,7 @@ const list = ref([
{
id
:
6
,
title
:
"之"
,
content
:
"美国DARPA资助可调控生物功能微系统技术开
发"
,
content
:
"蝢DARPA韏靚敺桃頂蝏撘?,
time: "
銝憭拙
"
}
]);
...
...
@@ -164,11 +164,11 @@ const handleSwithCurDecree = name => {
carouselRef.value.next();
}
};
//// 最新资助项
目
//// 韏憿寧?
const handleGetNewProject = async () => {
try {
const res = await getNewProject();
console
.
log
(
"最新资助项
目"
,
res
);
console.log("
韏憿寧
?,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
box1Data
.
value
=
res
.
data
}
...
...
@@ -505,7 +505,7 @@ onMounted(async () => {
overflow
:
hidden
;
/* */
text-overflow
:
ellipsis
;
/* 超出部分显示省略
号
*/
/* 頞蝷箇?*/
width
:
200px
;
/* 霈曄蔭銝銝芸摰捐摨 */
height
:
30px
;
...
...
src/views/technologyFigures/index.vue
浏览文件 @
01a8b2b3
...
...
@@ -21,8 +21,8 @@
</div>
-->
<div
class=
"home-main-header-center"
>
<SearchContainer
style=
"margin-bottom: 0;margin-top: 48px; "
v-if=
"containerRef"
placeholder=
"搜索科技人物及观
点"
:containerRef=
"containerRef"
areaName=
"人物"
/>
<!--
<el-input
v-model=
"input"
style=
"width: 838px; height: 100%"
placeholder=
"搜索科技人物及观
点"
/>
placeholder=
"搜索科技人物及观
?
:containerRef="
containerRef
"
areaName=
"人物"
/>
<!--
<el-input
v-model=
"input"
style=
"width: 838px; height: 100%"
placeholder=
"搜索科技人物及观
?
/>
<div
class=
"search"
>
<div
class=
"search-icon"
>
<img
src=
"./assets/images/search-icon.png"
alt=
""
/>
...
...
@@ -41,7 +41,7 @@
</div>
<div
class=
"home-main-header-footer-item"
>
<div
class=
"item-top"
>
633
</div>
<div
class=
"item-footer"
>
顶级科学
家
<
/div>
<div
class=
"item-footer"
>
顶级科学
?
/div>
</div>
<div
class=
"home-main-header-footer-item"
>
<div
class=
"item-top"
>
312
</div>
...
...
@@ -50,13 +50,13 @@
</div>
-->
<!--
<div
class=
"home-main-header-btn-box"
>
<div
class=
"btn"
@
click=
"handleToPosi('position1')"
>
<div
class=
"btn-text"
>
{{
"最新动
态"
}}
</div>
<div
class=
"btn-text"
>
{{
"最新动
?
}}
</div>
<div
class=
"btn-icon"
>
<img
src=
"@/assets/icons/arrow-right-icon.png"
alt=
""
/>
</div>
</div>
<div
class=
"btn"
@
click=
"handleToPosi('position2')"
>
<div
class=
"btn-text"
>
{{
"言论动
态"
}}
</div>
<div
class=
"btn-text"
>
{{
"言论动
?
}}
</div>
<div
class=
"btn-icon"
>
<img
src=
"@/assets/icons/arrow-right-icon.png"
alt=
""
/>
</div>
...
...
@@ -68,7 +68,7 @@
</div>
</div>
<div
class=
"btn"
@
click=
"handleToPosi('position4')"
>
<div
class=
"btn-text"
>
{{
"资源
库"
}}
</div>
<div
class=
"btn-text"
>
{{
"资源
?
}}
</div>
<div
class=
"btn-icon"
>
<img
src=
"@/assets/icons/arrow-right-icon.png"
alt=
""
/>
</div>
...
...
@@ -76,16 +76,16 @@
</div>
-->
</div>
<div
class=
"home-main-center"
>
<DivideHeader
id=
"position1"
class=
"divide-header"
:titleText=
"'最新动
态'
"
></DivideHeader>
<DivideHeader
id=
"position1"
class=
"divide-header"
:titleText=
"'最新动
?
"
></DivideHeader>
<div
class=
"center-top"
>
<OverviewMainBox
title=
"人物新闻动
态"
width=
"1064px"
height=
"460px"
<OverviewMainBox
title=
"人物新闻动
?
width="
1064px
"
height=
"460px"
@
to-detail=
"handleClcikToCharacter(curnews.personId, curnews.name)"
>
<!-- 自定义左上角图标插槽 -->
<template
#
headerIcon
>
<img
src=
"./assets/images/personNewIcon.svg "
alt=
""
/>
</
template
>
<!-- 主内容区
域
-->
<!-- 主内容区
?
-->
<div
class=
"box1-wrapper"
>
<div
class=
"box1-left"
@
click=
"handleSwithCurBill('left')"
>
<img
src=
"./assets/images/box1-left.png"
alt=
""
/>
...
...
@@ -99,7 +99,7 @@
arrow=
"never"
indicator-position=
"none"
@
change=
"handleCarouselChange"
>
<el-carousel-item
v-for=
"person in newsDynamics"
:key=
"person.personId"
>
<div
class=
"carousel-content"
>
<!-- 左侧:头
像
-->
<!-- 左侧:头
?
-->
<div
class=
"avatar"
>
<img
:src=
"person.imageUrl"
alt=
"人物头像"
/>
</div>
...
...
@@ -155,7 +155,7 @@
<RiskSignal
:list=
"warningList"
@
more-click=
"handleToMoreRiskSignal"
postDate=
"signalTime"
name=
"signalTitle"
riskLevel=
"signalLevel"
/>
</div>
<DivideHeader
id=
"position2"
class=
"divide-header"
:titleText=
"'言论动
态'
"
></DivideHeader>
<DivideHeader
id=
"position2"
class=
"divide-header"
:titleText=
"'言论动
?
"
></DivideHeader>
<div
class=
"center-center"
>
<div
class=
"box3"
>
<div
class=
"box3-header"
>
...
...
@@ -298,7 +298,7 @@
</div>
<div
class=
"home-main-footer"
>
<DivideHeader
id=
"position4"
class=
"divide-header"
:titleText=
"'资源
库'
"
></DivideHeader>
<DivideHeader
id=
"position4"
class=
"divide-header"
:titleText=
"'资源
?
"
></DivideHeader>
<div
class=
"home-main-footer-header"
>
<div
class=
"btn-box"
>
<div
class=
"btn"
:class=
"{ btnActive: activeCate === cate.typeName }"
...
...
@@ -317,7 +317,7 @@
</template>
<
script
setup
>
import
RiskSignal
from
"@/components/base/
R
iskSignal/index.vue"
;
import
RiskSignal
from
"@/components/base/
r
iskSignal/index.vue"
;
import
{
onMounted
,
ref
}
from
"vue"
;
import
{
useRouter
}
from
"vue-router"
;
import
scrollToTop
from
"@/utils/scrollToTop"
;
...
...
@@ -353,7 +353,7 @@ const router = useRouter();
const
containerRef
=
ref
(
null
);
const
{
isShow
}
=
useContainerScroll
(
containerRef
);
// 当前人物新闻动
态
// 当前人物新闻动
?
const
curnews
=
ref
({
imageUrl
:
""
,
name
:
""
,
...
...
@@ -374,12 +374,12 @@ const handleCarouselChange = index => {
// 获取人物新闻动
态
// 获取人物新闻动
?
const
newsDynamics
=
ref
([]);
const
handlgetnewsDynamicsFn
=
async
()
=>
{
try
{
const
res
=
await
getnewsDynamics
();
console
.
log
(
"人物新闻动
态"
,
res
);
console
.
log
(
"人物新闻动
?
, res);
newsDynamics.value = res.data;
} catch (error) {
console.error(error);
...
...
@@ -501,7 +501,7 @@ const handlegetOptionAreaChangeFn = async () => {
//提取年份作为 title
const years = sortedData.map(item => item.year);
//收集所有行业名
称
//收集所有行业名
?
const allIndustries = new Set();
sortedData.forEach(yearData => {
yearData.industryList.forEach(industry => {
...
...
@@ -514,7 +514,7 @@ const handlegetOptionAreaChangeFn = async () => {
Array.from(allIndustries).forEach(industryName => {
industryMap.set(industryName, new Array(years.length).fill(0));
});
// 填充每个行业每年的数
据
// 填充每个行业每年的数
?
sortedData.forEach((yearData, yearIndex) => {
yearData.industryList.forEach(industry => {
const industryValues = industryMap.get(industry.industryName);
...
...
@@ -537,7 +537,7 @@ const handlegetOptionAreaChangeFn = async () => {
// 科技人物类型
const chart7Data = ref({
name
:
[
"国会议员"
,
"行政主官"
,
"科技领袖"
,
"顶尖科学
家"
,
"其他"
],
name: ["
国会议员
", "
行政主官
", "
科技领袖
", "
顶尖科学
?
,
"其他"
],
value
:
[
482
,
41
,
83
,
201
,
25
]
});
const
handlegetPersonTypeCountFn
=
async
()
=>
{
...
...
@@ -565,7 +565,7 @@ const handleBackHome = () => {
const
carouselRef
=
ref
(
null
);
// 切换人物新闻动
态
// 切换人物新闻动
?
const
handleSwithCurBill
=
name
=>
{
if
(
name
===
"left"
)
{
...
...
@@ -667,7 +667,7 @@ const handleClcikToCharacter = async (id, name) => {
const
route
=
router
.
resolve
({
path
:
"/characterPage"
,
query
:
{
type
:
type
,
// type=1为科技企业领袖
,2为国会议员,3为智库研究人员
type
:
type
,
// type=1为科技企业领袖
?为国会议员,3为智库研究人?
personId
:
id
}
});
...
...
@@ -687,15 +687,15 @@ const handleClcikToCharacter = async (id, name) => {
// 风险信号
const
warningList
=
ref
([
{
title
:
"关于对中华人民共和国合成阿片类药物供应链..."
,
time
:
"一天前"
,
status
:
"特别重大"
},
{
title
:
"关于调整汽车及汽车零部件进口的公
告"
,
time
:
"一天前"
,
status
:
"特别重大"
},
{
title
:
"关于调整钢铁进口的公
告"
,
time
:
"一天前"
,
status
:
"重大风险"
},
{
title
:
"关于调整汽车及汽车零部件进口的公
?
, time: "
一天前
", status: "
特别重大
" },
{ title: "
关于调整钢铁进口的公
?
,
time
:
"一天前"
,
status
:
"重大风险"
},
{
title
:
"关于使用互惠关税规范进口以纠正导致大规模..."
,
time
:
"一天前"
,
status
:
"重大风险"
},
{
title
:
"关于修订对中华人民共和国低价值进口商品
适..."
,
time
:
"一天前"
,
status
:
"一般风险"
}
{
title
:
"关于修订对中华人民共和国低价值进口商品
?.."
,
time
:
"一天前"
,
status
:
"一般风?
}
]);
//人物动向
const peoDate = ref("
本周
");
const
peoDateList
=
[
"今天"
,
"昨天"
,
"近三
天"
,
"本周"
,
"本月"
];
const peoDateList = ["
今天
", "
昨天
", "
近三
?
,
"本周"
,
"本月"
];
//重要人物言论及立场选择按钮
const
fieldSelected
=
ref
(
"全部领域"
);
...
...
@@ -713,7 +713,7 @@ const fieldSelectList = ref([
value
:
"2"
},
{
label
:
"新一代信息技
术"
,
label
:
"新一代信息技
?
,
value: "
3
"
},
{
...
...
@@ -721,7 +721,7 @@ const fieldSelectList = ref([
value: "
4
"
},
{
label
:
"新能
源"
,
label: "
新能
?
,
value
:
"5"
},
{
...
...
@@ -733,11 +733,11 @@ const fieldSelectList = ref([
value
:
"7"
},
{
label
:
"先进制
造"
,
label
:
"先进制
?
,
value: "
8
"
},
{
label
:
"新材
料"
,
label: "
新材
?
,
value
:
"9"
},
{
...
...
@@ -757,7 +757,7 @@ const fieldSelectList = ref([
value
:
"13"
},
{
label
:
"
核"
,
label
:
"
?
,
value: "
14
"
}
]);
...
...
@@ -771,29 +771,29 @@ const fields = [
"
通信网络
",
"
航空航天
",
"
海洋
",
"新材
料"
,
"先进制
造"
"
新材
?
,
"先进制
?
];
const yearList = ref([
{
label
:
"2025
年"
,
label: "
2025
?
,
value
:
"2025"
},
{
label
:
"2024
年"
,
label
:
"2024
?
,
value: "
2024
"
},
{
label
:
"2023
年"
,
label: "
2023
?
,
value
:
"2023"
},
{
label
:
"2022
年"
,
label
:
"2022
?
,
value: "
2022
"
}
]);
// 资源库分
类
const
categoryList
=
ref
([
"全部人物"
,
"国会议员"
,
"行政主官"
,
"科技领袖"
,
"顶尖科学
家"
]);
// 资源库分
?
const categoryList = ref(["
全部人物
", "
国会议员
", "
行政主官
", "
科技领袖
", "
顶尖科学
?
]);
const
activeCate
=
ref
(
"全部人物"
);
const
typeId
=
ref
(
"000"
);
...
...
@@ -814,44 +814,44 @@ const handleToMoreRiskSignal = () => {
// 词云数据
const
wordCloudData
=
ref
([
{
name
:
"人工智能 (AI)"
,
value
:
100
},
{
name
:
"进行可再生能源税收减
免"
,
value
:
85
},
{
name
:
"进行可再生能源税收减
?
, value: 85 },
{ name: "
减少燃料对外依赖
", value: 80 },
{
name
:
"评估中美现代化技
术"
,
value
:
75
},
{
name
:
"应对中国制
造2
025战略"
,
value
:
70
},
{
name
:
"加强供应链风险管
理"
,
value
:
68
},
{
name
:
"补贴和税收抵
免"
,
value
:
65
},
{
name
:
"评估中美能源技
术"
,
value
:
60
},
{ name: "
评估中美现代化技
?
,
value
:
75
},
{
name
:
"应对中国制
?
025战略"
,
value
:
70
},
{
name
:
"加强供应链风险管
?
, value: 68 },
{ name: "
补贴和税收抵
?
,
value
:
65
},
{
name
:
"评估中美能源技
?
, value: 60 },
{ name: "
实施能源税收延期
", value: 58 },
{ name: "
投资基础设施
", value: 55 },
{ name: "
禁止资助中国能源项目
", value: 53 },
{
name
:
"限制采购中国产电
池"
,
value
:
50
},
{ name: "
限制采购中国产电
?
,
value
:
50
},
{
name
:
"加强美国在核能领域得到领导力"
,
value
:
48
},
{
name
:
"技术出口限
制"
,
value
:
45
},
{
name
:
"出口管制与投资审
查"
,
value
:
42
},
{
name
:
"供应链调
整"
,
value
:
40
},
{
name
:
"技术出口限
?
, value: 45 },
{ name: "
出口管制与投资审
?
,
value
:
42
},
{
name
:
"供应链调
?
, value: 40 },
{ name: "
左岸外包
", value: 38 },
{
name
:
"空域主权与安
全"
,
value
:
36
},
{ name: "
空域主权与安
?
,
value
:
36
},
{
name
:
"抵制外国人才争夺"
,
value
:
34
},
{
name
:
"无人机先进空中交
通"
,
value
:
32
},
{
name
:
"无人机先进空中交
?
, value: 32 },
{ name: "
能源与基础设施
", value: 30 }
]);
const wordCloudfield = ref("
0
");
const wordCloudvalue = ref("
2025
");
const yearSelect = ref("
2025
");
const
areaSelect
=
ref
(
"近十
年"
);
const areaSelect = ref("
近十
?
);
const
options
=
[
{
value
:
"近十
年"
,
label
:
"近十
年"
value
:
"近十
?
,
label: "
近十
?
},
{
value
:
"近五
年"
,
label
:
"近五
年"
value
:
"近五
?
,
label: "
近五
?
}
];
const
viewOption
=
ref
([
"行政主管"
,
"国会议员"
,
"科技领袖"
,
"顶尖科学
家"
]);
const
viewOption
=
ref
([
"行政主管"
,
"国会议员"
,
"科技领袖"
,
"顶尖科学
?
]);
const viewSelect = ref("
国会议员
");
...
...
@@ -1975,7 +1975,7 @@ onMounted(async () => {
}
.source-tag
{
/* 数据展示/Tag标签/亮色/
蓝
*/
/* 数据展示/Tag标签/亮色/
?
*/
width
:
100px
;
height
:
24px
;
/* 自动布局 */
...
...
张伊明
@zhangyiming
被提及 commit
6af1ef83
·
3月 24, 2026
被提及 commit
6af1ef83
被提及 commit 6af1ef83bbf9ef709f9cfd1614a1b042c9cdf9c0
切换提交列表
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论