Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
R
risk-monitor
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
蔡建
risk-monitor
Commits
3ed377d1
提交
3ed377d1
authored
12月 20, 2025
作者:
李智林
浏览文件
操作
浏览文件
下载
差异文件
update
上级
17e424f0
e641835b
全部展开
隐藏空白字符变更
内嵌
并排
正在显示
20 个修改的文件
包含
449 行增加
和
148 行删除
+449
-148
exportControl.js
src/api/exportControl.js
+91
-0
index.vue
src/views/bill/billHome/index.vue
+0
-0
index.vue
src/views/decree/decreeHome/index.vue
+55
-50
fishbone-mock.json
...iews/exportControl/analysis/components/fishbone-mock.json
+11
-7
influencePanel1.vue
...ews/exportControl/analysis/components/influencePanel1.vue
+154
-33
influencePanel2.vue
...ews/exportControl/analysis/components/influencePanel2.vue
+1
-1
panel2.vue
src/views/exportControl/analysis/components/panel2.vue
+2
-2
pieCharts.vue
src/views/exportControl/analysis/components/pieCharts.vue
+1
-1
overview.vue
src/views/exportControl/analysis/content/overview.vue
+0
-0
dialog.vue
src/views/exportControl/components/dialog.vue
+3
-1
index.vue
src/views/exportControl/index.vue
+25
-7
charts.js
src/views/exportControl/utils/charts.js
+3
-1
index.vue
src/views/finance/index.vue
+7
-3
index.vue
src/views/innovationSubject/index.vue
+2
-3
index.vue
...views/marketAccessRestrictions/marketAccessHome/index.vue
+7
-3
index.vue
src/views/technologyFigures/index.vue
+87
-36
index.vue
src/views/thinkTank/index.vue
+0
-0
出口管制接口-4.md
出口管制接口-4.md
+0
-0
出口管制接口.xlsx
出口管制接口.xlsx
+0
-0
出口管制接口new.md
出口管制接口new.md
+0
-0
没有找到文件。
src/api/exportControl.js
浏览文件 @
3ed377d1
...
@@ -353,6 +353,24 @@ export function getEntitiesCountBy50PercentRules(
...
@@ -353,6 +353,24 @@ export function getEntitiesCountBy50PercentRules(
);
);
}
}
/**
* 获取前序事件
*/
// /entitiesDataInfo/precedingEvents
export
function
getPrecedingEvents
(
startTime
=
"2025-11-11"
,
pageNum
=
1
,
pageSize
=
10
)
{
return
request200
(
request
({
method
:
"POST"
,
url
:
"/api/entitiesDataInfo/precedingEvents"
,
data
:
{
sanctionDate
:
startTime
,
pageNum
,
pageSize
}
})
);
}
/**
/**
* 领域分布查询
* 领域分布查询
*/
*/
...
@@ -745,3 +763,76 @@ export function getKeyListedEntityList(date, keyword = "") {
...
@@ -745,3 +763,76 @@ export function getKeyListedEntityList(date, keyword = "") {
})
})
);
);
}
}
/**
* 获取科学仪器对美依赖数量
*/
export
function
getScientificInstrumentDependencyCount
(
orgIds
=
"12100000400012916R,121000004013595328,12100000435230200R"
)
{
return
request200
(
request
({
method
:
"GET"
,
url
:
"/api/instrument/getDependencyUS"
,
params
:
{
orgIds
}
})
);
}
/**
* 科学仪器近十年对美依赖度升高风险分析
* url: /instrument/getDependencyUSRisk
*/
export
function
getScientificInstrumentDependencyRisk
()
{
return
request200
(
request
({
method
:
"GET"
,
url
:
"/api/instrument/getDependencyUSRisk"
})
);
}
/**
* 科学仪器近十年国产化数量统计
* url:/instrument/getLocalizationRisk
*/
export
function
getScientificInstrumentLocalizationRisk
()
{
return
request200
(
request
({
method
:
"GET"
,
url
:
"/api/instrument/getLocalizationRisk"
})
);
}
/**
* 科学仪器进口国统计
* url: /instrument/getOriginCount
*/
export
function
getScientificInstrumentOriginCount
(
orgIds
=
"12100000400012916R,121000004013595328,12100000435230200R"
)
{
return
request200
(
request
({
method
:
"GET"
,
url
:
"/api/instrument/getOriginCount"
,
params
:
{
orgIds
}
})
);
}
/**
* 新增科研机构列表
* url: /entitiesDataInfo/scientificImpact/entityList
*/
export
function
getScientificImpactEntityList
(
startTime
)
{
return
request200
(
request
({
method
:
"GET"
,
url
:
"/api/entitiesDataInfo/scientificImpact/entityList"
,
params
:
{
sanctionDate
:
startTime
||
"2025-11-11"
}
})
);
}
src/views/bill/billHome/index.vue
浏览文件 @
3ed377d1
差异被折叠。
点击展开。
src/views/decree/decreeHome/index.vue
浏览文件 @
3ed377d1
...
@@ -106,7 +106,7 @@
...
@@ -106,7 +106,7 @@
<div
class=
"home-main-header-item-box"
>
<div
class=
"home-main-header-item-box"
>
<div
class=
"item"
v-for=
"(item, index) in govInsList"
:key=
"index"
@
click=
"handleToInstitution(item)"
>
<div
class=
"item"
v-for=
"(item, index) in govInsList"
:key=
"index"
@
click=
"handleToInstitution(item)"
>
<div
class=
"item-left"
>
<div
class=
"item-left"
>
<img
:src=
"item.img
?item.img
: DefaultIcon2"
alt=
""
/>
<img
:src=
"item.img
? item.img
: DefaultIcon2"
alt=
""
/>
</div>
</div>
<div
class=
"item-right"
>
{{
item
.
name
}}
</div>
<div
class=
"item-right"
>
{{
item
.
name
}}
</div>
</div>
</div>
...
@@ -335,17 +335,15 @@
...
@@ -335,17 +335,15 @@
<DivideHeader
id=
"position4"
class=
"divide4"
:titleText=
"'资源库'"
></DivideHeader>
<DivideHeader
id=
"position4"
class=
"divide4"
:titleText=
"'资源库'"
></DivideHeader>
<div
class=
"home-main-footer-header"
>
<div
class=
"home-main-footer-header"
>
<div
class=
"btn-box"
>
<div
class=
"btn-box"
>
<div
<div
class=
"btn"
class=
"btn"
:class=
"
{ btnActive: activeCate === cate.id }"
:class=
"
{ btnActive: activeCate === cate.id }"
v-for="(cate, index) in categoryList"
v-for="(cate, index) in categoryList"
:key="index"
:key="index"
@click="handleClickCate(cate)"
@click="handleClickCate(cate)"
>
>
{{
cate
.
name
}}
{{
cate
.
name
}}
</div>
</div>
</div>
</div>
<div
class=
"select-box"
>
<div
class=
"select-box"
>
<div
class=
"paixu-btn"
@
click=
"handleSwithSort"
>
<div
class=
"paixu-btn"
@
click=
"handleSwithSort"
>
...
@@ -375,6 +373,7 @@
...
@@ -375,6 +373,7 @@
:key=
"time.id"
:key=
"time.id"
v-model=
"activePubTime"
v-model=
"activePubTime"
:label=
"time.id"
:label=
"time.id"
style=
"width: 100px"
class=
"filter-checkbox"
class=
"filter-checkbox"
>
>
{{
time
.
name
}}
{{
time
.
name
}}
...
@@ -414,13 +413,13 @@
...
@@ -414,13 +413,13 @@
class=
"main-item"
class=
"main-item"
v-for=
"(item, index) in curDecreeList"
v-for=
"(item, index) in curDecreeList"
:key=
"index"
:key=
"index"
@
click=
"handleClick
ToDetail
"
@
click=
"handleClick
Decree(item)
"
>
>
<div
class=
"main-item-left"
>
<div
class=
"main-item-left"
>
<div
class=
"left-left"
>
{{
item
.
time
}}
</div>
<div
class=
"left-left"
>
{{
item
.
time
}}
</div>
<div
class=
"left-right"
>
<div
class=
"left-right"
>
<div
class=
"icon"
>
<div
class=
"icon"
>
<img
:src=
"item.orgImage
?item.orgImage:DefaultIcon2"
alt=
""
>
<img
:src=
"item.orgImage
? item.orgImage : DefaultIcon2"
alt=
""
/
>
</div>
</div>
<div
class=
"line"
v-if=
"index !== 9 && index !== totalDecreesNum - 1"
></div>
<div
class=
"line"
v-if=
"index !== 9 && index !== totalDecreesNum - 1"
></div>
</div>
</div>
...
@@ -497,8 +496,8 @@ import getCalendarHeatChart from "./utils/cleandarHeat";
...
@@ -497,8 +496,8 @@ import getCalendarHeatChart from "./utils/cleandarHeat";
import
setChart
from
"@/utils/setChart"
;
import
setChart
from
"@/utils/setChart"
;
import
DefaultIcon1
from
'@/assets/icons/default-icon1.png'
import
DefaultIcon1
from
"@/assets/icons/default-icon1.png"
;
import
DefaultIcon2
from
'@/assets/icons/default-icon2.png'
import
DefaultIcon2
from
"@/assets/icons/default-icon2.png"
;
import
p1
from
"./assets/images/iconp1.png"
;
import
p1
from
"./assets/images/iconp1.png"
;
import
p2
from
"./assets/images/iconp2.png"
;
import
p2
from
"./assets/images/iconp2.png"
;
...
@@ -534,10 +533,8 @@ import Message3 from "./assets/images/message-icon3.png";
...
@@ -534,10 +533,8 @@ import Message3 from "./assets/images/message-icon3.png";
// 跳转行政机构主页
// 跳转行政机构主页
const
handleToInstitution
=
item
=>
{
const
handleToInstitution
=
item
=>
{
if
(
item
.
name
===
"美国商务部"
)
{
const
curRoute
=
router
.
resolve
(
"/institution"
);
const
curRoute
=
router
.
resolve
(
"/institution"
);
window
.
open
(
curRoute
.
href
,
"_blank"
);
window
.
open
(
curRoute
.
href
,
"_blank"
);
}
}
;
}
;
// 返回首页
// 返回首页
...
@@ -689,6 +686,17 @@ const handleClickToDetail = () => {
...
@@ -689,6 +686,17 @@ const handleClickToDetail = () => {
window
.
open
(
route
.
href
,
"_blank"
);
window
.
open
(
route
.
href
,
"_blank"
);
}
;
}
;
// 点击政令库政令
const
handleClickDecree
=
decree
=>
{
const
route
=
router
.
resolve
({
path
:
"/decreeLayout"
,
query
:
{
id
:
decree
.
id
}
}
);
window
.
open
(
route
.
href
,
"_blank"
);
}
;
// 风险信号
// 风险信号
const
warningList
=
ref
([
const
warningList
=
ref
([
{
{
...
@@ -780,7 +788,6 @@ const messageList = ref([
...
@@ -780,7 +788,6 @@ const messageList = ref([
// time: "14:49 · 发布于X",
// time: "14:49 · 发布于X",
// content: `如果这个疯狂的支出法案获得通过,‘美国党’将在第二天成立。`
// content: `如果这个疯狂的支出法案获得通过,‘美国党’将在第二天成立。`
//
}
//
}
]);
]);
const
handleGetMessage
=
async
()
=>
{
const
handleGetMessage
=
async
()
=>
{
const
params
=
{
const
params
=
{
...
@@ -854,7 +861,6 @@ const chart2Data = ref([
...
@@ -854,7 +861,6 @@ const chart2Data = ref([
// name: "人工智能",
// name: "人工智能",
// value: 46
// value: 46
//
}
,
//
}
,
]);
]);
// const colorList = ["#69B1FF", "#FFC069", "#87E8DE", "#85A5FF", "#FF7875", "#B37FEB", "#4096FF"];
// const colorList = ["#69B1FF", "#FFC069", "#87E8DE", "#85A5FF", "#FF7875", "#B37FEB", "#4096FF"];
...
@@ -892,7 +898,6 @@ const keyDecreeList = ref([
...
@@ -892,7 +898,6 @@ const keyDecreeList = ref([
// time: "2025年2月",
// time: "2025年2月",
// content: `将中国列为“外国对手”,系统性收紧中美在半导体、人工智能、量子技术等前沿科技领域的双向投资,构建对华科技封锁体系。`
// content: `将中国列为“外国对手”,系统性收紧中美在半导体、人工智能、量子技术等前沿科技领域的双向投资,构建对华科技封锁体系。`
//
}
,
//
}
,
]);
]);
const
handleGetKeyDecree
=
async
()
=>
{
const
handleGetKeyDecree
=
async
()
=>
{
...
@@ -1857,7 +1862,7 @@ onMounted(async () => {
...
@@ -1857,7 +1862,7 @@ onMounted(async () => {
height
:
402
px
;
height
:
402
px
;
overflow
-
y
:
auto
;
overflow
-
y
:
auto
;
overflow
-
x
:
hidden
;
overflow
-
x
:
hidden
;
padding
-
top
:
6
px
;
padding
:
6
px
0
;
.
box3
-
item
{
.
box3
-
item
{
display
:
flex
;
display
:
flex
;
height
:
77
px
;
height
:
77
px
;
...
@@ -1967,7 +1972,7 @@ onMounted(async () => {
...
@@ -1967,7 +1972,7 @@ onMounted(async () => {
height
:
402
px
;
height
:
402
px
;
overflow
-
y
:
auto
;
overflow
-
y
:
auto
;
box
-
sizing
:
border
-
box
;
box
-
sizing
:
border
-
box
;
padding
-
top
:
8
px
;
padding
-
bottom
:
8
px
;
.
box4
-
main
-
item
{
.
box4
-
main
-
item
{
margin
-
top
:
16
px
;
margin
-
top
:
16
px
;
display
:
flex
;
display
:
flex
;
...
@@ -2601,7 +2606,8 @@ onMounted(async () => {
...
@@ -2601,7 +2606,8 @@ onMounted(async () => {
}
}
}
}
.
box7
-
main
{
.
box7
-
main
{
height
:
400
px
;
margin
-
top
:
10
px
;
height
:
380
px
;
box
-
sizing
:
border
-
box
;
box
-
sizing
:
border
-
box
;
overflow
-
y
:
auto
;
overflow
-
y
:
auto
;
overflow
-
x
:
hidden
;
overflow
-
x
:
hidden
;
...
@@ -2731,32 +2737,31 @@ onMounted(async () => {
...
@@ -2731,32 +2737,31 @@ onMounted(async () => {
display
:
flex
;
display
:
flex
;
gap
:
8
px
;
gap
:
8
px
;
white
-
space
:
nowrap
;
white
-
space
:
nowrap
;
.
btn
{
.
btn
{
min
-
width
:
min
-
content
;
min
-
width
:
min
-
content
;
height
:
42
px
;
height
:
42
px
;
color
:
rgba
(
95
,
101
,
108
,
1
);
color
:
rgba
(
95
,
101
,
108
,
1
);
font
-
family
:
Microsoft
YaHei
;
font
-
family
:
Microsoft
YaHei
;
font
-
size
:
20
px
;
font
-
size
:
20
px
;
font
-
weight
:
400
;
font
-
weight
:
400
;
line
-
height
:
42
px
;
line
-
height
:
42
px
;
padding
:
0
24
px
;
padding
:
0
24
px
;
border
-
radius
:
21
px
;
border
-
radius
:
21
px
;
background
:
rgba
(
20
,
89
,
187
,
0
);
background
:
rgba
(
20
,
89
,
187
,
0
);
cursor
:
pointer
;
cursor
:
pointer
;
&
:
hover
{
&
:
hover
{
background
:
rgba
(
20
,
89
,
187
,
0.1
);
background
:
rgba
(
20
,
89
,
187
,
0.1
);
}
}
}
.
btnActive
{
}
font
-
weight
:
700
;
.
btnActive
{
background
:
rgba
(
20
,
89
,
187
,
1
);
font
-
weight
:
700
;
background
:
rgba
(
20
,
89
,
187
,
1
);
color
:
#
fff
;
&
:
hover
{
color
:
#
fff
;
color
:
#
fff
;
&
:
hover
{
background
:
rgba
(
20
,
89
,
187
,
1
);
color
:
#
fff
;
background
:
rgba
(
20
,
89
,
187
,
1
);
}
}
}
}
}
}
.
select
-
box
{
.
select
-
box
{
margin
-
top
:
5
px
;
margin
-
top
:
5
px
;
...
@@ -2919,7 +2924,7 @@ onMounted(async () => {
...
@@ -2919,7 +2924,7 @@ onMounted(async () => {
height
:
24
px
;
height
:
24
px
;
border
-
radius
:
12
px
;
border
-
radius
:
12
px
;
overflow
:
hidden
;
overflow
:
hidden
;
img
{
img
{
width
:
100
%
;
width
:
100
%
;
height
:
100
%
;
height
:
100
%
;
}
}
...
...
src/views/exportControl/analysis/components/fishbone-mock.json
浏览文件 @
3ed377d1
[
[
{
{
"id"
:
86
,
"name"
:
"美国"
,
"name"
:
"人工智能"
,
"count"
:
0.37960339943342775
"nameZh"
:
"人工智能"
,
},
"description"
:
null
,
{
"parentId"
:
null
,
"name"
:
"德国"
,
"isMainBranch"
:
"Y"
,
"count"
:
0.20113314447592068
"children"
:
null
},
{
"name"
:
"日本"
,
"count"
:
0.1558073654390935
}
}
]
]
\ No newline at end of file
src/views/exportControl/analysis/components/influencePanel1.vue
浏览文件 @
3ed377d1
...
@@ -99,6 +99,13 @@ import college9 from "../../assets/images/college9.png";
...
@@ -99,6 +99,13 @@ import college9 from "../../assets/images/college9.png";
import
college10
from
"../../assets/images/college10.png"
;
import
college10
from
"../../assets/images/college10.png"
;
import
college11
from
"../../assets/images/college11.png"
;
import
college11
from
"../../assets/images/college11.png"
;
import
{
getHorizontalBarChart1
,
getPieOption2
,
getMultipleLineChart
}
from
"../../utils/charts"
;
import
{
getHorizontalBarChart1
,
getPieOption2
,
getMultipleLineChart
}
from
"../../utils/charts"
;
import
{
getScientificImpactEntityList
,
getScientificInstrumentDependencyCount
,
getScientificInstrumentDependencyRisk
,
getScientificInstrumentLocalizationRisk
,
getScientificInstrumentOriginCount
}
from
"@/api/exportControl"
;
const
selectOptions
=
[
const
selectOptions
=
[
{
{
value
:
1
,
value
:
1
,
...
@@ -170,39 +177,153 @@ const horizontalBarOptions = shallowRef({});
...
@@ -170,39 +177,153 @@ const horizontalBarOptions = shallowRef({});
const
pieOptions2
=
shallowRef
({});
const
pieOptions2
=
shallowRef
({});
const
multipleLineOptions1
=
shallowRef
({});
const
multipleLineOptions1
=
shallowRef
({});
const
multipleLineOptions2
=
shallowRef
({});
const
multipleLineOptions2
=
shallowRef
({});
onMounted
(()
=>
{
// 获取仪器对美依赖度升高风险分析数据
horizontalBarOptions
.
value
=
getHorizontalBarChart1
(
const
fetchDependencyRiskData
=
async
()
=>
{
[
"地球探测仪器"
,
"计算机及其配套设备"
,
"天文仪器"
,
"分析仪器"
,
"核仪器"
,
"物理性能测试仪器"
,
"医学科研仪器"
],
try
{
[
10
,
10
,
21
,
25
,
79
,
95
,
109
],
const
data
=
await
getScientificInstrumentDependencyRisk
();
false
if
(
data
&&
data
.
instrumentCountList
&&
Array
.
isArray
(
data
.
instrumentCountList
))
{
);
// 提取年份数据(去重并排序)
pieOptions2
.
value
=
getPieOption2
([
const
allYears
=
[...
new
Set
(
data
.
instrumentCountList
.
flatMap
(
item
=>
item
.
countList
.
map
(
c
=>
c
.
year
)))].
sort
();
{
name
:
"美国"
,
value
:
27
},
{
name
:
"日本"
,
value
:
22
},
// 转换数据格式以适应 getMultipleLineChart
{
name
:
"德国"
,
value
:
18
},
const
chartData
=
data
.
instrumentCountList
.
map
(
item
=>
{
{
name
:
"英国"
,
value
:
15
},
// 为每个仪器类型创建完整的年份数据序列
{
name
:
"韩国"
,
value
:
12
},
const
values
=
allYears
.
map
(
year
=>
{
{
name
:
"荷兰"
,
value
:
8
},
const
yearData
=
item
.
countList
.
find
(
c
=>
c
.
year
===
year
);
{
name
:
"其他"
,
value
:
7
}
return
yearData
?
yearData
.
count
:
0
;
]);
});
multipleLineOptions1
.
value
=
getMultipleLineChart
({
dates
:
[
"2016"
,
"2017"
,
"2018"
,
"2019"
,
"2020"
,
"2021"
,
"2022"
,
"2023"
,
"2024"
,
"2025"
],
return
{
data
:
[
name
:
item
.
name
,
{
name
:
"电子测量仪器"
,
value
:
[
45
,
35
,
25
,
20
,
20
,
14
,
15
,
15
,
23
,
21
]
},
value
:
values
{
name
:
"分析仪器"
,
value
:
[
35
,
33
,
24
,
21
,
22
,
18
,
13
,
19
,
21
,
31
]
},
};
{
name
:
"工艺试验仪器"
,
value
:
[
32
,
22
,
12
,
11
,
14
,
15
,
17
,
13
,
12
,
26
]
},
});
{
name
:
"核仪器"
,
value
:
[
48
,
38
,
28
,
28
,
28
,
18
,
18
,
18
,
28
,
28
]
}
]
// 使用 getMultipleLineChart 生成图表配置
});
multipleLineOptions1
.
value
=
getMultipleLineChart
({
multipleLineOptions2
.
value
=
getMultipleLineChart
({
dates
:
allYears
.
map
(
String
),
// 转换为字符串以匹配原数据格式
dates
:
[
"2016"
,
"2017"
,
"2018"
,
"2019"
,
"2020"
,
"2021"
,
"2022"
,
"2023"
,
"2024"
,
"2025"
],
data
:
chartData
data
:
[
});
{
name
:
"电子测量仪器"
,
value
:
[
45
,
35
,
25
,
20
,
20
,
14
,
15
,
15
,
23
,
21
]
},
}
{
name
:
"分析仪器"
,
value
:
[
35
,
33
,
24
,
21
,
22
,
18
,
13
,
19
,
21
,
31
]
},
}
catch
(
error
)
{
{
name
:
"工艺试验仪器"
,
value
:
[
32
,
22
,
12
,
11
,
14
,
15
,
17
,
13
,
12
,
26
]
},
console
.
error
(
"获取仪器对美依赖度升高风险分析数据失败:"
,
error
);
{
name
:
"核仪器"
,
value
:
[
48
,
38
,
28
,
28
,
28
,
18
,
18
,
18
,
28
,
28
]
}
}
]
};
});
// 获取仪器国产化降低风险分析数据
const
fetchLocalizationRiskData
=
async
()
=>
{
try
{
const
data
=
await
getScientificInstrumentLocalizationRisk
();
if
(
data
&&
data
.
instrumentCountList
&&
Array
.
isArray
(
data
.
instrumentCountList
))
{
// 提取年份数据(去重并排序)
const
allYears
=
[...
new
Set
(
data
.
instrumentCountList
.
flatMap
(
item
=>
item
.
countList
.
map
(
c
=>
c
.
year
)))].
sort
();
// 转换数据格式以适应 getMultipleLineChart
const
chartData
=
data
.
instrumentCountList
.
map
(
item
=>
{
// 为每个仪器类型创建完整的年份数据序列
const
values
=
allYears
.
map
(
year
=>
{
const
yearData
=
item
.
countList
.
find
(
c
=>
c
.
year
===
year
);
return
yearData
?
yearData
.
count
:
0
;
});
return
{
name
:
item
.
name
,
value
:
values
};
});
// 使用 getMultipleLineChart 生成图表配置
multipleLineOptions2
.
value
=
getMultipleLineChart
({
dates
:
allYears
.
map
(
String
),
// 转换为字符串以匹配原数据格式
data
:
chartData
});
}
}
catch
(
error
)
{
console
.
error
(
"获取仪器国产化降低风险分析数据失败:"
,
error
);
}
};
// 获取各类别仪器对美依赖情况数据
const
fetchDependencyCountData
=
async
()
=>
{
try
{
const
data
=
await
getScientificInstrumentDependencyCount
();
if
(
data
&&
Array
.
isArray
(
data
))
{
// 按照 count 降序排列
const
sortedData
=
data
.
sort
((
a
,
b
)
=>
a
.
count
-
b
.
count
);
// 提取仪器名称和对应的计数
const
names
=
sortedData
.
map
(
item
=>
item
.
name
);
const
counts
=
sortedData
.
map
(
item
=>
item
.
count
);
// 使用 getHorizontalBarChart1 生成图表配置
horizontalBarOptions
.
value
=
getHorizontalBarChart1
(
names
,
counts
,
false
);
}
}
catch
(
error
)
{
console
.
error
(
"获取各类别仪器对美依赖情况数据失败:"
,
error
);
}
};
// 获取仪器进口国可替代性分析数据
const
fetchOriginCountData
=
async
()
=>
{
try
{
const
data
=
await
getScientificInstrumentOriginCount
();
if
(
data
&&
Array
.
isArray
(
data
))
{
// 转换数据格式以适应 getPieOption2
// 数据结构应该是 [{ name: "国家名", value: 数量 }]
const
pieData
=
data
.
map
(
item
=>
({
name
:
item
.
name
,
value
:
(
item
.
count
*
100
).
toFixed
(
1
)
}));
// 使用 getPieOption2 生成图表配置
pieOptions2
.
value
=
getPieOption2
(
pieData
);
}
}
catch
(
error
)
{
console
.
error
(
"获取仪器进口国可替代性分析数据失败:"
,
error
);
}
};
onMounted
(
async
()
=>
{
// horizontalBarOptions.value = getHorizontalBarChart1(
// ["地球探测仪器", "计算机及其配套设备", "天文仪器", "分析仪器", "核仪器", "物理性能测试仪器", "医学科研仪器"],
// [10, 10, 21, 25, 79, 95, 109],
// false
// );
// pieOptions2.value = getPieOption2([
// { name: "美国", value: 27 },
// { name: "日本", value: 22 },
// { name: "德国", value: 18 },
// { name: "英国", value: 15 },
// { name: "韩国", value: 12 },
// { name: "荷兰", value: 8 },
// { name: "其他", value: 7 }
// ]);
// multipleLineOptions1.value = getMultipleLineChart({
// dates: ["2016", "2017", "2018", "2019", "2020", "2021", "2022", "2023", "2024", "2025"],
// data: [
// { name: "电子测量仪器", value: [45, 35, 25, 20, 20, 14, 15, 15, 23, 21] },
// { name: "分析仪器", value: [35, 33, 24, 21, 22, 18, 13, 19, 21, 31] },
// { name: "工艺试验仪器", value: [32, 22, 12, 11, 14, 15, 17, 13, 12, 26] },
// { name: "核仪器", value: [48, 38, 28, 28, 28, 18, 18, 18, 28, 28] }
// ]
// });
// multipleLineOptions2.value = getMultipleLineChart({
// dates: ["2016", "2017", "2018", "2019", "2020", "2021", "2022", "2023", "2024", "2025"],
// data: [
// { name: "电子测量仪器", value: [45, 35, 25, 20, 20, 14, 15, 15, 23, 21] },
// { name: "分析仪器", value: [35, 33, 24, 21, 22, 18, 13, 19, 21, 31] },
// { name: "工艺试验仪器", value: [32, 22, 12, 11, 14, 15, 17, 13, 12, 26] },
// { name: "核仪器", value: [48, 38, 28, 28, 28, 18, 18, 18, 28, 28] }
// ]
// });
// 获取各类别仪器对美依赖情况数据
await
fetchDependencyCountData
();
// 获取仪器进口国可替代性分析数据
await
fetchOriginCountData
();
// 获取仪器对美依赖度升高风险分析数据
await
fetchDependencyRiskData
();
// 获取仪器国产化降低风险分析数据
await
fetchLocalizationRiskData
();
});
});
</
script
>
</
script
>
...
...
src/views/exportControl/analysis/components/influencePanel2.vue
浏览文件 @
3ed377d1
...
@@ -12,7 +12,7 @@
...
@@ -12,7 +12,7 @@
<div
class=
"item"
v-for=
"(item, index) in listData"
:key=
"index"
@
click=
"handleEttClick(item)"
>
<div
class=
"item"
v-for=
"(item, index) in listData"
:key=
"index"
@
click=
"handleEttClick(item)"
>
<div
class=
"index"
:class=
"
{ isTopTen: index
<
10
}"
>
{{
index
+
1
}}
</div>
<div
class=
"index"
:class=
"
{ isTopTen: index
<
10
}"
>
{{
index
+
1
}}
</div>
<div
class=
"name"
>
{{
item
.
name
||
item
.
nameEn
}}
</div>
<div
class=
"name"
>
{{
item
.
name
||
item
.
nameEn
}}
</div>
<div
class=
"icon"
:class=
"
{ iconUp: item.
isUp, iconDown: !item.isUp
}">
</div>
<div
class=
"icon"
:class=
"
{ iconUp: item.
marketChange > 0, iconDown: item.marketChange
<
0
}"
></div>
</div>
</div>
</div>
</div>
</div>
</div>
...
...
src/views/exportControl/analysis/components/panel2.vue
浏览文件 @
3ed377d1
...
@@ -186,12 +186,12 @@ const fetchEntityFinancing = async () => {
...
@@ -186,12 +186,12 @@ const fetchEntityFinancing = async () => {
// 按日期排序
// 按日期排序
const
sortedData
=
data
const
sortedData
=
data
.
sort
((
a
,
b
)
=>
{
.
sort
((
a
,
b
)
=>
{
return
new
Date
(
a
.
name
)
-
new
Date
(
b
.
name
);
return
new
Date
(
a
.
year
)
-
new
Date
(
b
.
year
);
})
})
.
filter
((
item
,
idx
)
=>
idx
%
3
===
0
);
.
filter
((
item
,
idx
)
=>
idx
%
3
===
0
);
// 提取 x 轴数据(日期)
// 提取 x 轴数据(日期)
const
xAxisData
=
sortedData
.
map
(
item
=>
item
.
name
);
const
xAxisData
=
sortedData
.
map
(
item
=>
item
.
year
);
// 提取 y 轴数据(融资数量)
// 提取 y 轴数据(融资数量)
const
seriesData
=
sortedData
.
map
(
item
=>
item
.
count
);
const
seriesData
=
sortedData
.
map
(
item
=>
item
.
count
);
...
...
src/views/exportControl/analysis/components/pieCharts.vue
浏览文件 @
3ed377d1
...
@@ -30,7 +30,7 @@ onMounted(async () => {
...
@@ -30,7 +30,7 @@ onMounted(async () => {
.
filter
(
item
=>
item
.
count
>
0
)
.
filter
(
item
=>
item
.
count
>
0
)
.
map
(
item
=>
{
.
map
(
item
=>
{
return
{
return
{
name
:
item
?.
domain
,
name
:
item
?.
name
,
value
:
item
?.
count
value
:
item
?.
count
};
};
})
})
...
...
src/views/exportControl/analysis/content/overview.vue
浏览文件 @
3ed377d1
差异被折叠。
点击展开。
src/views/exportControl/components/dialog.vue
浏览文件 @
3ed377d1
<
template
>
<
template
>
<div
class=
"message-bubble"
>
<div
class=
"message-bubble"
>
<div
class=
"avatar-container"
@
click=
"handleClick"
>
<div
class=
"avatar-container"
@
click=
"handleClick"
>
<img
:src=
"avatar"
:alt=
"name"
class=
"avatar"
/>
<img
:src=
"avatar
|| avatarUser
"
:alt=
"name"
class=
"avatar"
/>
</div>
</div>
<div
class=
"bubble-container"
>
<div
class=
"bubble-container"
>
<div
class=
"bubble"
>
<div
class=
"bubble"
>
...
@@ -19,6 +19,8 @@
...
@@ -19,6 +19,8 @@
</
template
>
</
template
>
<
script
setup
>
<
script
setup
>
import
avatarUser
from
"@/assets/images/avatar_user.png"
;
const
emit
=
defineEmits
([
"click"
,
"info-click"
]);
const
emit
=
defineEmits
([
"click"
,
"info-click"
]);
defineProps
({
defineProps
({
avatar
:
{
avatar
:
{
...
...
src/views/exportControl/index.vue
浏览文件 @
3ed377d1
...
@@ -220,7 +220,7 @@
...
@@ -220,7 +220,7 @@
<
template
#
default
>
<
template
#
default
>
<div
class=
"news-list"
>
<div
class=
"news-list"
>
<NewsList
:list-data=
"newsList"
@
click=
"handleNewsInfoClick
"
/>
<NewsList
:list-data=
"newsList"
@
item-click=
"item => handleNewsInfoClick(item)
"
/>
</div>
</div>
</
template
>
</
template
>
</custom-container>
</custom-container>
...
@@ -321,7 +321,7 @@
...
@@ -321,7 +321,7 @@
</div>
</div>
<div
class=
"box3-content"
>
<div
class=
"box3-content"
>
<div
class=
"box3-content-title"
>
商业管制清单(CCL)更新频度
</div>
<div
class=
"box3-content-title"
>
商业管制清单(CCL)更新频度
</div>
<el-table
:data=
"tableData
1
"
stripe
style=
"width: 100%"
>
<el-table
:data=
"tableData
2
"
stripe
style=
"width: 100%"
>
<el-table-column
prop=
"year"
label=
"年份"
width=
"150"
/>
<el-table-column
prop=
"year"
label=
"年份"
width=
"150"
/>
<el-table-column
label=
"发布次数"
width=
"200"
>
<el-table-column
label=
"发布次数"
width=
"200"
>
<
template
#
default=
"scope"
>
<
template
#
default=
"scope"
>
...
@@ -694,6 +694,7 @@ import _ from "lodash";
...
@@ -694,6 +694,7 @@ import _ from "lodash";
const
handleCompClick
=
item
=>
{
const
handleCompClick
=
item
=>
{
console
.
log
(
"item"
,
item
);
console
.
log
(
"item"
,
item
);
if
(
item
.
entityType
!=
2
)
return
;
const
route
=
router
.
resolve
({
const
route
=
router
.
resolve
({
path
:
"/companyPages"
,
path
:
"/companyPages"
,
query
:
{
query
:
{
...
@@ -712,6 +713,8 @@ const trendOption = ref({});
...
@@ -712,6 +713,8 @@ const trendOption = ref({});
const
trendChecked
=
ref
(
false
);
const
trendChecked
=
ref
(
false
);
// 发布频度
// 发布频度
const
tableData1
=
ref
([]);
const
tableData1
=
ref
([]);
// CCL发布频度
const
tableData2
=
ref
([]);
// 历次制裁过程
// 历次制裁过程
const
sanctionProcessList
=
ref
([]);
const
sanctionProcessList
=
ref
([]);
const
sanctionPage
=
ref
(
1
);
const
sanctionPage
=
ref
(
1
);
...
@@ -727,10 +730,11 @@ const newsList = ref([]);
...
@@ -727,10 +730,11 @@ const newsList = ref([]);
onMounted
(
async
()
=>
{
onMounted
(
async
()
=>
{
try
{
try
{
const
[
dataCount
,
entitiesDataInfo
,
industryCountByYear
,
countDomainByYear
]
=
await
Promise
.
all
([
const
[
dataCount
,
entitiesDataInfo
,
industryCountByYear
,
cclList
,
countDomainByYear
]
=
await
Promise
.
all
([
getEntitiesDataCount
(),
getEntitiesDataCount
(),
getEntitiesDataInfo
(),
getEntitiesDataInfo
(),
getIndustryCountByYear
(
1
),
getIndustryCountByYear
(
1
),
getIndustryCountByYear
(
13
),
getCountDomainByYear
(
trendChecked
.
value
)
getCountDomainByYear
(
trendChecked
.
value
)
]);
]);
// 交换第二个和第三个元素
// 交换第二个和第三个元素
...
@@ -742,6 +746,7 @@ onMounted(async () => {
...
@@ -742,6 +746,7 @@ onMounted(async () => {
});
});
entitiesDataInfoList
.
value
=
entitiesDataInfo
||
[];
entitiesDataInfoList
.
value
=
entitiesDataInfo
||
[];
const
list
=
_
.
chain
(
industryCountByYear
).
filter
(
"year"
).
orderBy
(
"year"
,
"desc"
).
value
();
const
list
=
_
.
chain
(
industryCountByYear
).
filter
(
"year"
).
orderBy
(
"year"
,
"desc"
).
value
();
const
cclList1
=
_
.
chain
(
cclList
).
filter
(
"year"
).
orderBy
(
"year"
,
"desc"
).
value
();
const
total
=
_
.
sumBy
(
list
,
"count"
);
const
total
=
_
.
sumBy
(
list
,
"count"
);
tableData1
.
value
=
_
.
map
(
list
,
item
=>
{
tableData1
.
value
=
_
.
map
(
list
,
item
=>
{
return
{
return
{
...
@@ -751,6 +756,14 @@ onMounted(async () => {
...
@@ -751,6 +756,14 @@ onMounted(async () => {
tags
:
item
.
domain
tags
:
item
.
domain
};
};
}).
slice
(
0
,
5
);
}).
slice
(
0
,
5
);
tableData2
.
value
=
_
.
map
(
cclList1
,
item
=>
{
return
{
year
:
item
.
year
,
num
:
item
.
count
,
percent
:
item
.
count
/
total
,
tags
:
item
.
domain
};
}).
slice
(
0
,
5
);
console
.
log
(
"countDomainByYear"
,
countDomainByYear
);
console
.
log
(
"countDomainByYear"
,
countDomainByYear
);
// 整理柱状图数据并应用到趋势图
// 整理柱状图数据并应用到趋势图
if
(
countDomainByYear
&&
countDomainByYear
[
0
].
yearDomainCount
)
{
if
(
countDomainByYear
&&
countDomainByYear
[
0
].
yearDomainCount
)
{
...
@@ -1194,6 +1207,7 @@ const fetchNewsInfo = async () => {
...
@@ -1194,6 +1207,7 @@ const fetchNewsInfo = async () => {
const
data
=
await
getNewsInfo
();
const
data
=
await
getNewsInfo
();
if
(
data
&&
Array
.
isArray
(
data
))
{
if
(
data
&&
Array
.
isArray
(
data
))
{
newsList
.
value
=
data
.
map
(
item
=>
({
newsList
.
value
=
data
.
map
(
item
=>
({
...
item
,
avatar
:
item
.
newsImage
,
avatar
:
item
.
newsImage
,
name
:
item
.
newsTitle
,
name
:
item
.
newsTitle
,
time
:
formatTime
(
item
.
newsDate
),
time
:
formatTime
(
item
.
newsDate
),
...
@@ -1439,7 +1453,7 @@ const handleNewsInfoClick = item => {
...
@@ -1439,7 +1453,7 @@ const handleNewsInfoClick = item => {
const
route
=
router
.
resolve
({
const
route
=
router
.
resolve
({
path
:
"/newsAnalysis"
,
path
:
"/newsAnalysis"
,
query
:
{
query
:
{
newsId
:
item
.
i
d
newsId
:
item
.
newsI
d
}
}
});
});
window
.
open
(
route
.
href
,
"_blank"
);
window
.
open
(
route
.
href
,
"_blank"
);
...
@@ -1887,10 +1901,14 @@ const handleMediaClick = item => {
...
@@ -1887,10 +1901,14 @@ const handleMediaClick = item => {
}
}
.home-wrapper
{
.home-wrapper
{
width
:
100%
;
height
:
calc
(
100vh
-
96px
);
position
:
relative
;
overflow-y
:
hidden
;
.home-main
{
.home-main
{
// width: 1400px
;
width
:
100%
;
padding
:
0
5
%
;
height
:
100
%
;
margin
:
0
auto
;
overflow-y
:
auto
;
background
:
url("./assets/images/background.png")
;
background
:
url("./assets/images/background.png")
;
background-size
:
100%
100%
;
background-size
:
100%
100%
;
.home-main-header
{
.home-main-header
{
...
...
src/views/exportControl/utils/charts.js
浏览文件 @
3ed377d1
...
@@ -139,6 +139,7 @@ export function getPieOption2(data, title) {
...
@@ -139,6 +139,7 @@ export function getPieOption2(data, title) {
}
}
},
},
legend
:
{
legend
:
{
type
:
"scroll"
,
icon
:
"rect"
,
icon
:
"rect"
,
top
:
"center"
,
top
:
"center"
,
right
:
"40"
,
right
:
"40"
,
...
@@ -825,6 +826,7 @@ export const getMultipleLineChart = obj => {
...
@@ -825,6 +826,7 @@ export const getMultipleLineChart = obj => {
containLabel
:
true
containLabel
:
true
},
},
legend
:
{
legend
:
{
type
:
"scroll"
,
right
:
"5%"
,
right
:
"5%"
,
icon
:
"circle"
,
icon
:
"circle"
,
itemWidth
:
15
,
itemWidth
:
15
,
...
@@ -835,7 +837,7 @@ export const getMultipleLineChart = obj => {
...
@@ -835,7 +837,7 @@ export const getMultipleLineChart = obj => {
},
},
itemGap
:
17
,
itemGap
:
17
,
data
:
obj
.
data
.
map
((
item
,
index
)
=>
{
data
:
obj
.
data
.
map
((
item
,
index
)
=>
{
return
{
name
:
item
.
name
,
itemStyle
:
{
color
:
color
[
index
]
}
};
return
{
name
:
item
.
name
,
itemStyle
:
{
color
:
color
[
index
%
4
]
}
};
})
})
},
},
xAxis
:
{
xAxis
:
{
...
...
src/views/finance/index.vue
浏览文件 @
3ed377d1
...
@@ -1698,10 +1698,14 @@ onMounted(async () => {
...
@@ -1698,10 +1698,14 @@ onMounted(async () => {
}
}
.home-wrapper
{
.home-wrapper
{
width
:
100%
;
height
:
calc
(
100vh
-
96px
);
position
:
relative
;
overflow-y
:
hidden
;
.home-main
{
.home-main
{
// width: 1400px
;
width
:
100%
;
padding
:
0
5
%
;
height
:
100
%
;
margin
:
0
auto
;
overflow-y
:
auto
;
background
:
url("./assets/images/background.png")
;
background
:
url("./assets/images/background.png")
;
background-size
:
100%
100%
;
background-size
:
100%
100%
;
.home-main-header
{
.home-main-header
{
...
...
src/views/innovationSubject/index.vue
浏览文件 @
3ed377d1
...
@@ -351,8 +351,7 @@
...
@@ -351,8 +351,7 @@
:value=
"item.value"
:value=
"item.value"
/>
/>
</el-select>
</el-select>
</div>
</div>
</div>
</div>
</div>
</div>
<div
class=
"center-footer-layout"
>
<div
class=
"center-footer-layout"
>
...
@@ -405,6 +404,7 @@
...
@@ -405,6 +404,7 @@
</div>
</div>
</div>
</div>
<div
class=
"home-main-footer-main"
>
<div
class=
"home-main-footer-main"
>
<div
class=
"footer-main-item"
v-for=
"item in universityList"
:key=
"item.name"
@
click=
"handleClickToDetail"
>
<div
class=
"footer-main-item"
v-for=
"item in universityList"
:key=
"item.name"
@
click=
"handleClickToDetail"
>
<img
:src=
"item.pic"
style=
"height: 32px; width: 32px;"
/>
<img
:src=
"item.pic"
style=
"height: 32px; width: 32px;"
/>
<div
class=
"item-text"
>
{{ item.name }}
</div>
<div
class=
"item-text"
>
{{ item.name }}
</div>
...
@@ -894,7 +894,6 @@ onMounted(async () => {
...
@@ -894,7 +894,6 @@ onMounted(async () => {
let
chart1
=
getPieChart
(
chart1Data
.
value
,
colorList
);
let
chart1
=
getPieChart
(
chart1Data
.
value
,
colorList
);
setChart
(
chart1
,
"chart1"
);
setChart
(
chart1
,
"chart1"
);
});
});
</
script
>
</
script
>
...
...
src/views/marketAccessRestrictions/marketAccessHome/index.vue
浏览文件 @
3ed377d1
...
@@ -1070,10 +1070,14 @@ onMounted(async () => {
...
@@ -1070,10 +1070,14 @@ onMounted(async () => {
box-shadow
:
none
;
box-shadow
:
none
;
}
}
.home-wrapper
{
.home-wrapper
{
width
:
100%
;
height
:
calc
(
100vh
-
96px
);
position
:
relative
;
overflow-y
:
hidden
;
.home-main
{
.home-main
{
// width: 1400px;
width
:
100%
;
width
:
100%
;
margin
:
0
auto
;
height
:
100%
;
overflow-y
:
auto
;
background
:
url("./assets/images/background.png")
;
background
:
url("./assets/images/background.png")
;
background-size
:
100%
100%
;
background-size
:
100%
100%
;
.home-main-header
{
.home-main-header
{
...
@@ -1217,7 +1221,7 @@ onMounted(async () => {
...
@@ -1217,7 +1221,7 @@ onMounted(async () => {
right
:
19px
;
right
:
19px
;
width
:
6px
;
width
:
6px
;
height
:
12px
;
height
:
12px
;
img
{
img
{
width
:
100%
;
width
:
100%
;
height
:
100%
;
height
:
100%
;
}
}
...
...
src/views/technologyFigures/index.vue
浏览文件 @
3ed377d1
...
@@ -100,10 +100,13 @@
...
@@ -100,10 +100,13 @@
</div>
</div>
<div
class=
"box2-main"
>
<div
class=
"box2-main"
>
<div
class=
"box2-main-item"
v-for=
"(item, index) in warningList"
:key=
"index"
>
<div
class=
"box2-main-item"
v-for=
"(item, index) in warningList"
:key=
"index"
>
<div
class=
"item-left"
:class=
"
{
<div
itemLeftStatus1: item.status === '一般风险',
class=
"item-left"
itemLeftStatus2: item.status === '重大风险'
:class=
"
{
}">
itemLeftStatus1: item.status === '一般风险',
itemLeftStatus2: item.status === '重大风险'
}"
>
{{
item
.
status
}}
{{
item
.
status
}}
</div>
</div>
<div
class=
"item-right"
>
<div
class=
"item-right"
>
...
@@ -131,14 +134,18 @@
...
@@ -131,14 +134,18 @@
<img
src=
"./assets/images/TechnologyFigures-icon3.png"
alt=
""
/>
<img
src=
"./assets/images/TechnologyFigures-icon3.png"
alt=
""
/>
</div>
</div>
<!--
<div
class=
"box3-header-title"
>
{{
"人物动向"
}}
</div>
-->
<!--
<div
class=
"box3-header-title"
>
{{
"人物动向"
}}
</div>
-->
<div
class=
"header-title"
<div
style=
"width: 1560px; display: flex; justify-content: space-between; margin-top: 10px"
>
class=
"header-title"
style=
"width: 1560px; display: flex; justify-content: space-between; margin-top: 10px"
>
<div
class=
"box3-header-title"
>
<div
class=
"box3-header-title"
>
{{
"人物动向"
}}
{{
"人物动向"
}}
</div>
</div>
<div
style=
"display: flex; gap: 8px; margin-right: 12px"
>
<div
style=
"display: flex; gap: 8px; margin-right: 12px"
>
<div
v-for=
"value in peoDateList"
<div
:class=
"peoDate !== value ? 'btn-box-samll' : 'btn-box-select-samll'"
>
v-for=
"value in peoDateList"
:class=
"peoDate !== value ? 'btn-box-samll' : 'btn-box-select-samll'"
>
{{
value
}}
{{
value
}}
</div>
</div>
</div>
</div>
...
@@ -154,14 +161,18 @@
...
@@ -154,14 +161,18 @@
<div
class=
"header-icon"
>
<div
class=
"header-icon"
>
<img
src=
"./assets/images/header-message.png"
alt=
""
/>
<img
src=
"./assets/images/header-message.png"
alt=
""
/>
</div>
</div>
<div
class=
"header-title"
<div
style=
"width: 1595px; display: flex; justify-content: space-between; margin-top: 10px"
>
class=
"header-title"
style=
"width: 1595px; display: flex; justify-content: space-between; margin-top: 10px"
>
<div>
<div>
{{
"重要人物言论及立场"
}}
{{
"重要人物言论及立场"
}}
</div>
</div>
<div
style=
"display: flex; gap: 8px; margin-right: 12px"
>
<div
style=
"display: flex; gap: 8px; margin-right: 12px"
>
<div
v-for=
"value in fields"
<div
:class=
"fieldSelect !== value ? 'btn-box-samll' : 'btn-box-select-samll'"
>
v-for=
"value in fields"
:class=
"fieldSelect !== value ? 'btn-box-samll' : 'btn-box-select-samll'"
>
{{
value
}}
{{
value
}}
</div>
</div>
</div>
</div>
...
@@ -178,18 +189,33 @@
...
@@ -178,18 +189,33 @@
<div
class=
"box5-header"
>
<div
class=
"box5-header"
>
<div
class=
"box5-header-left"
>
<div
class=
"box5-header-left"
>
<div
class=
"box5-header-icon"
>
<div
class=
"box5-header-icon"
>
<img
src=
"./assets/images/TechnologyFigures-icon1.png"
alt=
""
<img
style=
"margin: 13px 21px 13px 21px; height: 22px"
/>
src=
"./assets/images/TechnologyFigures-icon1.png"
alt=
""
style=
"margin: 13px 21px 13px 21px; height: 22px"
/>
<div
class=
"box5-header-title"
>
{{
"科技人物观点词云"
}}
</div>
<div
class=
"box5-header-title"
>
{{
"科技人物观点词云"
}}
</div>
</div>
</div>
<div>
<div>
<div
style=
"height: 45px; display: flex; align-items: center"
>
<div
style=
"height: 45px; display: flex; align-items: center"
>
<el-select
v-model=
"wordCloudvalue"
style=
"width: 120px; height: 28px"
>
<el-select
v-model=
"wordCloudvalue"
style=
"width: 120px; height: 28px"
>
<el-option
v-for=
"item in yearList"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
<el-option
v-for=
"item in yearList"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
</el-select>
</el-select>
<el-select
v-model=
"wordCloudfield"
style=
"width: 120px; height: 28px; margin: 10px 24px 10px 5px"
>
<el-select
<el-option
v-for=
"item in fieldSelect"
:key=
"item.value"
:label=
"item.label"
v-model=
"wordCloudfield"
:value=
"item.value"
/>
style=
"width: 120px; height: 28px; margin: 10px 24px 10px 5px"
>
<el-option
v-for=
"item in fieldSelect"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
</el-select>
</el-select>
</div>
</div>
</div>
</div>
...
@@ -202,17 +228,22 @@
...
@@ -202,17 +228,22 @@
<div
class=
"header-icon"
>
<div
class=
"header-icon"
>
<img
src=
"./assets/images/box3-header-icon.png"
alt=
""
/>
<img
src=
"./assets/images/box3-header-icon.png"
alt=
""
/>
</div>
</div>
<div
class=
"header-title"
<div
style=
"display: flex; width: 740px; justify-content: space-between; align-items: center"
>
class=
"header-title"
style=
"display: flex; width: 740px; justify-content: space-between; align-items: center"
>
<div>
<div>
{{
"科技人物观点涉及领域变化趋势"
}}
{{
"科技人物观点涉及领域变化趋势"
}}
</div>
</div>
<el-select
v-model=
"areaSelect"
style=
"width: 120px; height: 28px"
>
<el-select
v-model=
"areaSelect"
style=
"width: 120px; height: 28px"
>
<el-option
v-for=
"item in options"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
<el-option
v-for=
"item in options"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
</el-select>
</el-select>
</div>
</div>
</div>
</div>
<div
class=
"box6-main"
id=
"box6Chart"
></div>
<div
class=
"box6-main"
id=
"box6Chart"
></div>
...
@@ -238,16 +269,22 @@
...
@@ -238,16 +269,22 @@
</div>
</div>
<div
style=
"display: flex; width: 730px; justify-content: space-between; align-items: center"
>
<div
style=
"display: flex; width: 730px; justify-content: space-between; align-items: center"
>
<div
class=
"box8-header-title"
>
{{
"主要人物涉华观点统计"
}}
</div>
<div
class=
"box8-header-title"
>
{{
"主要人物涉华观点统计"
}}
</div>
<div
style=
"gap: 8px;display: flex;"
>
<div
style=
"gap: 8px; display: flex"
>
<div
v-for=
"value in viewOption"
<div
:class=
"viewSelect !== value ? 'btn-box-samll' : 'btn-box-select-samll'"
>
v-for=
"value in viewOption"
:class=
"viewSelect !== value ? 'btn-box-samll' : 'btn-box-select-samll'"
>
{{
value
}}
{{
value
}}
</div>
</div>
<el-select
v-model=
"wordCloudvalue"
style=
"width: 120px; height: 28px; margin-top: -5px;"
>
<el-select
v-model=
"wordCloudvalue"
style=
"width: 120px; height: 28px; margin-top: -5px"
>
<el-option
v-for=
"item in yearList"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
<el-option
v-for=
"item in yearList"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
</el-select>
</el-select>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
...
@@ -262,8 +299,13 @@
...
@@ -262,8 +299,13 @@
<DivideHeader
id=
"position4"
class=
"divide-header"
:titleText=
"'资源库'"
></DivideHeader>
<DivideHeader
id=
"position4"
class=
"divide-header"
:titleText=
"'资源库'"
></DivideHeader>
<div
class=
"home-main-footer-header"
>
<div
class=
"home-main-footer-header"
>
<div
class=
"btn-box"
>
<div
class=
"btn-box"
>
<div
class=
"btn"
:class=
"
{ btnActive: activeCate === cate }" v-for="(cate, index) in categoryList"
<div
:key="index" @click="handleClickCate(cate)">
class=
"btn"
:class=
"
{ btnActive: activeCate === cate }"
v-for="(cate, index) in categoryList"
:key="index"
@click="handleClickCate(cate)"
>
{{
cate
}}
{{
cate
}}
</div>
</div>
</div>
</div>
...
@@ -438,13 +480,22 @@ onMounted(() => {
...
@@ -438,13 +480,22 @@ onMounted(() => {
}
}
.home-wrapper
{
.home-wrapper
{
width
:
100%
;
height
:
calc
(
100vh
-
96px
);
position
:
relative
;
overflow-y
:
hidden
;
.home-main
{
.home-main
{
width
:
1920px
;
// width: 1920px;
margin
:
0
auto
;
// margin: 0 auto;
// background: url("./assets/images/background.png");
// background-repeat: no-repeat;
// background-color: #fff;
// background-size: contain;
width
:
100%
;
height
:
100%
;
overflow-y
:
auto
;
background
:
url("./assets/images/background.png")
;
background
:
url("./assets/images/background.png")
;
background-repeat
:
no-repeat
;
background-size
:
100%
100%
;
background-color
:
#fff
;
background-size
:
contain
;
.home-main-header
{
.home-main-header
{
display
:
flex
;
display
:
flex
;
...
...
src/views/thinkTank/index.vue
浏览文件 @
3ed377d1
差异被折叠。
点击展开。
出口管制接口-4.md
0 → 100644
浏览文件 @
3ed377d1
差异被折叠。
点击展开。
出口管制接口.xlsx
deleted
100644 → 0
浏览文件 @
17e424f0
File deleted
出口管制接口new.md
0 → 100644
浏览文件 @
3ed377d1
差异被折叠。
点击展开。
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论