Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
R
risk-monitor
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
蔡建
risk-monitor
Commits
02341b24
提交
02341b24
authored
3月 18, 2026
作者:
张伊明
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat 新增法案对比页面
feat 新增首页图标ai总结功能(未接入接口)
上级
b21e37b1
全部展开
隐藏空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
126 行增加
和
10 行删除
+126
-10
bill.js
src/api/bill.js
+14
-0
bill.js
src/router/modules/bill.js
+9
-0
index.vue
src/views/bill/billHome/index.vue
+91
-6
index.vue
src/views/bill/billLayout/index.vue
+11
-3
index.vue
src/views/bill/template/index.vue
+1
-1
index.vue
src/views/bill/versionCompare/index.vue
+0
-0
没有找到文件。
src/api/bill.js
浏览文件 @
02341b24
...
...
@@ -192,3 +192,17 @@ export function getBillFullText(params) {
params
,
})
}
// 条款对比-根据两版版本与筛选条件获取配对条款列表
/**
* @param {billId,oldVersionId,newVersionId,diffType,cRelated,keyword}
* @header token
* @returns { list: Array<{ oldTerm: object|null, newTerm: object|null }> }
*/
export
function
getBillTermsCompare
(
params
)
{
return
request
({
method
:
"GET"
,
url
:
"/api/billInfoBean/content/compare"
,
params
,
});
}
src/router/modules/bill.js
浏览文件 @
02341b24
...
...
@@ -13,6 +13,7 @@ const BillInfluenceLayout = () => import('@/views/bill/influence/index.vue')
const
BillInfluenceIndustry
=
()
=>
import
(
'@/views/bill/influence/industry/index.vue'
)
const
BillInfluenceScientificResearch
=
()
=>
import
(
'@/views/bill/influence/scientificResearch/index.vue'
)
const
BillRelevantCircumstance
=
()
=>
import
(
'@/views/bill/relevantCircumstance/index.vue'
)
const
BillVersionCompare
=
()
=>
import
(
'@/views/bill/versionCompare/index.vue'
)
const
billRoutes
=
[
...
...
@@ -129,6 +130,14 @@ const billRoutes = [
// meta: {
// title: "相关情况"
// }
},
{
path
:
"versionCompare"
,
name
:
"BillVersionCompare"
,
component
:
BillVersionCompare
,
meta
:
{
title
:
"版本对比"
}
}
]
},
...
...
src/views/bill/billHome/index.vue
浏览文件 @
02341b24
...
...
@@ -127,7 +127,13 @@
<el-empty
v-if=
"!box5HasData"
description=
"暂无数据"
:image-size=
"100"
/>
<div
v-else
id=
"box5Chart"
class=
"overview-chart"
></div>
</div>
<TipTab
class=
"overview-tip"
/>
<div
class=
"overview-tip-row"
>
<TipTab
class=
"overview-tip"
/>
<AiButton
class=
"overview-tip-action"
@
mouseenter=
"handleShowAiPane('box5')"
/>
</div>
<div
v-if=
"aiPaneVisible.box5"
class=
"overview-ai-pane"
@
mouseleave=
"handleHideAiPane('box5')"
>
<AiPane
:aiContent=
"overviewAiContent.box5"
/>
</div>
</div>
</OverviewCard>
<OverviewCard
class=
"overview-card--single box6"
title=
"涉华法案领域分布"
:icon=
"box6HeaderIcon"
>
...
...
@@ -141,7 +147,13 @@
<el-empty
v-if=
"!box9HasData"
description=
"暂无数据"
:image-size=
"100"
/>
<div
v-else
id=
"box9Chart"
class=
"overview-chart"
></div>
</div>
<TipTab
class=
"overview-tip"
/>
<div
class=
"overview-tip-row"
>
<TipTab
class=
"overview-tip"
/>
<AiButton
class=
"overview-tip-action"
@
mouseenter=
"handleShowAiPane('box6')"
/>
</div>
<div
v-if=
"aiPaneVisible.box6"
class=
"overview-ai-pane"
@
mouseleave=
"handleHideAiPane('box6')"
>
<AiPane
:aiContent=
"overviewAiContent.box6"
/>
</div>
</div>
</OverviewCard>
</div>
...
...
@@ -157,7 +169,13 @@
<el-empty
v-if=
"!box7HasData"
description=
"暂无数据"
:image-size=
"100"
/>
<div
v-else
id=
"box7Chart"
class=
"overview-chart"
></div>
</div>
<TipTab
class=
"overview-tip"
/>
<div
class=
"overview-tip-row"
>
<TipTab
class=
"overview-tip"
/>
<AiButton
class=
"overview-tip-action"
@
mouseenter=
"handleShowAiPane('box7')"
/>
</div>
<div
v-if=
"aiPaneVisible.box7"
class=
"overview-ai-pane"
@
mouseleave=
"handleHideAiPane('box7')"
>
<AiPane
:aiContent=
"overviewAiContent.box7"
/>
</div>
</div>
</OverviewCard>
<OverviewCard
class=
"overview-card--single box8"
title=
"涉华法案进展分布"
:icon=
"box7HeaderIcon"
>
...
...
@@ -174,7 +192,13 @@
<div
id=
"box8Chart"
class=
"overview-chart box8-chart"
></div>
</
template
>
</div>
<TipTab
class=
"overview-tip"
/>
<div
class=
"overview-tip-row"
>
<TipTab
class=
"overview-tip"
/>
<AiButton
class=
"overview-tip-action"
@
mouseenter=
"handleShowAiPane('box8')"
/>
</div>
<div
v-if=
"aiPaneVisible.box8"
class=
"overview-ai-pane"
@
mouseleave=
"handleHideAiPane('box8')"
>
<AiPane
:aiContent=
"overviewAiContent.box8"
/>
</div>
</div>
</OverviewCard>
<OverviewCard
class=
"overview-card--single box9"
title=
"涉华法案关键条款"
:icon=
"box7HeaderIcon"
>
...
...
@@ -183,7 +207,13 @@
<el-empty
v-if=
"!wordCloudHasData"
description=
"暂无数据"
:image-size=
"100"
/>
<WordCloundChart
v-else
class=
"overview-chart"
width=
"100%"
height=
"100%"
:data=
"wordCloudData"
/>
</div>
<TipTab
class=
"overview-tip"
/>
<div
class=
"overview-tip-row"
>
<TipTab
class=
"overview-tip"
/>
<AiButton
class=
"overview-tip-action"
@
mouseenter=
"handleShowAiPane('box9')"
/>
</div>
<div
v-if=
"aiPaneVisible.box9"
class=
"overview-ai-pane"
@
mouseleave=
"handleHideAiPane('box9')"
>
<AiPane
:aiContent=
"overviewAiContent.box9"
/>
</div>
</div>
</OverviewCard>
</div>
...
...
@@ -221,6 +251,8 @@ import OverviewCard from "./OverviewCard.vue";
import
ResourceLibrarySection
from
"./ResourceLibrarySection.vue"
;
import
{
useContainerScroll
}
from
"@/hooks/useScrollShow"
;
import
TipTab
from
"@/components/base/TipTab/index.vue"
;
import
AiButton
from
"@/components/base/Ai/AiButton/index.vue"
;
import
AiPane
from
"@/components/base/Ai/AiPane/index.vue"
;
import
WordCloundChart
from
"@/components/base/WordCloundChart/index.vue"
;
import
getMultiLineChart
from
"./utils/multiLineChart"
;
...
...
@@ -370,6 +402,36 @@ const box7YearList = ref([
}
]);
const
aiPaneVisible
=
ref
({
box5
:
false
,
box6
:
false
,
box7
:
false
,
box8
:
false
,
box9
:
false
});
const
overviewAiContent
=
ref
({
box5
:
"智能总结生成中..."
,
box6
:
"智能总结生成中..."
,
box7
:
"智能总结生成中..."
,
box8
:
"智能总结生成中..."
,
box9
:
"智能总结生成中..."
});
const
handleShowAiPane
=
key
=>
{
aiPaneVisible
.
value
=
{
...
aiPaneVisible
.
value
,
[
key
]:
true
};
};
const
handleHideAiPane
=
key
=>
{
aiPaneVisible
.
value
=
{
...
aiPaneVisible
.
value
,
[
key
]:
false
};
};
const
box8selectetedTime
=
ref
(
"2025"
);
const
box8YearList
=
ref
([
{
...
...
@@ -2109,6 +2171,20 @@ onUnmounted(() => {
.overview-card-body
{
display
:
flex
;
flex-direction
:
column
;
position
:
relative
;
}
.overview-ai-pane
{
position
:
absolute
;
left
:
0
;
bottom
:
0
;
width
:
100%
;
z-index
:
3
;
pointer-events
:
none
;
.ai-pane-wrapper
{
pointer-events
:
auto
;
}
}
.overview-chart-wrap
{
...
...
@@ -2131,8 +2207,17 @@ onUnmounted(() => {
min-height
:
0
;
}
.overview-tip
{
.overview-tip
-row
{
margin-top
:
10px
;
position
:
relative
;
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
}
.overview-tip-action
{
position
:
absolute
;
right
:
-30px
;
}
}
}
...
...
src/views/bill/billLayout/index.vue
浏览文件 @
02341b24
...
...
@@ -7,6 +7,8 @@
:defaultLogo=
"USALogo"
:tabs=
"mainHeaderBtnList"
:activeTitle=
"activeTitle"
:showTabs=
"showHeaderTabs"
:showActions=
"showHeaderActions"
@
tab-click=
"handleClickMainHeaderBtn"
@
open-analysis=
"handleAnalysisClick"
/>
...
...
@@ -79,6 +81,8 @@ const mainHeaderBtnList = ref([
]);
const
activeTitle
=
ref
(
"法案概况"
);
const
showHeaderTabs
=
ref
(
true
);
const
showHeaderActions
=
ref
(
true
);
const
getActiveTitleByRoutePath
=
path
=>
{
if
(
path
.
startsWith
(
"/billLayout/deepDig"
))
return
"深度挖掘"
;
...
...
@@ -88,8 +92,12 @@ const getActiveTitleByRoutePath = path => {
return
"法案概况"
;
};
const
syncActiveTitleFromRoute
=
()
=>
{
const
syncHeaderStateFromRoute
=
()
=>
{
const
currentPath
=
route
.
path
||
""
;
activeTitle
.
value
=
getActiveTitleByRoutePath
(
route
.
path
);
const
isVersionCompare
=
currentPath
.
startsWith
(
"/billLayout/versionCompare"
);
showHeaderTabs
.
value
=
!
isVersionCompare
;
showHeaderActions
.
value
=
!
isVersionCompare
;
};
const
handleClickMainHeaderBtn
=
item
=>
{
...
...
@@ -120,7 +128,7 @@ const handleAnalysisClick = () => {
onMounted
(()
=>
{
getBillInfoGlobalFn
();
// 以当前路由为准,避免 sessionStorage 造成高亮错乱
sync
ActiveTitl
eFromRoute
();
sync
HeaderStat
eFromRoute
();
// 兜底:如果未来出现未知路由且有缓存,再用缓存
const
cachedTitle
=
window
.
sessionStorage
.
getItem
(
"activeTitle"
);
if
(
!
activeTitle
.
value
&&
cachedTitle
)
activeTitle
.
value
=
cachedTitle
;
...
...
@@ -129,7 +137,7 @@ onMounted(() => {
watch
(
()
=>
route
.
path
,
()
=>
{
sync
ActiveTitl
eFromRoute
();
sync
HeaderStat
eFromRoute
();
},
{
immediate
:
true
}
);
...
...
src/views/bill/template/index.vue
浏览文件 @
02341b24
...
...
@@ -387,7 +387,7 @@ const handleChangeBill = val => {
};
const
handleOpenVersionCompare
=
()
=>
{
const
targetUrl
=
`/billLayout/
deepDig/processOverview
?billId=
${
route
.
query
.
billId
}
`
;
const
targetUrl
=
`/billLayout/
versionCompare
?billId=
${
route
.
query
.
billId
}
`
;
window
.
open
(
targetUrl
,
"_blank"
);
};
...
...
src/views/bill/versionCompare/index.vue
0 → 100644
浏览文件 @
02341b24
差异被折叠。
点击展开。
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论