Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
R
risk-monitor
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
蔡建
risk-monitor
Commits
9250fcda
提交
9250fcda
authored
4月 01, 2026
作者:
朱政
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat:调查项目及国会听证会的详情页面及列表的样式与功能的开发
上级
00f4a246
流水线
#276
已通过 于阶段
in 1 分 48 秒
变更
13
流水线
1
隐藏空白字符变更
内嵌
并排
正在显示
13 个修改的文件
包含
343 行增加
和
348 行删除
+343
-348
overview.js
src/api/thinkTank/overview.js
+49
-2
thinktank.js
src/router/modules/thinktank.js
+15
-1
index.vue
src/views/thinkTank/CongressHearingView/index.vue
+56
-29
index.vue
src/views/thinkTank/SurveyProjectView/index.vue
+12
-5
piechart.js
...hinkTank/ThinkTankDetail/PolicyTracking/utils/piechart.js
+1
-1
index.vue
...k/ThinkTankDetail/thinkDynamics/CongressHearing/index.vue
+18
-57
index.vue
...nkTank/ThinkTankDetail/thinkDynamics/SurveyForm/index.vue
+1
-1
index.vue
src/views/thinkTank/ThinkTankDetail/thinkDynamics/index.vue
+104
-181
HomeMainFooterSurvey.vue
src/views/thinkTank/components/HomeMainFooterSurvey.vue
+3
-1
ThinkTankCongressHearingOverview.vue
...thinkTank/components/ThinkTankCongressHearingOverview.vue
+20
-63
index.vue
src/views/thinkTank/index.vue
+36
-3
index.vue
src/views/thinkTank/reportOriginal/index.vue
+27
-3
piechart.js
src/views/thinkTank/utils/piechart.js
+1
-1
没有找到文件。
src/api/thinkTank/overview.js
浏览文件 @
9250fcda
...
@@ -111,6 +111,13 @@ export function getThinkTankProjects(params) {
...
@@ -111,6 +111,13 @@ export function getThinkTankProjects(params) {
params
params
})
})
}
}
//智库概览页国会听证会
export
function
getThinkTankTestimonies
()
{
return
request
({
method
:
'GET'
,
url
:
`/api/think-tank/testimonies`
,
})
}
//智库调查项目详情主页
//智库调查项目详情主页
export
function
getThinkTankProjectsInfo
(
params
)
{
export
function
getThinkTankProjectsInfo
(
params
)
{
return
request
({
return
request
({
...
@@ -119,7 +126,14 @@ export function getThinkTankProjectsInfo(params) {
...
@@ -119,7 +126,14 @@ export function getThinkTankProjectsInfo(params) {
})
})
}
}
//智库国会听证会详情主页
export
function
getThinkTankHearingInfo
(
params
)
{
return
request
({
method
:
'GET'
,
url
:
`/api/think-tank/testimonies/
${
params
.
id
}
`
,
})
}
// 智库详情-调查项目(按智库 id)
// 智库详情-调查项目(按智库 id)
export
function
getThinkTankProjectsByThinkTankId
(
params
)
{
export
function
getThinkTankProjectsByThinkTankId
(
params
)
{
return
request
({
return
request
({
...
@@ -131,6 +145,18 @@ export function getThinkTankProjectsByThinkTankId(params) {
...
@@ -131,6 +145,18 @@ export function getThinkTankProjectsByThinkTankId(params) {
}
}
})
})
}
}
// 智库动态-国会听证会(按智库 id)
export
function
getThinkTankTestimoniesByThinkTankId
(
params
)
{
return
request
({
method
:
'GET'
,
url
:
`/api/think-tank/
${
params
.
thinkTankId
}
/testimonies`
,
params
:
{
pageNum
:
params
.
pageNum
,
pageSize
:
params
.
pageSize
,
}
})
}
//智库调查项目详情作者
//智库调查项目详情作者
export
function
getThinkTankProjectsAuthors
(
params
)
{
export
function
getThinkTankProjectsAuthors
(
params
)
{
return
request
({
return
request
({
...
@@ -469,7 +495,21 @@ export function getThinkTankReportViewpoint(params) {
...
@@ -469,7 +495,21 @@ export function getThinkTankReportViewpoint(params) {
}
}
})
})
}
}
// 获取报告核心论点(支持关键字搜索)
export
function
getThinkTankHearingViewpoint
(
params
)
{
const
{
testimonyId
,
pageSize
,
keyword
=
''
,
pageNum
}
=
params
return
request
({
method
:
'GET'
,
url
:
`/api/think-tank/testimonies/qa`
,
params
:
{
pageSize
,
keyword
,
pageNum
,
testimonyId
}
})
}
//获取涉及科技领域
//获取涉及科技领域
export
function
getThinkTankReportIndustry
(
params
)
{
export
function
getThinkTankReportIndustry
(
params
)
{
return
request
({
return
request
({
...
@@ -485,13 +525,20 @@ export function getThinkTankReportIndustryCloud(params) {
...
@@ -485,13 +525,20 @@ export function getThinkTankReportIndustryCloud(params) {
url
:
`/api/thinkTankReport/keyword/
${
params
.
id
}
`
,
url
:
`/api/thinkTankReport/keyword/
${
params
.
id
}
`
,
})
})
}
}
//获取
科技领域
词云
//获取
调查项目
词云
export
function
getThinkTankProjectCloud
(
params
)
{
export
function
getThinkTankProjectCloud
(
params
)
{
return
request
({
return
request
({
method
:
'GET'
,
method
:
'GET'
,
url
:
`/api/think-tank/projects/
${
params
.
id
}
/word-cloud`
,
url
:
`/api/think-tank/projects/
${
params
.
id
}
/word-cloud`
,
})
})
}
}
//获取国会听证会词云
export
function
getThinkTankHearingCloud
(
params
)
{
return
request
({
method
:
'GET'
,
url
:
`/api/think-tank/testimonies/
${
params
.
id
}
/wordcloud`
,
})
}
//获取政策建议落实情况
//获取政策建议落实情况
export
function
getThinkTankReportPolicy
(
params
)
{
export
function
getThinkTankReportPolicy
(
params
)
{
...
...
src/router/modules/thinktank.js
浏览文件 @
9250fcda
...
@@ -41,17 +41,31 @@ const thinktankRoutes = [
...
@@ -41,17 +41,31 @@ const thinktankRoutes = [
path
:
"/thinkTank/reportOriginal/:id"
,
path
:
"/thinkTank/reportOriginal/:id"
,
name
:
"ReportOriginal"
,
name
:
"ReportOriginal"
,
component
:
ReportOriginal
,
component
:
ReportOriginal
,
meta
:
{
title
:
"报告原文"
,
dynamicTitle
:
true
,
titleStorageKey
:
"reportOriginalTabName"
}
},
},
{
{
path
:
"/thinkTank/SurveyProjectView/:id"
,
path
:
"/thinkTank/SurveyProjectView/:id"
,
name
:
"SurveyProjectView"
,
name
:
"SurveyProjectView"
,
component
:
SurveyProjectView
,
component
:
SurveyProjectView
,
meta
:
{
title
:
"调查项目"
,
dynamicTitle
:
true
,
titleStorageKey
:
"surveyProjectTabName"
}
},
},
{
{
path
:
"/thinkTank/CongressHearingView/:id"
,
path
:
"/thinkTank/CongressHearingView/:id"
,
name
:
"CongressHearingView"
,
name
:
"CongressHearingView"
,
component
:
CongressHearingView
,
component
:
CongressHearingView
,
meta
:
{
title
:
"国会听证会"
,
dynamicTitle
:
true
,
titleStorageKey
:
"congressHearingTabName"
}
},
},
{
{
path
:
"/thinkTank/allThinkTank"
,
path
:
"/thinkTank/allThinkTank"
,
...
...
src/views/thinkTank/CongressHearingView/index.vue
浏览文件 @
9250fcda
...
@@ -4,18 +4,18 @@
...
@@ -4,18 +4,18 @@
<div
class=
"header"
>
<div
class=
"header"
>
<div
class=
"header-top"
>
<div
class=
"header-top"
>
<div
class=
"header-top-left"
>
<div
class=
"header-top-left"
>
<img
src=
"../assets/images/box1-logo.png"
alt=
""
/>
<img
:src=
thinkInfo.coverImgUrl
alt=
""
/>
<div>
<div>
<div
class=
"title"
>
{{
thinkInfo
.
name
}}
</div>
<div
class=
"title"
>
{{
thinkInfo
.
titleZh
}}
</div>
<div
class=
"en-title"
>
<div
class=
"en-title"
>
{{
thinkInfo
.
ename
}}
.
{{
thinkInfo
.
times
}}
{{
thinkInfo
.
testimonyDate
}}
·
{{
"国会听证会"
}}
·
{{
thinkInfo
.
committeeZh
}}
</div>
</div>
<div
class=
"tag-box"
>
<div
class=
"tag-box"
>
<!--
<div
class=
"tag-box"
v-for=
"value,index in thinkInfo.tags"
:key=
"index"
>
<!--
<div
class=
"tag-box"
v-for=
"value,index in thinkInfo.tags"
:key=
"index"
>
<div
class=
"tag"
>
{{
value
.
industryName
}}
</div>
<div
class=
"tag"
>
{{
value
.
industryName
}}
</div>
</div>
-->
</div>
-->
<AreaTag
v-for=
"(value, index) in thinkInfo.tags"
:key=
"index"
:tagName=
"value.
industry
Name"
></AreaTag>
<AreaTag
v-for=
"(value, index) in thinkInfo.tags"
:key=
"index"
:tagName=
"value.
domain
Name"
></AreaTag>
</div>
</div>
</div>
</div>
</div>
</div>
...
@@ -155,7 +155,7 @@
...
@@ -155,7 +155,7 @@
<div
class=
"box3-main"
>
<div
class=
"box3-main"
>
<AiSummary>
<AiSummary>
<
template
#
summary-content
>
<
template
#
summary-content
>
{{
box1Data
}}
{{
thinkInfo
.
descriptionZh
}}
</
template
>
</
template
>
</AiSummary>
</AiSummary>
...
@@ -180,10 +180,9 @@
...
@@ -180,10 +180,9 @@
{{ index + 1 }}
{{ index + 1 }}
</div>
</div>
<div
class=
"center"
>
<div
class=
"center"
>
<div
class=
"title"
v-html=
"highlightOpinionText(item.
title
Zh)"
></div>
<div
class=
"title"
v-html=
"highlightOpinionText(item.
question
Zh)"
></div>
<div>
<div>
<img
src=
"./images/image-open.png"
alt=
""
class=
"center-image"
<img
src=
"./images/image-open.png"
alt=
""
class=
"center-image"
/>
@
click=
"handleOpenReportOriginal(item)"
/>
</div>
</div>
<div>
<div>
<img
v-if=
"!isOpinionExpanded(item, index)"
src=
"./images/image-down.png"
alt=
""
<img
v-if=
"!isOpinionExpanded(item, index)"
src=
"./images/image-down.png"
alt=
""
...
@@ -194,7 +193,7 @@
...
@@ -194,7 +193,7 @@
</div>
</div>
</div>
</div>
<div
v-if=
"isOpinionExpanded(item, index)"
class=
"desc"
<div
v-if=
"isOpinionExpanded(item, index)"
class=
"desc"
v-html=
"highlightOpinionText(item.
content
Zh)"
>
v-html=
"highlightOpinionText(item.
answer
Zh)"
>
</div>
</div>
<!-- <div class="right"> -->
<!-- <div class="right"> -->
<!-- <div class="tag" v-for="(val, idx) in item.hylyList" :key="idx">
<!-- <div class="tag" v-for="(val, idx) in item.hylyList" :key="idx">
...
@@ -239,7 +238,10 @@ import {
...
@@ -239,7 +238,10 @@ import {
getThinkTankReportContent
,
getThinkTankReportContent
,
getThinkTankReportIndustry
,
getThinkTankReportIndustry
,
getThinkTankReportIndustryCloud
,
getThinkTankReportIndustryCloud
,
getThinkTankReportViewpoint
getThinkTankReportViewpoint
,
getThinkTankHearingInfo
,
getThinkTankHearingCloud
,
getThinkTankHearingViewpoint
}
from
"@/api/thinkTank/overview"
;
}
from
"@/api/thinkTank/overview"
;
import
{
getChartAnalysis
}
from
"@/api/aiAnalysis/index"
;
import
{
getChartAnalysis
}
from
"@/api/aiAnalysis/index"
;
import
{
useRouter
}
from
"vue-router"
;
import
{
useRouter
}
from
"vue-router"
;
...
@@ -270,15 +272,39 @@ const props = defineProps({
...
@@ -270,15 +272,39 @@ const props = defineProps({
}
}
});
});
const
thinkInfo
=
ref
({
const
thinkInfo
=
ref
({
name
:
"探讨中国开发和管理的跨大陆电网的安全影响"
,
ename
:
"调查项目"
,
tags
:
[{
industryName
:
"深海"
},
{
industryName
:
"人工智能"
}],
thinkTankName
:
"兰德科技智库"
,
thinkTankLogoUrl
:
"http://8.140.26.4:10010/kjb-files/images/org/land.webp"
,
times
:
"2024-05-28"
})
})
const
applyCongressHearingDocumentTitle
=
(
title
)
=>
{
const
text
=
String
(
title
||
""
).
trim
();
if
(
!
text
)
return
;
window
.
sessionStorage
.
setItem
(
"congressHearingTabName"
,
text
);
document
.
title
=
text
;
};
const
handleGetThinkTankHearingInfo
=
async
()
=>
{
try
{
const
id
=
router
.
currentRoute
.
_value
.
params
.
id
;
if
(
!
id
)
return
;
const
res
=
await
getThinkTankHearingInfo
({
id
});
if
(
res
?.
code
===
200
&&
res
?.
data
)
{
const
info
=
res
.
data
;
thinkInfo
.
value
=
{
...
info
,
// 保持模板现有字段:titleZh / testimonyDate / committeeZh / coverImgUrl ...
tags
:
Array
.
isArray
(
info
.
domains
)
?
info
.
domains
:
thinkInfo
.
value
.
tags
,
};
console
.
log
(
"thinkInfo"
,
thinkInfo
.
value
);
applyCongressHearingDocumentTitle
(
info
.
titleZh
||
info
.
title
||
""
);
if
(
info
.
summaryZh
||
info
.
summary
)
{
box1Data
.
value
=
info
.
summaryZh
||
info
.
summary
;
}
projectBackground
.
value
=
info
.
backgroundZh
||
info
.
background
||
projectBackground
.
value
;
}
}
catch
(
error
)
{
console
.
error
(
"获取调查项目详情error"
,
error
);
}
};
const
REPORT_ANALYSIS_TIP_BOX5
=
const
REPORT_ANALYSIS_TIP_BOX5
=
"
智库报告
关键词云,数据来源:美国兰德公司官网"
;
"
国会听证会
关键词云,数据来源:美国兰德公司官网"
;
// 刷新后默认展示「报告关键词云」AI 总结
// 刷新后默认展示「报告关键词云」AI 总结
const
isShowAiContentBox5
=
ref
(
true
);
const
isShowAiContentBox5
=
ref
(
true
);
const
aiContentBox5
=
ref
(
""
);
const
aiContentBox5
=
ref
(
""
);
...
@@ -464,19 +490,19 @@ const hasBox5ChartData = computed(() => Array.isArray(box5Data.value) && box5Dat
...
@@ -464,19 +490,19 @@ const hasBox5ChartData = computed(() => Array.isArray(box5Data.value) && box5Dat
/** 词云子组件不 watch 数据,每次接口成功有数据时递增 key,强制重新挂载以触发 onMounted */
/** 词云子组件不 watch 数据,每次接口成功有数据时递增 key,强制重新挂载以触发 onMounted */
const
box5WordCloudKey
=
ref
(
0
);
const
box5WordCloudKey
=
ref
(
0
);
//获取
科技领域
词云
//获取
国会听证会
词云
const
handleGetThinkTankReportIndustryCloud
=
async
()
=>
{
const
handleGetThinkTankReportIndustryCloud
=
async
()
=>
{
try
{
try
{
const
params
=
{
const
params
=
{
id
:
router
.
currentRoute
.
_value
.
params
.
id
id
:
router
.
currentRoute
.
_value
.
params
.
id
// industryId: activeArea.value
// industryId: activeArea.value
};
};
const
res
=
await
getThinkTank
ReportIndustry
Cloud
(
params
);
const
res
=
await
getThinkTank
Hearing
Cloud
(
params
);
console
.
log
(
"科技领域词云"
,
res
);
console
.
log
(
"科技领域词云"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
if
(
res
.
code
===
200
&&
res
.
data
)
{
const
data
=
(
res
.
data
||
[]).
map
(
item
=>
({
const
data
=
(
res
.
data
||
[]).
map
(
item
=>
({
name
:
item
.
claus
e
,
name
:
item
.
nam
e
,
value
:
item
.
count
value
:
item
.
value
}));
}));
// 该接口数据用于「报告关键词云」
// 该接口数据用于「报告关键词云」
box5Data
.
value
=
data
;
box5Data
.
value
=
data
;
...
@@ -566,18 +592,17 @@ const handleCurrentChange = page => {
...
@@ -566,18 +592,17 @@ const handleCurrentChange = page => {
handleGetThinkTankReportViewpoint
();
handleGetThinkTankReportViewpoint
();
};
};
// 获取报告
核心论点
(支持搜索)
// 获取报告
听证会
(支持搜索)
const
handleGetThinkTankReportViewpoint
=
async
()
=>
{
const
handleGetThinkTankReportViewpoint
=
async
()
=>
{
try
{
try
{
const
params
=
{
const
params
=
{
report
Id
:
router
.
currentRoute
.
_value
.
params
.
id
,
testimony
Id
:
router
.
currentRoute
.
_value
.
params
.
id
,
currentPage
:
currentPage
.
value
-
1
,
pageNum
:
currentPage
.
value
,
pageSize
:
pageSize
.
value
,
pageSize
:
pageSize
.
value
,
keyword
:
(
searchOpinions
.
value
||
""
).
trim
(),
keyword
:
(
searchOpinions
.
value
||
""
).
trim
(),
orgIds
:
""
};
};
const
res
=
await
getThinkTank
Report
Viewpoint
(
params
);
const
res
=
await
getThinkTank
Hearing
Viewpoint
(
params
);
console
.
log
(
"
核心论点
"
,
res
.
data
);
console
.
log
(
"
听证会内容
"
,
res
.
data
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
if
(
res
.
code
===
200
&&
res
.
data
)
{
const
nextOpinions
=
res
.
data
.
content
||
[];
const
nextOpinions
=
res
.
data
.
content
||
[];
majorOpinions
.
value
=
nextOpinions
;
majorOpinions
.
value
=
nextOpinions
;
...
@@ -672,6 +697,7 @@ onMounted(() => {
...
@@ -672,6 +697,7 @@ onMounted(() => {
handleGetThinkTankReportIndustry
();
handleGetThinkTankReportIndustry
();
handleGetThinkTankReportIndustryCloud
();
handleGetThinkTankReportIndustryCloud
();
handleGetThinkTankHearingInfo
();
});
});
</
script
>
</
script
>
...
@@ -1484,6 +1510,7 @@ onMounted(() => {
...
@@ -1484,6 +1510,7 @@ onMounted(() => {
height
:
24px
;
height
:
24px
;
margin-top
:
12px
;
margin-top
:
12px
;
margin-left
:
18px
;
margin-left
:
18px
;
cursor
:
pointer
;
}
}
...
@@ -1533,8 +1560,8 @@ onMounted(() => {
...
@@ -1533,8 +1560,8 @@ onMounted(() => {
padding-top
:
22px
;
padding-top
:
22px
;
padding-bottom
:
23px
;
padding-bottom
:
23px
;
padding-left
:
56px
;
// 24(left) + 13(center margin) + 一点间距
padding-left
:
56px
;
padding-right
:
56px
;
color
:
rgb
(
59
,
65
,
75
);
color
:
rgb
(
59
,
65
,
75
);
font-family
:
"Source Han Sans CN"
;
font-family
:
"Source Han Sans CN"
;
font-weight
:
400
;
font-weight
:
400
;
...
...
src/views/thinkTank/SurveyProjectView/index.vue
浏览文件 @
9250fcda
...
@@ -8,18 +8,18 @@
...
@@ -8,18 +8,18 @@
<div>
<div>
<div
class=
"title"
>
{{
thinkInfo
.
name
}}
</div>
<div
class=
"title"
>
{{
thinkInfo
.
name
}}
</div>
<div
class=
"en-title"
>
<div
class=
"en-title"
>
{{
thinkInfo
.
ename
}}
{{
"调查项目"
}}
</div>
</div>
</div>
</div>
</div>
</div>
<div
class=
"header-top-right"
>
<div
class=
"header-top-right"
>
<div
class=
"image-name-box"
>
<div
class=
"image-name-box"
>
<div
class=
"image"
><img
:src=
"thinkInfo.
thinkTank
Logo"
alt=
""
/></div>
<div
class=
"image"
><img
:src=
"thinkInfo.
org
Logo"
alt=
""
/></div>
<div
class=
"name"
>
{{
thinkInfo
.
thinkTank
Name
}}
</div>
<div
class=
"name"
>
{{
thinkInfo
.
org
Name
}}
</div>
</div>
</div>
<div
class=
"tag-box"
>
<div
class=
"tag-box"
>
<AreaTag
v-for=
"(value, index) in thinkInfo.tags"
:key=
"index"
:tagName=
"value
.industryName
"
></AreaTag>
<AreaTag
v-for=
"(value, index) in thinkInfo.tags"
:key=
"index"
:tagName=
"value"
></AreaTag>
</div>
</div>
</div>
</div>
</div>
</div>
...
@@ -177,6 +177,12 @@ const thinkInfo = ref({
...
@@ -177,6 +177,12 @@ const thinkInfo = ref({
})
})
const
reportAuthors
=
ref
([]);
const
reportAuthors
=
ref
([]);
const
projectBackground
=
ref
(
""
);
const
projectBackground
=
ref
(
""
);
const
applySurveyProjectDocumentTitle
=
(
title
)
=>
{
const
text
=
String
(
title
||
""
).
trim
();
if
(
!
text
)
return
;
window
.
sessionStorage
.
setItem
(
"surveyProjectTabName"
,
text
);
document
.
title
=
text
;
};
const
REPORT_ANALYSIS_TIP_BOX5
=
const
REPORT_ANALYSIS_TIP_BOX5
=
"调查项目关键词云,数据来源:美国兰德公司官网"
;
"调查项目关键词云,数据来源:美国兰德公司官网"
;
// 刷新后默认展示「报告关键词云」AI 总结
// 刷新后默认展示「报告关键词云」AI 总结
...
@@ -221,7 +227,7 @@ const formatDate = (dateStr) => {
...
@@ -221,7 +227,7 @@ const formatDate = (dateStr) => {
if
(
!
dateStr
)
return
""
;
if
(
!
dateStr
)
return
""
;
const
date
=
new
Date
(
dateStr
)
const
date
=
new
Date
(
dateStr
)
const
y
=
date
.
getFullYear
()
const
y
=
date
.
getFullYear
()
const
m
=
date
.
getMonth
()
+
1
const
m
=
date
.
getMonth
()
+
1
const
d
=
date
.
getDate
()
const
d
=
date
.
getDate
()
return
`
${
y
}
年
${
m
}
月
${
d
}
日`
return
`
${
y
}
年
${
m
}
月
${
d
}
日`
};
};
...
@@ -276,6 +282,7 @@ const handleGetThinkTankProjectsInfo = async () => {
...
@@ -276,6 +282,7 @@ const handleGetThinkTankProjectsInfo = async () => {
tags
:
Array
.
isArray
(
info
.
domains
)
?
info
.
domains
:
thinkInfo
.
value
.
tags
,
tags
:
Array
.
isArray
(
info
.
domains
)
?
info
.
domains
:
thinkInfo
.
value
.
tags
,
};
};
console
.
log
(
"thinkInfo"
,
thinkInfo
.
value
);
console
.
log
(
"thinkInfo"
,
thinkInfo
.
value
);
applySurveyProjectDocumentTitle
(
info
.
projectNameZh
||
info
.
projectName
||
""
);
if
(
info
.
summaryZh
||
info
.
summary
)
{
if
(
info
.
summaryZh
||
info
.
summary
)
{
box1Data
.
value
=
info
.
summaryZh
||
info
.
summary
;
box1Data
.
value
=
info
.
summaryZh
||
info
.
summary
;
}
}
...
...
src/views/thinkTank/ThinkTankDetail/PolicyTracking/utils/piechart.js
浏览文件 @
9250fcda
...
@@ -32,7 +32,7 @@ const getPieChart = (data) => {
...
@@ -32,7 +32,7 @@ const getPieChart = (data) => {
const
value
=
params
.
value
??
""
;
const
value
=
params
.
value
??
""
;
const
percent
=
params
.
percent
!=
null
?
Math
.
round
(
params
.
percent
)
:
0
;
const
percent
=
params
.
percent
!=
null
?
Math
.
round
(
params
.
percent
)
:
0
;
return
`{name|
${
name
}
}\n{time|
${
value
}
项
${
percent
}
%}`
;
return
`{name|
${
name
}
}\n{time|
${
percent
}
%}`
;
},
},
minMargin
:
10
,
minMargin
:
10
,
edgeDistance
:
20
,
edgeDistance
:
20
,
...
...
src/views/thinkTank/ThinkTankDetail/thinkDynamics/CongressHearing/index.vue
浏览文件 @
9250fcda
...
@@ -21,10 +21,7 @@
...
@@ -21,10 +21,7 @@
<div
class=
"title"
>
{{
"科技领域"
}}
</div>
<div
class=
"title"
>
{{
"科技领域"
}}
</div>
</div>
</div>
<div
class=
"select-main"
>
<div
class=
"select-main"
>
<el-checkbox-group
<el-checkbox-group
class=
"checkbox-group"
:model-value=
"selectedResearchIds"
@
change=
"handleAreaGroupChange"
>
class=
"checkbox-group"
:model-value=
"selectedResearchIds"
@
change=
"handleAreaGroupChange"
>
<el-checkbox
class=
"filter-checkbox"
:label=
"RESOURCE_FILTER_ALL_AREA"
>
<el-checkbox
class=
"filter-checkbox"
:label=
"RESOURCE_FILTER_ALL_AREA"
>
{{
RESOURCE_FILTER_ALL_AREA
}}
{{
RESOURCE_FILTER_ALL_AREA
}}
</el-checkbox>
</el-checkbox>
...
@@ -40,9 +37,7 @@
...
@@ -40,9 +37,7 @@
<div
class=
"title"
>
{{
"发布时间"
}}
</div>
<div
class=
"title"
>
{{
"发布时间"
}}
</div>
</div>
</div>
<div
class=
"select-main"
>
<div
class=
"select-main"
>
<el-checkbox-group
<el-checkbox-group
class=
"checkbox-group"
:model-value=
"selectedResearchTimeIds"
class=
"checkbox-group"
:model-value=
"selectedResearchTimeIds"
@
change=
"handleTimeGroupChange"
>
@
change=
"handleTimeGroupChange"
>
<el-checkbox
class=
"filter-checkbox"
:label=
"RESOURCE_FILTER_ALL_TIME"
>
<el-checkbox
class=
"filter-checkbox"
:label=
"RESOURCE_FILTER_ALL_TIME"
>
{{
RESOURCE_FILTER_ALL_TIME
}}
{{
RESOURCE_FILTER_ALL_TIME
}}
...
@@ -62,9 +57,7 @@
...
@@ -62,9 +57,7 @@
<div
class=
"title"
>
{{
"听证会部门"
}}
</div>
<div
class=
"title"
>
{{
"听证会部门"
}}
</div>
</div>
</div>
<div
class=
"select-main"
>
<div
class=
"select-main"
>
<el-checkbox-group
<el-checkbox-group
class=
"checkbox-group"
:model-value=
"selectedResearchHearingIds"
class=
"checkbox-group"
:model-value=
"selectedResearchHearingIds"
@
change=
"handleDeptGroupChange"
>
@
change=
"handleDeptGroupChange"
>
<el-checkbox
class=
"filter-checkbox"
:label=
"RESOURCE_FILTER_ALL_DEPT"
>
<el-checkbox
class=
"filter-checkbox"
:label=
"RESOURCE_FILTER_ALL_DEPT"
>
{{
RESOURCE_FILTER_ALL_DEPT
}}
{{
RESOURCE_FILTER_ALL_DEPT
}}
...
@@ -82,31 +75,33 @@
...
@@ -82,31 +75,33 @@
<div
class=
"right"
>
<div
class=
"right"
>
<div
class=
"card-box"
>
<div
class=
"card-box"
>
<div
class=
"card-content"
>
<div
class=
"card-content"
>
<div
v-for=
"(item, index) in displayList"
:key=
"item.id"
>
<div
v-for=
"(item, index) in hearingData"
:key=
"item.id"
>
<div
class=
"card-item"
>
<div
class=
"card-item"
@
click=
"handleToReportDetail(item)"
>
<img
class=
"card-item-img"
src=
"../images/img congress.png"
alt=
"report image"
/>
<img
class=
"card-item-img"
:src=
"item.coverImgUrl"
alt=
"report image"
/>
<div
class=
"card-item-text"
>
<div
class=
"card-item-text"
>
<div
class=
"card-item-title"
>
<div
class=
"card-item-title"
>
<span
v-html=
"highlightText(item.title)"
></span>
<span
v-html=
"highlightText(item.title)"
></span>
</div>
</div>
<div
class=
"card-item-time"
>
<div
class=
"card-item-time"
>
<span
v-html=
"highlightText(item.time + ' · ' + item.content)"
></span>
<span
v-html=
"highlightText(item.time + ' · ' + item.content)"
></span>
<img
src=
"../images/image open.png"
alt=
"open icon"
class=
"card-open-image"
/>
<img
src=
"../images/image open.png"
alt=
"open icon"
class=
"card-open-image"
@
click
.
stop=
"handleToReportDetail(item)"
/>
</div>
</div>
<div
class=
"card-item-category"
>
{{
item
.
category
}}
</div>
<div
class=
"card-item-category"
v-if=
"item.category"
>
{{
item
.
category
}}
</div>
</div>
</div>
</div>
</div>
<div
class=
"divider"
v-if=
"index !==
displayList
.length - 1"
></div>
<div
class=
"divider"
v-if=
"index !==
hearingData
.length - 1"
></div>
</div>
</div>
</div>
</div>
</div>
</div>
<div
class=
"right-footer"
>
<div
class=
"right-footer"
>
<div
class=
"info"
>
<div
class=
"info"
>
共
{{
filteredHearingData
.
length
}}
篇智库报告
共
{{
total
}}
篇智库报告
</div>
</div>
<div
class=
"page-box"
>
<div
class=
"page-box"
>
<el-pagination
:page-size=
"10"
background
layout=
"prev, pager, next"
:total=
"
filteredHearingData.length
"
<el-pagination
:page-size=
"10"
background
layout=
"prev, pager, next"
:total=
"
total
"
@
current-change=
"handleCurrentChange"
:current-page=
"currentPage"
/>
@
current-change=
"handleCurrentChange"
:current-page=
"currentPage"
/>
</div>
</div>
</div>
</div>
...
@@ -262,42 +257,9 @@ const handleDeptGroupChange = (val) => {
...
@@ -262,42 +257,9 @@ const handleDeptGroupChange = (val) => {
handleGetThinkDynamicsReport
();
handleGetThinkDynamicsReport
();
};
};
const
filteredHearingData
=
computed
(()
=>
{
const
areaSel
=
stripAllAreaForRequest
(
selectedResearchIds
.
value
);
const
timeSel
=
stripAllTimeForRequest
(
selectedResearchTimeIds
.
value
);
const
deptSel
=
stripAllDeptForRequest
(
selectedResearchHearingIds
.
value
);
const
rangeStart
=
getDateYearsAgo
(
selectedYear
.
value
||
1
);
return
(
hearingData
.
value
||
[]).
filter
(
item
=>
{
const
itemDate
=
parseChineseDate
(
item
.
time
);
const
matchTopRange
=
itemDate
?
itemDate
>=
rangeStart
:
true
;
const
matchYear
=
timeSel
.
length
===
0
||
timeSel
.
some
(
sel
=>
{
if
(
sel
===
RESOURCE_FILTER_EARLIER
)
{
return
matchesEarlierChineseDate
(
item
.
time
);
}
return
String
(
item
.
time
||
""
).
startsWith
(
String
(
sel
));
});
const
matchDepartment
=
deptSel
.
length
===
0
||
deptSel
.
some
(
department
=>
String
(
item
.
content
||
""
).
includes
(
department
)
||
String
(
item
.
title
||
""
).
includes
(
department
)
);
const
matchType
=
areaSel
.
length
===
0
||
areaSel
.
some
(
typeId
=>
String
(
item
.
category
||
""
).
includes
(
String
(
typeId
))
||
String
(
item
.
title
||
""
).
includes
(
String
(
typeId
))
);
return
matchTopRange
&&
matchYear
&&
matchDepartment
&&
matchType
;
});
});
// 只展示当前页的数据
const
displayList
=
computed
(()
=>
{
const
list
=
filteredHearingData
.
value
||
[];
const
start
=
(
currentPage
.
value
-
1
)
*
pageSize
;
return
list
.
slice
(
start
,
start
+
pageSize
);
});
// 保持模板里的方法名不变,但改成通知父组件,直接传入当前选中值避免时序问题
// 保持模板里的方法名不变,但改成通知父组件,直接传入当前选中值避免时序问题
const
handleGetThinkDynamicsReport
=
()
=>
{
const
handleGetThinkDynamicsReport
=
()
=>
{
...
@@ -542,7 +504,7 @@ const handleToReportDetail = item => {
...
@@ -542,7 +504,7 @@ const handleToReportDetail = item => {
width
:
100%
;
width
:
100%
;
height
:
77px
;
height
:
77px
;
display
:
flex
;
display
:
flex
;
align-items
:
center
;
...
@@ -555,11 +517,9 @@ const handleToReportDetail = item => {
...
@@ -555,11 +517,9 @@ const handleToReportDetail = item => {
}
}
.card-item-text
{
.card-item-text
{
flex
:
1
;
min-width
:
0
;
flex-direction
:
column
;
flex-direction
:
column
;
justify-content
:
space-between
;
display
:
flex
;
display
:
flex
;
...
@@ -592,6 +552,7 @@ const handleToReportDetail = item => {
...
@@ -592,6 +552,7 @@ const handleToReportDetail = item => {
height
:
16px
;
height
:
16px
;
margin-left
:
9px
;
margin-left
:
9px
;
margin-top
:
3px
;
margin-top
:
3px
;
cursor
:
pointer
;
}
}
}
}
...
...
src/views/thinkTank/ThinkTankDetail/thinkDynamics/SurveyForm/index.vue
浏览文件 @
9250fcda
...
@@ -64,7 +64,7 @@
...
@@ -64,7 +64,7 @@
</div>
</div>
<div
class=
"footer-card-footer"
>
<div
class=
"footer-card-footer"
>
<div
class=
"time"
>
{{
formatDate
(
item
.
startDate
)
}}
</div>
<div
class=
"time"
>
{{
formatDate
(
item
.
startDate
)
}}
</div>
<div
class=
"from"
>
{{
item
.
think
T
ankName
}}
</div>
<div
class=
"from"
>
{{
item
.
think
t
ankName
}}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
...
...
src/views/thinkTank/ThinkTankDetail/thinkDynamics/index.vue
浏览文件 @
9250fcda
...
@@ -41,42 +41,38 @@
...
@@ -41,42 +41,38 @@
<img
v-else
src=
"./images/image up.png"
class=
"select-prefix-img"
alt=
""
<img
v-else
src=
"./images/image up.png"
class=
"select-prefix-img"
alt=
""
@
click
.
stop=
"toggleSortAndFetch()"
/>
@
click
.
stop=
"toggleSortAndFetch()"
/>
</
template
>
</
template
>
<el-option
@
click=
"handleGetThinkDynamicsReport()"
:key=
"true"
label=
"正序"
:value=
"true"
/>
<el-option
:key=
"'think-dynamics-sort-asc'"
label=
"正序"
:value=
"true"
<el-option
@
click=
"handleGetThinkDynamicsReport()"
:key=
"false"
label=
"倒序"
:value=
"false"
/>
@
click=
"handleGetThinkDynamicsReport()"
/>
<el-option
:key=
"'think-dynamics-sort-desc'"
label=
"倒序"
:value=
"false"
@
click=
"handleGetThinkDynamicsReport()"
/>
</el-select>
</el-select>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div
v-if=
"isThinkTankReport"
>
<ThinkTankReport
v-if=
"isThinkTankReport"
:research-type-list=
"researchTypeList"
<ThinkTankReport
:research-type-list=
"researchTypeList"
:research-time-list=
"researchTimeList"
:research-time-list=
"researchTimeList"
:key=
"`智库报告-${tabResetKey}`"
:selected-filters=
"selectedFilters"
:key=
"`智库报告-${tabResetKey}`"
:selected-filters=
"selectedFilters"
:cur-footer-list=
"curFooterList"
:total=
"total"
:cur-footer-list=
"curFooterList"
:total=
"total"
:current-page=
"currentPage"
:search-keyword=
"searchReport"
:current-page=
"currentPage"
:search-keyword=
"searchReport"
@
update:selected-filters=
"handleSelectedFiltersUpdate"
@
update:selected-filters=
"handleSelectedFiltersUpdate"
@
filter-change=
"(payload) => handleGetThinkDynamicsReport(payload)"
@
page-change=
"handleCurrentChange"
@
filter-change=
"(payload) => handleGetThinkDynamicsReport(payload)"
@
page-change=
"handleCurrentChange"
@
report-click=
"handleToReportDetail"
/>
@
report-click=
"handleToReportDetail"
/>
<CongressHearing
v-else-if=
"isCongressHearing"
:research-type-list=
"researchTypeList"
</div>
:research-time-list=
"researchTimeList"
:key=
"`国会听证会-${tabResetKey}`"
:research-hearing-list=
"researchHearingList"
<div
v-if=
"isCongressHearing"
>
:selected-filters=
"selectedFilters"
:selected-year=
"selectedYear"
:total=
"total"
:current-page=
"currentPage"
<CongressHearing
:research-type-list=
"researchTypeList"
:research-time-list=
"researchTimeList"
:search-keyword=
"searchReport"
:hearing-data=
"hearingData"
@
update:selected-filters=
"handleSelectedFiltersUpdate"
:key=
"`国会听证会-${tabResetKey}`"
:research-hearing-list=
"researchHearingList"
:selected-filters=
"selectedFilters"
@
filter-change=
"(payload) => handleGetThinkDynamicsReport(payload)"
@
page-change=
"handleCurrentChange"
:selected-year=
"selectedYear"
:total=
"total"
:current-page=
"currentPage"
:search-keyword=
"searchReport"
@
report-click=
"handleToHearingDetail"
/>
:hearing-data=
"hearingData"
@
update:selected-filters=
"handleSelectedFiltersUpdate"
<SurveyForm
v-else-if=
"isSurveyForm"
:research-type-list=
"researchTypeList"
:research-time-list=
"researchTimeList"
@
filter-change=
"(payload) => handleGetThinkDynamicsReport(payload)"
@
page-change=
"handleCurrentChange"
:key=
"`调查项目-${tabResetKey}`"
:selected-filters=
"selectedFilters"
:cur-footer-list=
"curFooterProjectList"
@
report-click=
"handleToReportDetail"
/>
:total=
"total"
:current-page=
"currentPage"
:search-keyword=
"searchReport"
</div>
@
update:selected-filters=
"handleSelectedFiltersUpdate"
<div>
@
filter-change=
"(payload) => handleGetThinkDynamicsReport(payload)"
@
page-change=
"handleCurrentChange"
<SurveyForm
v-if=
"isSurveyForm"
:research-type-list=
"researchTypeList"
:research-time-list=
"researchTimeList"
@
report-click=
"handleToProjectDetail"
/>
:key=
"`调查项目-${tabResetKey}`"
:selected-filters=
"selectedFilters"
:cur-footer-list=
"curFooterProjectList"
:total=
"total"
:current-page=
"currentPage"
:search-keyword=
"searchReport"
@
update:selected-filters=
"handleSelectedFiltersUpdate"
@
filter-change=
"(payload) => handleGetThinkDynamicsReport(payload)"
@
page-change=
"handleCurrentChange"
@
report-click=
"handleToProjectDetail"
/>
</div>
</div>
</div>
</template>
</template>
<
script
setup
>
<
script
setup
>
import
{
ref
,
reactive
,
onMounted
}
from
"vue"
;
import
{
ref
,
reactive
,
onMounted
,
nextTick
}
from
"vue"
;
import
SurveyForm
from
"./SurveyForm/index.vue"
import
SurveyForm
from
"./SurveyForm/index.vue"
// import Img1 from "./images/img1.png";
// import Img1 from "./images/img1.png";
// import Img2 from "./images/img2.png";
// import Img2 from "./images/img2.png";
...
@@ -95,7 +91,8 @@ import {
...
@@ -95,7 +91,8 @@ import {
getThinkDynamicsReportType
,
getThinkDynamicsReportType
,
getHylyList
,
getHylyList
,
getThinkTankReport
,
getThinkTankReport
,
getThinkTankProjectsByThinkTankId
getThinkTankProjectsByThinkTankId
,
getThinkTankTestimoniesByThinkTankId
}
from
"@/api/thinkTank/overview"
;
}
from
"@/api/thinkTank/overview"
;
import
{
import
{
RESOURCE_FILTER_EARLIER
,
RESOURCE_FILTER_EARLIER
,
...
@@ -123,6 +120,19 @@ const handleToReportDetail = (item) => {
...
@@ -123,6 +120,19 @@ const handleToReportDetail = (item) => {
window
.
open
(
route
.
href
,
"_blank"
);
window
.
open
(
route
.
href
,
"_blank"
);
}
}
const
handleToHearingDetail
=
item
=>
{
const
id
=
item
?.
id
;
if
(
!
id
)
return
;
window
.
sessionStorage
.
setItem
(
'curTabName'
,
item
?.
title
||
item
?.
name
||
""
);
const
route
=
router
.
resolve
({
name
:
"CongressHearingView"
,
params
:
{
id
}
});
window
.
open
(
route
.
href
,
"_blank"
);
};
const
handleToProjectDetail
=
(
item
)
=>
{
const
handleToProjectDetail
=
(
item
)
=>
{
window
.
sessionStorage
.
setItem
(
'curTabName'
,
item
.
name
)
window
.
sessionStorage
.
setItem
(
'curTabName'
,
item
.
name
)
const
route
=
router
.
resolve
({
const
route
=
router
.
resolve
({
...
@@ -135,128 +145,8 @@ const handleToProjectDetail = (item) => {
...
@@ -135,128 +145,8 @@ const handleToProjectDetail = (item) => {
}
}
const
hearingData
=
ref
([
const
hearingData
=
ref
([
// 军事类(10条)
{
title
:
"2025财年美国国防部国防授权法案听证会:军事预算与战略部署"
,
content
:
"参与美中经济与安全审查委员会听证会"
,
category
:
"军事"
,
time
:
"2025年7月8日"
},
{
title
:
"美国国会众议院听证会:美军网络安全与军事信息系统防护"
,
content
:
"参与美中经济与安全审查委员会听证会"
,
category
:
"军事"
,
time
:
"2025年6月15日"
},
{
title
:
"俄乌冲突背景下美国对乌军事援助听证会:援助规模与后续规划"
,
content
:
"参与美中经济与安全审查委员会听证会"
,
category
:
"军事"
,
time
:
"2025年5月22日"
},
{
title
:
"美国海军舰艇建造与维护听证会:舰队规模目标与工业基础支撑"
,
content
:
"参与美中经济与安全审查委员会听证会"
,
category
:
"军事"
,
time
:
"2025年4月10日"
},
{
title
:
"美军太空军事能力建设听证会:太空军发展与反卫星武器管控"
,
content
:
"参与美中经济与安全审查委员会听证会"
,
category
:
"军事"
,
time
:
"2025年3月5日"
},
{
title
:
"美国国防工业基础听证会:军工供应链韧性与本土制造能力"
,
content
:
"参与美中经济与安全审查委员会听证会"
,
category
:
"军事"
,
time
:
"2025年2月18日"
},
{
title
:
"美军人工智能军事应用听证会:伦理规范与作战效能评估"
,
content
:
"参与美中经济与安全审查委员会听证会"
,
category
:
"军事"
,
time
:
"2025年1月30日"
},
{
title
:
"美国陆军未来作战系统听证会:下一代战车与单兵装备研发"
,
content
:
"参与美中经济与安全审查委员会听证会"
,
category
:
"军事"
,
time
:
"2025年7月2日"
},
{
title
:
"北约军事合作听证会:美国对北约防务开支承诺与兵力部署"
,
content
:
"参与美中经济与安全审查委员会听证会"
,
category
:
"军事"
,
time
:
"2025年6月8日"
},
{
title
:
"美军核力量现代化听证会:洲际导弹更新与核不扩散政策"
,
content
:
"参与美中经济与安全审查委员会听证会"
,
category
:
"军事"
,
time
:
"2025年5月1日"
},
// 先进制造类(10条)
{
title
:
"美国国会听证会:先进制造业供应链重塑与本土产业回流"
,
content
:
"参与美中经济与安全审查委员会听证会"
,
category
:
"先进制造"
,
time
:
"2025年7月15日"
},
{
title
:
"先进制造中的人工智能应用听证会:智能制造与产业升级"
,
content
:
"参与美中经济与安全审查委员会听证会"
,
category
:
"先进制造"
,
time
:
"2025年6月20日"
},
{
title
:
"美国先进制造业研发法案听证会:资金分配与技术突破方向"
,
content
:
"参与美中经济与安全审查委员会听证会"
,
category
:
"先进制造"
,
time
:
"2025年4月25日"
},
{
title
:
"新能源装备先进制造听证会:动力电池与氢能装备产业化"
,
content
:
"参与美中经济与安全审查委员会听证会"
,
category
:
"先进制造"
,
time
:
"2025年3月12日"
},
{
title
:
"美国半导体先进制造听证会:芯片制造本土化与技术封锁"
,
content
:
"参与美中经济与安全审查委员会听证会"
,
category
:
"先进制造"
,
time
:
"2025年2月8日"
},
{
title
:
"先进制造劳动力培训听证会:技能匹配与产业人才供给"
,
content
:
"参与美中经济与安全审查委员会听证会"
,
category
:
"先进制造"
,
time
:
"2025年1月15日"
},
{
title
:
"航空航天先进制造听证会:民用飞机轻量化材料与智能制造"
,
content
:
"参与美中经济与安全审查委员会听证会"
,
category
:
"先进制造"
,
time
:
"2025年7月20日"
},
{
title
:
"先进制造中的可持续发展听证会:绿色制造与碳中和目标"
,
content
:
"参与美中经济与安全审查委员会听证会"
,
category
:
"先进制造"
,
time
:
"2025年6月1日"
},
{
title
:
"美国国防先进制造听证会:军工制造数字化与快速响应能力"
,
content
:
"参与美中经济与安全审查委员会听证会"
,
category
:
"先进制造"
,
time
:
"2025年5月18日"
},
{
title
:
"先进制造标准制定听证会:美国主导的全球制造标准体系构建"
,
content
:
"参与美中经济与安全审查委员会听证会"
,
category
:
"先进制造"
,
time
:
"2025年4月8日"
}
])
])
const
reportTypeList
=
ref
([
const
reportTypeList
=
ref
([
{
{
...
@@ -328,11 +218,13 @@ const resetThinkDynamicsState = () => {
...
@@ -328,11 +218,13 @@ const resetThinkDynamicsState = () => {
currentPage
.
value
=
1
currentPage
.
value
=
1
selectedFilters
.
value
=
createDefaultSelectedFilters
()
selectedFilters
.
value
=
createDefaultSelectedFilters
()
curFooterList
.
value
=
[]
curFooterList
.
value
=
[]
curFooterProjectList
.
value
=
[]
hearingData
.
value
=
[]
total
.
value
=
0
total
.
value
=
0
tabResetKey
.
value
+=
1
tabResetKey
.
value
+=
1
}
}
const
handleChooseType
=
(
type
)
=>
{
const
handleChooseType
=
async
(
type
)
=>
{
if
(
activeTypeId
.
value
===
type
.
id
)
{
if
(
activeTypeId
.
value
===
type
.
id
)
{
return
return
}
}
...
@@ -350,8 +242,10 @@ const handleChooseType = (type) => {
...
@@ -350,8 +242,10 @@ const handleChooseType = (type) => {
isCongressHearing
.
value
=
false
isCongressHearing
.
value
=
false
isSurveyForm
.
value
=
true
isSurveyForm
.
value
=
true
}
}
// 等当前 tick 完成卸载/挂载后再重置 key 与拉数,避免 patch 阶段子组件 vnode 为 null(emitsOptions 报错)
await
nextTick
()
resetThinkDynamicsState
()
resetThinkDynamicsState
()
handleGetThinkDynamicsReport
()
await
handleGetThinkDynamicsReport
()
}
}
const
researchTimeList
=
ref
([
const
researchTimeList
=
ref
([
{
{
...
@@ -380,34 +274,7 @@ const researchTimeList = ref([
...
@@ -380,34 +274,7 @@ const researchTimeList = ref([
}
}
])
])
const
researchHearingList
=
ref
([
const
researchHearingList
=
ref
([
{
id
:
'美中经济与安全审查委员会'
,
name
:
'美中经济与安全审查委员会'
,
},
{
id
:
'国会-行政部门中国委员会'
,
name
:
'国会-行政部门中国委员会'
,
},
{
id
:
'美中战略竞争特设委员会'
,
name
:
'美中战略竞争特设委员会'
,
},
{
id
:
'众议院小企业委员会'
,
name
:
'众议院小企业委员会'
,
},
{
id
:
'众议院国土安全委员会'
,
name
:
'众议院国土安全委员会'
,
},
{
id
:
'参议院能源与自然资源委员会'
,
name
:
'参议院能源与自然资源委员会'
,
},
{
id
:
'新材料'
,
name
:
'新材料'
,
}
])
])
const
selectedFilters
=
ref
(
createDefaultSelectedFilters
())
const
selectedFilters
=
ref
(
createDefaultSelectedFilters
())
...
@@ -473,6 +340,43 @@ function arrayToString(arr) {
...
@@ -473,6 +340,43 @@ function arrayToString(arr) {
},
""
);
},
""
);
}
}
/** 国会听证会列表筛选用「xxxx年x月x日」格式 */
const
formatHearingTimeForFilter
=
(
value
)
=>
{
if
(
value
===
null
||
value
===
undefined
||
value
===
""
)
return
""
;
const
s
=
String
(
value
).
trim
();
if
(
/年/
.
test
(
s
))
return
s
;
const
d
=
new
Date
(
s
);
if
(
!
Number
.
isNaN
(
d
.
getTime
()))
{
return
`
${
d
.
getFullYear
()}
年
${
d
.
getMonth
()
+
1
}
月
${
d
.
getDate
()}
日`
;
}
return
s
;
};
/** 后端证词/听证会条目 → CongressHearing 组件所需字段(与 /think-tank/{id}/testimonies 返回对齐) */
const
mapTestimonyToHearingItem
=
(
raw
,
index
)
=>
{
const
item
=
raw
||
{};
const
title
=
item
.
titleZh
||
item
.
title
||
item
.
hearingTitle
||
item
.
name
||
""
;
return
{
id
:
item
.
id
??
item
.
testimonyId
??
`hearing-
${
index
}
`
,
name
:
title
,
title
,
coverImgUrl
:
item
.
coverImgUrl
||
""
,
thinkTankLogoUrl
:
item
.
thinkTankLogoUrl
||
""
,
time
:
formatHearingTimeForFilter
(
item
.
testimonyDate
||
item
.
hearingDate
||
item
.
date
||
item
.
startDate
||
item
.
publishTime
),
content
:
item
.
committeeZh
||
item
.
committee
||
item
.
organization
||
item
.
summaryZh
||
item
.
summary
||
item
.
subtitle
||
""
,
category
:
item
.
category
||
item
.
domain
||
item
.
area
||
item
.
field
||
""
};
};
// 获取智库动态报告,payload 为子组件筛选变更时传入的当前选中值,避免时序导致拿到旧值
// 获取智库动态报告,payload 为子组件筛选变更时传入的当前选中值,避免时序导致拿到旧值
const
handleGetThinkDynamicsReport
=
async
(
payload
)
=>
{
const
handleGetThinkDynamicsReport
=
async
(
payload
)
=>
{
const
nextFilters
=
payload
&&
typeof
payload
===
"object"
const
nextFilters
=
payload
&&
typeof
payload
===
"object"
...
@@ -487,7 +391,7 @@ const handleGetThinkDynamicsReport = async (payload) => {
...
@@ -487,7 +391,7 @@ const handleGetThinkDynamicsReport = async (payload) => {
currentPage
.
value
=
1
;
currentPage
.
value
=
1
;
}
}
if
(
!
isThinkTankReport
.
value
&&
!
isSurveyForm
.
value
)
{
if
(
!
isThinkTankReport
.
value
&&
!
isSurveyForm
.
value
&&
!
isCongressHearing
.
value
)
{
return
;
return
;
}
}
try
{
try
{
...
@@ -504,6 +408,24 @@ const handleGetThinkDynamicsReport = async (payload) => {
...
@@ -504,6 +408,24 @@ const handleGetThinkDynamicsReport = async (payload) => {
:
arrayToString
(
areas
);
:
arrayToString
(
areas
);
const
keyword
=
(
searchReport
.
value
||
""
).
trim
();
const
keyword
=
(
searchReport
.
value
||
""
).
trim
();
const
thinkTankId
=
router
.
currentRoute
.
_value
.
params
?.
id
;
const
thinkTankId
=
router
.
currentRoute
.
_value
.
params
?.
id
;
if
(
isCongressHearing
.
value
)
{
curFooterList
.
value
=
[];
curFooterProjectList
.
value
=
[];
const
res
=
await
getThinkTankTestimoniesByThinkTankId
({
thinkTankId
,
pageNum
:
Math
.
max
(
0
,
(
currentPage
.
value
||
1
)),
pageSize
:
10
});
if
(
res
.
code
===
200
&&
res
.
data
)
{
const
list
=
Array
.
isArray
(
res
.
data
.
content
)
?
res
.
data
.
content
:
Array
.
isArray
(
res
.
data
)
?
res
.
data
:
[];
hearingData
.
value
=
list
.
map
((
row
,
idx
)
=>
mapTestimonyToHearingItem
(
row
,
idx
));
total
.
value
=
res
.
data
.
totalElements
??
hearingData
.
value
.
length
;
}
else
{
hearingData
.
value
=
[];
total
.
value
=
0
;
}
return
;
}
if
(
isSurveyForm
.
value
)
{
if
(
isSurveyForm
.
value
)
{
// 调查项目:用新接口 /think-tank/{thinkTankId}/projects
// 调查项目:用新接口 /think-tank/{thinkTankId}/projects
curFooterList
.
value
=
[];
curFooterList
.
value
=
[];
...
@@ -618,6 +540,7 @@ onMounted(async () => {
...
@@ -618,6 +540,7 @@ onMounted(async () => {
// 图层模式:穿透(即允许点击事件穿透,如需的话)
// 图层模式:穿透(即允许点击事件穿透,如需的话)
box-sizing
:
border-box
;
// 确保描边/内边距不影响尺寸
box-sizing
:
border-box
;
// 确保描边/内边距不影响尺寸
cursor
:
pointer
;
// 鼠标悬停时显示为可点击
&
.active
{
&
.active
{
background
:
rgb
(
5
,
95
,
194
);
// 蓝色背景
background
:
rgb
(
5
,
95
,
194
);
// 蓝色背景
...
...
src/views/thinkTank/components/HomeMainFooterSurvey.vue
浏览文件 @
9250fcda
...
@@ -49,7 +49,7 @@
...
@@ -49,7 +49,7 @@
</div>
</div>
<div
class=
"footer-card-footer"
>
<div
class=
"footer-card-footer"
>
<div
class=
"time"
>
{{
formatDate
(
item
.
startDate
)
}}
</div>
<div
class=
"time"
>
{{
formatDate
(
item
.
startDate
)
}}
</div>
<div
class=
"from"
>
{{
item
.
think
T
ankName
}}
</div>
<div
class=
"from"
>
{{
item
.
think
t
ankName
}}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
...
@@ -180,12 +180,14 @@ const handleTimeGroupChange = (val) => {
...
@@ -180,12 +180,14 @@ const handleTimeGroupChange = (val) => {
flex-wrap
:
wrap
;
flex-wrap
:
wrap
;
gap
:
16px
16px
;
gap
:
16px
16px
;
.footer-card
{
.footer-card
{
width
:
398px
;
width
:
398px
;
height
:
300px
;
height
:
300px
;
border-radius
:
10px
;
border-radius
:
10px
;
box-shadow
:
0px
0px
20px
0px
rgba
(
25
,
69
,
130
,
0
.1
);
box-shadow
:
0px
0px
20px
0px
rgba
(
25
,
69
,
130
,
0
.1
);
background
:
rgba
(
255
,
255
,
255
,
1
);
background
:
rgba
(
255
,
255
,
255
,
1
);
cursor
:
pointer
;
.footer-card-top
{
.footer-card-top
{
width
:
364px
;
width
:
364px
;
...
...
src/views/thinkTank/components/ThinkTankCongressHearingOverview.vue
浏览文件 @
9250fcda
...
@@ -58,35 +58,34 @@
...
@@ -58,35 +58,34 @@
<div
class=
"right"
>
<div
class=
"right"
>
<div
class=
"card-box"
>
<div
class=
"card-box"
>
<div
class=
"card-content"
>
<div
class=
"card-content"
>
<div
v-for=
"(item, index) in displayList"
:key=
"item.id ?? index"
>
<div
v-for=
"(item, index) in hearingData"
:key=
"item.id ?? index"
>
<div
class=
"card-item"
@
click=
"emit('report-click', item)"
>
<div
class=
"card-item"
>
<img
class=
"card-item-img"
src=
"../ThinkTankDetail/thinkDynamics/images/img congress.png"
<img
class=
"card-item-img"
:src=
item.coverImgUrl
alt=
"report image"
/>
alt=
"report image"
/>
<div
class=
"card-item-text"
>
<div
class=
"card-item-text"
>
<div
class=
"card-item-title"
>
<div
class=
"card-item-title"
>
{{
item
.
title
}}
{{
item
.
title
Zh
}}
</div>
</div>
<div
class=
"card-item-time"
>
<div
class=
"card-item-time"
>
{{
item
.
t
ime
+
' · '
+
item
.
content
}}
{{
item
.
t
estimonyDate
+
' · '
+
item
.
committeeZh
}}
<img
src=
"../ThinkTankDetail/thinkDynamics/images/image open.png"
alt=
"open icon"
<img
src=
"../ThinkTankDetail/thinkDynamics/images/image open.png"
alt=
"open icon"
class=
"card-open-image"
/>
class=
"card-open-image"
@
click=
"emit('report-click', item)"
/>
</div>
</div>
<div
class=
"card-item-category"
>
<div
class=
"card-item-category"
v-if=
"item.category"
>
<AreaTag
:key=
"`cat-$
{item.id}`" :tagName="item.category" />
<AreaTag
:key=
"`cat-$
{item.id}`" :tagName="item.category" />
</div>
</div>
</div>
</div>
</div>
</div>
<div
class=
"divider"
v-if=
"index !==
displayList
.length - 1"
></div>
<div
class=
"divider"
v-if=
"index !==
hearingData
.length - 1"
></div>
</div>
</div>
</div>
</div>
</div>
</div>
<div
class=
"right-footer"
>
<div
class=
"right-footer"
>
<div
class=
"info"
>
<div
class=
"info"
>
共
{{
filteredH
earingData
.
length
}}
篇智库报告
共
{{
h
earingData
.
length
}}
篇智库报告
</div>
</div>
<div
class=
"page-box"
>
<div
class=
"page-box"
>
<el-pagination
:page-size=
"pageSize"
background
layout=
"prev, pager, next"
:total=
"
filteredHearingData.length
"
<el-pagination
:page-size=
"pageSize"
background
layout=
"prev, pager, next"
:total=
"
total
"
@
current-change=
"handlePageChange"
:current-page=
"currentPage"
/>
@
current-change=
"handlePageChange"
:current-page=
"currentPage"
/>
</div>
</div>
</div>
</div>
...
@@ -112,6 +111,8 @@ import {
...
@@ -112,6 +111,8 @@ import {
const
props
=
defineProps
({
const
props
=
defineProps
({
researchTypeList
:
{
type
:
Array
,
default
:
()
=>
[]
},
researchTypeList
:
{
type
:
Array
,
default
:
()
=>
[]
},
researchTimeList
:
{
type
:
Array
,
default
:
()
=>
[]
},
researchTimeList
:
{
type
:
Array
,
default
:
()
=>
[]
},
hearingData
:
{
type
:
Array
,
default
:
()
=>
[]
},
total
:
{
type
:
Number
,
default
:
0
}
});
});
const
emit
=
defineEmits
([
"report-click"
]);
const
emit
=
defineEmits
([
"report-click"
]);
...
@@ -123,25 +124,10 @@ const selectedResearchIds = ref([RESOURCE_FILTER_ALL_AREA]);
...
@@ -123,25 +124,10 @@ const selectedResearchIds = ref([RESOURCE_FILTER_ALL_AREA]);
const
selectedResearchTimeIds
=
ref
([
RESOURCE_FILTER_ALL_TIME
]);
const
selectedResearchTimeIds
=
ref
([
RESOURCE_FILTER_ALL_TIME
]);
const
selectedResearchHearingIds
=
ref
([
RESOURCE_FILTER_ALL_DEPT
]);
const
selectedResearchHearingIds
=
ref
([
RESOURCE_FILTER_ALL_DEPT
]);
const
hearingData
=
ref
([
{
id
:
1
,
title
:
"美国国会听证会:人工智能与国家安全"
,
content
:
"美中经济与安全审查委员会"
,
category
:
"人工智能"
,
time
:
"2025年7月8日"
},
{
id
:
2
,
title
:
"美国国会听证会:先进制造供应链韧性"
,
content
:
"国会-行政部门中国委员会"
,
category
:
"先进制造"
,
time
:
"2025年6月15日"
},
{
id
:
3
,
title
:
"美国国会听证会:半导体出口管制与产业政策"
,
content
:
"美国商务部"
,
category
:
"半导体"
,
time
:
"2025年5月22日"
},
{
id
:
4
,
title
:
"美国国会听证会:人工智能与国家安全"
,
content
:
"美中经济与安全审查委员会"
,
category
:
"人工智能"
,
time
:
"2025年7月8日"
},
{
id
:
5
,
title
:
"美国国会听证会:先进制造供应链韧性"
,
content
:
"国会-行政部门中国委员会"
,
category
:
"先进制造"
,
time
:
"2025年6月15日"
},
{
id
:
6
,
title
:
"美国国会听证会:半导体出口管制与产业政策"
,
content
:
"美国商务部"
,
category
:
"半导体"
,
time
:
"2025年5月22日"
},
{
id
:
7
,
title
:
"美国国会听证会:人工智能与国家安全"
,
content
:
"美中经济与安全审查委员会"
,
category
:
"人工智能"
,
time
:
"2025年7月8日"
},
{
id
:
8
,
title
:
"美国国会听证会:先进制造供应链韧性"
,
content
:
"国会-行政部门中国委员会"
,
category
:
"先进制造"
,
time
:
"2025年6月15日"
},
{
id
:
9
,
title
:
"美国国会听证会:半导体出口管制与产业政策"
,
content
:
"美国商务部"
,
category
:
"半导体"
,
time
:
"2025年5月22日"
},
{
id
:
10
,
title
:
"美国国会听证会:人工智能与国家安全"
,
content
:
"美中经济与安全审查委员会"
,
category
:
"人工智能"
,
time
:
"2025年7月8日"
},
{
id
:
11
,
title
:
"美国国会听证会:先进制造供应链韧性"
,
content
:
"国会-行政部门中国委员会"
,
category
:
"先进制造"
,
time
:
"2025年6月15日"
},
{
id
:
12
,
title
:
"美国国会听证会:半导体出口管制与产业政策"
,
content
:
"美国商务部"
,
category
:
"半导体"
,
time
:
"2025年5月22日"
},
]);
const
researchHearingList
=
ref
([
const
researchHearingList
=
ref
([
{
id
:
"美中经济与安全审查委员会"
,
name
:
"美中经济与安全审查委员会"
},
{
id
:
"国会-行政部门中国委员会"
,
name
:
"国会-行政部门中国委员会"
},
{
id
:
"美国商务部"
,
name
:
"美国商务部"
},
]);
]);
const
handleAreaGroupChange
=
(
val
)
=>
{
const
handleAreaGroupChange
=
(
val
)
=>
{
...
@@ -159,39 +145,9 @@ const handleDeptGroupChange = (val) => {
...
@@ -159,39 +145,9 @@ const handleDeptGroupChange = (val) => {
currentPage
.
value
=
1
;
currentPage
.
value
=
1
;
};
};
const
filteredHearingData
=
computed
(()
=>
{
const
areaSel
=
stripAllAreaForRequest
(
selectedResearchIds
.
value
);
const
timeSel
=
stripAllTimeForRequest
(
selectedResearchTimeIds
.
value
);
const
deptSel
=
stripAllDeptForRequest
(
selectedResearchHearingIds
.
value
);
return
(
hearingData
.
value
||
[]).
filter
(
item
=>
{
const
matchYear
=
timeSel
.
length
===
0
||
timeSel
.
some
(
sel
=>
{
if
(
sel
===
RESOURCE_FILTER_EARLIER
)
{
return
matchesEarlierChineseDate
(
item
.
time
);
}
return
String
(
item
.
time
||
""
).
startsWith
(
String
(
sel
));
});
const
matchDepartment
=
deptSel
.
length
===
0
||
deptSel
.
some
(
department
=>
String
(
item
.
content
||
""
).
includes
(
department
)
||
String
(
item
.
title
||
""
).
includes
(
department
)
);
const
matchType
=
areaSel
.
length
===
0
||
areaSel
.
some
(
typeId
=>
String
(
item
.
category
||
""
).
includes
(
String
(
typeId
))
||
String
(
item
.
title
||
""
).
includes
(
String
(
typeId
))
);
return
matchYear
&&
matchDepartment
&&
matchType
;
});
});
const
displayList
=
computed
(()
=>
{
const
list
=
filteredHearingData
.
value
||
[];
const
start
=
(
currentPage
.
value
-
1
)
*
pageSize
;
return
list
.
slice
(
start
,
start
+
pageSize
);
});
const
handlePageChange
=
page
=>
{
const
handlePageChange
=
page
=>
{
currentPage
.
value
=
page
;
currentPage
.
value
=
page
;
...
@@ -335,7 +291,7 @@ const handlePageChange = page => {
...
@@ -335,7 +291,7 @@ const handlePageChange = page => {
width
:
100%
;
width
:
100%
;
height
:
77px
;
height
:
77px
;
display
:
flex
;
display
:
flex
;
align-items
:
center
;
.card-item-img
{
.card-item-img
{
width
:
56px
;
width
:
56px
;
...
@@ -345,8 +301,8 @@ const handlePageChange = page => {
...
@@ -345,8 +301,8 @@ const handlePageChange = page => {
}
}
.card-item-text
{
.card-item-text
{
flex
:
1
;
min-width
:
0
;
display
:
flex
;
display
:
flex
;
flex-direction
:
column
;
flex-direction
:
column
;
...
@@ -375,6 +331,7 @@ const handlePageChange = page => {
...
@@ -375,6 +331,7 @@ const handlePageChange = page => {
height
:
16px
;
height
:
16px
;
margin-left
:
9px
;
margin-left
:
9px
;
margin-top
:
3px
;
margin-top
:
3px
;
cursor
:
pointer
;
}
}
}
}
...
...
src/views/thinkTank/index.vue
浏览文件 @
9250fcda
...
@@ -367,7 +367,8 @@
...
@@ -367,7 +367,8 @@
@
report-click=
"handleToSurveyProjectView"
@
page-change=
"handleSurveyCurrentChange"
/>
@
report-click=
"handleToSurveyProjectView"
@
page-change=
"handleSurveyCurrentChange"
/>
<ThinkTankCongressHearingOverview
v-else-if=
"activeCate === '国会听证会'"
:key=
"`congress-${resourceTabResetKey}`"
<ThinkTankCongressHearingOverview
v-else-if=
"activeCate === '国会听证会'"
:key=
"`congress-${resourceTabResetKey}`"
:research-type-list=
"areaList"
:research-time-list=
"pubTimeList"
@
report-click=
"handleToReportDetail"
/>
:hearing-data=
"hearingData"
:research-type-list=
"areaList"
:research-time-list=
"pubTimeList"
:total=
"projectTotal"
@
report-click=
"handleToHearingDetail"
/>
<ThinkTankPolicyAdviceOverview
v-else
:key=
"`policy-${resourceTabResetKey}`"
:research-type-list=
"areaList"
<ThinkTankPolicyAdviceOverview
v-else
:key=
"`policy-${resourceTabResetKey}`"
:research-type-list=
"areaList"
:research-time-list=
"pubTimeList"
:list=
"policyFooterList"
:total=
"policyTotal"
:research-time-list=
"pubTimeList"
:list=
"policyFooterList"
:total=
"policyTotal"
...
@@ -408,7 +409,8 @@ import {
...
@@ -408,7 +409,8 @@ import {
getThinkTankOverviewPolicy
,
getThinkTankOverviewPolicy
,
getThinkTankReportNews
,
getThinkTankReportNews
,
getThinkTankReportRemarks
,
getThinkTankReportRemarks
,
getThinkTankProjects
getThinkTankProjects
,
getThinkTankTestimonies
}
from
"@/api/thinkTank/overview"
;
}
from
"@/api/thinkTank/overview"
;
import
{
getPersonSummaryInfo
}
from
"@/api/common/index"
;
import
{
getPersonSummaryInfo
}
from
"@/api/common/index"
;
import
getMultiLineChart
from
"./utils/multiLineChart"
;
import
getMultiLineChart
from
"./utils/multiLineChart"
;
...
@@ -433,7 +435,8 @@ import {
...
@@ -433,7 +435,8 @@ import {
stripAllTimeForRequest
,
stripAllTimeForRequest
,
buildNumericYearsQueryString
,
buildNumericYearsQueryString
,
isSelectionCoveringAllOptions
,
isSelectionCoveringAllOptions
,
getResourceLibraryReportDateRangeFromTimeSelection
getResourceLibraryReportDateRangeFromTimeSelection
,
}
from
"./utils/resourceLibraryFilters"
;
}
from
"./utils/resourceLibraryFilters"
;
import
Message1
from
"./assets/images/message-icon1.png"
;
import
Message1
from
"./assets/images/message-icon1.png"
;
...
@@ -553,6 +556,8 @@ const getStatCountInfo = async () => {
...
@@ -553,6 +556,8 @@ const getStatCountInfo = async () => {
};
};
//国会听证会数据
const
hearingData
=
ref
([]);
const
searchThinktankText
=
ref
(
""
);
//搜索科技人物及观点
const
searchThinktankText
=
ref
(
""
);
//搜索科技人物及观点
// 智库列表
// 智库列表
const
cardList
=
ref
([
const
cardList
=
ref
([
...
@@ -1638,6 +1643,7 @@ const handleClickCate = cate => {
...
@@ -1638,6 +1643,7 @@ const handleClickCate = cate => {
handleGetThinkTankPolicyAdvice
();
handleGetThinkTankPolicyAdvice
();
}
else
if
(
cate
===
"国会听证会"
)
{
}
else
if
(
cate
===
"国会听证会"
)
{
resetResourceTabCommon
()
resetResourceTabCommon
()
handleGetThinkTankHearings
();
}
}
};
};
...
@@ -1787,6 +1793,8 @@ const surveySort = ref(null);
...
@@ -1787,6 +1793,8 @@ const surveySort = ref(null);
const
surveyFooterList
=
ref
([]);
const
surveyFooterList
=
ref
([]);
const
surveyCurrentPage
=
ref
(
1
);
const
surveyCurrentPage
=
ref
(
1
);
const
surveyTotal
=
ref
(
0
);
const
surveyTotal
=
ref
(
0
);
//国会听证会总数
const
projectTotal
=
ref
(
0
);
const
handleSurveyFilterChange
=
()
=>
{
const
handleSurveyFilterChange
=
()
=>
{
surveyCurrentPage
.
value
=
1
;
surveyCurrentPage
.
value
=
1
;
...
@@ -1817,7 +1825,22 @@ const handleGetThinkTankSurvey = async () => {
...
@@ -1817,7 +1825,22 @@ const handleGetThinkTankSurvey = async () => {
console
.
error
(
"获取调查项目 error"
,
error
);
console
.
error
(
"获取调查项目 error"
,
error
);
}
}
};
};
const
handleGetThinkTankHearings
=
async
()
=>
{
try
{
const
res
=
await
getThinkTankTestimonies
();
if
(
res
.
code
===
200
&&
res
.
data
)
{
hearingData
.
value
=
res
.
data
.
content
;
projectTotal
.
value
=
res
.
data
.
totalElements
;
}
else
{
hearingData
.
value
=
[];
projectTotal
.
value
=
0
;
}
}
catch
(
error
)
{
console
.
error
(
"获取调查项目 error"
,
error
);
}
};
// ===== 政策建议:独立状态(不影响智库报告/调查项目)=====
// ===== 政策建议:独立状态(不影响智库报告/调查项目)=====
const
policyFooterList
=
ref
([]);
const
policyFooterList
=
ref
([]);
const
policyCurrentPage
=
ref
(
1
);
const
policyCurrentPage
=
ref
(
1
);
...
@@ -2058,6 +2081,16 @@ const handleToReportDetail = item => {
...
@@ -2058,6 +2081,16 @@ const handleToReportDetail = item => {
});
});
window
.
open
(
route
.
href
,
"_blank"
);
window
.
open
(
route
.
href
,
"_blank"
);
};
};
const
handleToHearingDetail
=
item
=>
{
window
.
sessionStorage
.
setItem
(
"curTabName"
,
item
.
titleZh
);
const
route
=
router
.
resolve
({
name
:
"CongressHearingView"
,
params
:
{
id
:
item
.
id
}
});
window
.
open
(
route
.
href
,
"_blank"
);
};
const
handleToSurveyProjectView
=
item
=>
{
const
handleToSurveyProjectView
=
item
=>
{
window
.
sessionStorage
.
setItem
(
"curTabName"
,
item
.
name
);
window
.
sessionStorage
.
setItem
(
"curTabName"
,
item
.
name
);
const
route
=
router
.
resolve
({
const
route
=
router
.
resolve
({
...
...
src/views/thinkTank/reportOriginal/index.vue
浏览文件 @
9250fcda
...
@@ -14,7 +14,7 @@
...
@@ -14,7 +14,7 @@
</div>
</div>
<div
class=
"header-top-right"
>
<div
class=
"header-top-right"
>
<div
class=
"image-name-box"
>
<div
class=
"image-name-box"
>
<div
class=
"image"
>
<img
:src=
thinkInfo.thinkTankLogoUrl
alt=
""
/></div>
<div
class=
"image"
>
<img
:src=
"thinkInfo.thinkTankLogoUrl"
alt=
""
/></div>
<div
class=
"name"
>
{{
thinkInfo
.
thinkTankName
}}
</div>
<div
class=
"name"
>
{{
thinkInfo
.
thinkTankName
}}
</div>
</div>
</div>
<div
class=
"time"
>
{{
thinkInfo
.
times
}}
</div>
<div
class=
"time"
>
{{
thinkInfo
.
times
}}
</div>
...
@@ -242,14 +242,38 @@ const handleDownload = async () => {
...
@@ -242,14 +242,38 @@ const handleDownload = async () => {
}
}
}
}
/** 接口可能返回对象或数组;字段名兼容 snake/camel */
const
normalizeReportSummaryRow
=
(
row
)
=>
{
if
(
!
row
||
typeof
row
!==
"object"
)
return
{};
return
{
...
row
,
name
:
row
.
name
||
""
,
imageUrl
:
row
.
imageUrl
||
row
.
image
||
""
,
ename
:
row
.
ename
||
row
.
nameEn
||
row
.
englishName
||
""
,
times
:
row
.
times
||
row
.
postDate
||
""
,
thinkTankName
:
row
.
thinkTankName
||
row
.
thinktankName
||
""
,
thinkTankLogoUrl
:
row
.
thinkTankLogoUrl
||
row
.
thinktankLogo
||
""
};
};
const
applyReportOriginalDocumentTitle
=
(
title
)
=>
{
const
text
=
String
(
title
||
""
).
trim
();
if
(
!
text
)
return
;
window
.
sessionStorage
.
setItem
(
"reportOriginalTabName"
,
text
);
document
.
title
=
text
;
};
// 获取报告全局信息
// 获取报告全局信息
const
handleGetThinkTankReportSummary
=
async
()
=>
{
const
handleGetThinkTankReportSummary
=
async
()
=>
{
try
{
try
{
const
res
=
await
getThinkTankReportSummary
(
router
.
currentRoute
.
_value
.
params
.
id
);
const
res
=
await
getThinkTankReportSummary
(
router
.
currentRoute
.
_value
.
params
.
id
);
console
.
log
(
"报告全局信息"
,
res
);
console
.
log
(
"报告全局信息"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
if
(
res
.
code
===
200
&&
res
.
data
)
{
const
raw
=
res
.
data
;
thinkInfo
.
value
=
res
.
data
const
first
=
Array
.
isArray
(
raw
)
?
raw
[
0
]
:
raw
;
const
normalized
=
normalizeReportSummaryRow
(
first
);
thinkInfo
.
value
=
normalized
;
applyReportOriginalDocumentTitle
(
normalized
.
name
);
}
}
}
catch
(
error
)
{
}
catch
(
error
)
{
console
.
error
(
"获取报告全局信息error"
,
error
);
console
.
error
(
"获取报告全局信息error"
,
error
);
...
...
src/views/thinkTank/utils/piechart.js
浏览文件 @
9250fcda
...
@@ -40,7 +40,7 @@ const getPieChart = (data) => {
...
@@ -40,7 +40,7 @@ const getPieChart = (data) => {
const
value
=
params
.
value
??
""
;
const
value
=
params
.
value
??
""
;
const
percent
=
params
.
percent
!=
null
?
Math
.
round
(
params
.
percent
)
:
0
;
const
percent
=
params
.
percent
!=
null
?
Math
.
round
(
params
.
percent
)
:
0
;
return
`{name|
${
name
}
}\n{time|
${
value
}
项
${
percent
}
%}`
;
return
`{name|
${
name
}
}\n{time|
${
percent
}
%}`
;
},
},
minMargin
:
5
,
minMargin
:
5
,
edgeDistance
:
10
,
edgeDistance
:
10
,
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论