Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
R
risk-monitor
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
蔡建
risk-monitor
Commits
42c74a3f
提交
42c74a3f
authored
3月 12, 2026
作者:
张烨
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
科技政令-深度挖掘增加冲突关系弹出框
上级
9b312ae7
显示空白字符变更
内嵌
并排
正在显示
10 个修改的文件
包含
258 行增加
和
130 行删除
+258
-130
index.vue
src/views/decree/decreeHome/index.vue
+7
-5
ai.png
src/views/decree/decreeLayout/assets/icons/ai.png
+0
-0
right.png
src/views/decree/decreeLayout/assets/icons/right.png
+0
-0
index.vue
src/views/decree/decreeLayout/deepdig/index.vue
+182
-93
ChartChain.vue
src/views/decree/decreeLayout/influence/ChartChain.vue
+2
-2
index.vue
src/views/decree/decreeLayout/overview/background/index.vue
+18
-14
index.vue
src/views/decree/decreeLayout/overview/index.vue
+0
-2
index.vue
src/views/decree/decreeLayout/overview/measures/index.vue
+10
-12
index.vue
src/views/decree/decreeOriginal/index.vue
+38
-1
vite.config.js
vite.config.js
+1
-1
没有找到文件。
src/views/decree/decreeHome/index.vue
浏览文件 @
42c74a3f
...
@@ -364,7 +364,7 @@
...
@@ -364,7 +364,7 @@
</div>
</div>
</div>
</div>
</div>
</div>
<div
class=
"select-box"
>
<
!-- <
div class="select-box">
<div class="select-box-header">
<div class="select-box-header">
<div class="icon"></div>
<div class="icon"></div>
<div class="title">{{ "涉及领域" }}</div>
<div class="title">{{ "涉及领域" }}</div>
...
@@ -378,7 +378,7 @@
...
@@ -378,7 +378,7 @@
</el-checkbox>
</el-checkbox>
</div>
</div>
</div>
</div>
</div>
</div>
-->
</div>
</div>
<div
class=
"right"
>
<div
class=
"right"
>
<div
class=
"content-header"
>
<div
class=
"content-header"
>
...
@@ -521,6 +521,7 @@ const pageSize = ref(10);
...
@@ -521,6 +521,7 @@ const pageSize = ref(10);
// 处理页码改变事件
// 处理页码改变事件
const
handleCurrentChange
=
page
=>
{
const
handleCurrentChange
=
page
=>
{
currentPage
.
value
=
page
;
currentPage
.
value
=
page
;
handleToPosi
(
'position4'
)
handleGetDecreeOrderList
();
handleGetDecreeOrderList
();
};
};
...
@@ -1235,7 +1236,8 @@ const handleGetDecreeOrderList = async () => {
...
@@ -1235,7 +1236,8 @@ const handleGetDecreeOrderList = async () => {
watch
([
activePubTime
,
activeAreaList
,
checkedGovIns
,
isSort
,
isChina
,
searchType
],
val
=>
{
watch
([
activePubTime
,
activeAreaList
,
checkedGovIns
,
isSort
,
isChina
,
searchType
],
val
=>
{
// 切换页码到第一页
// 切换页码到第一页
handleCurrentChange
(
1
);
currentPage
.
value
=
1
;
handleGetDecreeOrderList
();
});
});
// 切换当前政令
// 切换当前政令
...
@@ -3182,11 +3184,11 @@ onMounted(async () => {
...
@@ -3182,11 +3184,11 @@ onMounted(async () => {
border-radius
:
10px
;
border-radius
:
10px
;
.select-box
{
.select-box
{
margin-top
:
21
px
;
margin-top
:
16
px
;
.select-box-header
{
.select-box-header
{
display
:
flex
;
display
:
flex
;
gap
:
1
7
px
;
gap
:
1
6
px
;
.icon
{
.icon
{
margin-top
:
4px
;
margin-top
:
4px
;
...
...
src/views/decree/decreeLayout/
influence/assets/image
s/ai.png
→
src/views/decree/decreeLayout/
assets/icon
s/ai.png
浏览文件 @
42c74a3f
File moved
src/views/decree/decreeLayout/
influence/assets/image
s/right.png
→
src/views/decree/decreeLayout/
assets/icon
s/right.png
浏览文件 @
42c74a3f
File moved
src/views/decree/decreeLayout/deepdig/index.vue
浏览文件 @
42c74a3f
...
@@ -5,12 +5,12 @@
...
@@ -5,12 +5,12 @@
<div
class=
"box1-main"
>
<div
class=
"box1-main"
>
<el-empty
v-if=
"siderList.length===0"
style=
"padding-top: 30%"
description=
"暂无数据"
:image-size=
"100"
/>
<el-empty
v-if=
"siderList.length===0"
style=
"padding-top: 30%"
description=
"暂无数据"
:image-size=
"100"
/>
<el-scrollbar
height=
"100%"
always
>
<el-scrollbar
height=
"100%"
always
>
<div
class=
"left-item"
:class=
"
{ 'item-active': false }" v-for="(item, index) in siderList" :key="index" @click="handleClickSider(i
ndex
)">
<div
class=
"left-item"
:class=
"
{ 'item-active': false }" v-for="(item, index) in siderList" :key="index" @click="handleClickSider(i
tem
)">
<div
class=
"item-head"
>
<div
class=
"item-head"
>
<div
class=
"itme-name one-line-ellipsis"
>
{{
item
.
proposeOrgName
}}
</div>
<div
class=
"itme-name one-line-ellipsis"
>
{{
item
.
label
}}
</div>
<div
class=
"item-tag"
>
政令
</div>
<div
class=
"item-tag"
>
政令
</div>
</div>
</div>
<div
class=
"itme-time one-line-ellipsis"
>
{{
item
.
postDat
e
}}
·
{{
item
.
name
}}
</div>
<div
class=
"itme-time one-line-ellipsis"
>
{{
item
.
tim
e
}}
·
{{
item
.
name
}}
</div>
</div>
</div>
</el-scrollbar>
</el-scrollbar>
</div>
</div>
...
@@ -24,14 +24,23 @@
...
@@ -24,14 +24,23 @@
</AnalysisBox>
</AnalysisBox>
</div>
</div>
<el-dialog
v-model=
"dialogVisible"
width=
"1
280px"
class=
"viewpoint-dialog"
top=
"8vh
"
>
<el-dialog
v-model=
"dialogVisible"
width=
"1
000px"
class=
"viewpoint-dialog
"
>
<template
#
header
>
<template
#
header
>
<div
class=
"viewpoint-header"
>
<div
class=
"viewpoint-header"
>
<div
class=
"viewpoint-title"
>
冲突关系
</div>
<div
class=
"viewpoint-title"
>
冲突关系
</div>
</div>
</div>
</
template
>
</
template
>
<div
class=
"viewpoint-body"
>
<div
class=
"viewpoint-body"
>
<div
class=
"graph-tag"
>
<div
class=
"icon1"
></div>
<div
class=
"title"
>
{{ `${mainInfo.time}-${mainInfo.label} ${nodeInfo.relation} ${nodeInfo.time}-${nodeInfo.label}, 属于${nodeInfo.relation}关系` }}
</div>
<div
class=
"icon2Wrap"
>
<div
class=
"icon2"
></div>
</div>
</div>
<div
ref=
"graphContainer"
class=
"graph-container"
></div>
</div>
</div>
</el-dialog>
</el-dialog>
</div>
</div>
...
@@ -53,44 +62,41 @@ const route = useRoute();
...
@@ -53,44 +62,41 @@ const route = useRoute();
const
dialogVisible
=
ref
(
false
);
const
dialogVisible
=
ref
(
false
);
// 基本信息
// 基本信息
const
basicInfo
=
ref
({
const
mainInfo
=
ref
({});
id
:
''
,
const
nodeInfo
=
ref
({});
proposeOrgName
:
''
,
isCenter
:
true
});
const
onDecreeSummaryData
=
async
()
=>
{
const
onDecreeSummaryData
=
async
()
=>
{
// basicInfo.value = {proposeOrgName: "是事儿也就来一回儿一会儿就完事儿", id: route.query.id, isCenter: true}
try
{
try
{
const
res
=
await
getDecreeSummary
({
id
:
route
.
query
.
id
});
const
res
=
await
getDecreeSummary
({
id
:
route
.
query
.
id
});
console
.
log
(
"基本信息"
,
res
);
console
.
log
(
"基本信息"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
if
(
res
.
code
===
200
&&
res
.
data
)
{
basicInfo
.
value
.
proposeOrgName
=
res
.
data
.
name
;
mainInfo
.
value
.
label
=
res
.
data
.
name
;
basicInfo
.
value
.
id
=
route
.
query
.
id
;
mainInfo
.
value
.
time
=
res
.
data
.
postDate
;
mainInfo
.
value
.
id
=
route
.
query
.
id
;
mainInfo
.
value
.
isCenter
=
true
}
}
}
catch
(
error
)
{
}
catch
(
error
)
{
basic
Info
.
value
=
{};
main
Info
.
value
=
{};
console
.
log
(
"获取基本信息数据失败:"
,
error
);
console
.
log
(
"获取基本信息数据失败:"
,
error
);
}
}
};
};
// 相关政令
// 相关政令
const
siderList
=
ref
([]);
const
siderList
=
ref
([]);
const
siderActive
=
ref
(
0
);
const
handleClickSider
=
async
(
item
)
=>
{
const
handleClickSider
=
async
index
=>
{
siderActive
.
value
=
index
;
dialogVisible
.
value
=
true
;
dialogVisible
.
value
=
true
;
nodeInfo
.
value
=
item
setTimeout
(
onRelationChart
,
300
)
};
};
const
handleGetRelateOrder
=
async
()
=>
{
const
handleGetRelateOrder
=
async
()
=>
{
// siderList.value = [
// {id: 1, proposeOrgName: '天空飘来五个字那都不是事儿天空飘来五个字那都不是事儿1', postDate: '2022-01-01', name: 'name'},
// {id: 2, proposeOrgName: '天空飘来五个字那都不是事儿天空飘来五个字那都不是事儿2', postDate: '2022-01-02', name: 'name'},
// {id: 3, proposeOrgName: '天空飘来五个字那都不是事儿天空飘来五个字那都不是事儿3', postDate: '2022-01-03', name: 'name'},
// ]
try
{
try
{
const
res
=
await
getDecreeRelatedOrder
({
id
:
route
.
query
.
id
});
const
res
=
await
getDecreeRelatedOrder
({
id
:
route
.
query
.
id
});
console
.
log
(
"相关政令"
,
res
);
console
.
log
(
"相关政令"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
?.
length
)
{
if
(
res
.
code
===
200
&&
res
.
data
?.
length
)
{
siderList
.
value
=
res
.
data
siderList
.
value
=
res
.
data
siderList
.
value
.
forEach
(
item
=>
{
item
.
label
=
item
.
proposeOrgName
;
item
.
time
=
item
.
postDate
;
})
}
else
{
}
else
{
siderList
.
value
=
[]
siderList
.
value
=
[]
}
}
...
@@ -103,19 +109,22 @@ const handleGetRelateOrder = async () => {
...
@@ -103,19 +109,22 @@ const handleGetRelateOrder = async () => {
// 政令关系挖掘
// 政令关系挖掘
const
containerRef
=
ref
();
const
containerRef
=
ref
();
let
graphInstance
=
null
;
let
graphInstance
=
null
;
const
onFormatNode
=
(
item
)
=>
{
// 文本插入换行符
let
isCenter
=
item
.
isCenter
||
false
const
onWordWrap
=
(
word
,
num
)
=>
{
// 判断文字每达到8个字插入换行符
const
list
=
word
.
split
(
''
);
const
text
=
item
.
proposeOrgName
.
split
(
''
);
let
label
=
""
;
let
label
=
""
;
for
(
let
i
=
0
;
i
<
tex
t
.
length
;
i
++
)
{
for
(
let
i
=
0
;
i
<
lis
t
.
length
;
i
++
)
{
if
(
i
%
8
===
0
&&
i
!==
0
)
{
if
(
i
%
num
===
0
&&
i
!==
0
)
{
label
+=
"
\
n"
;
label
+=
"
\
n"
;
}
}
label
+=
tex
t
[
i
];
label
+=
lis
t
[
i
];
}
}
return
label
;
}
const
onFormatNode
=
(
item
)
=>
{
let
isCenter
=
item
.
isCenter
||
false
return
{
return
{
id
:
item
.
id
+
''
,
label
,
isCenter
,
size
:
40
,
id
:
item
.
id
+
''
,
label
:
onWordWrap
(
item
.
label
,
15
)
,
isCenter
,
size
:
40
,
img
:
isCenter
?
icon1628
:
icon1629
,
img
:
isCenter
?
icon1628
:
icon1629
,
clipCfg
:
{
show
:
true
,
type
:
"circle"
,
r
:
isCenter
?
30
:
20
},
style
:
{
cursor
:
"pointer"
},
clipCfg
:
{
show
:
true
,
type
:
"circle"
,
r
:
isCenter
?
30
:
20
},
style
:
{
cursor
:
"pointer"
},
labelCfg
:
{
labelCfg
:
{
...
@@ -161,7 +170,8 @@ const onFormatEdge = (item, index) => {
...
@@ -161,7 +170,8 @@ const onFormatEdge = (item, index) => {
const
initChart
=
()
=>
{
const
initChart
=
()
=>
{
let
edgeList
=
siderList
.
value
.
map
(
onFormatEdge
)
let
edgeList
=
siderList
.
value
.
map
(
onFormatEdge
)
let
nodeList
=
siderList
.
value
.
map
(
onFormatNode
)
let
nodeList
=
siderList
.
value
.
map
(
onFormatNode
)
nodeList
.
unshift
(
onFormatNode
(
basicInfo
.
value
))
nodeList
.
unshift
(
onFormatNode
(
mainInfo
.
value
))
console
.
log
(
nodeList
)
const
width
=
containerRef
.
value
.
offsetWidth
||
800
const
width
=
containerRef
.
value
.
offsetWidth
||
800
const
height
=
containerRef
.
value
.
offsetHeight
||
600
const
height
=
containerRef
.
value
.
offsetHeight
||
600
...
@@ -184,9 +194,6 @@ const initChart = () => {
...
@@ -184,9 +194,6 @@ const initChart = () => {
centerNode
.
fy
=
centerY
centerNode
.
fy
=
centerY
}
}
console
.
log
(
"节点列表"
,
nodeList
)
console
.
log
(
"边列表"
,
edgeList
)
graphInstance
=
new
G6
.
Graph
({
graphInstance
=
new
G6
.
Graph
({
container
:
containerRef
.
value
,
container
:
containerRef
.
value
,
width
,
width
,
...
@@ -235,21 +242,115 @@ const initChart = () => {
...
@@ -235,21 +242,115 @@ const initChart = () => {
// 节点点击处理
// 节点点击处理
graphInstance
.
on
(
'node:click'
,
(
evt
)
=>
{
graphInstance
.
on
(
'node:click'
,
(
evt
)
=>
{
console
.
log
(
'节点详情:'
,
evt
.
item
);
console
.
log
(
'节点详情:'
,
evt
.
item
.
_cfg
.
model
.
id
);
let
node
=
siderList
.
value
.
find
(
item
=>
item
.
id
==
evt
.
item
.
_cfg
.
model
.
id
)
handleClickSider
(
node
)
});
});
graphInstance
.
data
({
nodes
:
nodeList
,
edges
:
edgeList
})
graphInstance
.
data
({
nodes
:
nodeList
,
edges
:
edgeList
})
graphInstance
.
render
()
graphInstance
.
render
()
}
}
// 冲突关系
const
graphContainer
=
ref
(
null
);
let
graph
=
null
;
const
onRelationChart
=
()
=>
{
const
container
=
graphContainer
.
value
;
const
nodeWidth
=
180
;
const
width
=
container
.
clientWidth
;
const
height
=
container
.
clientHeight
;
const
centerX
=
width
/
2
const
centerY
=
height
/
2
-
40
const
leftNodeX
=
centerX
-
nodeWidth
;
const
rightNodeX
=
centerX
+
nodeWidth
;
const
data
=
{
nodes
:
[
{
id
:
'node-left'
,
label
:
`
${
mainInfo
.
value
.
time
}
\n
${
onWordWrap
(
mainInfo
.
value
.
label
,
15
)}
`
,
size
:
[
250
,
80
],
x
:
leftNodeX
,
y
:
centerY
,
},
{
id
:
'node-right'
,
label
:
`
${
nodeInfo
.
value
.
time
}
\n
${
onWordWrap
(
nodeInfo
.
value
.
label
,
15
)}
`
,
size
:
[
250
,
80
],
x
:
rightNodeX
,
y
:
centerY
,
},
],
edges
:
[
{
id
:
`edge-1`
,
target
:
'node-right'
,
source
:
'node-left'
,
type
:
"line"
,
label
:
nodeInfo
.
value
.
relation
,
style
:
{
stroke
:
[
""
,
"#B9DCFF"
,
"#87E8DE"
,
"#FFCCC7"
][
1
],
lineWidth
:
1
,
endArrow
:
true
,
},
labelCfg
:
{
autoRotate
:
true
,
style
:
{
fill
:
[
""
,
"#055FC2"
,
"#13A8A8"
,
"#CE4F51"
][
1
],
fontSize
:
14
,
fontFamily
:
'Microsoft YaHei'
,
background
:
{
fill
:
[
""
,
"#E7F3FF"
,
"#E6FFFB"
,
"#FFE0E0"
][
1
],
padding
:
[
6
,
4
,
4
,
4
],
}
}
}
}
]
};
// 创建图实例
if
(
!
graph
)
{
graph
=
new
G6
.
Graph
({
container
:
container
,
width
,
height
,
defaultNode
:
{
type
:
'rect'
,
anchorPoints
:
[[
0
,
0.5
],
[
1
,
0.5
]],
style
:
{
radius
:
4
,
fill
:
'#f6faff'
,
stroke
:
'#B9DCFF'
,
},
labelCfg
:
{
style
:
{
fill
:
"#333333"
,
fontSize
:
15
,
fontWeight
:
"bold"
,
fontFamily
:
"Microsoft YaHei"
,
textAlign
:
"center"
,
}
}
},
layout
:
null
,
modes
:
{
default
:
[]
},
fitView
:
false
,
});
}
// 加载数据并渲染
graph
.
data
(
data
);
graph
.
render
();
}
onMounted
(()
=>
{
onMounted
(()
=>
{
Promise
.
all
([
onDecreeSummaryData
(),
handleGetRelateOrder
()]).
then
(()
=>
{
Promise
.
all
([
onDecreeSummaryData
(),
handleGetRelateOrder
()]).
then
(()
=>
{
if
(
basic
Info
.
value
.
id
&&
siderList
.
value
.
length
)
initChart
()
if
(
main
Info
.
value
.
id
&&
siderList
.
value
.
length
)
initChart
()
})
})
});
});
onBeforeUnmount
(()
=>
{
onBeforeUnmount
(()
=>
{
graphInstance
?.
destroy
()
graphInstance
?.
destroy
()
graph
?.
destroy
()
})
})
</
script
>
</
script
>
...
@@ -351,7 +452,6 @@ onBeforeUnmount(() => {
...
@@ -351,7 +452,6 @@ onBeforeUnmount(() => {
// 修改element-plus弹出框样式
// 修改element-plus弹出框样式
:deep
(
.viewpoint-dialog
)
{
:deep
(
.viewpoint-dialog
)
{
height
:
750px
;
padding
:
0
;
padding
:
0
;
border-radius
:
4px
;
border-radius
:
4px
;
.el-dialog__body
{
.el-dialog__body
{
...
@@ -369,7 +469,6 @@ onBeforeUnmount(() => {
...
@@ -369,7 +469,6 @@ onBeforeUnmount(() => {
right
:
12px
;
right
:
12px
;
}
}
.viewpoint-header
{
.viewpoint-header
{
width
:
761px
;
height
:
48px
;
height
:
48px
;
display
:
flex
;
display
:
flex
;
align-items
:
center
;
align-items
:
center
;
...
@@ -383,70 +482,60 @@ onBeforeUnmount(() => {
...
@@ -383,70 +482,60 @@ onBeforeUnmount(() => {
line-height
:
24px
;
line-height
:
24px
;
}
}
.viewpoint-body
{
.viewpoint-body
{
padding
:
24px
24px
35px
24px
;
padding
:
16px
;
height
:
calc
(
669px
-
48px
);
height
:
560px
;
box-sizing
:
border-box
;
overflow
:
hidden
;
overflow
:
hidden
;
.viewpoint-body-title
{
display
:
flex
;
font-size
:
28px
;
flex-direction
:
column
;
font-weight
:
700
;
.graph-tag
{
font-family
:
"Microsoft YaHei"
;
display
:
flex
;
line-height
:
37px
;
align-items
:
center
;
color
:
rgb
(
59
,
65
,
75
);
padding
:
7px
12px
;
margin-bottom
:
32px
;
border
:
1px
solid
rgba
(
231
,
243
,
255
,
1
);
}
border-radius
:
4px
;
.viewpoint-item
{
background
:
rgba
(
246
,
250
,
255
,
1
);
width
:
713px
;
margin-bottom
:
9px
;
min-height
:
81px
;
display
:
block
;
.icon1
{
margin-bottom
:
12px
;
width
:
19px
;
position
:
relative
;
height
:
20px
;
padding-left
:
48px
;
background-image
:
url("../assets/icons/ai.png")
;
.viewpoint-item-img
{
position
:
absolute
;
top
:
0
;
left
:
-10px
;
width
:
42px
;
height
:
42px
;
}
.viewpoint-item-content
{
width
:
665px
;
min-height
:
81px
;
background-image
:
url("./assets/bg01.png")
;
background-size
:
100%
100%
;
background-size
:
100%
100%
;
position
:
relative
;
flex-shrink
:
0
;
top
:
0
;
left
:
0
;
padding-left
:
23px
;
padding-top
:
12px
;
padding-bottom
:
13px
;
box-sizing
:
border-box
;
.viewpoint-item-name
{
font-size
:
16px
;
font-weight
:
700
;
font-family
:
"Microsoft YaHei"
;
line-height
:
24px
;
color
:
rgb
(
59
,
65
,
75
);
margin-bottom
:
5px
;
}
}
.viewpoint-item-desc
{
.title
{
color
:
rgb
(
5
,
95
,
194
);
font-size
:
16px
;
font-size
:
16px
;
font-weight
:
400
;
font-weight
:
400
;
font-family
:
"Microsoft YaHei"
;
line-height
:
24px
;
line-height
:
24px
;
color
:
rgb
(
59
,
65
,
75
);
margin-left
:
13px
;
flex
:
1
;
}
.icon2Wrap
{
width
:
24px
;
height
:
24px
;
background-color
:
rgba
(
231
,
243
,
255
,
1
);
display
:
flex
;
justify-content
:
center
;
align-items
:
center
;
border-radius
:
12px
;
margin-left
:
20px
;
flex-shrink
:
0
;
.icon2
{
width
:
24px
;
height
:
24px
;
background-image
:
url("../assets/icons/right.png")
;
background-size
:
100%
100%
;
}
}
.viewpoint-item-job
{
position
:
absolute
;
top
:
8px
;
right
:
22px
;
font-size
:
16px
;
font-weight
:
400
;
font-family
:
"Microsoft YaHei"
;
line-height
:
30px
;
color
:
rgb
(
132
,
136
,
142
);
}
}
}
}
.graph-container
{
width
:
100%
;
height
:
20px
;
flex
:
auto
;
}
}
}
}
}
}
...
...
src/views/decree/decreeLayout/influence/ChartChain.vue
浏览文件 @
42c74a3f
...
@@ -328,7 +328,7 @@ onMounted(() => {
...
@@ -328,7 +328,7 @@ onMounted(() => {
.
icon1
{
.
icon1
{
width
:
19
px
;
width
:
19
px
;
height
:
20
px
;
height
:
20
px
;
background
-
image
:
url
(
".
/assets/image
s/ai.png"
);
background
-
image
:
url
(
".
./assets/icon
s/ai.png"
);
background
-
size
:
100
%
100
%
;
background
-
size
:
100
%
100
%
;
flex
-
shrink
:
0
;
flex
-
shrink
:
0
;
}
}
...
@@ -356,7 +356,7 @@ onMounted(() => {
...
@@ -356,7 +356,7 @@ onMounted(() => {
.
icon2
{
.
icon2
{
width
:
24
px
;
width
:
24
px
;
height
:
24
px
;
height
:
24
px
;
background
-
image
:
url
(
".
/assets/image
s/right.png"
);
background
-
image
:
url
(
".
./assets/icon
s/right.png"
);
background
-
size
:
100
%
100
%
;
background
-
size
:
100
%
100
%
;
}
}
}
}
...
...
src/views/decree/decreeLayout/overview/background/index.vue
浏览文件 @
42c74a3f
...
@@ -11,6 +11,7 @@
...
@@ -11,6 +11,7 @@
</div>
</div>
</div>
</div>
</
template
>
</
template
>
<div
class=
"box1-container"
>
<div
class=
"box1-main"
>
<div
class=
"box1-main"
>
<el-empty
v-if=
"backgroundList.length === 0"
style=
"padding-top: 60px;"
description=
"暂无数据"
:image-size=
"100"
/>
<el-empty
v-if=
"backgroundList.length === 0"
style=
"padding-top: 60px;"
description=
"暂无数据"
:image-size=
"100"
/>
<div
class=
"box1-item"
v-for=
"(item, index) in backgroundList"
:key=
"index"
>
<div
class=
"box1-item"
v-for=
"(item, index) in backgroundList"
:key=
"index"
>
...
@@ -27,6 +28,7 @@
...
@@ -27,6 +28,7 @@
<el-pagination
:page-size=
"10"
@
current-change=
"handleCurrentChange"
:current-page=
"currentPage"
background
layout=
"prev, pager, next"
:total=
"backgroundListNum"
/>
<el-pagination
:page-size=
"10"
@
current-change=
"handleCurrentChange"
:current-page=
"currentPage"
background
layout=
"prev, pager, next"
:total=
"backgroundListNum"
/>
</div>
</div>
</div>
</div>
</div>
</AnalysisBox>
</AnalysisBox>
</div>
</div>
<div
class=
"box2"
>
<div
class=
"box2"
>
...
@@ -203,7 +205,6 @@ onMounted(() => {
...
@@ -203,7 +205,6 @@ onMounted(() => {
.introduction-wrap
{
.introduction-wrap
{
display
:
flex
;
display
:
flex
;
width
:
1600px
;
width
:
1600px
;
height
:
901px
;
padding
:
16px
0
;
padding
:
16px
0
;
gap
:
16px
;
gap
:
16px
;
...
@@ -215,8 +216,7 @@ onMounted(() => {
...
@@ -215,8 +216,7 @@ onMounted(() => {
gap
:
16px
;
gap
:
16px
;
.box1
{
.box1
{
height
:
50%
;
height
:
690px
;
flex
:
auto
;
.header-btn-box
{
.header-btn-box
{
display
:
flex
;
display
:
flex
;
...
@@ -245,12 +245,17 @@ onMounted(() => {
...
@@ -245,12 +245,17 @@ onMounted(() => {
}
}
}
}
.box1-container
{
height
:
100%
;
display
:
flex
;
flex-direction
:
column
;
padding
:
16px
;
}
.box1-main
{
.box1-main
{
margin-top
:
16px
;
margin-left
:
22px
;
width
:
1034px
;
width
:
1034px
;
height
:
2
9
0px
;
height
:
20px
;
overflow
:
hidden
;
flex
:
auto
;
overflow-y
:
auto
;
overflow-y
:
auto
;
.box1-item
{
.box1-item
{
...
@@ -300,7 +305,6 @@ onMounted(() => {
...
@@ -300,7 +305,6 @@ onMounted(() => {
}
}
.box1-footer
{
.box1-footer
{
margin
:
20px
22px
;
display
:
flex
;
display
:
flex
;
justify-content
:
space-between
;
justify-content
:
space-between
;
...
@@ -316,14 +320,11 @@ onMounted(() => {
...
@@ -316,14 +320,11 @@ onMounted(() => {
}
}
.box2
{
.box2
{
height
:
50%
;
height
:
500px
;
flex
:
auto
;
.box2-main
{
.box2-main
{
margin-top
:
3px
;
padding
:
16px
20px
;
margin-left
:
31px
;
height
:
100%
;
height
:
330px
;
width
:
1004px
;
overflow
:
hidden
;
overflow
:
hidden
;
overflow-y
:
auto
;
overflow-y
:
auto
;
.custom-collapse
{
.custom-collapse
{
...
@@ -335,6 +336,9 @@ onMounted(() => {
...
@@ -335,6 +336,9 @@ onMounted(() => {
:deep
(
.el-collapse-item__header
)
{
:deep
(
.el-collapse-item__header
)
{
border-bottom
:
1px
solid
rgba
(
234
,
236
,
238
,
1
);
border-bottom
:
1px
solid
rgba
(
234
,
236
,
238
,
1
);
}
}
:deep
(
.el-collapse-item__content
)
{
padding-bottom
:
16px
;
}
.custom-collapse-title
{
.custom-collapse-title
{
position
:
relative
;
position
:
relative
;
.custom-collapse-index
{
.custom-collapse-index
{
...
...
src/views/decree/decreeLayout/overview/index.vue
浏览文件 @
42c74a3f
...
@@ -114,7 +114,6 @@ onMounted(() => {
...
@@ -114,7 +114,6 @@ onMounted(() => {
}
}
.main
{
.main
{
width
:
1760px
;
width
:
1760px
;
height
:
901px
;
}
}
}
}
</
style
>
</
style
>
\ No newline at end of file
src/views/decree/decreeLayout/overview/measures/index.vue
浏览文件 @
42c74a3f
...
@@ -29,19 +29,19 @@
...
@@ -29,19 +29,19 @@
</div>
</div>
<!-- 渲染一级列表 -->
<!-- 渲染一级列表 -->
<div
class=
"numbered-list"
>
<div
class=
"numbered-list"
>
<div
v-for=
"(item, itemIndex) in section.
children
"
:key=
"itemIndex"
class=
"list-item"
>
<div
v-for=
"(item, itemIndex) in section.
slaver
"
:key=
"itemIndex"
class=
"list-item"
>
<div
class=
"list-item-dot"
>
{{
itemIndex
+
1
}}
.
</div>
<div
class=
"list-item-dot"
>
{{
itemIndex
+
1
}}
.
</div>
<div
class=
"list-item-word"
>
{{
item
.
content
}}
</div>
<div
class=
"list-item-word"
>
{{
item
.
content
}}
</div>
<!-- 渲染二级列表 -->
<!-- 渲染二级列表 -->
<div
v-if=
"item.
children
"
class=
"sub-list"
>
<div
v-if=
"item.
slaver
"
class=
"sub-list"
>
<div
v-for=
"(subItem, subIndex) in item.
children
"
:key=
"subIndex"
class=
"sub-item"
>
<div
v-for=
"(subItem, subIndex) in item.
slaver
"
:key=
"subIndex"
class=
"sub-item"
>
<div
class=
"sub-item-dot"
>
(
{{
subIndex
+
1
}}
)
</div>
<div
class=
"sub-item-dot"
>
(
{{
subIndex
+
1
}}
)
</div>
<div
class=
"sub-item-word"
>
{{
subItem
.
content
}}
</div>
<div
class=
"sub-item-word"
>
{{
subItem
.
content
}}
</div>
<!-- 渲染三级列表 -->
<!-- 渲染三级列表 -->
<div
v-if=
"subItem.
children
"
class=
"sub-sub-list"
>
<div
v-if=
"subItem.
slaver
"
class=
"sub-sub-list"
>
<div
v-for=
"(subSubItem, subSubIndex) in subItem.
children
"
:key=
"subSubIndex"
class=
"sub-sub-item"
>
<div
v-for=
"(subSubItem, subSubIndex) in subItem.
slaver
"
:key=
"subSubIndex"
class=
"sub-sub-item"
>
<div
class=
"sub-sub-item-dot"
>
{{
ALPHABET
[
subSubIndex
%
26
]
}}
.
</div>
<div
class=
"sub-sub-item-dot"
>
{{
ALPHABET
[
subSubIndex
%
26
]
}}
.
</div>
<div
class=
"sub-sub-item-word"
>
{{
subSubItem
.
content
}}
</div>
<div
class=
"sub-sub-item-word"
>
{{
subSubItem
.
content
}}
</div>
</div>
</div>
...
@@ -149,16 +149,16 @@ const commandWord = ref("");
...
@@ -149,16 +149,16 @@ const commandWord = ref("");
const
contentList
=
ref
([
const
contentList
=
ref
([
// {
// {
// content: "建立美国人工智能出口计划建立美国人工智能出口计划建立美国人工智能出口计划建立美国人工智能出口计划建立美国人工智能出口计划",
// content: "建立美国人工智能出口计划建立美国人工智能出口计划建立美国人工智能出口计划建立美国人工智能出口计划建立美国人工智能出口计划",
//
children
: [
//
slaver
: [
// {
// {
// content: '在本命令发布之日起 90 天内,商务部长应与国务卿及科学技术政策办公室(OSTP)主任协商,建立并实施美国人工智能出口计划(计划),以支持美国全栈人工智能出口软件包的开发和部署。'
// content: '在本命令发布之日起 90 天内,商务部长应与国务卿及科学技术政策办公室(OSTP)主任协商,建立并实施美国人工智能出口计划(计划),以支持美国全栈人工智能出口软件包的开发和部署。'
// },
// },
// {
// {
// content: '商务部长应公开征集由行业主导的联盟提案,以纳入该计划。公开征集要求每项提案必须:',
// content: '商务部长应公开征集由行业主导的联盟提案,以纳入该计划。公开征集要求每项提案必须:',
//
children
: [
//
slaver
: [
// {
// {
// content: '包含一套全栈人工智能技术包,涵盖:',
// content: '包含一套全栈人工智能技术包,涵盖:',
//
children
: [
//
slaver
: [
// {
// {
// content: 'AI 优化的计算机硬件(如芯片、服务器和加速器)、数据中心存储、云服务和网络,以及这些设备是否以及在多大程度上在美国制造的描述;'
// content: 'AI 优化的计算机硬件(如芯片、服务器和加速器)、数据中心存储、云服务和网络,以及这些设备是否以及在多大程度上在美国制造的描述;'
// },
// },
...
@@ -200,7 +200,7 @@ const contentList = ref([
...
@@ -200,7 +200,7 @@ const contentList = ref([
// },
// },
// {
// {
// content: "动员联邦融资工具",
// content: "动员联邦融资工具",
//
children
: [
//
slaver
: [
// {
// {
// content: '经济外交行动小组(EDAG),于 2024 年 6 月 21 日总统备忘录中成立,由国务卿主持,并与商务部长和美国贸易代表协商,并根据 2019 年《通过外交倡导美国企业法案》(公共法 116-94 J 部分第七章)第 708 条(CABDA)所述,应协调联邦融资工具的动员,以支持优先的人工智能出口方案。'
// content: '经济外交行动小组(EDAG),于 2024 年 6 月 21 日总统备忘录中成立,由国务卿主持,并与商务部长和美国贸易代表协商,并根据 2019 年《通过外交倡导美国企业法案》(公共法 116-94 J 部分第七章)第 708 条(CABDA)所述,应协调联邦融资工具的动员,以支持优先的人工智能出口方案。'
// },
// },
...
@@ -319,7 +319,6 @@ onMounted(() => {
...
@@ -319,7 +319,6 @@ onMounted(() => {
.introduction-wrap
{
.introduction-wrap
{
display
:
flex
;
display
:
flex
;
width
:
1600px
;
width
:
1600px
;
height
:
100%
;
padding
:
16px
0
;
padding
:
16px
0
;
gap
:
16px
;
gap
:
16px
;
...
@@ -723,8 +722,7 @@ onMounted(() => {
...
@@ -723,8 +722,7 @@ onMounted(() => {
}
}
.box4
{
.box4
{
height
:
20px
;
height
:
610px
;
flex
:
auto
;
.left-bottom-main
{
.left-bottom-main
{
padding
:
20px
20px
0
;
padding
:
20px
20px
0
;
...
...
src/views/decree/decreeOriginal/index.vue
浏览文件 @
42c74a3f
...
@@ -60,6 +60,7 @@
...
@@ -60,6 +60,7 @@
<
script
setup
>
<
script
setup
>
import
{
ref
,
onMounted
}
from
"vue"
;
import
{
ref
,
onMounted
}
from
"vue"
;
import
{
useRoute
}
from
"vue-router"
;
import
{
useRoute
}
from
"vue-router"
;
import
{
ElMessage
}
from
"element-plus"
;
import
{
getDecreeSummary
}
from
"@/api/decree/introduction"
;
import
{
getDecreeSummary
}
from
"@/api/decree/introduction"
;
import
{
getDecreeReport
}
from
"@/api/decree/introduction"
;
import
{
getDecreeReport
}
from
"@/api/decree/introduction"
;
...
@@ -72,8 +73,44 @@ const summaryInfo = ref({});
...
@@ -72,8 +73,44 @@ const summaryInfo = ref({});
// 政令原文操作
// 政令原文操作
const
isHighlight
=
ref
(
true
);
const
isHighlight
=
ref
(
true
);
const
isTranslate
=
ref
(
true
);
const
isTranslate
=
ref
(
true
);
const
handleDownload
=
()
=>
{
const
handleDownload
=
async
()
=>
{
if
(
summaryInfo
.
value
?.
url
)
{
try
{
const
response
=
await
fetch
(
summaryInfo
.
value
.
url
,
{
method
:
'GET'
,
headers
:
{
'Content-Type'
:
'application/pdf'
},
});
if
(
!
response
.
ok
)
{
throw
new
Error
(
`HTTP error! status:
${
response
.
status
}
`
);
}
const
blob
=
await
response
.
blob
();
// 创建 Blob URL
const
blobUrl
=
window
.
URL
.
createObjectURL
(
blob
);
// 创建隐藏的下载链接
const
link
=
document
.
createElement
(
'a'
);
link
.
href
=
blobUrl
;
link
.
download
=
`
${
summaryInfo
.
value
.
name
}
.pdf`
;
// 添加到文档中并点击
document
.
body
.
appendChild
(
link
);
link
.
click
();
// 清理
document
.
body
.
removeChild
(
link
);
window
.
URL
.
revokeObjectURL
(
blobUrl
);
}
catch
(
error
)
{
console
.
error
(
'下载失败:'
,
error
);
// 可以在这里提示用户下载失败
alert
(
'PDF 下载失败,请稍后重试'
);
}
}
else
{
ElMessage
.
warning
(
"暂无下载链接!"
);
}
}
}
const
handleFindWord
=
()
=>
{
const
handleFindWord
=
()
=>
{
...
...
vite.config.js
浏览文件 @
42c74a3f
...
@@ -53,7 +53,7 @@ export default defineConfig({
...
@@ -53,7 +53,7 @@ export default defineConfig({
'/api'
:
{
'/api'
:
{
// target: 'http://8.140.26.4:9085/',
// target: 'http://8.140.26.4:9085/',
target
:
'http://192.168.0.
6
:28080/'
,
target
:
'http://192.168.0.
5
:28080/'
,
changeOrigin
:
true
,
changeOrigin
:
true
,
rewrite
:
(
path
)
=>
path
.
replace
(
/^
\/
api/
,
''
)
rewrite
:
(
path
)
=>
path
.
replace
(
/^
\/
api/
,
''
)
},
},
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论