Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
R
risk-monitor
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
蔡建
risk-monitor
Commits
486b8d7c
提交
486b8d7c
authored
1月 04, 2026
作者:
付康
浏览文件
操作
浏览文件
下载
差异文件
合并分支 'lzl-dev' 到 'master'
Lzl dev 查看合并请求
!72
上级
95bfa457
e2355325
显示空白字符变更
内嵌
并排
正在显示
23 个修改的文件
包含
929 行增加
和
694 行删除
+929
-694
bill.js
src/api/bill.js
+31
-5
exportControl.js
src/router/modules/exportControl.js
+10
-0
WordCloudMap.vue
src/views/bill/background/WordCloudMap.vue
+65
-37
index.vue
src/views/bill/background/index.vue
+253
-222
index.vue
src/views/bill/billHome/index.vue
+6
-130
index.vue
src/views/bill/billLayout/index.vue
+44
-18
index.vue
src/views/bill/commonPrompt/index.vue
+1
-0
index.vue
src/views/bill/deepDig/index.vue
+9
-1
index.vue
src/views/bill/deepDig/poliContribution/index.vue
+1
-0
index.vue
src/views/bill/deepDig/processAnalysis/index.vue
+12
-11
index.vue
src/views/bill/deepDig/processOverview/index.vue
+14
-5
index.vue
src/views/bill/index.vue
+9
-1
index.vue
src/views/bill/influence/index.vue
+6
-1
index.vue
src/views/bill/influence/industry/index.vue
+7
-4
index.vue
src/views/bill/introdoction/index.vue
+40
-64
index.vue
src/views/bill/template/index.vue
+32
-176
news.vue
src/views/exportControl/components/news.vue
+11
-6
index.vue
src/views/exportControl/index.vue
+20
-4
index.vue
...s/sanctionsOverview/components/introductionPage/index.vue
+18
-4
index.vue
...omponents/sanctionsOverview/components/listPage/index.vue
+16
-1
index.vue
...v2.0SingleSanction/components/sanctionsOverview/index.vue
+49
-3
index.vue
src/views/exportControl/v2.0SingleSanction/index.vue
+7
-1
index.vue
...ews/exportControl/v2.0SingleSanction/originPage/index.vue
+268
-0
没有找到文件。
src/api/bill.js
浏览文件 @
486b8d7c
...
@@ -89,6 +89,19 @@ export function getBillPersonAnalyze(params) {
...
@@ -89,6 +89,19 @@ export function getBillPersonAnalyze(params) {
})
})
}
}
// 议员相关性分析领域人物动态-根据法案ID获取议员分析领域人物动态
/**
* @param {id, isOppose,areaId}
* @header token
*/
export
function
getBillPersonAnalyzeDy
(
params
)
{
return
request
({
method
:
'GET'
,
url
:
`/api/billInfoBean/personAnalyze/news/
${
params
.
id
}
/
${
params
.
areaId
}
`
,
params
,
})
}
// 主要条款-根据法案ID获取原文id列表
// 主要条款-根据法案ID获取原文id列表
/**
/**
* @param {id}
* @param {id}
...
@@ -110,33 +123,33 @@ export function getBillContentId(params) {
...
@@ -110,33 +123,33 @@ export function getBillContentId(params) {
export
function
getBillContentTk
(
params
)
{
export
function
getBillContentTk
(
params
)
{
return
request
({
return
request
({
method
:
'GET'
,
method
:
'GET'
,
url
:
`/api/billInfoBean/content/tk/
${
params
.
bill
i
d
}
/
${
params
.
id
}
`
,
url
:
`/api/billInfoBean/content/tk/
${
params
.
bill
I
d
}
/
${
params
.
id
}
`
,
params
,
params
,
})
})
}
}
// 限制方式-根据法案原文ID获取限制方式列表
// 限制方式-根据法案原文ID获取限制方式列表
/**
/**
* @param {billId}
* @param {billId
,versionId,cRelated
}
* @header token
* @header token
*/
*/
export
function
getBillContentXzfs
(
params
)
{
export
function
getBillContentXzfs
(
params
)
{
return
request
({
return
request
({
method
:
'GET'
,
method
:
'GET'
,
url
:
`/api/billInfoBean/content/xzfs/
${
params
.
i
d
}
`
,
url
:
`/api/billInfoBean/content/xzfs/
${
params
.
billId
}
/
${
params
.
versionI
d
}
`
,
params
,
params
,
})
})
}
}
// 涉及行业-根据法案原文ID获取行业领域列表
// 涉及行业-根据法案原文ID获取行业领域列表
/**
/**
* @param {
i
d}
* @param {
billId,versionId,cRelate
d}
* @header token
* @header token
*/
*/
export
function
getBillHyly
(
params
)
{
export
function
getBillHyly
(
params
)
{
return
request
({
return
request
({
method
:
'GET'
,
method
:
'GET'
,
url
:
`/api/billInfoBean/content/hyly/
${
params
.
i
d
}
`
,
url
:
`/api/billInfoBean/content/hyly/
${
params
.
billId
}
/
${
params
.
versionI
d
}
`
,
params
,
params
,
})
})
}
}
...
@@ -166,3 +179,16 @@ export function getBillDyqkSummary(params) {
...
@@ -166,3 +179,16 @@ export function getBillDyqkSummary(params) {
params
,
params
,
})
})
}
}
// 获取法案全文-根据法案ID获取法案全文
/**
* @param {id}
* @header token
*/
export
function
getBillFullText
(
params
)
{
return
request
({
method
:
'GET'
,
url
:
`/api/billInfoBean/content/
${
params
.
id
}
`
,
params
,
})
}
src/router/modules/exportControl.js
浏览文件 @
486b8d7c
...
@@ -104,6 +104,15 @@ const exportControlRoutes = [
...
@@ -104,6 +104,15 @@ const exportControlRoutes = [
title
:
"单条制裁详情"
title
:
"单条制裁详情"
}
}
},
},
// V2.0单条制裁详情-实体清单原文
{
path
:
"/exportControl/origin"
,
name
:
"entityListOrigin"
,
component
:
()
=>
import
(
"@/views/exportControl/v2.0SingleSanction/originPage/index.vue"
),
meta
:
{
title
:
"实体清单原文"
}
},
]
]
export
default
exportControlRoutes
export
default
exportControlRoutes
\ No newline at end of file
src/views/bill/background/WordCloudMap.vue
浏览文件 @
486b8d7c
...
@@ -5,7 +5,7 @@
...
@@ -5,7 +5,7 @@
</
template
>
</
template
>
<
script
setup
>
<
script
setup
>
import
{
ref
,
onMounted
,
onBeforeUnmount
}
from
"vue"
;
import
{
ref
,
onMounted
,
onBeforeUnmount
,
watch
}
from
"vue"
;
import
*
as
echarts
from
"echarts"
;
import
*
as
echarts
from
"echarts"
;
import
"echarts-wordcloud"
;
import
"echarts-wordcloud"
;
...
@@ -13,57 +13,73 @@ const props = defineProps({
...
@@ -13,57 +13,73 @@ const props = defineProps({
// 词云数据
// 词云数据
data
:
{
data
:
{
type
:
Array
,
type
:
Array
,
required
:
true
,
required
:
true
// 示例:
// [
// { name: 'Vue', value: 1000 },
// { name: 'ECharts', value: 618 },
// // ...
// ]
},
},
// 词云形状,可以是 'circle', 'cardioid', 'diamond', 'triangle-forward', 'triangle', 'pentagon' 等
// 词云形状
shape
:
{
shape
:
{
type
:
String
,
type
:
String
,
default
:
"circle"
,
default
:
"circle"
},
},
// 选中的项的名字
selectedName
:
{
type
:
String
,
default
:
""
}
});
});
const
emit
=
defineEmits
([
"wordClick"
]);
const
echartWord
=
ref
(
null
);
const
echartWord
=
ref
(
null
);
let
myChart
=
null
;
let
myChart
=
null
;
const
initChart
=
()
=>
{
const
initChart
=
()
=>
{
if
(
echartWord
.
value
)
{
if
(
echartWord
.
value
)
{
if
(
myChart
)
{
myChart
.
dispose
();
}
myChart
=
echarts
.
init
(
echartWord
.
value
);
myChart
=
echarts
.
init
(
echartWord
.
value
);
const
chartData
=
props
.
data
.
map
(
item
=>
{
const
isSelected
=
item
.
name
===
props
.
selectedName
;
if
(
isSelected
)
{
return
{
...
item
,
// 提升选中项的权重,确保其在布局中占主导地位
value
:
100
,
// 给予一个显著高于其他的固定大值,使其占据中心
textStyle
:
{
fontWeight
:
"bold"
,
color
:
"#fff"
,
backgroundColor
:
"rgba(189, 33, 33, 0.9)"
,
borderRadius
:
20
,
padding
:
[
8
,
16
]
// 适当增加 padding 以确保背景块足够大
}
};
}
return
{
...
item
,
value
:
Math
.
floor
(
Math
.
random
()
*
20
)
+
10
// 为非选中项分配较小的随机权重,有助于均匀分布
};
});
const
option
=
{
const
option
=
{
grid
:
{
grid
:
{
left
:
5
,
left
:
0
,
top
:
5
,
top
:
0
,
right
:
5
,
right
:
0
,
bottom
:
5
,
bottom
:
0
},
},
series
:
[
series
:
[
{
{
type
:
"wordCloud"
,
type
:
"wordCloud"
,
shape
:
props
.
shape
,
shape
:
props
.
shape
,
// 其他形状你可以使用形状路径
gridSize
:
30
,
// 增大网格间距,防止重叠
// shape: 'circle', // 示例
sizeRange
:
[
16
,
26
],
// 保持字体大小
// 或者自定义路径
gridSize
:
20
,
// 网格大小,影响词间距。
sizeRange
:
[
15
,
25
],
// 定义词云中文字大小的范围
rotationRange
:
[
0
,
0
],
rotationRange
:
[
0
,
0
],
rotationStep
:
0
,
rotationStep
:
0
,
drawOutOfBound
:
false
,
// 是否超出画布
drawOutOfBound
:
true
,
// 字体
layoutAnimation
:
true
,
keepAspect
:
true
,
textStyle
:
{
textStyle
:
{
// normal: {
// color: function () {
// return 'rgb(' + [
// Math.round(Math.random() * 160),
// Math.round(Math.random() * 160),
// Math.round(Math.random() * 160)
// ].join(',') + ')';
// }
// },
color
:
function
()
{
color
:
function
()
{
let
colors
=
[
let
colors
=
[
"rgba(189, 33, 33, 1)"
,
"rgba(189, 33, 33, 1)"
,
...
@@ -71,25 +87,37 @@ const initChart = () => {
...
@@ -71,25 +87,37 @@ const initChart = () => {
"rgba(220, 190, 68, 1)"
,
"rgba(220, 190, 68, 1)"
,
"rgba(96, 58, 186, 1)"
,
"rgba(96, 58, 186, 1)"
,
"rgba(32, 121, 69, 1)"
,
"rgba(32, 121, 69, 1)"
,
"rgba(22, 119, 255, 1)"
,
"rgba(22, 119, 255, 1)"
];
];
return
colors
[
parseInt
(
Math
.
random
()
*
colors
.
length
)];
return
colors
[
parseInt
(
Math
.
random
()
*
colors
.
length
)];
},
},
emphasis
:
{
emphasis
:
{
shadowBlur
:
5
,
shadowBlur
:
5
,
shadowColor
:
"#333"
,
shadowColor
:
"#333"
},
}
},
// 设置词云数据
data
:
props
.
data
,
},
},
],
data
:
chartData
}
]
};
};
myChart
.
setOption
(
option
);
myChart
.
setOption
(
option
);
myChart
.
on
(
"click"
,
params
=>
{
emit
(
"wordClick"
,
params
.
data
);
});
window
.
addEventListener
(
"resize"
,
myChart
.
resize
);
window
.
addEventListener
(
"resize"
,
myChart
.
resize
);
}
}
};
};
watch
(
()
=>
[
props
.
data
,
props
.
selectedName
],
()
=>
{
initChart
();
},
{
deep
:
true
}
);
onMounted
(()
=>
{
onMounted
(()
=>
{
initChart
();
initChart
();
});
});
...
...
src/views/bill/background/index.vue
浏览文件 @
486b8d7c
...
@@ -30,7 +30,7 @@
...
@@ -30,7 +30,7 @@
<div
class=
"id"
>
{{
(
currentPage
-
1
)
*
10
+
index
+
1
}}
</div>
<div
class=
"id"
>
{{
(
currentPage
-
1
)
*
10
+
index
+
1
}}
</div>
<div
class=
"title"
>
{{
item
.
backgroundTitle
}}
</div>
<div
class=
"title"
>
{{
item
.
backgroundTitle
}}
</div>
<div
class=
"share"
>
<div
class=
"share"
>
<
img
src=
"./assets/icons/open.png"
alt=
"打开"
/
>
<
!--
<img
src=
"./assets/icons/open.png"
alt=
"打开"
/>
--
>
</div>
</div>
</div>
</div>
</div>
</div>
...
@@ -64,13 +64,17 @@
...
@@ -64,13 +64,17 @@
<
/div
>
<
/div
>
<
/div
>
<
/div
>
<
div
class
=
"box2-main"
>
<
div
class
=
"box2-main"
>
<
div
class
=
"box2-main-item"
v
-
for
=
"(item, index) in eventList"
:
key
=
"index"
>
<
div
class
=
"box2-main-item"
v
-
for
=
"(item, index) in eventList"
:
key
=
"index"
@
click
=
"handleClickEvent(item)"
>
<
div
class
=
"left"
>
<
div
class
=
"left"
>
<
img
:
src
=
"item.imageUrl || defaultNew"
@
error
=
"e => (e.target.src = defaultNew)"
alt
=
""
/>
<
img
:
src
=
"item.imageUrl || defaultNew"
@
error
=
"e => (e.target.src = defaultNew)"
alt
=
""
/>
<
/div
>
<
/div
>
<
div
class
=
"center"
>
<
div
class
=
"center"
>
<
CommonPrompt
:
content
=
"item.sjbt"
>
<
div
class
=
"title"
>
{{
item
.
sjbt
}}
<
/div
>
<
div
class
=
"title"
>
{{
item
.
sjbt
}}
<
/div
>
<
/CommonPrompt
>
<
CommonPrompt
:
content
=
"item.sjnr"
>
<
div
class
=
"content"
>
{{
item
.
sjnr
}}
<
/div
>
<
div
class
=
"content"
>
{{
item
.
sjnr
}}
<
/div
>
<
/CommonPrompt
>
<
/div
>
<
/div
>
<
div
class
=
"right"
>
{{
item
.
sjsj
}}
<
/div
>
<
div
class
=
"right"
>
{{
item
.
sjsj
}}
<
/div
>
<
/div
>
<
/div
>
...
@@ -115,8 +119,21 @@
...
@@ -115,8 +119,21 @@
<
/div> --
>
<
/div> --
>
<
div
class
=
"right-box1-main"
>
<
div
class
=
"right-box1-main"
>
<
div
class
=
"right-box1-main-top"
>
<
div
class
=
"right-box1-main-top"
>
<
el
-
icon
style
=
"margin-top: 20px"
size
=
"20"
color
=
"#5f656c"
><
CaretLeft
/><
/el-icon
>
<
el
-
icon
<
div
class
=
"user-box"
v
-
for
=
"(item, index) in personList"
:
key
=
"index"
>
style
=
"margin-top: 20px; cursor: pointer"
size
=
"20"
:
color
=
"currentIndex > 0 ? '#5f656c' : '#ccc'"
@
click
=
"handlePrev"
><
CaretLeft
/><
/el-icon
>
<
div
class
=
"user-list-container"
>
<
div
class
=
"user-list-wrapper"
:
style
=
"{ transform: `translateX(-${currentIndex * 110
}
px)`
}
"
>
<
div
class
=
"user-box"
v
-
for
=
"(item, index) in personList"
:
key
=
"index"
@
click
=
"handleClickUser(item)"
>
<
div
class
=
"img-box"
>
<
div
class
=
"img-box"
>
<
img
:
src
=
"item.image"
alt
=
""
/>
<
img
:
src
=
"item.image"
alt
=
""
/>
<
div
class
=
"icon1"
>
<
div
class
=
"icon1"
>
...
@@ -126,27 +143,48 @@
...
@@ -126,27 +143,48 @@
<
img
:
src
=
"item.icon1"
alt
=
""
/>
<
img
:
src
=
"item.icon1"
alt
=
""
/>
<
/div
>
<
/div
>
<
/div
>
<
/div
>
<
CommonPrompt
:
content
=
"item.name"
>
<
div
class
=
"name"
>
{{
item
.
name
}}
<
/div
>
<
div
class
=
"name"
>
{{
item
.
name
}}
<
/div
>
<
/CommonPrompt
>
<
/div
>
<
/div
>
<
el
-
icon
style
=
"margin-top: 20px"
size
=
"20"
color
=
"#5f656c"
><
CaretRight
/><
/el-icon
>
<
/div
>
<
/div
>
<
el
-
icon
style
=
"margin-top: 20px; cursor: pointer"
size
=
"20"
:
color
=
"currentIndex < personList.length - 4 ? '#5f656c' : '#ccc'"
@
click
=
"handleNext"
><
CaretRight
/><
/el-icon
>
<
/div
>
<
/div
>
<
div
class
=
"right-box1-main-bottom"
>
<
div
class
=
"right-box1-main-bottom"
>
<
WordCloudMap
:
data
=
"wordCloudData"
shape
=
"circle"
/>
<
WordCloudMap
:
data
=
"wordCloudData"
:
selectedName
=
"selectedIndustryName"
shape
=
"circle"
@
wordClick
=
"handleWordClick"
/>
<
/div
>
<
/div
>
<
/div
>
<
/div
>
<
/div
>
<
/div
>
<
div
class
=
"right-box2"
>
<
div
class
=
"right-box2"
>
<
div
class
=
"right-box2-header"
>
<
div
class
=
"right-box2-header"
>
<
div
class
=
"title"
><
span
class
=
"title-active"
>
"传统能源"
<
/span>涉及议员动态 ></
div
>
<
div
class
=
"title"
>
<
span
class
=
"title-active"
>
"{{ selectedIndustryName
}}
"
<
/span>涉及议员动态
>
<
/div
>
<
/div
>
<
/div
>
<
div
class
=
"right-box2-center"
>
<
div
class
=
"right-box2-center"
>
<
div
class
=
"user-box"
v
-
for
=
"(item, index) in aboutUserList"
:
key
=
"index"
>
<
div
class
=
"user-box"
v
-
for
=
"(item, index) in aboutUserList"
:
key
=
"index"
@
click
=
"handleClickUser(item)"
>
<
div
class
=
"user-left"
>
<
div
class
=
"user-left"
>
<
div
class
=
"img-box"
>
<
img
:
src
=
"item.img"
alt
=
""
/>
<
img
:
src
=
"item.img"
alt
=
""
/>
<
/div
>
<
/div
>
<
/div
>
<
div
class
=
"user-right"
>
<
div
class
=
"user-right"
>
<
div
class
=
"name"
>
{{
item
.
name
}}
<
/div
>
<
div
class
=
"name"
>
{{
item
.
name
}}
<
/div
>
<
CommonPrompt
:
content
=
"item.content"
>
<
div
class
=
"content"
>
{{
item
.
content
}}
<
/div
>
<
div
class
=
"content"
>
{{
item
.
content
}}
<
/div
>
<
/CommonPrompt
>
<
/div
>
<
/div
>
<
/div
>
<
/div
>
<
/div
>
<
/div
>
...
@@ -163,7 +201,12 @@
...
@@ -163,7 +201,12 @@
<
script
setup
>
<
script
setup
>
import
{
onMounted
,
ref
}
from
"vue"
;
import
{
onMounted
,
ref
}
from
"vue"
;
import
{
useRoute
,
useRouter
}
from
"vue-router"
;
import
WordCloudMap
from
"./WordCloudMap.vue"
;
import
WordCloudMap
from
"./WordCloudMap.vue"
;
import
CommonPrompt
from
"../commonPrompt/index.vue"
;
const
route
=
useRoute
();
const
router
=
useRouter
();
import
event1
from
"./assets/images/event1.png"
;
import
event1
from
"./assets/images/event1.png"
;
import
event2
from
"./assets/images/event2.png"
;
import
event2
from
"./assets/images/event2.png"
;
import
event3
from
"./assets/images/event3.png"
;
import
event3
from
"./assets/images/event3.png"
;
...
@@ -178,8 +221,33 @@ import userIcon from "./assets/icons/user-icon.png";
...
@@ -178,8 +221,33 @@ import userIcon from "./assets/icons/user-icon.png";
import
userIcon1
from
"./assets/icons/user-icon1.png"
;
import
userIcon1
from
"./assets/icons/user-icon1.png"
;
import
userIcon2
from
"./assets/icons/user-icon2.png"
;
import
userIcon2
from
"./assets/icons/user-icon2.png"
;
import
defaultNew
from
"../assets/images/default-icon-news.png"
;
import
defaultNew
from
"../assets/images/default-icon-news.png"
;
import
defaultA
from
"../assets/images/default-icon1.png"
;
import
{
getBillBackground
,
getBillEvent
,
getBillPersonAnalyze
,
getBillInfoEvent
,
getBillPersonAnalyzeDy
}
from
"@/api/bill"
;
// 跳转到相关新闻
const
handleClickEvent
=
item
=>
{
const
routeData
=
router
.
resolve
({
path
:
"/newsAnalysis"
,
query
:
{
newsId
:
item
.
id
}
}
);
window
.
open
(
routeData
.
href
,
"_blank"
);
}
;
import
{
getBillBackground
,
getBillEvent
,
getBillPersonAnalyze
,
getBillInfoEvent
}
from
"@/api/bill"
;
// 跳转人员详情
const
handleClickUser
=
item
=>
{
const
routeData
=
router
.
resolve
({
path
:
"/characterPage"
,
query
:
{
personId
:
item
.
id
}
}
);
window
.
open
(
routeData
.
href
,
"_blank"
);
}
;
const
box1BtnActive
=
ref
(
1
);
const
box1BtnActive
=
ref
(
1
);
const
currentPage
=
ref
(
1
);
const
currentPage
=
ref
(
1
);
...
@@ -192,8 +260,26 @@ const handleClickBox1Btn = index => {
...
@@ -192,8 +260,26 @@ const handleClickBox1Btn = index => {
}
;
}
;
const
box2BtnActive
=
ref
(
1
);
const
box2BtnActive
=
ref
(
1
);
const
currentIndex
=
ref
(
0
);
const
handlePrev
=
()
=>
{
if
(
currentIndex
.
value
>
0
)
{
currentIndex
.
value
--
;
}
}
;
const
handleNext
=
()
=>
{
if
(
currentIndex
.
value
<
personList
.
value
.
length
-
4
)
{
currentIndex
.
value
++
;
}
}
;
const
handleClickBox2Btn
=
index
=>
{
const
handleClickBox2Btn
=
index
=>
{
box2BtnActive
.
value
=
index
;
box2BtnActive
.
value
=
index
;
currentIndex
.
value
=
0
;
// 切换赞成/反对时重置索引
// 切换赞成/反对时,重置选中的词云项
selectedIndustryStatus
.
value
=
""
;
selectedIndustryName
.
value
=
""
;
if
(
index
===
1
)
{
if
(
index
===
1
)
{
handleGetBillPersonAnalyze
(
false
);
handleGetBillPersonAnalyze
(
false
);
}
else
{
}
else
{
...
@@ -201,208 +287,31 @@ const handleClickBox2Btn = index => {
...
@@ -201,208 +287,31 @@ const handleClickBox2Btn = index => {
}
}
}
;
}
;
const
aboutUserList
=
ref
([
const
aboutUserList
=
ref
([]);
{
img
:
user1
,
name
:
"林赛·格雷厄姆"
,
content
:
"拟对购买俄罗斯石油、天然气等能源的国家征收高达500%的“二级关税”。"
}
,
{
img
:
user2
,
name
:
"史蒂夫·戴恩斯"
,
content
:
"提出了一项两党立法,旨在通过美国能源部(DOE)扩大美国在量子信息科学和研发(R&D)方面的投资能力。”。"
}
,
{
img
:
user3
,
name
:
"乔·曼钦"
,
content
:
"介绍了《2024能源许可改革法案》,目的是通过缩短联邦环境审查程序以及限定法院质询等来加快清洁能源、管道和输电项目的审批。”。"
}
]);
const
backgroundList
=
ref
([
const
backgroundList
=
ref
([]);
{
id
:
window
.
sessionStorage
.
getItem
(
"billId"
),
bjnr
:
"将中国跨境电商描述为“利用低价商品冲击美国市场、规避关税监管”"
}
,
{
id
:
2
,
bjnr
:
"指责“中美技术合作助长军民融合”"
}
,
{
id
:
3
,
bjnr
:
"强调“需防范中国通过第三国转运规避关税”"
}
,
{
id
:
4
,
bjnr
:
"将中资在美子公司定义为“潜在避税与资本转移工具”"
}
,
{
id
:
5
,
bjnr
:
"将中国列为“试图主导全球清洁能源供应链的竞争对手”"
}
,
{
id
:
6
,
bjnr
:
"声称“中国控股企业通过转移定价侵蚀美国税基”"
}
,
{
id
:
7
,
bjnr
:
"法案序言称“中国光伏、风电企业通过政府补贴倾销产品”"
}
,
{
id
:
8
,
bjnr
:
"辩称“中国主导全球减排议程损害美国利益”"
}
,
{
id
:
9
,
bjnr
:
"将中国定位为“通过强制技术转让获取先进制程的威胁”"
}
,
{
id
:
10
,
bjnr
:
"将中国与伊朗、朝鲜并列,强调“需遏制印太地区对手”"
}
]);
const
eventList
=
ref
([
const
eventList
=
ref
([]);
//
{
// id: 1,
// image: event1,
// title: "2017年《减税与就业法案》的出台与立法博弈",
// content:
// "2017年,美国通过了一项自里根时代以来最为重大的税制改革——《减税与就业法案》(Tax Cuts and Jobs Act,简称TCJA)。该法案于当年...",
// date: "2017-08-30",
//
}
,
//
{
// id: 2,
// image: event2,
// title: "信用评级机构穆迪下调美国信用评级",
// content:
// "2025年5月16日,信用评级机构穆迪自2011年以来第三次下调美国主权信用评级,直接原因是对OBBBA加剧财政赤字的担忧。彼时法案尚未通...",
// date: "2025-05-16",
//
}
,
//
{
// id: 3,
// image: event3,
// title: "马斯克与特朗普决裂",
// content:
// "马斯克5月30日离任政府效率部负责人时与特朗普友好告别,但6月3日突然批评OBBBA“令人作呕”,指责其推高赤字、违背削减开支承诺。特...",
// date: "2025-05-26",
//
}
,
//
{
// id: 4,
// image: event4,
// title: "马斯克成立“美国党”",
// content:
// "7月5日(法案签署次日),马斯克宣布成立新政党“美国党”,计划参与2026年中期选举,剑指支持法案的共和党议员。",
// date: "2025-07-01",
//
}
,
//
{
// id: 5,
// image: event5,
// title: "“90天关税暂缓期”即将到期",
// content:
// "法案通过恰逢美国对多国“90天关税暂缓期”即将到期(2025年7月9日)。欧盟、日本等国担忧特朗普为弥补减税导致的财政收入缺口,将强征...",
// date: "2025-08-09",
//
}
,
]);
const
personList
=
ref
([
const
personList
=
ref
([]);
{
name
:
"乔迪·阿灵顿"
,
const
selectedIndustryStatus
=
ref
(
""
);
image
:
user1
,
const
selectedIndustryName
=
ref
(
""
);
icon
:
userIcon
,
icon1
:
userIcon1
}
,
{
name
:
"约翰·图恩"
,
image
:
user2
,
icon
:
userIcon
,
icon1
:
userIcon2
}
,
{
name
:
"贾森·史密斯"
,
image
:
user3
,
icon
:
userIcon
,
icon1
:
userIcon1
}
,
{
name
:
"拉塞尔·沃特"
,
image
:
user4
,
icon
:
userIcon
,
icon1
:
userIcon1
}
,
{
name
:
"詹姆斯·布莱尔"
,
image
:
user5
,
icon
:
userIcon
,
icon1
:
userIcon1
}
]);
const
progressList
=
ref
([
const
handleWordClick
=
word
=>
{
{
selectedIndustryStatus
.
value
=
word
.
status
;
tip
:
true
,
selectedIndustryName
.
value
=
word
.
name
;
date
:
"7月5日"
,
handleGetBillPersonAnalyzeDy
();
title
:
"特朗普于美国独立日签署法案,公法编号Pub. L. No. 119-21。白宫举行庆典,B-2轰炸机飞越上空,象征“美国新时代”开启。"
,
}
;
degree
:
"特别重大风险"
,
rank
:
4
}
,
{
tip
:
true
,
date
:
"7月4日"
,
title
:
"众议院最终表决218票赞成 vs 214票反对,修订版法案以4票优势通过,2名共和党议员倒戈,民主党全员反对。"
,
degree
:
"重大风险"
,
rank
:
3
}
,
{
tip
:
true
,
date
:
"7月3日"
,
title
:
"民主党领袖杰弗里斯发表 8小时45分钟 演讲(众议院现代史最长),抗议法案“劫贫济富”,但仍未阻止表决。"
,
degree
:
"较大风险"
,
rank
:
2
}
,
{
tip
:
true
,
date
:
"7月2日"
,
title
:
"众议院以 219:213 通过程序规则,为最终表决铺路。此前4名共和党议员反对程序规则,议长约翰逊紧急游说挽回1票。"
,
degree
:
"低风险"
,
rank
:
1
}
,
{
tip
:
false
,
date
:
"7月1日"
,
title
:
"参议院最终表决投票51:50,副总统万斯(JD Vance)投出关键票打破平局。3名共和党参议员倒戈(蒂利斯、保罗、柯林斯)。"
,
degree
:
""
}
]);
const
wordCloudData
=
[
const
wordCloudData
=
ref
([]);
{
name
:
"与马斯克公开冲突"
,
value
:
100
}
,
{
name
:
"传统能源"
,
value
:
5
}
,
{
name
:
"共和党财政鹰派"
,
value
:
77
}
,
{
name
:
"未实现赤字控制目标"
,
value
:
35
}
,
{
name
:
"得克萨斯州"
,
value
:
88
}
,
{
name
:
"选举压力"
,
value
:
57
}
,
{
name
:
"主张财政紧缩"
,
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
}
];
// 获取立法背景内容
// 获取立法背景内容
const
handleGetBillBackground
=
async
()
=>
{
const
handleGetBillBackground
=
async
()
=>
{
const
cRelated
=
box1BtnActive
.
value
===
1
?
"Y"
:
"N"
;
const
cRelated
=
box1BtnActive
.
value
===
1
?
"Y"
:
"N"
;
const
params
=
{
const
params
=
{
cRelated
:
cRelated
,
cRelated
:
cRelated
,
id
:
window
.
sessionStorage
.
getItem
(
"billId"
)
,
id
:
route
.
query
.
billId
,
currentPage
:
currentPage
.
value
-
1
,
currentPage
:
currentPage
.
value
-
1
,
pageSize
:
10
pageSize
:
10
}
;
}
;
...
@@ -417,7 +326,7 @@ const handleGetBillBackground = async () => {
...
@@ -417,7 +326,7 @@ const handleGetBillBackground = async () => {
// 获取相关事件
// 获取相关事件
const
handleGetRelatedEvent
=
async
()
=>
{
const
handleGetRelatedEvent
=
async
()
=>
{
const
params
=
{
const
params
=
{
id
:
window
.
sessionStorage
.
getItem
(
"billId"
)
id
:
route
.
query
.
billId
}
;
}
;
try
{
try
{
const
res
=
await
getBillInfoEvent
(
params
);
const
res
=
await
getBillInfoEvent
(
params
);
...
@@ -442,26 +351,70 @@ const handleGetRelatedEvent = async () => {
...
@@ -442,26 +351,70 @@ const handleGetRelatedEvent = async () => {
// 议员相关性分析
// 议员相关性分析
const
handleGetBillPersonAnalyze
=
async
isOppose
=>
{
const
handleGetBillPersonAnalyze
=
async
isOppose
=>
{
const
params
=
{
const
params
=
{
id
:
window
.
sessionStorage
.
getItem
(
"billId"
)
,
id
:
route
.
query
.
billId
,
isOppose
:
isOppose
isOppose
:
isOppose
}
;
}
;
try
{
try
{
const
res
=
await
getBillPersonAnalyze
(
params
);
const
res
=
await
getBillPersonAnalyze
(
params
);
console
.
log
(
"议员相关性分析"
,
res
);
console
.
log
(
"议员相关性分析"
,
res
);
personList
.
value
=
res
.
data
;
const
{
members
,
industryCounts
}
=
res
.
data
;
// 更新人员列表
personList
.
value
=
members
||
[];
personList
.
value
.
forEach
((
item
,
index
)
=>
{
personList
.
value
.
forEach
((
item
,
index
)
=>
{
const
imgList
=
[
user1
,
user2
,
user3
,
user4
,
user5
];
// 优先使用接口返回的图片,没有则使用默认头像 defaultA
item
.
image
=
i
mgList
[
index
%
imgList
.
length
]
;
item
.
image
=
i
tem
.
imageUrl
||
defaultA
;
item
.
icon
=
userIcon
;
item
.
icon
=
userIcon
;
item
.
icon1
=
userIcon1
;
// 根据党派动态设置图标 (民主党使用 userIcon1, 共和党使用 userIcon2)
item
.
icon1
=
item
.
party
===
"共和党"
?
userIcon2
:
userIcon1
;
}
);
}
);
// 更新词云图数据
if
(
industryCounts
&&
industryCounts
.
length
>
0
)
{
wordCloudData
.
value
=
industryCounts
.
map
(
item
=>
({
name
:
item
.
industryName
,
value
:
item
.
count
,
status
:
item
.
status
// 真正选中的为status
}
));
// 如果当前没有选中项,则默认选中第一个
if
(
!
selectedIndustryStatus
.
value
)
{
selectedIndustryStatus
.
value
=
industryCounts
[
0
].
status
;
selectedIndustryName
.
value
=
industryCounts
[
0
].
industryName
;
handleGetBillPersonAnalyzeDy
();
}
}
else
{
wordCloudData
.
value
=
[];
aboutUserList
.
value
=
[];
}
}
catch
(
error
)
{
}
}
;
// 获取议员相关性分析领域人物动态
const
handleGetBillPersonAnalyzeDy
=
async
()
=>
{
const
params
=
{
id
:
route
.
query
.
billId
,
areaId
:
selectedIndustryStatus
.
value
,
isOppose
:
box2BtnActive
.
value
===
2
}
;
try
{
const
res
=
await
getBillPersonAnalyzeDy
(
params
);
console
.
log
(
"议员相关性分析领域人物动态"
,
res
);
aboutUserList
.
value
=
(
res
.
data
||
[]).
map
(
m
=>
({
id
:
m
.
id
,
img
:
m
.
imageUrl
||
defaultA
,
name
:
m
.
name
,
content
:
m
.
newsContent
,
icon
:
userIcon
,
icon1
:
m
.
party
===
"共和党"
?
userIcon2
:
userIcon1
}
));
}
catch
(
error
)
{
}
}
catch
(
error
)
{
}
}
;
}
;
onMounted
(()
=>
{
onMounted
(()
=>
{
handleGetBillBackground
();
handleGetBillBackground
();
handleGetRelatedEvent
();
handleGetRelatedEvent
();
//
handleGetBillPersonAnalyze(false);
handleGetBillPersonAnalyze
(
false
);
}
);
}
);
<
/script
>
<
/script
>
...
@@ -732,8 +685,17 @@ onMounted(() => {
...
@@ -732,8 +685,17 @@ onMounted(() => {
width
:
544
px
;
width
:
544
px
;
display
:
flex
;
display
:
flex
;
justify
-
content
:
space
-
between
;
justify
-
content
:
space
-
between
;
.
user
-
list
-
container
{
width
:
440
px
;
// 4个 user-box 的宽度 (110 * 4)
overflow
:
hidden
;
.
user
-
list
-
wrapper
{
display
:
flex
;
transition
:
transform
0.3
s
ease
;
}
}
.
user
-
box
{
.
user
-
box
{
width
:
100
px
;
width
:
110
px
;
flex
-
shrink
:
0
;
height
:
80
px
;
height
:
80
px
;
.
img
-
box
{
.
img
-
box
{
width
:
48
px
;
width
:
48
px
;
...
@@ -743,6 +705,8 @@ onMounted(() => {
...
@@ -743,6 +705,8 @@ onMounted(() => {
img
{
img
{
width
:
100
%
;
width
:
100
%
;
height
:
100
%
;
height
:
100
%
;
border
-
radius
:
50
%
;
// 圆形头像
object
-
fit
:
cover
;
}
}
.
icon1
{
.
icon1
{
position
:
absolute
;
position
:
absolute
;
...
@@ -783,6 +747,12 @@ onMounted(() => {
...
@@ -783,6 +747,12 @@ onMounted(() => {
line
-
height
:
14
px
;
line
-
height
:
14
px
;
letter
-
spacing
:
0
px
;
letter
-
spacing
:
0
px
;
text
-
align
:
center
;
text
-
align
:
center
;
// 名字过长处理
width
:
100
px
;
margin
-
left
:
5
px
;
overflow
:
hidden
;
text
-
overflow
:
ellipsis
;
white
-
space
:
nowrap
;
}
}
}
}
}
}
...
@@ -900,43 +870,104 @@ onMounted(() => {
...
@@ -900,43 +870,104 @@ onMounted(() => {
}
}
.
right
-
box2
-
center
{
.
right
-
box2
-
center
{
height
:
345
px
;
height
:
345
px
;
overflow
:
hidden
;
overflow
:
auto
;
overflow
-
y
:
auto
;
overflow
-
y
:
auto
;
margin
-
top
:
19
px
;
margin
-
top
:
19
px
;
margin
-
left
:
16
px
;
margin
-
left
:
16
px
;
width
:
544
px
;
width
:
544
px
;
.
user
-
box
{
.
user
-
box
{
cursor
:
pointer
;
width
:
538
px
;
width
:
538
px
;
padding
-
bottom
:
5
px
;
padding
:
12
px
0
;
// height: 84px;
box
-
sizing
:
border
-
box
;
box
-
sizing
:
border
-
box
;
border
:
1
px
solid
rgba
(
241
,
243
,
246
,
1
);
border
-
bottom
:
1
px
solid
rgba
(
241
,
243
,
246
,
1
);
border
-
radius
:
4
px
;
margin
-
bottom
:
0
;
margin
-
bottom
:
8
px
;
display
:
flex
;
display
:
flex
;
&
:
last
-
child
{
border
-
bottom
:
none
;
}
.
user
-
left
{
.
user
-
left
{
margin
-
left
:
14
px
;
margin
-
left
:
14
px
;
margin
-
top
:
12
px
;
margin
-
top
:
12
px
;
.
img
-
box
{
width
:
56
px
;
height
:
56
px
;
position
:
relative
;
img
{
width
:
100
%
;
height
:
100
%
;
border
-
radius
:
50
%
;
object
-
fit
:
cover
;
}
.
icon1
{
position
:
absolute
;
left
:
-
2
px
;
bottom
:
-
2
px
;
width
:
18
px
;
height
:
18
px
;
border
-
radius
:
50
%
;
padding
:
2
px
;
background
:
#
fff
;
box
-
shadow
:
0
2
px
4
px
rgba
(
0
,
0
,
0
,
0.1
);
display
:
flex
;
align
-
items
:
center
;
justify
-
content
:
center
;
img
{
width
:
14
px
;
height
:
14
px
;
border
-
radius
:
0
;
}
}
.
icon2
{
position
:
absolute
;
right
:
-
2
px
;
bottom
:
-
2
px
;
width
:
18
px
;
height
:
18
px
;
border
-
radius
:
50
%
;
padding
:
2
px
;
background
:
#
fff
;
box
-
shadow
:
0
2
px
4
px
rgba
(
0
,
0
,
0
,
0.1
);
display
:
flex
;
align
-
items
:
center
;
justify
-
content
:
center
;
img
{
width
:
14
px
;
height
:
14
px
;
border
-
radius
:
0
;
}
}
}
}
}
.
user
-
right
{
.
user
-
right
{
margin
-
left
:
12
px
;
margin
-
left
:
16
px
;
width
:
459
px
;
flex
:
1
;
:
deep
(.
text
-
ellipsis
)
{
white
-
space
:
normal
;
}
.
name
{
.
name
{
margin
-
top
:
6
px
;
margin
-
top
:
10
px
;
height
:
24
px
;
height
:
24
px
;
line
-
height
:
24
px
;
line
-
height
:
24
px
;
color
:
rgba
(
95
,
101
,
108
,
1
)
;
color
:
#
333
;
font
-
family
:
Microsoft
YaHei
;
font
-
family
:
Microsoft
YaHei
;
font
-
size
:
16
px
;
font
-
size
:
16
px
;
font
-
weight
:
700
;
font
-
weight
:
700
;
}
}
.
content
{
.
content
{
margin
-
top
:
2
px
;
margin
-
top
:
4
px
;
color
:
rgba
(
132
,
136
,
142
,
1
)
;
color
:
#
666
;
font
-
family
:
Microsoft
YaHei
;
font
-
family
:
Microsoft
YaHei
;
font
-
size
:
1
6
px
;
font
-
size
:
1
5
px
;
font
-
weight
:
400
;
font
-
weight
:
400
;
line
-
height
:
24
px
;
line
-
height
:
1.5
;
padding
-
right
:
14
px
;
text
-
align
:
justify
;
display
:
-
webkit
-
box
;
-
webkit
-
box
-
orient
:
vertical
;
-
webkit
-
line
-
clamp
:
2
;
overflow
:
hidden
;
text
-
overflow
:
ellipsis
;
}
}
}
}
}
}
...
...
src/views/bill/billHome/index.vue
浏览文件 @
486b8d7c
...
@@ -223,7 +223,7 @@
...
@@ -223,7 +223,7 @@
</div>
</div>
</div>
</div>
<div
class=
"box2-main"
>
<div
class=
"box2-main"
>
<div
class=
"box2-main-item"
v-for=
"(item, index) in warningList"
:key=
"index"
>
<div
class=
"box2-main-item"
v-for=
"(item, index) in warningList"
:key=
"index"
@
click=
"handleClickToDetailO(item)"
>
<div
<div
class=
"item-left"
class=
"item-left"
:class=
"
{
:class=
"
{
...
@@ -283,7 +283,9 @@
...
@@ -283,7 +283,9 @@
{{
news
.
newsDate
?
news
.
newsDate
.
slice
(
5
)
:
""
}}
-
{{
news
.
newsOrg
}}
{{
news
.
newsDate
?
news
.
newsDate
.
slice
(
5
)
:
""
}}
-
{{
news
.
newsOrg
}}
</div>
</div>
</div>
</div>
<CommonPrompt
:content=
"news.newsContent"
>
<div
class=
"right-footer"
>
{{
news
.
newsContent
}}
</div>
<div
class=
"right-footer"
>
{{
news
.
newsContent
}}
</div>
</CommonPrompt>
</div>
</div>
</div>
</div>
</div>
</div>
...
@@ -772,6 +774,7 @@ import {
...
@@ -772,6 +774,7 @@ import {
}
from
"@/api/bill/billHome"
;
}
from
"@/api/bill/billHome"
;
import
{
getPersonSummaryInfo
}
from
"@/api/common/index"
;
import
{
getPersonSummaryInfo
}
from
"@/api/common/index"
;
import
DivideHeader
from
"@/components/DivideHeader.vue"
;
import
DivideHeader
from
"@/components/DivideHeader.vue"
;
import
CommonPrompt
from
"../commonPrompt/index.vue"
;
import
{
useContainerScroll
}
from
"@/hooks/useScrollShow"
;
import
{
useContainerScroll
}
from
"@/hooks/useScrollShow"
;
...
@@ -944,13 +947,13 @@ const curBill = ref({
...
@@ -944,13 +947,13 @@ const curBill = ref({
// 查看详情
// 查看详情
const
handleClickToDetail
=
()
=>
{
const
handleClickToDetail
=
()
=>
{
window
.
sessionStorage
.
setItem
(
"billId"
,
curBill
.
value
.
billId
);
window
.
sessionStorage
.
setItem
(
"billId"
,
curBill
.
value
.
billId
);
const
route
=
router
.
resolve
(
"/billLayout
"
);
const
route
=
router
.
resolve
(
"/billLayout
?billId="
+
curBill
.
value
.
billId
);
window
.
open
(
route
.
href
,
"_blank"
);
window
.
open
(
route
.
href
,
"_blank"
);
}
;
}
;
// 查看详情 传递参数
// 查看详情 传递参数
const
handleClickToDetailO
=
item
=>
{
const
handleClickToDetailO
=
item
=>
{
window
.
sessionStorage
.
setItem
(
"billId"
,
item
.
billId
);
window
.
sessionStorage
.
setItem
(
"billId"
,
item
.
billId
);
const
route
=
router
.
resolve
(
"/billLayout
"
);
const
route
=
router
.
resolve
(
"/billLayout
?billId="
+
item
.
billId
);
window
.
open
(
route
.
href
,
"_blank"
);
window
.
open
(
route
.
href
,
"_blank"
);
}
;
}
;
...
@@ -980,133 +983,6 @@ const handleToMoreNews = () => {
...
@@ -980,133 +983,6 @@ const handleToMoreNews = () => {
// 风险信号
// 风险信号
const
warningList
=
ref
([]);
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 curBillList = computed(() =>
{
// const startIndex = (currentPage.value - 1) * 12;
// const endIndex = startIndex + 12;
// return billList.value.slice(startIndex, endIndex);
//
}
);
const
box7selectetedTime
=
ref
(
"2025"
);
const
box7selectetedTime
=
ref
(
"2025"
);
const
box7YearList
=
ref
([
const
box7YearList
=
ref
([
...
...
src/views/bill/billLayout/index.vue
浏览文件 @
486b8d7c
...
@@ -39,11 +39,6 @@
...
@@ -39,11 +39,6 @@
<div
class=
"name"
>
{{
billInfoGlobal
.
tarName
}}
</div>
<div
class=
"name"
>
{{
billInfoGlobal
.
tarName
}}
</div>
</div>
</div>
<div
class=
"right-box-bottom"
>
<div
class=
"right-box-bottom"
>
<!--
<el-button
type=
"plain"
size=
"large"
icon=
"Search"
@
click=
"handleSwitchActiveName('法案原文')"
>
法案原文
</el-button
>
<el-button
type=
"primary"
size=
"large"
icon=
"EditPen"
>
分析报告
</el-button>
-->
<div
class=
"btn1"
@
click=
"handleSwitchActiveName('法案原文')"
>
<div
class=
"btn1"
@
click=
"handleSwitchActiveName('法案原文')"
>
<div
class=
"icon"
>
<div
class=
"icon"
>
<img
src=
"./assets/icons/btn-icon1.png"
alt=
""
/>
<img
src=
"./assets/icons/btn-icon1.png"
alt=
""
/>
...
@@ -85,21 +80,21 @@
...
@@ -85,21 +80,21 @@
<div
class=
"report-main"
>
<div
class=
"report-main"
>
<div
class=
"report-header"
>
<div
class=
"report-header"
>
<div
class=
"report-header-left"
>
<div
class=
"report-header-left"
>
<div
class=
"text"
>
法案版本:
</div>
<
!--
<
div
class=
"text"
>
法案版本:
</div>
<div
class=
"select-box"
>
<div
class=
"select-box"
>
<el-select
v-model=
"curBill"
placeholder=
"选择法案"
style=
"width: 240px"
>
<el-select
v-model=
"curBill"
placeholder=
"选择法案"
style=
"width: 240px"
>
<el-option
v-for=
"item in billList"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
<el-option
v-for=
"item in billList"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
</el-select>
</el-select>
</div>
</div>
-->
</div>
</div>
<div
class=
"report-header-right"
>
<div
class=
"report-header-right"
>
<div
class=
"btn"
>
<
!--
<
div
class=
"btn"
>
<div
class=
"icon"
>
<div
class=
"icon"
>
<img
src=
"./assets/images/report-header-icon1.png"
alt=
""
/>
<img
src=
"./assets/images/report-header-icon1.png"
alt=
""
/>
</div>
</div>
<div
class=
"text"
>
翻译
</div>
<div
class=
"text"
>
翻译
</div>
</div>
</div>
-->
<div
class=
"btn"
>
<
!--
<
div
class=
"btn"
>
<div
class=
"icon"
>
<div
class=
"icon"
>
<img
src=
"./assets/images/report-header-icon2.png"
alt=
""
/>
<img
src=
"./assets/images/report-header-icon2.png"
alt=
""
/>
</div>
</div>
...
@@ -116,16 +111,17 @@
...
@@ -116,16 +111,17 @@
<img
src=
"./assets/images/report-header-icon4.png"
alt=
""
/>
<img
src=
"./assets/images/report-header-icon4.png"
alt=
""
/>
</div>
</div>
<div
class=
"text"
>
查找
</div>
<div
class=
"text"
>
查找
</div>
</div>
</div>
-->
</div>
</div>
</div>
</div>
<div
class=
"report-content"
>
<div
class=
"report-content"
>
<div
class=
"content-left"
>
<div
class=
"content-left"
>
<img
src=
"./assets/images/report1.png"
alt=
""
/>
<iframe
v-if=
"billFullText"
:src=
"billFullText"
width=
"100%"
height=
"100%"
frameborder=
"0"
></iframe>
<!--
<img
v-else
src=
"./assets/images/report1.png"
alt=
""
/>
-->
</div>
</div>
<div
class=
"content-right"
>
<
!--
<
div
class=
"content-right"
>
<img
src=
"./assets/images/report2.png"
alt=
""
/>
<img
src=
"./assets/images/report2.png"
alt=
""
/>
</div>
</div>
-->
</div>
</div>
</div>
</div>
</div>
</div>
...
@@ -135,7 +131,10 @@
...
@@ -135,7 +131,10 @@
<
script
setup
>
<
script
setup
>
import
{
ref
,
onMounted
}
from
"vue"
;
import
{
ref
,
onMounted
}
from
"vue"
;
import
router
from
"@/router"
;
import
router
from
"@/router"
;
import
{
getBillInfoGlobal
}
from
"@/api/bill"
;
import
{
useRoute
}
from
"vue-router"
;
import
{
getBillInfoGlobal
,
getBillFullText
}
from
"@/api/bill"
;
const
route
=
useRoute
();
import
icon1
from
"./assets/icons/icon1.png"
;
import
icon1
from
"./assets/icons/icon1.png"
;
import
icon1Active
from
"./assets/icons/icon1_active.png"
;
import
icon1Active
from
"./assets/icons/icon1_active.png"
;
...
@@ -147,13 +146,28 @@ import icon4 from "./assets/icons/icon4.png";
...
@@ -147,13 +146,28 @@ import icon4 from "./assets/icons/icon4.png";
import
icon4Active
from
"./assets/icons/icon4_active.png"
;
import
icon4Active
from
"./assets/icons/icon4_active.png"
;
import
USALogo
from
"./assets/images/USA-logo.png"
;
import
USALogo
from
"./assets/images/USA-logo.png"
;
// 法案原文
const
billFullText
=
ref
(
""
);
const
getBillFullTextFn
=
async
()
=>
{
const
res
=
await
getBillFullText
({
id
:
route
.
query
.
billId
});
if
(
res
.
code
===
200
)
{
console
.
log
(
"法案全文"
,
res
);
if
(
res
.
data
)
{
billFullText
.
value
=
typeof
res
.
data
===
"string"
?
res
.
data
.
trim
()
:
res
.
data
;
}
}
};
const
activeName
=
ref
(
"分析报告"
);
const
activeName
=
ref
(
"分析报告"
);
// 获取法案全局信息
// 获取法案全局信息
const
billInfoGlobal
=
ref
({});
const
billInfoGlobal
=
ref
({});
const
getBillInfoGlobalFn
=
async
()
=>
{
const
getBillInfoGlobalFn
=
async
()
=>
{
const
res
=
await
getBillInfoGlobal
({
const
res
=
await
getBillInfoGlobal
({
id
:
window
.
sessionStorage
.
getItem
(
"billId"
)
id
:
route
.
query
.
billId
});
});
if
(
res
.
code
===
200
)
{
if
(
res
.
code
===
200
)
{
console
.
log
(
"法案全局信息"
,
res
);
console
.
log
(
"法案全局信息"
,
res
);
...
@@ -165,6 +179,9 @@ const getBillInfoGlobalFn = async () => {
...
@@ -165,6 +179,9 @@ const getBillInfoGlobalFn = async () => {
const
handleSwitchActiveName
=
name
=>
{
const
handleSwitchActiveName
=
name
=>
{
activeName
.
value
=
name
;
activeName
.
value
=
name
;
if
(
name
===
"法案原文"
)
{
getBillFullTextFn
();
}
};
};
const
curBill
=
ref
(
"公法(2025年7月4日)"
);
const
curBill
=
ref
(
"公法(2025年7月4日)"
);
...
@@ -212,7 +229,12 @@ const activeTitle = ref("法案概况");
...
@@ -212,7 +229,12 @@ const activeTitle = ref("法案概况");
const
handleClickMainHeaderBtn
=
item
=>
{
const
handleClickMainHeaderBtn
=
item
=>
{
activeTitle
.
value
=
item
.
name
;
activeTitle
.
value
=
item
.
name
;
window
.
sessionStorage
.
setItem
(
"activeTitle"
,
activeTitle
.
value
);
window
.
sessionStorage
.
setItem
(
"activeTitle"
,
activeTitle
.
value
);
router
.
push
(
item
.
path
);
router
.
push
({
path
:
item
.
path
,
query
:
{
billId
:
route
.
query
.
billId
}
});
};
};
onMounted
(()
=>
{
onMounted
(()
=>
{
...
@@ -499,6 +521,7 @@ onMounted(() => {
...
@@ -499,6 +521,7 @@ onMounted(() => {
justify-content
:
flex-end
;
justify-content
:
flex-end
;
gap
:
8px
;
gap
:
8px
;
.btn1
{
.btn1
{
cursor
:
pointer
;
width
:
120px
;
width
:
120px
;
height
:
36px
;
height
:
36px
;
box-sizing
:
border-box
;
box-sizing
:
border-box
;
...
@@ -559,6 +582,7 @@ onMounted(() => {
...
@@ -559,6 +582,7 @@ onMounted(() => {
}
}
}
}
.btn3
{
.btn3
{
cursor
:
pointer
;
width
:
120px
;
width
:
120px
;
height
:
36px
;
height
:
36px
;
border-radius
:
6px
;
border-radius
:
6px
;
...
@@ -715,10 +739,12 @@ onMounted(() => {
...
@@ -715,10 +739,12 @@ onMounted(() => {
}
}
}
}
.report-content
{
.report-content
{
width
:
100%
;
display
:
flex
;
display
:
flex
;
margin-top
:
35px
;
margin-top
:
35px
;
.content-left
{
.content-left
{
width
:
680px
;
// width: 680px;
width
:
100%
;
height
:
786px
;
height
:
786px
;
// background: #eee;
// background: #eee;
// overflow-y: auto;
// overflow-y: auto;
...
...
src/views/bill/commonPrompt/index.vue
浏览文件 @
486b8d7c
...
@@ -33,6 +33,7 @@ defineProps({
...
@@ -33,6 +33,7 @@ defineProps({
<
style
>
<
style
>
.common-prompt-popper.el-popper
{
.common-prompt-popper.el-popper
{
z-index
:
10000000
!important
;
padding
:
8px
16px
!important
;
padding
:
8px
16px
!important
;
border-radius
:
10px
!important
;
border-radius
:
10px
!important
;
background-color
:
rgb
(
59
,
65
,
75
)
!important
;
background-color
:
rgb
(
59
,
65
,
75
)
!important
;
...
...
src/views/bill/deepDig/index.vue
浏览文件 @
486b8d7c
...
@@ -24,8 +24,11 @@
...
@@ -24,8 +24,11 @@
<
script
setup
>
<
script
setup
>
import
{
onMounted
,
ref
}
from
"vue"
;
import
{
onMounted
,
ref
}
from
"vue"
;
import
{
useRoute
}
from
"vue-router"
;
import
router
from
"@/router"
;
import
router
from
"@/router"
;
const
route
=
useRoute
();
const
siderBtnList
=
ref
([
const
siderBtnList
=
ref
([
{
{
name
:
"流程概要"
,
name
:
"流程概要"
,
...
@@ -49,7 +52,12 @@ const handleClickLeftSiderBtn = (item,index) => {
...
@@ -49,7 +52,12 @@ const handleClickLeftSiderBtn = (item,index) => {
item
.
isActive
=
false
item
.
isActive
=
false
})
})
siderBtnList
.
value
[
index
].
isActive
=
true
siderBtnList
.
value
[
index
].
isActive
=
true
router
.
push
(
item
.
path
);
router
.
push
({
path
:
item
.
path
,
query
:
{
billId
:
route
.
query
.
billId
}
});
};
};
</
script
>
</
script
>
...
...
src/views/bill/deepDig/poliContribution/index.vue
浏览文件 @
486b8d7c
...
@@ -861,6 +861,7 @@ onMounted(() => {
...
@@ -861,6 +861,7 @@ onMounted(() => {
img
{
img
{
width
:
100
%
;
width
:
100
%
;
height
:
100
%
;
height
:
100
%
;
border
-
radius
:
50
%
;
}
}
}
}
.
item
-
center
{
.
item
-
center
{
...
...
src/views/bill/deepDig/processAnalysis/index.vue
浏览文件 @
486b8d7c
...
@@ -1195,8 +1195,9 @@ onMounted(async () => {
...
@@ -1195,8 +1195,9 @@ onMounted(async () => {
font
-
size
:
14
px
;
font
-
size
:
14
px
;
font
-
weight
:
600
;
font
-
weight
:
600
;
line
-
height
:
22
px
;
line
-
height
:
22
px
;
padding
:
0
20
px
;
.
box3
-
main
-
center
-
header
-
box1
{
.
box3
-
main
-
center
-
header
-
box1
{
width
:
43
0
px
;
width
:
37
0
px
;
text
-
align
:
center
;
text
-
align
:
center
;
}
}
.
box3
-
main
-
center
-
header
-
box2
{
.
box3
-
main
-
center
-
header
-
box2
{
...
@@ -1204,7 +1205,7 @@ onMounted(async () => {
...
@@ -1204,7 +1205,7 @@ onMounted(async () => {
text
-
align
:
center
;
text
-
align
:
center
;
}
}
.
box3
-
main
-
center
-
header
-
box3
{
.
box3
-
main
-
center
-
header
-
box3
{
width
:
7
7
px
;
width
:
7
5
px
;
text
-
align
:
center
;
text
-
align
:
center
;
}
}
.
box3
-
main
-
center
-
header
-
box4
{
.
box3
-
main
-
center
-
header
-
box4
{
...
@@ -1212,11 +1213,11 @@ onMounted(async () => {
...
@@ -1212,11 +1213,11 @@ onMounted(async () => {
text
-
align
:
center
;
text
-
align
:
center
;
}
}
.
box3
-
main
-
center
-
header
-
box5
{
.
box3
-
main
-
center
-
header
-
box5
{
width
:
8
0
px
;
width
:
10
0
px
;
text
-
align
:
center
;
text
-
align
:
center
;
}
}
.
box3
-
main
-
center
-
header
-
box6
{
.
box3
-
main
-
center
-
header
-
box6
{
width
:
126
px
;
width
:
90
px
;
text
-
align
:
center
;
text
-
align
:
center
;
}
}
}
}
...
@@ -1236,7 +1237,7 @@ onMounted(async () => {
...
@@ -1236,7 +1237,7 @@ onMounted(async () => {
display
:
flex
;
display
:
flex
;
height
:
45
px
;
height
:
45
px
;
.
item
-
box1
{
.
item
-
box1
{
width
:
40
0
px
;
width
:
37
0
px
;
display
:
flex
;
display
:
flex
;
.
box1
-
left
{
.
box1
-
left
{
width
:
130
px
;
width
:
130
px
;
...
@@ -1282,7 +1283,7 @@ onMounted(async () => {
...
@@ -1282,7 +1283,7 @@ onMounted(async () => {
border
-
radius
:
0
;
border
-
radius
:
0
;
}
}
:
deep
(.
el
-
progress
-
bar__outer
)
{
:
deep
(.
el
-
progress
-
bar__outer
)
{
background
:
rgba
(
22
,
119
,
255
,
0.
5
);
background
:
rgba
(
22
,
119
,
255
,
0.
1
);
border
-
radius
:
0
;
border
-
radius
:
0
;
}
}
}
}
...
@@ -1292,7 +1293,7 @@ onMounted(async () => {
...
@@ -1292,7 +1293,7 @@ onMounted(async () => {
border
-
radius
:
0
;
border
-
radius
:
0
;
}
}
:
deep
(.
el
-
progress
-
bar__outer
)
{
:
deep
(.
el
-
progress
-
bar__outer
)
{
background
:
rgba
(
255
,
172
,
77
,
0.
5
);
background
:
rgba
(
255
,
172
,
77
,
0.
1
);
border
-
radius
:
0
;
border
-
radius
:
0
;
}
}
}
}
...
@@ -1322,7 +1323,7 @@ onMounted(async () => {
...
@@ -1322,7 +1323,7 @@ onMounted(async () => {
}
}
}
}
.
item
-
box3
{
.
item
-
box3
{
width
:
7
7
px
;
width
:
7
5
px
;
text
-
align
:
center
;
text
-
align
:
center
;
.
box3
-
1
{
.
box3
-
1
{
height
:
14
px
;
height
:
14
px
;
...
@@ -1368,7 +1369,7 @@ onMounted(async () => {
...
@@ -1368,7 +1369,7 @@ onMounted(async () => {
}
}
}
}
.
item
-
box5
{
.
item
-
box5
{
width
:
8
0
px
;
width
:
10
0
px
;
text
-
align
:
center
;
text
-
align
:
center
;
.
box5
-
1
{
.
box5
-
1
{
height
:
14
px
;
height
:
14
px
;
...
@@ -1389,12 +1390,12 @@ onMounted(async () => {
...
@@ -1389,12 +1390,12 @@ onMounted(async () => {
}
}
}
}
.
item
-
box6
{
.
item
-
box6
{
width
:
116
px
;
width
:
90
px
;
text
-
align
:
center
;
text
-
align
:
center
;
.
img
-
box
{
.
img
-
box
{
width
:
30
px
;
width
:
30
px
;
height
:
30
px
;
height
:
30
px
;
margin
-
left
:
5
0
px
;
margin
-
left
:
3
0
px
;
img
{
img
{
width
:
100
%
;
width
:
100
%
;
height
:
100
%
;
height
:
100
%
;
...
...
src/views/bill/deepDig/processOverview/index.vue
浏览文件 @
486b8d7c
...
@@ -156,9 +156,9 @@
...
@@ -156,9 +156,9 @@
</div>
</div>
<div
class=
"text"
>
{{
"变更条款"
}}
</div>
<div
class=
"text"
>
{{
"变更条款"
}}
</div>
</div>
</div>
<div
class=
"box4-right"
@
click=
"handleSwitchCompareDialog(true)"
>
<
!--
<
div
class=
"box4-right"
@
click=
"handleSwitchCompareDialog(true)"
>
{{
"条款对比 >"
}}
{{
"条款对比 >"
}}
</div>
</div>
-->
</div>
</div>
<div
class=
"dialog-box5"
>
<div
class=
"dialog-box5"
>
<div
class=
"box5-item"
v-for=
"(sub, subIndex) in currentDetailItem.fynrList"
:key=
"subIndex"
>
<div
class=
"box5-item"
v-for=
"(sub, subIndex) in currentDetailItem.fynrList"
:key=
"subIndex"
>
...
@@ -757,6 +757,7 @@ onMounted(() => {
...
@@ -757,6 +757,7 @@ onMounted(() => {
height
:
30px
;
height
:
30px
;
border-left
:
1px
solid
rgb
(
20
,
89
,
187
);
border-left
:
1px
solid
rgb
(
20
,
89
,
187
);
padding
:
0
10px
;
padding
:
0
10px
;
margin-bottom
:
8px
;
.item-title
{
.item-title
{
line-height
:
26px
;
line-height
:
26px
;
color
:
rgb
(
59
,
65
,
75
);
color
:
rgb
(
59
,
65
,
75
);
...
@@ -794,6 +795,7 @@ onMounted(() => {
...
@@ -794,6 +795,7 @@ onMounted(() => {
font-size
:
16px
;
font-size
:
16px
;
font-weight
:
400
;
font-weight
:
400
;
line-height
:
24px
;
line-height
:
24px
;
margin-bottom
:
4px
;
}
}
.item-main
{
.item-main
{
border-left
:
1px
solid
rgb
(
20
,
89
,
187
);
border-left
:
1px
solid
rgb
(
20
,
89
,
187
);
...
@@ -802,6 +804,7 @@ onMounted(() => {
...
@@ -802,6 +804,7 @@ onMounted(() => {
display
:
flex
;
display
:
flex
;
align-items
:
baseline
;
align-items
:
baseline
;
width
:
269px
;
width
:
269px
;
margin-bottom
:
4px
;
.icon
{
.icon
{
margin
:
9px
12px
;
margin
:
9px
12px
;
width
:
6px
;
width
:
6px
;
...
@@ -965,6 +968,7 @@ onMounted(() => {
...
@@ -965,6 +968,7 @@ onMounted(() => {
height
:
30px
;
height
:
30px
;
border-left
:
1px
solid
rgba
(
255
,
172
,
77
,
1
);
border-left
:
1px
solid
rgba
(
255
,
172
,
77
,
1
);
padding
:
5px
10px
;
padding
:
5px
10px
;
margin-top
:
8px
;
.item-title
{
.item-title
{
line-height
:
26px
;
line-height
:
26px
;
color
:
rgb
(
59
,
65
,
75
);
color
:
rgb
(
59
,
65
,
75
);
...
@@ -1002,6 +1006,7 @@ onMounted(() => {
...
@@ -1002,6 +1006,7 @@ onMounted(() => {
font-size
:
16px
;
font-size
:
16px
;
font-weight
:
400
;
font-weight
:
400
;
line-height
:
24px
;
line-height
:
24px
;
margin-top
:
8px
;
}
}
.item-main
{
.item-main
{
border-left
:
1px
solid
rgba
(
255
,
172
,
77
,
1
);
border-left
:
1px
solid
rgba
(
255
,
172
,
77
,
1
);
...
@@ -1010,6 +1015,7 @@ onMounted(() => {
...
@@ -1010,6 +1015,7 @@ onMounted(() => {
display
:
flex
;
display
:
flex
;
align-items
:
baseline
;
align-items
:
baseline
;
width
:
269px
;
width
:
269px
;
margin-top
:
4px
;
.icon
{
.icon
{
margin
:
9px
12px
;
margin
:
9px
12px
;
width
:
6px
;
width
:
6px
;
...
@@ -1339,23 +1345,26 @@ onMounted(() => {
...
@@ -1339,23 +1345,26 @@ onMounted(() => {
margin-left
:
23px
;
margin-left
:
23px
;
width
:
438px
;
width
:
438px
;
.box5-item
{
.box5-item
{
height
:
30px
;
min-
height
:
30px
;
color
:
rgba
(
132
,
136
,
142
,
1
);
color
:
rgba
(
132
,
136
,
142
,
1
);
font-family
:
Microsoft
YaHei
;
font-family
:
Microsoft
YaHei
;
font-size
:
16px
;
font-size
:
16px
;
font-weight
:
400
;
font-weight
:
400
;
line-height
:
30px
;
line-height
:
1
.5
;
display
:
flex
;
display
:
flex
;
margin-bottom
:
8px
;
.icon
{
.icon
{
flex-shrink
:
0
;
margin-left
:
15px
;
margin-left
:
15px
;
width
:
6px
;
width
:
6px
;
height
:
6px
;
height
:
6px
;
margin-top
:
12
px
;
margin-top
:
9
px
;
border-radius
:
3px
;
border-radius
:
3px
;
background
:
#84888e
;
background
:
#84888e
;
}
}
.text
{
.text
{
margin-left
:
10px
;
margin-left
:
10px
;
word-break
:
break-all
;
}
}
}
}
}
}
...
...
src/views/bill/index.vue
浏览文件 @
486b8d7c
...
@@ -86,8 +86,11 @@
...
@@ -86,8 +86,11 @@
<
script
setup
>
<
script
setup
>
import
{
onMounted
,
ref
}
from
"vue"
;
import
{
onMounted
,
ref
}
from
"vue"
;
import
{
useRoute
}
from
"vue-router"
;
import
router
from
'@/router'
import
router
from
'@/router'
const
route
=
useRoute
();
const
siderBtnList
=
ref
([
const
siderBtnList
=
ref
([
{
{
name
:
'法案简介'
,
name
:
'法案简介'
,
...
@@ -106,7 +109,12 @@ const siderBtnList = ref([
...
@@ -106,7 +109,12 @@ const siderBtnList = ref([
const
siderBtnActive
=
ref
(
"法案简介"
);
const
siderBtnActive
=
ref
(
"法案简介"
);
const
handleClickLeftSiderBtn
=
(
item
)
=>
{
const
handleClickLeftSiderBtn
=
(
item
)
=>
{
siderBtnActive
.
value
=
item
.
name
siderBtnActive
.
value
=
item
.
name
router
.
push
(
item
.
path
)
router
.
push
({
path
:
item
.
path
,
query
:
{
billId
:
route
.
query
.
billId
}
})
}
}
const
progressList
=
ref
([
const
progressList
=
ref
([
{
{
...
...
src/views/bill/influence/index.vue
浏览文件 @
486b8d7c
...
@@ -44,7 +44,12 @@ const handleClickLeftSiderBtn = (item,index) => {
...
@@ -44,7 +44,12 @@ const handleClickLeftSiderBtn = (item,index) => {
item
.
isActive
=
false
item
.
isActive
=
false
})
})
siderBtnList
.
value
[
index
].
isActive
=
true
siderBtnList
.
value
[
index
].
isActive
=
true
router
.
push
(
item
.
path
);
router
.
push
({
path
:
item
.
path
,
query
:
{
billId
:
route
.
query
.
billId
}
});
};
};
</
script
>
</
script
>
...
...
src/views/bill/influence/industry/index.vue
浏览文件 @
486b8d7c
...
@@ -179,7 +179,9 @@
...
@@ -179,7 +179,9 @@
<!--
<
img
:
src
=
"uncheckIcon"
alt
=
""
>
-->
<!--
<
img
:
src
=
"uncheckIcon"
alt
=
""
>
-->
<
img
:
src
=
"checkedIcon"
alt
=
""
/>
<
img
:
src
=
"checkedIcon"
alt
=
""
/>
<
/div
>
<
/div
>
<
div
class
=
"item-right"
>
{{
val
}}
<
/div
>
<
div
class
=
"item-right"
>
<
CommonPrompt
:
content
=
"val"
>
{{
val
}}
<
/CommonPrompt
>
<
/div
>
<
/div
>
<
/div
>
<
/div
>
<
/div
>
<
/div
>
<
/div
>
...
@@ -209,7 +211,10 @@
...
@@ -209,7 +211,10 @@
<
script
setup
>
<
script
setup
>
import
{
ref
,
onMounted
,
nextTick
,
computed
}
from
"vue"
;
import
{
ref
,
onMounted
,
nextTick
,
computed
}
from
"vue"
;
import
{
useRoute
}
from
"vue-router"
;
import
*
as
echarts
from
"echarts"
;
import
*
as
echarts
from
"echarts"
;
const
route
=
useRoute
();
import
{
getCompanyList
,
getIndustryHyly
,
getHylyList
,
getCompanyDetail
}
from
"@/api/influence"
;
import
{
getCompanyList
,
getIndustryHyly
,
getHylyList
,
getCompanyDetail
}
from
"@/api/influence"
;
import
getBarChart
from
"./utils/barChart"
;
import
getBarChart
from
"./utils/barChart"
;
import
getLineChart
from
"./utils/lineChart"
;
import
getLineChart
from
"./utils/lineChart"
;
...
@@ -229,6 +234,7 @@ import checkedIcon from "./assets/images/checked.png";
...
@@ -229,6 +234,7 @@ import checkedIcon from "./assets/images/checked.png";
import
closeIcon
from
"./assets/images/close.png"
;
import
closeIcon
from
"./assets/images/close.png"
;
import
Fishbone
from
"./components/fishbone.vue"
;
import
Fishbone
from
"./components/fishbone.vue"
;
import
CommonPrompt
from
"../../commonPrompt/index.vue"
;
import
CompanyImg
from
"./assets/images/symbol.png"
;
import
CompanyImg
from
"./assets/images/symbol.png"
;
...
@@ -1127,9 +1133,6 @@ onMounted(async () => {
...
@@ -1127,9 +1133,6 @@ onMounted(async () => {
font-size: 14px;
font-size: 14px;
font-weight: 400;
font-weight: 400;
line-height: 22px;
line-height: 22px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
}
}
}
}
}
...
...
src/views/bill/introdoction/index.vue
浏览文件 @
486b8d7c
...
@@ -177,7 +177,7 @@
...
@@ -177,7 +177,7 @@
<
/div> --
>
<
/div> --
>
<
div
class
=
"info-box"
>
<
div
class
=
"info-box"
>
<
div
class
=
"info-left"
>
<
div
class
=
"info-left"
>
<
img
:
src
=
"defaultAvatar"
alt
=
""
/>
<
img
:
src
=
"defaultAvatar"
alt
=
""
@
click
=
"handleClickAvatar(curPerson.id)"
/>
<
div
class
=
"usr-icon1"
>
<
div
class
=
"usr-icon1"
>
<
img
src
=
"./assets/images/usr-icon1.png"
alt
=
""
/>
<
img
src
=
"./assets/images/usr-icon1.png"
alt
=
""
/>
<
/div
>
<
/div
>
...
@@ -267,7 +267,7 @@
...
@@ -267,7 +267,7 @@
<
div
class
=
"inner-left"
>
<
div
class
=
"inner-left"
>
<
div
class
=
"info-box"
>
<
div
class
=
"info-box"
>
<
div
class
=
"info-top"
>
<
div
class
=
"info-top"
>
<
img
src
=
"./assets/images/usr1.png
"
alt
=
""
/>
<
img
:
src
=
"defaultAvatar
"
alt
=
""
/>
<
div
class
=
"usr-icon1"
>
<
div
class
=
"usr-icon1"
>
<
img
src
=
"./assets/images/usr-icon1.png"
alt
=
""
/>
<
img
src
=
"./assets/images/usr-icon1.png"
alt
=
""
/>
<
/div
>
<
/div
>
...
@@ -305,7 +305,7 @@
...
@@ -305,7 +305,7 @@
status2: tag.status === 2,
status2: tag.status === 2,
status3: tag.status === 3
status3: tag.status === 3
}
"
}
"
v
-
for
=
"(tag, index) in tagList"
v
-
for
=
"(tag, index) in
curPerson.
tagList"
:
key
=
"index"
:
key
=
"index"
>
>
{{
tag
.
title
}}
{{
tag
.
title
}}
...
@@ -335,30 +335,10 @@
...
@@ -335,30 +335,10 @@
{{
item
.
newsContent
}}
{{
item
.
newsContent
}}
<
/div
>
<
/div
>
<
div
class
=
"pic"
>
<
div
class
=
"pic"
>
<
img
src
=
"./assets/imgs/img1.png
"
alt
=
""
/>
<
img
:
src
=
"defaultNew
"
alt
=
""
/>
<
/div
>
<
/div
>
<
/div
>
<
/div
>
<
/el-timeline-item
>
<
/el-timeline-item
>
<!--
<
el
-
timeline
-
item
timestamp
=
"2018/4/3"
placement
=
"top"
>
<
div
class
=
"timeline-content1"
>
<
div
class
=
"text"
>
当地时间周五,美国众议院预算委员会投票否决了共和党提出的党派性税收与支出法案,强硬派保守党人的持续反对导致法案推进受阻。为安抚委员会内的极右翼成员,共和党领袖正考虑对法案进行重大修改,包括将医疗补助的工作要求实施时间从原定的
2029
年提前,并立即取消无证移民
...
<
/div
>
<
div
class
=
"pic"
>
<
img
src
=
"./assets/imgs/img2.png"
alt
=
""
/>
<
/div
>
<
/div
>
<
/el-timeline-item
>
<
el
-
timeline
-
item
timestamp
=
"2018/4/2"
placement
=
"top"
>
<
div
class
=
"timeline-content1"
>
<
div
class
=
"text"
>
2025
年
2
月中旬,众议院预算委员会通过《
2025
财年预算决议》,特朗普的减税议程迈出第一步。决议要求:延长
2017
年特朗普首个任期内出台的减税条款,计划在未来十年减税
4.5
万亿美元,强制性支出需合计削减
2
万亿美元,部分支出需控制增幅,未来十年共削减政府开支
1.5
万亿
...
<
/div
>
<
div
class
=
"pic"
>
<
img
src
=
"./assets/imgs/img3.png"
alt
=
""
/>
<
/div
>
<
/div
>
<
/el-timeline-item> --
>
<
/el-timeline
>
<
/el-timeline
>
<
/div
>
<
/div
>
<
/div
>
<
/div
>
...
@@ -369,22 +349,41 @@
...
@@ -369,22 +349,41 @@
<
script
setup
>
<
script
setup
>
import
{
onMounted
,
ref
}
from
"vue"
;
import
{
onMounted
,
ref
}
from
"vue"
;
import
{
useRoute
,
useRouter
}
from
"vue-router"
;
import
WordCloudMap
from
"./WordCloudMap.vue"
;
import
WordCloudMap
from
"./WordCloudMap.vue"
;
import
STimeline
from
"./STimeline.vue"
;
import
STimeline
from
"./STimeline.vue"
;
import
{
getBillInfo
,
getBillPerson
,
getBillEvent
,
getBillDyqk
}
from
"@/api/bill"
;
import
{
getBillInfo
,
getBillPerson
,
getBillEvent
,
getBillDyqk
}
from
"@/api/bill"
;
import
defaultAvatar
from
"../assets/images/default-icon1.png"
;
import
defaultAvatar
from
"../assets/images/default-icon1.png"
;
import
defaultNew
from
"../assets/images/default-icon-news.png"
;
const
box2BtnActive
=
ref
(
1
);
const
route
=
useRoute
();
const
handleClcikBox2Btn
=
index
=>
{
const
router
=
useRouter
();
box2BtnActive
.
value
=
index
;
}
;
const
box3BtnActive
=
ref
(
""
);
// 跳转到人物页面
const
handleClcikBox3Btn
=
(
name
,
index
)
=>
{
const
handleClickAvatar
=
id
=>
{
box3BtnActive
.
value
=
name
;
const
routeData
=
router
.
resolve
({
curPerson
.
value
=
personList
.
value
[
index
];
path
:
"/characterPage"
,
personEventList
.
value
=
personList
.
value
[
index
].
eventList
;
query
:
{
personId
:
id
}
}
);
window
.
open
(
routeData
.
href
,
"_blank"
);
}
;
}
;
// 获取URL地址里面的billId
const
billId
=
ref
(
route
.
query
.
billId
);
// console.log(billId.value)
// const box2BtnActive = ref(1);
// const handleClcikBox2Btn = index =>
{
// box2BtnActive.value = index;
//
}
;
// const box3BtnActive = ref("");
// const handleClcikBox3Btn = (name, index) =>
{
// box3BtnActive.value = name;
// curPerson.value = personList.value[index];
// personEventList.value = personList.value[index].eventList;
//
}
;
const
dialogBoxBtnActive
=
ref
(
0
);
const
dialogBoxBtnActive
=
ref
(
0
);
const
handleClcikDialogBoxBtn
=
index
=>
{
const
handleClcikDialogBoxBtn
=
index
=>
{
...
@@ -540,7 +539,7 @@ const basicInfo = ref({});
...
@@ -540,7 +539,7 @@ const basicInfo = ref({});
const
handleGetBasicInfo
=
async
()
=>
{
const
handleGetBasicInfo
=
async
()
=>
{
const
params
=
{
const
params
=
{
id
:
window
.
sessionStorage
.
getItem
(
"billId"
)
id
:
billId
.
value
}
;
}
;
try
{
try
{
const
res
=
await
getBillInfo
(
params
);
const
res
=
await
getBillInfo
(
params
);
...
@@ -579,21 +578,13 @@ const warningNum = ref(0);
...
@@ -579,21 +578,13 @@ const warningNum = ref(0);
// 法案进展 获取前期进展 --也是提出人左上角列表
// 法案进展 获取前期进展 --也是提出人左上角列表
const
handleGetBillDyqk
=
async
()
=>
{
const
handleGetBillDyqk
=
async
()
=>
{
const
params
=
{
const
params
=
{
id
:
window
.
sessionStorage
.
getItem
(
"billId"
)
id
:
billId
.
value
}
;
}
;
try
{
try
{
const
res
=
await
getBillDyqk
(
params
);
const
res
=
await
getBillDyqk
(
params
);
console
.
log
(
"前期进展"
,
res
);
console
.
log
(
"前期进展"
,
res
);
timelineData
.
value
=
res
.
data
;
timelineData
.
value
=
res
.
data
;
// faList.value = res.data.map(item =>
{
// return
{
// label: item.actionTitle,
// value: item.actionTitle,
// id: item.id
//
}
;
//
}
);
// selectValue.value = faList.value[0];
// handleGetBillPerson(faList.value[0].id);
}
catch
(
error
)
{
}
catch
(
error
)
{
console
.
error
(
error
);
console
.
error
(
error
);
}
}
...
@@ -605,35 +596,20 @@ const curPerson = ref({});
...
@@ -605,35 +596,20 @@ const curPerson = ref({});
// 人物动态
// 人物动态
const
personEventList
=
ref
([]);
const
personEventList
=
ref
([]);
// 提出人 --动议id
// const handleGetBillPerson = async id =>
{
// const params =
{
// id: id
//
}
;
// try
{
// const res = await getBillPerson(params);
// console.log("提出人", res);
// personList.value = res.data;
// box3BtnActive.value = res.data.length ? res.data[0].name : "";
// curPerson.value = res.data.length ? res.data[0] :
{
}
;
// personEventList.value = res.data.length ? res.data[0].eventList : [];
//
}
catch
(
error
)
{
// console.error(error);
//
}
//
}
;
// 法案提出人
// 法案提出人
const
handleGetBillPerson
=
async
()
=>
{
const
handleGetBillPerson
=
async
()
=>
{
const
params
=
{
const
params
=
{
billId
:
window
.
sessionStorage
.
getItem
(
"billId"
)
billId
:
billId
.
value
}
;
}
;
try
{
try
{
const
res
=
await
getBillPerson
(
params
);
const
res
=
await
getBillPerson
(
params
);
console
.
log
(
"提出人"
,
res
);
console
.
log
(
"提出人"
,
res
);
personList
.
value
=
res
.
data
;
//
personList.value = res.data;
box3BtnActive
.
value
=
res
.
data
.
length
?
res
.
data
[
0
].
name
:
""
;
//
box3BtnActive.value = res.data.length ? res.data[0].name : "";
curPerson
.
value
=
res
.
data
.
length
?
res
.
data
[
0
]
:
{
}
;
curPerson
.
value
=
res
.
data
.
length
?
res
.
data
[
0
]
:
{
}
;
personEventList
.
value
=
res
.
data
.
length
?
res
.
data
[
0
].
eventList
:
[];
//
personEventList.value = res.data.length ? res.data[0].eventList : [];
}
catch
(
error
)
{
}
catch
(
error
)
{
console
.
error
(
error
);
console
.
error
(
error
);
}
}
...
...
src/views/bill/template/index.vue
浏览文件 @
486b8d7c
...
@@ -160,10 +160,13 @@
...
@@ -160,10 +160,13 @@
<
script
setup
>
<
script
setup
>
import
{
ref
,
onMounted
}
from
"vue"
;
import
{
ref
,
onMounted
}
from
"vue"
;
import
{
useRoute
}
from
"vue-router"
;
import
*
as
echarts
from
"echarts"
;
import
*
as
echarts
from
"echarts"
;
import
getPieChart
from
"./utils/piechart"
;
import
getPieChart
from
"./utils/piechart"
;
import
{
getBillContentId
,
getBillContentTk
,
getBillContentXzfs
,
getBillHyly
}
from
"@/api/bill"
;
import
{
getBillContentId
,
getBillContentTk
,
getBillContentXzfs
,
getBillHyly
}
from
"@/api/bill"
;
const
route
=
useRoute
();
const
curBill
=
ref
(
""
);
const
curBill
=
ref
(
""
);
const
curBillId
=
ref
(
null
);
const
curBillId
=
ref
(
null
);
const
checkedValue
=
ref
(
false
);
const
checkedValue
=
ref
(
false
);
...
@@ -173,172 +176,7 @@ const currentPage = ref(1);
...
@@ -173,172 +176,7 @@ const currentPage = ref(1);
const
pageSize
=
ref
(
10
);
const
pageSize
=
ref
(
10
);
const
total
=
ref
(
0
);
const
total
=
ref
(
0
);
const
mainTermsList
=
ref
([
const
mainTermsList
=
ref
([]);
{
id
:
1
,
title
:
"废除价值800美元以下进口包裹的免税政策,改为征收30%关税或每件25-50美元费用。"
,
header
:
"第51255条"
,
headerEn
:
"Sec.51225"
,
content
:
"Elimination of De Minimis Rule for imports valued below $800."
,
tags
:
[
{
name
:
"关税"
,
status
:
2
}
,
{
name
:
"跨境电商"
,
status
:
1
}
]
}
,
{
id
:
2
,
title
:
"对所有进口商品加征10%关税。"
,
header
:
"第51255条"
,
headerEn
:
"Sec.51225"
,
content
:
"Imposing a 10% baseline tariff on all imported goods."
,
tags
:
[
{
name
:
"关税"
,
status
:
2
}
]
}
,
{
id
:
3
,
title
:
"第50404条:若美企与中企签订超100万美元技术许可协议,将丧失政府补贴资格。"
,
header
:
"第51255条"
,
headerEn
:
"Sec.51225"
,
content
:
"Sec. 50404. If the taxpayer has entered into any technology licensing agreement with a FEOC exceeding $1,000,000..."
,
tags
:
[
{
name
:
"技术封锁"
,
status
:
6
}
]
}
,
{
id
:
4
,
title
:
"第4502条:2025年9月30日后终止电动汽车消费者税收抵免。"
,
header
:
"第51255条"
,
headerEn
:
"Sec.51225"
,
content
:
"Sec.4502. Termination of electric vehicle consumer tax credits after September 30, 2025."
,
tags
:
[
{
name
:
"税收"
,
status
:
2
}
,
{
name
:
"新能源"
,
status
:
1
}
]
}
,
{
id
:
5
,
title
:
"2026年1月1日起对使用进口组件的光伏项目征收15%消费税。"
,
header
:
"第51255条"
,
headerEn
:
"Sec.51225"
,
content
:
"Imposition of 15% excise tax on solar projects using imported components after January 1, 2026."
,
tags
:
[
{
name
:
"供应链打压"
,
status
:
3
}
,
{
name
:
"光伏"
,
status
:
1
}
]
}
,
{
id
:
6
,
title
:
"若风电/光伏项目中受关注外国实体(FEOC)组件成本占比超标(如2026年太阳能为40%),则取消税收抵免。"
,
header
:
"第51255条"
,
headerEn
:
"Sec.51225"
,
content
:
"Prohibiting tax credits for wind/solar projects if components from Foreign Entities of Concern (FEOC) exceed cost ratios ..."
,
tags
:
[
{
name
:
"供应链打压"
,
status
:
3
}
,
{
name
:
"光伏"
,
status
:
1
}
]
}
,
{
id
:
7
,
title
:
"第50401条:2025年起,若电池中关键矿物由受关注外国实体(FEOC)提取、加工或回收,则该车辆无法享受税收抵免。"
,
header
:
"第51255条"
,
headerEn
:
"Sec.51225"
,
content
:
"Sec. 50401. No tax credit shall be allowed for any vehicle placed in service after December 31, 2024, if any of the..."
,
tags
:
[
{
name
:
"供应链打压"
,
status
:
3
}
,
{
name
:
"新能源"
,
status
:
1
}
]
}
,
{
id
:
8
,
title
:
"Sec. 50401. No tax credit shall be allowed for any vehicle placed in service after December 31, 2024, if any of the..."
,
header
:
"第51255条"
,
headerEn
:
"Sec.51225"
,
content
:
"Sec. 50405. No credit shall be allowed under this chapter to any entity in which a foreign adversary holds 25% or more ..."
,
tags
:
[
{
name
:
"新能源"
,
status
:
1
}
]
}
,
{
id
:
9
,
title
:
"第4501条:芯片企业税收抵免提至35%,但禁止在中国大陆扩大先进制程生产。"
,
header
:
"第51255条"
,
headerEn
:
"Sec.51225"
,
content
:
"Sec. 4501. The advanced manufacturing investment credit under section 48D shall be increased to 35%, provided that ..."
,
tags
:
[
{
name
:
"技术封锁"
,
status
:
5
}
,
{
name
:
"半导体"
,
status
:
4
}
]
}
,
{
id
:
10
,
title
:
"第20013条:授权拨款5亿美元用于向台湾提供防御物资、训练及其他服务。"
,
content
:
"Sec. 20013. $500,000,000 is authorized to be appropriated for the provision of defense articles, training, and other ..."
,
header
:
"第51255条"
,
headerEn
:
"Sec.51225"
,
tags
:
[
{
name
:
"拨款"
,
status
:
2
}
,
{
name
:
"军工"
,
status
:
6
}
]
}
]);
const
btnActiveIndex
=
ref
(
1
);
const
btnActiveIndex
=
ref
(
1
);
const
handleSelectBtn
=
index
=>
{
const
handleSelectBtn
=
index
=>
{
btnActiveIndex
.
value
=
index
;
btnActiveIndex
.
value
=
index
;
...
@@ -382,13 +220,15 @@ const handleChangeBill = val => {
...
@@ -382,13 +220,15 @@ const handleChangeBill = val => {
curBillId
.
value
=
item
.
id
;
curBillId
.
value
=
item
.
id
;
currentPage
.
value
=
1
;
currentPage
.
value
=
1
;
handleGetBillContentTk
(
checkedValue
.
value
?
"Y"
:
"N"
);
handleGetBillContentTk
(
checkedValue
.
value
?
"Y"
:
"N"
);
handleGetBillContentXzfs
();
handleGetBillHyly
();
}
}
}
;
}
;
// 获取法案id列表
// 获取法案id列表
const
handleGetBillList
=
async
()
=>
{
const
handleGetBillList
=
async
()
=>
{
const
params
=
{
const
params
=
{
id
:
window
.
sessionStorage
.
getItem
(
"billId"
)
id
:
route
.
query
.
billId
}
;
}
;
try
{
try
{
const
res
=
await
getBillContentId
(
params
);
const
res
=
await
getBillContentId
(
params
);
...
@@ -410,6 +250,8 @@ const handleGetBillList = async () => {
...
@@ -410,6 +250,8 @@ const handleGetBillList = async () => {
const
handleChangeCheckbox
=
val
=>
{
const
handleChangeCheckbox
=
val
=>
{
currentPage
.
value
=
1
;
currentPage
.
value
=
1
;
handleGetBillContentTk
(
val
?
"Y"
:
"N"
);
handleGetBillContentTk
(
val
?
"Y"
:
"N"
);
handleGetBillContentXzfs
();
handleGetBillHyly
();
}
;
}
;
const
handleCurrentChange
=
val
=>
{
const
handleCurrentChange
=
val
=>
{
...
@@ -420,16 +262,17 @@ const handleCurrentChange = val => {
...
@@ -420,16 +262,17 @@ const handleCurrentChange = val => {
// 根据原文ID获取条款列表
// 根据原文ID获取条款列表
const
handleGetBillContentTk
=
async
cRelated
=>
{
const
handleGetBillContentTk
=
async
cRelated
=>
{
const
params
=
{
const
params
=
{
bill
id
:
window
.
sessionStorage
.
getItem
(
"billId"
)
,
bill
Id
:
route
.
query
.
billId
,
id
:
curBill
.
value
,
id
:
curBill
.
value
,
cRelated
:
cRelated
,
cRelated
:
cRelated
,
currentPage
:
currentPage
.
value
-
1
,
pageSize
:
pageSize
.
value
,
pageSize
:
pageSiz
e
.
value
currentPage
:
currentPag
e
.
value
}
;
}
;
try
{
try
{
const
res
=
await
getBillContentTk
(
params
);
const
res
=
await
getBillContentTk
(
params
);
console
.
log
(
"条款内容"
,
res
);
console
.
log
(
"条款内容"
,
res
);
mainTermsList
.
value
=
res
.
data
.
content
.
map
(
item
=>
{
if
(
res
&&
res
.
data
)
{
mainTermsList
.
value
=
(
res
.
data
.
content
||
[]).
map
(
item
=>
{
// 处理 fynr
// 处理 fynr
if
(
item
.
fynr
)
{
if
(
item
.
fynr
)
{
const
matchComplex
=
item
.
fynr
.
match
(
/^
(?:
正文内容
[
::
]\s
*
)?[
“"
]?\s
*第
\s
*
([
0-9a-zA-Z
]
+
)\s
*
[
条节
][
::
\.\。]?[
”"
]?\s
*/
);
const
matchComplex
=
item
.
fynr
.
match
(
/^
(?:
正文内容
[
::
]\s
*
)?[
“"
]?\s
*第
\s
*
([
0-9a-zA-Z
]
+
)\s
*
[
条节
][
::
\.\。]?[
”"
]?\s
*/
);
...
@@ -462,14 +305,24 @@ const handleGetBillContentTk = async cRelated => {
...
@@ -462,14 +305,24 @@ const handleGetBillContentTk = async cRelated => {
}
}
return
item
;
return
item
;
}
);
}
);
total
.
value
=
res
.
data
.
totalElements
;
total
.
value
=
res
.
data
.
totalElements
||
0
;
}
catch
(
error
)
{
}
}
else
{
mainTermsList
.
value
=
[];
total
.
value
=
0
;
}
}
catch
(
error
)
{
console
.
error
(
"获取条款内容失败"
,
error
);
mainTermsList
.
value
=
[];
total
.
value
=
0
;
}
}
;
}
;
// 获取限制方式列表
// 获取限制方式列表
const
handleGetBillContentXzfs
=
async
()
=>
{
const
handleGetBillContentXzfs
=
async
()
=>
{
const
params
=
{
const
params
=
{
id
:
window
.
sessionStorage
.
getItem
(
"billId"
)
billId
:
route
.
query
.
billId
,
versionId
:
curBill
.
value
,
cRelated
:
checkedValue
.
value
?
"Y"
:
"N"
}
;
}
;
try
{
try
{
...
@@ -481,13 +334,17 @@ const handleGetBillContentXzfs = async () => {
...
@@ -481,13 +334,17 @@ const handleGetBillContentXzfs = async () => {
value
:
item
.
countTk
value
:
item
.
countTk
}
;
}
;
}
);
}
);
let
chart1
=
getPieChart
(
chart1Data
.
value
,
chart1ColorList
.
value
);
setChart
(
chart1
,
"chart1"
);
}
catch
(
error
)
{
}
}
catch
(
error
)
{
}
}
;
}
;
// 行业领域
// 行业领域
const
handleGetBillHyly
=
async
()
=>
{
const
handleGetBillHyly
=
async
()
=>
{
const
params
=
{
const
params
=
{
id
:
window
.
sessionStorage
.
getItem
(
"billId"
)
billId
:
route
.
query
.
billId
,
versionId
:
curBill
.
value
,
cRelated
:
checkedValue
.
value
?
"Y"
:
"N"
}
;
}
;
try
{
try
{
...
@@ -499,7 +356,6 @@ const handleGetBillHyly = async () => {
...
@@ -499,7 +356,6 @@ const handleGetBillHyly = async () => {
value
:
item
.
countTk
value
:
item
.
countTk
}
;
}
;
}
);
}
);
console
.
log
(
"chart2Data"
,
chart2Data
.
value
);
let
chart2
=
getPieChart
(
chart2Data
.
value
,
chart2ColorList
.
value
);
let
chart2
=
getPieChart
(
chart2Data
.
value
,
chart2ColorList
.
value
);
setChart
(
chart2
,
"chart2"
);
setChart
(
chart2
,
"chart2"
);
...
...
src/views/exportControl/components/news.vue
浏览文件 @
486b8d7c
...
@@ -6,7 +6,9 @@
...
@@ -6,7 +6,9 @@
</div>
</div>
<div
class=
"news-content"
>
<div
class=
"news-content"
>
<div
class=
"news-header"
>
<div
class=
"news-header"
>
<div
class=
"news-title"
>
{{
item
.
title
}}
</div>
<CommonPrompt
:content=
"item.title"
class=
"news-title-prompt"
>
<span
class=
"news-title"
>
{{
item
.
title
}}
</span>
</CommonPrompt>
<div
class=
"news-meta"
>
<div
class=
"news-meta"
>
<span
class=
"news-time"
>
{{
item
.
time
}}
</span>
·
<span
class=
"news-time"
>
{{
item
.
time
}}
</span>
·
<span
class=
"news-source"
>
{{
item
.
source
}}
</span>
<span
class=
"news-source"
>
{{
item
.
source
}}
</span>
...
@@ -100,6 +102,13 @@ const handleItemClick = item => {
...
@@ -100,6 +102,13 @@ const handleItemClick = item => {
justify-content
:
space-between
;
justify-content
:
space-between
;
align-items
:
flex-start
;
align-items
:
flex-start
;
margin-bottom
:
8px
;
margin-bottom
:
8px
;
overflow
:
hidden
;
}
.news-title-prompt
{
flex
:
1
;
min-width
:
0
;
margin-right
:
12px
;
}
}
.news-title
{
.news-title
{
...
@@ -108,11 +117,7 @@ const handleItemClick = item => {
...
@@ -108,11 +117,7 @@ const handleItemClick = item => {
font-weight
:
700
;
font-weight
:
700
;
color
:
rgba
(
59
,
65
,
75
,
1
);
color
:
rgba
(
59
,
65
,
75
,
1
);
line-height
:
24px
;
line-height
:
24px
;
flex
:
1
;
display
:
inline-block
;
margin-right
:
12px
;
white-space
:
nowrap
;
overflow
:
hidden
;
text-overflow
:
ellipsis
;
}
}
.news-meta
{
.news-meta
{
...
...
src/views/exportControl/index.vue
浏览文件 @
486b8d7c
...
@@ -190,7 +190,7 @@
...
@@ -190,7 +190,7 @@
>
>
<
template
#
default
>
<
template
#
default
>
<div
class=
"box2-main"
>
<div
class=
"box2-main"
>
<div
class=
"box2-main-item"
v-for=
"(item, index) in warningList"
:key=
"index"
>
<div
class=
"box2-main-item"
v-for=
"(item, index) in warningList"
:key=
"index"
@
click=
"handleToRiskSignalDetail(item)"
>
<div
<div
class=
"item-left"
class=
"item-left"
:class=
"
{
:class=
"
{
...
@@ -202,7 +202,9 @@
...
@@ -202,7 +202,9 @@
</div>
</div>
<div
class=
"item-right"
>
<div
class=
"item-right"
>
<div
class=
"text"
>
<div
class=
"text"
>
<CommonPrompt
:content=
"item.title"
>
{{
item
.
title
}}
{{
item
.
title
}}
</CommonPrompt>
</div>
</div>
<div
class=
"time"
>
{{
item
.
time
}}
</div>
<div
class=
"time"
>
{{
item
.
time
}}
</div>
</div>
</div>
...
@@ -758,6 +760,18 @@ import {
...
@@ -758,6 +760,18 @@ import {
getExportControlList
getExportControlList
}
from
"@/api/exportControl"
;
}
from
"@/api/exportControl"
;
// 跳转到单项制裁页面
const
handleToRiskSignalDetail
=
item
=>
{
const
routeData
=
router
.
resolve
({
path
:
"/exportControl/singleSanction"
,
query
:
{
id
:
item
.
sanId
}
});
// 打开新页面
window
.
open
(
routeData
.
href
,
"_blank"
);
};
const
sanctionList
=
ref
([]);
const
sanctionList
=
ref
([]);
const
techOptions
=
[
const
techOptions
=
[
...
@@ -797,8 +811,8 @@ import { formatAnyDateToChinese } from "./utils";
...
@@ -797,8 +811,8 @@ import { formatAnyDateToChinese } from "./utils";
import
_
from
"lodash"
;
import
_
from
"lodash"
;
const
handleCompClick
=
item
=>
{
const
handleCompClick
=
item
=>
{
console
.
log
(
"item"
,
item
);
//
console.log("item", item);
if
(
item
.
entityType
!=
2
)
return
;
//
if (item.entityType != 2) return;
const
route
=
router
.
resolve
({
const
route
=
router
.
resolve
({
path
:
"/companyPages"
,
path
:
"/companyPages"
,
query
:
{
query
:
{
...
@@ -1426,12 +1440,14 @@ const fetchRiskSignals = async () => {
...
@@ -1426,12 +1440,14 @@ const fetchRiskSignals = async () => {
try
{
try
{
const
data
=
await
getRiskSignal
();
const
data
=
await
getRiskSignal
();
if
(
data
&&
Array
.
isArray
(
data
))
{
if
(
data
&&
Array
.
isArray
(
data
))
{
console
.
log
(
data
);
warningList
.
value
=
data
.
map
(
item
=>
({
warningList
.
value
=
data
.
map
(
item
=>
({
...
item
,
...
item
,
title
:
item
.
signalTitle
,
title
:
item
.
signalTitle
,
time
:
item
.
signalTime
,
time
:
item
.
signalTime
,
status
:
item
.
signalLevel
,
status
:
item
.
signalLevel
,
id
:
item
.
signalId
id
:
item
.
signalId
,
sanId
:
item
.
sanId
}));
}));
}
}
}
catch
(
err
)
{
}
catch
(
err
)
{
...
...
src/views/exportControl/v2.0EntityList/components/sanctionsOverview/components/introductionPage/index.vue
浏览文件 @
486b8d7c
...
@@ -104,7 +104,7 @@
...
@@ -104,7 +104,7 @@
<
/div
>
<
/div
>
<
/div
>
<
/div
>
<
div
class
=
"right-main"
>
<
div
class
=
"right-main"
>
<
div
class
=
"right-main-title"
>
<
div
class
=
"right-main-title"
@
click
=
"handleClickOrg(publishInfo)"
>
<
img
:
src
=
"publishInfo.imageUrl"
alt
=
""
/>
<
img
:
src
=
"publishInfo.imageUrl"
alt
=
""
/>
<
div
>
<
div
>
<
div
class
=
"title-text"
>
{{
publishInfo
.
orgNameZh
}}
><
/div
>
<
div
class
=
"title-text"
>
{{
publishInfo
.
orgNameZh
}}
><
/div
>
...
@@ -170,10 +170,11 @@ import icon02 from "../../assets/icon02.png";
...
@@ -170,10 +170,11 @@ import icon02 from "../../assets/icon02.png";
import
{
ArrowDown
}
from
"@element-plus/icons-vue"
;
import
{
ArrowDown
}
from
"@element-plus/icons-vue"
;
import
{
getEntityInfo
,
getPublishInfo
,
getPublishOrgInfo
,
getEntityUpdateInfo
}
from
"@/api/exportControlV2.0.js"
;
import
{
getEntityInfo
,
getPublishInfo
,
getPublishOrgInfo
,
getEntityUpdateInfo
}
from
"@/api/exportControlV2.0.js"
;
// 跳转到详情页
// 处理点击发布机构的方法
const
handleClick
=
item
=>
{
const
handleClickOrg
=
item
=>
{
// console.log("点击了发布机构:", item);
const
route
=
router
.
resolve
({
const
route
=
router
.
resolve
({
path
:
"/
exportControl/singleSanc
tion"
,
path
:
"/
institu
tion"
,
query
:
{
query
:
{
id
:
item
.
id
id
:
item
.
id
}
}
...
@@ -194,6 +195,18 @@ const handlePerClick = item => {
...
@@ -194,6 +195,18 @@ const handlePerClick = item => {
window
.
open
(
route
.
href
,
"_blank"
);
window
.
open
(
route
.
href
,
"_blank"
);
}
;
}
;
// 处理点击实体名称的方法
const
handleClick
=
item
=>
{
// console.log("点击了实体名称:", item);
const
route
=
router
.
resolve
({
path
:
"/exportControl/singleSanction"
,
query
:
{
id
:
item
.
id
}
}
);
window
.
open
(
route
.
href
,
"_blank"
);
}
;
const
selectedDomain
=
ref
(
0
);
const
selectedDomain
=
ref
(
0
);
const
onlyChina
=
ref
(
false
);
const
onlyChina
=
ref
(
false
);
const
domainOptions
=
[
const
domainOptions
=
[
...
@@ -560,6 +573,7 @@ onMounted(() => {
...
@@ -560,6 +573,7 @@ onMounted(() => {
.
right
-
main
{
.
right
-
main
{
padding
:
7
px
24
px
0
px
23
px
;
padding
:
7
px
24
px
0
px
23
px
;
.
right
-
main
-
title
{
.
right
-
main
-
title
{
cursor
:
pointer
;
width
:
473
px
;
width
:
473
px
;
height
:
auto
;
height
:
auto
;
border
-
radius
:
4
px
;
border
-
radius
:
4
px
;
...
...
src/views/exportControl/v2.0EntityList/components/sanctionsOverview/components/listPage/index.vue
浏览文件 @
486b8d7c
...
@@ -66,7 +66,7 @@
...
@@ -66,7 +66,7 @@
>
>
<el-table-column
label=
"实体名称"
min-width=
"200"
>
<el-table-column
label=
"实体名称"
min-width=
"200"
>
<template
#
default=
"
{ row }">
<template
#
default=
"
{ row }">
<div
class=
"entity-name-cell"
>
<div
class=
"entity-name-cell"
@
click=
"handleCompClick(row)"
>
<el-image
<el-image
v-if=
"row.img"
v-if=
"row.img"
class=
"avatar"
class=
"avatar"
...
@@ -138,12 +138,27 @@
...
@@ -138,12 +138,27 @@
<
script
setup
>
<
script
setup
>
import
{
ref
,
computed
,
onMounted
,
watch
}
from
"vue"
;
import
{
ref
,
computed
,
onMounted
,
watch
}
from
"vue"
;
import
{
useRouter
}
from
"vue-router"
;
import
{
Search
}
from
"@element-plus/icons-vue"
;
import
{
Search
}
from
"@element-plus/icons-vue"
;
import
defaultIcon
from
"../../../../../assets/icons/default-avatar.png"
;
import
defaultIcon
from
"../../../../../assets/icons/default-avatar.png"
;
import
RuleSubsidiaryDialog
from
"./RuleSubsidiaryDialog.vue"
;
import
RuleSubsidiaryDialog
from
"./RuleSubsidiaryDialog.vue"
;
import
{
getExportControlList
,
get50PercentEntityCount
}
from
"@/api/exportControlV2.0.js"
import
{
getExportControlList
,
get50PercentEntityCount
}
from
"@/api/exportControlV2.0.js"
import
CommonPrompt
from
'@/views/exportControl/commonPrompt/index.vue'
import
CommonPrompt
from
'@/views/exportControl/commonPrompt/index.vue'
const
router
=
useRouter
();
// 跳转公司详情页
const
handleCompClick
=
item
=>
{
console
.
log
(
"item"
,
item
);
const
route
=
router
.
resolve
({
path
:
"/companyPages"
,
query
:
{
id
:
item
.
id
}
});
window
.
open
(
route
.
href
,
"_blank"
);
};
const
searchKeyword
=
ref
(
""
);
const
searchKeyword
=
ref
(
""
);
const
onlyChina
=
ref
(
false
);
const
onlyChina
=
ref
(
false
);
const
sanctionTime
=
ref
(
""
);
const
sanctionTime
=
ref
(
""
);
...
...
src/views/exportControl/v2.0SingleSanction/components/sanctionsOverview/index.vue
浏览文件 @
486b8d7c
...
@@ -16,7 +16,7 @@
...
@@ -16,7 +16,7 @@
<div
class=
"label"
>
发布机构:
</div>
<div
class=
"label"
>
发布机构:
</div>
<div
class=
"value link"
>
<div
class=
"value link"
>
<img
:src=
"title"
alt=
""
class=
"icon"
>
<img
:src=
"title"
alt=
""
class=
"icon"
>
<span>
{{
formattedData
.
postOrgName
}}
>
</span>
<span
@
click=
"handleClickDp"
>
{{
formattedData
.
postOrgName
}}
>
</span>
</div>
</div>
</div>
</div>
<div
class=
"info-row"
>
<div
class=
"info-row"
>
...
@@ -165,7 +165,7 @@
...
@@ -165,7 +165,7 @@
<div
class=
"name-cell"
>
<div
class=
"name-cell"
>
<div
class=
"dot"
></div>
<div
class=
"dot"
></div>
<img
:src=
"defaultTitle"
class=
"company-icon"
/>
<img
:src=
"defaultTitle"
class=
"company-icon"
/>
<span
class=
"company-name"
>
{{
scope
.
row
.
name
}}
</span>
<span
class=
"company-name"
@
click=
"handleCompClick(scope.row)"
>
{{
scope
.
row
.
name
}}
</span>
</div>
</div>
</
template
>
</
template
>
</el-table-column>
</el-table-column>
...
@@ -185,7 +185,7 @@
...
@@ -185,7 +185,7 @@
<el-table-column
prop=
"revenue"
label=
"营收(亿元)"
width=
"110"
align=
"center"
/>
<el-table-column
prop=
"revenue"
label=
"营收(亿元)"
width=
"110"
align=
"center"
/>
<el-table-column
label=
"50%规则子企业"
width=
"180"
align=
"center"
>
<el-table-column
label=
"50%规则子企业"
width=
"180"
align=
"center"
>
<
template
#
default=
"scope"
>
<
template
#
default=
"scope"
>
<span
v-if=
"scope.row.subsidiaryCount"
class=
"subsidiary-link"
>
<span
v-if=
"scope.row.subsidiaryCount"
class=
"subsidiary-link"
@
click=
"handleSubsidiaryClick(scope.row)"
>
{{
scope
.
row
.
subsidiaryText
}}
<span
class=
"blue-text"
>
{{
scope
.
row
.
subsidiaryCount
}}
家 >
</span>
{{
scope
.
row
.
subsidiaryText
}}
<span
class=
"blue-text"
>
{{
scope
.
row
.
subsidiaryCount
}}
家 >
</span>
</span>
</span>
<span
v-else
>
--
</span>
<span
v-else
>
--
</span>
...
@@ -200,6 +200,13 @@
...
@@ -200,6 +200,13 @@
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 50%规则子企业弹框 -->
<RuleSubsidiaryDialog
v-model=
"subsidiaryDialogVisible"
:company-name=
"currentSubsidiaryCompanyName"
:total-count=
"currentSubsidiaryCount"
:data-list=
"currentSubsidiaryList"
/>
</div>
</div>
</template>
</template>
...
@@ -212,6 +219,44 @@ import title from "../../assets/title.png"
...
@@ -212,6 +219,44 @@ import title from "../../assets/title.png"
import
defaultTitle
from
"../../assets/default-icon1.png"
import
defaultTitle
from
"../../assets/default-icon1.png"
import
flag
from
"../../assets/default-icon2.png"
import
flag
from
"../../assets/default-icon2.png"
import
{
getSingleSanctionEntityCountry
,
getSingleSanctionBackground
,
getSingleSanctionOverviewList
}
from
"@/api/exportControlV2.0"
;
import
{
getSingleSanctionEntityCountry
,
getSingleSanctionBackground
,
getSingleSanctionOverviewList
}
from
"@/api/exportControlV2.0"
;
import
RuleSubsidiaryDialog
from
"../../../v2.0EntityList/components/sanctionsOverview/components/listPage/RuleSubsidiaryDialog.vue"
;
// 跳转公司详情页
const
handleCompClick
=
item
=>
{
console
.
log
(
"item"
,
item
);
const
route
=
router
.
resolve
({
path
:
"/companyPages"
,
query
:
{
id
:
item
.
id
}
});
window
.
open
(
route
.
href
,
"_blank"
);
};
// 跳转发布机构详情页
const
handleClickDp
=
()
=>
{
// console.log("点击了发布机构:", props.data);
const
route
=
router
.
resolve
({
path
:
"/institution"
,
query
:
{
id
:
props
.
data
.
postOrgId
}
});
window
.
open
(
route
.
href
,
"_blank"
);
};
// 50%规则子企业弹框逻辑
const
subsidiaryDialogVisible
=
ref
(
false
);
const
currentSubsidiaryCompanyName
=
ref
(
""
);
const
currentSubsidiaryCount
=
ref
(
0
);
const
currentSubsidiaryList
=
ref
([]);
const
handleSubsidiaryClick
=
(
row
)
=>
{
currentSubsidiaryCompanyName
.
value
=
row
.
name
;
currentSubsidiaryCount
.
value
=
row
.
subsidiaryCount
;
currentSubsidiaryList
.
value
=
row
.
ruleOrgList
||
[];
subsidiaryDialogVisible
.
value
=
true
;
};
// 单次制裁-制裁概况-制裁清单
// 单次制裁-制裁概况-制裁清单
const
sanctionList
=
ref
([])
const
sanctionList
=
ref
([])
...
@@ -240,6 +285,7 @@ const getSanctionOverviewList = async () => {
...
@@ -240,6 +285,7 @@ const getSanctionOverviewList = async () => {
sanctionList
.
value
=
list
.
map
(
item
=>
({
sanctionList
.
value
=
list
.
map
(
item
=>
({
reason
:
item
.
sanReason
,
reason
:
item
.
sanReason
,
entities
:
(
item
.
orgList
||
[]).
map
(
org
=>
({
entities
:
(
item
.
orgList
||
[]).
map
(
org
=>
({
...
org
,
name
:
org
.
entityNameZh
||
org
.
entityName
,
name
:
org
.
entityNameZh
||
org
.
entityName
,
fields
:
org
.
techDomains
||
[],
fields
:
org
.
techDomains
||
[],
location
:
"--"
,
// 接口暂无数据
location
:
"--"
,
// 接口暂无数据
...
...
src/views/exportControl/v2.0SingleSanction/index.vue
浏览文件 @
486b8d7c
...
@@ -28,7 +28,7 @@
...
@@ -28,7 +28,7 @@
<span>
{{
item
.
title
}}
</span>
<span>
{{
item
.
title
}}
</span>
<div
class=
"active-line"
v-if=
"activeIndex === index"
></div>
<div
class=
"active-line"
v-if=
"activeIndex === index"
></div>
</div>
</div>
<div
class=
"original-text-btn"
>
<div
class=
"original-text-btn"
@
click=
"handleClickOriginalText"
>
<img
:src=
"icon1"
alt=
""
>
<img
:src=
"icon1"
alt=
""
>
<span>
实体清单原文
</span>
<span>
实体清单原文
</span>
</div>
</div>
...
@@ -67,6 +67,12 @@ import icon3Active from "../assets/icons/icon3_active.png";
...
@@ -67,6 +67,12 @@ import icon3Active from "../assets/icons/icon3_active.png";
import
{
getSingleSanctionOverview
}
from
"@/api/exportControlV2.0.js"
import
{
getSingleSanctionOverview
}
from
"@/api/exportControlV2.0.js"
// 处理点击实体清单原文按钮
const
handleClickOriginalText
=
()
=>
{
// 打开新标签页
window
.
open
(
`/exportControl/origin?id=
${
sanRecordId
.
value
}
`
,
"_blank"
)
}
// 获取URL参数
// 获取URL参数
const
sanRecordId
=
ref
(
""
)
const
sanRecordId
=
ref
(
""
)
const
getUrlParams
=
()
=>
{
const
getUrlParams
=
()
=>
{
...
...
src/views/exportControl/v2.0SingleSanction/originPage/index.vue
0 → 100644
浏览文件 @
486b8d7c
<
template
>
<div
class=
"entity-list"
>
<div
class=
"header"
>
<div
class=
"header-title"
>
<img
:src=
"headerTitle.img"
alt=
""
>
<div>
<div
class=
"title"
>
{{
headerTitle
.
title
}}
<!--
<span>
{{
headerTitle
.
titleEn
}}
</span>
-->
</div>
<div
class=
"department"
>
{{
headerTitle
.
department
}}
</div>
</div>
<!--
<div
class=
"btn"
>
<img
:src=
"icon01"
alt=
""
>
切换
</div>
-->
</div>
</div>
<div
class=
"main"
>
<div
class=
"pdf-container"
>
<iframe
v-if=
"headerTitle.srcUrl"
:src=
"headerTitle.srcUrl"
width=
"100%"
height=
"100%"
frameborder=
"0"
></iframe>
<div
v-else
class=
"no-pdf"
>
暂无原文
</div>
</div>
<div
class=
"pdf-container"
>
<iframe
v-if=
"headerTitle.transUrl"
:src=
"headerTitle.transUrl"
width=
"100%"
height=
"100%"
frameborder=
"0"
></iframe>
<div
v-else
class=
"no-pdf"
>
暂无译文
</div>
</div>
</div>
</div>
</
template
>
<
script
setup
>
import
{
ref
,
onMounted
}
from
'vue'
import
{
getSingleSanctionOverview
}
from
"@/api/exportControlV2.0.js"
import
title
from
"../assets/title.png"
import
icon01
from
"../assets/icon01.png"
// 单次制裁-制裁概况-基本信息
const
singleSanctionOverview
=
ref
({})
const
getSingleSanctionOverviewData
=
async
()
=>
{
if
(
!
sanRecordId
.
value
)
return
try
{
const
res
=
await
getSingleSanctionOverview
({
sanRecordId
:
sanRecordId
.
value
})
if
(
res
.
code
===
200
)
{
singleSanctionOverview
.
value
=
res
.
data
||
{}
// 格式化日期
let
dateStr
=
""
;
if
(
singleSanctionOverview
.
value
.
postDate
)
{
const
date
=
new
Date
(
singleSanctionOverview
.
value
.
postDate
);
if
(
!
isNaN
(
date
.
getTime
()))
{
dateStr
=
`
${
date
.
getFullYear
()}
年
${
date
.
getMonth
()
+
1
}
月
${
date
.
getDate
()}
日`
;
}
else
{
dateStr
=
singleSanctionOverview
.
value
.
postDate
;
}
}
// 更新头部信息
headerTitle
.
value
=
{
...
headerTitle
.
value
,
title
:
`
${
dateStr
}
《
${
singleSanctionOverview
.
value
.
sanTitleZh
||
singleSanctionOverview
.
value
.
sanTitle
}
》`
,
titleEn
:
singleSanctionOverview
.
value
.
sanTitle
||
""
,
department
:
singleSanctionOverview
.
value
.
fileCode
||
""
,
srcUrl
:
singleSanctionOverview
.
value
.
srcUrl
||
""
,
transUrl
:
singleSanctionOverview
.
value
.
transUrl
||
""
}
}
}
catch
(
error
)
{
console
.
error
(
"获取制裁概况失败:"
,
error
)
}
}
const
headerTitle
=
ref
({
img
:
title
,
})
// 获取URL参数
const
sanRecordId
=
ref
(
""
)
const
getUrlParams
=
()
=>
{
const
urlParams
=
new
URLSearchParams
(
window
.
location
.
search
);
sanRecordId
.
value
=
urlParams
.
get
(
"id"
)
||
""
}
onMounted
(()
=>
{
getUrlParams
()
getSingleSanctionOverviewData
()
})
</
script
>
<
style
scoped
lang=
"scss"
>
*
{
margin
:
0
;
padding
:
0
;
}
.entity-list
{
width
:
100%
;
height
:
100%
;
.header
{
width
:
100%
;
height
:
148px
;
background-color
:
#fff
;
padding-top
:
16px
;
.header-title
{
width
:
1601px
;
height
:
72px
;
background-color
:
rgba
(
246
,
250
,
255
,
1
);
margin
:
0
auto
;
border-radius
:
10px
;
border
:
2px
solid
rgba
(
174
,
214
,
255
,
1
);
display
:
flex
;
align-items
:
center
;
margin-bottom
:
12px
;
position
:
relative
;
img
{
width
:
54px
;
height
:
54px
;
margin-left
:
15px
;
margin-right
:
11px
;
}
.title
{
font-size
:
20px
;
font-weight
:
700
;
font-family
:
"Microsoft YaHei"
;
line-height
:
26px
;
color
:
rgb
(
59
,
65
,
75
);
span
{
font-size
:
16px
;
font-weight
:
400
;
font-family
:
"Microsoft YaHei"
;
line-height
:
24px
;
color
:
rgb
(
95
,
101
,
108
);
margin-left
:
11px
;
}
}
.department
{
font-size
:
16px
;
font-weight
:
400
;
font-family
:
"Microsoft YaHei"
;
line-height
:
24px
;
color
:
rgb
(
95
,
101
,
108
);
}
.btn
{
cursor
:
pointer
;
display
:
flex
;
align-items
:
center
;
position
:
absolute
;
right
:
16px
;
top
:
25px
;
font-size
:
18px
;
font-weight
:
700
;
font-family
:
"Microsoft YaHei"
;
line-height
:
24px
;
color
:
rgb
(
5
,
95
,
194
);
img
{
width
:
20px
;
height
:
20px
;
margin-right
:
7px
;
}
}
}
.header-nav
{
width
:
1601px
;
margin
:
0
auto
;
height
:
48px
;
display
:
flex
;
align-items
:
center
;
.nav-item
{
display
:
flex
;
align-items
:
center
;
height
:
100%
;
margin-right
:
32px
;
cursor
:
pointer
;
position
:
relative
;
font-size
:
18px
;
font-weight
:
400
;
font-family
:
"Microsoft YaHei"
;
color
:
rgb
(
59
,
65
,
75
);
&
:last-child
{
margin-right
:
0
;
}
img
{
width
:
16px
;
height
:
16px
;
margin-right
:
4px
;
}
&
.active
{
color
:
rgb
(
5
,
95
,
194
);
font-weight
:
700
;
}
.active-line
{
position
:
absolute
;
bottom
:
0
;
left
:
0
;
width
:
100%
;
height
:
3px
;
background-color
:
#055fc2
;
border-radius
:
1
.5px
;
}
}
.original-text-btn
{
margin-left
:
auto
;
width
:
152px
;
height
:
36px
;
background
:
#FFFFFF
;
border-radius
:
4px
;
border
:
1px
solid
rgba
(
230
,
231
,
232
,
1
);
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
cursor
:
pointer
;
img
{
width
:
16px
;
height
:
16px
;
margin-right
:
8px
;
}
span
{
font-size
:
16px
;
font-weight
:
400
;
color
:
rgb
(
95
,
101
,
108
);
font-family
:
"Microsoft YaHei"
;
line-height
:
24px
;
}
}
}
}
.main
{
width
:
1601px
;
height
:
calc
(
100%
-
148px
);
background-color
:
#F7F8F9
;
margin
:
0
auto
;
display
:
flex
;
justify-content
:
space-between
;
padding-top
:
20px
;
box-sizing
:
border-box
;
.pdf-container
{
width
:
790px
;
height
:
calc
(
100%
-
20px
);
background-color
:
#fff
;
// border: 1px solid rgba(174, 214, 255, 1);
border-radius
:
4px
;
overflow
:
hidden
;
.no-pdf
{
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
height
:
100%
;
color
:
#909399
;
font-size
:
16px
;
background-color
:
#fff
;
}
}
}
}
</
style
>
\ No newline at end of file
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论