Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
R
risk-monitor
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
蔡建
risk-monitor
Commits
4d409c10
提交
4d409c10
authored
3月 25, 2026
作者:
张伊明
浏览文件
操作
浏览文件
下载
差异文件
合并分支 'zy-dev' 到 'pre'
Zy dev 查看合并请求
!226
上级
f835b3ed
c87e484c
流水线
#52
已通过 于阶段
in 6 分 18 秒
变更
16
流水线
1
隐藏空白字符变更
内嵌
并排
正在显示
16 个修改的文件
包含
766 行增加
和
156 行删除
+766
-156
background.js
src/api/decree/background.js
+11
-0
home.js
src/api/decree/home.js
+11
-1
introduction.js
src/api/decree/introduction.js
+2
-2
index.vue
src/components/base/DecreeOriginal/index.vue
+6
-8
decree.js
src/router/modules/decree.js
+7
-4
tips-icon.png
src/views/decree/allOrganization/assets/icons/tips-icon.png
+0
-0
index.vue
src/views/decree/allOrganization/index.vue
+322
-0
MindGraph.vue
src/views/decree/com/MindGraph.vue
+123
-0
index.vue
src/views/decree/decreeHome/index.vue
+45
-36
index.vue
src/views/decree/decreeLayout/deepdig/index.vue
+80
-81
index.vue
src/views/decree/decreeLayout/influence/index.vue
+1
-1
index.vue
src/views/decree/decreeLayout/overview/background/index.vue
+17
-8
index.vue
...views/decree/decreeLayout/overview/introduction/index.vue
+5
-12
edit-line.png
...ecreeLayout/overview/measures/assets/images/edit-line.png
+0
-0
index.vue
src/views/decree/decreeLayout/overview/measures/index.vue
+134
-2
vite.config.js
vite.config.js
+2
-1
没有找到文件。
src/api/decree/background.js
浏览文件 @
4d409c10
...
@@ -60,6 +60,17 @@ export function getDecreeMainContent(params) {
...
@@ -60,6 +60,17 @@ export function getDecreeMainContent(params) {
})
})
}
}
// 思维导图
/**
* @param { id }
*/
export
function
getDecreeMindMap
(
params
)
{
return
request
({
method
:
'GET'
,
url
:
`/api/administrativeOrderInfo/mindMap/
${
params
.
id
}
`
,
})
}
// 相关实体
// 相关实体
/**
/**
* @param { id }
* @param { id }
...
...
src/api/decree/home.js
浏览文件 @
4d409c10
...
@@ -91,10 +91,20 @@ export function getDecreeTypeList() {
...
@@ -91,10 +91,20 @@ export function getDecreeTypeList() {
}
}
// 关键机构
// 关键机构
export
function
getKeyOrganization
()
{
export
function
getKeyOrganization
(
params
)
{
return
request
({
return
request
({
method
:
'GET'
,
method
:
'GET'
,
url
:
`/api/commonFeature/keyOrganization`
,
url
:
`/api/commonFeature/keyOrganization`
,
params
})
}
// 所有机构
export
function
getAllOrganization
(
params
)
{
return
request
({
method
:
'POST'
,
url
:
`/api/administrativeOrderOverview/orderCount`
,
data
:
params
})
})
}
}
...
...
src/api/decree/introduction.js
浏览文件 @
4d409c10
...
@@ -80,10 +80,10 @@ export function getDecreeReport(params) {
...
@@ -80,10 +80,10 @@ export function getDecreeReport(params) {
}
}
// 政令关键词云
// 政令关键词云
export
function
getKeyWordUp
()
{
export
function
getKeyWordUp
(
params
)
{
return
request
({
return
request
({
method
:
'GET'
,
method
:
'GET'
,
url
:
`/api/
element/getKeyWordUp/2025-01-01
`
,
url
:
`/api/
administrativeOrderInfo/wordCloud/
${
params
.
id
}
`
,
})
})
}
}
...
...
src/components/base/DecreeOriginal/index.vue
浏览文件 @
4d409c10
...
@@ -9,7 +9,7 @@
...
@@ -9,7 +9,7 @@
<div
class=
"switch-label switch-label-left"
>
高亮实体
</div>
<div
class=
"switch-label switch-label-left"
>
高亮实体
</div>
<el-switch
v-model=
"isTranslate"
/>
<el-switch
v-model=
"isTranslate"
/>
<div
class=
"switch-label"
>
原
文显示
</div>
<div
class=
"switch-label"
>
译
文显示
</div>
<div
<div
v-for=
"action in headerActions"
v-for=
"action in headerActions"
...
@@ -53,8 +53,8 @@
...
@@ -53,8 +53,8 @@
class=
"content-row"
class=
"content-row"
:class=
"
{ 'high-light': isHighlight }"
:class=
"
{ 'high-light': isHighlight }"
>
>
<div
class=
"content-
cn"
:class=
"
{ 'translate-cn': !isTranslate }" v-html="item.content" /
>
<div
class=
"content-
en"
v-html=
"item.contentEn"
:class=
"
{ 'translate-cn': !isTranslate }">
</div
>
<div
v-if=
"isTranslate"
class=
"content-en"
v-html=
"item.contentEn"
/
>
<div
class=
"content-cn"
v-html=
"item.content"
v-if=
"isTranslate"
></div
>
</div>
</div>
</el-scrollbar>
</el-scrollbar>
</div>
</div>
...
@@ -150,11 +150,9 @@ const doUpdateWord = () => {
...
@@ -150,11 +150,9 @@ const doUpdateWord = () => {
}
}
displayReportData
.
value
=
originReportData
.
value
.
map
((
item
)
=>
{
displayReportData
.
value
=
originReportData
.
value
.
map
((
item
)
=>
{
const
cn
=
applyHighlightToText
(
item
.
content
,
term
);
const
en
=
applyHighlightToText
(
item
.
contentEn
,
term
);
const
en
=
isTranslate
.
value
const
cn
=
isTranslate
.
value
?
applyHighlightToText
(
item
.
content
,
term
)
:
{
html
:
item
.
content
,
count
:
0
};
?
applyHighlightToText
(
item
.
contentEn
,
term
)
findWordMax
.
value
+=
en
.
count
+
cn
.
count
;
:
{
html
:
item
.
contentEn
,
count
:
0
};
findWordMax
.
value
+=
cn
.
count
+
en
.
count
;
return
{
return
{
...
item
,
...
item
,
content
:
cn
.
html
,
content
:
cn
.
html
,
...
...
src/router/modules/decree.js
浏览文件 @
4d409c10
...
@@ -9,6 +9,7 @@ const DecreeDeepDig = () => import('@/views/decree/decreeLayout/deepdig/index.vu
...
@@ -9,6 +9,7 @@ const DecreeDeepDig = () => import('@/views/decree/decreeLayout/deepdig/index.vu
const
DecreeInfluence
=
()
=>
import
(
'@/views/decree/decreeLayout/influence/index.vue'
)
const
DecreeInfluence
=
()
=>
import
(
'@/views/decree/decreeLayout/influence/index.vue'
)
const
Institution
=
()
=>
import
(
'@/views/decree/institution/index.vue'
)
const
Institution
=
()
=>
import
(
'@/views/decree/institution/index.vue'
)
const
DecreeOriginal
=
()
=>
import
(
'@/views/decree/decreeOriginal/index.vue'
)
const
DecreeOriginal
=
()
=>
import
(
'@/views/decree/decreeOriginal/index.vue'
)
const
allOrganization
=
()
=>
import
(
'@/views/decree/allOrganization/index.vue'
)
const
decreeRoutes
=
[
const
decreeRoutes
=
[
...
@@ -93,11 +94,12 @@ const decreeRoutes = [
...
@@ -93,11 +94,12 @@ const decreeRoutes = [
path
:
"/decree/decreeOriginal"
,
path
:
"/decree/decreeOriginal"
,
name
:
"DecreeOriginal"
,
name
:
"DecreeOriginal"
,
component
:
DecreeOriginal
,
component
:
DecreeOriginal
,
// meta: {
// title: "政令原文"
// }
},
},
{
path
:
"/decree/allOrganization"
,
name
:
"allOrganization"
,
component
:
allOrganization
,
},
]
]
export
default
decreeRoutes
export
default
decreeRoutes
\ No newline at end of file
src/views/decree/allOrganization/assets/icons/tips-icon.png
0 → 100644
浏览文件 @
4d409c10
1.0 KB
src/views/decree/allOrganization/index.vue
0 → 100644
浏览文件 @
4d409c10
<
template
>
<div
class=
"view-box"
>
<div
class=
"container-box"
>
<div
class=
"hard-box"
>
<div
class=
"hard-name text-title-0-show"
>
美国政府机构
</div>
<div
class=
"hard-num text-title-2-show"
>
{{
organizationInfo
.
total
}}
家
</div>
<div
style=
"width: 0px; flex: auto;"
></div>
<div
class=
"hard-input"
>
<el-input
v-model=
"organizationInfo.keyWord"
@
keyup
.
enter=
"onAllOrganization()"
style=
"width:100%; height:100%;"
:suffix-icon=
"Search"
placeholder=
"搜索机构"
/>
</div>
<div
class=
"hard-time"
>
<el-select
v-model=
"organizationInfo.isSort"
@
change=
"onAllOrganization()"
placeholder=
"发布时间"
style=
"width:160px; margin-left:8px;"
>
<template
#
prefix
>
<div
class=
"icon1"
>
<img
v-if=
"isSort"
src=
"@/assets/icons/shengxu1.png"
alt=
""
/>
<img
v-else
src=
"@/assets/icons/jiangxu1.png"
alt=
""
/>
</div>
</
template
>
<el-option
label=
"政令数量"
:value=
"1"
/>
</el-select>
</div>
</div>
<div
class=
"date-box"
>
<div
class=
"date-icon"
>
<img
:src=
"tipsTcon"
alt=
""
>
</div>
<div
class=
"date-text"
>
近期美国各联邦政府机构发布涉华政令数量汇总
</div>
<TimeTabPane
@
time-click=
"handleDateChange"
/>
</div>
<div
class=
"organization-list"
ref=
"refOrganization"
v-loading=
"organizationInfo.loading"
>
<div
class=
"organization-item"
v-for=
"(item, index) in organizationInfo.list"
:key=
"index"
@
click=
"handleToInstitution(item)"
>
<div
class=
"item-left"
>
<img
:src=
"item.imgUrl || DefaultIcon2"
alt=
""
/>
</div>
<div
class=
"item-right one-line-ellipsis"
>
{{ item.orgName }}
</div>
<div
class=
"item-total"
>
{{ item.totalOrderNum }}项
</div>
<el-icon
color=
"var(--color-primary-100)"
><ArrowRightBold
/></el-icon>
<div
class=
"item-dot"
v-if=
"item.recentOrderNum"
>
+{{item.recentOrderNum}}
</div>
</div>
</div>
<div
class=
"pagination-box"
>
<el-pagination
@
current-change=
"onAllOrganization"
:pageSize=
"organizationInfo.pageSize"
:current-page=
"organizationInfo.pageNum"
background
layout=
"prev, pager, next"
:total=
"organizationInfo.total"
/>
</div>
</div>
<div
class=
"back-bnt"
@
click=
"router.back()"
>
<el-icon><Back
/></el-icon>
<div
style=
"margin-left: 6px;"
>
返回
</div>
</div>
</div>
</template>
<
script
setup
name=
"index"
>
import
{
onMounted
,
reactive
,
ref
}
from
"vue"
import
{
Search
}
from
'@element-plus/icons-vue'
import
router
from
"@/router"
;
import
TimeTabPane
from
'@/components/base/TimeTabPane/index.vue'
;
import
{
getAllOrganization
}
from
"@/api/decree/home"
;
import
tipsTcon
from
"./assets/icons/tips-icon.png"
;
import
DefaultIcon2
from
"@/assets/icons/default-icon2.png"
;
const
organizationInfo
=
reactive
({
loading
:
false
,
pageNum
:
1
,
pageSize
:
8
,
total
:
0
,
isSort
:
1
,
keyWord
:
""
,
day
:
7
,
list
:
[]
})
const
onAllOrganization
=
async
(
num
)
=>
{
organizationInfo
.
pageNum
=
num
||
1
organizationInfo
.
loading
=
true
try
{
let
{
keyWord
,
pageNum
,
pageSize
,
day
}
=
organizationInfo
const
res
=
await
getAllOrganization
({
day
,
pageNum
:
pageNum
-
1
,
pageSize
,
keyWord
:
keyWord
||
undefined
});
console
.
log
(
"机构列表"
,
res
);
if
(
res
.
code
===
200
)
{
organizationInfo
.
list
=
res
.
data
.
orgList
||
[];
organizationInfo
.
total
=
res
.
data
.
total
||
0
;
}
}
catch
(
error
)
{
console
.
error
(
"获取机构列表数据失败"
,
error
);
organizationInfo
.
list
=
[];
organizationInfo
.
total
=
0
;
}
organizationInfo
.
loading
=
false
}
const
handleDateChange
=
(
event
)
=>
{
if
(
event
?.
time
===
'近一周'
)
organizationInfo
.
day
=
7
if
(
event
?.
time
===
'近一月'
)
organizationInfo
.
day
=
30
if
(
event
?.
time
===
'近一年'
)
organizationInfo
.
day
=
365
onAllOrganization
()
}
// 跳转行政机构主页
const
handleToInstitution
=
item
=>
{
window
.
sessionStorage
.
setItem
(
"curTabName"
,
item
.
orgName
);
const
curRoute
=
router
.
resolve
({
path
:
"/institution"
,
query
:
{
id
:
item
.
orgId
}
});
window
.
open
(
curRoute
.
href
,
"_blank"
);
};
const
refOrganization
=
ref
()
onMounted
(()
=>
{
// 根据元素的高度决定分页显示的机构数量
let
height
=
2
;
if
(
refOrganization
.
value
)
{
height
=
Math
.
floor
(
refOrganization
.
value
?.
clientHeight
/
120
)
}
organizationInfo
.
pageSize
=
height
*
4
onAllOrganization
()
})
</
script
>
<
style
scoped
lang=
"scss"
>
.view-box
{
width
:
100%
;
height
:
100%
;
background
:
url("./assets/images/background.png")
,
linear-gradient
(
180deg
,
rgba
(
229
,
241
,
254
,
1
)
0%
,
rgba
(
246
,
251
,
255
,
0
)
30%
);
background-size
:
100%
100%
;
display
:
flex
;
justify-content
:
center
;
position
:
relative
;
.back-bnt
{
position
:
absolute
;
top
:
16px
;
left
:
30px
;
width
:
86px
;
height
:
38px
;
background-color
:
white
;
border-radius
:
19px
;
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
color
:
var
(
--
text-primary-65-color
);
font-family
:
Source
Han
Sans
CN
;
font-size
:
16px
;
cursor
:
pointer
;
}
.container-box
{
width
:
1600px
;
padding
:
50px
0
20px
;
display
:
flex
;
flex-direction
:
column
;
.hard-box
{
display
:
flex
;
align-items
:
center
;
width
:
100%
;
.hard-name
{
color
:
var
(
--
text-primary-90-color
);
height
:
62px
;
line-height
:
62px
!
important
;
}
.hard-num
{
height
:
36px
;
background-color
:
var
(
--
color-primary-100
);
color
:
var
(
--
bg-white-100
);
border-radius
:
18px
;
line-height
:
36px
!
important
;
padding
:
0
16px
;
margin-left
:
16px
;
}
.hard-input
{
background-color
:
var
(
--
el-fill-color-blank
);
border-radius
:
var
(
--
el-border-radius-base
);
box-shadow
:
0
0
0
1px
var
(
--
el-border-color
)
inset
;
box-sizing
:
border-box
;
margin-left
:
20px
;
width
:
160px
;
height
:
32px
;
}
.hard-time
{
height
:
42px
;
padding
:
5px
0
;
.icon1
{
width
:
11px
;
height
:
14px
;
font-size
:
0px
;
img
{
width
:
100%
;
height
:
100%
;
}
}
}
}
.date-box
{
margin-top
:
6px
;
display
:
flex
;
align-items
:
center
;
width
:
100%
;
.date-icon
{
width
:
16px
;
height
:
16px
;
font-size
:
0px
;
margin-right
:
6px
;
img
{
width
:
100%
;
height
:
100%
;
}
}
.date-text
{
width
:
20px
;
flex
:
auto
;
font-size
:
18px
;
line-height
:
18px
;
font-family
:
Source
Han
Sans
CN
;
color
:
var
(
--
text-primary-80-color
);
}
}
.organization-list
{
width
:
100%
;
height
:
20px
;
padding
:
16px
0
;
margin-top
:
10px
;
flex
:
auto
;
display
:
grid
;
grid-template-columns
:
repeat
(
4
,
1fr
);
grid-auto-rows
:
104px
;
gap
:
16px
;
font-family
:
Microsoft
YaHei
;
.organization-item
{
padding
:
0
16px
;
display
:
flex
;
box-sizing
:
border-box
;
background
:
rgba
(
255
,
255
,
255
,
0
.65
);
border
:
1px
solid
rgba
(
255
,
255
,
255
,
1
);
border-radius
:
10px
;
box-shadow
:
0px
0px
20px
0px
rgba
(
25
,
69
,
130
,
0
.1
);
align-items
:
center
;
justify-content
:
center
;
cursor
:
pointer
;
transition
:
transform
0
.3s
ease
,
box-shadow
0
.3s
ease
;
position
:
relative
;
&
:hover
{
transform
:
translateY
(
-3px
);
box-shadow
:
0
4px
16px
rgba
(
0
,
0
,
0
,
0
.15
);
}
.item-left
{
width
:
48px
;
height
:
48px
;
font-size
:
0px
;
img
{
width
:
100%
;
height
:
100%
;
}
}
.item-right
{
width
:
20px
;
flex
:
auto
;
color
:
rgba
(
59
,
65
,
75
,
1
);
font-size
:
20px
;
font-weight
:
700
;
line-height
:
20px
;
margin
:
0
16px
;
}
.item-total
{
font-size
:
20px
;
margin-right
:
2px
;
white-space
:
nowrap
;
font-weight
:
700
;
line-height
:
20px
;
color
:
var
(
--
color-primary-100
);
}
.item-more
{
font-size
:
16px
;
margin-right
:
12px
;
white-space
:
nowrap
;
font-weight
:
700
;
line-height
:
16px
;
color
:
var
(
--
color-primary-100
);
}
.item-dot
{
position
:
absolute
;
right
:
-13px
;
top
:
-10px
;
padding
:
0
8px
;
height
:
26px
;
background-color
:
#FF4D4F
;
color
:
white
;
font-size
:
16px
;
line-height
:
26px
;
font-family
:
Source
Han
Sans
CN
;
border-radius
:
14px
;
letter-spacing
:
1px
;
}
}
}
.pagination-box
{
display
:
flex
;
justify-content
:
center
;
}
}
}
</
style
>
\ No newline at end of file
src/views/decree/com/MindGraph.vue
0 → 100644
浏览文件 @
4d409c10
<
template
>
<div
class=
"view-box"
>
<div
ref=
"graphContainer"
style=
"height: 100%; width: 100%;"
></div>
</div>
</
template
>
<
script
setup
name=
"MindGraph"
>
import
{
ref
,
onBeforeUnmount
}
from
"vue"
import
*
as
G6
from
'@antv/g6'
;
// 初始化画布
const
graphContainer
=
ref
(
null
);
let
graph
=
null
;
const
onInitGraph
=
()
=>
{
const
container
=
graphContainer
.
value
;
const
width
=
container
.
clientWidth
;
const
height
=
container
.
clientHeight
;
graph
=
new
G6
.
Graph
({
container
:
container
,
width
,
height
,
// fitView: true,
// fitViewPadding: 50,
defaultNode
:
{
type
:
"rect"
,
size
:
[
250
,
45
],
style
:
{
fill
:
"#F6FAFF"
,
stroke
:
"#B9DCFF"
,
lineWidth
:
1
},
labelCfg
:
{
style
:
{
fill
:
"#055FC2"
,
fontSize
:
18
,
lineHeight
:
25
,
fontWeight
:
"bold"
,
fontFamily
:
"Source Han Sans CN"
,
}
}
},
defaultEdge
:
{
type
:
"cubic-horizontal"
,
style
:
{
stroke
:
"#B9DCFF"
,
lineWidth
:
2
,
endArrow
:
true
,
}
},
layout
:
{
type
:
'dagre'
,
// 层次布局
rankdir
:
'LR'
,
// 布局从左向右
controlPoints
:
true
,
// 节点间连线的控制点
nodesep
:
10
,
// 同一层节点之间的距离
ranksep
:
50
,
// 不同层节点之间的距离
},
modes
:
{
default
:
[
'drag-canvas'
,
// 鼠标拖拽移动画布
'zoom-canvas'
,
// 鼠标滚轮缩放
// 'drag-node' // 可选:允许拖拽节点
]
},
});
}
// 加载思维导图数据
const
onMindGraphData
=
(
nodes
=
[],
edges
=
[])
=>
{
let
data
=
{
nodes
:[],
edges
}
nodes
.
forEach
(
node
=>
{
if
(
node
.
maxWidth
)
onFormatLineFeed
(
node
);
data
.
nodes
.
push
(
node
);
})
if
(
!
graph
)
onInitGraph
();
graph
.
data
(
data
);
graph
.
render
();
}
// 获取文本宽度
const
canvas
=
document
.
createElement
(
'canvas'
);
const
ctx
=
canvas
.
getContext
(
'2d'
);
const
getLabelWidth
=
(
label
,
size
,
family
)
=>
{
ctx
.
font
=
`
${
size
}
px
${
family
}
`
;
return
ctx
.
measureText
(
label
).
width
;
}
// 文本插入换行符
const
onFormatLineFeed
=
(
node
)
=>
{
let
size
=
node
?.
labelCfg
?.
style
?.
fontSize
||
'16'
let
family
=
node
?.
labelCfg
?.
style
?.
fontFamily
||
'Source Han Sans CN'
const
lines
=
[];
let
line
=
''
;
for
(
let
char
of
node
.
label
)
{
const
testLine
=
line
+
char
;
const
width
=
getLabelWidth
(
testLine
,
size
,
family
);
if
(
width
>
node
.
maxWidth
-
40
)
{
lines
.
push
(
line
);
line
=
char
;
}
else
{
line
=
testLine
;
}
}
if
(
line
)
lines
.
push
(
line
);
node
.
label
=
lines
.
join
(
"
\
n"
)
node
.
size
=
[
node
.
maxWidth
,
25
*
lines
.
length
+
20
]
}
defineExpose
({
onMindGraphData
})
onBeforeUnmount
(()
=>
{
graph
?.
destroy
()
})
</
script
>
<
style
scoped
lang=
"scss"
>
.view-box
{
width
:
100%
;
height
:
100%
;
}
</
style
>
\ No newline at end of file
src/views/decree/decreeHome/index.vue
浏览文件 @
4d409c10
...
@@ -29,24 +29,24 @@
...
@@ -29,24 +29,24 @@
<div
class=
"item-footer"
>
分析报告
</div>
<div
class=
"item-footer"
>
分析报告
</div>
</div>
</div>
</div>
-->
</div>
-->
<div
class=
"date-box"
v-if=
"
govIns
List.length"
>
<div
class=
"date-box"
v-if=
"
keyOrganization
List.length"
>
<div
class=
"date-icon"
>
<div
class=
"date-icon"
>
<img
:src=
"tipsTcon"
alt=
""
>
<img
:src=
"tipsTcon"
alt=
""
>
</div>
</div>
<div
class=
"date-text"
>
近期美国各联邦政府机构发布涉华政令数量汇总
</div>
<div
class=
"date-text"
>
近期美国各联邦政府机构发布涉华政令数量汇总
</div>
<TimeTabPane
@
time-click=
"
handleGetDepartmentList
"
/>
<TimeTabPane
@
time-click=
"
onKeyOrganization
"
/>
</div>
</div>
<div
class=
"home-main-header-item-box"
v-if=
"
govIns
List.length"
>
<div
class=
"home-main-header-item-box"
v-if=
"
keyOrganization
List.length"
>
<div
class=
"organization-item"
v-for=
"(item, index) in
govInsList.slice(0, 7)
"
:key=
"index"
@
click=
"handleToInstitution(item)"
>
<div
class=
"organization-item"
v-for=
"(item, index) in
keyOrganizationList
"
:key=
"index"
@
click=
"handleToInstitution(item)"
>
<div
class=
"item-left"
>
<div
class=
"item-left"
>
<img
:src=
"item.
orgImage
|| DefaultIcon2"
alt=
""
/>
<img
:src=
"item.
imgUrl
|| DefaultIcon2"
alt=
""
/>
</div>
</div>
<div
class=
"item-right one-line-ellipsis"
>
{{
item
.
orgName
}}
</div>
<div
class=
"item-right one-line-ellipsis"
>
{{
item
.
orgName
}}
</div>
<div
class=
"item-total"
>
{{
item
.
total
}}
项
</div>
<div
class=
"item-total"
>
{{
item
.
total
OrderNum
}}
项
</div>
<el-icon
color=
"var(--color-primary-100)"
><ArrowRightBold
/></el-icon>
<el-icon
color=
"var(--color-primary-100)"
><ArrowRightBold
/></el-icon>
<div
class=
"item-dot"
v-if=
"item.
totalRecent"
>
+
{{
item
.
totalRecent
}}
</div>
<div
class=
"item-dot"
v-if=
"item.
recentOrderNum"
>
+
{{
item
.
recentOrderNum
}}
</div>
</div>
</div>
<div
class=
"organization-item"
>
<div
class=
"organization-item"
@
click=
"onNavigateTo()"
>
<div
class=
"item-more"
>
查看全部机构 (
{{
govInsList
.
length
+
1
}}
家)
</div>
<div
class=
"item-more"
>
查看全部机构 (
{{
govInsList
.
length
+
1
}}
家)
</div>
<el-icon
color=
"var(--color-primary-100)"
><ArrowRightBold
/></el-icon>
<el-icon
color=
"var(--color-primary-100)"
><ArrowRightBold
/></el-icon>
</div>
</div>
...
@@ -164,7 +164,6 @@
...
@@ -164,7 +164,6 @@
<DivideHeader
id=
"position2"
class=
"divide2"
:titleText=
"'资讯要闻'"
></DivideHeader>
<DivideHeader
id=
"position2"
class=
"divide2"
:titleText=
"'资讯要闻'"
></DivideHeader>
<div
class=
"center-center"
>
<div
class=
"center-center"
>
<NewsList
:newsList=
"newsList"
@
item-click=
"handleToNewsAnalysis"
@
more-click=
"handleToMoreNews"
/>
<NewsList
:newsList=
"newsList"
@
item-click=
"handleToNewsAnalysis"
@
more-click=
"handleToMoreNews"
/>
<!--
<NewsList
:newsList=
"newsList"
/>
-->
<MessageBubble
:messageList=
"messageList"
@
person-click=
"handleClickPerson"
@
info-click=
"handleGetMessage"
<MessageBubble
:messageList=
"messageList"
@
person-click=
"handleClickPerson"
@
info-click=
"handleGetMessage"
imageUrl=
"img"
@
more-click=
"handleToSocialDetail"
/>
imageUrl=
"img"
@
more-click=
"handleToSocialDetail"
/>
</div>
</div>
...
@@ -194,7 +193,7 @@
...
@@ -194,7 +193,7 @@
</el-select>
</el-select>
</div>
</div>
</div>
</div>
<div
class=
"box5-main"
>
<div
class=
"box5-main"
v-loading=
"box5Params.loading"
>
<div
class=
"box5-chart"
id=
"chart1"
></div>
<div
class=
"box5-chart"
id=
"chart1"
></div>
</div>
</div>
<div
class=
"data-origin-box"
>
<div
class=
"data-origin-box"
>
...
@@ -227,7 +226,7 @@
...
@@ -227,7 +226,7 @@
</el-select>
</el-select>
</div>
</div>
</div>
</div>
<div
class=
"box5-main"
>
<div
class=
"box5-main"
v-loading=
"box6Params.loading"
>
<div
class=
"box5-chart"
id=
"chart2"
></div>
<div
class=
"box5-chart"
id=
"chart2"
></div>
</div>
</div>
<div
class=
"data-origin-box"
>
<div
class=
"data-origin-box"
>
...
@@ -267,7 +266,7 @@
...
@@ -267,7 +266,7 @@
</el-select>
</el-select>
</div>
</div>
</div>
</div>
<div
class=
"box7-main"
>
<div
class=
"box7-main"
v-loading=
"box7Params.loading"
>
<div
class=
"box7-list"
>
<div
class=
"box7-list"
>
<div
class=
"box7-item"
v-for=
"(item, index) in keyDecreeList"
:key=
"index"
@
click=
"handleKeyDecree(item)"
>
<div
class=
"box7-item"
v-for=
"(item, index) in keyDecreeList"
:key=
"index"
@
click=
"handleKeyDecree(item)"
>
<div
class=
"icon"
>
<div
class=
"icon"
>
...
@@ -315,7 +314,7 @@
...
@@ -315,7 +314,7 @@
</el-select>
</el-select>
</div>
</div>
</div>
</div>
<div
class=
"box8-content"
>
<div
class=
"box8-content"
v-loading=
"box8Params.loading"
>
<WordCloudChart
v-if=
"wordCloudData?.length"
:data=
"wordCloudData"
width=
"100%"
height=
"100%"
/>
<WordCloudChart
v-if=
"wordCloudData?.length"
:data=
"wordCloudData"
width=
"100%"
height=
"100%"
/>
</div>
</div>
<div
class=
"data-origin-box"
>
<div
class=
"data-origin-box"
>
...
@@ -485,6 +484,8 @@ import DefaultIcon2 from "@/assets/icons/default-icon2.png";
...
@@ -485,6 +484,8 @@ import DefaultIcon2 from "@/assets/icons/default-icon2.png";
import
tipsTcon
from
"./assets/images/tips-icon.png"
;
import
tipsTcon
from
"./assets/images/tips-icon.png"
;
import
{
ElMessage
}
from
"element-plus"
;
import
{
ElMessage
}
from
"element-plus"
;
import
{
useGotoNewsDetail
}
from
'@/router/modules/news'
;
const
containerRef
=
ref
(
null
);
const
containerRef
=
ref
(
null
);
const
{
isShow
}
=
useContainerScroll
(
containerRef
);
const
{
isShow
}
=
useContainerScroll
(
containerRef
);
const
currentPage
=
ref
(
1
);
const
currentPage
=
ref
(
1
);
...
@@ -499,14 +500,9 @@ const handleCurrentChange = page => {
...
@@ -499,14 +500,9 @@ const handleCurrentChange = page => {
// 机构列表
// 机构列表
const
govInsList
=
ref
([]);
const
govInsList
=
ref
([]);
const
checkedGovIns
=
ref
([]);
const
checkedGovIns
=
ref
([]);
const
handleGetDepartmentList
=
async
(
event
)
=>
{
const
handleGetDepartmentList
=
async
()
=>
{
let
day
=
7
if
(
event
?.
time
===
'近一周'
)
day
=
7
if
(
event
?.
time
===
'近一月'
)
day
=
30
if
(
event
?.
time
===
'近一年'
)
day
=
365
try
{
try
{
const
res
=
await
getDepartmentList
({
day
});
const
res
=
await
getDepartmentList
({
day
:
7
});
console
.
log
(
"机构列表"
,
res
);
console
.
log
(
"机构列表"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
if
(
res
.
code
===
200
&&
res
.
data
)
{
govInsList
.
value
=
res
.
data
;
govInsList
.
value
=
res
.
data
;
...
@@ -526,6 +522,10 @@ const handleToInstitution = item => {
...
@@ -526,6 +522,10 @@ const handleToInstitution = item => {
});
});
window
.
open
(
curRoute
.
href
,
"_blank"
);
window
.
open
(
curRoute
.
href
,
"_blank"
);
};
};
// 跳转全部机构页面
const
onNavigateTo
=
()
=>
{
router
.
push
({
name
:
"allOrganization"
});
}
// 查看更多风险信号
// 查看更多风险信号
const
handleToMoreRiskSignal
=
()
=>
{
const
handleToMoreRiskSignal
=
()
=>
{
...
@@ -657,7 +657,6 @@ const handleGetNews = async () => {
...
@@ -657,7 +657,6 @@ const handleGetNews = async () => {
const
res
=
await
getNews
({
moduleId
:
"0101"
});
const
res
=
await
getNews
({
moduleId
:
"0101"
});
console
.
log
(
"新闻资讯"
,
res
);
console
.
log
(
"新闻资讯"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
if
(
res
.
code
===
200
&&
res
.
data
)
{
// newsList.value = res.data || []
newsList
.
value
=
(
res
.
data
??
[]).
map
(
item
=>
{
newsList
.
value
=
(
res
.
data
??
[]).
map
(
item
=>
{
return
{
return
{
newsId
:
item
.
newsId
,
newsId
:
item
.
newsId
,
...
@@ -673,14 +672,9 @@ const handleGetNews = async () => {
...
@@ -673,14 +672,9 @@ const handleGetNews = async () => {
}
}
};
};
// 点击新闻条目,跳转到新闻分析页
// 点击新闻条目,跳转到新闻分析页
const
gotoNewsDetail
=
useGotoNewsDetail
()
const
handleToNewsAnalysis
=
news
=>
{
const
handleToNewsAnalysis
=
news
=>
{
const
route
=
router
.
resolve
({
gotoNewsDetail
(
news
.
newsId
)
path
:
"/newsAnalysis"
,
query
:
{
newsId
:
news
.
newsId
}
});
window
.
open
(
route
.
href
,
"_blank"
);
};
};
// 社交媒体
// 社交媒体
...
@@ -799,9 +793,11 @@ const box5Params = reactive({
...
@@ -799,9 +793,11 @@ const box5Params = reactive({
year
:
yearList
[
0
].
value
,
year
:
yearList
[
0
].
value
,
domainId
:
''
,
domainId
:
''
,
proposeName
:
''
,
proposeName
:
''
,
loading
:
false
,
})
})
const
summarize1
=
ref
()
const
summarize1
=
ref
()
const
handleGetDecreeYearOrder
=
async
()
=>
{
const
handleGetDecreeYearOrder
=
async
()
=>
{
box5Params
.
loading
=
true
try
{
try
{
let
{
year
,
domainId
,
proposeName
}
=
box5Params
;
let
{
year
,
domainId
,
proposeName
}
=
box5Params
;
const
res
=
await
getDecreeYearOrder
({
const
res
=
await
getDecreeYearOrder
({
...
@@ -822,6 +818,7 @@ const handleGetDecreeYearOrder = async () => {
...
@@ -822,6 +818,7 @@ const handleGetDecreeYearOrder = async () => {
}
catch
(
error
)
{
}
catch
(
error
)
{
console
.
error
(
"行政令发布频度error"
,
error
);
console
.
error
(
"行政令发布频度error"
,
error
);
}
}
box5Params
.
loading
=
false
};
};
// AI智能总结
// AI智能总结
const
onChartInterpretation
=
async
(
text
)
=>
{
const
onChartInterpretation
=
async
(
text
)
=>
{
...
@@ -882,9 +879,11 @@ const chart2Data = ref([
...
@@ -882,9 +879,11 @@ const chart2Data = ref([
const
box6Params
=
reactive
({
const
box6Params
=
reactive
({
year
:
yearList
[
0
].
value
,
year
:
yearList
[
0
].
value
,
proposeName
:
''
,
proposeName
:
''
,
loading
:
false
,
});
});
const
summarize2
=
ref
()
const
summarize2
=
ref
()
const
handleGetDecreeArea
=
async
()
=>
{
const
handleGetDecreeArea
=
async
()
=>
{
box6Params
.
loading
=
true
try
{
try
{
let
{
year
,
proposeName
}
=
box6Params
;
let
{
year
,
proposeName
}
=
box6Params
;
const
res
=
await
getDecreeArea
({
const
res
=
await
getDecreeArea
({
...
@@ -904,6 +903,7 @@ const handleGetDecreeArea = async () => {
...
@@ -904,6 +903,7 @@ const handleGetDecreeArea = async () => {
}
catch
(
error
)
{
}
catch
(
error
)
{
console
.
error
(
"政令科技领域error"
,
error
);
console
.
error
(
"政令科技领域error"
,
error
);
}
}
box6Params
.
loading
=
false
};
};
const
handleBox6
=
async
()
=>
{
const
handleBox6
=
async
()
=>
{
await
handleGetDecreeArea
();
await
handleGetDecreeArea
();
...
@@ -926,8 +926,10 @@ const box7Params = reactive({
...
@@ -926,8 +926,10 @@ const box7Params = reactive({
year
:
yearList
[
0
].
value
,
year
:
yearList
[
0
].
value
,
domainId
:
''
,
domainId
:
''
,
proposeName
:
''
,
proposeName
:
''
,
loading
:
false
,
})
})
const
handleGetKeyDecree
=
async
()
=>
{
const
handleGetKeyDecree
=
async
()
=>
{
box7Params
.
loading
=
true
try
{
try
{
let
{
year
,
domainId
,
proposeName
}
=
box7Params
;
let
{
year
,
domainId
,
proposeName
}
=
box7Params
;
const
res
=
await
getKeyDecree
({
const
res
=
await
getKeyDecree
({
...
@@ -950,6 +952,7 @@ const handleGetKeyDecree = async () => {
...
@@ -950,6 +952,7 @@ const handleGetKeyDecree = async () => {
});
});
}
}
}
catch
(
error
)
{
}
}
catch
(
error
)
{
}
box7Params
.
loading
=
false
};
};
// 政令重点条款
// 政令重点条款
...
@@ -958,8 +961,10 @@ const box8Params = reactive({
...
@@ -958,8 +961,10 @@ const box8Params = reactive({
year
:
yearList
[
0
].
value
,
year
:
yearList
[
0
].
value
,
domainId
:
''
,
domainId
:
''
,
proposeName
:
''
,
proposeName
:
''
,
loading
:
false
,
})
})
const
handleGetDecreeKeyInstruction
=
async
()
=>
{
const
handleGetDecreeKeyInstruction
=
async
()
=>
{
box8Params
.
loading
=
true
try
{
try
{
let
{
year
,
domainId
,
proposeName
}
=
box8Params
;
let
{
year
,
domainId
,
proposeName
}
=
box8Params
;
const
res
=
await
getDecreeKeyInstruction
({
const
res
=
await
getDecreeKeyInstruction
({
...
@@ -972,6 +977,7 @@ const handleGetDecreeKeyInstruction = async () => {
...
@@ -972,6 +977,7 @@ const handleGetDecreeKeyInstruction = async () => {
}
catch
(
error
)
{
}
catch
(
error
)
{
console
.
error
(
"政令重点条款error"
,
error
);
console
.
error
(
"政令重点条款error"
,
error
);
}
}
box8Params
.
loading
=
false
};
};
// 资源库
// 资源库
...
@@ -1197,12 +1203,16 @@ const handleSearch = () => {
...
@@ -1197,12 +1203,16 @@ const handleSearch = () => {
// 关键机构
// 关键机构
const
keyOrganizationList
=
ref
([]);
const
keyOrganizationList
=
ref
([]);
const
onKeyOrganization
=
async
()
=>
{
const
onKeyOrganization
=
async
(
event
)
=>
{
let
day
=
7
if
(
event
?.
time
===
'近一周'
)
day
=
7
if
(
event
?.
time
===
'近一月'
)
day
=
30
if
(
event
?.
time
===
'近一年'
)
day
=
365
try
{
try
{
const
res
=
await
getKeyOrganization
();
const
res
=
await
getKeyOrganization
(
{
day
}
);
console
.
log
(
"关键机构"
,
res
);
console
.
log
(
"关键机构"
,
res
);
if
(
res
.
code
===
200
)
{
if
(
res
.
code
===
200
)
{
keyOrganizationList
.
value
=
res
.
data
.
map
(
item
=>
({
orgName
:
item
.
orgName
,
orgId
:
item
.
id
}))
;
keyOrganizationList
.
value
=
res
.
data
;
}
}
}
catch
(
error
)
{
}
}
catch
(
error
)
{
}
}
}
...
@@ -1423,15 +1433,13 @@ onMounted(async () => {
...
@@ -1423,15 +1433,13 @@ onMounted(async () => {
.home-main-header-item-box
{
.home-main-header-item-box
{
margin
:
20px
0
64px
;
margin
:
20px
0
64px
;
width
:
1600px
;
width
:
1600px
;
display
:
flex
;
display
:
grid
;
flex-wrap
:
wrap
;
grid-template-columns
:
repeat
(
4
,
1fr
);
grid-auto-rows
:
80px
;
gap
:
16px
;
gap
:
16px
;
font-family
:
Microsoft
YaHei
;
font-family
:
Microsoft
YaHei
;
.organization-item
{
.organization-item
{
width
:
20%
;
flex
:
auto
;
height
:
80px
;
padding
:
0
16px
;
padding
:
0
16px
;
display
:
flex
;
display
:
flex
;
box-sizing
:
border-box
;
box-sizing
:
border-box
;
...
@@ -2194,6 +2202,7 @@ onMounted(async () => {
...
@@ -2194,6 +2202,7 @@ onMounted(async () => {
.box5-main
{
.box5-main
{
flex
:
auto
;
flex
:
auto
;
height
:
20px
;
height
:
20px
;
padding-top
:
16px
;
.box5-chart
{
.box5-chart
{
height
:
100%
;
height
:
100%
;
}
}
...
...
src/views/decree/decreeLayout/deepdig/index.vue
浏览文件 @
4d409c10
...
@@ -170,7 +170,6 @@ const onWordWrap = (word, num) => {
...
@@ -170,7 +170,6 @@ const onWordWrap = (word, num) => {
}
}
const
handleClickDecree
=
decree
=>
{
const
handleClickDecree
=
decree
=>
{
window
.
sessionStorage
.
setItem
(
"curTabName"
,
decree
.
name
);
const
route
=
router
.
resolve
({
const
route
=
router
.
resolve
({
path
:
"/decreeLayout"
,
path
:
"/decreeLayout"
,
query
:
{
query
:
{
...
@@ -184,101 +183,101 @@ const handleClickDecree = decree => {
...
@@ -184,101 +183,101 @@ const handleClickDecree = decree => {
const
graphContainer
=
ref
(
null
);
const
graphContainer
=
ref
(
null
);
let
graph
=
null
;
let
graph
=
null
;
const
onRelationChart
=
()
=>
{
const
onRelationChart
=
()
=>
{
const
container
=
graphContainer
.
value
;
const
container
=
graphContainer
.
value
;
const
nodeWidth
=
180
;
const
nodeWidth
=
180
;
const
width
=
container
.
clientWidth
;
const
width
=
container
.
clientWidth
;
const
height
=
container
.
clientHeight
;
const
height
=
container
.
clientHeight
;
const
centerX
=
width
/
2
const
centerX
=
width
/
2
const
centerY
=
height
/
2
-
40
const
centerY
=
height
/
2
-
40
const
leftNodeX
=
centerX
-
nodeWidth
;
const
leftNodeX
=
centerX
-
nodeWidth
;
const
rightNodeX
=
centerX
+
nodeWidth
;
const
rightNodeX
=
centerX
+
nodeWidth
;
const
data
=
{
const
data
=
{
nodes
:
[
nodes
:
[
{
{
id
:
mainInfo
.
value
.
id
+
''
,
label
:
`
${
mainInfo
.
value
.
time
}
\n
${
onWordWrap
(
mainInfo
.
value
.
label
,
15
)}
`
,
id
:
mainInfo
.
value
.
id
+
''
,
label
:
`
${
mainInfo
.
value
.
time
}
\n
${
onWordWrap
(
mainInfo
.
value
.
label
,
15
)}
`
,
size
:
[
250
,
80
],
x
:
leftNodeX
,
y
:
centerY
,
size
:
[
250
,
80
],
x
:
leftNodeX
,
y
:
centerY
,
},
{
id
:
nodeInfo
.
value
.
id
+
''
,
label
:
`
${
nodeInfo
.
value
.
time
}
\n
${
onWordWrap
(
nodeInfo
.
value
.
label
,
15
)}
`
,
size
:
[
250
,
80
],
x
:
rightNodeX
,
y
:
centerY
,
},
],
edges
:
[
{
id
:
`edge-1`
,
target
:
nodeInfo
.
value
.
id
+
''
,
source
:
mainInfo
.
value
.
id
+
''
,
label
:
nodeInfo
.
value
.
relation
,
style
:
{
stroke
:
[
""
,
"#B9DCFF"
,
"#87E8DE"
,
"#FFCCC7"
][
1
],
},
},
{
labelCfg
:
{
id
:
nodeInfo
.
value
.
id
+
''
,
label
:
`
${
nodeInfo
.
value
.
time
}
\n
${
onWordWrap
(
nodeInfo
.
value
.
label
,
15
)}
`
,
size
:
[
250
,
80
],
x
:
rightNodeX
,
y
:
centerY
,
},
],
edges
:
[
{
id
:
`edge-1`
,
target
:
nodeInfo
.
value
.
id
+
''
,
source
:
mainInfo
.
value
.
id
+
''
,
label
:
nodeInfo
.
value
.
relation
,
style
:
{
style
:
{
stroke
:
[
""
,
"#B9DCFF"
,
"#87E8DE"
,
"#FFCCC7"
][
1
],
fill
:
[
""
,
"#055fc2"
,
"#13A8A8"
,
"#CE4F51"
][
1
],
},
background
:
{
labelCfg
:
{
fill
:
[
""
,
"#eef7ff"
,
"#E6FFFB"
,
"#FFE0E0"
][
1
],
style
:
{
fill
:
[
""
,
"#055fc2"
,
"#13A8A8"
,
"#CE4F51"
][
1
],
background
:
{
fill
:
[
""
,
"#eef7ff"
,
"#E6FFFB"
,
"#FFE0E0"
][
1
],
}
}
}
}
}
}
}
]
}
};
]
};
// 创建图实例
// 创建图实例
if
(
!
graph
)
{
if
(
!
graph
)
{
graph
=
new
G6
.
Graph
({
graph
=
new
G6
.
Graph
({
container
:
container
,
container
:
container
,
width
,
width
,
height
,
height
,
defaultNode
:
{
defaultNode
:
{
type
:
'rect'
,
type
:
'rect'
,
anchorPoints
:
[[
0
,
0.5
],
[
1
,
0.5
]],
anchorPoints
:
[[
0
,
0.5
],
[
1
,
0.5
]],
style
:
{
style
:
{
cursor
:
"pointer"
,
radius
:
4
,
fill
:
'#f6faff'
,
stroke
:
'#B9DCFF'
,
},
labelCfg
:
{
style
:
{
cursor
:
"pointer"
,
cursor
:
"pointer"
,
radius
:
4
,
fill
:
"#333333"
,
fill
:
'#f6faff'
,
fontSize
:
15
,
stroke
:
'#B9DCFF'
,
fontWeight
:
"bold"
,
},
fontFamily
:
"Microsoft YaHei"
,
labelCfg
:
{
textAlign
:
"center"
,
style
:
{
cursor
:
"pointer"
,
fill
:
"#333333"
,
fontSize
:
15
,
fontWeight
:
"bold"
,
fontFamily
:
"Microsoft YaHei"
,
textAlign
:
"center"
,
}
}
}
}
},
defaultEdge
:
{
type
:
"line"
,
style
:
{
lineWidth
:
1
,
endArrow
:
true
,
},
},
defaultEdge
:
{
labelCfg
:
{
type
:
"line"
,
autoRotate
:
true
,
style
:
{
style
:
{
lineWidth
:
1
,
fontSize
:
14
,
endArrow
:
true
,
fontFamily
:
'Microsoft YaHei'
,
},
background
:
{
labelCfg
:
{
padding
:
[
6
,
4
,
4
,
4
],
autoRotate
:
true
,
style
:
{
fontSize
:
14
,
fontFamily
:
'Microsoft YaHei'
,
background
:
{
padding
:
[
6
,
4
,
4
,
4
],
}
}
}
}
}
},
}
layout
:
null
,
},
modes
:
{
default
:
[]
},
layout
:
null
,
fitView
:
false
,
modes
:
{
default
:
[]
},
});
fitView
:
false
,
});
graph
.
on
(
'node:click'
,
(
evt
)
=>
{
graph
.
on
(
'node:click'
,
(
evt
)
=>
{
let
node
=
siderList
.
value
.
find
(
item
=>
item
.
id
==
evt
.
item
.
_cfg
.
model
.
id
)
let
node
=
siderList
.
value
.
find
(
item
=>
item
.
id
==
evt
.
item
.
_cfg
.
model
.
id
)
if
(
node
)
handleClickDecree
(
node
)
if
(
node
)
handleClickDecree
(
node
)
});
});
}
}
// 加载数据并渲染
// 加载数据并渲染
graph
.
data
(
data
);
graph
.
data
(
data
);
graph
.
render
();
graph
.
render
();
}
}
onMounted
(()
=>
{
onMounted
(()
=>
{
...
...
src/views/decree/decreeLayout/influence/index.vue
浏览文件 @
4d409c10
...
@@ -75,7 +75,7 @@
...
@@ -75,7 +75,7 @@
<
/div
>
<
/div
>
<
/template
>
<
/template
>
<
div
class
=
"box2-main"
>
<
div
class
=
"box2-main"
>
<
AiTips
:
tips
=
"tips"
/
>
<
!--
<
AiTips
:
tips
=
"tips"
/>
--
>
<
div
class
=
"graph-box"
v
-
if
=
"contentType==1"
>
<
div
class
=
"graph-box"
v
-
if
=
"contentType==1"
>
<
ChartChain
:
listData
=
"fishbone.list"
:
baseData
=
"fishbone.base"
/>
<
ChartChain
:
listData
=
"fishbone.list"
:
baseData
=
"fishbone.base"
/>
<
/div
>
<
/div
>
...
...
src/views/decree/decreeLayout/overview/background/index.vue
浏览文件 @
4d409c10
...
@@ -46,7 +46,7 @@
...
@@ -46,7 +46,7 @@
<div
class=
"custom-collapse-title"
>
<div
class=
"custom-collapse-title"
>
<div
class=
"custom-collapse-index"
>
{{
index
+
1
}}
</div>
<div
class=
"custom-collapse-index"
>
{{
index
+
1
}}
</div>
<div
class=
"custom-collapse-name one-line-ellipsis"
>
<div
class=
"custom-collapse-name one-line-ellipsis"
>
<span
class=
"text-click-hover"
@
click
.
stop=
"handleClick
Decree
(item)"
>
{{
item
.
title
}}
</span>
<span
class=
"text-click-hover"
@
click
.
stop=
"handleClick
Bull
(item)"
>
{{
item
.
title
}}
</span>
</div>
</div>
</div>
</div>
</
template
>
</
template
>
...
@@ -73,9 +73,9 @@
...
@@ -73,9 +73,9 @@
<div
class=
"time-line-icon"
>
<div
class=
"time-line-icon"
>
<img
style=
"width: 100%; height: 100%;"
:src=
"item.orgImage || DefaultIcon1"
alt=
""
>
<img
style=
"width: 100%; height: 100%;"
:src=
"item.orgImage || DefaultIcon1"
alt=
""
>
</div>
</div>
<div
class=
"time-line-name"
@
click=
"handleToInstitution(item)"
>
{{ item.proposeOrgName }}
</div>
<div
class=
"time-line-name
text-click-hover
"
@
click=
"handleToInstitution(item)"
>
{{ item.proposeOrgName }}
</div>
</div>
</div>
<div
class=
"timeline-content"
>
{{ item.describe }}
</div>
<div
class=
"timeline-content"
@
click=
"handleClickDecree(item)"
>
{{ item.describe }}
</div>
</div>
</div>
</el-timeline-item>
</el-timeline-item>
</el-timeline>
</el-timeline>
...
@@ -167,15 +167,24 @@ const handleGetPrev = async () => {
...
@@ -167,15 +167,24 @@ const handleGetPrev = async () => {
};
};
// 跳转行政机构主页
// 跳转行政机构主页
const
handleToInstitution
=
item
=>
{
const
handleToInstitution
=
item
=>
{
window
.
sessionStorage
.
setItem
(
"curTabName"
,
item
.
proposeOrgName
);
const
curRoute
=
router
.
resolve
({
const
curRoute
=
router
.
resolve
({
path
:
"/institution"
,
path
:
"/institution"
,
query
:
{
query
:
{
id
:
item
.
i
d
id
:
item
.
orgI
d
}
}
});
});
window
.
open
(
curRoute
.
href
,
"_blank"
);
window
.
open
(
curRoute
.
href
,
"_blank"
);
};
};
// 跳转科技政令详情页
const
handleClickDecree
=
item
=>
{
const
route
=
router
.
resolve
({
path
:
"/decreeLayout"
,
query
:
{
id
:
item
.
id
}
});
window
.
open
(
route
.
href
,
"_blank"
);
};
// 法律依据
// 法律依据
const
dependList
=
ref
([]);
const
dependList
=
ref
([]);
...
@@ -186,7 +195,7 @@ const handleGetLaws = async () => {
...
@@ -186,7 +195,7 @@ const handleGetLaws = async () => {
console
.
log
(
"法律依据"
,
res
);
console
.
log
(
"法律依据"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
if
(
res
.
code
===
200
&&
res
.
data
)
{
dependList
.
value
=
res
.
data
;
dependList
.
value
=
res
.
data
;
dependActive
.
value
=
res
.
data
.
map
(
item
=>
item
.
billId
);
//
dependActive.value = res.data.map(item => item.billId);
}
else
{
}
else
{
dependList
.
value
=
[];
dependList
.
value
=
[];
}
}
...
@@ -196,7 +205,7 @@ const handleGetLaws = async () => {
...
@@ -196,7 +205,7 @@ const handleGetLaws = async () => {
}
}
};
};
// 跳转科技法案详情页
// 跳转科技法案详情页
const
handleClick
Decree
=
decree
=>
{
const
handleClick
Bull
=
decree
=>
{
window
.
sessionStorage
.
setItem
(
"billId"
,
decree
.
billId
);
window
.
sessionStorage
.
setItem
(
"billId"
,
decree
.
billId
);
window
.
sessionStorage
.
setItem
(
"curTabName"
,
decree
.
title
);
window
.
sessionStorage
.
setItem
(
"curTabName"
,
decree
.
title
);
const
route
=
router
.
resolve
({
const
route
=
router
.
resolve
({
...
@@ -414,7 +423,6 @@ onMounted(() => {
...
@@ -414,7 +423,6 @@ onMounted(() => {
.time-line-name
{
.time-line-name
{
color
:
rgba
(
59
,
65
,
75
,
1
);
color
:
rgba
(
59
,
65
,
75
,
1
);
font-size
:
15px
;
font-size
:
15px
;
cursor
:
pointer
;
}
}
}
}
...
@@ -445,6 +453,7 @@ onMounted(() => {
...
@@ -445,6 +453,7 @@ onMounted(() => {
font-size
:
16px
;
font-size
:
16px
;
font-weight
:
400
;
font-weight
:
400
;
line-height
:
26px
;
line-height
:
26px
;
cursor
:
pointer
;
}
}
}
}
}
}
...
...
src/views/decree/decreeLayout/overview/introduction/index.vue
浏览文件 @
4d409c10
...
@@ -83,7 +83,7 @@
...
@@ -83,7 +83,7 @@
<img
:src=
"item.imageUrl || DefaultIconNews"
alt=
""
/>
<img
:src=
"item.imageUrl || DefaultIconNews"
alt=
""
/>
</div>
</div>
<div
class=
"item-center"
>
<div
class=
"item-center"
>
<div
class=
"bubble-header"
@
click=
"
handleClickToNewsDetail(item
)"
>
<div
class=
"bubble-header"
@
click=
"
gotoNewsDetail(item.id
)"
>
<span
class=
"name"
>
{{ item.sjbt }}
</span>
<span
class=
"name"
>
{{ item.sjbt }}
</span>
<span
class=
"meta"
>
{{ item.sjsj }} · {{ item.source }}
</span>
<span
class=
"meta"
>
{{ item.sjsj }} · {{ item.source }}
</span>
</div>
</div>
...
@@ -177,6 +177,9 @@ import DefaultIcon1 from "@/assets/icons/default-icon1.png";
...
@@ -177,6 +177,9 @@ import DefaultIcon1 from "@/assets/icons/default-icon1.png";
import
DefaultIcon2
from
"@/assets/icons/default-icon2.png"
;
import
DefaultIcon2
from
"@/assets/icons/default-icon2.png"
;
import
DefaultIconNews
from
"@/assets/icons/default-icon-news.png"
;
import
DefaultIconNews
from
"@/assets/icons/default-icon-news.png"
;
import
{
useGotoNewsDetail
}
from
'@/router/modules/news'
;
const
gotoNewsDetail
=
useGotoNewsDetail
()
const
route
=
useRoute
();
const
route
=
useRoute
();
const
decreeId
=
ref
(
route
.
query
.
id
);
const
decreeId
=
ref
(
route
.
query
.
id
);
...
@@ -235,7 +238,7 @@ handleGetBasicInfo();
...
@@ -235,7 +238,7 @@ handleGetBasicInfo();
const
wordCloudData
=
ref
([])
const
wordCloudData
=
ref
([])
const
onKeyWordUp
=
async
()
=>
{
const
onKeyWordUp
=
async
()
=>
{
try
{
try
{
const
res
=
await
getKeyWordUp
();
const
res
=
await
getKeyWordUp
(
{
id
:
decreeId
.
value
}
);
console
.
log
(
"政令关键词云"
,
res
);
console
.
log
(
"政令关键词云"
,
res
);
wordCloudData
.
value
=
res
.
data
.
slice
(
0
,
10
).
map
(
item
=>
({
name
:
item
.
name
,
value
:
item
.
count
}));
wordCloudData
.
value
=
res
.
data
.
slice
(
0
,
10
).
map
(
item
=>
({
name
:
item
.
name
,
value
:
item
.
count
}));
}
catch
(
error
)
{
}
catch
(
error
)
{
...
@@ -271,15 +274,6 @@ const handleGetRelateEvents = async () => {
...
@@ -271,15 +274,6 @@ const handleGetRelateEvents = async () => {
console
.
error
(
"获取相关事件数据失败"
,
error
);
console
.
error
(
"获取相关事件数据失败"
,
error
);
}
}
};
};
const
handleClickToNewsDetail
=
news
=>
{
const
route
=
router
.
resolve
({
path
:
"/newsAnalysis"
,
query
:
{
newsId
:
news
.
id
}
});
window
.
open
(
route
.
href
,
"_blank"
);
};
// 发布机构
// 发布机构
const
box3TopTopData
=
ref
({
const
box3TopTopData
=
ref
({
...
@@ -476,7 +470,6 @@ onMounted(() => {
...
@@ -476,7 +470,6 @@ onMounted(() => {
font-weight
:
400
;
font-weight
:
400
;
font-size
:
16px
;
font-size
:
16px
;
line-height
:
30px
;
line-height
:
30px
;
min-height
:
300px
;
}
}
}
}
...
...
src/views/decree/decreeLayout/overview/measures/assets/images/edit-line.png
0 → 100644
浏览文件 @
4d409c10
270 Bytes
src/views/decree/decreeLayout/overview/measures/index.vue
浏览文件 @
4d409c10
...
@@ -3,6 +3,14 @@
...
@@ -3,6 +3,14 @@
<div
class=
"page-left"
>
<div
class=
"page-left"
>
<div
class=
"box1"
>
<div
class=
"box1"
>
<AnalysisBox
title=
"主要指令"
:showAllBtn=
"false"
>
<AnalysisBox
title=
"主要指令"
:showAllBtn=
"false"
>
<template
#
header-btn
>
<div
class=
"mind-bnt"
@
click=
"onDecreeMindMap()"
>
<div
class=
"mind-icon"
>
<img
src=
"./assets/images/edit-line.png"
alt=
""
>
</div>
<div
class=
"mind-text"
>
思维导图
</div>
</div>
</
template
>
<div
class=
"analysis-box"
>
<div
class=
"analysis-box"
>
<div
class=
"analysis-top"
>
<div
class=
"analysis-top"
>
<el-select
v-model=
"areaType"
:empty-values=
"[null, undefined]"
@
change=
"onMainContentData()"
style=
"width: 200px;"
>
<el-select
v-model=
"areaType"
:empty-values=
"[null, undefined]"
@
change=
"onMainContentData()"
style=
"width: 200px;"
>
...
@@ -92,7 +100,7 @@
...
@@ -92,7 +100,7 @@
</div>
</div>
</div>
</div>
</div>
</div>
<div
class=
"organization-button"
>
<div
class=
"organization-button"
@
click=
"handleClickToolBox()"
>
<div
class=
"button-text"
>
查看政令执行情况
</div>
<div
class=
"button-text"
>
查看政令执行情况
</div>
<el-icon
size=
"16"
><Right
/></el-icon>
<el-icon
size=
"16"
><Right
/></el-icon>
</div>
</div>
...
@@ -114,16 +122,29 @@
...
@@ -114,16 +122,29 @@
</AnalysisBox>
</AnalysisBox>
</div>
</div>
</div>
</div>
<el-dialog
v-model=
"isTreeDialog"
width=
"1540px"
top=
"8vh"
class=
"viewpoint-dialog"
destroy-on-close
>
<
template
#
header
>
<div
class=
"viewpoint-header"
>
<div
class=
"viewpoint-title"
>
政令举措思维导图
</div>
</div>
</
template
>
<div
class=
"viewpoint-body"
>
<MindGraph
ref=
"refMindGraph"
></MindGraph>
</div>
</el-dialog>
</div>
</div>
</template>
</template>
<
script
setup
>
<
script
setup
>
import
{
ref
,
onMounted
,
reactive
}
from
"vue"
;
import
{
ref
,
onMounted
,
reactive
}
from
"vue"
;
import
{
useRoute
}
from
"vue-router"
;
import
{
useRoute
}
from
"vue-router"
;
import
{
ElMessage
}
from
"element-plus"
;
import
router
from
"@/router"
;
import
router
from
"@/router"
;
import
{
Search
}
from
'@element-plus/icons-vue'
import
{
Search
}
from
'@element-plus/icons-vue'
import
MindGraph
from
"@/views/decree/com/MindGraph.vue"
import
{
getDecreeOrganization
}
from
"@/api/decree/introduction"
;
import
{
getDecreeOrganization
}
from
"@/api/decree/introduction"
;
import
{
getDecreeRelatedEntity
,
getDecreeMainContent
}
from
"@/api/decree/background"
;
import
{
getDecreeRelatedEntity
,
getDecreeMainContent
,
getDecreeMindMap
}
from
"@/api/decree/background"
;
import
{
getDecreehylyList
}
from
"@/api/decree/home"
;
import
{
getDecreehylyList
}
from
"@/api/decree/home"
;
import
ActionButton
from
'@/components/base/ActionButton/index.vue'
import
ActionButton
from
'@/components/base/ActionButton/index.vue'
import
DefaultIcon1
from
"@/assets/icons/default-icon1.png"
;
import
DefaultIcon1
from
"@/assets/icons/default-icon1.png"
;
...
@@ -132,6 +153,10 @@ import defaultCom from "@/views/coopRestriction/assets/images/default-icon2.png"
...
@@ -132,6 +153,10 @@ import defaultCom from "@/views/coopRestriction/assets/images/default-icon2.png"
const
route
=
useRoute
();
const
route
=
useRoute
();
const
handleClickToolBox
=
()
=>
{
ElMessage
.
warning
(
"当前功能正在开发中,敬请期待!"
);
};
// 科技领域
// 科技领域
const
areaType
=
ref
(
""
);
const
areaType
=
ref
(
""
);
const
areaList
=
ref
([]);
const
areaList
=
ref
([]);
...
@@ -272,6 +297,50 @@ const simpleNumToChinese = (num) => {
...
@@ -272,6 +297,50 @@ const simpleNumToChinese = (num) => {
}
}
}
}
// 思维导图
const
isTreeDialog
=
ref
(
false
);
const
refMindGraph
=
ref
(
null
);
const
onDecreeMindMap
=
async
()
=>
{
let
labelCfg
=
{
position
:
'left'
,
offset
:
-
20
,
style
:
{
fontWeight
:
"normal"
,
fontSize
:
16
,
textAlign
:
'left'
,
autoWrap
:
true
}
}
isTreeDialog
.
value
=
true
;
try
{
let
res
=
await
getDecreeMindMap
({
id
:
route
.
query
.
id
});
console
.
log
(
"思维导图"
,
res
);
if
(
res
.
code
===
200
)
{
let
nodes
=
[]
let
edges
=
[]
Object
.
keys
(
res
.
data
||
{}).
forEach
((
label
,
count
)
=>
{
nodes
.
push
({
id
:
`node-
${
count
}
`
,
label
})
})
Object
.
values
(
res
.
data
||
{}).
forEach
((
list
,
count
)
=>
{
list
.
forEach
((
item
,
index
)
=>
{
if
(
item
.
execAgent
?.
length
)
{
nodes
.
push
({
id
:
`node-
${
count
}
-
${
index
}
`
,
label
:
item
.
textZh
,
maxWidth
:
600
,
labelCfg
})
item
.
execAgent
.
forEach
((
label
,
num
)
=>
{
nodes
.
push
({
id
:
`node-
${
count
}
-
${
index
}
-
${
num
}
`
,
label
})
edges
.
push
({
id
:
`edge1-
${
count
}
-
${
index
}
-
${
num
}
`
,
source
:
`node-
${
count
}
-
${
index
}
-
${
num
}
`
,
target
:
`node-
${
count
}
-
${
index
}
`
})
edges
.
push
({
id
:
`edge2-
${
count
}
-
${
index
}
-
${
num
}
`
,
source
:
`node-
${
count
}
`
,
target
:
`node-
${
count
}
-
${
index
}
-
${
num
}
`
})
})
}
})
})
setTimeout
(()
=>
{
refMindGraph
.
value
.
onMindGraphData
(
nodes
,
edges
)
},
100
)
}
}
catch
(
error
)
{
console
.
error
(
"获取思维导图数据失败:"
,
error
);
}
}
// 相关实体
// 相关实体
const
entityList
=
ref
([]);
const
entityList
=
ref
([]);
const
onRelatedEntityData
=
async
()
=>
{
const
onRelatedEntityData
=
async
()
=>
{
...
@@ -359,6 +428,31 @@ onMounted(() => {
...
@@ -359,6 +428,31 @@ onMounted(() => {
flex
:
auto
;
flex
:
auto
;
.box1
{
.box1
{
.mind-bnt
{
background-color
:
var
(
--
color-primary-10
);
height
:
28px
;
border-radius
:
14px
;
display
:
flex
;
align-items
:
center
;
padding
:
0
16px
;
cursor
:
pointer
;
.mind-icon
{
width
:
16px
;
height
:
13px
;
font-size
:
0px
;
img
{
width
:
100%
;
height
:
100%
;
}
}
.mind-text
{
color
:
var
(
--
color-primary-100
);
font-family
:
Source
Han
Sans
CN
;
font-size
:
16px
;
line-height
:
16px
;
margin-left
:
6px
;
}
}
.analysis-box
{
.analysis-box
{
display
:
flex
;
display
:
flex
;
...
@@ -776,5 +870,42 @@ onMounted(() => {
...
@@ -776,5 +870,42 @@ onMounted(() => {
}
}
}
}
}
}
// 修改element-plus弹出框样式
:deep
(
.viewpoint-dialog
)
{
padding
:
0
;
border-radius
:
4px
;
.el-dialog__body
{
padding
:
0
;
}
.el-dialog__header
{
padding
:
0
;
margin
:
0
;
position
:
relative
;
height
:
48px
;
}
.el-dialog__headerbtn
{
top
:
50%
;
transform
:
translateY
(
-50%
);
right
:
12px
;
}
.viewpoint-header
{
height
:
48px
;
display
:
flex
;
align-items
:
center
;
padding
:
0
24px
;
border-bottom
:
1px
solid
rgb
(
234
,
236
,
238
);
}
.viewpoint-title
{
font-size
:
16px
;
font-weight
:
700
;
font-family
:
"Microsoft YaHei"
;
line-height
:
24px
;
}
.viewpoint-body
{
padding
:
16px
;
height
:
77vh
;
}
}
}
}
</
style
>
</
style
>
\ No newline at end of file
vite.config.js
浏览文件 @
4d409c10
...
@@ -53,8 +53,9 @@ export default defineConfig({
...
@@ -53,8 +53,9 @@ export default defineConfig({
rewrite
:
(
path
)
=>
path
.
replace
(
/^
\/
reportData/
,
''
)
rewrite
:
(
path
)
=>
path
.
replace
(
/^
\/
reportData/
,
''
)
},
},
'/api'
:
{
'/api'
:
{
target
:
'http://8.140.26.4:9085/'
,
target
:
'http://8.140.26.4:9085/'
,
// target: 'http://192.168.0.4:28080/',
changeOrigin
:
true
,
changeOrigin
:
true
,
rewrite
:
(
path
)
=>
path
.
replace
(
/^
\/
api/
,
''
)
rewrite
:
(
path
)
=>
path
.
replace
(
/^
\/
api/
,
''
)
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论