Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
D
dataease
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
zhu
dataease
Commits
769b7bc2
提交
769b7bc2
authored
2月 14, 2022
作者:
wangjiahao
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat: 视图归属于仪表板,去掉视图菜单
上级
ecf1be44
隐藏空白字符变更
内嵌
并排
正在显示
22 个修改的文件
包含
519 行增加
和
149 行删除
+519
-149
ExtChartViewMapper.java
.../java/io/dataease/base/mapper/ext/ExtChartViewMapper.java
+1
-1
ExtChartViewMapper.xml
...n/java/io/dataease/base/mapper/ext/ExtChartViewMapper.xml
+5
-3
ExtPanelGroupMapper.java
...java/io/dataease/base/mapper/ext/ExtPanelGroupMapper.java
+2
-0
ExtPanelGroupMapper.xml
.../java/io/dataease/base/mapper/ext/ExtPanelGroupMapper.xml
+17
-0
ExtVAuthModelMapper.java
...java/io/dataease/base/mapper/ext/ExtVAuthModelMapper.java
+4
-1
ExtVAuthModelMapper.xml
.../java/io/dataease/base/mapper/ext/ExtVAuthModelMapper.xml
+167
-98
TreeUtils.java
...nd/src/main/java/io/dataease/commons/utils/TreeUtils.java
+4
-0
ChartViewController.java
...ava/io/dataease/controller/chart/ChartViewController.java
+3
-3
PanelGroupController.java
...va/io/dataease/controller/panel/PanelGroupController.java
+7
-0
VAuthModelRequest.java
...aease/controller/request/authModel/VAuthModelRequest.java
+6
-0
VAuthModelDTO.java
...rc/main/java/io/dataease/dto/authModel/VAuthModelDTO.java
+8
-0
ChartViewService.java
...main/java/io/dataease/service/chart/ChartViewService.java
+2
-2
PanelGroupService.java
...ain/java/io/dataease/service/panel/PanelGroupService.java
+39
-1
V32__1.8.sql
backend/src/main/resources/db/migration/V32__1.8.sql
+198
-2
messages_en_US.properties
backend/src/main/resources/i18n/messages_en_US.properties
+2
-2
messages_zh_CN.properties
backend/src/main/resources/i18n/messages_zh_CN.properties
+1
-0
messages_zh_TW.properties
backend/src/main/resources/i18n/messages_zh_TW.properties
+1
-0
chart.js
frontend/src/api/chart/chart.js
+3
-3
panel.js
frontend/src/api/panel/panel.js
+8
-0
copy.js
frontend/src/components/canvas/store/copy.js
+1
-1
index.vue
frontend/src/views/panel/ViewSelect/index.vue
+11
-28
index.vue
frontend/src/views/panel/edit/index.vue
+29
-4
没有找到文件。
backend/src/main/java/io/dataease/base/mapper/ext/ExtChartViewMapper.java
浏览文件 @
769b7bc2
...
...
@@ -14,7 +14,7 @@ public interface ExtChartViewMapper {
ChartViewDTO
searchOne
(
ChartViewRequest
request
);
void
chartCopy
(
@Param
(
"newChartId"
)
String
newChartId
,
@Param
(
"oldChartId"
)
String
oldChartId
);
void
chartCopy
(
@Param
(
"newChartId"
)
String
newChartId
,
@Param
(
"oldChartId"
)
String
oldChartId
,
@Param
(
"panelId"
)
String
panelId
);
@Select
(
"select id from chart_view where table_id = #{tableId}"
)
List
<
String
>
allViewIds
(
@Param
(
"tableId"
)
String
tableId
);
...
...
backend/src/main/java/io/dataease/base/mapper/ext/ExtChartViewMapper.xml
浏览文件 @
769b7bc2
...
...
@@ -109,11 +109,12 @@
`y_axis_ext`,
`render`,
`result_count`,
`result_mode`
`result_mode`,
`chart_type`
) SELECT
#{newChartId},
GET_CHART_VIEW_COPY_NAME ( #{oldChartId} ),
`scene_id`
,
#{panelId}
,
`table_id`,
`type`,
GET_CHART_VIEW_COPY_NAME ( #{oldChartId} ),
...
...
@@ -133,7 +134,8 @@
`y_axis_ext`,
`render`,
`result_count`,
`result_mode`
`result_mode`,
'private'
FROM
chart_view
WHERE
...
...
backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelGroupMapper.java
浏览文件 @
769b7bc2
...
...
@@ -19,5 +19,7 @@ public interface ExtPanelGroupMapper {
void
copyPanelView
(
@Param
(
"pid"
)
String
panelId
);
//移除未使用的视图
void
removeUselessViews
(
@Param
(
"panelId"
)
String
panelId
);
}
backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelGroupMapper.xml
浏览文件 @
769b7bc2
...
...
@@ -178,4 +178,21 @@
panel_id = #{panelId}
</insert>
<delete
id=
"removeUselessViews"
>
DELETE
FROM
chart_view
WHERE
chart_view.chart_type = 'private'
AND chart_view.scene_id = #{panelId}
AND id NOT IN (
SELECT
panel_view.chart_view_id
FROM
panel_view
WHERE
panel_view.panel_id = #{panelId}
)
</delete>
</mapper>
backend/src/main/java/io/dataease/base/mapper/ext/ExtVAuthModelMapper.java
浏览文件 @
769b7bc2
...
...
@@ -8,6 +8,9 @@ import java.util.List;
public
interface
ExtVAuthModelMapper
{
List
<
VAuthModelDTO
>
queryAuthModel
(
@Param
(
"record"
)
VAuthModelRequest
record
);
List
<
VAuthModelDTO
>
queryAuthModel
(
@Param
(
"record"
)
VAuthModelRequest
record
);
List
<
VAuthModelDTO
>
queryAuthModelViews
(
@Param
(
"record"
)
VAuthModelRequest
record
);
List
<
VAuthModelDTO
>
queryAuthViewsOriginal
(
@Param
(
"record"
)
VAuthModelRequest
record
);
}
backend/src/main/java/io/dataease/base/mapper/ext/ExtVAuthModelMapper.xml
浏览文件 @
769b7bc2
...
...
@@ -4,106 +4,175 @@
<resultMap
extends=
"io.dataease.base.mapper.VAuthModelMapper.ResultMapWithBLOBs"
id=
"ExtResultMap"
type=
"io.dataease.dto.authModel.VAuthModelDTO"
>
<result
column=
"privileges"
jdbcType=
"VARCHAR"
property=
"privileges"
/>
<result
column=
"inner_id"
jdbcType=
"VARCHAR"
property=
"innerId"
/>
</resultMap>
<select
id=
"queryAuthModel"
resultMap=
"ExtResultMap"
>
SELECT
v_auth_model.id,
v_auth_model.name,
v_auth_model.label,
v_auth_model.pid,
v_auth_model.node_type,
v_auth_model.model_type,
v_auth_model.model_inner_type,
v_auth_model.auth_type,
v_auth_model.create_by,
v_auth_model.level,
v_auth_model.mode,
v_auth_model.data_source_id,
authInfo.PRIVILEGES AS `privileges`
FROM
( SELECT GET_V_AUTH_MODEL_ID_P_USE ( #{record.userId}, #{record.modelType} ) cids ) t,
v_auth_model
LEFT JOIN (
SELECT
auth_source,
group_concat( DISTINCT sys_auth_detail.privilege_extend ) AS `privileges`
FROM
(
`sys_auth`
LEFT JOIN `sys_auth_detail` ON ((
`sys_auth`.`id` = `sys_auth_detail`.`auth_id`
)))
WHERE
sys_auth_detail.privilege_value = 1
AND sys_auth.auth_source_type = #{record.modelType}
AND (
(
sys_auth.auth_target_type = 'dept'
AND sys_auth.auth_target IN ( SELECT dept_id FROM sys_user WHERE user_id = #{record.userId} )
)
OR (
sys_auth.auth_target_type = 'user'
AND sys_auth.auth_target = #{record.userId}
)
OR (
sys_auth.auth_target_type = 'role'
AND sys_auth.auth_target IN ( SELECT role_id FROM sys_users_roles WHERE user_id = #{record.userId} )
)
)
GROUP BY
`sys_auth`.`auth_source`
) authInfo ON v_auth_model.id = authInfo.auth_source
WHERE
FIND_IN_SET( v_auth_model.id, cids )
<if
test=
"record.id != null"
>
and v_auth_model.id = #{record.id,jdbcType=VARCHAR}
</if>
<if
test=
"record.pid != null"
>
and v_auth_model.pid = #{record.pid,jdbcType=VARCHAR}
</if>
<if
test=
"record.nodeType != null"
>
and v_auth_model.node_type = #{record.nodeType,jdbcType=VARCHAR}
</if>
<if
test=
"record.modelType != null"
>
and v_auth_model.model_type = #{record.modelType,jdbcType=VARCHAR}
</if>
<if
test=
"record.modelInnerType != null"
>
and v_auth_model.model_inner_type = #{record.modelInnerType,jdbcType=VARCHAR}
</if>
<if
test=
"record.authType != null"
>
and v_auth_model.auth_type = #{record.authType,jdbcType=VARCHAR}
</if>
<if
test=
"record.createBy != null"
>
and v_auth_model.create_by = #{record.createBy,jdbcType=VARCHAR}
</if>
<if
test=
"record.level != null"
>
and v_auth_model.`level` = #{record.level,jdbcType=BIGINT}
</if>
<if
test=
"record.mode != null"
>
<if
test=
"record.mode == 0"
>
and v_auth_model.`mode` = 0
</if>
<if
test=
'record.mode == 1 and record.modelType != null and record.modelType == "dataset"'
>
and (v_auth_model.`mode` = 1 or (v_auth_model.`model_inner_type` = 'group' and v_auth_model.model_type = 'dataset'))
</if>
</if>
<if
test=
"record.dataSourceId != null"
>
and v_auth_model.data_source_id = #{record.dataSourceId,jdbcType=VARCHAR}
</if>
<if
test=
"record.name != null"
>
and v_auth_model.`name` = #{record.name,jdbcType=LONGVARCHAR}
</if>
<if
test=
"record.label != null"
>
and v_auth_model.`label` = #{record.label,jdbcType=LONGVARCHAR}
</if>
<if
test=
"record.modelInnerTypeArray != null and record.modelInnerTypeArray.size() > 0"
>
and v_auth_model.model_inner_type in
<foreach
collection=
"record.modelInnerTypeArray"
item=
"item"
separator=
","
open=
"("
close=
")"
>
#{item}
</foreach>
</if>
ORDER BY v_auth_model.node_type desc, CONVERT(v_auth_model.label using gbk) asc
</select>
SELECT
v_auth_model.id,
v_auth_model.name,
v_auth_model.label,
v_auth_model.pid,
v_auth_model.node_type,
v_auth_model.model_type,
v_auth_model.model_inner_type,
v_auth_model.auth_type,
v_auth_model.create_by,
v_auth_model.level,
v_auth_model.mode,
v_auth_model.data_source_id,
authInfo.PRIVILEGES AS `privileges`
FROM
( SELECT GET_V_AUTH_MODEL_ID_P_USE ( #{record.userId}, #{record.modelType} ) cids ) t,
v_auth_model
LEFT JOIN (
SELECT
auth_source,
group_concat( DISTINCT sys_auth_detail.privilege_extend ) AS `privileges`
FROM
(
`sys_auth`
LEFT JOIN `sys_auth_detail` ON ((
`sys_auth`.`id` = `sys_auth_detail`.`auth_id`
)))
WHERE
sys_auth_detail.privilege_value = 1
AND sys_auth.auth_source_type = #{record.modelType}
AND (
(
sys_auth.auth_target_type = 'dept'
AND sys_auth.auth_target IN ( SELECT dept_id FROM sys_user WHERE user_id = #{record.userId} )
)
OR (
sys_auth.auth_target_type = 'user'
AND sys_auth.auth_target = #{record.userId}
)
OR (
sys_auth.auth_target_type = 'role'
AND sys_auth.auth_target IN ( SELECT role_id FROM sys_users_roles WHERE user_id = #{record.userId} )
)
)
GROUP BY
`sys_auth`.`auth_source`
) authInfo ON v_auth_model.id = authInfo.auth_source
WHERE
FIND_IN_SET( v_auth_model.id, cids )
<if
test=
"record.id != null"
>
and v_auth_model.id = #{record.id,jdbcType=VARCHAR}
</if>
<if
test=
"record.pid != null"
>
and v_auth_model.pid = #{record.pid,jdbcType=VARCHAR}
</if>
<if
test=
"record.nodeType != null"
>
and v_auth_model.node_type = #{record.nodeType,jdbcType=VARCHAR}
</if>
<if
test=
"record.modelType != null"
>
and v_auth_model.model_type = #{record.modelType,jdbcType=VARCHAR}
</if>
<if
test=
"record.modelInnerType != null"
>
and v_auth_model.model_inner_type = #{record.modelInnerType,jdbcType=VARCHAR}
</if>
<if
test=
"record.authType != null"
>
and v_auth_model.auth_type = #{record.authType,jdbcType=VARCHAR}
</if>
<if
test=
"record.createBy != null"
>
and v_auth_model.create_by = #{record.createBy,jdbcType=VARCHAR}
</if>
<if
test=
"record.level != null"
>
and v_auth_model.`level` = #{record.level,jdbcType=BIGINT}
</if>
<if
test=
"record.mode != null"
>
<if
test=
"record.mode == 0"
>
and v_auth_model.`mode` = 0
</if>
<if
test=
'record.mode == 1 and record.modelType != null and record.modelType == "dataset"'
>
and (v_auth_model.`mode` = 1 or (v_auth_model.`model_inner_type` = 'group' and v_auth_model.model_type =
'dataset'))
</if>
</if>
<if
test=
"record.dataSourceId != null"
>
and v_auth_model.data_source_id = #{record.dataSourceId,jdbcType=VARCHAR}
</if>
<if
test=
"record.name != null"
>
and v_auth_model.`name` = #{record.name,jdbcType=LONGVARCHAR}
</if>
<if
test=
"record.label != null"
>
and v_auth_model.`label` = #{record.label,jdbcType=LONGVARCHAR}
</if>
<if
test=
"record.modelInnerTypeArray != null and record.modelInnerTypeArray.size() > 0"
>
and v_auth_model.model_inner_type in
<foreach
collection=
"record.modelInnerTypeArray"
item=
"item"
separator=
","
open=
"("
close=
")"
>
#{item}
</foreach>
</if>
ORDER BY v_auth_model.node_type desc, CONVERT(v_auth_model.label using gbk) asc
</select>
<select
id=
"queryAuthModelViews"
resultMap=
"ExtResultMap"
>
SELECT
panel_view.id,
chart_view.id as 'inner_id',
chart_view.NAME,
chart_view.NAME AS 'label',
panel_view.panel_id AS pid,
chart_view.type as 'model_inner_type',
'leaf' AS node_type,
'view' AS model_type
FROM
panel_view
LEFT JOIN chart_view ON panel_view.chart_view_id = chart_view.id
<where>
<if
test=
"record.pids != null and record.pids.size() > 0"
>
and panel_view.panel_id in
<foreach
collection=
"record.pids"
item=
"item"
separator=
","
open=
"("
close=
")"
>
#{item}
</foreach>
</if>
</where>
ORDER BY CONVERT(chart_view.name using gbk) asc
</select>
<select
id=
"queryAuthViewsOriginal"
resultMap=
"ExtResultMap"
>
select * from (
SELECT
chart_group.id,
chart_group.id AS 'inner_id',
chart_group.NAME,
chart_group.NAME AS 'label',
chart_group.pid AS pid,
chart_group.type AS 'model_inner_type',
'spine' AS node_type,
'view' AS model_type
FROM
chart_group
UNION ALL
SELECT
panel_view.id,
chart_view.id AS 'inner_id',
chart_view.NAME,
chart_view.NAME AS 'label',
chart_view.scene_id AS pid,
chart_view.type AS 'model_inner_type',
'leaf' AS node_type,
'view' AS model_type
FROM
panel_view
LEFT JOIN chart_view ON panel_view.chart_view_id = chart_view.id
<where>
chart_view.chart_type ='public'
<if
test=
"record.pids != null and record.pids.size() > 0"
>
and panel_view.panel_id in
<foreach
collection=
"record.pids"
item=
"item"
separator=
","
open=
"("
close=
")"
>
#{item}
</foreach>
</if>
</where>
) viewsOriginal
ORDER BY viewsOriginal.node_type desc, CONVERT(viewsOriginal.label using gbk) asc
</select>
</mapper>
backend/src/main/java/io/dataease/commons/utils/TreeUtils.java
浏览文件 @
769b7bc2
...
...
@@ -2,6 +2,7 @@ package io.dataease.commons.utils;
import
io.dataease.commons.model.ITreeBase
;
import
org.springframework.util.Assert
;
import
org.springframework.util.CollectionUtils
;
import
java.util.*
;
import
java.util.stream.Collectors
;
...
...
@@ -18,6 +19,9 @@ public class TreeUtils{
*/
public
static
<
T
extends
ITreeBase
>
List
<
T
>
mergeTree
(
List
<
T
>
tree
,
String
...
rootPid
)
{
Assert
.
notNull
(
rootPid
,
"Root Pid cannot be null"
);
if
(
CollectionUtils
.
isEmpty
(
tree
)){
return
null
;
}
List
<
T
>
result
=
new
ArrayList
<>();
// 构建id-节点map映射
Map
<
String
,
T
>
treePidMap
=
tree
.
stream
().
collect
(
Collectors
.
toMap
(
T:
:
getId
,
t
->
t
));
...
...
backend/src/main/java/io/dataease/controller/chart/ChartViewController.java
浏览文件 @
769b7bc2
...
...
@@ -72,9 +72,9 @@ public class ChartViewController {
}
@ApiOperation
(
"复制"
)
@PostMapping
(
"chartCopy/{id}"
)
public
String
chartCopy
(
@PathVariable
String
id
)
{
return
chartViewService
.
chartCopy
(
id
);
@PostMapping
(
"chartCopy/{id}
/{panelId}
"
)
public
String
chartCopy
(
@PathVariable
String
id
,
@PathVariable
String
panelId
)
{
return
chartViewService
.
chartCopy
(
id
,
panelId
);
}
@ApiIgnore
...
...
backend/src/main/java/io/dataease/controller/panel/PanelGroupController.java
浏览文件 @
769b7bc2
...
...
@@ -9,6 +9,7 @@ import io.dataease.commons.constants.DePermissionType;
import
io.dataease.commons.constants.ResourceAuthLevel
;
import
io.dataease.controller.handler.annotation.I18n
;
import
io.dataease.controller.request.panel.PanelGroupRequest
;
import
io.dataease.dto.authModel.VAuthModelDTO
;
import
io.dataease.dto.panel.PanelGroupDTO
;
import
io.dataease.service.panel.PanelGroupService
;
import
io.swagger.annotations.Api
;
...
...
@@ -70,5 +71,11 @@ public class PanelGroupController {
return
panelGroupService
.
findOne
(
id
);
}
@ApiOperation
(
"仪表板视图信息"
)
@PostMapping
(
"/queryPanelViewTree"
)
@I18n
public
List
<
VAuthModelDTO
>
queryPanelViewTree
(){
return
panelGroupService
.
queryPanelViewTree
();
}
}
backend/src/main/java/io/dataease/controller/request/authModel/VAuthModelRequest.java
浏览文件 @
769b7bc2
...
...
@@ -14,9 +14,15 @@ import java.util.List;
public
class
VAuthModelRequest
extends
VAuthModelDTO
{
private
String
userId
;
private
String
privileges
;
private
Integer
datasetMode
;
private
boolean
clearEmptyDir
;
private
List
<
String
>
modelInnerTypeArray
;
private
List
<
String
>
pids
;
}
backend/src/main/java/io/dataease/dto/authModel/VAuthModelDTO.java
浏览文件 @
769b7bc2
...
...
@@ -17,5 +17,13 @@ public class VAuthModelDTO extends VAuthModelWithBLOBs implements ITreeBase<VAu
private
String
privileges
;
private
List
<
VAuthModelDTO
>
children
;
private
long
allLeafs
=
0
l
;
private
String
innerId
;
public
String
toString
(){
return
this
.
getId
();
}
}
backend/src/main/java/io/dataease/service/chart/ChartViewService.java
浏览文件 @
769b7bc2
...
...
@@ -1684,9 +1684,9 @@ public class ChartViewService {
return
chartViewMapper
.
selectByPrimaryKey
(
id
);
}
public
String
chartCopy
(
String
id
)
{
public
String
chartCopy
(
String
id
,
String
panelId
)
{
String
newChartId
=
UUID
.
randomUUID
().
toString
();
extChartViewMapper
.
chartCopy
(
newChartId
,
id
);
extChartViewMapper
.
chartCopy
(
newChartId
,
id
,
panelId
);
return
newChartId
;
}
...
...
backend/src/main/java/io/dataease/service/panel/PanelGroupService.java
浏览文件 @
769b7bc2
...
...
@@ -3,12 +3,16 @@ package io.dataease.service.panel;
import
io.dataease.base.domain.*
;
import
io.dataease.base.mapper.ChartViewMapper
;
import
io.dataease.base.mapper.PanelGroupMapper
;
import
io.dataease.base.mapper.VAuthModelMapper
;
import
io.dataease.base.mapper.ext.ExtPanelGroupMapper
;
import
io.dataease.base.mapper.ext.ExtPanelLinkJumpMapper
;
import
io.dataease.base.mapper.ext.ExtVAuthModelMapper
;
import
io.dataease.commons.constants.PanelConstants
;
import
io.dataease.commons.utils.AuthUtils
;
import
io.dataease.commons.utils.TreeUtils
;
import
io.dataease.controller.request.authModel.VAuthModelRequest
;
import
io.dataease.controller.request.panel.PanelGroupRequest
;
import
io.dataease.dto.authModel.VAuthModelDTO
;
import
io.dataease.dto.chart.ChartViewDTO
;
import
io.dataease.dto.panel.PanelGroupDTO
;
import
io.dataease.exception.DataEaseException
;
...
...
@@ -28,6 +32,7 @@ import java.util.ArrayList;
import
java.util.List
;
import
java.util.Optional
;
import
java.util.UUID
;
import
java.util.stream.Collectors
;
/**
* Author: wangjiahao
...
...
@@ -59,7 +64,10 @@ public class PanelGroupService {
private
PanelViewService
panelViewService
;
@Resource
private
ExtPanelLinkJumpMapper
extPanelLinkJumpMapper
;
@Resource
private
ExtVAuthModelMapper
extVAuthModelMapper
;
@Resource
private
VAuthModelMapper
vAuthModelMapper
;
public
List
<
PanelGroupDTO
>
tree
(
PanelGroupRequest
panelGroupRequest
)
{
String
userId
=
String
.
valueOf
(
AuthUtils
.
getUser
().
getUserId
());
...
...
@@ -157,6 +165,9 @@ public class PanelGroupService {
if
(!
CollectionUtils
.
isNotEmpty
(
panelGroupDTOList
))
{
DataEaseException
.
throwException
(
"未查询到用户对应的资源权限,请尝试刷新重新保存"
);
}
//移除没有用到的仪表板私有视图
extPanelGroupMapper
.
removeUselessViews
(
panelId
);
return
panelGroupDTOList
.
get
(
0
);
}
...
...
@@ -214,4 +225,31 @@ public class PanelGroupService {
return
chartViewDTOList
;
}
public
List
<
VAuthModelDTO
>
queryPanelViewTree
(){
List
<
VAuthModelDTO
>
result
=
new
ArrayList
<>();
VAuthModelRequest
panelRequest
=
new
VAuthModelRequest
();
panelRequest
.
setUserId
(
String
.
valueOf
(
AuthUtils
.
getUser
().
getUserId
()));
panelRequest
.
setModelType
(
"panel"
);
List
<
VAuthModelDTO
>
panelResult
=
extVAuthModelMapper
.
queryAuthModel
(
panelRequest
);
// 获取仪表板下面的视图
if
(
CollectionUtils
.
isNotEmpty
(
panelResult
)){
result
.
addAll
(
panelResult
);
List
<
String
>
panelIds
=
panelResult
.
stream
().
map
(
VAuthModelDTO:
:
getId
).
collect
(
Collectors
.
toList
());
VAuthModelRequest
viewRequest
=
new
VAuthModelRequest
();
viewRequest
.
setPids
(
panelIds
);
List
<
VAuthModelDTO
>
viewResult
=
extVAuthModelMapper
.
queryAuthModelViews
(
viewRequest
);
if
(
CollectionUtils
.
isNotEmpty
(
viewResult
)){
result
.
addAll
(
viewResult
);
}
result
=
TreeUtils
.
mergeTree
(
panelResult
,
"panel_list"
);
// 原有视图的目录结构
List
<
VAuthModelDTO
>
viewOriginal
=
extVAuthModelMapper
.
queryAuthViewsOriginal
(
viewRequest
);
if
(
CollectionUtils
.
isNotEmpty
(
viewOriginal
)
&&
viewOriginal
.
size
()>
1
){
result
.
addAll
(
TreeUtils
.
mergeTree
(
viewOriginal
,
"public_chart"
));
}
}
return
result
;
}
}
backend/src/main/resources/db/migration/V32__1.8.sql
浏览文件 @
769b7bc2
ALTER
TABLE
`chart_view`
ADD
COLUMN
`x_axis_ext`
LONGTEXT
COMMENT
'table-row'
AFTER
`x_axis`
;
UPDATE
`chart_view`
SET
`x_axis_ext`
=
'[]'
;
\ No newline at end of file
UPDATE
`chart_view`
SET
`x_axis_ext`
=
'[]'
;
INSERT
INTO
`chart_group`
(
`id`
,
`name`
,
`pid`
,
`level`
,
`type`
,
`create_by`
,
`create_time`
)
VALUES
(
'0'
,
'i18n_public_chart'
,
'public_chart'
,
-
1
,
'group'
,
'admin'
,
NULL
);
ALTER
TABLE
`chart_view`
MODIFY
COLUMN
`scene_id`
varchar
(
50
)
CHARACTER
SET
utf8mb4
COLLATE
utf8mb4_general_ci
NOT
NULL
COMMENT
'场景ID chart_type为privat的时候 是仪表板id'
AFTER
`title`
,
ADD
COLUMN
`chart_type`
varchar
(
255
)
NULL
DEFAULT
'public'
COMMENT
'视图类型 public 公共 历史可复用的视图,private 私有 专属某个仪表板'
AFTER
`style_priority`
;
delete
from
sys_auth_detail
where
auth_id
in
(
select
id
from
sys_auth
where
auth_source_type
=
'chart'
);
delete
from
sys_auth
where
auth_source_type
=
'chart'
;
DROP
TRIGGER
`new_auth_chart_view`
;
DROP
TRIGGER
`delete_auth_chart_view`
;
delete
from
sys_menu
where
menu_id
=
'10'
;
DROP
VIEW
IF
EXISTS
`v_auth_model`
;
CREATE
ALGORITHM
=
UNDEFINED
SQL
SECURITY
DEFINER
VIEW
`v_auth_model`
AS
SELECT
`sys_user`
.
`user_id`
AS
`id`
,
`sys_user`
.
`username`
AS
`name`
,
`sys_user`
.
`username`
AS
`label`
,
'0'
AS
`pid`
,
'leaf'
AS
`node_type`
,
'user'
AS
`model_type`
,
'user'
AS
`model_inner_type`
,
'target'
AS
`auth_type`
,
`sys_user`
.
`create_by`
AS
`create_by`
,
0
AS
`level`
,
0
AS
`mode`
,
'0'
AS
`data_source_id`
FROM
`sys_user`
WHERE
(
`sys_user`
.
`is_admin`
<>
1
)
UNION
ALL
SELECT
`sys_role`
.
`role_id`
AS
`id`
,
`sys_role`
.
`name`
AS
`name`
,
`sys_role`
.
`name`
AS
`label`
,
'0'
AS
`pid`
,
'leaf'
AS
`node_type`
,
'role'
AS
`model_type`
,
'role'
AS
`model_inner_type`
,
'target'
AS
`auth_type`
,
`sys_role`
.
`create_by`
AS
`create_by`
,
0
AS
`level`
,
0
AS
`mode`
,
'0'
AS
`data_source_id`
FROM
`sys_role`
UNION
ALL
SELECT
`sys_dept`
.
`dept_id`
AS
`id`
,
`sys_dept`
.
`name`
AS
`name`
,
`sys_dept`
.
`name`
AS
`lable`
,(
cast
(
`sys_dept`
.
`pid`
AS
CHAR
charset
utf8mb4
)
COLLATE
utf8mb4_general_ci
)
AS
`pid`
,
IF
((
`sys_dept`
.
`sub_count`
=
0
),
'leaf'
,
'spine'
)
AS
`node_type`
,
'dept'
AS
`model_type`
,
'dept'
AS
`model_inner_type`
,
'target'
AS
`auth_type`
,
`sys_dept`
.
`create_by`
AS
`create_by`
,
0
AS
`level`
,
0
AS
`mode`
,
'0'
AS
`data_source_id`
FROM
`sys_dept`
UNION
ALL
SELECT
`datasource`
.
`id`
AS
`id`
,
`datasource`
.
`name`
AS
`NAME`
,
`datasource`
.
`name`
AS
`label`
,
'0'
AS
`pid`
,
'leaf'
AS
`node_type`
,
'link'
AS
`model_type`
,
`datasource`
.
`type`
AS
`model_inner_type`
,
'source'
AS
`auth_type`
,
`datasource`
.
`create_by`
AS
`create_by`
,
0
AS
`level`
,
0
AS
`mode`
,
'0'
AS
`data_source_id`
FROM
`datasource`
UNION
ALL
SELECT
`dataset_group`
.
`id`
AS
`id`
,
`dataset_group`
.
`name`
AS
`NAME`
,
`dataset_group`
.
`name`
AS
`lable`
,
IF
(
isnull
(
`dataset_group`
.
`pid`
),
'0'
,
`dataset_group`
.
`pid`
)
AS
`pid`
,
'spine'
AS
`node_type`
,
'dataset'
AS
`model_type`
,
`dataset_group`
.
`type`
AS
`model_inner_type`
,
'source'
AS
`auth_type`
,
`dataset_group`
.
`create_by`
AS
`create_by`
,
`dataset_group`
.
`level`
AS
`level`
,
0
AS
`mode`
,
'0'
AS
`data_source_id`
FROM
`dataset_group`
UNION
ALL
SELECT
`dataset_table`
.
`id`
AS
`id`
,
`dataset_table`
.
`name`
AS
`NAME`
,
`dataset_table`
.
`name`
AS
`lable`
,
`dataset_table`
.
`scene_id`
AS
`pid`
,
'leaf'
AS
`node_type`
,
'dataset'
AS
`model_type`
,
`dataset_table`
.
`type`
AS
`model_inner_type`
,
'source'
AS
`auth_type`
,
`dataset_table`
.
`create_by`
AS
`create_by`
,
0
AS
`level`
,
`dataset_table`
.
`mode`
AS
`mode`
,
`dataset_table`
.
`data_source_id`
AS
`data_source_id`
FROM
`dataset_table`
UNION
ALL
SELECT
`panel_group`
.
`id`
AS
`id`
,
`panel_group`
.
`name`
AS
`NAME`
,
`panel_group`
.
`name`
AS
`label`
,(
CASE
`panel_group`
.
`id`
WHEN
'panel_list'
THEN
'0'
WHEN
'default_panel'
THEN
'0'
ELSE
`panel_group`
.
`pid`
END
)
AS
`pid`
,
IF
((
`panel_group`
.
`node_type`
=
'folder'
),
'spine'
,
'leaf'
)
AS
`node_type`
,
'panel'
AS
`model_type`
,
`panel_group`
.
`panel_type`
AS
`model_inner_type`
,
'source'
AS
`auth_type`
,
`panel_group`
.
`create_by`
AS
`create_by`
,
0
AS
`level`
,
0
AS
`mode`
,
'0'
AS
`data_source_id`
FROM
`panel_group`
UNION
ALL
SELECT
`sys_menu`
.
`menu_id`
AS
`menu_id`
,
`sys_menu`
.
`title`
AS
`name`
,
`sys_menu`
.
`title`
AS
`label`
,
`sys_menu`
.
`pid`
AS
`pid`
,
IF
((
`sys_menu`
.
`sub_count`
>
0
),
'spine'
,
'leaf'
)
AS
`node_type`
,
'menu'
AS
`model_type`
,(
CASE
`sys_menu`
.
`type`
WHEN
0
THEN
'folder'
WHEN
1
THEN
'menu'
WHEN
2
THEN
'button'
END
)
AS
`model_inner_type`
,
'source'
AS
`auth_type`
,
`sys_menu`
.
`create_by`
AS
`create_by`
,
0
AS
`level`
,
0
AS
`mode`
,
'0'
AS
`data_source_id`
FROM
`sys_menu`
WHERE
((
`sys_menu`
.
`i_frame`
<>
1
)
OR
isnull
(
`sys_menu`
.
`i_frame`
))
UNION
ALL
SELECT
`plugin_sys_menu`
.
`menu_id`
AS
`menu_id`
,
`plugin_sys_menu`
.
`title`
AS
`name`
,
`plugin_sys_menu`
.
`title`
AS
`label`
,
`plugin_sys_menu`
.
`pid`
AS
`pid`
,
IF
((
`plugin_sys_menu`
.
`sub_count`
>
0
),
'spine'
,
'leaf'
)
AS
`node_type`
,
'menu'
AS
`model_type`
,(
CASE
`plugin_sys_menu`
.
`type`
WHEN
0
THEN
'folder'
WHEN
1
THEN
'menu'
WHEN
2
THEN
'button'
END
)
AS
`model_inner_type`
,
'source'
AS
`auth_type`
,
`plugin_sys_menu`
.
`create_by`
AS
`create_by`
,
0
AS
`level`
,
0
AS
`mode`
,
'0'
AS
`data_source_id`
FROM
`plugin_sys_menu`
WHERE
((
`plugin_sys_menu`
.
`i_frame`
<>
1
)
OR
isnull
(
`plugin_sys_menu`
.
`i_frame`
));
backend/src/main/resources/i18n/messages_en_US.properties
浏览文件 @
769b7bc2
...
...
@@ -118,4 +118,5 @@ i18n_calc_field_error=Field expression error
i18n_cp_exist
=
Column permission of the same type already exists
connection_failed
=
Connection Failed
theme_name_repeat
=
name of theme has been existed
theme_name_empty
=
name can not be empty
\ No newline at end of file
theme_name_empty
=
name can not be empty
i18n_public_chart
=
Public Chart
backend/src/main/resources/i18n/messages_zh_CN.properties
浏览文件 @
769b7bc2
...
...
@@ -118,3 +118,4 @@ i18n_cp_exist=已有同类型的列权限存在
connection_failed
=
连接失败
theme_name_repeat
=
名称已存在
theme_name_empty
=
名称不能为空
i18n_public_chart
=
存量视图
backend/src/main/resources/i18n/messages_zh_TW.properties
浏览文件 @
769b7bc2
...
...
@@ -119,3 +119,4 @@ i18n_cp_exist=已有同類型的列權限存在
connection_failed
=
連接失敗
theme_name_repeat
=
名稱已存在
theme_name_empty
=
名稱不能為空
i18n_public_chart
=
存量视图
frontend/src/api/chart/chart.js
浏览文件 @
769b7bc2
...
...
@@ -28,11 +28,11 @@ export function getChartTree(data) {
})
}
export
function
chartCopy
(
id
)
{
export
function
chartCopy
(
id
,
panelId
)
{
return
request
({
url
:
'/chart/view/chartCopy/'
+
id
,
url
:
'/chart/view/chartCopy/'
+
id
+
'/'
+
panelId
,
method
:
'post'
,
loading
:
tru
e
loading
:
fals
e
})
}
export
function
chartGroupTree
(
data
)
{
...
...
frontend/src/api/panel/panel.js
浏览文件 @
769b7bc2
...
...
@@ -154,3 +154,11 @@ export function initPanelData(panelId, callback) {
callback
(
response
)
})
}
export
function
queryPanelViewTree
()
{
return
request
({
url
:
'/panel/group/queryPanelViewTree'
,
method
:
'post'
})
}
frontend/src/components/canvas/store/copy.js
浏览文件 @
769b7bc2
...
...
@@ -47,7 +47,7 @@ export default {
// 如果是用户视图 测先进行底层复制
if
(
data
.
type
===
'view'
)
{
chartCopy
(
data
.
propValue
.
viewId
).
then
(
res
=>
{
chartCopy
(
data
.
propValue
.
viewId
,
state
.
panel
.
panelInfo
.
id
).
then
(
res
=>
{
const
newView
=
deepCopy
(
data
)
newView
.
id
=
uuid
.
v1
()
newView
.
propValue
.
viewId
=
res
.
data
...
...
frontend/src/views/panel/ViewSelect/index.vue
浏览文件 @
769b7bc2
...
...
@@ -2,7 +2,7 @@
<el-col
v-loading=
"loading"
>
<el-row
style=
"margin-top: 5px"
>
<el-row
style=
"margin-left: 5px;margin-right: 5px"
>
<el-col
:span=
"
selectModel ? 23 : 16
"
>
<el-col
:span=
"
23
"
>
<el-input
v-model=
"templateFilterText"
:placeholder=
"$t('panel.filter_keywords')"
...
...
@@ -11,9 +11,9 @@
prefix-icon=
"el-icon-search"
/>
</el-col>
<
el-col
v-if=
"!selectModel"
:span=
"7"
>
<el-button
type=
"primary"
size=
"mini"
style=
"float: right"
@
click=
"newChart"
>
新建
</el-button
>
<
/el-col
>
<
!--
<el-col
v-if=
"!selectModel"
:span=
"7"
>
--
>
<!--
<el-button
type=
"primary"
size=
"mini"
style=
"float: right"
@
click=
"newChart"
>
新建
</el-button>
--
>
<
!--
</el-col>
--
>
</el-row>
<el-row
style=
"margin-top: 5px"
>
...
...
@@ -31,46 +31,35 @@
:filter-node-method=
"filterNode"
:highlight-current=
"true"
@
node-drag-start=
"handleDragStart"
@
node-click=
"nodeClick"
@
check=
"checkChanged"
@
node-drag-end=
"dragEnd"
>
<span
slot-scope=
"
{ node, data }" class="custom-tree-node">
<span>
<span
v-if=
"data.
type==='scene'||data.type==='group
'"
>
<span
v-if=
"data.
modelType==='panel'|| data.nodeType === 'spine
'"
>
<el-button
icon=
"el-icon-folder"
type=
"text"
/>
</span>
<span
v-else
>
<svg-icon
:icon-class=
"data.
t
ype"
style=
"width: 14px;height: 14px"
/>
<svg-icon
:icon-class=
"data.
modelInnerT
ype"
style=
"width: 14px;height: 14px"
/>
</span>
<span
style=
"margin-left: 6px;font-size: 14px"
>
{{
data
.
name
}}
</span>
</span>
</span>
</el-tree>
</el-row>
<!--
<el-row
v-if=
"detailItem&&detailItem.snapshot"
class=
"detail-class"
>
-->
<!--
<el-card
class=
"filter-card-class"
>
-->
<!--
<div
slot=
"header"
class=
"button-div-class"
>
-->
<!--
<span>
{{
detailItem
.
name
}}
</span>
-->
<!--
</div>
-->
<!--
<img
draggable=
"false"
class=
"view-list-thumbnails"
:src=
"detailItem.snapshot"
alt=
""
>
-->
<!--
</el-card>
-->
<!--
</el-row>
-->
</el-row>
</el-col>
</
template
>
<
script
>
import
{
tree
,
findOne
}
from
'@/api/panel/view'
import
componentList
from
'@/components/canvas/custom-component/component-list'
import
{
deepCopy
}
from
'@/components/canvas/utils/utils'
import
eventBus
from
'@/components/canvas/utils/eventBus'
import
{
mapState
}
from
'vuex'
import
{
queryPanelViewTree
}
from
'@/api/panel/panel'
export
default
{
name
:
'ViewSelect'
,
...
...
@@ -113,15 +102,9 @@ export default {
if
(
!
value
)
return
true
return
data
.
name
.
indexOf
(
value
)
!==
-
1
},
nodeClick
(
data
,
node
)
{
findOne
(
data
.
id
).
then
(
res
=>
{
this
.
detailItem
=
res
.
data
})
},
loadData
()
{
const
param
=
{}
this
.
loading
=
true
tree
(
param
).
then
(
res
=>
{
queryPanelViewTree
(
).
then
(
res
=>
{
const
nodeDatas
=
res
.
data
if
(
this
.
selectModel
)
{
this
.
setParentDisable
(
nodeDatas
)
...
...
@@ -135,7 +118,7 @@ export default {
ev
.
dataTransfer
.
effectAllowed
=
'copy'
const
dataTrans
=
{
type
:
'view'
,
id
:
node
.
data
.
id
id
:
node
.
data
.
i
nnerI
d
}
ev
.
dataTransfer
.
setData
(
'componentInfo'
,
JSON
.
stringify
(
dataTrans
))
eventBus
.
$emit
(
'startMoveIn'
)
...
...
@@ -146,7 +129,7 @@ export default {
},
// 判断节点能否被拖拽
allowDrag
(
draggingNode
)
{
if
(
draggingNode
.
data
.
type
===
'scene'
||
draggingNode
.
data
.
type
===
'group
'
)
{
if
(
draggingNode
.
data
.
modelType
===
'panel'
||
draggingNode
.
data
.
nodeType
===
'spine
'
)
{
return
false
}
else
{
return
true
...
...
@@ -171,7 +154,7 @@ export default {
},
setParentDisable
(
nodes
)
{
nodes
.
forEach
(
node
=>
{
if
(
node
.
type
===
'group
'
)
{
if
(
node
.
modelType
===
'panel'
||
node
.
nodeType
===
'spine
'
)
{
node
.
disabled
=
true
}
if
(
node
.
children
&&
node
.
children
.
length
>
0
)
{
...
...
frontend/src/views/panel/edit/index.vue
浏览文件 @
769b7bc2
...
...
@@ -25,7 +25,7 @@
<div
style=
"width: 60px;height: 100%;overflow: hidden auto;position: relative;margin: 0px auto; font-size: 14px"
>
<!-- 视图图表 start -->
<div
class=
"button-div-class"
style=
" width: 24px;height: 24px;text-align: center;line-height: 1;position: relative;margin: 16px auto 0px;"
>
<el-button
:class=
"show&&showIndex===0? 'button-show':'button-closed'"
circle
class=
"el-icon-circle-plus-outline"
size=
"mini"
@
click=
"showPanel(0
)"
/>
<el-button
circle
class=
"el-icon-circle-plus-outline"
size=
"mini"
@
click=
"newChart(
)"
/>
</div>
<div
class=
"button-text"
style=
"position: relative; margin: 18px auto 16px;"
>
<div
style=
"max-width: 100%;text-align: center;white-space: nowrap;text-overflow: ellipsis;position: relative;flex-shrink: 0;"
>
...
...
@@ -66,6 +66,21 @@
<div
style=
"width: 60px;height: 1px;line-height: 1px;text-align: center;white-space: pre;text-overflow: ellipsis;position: relative;flex-shrink: 0;"
/>
</div>
<!-- 其他组件 end -->
<!-- 视图复用 start -->
<div
class=
"button-div-class"
style=
" width: 24px;height: 24px;text-align: center;line-height: 1;position: relative;margin: 16px auto 0px;"
>
<el-button
:class=
"show&&showIndex===0? 'button-show':'button-closed'"
circle
class=
"el-icon-copy-document"
size=
"mini"
@
click=
"showPanel(0)"
/>
</div>
<div
class=
"button-text"
style=
"position: relative; margin: 18px auto 16px;"
>
<div
style=
"max-width: 100%;text-align: center;white-space: nowrap;text-overflow: ellipsis;position: relative;flex-shrink: 0;"
>
<!--
{{
$t
(
'panel.view'
)
}}
-->
复用
</div>
</div>
<div
style=
"height: 1px; position: relative; margin: 0px auto;background-color:#E6E6E6;"
>
<div
style=
"width: 60px;height: 1px;line-height: 1px;text-align: center;white-space: pre;text-overflow: ellipsis;position: relative;flex-shrink: 0;"
/>
</div>
<!-- 视图复用 end -->
</div>
</div>
</de-aside-container>
...
...
@@ -228,7 +243,7 @@ import elementResizeDetectorMaker from 'element-resize-detector'
import
AssistComponent
from
'@/views/panel/AssistComponent'
import
PanelTextEditor
from
'@/components/canvas/custom-component/PanelTextEditor'
import
ChartGroup
from
'@/views/chart/group/Group'
import
{
searchAdviceSceneId
}
from
'@/api/chart/chart'
import
{
chartCopy
,
searchAdviceSceneId
}
from
'@/api/chart/chart'
// 引入样式
import
'@/components/canvas/assets/iconfont/iconfont.css'
import
'@/components/canvas/styles/animate.css'
...
...
@@ -628,8 +643,18 @@ export default {
component
.
id
=
newComponentId
// 新拖入的组件矩阵状态 和仪表板当前的矩阵状态 保持一致
component
.
auxiliaryMatrix
=
this
.
canvasStyleData
.
auxiliaryMatrix
this
.
$store
.
commit
(
'addComponent'
,
{
component
})
this
.
$store
.
commit
(
'recordSnapshot'
,
'handleDrop'
)
// 视图统一调整为复制
if
(
componentInfo
.
type
===
'view'
)
{
chartCopy
(
component
.
propValue
.
viewId
,
this
.
panelInfo
.
id
).
then
(
res
=>
{
component
.
propValue
.
viewId
=
res
.
data
this
.
$store
.
commit
(
'addComponent'
,
{
component
})
this
.
$store
.
commit
(
'recordSnapshot'
,
'handleDrop'
)
})
}
else
{
this
.
$store
.
commit
(
'addComponent'
,
{
component
})
this
.
$store
.
commit
(
'recordSnapshot'
,
'handleDrop'
)
}
this
.
clearCurrentInfo
()
},
clearCurrentInfo
()
{
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论