Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
R
risk-monitor
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
蔡建
risk-monitor
Commits
b2d89c27
提交
b2d89c27
authored
12月 18, 2025
作者:
李智林
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
法案接口和样式更新
上级
b8fd958d
隐藏空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
676 行增加
和
568 行删除
+676
-568
billHome.js
src/api/bill/billHome.js
+49
-4
index.vue
src/views/bill/background/index.vue
+1
-1
index.vue
src/views/bill/billHome/index.vue
+608
-551
doublePieChart.js
src/views/bill/billHome/utils/doublePieChart.js
+3
-5
index.vue
src/views/bill/billLayout/index.vue
+1
-0
index.vue
src/views/bill/introdoction/index.vue
+14
-7
没有找到文件。
src/api/bill/billHome.js
浏览文件 @
b2d89c27
...
...
@@ -39,10 +39,37 @@ export function getHotBills() {
}
// 获取法案风险信号
export
function
getBillRiskSignal
()
{
/**
* @param {moduleId}
*/
export
function
getBillRiskSignal
(
params
)
{
return
request
({
method
:
'GET'
,
// 这个是之前的接口地址,现在接口地址换成新的了所以使用新地址
// url: '/api/BillOverview/riskSignal',
url
:
`/api/commonFeature/riskSignal/
${
params
.
moduleId
}
`
,
})
}
// 获取新闻资讯
/**
* @param {moduleId}
*/
export
function
getNews
(
params
)
{
return
request
({
method
:
'GET'
,
url
:
'/api/BillOverview/riskSignal'
,
url
:
`/api/commonFeature/news/
${
params
.
moduleId
}
`
,
})
}
// 获取社交媒体
/**
* @param {moduleId}
*/
export
function
getRemarks
(
params
)
{
return
request
({
method
:
'GET'
,
url
:
`/api/commonFeature/remarks/
${
params
.
moduleId
}
`
,
})
}
...
...
@@ -89,10 +116,27 @@ export function getMemberProposal(params) {
}
// 获取资源库
export
function
getBills
(
params
)
{
export
function
getBills
(
params
,
signal
)
{
return
request
({
method
:
'GET'
,
url
:
`/api/BillOverview/bills`
,
params
params
,
signal
})
}
// 获取提出部门列表
export
function
getPostOrgList
()
{
return
request
({
method
:
'GET'
,
url
:
`/api/BillDict/department`
,
})
}
// 获取提出议员列表
export
function
getPostMemberList
()
{
return
request
({
method
:
'GET'
,
url
:
`/api/BillDict/member`
,
})
}
\ No newline at end of file
src/views/bill/background/index.vue
浏览文件 @
b2d89c27
...
...
@@ -505,7 +505,7 @@ const handleGetBillPersonAnalyze = async (isOppose) => {
onMounted
(()
=>
{
handleGetBillBackground
();
handleGetRelatedEvent
();
handleGetBillPersonAnalyze
(
false
);
//
handleGetBillPersonAnalyze(false);
}
);
<
/script
>
...
...
src/views/bill/billHome/index.vue
浏览文件 @
b2d89c27
...
...
@@ -214,22 +214,21 @@
class=
"box2-main-item"
v-for=
"(item, index) in warningList"
:key=
"index"
@
click=
"handleClickToDetail()"
>
<div
class=
"item-left"
:class=
"
{
itemLeftStatus1: item.
risk
Level === '特别重大',
itemLeftStatus2: item.
risk
Level === '重大风险'
itemLeftStatus1: item.
signal
Level === '特别重大',
itemLeftStatus2: item.
signal
Level === '重大风险'
}"
>
{{
item
.
riskLevel
?
item
.
risk
Level
:
"一般风险"
}}
{{
item
.
signalLevel
?
item
.
signal
Level
:
"一般风险"
}}
</div>
<div
class=
"item-right"
>
<div
class=
"text"
>
{{
item
.
description
}}
{{
item
.
signalTitle
}}
</div>
<div
class=
"time"
>
{{
item
.
introductionDat
e
}}
</div>
<div
class=
"time"
>
{{
item
.
signalTim
e
}}
</div>
</div>
</div>
</div>
...
...
@@ -254,16 +253,16 @@
</div>
</div>
<div
class=
"box3-main"
>
<div
class=
"box3-item"
v-for=
"(news, index) in newsList"
:key=
"index"
>
<div
class=
"box3-item"
v-for=
"(news, index) in newsList"
:key=
"index"
@
click=
"handleClickToNewsDetail()"
>
<div
class=
"left"
>
<img
:src=
"news.
img
"
alt=
""
/>
<img
:src=
"news.
newsImage || News1
"
alt=
""
/>
</div>
<div
class=
"right"
>
<div
class=
"right-top"
>
<div
class=
"title"
>
{{
news
.
t
itle
}}
</div>
<div
class=
"time"
>
{{
news
.
from
}}
</div>
<div
class=
"title"
>
{{
news
.
newsT
itle
}}
</div>
<div
class=
"time"
>
{{
news
.
newsDate
?
news
.
newsDate
.
slice
(
5
)
:
''
}}
-
{{
news
.
newsOrg
}}
</div>
</div>
<div
class=
"right-footer"
>
{{
news
.
c
ontent
}}
</div>
<div
class=
"right-footer"
>
{{
news
.
newsC
ontent
}}
</div>
</div>
</div>
</div>
...
...
@@ -278,14 +277,14 @@
<div
class=
"box4-main"
>
<div
class=
"box4-main-item"
v-for=
"(item, index) in messageList"
:key=
"index"
>
<div
class=
"left"
@
click=
"handleClcikToCharacter(index)"
>
<img
:src=
"item.
img
"
alt=
""
/>
<img
:src=
"item.
personImage
"
alt=
""
/>
</div>
<div
class=
"right"
>
<div
class=
"right-top"
>
<div
class=
"name"
>
{{
item
.
n
ame
}}
</div>
<div
class=
"time"
>
{{
item
.
ti
me
}}
</div>
<div
class=
"name"
>
{{
item
.
personN
ame
}}
</div>
<div
class=
"time"
>
{{
formatMessageTime
(
item
.
time
)
}}
·发布于
{{
item
.
orgNa
me
}}
</div>
</div>
<div
class=
"content"
>
{{
item
.
content
}}
</div>
<div
class=
"content"
>
{{
item
.
remarks
}}
</div>
</div>
</div>
</div>
...
...
@@ -311,10 +310,13 @@
<div
class=
"box5-select"
>
<el-select
v-model=
"box5Select"
placeholder=
"选择领域"
@
change=
"handleBox5Change"
style=
"width: 150px"
>
<el-option
label=
"全部领域"
value=
"全部领域"
/>
<el-option
v-for=
"item in categoryList
.slice(1)
"
: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
class=
"box5-main"
id=
"box5Chart"
></div>
<div
class=
"box5-main"
:style=
"
{ display: !box5HasData ? 'flex' : 'block', justifyContent: 'center', alignItems: 'center' }">
<el-empty
v-if=
"!box5HasData"
description=
"暂无数据"
:image-size=
"100"
/>
<div
v-else
id=
"box5Chart"
style=
"width: 100%; height: 100%;"
></div>
</div>
</div>
<div
class=
"box6"
>
<div
class=
"box6-header"
>
...
...
@@ -358,7 +360,10 @@
/>
</el-select>
</div>
<div
class=
"box7-main"
id=
"box7Chart"
></div>
<div
class=
"box7-main"
:style=
"
{ display: !box7HasData ? 'flex' : 'block', justifyContent: 'center', alignItems: 'center' }">
<el-empty
v-if=
"!box7HasData"
description=
"暂无数据"
:image-size=
"100"
/>
<div
v-else
id=
"box7Chart"
style=
"width: 100%; height: 100%;"
></div>
</div>
</div>
<div
class=
"box8"
>
<div
class=
"box8-header"
>
...
...
@@ -385,12 +390,14 @@
/>
</el-select>
</div>
<div
class=
"box8-main"
>
<div
class=
"box8-main"
:style=
"
{ display: box8Data.length === 0 ? 'flex' : 'block', justifyContent: 'center', alignItems: 'center' }">
<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(
0
)"
@
click=
"handleClcikToCharacter(
index
)"
>
<div
class=
"box8-main-item-left"
>
<img
:src=
"item.img"
alt=
""
referrerpolicy=
"no-referrer"
class=
"left-img"
/>
...
...
@@ -436,7 +443,10 @@
/>
<
/el-select
>
<
/div
>
<
div
class
=
"box9-main"
id
=
"box9Chart"
><
/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
>
<
/div
>
<
/div
>
...
...
@@ -447,10 +457,10 @@
<
div
class
=
"btn-box"
>
<
div
class
=
"btn"
:
class
=
"{ btnActive: activeTabName === cate.name
}
"
:
class
=
"{ btnActive: activeTabName === cate.name
, disabled: index !== 0
}
"
v
-
for
=
"(cate, index) in tabList"
:
key
=
"index"
@
click
=
"handleClickTab(cate)"
@
click
=
"
index === 0 &&
handleClickTab(cate)"
>
{{
cate
.
name
}}
<
/div
>
...
...
@@ -465,9 +475,12 @@
<
div
class
=
"title"
>
{{
"科技领域"
}}
<
/div
>
<
/div
>
<
div
class
=
"select-main"
>
<
el
-
checkbox
-
group
class
=
"checkbox-group"
v
-
model
=
"activeAreaList"
>
<
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
area
List"
v
-
for
=
"(area, index) in
cateKu
List"
:
key
=
"area.id"
:
label
=
"area.id"
class
=
"filter-checkbox"
...
...
@@ -483,7 +496,7 @@
<
div
class
=
"title"
>
{{
"党派"
}}
<
/div
>
<
/div
>
<
div
class
=
"select-main"
>
<
el
-
checkbox
-
group
class
=
"checkbox-group"
v
-
model
=
"activeDpList"
>
<
el
-
checkbox
-
group
class
=
"checkbox-group"
v
-
model
=
"activeDpList"
@
change
=
"handleDpChange"
>
<
el
-
checkbox
v
-
for
=
"(dp, index) in dpList"
:
key
=
"dp.id"
...
...
@@ -501,7 +514,7 @@
<
div
class
=
"title"
>
{{
"议院"
}}
<
/div
>
<
/div
>
<
div
class
=
"select-main"
>
<
el
-
checkbox
-
group
class
=
"checkbox-group"
v
-
model
=
"activeYyList"
>
<
el
-
checkbox
-
group
class
=
"checkbox-group"
v
-
model
=
"activeYyList"
@
change
=
"handleYyChange"
>
<
el
-
checkbox
v
-
for
=
"(yy, index) in yyList"
:
key
=
"yy.id"
...
...
@@ -520,7 +533,7 @@
<
div
class
=
"title"
>
{{
"发布时间"
}}
<
/div
>
<
/div
>
<
div
class
=
"select-main"
>
<
el
-
checkbox
-
group
class
=
"checkbox-group"
v
-
model
=
"activePubTime"
>
<
el
-
checkbox
-
group
class
=
"checkbox-group"
v
-
model
=
"activePubTime"
@
change
=
"handlePubTimeChange"
>
<
el
-
checkbox
v
-
for
=
"(time, index) in pubTime"
:
key
=
"time.id"
...
...
@@ -536,27 +549,27 @@
<
div
class
=
"right"
>
<
div
class
=
"right-header"
>
<
div
class
=
"right-header-box"
>
<
el
-
select
v
-
model
=
"footerSelect1"
placeholder
=
"选择委员会"
style
=
"width: 240px"
>
<
el
-
select
v
-
model
=
"footerSelect1"
placeholder
=
"选择委员会"
style
=
"width: 240px"
@
change
=
"handleFooterSelect1Change"
>
<
el
-
option
v
-
for
=
"item in
footerSelectList1
"
:
key
=
"item.
value
"
:
label
=
"item.
label
"
:
value
=
"item.
value
"
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"
>
<
el
-
select
v
-
model
=
"footerSelect2"
placeholder
=
"选择提出议员"
style
=
"width: 240px"
@
change
=
"handleFooterSelect2Change"
>
<
el
-
option
v
-
for
=
"item in
footerSelectList2
"
:
key
=
"item.
value
"
:
label
=
"item.
label
"
:
value
=
"item.
value
"
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
"
>
<
el
-
select
v
-
model
=
"releaseTime"
placeholder
=
"选择
排序方式"
style
=
"width: 120px"
@
change
=
"handlePxChange
"
>
<
el
-
option
v
-
for
=
"item in releaseTimeList"
:
key
=
"item.value"
...
...
@@ -566,8 +579,8 @@
<
/el-select
>
<
/div
>
<
/div
>
<
div
class
=
"right-main"
>
<
div
class
=
"right-main-box"
v
-
for
=
"(item, index) in
footerBillList"
:
key
=
"index
"
>
<
div
class
=
"right-main"
v
-
loading
=
"loading"
>
<
div
class
=
"right-main-box"
v
-
for
=
"(item, index) in
bills"
:
key
=
"index"
@
click
=
"handleClickToDetail()
"
>
<
div
class
=
"header"
>
<
div
class
=
"title"
>
{{
item
.
name
}}
<
/div
>
<
div
class
=
"en-title"
>
{{
item
.
eName
}}
<
/div
>
...
...
@@ -597,22 +610,19 @@
<
/div
>
<
/div
>
<
/div
>
<
div
class
=
"right-main-box"
><
/div
>
<
div
class
=
"right-main-box"
><
/div
>
<
div
class
=
"right-main-box"
><
/div
>
<
/div
>
<
div
class
=
"right-footer"
>
<
div
class
=
"footer-left"
>
{{
`共
1149
项调查`
}}
{{
`共
${total
}
项调查`
}}
<
/div
>
<
div
class
=
"footer-right"
>
<
el
-
pagination
@
current
-
change
=
"handleCurrentChange"
:
page
Size
=
"12
"
:
page
-
size
=
"pageSize
"
:
current
-
page
=
"currentPage"
background
layout
=
"prev, pager, next"
:
total
=
"
1149
"
:
total
=
"
total
"
/>
<
/div
>
<
/div
>
...
...
@@ -637,7 +647,12 @@ import {
getBillOverviewKeyTK
,
getBillCount
,
getBillPostOrg
,
getMemberProposal
getMemberProposal
,
getNews
,
getRemarks
,
getPostOrgList
,
getPostMemberList
,
getBills
}
from
"@/api/bill/billHome"
;
import
DivideHeader
from
"@/components/DivideHeader.vue"
;
...
...
@@ -692,6 +707,18 @@ import { iteratee } from "lodash";
const
searchBillText
=
ref
(
""
);
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
=
index
=>
{
let
type
;
...
...
@@ -722,6 +749,7 @@ const currentPage = ref(1);
// 处理页码改变事件
const
handleCurrentChange
=
page
=>
{
currentPage
.
value
=
page
;
handleGetBills
();
}
;
const
containerRef
=
ref
(
null
);
...
...
@@ -772,6 +800,12 @@ const handleToMoreRiskSignal = () => {
const
route
=
router
.
resolve
(
"/riskSignal"
);
window
.
open
(
route
.
href
,
"_blank"
);
}
;
// 跳转新闻详情页
const
handleClickToNewsDetail
=
()
=>
{
// window.sessionStorage.setItem("newsId", "119_HR_1");
const
route
=
router
.
resolve
(
"/newsAnalysis"
);
window
.
open
(
route
.
href
,
"_blank"
);
}
;
// 查看更多新闻资讯
const
handleToMoreNews
=
()
=>
{
...
...
@@ -780,161 +814,135 @@ const handleToMoreNews = () => {
}
;
// 风险信号
const
warningList
=
ref
([
{
title
:
"美国大而美法案落地,总统签署通过"
,
time
:
"一天前"
,
status
:
"特别重大"
}
,
{
title
:
"美大而美法案7月1日以51:50的票数通过..."
,
time
:
"一天前"
,
status
:
"特别重大"
}
,
{
title
:
"首次提出“限制外国敏感实体获取补贴”"
,
time
:
"一天前"
,
status
:
"重大风险"
}
,
{
title
:
"将中国企业海外子公司、合资公司纳入受..."
,
time
:
"一天前"
,
status
:
"重大风险"
}
,
{
title
:
"H.R.8333《生物安全法案》将华大基因等..."
,
time
:
"一天前"
,
status
:
"一般风险"
}
]);
const
warningList
=
ref
([]);
// 资源库 法案列表
const
billList
=
ref
([
{
billName
:
"大而美法案"
,
introductionDate
:
"2025年7月4日"
,
status
:
"特别重大风险"
,
tagList
:
[
"集成电路"
,
"人工智能"
],
img
:
bill1
,
yuan
:
"众议院"
,
dangpai
:
"共和党"
}
,
{
billName
:
"GENIUS稳定币法案"
,
introductionDate
:
"2025年7月5日"
,
status
:
""
,
tagList
:
[
"集成电路"
,
"人工智能"
],
img
:
bill2
,
yuan
:
"众议院"
,
dangpai
:
"共和党"
}
,
{
billName
:
"美越贸易协议"
,
introductionDate
:
"2025年7月6日"
,
status
:
""
,
tagList
:
[
"集成电路"
,
"人工智能"
],
img
:
bill3
,
yuan
:
"众议院"
,
dangpai
:
"共和党"
}
,
{
billName
:
"美越贸易协议"
,
introductionDate
:
"2025年7月7日"
,
status
:
"特别重大风险"
,
tagList
:
[
"集成电路"
,
"人工智能"
],
img
:
bill4
,
yuan
:
"众议院"
,
dangpai
:
"共和党"
}
,
{
billName
:
"汽车零部件25%关税实施规则"
,
introductionDate
:
"2025年7月10日"
,
status
:
"重大风险"
,
tagList
:
[
"集成电路"
,
"人工智能"
],
img
:
bill5
,
yuan
:
"众议院"
,
dangpai
:
"共和党"
}
,
{
billName
:
"汽车零部件25%关税实施规则"
,
introductionDate
:
"2025年7月12日"
,
status
:
""
,
tagList
:
[
"集成电路"
,
"人工智能"
],
img
:
bill6
,
yuan
:
"众议院"
,
dangpai
:
"共和党"
}
,
{
billName
:
"小额豁免包裹政策调整"
,
introductionDate
:
"2025年7月14日"
,
status
:
"特别重大风险"
,
tagList
:
[
"集成电路"
,
"人工智能"
],
img
:
bill7
,
yuan
:
"众议院"
,
dangpai
:
"共和党"
}
,
{
billName
:
"NIH预算否决案"
,
introductionDate
:
"2025年7月15日"
,
status
:
"重大风险"
,
tagList
:
[
"集成电路"
,
"人工智能"
],
img
:
bill8
,
yuan
:
"众议院"
,
dangpai
:
"共和党"
}
,
{
billName
:
"得州国会选区重划法案"
,
introductionDate
:
"2025年7月17日"
,
status
:
"一般风险"
,
tagList
:
[
"集成电路"
,
"人工智能"
],
img
:
bill9
,
yuan
:
"众议院"
,
dangpai
:
"共和党"
}
,
{
billName
:
"美越贸易协议"
,
introductionDate
:
"2025年7月24日"
,
status
:
""
,
tagList
:
[
"集成电路"
,
"人工智能"
],
img
:
bill10
,
yuan
:
"众议院"
,
dangpai
:
"共和党"
}
,
{
billName
:
"美越贸易协议"
,
introductionDate
:
"2025年8月4日"
,
status
:
""
,
tagList
:
[
"集成电路"
,
"人工智能"
],
img
:
bill11
,
yuan
:
"众议院"
,
dangpai
:
"共和党"
}
,
{
billName
:
"美越贸易协议"
,
introductionDate
:
"2025年8月8日"
,
status
:
"特别重大风险"
,
tagList
:
[
"集成电路"
,
"人工智能"
],
img
:
bill12
,
yuan
:
"众议院"
,
dangpai
:
"共和党"
}
,
{
billName
:
"美越贸易协议"
,
introductionDate
:
"2025年8月8日"
,
status
:
"特别重大风险"
,
tagList
:
[
"集成电路"
,
"人工智能"
],
img
:
bill12
,
yuan
:
"众议院"
,
dangpai
:
"共和党"
}
]);
//
const billList = ref([
//
{
//
billName: "大而美法案",
//
introductionDate: "2025年7月4日",
//
status: "特别重大风险",
//
tagList: ["集成电路", "人工智能"],
//
img: bill1,
//
yuan: "众议院",
//
dangpai: "共和党"
//
}
,
//
{
//
billName: "GENIUS稳定币法案",
//
introductionDate: "2025年7月5日",
//
status: "",
//
tagList: ["集成电路", "人工智能"],
//
img: bill2,
//
yuan: "众议院",
//
dangpai: "共和党"
//
}
,
//
{
//
billName: "美越贸易协议",
//
introductionDate: "2025年7月6日",
//
status: "",
//
tagList: ["集成电路", "人工智能"],
//
img: bill3,
//
yuan: "众议院",
//
dangpai: "共和党"
//
}
,
//
{
//
billName: "美越贸易协议",
//
introductionDate: "2025年7月7日",
//
status: "特别重大风险",
//
tagList: ["集成电路", "人工智能"],
//
img: bill4,
//
yuan: "众议院",
//
dangpai: "共和党"
//
}
,
//
{
//
billName: "汽车零部件25%关税实施规则",
//
introductionDate: "2025年7月10日",
//
status: "重大风险",
//
tagList: ["集成电路", "人工智能"],
//
img: bill5,
//
yuan: "众议院",
//
dangpai: "共和党"
//
}
,
//
{
//
billName: "汽车零部件25%关税实施规则",
//
introductionDate: "2025年7月12日",
//
status: "",
//
tagList: ["集成电路", "人工智能"],
//
img: bill6,
//
yuan: "众议院",
//
dangpai: "共和党"
//
}
,
//
{
//
billName: "小额豁免包裹政策调整",
//
introductionDate: "2025年7月14日",
//
status: "特别重大风险",
//
tagList: ["集成电路", "人工智能"],
//
img: bill7,
//
yuan: "众议院",
//
dangpai: "共和党"
//
}
,
//
{
//
billName: "NIH预算否决案",
//
introductionDate: "2025年7月15日",
//
status: "重大风险",
//
tagList: ["集成电路", "人工智能"],
//
img: bill8,
//
yuan: "众议院",
//
dangpai: "共和党"
//
}
,
//
{
//
billName: "得州国会选区重划法案",
//
introductionDate: "2025年7月17日",
//
status: "一般风险",
//
tagList: ["集成电路", "人工智能"],
//
img: bill9,
//
yuan: "众议院",
//
dangpai: "共和党"
//
}
,
//
{
//
billName: "美越贸易协议",
//
introductionDate: "2025年7月24日",
//
status: "",
//
tagList: ["集成电路", "人工智能"],
//
img: bill10,
//
yuan: "众议院",
//
dangpai: "共和党"
//
}
,
//
{
//
billName: "美越贸易协议",
//
introductionDate: "2025年8月4日",
//
status: "",
//
tagList: ["集成电路", "人工智能"],
//
img: bill11,
//
yuan: "众议院",
//
dangpai: "共和党"
//
}
,
//
{
//
billName: "美越贸易协议",
//
introductionDate: "2025年8月8日",
//
status: "特别重大风险",
//
tagList: ["集成电路", "人工智能"],
//
img: bill12,
//
yuan: "众议院",
//
dangpai: "共和党"
//
}
,
//
{
//
billName: "美越贸易协议",
//
introductionDate: "2025年8月8日",
//
status: "特别重大风险",
//
tagList: ["集成电路", "人工智能"],
//
img: bill12,
//
yuan: "众议院",
//
dangpai: "共和党"
//
}
//
]);
// 当前展示法案列表
const
curBillList
=
computed
(()
=>
{
const
startIndex
=
(
currentPage
.
value
-
1
)
*
12
;
const
endIndex
=
startIndex
+
12
;
return
billList
.
value
.
slice
(
startIndex
,
endIndex
);
}
);
//
const curBillList = computed(() =>
{
//
const startIndex = (currentPage.value - 1) * 12;
//
const endIndex = startIndex + 12;
//
return billList.value.slice(startIndex, endIndex);
//
}
);
const
box7selectetedTime
=
ref
(
"2025"
);
const
box7YearList
=
ref
([
...
...
@@ -975,52 +983,24 @@ const box8YearList = ref([
value
:
"2022"
}
]);
const
releaseTime
=
ref
(
"近一年发布"
);
// 发布时间
// 排序方式
const
releaseTime
=
ref
(
true
);
const
releaseTimeList
=
ref
([
{
label
:
"
近半年发布
"
,
value
:
"近半年发布"
label
:
"
正序
"
,
value
:
true
}
,
{
label
:
"近一年发布"
,
value
:
"近一年发布"
}
,
{
label
:
"近两年发布"
,
value
:
"近两年发布"
}
,
{
label
:
"近三年发布"
,
value
:
"近三年发布"
}
,
{
label
:
"近五年发布"
,
value
:
"近五年发布"
label
:
"倒序"
,
value
:
false
}
]);
// 涉华法案数量使用的领域分类列表
const
categoryList
=
ref
([]);
// 资源库使用的领域分类列表
const
cateKuList
=
ref
([]);
const
categoryList
=
ref
([
// "全部分类",
// "生物科技",
// "集成电路",
// "通信网络",
// "量子科技",
// "新能源",
// "新一代信息技术",
// "海洋",
// "先进制造",
// "新材料",
// "航空航天",
]);
const
curCategoryList
=
ref
([]);
const
curCategoryIndex
=
ref
(
0
);
const
SHOW_COUNT
=
10
;
const
activeCate
=
ref
(
"全部分类"
);
const
activeHylyId
=
ref
(
""
);
// 获取领域分类
const
handleGetHylyList
=
async
()
=>
{
...
...
@@ -1028,79 +1008,14 @@ const handleGetHylyList = async () => {
const
res
=
await
getHylyList
();
console
.
log
(
"行业领域列表"
,
res
);
categoryList
.
value
=
res
.
data
;
const
obj
=
{
id
:
0
,
pid
:
""
,
name
:
"全部分类"
}
;
categoryList
.
value
=
[
obj
,
...
categoryList
.
value
];
curCategoryList
.
value
=
categoryList
.
value
.
slice
(
0
,
SHOW_COUNT
);
cateKuList
.
value
=
res
.
data
;
}
catch
(
error
)
{
}
}
;
const
handleClickCate
=
cate
=>
{
console
.
log
(
cate
);
activeCate
.
value
=
cate
.
name
;
activeHylyId
.
value
=
cate
.
id
;
handleGetBillsByType
();
}
;
// 新闻资讯
const
newsList
=
ref
([
{
img
:
News1
,
title
:
"美政府停摆仍持续,拨款法案存缺陷,但两党磋商露曙光"
,
content
:
`美国政府停摆已持续34天,距离历史上最长的停摆纪录仅差一天,参议院已先后13次尝试...`
,
from
:
"11-4 · 华盛顿邮报"
}
,
{
img
:
News2
,
title
:
"美参议院通过决议,要求终止特朗普全球关税政策"
,
content
:
`参议院以51票赞成、47票反对通过一项决议,旨在终止特朗普实施的全面关税政策,四名......`
,
from
:
"11-4 · 纽约时报"
}
,
{
img
:
News3
,
title
:
"美众院通过950亿美元对外援助法案,包含对台军援"
,
content
:
`国会众议院在4月通过了大规模对外援助法案,其中包括为“印太安全”提供资金的条款,......`
,
from
:
"11-3 · 洛杉矶时报"
}
,
{
img
:
News4
,
title
:
"“大而美”法案在激烈争议中通过"
,
content
:
`特朗普力推的大规模税收与支出法案在国会以微弱优势通过。该法案因大幅削减医疗补助和......`
,
from
:
"11-3 · 今日美国"
}
,
{
img
:
News5
,
title
:
"美政府“停摆”追平历史最长纪录,民生多领域受重创"
,
content
:
`联邦政府“停摆”进入第35天,追平历史纪录。食品救济项目资金中断,数百万低收入民......`
,
from
:
"11-2 · 福克斯新闻网"
}
]);
const
newsList
=
ref
([]);
// 社交媒体
const
messageList
=
ref
([
{
img
:
Message1
,
name
:
"唐纳德·特朗普"
,
time
:
"15:23 · 发布于真实社交"
,
content
:
`埃隆·马斯克在强力支持我竞选总统之前,早就知道我强烈反对‘电动汽车强制令’。这太荒谬了,这一直是我竞选活动的主要部分。电动汽车没问题,但不应该强迫每个人都拥有一辆。埃隆获得的补贴可能远远超过历史上任何一个人。如果没有补贴,埃隆可能不得不关门大吉,回到南非老家。`
}
,
{
img
:
Message2
,
name
:
"埃隆·马斯克"
,
time
:
"14:49 · 发布于X"
,
content
:
`如果这个疯狂的支出法案获得通过,‘美国党’将在第二天成立。`
}
,
{
img
:
Message3
,
name
:
"塞巴斯蒂安·马拉比"
,
time
:
"11:05 · 发布于X"
,
content
:
`提出特朗普政府的AI政策强调技术开放与快速应用,但可能以牺牲安全防范为代价,开启了“潘多拉魔盒”。`
}
]);
const
messageList
=
ref
([]);
// 获取热门法案
const
handleGetHotBills
=
async
()
=>
{
...
...
@@ -1115,8 +1030,11 @@ const handleGetHotBills = async () => {
// 获取法案风险信号
const
handleGetBillRiskSignal
=
async
()
=>
{
const
params
=
{
moduleId
:
"0100"
}
;
try
{
const
res
=
await
getBillRiskSignal
();
const
res
=
await
getBillRiskSignal
(
params
);
console
.
log
(
"法案风险信号"
,
res
);
if
(
res
.
code
===
200
)
{
warningList
.
value
=
res
.
data
;
...
...
@@ -1124,25 +1042,180 @@ const handleGetBillRiskSignal = async () => {
}
catch
(
error
)
{
}
}
;
//
根据法案类型获取法案列表
const
handleGet
BillsByType
=
async
()
=>
{
//
获取新闻资讯
const
handleGet
News
=
async
()
=>
{
const
params
=
{
type
:
activeHylyId
.
value
moduleId
:
"0100"
}
;
try
{
const
res
=
await
getBillsByType
(
params
);
console
.
log
(
"根据法案类型获取法案列表"
,
res
);
billList
.
value
=
res
.
data
.
map
(
item
=>
{
return
{
billId
:
item
.
billId
,
billName
:
item
.
billName
,
introductionDate
:
item
.
introductionDate
,
img
:
bill1
}
;
}
);
const
res
=
await
getNews
(
params
);
console
.
log
(
"新闻资讯"
,
res
);
if
(
res
.
code
===
200
)
{
newsList
.
value
=
res
.
data
;
}
}
catch
(
error
)
{
}
}
;
// 获取社交媒体
const
handleGetRemarks
=
async
()
=>
{
const
params
=
{
moduleId
:
"0100"
}
;
try
{
const
res
=
await
getRemarks
(
params
);
console
.
log
(
"社交媒体"
,
res
);
if
(
res
.
code
===
200
)
{
messageList
.
value
=
res
.
data
;
}
}
catch
(
error
)
{
}
}
;
// 获取提出部门列表
const
postOrgList
=
ref
([{
departmentName
:
"全部委员会"
,
departmentId
:
"全部委员会"
}
]);
const
handleGetPostOrgList
=
async
()
=>
{
try
{
const
res
=
await
getPostOrgList
();
console
.
log
(
"提出部门列表"
,
res
);
if
(
res
.
code
===
200
)
{
const
list
=
res
.
data
.
filter
(
item
=>
item
.
departmentId
);
postOrgList
.
value
=
[
{
departmentName
:
"全部委员会"
,
departmentId
:
"全部委员会"
}
,
...
list
];
}
}
catch
(
error
)
{
}
}
;
// 获取提出议员列表
const
postMemberList
=
ref
([{
memberName
:
"全部提出议员"
,
memberId
:
"全部提出议员"
}
]);
const
handleGetPostMemberList
=
async
()
=>
{
try
{
const
res
=
await
getPostMemberList
();
console
.
log
(
"提出议员列表"
,
res
);
if
(
res
.
code
===
200
)
{
const
list
=
res
.
data
.
filter
(
item
=>
item
.
memberId
);
postMemberList
.
value
=
[
{
memberName
:
"全部提出议员"
,
memberId
:
"全部提出议员"
}
,
...
list
];
}
}
catch
(
error
)
{
}
}
;
// 获取资源库
const
bills
=
ref
([]);
const
total
=
ref
(
0
);
const
pageSize
=
ref
(
4
);
const
loading
=
ref
(
false
);
const
abortController
=
ref
(
null
);
const
handleGetBills
=
async
()
=>
{
// 取消上一次未完成的请求
if
(
abortController
.
value
)
{
abortController
.
value
.
abort
();
}
// 创建新的 AbortController
abortController
.
value
=
new
AbortController
();
loading
.
value
=
true
;
const
params
=
{
currentPage
:
currentPage
.
value
-
1
,
// Standard Spring Boot page index is 0-based
pageSize
:
pageSize
.
value
}
;
if
(
!
activeYyList
.
value
.
includes
(
"全部议院"
))
{
params
.
congressIds
=
activeYyList
.
value
.
join
(
','
);
}
if
(
footerSelect1
.
value
!==
"全部委员会"
)
{
params
.
departmentId
=
footerSelect1
.
value
;
}
if
(
!
activeDpList
.
value
.
includes
(
"全部党派"
))
{
params
.
partyIds
=
activeDpList
.
value
.
join
(
','
);
}
if
(
footerSelect2
.
value
!==
"全部提出议员"
)
{
params
.
personId
=
footerSelect2
.
value
;
}
if
(
!
activeAreaList
.
value
.
includes
(
"全部领域"
))
{
params
.
researchIds
=
activeAreaList
.
value
.
join
(
','
);
}
if
(
releaseTime
.
value
!==
true
)
{
params
.
sortFun
=
releaseTime
.
value
;
}
if
(
!
activePubTime
.
value
.
includes
(
"全部时间"
))
{
params
.
years
=
activePubTime
.
value
.
join
(
','
);
}
try
{
const
res
=
await
getBills
(
params
,
abortController
.
value
.
signal
);
console
.
log
(
"资源库列表"
,
res
);
if
(
res
.
code
===
200
)
{
if
(
res
.
data
&&
res
.
data
.
content
)
{
bills
.
value
=
res
.
data
.
content
.
map
(
item
=>
({
// id: item.billId,
name
:
item
.
billName
,
eName
:
item
.
billNameEn
,
tcr
:
item
.
personName
,
wyh
:
item
.
congressName
,
areaList
:
item
.
hylyList
||
[],
zxdy
:
item
.
latestAction
,
progress
:
item
.
stageList
||
[]
}
));
total
.
value
=
res
.
data
.
totalElements
;
}
else
{
bills
.
value
=
[];
total
.
value
=
0
;
}
}
else
{
bills
.
value
=
[];
total
.
value
=
0
;
}
loading
.
value
=
false
;
}
catch
(
error
)
{
if
(
error
.
name
!==
'AbortError'
)
{
console
.
error
(
error
);
loading
.
value
=
false
;
}
}
}
;
// 处理选择委员会变化
const
handleFooterSelect1Change
=
(
val
)
=>
{
console
.
log
(
"选择委员会变化"
,
val
);
// 等会再做处理
handleGetBills
();
}
;
// 处理选择议员变化
const
handleFooterSelect2Change
=
(
val
)
=>
{
console
.
log
(
"选择议员变化"
,
val
);
// 等会再做处理
handleGetBills
();
}
;
// 处理选择排序方式变化
const
handlePxChange
=
(
val
)
=>
{
console
.
log
(
"选择排序方式变化"
,
val
);
// 等会再做处理
handleGetBills
();
}
;
// 根据法案类型获取法案列表
// const handleGetBillsByType = async () =>
{
// const params =
{
// type: activeHylyId.value
//
}
;
// try
{
// const res = await getBillsByType(params);
// console.log("根据法案类型获取法案列表", res);
// billList.value = res.data.map(item =>
{
// return
{
// billId: item.billId,
// billName: item.billName,
// introductionDate: item.introductionDate,
// img: bill1
//
}
;
//
}
);
//
}
catch
(
error
)
{
}
//
}
;
// 涉华法案数量
const
box5Select
=
ref
(
"全部领域"
);
const
box5Data
=
ref
({
...
...
@@ -1171,6 +1244,7 @@ const box5Data = ref({
}
]
}
);
const
box5HasData
=
ref
(
true
);
const
handleGetBillCount
=
async
()
=>
{
try
{
let
params
=
{
}
;
...
...
@@ -1179,7 +1253,8 @@ const handleGetBillCount = async () => {
}
const
res
=
await
getBillCount
(
params
);
console
.
log
(
"涉华法案统计"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
if
(
res
.
code
===
200
&&
res
.
data
&&
res
.
data
.
length
>
0
)
{
box5HasData
.
value
=
true
;
const
sortedData
=
res
.
data
.
sort
((
a
,
b
)
=>
a
.
month
.
localeCompare
(
b
.
month
));
box5Data
.
value
=
{
title
:
sortedData
.
map
(
item
=>
item
.
month
),
...
...
@@ -1196,24 +1271,45 @@ const handleGetBillCount = async () => {
percent
:
sortedData
.
map
(
item
=>
item
.
percent
)
}
;
}
else
{
// 保持默认数据或清空
// box5Data.value =
{
}
;
// 接口异常(如500)时,清空图表数据以避免报错或显示错误信息
box5HasData
.
value
=
false
;
box5Data
.
value
=
{
title
:
[],
data
:
[
{
name
:
"提出法案"
,
value
:
[]
}
,
{
name
:
"通过法案"
,
value
:
[]
}
],
percent
:
[]
}
;
}
}
catch
(
error
)
{
console
.
error
(
"获取涉华法案统计error"
,
error
);
// 发生错误时同样清空数据
box5HasData
.
value
=
false
;
box5Data
.
value
=
{
title
:
[],
data
:
[
{
name
:
"提出法案"
,
value
:
[]
}
,
{
name
:
"通过法案"
,
value
:
[]
}
],
percent
:
[]
}
;
}
}
;
const
handleBox5
=
async
()
=>
{
await
handleGetBillCount
();
const
proposed
=
box5Data
.
value
.
data
[
0
].
value
;
const
passed
=
box5Data
.
value
.
data
[
1
].
value
;
const
rate
=
box5Data
.
value
.
percent
||
proposed
.
map
((
p
,
i
)
=>
{
const
pass
=
passed
[
i
]
||
0
;
return
p
?
((
pass
/
p
)
*
100
).
toFixed
(
2
)
:
0
;
}
);
let
box5Chart
=
getMultiLineChart
(
box5Data
.
value
.
title
,
proposed
,
passed
,
rate
);
setChart
(
box5Chart
,
"box5Chart"
);
if
(
box5HasData
.
value
)
{
await
nextTick
();
const
proposed
=
box5Data
.
value
.
data
[
0
].
value
;
const
passed
=
box5Data
.
value
.
data
[
1
].
value
;
const
rate
=
box5Data
.
value
.
percent
||
proposed
.
map
((
p
,
i
)
=>
{
const
pass
=
passed
[
i
]
||
0
;
return
p
?
((
pass
/
p
)
*
100
).
toFixed
(
2
)
:
0
;
}
);
let
box5Chart
=
getMultiLineChart
(
box5Data
.
value
.
title
,
proposed
,
passed
,
rate
);
setChart
(
box5Chart
,
"box5Chart"
);
}
}
;
const
handleBox5Change
=
()
=>
{
...
...
@@ -1221,11 +1317,16 @@ const handleBox5Change = () => {
}
;
// 法案提出部门
const
box7HasData
=
ref
(
true
);
const
handleBox7Data
=
async
()
=>
{
try
{
const
res
=
await
getBillPostOrg
({
year
:
box7selectetedTime
.
value
}
);
console
.
log
(
"法案提出部门"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
if
(
res
.
code
===
200
&&
res
.
data
&&
res
.
data
.
length
>
0
)
{
box7HasData
.
value
=
true
;
// 必须等待DOM更新,因为v-if切换可能导致元素刚被创建
await
nextTick
();
const
apiData
=
res
.
data
;
const
houseItems
=
apiData
.
filter
(
i
=>
i
.
congressName
===
"House"
);
...
...
@@ -1250,9 +1351,14 @@ const handleBox7Data = async () => {
const
box7Chart
=
getDoublePieChart
(
data1
,
data2
);
setChart
(
box7Chart
,
"box7Chart"
);
}
else
{
// 接口异常(如500)时,清空图表数据以避免报错或显示错误信息
box7HasData
.
value
=
false
;
setChart
({
}
,
"box7Chart"
);
}
}
catch
(
error
)
{
console
.
error
(
"获取法案提出部门数据失败"
,
error
);
box7HasData
.
value
=
false
;
}
}
;
...
...
@@ -1261,28 +1367,7 @@ watch(box7selectetedTime, () => {
}
);
// 关键条款
const
wordCloudData
=
ref
([
{
name
:
"限制中国获取能源技术"
,
value
:
100
}
,
{
name
:
"未实现赤字控制目标"
,
value
:
66
}
,
{
name
:
"关注核聚变能源研究"
,
value
:
77
}
,
{
name
:
"抵制外国人才争夺"
,
value
:
35
}
,
{
name
:
"进行可再生能源税收减免"
,
value
:
88
}
,
{
name
:
"评估中美现代化技术"
,
value
:
57
}
,
{
name
:
"应对中国制造2025战略"
,
value
:
72
}
,
{
name
:
"实施能源税收延期"
,
value
:
18
}
,
{
name
:
"限制采购中国产电池"
,
value
:
34
}
,
{
name
:
"加强美国在核能领域得到领导力"
,
value
:
16
}
,
{
name
:
"发展替代燃料"
,
value
:
72
}
,
{
name
:
"发展风能"
,
value
:
58
}
,
{
name
:
"发展太阳能"
,
value
:
24
}
,
{
name
:
"施加额外能源出口限制"
,
value
:
33
}
,
{
name
:
"评估中美能源技术"
,
value
:
47
}
,
{
name
:
"禁止资助中国能源项目"
,
value
:
32
}
,
{
name
:
"不得向中国机构提供援助"
,
value
:
62
}
,
{
name
:
"开展先进生物能源计划"
,
value
:
51
}
,
{
name
:
"减少燃料对外依赖"
,
value
:
81
}
,
{
name
:
"加强供应链风险管理"
,
value
:
73
}
]);
const
wordCloudData
=
ref
([]);
const
handleGetKeyTK
=
async
()
=>
{
try
{
const
res
=
await
getBillOverviewKeyTK
();
...
...
@@ -1306,37 +1391,7 @@ const handleBox6 = async () => {
}
;
// 涉华领域分布
const
box9ChartColorList
=
ref
([
"#4096FF"
,
"#FFA39E"
,
"#ADC6FF"
,
"#FFC069"
,
"#B5F5EC"
,
"#B37FEB"
,
"#D6E4FF"
]);
const
box9ChartData
=
ref
([
//
{
// name: "半导体",
// value: 50
//
}
,
//
{
// name: "电子设备",
// value: 46
//
}
,
//
{
// name: "显示技术",
// value: 40
//
}
,
//
{
// name: "新能源",
// value: 32
//
}
,
//
{
// name: "通信设备",
// value: 31
//
}
,
//
{
// name: "汽车",
// value: 30
//
}
,
//
{
// name: "其他",
// value: 24
//
}
]);
const
box9ChartData
=
ref
([]);
const
box9selectetedTime
=
ref
(
"2025"
);
const
box9YearList
=
ref
([
{
...
...
@@ -1356,6 +1411,7 @@ const box9YearList = ref([
value
:
"2022"
}
]);
const
box9HasData
=
ref
(
true
);
const
getBox9Data
=
async
()
=>
{
const
params
=
{
year
:
box9selectetedTime
.
value
...
...
@@ -1363,98 +1419,37 @@ const getBox9Data = async () => {
try
{
const
res
=
await
getBillIndustry
(
params
);
console
.
log
(
"box9-涉华法案领域分布"
,
res
.
data
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
if
(
res
.
code
===
200
&&
res
.
data
&&
res
.
data
.
length
>
0
)
{
box9HasData
.
value
=
true
;
box9ChartData
.
value
=
res
.
data
;
}
else
{
box9HasData
.
value
=
false
;
box9ChartData
.
value
=
[];
}
}
catch
(
error
)
{
}
}
catch
(
error
)
{
box9HasData
.
value
=
false
;
box9ChartData
.
value
=
[];
}
}
;
const
handleBox9Data
=
async
()
=>
{
await
getBox9Data
();
const
box9Chart
=
getPieChart
(
box9ChartData
.
value
.
map
(
item
=>
{
return
{
name
:
item
.
industryName
,
value
:
item
.
countBill
}
;
}
)
);
setChart
(
box9Chart
,
"box9Chart"
);
if
(
box9HasData
.
value
)
{
await
nextTick
();
const
box9Chart
=
getPieChart
(
box9ChartData
.
value
.
map
(
item
=>
{
return
{
name
:
item
.
industryName
,
value
:
item
.
countBill
}
;
}
)
);
setChart
(
box9Chart
,
"box9Chart"
);
}
}
;
const
box7Data
=
ref
([
[
{
name
:
"众议院"
,
value
:
298
}
,
{
name
:
"参议院"
,
value
:
149
}
],
[
{
name
:
"拨款委员会"
,
value
:
50
,
type
:
"众议院"
}
,
{
name
:
"筹款委员会"
,
value
:
50
,
type
:
"众议院"
}
,
{
name
:
"外交事务委员会"
,
value
:
46
,
type
:
"众议院"
}
,
{
name
:
"国土安全委员会"
,
value
:
40
,
type
:
"众议院"
}
,
{
name
:
"司法委员会"
,
value
:
40
,
type
:
"众议院"
}
,
{
name
:
"军事委员会"
,
value
:
40
,
type
:
"众议院"
}
,
{
name
:
"能源和商业委员会"
,
value
:
32
,
type
:
"众议院"
}
,
{
name
:
"拨款委员会1"
,
value
:
32
,
type
:
"参议院"
}
,
{
name
:
"财政委员会"
,
value
:
31
,
type
:
"参议院"
}
,
{
name
:
"能源"
,
value
:
30
,
type
:
"参议院"
}
,
{
name
:
"能源1"
,
value
:
30
,
type
:
"参议院"
}
,
{
name
:
"其他"
,
value
:
24
,
type
:
"参议院"
}
]
]);
watch
(
box9selectetedTime
,
()
=>
{
handleBox9Data
();
}
);
const
box8Data
=
ref
([]);
...
...
@@ -1471,9 +1466,13 @@ const handleBox8Data = async () => {
dangpai
:
Cyy
,
yuan
:
item
.
position
===
"Democratic"
?
Mzd
:
Ghd
}
));
}
else
{
// 接口异常(如500)时,清空图表数据以避免报错或显示错误信息
box8Data
.
value
=
[];
}
}
catch
(
error
)
{
console
.
error
(
"获取关键议员提案失败"
,
error
);
box8Data
.
value
=
[];
}
}
;
...
...
@@ -1522,97 +1521,137 @@ const handleClickTab = tab => {
activeTabName
.
value
=
tab
.
name
;
}
;
const
areaList
=
[
{
id
:
"全部领域"
,
name
:
"全部领域"
}
,
{
id
:
"人工智能"
,
name
:
"人工智能"
}
,
{
id
:
"集成电路"
,
name
:
"集成电路"
}
,
{
id
:
"通信网络"
,
name
:
"通信网络"
}
,
{
id
:
"先进制造"
,
name
:
"先进制造"
}
,
{
id
:
"量子科技"
,
name
:
"量子科技"
}
,
{
id
:
"生物科技"
,
name
:
"生物科技"
}
,
{
id
:
"能源"
,
name
:
"能源"
}
,
{
id
:
"航空航天"
,
name
:
"航空航天"
}
,
{
id
:
"新材料"
,
name
:
"新材料"
}
,
{
id
:
"海洋"
,
name
:
"海洋"
}
];
const
activeAreaList
=
ref
([
"全部领域"
]);
const
handleAreaChange
=
(
val
)
=>
{
if
(
val
.
includes
(
"全部领域"
)
&&
val
.
length
>
1
)
{
if
(
val
[
val
.
length
-
1
]
===
"全部领域"
)
{
activeAreaList
.
value
=
[
"全部领域"
];
}
else
{
activeAreaList
.
value
=
val
.
filter
(
item
=>
item
!==
"全部领域"
);
}
}
else
if
(
val
.
length
===
0
)
{
activeAreaList
.
value
=
[
"全部领域"
];
}
// 打印 activeAreaList.value
console
.
log
(
activeAreaList
.
value
);
handleGetBills
();
}
;
const
dpList
=
ref
([
{
id
:
"全部党派"
,
name
:
"全部党派"
}
,
{
id
:
"
民主党
"
,
name
:
"民主党"
}
,
{
id
:
"
共和党
"
,
name
:
"共和党"
}
{
id
:
"
Democratic
"
,
name
:
"民主党"
}
,
{
id
:
"
Republican
"
,
name
:
"共和党"
}
]);
const
activeDpList
=
ref
([
"全部党派"
]);
// 处理选择党派变化
const
handleDpChange
=
(
val
)
=>
{
if
(
val
.
includes
(
"全部党派"
)
&&
val
.
length
>
1
)
{
if
(
val
[
val
.
length
-
1
]
===
"全部党派"
)
{
activeDpList
.
value
=
[
"全部党派"
];
}
else
{
activeDpList
.
value
=
val
.
filter
(
item
=>
item
!==
"全部党派"
);
}
}
else
if
(
val
.
length
===
0
)
{
activeDpList
.
value
=
[
"全部党派"
];
}
console
.
log
(
"选择党派变化"
,
activeDpList
.
value
);
handleGetBills
();
}
;
const
yyList
=
ref
([
{
id
:
"全部议院"
,
name
:
"全部议院"
}
,
{
id
:
"
参议院
"
,
name
:
"参议院"
}
,
{
id
:
"
众议院
"
,
name
:
"众议院"
}
{
id
:
"
S
"
,
name
:
"参议院"
}
,
{
id
:
"
H
"
,
name
:
"众议院"
}
]);
const
activeYyList
=
ref
([
"全部议院"
]);
// 处理选择议院变化
const
handleYyChange
=
(
val
)
=>
{
if
(
val
.
includes
(
"全部议院"
)
&&
val
.
length
>
1
)
{
if
(
val
[
val
.
length
-
1
]
===
"全部议院"
)
{
activeYyList
.
value
=
[
"全部议院"
];
}
else
{
activeYyList
.
value
=
val
.
filter
(
item
=>
item
!==
"全部议院"
);
}
}
else
if
(
val
.
length
===
0
)
{
activeYyList
.
value
=
[
"全部议院"
];
}
console
.
log
(
"选择议院变化"
,
activeYyList
.
value
);
handleGetBills
();
}
;
const
pubTime
=
ref
([
{
id
:
"全部时间"
,
name
:
"全部时间"
}
,
{
id
:
"2025
年
"
,
name
:
"2025年"
}
,
{
id
:
"2024
年
"
,
name
:
"2024年"
}
,
{
id
:
"2023
年
"
,
name
:
"2023年"
}
,
{
id
:
"2022
年
"
,
name
:
"2022年"
}
,
{
id
:
"2021
年
"
,
name
:
"2021年"
}
,
{
id
:
"更早时间"
,
name
:
"更早时间"
}
{
id
:
"2025"
,
name
:
"2025年"
}
,
{
id
:
"2024"
,
name
:
"2024年"
}
,
{
id
:
"2023"
,
name
:
"2023年"
}
,
{
id
:
"2022"
,
name
:
"2022年"
}
,
{
id
:
"2021"
,
name
:
"2021年"
}
,
//
{
id
:
"更早时间"
,
name
:
"更早时间"
}
]);
const
activePubTime
=
ref
([
"全部时间"
]);
const
footerSelectList1
=
ref
([
{
label
:
"全部委员会"
,
value
:
"全部委员会"
// 处理选择时间变化
const
handlePubTimeChange
=
(
val
)
=>
{
if
(
val
.
includes
(
"全部时间"
)
&&
val
.
length
>
1
)
{
if
(
val
[
val
.
length
-
1
]
===
"全部时间"
)
{
activePubTime
.
value
=
[
"全部时间"
];
}
else
{
activePubTime
.
value
=
val
.
filter
(
item
=>
item
!==
"全部时间"
);
}
}
else
if
(
val
.
length
===
0
)
{
activePubTime
.
value
=
[
"全部时间"
];
}
]);
const
footerSelect1
=
ref
(
"全部委员会"
);
console
.
log
(
"选择时间变化"
,
activePubTime
.
value
);
handleGetBills
();
}
;
const
footerSelectList2
=
ref
([
{
label
:
"全部提出议员"
,
value
:
"全部提出议员"
}
]);
const
footerSelect1
=
ref
(
"全部委员会"
);
const
footerSelect2
=
ref
(
"全部提出议员"
);
const
footerBillList
=
ref
([
{
name
:
"H.R.1-大而美法案"
,
eName
:
"One Big Beautiful Bill Act"
,
tcr
:
"乔迪·阿灵顿等2人"
,
wyh
:
"众议院-预算委员会"
,
areaList
:
[
"集成电路"
,
"人工智能"
],
zxdy
:
"2025.07.04 成为公法 No: 119-21"
,
progress
:
[]
}
,
{
name
:
"H.R.1-大而美法案"
,
eName
:
"One Big Beautiful Bill Act"
,
tcr
:
"乔迪·阿灵顿等2人"
,
wyh
:
"众议院-预算委员会"
,
areaList
:
[
"集成电路"
,
"人工智能"
],
zxdy
:
"2025.07.04 成为公法 No: 119-21"
,
progress
:
[]
}
,
{
name
:
"H.R.1-大而美法案"
,
eName
:
"One Big Beautiful Bill Act"
,
tcr
:
"乔迪·阿灵顿等2人"
,
wyh
:
"众议院-预算委员会"
,
areaList
:
[
"集成电路"
,
"人工智能"
],
zxdy
:
"2025.07.04 成为公法 No: 119-21"
,
progress
:
[]
}
]);
//
const footerBillList = ref([
//
{
//
name: "H.R.1-大而美法案",
//
eName: "One Big Beautiful Bill Act",
//
tcr: "乔迪·阿灵顿等2人",
//
wyh: "众议院-预算委员会",
//
areaList: ["集成电路", "人工智能"],
//
zxdy: "2025.07.04 成为公法 No: 119-21",
//
progress: []
//
}
,
//
{
//
name: "H.R.1-大而美法案",
//
eName: "One Big Beautiful Bill Act",
//
tcr: "乔迪·阿灵顿等2人",
//
wyh: "众议院-预算委员会",
//
areaList: ["集成电路", "人工智能"],
//
zxdy: "2025.07.04 成为公法 No: 119-21",
//
progress: []
//
}
,
//
{
//
name: "H.R.1-大而美法案",
//
eName: "One Big Beautiful Bill Act",
//
tcr: "乔迪·阿灵顿等2人",
//
wyh: "众议院-预算委员会",
//
areaList: ["集成电路", "人工智能"],
//
zxdy: "2025.07.04 成为公法 No: 119-21",
//
progress: []
//
}
//
]);
onMounted
(
async
()
=>
{
handleGetHylyList
();
// 获取风险信号
handleGetBillRiskSignal
();
// 获取新闻资讯
handleGetNews
();
// 获取社交媒体
handleGetRemarks
();
// 获取提出部门列表
handleGetPostOrgList
();
// 获取提出议员列表
handleGetPostMemberList
();
// 获取资源库
handleGetBills
();
// handleGetBillsByType();
handleBox5
();
//涉华法案统计
...
...
@@ -2441,6 +2480,10 @@ onUnmounted(() => {});
width
:
749
px
;
margin
-
left
:
21
px
;
border
-
bottom
:
1
px
solid
rgba
(
240
,
242
,
244
,
1
);
cursor
:
pointer
;
&
:
hover
{
background
:
var
(
--
color
-
bg
-
hover
);
}
.
left
{
width
:
72
px
;
height
:
48
px
;
...
...
@@ -2459,7 +2502,7 @@ onUnmounted(() => {});
justify
-
content
:
space
-
between
;
.
title
{
margin
-
top
:
13
px
;
width
:
52
0
px
;
width
:
44
0
px
;
height
:
24
px
;
color
:
rgba
(
59
,
65
,
75
,
1
);
font
-
family
:
Microsoft
YaHei
;
...
...
@@ -3108,6 +3151,13 @@ onUnmounted(() => {});
background
:
var
(
--
color
-
main
-
active
);
}
}
.
disabled
{
cursor
:
not
-
allowed
;
opacity
:
0.5
;
&
:
hover
{
background
:
transparent
;
}
}
}
.
select
-
box
{
height
:
42
px
;
...
...
@@ -3120,9 +3170,12 @@ onUnmounted(() => {});
height
:
1401
px
;
margin
:
0
auto
;
display
:
flex
;
justify
-
content
:
space
-
between
;
align
-
items
:
flex
-
start
;
.
left
{
width
:
300
px
;
height
:
784
px
;
// min-height: 784px;
padding
-
bottom
:
33
px
;
box
-
sizing
:
border
-
box
;
border
:
1
px
solid
rgba
(
234
,
236
,
238
,
1
);
border
-
radius
:
10
px
;
...
...
@@ -3186,22 +3239,25 @@ onUnmounted(() => {});
}
.
right
-
main
{
height
:
1264
px
;
overflow
:
hidden
;
//
overflow: hidden;
.
right
-
main
-
box
{
width
:
1280
px
;
height
:
300
px
;
padding
-
bottom
:
24
px
;
border
-
radius
:
10
px
;
box
-
shadow
:
0
px
0
px
1
0
px
0
px
rgba
(
25
,
69
,
130
,
0.1
);
box
-
shadow
:
0
px
0
px
2
0
px
0
px
rgba
(
25
,
69
,
130
,
0.1
);
background
:
rgba
(
255
,
255
,
255
,
1
);
margin
-
bottom
:
16
px
;
overflow
:
hidden
;
cursor
:
pointer
;
.
header
{
height
:
91
px
;
width
:
1200
px
;
margin
:
0
auto
;
border
-
bottom
:
1
px
solid
rgba
(
234
,
236
,
238
,
1
);
padding
-
top
:
19
px
;
.
title
{
margin
-
top
:
19
px
;
// margin-top: 19px;
// padding-top: 19px;
height
:
26
px
;
color
:
rgba
(
59
,
65
,
75
,
1
);
font
-
family
:
Microsoft
YaHei
;
...
...
@@ -3229,13 +3285,13 @@ onUnmounted(() => {});
margin
-
top
:
2
px
;
.
item
{
margin
-
top
:
12
px
;
height
:
24
px
;
//
height: 24px;
display
:
flex
;
.
item
-
left
{
width
:
91
px
;
height
:
24
px
;
color
:
rgb
a
(
59
,
65
,
75
,
1
);
font
-
family
:
Microsoft
YaHei
;
width
:
100
px
;
//
height: 24px;
color
:
rgb
(
59
,
65
,
75
);
font
-
family
:
"Microsoft YaHei"
;
font
-
size
:
16
px
;
font
-
weight
:
700
;
line
-
height
:
24
px
;
...
...
@@ -3243,9 +3299,10 @@ onUnmounted(() => {});
text
-
align
:
left
;
}
.
item
-
right
{
max
-
width
:
1000
px
;
margin
-
left
:
10
px
;
color
:
rgba
(
95
,
101
,
108
,
1
);
font
-
family
:
Microsoft
YaHei
;
font
-
family
:
"Microsoft YaHei"
;
font
-
size
:
16
px
;
font
-
weight
:
400
;
line
-
height
:
24
px
;
...
...
@@ -3263,7 +3320,7 @@ onUnmounted(() => {});
border
-
radius
:
4
px
;
background
:
rgba
(
231
,
243
,
255
,
1
);
color
:
var
(
--
color
-
main
-
active
);
font
-
family
:
Microsoft
YaHei
;
font
-
family
:
"Microsoft YaHei"
;
font
-
size
:
14
px
;
font
-
weight
:
400
;
}
...
...
@@ -3280,7 +3337,7 @@ onUnmounted(() => {});
padding
-
top
:
12
px
;
.
footer
-
left
{
color
:
rgba
(
59
,
65
,
75
,
1
);
font
-
family
:
Microsoft
YaHei
;
font
-
family
:
"Microsoft YaHei"
;
font
-
size
:
16
px
;
font
-
weight
:
400
;
line
-
height
:
32
px
;
...
...
@@ -3297,7 +3354,7 @@ onUnmounted(() => {});
justify
-
content
:
space
-
between
;
.
footer
-
left
{
color
:
rgba
(
59
,
65
,
75
,
1
);
font
-
family
:
Microsoft
YaHei
;
font
-
family
:
"Microsoft YaHei"
;
font
-
size
:
16
px
;
font
-
weight
:
400
;
line
-
height
:
32
px
;
...
...
src/views/bill/billHome/utils/doublePieChart.js
浏览文件 @
b2d89c27
...
...
@@ -16,11 +16,9 @@ const getDoublePieChart = (data1, data2) => {
},
label
:
{
position
:
'inside'
,
textStyle
:
{
fontSize
:
'16px'
,
fontWeight
:
700
,
// color: '#333'
}
fontSize
:
'16px'
,
fontWeight
:
700
,
// color: '#333'
},
data
:
data1
.
map
(
item
=>
{
return
{
...
...
src/views/bill/billLayout/index.vue
浏览文件 @
b2d89c27
...
...
@@ -212,6 +212,7 @@ onMounted(() => {
height
:
1016px
;
background
:
rgba
(
249
,
250
,
252
,
1
);
position
:
relative
;
margin
:
0
auto
;
.layout-header
{
width
:
1920px
;
height
:
64px
;
...
...
src/views/bill/introdoction/index.vue
浏览文件 @
b2d89c27
...
...
@@ -37,10 +37,10 @@
<div
class=
"right1-item"
v-for=
"item in basicInfo.hylyList"
:key=
"item"
>
{{
item
}}
</div>
</div>
</div>
<div
class=
"box1-right-item"
>
<
!--
<
div
class=
"box1-right-item"
>
<div
class=
"item-left"
>
法案类别:
</div>
<div
class=
"item-right"
>
{{
basicInfo
.
typeName
}}
</div>
</div>
</div>
-->
<div
class=
"box1-right-item"
>
<div
class=
"item-left"
>
委员会报告:
</div>
<div
class=
"item-right2"
v-if=
"basicInfo.reportList"
>
...
...
@@ -132,11 +132,11 @@
<
/div> --
>
<
/div
>
<
/div
>
<
div
class
=
"box2-footer"
>
<
!--
<
div
class
=
"box2-footer"
>
<
div
class
=
"btn-more"
>
<
img
src
=
"../assets/images/btn-more.png"
alt
=
""
/>
<
/div
>
<
/div
>
<
/div>
--
>
<
/div
>
<
/div
>
<
div
class
=
"introduction-wrap-right"
>
...
...
@@ -154,7 +154,7 @@
<
/div
>
<
div
class
=
"introduction-wrap-right-main"
>
<
div
class
=
"right-main-box1"
>
<
div
class
=
"name-box"
>
<
!--
<
div
class
=
"name-box"
>
<
el
-
select
v
-
model
=
"selectValue"
placeholder
=
"请选择"
...
...
@@ -174,7 +174,7 @@
{{
item
.
name
}}
<
/div
>
<
/div
>
<
/div
>
<
/div>
--
>
<
div
class
=
"info-box"
>
<
div
class
=
"info-left"
>
<
img
src
=
"./assets/images/usr1.png"
alt
=
""
/>
...
...
@@ -889,6 +889,7 @@ onMounted(() => {
background
:
#
fff
;
border
-
radius
:
10
px
;
box
-
shadow
:
0
px
0
px
15
px
0
px
rgba
(
22
,
119
,
255
,
0.1
);
position
:
relative
;
.
box2
-
main
{
margin
-
top
:
10
px
;
height
:
calc
(
100
%
-
70
px
);
// Subtract header height
...
...
@@ -1001,6 +1002,11 @@ onMounted(() => {
margin
-
top
:
7
px
;
display
:
flex
;
justify
-
content
:
center
;
position
:
absolute
;
bottom
:
10
px
;
left
:
50
%
;
transform
:
translateX
(
-
50
%
);
z
-
index
:
99
;
.
btn
-
more
{
width
:
108
px
;
height
:
32
px
;
...
...
@@ -1024,7 +1030,8 @@ onMounted(() => {
box
-
shadow
:
0
px
0
px
15
px
0
px
rgba
(
22
,
119
,
255
,
0.1
);
.
introduction
-
wrap
-
right
-
main
{
.
right
-
main
-
box1
{
height
:
218
px
;
// height: 218px; 将选择框去掉后高度变化
height
:
171
px
;
// border-bottom: 1px solid rgb(243, 243, 244);
.
name
-
box
{
display
:
flex
;
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论