Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
R
risk-monitor
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
蔡建
risk-monitor
Commits
26d5da4e
提交
26d5da4e
authored
3月 13, 2026
作者:
coderBryanFu
浏览文件
操作
浏览文件
下载
差异文件
feat:update
上级
c84a594d
b841823f
显示空白字符变更
内嵌
并排
正在显示
18 个修改的文件
包含
288 行增加
和
112 行删除
+288
-112
overview.js
src/api/thinkTank/overview.js
+15
-0
NewsItem.vue
src/components/base/newsList/NewsItem.vue
+2
-2
NewsItemMini.vue
src/components/base/newsList/NewsItemMini.vue
+2
-2
NewsItemWithTag.vue
src/components/base/newsList/NewsItemWithTag.vue
+2
-2
IntelligentEntityText.vue
src/components/base/texts/IntelligentEntityText.vue
+2
-0
TextTranslatePane.vue
src/components/base/texts/TextTranslatePane.vue
+2
-2
common.js
src/router/common.js
+10
-3
index.vue
src/styles/components/ActionButton/index.vue
+4
-3
index.vue
src/styles/components/News/index.vue
+42
-0
index.vue
src/styles/components/RadioPage/index.vue
+22
-2
index.vue
src/styles/components/index.vue
+4
-0
container.scss
src/styles/container.scss
+9
-0
ModeuleNews.vue
src/views/newsBrief/ModeuleNews.vue
+24
-9
NewsDetial.vue
src/views/newsBrief/NewsDetial.vue
+9
-4
Line_Search.png
src/views/thinkTank/ReportDetail/images/Line_Search.png
+0
-0
image-down.png
src/views/thinkTank/ReportDetail/images/image-down.png
+0
-0
image-up.png
src/views/thinkTank/ReportDetail/images/image-up.png
+0
-0
index.vue
src/views/thinkTank/ReportDetail/reportAnalysis/index.vue
+139
-83
没有找到文件。
src/api/thinkTank/overview.js
浏览文件 @
26d5da4e
...
...
@@ -258,6 +258,21 @@ export function getThinkTankReportContent(params) {
})
}
// 获取报告核心论点(支持关键字搜索)
export
function
getThinkTankReportViewpoint
(
params
)
{
const
{
reportId
,
currentPage
,
pageSize
,
keyword
=
''
,
orgIds
=
''
}
=
params
return
request
({
method
:
'GET'
,
url
:
`/api/thinkTankReport/viewpoint/
${
reportId
}
`
,
params
:
{
currentPage
,
pageSize
,
keyword
,
orgIds
,
}
})
}
//获取涉及科技领域
export
function
getThinkTankReportIndustry
(
params
)
{
return
request
({
...
...
src/components/base/newsList/NewsItem.vue
浏览文件 @
26d5da4e
<
template
>
<el-space
alignment=
"flex-start"
:size=
"10"
>
<img
:width=
"97"
:height=
"72"
:src=
"
news
?? DefaultIconNews"
alt=
""
/>
<img
:width=
"97"
:height=
"72"
:src=
"
img
?? DefaultIconNews"
alt=
""
/>
<el-space
direction=
"vertical"
alignment=
"flex-start"
:size=
"0"
fill
>
<div
class=
"full-width flex-display"
>
<common-text
:line-limit=
"1"
class=
"text-title-3-bold text-hover flex-fill"
...
...
@@ -26,7 +26,7 @@ import CommonText from "../texts/CommonText.vue";
const
props
=
defineProps
({
img
:
{
type
:
String
,
default
:
''
default
:
null
,
},
title
:
{
type
:
String
,
...
...
src/components/base/newsList/NewsItemMini.vue
浏览文件 @
26d5da4e
<
template
>
<el-space
alignment=
"flex-start"
:size=
"10"
>
<img
:width=
"64"
:height=
"52"
:src=
"
news
?? DefaultIconNews"
alt=
""
/>
<img
:width=
"64"
:height=
"52"
:src=
"
img
?? DefaultIconNews"
alt=
""
/>
<el-space
direction=
"vertical"
alignment=
"flex-start"
:size=
"0"
>
<common-text
:line-limit=
"1"
class=
"text-regular text-hover"
color=
"var(--text-primary-80-color)"
>
{{
title
}}
...
...
@@ -20,7 +20,7 @@ import CommonText from "../texts/CommonText.vue";
const
props
=
defineProps
({
img
:
{
type
:
String
,
default
:
''
default
:
null
},
title
:
{
type
:
String
,
...
...
src/components/base/newsList/NewsItemWithTag.vue
浏览文件 @
26d5da4e
...
...
@@ -11,7 +11,7 @@
<area-tag
v-for=
"(tag, index) in props.aeraTags"
:key=
"index"
:tagName=
"tag"
/>
</el-space>
</el-space>
<img
style=
"width: 122px; height: 82px"
:src=
"props.img"
>
<img
style=
"width: 122px; height: 82px"
:src=
"props.img
? props.img : DefaultIconNews
"
>
</div>
</
template
>
...
...
@@ -26,7 +26,7 @@ const props = defineProps({
img
:
{
type
:
String
,
default
:
'img'
default
:
null
},
title
:
{
type
:
String
,
...
...
src/components/base/texts/IntelligentEntityText.vue
浏览文件 @
26d5da4e
...
...
@@ -121,5 +121,6 @@ onMounted(processText)
.p-regular-rereg
{
text-indent
:
2em
;
margin
:
4px
0
;
}
</
style
>
\ No newline at end of file
src/components/base/texts/TextTranslatePane.vue
浏览文件 @
26d5da4e
...
...
@@ -9,8 +9,8 @@
<el-button
v-if=
"showMoreVisible"
@
click=
"() =>
{ showMore = !showMore; updateText() }">
{{
showMore
?
'收起'
:
'展开'
}}
<el-icon>
<arrow-
down
v-if=
"showMore"
/>
<arrow-
up
v-else
/>
<arrow-
up
v-if=
"showMore"
/>
<arrow-
down
v-else
/>
</el-icon>
</el-button>
</div>
...
...
src/router/common.js
浏览文件 @
26d5da4e
...
...
@@ -2,7 +2,7 @@ import { useRouter } from "vue-router";
export
function
useGotoPage
()
{
const
router
=
useRouter
();
return
(
path
,
data
,
isNewTabs
=
true
)
=>
{
console
.
log
(
'path'
,
path
);
console
.
log
(
"path"
,
path
);
if
(
isNewTabs
)
{
// 打开新页面
const
url
=
new
URL
(
window
.
location
.
origin
+
path
);
...
...
@@ -11,10 +11,17 @@ export function useGotoPage() {
url
.
searchParams
.
append
(
key
,
value
);
});
}
window
.
open
(
url
.
toString
(),
'_blank'
);
window
.
open
(
url
.
toString
(),
"_blank"
);
}
else
{
// 当前页面打开
router
.
push
({
path
,
query
:
data
});
}
}
};
}
// 滚动到指定元素
export
function
scrollToElement
(
elementId
)
{
document
.
getElementById
(
elementId
).
scrollIntoView
({
behavior
:
"smooth"
,
// 平滑滚动
block
:
"start"
// 滚动到元素顶部
});
}
src/styles/components/ActionButton/index.vue
浏览文件 @
26d5da4e
...
...
@@ -48,14 +48,15 @@
<
script
setup
>
import
'@/styles/common.scss'
import
LeftBtn
from
'@/components/base/
PageBtn/L
eftBtn.vue'
import
RightBtn
from
'@/components/base/
PageBtn/R
ightBtn.vue'
import
LeftBtn
from
'@/components/base/
pageBtn/l
eftBtn.vue'
import
RightBtn
from
'@/components/base/
pageBtn/r
ightBtn.vue'
const
span
=
12
</
script
>
<
style
lang=
"scss"
scoped
>
.button-box
{
margin-left
:
40px
;;
margin-left
:
40px
;
;
display
:
flex
;
gap
:
8px
}
...
...
src/styles/components/News/index.vue
0 → 100644
浏览文件 @
26d5da4e
<
script
setup
lang=
"ts"
>
import
{
ElRow
,
ElCol
}
from
'element-plus'
;
import
'@/styles/common.scss'
import
NewsItemMini
from
'@/components/base/newsList/NewsItemMini.vue'
import
NewsItem
from
'@/components/base/newsList/NewsItem.vue'
import
NewsItemWithTag
from
'@/components/base/newsList/NewsItemWithTag.vue'
const
span
=
12
const
news
=
{
title
:
'新闻标题-老长了老长了老长了老长了老长了老长长了老长了'
,
content
:
'新闻内容-老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了老长了'
,
from
:
"2025.1.1 · 来源:中国"
,
aeraTags
:
[
'人工智能'
,
'深海'
]
}
</
script
>
<
template
>
<el-row
class=
"wrapper layout-grid-line"
>
<el-col
:span=
"span"
>
<pre>
{{
`import NewsItem from '@/components/base/newsList/NewsItem.vue'`
}}
</pre>
<news-item
class=
"common-padding"
:title=
"news.title"
:content=
"news.content"
:from=
"news.from"
></news-item>
</el-col>
<el-col
:span=
"span"
>
<pre>
{{
`import NewsItemMini from '@/components/base/newsList/NewsItemMini.vue'`
}}
</pre>
<news-item-mini
class=
"common-padding"
:title=
"news.title"
:content=
"news.content"
:from=
"news.from"
></news-item-mini>
</el-col>
<el-col
:span=
"span"
>
<pre>
{{
`import NewsItemWithTag from '@/components/base/newsList/NewsItemWithTag.vue'`
}}
</pre>
<news-item-with-tag
class=
"common-padding"
:title=
"news.title"
:content=
"news.content"
:from=
"news.from"
:aeraTags=
"news.aeraTags"
></news-item-with-tag>
</el-col>
</el-row>
</
template
>
<
style
lang=
"scss"
scoped
></
style
>
\ No newline at end of file
src/styles/components/RadioPage/index.vue
浏览文件 @
26d5da4e
<
script
setup
lang=
"ts"
>
import
{
ElRadioGroup
,
ElRadioButton
,
ElRow
,
ElCol
}
from
'element-plus'
;
import
{
ElRadioGroup
,
ElRadioButton
,
ElRow
,
ElCol
,
ElSpace
}
from
'element-plus'
;
import
{
ref
}
from
'vue'
;
import
'@/styles/radio.scss'
;
...
...
@@ -13,16 +13,36 @@ const span = 12
<pre>
{{
`import '@/styles/radio.scss';
<template>
<el-radio-group class="radio-group-as-gap-btn">
<el-radio-group v-model="radio" class="radio-group-as-gap-btn">
<el-radio-button :value="1">选项1</el-radio-button>
<el-radio-button :value="2">选项2</el-radio-button>
<el-radio-button :value="3">选项3</el-radio-button>
</el-radio-group>
<el-radio-group v-model="radio" class="radio-group-as-gap-btn">
<el-space :size="24">
<el-radio-button :value="1">选项1</el-radio-button>
<el-radio-button :value="2">选项2</el-radio-button>
<el-radio-button :value="3">选项3</el-radio-button>
</el-space>
</el-radio-group>
</template>
`
}}
</pre>
<el-space
direction=
"vertical"
fill
>
<el-radio-group
v-model=
"radio"
class=
"radio-group-as-gap-btn"
>
<el-radio-button
:value=
"1"
>
选项1
</el-radio-button>
<el-radio-button
:value=
"2"
>
选项2
</el-radio-button>
<el-radio-button
:value=
"3"
>
选项3
</el-radio-button>
</el-radio-group>
<el-radio-group
v-model=
"radio"
class=
"radio-group-as-gap-btn"
>
<el-space
:size=
"24"
>
<el-radio-button
:value=
"1"
>
选项1
</el-radio-button>
<el-radio-button
:value=
"2"
>
选项2
</el-radio-button>
<el-radio-button
:value=
"3"
>
选项3
</el-radio-button>
</el-space>
</el-radio-group>
</el-space>
</el-col>
<el-col
:span=
"span"
>
<pre>
{{
`import '@/styles/radio.scss';\n <template>
...
...
src/styles/components/index.vue
浏览文件 @
26d5da4e
...
...
@@ -28,6 +28,9 @@
<el-tab-pane
label=
"人物"
lazy
>
<people-page
/>
</el-tab-pane>
<el-tab-pane
label=
"新闻"
lazy
>
<news-page
/>
</el-tab-pane>
<el-tab-pane
label=
"预警面板"
lazy
>
<WarnningPane
/>
</el-tab-pane>
...
...
@@ -71,6 +74,7 @@ import GraphTreeChart from './GraphTreeChart/index.vue'
import
AreaTag
from
'./AreaTag/index.vue'
import
ActionButton
from
'./ActionButton/index.vue'
import
WordCloudChart
from
'./WordCloudChart/index.vue'
import
NewsPage
from
'./News/index.vue'
</
script
>
<
style
lang=
"scss"
scoped
>
...
...
src/styles/container.scss
浏览文件 @
26d5da4e
...
...
@@ -17,3 +17,11 @@
.common-padding
{
padding
:
20px
24px
;
}
.common-padding-h
{
padding
:
0px
24px
;
}
.common-padding-v
{
padding
:
20px
0px
;
}
\ No newline at end of file
src/views/newsBrief/ModeuleNews.vue
浏览文件 @
26d5da4e
...
...
@@ -4,7 +4,7 @@
<back
/>
</el-icon>
返回
</el-button>
<el-space
style=
"width: 993px;"
direction=
"vertical"
alignment=
"flex-start"
>
<div
style=
"margin-top: 50px; margin-bottom: 24px; margin-left: 24px;"
>
<div
id=
"ref-news-list"
style=
"margin-top: 50px; margin-bottom: 24px; margin-left: 24px;"
>
<common-text
class=
"text-title-0-show"
color=
"var(--text-primary-90-color)"
>
{{
moduleName
}}
</common-text>
...
...
@@ -21,9 +21,12 @@
</el-space>
</el-radio-group>
<el-divider
style=
"margin: 10px 0px;"
></el-divider>
<div
class=
"
"
>
<news-list
:news=
"NewsData"
/>
<div
v-if=
"NewsData?.content?.length > 0
"
>
<news-list
:news=
"NewsData
.content
"
/>
</div>
<el-empty
v-else
></el-empty>
<el-pagination
background
layout=
"total, ->, prev, pager, next"
:current-page=
"modulePage"
:total=
"NewsData?.totalElements ?? 0"
v-on:current-change=
"onCurrentChange"
/>
</el-space>
</el-space>
</el-space>
...
...
@@ -36,32 +39,44 @@ import '@/styles/container.scss';
import
'@/styles/radio.scss'
;
import
NewsList
from
"./NewsList.vue"
;
import
{
getAreaList
,
getHotNewsByArea
}
from
"@/api/news/newsBrief"
;
import
{
ElSpace
,
ElDivider
,
ElRadioButton
,
ElRadioGroup
,
ElButton
,
ElIcon
}
from
"element-plus"
;
import
{
ElSpace
,
ElDivider
,
ElRadioButton
,
ElRadioGroup
,
ElButton
,
ElIcon
,
ElEmpty
,
ElPagination
}
from
"element-plus"
;
import
CommonText
from
"@/components/base/texts/CommonText.vue"
;
import
{
useGotoNewsBrief
}
from
"@/router/modules/news"
;
import
{
scrollToElement
}
from
"@/router/common"
;
import
{
number
}
from
"echarts"
;
const
route
=
useRoute
();
const
gotoNewsBrief
=
useGotoNewsBrief
();
const
moduleId
=
ref
(
route
.
params
.
id
);
const
moduleName
=
ref
(
route
.
query
.
name
??
""
);
const
NewsData
=
ref
([]);
const
modulePage
=
ref
(
1
);
const
NewsData
=
ref
({});
const
AreaList
=
ref
([]);
const
currentAreaId
=
ref
(
""
);
onMounted
(
async
()
=>
{
console
.
log
(
route
.
query
.
name
,
moduleId
.
value
,
moduleName
.
value
);
const
{
data
:
areaList
}
=
await
getAreaList
();
AreaList
.
value
=
areaList
??
[];
await
changeArea
(
""
)
await
updateDate
(
""
)
});
async
function
changeArea
(
id
)
{
const
onCurrentChange
=
async
e
=>
{
await
updateDate
(
currentAreaId
.
value
,
e
-
1
)
scrollToElement
(
"ref-news-list"
);
}
async
function
updateDate
(
id
,
page
=
0
)
{
const
{
data
}
=
await
getHotNewsByArea
({
moduleId
:
moduleId
.
value
,
industryId
:
id
?
id
:
null
,
currentPage
:
page
,
});
data
?.
forEach
(
item
=>
{
data
?.
content
?.
forEach
(
item
=>
{
item
.
newsImage
=
item
.
coverUrl
??
""
})
NewsData
.
value
=
data
??
[];
modulePage
.
value
=
(
data
?.
number
??
0
)
+
1
;
}
async
function
changeArea
(
id
)
{
await
updateDate
(
id
,
0
)
}
</
script
>
...
...
src/views/newsBrief/NewsDetial.vue
浏览文件 @
26d5da4e
...
...
@@ -41,22 +41,27 @@
译文
<
/el-button
>
<
/div
>
<
text
-
translate
-
pane
class
=
"common-padding"
:
texts
-
raw
=
"textEns"
:
texts
-
translate
=
"textZns"
<
text
-
translate
-
pane
class
=
"common-padding
-h
"
:
texts
-
raw
=
"textEns"
:
texts
-
translate
=
"textZns"
:
text
-
entities
=
"textEntities"
:
is
-
open
-
translation
=
"isOpenTranslation"
:
is
-
highlight
-
entity
=
"isHightLightEntity"
>
<
/text-translate-pane
>
<
div
>
<
img
v
-
if
=
"newsDetail.coverUrl"
class
=
"common-padding"
:
src
=
"newsDetail.coverUrl"
:
width
=
"320"
:
height
=
"240"
/>
<
/div
>
<
/el-space
>
<
el
-
space
direction
=
"vertical"
class
=
"background-as-card relation-news-box"
alignment
=
"flex-start"
>
<
el
-
space
direction
=
"vertical"
class
=
"background-as-card relation-news-box"
fill
>
<
el
-
space
style
=
"margin-top: 10px;"
>
<
color
-
prefix
-
title
height
=
"20px"
>
<
div
class
=
"text-title-2-bold"
>
相关新闻
<
/div
>
<
/color-prefix-title
>
<
/el-space
>
<
el
-
space
direction
=
"vertical"
fill
class
=
"common-padding"
>
<
el
-
space
v
-
if
=
"relationNews?.length > 0"
direction
=
"vertical"
fill
class
=
"common-padding"
>
<
news
-
item
-
mini
v
-
for
=
"item in relationNews"
:
key
=
"item.newsId"
:
news
=
"item"
:
img
=
"item.newsImage"
:
title
=
"item.newsTitle"
:
from
=
"`${item.newsDate
}
· ${item.newsOrg
}
`"
@
click
=
"gotoNewsDetail(item.newsId)"
/>
<
/el-space
>
<
el
-
empty
v
-
else
style
=
""
><
/el-empty
>
<
/el-space
>
<
/div
>
<
/el-scrollbar
>
...
...
@@ -67,7 +72,7 @@ import '@/styles/container.scss';
import
'@/styles/common.scss'
;
import
{
ref
,
onMounted
}
from
"vue"
;
import
{
useRoute
}
from
"vue-router"
;
import
{
ElSpace
,
ElButton
,
ElScrollbar
,
ElSwitch
}
from
"element-plus"
;
import
{
ElSpace
,
ElButton
,
ElScrollbar
,
ElSwitch
,
ElEmpty
,
ElImage
}
from
"element-plus"
;
import
CommonText
from
"@/components/base/texts/CommonText.vue"
;
import
AreaTag
from
"@/components/base/AreaTag/index.vue"
;
import
ColorPrefixTitle
from
'@/components/base/texts/ColorPrefixTitle.vue'
;
...
...
src/views/thinkTank/ReportDetail/images/Line_Search.png
0 → 100644
浏览文件 @
26d5da4e
21.4 KB
src/views/thinkTank/ReportDetail/images/image-down.png
0 → 100644
浏览文件 @
26d5da4e
10.5 KB
src/views/thinkTank/ReportDetail/images/image-up.png
0 → 100644
浏览文件 @
26d5da4e
10.3 KB
src/views/thinkTank/ReportDetail/reportAnalysis/index.vue
浏览文件 @
26d5da4e
<
template
>
<div
class=
"wrap"
>
<div
class=
"top"
>
<WarningPane
:warnningLevel=
"riskSignal?.level"
:warnningContent=
"riskSignal?.content"
>
</WarningPane>
</div>
<div
class=
"bottom-row"
>
<div
class=
"left"
>
<div
class=
"box1"
>
<!--
<div
class=
"box-header"
>
...
...
@@ -117,19 +122,36 @@
</div>
<div
class=
"box4"
>
<AnalysisBox
title=
"核心论点"
:showAllBtn=
"true"
>
<div
class=
"search-box"
>
<el-input
placeholder=
"搜索观点"
v-model=
"searchOpinions"
style=
"width: 180px"
@
keyup
.
enter=
"handleSearchOpinions"
/>
<div
class=
"icon"
>
<img
src=
"../images/Line_Search.png"
alt=
""
@
click=
"handleSearchOpinions"
/>
</div>
</div>
<div
class=
"box4-main"
>
<div
class=
"box4-main-main"
>
<div
class=
"box4-item"
v-for=
"(item, index) in majorOpinions"
:key=
"index"
>
<div
class=
"box4-item"
v-for=
"(item, index) in filteredOpinions"
:key=
"index"
>
<div
class=
"top-row"
>
<div
class=
"left"
>
{{ index + 1 }}
</div>
<div
class=
"center"
>
<div
class=
"title"
>
{{ item.content
}}
</div>
<div
class=
"title"
>
{{ item.titleZh
}}
</div>
<div>
<img
src=
"../images/image-open.png"
alt=
""
class=
"center-image"
@
click=
"handleOpenReportOriginal(item)"
/>
</div>
<!-- <div class="desc">{{ item.econtent }}</div> -->
<div>
<img
v-if=
"expandedIndex !== index"
src=
"../images/image-down.png"
alt=
""
class=
"center-image"
@
click=
"toggleOpinion(index)"
/>
<img
v-else
src=
"../images/image-up.png"
alt=
""
class=
"center-image"
@
click=
"toggleOpinion(index)"
/>
</div>
</div>
</div>
<div
v-if=
"expandedIndex === index"
class=
"desc"
>
{{ item.contentZh }}
</div>
<!-- <div class="right"> -->
<!-- <div class="tag" v-for="(val, idx) in item.hylyList" :key="idx">
...
...
@@ -146,9 +168,9 @@
</div>
</div>
<div
class=
"box4-main-footer"
>
<div
class=
"info"
>
共{{ t
otal }}条核心论点
</div>
<div
class=
"info"
>
共{{ opinionsT
otal }}条核心论点
</div>
<div
class=
"page-box"
>
<el-pagination
:page-size=
"12"
background
layout=
"prev, pager, next"
:total=
"t
otal"
<el-pagination
:page-size=
"pageSize"
background
layout=
"prev, pager, next"
:total=
"opinionsT
otal"
@
current-change=
"handleCurrentChange"
:current-page=
"currentPage"
/>
</div>
</div>
...
...
@@ -157,9 +179,12 @@
</div>
</div>
</div>
</div>
</template>
<
script
setup
>
import
WarningPane
from
"@/components/base/WarningPane/index.vue"
import
SearchContainer
from
"@/components/SearchContainer.vue"
;
import
{
ref
,
onMounted
,
computed
,
defineProps
}
from
"vue"
;
import
setChart
from
"@/utils/setChart"
;
import
getWordCloudChart
from
"./utils/worldCloudChart"
;
...
...
@@ -167,7 +192,8 @@ import {
getThinkTankReportAbstract
,
getThinkTankReportContent
,
getThinkTankReportIndustry
,
getThinkTankReportIndustryCloud
getThinkTankReportIndustryCloud
,
getThinkTankReportViewpoint
}
from
"@/api/thinkTank/overview"
;
import
{
getChartAnalysis
}
from
"@/api/aiAnalysis/index"
;
import
{
useRouter
}
from
"vue-router"
;
...
...
@@ -185,6 +211,28 @@ const props = defineProps({
}
});
const
searchOpinions
=
ref
(
''
);
const
handleSearchOpinions
=
()
=>
{
currentPage
.
value
=
1
;
handleGetThinkTankReportViewpoint
();
};
// 当前展开的核心论点下标(同一时刻只展开一条)
const
expandedIndex
=
ref
(
null
);
const
filteredOpinions
=
computed
(()
=>
majorOpinions
.
value
);
const
opinionsTotal
=
computed
(()
=>
total
.
value
);
const
toggleOpinion
=
index
=>
{
if
(
expandedIndex
.
value
===
index
)
{
expandedIndex
.
value
=
null
;
}
else
{
expandedIndex
.
value
=
index
;
}
};
const
publishTime
=
computed
(()
=>
{
const
info
=
props
.
thinkInfo
||
{};
// 优先用 times,其次用 reportTime 的日期部分
...
...
@@ -207,6 +255,11 @@ const reportAuthors = computed(() => {
}
return
[];
});
const
riskSignal
=
computed
(()
=>
{
const
info
=
props
.
thinkInfo
||
{};
return
info
.
riskSignal
;
});
// 内容摘要
...
...
@@ -362,22 +415,27 @@ const pageSize = ref(10);
const
total
=
ref
(
0
);
const
handleCurrentChange
=
page
=>
{
currentPage
.
value
=
page
;
handleGetThinkTankReport
Conte
nt
();
handleGetThinkTankReport
Viewpoi
nt
();
};
//获取报告主要观点
const
handleGetThinkTankReportContent
=
async
()
=>
{
// 获取报告核心论点(支持搜索)
const
handleGetThinkTankReportViewpoint
=
async
()
=>
{
try
{
const
params
=
{
i
d
:
router
.
currentRoute
.
_value
.
params
.
id
,
reportI
d
:
router
.
currentRoute
.
_value
.
params
.
id
,
currentPage
:
currentPage
.
value
-
1
,
pageSize
:
pageSize
.
value
pageSize
:
pageSize
.
value
,
keyword
:
(
searchOpinions
.
value
||
""
).
trim
(),
orgIds
:
""
};
const
res
=
await
getThinkTankReport
Conte
nt
(
params
);
console
.
log
(
"
主要观
点"
,
res
.
data
);
const
res
=
await
getThinkTankReport
Viewpoi
nt
(
params
);
console
.
log
(
"
核心论
点"
,
res
.
data
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
majorOpinions
.
value
=
res
.
data
.
content
||
[];
handleGetBox3AnalysisContent
(
majorOpinions
.
value
);
total
.
value
=
res
.
data
.
totalElements
||
0
;
// 重置展开状态
expandedIndex
.
value
=
null
;
}
}
catch
(
error
)
{
console
.
error
(
"获取主要观点error"
,
error
);
...
...
@@ -396,7 +454,7 @@ const handleGetBox3AnalysisContent = async textJson => {
onMounted
(()
=>
{
handleGetThinkTankReportAbstract
();
handleGetThinkTankReport
Conte
nt
();
handleGetThinkTankReport
Viewpoi
nt
();
handleGetThinkTankReportIndustry
();
handleGetThinkTankReportIndustryCloud
();
...
...
@@ -409,79 +467,23 @@ onMounted(() => {
justify-content
:
center
;
gap
:
16px
;
padding-bottom
:
16px
;
flex-direction
:
column
;
.box-header
{
.top
{
margin-top
:
16px
;
width
:
100%
;
height
:
50px
;
display
:
flex
;
position
:
relative
;
.header-left
{
margin-top
:
18px
;
width
:
8px
;
height
:
20px
;
border-radius
:
0
4px
4px
0
;
background
:
var
(
--
color-main-active
);
}
.title
{
margin-left
:
14px
;
margin-top
:
14px
;
height
:
26px
;
line-height
:
26px
;
color
:
var
(
--
color-main-active
);
font-family
:
Microsoft
YaHei
;
font-size
:
20px
;
font-weight
:
700
;
}
.header-btn-box
{
position
:
absolute
;
top
:
15px
;
right
:
83px
;
height
:
100%
;
justify-content
:
center
;
display
:
flex
;
justify-content
:
flex-end
;
gap
:
8px
;
.btn
{
height
:
28px
;
padding
:
0
8px
;
box-sizing
:
border-box
;
border
:
1px
solid
rgba
(
230
,
231
,
232
,
1
);
border-radius
:
4px
;
background
:
rgba
(
255
,
255
,
255
,
1
);
color
:
rgba
(
59
,
65
,
75
,
1
);
font-family
:
Microsoft
YaHei
;
font-size
:
16px
;
font-weight
:
400
;
line-height
:
28px
;
}
.btnActive
{
color
:
var
(
--
color-main-active
);
border
:
1px
solid
var
(
--
color-main-active
);
}
}
.bottom-row
{
.header-right
{
position
:
absolute
;
top
:
14px
;
right
:
12px
;
flex-direction
:
row
;
justify-content
:
center
;
display
:
flex
;
justify-content
:
flex-end
;
gap
:
4px
;
gap
:
16px
;
.icon
{
width
:
28px
;
height
:
28px
;
img
{
width
:
100%
;
height
:
100%
;
}
}
}
}
.left
{
gap
:
16px
;
...
...
@@ -881,6 +883,38 @@ onMounted(() => {
// background: rgba(255, 255, 255, 1);
position
:
relative
;
.search-box
{
display
:
flex
;
width
:
180px
;
height
:
32px
;
box-sizing
:
border-box
;
border
:
1px
solid
rgba
(
230
,
231
,
232
,
1
);
border-radius
:
4px
;
background
:
rgba
(
255
,
255
,
255
,
1
);
position
:
relative
;
margin-top
:
3px
;
margin-bottom
:
16px
;
margin-left
:
23px
;
.icon
{
width
:
16px
;
height
:
16px
;
cursor
:
pointer
;
position
:
absolute
;
right
:
8px
;
top
:
8px
;
display
:
flex
;
justify-content
:
flex-end
;
img
{
width
:
100%
;
height
:
100%
;
}
}
}
.box4-main
{
width
:
1057px
;
...
...
@@ -892,12 +926,17 @@ onMounted(() => {
.box4-item
{
width
:
1057px
;
height
:
72px
;
box-sizing
:
border-box
;
border-radius
:
4px
;
display
:
flex
;
flex-direction
:
column
;
position
:
relative
;
.top-row
{
display
:
flex
;
align-items
:
flex-start
;
}
.left
{
margin-top
:
24px
;
margin-left
:
15px
;
...
...
@@ -915,8 +954,8 @@ onMounted(() => {
}
.center
{
height
:
64px
;
width
:
910px
;
min-
height
:
64px
;
margin-left
:
13px
;
display
:
flex
;
align-items
:
center
;
...
...
@@ -993,6 +1032,22 @@ onMounted(() => {
height
:
100%
;
}
}
.desc
{
width
:
950px
;
margin-top
:
22px
;
margin-left
:
52px
;
// 24(left) + 13(center margin) + 一点间距
color
:
rgb
(
59
,
65
,
75
);
font-family
:
"Source Han Sans CN"
;
font-weight
:
400
;
/* Regular 常规 */
font-size
:
16px
;
line-height
:
30px
;
letter-spacing
:
0px
;
text-align
:
justify
;
/* 两端对齐 */
}
}
.box4-item
{
...
...
@@ -1069,6 +1124,7 @@ onMounted(() => {
}
}
}
}
}
:deep
(
.analysis-box-wrapper
.wrapper-header
)
{
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论