Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
R
risk-monitor
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
蔡建
risk-monitor
Commits
b67feed8
提交
b67feed8
authored
3月 03, 2026
作者:
coderBryanFu
浏览文件
操作
浏览文件
下载
差异文件
styles:组件命名更新
上级
c46c21a0
67255f2a
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
202 行增加
和
357 行删除
+202
-357
SearchContainer.vue
src/components/SearchContainer.vue
+108
-12
index.vue
src/views/bill/billHome/index.vue
+94
-345
没有找到文件。
src/components/SearchContainer.vue
浏览文件 @
b67feed8
<
template
>
<div
class=
"search-container"
v-show=
"!isShow"
>
<div
class=
"search-main"
>
<input
v-model=
"store.searchBillText"
:placeholder=
"placeholder"
@
keyup
.
enter=
"handleSearch"
class=
"search-input"
/>
<div
class=
"search-type-tabs"
v-if=
"enableBillTypeSwitch"
>
<div
class=
"search-type-tab"
:class=
"
{ active: billSearchType === 'federal' }"
@click="handleChangeBillSearchType('federal')">
联邦议会
</div>
<div
class=
"search-type-tab"
:class=
"
{ active: billSearchType === 'state' }"
@click="handleChangeBillSearchType('state')">
州议会
</div>
</div>
<div
class=
"search-main"
:class=
"
{ 'search-main-with-tabs': enableBillTypeSwitch }">
<input
v-model=
"store.searchBillText"
:placeholder=
"placeholder"
@
keyup
.
enter=
"handleSearch"
class=
"search-input"
/>
<div
class=
"search-btn"
@
click=
"handleSearch"
>
<img
src=
"@/assets/icons/search-icon.png"
alt
/>
搜索
...
...
@@ -43,19 +54,26 @@
</
template
>
<
script
setup
>
import
{
ref
,
nextTick
,
watchEffect
,
onMounted
}
from
"vue"
;
import
{
ref
,
nextTick
,
watchEffect
}
from
"vue"
;
import
{
useContainerScroll
}
from
"@/hooks/useScrollShow"
;
import
{
useRouter
}
from
"vue-router"
;
import
{
useWrittingAsstaintStore
}
from
"@/stores/writtingAsstaintStore"
;
const
store
=
useWrittingAsstaintStore
();
const
router
=
useRouter
();
let
{
countInfo
,
containerRef
,
placeholder
,
areaName
}
=
defineProps
({
const
{
countInfo
,
containerRef
,
placeholder
,
areaName
,
enableBillTypeSwitch
,
defaultBillSearchType
}
=
defineProps
({
countInfo
:
{
type
:
Array
,
default
:
()
=>
[]
},
containerRef
:
{
type
:
Object
,
default
:
{}
...
...
@@ -67,18 +85,48 @@ let { countInfo, containerRef, placeholder, areaName } = defineProps({
areaName
:
{
type
:
String
,
default
:
"法案"
},
// 法案页专用:是否展示“联邦议会/州议会”搜索类型切换
// 其他页面默认 false,不受影响
enableBillTypeSwitch
:
{
type
:
Boolean
,
default
:
false
},
// 法案页专用:默认搜索类型
// 可选值:'federal'(联邦议会)| 'state'(州议会)
defaultBillSearchType
:
{
type
:
String
,
default
:
"federal"
}
});
// 法案搜索类型状态(仅在 enableBillTypeSwitch=true 时生效)
// 维护说明:
// - federal: 联邦议会
// - state: 州议会
const
billSearchType
=
ref
(
defaultBillSearchType
===
"state"
?
"state"
:
"federal"
);
const
handleChangeBillSearchType
=
type
=>
{
billSearchType
.
value
=
type
;
};
const
handleSearch
=
()
=>
{
window
.
sessionStorage
.
setItem
(
"curTabName"
,
`搜索-
${
store
.
searchBillText
}
`
);
if
(
!
areaName
)
return
;
const
query
=
{
searchText
:
store
.
searchBillText
,
areaName
:
areaName
};
// 法案页附带搜索类型参数,便于搜索结果页后续按类型处理
if
(
enableBillTypeSwitch
)
{
query
.
billSearchType
=
billSearchType
.
value
;
}
const
curRoute
=
router
.
resolve
({
path
:
"/searchResults"
,
query
:
{
searchText
:
store
.
searchBillText
,
areaName
:
areaName
}
query
});
window
.
open
(
curRoute
.
href
,
"_blank"
);
};
...
...
@@ -90,17 +138,17 @@ watchEffect(() => {
if
(
isShow
.
value
)
{
homeMainRef
.
value
.
classList
.
add
(
"scroll-main"
);
homeMainRef
.
value
.
classList
.
add
(
"scrollHomeMain"
);
}
else
{
homeMainRef
.
value
.
classList
.
remove
(
"scroll-main"
);
homeMainRef
.
value
.
classList
.
remove
(
"scrollHomeMain"
);
}
store
.
changeIsShowSearchBar
(
isShow
.
value
);
});
store
.
setSearchData
({
placeholder
,
areaName
,
containerRef
:
homeMainRef
});
store
.
setSearchData
({
placeholder
,
areaName
,
containerRef
:
homeMainRef
});
// 锚点跳转
const
handleToPosi
=
id
=>
{
const
element
=
document
.
getElementById
(
id
);
...
...
@@ -131,6 +179,43 @@ const handleToPosi = id => {
width
:
960px
;
height
:
168px
;
margin
:
0
auto
68px
auto
;
.search-type-tabs
{
display
:
flex
;
align-items
:
flex-end
;
height
:
41px
;
gap
:
2px
;
.search-type-tab
{
width
:
176px
;
height
:
41px
;
line-height
:
48px
;
text-align
:
center
;
border-radius
:
10px
10px
0
0
;
border
:
1px
solid
rgb
(
255
,
255
,
255
);
border-bottom
:
none
;
background
:
rgba
(
255
,
255
,
255
,
0
.65
);
color
:
rgb
(
95
,
101
,
108
);
font-family
:
Microsoft
YaHei
;
font-size
:
18px
;
font-weight
:
700
;
line-height
:
41px
;
cursor
:
pointer
;
padding
:
0
16px
;
box-sizing
:
border-box
;
}
.search-type-tab.active
{
background
:
rgba
(
231
,
243
,
255
,
1
);
color
:
rgb
(
5
,
95
,
194
);
border-color
:
rgb
(
255
,
255
,
255
);
}
}
.search-main-with-tabs
{
border-top-left-radius
:
0
!
important
;
}
.search-center
{
width
:
688px
;
height
:
48px
;
...
...
@@ -170,6 +255,7 @@ const handleToPosi = id => {
}
}
}
.search-main
{
display
:
flex
;
padding-right
:
3px
;
...
...
@@ -181,9 +267,11 @@ const handleToPosi = id => {
background-color
:
rgba
(
255
,
255
,
255
,
0
.65
);
border-radius
:
10px
;
border
:
1px
solid
#fff
;
&
:hover
{
border
:
1px
solid
var
(
--
color-main-active
);
}
.search-input
{
border
:
none
;
outline
:
none
;
...
...
@@ -201,6 +289,7 @@ const handleToPosi = id => {
color
:
#a8abb2
;
}
}
.search-btn
{
cursor
:
pointer
;
display
:
flex
;
...
...
@@ -216,6 +305,7 @@ const handleToPosi = id => {
font-family
:
"Microsoft YaHei"
;
line-height
:
22px
;
color
:
#fff
;
img
{
width
:
18px
;
height
:
18px
;
...
...
@@ -223,6 +313,7 @@ const handleToPosi = id => {
}
}
}
.search-bottom
{
width
:
688px
;
height
:
48px
;
...
...
@@ -230,6 +321,7 @@ const handleToPosi = id => {
margin-top
:
36px
;
display
:
flex
;
justify-content
:
space-between
;
// gap: 16px;
.btn
{
display
:
flex
;
...
...
@@ -243,9 +335,11 @@ const handleToPosi = id => {
background
:
#e7f3ff
;
cursor
:
pointer
;
position
:
relative
;
&
:hover
{
background
:
#cae3fc
;
}
.btn-text
{
width
:
80px
;
color
:
var
(
--
color-main-active
);
...
...
@@ -256,12 +350,14 @@ const handleToPosi = id => {
margin-left
:
36px
;
text-align
:
center
;
}
.btn-icon
{
position
:
absolute
;
top
:
16px
;
right
:
19px
;
width
:
6px
;
height
:
12px
;
img
{
width
:
100%
;
height
:
100%
;
...
...
src/views/bill/billHome/index.vue
浏览文件 @
b67feed8
<
template
>
<div
class=
"home-wrapper"
>
<div
class=
"search-header"
v-show=
"false"
>
<div
class=
"search-header-container"
>
<div
class=
"home-content-header-center"
>
<el-input
v-model=
"searchBillText"
@
keyup
.
enter=
"handleSearch"
style=
"width: 680px; height: 100%"
placeholder=
"搜索科技法案"
/>
<div
class=
"search"
>
<div
class=
"search-icon"
>
<img
src=
"./assets/images/search-icon.png"
alt=
""
/>
</div>
<div
class=
"search-text"
@
click=
"handleSearch"
>
搜索
</div>
</div>
</div>
<div
class=
"home-content-header-btn-box"
>
<div
class=
"btn"
@
click=
"handleToPosi('position1')"
>
<div
class=
"btn-text"
>
{{
"最新动态"
}}
</div>
<div
class=
"btn-icon"
>
<img
src=
"@/assets/icons/arrow-right-icon.png"
alt=
""
/>
</div>
</div>
<div
class=
"btn"
@
click=
"handleToPosi('position2')"
>
<div
class=
"btn-text"
>
{{
"资讯要闻"
}}
</div>
<div
class=
"btn-icon"
>
<img
src=
"@/assets/icons/arrow-right-icon.png"
alt=
""
/>
</div>
</div>
<div
class=
"btn"
@
click=
"handleToPosi('position3')"
>
<div
class=
"btn-text"
>
{{
"数据总览"
}}
</div>
<div
class=
"btn-icon"
>
<img
src=
"@/assets/icons/arrow-right-icon.png"
alt=
""
/>
</div>
</div>
<div
class=
"btn"
@
click=
"handleToPosi('position4')"
>
<div
class=
"btn-text"
>
{{
"资源库"
}}
</div>
<div
class=
"btn-icon"
>
<img
src=
"@/assets/icons/arrow-right-icon.png"
alt=
""
/>
</div>
</div>
</div>
</div>
</div>
<div
class=
"home-main"
:class=
"
{ scrollHomeBox: isShow }" ref="containerRef">
<div
class=
"home-main"
ref=
"containerRef"
>
<div
class=
"home-top-bg"
></div>
<div
class=
"home-content"
>
<div
class=
"home-content-header"
>
<div
class=
"home-content-header-center"
v-show=
"!isShow"
>
<el-input
v-model=
"searchBillText"
@
keyup
.
enter=
"handleSearch"
style=
"width: 800px; height: 100%"
placeholder=
"搜索科技法案"
/>
<div
class=
"search"
>
<div
class=
"search-icon"
>
<img
src=
"./assets/images/search-icon.png"
alt=
""
/>
</div>
<div
class=
"search-text"
@
click=
"handleSearch"
>
搜索
</div>
</div>
</div>
<div
class=
"home-content-header-btn-box"
v-show=
"!isShow"
>
<div
class=
"btn"
@
click=
"handleToPosi('position1')"
>
<div
class=
"btn-text"
>
{{
"最新动态"
}}
</div>
<div
class=
"btn-icon"
>
<img
src=
"@/assets/icons/arrow-right-icon.png"
alt=
""
/>
</div>
</div>
<div
class=
"btn"
@
click=
"handleToPosi('position2')"
>
<div
class=
"btn-text"
>
{{
"资讯要闻"
}}
</div>
<div
class=
"btn-icon"
>
<img
src=
"@/assets/icons/arrow-right-icon.png"
alt=
""
/>
</div>
</div>
<div
class=
"btn"
@
click=
"handleToPosi('position3')"
>
<div
class=
"btn-text"
>
{{
"数据总览"
}}
</div>
<div
class=
"btn-icon"
>
<img
src=
"@/assets/icons/arrow-right-icon.png"
alt=
""
/>
</div>
</div>
<div
class=
"btn"
@
click=
"handleToPosi('position4')"
>
<div
class=
"btn-text"
>
{{
"资源库"
}}
</div>
<div
class=
"btn-icon"
>
<img
src=
"@/assets/icons/arrow-right-icon.png"
alt=
""
/>
</div>
</div>
</div>
<SearchContainer
style=
"margin-bottom: 0; height: fit-content"
v-if=
"containerRef"
placeholder=
"搜索科技法案"
:containerRef=
"containerRef"
areaName=
"法案"
:enableBillTypeSwitch=
"true"
defaultBillSearchType=
"federal"
/>
</div>
<DivideHeader
id=
"position1"
class=
"divide1"
:titleText=
"'最新动态'"
></DivideHeader>
<div
class=
"home-content-center"
>
<div
class=
"center-top"
>
...
...
@@ -107,8 +36,8 @@
</div>
</div>
<div
class=
"box1-main"
style=
"display: block"
>
<el-carousel
ref=
"carouselRef"
height=
"354px"
:autoplay=
"true"
:interval=
"3000"
arrow=
"never"
indicator-position=
"none"
@
change=
"handleCarouselChange"
>
<el-carousel
ref=
"carouselRef"
height=
"354px"
:autoplay=
"true"
:interval=
"3000"
arrow=
"never"
indicator-position=
"none"
@
change=
"handleCarouselChange"
>
<el-carousel-item
v-for=
"(bill, billIndex) in hotBillList"
:key=
"billIndex"
>
<div
class=
"carousel-content"
style=
"display: flex; height: 100%"
>
<div
class=
"box1-main-left"
>
...
...
@@ -117,17 +46,9 @@
{{
bill
.
billName
}}
</div>
<div
class=
"box1-main-left-info"
>
<AreaTag
v-for=
"(item, index) in bill.hylyList"
:key=
"index"
:tagName=
"item.industryName"
>
<AreaTag
v-for=
"(item, index) in bill.hylyList"
:key=
"index"
:tagName=
"item.industryName"
>
</AreaTag>
<div
class=
"info-box"
:class=
"
{
info1: index === 0,
info2: index === 1,
info3: index === 2,
info4: index === 3
}" v-for="(item, index) in bill.hylyList" :key="index">
{{
item
.
industryName
}}
</div>
</div>
<div
class=
"box1-main-left-info1"
>
<div
class=
"info1-box"
>
...
...
@@ -144,15 +65,18 @@
</div>
</div>
<div
class=
"box1-main-left-info2"
>
<div
class=
"info2-item"
v-for=
"(item, index) in bill.dyqkList"
:key=
"index"
>
<div
class=
"time-line"
v-if=
"index !== bill.dyqkList.length - 1"
></div>
<div
class=
"info2-item"
v-for=
"(item, index) in bill.dyqkList"
:key=
"index"
>
<div
class=
"time-line"
v-if=
"index !== bill.dyqkList.length - 1"
></div>
<div
class=
"item-icon"
>
<img
src=
"./assets/images/info2-icon.png"
alt=
""
/>
</div>
<div
class=
"item-time"
:class=
"
{ itemTimeActive: index === 0 }">
{{
item
.
actionDate
}}
</div>
<div
class=
"item-title"
:class=
"
{ itemTitleActive: index === 0 }">
<div
class=
"item-title"
:class=
"
{ itemTitleActive: index === 0 }">
{{
item
.
actionContentCn
}}
</div>
</div>
...
...
@@ -179,121 +103,19 @@
</el-carousel>
</div>
</div>
<!--
<div
class=
"box2"
>
<div
class=
"box2-header"
>
<div
class=
"icon"
>
<img
src=
"./assets/images/box2-header-icon.png"
alt=
""
/>
</div>
<div
class=
"title"
>
<div
class=
"text"
>
{{
"风险信号"
}}
</div>
<div
class=
"num"
>
{{
warningList
.
length
}}
</div>
</div>
</div>
<div
class=
"box2-main"
>
<div
class=
"box2-main-item"
v-for=
"(item, index) in warningList"
:key=
"index"
@
click=
"handleClickToDetailO(item)"
>
<div
class=
"item-left"
:class=
"
{
itemLeftStatus1: item.signalLevel === '特别重大',
itemLeftStatus2: item.signalLevel === '重大风险'
}">
{{
item
.
signalLevel
?
item
.
signalLevel
:
"一般风险"
}}
</div>
<div
class=
"item-right"
>
<div
class=
"text"
>
{{
item
.
signalTitle
}}
</div>
<div
class=
"time"
>
{{
item
.
signalTime
}}
</div>
</div>
</div>
</div>
<div
class=
"box2-footer"
@
click=
"handleToMoreRiskSignal"
>
<div
class=
"icon"
>
<img
src=
"./assets/images/box2-footer-icon.png"
alt=
""
/>
</div>
<div
class=
"text"
>
{{
"查看更多"
}}
</div>
</div>
</div>
-->
<RiskSignal
:list=
"warningList"
@
more-click=
"handleToMoreRiskSignal"
@
item-click=
'handleClickToDetailO'
riskLevel=
"signalLevel"
postDate=
"signalTime"
name=
"signalTitle"
/>
<RiskSignal
:list=
"warningList"
@
more-click=
"handleToMoreRiskSignal"
@
item-click=
"handleClickToDetailO"
riskLevel=
"signalLevel"
postDate=
"signalTime"
name=
"signalTitle"
/>
</div>
<DivideHeader
id=
"position2"
class=
"divide2"
:titleText=
"'资讯要闻'"
></DivideHeader>
<div
class=
"center-center"
>
<!--
<div
class=
"box3"
>
<div
class=
"box3-header"
>
<div
class=
"box3-header-left"
>
<div
class=
"box3-header-icon"
>
<img
src=
"./assets/images/box3-header-icon.png"
alt=
""
/>
</div>
<div
class=
"box3-header-title"
>
{{
"新闻资讯"
}}
</div>
<div
class=
"more"
@
click=
"handleToMoreNews"
>
{{
"更多 +"
}}
</div>
</div>
</div>
<div
class=
"box3-main"
>
<div
class=
"box3-item"
v-for=
"(news, index) in newsList.slice(0, 5)"
:key=
"index"
@
click=
"handleClickToNewsDetail(news)"
>
<div
class=
"left"
>
<img
:src=
"getProxyUrl(news.newsImage) || defaultNew"
alt=
""
referrerpolicy=
"no-referrer"
@
error=
"e => (e.target.src = News1)"
/>
</div>
<div
class=
"right"
>
<div
class=
"right-top"
>
<div
class=
"title"
>
{{
news
.
newsTitle
}}
</div>
<div
class=
"time"
>
{{
news
.
newsDate
?
news
.
newsDate
.
slice
(
5
)
:
""
}}
-
{{
news
.
newsOrg
}}
</div>
</div>
<div
class=
"right-footer"
>
{{
news
.
newsContent
}}
</div>
<!--
<CommonPrompt
:content=
"news.newsContent"
>
<div
class=
"right-footer"
>
{{
news
.
newsContent
}}
</div>
</CommonPrompt>
--
</div>
</div>
</div>
</div>
-->
<NewsList
:list=
"newsList"
/>
<MessageBubble
:messageList=
"messageList"
imageUrl=
"personImage"
@
more-click=
"handleToSocialDetail"
@
person-click=
"handleClcikToCharacter"
name=
"personName"
content=
"remarks"
source=
"orgName"
/>
<!--
<div
class=
"box4"
>
<div
class=
"box4-header"
>
<div
class=
"header-icon"
>
<img
src=
"./assets/images/box4-header-icon.png"
alt=
""
/>
</div>
<div
class=
"header-title"
>
{{
"社交媒体"
}}
</div>
</div>
<div
class=
"box4-main"
>
<MessageBubble
v-for=
"(item, index) in messageList"
@
click=
"handleClcikToCharacter(item.personId, item.personName)"
@
info-click=
"handleMediaClick(item)"
:key=
"index"
:avatar=
"item.personImage ? item.personImage : defaultIcon01"
:name=
"item.personName"
:time=
"item.time"
:source=
"item.orgName"
:content=
"item.remarks"
/>
<!--
<div
class=
"box4-main-item"
v-for=
"(item, index) in messageList"
:key=
"index"
>
<div
class=
"left"
@
click=
"handleClcikToCharacter(item.personId, item.personName)"
>
<img
:src=
"getProxyUrl(item.personImage) || Message3"
alt=
""
referrerpolicy=
"no-referrer"
@
error=
"e => (e.target.src = Message3)"
/>
</div>
<div
class=
"right"
>
<div
class=
"right-top"
>
<div
class=
"name"
>
{{
item
.
personName
}}
</div>
<div
class=
"time"
>
{{
formatMessageTime
(
item
.
time
)
}}
·发布于
{{
item
.
orgName
}}
</div>
</div>
<div
class=
"content"
>
{{
item
.
remarks
}}
</div>
</div>
</div>
--
</div>
</div>
-->
<MessageBubble
:messageList=
"messageList"
imageUrl=
"personImage"
@
more-click=
"handleToSocialDetail"
@
person-click=
"handleClcikToCharacter"
name=
"personName"
content=
"remarks"
source=
"orgName"
/>
</div>
<DivideHeader
id=
"position3"
class=
"divide3"
:titleText=
"'数据总览'"
></DivideHeader>
<div
class=
"center-footer"
>
<div
class=
"box5"
>
...
...
@@ -310,19 +132,17 @@
</div>
<div
class=
"header-right-text"
>
{{
"数据来源:美国国会官方网站"
}}
</div>
-->
<div
class=
"box5-select"
>
<el-select
v-model=
"box5Select"
placeholder=
"选择领域"
@
change=
"handleBox5Change"
style=
"width: 150px"
>
<el-select
v-model=
"box5Select"
placeholder=
"选择领域"
@
change=
"handleBox5Change"
style=
"width: 150px"
>
<el-option
label=
"全部领域"
value=
"全部领域"
/>
<el-option
v-for=
"item in categoryList"
:key=
"item.id"
:label=
"item.name"
:value=
"item.id"
/>
<el-option
v-for=
"item in categoryList"
:key=
"item.id"
:label=
"item.name"
:value=
"item.id"
/>
</el-select>
</div>
</div>
</div>
<div
class=
"box5-main"
:style=
"
{
display: !box5HasData ? 'flex' : 'block',
justifyContent: 'center',
alignItems: 'center'
}">
<div
class=
"box5-main"
:style=
"getEmptyStateStyle(box5HasData)"
>
<el-empty
v-if=
"!box5HasData"
description=
"暂无数据"
:image-size=
"100"
/>
<div
v-else
id=
"box5Chart"
style=
"width: 100%; height: 100%"
></div>
</div>
...
...
@@ -332,15 +152,18 @@
<div
class=
"header-icon"
>
<img
src=
"./assets/images/box6-header-icon.png"
alt=
""
/>
</div>
<div
class=
"header-title"
>
{{
"关键条款"
}}
</div>
<!--
<div
class=
"box6-header-right"
>
<div
class=
"header-right-icon"
>
<img
src=
"./assets/images/tips-icon.png"
alt=
""
/>
</div>
<div
class=
"header-right-text"
>
{{
"数据来源:美国国会官方网站"
}}
</div>
</div>
-->
<div
class=
"header-title"
>
{{
"涉华法案领域分布"
}}
</div>
<div
class=
"box6-header-right"
>
<el-select
v-model=
"box9selectetedTime"
placeholder=
"选择时间"
style=
"width: 90px"
>
<el-option
v-for=
"item in box9YearList"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
</el-select>
</div>
</div>
<div
class=
"box6-main"
:style=
"getEmptyStateStyle(box9HasData)"
>
<el-empty
v-if=
"!box9HasData"
description=
"暂无数据"
:image-size=
"100"
/>
<div
v-else
id=
"box9Chart"
style=
"width: 100%; height: 100%"
></div>
</div>
<div
class=
"box6-main"
id=
"wordCloudChart"
></div>
</div>
</div>
<div
class=
"center-footer1"
>
...
...
@@ -358,7 +181,8 @@
</div>
-->
<!--
<div
class=
"header-right-text"
>
{{
"数据来源:美国国会官方网站"
}}
</div>
-->
<el-select
v-model=
"box7selectetedTime"
placeholder=
"选择时间"
style=
"width: 90px"
>
<el-option
v-for=
"item in box7YearList"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
<el-option
v-for=
"item in box7YearList"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
</el-select>
</div>
</div>
...
...
@@ -372,11 +196,7 @@
/>
</el-select>
</div>
-->
<div
class=
"box7-main"
:style=
"
{
display: !box7HasData ? 'flex' : 'block',
justifyContent: 'center',
alignItems: 'center'
}">
<div
class=
"box7-main"
:style=
"getEmptyStateStyle(box7HasData)"
>
<el-empty
v-if=
"!box7HasData"
description=
"暂无数据"
:image-size=
"100"
/>
<div
v-else
id=
"box7Chart"
style=
"width: 100%; height: 100%"
></div>
</div>
...
...
@@ -395,7 +215,8 @@
</div>
-->
<!--
<div
class=
"header-right-text"
>
{{
"数据来源:美国国会官方网站"
}}
</div>
-->
<el-select
v-model=
"box8selectetedTime"
placeholder=
"选择时间"
style=
"width: 90px"
>
<el-option
v-for=
"item in box8YearList"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
<el-option
v-for=
"item in box8YearList"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
</el-select>
</div>
</div>
...
...
@@ -409,16 +230,13 @@
/>
</el-select>
</div>
-->
<div
class=
"box8-main"
:style=
"
{
display: box8Data.length === 0 ? 'flex' : 'block',
justifyContent: 'center',
alignItems: 'center'
}">
<div
class=
"box8-main"
:style=
"getEmptyStateStyle(box8Data.length > 0)"
>
<el-empty
v-if=
"box8Data.length === 0"
description=
"暂无数据"
:image-size=
"100"
/>
<div
v-else
class=
"box8-main-item"
v-for=
"(item, index) in box8Data"
:key=
"index"
@
click=
"handleClcikToCharacter(item.memberId, item.name)"
>
<div
class=
"box8-main-item-left"
>
<img
:src=
"getProxyUrl(item.img)"
alt=
""
referrerpolicy=
"no-referrer"
class=
"left-img"
/>
<img
:src=
"getProxyUrl(item.img)"
alt=
""
referrerpolicy=
"no-referrer"
class=
"left-img"
/>
<div
class=
"left-icon1"
>
<img
:src=
"item.dangpai"
alt=
""
/>
</div>
...
...
@@ -442,36 +260,10 @@
<
div
class
=
"box9-header-icon"
>
<
img
src
=
"./assets/images/box7-header-icon.png"
alt
=
""
/>
<
/div
>
<
div
class
=
"box9-header-title"
>
{{
"涉华法案领域分布"
}}
<
/div
>
<
/div
>
<
div
class
=
"box9-header-right"
>
<!--
<
div
class
=
"header-right-icon"
>
<
img
src
=
"./assets/images/tips-icon.png"
alt
=
""
/>
<
/div> --
>
<!--
<
div
class
=
"header-right-text"
>
{{
"数据来源:美国国会官方网站"
}}
<
/div> --
>
<
el
-
select
v
-
model
=
"box9selectetedTime"
placeholder
=
"选择时间"
style
=
"width: 90px"
>
<
el
-
option
v
-
for
=
"item in box9YearList"
:
key
=
"item.value"
:
label
=
"item.label"
:
value
=
"item.value"
/>
<
/el-select
>
<
div
class
=
"box9-header-title"
>
{{
"关键条款"
}}
<
/div
>
<
/div
>
<
/div
>
<!--
<
div
class
=
"box-center"
>
<
el
-
select
v
-
model
=
"box9selectetedTime"
placeholder
=
"选择时间"
style
=
"width: 90px"
>
<
el
-
option
v
-
for
=
"item in box9YearList"
:
key
=
"item.value"
:
label
=
"item.label"
:
value
=
"item.value"
/>
<
/el-select
>
<
/div> --
>
<
div
class
=
"box9-main"
:
style
=
"{
display: !box9HasData ? 'flex' : 'block',
justifyContent: 'center',
alignItems: 'center'
}
"
>
<
el
-
empty
v
-
if
=
"!box9HasData"
description
=
"暂无数据"
:
image
-
size
=
"100"
/>
<
div
v
-
else
id
=
"box9Chart"
style
=
"width: 100%; height: 100%"
><
/div
>
<
/div
>
<
div
class
=
"box9-main"
id
=
"wordCloudChart"
><
/div
>
<
/div
>
<
/div
>
<
/div
>
...
...
@@ -494,7 +286,8 @@
<
div
class
=
"title"
>
{{
"科技领域"
}}
<
/div
>
<
/div
>
<
div
class
=
"select-main"
>
<
el
-
checkbox
-
group
class
=
"checkbox-group"
v
-
model
=
"activeAreaList"
@
change
=
"handleAreaChange"
>
<
el
-
checkbox
-
group
class
=
"checkbox-group"
v
-
model
=
"activeAreaList"
@
change
=
"handleAreaChange"
>
<
el
-
checkbox
class
=
"filter-checkbox"
label
=
"全部领域"
>
全部领域
<
/el-checkbox
>
<
el
-
checkbox
v
-
for
=
"(area, index) in cateKuList"
:
key
=
"index"
:
label
=
"area.id"
class
=
"filter-checkbox"
>
...
...
@@ -509,8 +302,10 @@
<
div
class
=
"title"
>
{{
"党派"
}}
<
/div
>
<
/div
>
<
div
class
=
"select-main"
>
<
el
-
checkbox
-
group
class
=
"checkbox-group"
v
-
model
=
"activeDpList"
@
change
=
"handleDpChange"
>
<
el
-
checkbox
v
-
for
=
"(dp, index) in dpList"
:
key
=
"index"
:
label
=
"dp.id"
class
=
"filter-checkbox"
>
<
el
-
checkbox
-
group
class
=
"checkbox-group"
v
-
model
=
"activeDpList"
@
change
=
"handleDpChange"
>
<
el
-
checkbox
v
-
for
=
"(dp, index) in dpList"
:
key
=
"index"
:
label
=
"dp.id"
class
=
"filter-checkbox"
>
{{
dp
.
name
}}
<
/el-checkbox
>
<
/el-checkbox-group
>
...
...
@@ -522,8 +317,10 @@
<
div
class
=
"title"
>
{{
"议院"
}}
<
/div
>
<
/div
>
<
div
class
=
"select-main"
>
<
el
-
checkbox
-
group
class
=
"checkbox-group"
v
-
model
=
"activeYyList"
@
change
=
"handleYyChange"
>
<
el
-
checkbox
v
-
for
=
"(yy, index) in yyList"
:
key
=
"index"
:
label
=
"yy.id"
class
=
"filter-checkbox"
>
<
el
-
checkbox
-
group
class
=
"checkbox-group"
v
-
model
=
"activeYyList"
@
change
=
"handleYyChange"
>
<
el
-
checkbox
v
-
for
=
"(yy, index) in yyList"
:
key
=
"index"
:
label
=
"yy.id"
class
=
"filter-checkbox"
>
{{
yy
.
name
}}
<
/el-checkbox
>
<
/el-checkbox-group
>
...
...
@@ -536,8 +333,10 @@
<
div
class
=
"title"
>
{{
"发布时间"
}}
<
/div
>
<
/div
>
<
div
class
=
"select-main"
>
<
el
-
checkbox
-
group
class
=
"checkbox-group"
v
-
model
=
"activePubTime"
@
change
=
"handlePubTimeChange"
>
<
el
-
checkbox
v
-
for
=
"(time, index) in pubTime"
:
key
=
"index"
:
label
=
"time.id"
class
=
"filter-checkbox"
>
<
el
-
checkbox
-
group
class
=
"checkbox-group"
v
-
model
=
"activePubTime"
@
change
=
"handlePubTimeChange"
>
<
el
-
checkbox
v
-
for
=
"(time, index) in pubTime"
:
key
=
"index"
:
label
=
"time.id"
class
=
"filter-checkbox"
>
{{
time
.
name
}}
<
/el-checkbox
>
<
/el-checkbox-group
>
...
...
@@ -549,19 +348,20 @@
<
div
class
=
"right-header-box"
>
<
el
-
select
v
-
model
=
"footerSelect1"
placeholder
=
"选择委员会"
style
=
"width: 240px"
@
change
=
"handleFooterSelect1Change"
>
<
el
-
option
v
-
for
=
"item in postOrgList"
:
key
=
"item.departmentId"
:
label
=
"item.departmentName"
:
value
=
"item.departmentId"
/>
<
el
-
option
v
-
for
=
"item in postOrgList"
:
key
=
"item.departmentId"
:
label
=
"item.departmentName"
:
value
=
"item.departmentId"
/>
<
/el-select
>
<
/div
>
<
div
class
=
"right-header-box"
>
<
el
-
select
v
-
model
=
"footerSelect2"
placeholder
=
"选择提出议员"
style
=
"width: 240px"
@
change
=
"handleFooterSelect2Change"
>
<
el
-
option
v
-
for
=
"item in postMemberList"
:
key
=
"item.memberId"
:
label
=
"item.memberName"
:
value
=
"item.memberId"
/>
<
el
-
option
v
-
for
=
"item in postMemberList"
:
key
=
"item.memberId"
:
label
=
"item.memberName"
:
value
=
"item.memberId"
/>
<
/el-select
>
<
/div
>
<
div
class
=
"right-header-box"
style
=
"margin-left: auto"
>
<
el
-
select
v
-
model
=
"releaseTime"
placeholder
=
"选择排序方式"
style
=
"width: 120px"
@
change
=
"handlePxChange"
>
<
el
-
select
v
-
model
=
"releaseTime"
placeholder
=
"选择排序方式"
style
=
"width: 120px"
@
change
=
"handlePxChange"
>
<
template
#
prefix
>
<
div
style
=
"display: flex; align-items: center; height: 100%"
>
<
img
:
src
=
"desc"
style
=
"width: 14px; height: 14px"
/>
...
...
@@ -592,7 +392,8 @@
<
div
class
=
"item"
>
<
div
class
=
"item-left"
>
{{
"相关领域:"
}}
<
/div
>
<
div
class
=
"item-right1"
>
<
div
class
=
"tag"
v
-
for
=
"(val, idx) in item.areaList"
:
key
=
"idx"
>
{{
val
}}
<
/div
>
<
div
class
=
"tag"
v
-
for
=
"(val, idx) in item.areaList"
:
key
=
"idx"
>
{{
val
}}
<
/div
>
<
/div
>
<
/div
>
<
div
class
=
"item"
>
...
...
@@ -604,8 +405,8 @@
<
div
class
=
"item"
>
<
div
class
=
"item-left"
>
{{
"法案进展:"
}}
<
/div
>
<
div
class
=
"item-right2"
>
<
div
class
=
"tag"
v
-
for
=
"(val, idx) in [...item.progress].reverse()"
:
key
=
"idx"
:
style
=
"{ zIndex: item.progress.length - idx
}
"
>
<
div
class
=
"tag"
v
-
for
=
"(val, idx) in [...item.progress].reverse()"
:
key
=
"idx"
:
style
=
"{ zIndex: item.progress.length - idx
}
"
>
{{
val
}}
<
/div
>
<
/div
>
...
...
@@ -617,8 +418,9 @@
{{
`共 ${total
}
项`
}}
<
/div
>
<
div
class
=
"footer-right"
>
<
el
-
pagination
@
current
-
change
=
"handleCurrentChange"
:
page
-
size
=
"pageSize"
:
current
-
page
=
"currentPage"
background
layout
=
"prev, pager, next"
:
total
=
"total"
/>
<
el
-
pagination
@
current
-
change
=
"handleCurrentChange"
:
page
-
size
=
"pageSize"
:
current
-
page
=
"currentPage"
background
layout
=
"prev, pager, next"
:
total
=
"total"
/>
<
/div
>
<
/div
>
<
/div
>
...
...
@@ -631,16 +433,13 @@
<
script
setup
>
import
RiskSignal
from
"@/components/RiskSignal/RiskSignal.vue"
;
import
{
onMounted
,
ref
,
computed
,
onUnmounted
,
nextTick
,
watch
}
from
"vue"
;
import
{
onMounted
,
ref
,
onUnmounted
,
nextTick
,
watch
}
from
"vue"
;
import
router
from
"@/router/index"
;
import
setChart
from
"@/utils/setChart"
;
import
HeaderMenu
from
"@/components/headerMenu.vue"
;
import
headerInfo
from
"@/components/headerInfo.vue"
;
import
{
getBillIndustry
,
getHotBills
,
getBillRiskSignal
,
getBillsByType
,
getHylyList
,
getBillOverviewKeyTK
,
getBillCount
,
...
...
@@ -662,24 +461,14 @@ import getWordCloudChart from "./utils/worldCloudChart";
import
getPieChart
from
"./utils/piechart"
;
import
getDoublePieChart
from
"./utils/doublePieChart"
;
import
defaultNew
from
"../assets/images/default-icon-news.png"
;
import
News1
from
"./assets/images/news1.png"
;
import
defaultIcon01
from
"../../../assets/icons/default-icon1.png"
;
import
desc
from
"./assets/icons/icon-desc.png"
;
import
Message1
from
"./assets/images/message-icon1.png"
;
import
Message2
from
"./assets/images/message-icon2.png"
;
import
Message3
from
"./assets/images/message-icon3.png"
;
import
Cyy
from
"@/assets/icons/cyy.png"
;
import
Zyy
from
"@/assets/icons/zyy.png"
;
import
Ghd
from
"@/assets/icons/ghd.png"
;
import
Mzd
from
"@/assets/icons/mzd.png"
;
import
{
ElMessage
}
from
"element-plus"
;
const
searchBillText
=
ref
(
""
);
// 处理图片代理
const
getProxyUrl
=
url
=>
{
if
(
!
url
)
return
""
;
...
...
@@ -698,18 +487,6 @@ const getProxyUrl = url => {
return
`https://images.weserv.nl/?url=${encodeURIComponent(cleanUrl)
}
`
;
}
;
const
formatMessageTime
=
timeStr
=>
{
if
(
!
timeStr
)
return
""
;
// 假设格式为 2025-11-02T12:09:45
if
(
timeStr
.
includes
(
"T"
))
{
const
[
date
,
time
]
=
timeStr
.
split
(
"T"
);
const
[
year
,
month
,
day
]
=
date
.
split
(
"-"
);
const
[
hour
,
minute
]
=
time
.
split
(
":"
);
return
`${year
}
-${month
}
-${day
}
${hour
}
:${minute
}
`
;
}
return
timeStr
;
}
;
// 跳转人物主页
const
handleClcikToCharacter
=
async
(
id
,
name
)
=>
{
const
personTypeList
=
JSON
.
parse
(
window
.
sessionStorage
.
getItem
(
"personTypeList"
));
...
...
@@ -833,27 +610,15 @@ const handleToMoreRiskSignal = () => {
const
route
=
router
.
resolve
(
"/riskSignal"
);
window
.
open
(
route
.
href
,
"_blank"
);
}
;
// 跳转新闻详情页
const
handleClickToNewsDetail
=
news
=>
{
// window.sessionStorage.setItem("newsId", "119_HR_1");
const
route
=
router
.
resolve
({
path
:
"/newsAnalysis"
,
query
:
{
newsId
:
news
.
newsId
}
}
);
window
.
open
(
route
.
href
,
"_blank"
);
}
;
// 查看更多新闻资讯
const
handleToMoreNews
=
()
=>
{
const
route
=
router
.
resolve
(
"/newsBrief"
);
window
.
open
(
route
.
href
,
"_blank"
);
}
;
// 风险信号
const
warningList
=
ref
([]);
const
getEmptyStateStyle
=
hasData
=>
({
display
:
hasData
?
"block"
:
"flex"
,
justifyContent
:
"center"
,
alignItems
:
"center"
}
);
const
box7selectetedTime
=
ref
(
"2025"
);
const
box7YearList
=
ref
([
{
...
...
@@ -960,13 +725,14 @@ const handleGetNews = async () => {
const
res
=
await
getNews
(
params
);
console
.
log
(
"新闻资讯"
,
res
);
if
(
res
.
code
===
200
)
{
newsList
.
value
=
res
.
data
||
[].
map
(
item
=>
{
return
{
...
item
,
from
:
`${item.newsOrg
}
· ${item.newsDate ? item.newsDate.slice(5) : ""
}
`
,
}
;
}
);
newsList
.
value
=
res
.
data
||
[].
map
(
item
=>
{
return
{
...
item
,
from
:
`${item.newsOrg
}
· ${item.newsDate ? item.newsDate.slice(5) : ""
}
`
}
;
}
);
}
}
catch
(
error
)
{
}
}
;
...
...
@@ -984,7 +750,6 @@ const handleGetRemarks = async () => {
return
{
...
item
,
time
:
item
.
time
.
replace
(
"T"
,
" "
)
}
;
}
);
}
...
...
@@ -1571,18 +1336,6 @@ const footerSelect2 = ref("全部提出议员");
//
}
// ]);
const
handleSearch
=
()
=>
{
window
.
sessionStorage
.
setItem
(
"curTabName"
,
`搜索-${searchBillText.value
}
`
);
const
curRoute
=
router
.
resolve
({
path
:
"/searchResults"
,
query
:
{
searchText
:
searchBillText
.
value
,
areaName
:
"法案"
}
}
);
window
.
open
(
curRoute
.
href
,
"_blank"
);
}
;
const
handleResize
=
()
=>
{
box9ChartInstance
&&
box9ChartInstance
.
resize
();
}
;
...
...
@@ -1624,10 +1377,6 @@ onUnmounted(() => {
<
/script
>
<
style
lang
=
"scss"
scoped
>
:
deep
(.
el
-
input__wrapper
)
{
box
-
shadow
:
none
;
}
.
home
-
wrapper
{
width
:
100
%
;
height
:
100
%
;
...
...
@@ -1755,8 +1504,8 @@ onUnmounted(() => {
}
.
home
-
top
-
bg
{
background
:
url
(
"./assets/images/background.png"
),
linear
-
gradient
(
180
deg
,
rgba
(
229
,
241
,
254
,
1
)
0
%
,
rgba
(
246
,
251
,
255
,
0
)
30
%
);
background
:
url
(
"./assets/images/background.png"
),
linear
-
gradient
(
180
deg
,
rgba
(
229
,
241
,
254
,
1
)
0
%
,
rgba
(
246
,
251
,
255
,
0
)
30
%
);
background
-
size
:
100
%
100
%
;
position
:
absolute
;
width
:
100
%
;
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论