Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
R
risk-monitor
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
1
合并请求
1
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
蔡建
risk-monitor
Commits
c5add0d2
提交
c5add0d2
authored
1月 07, 2026
作者:
coderBryanFu
浏览文件
操作
浏览文件
下载
差异文件
update
上级
93476144
ca74db31
全部展开
显示空白字符变更
内嵌
并排
正在显示
22 个修改的文件
包含
982 行增加
和
227 行删除
+982
-227
coopRestriction.js
src/api/coopRestriction/coopRestriction.js
+20
-0
overview.js
src/api/innovationSubject/overview.js
+136
-0
InnovationSubject.js
src/router/modules/InnovationSubject.js
+1
-1
index.vue
src/views/bill/background/index.vue
+0
-0
index.vue
src/views/bill/billHome/index.vue
+16
-13
index.vue
src/views/bill/index.vue
+0
-56
default-icon-news.png
...views/coopRestriction/assets/images/default-icon-news.png
+0
-0
default-icon1.png
src/views/coopRestriction/assets/images/default-icon1.png
+0
-0
default-icon2.png
src/views/coopRestriction/assets/images/default-icon2.png
+0
-0
index.vue
src/views/coopRestriction/components/dataNew/index.vue
+18
-0
index.vue
src/views/coopRestriction/components/resLib/index.vue
+0
-0
index.vue
src/views/coopRestriction/index.vue
+212
-10
index.vue
src/views/exportControl/index.vue
+12
-2
index.vue
...v2.0SingleSanction/components/sanctionsOverview/index.vue
+28
-31
index.vue
src/views/innovationSubject/index.vue
+109
-26
index.vue
src/views/innovationSubject/innovativeInstitutions/index.vue
+53
-13
index.vue
...novationSubject/innovativeInstitutions/overView/index.vue
+0
-0
index.vue
...Subject/innovativeInstitutions/researchStrength/index.vue
+133
-20
charts.js
src/views/innovationSubject/utils/charts.js
+0
-0
index.vue
src/views/ruleRestriction/index.vue
+221
-53
index.vue
src/views/thinkTank/ThinkTankDetail/PolicyTracking/index.vue
+23
-2
box6-header-icon.png
src/views/thinkTank/assets/images/box6-header-icon.png
+0
-0
没有找到文件。
src/api/coopRestriction/coopRestriction.js
浏览文件 @
c5add0d2
...
...
@@ -77,3 +77,22 @@ export function getCoopRestrictionDomain(params) {
params
})
}
// 合作限制-获取合作限制列表接口
/**
* @param {area} 涉及领域
* @param {currentPage} 当前页码
* @param {pageSize} 每页数量
* @param {sortOrder} 排序顺序
* @param {source} 合作来源
* @param {sortField} 排序字段
* @param {type} 合作限制类型
* @header token
*/
export
function
getCoopRestrictionList
(
params
)
{
return
request
({
method
:
'GET'
,
url
:
`/api/cooperationlimitinfo/statList`
,
params
})
}
\ No newline at end of file
src/api/innovationSubject/overview.js
浏览文件 @
c5add0d2
// 智库概览信息
import
request
from
"@/api/request.js"
;
// 获取新闻资讯
/**
* @param {moduleId}
*/
export
function
getNews
(
moduleId
=
"0105"
)
{
return
request
({
method
:
'GET'
,
url
:
`/api/commonFeature/news/
${
moduleId
}
`
,
})
}
/**
* 社交媒体
*/
export
function
getSocialMediaInfo
(
moduleId
=
"0105"
)
{
return
request
({
method
:
"GET"
,
url
:
`/api/commonFeature/remarks/
${
moduleId
}
`
})
}
// 获取法案风险信号
/**
* @param {moduleId}
*/
export
function
getBillRiskSignal
(
moduleId
=
"0105"
)
{
return
request
({
method
:
'GET'
,
url
:
`/api/commonFeature/riskSignal/
${
moduleId
}
`
,
})
}
//创新主体主页:统计不同创新主体类型对应的主体数量
export
function
getCountSubjectType
()
{
return
request
({
...
...
@@ -41,3 +76,104 @@ export function getOverallRanking(params) {
params
})
}
//创新主体主页:领域布局
export
function
getResearchField
(
params
)
{
return
request
({
method
:
'GET'
,
url
:
`/api/innovateSubject/researchField`
,
params
})
}
//创新主体主页:主体类型分类领域布局
export
function
getResearchFieldSubjectType
(
params
)
{
return
request
({
method
:
'GET'
,
url
:
`/api/innovateSubject/researchFieldSubjectType`
,
params
})
}
/***********详情页 */
//创新主体详情:基本信息
export
function
getInfo
(
params
)
{
return
request
({
method
:
'GET'
,
url
:
`/api/innovateSubject/info/
${
params
.
id
}
`
,
params
})
}
//最新动态
export
function
getDynamics
(
params
)
{
return
request
({
method
:
'GET'
,
url
:
`/api/innovateSubject/dynamics/
${
params
.
orgId
}
`
,
params
})
}
//创新主体详情:历史事件轴
export
function
getEventList
(
params
)
{
return
request
({
method
:
'GET'
,
url
:
`/api/innovateSubject/eventList/
${
params
.
id
}
`
,
params
})
}
//创新主体详情:重点人物
export
function
getPersonList
(
params
)
{
return
request
({
method
:
'GET'
,
url
:
`/api/innovateSubject/personList/
${
params
.
id
}
`
,
params
})
}
//创新主体科研实力:专利数量统计
export
function
getPatentList
(
params
)
{
return
request
({
method
:
'GET'
,
url
:
`/api/innovateSubject/patentList/
${
params
.
id
}
`
,
params
})
}
// 创新主体科研实力:论文数量统计
export
function
getPaperList
(
params
)
{
return
request
({
method
:
'GET'
,
url
:
`/api/innovateSubject/paperList/
${
params
.
id
}
`
,
params
})
}
//创新主体科研实力:经费增长情况
export
function
getFundGrowth
(
params
)
{
return
request
({
method
:
'GET'
,
url
:
`/api/innovateSubject/fundGrowth/
${
params
.
id
}
`
,
params
})
}
//创新主体科研实力:经费来源
export
function
getFundFromList
(
params
)
{
return
request
({
method
:
'GET'
,
url
:
`/api/innovateSubject/fundFromList/
${
params
.
id
}
`
,
params
})
}
//创新主体科研实力:经费分配
export
function
getFundToList
(
params
)
{
return
request
({
method
:
'GET'
,
url
:
`/api/innovateSubject/fundToList/
${
params
.
id
}
`
,
params
})
}
src/router/modules/InnovationSubject.js
浏览文件 @
c5add0d2
...
...
@@ -13,7 +13,7 @@ const innovationSubjectRoutes = [
}
},
{
path
:
"/InnovativeInstitutions"
,
path
:
"/InnovativeInstitutions
/:id
"
,
name
:
"InnovativeInstitutions"
,
component
:
InnovationInstitution
,
meta
:
{
...
...
src/views/bill/background/index.vue
浏览文件 @
c5add0d2
差异被折叠。
点击展开。
src/views/bill/billHome/index.vue
浏览文件 @
c5add0d2
...
...
@@ -1524,24 +1524,26 @@ watch(box8selectetedTime, () => {
}
);
const
handleToPosi
=
id
=>
{
let
top
=
0
;
switch
(
id
)
{
case
"position2"
:
top
=
isShow
.
value
?
634
:
980
;
break
;
case
"position3"
:
top
=
isShow
.
value
?
1204
:
1550
;
break
;
case
"position4"
:
top
=
isShow
.
value
?
2334
:
2680
;
break
;
default
:
top
=
0
;
const
element
=
document
.
getElementById
(
id
);
if
(
element
&&
containerRef
.
value
)
{
// 1. 如果是从完整搜索框跳转,先强制切换状态稳定布局
if
(
!
isShow
.
value
)
{
isShow
.
value
=
true
;
}
// 2. 使用 nextTick 等待 DOM 布局(如高度切换)完成后再进行坐标计算
nextTick
(()
=>
{
const
containerRect
=
containerRef
.
value
.
getBoundingClientRect
();
const
elementRect
=
element
.
getBoundingClientRect
();
// 使用 getBoundingClientRect 计算元素相对于容器顶部的绝对距离
const
top
=
elementRect
.
top
-
containerRect
.
top
+
containerRef
.
value
.
scrollTop
;
containerRef
.
value
.
scrollTo
({
top
:
top
,
behavior
:
"smooth"
}
);
}
);
}
}
;
const
tabList
=
ref
([
...
...
@@ -1838,6 +1840,7 @@ onUnmounted(() => {});
overflow
-
y
:
auto
;
}
.
home
-
box
{
position
:
relative
;
width
:
100
%
;
height
:
100
%
;
background
:
url
(
"./assets/images/background.png"
);
...
...
src/views/bill/index.vue
浏览文件 @
c5add0d2
...
...
@@ -116,62 +116,6 @@ const handleClickLeftSiderBtn = (item) => {
}
})
}
const
progressList
=
ref
([
{
tip
:
true
,
date
:
"7月5日"
,
title
:
"特朗普于美国独立日签署法案,公法编号Pub. L. No. 119-21。白宫举行庆典,B-2轰炸机飞越上空,象征“美国新时代”开启。"
,
degree
:
"特别重大风险"
,
rank
:
4
,
},
{
tip
:
true
,
date
:
"7月4日"
,
title
:
"众议院最终表决218票赞成 vs 214票反对,修订版法案以4票优势通过,2名共和党议员倒戈,民主党全员反对。"
,
degree
:
"重大风险"
,
rank
:
3
,
},
{
tip
:
true
,
date
:
"7月3日"
,
title
:
"民主党领袖杰弗里斯发表 8小时45分钟 演讲(众议院现代史最长),抗议法案“劫贫济富”,但仍未阻止表决。"
,
degree
:
"较大风险"
,
rank
:
2
,
},
{
tip
:
true
,
date
:
"7月2日"
,
title
:
"众议院以 219:213 通过程序规则,为最终表决铺路。此前4名共和党议员反对程序规则,议长约翰逊紧急游说挽回1票。"
,
degree
:
"低风险"
,
rank
:
1
,
},
{
tip
:
false
,
date
:
"7月1日"
,
title
:
"参议院最终表决投票51:50,副总统万斯(JD Vance)投出关键票打破平局。3名共和党参议员倒戈(蒂利斯、保罗、柯林斯)。"
,
degree
:
""
,
},
]);
const
wordCloudData
=
[
{
name
:
"财政保守主义"
,
value
:
100
},
{
name
:
"移民与边境安全"
,
value
:
5
},
{
name
:
"削减市民福利"
,
value
:
77
},
{
name
:
"债务驱动型经济"
,
value
:
35
},
{
name
:
"传统能源"
,
value
:
96
},
{
name
:
"与马斯克公开冲突"
,
value
:
57
},
{
name
:
"共和党财政鹰派"
,
value
:
72
},
{
name
:
"财政问责法案"
,
value
:
18
},
{
name
:
"强硬边境政策"
,
value
:
34
},
{
name
:
"扩大军费"
,
value
:
16
},
{
name
:
"债务与赤字警告"
,
value
:
72
},
{
name
:
"批评美国债务膨胀"
,
value
:
58
},
];
onMounted
(()
=>
{});
</
script
>
...
...
src/views/coopRestriction/assets/images/default-icon-news.png
0 → 100644
浏览文件 @
c5add0d2
57.8 KB
src/views/coopRestriction/assets/images/default-icon1.png
0 → 100644
浏览文件 @
c5add0d2
6.5 KB
src/views/coopRestriction/assets/images/default-icon2.png
0 → 100644
浏览文件 @
c5add0d2
8.2 KB
src/views/coopRestriction/components/dataNew/index.vue
浏览文件 @
c5add0d2
...
...
@@ -335,6 +335,14 @@ onMounted(() => {
margin-bottom
:
12px
;
display
:
flex
;
align-items
:
flex-start
;
&
:
:
before
{
content
:
"·"
;
font-size
:
24px
;
line-height
:
20px
;
font-weight
:
bold
;
margin-right
:
16px
;
color
:
rgb
(
59
,
65
,
75
);
}
.ul-title
{
flex-shrink
:
0
;
width
:
120px
;
...
...
@@ -413,6 +421,16 @@ onMounted(() => {
line-height
:
24px
;
color
:
rgb
(
59
,
65
,
75
);
margin-bottom
:
10px
;
display
:
flex
;
align-items
:
center
;
&
:
:
before
{
content
:
"·"
;
font-size
:
24px
;
line-height
:
20px
;
font-weight
:
bold
;
margin-right
:
12px
;
color
:
rgb
(
59
,
65
,
75
);
}
}
}
.left-bottom-content
{
...
...
src/views/coopRestriction/components/resLib/index.vue
浏览文件 @
c5add0d2
差异被折叠。
点击展开。
src/views/coopRestriction/index.vue
浏览文件 @
c5add0d2
<
template
>
<div
class=
"coop-page"
>
<!-- 吸顶简易搜索框 -->
<div
class=
"search-header"
v-show=
"isShow"
>
<div
class=
"home-main-header-center"
>
<input
v-model=
"input"
class=
"search-input"
placeholder=
"搜索合作限制"
/>
<div
class=
"search-btn-small"
@
click=
"handleSearch"
>
<div
class=
"search-icon"
>
<img
src=
"./assets/icons/search-icon.png"
alt=
""
/>
</div>
<div
class=
"search-text"
>
搜索
</div>
</div>
</div>
<div
class=
"home-main-header-btn-box"
>
<div
class=
"btn"
@
click=
"handleToPosi('position1')"
>
<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-icon"
>
<img
src=
"@/assets/icons/arrow-right-icon.png"
alt=
""
/>
</div>
</div>
<div
class=
"btn"
@
click=
"handleToPosi('position3')"
>
<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('position4')"
>
<div
class=
"btn-text"
>
资源库
</div>
<div
class=
"btn-icon"
>
<img
src=
"@/assets/icons/arrow-right-icon.png"
alt=
""
/>
</div>
</div>
</div>
</div>
<!-- 面包屑 -->
<div
class=
"breadcrumb"
>
<div
class=
"breadcrumb"
v-show=
"!isShow"
>
<div
class=
"breadcrumb-box"
>
<div
class=
"breadcrumb-item"
>
国家科技安全
</div>
<div
class=
"breadcrumb-item"
>
>
</div>
...
...
@@ -11,9 +50,9 @@
</div>
</div>
<!-- 主页面 -->
<div
class=
"main-content"
>
<div
class=
"main-content"
ref=
"homeMainRef"
:class=
"
{ 'scroll-main': isShow }"
>
<!-- 搜索栏部分 -->
<div
class=
"search"
>
<div
class=
"search"
v-show=
"!isShow"
>
<div
class=
"search-main"
>
<input
v-model=
"input"
placeholder=
"搜索合作限制"
class=
"search-input"
/>
<div
class=
"search-btn"
>
...
...
@@ -36,25 +75,25 @@
</div>
</div>
-->
<div
class=
"search-bottom"
>
<div
class=
"btn"
@
click=
"
scrollToTop
('position1')"
>
<div
class=
"btn"
@
click=
"
handleToPosi
('position1')"
>
<div
class=
"btn-text"
>
最新动态
</div>
<div
class=
"btn-icon"
>
<img
src=
"@/assets/icons/arrow-right-icon.png"
alt=
""
/>
</div>
</div>
<div
class=
"btn"
@
click=
"
scrollToTop
('position2')"
>
<div
class=
"btn"
@
click=
"
handleToPosi
('position2')"
>
<div
class=
"btn-text"
>
咨询要闻
</div>
<div
class=
"btn-icon"
>
<img
src=
"@/assets/icons/arrow-right-icon.png"
alt=
""
/>
</div>
</div>
<div
class=
"btn"
@
click=
"
scrollToTop
('position3')"
>
<div
class=
"btn"
@
click=
"
handleToPosi
('position3')"
>
<div
class=
"btn-text"
>
数据总览
</div>
<div
class=
"btn-icon"
>
<img
src=
"@/assets/icons/arrow-right-icon.png"
alt=
""
/>
</div>
</div>
<div
class=
"btn"
@
click=
"
scrollToTop
('position4')"
>
<div
class=
"btn"
@
click=
"
handleToPosi
('position4')"
>
<div
class=
"btn-text"
>
资源库
</div>
<div
class=
"btn-icon"
>
<img
src=
"@/assets/icons/arrow-right-icon.png"
alt=
""
/>
...
...
@@ -95,21 +134,52 @@
</
template
>
<
script
setup
>
import
{
ref
,
onMounted
}
from
"vue"
;
import
{
ref
,
onMounted
,
nextTick
}
from
"vue"
;
import
{
useRouter
}
from
"vue-router"
;
import
comTitle
from
"./common/comTitle.vue"
;
import
newData
from
"./components/dataNew/index.vue"
;
import
askPage
from
"./components/askPage/index.vue"
;
import
dataSub
from
"./components/dataSub/index.vue"
;
import
resLib
from
"./components/resLib/index.vue"
;
import
scrollToTop
from
"@/utils/scrollToTop"
;
import
{
useContainerScroll
}
from
"@/hooks/useScrollShow"
;
// 搜索框
const
input
=
ref
(
""
);
const
homeMainRef
=
ref
(
null
);
const
{
isShow
}
=
useContainerScroll
(
homeMainRef
);
const
router
=
useRouter
();
// 搜索功能
const
handleSearch
=
()
=>
{
console
.
log
(
"搜索内容:"
,
input
.
value
);
};
// 锚点跳转
const
handleToPosi
=
id
=>
{
const
element
=
document
.
getElementById
(
id
);
if
(
element
&&
homeMainRef
.
value
)
{
// 如果当前还未显示吸顶搜索栏,先强制切换状态以稳定布局
if
(
!
isShow
.
value
)
{
isShow
.
value
=
true
;
}
// 使用 nextTick 确保 DOM 状态更新(高度变化生效)后再计算
nextTick
(()
=>
{
const
containerRect
=
homeMainRef
.
value
.
getBoundingClientRect
();
const
elementRect
=
element
.
getBoundingClientRect
();
// 使用 getBoundingClientRect 计算元素相对于容器顶部的绝对距离,不受嵌套布局影响
const
top
=
elementRect
.
top
-
containerRect
.
top
+
homeMainRef
.
value
.
scrollTop
;
homeMainRef
.
value
.
scrollTo
({
top
:
top
,
behavior
:
"smooth"
});
});
}
};
// 返回首页
const
handleBackHome
=
()
=>
{
router
.
push
({
...
...
@@ -152,6 +222,7 @@ const handleBackHome = () => {
}
}
.main-content
{
position
:
relative
;
overflow
:
auto
;
width
:
100%
;
height
:
calc
(
100%
-
64px
);
...
...
@@ -188,7 +259,11 @@ const handleBackHome = () => {
font-weight
:
400
;
font-family
:
"Microsoft YaHei"
;
line-height
:
24px
;
color
:
rgb
(
132
,
136
,
142
);
color
:
rgba
(
59
,
65
,
75
,
1
);
&
:
:
placeholder
{
color
:
#a8abb2
;
}
}
.search-btn
{
margin-right
:
-3px
;
...
...
@@ -335,5 +410,132 @@ const handleBackHome = () => {
}
}
}
.search-header
{
width
:
100%
;
height
:
144px
;
background
:
#fff
;
box-shadow
:
0px
0px
15px
0px
rgba
(
22
,
119
,
255
,
0
.1
);
overflow
:
hidden
;
.home-main-header-center
{
margin-top
:
20px
;
margin-left
:
200px
;
width
:
800px
;
height
:
48px
;
border-radius
:
10px
;
box-shadow
:
0px
0px
15px
0px
rgba
(
22
,
119
,
255
,
0
.1
);
background
:
rgba
(
255
,
255
,
255
,
1
);
box-sizing
:
border-box
;
padding
:
1px
;
position
:
relative
;
border
:
1px
solid
transparent
;
display
:
flex
;
align-items
:
center
;
&
:hover
{
border
:
1px
solid
var
(
--
color-main-active
);
}
.search-input
{
border
:
none
;
outline
:
none
;
width
:
800px
;
height
:
46px
;
background-color
:
transparent
;
font-size
:
16px
;
padding
:
12px
16px
;
font-weight
:
400
;
font-family
:
"Microsoft YaHei"
;
line-height
:
24px
;
color
:
rgb
(
132
,
136
,
142
);
}
.search-btn-small
{
position
:
absolute
;
right
:
-1px
;
top
:
0px
;
width
:
120px
;
height
:
46px
;
border-radius
:
10px
;
background
:
var
(
--
color-main-active
);
display
:
flex
;
justify-content
:
center
;
align-items
:
center
;
cursor
:
pointer
;
.search-icon
{
width
:
18px
;
height
:
18px
;
img
{
width
:
100%
;
height
:
100%
;
}
}
.search-text
{
margin-left
:
8px
;
height
:
22px
;
color
:
#fff
;
font-family
:
Microsoft
YaHei
;
font-size
:
16px
;
font-weight
:
400
;
line-height
:
22px
;
}
}
}
.home-main-header-btn-box
{
margin-top
:
20px
;
margin-left
:
200px
;
display
:
flex
;
gap
:
16px
;
.btn
{
display
:
flex
;
align-items
:
center
;
gap
:
9px
;
width
:
160px
;
height
:
48px
;
border
:
1px
solid
#aed6ff
;
box-sizing
:
border-box
;
border-radius
:
24px
;
background
:
#e7f3ff
;
cursor
:
pointer
;
position
:
relative
;
&
:hover
{
background
:
#cae3fc
;
}
.btn-text
{
width
:
80px
;
color
:
var
(
--
color-main-active
);
font-family
:
Microsoft
YaHei
;
font-size
:
20px
;
font-weight
:
400
;
line-height
:
48px
;
margin-left
:
36px
;
text-align
:
center
;
}
.btn-icon
{
position
:
absolute
;
top
:
16px
;
right
:
19px
;
width
:
6px
;
height
:
12px
;
img
{
width
:
100%
;
height
:
100%
;
}
}
}
}
}
.scroll-main
{
height
:
calc
(
100%
-
144px
)
!
important
;
}
}
</
style
>
src/views/exportControl/index.vue
浏览文件 @
c5add0d2
...
...
@@ -627,8 +627,7 @@
</template>
<
script
setup
>
import
{
onMounted
,
ref
,
computed
,
reactive
,
shallowRef
,
watch
}
from
"vue"
;
import
scrollToTop
from
"@/utils/scrollToTop"
;
import
{
onMounted
,
ref
,
computed
,
reactive
,
shallowRef
,
watch
,
nextTick
}
from
"vue"
;
import
{
useContainerScroll
}
from
"@/hooks/useScrollShow"
;
const
homeMainRef
=
ref
(
null
);
const
{
isShow
}
=
useContainerScroll
(
homeMainRef
);
...
...
@@ -686,13 +685,23 @@ import {
const
handleToPosi
=
id
=>
{
const
element
=
document
.
getElementById
(
id
);
if
(
element
&&
homeMainRef
.
value
)
{
// 1. 如果是从完整搜索框跳转,先强制切换状态稳定布局
if
(
!
isShow
.
value
)
{
isShow
.
value
=
true
;
}
// 2. 使用 nextTick 等待 DOM 布局(如高度切换)完成后再进行坐标计算
nextTick
(()
=>
{
const
containerRect
=
homeMainRef
.
value
.
getBoundingClientRect
();
const
elementRect
=
element
.
getBoundingClientRect
();
// 使用 getBoundingClientRect 计算元素相对于容器顶部的绝对距离,不受嵌套布局影响
const
top
=
elementRect
.
top
-
containerRect
.
top
+
homeMainRef
.
value
.
scrollTop
;
homeMainRef
.
value
.
scrollTo
({
top
:
top
,
behavior
:
"smooth"
});
});
}
};
...
...
@@ -2159,6 +2168,7 @@ const handleMediaClick = item => {
overflow-y
:
hidden
;
.home-main
{
position
:
relative
;
width
:
100%
;
height
:
100%
;
overflow-y
:
auto
;
...
...
src/views/exportControl/v2.0SingleSanction/components/sanctionsOverview/index.vue
浏览文件 @
c5add0d2
...
...
@@ -103,36 +103,37 @@
</div>
</div>
<div
class=
"right-title"
>
<div
class=
"filter-row"
>
<!--
<div
class=
"filter-left"
>
<el-select
v-model=
"filterEntity"
placeholder=
"受制裁实体"
style=
"width: 184px"
>
<el-option
label=
"受制裁实体"
value=
"1"
/>
</el-select>
</div>
-->
<div
class=
"filter-right"
>
<el-checkbox
v-model=
"onlyChina"
label=
"只看中国实体"
/>
<el-select
v-model=
"filterField"
placeholder=
"全部领域"
style=
"width: 150px; margin: 0 12px 0 16px"
>
<el-option
label=
"全部领域"
value=
""
/>
<el-option
v-for=
"item in domainOptions"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
</el-select>
<el-input
v-model=
"searchKeyword"
placeholder=
"搜索实体"
style=
"width: 150px"
:suffix-icon=
"Search"
/>
</div>
</div>
<div
class=
"stats-row"
>
<
!--
<
div
class=
"tabs"
>
<div
class=
"tabs"
>
<div
class=
"tab-btn"
:class=
"
{ active: activeTab === 'add' }" @click="activeTab = 'add'">新增实体
</div>
<div
class=
"tab-btn"
:class=
"
{ active: activeTab === 'remove' }" @click="activeTab = 'remove'">移除实体
</div>
</div>
-->
</div>
<div
class=
"stats-info"
>
<div
class=
"stat-item"
>
<span
class=
"dot red"
></span>
<span
class=
"text"
>
新增
<span
class=
"num red"
>
{{
addCount
}}
</span>
家 (50%规则涉及
<span
class=
"num red"
>
{{
addRuleCount
}}
</span>
家)
</span>
</div>
<
!--
<
div
class=
"stat-item"
>
<div
class=
"stat-item"
>
<span
class=
"dot green"
></span>
<span
class=
"text"
>
移除
<span
class=
"num green"
>
{{
removeCount
}}
</span>
家 (50%规则涉及
<span
class=
"num green"
>
{{
removeRuleCount
}}
</span>
家)
</span>
</div>
-->
</div>
</div>
</div>
<div
class=
"filter-row"
>
<div
class=
"filter-left"
>
<!--
<el-select
v-model=
"filterEntity"
placeholder=
"受制裁实体"
style=
"width: 184px"
>
<el-option
label=
"受制裁实体"
value=
"1"
/>
</el-select>
-->
</div>
<div
class=
"filter-right"
>
<el-checkbox
v-model=
"onlyChina"
label=
"只看中国实体"
/>
<el-select
v-model=
"filterField"
placeholder=
"全部领域"
style=
"width: 150px; margin: 0 12px 0 16px"
>
<el-option
label=
"全部领域"
value=
""
/>
<el-option
v-for=
"item in domainOptions"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
</el-select>
<el-input
v-model=
"searchKeyword"
placeholder=
"搜索实体"
style=
"width: 150px"
:suffix-icon=
"Search"
/>
</div>
</div>
</div>
...
...
@@ -185,6 +186,7 @@
<
script
setup
>
import
{
ref
,
defineProps
,
computed
,
onMounted
,
watch
}
from
"vue"
;
import
{
useRouter
}
from
"vue-router"
;
import
{
ElMessage
}
from
"element-plus"
;
import
{
DArrowRight
,
Search
}
from
"@element-plus/icons-vue"
;
import
{
debounce
}
from
"lodash"
;
import
title
from
"../../assets/title.png"
...
...
@@ -195,14 +197,10 @@ import RuleSubsidiaryDialog from "../../../v2.0EntityList/components/sanctionsOv
// 跳转公司详情页
const
handleCompClick
=
item
=>
{
// console.log("item", item);
// const route = router.resolve({
// path: "/companyPages",
// query: {
// id: item.entityId
// }
// });
// window.open(route.href, "_blank");
if
(
!
item
.
entityId
)
{
ElMessage
.
warning
(
"暂无数据"
);
return
;
}
const
curRoute
=
router
.
resolve
({
name
:
"companyPages"
,
params
:
{
id
:
item
.
entityId
}
});
window
.
open
(
curRoute
.
href
,
"_blank"
);
};
...
...
@@ -817,10 +815,9 @@ onMounted(() => {
.filter-row
{
display
:
flex
;
// 隐藏使用right,解除使用space-between
justify-content
:
right
;
align-items
:
center
;
margin-bottom
:
20px
;
//
margin-bottom: 20px;
:deep
(
.el-input__inner
)
{
font-size
:
16px
;
...
...
@@ -850,8 +847,8 @@ onMounted(() => {
.stats-row
{
display
:
flex
;
// 隐藏使用right,解除使用space-between
justify-content
:
right
;
margin-bottom
:
20px
;
justify-content
:
space-between
;
align-items
:
center
;
.tabs
{
...
...
src/views/innovationSubject/index.vue
浏览文件 @
c5add0d2
...
...
@@ -158,16 +158,16 @@
<div
class=
"box2-main"
>
<div
class=
"box2-main-item"
v-for=
"(item, index) in warningList"
:key=
"index"
>
<div
class=
"item-left"
:class=
"
{
itemLeftStatus1: item.s
tatus
=== '一般风险',
itemLeftStatus2: item.s
tatus
=== '重大风险'
itemLeftStatus1: item.s
ignalLevel
=== '一般风险',
itemLeftStatus2: item.s
ignalLevel
=== '重大风险'
}">
{{
item
.
s
tatus
}}
{{
item
.
s
ignalLevel
}}
</div>
<div
class=
"item-right"
>
<div
class=
"text"
>
{{
item
.
t
itle
}}
{{
item
.
signalT
itle
}}
</div>
<div
class=
"time"
>
{{
item
.
t
ime
}}
</div>
<div
class=
"time"
>
{{
item
.
signalT
ime
}}
</div>
</div>
</div>
</div>
...
...
@@ -194,14 +194,14 @@
<div
class=
"box3-main"
>
<div
class=
"box3-item"
v-for=
"(news, index) in newsList"
:key=
"index"
>
<div
class=
"left"
>
<img
:src=
"news.
img
"
alt=
""
/>
<img
:src=
"news.
newsImage
"
alt=
""
/>
</div>
<div
class=
"right"
>
<div
class=
"right-top"
>
<div
class=
"title"
>
{{
news
.
t
itle
}}
</div>
<div
class=
"time"
>
{{
news
.
from
}}
</div>
<div
class=
"title"
>
{{
news
.
newsT
itle
}}
</div>
<div
class=
"time"
>
{{
news
.
newsDate
+
'.'
+
news
.
newsOrg
}}
</div>
</div>
<div
class=
"right-footer"
>
{{
news
.
c
ontent
}}
</div>
<div
class=
"right-footer"
>
{{
news
.
newsC
ontent
}}
</div>
</div>
</div>
</div>
...
...
@@ -216,14 +216,14 @@
<div
class=
"box4-main"
>
<div
class=
"box4-main-item"
v-for=
"(item, index) in messageList"
:key=
"index"
>
<div
class=
"left"
>
<img
:src=
"item.
img
"
alt=
""
/>
<img
:src=
"item.
personImage
"
alt=
""
/>
</div>
<div
class=
"right"
>
<div
class=
"right-top"
>
<div
class=
"name"
>
{{
item
.
n
ame
}}
</div>
<div
class=
"time"
>
{{
item
.
time
}}
</div>
<div
class=
"name"
>
{{
item
.
personN
ame
}}
</div>
<div
class=
"time"
>
{{
item
.
time
+
'.'
+
item
.
orgName
}}
</div>
</div>
<div
class=
"content"
>
{{
item
.
content
}}
</div>
<div
class=
"content"
>
{{
item
.
remarks
}}
</div>
</div>
</div>
</div>
...
...
@@ -240,7 +240,7 @@
</div>
</div>
<div
class=
"select-box"
>
<el-select
v-model=
"releaseTime"
placeholder=
"2022"
style=
"width: 120px"
<el-select
v-model=
"releaseTime"
pl
aceholder=
"2022"
style=
"width: 120px"
@
change=
"handleGetOverallRanking"
>
<el-option
v-for=
"item in releaseTimeList"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
...
...
@@ -308,7 +308,8 @@
</div>
</div>
<div
class=
"select-box"
>
<el-select
v-model=
"releaseTime"
placeholder=
"2022"
style=
"width: 120px"
>
<el-select
v-model=
"releaseTime"
placeholder=
"2022"
style=
"width: 120px"
@
change=
"handleGetResearchField(), handleGetResearchFieldSubjectType()"
>
<el-option
v-for=
"item in releaseTimeList"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
</el-select>
...
...
@@ -324,7 +325,7 @@
</div>
<div
class=
"center-footer-layout-content"
>
<div
class=
"center-footer-layout-content-item"
>
<EChart
:option=
"pieOption"
autoresize
:style=
"{ height: '370px', width: '750px' }"
/>
<EChart
:option=
"pieOption
(barOptionData)
"
autoresize
:style=
"{ height: '370px', width: '750px' }"
/>
<div
class=
"center-footer-elx-footer"
>
<img
src=
"./assets/images/ai.png"
alt=
""
/>
<div
class=
"center-footer-elx-footer-text"
>
...
...
@@ -335,7 +336,8 @@
</div>
<div
style=
"width: 1px;height: 432px;background: rgba(234, 236, 238, 1);"
></div>
<div
class=
"center-footer-layout-content-item"
>
<EChart
:option=
"raderOption"
autoresize
:style=
"{ height: '370px', width: '750px' }"
/>
<EChart
:option=
"raderOption(raderOptionData)"
autoresize
:style=
"{ height: '370px', width: '750px' }"
/>
<div
class=
"center-footer-elx-footer"
>
<img
src=
"./assets/images/ai.png"
alt=
""
/>
<div
class=
"center-footer-elx-footer-text"
>
...
...
@@ -365,7 +367,8 @@
</div>
<div
class=
"home-main-footer-main"
>
<div
style=
" width: 1600px;"
>
<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(item.orgId)"
>
<img
:src=
"item.logoUrl"
style=
"height: 32px; width: 32px;"
/>
<div
class=
"item-text"
>
{{ item.orgName }}
</div>
<div
class=
"item-text2"
>
{{ item.address }}
</div>
...
...
@@ -409,11 +412,16 @@ import getCalendarHeatChart from "./utils/cleandarHeat";
import
EChart
from
"@/components/Chart/index.vue"
;
import
{
pieOption
,
raderOption
}
from
"./utils/charts"
;
import
{
getNews
,
getSocialMediaInfo
,
getBillRiskSignal
,
getCountGeography
,
getCountSubjectType
,
getSubjectTypeList
,
findListBySubjectTypeId
,
getOverallRanking
getOverallRanking
,
getResearchField
,
getResearchFieldSubjectType
}
from
"@/api/innovationSubject/overview.js"
;
import
setChart
from
"@/utils/setChart"
;
...
...
@@ -555,9 +563,11 @@ const handleGetCountGeography = async () => {
}
};
// 点击查看详情
const
handleClickToDetail
=
()
=>
{
const
route
=
router
.
resolve
(
"/InnovativeInstitutions"
);
window
.
open
(
route
.
href
,
"_blank"
);
const
handleClickToDetail
=
(
university
)
=>
{
const
curRoute
=
router
.
resolve
({
name
:
"InnovativeInstitutions"
,
params
:
{
id
:
university
}
});
window
.
open
(
curRoute
.
href
,
"_blank"
);
// const route = router.resolve("/InnovativeInstitutions");
// window.open(route.href, "_blank");
};
// 查看更多风险信号
...
...
@@ -610,7 +620,17 @@ const warningList = ref([
status
:
"重大风险"
}
]);
const
handleGetBillRiskSignal
=
async
()
=>
{
try
{
const
res
=
await
getBillRiskSignal
();
console
.
log
(
"风险信号"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
warningList
.
value
=
res
.
data
}
}
catch
(
error
)
{
console
.
error
(
"获取风险信号error"
,
error
);
}
};
// 新闻资讯
const
newsList
=
ref
([
{
...
...
@@ -644,6 +664,18 @@ const newsList = ref([
from
:
"11-2 · 福克斯新闻网"
}
]);
const
handleGetNews
=
async
()
=>
{
try
{
const
res
=
await
getNews
();
console
.
log
(
"新闻资讯"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
newsList
.
value
=
res
.
data
}
}
catch
(
error
)
{
console
.
error
(
"获取新闻资讯error"
,
error
);
}
};
// 社交媒体
const
messageList
=
ref
([
...
...
@@ -666,7 +698,17 @@ const messageList = ref([
content
:
`提出特朗普政府的AI政策强调技术开放与快速应用,但可能以牺牲安全防范为代价,开启了“潘多拉魔盒”。`
}
]);
const
handleGetSocialMediaInfo
=
async
()
=>
{
try
{
const
res
=
await
getSocialMediaInfo
();
console
.
log
(
"社交媒体"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
messageList
.
value
=
res
.
data
}
}
catch
(
error
)
{
console
.
error
(
"获取社交媒体error"
,
error
);
}
};
// 政令涉及领域
const
chart1Data
=
ref
([
...
...
@@ -884,6 +926,43 @@ const releaseTimeList = ref([
]);
const
categoryList
=
ref
([
"创新主体排名"
,
"研究布局"
]);
const
activeCate
=
ref
(
"创新主体排名"
);
//研究领域布局情况
const
barOptionData
=
ref
([])
const
handleGetResearchField
=
async
()
=>
{
try
{
let
params
=
{
year
:
releaseTime
.
value
,
}
const
res
=
await
getResearchField
(
params
);
console
.
log
(
"研究领域布局情况"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
// 提取 names 和 values
const
names
=
res
.
data
.
map
(
item
=>
item
.
areaName
);
const
values
=
res
.
data
.
map
(
item
=>
item
.
amount
);
// 或者使用 item.percent,根据需求选择
const
total
=
res
.
data
.
reduce
((
sum
,
item
)
=>
sum
+
item
.
amount
,
0
);
barOptionData
.
value
=
{
names
,
values
,
total
}
}
}
catch
(
error
)
{
console
.
error
(
"获取研究领域布局情况error"
,
error
);
}
};
const
raderOptionData
=
ref
([])
const
handleGetResearchFieldSubjectType
=
async
()
=>
{
try
{
let
params
=
{
year
:
releaseTime
.
value
,
}
const
res
=
await
getResearchFieldSubjectType
(
params
);
console
.
log
(
"研究领域布局情况"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
raderOptionData
.
value
=
res
.
data
}
}
catch
(
error
)
{
console
.
error
(
"获取研究领域布局情况error"
,
error
);
}
};
const
areaList
=
ref
([
{
...
...
@@ -894,7 +973,6 @@ const areaList = ref([
const
categoryList1
=
ref
([
"研究型大学"
,
"国家实验室"
,
"科技企业"
,
"国防承包商"
]);
const
activeCate1
=
ref
(
''
);
//类型列表
const
handleGetSubjectTypeList
=
async
()
=>
{
try
{
...
...
@@ -959,12 +1037,17 @@ const handleToPosi = id => {
};
onMounted
(
async
()
=>
{
handleGetNews
()
handleGetSocialMediaInfo
()
handleGetBillRiskSignal
()
await
handleGetSubjectTypeList
()
handleGetCountGeography
()
handleGetCountSubjectType
()
handleGetOverallRanking
()
handleFindListBySubjectTypeId
()
handleGetResearchField
()
handleGetResearchFieldSubjectType
()
let
chart1
=
getPieChart
(
chart1Data
.
value
,
colorList
);
setChart
(
chart1
,
"chart1"
);
});
...
...
@@ -1621,7 +1704,7 @@ onMounted(async () => {
display
:
flex
;
.text
{
width
:
3
48
px
;
width
:
3
10
px
;
color
:
rgba
(
59
,
65
,
75
,
1
);
font-family
:
Microsoft
YaHei
;
font-size
:
16px
;
...
...
src/views/innovationSubject/innovativeInstitutions/index.vue
浏览文件 @
c5add0d2
...
...
@@ -2,14 +2,14 @@
<div
class=
"wrap"
>
<div
class=
"header"
>
<div
class=
"header-left"
>
<img
src=
"./assets/images/icon-harvard.png
"
alt=
""
/>
<img
:src=
"institutionInfo.logoUrl
"
alt=
""
/>
</div>
<div
class=
"header-right"
>
<div
class=
"title"
>
{{
institutionInfo
.
n
ame
}}
</div>
<div
class=
"en-title"
>
{{
institutionInfo
.
enName
}}
</div>
<div
class=
"desc"
>
{{
institutionInfo
.
desc
}}
</div>
<div
class=
"title"
>
{{
institutionInfo
.
orgN
ame
}}
</div>
<div
class=
"en-title"
>
{{
institutionInfo
.
orgNameEn
}}
</div>
<div
class=
"desc"
>
{{
institutionInfo
.
orgIntroduction
}}
</div>
<div
class=
"tag-box"
>
<div
class=
"tag"
v-for=
"(tag, index) in institutionInfo.tag
L
ist"
:key=
"index"
>
<div
class=
"tag"
v-for=
"(tag, index) in institutionInfo.tag
l
ist"
:key=
"index"
>
{{
tag
}}
</div>
</div>
...
...
@@ -18,17 +18,12 @@
<div
class=
"icon"
>
<img
src=
"@/assets/images/links-icon.png"
alt=
""
/>
</div>
<div
class=
"text"
>
{{
"查看官网"
}}
</div>
<div
class=
"text"
@
click=
"toURL(institutionInfo.url)"
>
{{
"查看官网"
}}
</div>
</div>
</div>
<div
class=
"tab-box"
>
<div
class=
"tab"
@
click=
"handleClickTab(item, index)"
:class=
"
{ tabActive: item.active }"
v-for="(item, index) in tabList"
:key="index"
>
<div
class=
"tab"
@
click=
"handleClickTab(item, index)"
:class=
"
{ tabActive: item.active }"
v-for="(item, index) in tabList" :key="index">
{{
item
.
name
}}
</div>
</div>
...
...
@@ -47,6 +42,11 @@ import overView from "./overView/index.vue";
import
researchStrength
from
"./researchStrength/index.vue"
;
import
cooperationStatus
from
"./cooperationStatus/index.vue"
;
import
otherStatus
from
"./otherStatus/index.vue"
;
import
{
useRouter
}
from
"vue-router"
;
import
{
getInfo
}
from
"@/api/innovationSubject/overview.js"
;
const
router
=
useRouter
();
const
institutionInfo
=
ref
({
name
:
"哈佛大学"
,
...
...
@@ -55,6 +55,23 @@ const institutionInfo = ref({
tagList
:
[
"常春藤"
,
"精英摇篮"
]
});
const
handleGetInfo
=
async
()
=>
{
try
{
let
params
=
{
id
:
router
.
currentRoute
.
_value
.
params
.
id
}
const
res
=
await
getInfo
(
params
);
console
.
log
(
"创新主体详情"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
institutionInfo
.
value
=
res
.
data
}
}
catch
(
error
)
{
console
.
error
(
"获取创新主体详情error"
,
error
);
}
};
const
toURL
=
(
url
)
=>
{
}
const
activeTabName
=
ref
(
"学校详情"
);
const
tabList
=
ref
([
...
...
@@ -83,6 +100,11 @@ const handleClickTab = (val, index) => {
tabList
.
value
[
index
].
active
=
true
;
activeTabName
.
value
=
val
.
name
;
};
onMounted
(
async
()
=>
{
handleGetInfo
()
});
</
script
>
<
style
lang=
"scss"
scoped
>
...
...
@@ -93,6 +115,7 @@ const handleClickTab = (val, index) => {
background-repeat
:
no-repeat
;
background-size
:
100%
auto
;
padding-top
:
16px
;
.header
{
width
:
1600px
;
height
:
200px
;
...
...
@@ -104,17 +127,21 @@ const handleClickTab = (val, index) => {
background
:
rgba
(
255
,
255
,
255
,
0
.8
);
display
:
flex
;
position
:
relative
;
.header-left
{
width
:
160px
;
height
:
160px
;
margin
:
20px
;
img
{
width
:
100%
;
height
:
100%
;
}
}
.header-right
{
margin-left
:
24px
;
.title
{
margin-top
:
26px
;
height
:
42px
;
...
...
@@ -126,6 +153,7 @@ const handleClickTab = (val, index) => {
letter-spacing
:
0px
;
text-align
:
left
;
}
.en-title
{
margin-top
:
8px
;
height
:
24px
;
...
...
@@ -137,6 +165,7 @@ const handleClickTab = (val, index) => {
letter-spacing
:
0px
;
text-align
:
left
;
}
.desc
{
margin-top
:
6px
;
height
:
24px
;
...
...
@@ -148,10 +177,12 @@ const handleClickTab = (val, index) => {
letter-spacing
:
0px
;
text-align
:
justify
;
}
.tag-box
{
margin-top
:
14px
;
display
:
flex
;
gap
:
8px
;
.tag
{
height
:
24px
;
padding
:
0px
8px
;
...
...
@@ -166,6 +197,7 @@ const handleClickTab = (val, index) => {
}
}
}
.header-btn
{
position
:
absolute
;
top
:
26px
;
...
...
@@ -179,14 +211,17 @@ const handleClickTab = (val, index) => {
justify-content
:
center
;
align-items
:
center
;
cursor
:
pointer
;
.icon
{
width
:
16px
;
height
:
16px
;
img
{
width
:
100%
;
height
:
100%
;
}
}
.text
{
height
:
22px
;
color
:
rgba
(
255
,
255
,
255
,
1
);
...
...
@@ -197,6 +232,7 @@ const handleClickTab = (val, index) => {
}
}
}
.tab-box
{
width
:
1600px
;
height
:
64px
;
...
...
@@ -209,6 +245,7 @@ const handleClickTab = (val, index) => {
display
:
flex
;
justify-content
:
space-between
;
align-items
:
center
;
.tab
{
width
:
397px
;
height
:
54px
;
...
...
@@ -223,10 +260,12 @@ const handleClickTab = (val, index) => {
font-weight
:
400
;
letter-spacing
:
0px
;
cursor
:
pointer
;
&
:hover
{
background
:
rgba
(
231
,
243
,
255
,
1
);
}
}
.tabActive
{
border
:
2px
solid
rgba
(
174
,
214
,
255
,
1
);
background
:
rgba
(
231
,
243
,
255
,
1
);
...
...
@@ -235,6 +274,7 @@ const handleClickTab = (val, index) => {
font-weight
:
700
;
}
}
.main
{
width
:
1600px
;
margin
:
16px
auto
;
...
...
src/views/innovationSubject/innovativeInstitutions/overView/index.vue
浏览文件 @
c5add0d2
差异被折叠。
点击展开。
src/views/innovationSubject/innovativeInstitutions/researchStrength/index.vue
浏览文件 @
c5add0d2
<!--科研实力-->
<
template
>
<div
class=
"detail-wrap"
>
<div
class=
"row"
>
...
...
@@ -15,7 +16,7 @@
</div>
</div>
<div
class=
"statisticsChart"
>
<Echarts
:option=
"barOption"
height=
"100%"
></Echarts>
<Echarts
:option=
"barOption
(patentList)
"
height=
"100%"
></Echarts>
</div>
<div
class=
"statisticsAI"
>
<div
class=
"AIbox"
>
...
...
@@ -39,7 +40,7 @@
</div>
</div>
<div
class=
"statisticsChart"
>
<Echarts
:option=
"lineChart"
height=
"100%"
></Echarts>
<Echarts
:option=
"lineChart
(paperList)
"
height=
"100%"
></Echarts>
</div>
<div
class=
"statisticsAI"
>
<div
class=
"AIbox"
>
...
...
@@ -89,7 +90,7 @@
</div>
</div>
<div
class=
"statisticsChart"
>
<Echarts
:option=
"lineChart1"
height=
"100%"
></Echarts>
<Echarts
:option=
"lineChart1
(fundGrowth)
"
height=
"100%"
></Echarts>
</div>
<div
class=
"statisticsAI"
>
<div
class=
"AIbox"
>
...
...
@@ -115,7 +116,7 @@
</div>
</div>
<div
class=
"statisticsChart"
>
<Echarts
:option=
"pieOption1"
height=
"100%"
></Echarts>
<Echarts
:option=
"pieOption1
(fundFromList)
"
height=
"100%"
></Echarts>
</div>
<div
class=
"statisticsAI"
>
<div
class=
"AIbox"
>
...
...
@@ -146,7 +147,7 @@
letter-spacing: 0px;
text-align: right;"
>
(亿美元)
</div>
<div
class=
"statisticsChart"
style=
"height: 298px; "
>
<Echarts
:option=
"horizontalBaroption
"
height=
"100%"
></Echarts>
<Echarts
:option=
"horizontalBaroption
(fundToList)"
height=
"100%"
></Echarts>
</div>
<div
class=
"statisticsAI"
>
<div
class=
"AIbox"
>
...
...
@@ -164,8 +165,103 @@
import
{
ref
,
computed
,
onMounted
}
from
"vue"
;
import
Echarts
from
"@/components/Chart/index.vue"
;
import
{
barOption
,
lineChart
,
raderOption1
,
lineChart1
,
pieOption1
,
horizontalBaroption
}
from
"../../utils/charts.js"
;
import
{
getPatentList
,
getPaperList
,
getFundGrowth
,
getFundFromList
,
getFundToList
}
from
"@/api/innovationSubject/overview.js"
;
import
{
useRouter
}
from
"vue-router"
;
const
router
=
useRouter
();
//专利数量统计
const
patentList
=
ref
([])
const
handleGetPatentList
=
async
()
=>
{
try
{
let
params
=
{
id
:
router
.
currentRoute
.
_value
.
params
.
id
}
const
res
=
await
getPatentList
(
params
);
console
.
log
(
"专利数量统计"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
patentList
.
value
=
res
.
data
}
}
catch
(
error
)
{
console
.
error
(
"获取专利数量统计error"
,
error
);
}
};
//论文数量统计
const
paperList
=
ref
([])
const
handleGetPaperList
=
async
()
=>
{
try
{
let
params
=
{
id
:
router
.
currentRoute
.
_value
.
params
.
id
}
const
res
=
await
getPaperList
(
params
);
console
.
log
(
"论文数量统计"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
paperList
.
value
=
res
.
data
}
}
catch
(
error
)
{
console
.
error
(
"获取论文数量统计error"
,
error
);
}
};
//经费增长情况
const
fundGrowth
=
ref
([])
const
handleGetFundGrowth
=
async
()
=>
{
try
{
let
params
=
{
id
:
router
.
currentRoute
.
_value
.
params
.
id
}
const
res
=
await
getFundGrowth
(
params
);
console
.
log
(
"经费增长情况"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
fundGrowth
.
value
=
res
.
data
}
}
catch
(
error
)
{
console
.
error
(
"获取经费增长情况error"
,
error
);
}
};
//经费来源
const
fundFromList
=
ref
([])
const
handleGetFundFromList
=
async
()
=>
{
try
{
let
params
=
{
id
:
router
.
currentRoute
.
_value
.
params
.
id
}
const
res
=
await
getFundFromList
(
params
);
console
.
log
(
"经费来源"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
fundFromList
.
value
=
res
.
data
}
}
catch
(
error
)
{
console
.
error
(
"获取经费来源error"
,
error
);
}
};
//学院经费分配排序
const
fundToList
=
ref
([])
const
handlegGetFundToList
=
async
()
=>
{
try
{
let
params
=
{
id
:
router
.
currentRoute
.
_value
.
params
.
id
}
const
res
=
await
getFundToList
(
params
);
console
.
log
(
"学院经费分配排序"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
fundToList
.
value
=
res
.
data
}
}
catch
(
error
)
{
console
.
error
(
"获取学院经费分配排序error"
,
error
);
}
};
onMounted
(
async
()
=>
{
handleGetPatentList
()
handleGetPaperList
()
handleGetFundGrowth
()
handleGetFundFromList
()
handlegGetFundToList
()
});
</
script
>
...
...
@@ -175,16 +271,19 @@ import { barOption, lineChart, raderOption1, lineChart1, pieOption1, horizontalB
flex-direction
:
column
;
gap
:
16px
;
padding-bottom
:
30px
;
.box
{
border
:
1px
solid
rgba
(
234
,
236
,
238
,
1
);
border-radius
:
10px
;
box-shadow
:
0px
0px
20px
0px
rgba
(
25
,
69
,
130
,
0
.1
);
background
:
rgba
(
255
,
255
,
255
,
1
);
}
.box-header
{
height
:
56px
;
display
:
flex
;
position
:
relative
;
.header-left
{
margin-top
:
18px
;
width
:
8px
;
...
...
@@ -192,6 +291,7 @@ import { barOption, lineChart, raderOption1, lineChart1, pieOption1, horizontalB
border-radius
:
0
4px
4px
0
;
background
:
rgba
(
10
,
87
,
166
,
1
);
}
.title
{
margin-left
:
14px
;
margin-top
:
14px
;
...
...
@@ -203,11 +303,13 @@ import { barOption, lineChart, raderOption1, lineChart1, pieOption1, horizontalB
letter-spacing
:
0px
;
text-align
:
left
;
}
.header-btn-box
{
position
:
absolute
;
top
:
14px
;
right
:
52px
;
display
:
flex
;
.btn
{
margin-left
:
8px
;
height
:
28px
;
...
...
@@ -224,12 +326,14 @@ import { barOption, lineChart, raderOption1, lineChart1, pieOption1, horizontalB
font-weight
:
400
;
cursor
:
pointer
;
}
.btnActive
{
border
:
1px
solid
rgba
(
10
,
87
,
166
,
1
);
background
:
rgba
(
246
,
250
,
255
,
1
);
color
:
rgba
(
10
,
87
,
166
,
1
);
}
}
.header-info
{
height
:
22px
;
position
:
absolute
;
...
...
@@ -237,16 +341,19 @@ import { barOption, lineChart, raderOption1, lineChart1, pieOption1, horizontalB
top
:
17px
;
display
:
flex
;
justify-content
:
flex-end
;
.icon
{
margin-top
:
3px
;
width
:
14px
;
height
:
14px
;
margin-right
:
8px
;
img
{
width
:
100%
;
height
:
100%
;
}
}
.text
{
height
:
22px
;
color
:
rgba
(
95
,
101
,
108
,
1
);
...
...
@@ -256,6 +363,7 @@ import { barOption, lineChart, raderOption1, lineChart1, pieOption1, horizontalB
line-height
:
22px
;
}
}
.header-right
{
position
:
absolute
;
top
:
14px
;
...
...
@@ -263,15 +371,18 @@ import { barOption, lineChart, raderOption1, lineChart1, pieOption1, horizontalB
display
:
flex
;
justify-content
:
flex-end
;
gap
:
8px
;
.icon
{
width
:
28px
;
height
:
28px
;
img
{
width
:
100%
;
height
:
100%
;
}
}
.checkboxRight
{
.checkboxRight
{
color
:
rgba
(
132
,
136
,
142
,
1
);
font-family
:
Microsoft
YaHei
;
font-size
:
16px
;
...
...
@@ -280,7 +391,8 @@ import { barOption, lineChart, raderOption1, lineChart1, pieOption1, horizontalB
letter-spacing
:
0px
;
text-align
:
justify
;
}
.btnRightActive
{
.btnRightActive
{
width
:
80px
;
height
:
28px
;
display
:
flex
;
...
...
@@ -299,7 +411,8 @@ import { barOption, lineChart, raderOption1, lineChart1, pieOption1, horizontalB
letter-spacing
:
0px
;
text-align
:
center
;
}
.btnRight
{
.btnRight
{
width
:
80px
;
height
:
28px
;
display
:
flex
;
...
...
@@ -320,20 +433,24 @@ import { barOption, lineChart, raderOption1, lineChart1, pieOption1, horizontalB
}
}
}
.row
{
.row
{
display
:
flex
;
width
:
1600px
;
height
:
500px
;
gap
:
16px
;
.statisticsItem
{
.statisticsItem
{
width
:
792px
;
height
:
500px
;
.statisticsChart
{
.statisticsChart
{
width
:
736px
;
height
:
321px
;
margin
:
20px
auto
;
}
.statisticsAI
{
.statisticsAI
{
margin
:
0
auto
;
width
:
760px
;
height
:
64px
;
...
...
@@ -348,7 +465,8 @@ import { barOption, lineChart, raderOption1, lineChart1, pieOption1, horizontalB
border
:
1px
solid
rgba
(
231
,
243
,
255
,
1
);
border-radius
:
4px
;
background
:
rgba
(
246
,
250
,
255
,
1
);
.AIbox
{
.AIbox
{
width
:
736px
;
height
:
52px
;
...
...
@@ -359,7 +477,8 @@ import { barOption, lineChart, raderOption1, lineChart1, pieOption1, horizontalB
align-items
:
center
;
gap
:
13px
;
padding
:
2px
0px
2px
0px
;
.AItext
{
.AItext
{
width
:
667px
;
height
:
48px
;
display
:
flex
;
...
...
@@ -381,9 +500,4 @@ import { barOption, lineChart, raderOption1, lineChart1, pieOption1, horizontalB
}
}
</
style
>
\ No newline at end of file
src/views/innovationSubject/utils/charts.js
浏览文件 @
c5add0d2
差异被折叠。
点击展开。
src/views/ruleRestriction/index.vue
浏览文件 @
c5add0d2
<
template
>
<div
class=
"coop-page"
>
<!-- 吸顶简易搜索框 -->
<div
class=
"search-header"
v-show=
"isShow"
>
<div
class=
"home-main-header-center"
>
<input
v-model=
"input"
class=
"search-input"
placeholder=
"搜索规则限制"
/>
<div
class=
"search-btn-small"
@
click=
"handleSearch"
>
<div
class=
"search-icon"
>
<img
src=
"./assets/icons/search-icon.png"
alt=
""
/>
</div>
<div
class=
"search-text"
>
搜索
</div>
</div>
</div>
<div
class=
"home-main-header-btn-box"
>
<div
class=
"btn"
@
click=
"handleToPosi('position1')"
>
<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-icon"
>
<img
src=
"@/assets/icons/arrow-right-icon.png"
alt=
""
/>
</div>
</div>
<div
class=
"btn"
@
click=
"handleToPosi('position3')"
>
<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('position4')"
>
<div
class=
"btn-text"
>
资源库
</div>
<div
class=
"btn-icon"
>
<img
src=
"@/assets/icons/arrow-right-icon.png"
alt=
""
/>
</div>
</div>
</div>
</div>
<!-- 面包屑 -->
<div
class=
"breadcrumb"
>
<div
class=
"breadcrumb"
v-show=
"!isShow"
>
<div
class=
"breadcrumb-box"
>
<div
class=
"breadcrumb-item"
>
国家科技安全
</div>
<div
class=
"breadcrumb-item"
>
>
</div>
...
...
@@ -11,9 +50,9 @@
</div>
</div>
<!-- 主页面 -->
<div
class=
"main-content"
>
<div
class=
"main-content"
ref=
"homeMainRef"
:class=
"
{ 'scroll-main': isShow }"
>
<!-- 搜索栏部分 -->
<div
class=
"search"
>
<div
class=
"search"
v-show=
"!isShow"
>
<div
class=
"search-main"
>
<input
v-model=
"input"
placeholder=
"搜索规则限制"
class=
"search-input"
/>
<div
class=
"search-btn"
>
...
...
@@ -40,25 +79,25 @@
</div>
</div>
-->
<div
class=
"search-bottom"
>
<div
class=
"btn"
@
click=
"
scrollToTop
('position1')"
>
<div
class=
"btn"
@
click=
"
handleToPosi
('position1')"
>
<div
class=
"btn-text"
>
最新动态
</div>
<div
class=
"btn-icon"
>
<img
src=
"@/assets/icons/arrow-right-icon.png"
alt=
""
/>
</div>
</div>
<div
class=
"btn"
@
click=
"
scrollToTop
('position2')"
>
<div
class=
"btn"
@
click=
"
handleToPosi
('position2')"
>
<div
class=
"btn-text"
>
咨询要闻
</div>
<div
class=
"btn-icon"
>
<img
src=
"@/assets/icons/arrow-right-icon.png"
alt=
""
/>
</div>
</div>
<div
class=
"btn"
@
click=
"
scrollToTop
('position3')"
>
<div
class=
"btn"
@
click=
"
handleToPosi
('position3')"
>
<div
class=
"btn-text"
>
数据总览
</div>
<div
class=
"btn-icon"
>
<img
src=
"@/assets/icons/arrow-right-icon.png"
alt=
""
/>
</div>
</div>
<div
class=
"btn"
@
click=
"
scrollToTop
('position4')"
>
<div
class=
"btn"
@
click=
"
handleToPosi
('position4')"
>
<div
class=
"btn-text"
>
资源库
</div>
<div
class=
"btn-icon"
>
<img
src=
"@/assets/icons/arrow-right-icon.png"
alt=
""
/>
...
...
@@ -99,7 +138,7 @@
</
template
>
<
script
setup
>
import
{
ref
}
from
"vue"
;
import
{
ref
,
nextTick
}
from
"vue"
;
import
{
useRouter
}
from
"vue-router"
;
import
comTitle
from
"./common/comTitle.vue"
;
import
newData
from
"./components/dataNew/index.vue"
;
...
...
@@ -107,14 +146,44 @@ import askPage from "./components/askPage/index.vue";
import
dataSub
from
"./components/dataSub/index.vue"
;
import
resLib
from
"./components/resLib/index.vue"
;
import
scrollToTop
from
"@/utils/scrollToTop"
;
import
{
useContainerScroll
}
from
"@/hooks/useScrollShow"
;
// 搜索框
const
input
=
ref
(
""
);
const
homeMainRef
=
ref
(
null
);
const
{
isShow
}
=
useContainerScroll
(
homeMainRef
);
const
router
=
useRouter
();
// 搜索功能
const
handleSearch
=
()
=>
{
console
.
log
(
"搜索内容:"
,
input
.
value
);
};
// 锚点跳转
const
handleToPosi
=
id
=>
{
const
element
=
document
.
getElementById
(
id
);
if
(
element
&&
homeMainRef
.
value
)
{
// 如果当前还未显示吸顶搜索栏,先强制切换状态以稳定布局
if
(
!
isShow
.
value
)
{
isShow
.
value
=
true
;
}
// 使用 nextTick 确保 DOM 状态更新(高度变化生效)后再计算
nextTick
(()
=>
{
const
containerRect
=
homeMainRef
.
value
.
getBoundingClientRect
();
const
elementRect
=
element
.
getBoundingClientRect
();
// 使用 getBoundingClientRect 计算元素相对于容器顶部的绝对距离,不受嵌套布局影响
const
top
=
elementRect
.
top
-
containerRect
.
top
+
homeMainRef
.
value
.
scrollTop
;
homeMainRef
.
value
.
scrollTo
({
top
:
top
,
behavior
:
"smooth"
});
});
}
};
// 返回首页
const
handleBackHome
=
()
=>
{
router
.
push
({
...
...
@@ -157,12 +226,18 @@ const handleBackHome = () => {
}
}
.main-content
{
position
:
relative
;
overflow
:
auto
;
width
:
100%
;
height
:
calc
(
100%
-
64px
);
background
:
url("./assets/images/background.png")
;
background-size
:
100%
100%
;
padding
:
44px
160px
30px
160px
;
&
.scroll-main
{
height
:
calc
(
100%
-
144px
);
}
.search
{
width
:
960px
;
height
:
168px
;
...
...
@@ -184,15 +259,19 @@ const handleBackHome = () => {
.search-input
{
border
:
none
;
outline
:
none
;
width
:
8
00
px
;
width
:
8
38
px
;
height
:
48px
;
background-color
:
transparent
;
font-size
:
1
6
px
;
font-size
:
1
4
px
;
padding
:
12px
16px
;
font-weight
:
400
;
font-family
:
"Microsoft YaHei"
;
line-height
:
24px
;
color
:
rgb
(
132
,
136
,
142
);
line-height
:
22px
;
color
:
rgba
(
59
,
65
,
75
,
1
);
&
:
:
placeholder
{
color
:
#a8abb2
;
}
}
.search-btn
{
cursor
:
pointer
;
...
...
@@ -204,53 +283,18 @@ const handleBackHome = () => {
margin-right
:
-3px
;
border-radius
:
8px
;
background-color
:
rgb
(
5
,
95
,
194
);
font-size
:
1
8
px
;
font-size
:
1
6
px
;
font-weight
:
400
;
font-family
:
"Microsoft YaHei"
;
line-height
:
2
4
px
;
line-height
:
2
2
px
;
color
:
#fff
;
img
{
width
:
22
px
;
height
:
22
px
;
width
:
18
px
;
height
:
18
px
;
margin-right
:
8px
;
}
}
}
.search-center
{
width
:
600px
;
height
:
57px
;
margin
:
36px
auto
;
display
:
flex
;
align-items
:
center
;
justify-content
:
space-between
;
.search-item
{
box-sizing
:
border-box
;
width
:
120px
;
height
:
57px
;
.search-item-num
{
width
:
120px
;
height
:
22px
;
font-size
:
36px
;
font-weight
:
700
;
font-family
:
"Microsoft YaHei"
;
line-height
:
22px
;
color
:
rgb
(
5
,
95
,
194
);
text-align
:
center
;
cursor
:
pointer
;
}
.search-item-name
{
width
:
120px
;
height
:
24px
;
margin-top
:
11px
;
font-size
:
16px
;
font-weight
:
400
;
font-family
:
"Microsoft YaHei"
;
line-height
:
24px
;
color
:
rgb
(
95
,
101
,
108
);
text-align
:
center
;
}
}
}
.search-bottom
{
width
:
688px
;
height
:
48px
;
...
...
@@ -339,5 +383,129 @@ const handleBackHome = () => {
}
}
}
.search-header
{
width
:
100%
;
height
:
144px
;
background
:
#fff
;
box-shadow
:
0px
0px
15px
0px
rgba
(
22
,
119
,
255
,
0
.1
);
overflow
:
hidden
;
.home-main-header-center
{
margin-top
:
20px
;
margin-left
:
200px
;
width
:
800px
;
height
:
48px
;
border-radius
:
10px
;
box-shadow
:
0px
0px
15px
0px
rgba
(
22
,
119
,
255
,
0
.1
);
background
:
rgba
(
255
,
255
,
255
,
1
);
box-sizing
:
border-box
;
padding
:
1px
;
position
:
relative
;
display
:
flex
;
align-items
:
center
;
border
:
1px
solid
transparent
;
&
:hover
{
border
:
1px
solid
var
(
--
color-main-active
);
}
.search-input
{
border
:
none
;
outline
:
none
;
width
:
800px
;
height
:
46px
;
background-color
:
transparent
;
font-size
:
14px
;
padding
:
12px
16px
;
font-weight
:
400
;
font-family
:
"Microsoft YaHei"
;
line-height
:
22px
;
color
:
rgba
(
59
,
65
,
75
,
1
);
&
:
:
placeholder
{
color
:
#a8abb2
;
}
}
.search-btn-small
{
position
:
absolute
;
right
:
-1px
;
top
:
0px
;
width
:
120px
;
height
:
46px
;
border-radius
:
10px
;
background
:
var
(
--
color-main-active
);
display
:
flex
;
justify-content
:
center
;
align-items
:
center
;
cursor
:
pointer
;
.search-icon
{
width
:
18px
;
height
:
18px
;
img
{
width
:
100%
;
height
:
100%
;
}
}
.search-text
{
margin-left
:
8px
;
height
:
22px
;
color
:
#fff
;
font-family
:
Microsoft
YaHei
;
font-size
:
16px
;
font-weight
:
400
;
line-height
:
22px
;
}
}
}
.home-main-header-btn-box
{
margin-top
:
20px
;
margin-left
:
200px
;
display
:
flex
;
gap
:
16px
;
.btn
{
display
:
flex
;
align-items
:
center
;
gap
:
9px
;
width
:
160px
;
height
:
48px
;
border
:
1px
solid
#aed6ff
;
box-sizing
:
border-box
;
border-radius
:
24px
;
background
:
#e7f3ff
;
cursor
:
pointer
;
position
:
relative
;
&
:hover
{
background
:
#cae3fc
;
}
.btn-text
{
width
:
80px
;
color
:
var
(
--
color-main-active
);
font-family
:
Microsoft
YaHei
;
font-size
:
20px
;
font-weight
:
400
;
line-height
:
48px
;
margin-left
:
36px
;
text-align
:
center
;
}
.btn-icon
{
position
:
absolute
;
top
:
16px
;
right
:
19px
;
width
:
6px
;
height
:
12px
;
img
{
width
:
100%
;
height
:
100%
;
}
}
}
}
}
}
</
style
>
src/views/thinkTank/ThinkTankDetail/PolicyTracking/index.vue
浏览文件 @
c5add0d2
...
...
@@ -98,11 +98,11 @@
<div
class=
"bottom-main"
>
<div
class=
"left"
>
<div
class=
"select-box"
>
<div
class=
"select-box-header"
>
<div
class=
"select-box-header"
style=
" display: flex;"
>
<div
class=
"icon"
></div>
<div
class=
"title"
>
{{
"科技领域"
}}
</div>
</div>
<div
class=
"select-main"
>
<div
class=
"select-main"
style=
"padding: 25px;"
>
<div
class=
"checkbox-group"
>
<!--
<el-checkbox
v-for=
"(item, index) in areaList"
:key=
"index"
v-model=
"selectedAreaList"
:label=
"item"
class=
"filter-checkbox"
>
...
...
@@ -918,6 +918,7 @@ onMounted(() => {
.select-box
{
margin-top
:
21px
;
.paixu-btn
{
display
:
flex
;
width
:
120px
;
...
...
@@ -970,6 +971,26 @@ onMounted(() => {
}
}
}
.icon
{
margin-top
:
4px
;
width
:
8px
;
height
:
16px
;
background
:
var
(
--
color-main-active
);
border-radius
:
0
4px
4px
0
;
}
.title
{
color
:
rgba
(
5
,
95
,
194
,
1
);
margin-left
:
17px
;
font-family
:
Microsoft
YaHei
;
font-style
:
Bold
;
font-size
:
20px
;
font-weight
:
700
;
line-height
:
26px
;
letter-spacing
:
0px
;
text-align
:
left
;
}
}
}
...
...
src/views/thinkTank/assets/images/box6-header-icon.png
查看替换文件 @
93476144
浏览文件 @
c5add0d2
2.2 KB
|
W:
|
H:
837 Bytes
|
W:
|
H:
2-up
Swipe
Onion skin
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论