Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
D
dataease
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
zhu
dataease
Commits
8f2f6f16
提交
8f2f6f16
authored
7月 05, 2021
作者:
fit2cloud-chenyw
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat: 完善分享消息
上级
0baff3bf
隐藏空白字符变更
内嵌
并排
正在显示
16 个修改的文件
包含
285 行增加
和
11 行删除
+285
-11
ShiroServiceImpl.java
.../java/io/dataease/auth/service/impl/ShiroServiceImpl.java
+4
-0
ExtPanelShareMapper.java
...java/io/dataease/base/mapper/ext/ExtPanelShareMapper.java
+2
-0
ExtPanelShareMapper.xml
.../java/io/dataease/base/mapper/ext/ExtPanelShareMapper.xml
+8
-0
ShareApi.java
.../main/java/io/dataease/controller/panel/api/ShareApi.java
+5
-0
ShareServer.java
...java/io/dataease/controller/panel/server/ShareServer.java
+8
-0
PanelShareFineDto.java
.../dataease/controller/request/panel/PanelShareFineDto.java
+18
-0
ShareService.java
...src/main/java/io/dataease/service/panel/ShareService.java
+174
-0
share.js
frontend/src/api/panel/share.js
+9
-0
msg.js
frontend/src/api/system/msg.js
+1
-1
index.vue
frontend/src/components/Notification/index.vue
+12
-5
permission.js
frontend/src/permission.js
+1
-1
index.vue
frontend/src/views/panel/GrantAuth/dept/index.vue
+6
-0
index.vue
frontend/src/views/panel/GrantAuth/index.vue
+22
-2
index.vue
frontend/src/views/panel/GrantAuth/role/index.vue
+7
-0
index.vue
frontend/src/views/panel/GrantAuth/user/index.vue
+6
-0
DsTree.vue
frontend/src/views/system/datasource/DsTree.vue
+2
-2
没有找到文件。
backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java
浏览文件 @
8f2f6f16
...
...
@@ -46,6 +46,10 @@ public class ShiroServiceImpl implements ShiroService {
filterChainDefinitionMap
.
put
(
"/system/ui/**"
,
ANON
);
filterChainDefinitionMap
.
put
(
"/**/*.js"
,
ANON
);
filterChainDefinitionMap
.
put
(
"/**/*.css"
,
ANON
);
filterChainDefinitionMap
.
put
(
"/**/*.map"
,
ANON
);
// filterChainDefinitionMap.put("/axios.map", ANON);
filterChainDefinitionMap
.
put
(
"/api/auth/login"
,
ANON
);
filterChainDefinitionMap
.
put
(
"/api/auth/logout"
,
ANON
);
...
...
backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelShareMapper.java
浏览文件 @
8f2f6f16
...
...
@@ -12,6 +12,8 @@ public interface ExtPanelShareMapper {
int
batchInsert
(
@Param
(
"shares"
)
List
<
PanelShare
>
shares
);
int
batchDelete
(
@Param
(
"shareIds"
)
List
<
Long
>
shareIds
);
List
<
PanelSharePo
>
query
(
Map
<
String
,
Object
>
param
);
List
<
PanelShare
>
queryWithResource
(
GridExample
example
);
...
...
backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelShareMapper.xml
浏览文件 @
8f2f6f16
...
...
@@ -16,6 +16,14 @@
</foreach>
</insert>
<delete
id=
"batchDelete"
parameterType=
"java.lang.Long"
>
delete from panel_share
where share_id in
<foreach
collection=
"shareIds"
item=
"shareId"
open=
"("
separator=
","
close=
")"
>
#{shareId}
</foreach>
</delete>
<select
id=
"query"
resultMap=
"treeNodeMap"
>
select distinct s.panel_group_id as id, g.create_by as creator, g.name
from panel_share s
...
...
backend/src/main/java/io/dataease/controller/panel/api/ShareApi.java
浏览文件 @
8f2f6f16
package
io
.
dataease
.
controller
.
panel
.
api
;
import
io.dataease.base.domain.PanelShare
;
import
io.dataease.controller.request.panel.PanelShareFineDto
;
import
io.dataease.controller.request.panel.PanelShareRequest
;
import
io.dataease.controller.sys.base.BaseGridRequest
;
import
io.dataease.dto.panel.PanelShareDto
;
...
...
@@ -31,5 +32,9 @@ public interface ShareApi {
@PostMapping
(
"/queryWithResourceId"
)
List
<
PanelShare
>
queryWithResourceId
(
BaseGridRequest
request
);
@ApiOperation
(
"优化创建分享"
)
@PostMapping
(
"/fineSave"
)
void
fineSave
(
PanelShareFineDto
panelShareFineDto
);
}
backend/src/main/java/io/dataease/controller/panel/server/ShareServer.java
浏览文件 @
8f2f6f16
...
...
@@ -2,6 +2,7 @@ package io.dataease.controller.panel.server;
import
io.dataease.base.domain.PanelShare
;
import
io.dataease.controller.panel.api.ShareApi
;
import
io.dataease.controller.request.panel.PanelShareFineDto
;
import
io.dataease.controller.request.panel.PanelShareRequest
;
import
io.dataease.controller.sys.base.BaseGridRequest
;
import
io.dataease.dto.panel.PanelShareDto
;
...
...
@@ -32,4 +33,11 @@ public class ShareServer implements ShareApi {
public
List
<
PanelShare
>
queryWithResourceId
(
@RequestBody
BaseGridRequest
request
)
{
return
shareService
.
queryWithResource
(
request
);
}
@Override
public
void
fineSave
(
@RequestBody
PanelShareFineDto
panelShareFineDto
)
{
shareService
.
fineSave
(
panelShareFineDto
);
}
}
backend/src/main/java/io/dataease/controller/request/panel/PanelShareFineDto.java
0 → 100644
浏览文件 @
8f2f6f16
package
io
.
dataease
.
controller
.
request
.
panel
;
import
io.dataease.commons.model.AuthURD
;
import
lombok.Data
;
import
java.io.Serializable
;
@Data
public
class
PanelShareFineDto
implements
Serializable
{
private
static
final
long
serialVersionUID
=
-
792964171742204428L
;
private
String
resourceId
;
private
AuthURD
authURD
;
}
backend/src/main/java/io/dataease/service/panel/ShareService.java
浏览文件 @
8f2f6f16
...
...
@@ -14,12 +14,15 @@ import io.dataease.commons.model.AuthURD;
import
io.dataease.commons.utils.AuthUtils
;
import
io.dataease.commons.utils.BeanUtils
;
import
io.dataease.commons.utils.CommonBeanFactory
;
import
io.dataease.controller.request.panel.PanelShareFineDto
;
import
io.dataease.controller.request.panel.PanelShareRequest
;
import
io.dataease.controller.sys.base.BaseGridRequest
;
import
io.dataease.dto.panel.PanelShareDto
;
import
io.dataease.dto.panel.PanelSharePo
;
import
io.dataease.service.message.DeMsgutil
;
import
lombok.Data
;
import
org.apache.commons.collections.CollectionUtils
;
import
org.apache.commons.lang3.ObjectUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
...
...
@@ -27,6 +30,7 @@ import org.springframework.transaction.annotation.Transactional;
import
javax.annotation.Resource
;
import
java.util.*
;
import
java.util.stream.Collectors
;
import
java.util.stream.Stream
;
@Service
...
...
@@ -41,6 +45,176 @@ public class ShareService {
@Resource
private
ExtPanelShareMapper
extPanelShareMapper
;
/**
* 1.查询当前节点已经分享给了哪些目标
* 2.过滤出新增的目标
* 3.过滤出减少的目标
* 4.批量删除
* 5.批量新增
* 6.发送取消分享消息
* 7.发送新增分享消息
* @param panelShareFineDto
*/
@Transactional
public
void
fineSave
(
PanelShareFineDto
panelShareFineDto
)
{
List
<
PanelShare
>
addShares
=
new
ArrayList
<>();
//新增的分享
List
<
Long
>
redShareIdLists
=
new
ArrayList
<>();
//取消的分享
String
panelGroupId
=
panelShareFineDto
.
getResourceId
();
AuthURD
authURD
=
panelShareFineDto
.
getAuthURD
();
AuthURD
sharedAuthURD
=
new
AuthURD
();
AuthURD
addAuthURD
=
new
AuthURD
();
Map
<
Integer
,
List
<
Long
>>
authURDMap
=
new
HashMap
<>();
authURDMap
.
put
(
0
,
authURD
.
getUserIds
());
authURDMap
.
put
(
1
,
authURD
.
getRoleIds
());
authURDMap
.
put
(
2
,
authURD
.
getDeptIds
());
PanelShareExample
example
=
new
PanelShareExample
();
example
.
createCriteria
().
andPanelGroupIdEqualTo
(
panelGroupId
);
List
<
PanelShare
>
panelShares
=
mapper
.
selectByExample
(
example
);
/*if (CollectionUtils.isEmpty(panelShares)) {
return;
}*/
Map
<
Integer
,
List
<
TempShareNode
>>
typeSharedMap
=
panelShares
.
stream
().
map
(
this
::
convertNode
).
collect
(
Collectors
.
groupingBy
(
TempShareNode:
:
getType
));
for
(
Map
.
Entry
<
Integer
,
List
<
Long
>>
entry
:
authURDMap
.
entrySet
())
{
Integer
key
=
entry
.
getKey
();
List
<
TempShareNode
>
shareNodes
=
null
;
if
(
null
==
typeSharedMap
||
null
==
typeSharedMap
.
get
(
key
))
{
shareNodes
=
new
ArrayList
<>();
}
else
{
shareNodes
=
typeSharedMap
.
get
(
key
);
}
if
(
null
!=
authURDMap
.
get
(
key
))
{
Map
<
String
,
Object
>
dataMap
=
filterData
(
authURDMap
.
get
(
key
),
shareNodes
);
List
<
Long
>
newIds
=
(
List
<
Long
>)
dataMap
.
get
(
"add"
);
for
(
int
i
=
0
;
i
<
newIds
.
size
();
i
++)
{
Long
id
=
newIds
.
get
(
i
);
PanelShare
share
=
new
PanelShare
();
share
.
setCreateTime
(
System
.
currentTimeMillis
());
share
.
setPanelGroupId
(
panelGroupId
);
share
.
setTargetId
(
id
);
share
.
setType
(
key
);
addShares
.
add
(
share
);
}
List
<
TempShareNode
>
redNodes
=
(
List
<
TempShareNode
>)
dataMap
.
get
(
"red"
);
List
<
Long
>
redIds
=
redNodes
.
stream
().
map
(
TempShareNode:
:
getShareId
).
distinct
().
collect
(
Collectors
.
toList
());
redShareIdLists
.
addAll
(
redIds
);
buildRedAuthURD
(
key
,
redNodes
.
stream
().
map
(
TempShareNode:
:
getTargetId
).
distinct
().
collect
(
Collectors
.
toList
())
,
sharedAuthURD
);
buildRedAuthURD
(
key
,
newIds
,
addAuthURD
);
}
}
if
(
CollectionUtils
.
isNotEmpty
(
redShareIdLists
)){
extPanelShareMapper
.
batchDelete
(
redShareIdLists
);
}
if
(
CollectionUtils
.
isNotEmpty
(
addShares
)){
extPanelShareMapper
.
batchInsert
(
addShares
);
}
// 以上是业务代码
// 下面是消息发送
Set
<
Long
>
addUserIdSet
=
AuthUtils
.
userIdsByURD
(
addAuthURD
);
Set
<
Long
>
redUserIdSet
=
AuthUtils
.
userIdsByURD
(
sharedAuthURD
);
PanelGroup
panelGroup
=
panelGroupMapper
.
selectByPrimaryKey
(
panelGroupId
);;
CurrentUserDto
user
=
AuthUtils
.
getUser
();
Gson
gson
=
new
Gson
();
String
msg
=
panelGroup
.
getName
();
List
<
String
>
msgParam
=
new
ArrayList
<
String
>();
msgParam
.
add
(
panelGroupId
);
addUserIdSet
.
forEach
(
userId
->
{
if
(!
redUserIdSet
.
contains
(
userId
)){
DeMsgutil
.
sendMsg
(
userId
,
0
,
user
.
getNickName
()+
" 分享了仪表板【"
+
msg
+
"】,请查收!"
,
gson
.
toJson
(
msgParam
));
}
});
redUserIdSet
.
forEach
(
userId
->
{
if
(!
addUserIdSet
.
contains
(
userId
)){
DeMsgutil
.
sendMsg
(
userId
,
0
,
user
.
getNickName
()+
" 取消分享了仪表板【"
+
msg
+
"】,请查收!"
,
gson
.
toJson
(
msgParam
));
}
});
}
private
void
buildRedAuthURD
(
Integer
type
,
List
<
Long
>
redIds
,
AuthURD
authURD
)
{
if
(
type
==
0
)
{
authURD
.
setUserIds
(
redIds
);
}
if
(
type
==
1
)
{
authURD
.
setRoleIds
(
redIds
);
}
if
(
type
==
2
)
{
authURD
.
setDeptIds
(
redIds
);
}
}
/**
*
* @param newTargets 新的分享目标
* @param shareNodes 已景分享目标
* @return
*/
private
Map
<
String
,
Object
>
filterData
(
List
<
Long
>
newTargets
,
List
<
TempShareNode
>
shareNodes
)
{
Map
<
String
,
Object
>
result
=
new
HashMap
<>();
/*if (null == newTargets) {
result.put("add", new ArrayList<>());
result.put("red", new ArrayList<>());
return result;
}*/
List
<
Long
>
newUserIds
=
new
ArrayList
<>();
for
(
int
i
=
0
;
i
<
newTargets
.
size
();
i
++)
{
Long
newTargetId
=
newTargets
.
get
(
i
);
Boolean
isNew
=
true
;
for
(
int
j
=
0
;
j
<
shareNodes
.
size
();
j
++)
{
TempShareNode
shareNode
=
shareNodes
.
get
(
j
);
Long
sharedId
=
shareNode
.
getTargetId
();
if
(
newTargetId
==
sharedId
)
{
shareNode
.
setMatched
(
true
);
// 已分享 重新命中
isNew
=
false
;
}
}
if
(
isNew
)
{
// 获取新增的
newUserIds
.
add
(
newTargetId
);
}
}
//获取需要取消分享的
List
<
TempShareNode
>
missNodes
=
shareNodes
.
stream
().
filter
(
item
->
!
item
.
getMatched
()).
collect
(
Collectors
.
toList
());
result
.
put
(
"add"
,
newUserIds
);
result
.
put
(
"red"
,
missNodes
);
return
result
;
}
@Data
private
class
TempShareNode
{
private
Long
shareId
;
private
Integer
type
;
private
Long
targetId
;
private
Boolean
matched
=
false
;
public
boolean
targetMatch
(
Long
tid
)
{
return
targetId
==
tid
;
}
}
private
TempShareNode
convertNode
(
PanelShare
panelShare
)
{
return
BeanUtils
.
copyBean
(
new
TempShareNode
(),
panelShare
);
}
@Transactional
public
void
save
(
PanelShareRequest
request
){
List
<
PanelGroup
>
panelGroups
=
queryGroup
(
request
.
getPanelIds
());
...
...
frontend/src/api/panel/share.js
浏览文件 @
8f2f6f16
...
...
@@ -27,3 +27,12 @@ export function loadTree(data) {
})
}
export
function
fineSave
(
data
)
{
return
request
({
url
:
'/api/share/fineSave'
,
method
:
'post'
,
loading
:
true
,
data
})
}
frontend/src/api/system/msg.js
浏览文件 @
8f2f6f16
...
...
@@ -4,7 +4,7 @@ export function query(pageIndex, pageSize, data) {
return
request
({
url
:
'/api/sys_msg/list/'
+
pageIndex
+
'/'
+
pageSize
,
method
:
'post'
,
loading
:
tru
e
,
loading
:
fals
e
,
data
})
}
...
...
frontend/src/components/Notification/index.vue
浏览文件 @
8f2f6f16
...
...
@@ -73,7 +73,8 @@ export default {
currentPage
:
1
,
pageSize
:
5
,
total
:
0
}
},
timer
:
null
}
},
computed
:
{
...
...
@@ -82,14 +83,20 @@ export default {
created
()
{
this
.
search
()
// 每30s定时刷新拉取消息
setInterval
(()
=>
{
this
.
timer
=
setInterval
(()
=>
{
this
.
search
()
},
30000
)
},
beforeDestroy
()
{
this
.
timer
&&
clearInterval
(
this
.
timer
)
},
destroyed
()
{
this
.
timer
&&
clearInterval
(
this
.
timer
)
},
methods
:
{
handClick
(
lang
)
{
console
.
log
(
lang
)
},
//
handClick(lang) {
//
console.log(lang)
//
},
showDetail
(
row
)
{
const
param
=
{
...{
msgNotification
:
true
,
msgType
:
row
.
type
,
sourceParam
:
row
.
param
}}
this
.
visible
=
false
...
...
frontend/src/permission.js
浏览文件 @
8f2f6f16
...
...
@@ -76,7 +76,7 @@ export const loadMenus = (next, to) => {
buildMenus
().
then
(
res
=>
{
const
filterDatas
=
filterRouter
(
res
.
data
)
const
asyncRouter
=
filterAsyncRouter
(
filterDatas
)
addMsgMenu
(
asyncRouter
)
//
addMsgMenu(asyncRouter)
asyncRouter
.
push
({
path
:
'*'
,
redirect
:
'/404'
,
hidden
:
true
})
store
.
dispatch
(
'permission/GenerateRoutes'
,
asyncRouter
).
then
(()
=>
{
// 存储路由
router
.
addRoutes
(
asyncRouter
)
...
...
frontend/src/views/panel/GrantAuth/dept/index.vue
浏览文件 @
8f2f6f16
...
...
@@ -158,6 +158,12 @@ export default {
return
roots
},
getSelected
()
{
return
{
deptIds
:
this
.
$refs
.
table
.
store
.
states
.
selection
.
map
(
item
=>
item
.
deptId
)
}
},
save
(
msg
)
{
const
rows
=
this
.
$refs
.
table
.
store
.
states
.
selection
const
request
=
this
.
buildRequest
(
rows
)
...
...
frontend/src/views/panel/GrantAuth/index.vue
浏览文件 @
8f2f6f16
...
...
@@ -26,6 +26,7 @@
import
GrantDept
from
'./dept'
import
GrantRole
from
'./role'
import
GrantUser
from
'./user'
import
{
fineSave
}
from
'@/api/panel/share'
export
default
{
name
:
'GrantAuth'
,
components
:
{
GrantDept
,
GrantRole
,
GrantUser
},
...
...
@@ -58,8 +59,27 @@ export default {
this
.
showSearchInput
=
false
},
save
()
{
this
.
$refs
[
this
.
activeName
].
save
(
this
.
$t
(
'commons.share_success'
))
this
.
$emit
(
'close-grant'
,
0
)
// this.$refs[this.activeName].save(this.$t('commons.share_success'))
// this.$emit('close-grant', 0)
this
.
fineSave
()
},
fineSave
()
{
let
targetDto
=
{}
this
.
tabNames
.
forEach
(
tabName
=>
{
if
(
this
.
$refs
[
tabName
]
&&
this
.
$refs
[
tabName
].
getSelected
)
{
const
tempSelected
=
this
.
$refs
[
tabName
].
getSelected
()
targetDto
=
Object
.
assign
({},
targetDto
,
tempSelected
)
}
})
const
resourceId
=
this
.
resourceId
const
param
=
{
resourceId
,
authURD
:
targetDto
}
fineSave
(
param
).
then
(
res
=>
{
this
.
$success
(
this
.
$t
(
'commons.share_success'
))
this
.
$emit
(
'close-grant'
,
0
)
})
},
cancel
()
{
this
.
$refs
[
this
.
activeName
].
cancel
()
...
...
frontend/src/views/panel/GrantAuth/role/index.vue
浏览文件 @
8f2f6f16
...
...
@@ -78,6 +78,13 @@ export default {
this
.
setCheckNodes
()
})
},
getSelected
()
{
return
{
roleIds
:
this
.
$refs
.
table
.
store
.
states
.
selection
.
map
(
item
=>
item
.
roleId
)
}
},
save
(
msg
)
{
const
rows
=
this
.
$refs
.
table
.
store
.
states
.
selection
const
request
=
this
.
buildRequest
(
rows
)
...
...
frontend/src/views/panel/GrantAuth/user/index.vue
浏览文件 @
8f2f6f16
...
...
@@ -86,6 +86,12 @@ export default {
})
},
getSelected
()
{
return
{
userIds
:
this
.
$refs
.
table
.
store
.
states
.
selection
.
map
(
item
=>
item
.
userId
)
}
},
save
(
msg
)
{
const
rows
=
this
.
$refs
.
table
.
store
.
states
.
selection
const
request
=
this
.
buildRequest
(
rows
)
...
...
frontend/src/views/system/datasource/DsTree.vue
浏览文件 @
8f2f6f16
...
...
@@ -114,7 +114,7 @@ export default {
},
mounted
()
{
this
.
queryTreeDatas
()
console
.
log
(
'permis:'
+
JSON
.
stringify
(
this
.
$store
.
getters
.
permissions
))
//
console.log('permis:' + JSON.stringify(this.$store.getters.permissions))
},
methods
:
{
filterNode
(
value
,
data
)
{
...
...
@@ -154,7 +154,7 @@ export default {
return
'MySQL'
}
else
if
(
type
===
'sqlServer'
)
{
return
'SQL Server'
}
else
if
(
type
===
'oracle'
)
{
}
else
if
(
type
===
'oracle'
)
{
return
'Oracle'
}
},
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论