Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
R
risk-monitor
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
蔡建
risk-monitor
Commits
43550109
提交
43550109
authored
4月 01, 2026
作者:
张伊明
浏览文件
操作
浏览文件
下载
差异文件
合并分支 'zz-dev' 到 'pre'
feat:调查项目及国会听证会的详情页面及列表的样式与功能的开发 查看合并请求
!294
上级
83e5627a
b708ffdd
流水线
#279
已通过 于阶段
in 1 分 25 秒
变更
16
流水线
2
全部展开
显示空白字符变更
内嵌
并排
正在显示
16 个修改的文件
包含
342 行增加
和
250 行删除
+342
-250
overview.js
src/api/thinkTank/overview.js
+100
-1
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
+0
-0
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
+11
-12
index.vue
...k/ThinkTankDetail/thinkDynamics/ThinkTankReport/index.vue
+8
-9
index.vue
src/views/thinkTank/ThinkTankDetail/thinkDynamics/index.vue
+0
-0
HomeMainFooterMain.vue
src/views/thinkTank/components/HomeMainFooterMain.vue
+6
-1
HomeMainFooterSurvey.vue
src/views/thinkTank/components/HomeMainFooterSurvey.vue
+15
-23
ThinkTankCongressHearingOverview.vue
...thinkTank/components/ThinkTankCongressHearingOverview.vue
+26
-88
ThinkTankPolicyAdviceOverview.vue
...ws/thinkTank/components/ThinkTankPolicyAdviceOverview.vue
+7
-2
index.vue
src/views/thinkTank/index.vue
+51
-22
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
浏览文件 @
43550109
...
...
@@ -91,7 +91,7 @@ export function getHylyList() {
/**
* 智库概览/智库动态-智库报告
、调查项目
* 智库概览/智库动态-智库报告
* GET /api/thinkTankOverview/report
* 常用 query:pageNum, pageSize, sortFun, domainIds, startDate, endDate, category(调查项目), thinkTankId(详情页), keyword(动态搜索)
*/
...
...
@@ -103,6 +103,68 @@ export function getThinkTankReport(params) {
})
}
//智库概览调查项目
export
function
getThinkTankProjects
(
params
)
{
return
request
({
method
:
'GET'
,
url
:
`/api/think-tank/projects`
,
params
})
}
//智库概览页国会听证会
export
function
getThinkTankTestimonies
()
{
return
request
({
method
:
'GET'
,
url
:
`/api/think-tank/testimonies`
,
})
}
//智库调查项目详情主页
export
function
getThinkTankProjectsInfo
(
params
)
{
return
request
({
method
:
'GET'
,
url
:
`/api/think-tank/projects/
${
params
.
id
}
`
,
})
}
//智库国会听证会详情主页
export
function
getThinkTankHearingInfo
(
params
)
{
return
request
({
method
:
'GET'
,
url
:
`/api/think-tank/testimonies/
${
params
.
id
}
`
,
})
}
// 智库详情-调查项目(按智库 id)
export
function
getThinkTankProjectsByThinkTankId
(
params
)
{
return
request
({
method
:
'GET'
,
url
:
`/api/think-tank/
${
params
.
thinkTankId
}
/projects`
,
params
:
{
pageNum
:
params
.
pageNum
,
pageSize
:
params
.
pageSize
,
}
})
}
// 智库动态-国会听证会(按智库 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
)
{
return
request
({
method
:
'GET'
,
url
:
`/api/think-tank/projects/
${
params
.
id
}
/team`
,
})
}
// 智库概览:政策建议(资源库-政策建议)
export
function
getThinkTankOverviewPolicy
(
params
)
{
return
request
({
...
...
@@ -378,6 +440,15 @@ export const getThinkTankReportRelated = (params) => {
}
);
}
//调查项目:获取项目报告
export
const
getThinkTankProjectRelated
=
(
params
)
=>
{
return
request
(
{
method
:
'GET'
,
url
:
`/api/think-tank/projects/
${
params
}
/reports`
,
}
);
}
//获取报告原文
export
const
getThinkTankReportcontentUrl
=
(
params
)
=>
{
...
...
@@ -424,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
)
{
return
request
({
...
...
@@ -440,6 +525,20 @@ export function getThinkTankReportIndustryCloud(params) {
url
:
`/api/thinkTankReport/keyword/
${
params
.
id
}
`
,
})
}
//获取调查项目词云
export
function
getThinkTankProjectCloud
(
params
)
{
return
request
({
method
:
'GET'
,
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
)
{
...
...
src/router/modules/thinktank.js
浏览文件 @
43550109
...
...
@@ -41,17 +41,31 @@ const thinktankRoutes = [
path
:
"/thinkTank/reportOriginal/:id"
,
name
:
"ReportOriginal"
,
component
:
ReportOriginal
,
meta
:
{
title
:
"报告原文"
,
dynamicTitle
:
true
,
titleStorageKey
:
"reportOriginalTabName"
}
},
{
path
:
"/thinkTank/SurveyProjectView/:id"
,
name
:
"SurveyProjectView"
,
component
:
SurveyProjectView
,
meta
:
{
title
:
"调查项目"
,
dynamicTitle
:
true
,
titleStorageKey
:
"surveyProjectTabName"
}
},
{
path
:
"/thinkTank/CongressHearingView/:id"
,
name
:
"CongressHearingView"
,
component
:
CongressHearingView
,
meta
:
{
title
:
"国会听证会"
,
dynamicTitle
:
true
,
titleStorageKey
:
"congressHearingTabName"
}
},
{
path
:
"/thinkTank/allThinkTank"
,
...
...
src/views/thinkTank/CongressHearingView/index.vue
浏览文件 @
43550109
...
...
@@ -4,18 +4,18 @@
<div
class=
"header"
>
<div
class=
"header-top"
>
<div
class=
"header-top-left"
>
<img
src=
"../assets/images/box1-logo.png"
alt=
""
/>
<img
:src=
thinkInfo.coverImgUrl
alt=
""
/>
<div>
<div
class=
"title"
>
{{
thinkInfo
.
name
}}
</div>
<div
class=
"title"
>
{{
thinkInfo
.
titleZh
}}
</div>
<div
class=
"en-title"
>
{{
thinkInfo
.
ename
}}
.
{{
thinkInfo
.
times
}}
{{
thinkInfo
.
testimonyDate
}}
·
{{
"国会听证会"
}}
·
{{
thinkInfo
.
committeeZh
}}
</div>
<div
class=
"tag-box"
>
<!--
<div
class=
"tag-box"
v-for=
"value,index in thinkInfo.tags"
:key=
"index"
>
<div
class=
"tag"
>
{{
value
.
industryName
}}
</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>
...
...
@@ -155,7 +155,7 @@
<div
class=
"box3-main"
>
<AiSummary>
<
template
#
summary-content
>
{{
box1Data
}}
{{
thinkInfo
.
descriptionZh
}}
</
template
>
</AiSummary>
...
...
@@ -180,10 +180,9 @@
{{ index + 1 }}
</div>
<div
class=
"center"
>
<div
class=
"title"
v-html=
"highlightOpinionText(item.
title
Zh)"
></div>
<div
class=
"title"
v-html=
"highlightOpinionText(item.
question
Zh)"
></div>
<div>
<img
src=
"./images/image-open.png"
alt=
""
class=
"center-image"
@
click=
"handleOpenReportOriginal(item)"
/>
<img
src=
"./images/image-open.png"
alt=
""
class=
"center-image"
/>
</div>
<div>
<img
v-if=
"!isOpinionExpanded(item, index)"
src=
"./images/image-down.png"
alt=
""
...
...
@@ -194,7 +193,7 @@
</div>
</div>
<div
v-if=
"isOpinionExpanded(item, index)"
class=
"desc"
v-html=
"highlightOpinionText(item.
content
Zh)"
>
v-html=
"highlightOpinionText(item.
answer
Zh)"
>
</div>
<!-- <div class="right"> -->
<!-- <div class="tag" v-for="(val, idx) in item.hylyList" :key="idx">
...
...
@@ -239,7 +238,10 @@ import {
getThinkTankReportContent
,
getThinkTankReportIndustry
,
getThinkTankReportIndustryCloud
,
getThinkTankReportViewpoint
getThinkTankReportViewpoint
,
getThinkTankHearingInfo
,
getThinkTankHearingCloud
,
getThinkTankHearingViewpoint
}
from
"@/api/thinkTank/overview"
;
import
{
getChartAnalysis
}
from
"@/api/aiAnalysis/index"
;
import
{
useRouter
}
from
"vue-router"
;
...
...
@@ -270,15 +272,39 @@ const props = defineProps({
}
});
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
=
"
智库报告
关键词云,数据来源:美国兰德公司官网"
;
"
国会听证会
关键词云,数据来源:美国兰德公司官网"
;
// 刷新后默认展示「报告关键词云」AI 总结
const
isShowAiContentBox5
=
ref
(
true
);
const
aiContentBox5
=
ref
(
""
);
...
...
@@ -464,19 +490,19 @@ const hasBox5ChartData = computed(() => Array.isArray(box5Data.value) && box5Dat
/** 词云子组件不 watch 数据,每次接口成功有数据时递增 key,强制重新挂载以触发 onMounted */
const
box5WordCloudKey
=
ref
(
0
);
//获取
科技领域
词云
//获取
国会听证会
词云
const
handleGetThinkTankReportIndustryCloud
=
async
()
=>
{
try
{
const
params
=
{
id
:
router
.
currentRoute
.
_value
.
params
.
id
// industryId: activeArea.value
};
const
res
=
await
getThinkTank
ReportIndustry
Cloud
(
params
);
const
res
=
await
getThinkTank
Hearing
Cloud
(
params
);
console
.
log
(
"科技领域词云"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
const
data
=
(
res
.
data
||
[]).
map
(
item
=>
({
name
:
item
.
claus
e
,
value
:
item
.
count
name
:
item
.
nam
e
,
value
:
item
.
value
}));
// 该接口数据用于「报告关键词云」
box5Data
.
value
=
data
;
...
...
@@ -566,18 +592,17 @@ const handleCurrentChange = page => {
handleGetThinkTankReportViewpoint
();
};
// 获取报告
核心论点
(支持搜索)
// 获取报告
听证会
(支持搜索)
const
handleGetThinkTankReportViewpoint
=
async
()
=>
{
try
{
const
params
=
{
report
Id
:
router
.
currentRoute
.
_value
.
params
.
id
,
currentPage
:
currentPage
.
value
-
1
,
testimony
Id
:
router
.
currentRoute
.
_value
.
params
.
id
,
pageNum
:
currentPage
.
value
,
pageSize
:
pageSize
.
value
,
keyword
:
(
searchOpinions
.
value
||
""
).
trim
(),
orgIds
:
""
};
const
res
=
await
getThinkTank
Report
Viewpoint
(
params
);
console
.
log
(
"
核心论点
"
,
res
.
data
);
const
res
=
await
getThinkTank
Hearing
Viewpoint
(
params
);
console
.
log
(
"
听证会内容
"
,
res
.
data
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
const
nextOpinions
=
res
.
data
.
content
||
[];
majorOpinions
.
value
=
nextOpinions
;
...
...
@@ -672,6 +697,7 @@ onMounted(() => {
handleGetThinkTankReportIndustry
();
handleGetThinkTankReportIndustryCloud
();
handleGetThinkTankHearingInfo
();
});
</
script
>
...
...
@@ -1484,6 +1510,7 @@ onMounted(() => {
height
:
24px
;
margin-top
:
12px
;
margin-left
:
18px
;
cursor
:
pointer
;
}
...
...
@@ -1533,8 +1560,8 @@ onMounted(() => {
padding-top
:
22px
;
padding-bottom
:
23px
;
padding-left
:
56px
;
// 24(left) + 13(center margin) + 一点间距
padding-left
:
56px
;
padding-right
:
56px
;
color
:
rgb
(
59
,
65
,
75
);
font-family
:
"Source Han Sans CN"
;
font-weight
:
400
;
...
...
src/views/thinkTank/SurveyProjectView/index.vue
浏览文件 @
43550109
差异被折叠。
点击展开。
src/views/thinkTank/ThinkTankDetail/PolicyTracking/utils/piechart.js
浏览文件 @
43550109
...
...
@@ -32,7 +32,7 @@ const getPieChart = (data) => {
const
value
=
params
.
value
??
""
;
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
,
edgeDistance
:
20
,
...
...
src/views/thinkTank/ThinkTankDetail/thinkDynamics/CongressHearing/index.vue
浏览文件 @
43550109
...
...
@@ -21,10 +21,7 @@
<div
class=
"title"
>
{{
"科技领域"
}}
</div>
</div>
<div
class=
"select-main"
>
<el-checkbox-group
class=
"checkbox-group"
:model-value=
"selectedResearchIds"
@
change=
"handleAreaGroupChange"
>
<el-checkbox-group
class=
"checkbox-group"
:model-value=
"selectedResearchIds"
@
change=
"handleAreaGroupChange"
>
<el-checkbox
class=
"filter-checkbox"
:label=
"RESOURCE_FILTER_ALL_AREA"
>
{{
RESOURCE_FILTER_ALL_AREA
}}
</el-checkbox>
...
...
@@ -40,9 +37,7 @@
<div
class=
"title"
>
{{
"发布时间"
}}
</div>
</div>
<div
class=
"select-main"
>
<el-checkbox-group
class=
"checkbox-group"
:model-value=
"selectedResearchTimeIds"
<el-checkbox-group
class=
"checkbox-group"
:model-value=
"selectedResearchTimeIds"
@
change=
"handleTimeGroupChange"
>
<el-checkbox
class=
"filter-checkbox"
:label=
"RESOURCE_FILTER_ALL_TIME"
>
{{
RESOURCE_FILTER_ALL_TIME
}}
...
...
@@ -62,9 +57,7 @@
<div
class=
"title"
>
{{
"听证会部门"
}}
</div>
</div>
<div
class=
"select-main"
>
<el-checkbox-group
class=
"checkbox-group"
:model-value=
"selectedResearchHearingIds"
<el-checkbox-group
class=
"checkbox-group"
:model-value=
"selectedResearchHearingIds"
@
change=
"handleDeptGroupChange"
>
<el-checkbox
class=
"filter-checkbox"
:label=
"RESOURCE_FILTER_ALL_DEPT"
>
{{
RESOURCE_FILTER_ALL_DEPT
}}
...
...
@@ -82,31 +75,33 @@
<div
class=
"right"
>
<div
class=
"card-box"
>
<div
class=
"card-content"
>
<div
v-for=
"(item, index) in displayList"
:key=
"item.id"
>
<div
class=
"card-item"
>
<img
class=
"card-item-img"
src=
"../images/img congress.png"
alt=
"report image"
/>
<div
v-for=
"(item, index) in hearingData"
:key=
"item.id"
>
<div
class=
"card-item"
@
click=
"handleToReportDetail(item)"
>
<img
class=
"card-item-img"
:src=
"item.coverImgUrl"
alt=
"report image"
/>
<div
class=
"card-item-text"
>
<div
class=
"card-item-title"
>
<span
v-html=
"highlightText(item.title)"
></span>
</div>
<div
class=
"card-item-time"
>
<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
class=
"card-item-category"
>
{{
item
.
category
}}
</div>
<div
class=
"card-item-category"
v-if=
"item.category"
>
{{
item
.
category
}}
</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
class=
"right-footer"
>
<div
class=
"info"
>
共
{{
filteredHearingData
.
length
}}
篇智库报告
共
{{
total
}}
篇智库报告
</div>
<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"
/>
</div>
</div>
...
...
@@ -262,42 +257,9 @@ const handleDeptGroupChange = (val) => {
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
=
()
=>
{
...
...
@@ -542,7 +504,7 @@ const handleToReportDetail = item => {
width
:
100%
;
height
:
77px
;
display
:
flex
;
align-items
:
center
;
...
...
@@ -555,11 +517,9 @@ const handleToReportDetail = item => {
}
.card-item-text
{
flex
:
1
;
min-width
:
0
;
flex-direction
:
column
;
justify-content
:
space-between
;
display
:
flex
;
...
...
@@ -592,6 +552,7 @@ const handleToReportDetail = item => {
height
:
16px
;
margin-left
:
9px
;
margin-top
:
3px
;
cursor
:
pointer
;
}
}
...
...
src/views/thinkTank/ThinkTankDetail/thinkDynamics/SurveyForm/index.vue
浏览文件 @
43550109
...
...
@@ -21,10 +21,7 @@
<div
class=
"title"
>
{{
"科技领域"
}}
</div>
</div>
<div
class=
"select-main"
>
<el-checkbox-group
class=
"checkbox-group"
:model-value=
"selectedResearchIds"
@
change=
"handleAreaGroupChange"
>
<el-checkbox-group
class=
"checkbox-group"
:model-value=
"selectedResearchIds"
@
change=
"handleAreaGroupChange"
>
<el-checkbox
class=
"filter-checkbox"
:label=
"RESOURCE_FILTER_ALL_AREA"
>
{{
RESOURCE_FILTER_ALL_AREA
}}
</el-checkbox>
...
...
@@ -40,9 +37,7 @@
<div
class=
"title"
>
{{
"发布时间"
}}
</div>
</div>
<div
class=
"select-main"
>
<el-checkbox-group
class=
"checkbox-group"
:model-value=
"selectedResearchTimeIds"
<el-checkbox-group
class=
"checkbox-group"
:model-value=
"selectedResearchTimeIds"
@
change=
"handleTimeGroupChange"
>
<el-checkbox
class=
"filter-checkbox"
:label=
"RESOURCE_FILTER_ALL_TIME"
>
{{
RESOURCE_FILTER_ALL_TIME
}}
...
...
@@ -62,14 +57,14 @@
<div
class=
"footer-card"
v-for=
"(item, index) in curFooterList"
:key=
"index"
@
click=
"handleToReportDetail(item)"
>
<div
class=
"footer-card-top"
>
<img
:src=
"item.imageUrl"
alt=
""
/>
<img
:src=
item.projectCoverImgUrl
alt=
""
/>
</div>
<div
class=
"footer-card-title"
>
<span
v-html=
"highlightText(item.
name
)"
></span>
<span
v-html=
"highlightText(item.
projectNameZh
)"
></span>
</div>
<div
class=
"footer-card-footer"
>
<div
class=
"time"
>
{{
item
.
times
}}
</div>
<div
class=
"from"
>
{{
item
.
think
T
ankName
}}
</div>
<div
class=
"time"
>
{{
formatDate
(
item
.
startDate
)
}}
</div>
<div
class=
"from"
>
{{
item
.
think
t
ankName
}}
</div>
</div>
</div>
</div>
...
...
@@ -94,7 +89,11 @@ import {
stripAllAreaForRequest
,
stripAllTimeForRequest
}
from
"../../../utils/resourceLibraryFilters"
;
const
formatDate
=
(
str
)
=>
{
if
(
!
str
)
return
''
const
[
y
,
m
,
d
]
=
str
.
split
(
'T'
)[
0
].
split
(
'-'
)
return
`
${
y
}
年
${
+
m
}
月
${
+
d
}
日`
};
const
props
=
defineProps
({
researchTypeList
:
{
type
:
Array
,
...
...
src/views/thinkTank/ThinkTankDetail/thinkDynamics/ThinkTankReport/index.vue
浏览文件 @
43550109
...
...
@@ -21,10 +21,7 @@
<div
class=
"title"
>
{{
"科技领域"
}}
</div>
</div>
<div
class=
"select-main"
>
<el-checkbox-group
class=
"checkbox-group"
:model-value=
"selectedResearchIds"
@
change=
"handleAreaGroupChange"
>
<el-checkbox-group
class=
"checkbox-group"
:model-value=
"selectedResearchIds"
@
change=
"handleAreaGroupChange"
>
<el-checkbox
class=
"filter-checkbox"
:label=
"RESOURCE_FILTER_ALL_AREA"
>
{{
RESOURCE_FILTER_ALL_AREA
}}
</el-checkbox>
...
...
@@ -40,9 +37,7 @@
<div
class=
"title"
>
{{
"发布时间"
}}
</div>
</div>
<div
class=
"select-main"
>
<el-checkbox-group
class=
"checkbox-group"
:model-value=
"selectedResearchTimeIds"
<el-checkbox-group
class=
"checkbox-group"
:model-value=
"selectedResearchTimeIds"
@
change=
"handleTimeGroupChange"
>
<el-checkbox
class=
"filter-checkbox"
:label=
"RESOURCE_FILTER_ALL_TIME"
>
{{
RESOURCE_FILTER_ALL_TIME
}}
...
...
@@ -68,7 +63,7 @@
<span
v-html=
"highlightText(item.name)"
></span>
</div>
<div
class=
"footer-card-footer"
>
<div
class=
"time"
>
{{
item
.
times
}}
</div>
<div
class=
"time"
>
{{
formatDate
(
item
.
times
)
}}
</div>
<div
class=
"from"
>
{{
item
.
thinkTankName
}}
</div>
</div>
</div>
...
...
@@ -94,7 +89,11 @@ import {
stripAllAreaForRequest
,
stripAllTimeForRequest
}
from
"../../../utils/resourceLibraryFilters"
;
const
formatDate
=
(
str
)
=>
{
if
(
!
str
)
return
''
const
[
y
,
m
,
d
]
=
str
.
split
(
'T'
)[
0
].
split
(
'-'
)
return
`
${
y
}
年
${
+
m
}
月
${
+
d
}
日`
};
const
props
=
defineProps
({
researchTypeList
:
{
type
:
Array
,
...
...
src/views/thinkTank/ThinkTankDetail/thinkDynamics/index.vue
浏览文件 @
43550109
差异被折叠。
点击展开。
src/views/thinkTank/components/HomeMainFooterMain.vue
浏览文件 @
43550109
...
...
@@ -47,7 +47,7 @@
{{
item
.
name
}}
</div>
<div
class=
"footer-card-footer"
>
<div
class=
"time"
>
{{
item
.
times
}}
</div>
<div
class=
"time"
>
{{
formatDate
(
item
.
times
)
}}
</div>
<div
class=
"from"
>
{{
item
.
thinkTankName
}}
</div>
</div>
</div>
...
...
@@ -97,6 +97,11 @@ const handleTimeGroupChange = (val) => {
emit
(
"update:selectedPubTimeList"
,
normalizeExclusiveAllOption
(
val
,
RESOURCE_FILTER_ALL_TIME
));
emit
(
"filter-change"
);
};
const
formatDate
=
(
str
)
=>
{
if
(
!
str
)
return
''
const
[
y
,
m
,
d
]
=
str
.
split
(
'T'
)[
0
].
split
(
'-'
)
return
`
${
y
}
年
${
+
m
}
月
${
+
d
}
日`
};
</
script
>
<
style
lang=
"scss"
scoped
>
...
...
src/views/thinkTank/components/HomeMainFooterSurvey.vue
浏览文件 @
43550109
...
...
@@ -8,18 +8,11 @@
<div
class=
"title"
>
{{
"科技领域"
}}
</div>
</div>
<div
class=
"select-main"
>
<el-checkbox-group
class=
"checkbox-group"
:model-value=
"selectedAreaList"
@
change=
"handleAreaGroupChange"
>
<el-checkbox-group
class=
"checkbox-group"
:model-value=
"selectedAreaList"
@
change=
"handleAreaGroupChange"
>
<el-checkbox
class=
"filter-checkbox all-checkbox"
:label=
"RESOURCE_FILTER_ALL_AREA"
>
{{
RESOURCE_FILTER_ALL_AREA
}}
</el-checkbox>
<el-checkbox
v-for=
"research in areaList"
:key=
"research.id"
class=
"filter-checkbox"
:label=
"research.id"
>
<el-checkbox
v-for=
"research in areaList"
:key=
"research.id"
class=
"filter-checkbox"
:label=
"research.id"
>
{{
research
.
name
}}
</el-checkbox>
</el-checkbox-group>
...
...
@@ -32,18 +25,11 @@
<div
class=
"title"
>
{{
"发布时间"
}}
</div>
</div>
<div
class=
"select-main"
>
<el-checkbox-group
class=
"checkbox-group"
:model-value=
"selectedPubTimeList"
@
change=
"handleTimeGroupChange"
>
<el-checkbox-group
class=
"checkbox-group"
:model-value=
"selectedPubTimeList"
@
change=
"handleTimeGroupChange"
>
<el-checkbox
class=
"filter-checkbox all-checkbox"
:label=
"RESOURCE_FILTER_ALL_TIME"
>
{{
RESOURCE_FILTER_ALL_TIME
}}
</el-checkbox>
<el-checkbox
v-for=
"time in pubTimeList"
:key=
"time.id"
class=
"filter-checkbox"
:label=
"time.id"
>
<el-checkbox
v-for=
"time in pubTimeList"
:key=
"time.id"
class=
"filter-checkbox"
:label=
"time.id"
>
{{
time
.
name
}}
</el-checkbox>
</el-checkbox-group>
...
...
@@ -56,14 +42,14 @@
<div
class=
"footer-card"
v-for=
"(item, index) in curFooterList"
:key=
"index"
@
click=
"emit('report-click', item)"
>
<div
class=
"footer-card-top"
>
<img
:src=
"item.
image
Url"
alt=
""
/>
<img
:src=
"item.
projectCoverImg
Url"
alt=
""
/>
</div>
<div
class=
"footer-card-title"
>
{{
item
.
name
}}
{{
item
.
projectNameZh
}}
</div>
<div
class=
"footer-card-footer"
>
<div
class=
"time"
>
{{
item
.
times
}}
</div>
<div
class=
"from"
>
{{
item
.
think
T
ankName
}}
</div>
<div
class=
"time"
>
{{
formatDate
(
item
.
startDate
)
}}
</div>
<div
class=
"from"
>
{{
item
.
think
t
ankName
}}
</div>
</div>
</div>
</div>
...
...
@@ -94,7 +80,11 @@ defineProps({
total
:
{
type
:
Number
,
default
:
0
},
currentPage
:
{
type
:
Number
,
default
:
1
}
});
const
formatDate
=
(
str
)
=>
{
if
(
!
str
)
return
''
const
[
y
,
m
,
d
]
=
str
.
split
(
'T'
)[
0
].
split
(
'-'
)
return
`
${
y
}
年
${
+
m
}
月
${
+
d
}
日`
};
const
emit
=
defineEmits
([
"update:selectedAreaList"
,
"update:selectedPubTimeList"
,
...
...
@@ -190,12 +180,14 @@ const handleTimeGroupChange = (val) => {
flex-wrap
:
wrap
;
gap
:
16px
16px
;
.footer-card
{
width
:
398px
;
height
:
300px
;
border-radius
:
10px
;
box-shadow
:
0px
0px
20px
0px
rgba
(
25
,
69
,
130
,
0
.1
);
background
:
rgba
(
255
,
255
,
255
,
1
);
cursor
:
pointer
;
.footer-card-top
{
width
:
364px
;
...
...
src/views/thinkTank/components/ThinkTankCongressHearingOverview.vue
浏览文件 @
43550109
...
...
@@ -7,18 +7,11 @@
<div
class=
"title"
>
{{
"科技领域"
}}
</div>
</div>
<div
class=
"select-main"
>
<el-checkbox-group
class=
"checkbox-group"
:model-value=
"selectedResearchIds"
@
change=
"handleAreaGroupChange"
>
<el-checkbox-group
class=
"checkbox-group"
:model-value=
"selectedResearchIds"
@
change=
"handleAreaGroupChange"
>
<el-checkbox
class=
"filter-checkbox"
:label=
"RESOURCE_FILTER_ALL_AREA"
>
{{
RESOURCE_FILTER_ALL_AREA
}}
</el-checkbox>
<el-checkbox
v-for=
"type in researchTypeList"
:key=
"type.id"
class=
"filter-checkbox"
:label=
"type.id"
>
<el-checkbox
v-for=
"type in researchTypeList"
:key=
"type.id"
class=
"filter-checkbox"
:label=
"type.id"
>
{{
type
.
name
}}
</el-checkbox>
</el-checkbox-group>
...
...
@@ -31,18 +24,12 @@
<div
class=
"title"
>
{{
"发布时间"
}}
</div>
</div>
<div
class=
"select-main"
>
<el-checkbox-group
class=
"checkbox-group"
:model-value=
"selectedResearchTimeIds"
<el-checkbox-group
class=
"checkbox-group"
:model-value=
"selectedResearchTimeIds"
@
change=
"handleTimeGroupChange"
>
<el-checkbox
class=
"filter-checkbox"
:label=
"RESOURCE_FILTER_ALL_TIME"
>
{{
RESOURCE_FILTER_ALL_TIME
}}
</el-checkbox>
<el-checkbox
v-for=
"type in researchTimeList"
:key=
"type.id"
class=
"filter-checkbox"
:label=
"type.id"
>
<el-checkbox
v-for=
"type in researchTimeList"
:key=
"type.id"
class=
"filter-checkbox"
:label=
"type.id"
>
{{
type
.
name
}}
</el-checkbox>
</el-checkbox-group>
...
...
@@ -55,18 +42,12 @@
<div
class=
"title"
>
{{
"听证会部门"
}}
</div>
</div>
<div
class=
"select-main"
>
<el-checkbox-group
class=
"checkbox-group hearing-grid"
:model-value=
"selectedResearchHearingIds"
<el-checkbox-group
class=
"checkbox-group hearing-grid"
:model-value=
"selectedResearchHearingIds"
@
change=
"handleDeptGroupChange"
>
<el-checkbox
class=
"filter-checkbox"
:label=
"RESOURCE_FILTER_ALL_DEPT"
>
{{
RESOURCE_FILTER_ALL_DEPT
}}
</el-checkbox>
<el-checkbox
v-for=
"type in researchHearingList"
:key=
"type.id"
class=
"filter-checkbox"
:label=
"type.id"
>
<el-checkbox
v-for=
"type in researchHearingList"
:key=
"type.id"
class=
"filter-checkbox"
:label=
"type.id"
>
{{
type
.
name
}}
</el-checkbox>
</el-checkbox-group>
...
...
@@ -77,35 +58,34 @@
<div
class=
"right"
>
<div
class=
"card-box"
>
<div
class=
"card-content"
>
<div
v-for=
"(item, index) in displayList"
:key=
"item.id ?? index"
>
<div
class=
"card-item"
@
click=
"emit('report-click', item)"
>
<img
class=
"card-item-img"
src=
"../ThinkTankDetail/thinkDynamics/images/img congress.png"
alt=
"report image"
/>
<div
v-for=
"(item, index) in hearingData"
:key=
"item.id ?? index"
>
<div
class=
"card-item"
>
<img
class=
"card-item-img"
:src=
item.coverImgUrl
alt=
"report image"
/>
<div
class=
"card-item-text"
>
<div
class=
"card-item-title"
>
{{
item
.
title
}}
{{
item
.
title
Zh
}}
</div>
<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"
class=
"card-open-image"
/>
class=
"card-open-image"
@
click=
"emit('report-click', item)"
/>
</div>
<div
class=
"card-item-category"
>
<div
class=
"card-item-category"
v-if=
"item.category"
>
<AreaTag
:key=
"`cat-$
{item.id}`" :tagName="item.category" />
</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
class=
"right-footer"
>
<div
class=
"info"
>
共
{{
filteredH
earingData
.
length
}}
篇智库报告
共
{{
h
earingData
.
length
}}
篇智库报告
</div>
<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"
/>
</div>
</div>
...
...
@@ -131,6 +111,8 @@ import {
const
props
=
defineProps
({
researchTypeList
:
{
type
:
Array
,
default
:
()
=>
[]
},
researchTimeList
:
{
type
:
Array
,
default
:
()
=>
[]
},
hearingData
:
{
type
:
Array
,
default
:
()
=>
[]
},
total
:
{
type
:
Number
,
default
:
0
}
});
const
emit
=
defineEmits
([
"report-click"
]);
...
...
@@ -142,25 +124,10 @@ const selectedResearchIds = ref([RESOURCE_FILTER_ALL_AREA]);
const
selectedResearchTimeIds
=
ref
([
RESOURCE_FILTER_ALL_TIME
]);
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
([
{
id
:
"美中经济与安全审查委员会"
,
name
:
"美中经济与安全审查委员会"
},
{
id
:
"国会-行政部门中国委员会"
,
name
:
"国会-行政部门中国委员会"
},
{
id
:
"美国商务部"
,
name
:
"美国商务部"
},
]);
const
handleAreaGroupChange
=
(
val
)
=>
{
...
...
@@ -178,39 +145,9 @@ const handleDeptGroupChange = (val) => {
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
=>
{
currentPage
.
value
=
page
;
...
...
@@ -354,7 +291,7 @@ const handlePageChange = page => {
width
:
100%
;
height
:
77px
;
display
:
flex
;
align-items
:
center
;
.card-item-img
{
width
:
56px
;
...
...
@@ -364,8 +301,8 @@ const handlePageChange = page => {
}
.card-item-text
{
flex
:
1
;
min-width
:
0
;
display
:
flex
;
flex-direction
:
column
;
...
...
@@ -394,6 +331,7 @@ const handlePageChange = page => {
height
:
16px
;
margin-left
:
9px
;
margin-top
:
3px
;
cursor
:
pointer
;
}
}
...
...
src/views/thinkTank/components/ThinkTankPolicyAdviceOverview.vue
浏览文件 @
43550109
...
...
@@ -47,7 +47,8 @@
<div
class=
"card-item-text"
>
<div
class=
"card-item-title"
>
{{
item
.
name
}}
</div>
<div
class=
"card-item-time"
>
<span
class=
"info-text"
>
{{
item
.
times
}}
·
{{
item
.
thinkTankName
}}
·
{{
item
.
reportName
}}
</span>
<span
class=
"info-text"
>
{{
formatDate
(
item
.
times
)
}}
·
{{
item
.
thinkTankName
}}
·
{{
item
.
reportName
}}
</span>
<div
class=
"card-open-image"
@
click
.
stop=
"handleOpenReportOriginal(item)"
>
<img
src=
"@/views/thinkTank/ThinkTankDetail/thinkDynamics/images/image open.png"
alt=
""
/>
</div>
...
...
@@ -125,7 +126,11 @@ const handleOpenReportOriginal = (item) => {
})
window
.
open
(
route
.
href
,
"_blank"
)
}
const
formatDate
=
(
str
)
=>
{
if
(
!
str
)
return
''
const
[
y
,
m
,
d
]
=
str
.
split
(
'T'
)[
0
].
split
(
'-'
)
return
`
${
y
}
年
${
+
m
}
月
${
+
d
}
日`
};
/** 政策建议关联法案:新标签页打开法案介绍页,billId 随接口 id 变化 */
const
handleBillMoreClick
=
(
bill
)
=>
{
const
billId
=
bill
?.
id
;
...
...
src/views/thinkTank/index.vue
浏览文件 @
43550109
...
...
@@ -365,15 +365,17 @@
v-model:selectedAreaList=
"surveySelectedAreaList"
:pub-time-list=
"pubTimeList"
v-model:selectedPubTimeList=
"surveySelectedPubTimeList"
@
filter-change=
"handleSurveyFilterChange"
:cur-footer-list=
"surveyFooterList"
:total=
"surveyTotal"
:current-page=
"surveyCurrentPage"
@
report-click=
"handleTo
ReportDetail
"
@
page-change=
"handleSurveyCurrentChange"
/>
@
report-click=
"handleTo
SurveyProjectView
"
@
page-change=
"handleSurveyCurrentChange"
/>
<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"
:research-time-list=
"pubTimeList"
:list=
"policyFooterList"
:total=
"policyTotal"
:current-page=
"policyCurrentPage"
:page-size=
"7"
@
filter-change=
"handlePolicyFilterChange"
@
page-change=
"handlePolicyCurrentChange"
/>
</div>
</div>
</div>
...
...
@@ -407,7 +409,9 @@ import {
getThinkTankReport
,
getThinkTankOverviewPolicy
,
getThinkTankReportNews
,
getThinkTankReportRemarks
getThinkTankReportRemarks
,
getThinkTankProjects
,
getThinkTankTestimonies
}
from
"@/api/thinkTank/overview"
;
import
{
getPersonSummaryInfo
}
from
"@/api/common/index"
;
import
getMultiLineChart
from
"./utils/multiLineChart"
;
...
...
@@ -432,7 +436,8 @@ import {
stripAllTimeForRequest
,
buildNumericYearsQueryString
,
isSelectionCoveringAllOptions
,
getResourceLibraryReportDateRangeFromTimeSelection
getResourceLibraryReportDateRangeFromTimeSelection
,
}
from
"./utils/resourceLibraryFilters"
;
import
Message1
from
"./assets/images/message-icon1.png"
;
...
...
@@ -552,6 +557,8 @@ const getStatCountInfo = async () => {
};
//国会听证会数据
const
hearingData
=
ref
([]);
const
searchThinktankText
=
ref
(
""
);
//搜索科技人物及观点
// 智库列表
const
cardList
=
ref
([
...
...
@@ -1662,6 +1669,7 @@ const handleClickCate = cate => {
handleGetThinkTankPolicyAdvice
();
}
else
if
(
cate
===
"国会听证会"
)
{
resetResourceTabCommon
()
handleGetThinkTankHearings
();
}
};
...
...
@@ -1811,6 +1819,8 @@ const surveySort = ref(null);
const
surveyFooterList
=
ref
([]);
const
surveyCurrentPage
=
ref
(
1
);
const
surveyTotal
=
ref
(
0
);
//国会听证会总数
const
projectTotal
=
ref
(
0
);
const
handleSurveyFilterChange
=
()
=>
{
surveyCurrentPage
.
value
=
1
;
...
...
@@ -1827,24 +1837,9 @@ const handleGetThinkTankSurvey = async () => {
stripAllTimeForRequest
(
surveySelectedPubTimeList
.
value
),
(
pubTimeList
.
value
||
[]).
map
((
x
)
=>
x
.
id
)
);
const
params
=
{
pageNum
:
surveyCurrentPage
.
value
,
pageSize
:
12
,
sortFun
:
surveySort
.
value
===
true
,
domainIds
:
(()
=>
{
const
areas
=
stripAllAreaForRequest
(
surveySelectedAreaList
.
value
);
const
allAreaIds
=
(
areaList
.
value
||
[]).
map
((
a
)
=>
a
.
id
);
if
(
isSelectionCoveringAllOptions
(
areas
,
allAreaIds
))
{
return
""
;
}
return
arrayToString
(
areas
);
})(),
startDate
,
endDate
,
category
:
"调查项目"
};
try
{
const
res
=
await
getThinkTank
Report
(
params
);
const
res
=
await
getThinkTank
Projects
(
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
surveyFooterList
.
value
=
res
.
data
.
content
;
surveyTotal
.
value
=
res
.
data
.
totalElements
;
...
...
@@ -1856,7 +1851,22 @@ const handleGetThinkTankSurvey = async () => {
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
policyCurrentPage
=
ref
(
1
);
...
...
@@ -2097,7 +2107,26 @@ const handleToReportDetail = item => {
});
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
=>
{
window
.
sessionStorage
.
setItem
(
"curTabName"
,
item
.
name
);
const
route
=
router
.
resolve
({
name
:
"SurveyProjectView"
,
params
:
{
id
:
item
.
id
}
});
window
.
open
(
route
.
href
,
"_blank"
);
};
const
handleSearch
=
()
=>
{
window
.
sessionStorage
.
setItem
(
"curTabName"
,
`搜索-
${
searchThinktankText
.
value
}
`
);
const
curRoute
=
router
.
resolve
({
...
...
src/views/thinkTank/reportOriginal/index.vue
浏览文件 @
43550109
...
...
@@ -14,7 +14,7 @@
</div>
<div
class=
"header-top-right"
>
<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>
<div
class=
"time"
>
{{
thinkInfo
.
times
}}
</div>
...
...
@@ -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
()
=>
{
try
{
const
res
=
await
getThinkTankReportSummary
(
router
.
currentRoute
.
_value
.
params
.
id
);
console
.
log
(
"报告全局信息"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
thinkInfo
.
value
=
res
.
data
const
raw
=
res
.
data
;
const
first
=
Array
.
isArray
(
raw
)
?
raw
[
0
]
:
raw
;
const
normalized
=
normalizeReportSummaryRow
(
first
);
thinkInfo
.
value
=
normalized
;
applyReportOriginalDocumentTitle
(
normalized
.
name
);
}
}
catch
(
error
)
{
console
.
error
(
"获取报告全局信息error"
,
error
);
...
...
src/views/thinkTank/utils/piechart.js
浏览文件 @
43550109
...
...
@@ -40,7 +40,7 @@ const getPieChart = (data) => {
const
value
=
params
.
value
??
""
;
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
,
edgeDistance
:
10
,
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论