Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
R
risk-monitor
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
蔡建
risk-monitor
Commits
8f531fe8
提交
8f531fe8
authored
3月 23, 2026
作者:
刘宇琪
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix:2.23BUG部分修复
上级
f8252418
显示空白字符变更
内嵌
并排
正在显示
10 个修改的文件
包含
36 行增加
和
571 行删除
+36
-571
billHome.js
src/api/bill/billHome.js
+0
-5
InnovationAnalysis.vue
...novationSubject/InnovationAnalysis/InnovationAnalysis.vue
+0
-27
ChartSummary.vue
...ubject/innovativeInstitutions/components/ChartSummary.vue
+34
-38
index.vue
src/views/innovationSubject/innovativeInstitutions/index.vue
+0
-34
Cooperation.vue
...vationSubject/innovativeInstitutions/tabs/Cooperation.vue
+1
-386
ResearchStrength.vue
...nSubject/innovativeInstitutions/tabs/ResearchStrength.vue
+1
-5
SchoolDetail.vue
...ationSubject/innovativeInstitutions/tabs/SchoolDetail.vue
+0
-60
header-icon1.png
src/views/technologyFigures/assets/images/header-icon1.png
+0
-0
header-icon2.png
src/views/technologyFigures/assets/images/header-icon2.png
+0
-0
vite.config.js
vite.config.js
+0
-16
没有找到文件。
src/api/bill/billHome.js
浏览文件 @
8f531fe8
...
...
@@ -179,11 +179,6 @@ export function getPostMemberList() {
}
<<<<<<<
HEAD
=======
>>>>>>>
master
/**
* 获取筛选项配置 - 行业列表
* GET /api/billImpactAnalysis/industry/hylyList
...
...
src/views/innovationSubject/InnovationAnalysis/InnovationAnalysis.vue
浏览文件 @
8f531fe8
...
...
@@ -151,24 +151,12 @@ const fieldAnalysis = ref('人工智能与信息技术占据最大份额,反
const
radarAnalysis
=
ref
(
'研究型大学在基础科学领域(生物医学、材料科学)占据主导地位;科技企业高度集中于人工智能和信息技术领域;国家实验室在能源技术和国家安全相关领域有显著优势;国防承包商的研究高度集中于航空航天和国家安全领域。'
)
// 切换视图
<<<<<<<
HEAD
function
switchView
(
view
:
string
)
{
console
.
log
(
'[v0] switchView 被调用, view:'
,
view
,
', currentView:'
,
currentView
.
value
)
if
(
currentView
.
value
!==
view
)
{
currentView
.
value
=
view
if
(
view
===
'ranking'
)
{
console
.
log
(
'[v0] 切换到排名视图,调用 handleGetOverallRanking'
)
handleGetOverallRanking
()
}
else
{
console
.
log
(
'[v0] 切换到研究布局视图,调用 handleGetResearchField 和 handleGetResearchFieldSubjectType'
)
=======
function
switchView
(
view
:
string
)
{
if
(
currentView
.
value
!==
view
)
{
currentView
.
value
=
view
if
(
view
===
'ranking'
)
{
handleGetOverallRanking
()
}
else
{
>>>>>>>
master
handleGetResearchField
()
handleGetResearchFieldSubjectType
()
}
...
...
@@ -183,12 +171,7 @@ const handleGetOverallRanking = async () => {
subjectTypeId
:
props
.
activeCate1
,
year
:
releaseTime
.
value
}
<<<<<<<
HEAD
const
res
=
await
getOverallRanking
(
params
)
console
.
log
(
'[v0] 综合排名'
,
res
)
=======
const
res
=
await
getOverallRanking
(
params
)
>>>>>>>
master
if
(
res
.
code
===
200
&&
res
.
data
)
{
innoItemList
.
value
=
res
.
data
}
...
...
@@ -205,12 +188,7 @@ const handleGetResearchField = async () => {
const
params
=
{
year
:
releaseTime
.
value
}
<<<<<<<
HEAD
const
res
=
await
getResearchField
(
params
)
console
.
log
(
'[v0] 研究领域布局情况'
,
res
)
=======
const
res
=
await
getResearchField
(
params
)
>>>>>>>
master
if
(
res
.
code
===
200
&&
res
.
data
)
{
const
names
=
res
.
data
.
map
(
item
=>
item
.
areaName
)
const
values
=
res
.
data
.
map
(
item
=>
item
.
amount
)
...
...
@@ -232,12 +210,7 @@ const handleGetResearchFieldSubjectType = async () => {
const
params
=
{
year
:
releaseTime
.
value
}
<<<<<<<
HEAD
const
res
=
await
getResearchFieldSubjectType
(
params
)
console
.
log
(
'[v0] 研究领域主体类型'
,
res
)
=======
const
res
=
await
getResearchFieldSubjectType
(
params
)
>>>>>>>
master
if
(
res
.
code
===
200
&&
res
.
data
)
{
raderOptionData
.
value
=
res
.
data
}
...
...
src/views/innovationSubject/innovativeInstitutions/components/ChartSummary.vue
浏览文件 @
8f531fe8
<
template
>
<div
class=
"chart-summary"
>
<svg
class=
"summary-icon"
width=
"20"
height=
"20"
viewBox=
"0 0 20 20"
fill=
"none"
xmlns=
"http://www.w3.org/2000/svg"
>
<circle
cx=
"10"
cy=
"10"
r=
"9"
stroke=
"#055FC2"
stroke-width=
"2"
fill=
"none"
/>
<path
d=
"M7 10L9 12L13 8"
stroke=
"#055FC2"
stroke-width=
"2"
stroke-linecap=
"round"
stroke-linejoin=
"round"
/>
</svg>
<p
class=
"summary-text"
>
{{
text
}}
</p>
<svg
class=
"arrow-icon"
width=
"24"
height=
"24"
viewBox=
"0 0 24 24"
fill=
"none"
xmlns=
"http://www.w3.org/2000/svg"
@
click=
"$emit('more')"
>
<path
d=
"M9 18L15 12L9 6"
stroke=
"#055FC2"
stroke-width=
"2"
stroke-linecap=
"round"
stroke-linejoin=
"round"
/>
</svg>
<div
class=
"chart-summary-wrapper"
>
<div
class=
"btn-box"
@
mouseenter=
"handleSwitchAiContentShow(true)"
>
<AiButton
/>
</div>
<div
class=
"content-box"
v-if=
"isShowAiContent"
@
mouseleave=
"handleSwitchAiContentShow(false)"
>
<AiPane
:aiContent=
"text"
/>
</div>
</div>
</
template
>
<
script
setup
>
import
{
ref
}
from
'vue'
import
AiButton
from
'@/components/base/Ai/AiButton/index.vue'
import
AiPane
from
'@/components/base/Ai/AiPane/index.vue'
defineProps
({
text
:
{
type
:
String
,
...
...
@@ -21,40 +22,35 @@ defineProps({
})
defineEmits
([
'more'
])
const
isShowAiContent
=
ref
(
false
)
const
handleSwitchAiContentShow
=
(
isShow
)
=>
{
isShowAiContent
.
value
=
isShow
}
</
script
>
<
style
lang=
"scss"
scoped
>
.chart-summary
{
display
:
flex
;
align-items
:
flex-start
;
gap
:
12px
;
padding
:
12px
16px
;
margin
:
0
16px
16px
;
background
:
#F6FAFF
;
border
:
1px
solid
#E7F3FF
;
border-radius
:
4px
;
.summary-icon
{
flex-shrink
:
0
;
margin-top
:
2px
;
}
.chart-summary-wrapper
{
position
:
absolute
;
right
:
0
;
bottom
:
0
;
left
:
0
;
pointer-events
:
none
;
.summary-text
{
flex
:
1
;
font-size
:
16px
;
line-height
:
24px
;
color
:
#055FC2
;
margin
:
0
;
.btn-box
{
position
:
absolute
;
right
:
0
;
bottom
:
0
;
pointer-events
:
auto
;
}
.arrow-icon
{
flex-shrink
:
0
;
cursor
:
pointer
;
transition
:
opacity
0
.2s
;
&
:hover
{
opacity
:
0
.7
;
}
.content-box
{
position
:
absolute
;
left
:
0
;
right
:
0
;
bottom
:
0
;
pointer-events
:
auto
;
}
}
</
style
>
src/views/innovationSubject/innovativeInstitutions/index.vue
浏览文件 @
8f531fe8
...
...
@@ -61,19 +61,9 @@
<!-- 科研实力Tab -->
<ResearchStrength
v-else-if=
"activeTab === '科研实力'"
/>
<<<<<<<
HEAD
<!-- 合作情况Tab -->
<Cooperation
v-else-if=
"activeTab === '合作情况'"
/>
<!-- 其他Tab内容占位 -->
<div
class=
"placeholder-content"
v-else
>
<div
class=
"placeholder-text"
>
{{
activeTab
}}
内容开发中...
</div>
</div>
=======
<Cooperation
v-else-if=
"activeTab === '合作情况'"
/>
<OtherInfo
v-else-if=
"activeTab === '其他情况'"
/>
>>>>>>> c71276c18548779e8e676aea3b390352568ff20b
</div>
</div>
</div>
...
...
@@ -85,10 +75,7 @@ import AreaTag from '@/components/base/AreaTag/index.vue'
import
SchoolDetail
from
'./tabs/SchoolDetail.vue'
import
ResearchStrength
from
'./tabs/ResearchStrength.vue'
import
Cooperation
from
'./tabs/Cooperation.vue'
<<<<<<<
HEAD
=======
import
OtherInfo
from
'./tabs/OtherInfo.vue'
>>>>>>>
c71276c18548779e8e676aea3b390352568ff20b
// 大学基本信息
const
universityInfo
=
ref
({
...
...
@@ -235,11 +222,7 @@ const latestDynamics = ref([
date
:
'9月15日'
,
title
:
'艾伦·M·加伯接任临时校长'
,
content
:
'原教务长艾伦·加伯(Alan M. Garber)出任哈佛第30任校长(临时),并完整复学术诚信与校园团结。'
,
<<<<<<<
HEAD
tags
:
[{
name
:
'集成��路'
,
type
:
'tag6'
}],
=======
tags
:
[{
name
:
'集成电路'
,
type
:
'tag6'
}],
>>>>>>>
c71276c18548779e8e676aea3b390352568ff20b
isHighlight
:
true
},
{
...
...
@@ -356,18 +339,12 @@ const handleVisitWebsite = () => {
}
.header-section
{
<<<<<<<
HEAD
padding
:
80px
160px
30px
;
.header-content
{
=======
padding
:
80px
;
display
:
flex
;
justify-content
:
center
;
.header-content
{
width
:
1600px
;
>>>>>>>
c71276c18548779e8e676aea3b390352568ff20b
display
:
flex
;
align-items
:
flex-start
;
gap
:
24px
;
...
...
@@ -452,22 +429,15 @@ const handleVisitWebsite = () => {
.nav-tabs
{
display
:
flex
;
<<<<<<<
HEAD
margin
:
0
160px
16px
;
=======
justify-content
:
center
;
margin
:
0
auto
16px
;
>>>>>>>
c71276c18548779e8e676aea3b390352568ff20b
background
:
rgba
(
255
,
255
,
255
,
0
.65
);
border-radius
:
10px
;
padding
:
5px
;
box-shadow
:
0px
0px
20px
rgba
(
25
,
69
,
130
,
0
.1
);
<<<<<<<
HEAD
=======
width
:
1600px
;
margin-left
:
auto
;
margin-right
:
auto
;
>>>>>>>
c71276c18548779e8e676aea3b390352568ff20b
.nav-tab
{
flex
:
1
;
...
...
@@ -498,16 +468,12 @@ const handleVisitWebsite = () => {
}
.main-content
{
<<<<<<<
HEAD
padding
:
0
160px
;
=======
display
:
flex
;
justify-content
:
center
;
>
*
{
width
:
1600px
;
}
>>>>>>>
c71276c18548779e8e676aea3b390352568ff20b
}
.placeholder-content
{
...
...
src/views/innovationSubject/innovativeInstitutions/tabs/Cooperation.vue
浏览文件 @
8f531fe8
<
template
>
<div
class=
"cooperation-content"
>
<<<<<<<
HEAD
<!-- 悬浮提示框 -->
=======
>>>>>>> c71276c18548779e8e676aea3b390352568ff20b
<Teleport
to=
"body"
>
<div
v-if=
"tooltipVisible"
class=
"chart-tooltip"
:style=
"
{ left: tooltipPosition.x + 10 + 'px', top: tooltipPosition.y - 30 + 'px' }">
...
...
@@ -12,13 +8,7 @@
</div>
</Teleport>
<<<<<<<
HEAD
<!-- 第一行:数量变化 + 类型变化 -->
<div
class=
"chart-row"
>
<!-- 与中国合作数量变化 - 面积图 -->
=======
<div
class=
"chart-row"
>
>>>>>>> c71276c18548779e8e676aea3b390352568ff20b
<AnalysisBox
title=
"与中国合作数量变化"
width=
"100%"
height=
"500px"
:show-all-btn=
"false"
class=
"chart-box"
>
<div
class=
"chart-container"
>
<div
class=
"area-chart"
>
...
...
@@ -39,10 +29,6 @@
</defs>
<path
:d=
"quantityAreaPath"
fill=
"url(#coopAreaGradient1)"
/>
<path
:d=
"quantityLinePath"
fill=
"none"
stroke=
"#FF954D"
stroke-width=
"2"
/>
<<<<<<<
HEAD
<!-- 8px圆圈节点 -->
=======
>>>>>>> c71276c18548779e8e676aea3b390352568ff20b
<g
class=
"data-points"
>
<circle
v-for=
"(point, idx) in quantityPoints"
:key=
"idx"
:cx=
"point.x"
:cy=
"point.y"
r=
"4"
...
...
@@ -60,67 +46,23 @@
</div>
<ChartSummary
text=
"近十年哈佛大学与中国合作项目数量呈'前期稳步增多、2020年后敏感领域收缩、非敏感领域小幅复苏'的趋势。"
/>
</AnalysisBox>
<<<<<<<
HEAD
<!-- 与中国合作类型变化 - 半环形饼图 -->
=======
>>>>>>> c71276c18548779e8e676aea3b390352568ff20b
<AnalysisBox
title=
"与中国合作类型变化"
width=
"100%"
height=
"500px"
:show-all-btn=
"false"
class=
"chart-box"
>
<template
#
header-btn
>
<el-select
v-model=
"selectedYear"
size=
"small"
style=
"width: 80px;"
>
<el-option
v-for=
"year in yearOptions"
:key=
"year"
:label=
"year"
:value=
"year"
/>
</el-select>
</
template
>
<
<<<<<<
HEAD
<
div
class=
"chart-container"
>
<div
class=
"semi-donut-chart"
>
<div
class=
"donut-wrapper"
>
<svg
viewBox=
"0 0 200 140"
class=
"donut-svg"
>
<!-- 半环形:蓝色57% + 橙色25% + 浅蓝绿18% -->
<path
:d=
"getDonutPath(0, 57)"
fill=
"rgba(105, 177, 255, 1)"
/>
<path
:d=
"getDonutPath(57, 82)"
fill=
"rgba(255, 192, 105, 1)"
/>
<path
:d=
"getDonutPath(82, 100)"
fill=
"rgba(135, 232, 222, 1)"
/>
</svg>
</div>
<div
class=
"donut-legend"
>
<div
class=
"legend-item"
>
<span
class=
"legend-dot"
style=
"background: rgba(105, 177, 255, 1);"
></span>
<span
class=
"legend-label"
>
项目合作
</span>
<span
class=
"legend-value"
>
57%
</span>
</div>
<div
class=
"legend-item"
>
<span
class=
"legend-dot"
style=
"background: rgba(255, 192, 105, 1);"
></span>
<span
class=
"legend-label"
>
论文合作
</span>
<span
class=
"legend-value"
>
25%
</span>
</div>
<div
class=
"legend-item"
>
<span
class=
"legend-dot"
style=
"background: rgba(135, 232, 222, 1);"
></span>
<span
class=
"legend-label"
>
专利合作
</span>
<span
class=
"legend-value"
>
18%
</span>
</div>
</div>
</div>
</div>
=======
<SemiDonutChart
:data=
"{
names: ['项目合作', '论文合作', '专利合作'],
values: [57, 25, 18]
}"
/>
>>>>>>> c71276c18548779e8e676aea3b390352568ff20b
<ChartSummary
text=
"哈佛大学与中国的合作当中,大部分是以项目合作为主"
/>
</AnalysisBox>
</div>
<
<<<<<<
HEAD
<!
--
第二行:领域变化
+
经费变化
--
>
<div
class=
"chart-row"
>
<!-- 与中国合作领域变化 - 堆叠柱状图 -->
<AnalysisBox
title=
"与中国合作领域变化"
width=
"100%"
height=
"500px"
:show-all-btn=
"false"
class=
"chart-box"
>
=======
<div
class=
"chart-row"
>
<AnalysisBox
title=
"与中国合作领域变化"
width=
"100%"
height=
"500px"
:show-all-btn=
"false"
class=
"chart-box"
>
>>>>>>> c71276c18548779e8e676aea3b390352568ff20b
<div
class=
"chart-container"
>
<div
class=
"stacked-bar-chart"
>
<!-- 图例 -->
...
...
@@ -155,12 +97,7 @@
<ChartSummary
text=
"近十年哈佛大学与中国合作项目中,各领域分布均匀,其中以人工智能与能源领域为主。"
/>
</AnalysisBox>
<
<<<<<<
HEAD
<!
--
与中国合作经费变化
-
面积图
--
>
<AnalysisBox
title=
"与中国合作经费变化"
width=
"100%"
height=
"500px"
:show-all-btn=
"false"
class=
"chart-box"
>
=======
<AnalysisBox
title=
"与中国合作经费变化"
width=
"100%"
height=
"500px"
:show-all-btn=
"false"
class=
"chart-box"
>
>>>>>>> c71276c18548779e8e676aea3b390352568ff20b
<div
class=
"chart-container"
>
<div
class=
"area-chart"
>
<div
class=
"y-axis"
>
...
...
@@ -200,50 +137,8 @@
</AnalysisBox>
</div>
<
<<<<<<
HEAD
<!
--
第三行:与中国合作事例
--
>
<AnalysisBox
title=
"与中国合作事例"
width=
"100%"
height=
"auto"
:show-all-btn=
"false"
class=
"cases-box"
>
<div
class=
"cases-timeline"
>
<!-- 日期行 -->
<div
class=
"timeline-dates"
>
<span
v-for=
"(item, index) in visibleCases"
:key=
"index"
class=
"date-label"
>
{{ item.date }}
</span>
</div>
<!-- 时间轴:彩虹渐变线 + 绿色圆形节点 -->
<div
class=
"timeline-track"
>
<div
class=
"timeline-line"
></div>
<div
class=
"timeline-nodes"
>
<div
v-for=
"(item, index) in visibleCases"
:key=
"index"
class=
"node-wrapper"
>
<div
class=
"node-dot"
></div>
</div>
</div>
</div>
<!-- 卡片行 -->
<div
class=
"cases-carousel"
>
<button
class=
"carousel-btn prev"
@
click=
"prevCases"
>
<svg
width=
"24"
height=
"24"
viewBox=
"0 0 24 24"
fill=
"none"
>
<path
d=
"M15 18L9 12L15 6"
stroke=
"#055FC2"
stroke-width=
"2"
stroke-linecap=
"round"
stroke-linejoin=
"round"
/>
</svg>
</button>
<div
class=
"cases-cards"
>
<div
v-for=
"(item, index) in visibleCases"
:key=
"index"
class=
"case-card"
>
<div
class=
"case-tag"
:class=
"item.tagType"
>
{{ item.tag }}
</div>
<div
class=
"case-partner"
>
合作主体:{{ item.partner }}
</div>
<div
class=
"case-title"
>
{{ item.title }}
</div>
</div>
</div>
<button
class=
"carousel-btn next"
@
click=
"nextCases"
>
<svg
width=
"24"
height=
"24"
viewBox=
"0 0 24 24"
fill=
"none"
>
<path
d=
"M9 18L15 12L9 6"
stroke=
"#055FC2"
stroke-width=
"2"
stroke-linecap=
"round"
stroke-linejoin=
"round"
/>
</svg>
</button>
</div>
</div>
=======
<AnalysisBox
title=
"与中国合作事例"
width=
"100%"
height=
"auto"
:show-all-btn=
"false"
class=
"cases-box"
>
<CooperationCases
/>
>>>>>>> c71276c18548779e8e676aea3b390352568ff20b
</AnalysisBox>
</div>
</template>
...
...
@@ -252,11 +147,8 @@
import
{
ref
,
computed
}
from
'vue'
import
AnalysisBox
from
'@/components/base/boxBackground/analysisBox.vue'
import
ChartSummary
from
'../components/ChartSummary.vue'
<<<<<<<
HEAD
=======
import
SemiDonutChart
from
'../components/SemiDonutChart.vue'
import
CooperationCases
from
'../components/CooperationCases.vue'
>>>>>>>
c71276c18548779e8e676aea3b390352568ff20b
// Tooltip 状态
const
tooltipVisible
=
ref
(
false
)
...
...
@@ -348,36 +240,6 @@ const fieldData = [
]}
]
<<<<<<<
HEAD
// 合作事例数据
const
casesData
=
ref
([
{
date
:
'2025年3月12日'
,
tag
:
'项目合作'
,
tagType
:
'project'
,
partner
:
'清华大学'
,
title
:
'"气候变化、碳中和与能源智联"(CNEST)研讨会'
},
{
date
:
'2025年5月7日'
,
tag
:
'专利合作'
,
tagType
:
'patent'
,
partner
:
'北京航空航天大学'
,
title
:
'北航-哈佛 Wood 实验室联合研制鲤鱼仿生吸盘机器人'
},
{
date
:
'2025年6月23日'
,
tag
:
'论��合作'
,
tagType
:
'paper'
,
partner
:
'山西省古建筑与彩塑壁画保护研究院'
,
title
:
'山西古建院-哈佛中国艺术实验室合作'
},
{
date
:
'2025年10月19日'
,
tag
:
'项目合作'
,
tagType
:
'project'
,
partner
:
'复旦大学、四川大学'
,
title
:
'哈佛中国健康伙伴计划多机构合作'
}
])
const
caseStartIndex
=
ref
(
0
)
const
activeCaseIndex
=
ref
(
0
)
const
visibleCases
=
computed
(()
=>
{
return
casesData
.
value
.
slice
(
caseStartIndex
.
value
,
caseStartIndex
.
value
+
4
)
})
const
prevCases
=
()
=>
{
if
(
caseStartIndex
.
value
>
0
)
{
caseStartIndex
.
value
--
}
}
const
nextCases
=
()
=>
{
if
(
caseStartIndex
.
value
<
casesData
.
value
.
length
-
4
)
{
caseStartIndex
.
value
++
}
}
=======
>>>>>>>
c71276c18548779e8e676aea3b390352568ff20b
// 面积图路径计算
const
createAreaPath
=
(
data
,
maxValue
=
400
)
=>
{
const
width
=
700
...
...
@@ -422,32 +284,6 @@ const getDataPoints = (data, maxValue = 400) => {
const
quantityPoints
=
computed
(()
=>
getDataPoints
(
quantityData
))
const
fundingPoints
=
computed
(()
=>
getDataPoints
(
fundingData
))
<<<<<<<
HEAD
// 半环形饼图路径计算
const
getDonutPath
=
(
startPercent
,
endPercent
)
=>
{
const
cx
=
100
const
cy
=
100
const
outerR
=
80
const
innerR
=
50
const
startAngle
=
Math
.
PI
*
(
1
+
startPercent
/
100
)
const
endAngle
=
Math
.
PI
*
(
1
+
endPercent
/
100
)
const
x1
=
cx
+
outerR
*
Math
.
cos
(
startAngle
)
const
y1
=
cy
+
outerR
*
Math
.
sin
(
startAngle
)
const
x2
=
cx
+
outerR
*
Math
.
cos
(
endAngle
)
const
y2
=
cy
+
outerR
*
Math
.
sin
(
endAngle
)
const
x3
=
cx
+
innerR
*
Math
.
cos
(
endAngle
)
const
y3
=
cy
+
innerR
*
Math
.
sin
(
endAngle
)
const
x4
=
cx
+
innerR
*
Math
.
cos
(
startAngle
)
const
y4
=
cy
+
innerR
*
Math
.
sin
(
startAngle
)
const
largeArc
=
(
endPercent
-
startPercent
)
>
50
?
1
:
0
return
`M
${
x1
}
,
${
y1
}
A
${
outerR
}
,
${
outerR
}
0
${
largeArc
}
1
${
x2
}
,
${
y2
}
L
${
x3
}
,
${
y3
}
A
${
innerR
}
,
${
innerR
}
0
${
largeArc
}
0
${
x4
}
,
${
y4
}
Z`
}
=======
>>>>>>>
c71276c18548779e8e676aea3b390352568ff20b
</
script
>
<
style
lang=
"scss"
scoped
>
...
...
@@ -464,6 +300,7 @@ const getDonutPath = (startPercent, endPercent) => {
.chart-box
{
flex
:
1
;
min-width
:
0
;
position
:
relative
;
}
}
...
...
@@ -473,12 +310,7 @@ const getDonutPath = (startPercent, endPercent) => {
display
:
flex
;
flex-direction
:
column
;
}
<<<<<<<
HEAD
//
面积图样式
=======
>>>>>>>
c71276c18548779e8e676aea3b390352568ff20b
.area-chart
{
flex
:
1
;
display
:
flex
;
...
...
@@ -522,64 +354,7 @@ const getDonutPath = (startPercent, endPercent) => {
}
}
}
<<<<<<<
HEAD
//
半环形饼图样式
.semi-donut-chart
{
flex
:
1
;
display
:
flex
;
align-items
:
flex-start
;
justify-content
:
center
;
gap
:
60px
;
padding-top
:
40px
;
.donut-wrapper
{
width
:
240px
;
height
:
160px
;
.donut-svg
{
width
:
100%
;
height
:
100%
;
}
}
.donut-legend
{
display
:
flex
;
flex-direction
:
column
;
gap
:
20px
;
padding-top
:
20px
;
.legend-item
{
display
:
flex
;
align-items
:
center
;
gap
:
10px
;
.legend-dot
{
width
:
10px
;
height
:
10px
;
border-radius
:
50%
;
}
.legend-label
{
font-size
:
16px
;
color
:
#3B414B
;
width
:
60px
;
}
.legend-value
{
font-size
:
16px
;
font-weight
:
700
;
color
:
#3B414B
;
margin-left
:
16px
;
}
}
}
}
// 堆叠柱状图样式
=======
>>>>>>>
c71276c18548779e8e676aea3b390352568ff20b
.stacked-bar-chart
{
flex
:
1
;
display
:
flex
;
...
...
@@ -635,17 +410,10 @@ const getDonutPath = (startPercent, endPercent) => {
.bar-stack
{
display
:
flex
;
<<<<<<<
HEAD
flex-direction
:
column-reverse
;
// 从底部开始堆叠
align-items
:
center
;
width
:
20px
;
height
:
240px
;
// 必须设置高度,子元素百分比才能生效
=======
flex-direction
:
column-reverse
;
align-items
:
center
;
width
:
20px
;
height
:
240px
;
>>>>>>>
c71276c18548779e8e676aea3b390352568ff20b
position
:
relative
;
.bar-segment
{
...
...
@@ -669,163 +437,10 @@ const getDonutPath = (startPercent, endPercent) => {
}
}
}
<<<<<<<
HEAD
//
合作事例样式
=======
>>>>>>>
c71276c18548779e8e676aea3b390352568ff20b
.cases-box
{
:deep
(
.wrapper-main
)
{
overflow
:
visible
;
}
}
<<<<<<<
HEAD
.cases-timeline
{
padding
:
24px
;
// 日期行
.timeline-dates
{
display
:
flex
;
justify-content
:
space-around
;
padding
:
0
56px
;
margin-bottom
:
8px
;
.date-label
{
font-size
:
14px
;
font-weight
:
700
;
color
:
#055FC2
;
text-align
:
center
;
flex
:
1
;
}
}
// 时间轴行
.timeline-track
{
position
:
relative
;
height
:
24px
;
margin-bottom
:
16px
;
.timeline-line
{
position
:
absolute
;
top
:
50%
;
left
:
56px
;
right
:
56px
;
height
:
0
;
// 单色虚线
border-top
:
4px
dashed
#055FC2
;
transform
:
translateY
(
-50%
);
}
.timeline-nodes
{
display
:
flex
;
justify-content
:
space-around
;
padding
:
0
56px
;
position
:
relative
;
z-index
:
1
;
height
:
100%
;
align-items
:
center
;
.node-wrapper
{
flex
:
1
;
display
:
flex
;
justify-content
:
center
;
.node-dot
{
width
:
16px
;
height
:
16px
;
border-radius
:
50%
;
background
:
#22C55E
;
border
:
3px
solid
#FFFFFF
;
box-shadow
:
0
0
0
2px
#22C55E
;
}
}
}
}
// 卡片行
.cases-carousel
{
display
:
flex
;
align-items
:
stretch
;
gap
:
8px
;
.carousel-btn
{
width
:
32px
;
height
:
auto
;
min-height
:
120px
;
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
background
:
transparent
;
border
:
none
;
cursor
:
pointer
;
color
:
#055FC2
;
&
:hover
{
background
:
#F6FAFF
;
border-radius
:
4px
;
}
}
.cases-cards
{
flex
:
1
;
display
:
flex
;
gap
:
16px
;
.case-card
{
width
:
273px
;
min-height
:
210px
;
flex-shrink
:
0
;
padding
:
16px
;
background
:
#FFFFFF
;
border
:
1px
solid
#E5E7EB
;
border-radius
:
4px
;
display
:
flex
;
flex-direction
:
column
;
gap
:
8px
;
.case-tag
{
display
:
inline-block
;
padding
:
2px
8px
;
border-radius
:
4px
;
font-size
:
12px
;
width
:
fit-content
;
&
.project
{
background
:
#FFF1F0
;
color
:
#F5222D
;
border
:
1px
solid
#FFA39E
;
}
&
.patent
{
background
:
#FFFBE6
;
color
:
#FAAD14
;
border
:
1px
solid
#FFE58F
;
}
&
.paper
{
background
:
#F0F5FF
;
color
:
#2F54EB
;
border
:
1px
solid
#ADC6FF
;
}
}
.case-partner
{
font-size
:
14px
;
color
:
#5F656C
;
}
.case-title
{
font-size
:
16px
;
font-weight
:
700
;
color
:
#3B414B
;
line-height
:
24px
;
}
}
}
}
}
=======
>>>>>>>
c71276c18548779e8e676aea3b390352568ff20b
</
style
>
src/views/innovationSubject/innovativeInstitutions/tabs/ResearchStrength.vue
浏览文件 @
8f531fe8
...
...
@@ -288,11 +288,7 @@ const paperPoints = computed(() => getDataPoints(paperData))
const
fundingPoints
=
computed
(()
=>
getDataPoints
(
fundingData
))
// 雷达图数据和计算
<<<<<<<
HEAD
const
radarValues
=
[
0.7
,
0.9
,
0.85
,
0.6
,
0.75
,
0.65
]
// 各领域相对��
=======
const
radarValues
=
[
0.7
,
0.9
,
0.85
,
0.6
,
0.75
,
0.65
]
// 各领域
>>>>>>>
c71276c18548779e8e676aea3b390352568ff20b
const
getHexagonPoints
=
(
cx
,
cy
,
r
)
=>
{
const
points
=
[]
...
...
@@ -396,6 +392,7 @@ const getPatentBarGradient = () => {
.chart-box
{
flex
:
1
;
min-width
:
0
;
position
:
relative
;
}
}
...
...
@@ -648,6 +645,5 @@ const getPatentBarGradient = () => {
}
}
// 图表底部摘要
</
style
>
src/views/innovationSubject/innovativeInstitutions/tabs/SchoolDetail.vue
浏览文件 @
8f531fe8
...
...
@@ -203,12 +203,7 @@ const infoList = computed(() => [
<
style
lang
=
"scss"
scoped
>
.
school
-
detail
-
content
{
display
:
flex
;
<<<<<<<
HEAD
gap
:
16
px
;
// align-items 默认 stretch,使左右等高
=======
gap
:
16
px
;
>>>>>>>
c71276c18548779e8e676aea3b390352568ff20b
align
-
items
:
stretch
;
.
left
-
section
{
...
...
@@ -216,12 +211,7 @@ const infoList = computed(() => [
min
-
width
:
0
;
display
:
flex
;
flex
-
direction
:
column
;
<<<<<<<
HEAD
// 让内部 AnalysisBox 撑满整列高度
=======
>>>>>>>
c71276c18548779e8e676aea3b390352568ff20b
:
deep
(.
dynamics
-
box
),
:
deep
(.
analysis
-
box
-
wrapper
)
{
flex
:
1
;
...
...
@@ -234,12 +224,7 @@ const infoList = computed(() => [
flex
-
direction
:
column
;
}
}
<<<<<<<
HEAD
// dynamics-list 填满剩余空间,分页固定在底部
=======
>>>>>>>
c71276c18548779e8e676aea3b390352568ff20b
:
deep
(.
dynamics
-
box
)
{
height
:
100
%
;
}
...
...
@@ -252,13 +237,7 @@ const infoList = computed(() => [
flex
-
direction
:
column
;
gap
:
16
px
;
}
<<<<<<<
HEAD
}
// 节点尺寸变量
=======
}
>>>>>>>
c71276c18548779e8e676aea3b390352568ff20b
$node
-
size
:
24
px
;
$axis
-
width
:
2
px
;
...
...
@@ -271,22 +250,12 @@ $axis-width: 2px;
display
:
flex
;
align
-
items
:
stretch
;
gap
:
0
;
<<<<<<<
HEAD
// 左侧日期列
=======
>>>>>>>
c71276c18548779e8e676aea3b390352568ff20b
.
time
-
col
{
width
:
70
px
;
flex
-
shrink
:
0
;
text
-
align
:
right
;
<<<<<<<
HEAD
padding
-
right
:
16
px
;
// 日期与节点圆顶部对齐
=======
padding
-
right
:
16
px
;
>>>>>>>
c71276c18548779e8e676aea3b390352568ff20b
padding
-
top
:
calc
(
#
{
$node
-
size
}
/
2
-
12
px
);
.
year
,
.
date
{
...
...
@@ -297,12 +266,7 @@ $axis-width: 2px;
line
-
height
:
24
px
;
}
}
<<<<<<<
HEAD
// 中间轴线列:上段线 + 圆形节点 + 下段线,完全垂直居中对齐
=======
>>>>>>>
c71276c18548779e8e676aea3b390352568ff20b
.
axis
-
col
{
width
:
$node
-
size
;
flex
-
shrink
:
0
;
...
...
@@ -349,12 +313,7 @@ $axis-width: 2px;
}
}
}
<<<<<<<
HEAD
// 右侧内容列
=======
>>>>>>>
c71276c18548779e8e676aea3b390352568ff20b
.
content
-
col
{
flex
:
1
;
min
-
width
:
0
;
...
...
@@ -512,24 +471,6 @@ $axis-width: 2px;
color
:
rgb
(
59
,
65
,
75
);
margin
-
bottom
:
12
px
;
}
<<<<<<<
HEAD
// 最多展示 2 行 (每行2个),超出可滚动
.
people
-
grid
{
display
:
grid
;
grid
-
template
-
columns
:
repeat
(
2
,
1
fr
);
gap
:
16
px
;
// 每个卡片高度约 64px,2行 = 128px + 1个gap16 = 144px
max
-
height
:
144
px
;
overflow
-
y
:
auto
;
// 低于 2 行时不留白,自适应收缩
&
.
single
-
row
{
max
-
height
:
64
px
;
}
// 滚动条样式
=======
.
people
-
grid
{
display
:
grid
;
...
...
@@ -542,7 +483,6 @@ $axis-width: 2px;
max
-
height
:
64
px
;
}
>>>>>>>
c71276c18548779e8e676aea3b390352568ff20b
&
::
-
webkit
-
scrollbar
{
width
:
4
px
;
}
...
...
src/views/technologyFigures/assets/images/header-icon1.png
0 → 100644
浏览文件 @
8f531fe8
1.2 KB
src/views/technologyFigures/assets/images/header-icon2.png
0 → 100644
浏览文件 @
8f531fe8
1.5 KB
vite.config.js
浏览文件 @
8f531fe8
...
...
@@ -52,21 +52,6 @@ export default defineConfig({
changeOrigin
:
true
,
rewrite
:
(
path
)
=>
path
.
replace
(
/^
\/
reportData/
,
''
)
},
<<<<<<<
HEAD
'/api'
:
{
target
:
'http://8.140.26.4:9085/'
,
// target: 'http://192.168.0.4:28080/',
// target: 'http://172.20.10.3:28080/',
changeOrigin
:
true
,
rewrite
:
(
path
)
=>
path
.
replace
(
/^
\/
api/
,
''
)
// '/api': {
// target: 'http://10.134.117.162:28080/',
// changeOrigin: true,
// rewrite: (path) => path.replace(/^\/api/, '')
// '/api': {
=======
'/api'
:
{
target
:
'http://8.140.26.4:9085/'
,
...
...
@@ -74,7 +59,6 @@ export default defineConfig({
rewrite
:
(
path
)
=>
path
.
replace
(
/^
\/
api/
,
''
)
// '/api': {
>>>>>>>
c71276c18548779e8e676aea3b390352568ff20b
// target: 'http://10.119.133.162:28080/',
// changeOrigin: true,
// rewrite: (path) => path.replace(/^\/api/, '')
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论