Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
D
dataease
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
njgzx
dataease
Commits
d9ebc295
提交
d9ebc295
authored
8月 10, 2021
作者:
taojinlong
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'dev' into pr@dev@pg
上级
347b64ef
6c004fc1
全部展开
隐藏空白字符变更
内嵌
并排
正在显示
44 个修改的文件
包含
1020 行增加
和
57 行删除
+1020
-57
F2CRealm.java
backend/src/main/java/io/dataease/auth/config/F2CRealm.java
+46
-8
ASKToken.java
backend/src/main/java/io/dataease/auth/entity/ASKToken.java
+25
-0
JWTFilter.java
backend/src/main/java/io/dataease/auth/filter/JWTFilter.java
+18
-1
ApiKeyHandler.java
...src/main/java/io/dataease/auth/handler/ApiKeyHandler.java
+88
-0
UserKey.java
backend/src/main/java/io/dataease/base/domain/UserKey.java
+22
-0
UserKeyExample.java
...src/main/java/io/dataease/base/domain/UserKeyExample.java
+0
-0
UserKeyMapper.java
.../src/main/java/io/dataease/base/mapper/UserKeyMapper.java
+31
-0
UserKeyMapper.xml
...d/src/main/java/io/dataease/base/mapper/UserKeyMapper.xml
+229
-0
ExtPanelViewLinkageMapper.java
...o/dataease/base/mapper/ext/ExtPanelViewLinkageMapper.java
+4
-0
ExtPanelViewLinkageMapper.xml
...io/dataease/base/mapper/ext/ExtPanelViewLinkageMapper.xml
+20
-0
CodingUtil.java
...d/src/main/java/io/dataease/commons/utils/CodingUtil.java
+12
-0
Knife4jConfiguration.java
...rc/main/java/io/dataease/config/Knife4jConfiguration.java
+15
-4
PanelViewLinkageController.java
...dataease/controller/panel/PanelViewLinkageController.java
+6
-0
ChartDrillRequest.java
.../dataease/controller/request/chart/ChartDrillRequest.java
+15
-0
ChartExtRequest.java
...io/dataease/controller/request/chart/ChartExtRequest.java
+4
-0
LinkageInfoDTO.java
backend/src/main/java/io/dataease/dto/LinkageInfoDTO.java
+31
-0
ChartViewDTO.java
...end/src/main/java/io/dataease/dto/chart/ChartViewDTO.java
+4
-0
XUserKeysServer.java
...main/java/io/dataease/plugins/server/XUserKeysServer.java
+61
-0
OracleQueryProvider.java
...java/io/dataease/provider/oracle/OracleQueryProvider.java
+2
-2
ChartViewService.java
...main/java/io/dataease/service/chart/ChartViewService.java
+100
-9
PanelViewLinkageService.java
...va/io/dataease/service/panel/PanelViewLinkageService.java
+5
-11
application.properties
backend/src/main/resources/application.properties
+1
-1
V21__user_key.sql
backend/src/main/resources/db/migration/V21__user_key.sql
+16
-0
linkage.js
frontend/src/api/panel/linkage.js
+6
-0
ComponentWrapper.vue
.../components/canvas/components/Editor/ComponentWrapper.vue
+0
-1
Preview.vue
frontend/src/components/canvas/components/Editor/Preview.vue
+0
-1
UserView.vue
frontend/src/components/canvas/custom-component/UserView.vue
+15
-0
copy.js
frontend/src/components/canvas/store/copy.js
+0
-1
treemap.svg
frontend/src/icons/svg/treemap.svg
+1
-0
en.js
frontend/src/lang/en.js
+11
-2
tw.js
frontend/src/lang/tw.js
+11
-2
zh.js
frontend/src/lang/zh.js
+11
-2
Topbar.vue
frontend/src/layout/components/Topbar.vue
+5
-0
index.js
frontend/src/store/index.js
+50
-2
conditionUtil.js
frontend/src/utils/conditionUtil.js
+6
-0
chart.js
frontend/src/views/chart/chart/chart.js
+39
-1
funnel.js
frontend/src/views/chart/chart/funnel/funnel.js
+1
-3
treemap.js
frontend/src/views/chart/chart/treemap/treemap.js
+54
-0
ChartComponent.vue
frontend/src/views/chart/components/ChartComponent.vue
+20
-1
SizeSelector.vue
...nd/src/views/chart/components/shape-attr/SizeSelector.vue
+14
-3
ChartEdit.vue
frontend/src/views/chart/view/ChartEdit.vue
+0
-0
index.vue
frontend/src/views/panel/edit/index.vue
+9
-0
index.vue
frontend/src/views/panel/list/EditPanel/index.vue
+0
-1
PanelList.vue
frontend/src/views/panel/list/PanelList.vue
+12
-1
没有找到文件。
backend/src/main/java/io/dataease/auth/config/F2CRealm.java
浏览文件 @
d9ebc295
...
...
@@ -2,18 +2,17 @@ package io.dataease.auth.config;
import
io.dataease.auth.api.dto.CurrentRoleDto
;
import
io.dataease.auth.api.dto.CurrentUserDto
;
import
io.dataease.auth.entity.ASKToken
;
import
io.dataease.auth.entity.JWTToken
;
import
io.dataease.auth.entity.SysUserEntity
;
import
io.dataease.auth.entity.TokenInfo
;
import
io.dataease.auth.handler.ApiKeyHandler
;
import
io.dataease.auth.service.AuthUserService
;
import
io.dataease.auth.util.JWTUtils
;
import
io.dataease.commons.utils.BeanUtils
;
import
io.dataease.commons.utils.LogUtil
;
import
io.dataease.listener.util.CacheUtils
;
import
org.apache.shiro.authc.AuthenticationException
;
import
org.apache.shiro.authc.AuthenticationInfo
;
import
org.apache.shiro.authc.AuthenticationToken
;
import
org.apache.shiro.authc.SimpleAuthenticationInfo
;
import
org.apache.shiro.authc.*
;
import
org.apache.shiro.authz.AuthorizationInfo
;
import
org.apache.shiro.authz.SimpleAuthorizationInfo
;
import
org.apache.shiro.realm.AuthorizingRealm
;
...
...
@@ -37,7 +36,7 @@ public class F2CRealm extends AuthorizingRealm {
@Override
public
boolean
supports
(
AuthenticationToken
token
)
{
return
token
instanceof
JWTToken
;
return
token
instanceof
JWTToken
||
token
instanceof
ASKToken
;
}
//验证资源权限
...
...
@@ -56,12 +55,27 @@ public class F2CRealm extends AuthorizingRealm {
@Override
protected
AuthenticationInfo
doGetAuthenticationInfo
(
AuthenticationToken
auth
)
throws
AuthenticationException
{
if
(
auth
instanceof
ASKToken
)
{
Object
accessKey
=
auth
.
getPrincipal
();
Object
signature
=
auth
.
getCredentials
();
Long
userId
=
ApiKeyHandler
.
getUser
(
accessKey
.
toString
(),
signature
.
toString
());
SysUserEntity
userEntity
=
userWithId
(
userId
);
CurrentUserDto
currentUserDto
=
queryCacheUserDto
(
userEntity
);
return
new
SimpleAuthenticationInfo
(
currentUserDto
,
signature
,
"f2cReam"
);
}
try
{
CacheUtils
.
get
(
"lic_info"
,
"lic"
);
}
catch
(
Exception
e
)
{
LogUtil
.
error
(
e
);
throw
new
AuthenticationException
(
"lic error"
);
}
TokenInfo
tokenInfo
=
null
;
String
token
=
null
;
try
{
...
...
@@ -78,13 +92,14 @@ public class F2CRealm extends AuthorizingRealm {
throw
new
AuthenticationException
(
"token invalid"
);
}
// 使用缓存
SysUserEntity
user
=
authUserService
.
getUserById
(
userId
);
/*
SysUserEntity user = authUserService.getUserById(userId);
if (user == null) {
throw new AuthenticationException("User didn't existed!");
}
if (user.getEnabled()==0) {
throw new AuthenticationException("User is valid!");
}
}*/
SysUserEntity
user
=
userWithId
(
userId
);
String
pass
=
null
;
try
{
pass
=
user
.
getPassword
();
...
...
@@ -94,6 +109,29 @@ public class F2CRealm extends AuthorizingRealm {
if
(!
JWTUtils
.
verify
(
token
,
tokenInfo
,
pass
))
{
throw
new
AuthenticationException
(
"Username or password error"
);
}
/*// 使用缓存
List<CurrentRoleDto> currentRoleDtos = authUserService.roleInfos(user.getUserId());
// 使用缓存
List<String> permissions = authUserService.permissions(user.getUserId());
CurrentUserDto currentUserDto = BeanUtils.copyBean(new CurrentUserDto(), user);
currentUserDto.setRoles(currentRoleDtos);
currentUserDto.setPermissions(permissions);*/
CurrentUserDto
currentUserDto
=
queryCacheUserDto
(
user
);
return
new
SimpleAuthenticationInfo
(
currentUserDto
,
token
,
"f2cReam"
);
}
public
SysUserEntity
userWithId
(
Long
userId
)
{
SysUserEntity
user
=
authUserService
.
getUserById
(
userId
);
if
(
user
==
null
)
{
throw
new
AuthenticationException
(
"User didn't existed!"
);
}
if
(
user
.
getEnabled
()==
0
)
{
throw
new
AuthenticationException
(
"User is valid!"
);
}
return
user
;
}
public
CurrentUserDto
queryCacheUserDto
(
SysUserEntity
user
)
{
// 使用缓存
List
<
CurrentRoleDto
>
currentRoleDtos
=
authUserService
.
roleInfos
(
user
.
getUserId
());
// 使用缓存
...
...
@@ -101,6 +139,6 @@ public class F2CRealm extends AuthorizingRealm {
CurrentUserDto
currentUserDto
=
BeanUtils
.
copyBean
(
new
CurrentUserDto
(),
user
);
currentUserDto
.
setRoles
(
currentRoleDtos
);
currentUserDto
.
setPermissions
(
permissions
);
return
new
SimpleAuthenticationInfo
(
currentUserDto
,
token
,
"f2cReam"
)
;
return
currentUserDto
;
}
}
backend/src/main/java/io/dataease/auth/entity/ASKToken.java
0 → 100644
浏览文件 @
d9ebc295
package
io
.
dataease
.
auth
.
entity
;
import
org.apache.shiro.authc.AuthenticationToken
;
public
class
ASKToken
implements
AuthenticationToken
{
private
String
accessKey
;
private
String
signature
;
public
ASKToken
(
String
accessKey
,
String
signature
)
{
this
.
accessKey
=
accessKey
;
this
.
signature
=
signature
;
}
@Override
public
Object
getPrincipal
()
{
return
accessKey
;
}
@Override
public
Object
getCredentials
()
{
return
signature
;
}
}
backend/src/main/java/io/dataease/auth/filter/JWTFilter.java
浏览文件 @
d9ebc295
package
io
.
dataease
.
auth
.
filter
;
import
io.dataease.auth.entity.ASKToken
;
import
io.dataease.auth.entity.JWTToken
;
import
io.dataease.auth.entity.SysUserEntity
;
import
io.dataease.auth.entity.TokenInfo
;
import
io.dataease.auth.handler.ApiKeyHandler
;
import
io.dataease.auth.service.AuthUserService
;
import
io.dataease.auth.util.JWTUtils
;
import
io.dataease.commons.utils.CommonBeanFactory
;
...
...
@@ -48,6 +50,18 @@ public class JWTFilter extends BasicHttpAuthenticationFilter {
@Override
protected
boolean
executeLogin
(
ServletRequest
request
,
ServletResponse
response
)
throws
Exception
{
HttpServletRequest
httpServletRequest
=
(
HttpServletRequest
)
request
;
if
(
ApiKeyHandler
.
isApiKeyCall
(
httpServletRequest
))
{
// Long userId = ApiKeyHandler.getUser(httpServletRequest);
ASKToken
askToken
=
ApiKeyHandler
.
buildToken
(
httpServletRequest
);
// UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(userId.toString(), ApiKeyHandler.random);
getSubject
(
request
,
response
).
login
(
askToken
);
return
true
;
}
String
authorization
=
httpServletRequest
.
getHeader
(
"Authorization"
);
if
(
StringUtils
.
startsWith
(
authorization
,
"Basic"
))
{
return
false
;
...
...
@@ -72,7 +86,10 @@ public class JWTFilter extends BasicHttpAuthenticationFilter {
*/
@Override
protected
boolean
isAccessAllowed
(
ServletRequest
request
,
ServletResponse
response
,
Object
mappedValue
)
{
if
(
isLoginAttempt
(
request
,
response
))
{
// 先判断是不是api调用
HttpServletRequest
hRequest
=
(
HttpServletRequest
)
request
;
if
(
isLoginAttempt
(
request
,
response
)
||
ApiKeyHandler
.
isApiKeyCall
(
hRequest
))
{
try
{
boolean
loginSuccess
=
executeLogin
(
request
,
response
);
return
loginSuccess
;
...
...
backend/src/main/java/io/dataease/auth/handler/ApiKeyHandler.java
0 → 100644
浏览文件 @
d9ebc295
package
io
.
dataease
.
auth
.
handler
;
import
io.dataease.auth.entity.ASKToken
;
import
io.dataease.commons.utils.CodingUtil
;
import
io.dataease.plugins.config.SpringContextUtil
;
import
io.dataease.plugins.xpack.ukey.dto.request.XpackUkeyDto
;
import
io.dataease.plugins.xpack.ukey.service.UkeyXpackService
;
import
org.apache.commons.lang3.StringUtils
;
import
javax.servlet.http.HttpServletRequest
;
import
java.util.UUID
;
public
class
ApiKeyHandler
{
public
static
final
String
API_ACCESS_KEY
=
"accessKey"
;
public
static
final
String
API_SIGNATURE
=
"signature"
;
public
static
String
random
=
UUID
.
randomUUID
().
toString
()
+
UUID
.
randomUUID
().
toString
();
public
static
Long
getUser
(
HttpServletRequest
request
)
{
if
(
request
==
null
)
{
return
null
;
}
return
getUser
(
request
.
getHeader
(
API_ACCESS_KEY
),
request
.
getHeader
(
API_SIGNATURE
));
}
public
static
ASKToken
buildToken
(
HttpServletRequest
request
)
{
if
(
request
==
null
)
{
return
null
;
}
String
accessKey
=
request
.
getHeader
(
API_ACCESS_KEY
);
String
signature
=
request
.
getHeader
(
API_SIGNATURE
);
ASKToken
askToken
=
new
ASKToken
(
accessKey
,
signature
);
return
askToken
;
}
public
static
Boolean
isApiKeyCall
(
HttpServletRequest
request
)
{
if
(
request
==
null
)
{
return
false
;
}
if
(
StringUtils
.
isBlank
(
request
.
getHeader
(
API_ACCESS_KEY
))
||
StringUtils
.
isBlank
(
request
.
getHeader
(
API_SIGNATURE
)))
{
return
false
;
}
return
true
;
}
public
static
XpackUkeyDto
ukey
(
String
accessKey
)
{
UkeyXpackService
ukeyXpackService
=
SpringContextUtil
.
getBean
(
UkeyXpackService
.
class
);
XpackUkeyDto
userKey
=
ukeyXpackService
.
getUserKey
(
accessKey
);
return
userKey
;
}
public
static
Long
getUser
(
String
accessKey
,
String
signature
)
{
if
(
StringUtils
.
isBlank
(
accessKey
)
||
StringUtils
.
isBlank
(
signature
))
{
return
null
;
}
XpackUkeyDto
userKey
=
ukey
(
accessKey
);
if
(
userKey
==
null
)
{
throw
new
RuntimeException
(
"invalid accessKey"
);
}
String
signatureDecrypt
;
try
{
signatureDecrypt
=
CodingUtil
.
aesDecrypt
(
signature
,
userKey
.
getSecretKey
(),
accessKey
);
}
catch
(
Throwable
t
)
{
throw
new
RuntimeException
(
"invalid signature"
);
}
String
[]
signatureArray
=
StringUtils
.
split
(
StringUtils
.
trimToNull
(
signatureDecrypt
),
"|"
);
if
(
signatureArray
.
length
<
2
)
{
throw
new
RuntimeException
(
"invalid signature"
);
}
if
(!
StringUtils
.
equals
(
accessKey
,
signatureArray
[
0
]))
{
throw
new
RuntimeException
(
"invalid signature"
);
}
long
signatureTime
=
0
l
;
try
{
signatureTime
=
Long
.
valueOf
(
signatureArray
[
signatureArray
.
length
-
1
]).
longValue
();
}
catch
(
Exception
e
)
{
throw
new
RuntimeException
(
e
);
}
if
(
Math
.
abs
(
System
.
currentTimeMillis
()
-
signatureTime
)
>
1800000
)
{
//签名30分钟超时
throw
new
RuntimeException
(
"expired signature"
);
}
return
userKey
.
getUserId
();
}
}
backend/src/main/java/io/dataease/base/domain/UserKey.java
0 → 100644
浏览文件 @
d9ebc295
package
io
.
dataease
.
base
.
domain
;
import
java.io.Serializable
;
import
lombok.Data
;
@Data
public
class
UserKey
implements
Serializable
{
private
Long
id
;
private
Long
userId
;
private
String
accessKey
;
private
String
secretKey
;
private
Long
createTime
;
private
String
status
;
private
static
final
long
serialVersionUID
=
1L
;
}
\ No newline at end of file
backend/src/main/java/io/dataease/base/domain/UserKeyExample.java
0 → 100644
浏览文件 @
d9ebc295
差异被折叠。
点击展开。
backend/src/main/java/io/dataease/base/mapper/UserKeyMapper.java
0 → 100644
浏览文件 @
d9ebc295
package
io
.
dataease
.
base
.
mapper
;
import
io.dataease.base.domain.UserKey
;
import
io.dataease.base.domain.UserKeyExample
;
import
java.util.List
;
import
org.apache.ibatis.annotations.Param
;
public
interface
UserKeyMapper
{
long
countByExample
(
UserKeyExample
example
);
int
deleteByExample
(
UserKeyExample
example
);
int
deleteByPrimaryKey
(
Long
id
);
int
insert
(
UserKey
record
);
int
insertSelective
(
UserKey
record
);
List
<
UserKey
>
selectByExample
(
UserKeyExample
example
);
UserKey
selectByPrimaryKey
(
Long
id
);
int
updateByExampleSelective
(
@Param
(
"record"
)
UserKey
record
,
@Param
(
"example"
)
UserKeyExample
example
);
int
updateByExample
(
@Param
(
"record"
)
UserKey
record
,
@Param
(
"example"
)
UserKeyExample
example
);
int
updateByPrimaryKeySelective
(
UserKey
record
);
int
updateByPrimaryKey
(
UserKey
record
);
}
\ No newline at end of file
backend/src/main/java/io/dataease/base/mapper/UserKeyMapper.xml
0 → 100644
浏览文件 @
d9ebc295
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper
namespace=
"io.dataease.base.mapper.UserKeyMapper"
>
<resultMap
id=
"BaseResultMap"
type=
"io.dataease.base.domain.UserKey"
>
<id
column=
"id"
jdbcType=
"BIGINT"
property=
"id"
/>
<result
column=
"user_id"
jdbcType=
"BIGINT"
property=
"userId"
/>
<result
column=
"access_key"
jdbcType=
"VARCHAR"
property=
"accessKey"
/>
<result
column=
"secret_key"
jdbcType=
"VARCHAR"
property=
"secretKey"
/>
<result
column=
"create_time"
jdbcType=
"BIGINT"
property=
"createTime"
/>
<result
column=
"status"
jdbcType=
"VARCHAR"
property=
"status"
/>
</resultMap>
<sql
id=
"Example_Where_Clause"
>
<where>
<foreach
collection=
"oredCriteria"
item=
"criteria"
separator=
"or"
>
<if
test=
"criteria.valid"
>
<trim
prefix=
"("
prefixOverrides=
"and"
suffix=
")"
>
<foreach
collection=
"criteria.criteria"
item=
"criterion"
>
<choose>
<when
test=
"criterion.noValue"
>
and ${criterion.condition}
</when>
<when
test=
"criterion.singleValue"
>
and ${criterion.condition} #{criterion.value}
</when>
<when
test=
"criterion.betweenValue"
>
and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
</when>
<when
test=
"criterion.listValue"
>
and ${criterion.condition}
<foreach
close=
")"
collection=
"criterion.value"
item=
"listItem"
open=
"("
separator=
","
>
#{listItem}
</foreach>
</when>
</choose>
</foreach>
</trim>
</if>
</foreach>
</where>
</sql>
<sql
id=
"Update_By_Example_Where_Clause"
>
<where>
<foreach
collection=
"example.oredCriteria"
item=
"criteria"
separator=
"or"
>
<if
test=
"criteria.valid"
>
<trim
prefix=
"("
prefixOverrides=
"and"
suffix=
")"
>
<foreach
collection=
"criteria.criteria"
item=
"criterion"
>
<choose>
<when
test=
"criterion.noValue"
>
and ${criterion.condition}
</when>
<when
test=
"criterion.singleValue"
>
and ${criterion.condition} #{criterion.value}
</when>
<when
test=
"criterion.betweenValue"
>
and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
</when>
<when
test=
"criterion.listValue"
>
and ${criterion.condition}
<foreach
close=
")"
collection=
"criterion.value"
item=
"listItem"
open=
"("
separator=
","
>
#{listItem}
</foreach>
</when>
</choose>
</foreach>
</trim>
</if>
</foreach>
</where>
</sql>
<sql
id=
"Base_Column_List"
>
id, user_id, access_key, secret_key, create_time, `status`
</sql>
<select
id=
"selectByExample"
parameterType=
"io.dataease.base.domain.UserKeyExample"
resultMap=
"BaseResultMap"
>
select
<if
test=
"distinct"
>
distinct
</if>
<include
refid=
"Base_Column_List"
/>
from user_key
<if
test=
"_parameter != null"
>
<include
refid=
"Example_Where_Clause"
/>
</if>
<if
test=
"orderByClause != null"
>
order by ${orderByClause}
</if>
</select>
<select
id=
"selectByPrimaryKey"
parameterType=
"java.lang.Long"
resultMap=
"BaseResultMap"
>
select
<include
refid=
"Base_Column_List"
/>
from user_key
where id = #{id,jdbcType=BIGINT}
</select>
<delete
id=
"deleteByPrimaryKey"
parameterType=
"java.lang.Long"
>
delete from user_key
where id = #{id,jdbcType=BIGINT}
</delete>
<delete
id=
"deleteByExample"
parameterType=
"io.dataease.base.domain.UserKeyExample"
>
delete from user_key
<if
test=
"_parameter != null"
>
<include
refid=
"Example_Where_Clause"
/>
</if>
</delete>
<insert
id=
"insert"
parameterType=
"io.dataease.base.domain.UserKey"
>
insert into user_key (id, user_id, access_key,
secret_key, create_time, `status`
)
values (#{id,jdbcType=BIGINT}, #{userId,jdbcType=BIGINT}, #{accessKey,jdbcType=VARCHAR},
#{secretKey,jdbcType=VARCHAR}, #{createTime,jdbcType=BIGINT}, #{status,jdbcType=VARCHAR}
)
</insert>
<insert
id=
"insertSelective"
parameterType=
"io.dataease.base.domain.UserKey"
>
insert into user_key
<trim
prefix=
"("
suffix=
")"
suffixOverrides=
","
>
<if
test=
"id != null"
>
id,
</if>
<if
test=
"userId != null"
>
user_id,
</if>
<if
test=
"accessKey != null"
>
access_key,
</if>
<if
test=
"secretKey != null"
>
secret_key,
</if>
<if
test=
"createTime != null"
>
create_time,
</if>
<if
test=
"status != null"
>
`status`,
</if>
</trim>
<trim
prefix=
"values ("
suffix=
")"
suffixOverrides=
","
>
<if
test=
"id != null"
>
#{id,jdbcType=BIGINT},
</if>
<if
test=
"userId != null"
>
#{userId,jdbcType=BIGINT},
</if>
<if
test=
"accessKey != null"
>
#{accessKey,jdbcType=VARCHAR},
</if>
<if
test=
"secretKey != null"
>
#{secretKey,jdbcType=VARCHAR},
</if>
<if
test=
"createTime != null"
>
#{createTime,jdbcType=BIGINT},
</if>
<if
test=
"status != null"
>
#{status,jdbcType=VARCHAR},
</if>
</trim>
</insert>
<select
id=
"countByExample"
parameterType=
"io.dataease.base.domain.UserKeyExample"
resultType=
"java.lang.Long"
>
select count(*) from user_key
<if
test=
"_parameter != null"
>
<include
refid=
"Example_Where_Clause"
/>
</if>
</select>
<update
id=
"updateByExampleSelective"
parameterType=
"map"
>
update user_key
<set>
<if
test=
"record.id != null"
>
id = #{record.id,jdbcType=BIGINT},
</if>
<if
test=
"record.userId != null"
>
user_id = #{record.userId,jdbcType=BIGINT},
</if>
<if
test=
"record.accessKey != null"
>
access_key = #{record.accessKey,jdbcType=VARCHAR},
</if>
<if
test=
"record.secretKey != null"
>
secret_key = #{record.secretKey,jdbcType=VARCHAR},
</if>
<if
test=
"record.createTime != null"
>
create_time = #{record.createTime,jdbcType=BIGINT},
</if>
<if
test=
"record.status != null"
>
`status` = #{record.status,jdbcType=VARCHAR},
</if>
</set>
<if
test=
"_parameter != null"
>
<include
refid=
"Update_By_Example_Where_Clause"
/>
</if>
</update>
<update
id=
"updateByExample"
parameterType=
"map"
>
update user_key
set id = #{record.id,jdbcType=BIGINT},
user_id = #{record.userId,jdbcType=BIGINT},
access_key = #{record.accessKey,jdbcType=VARCHAR},
secret_key = #{record.secretKey,jdbcType=VARCHAR},
create_time = #{record.createTime,jdbcType=BIGINT},
`status` = #{record.status,jdbcType=VARCHAR}
<if
test=
"_parameter != null"
>
<include
refid=
"Update_By_Example_Where_Clause"
/>
</if>
</update>
<update
id=
"updateByPrimaryKeySelective"
parameterType=
"io.dataease.base.domain.UserKey"
>
update user_key
<set>
<if
test=
"userId != null"
>
user_id = #{userId,jdbcType=BIGINT},
</if>
<if
test=
"accessKey != null"
>
access_key = #{accessKey,jdbcType=VARCHAR},
</if>
<if
test=
"secretKey != null"
>
secret_key = #{secretKey,jdbcType=VARCHAR},
</if>
<if
test=
"createTime != null"
>
create_time = #{createTime,jdbcType=BIGINT},
</if>
<if
test=
"status != null"
>
`status` = #{status,jdbcType=VARCHAR},
</if>
</set>
where id = #{id,jdbcType=BIGINT}
</update>
<update
id=
"updateByPrimaryKey"
parameterType=
"io.dataease.base.domain.UserKey"
>
update user_key
set user_id = #{userId,jdbcType=BIGINT},
access_key = #{accessKey,jdbcType=VARCHAR},
secret_key = #{secretKey,jdbcType=VARCHAR},
create_time = #{createTime,jdbcType=BIGINT},
`status` = #{status,jdbcType=VARCHAR}
where id = #{id,jdbcType=BIGINT}
</update>
</mapper>
\ No newline at end of file
backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelViewLinkageMapper.java
浏览文件 @
d9ebc295
package
io
.
dataease
.
base
.
mapper
.
ext
;
import
io.dataease.base.domain.DatasetTableField
;
import
io.dataease.dto.LinkageInfoDTO
;
import
io.dataease.dto.PanelViewLinkageDTO
;
import
org.apache.ibatis.annotations.Param
;
import
java.util.List
;
import
java.util.Map
;
public
interface
ExtPanelViewLinkageMapper
{
List
<
PanelViewLinkageDTO
>
getViewLinkageGather
(
@Param
(
"panelId"
)
String
panelId
,
@Param
(
"sourceViewId"
)
String
sourceViewId
,
@Param
(
"targetViewIds"
)
List
<
String
>
targetViewIds
);
List
<
LinkageInfoDTO
>
getPanelAllLinkageInfo
(
@Param
(
"panelId"
)
String
panelId
);
List
<
DatasetTableField
>
queryTableField
(
@Param
(
"table_id"
)
String
tableId
);
void
deleteViewLinkage
(
@Param
(
"panelId"
)
String
panelId
,
@Param
(
"sourceViewId"
)
String
sourceViewId
);
...
...
backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelViewLinkageMapper.xml
浏览文件 @
d9ebc295
...
...
@@ -24,6 +24,14 @@
</collection>
</resultMap>
<resultMap
id=
"AllLinkageMap"
type=
"io.dataease.dto.LinkageInfoDTO"
>
<result
column=
"sourceInfo"
jdbcType=
"VARCHAR"
property=
"sourceInfo"
/>
<collection
property=
"targetInfoList"
ofType=
"String"
>
<result
column=
"targetInfo"
jdbcType=
"VARCHAR"
/>
</collection>
</resultMap>
<select
id=
"getViewLinkageGather"
resultMap=
"LinkageGatherMap"
>
SELECT
chart_view.`name` as 'targetViewName',
...
...
@@ -78,4 +86,16 @@
(#{menu.menuId},#{menu.title},#{menu.pid},#{menu.subCount},#{menu.permission},#{menu.hidden},ifnull(#{menu.hidden},0))
</foreach>
</insert>
<select
id=
"getPanelAllLinkageInfo"
resultMap=
"AllLinkageMap"
>
SELECT
distinct
CONCAT( panel_view_linkage.source_view_id, '#', panel_view_linkage_field.source_field ) AS 'sourceInfo',
CONCAT( panel_view_linkage.target_view_id, '#', panel_view_linkage_field.target_field ) AS 'targetInfo'
FROM
panel_view_linkage
LEFT JOIN panel_view_linkage_field ON panel_view_linkage.id = panel_view_linkage_field.linkage_id
WHERE
panel_view_linkage.panel_id = #{panelId}
</select>
</mapper>
backend/src/main/java/io/dataease/commons/utils/CodingUtil.java
浏览文件 @
d9ebc295
...
...
@@ -7,6 +7,7 @@ import javax.crypto.*;
import
javax.crypto.spec.IvParameterSpec
;
import
javax.crypto.spec.SecretKeySpec
;
import
java.security.MessageDigest
;
import
java.util.UUID
;
/**
* 加密解密工具
...
...
@@ -153,6 +154,17 @@ public class CodingUtil {
}
}
/*public static String getSignature(String accessKey, String secretKey) throws Exception {
return aesEncrypt(accessKey + "|" + UUID.randomUUID().toString() + "|" + System.currentTimeMillis(), secretKey, accessKey);
}
public static void main(String[] args) throws Exception{
String accessKey = "gnPFmtAsdLhUEWPA";
String secretKey = "TfK5FGUle0KRfJJJ";
String signature = getSignature(accessKey, secretKey);
System.out.println(signature);
}*/
public
static
String
secretKey
()
{
try
{
KeyGenerator
keyGen
=
KeyGenerator
.
getInstance
(
"AES"
);
...
...
backend/src/main/java/io/dataease/config/Knife4jConfiguration.java
浏览文件 @
d9ebc295
...
...
@@ -77,7 +77,9 @@ public class Knife4jConfiguration {
private
Docket
defaultApi
(
String
groupName
,
String
packageName
)
{
List
<
SecurityScheme
>
securitySchemes
=
new
ArrayList
<>();
securitySchemes
.
add
(
apiKey
());
securitySchemes
.
add
(
accessKey
());
securitySchemes
.
add
(
signature
());
List
<
SecurityContext
>
securityContexts
=
new
ArrayList
<>();
securityContexts
.
add
(
securityContext
());
...
...
@@ -100,8 +102,12 @@ public class Knife4jConfiguration {
.
build
();
}
private
ApiKey
apiKey
()
{
return
new
ApiKey
(
"Authorization"
,
"Authorization"
,
"header"
);
private
ApiKey
accessKey
()
{
return
new
ApiKey
(
"accessKey"
,
"accessKey"
,
"header"
);
}
private
ApiKey
signature
()
{
return
new
ApiKey
(
"signature"
,
"signature"
,
"header"
);
}
...
...
@@ -109,7 +115,12 @@ public class Knife4jConfiguration {
AuthorizationScope
authorizationScope
=
new
AuthorizationScope
(
"global"
,
"accessEverything"
);
AuthorizationScope
[]
authorizationScopes
=
new
AuthorizationScope
[
1
];
authorizationScopes
[
0
]
=
authorizationScope
;
return
CollectionUtil
.
newArrayList
(
new
SecurityReference
(
"Authorization"
,
authorizationScopes
));
List
<
SecurityReference
>
results
=
new
ArrayList
<>();
results
.
add
(
new
SecurityReference
(
"accessKey"
,
authorizationScopes
));
results
.
add
(
new
SecurityReference
(
"signature"
,
authorizationScopes
));
return
results
;
}
}
backend/src/main/java/io/dataease/controller/panel/PanelViewLinkageController.java
浏览文件 @
d9ebc295
...
...
@@ -9,6 +9,7 @@ import io.swagger.annotations.ApiOperation;
import
org.springframework.web.bind.annotation.*
;
import
javax.annotation.Resource
;
import
java.util.List
;
import
java.util.Map
;
/**
...
...
@@ -39,5 +40,10 @@ public class PanelViewLinkageController {
}
@ApiOperation
(
"获取当前仪表板所有联动信息"
)
@GetMapping
(
"/getPanelAllLinkageInfo/{panelId}"
)
public
Map
<
String
,
List
<
String
>>
getPanelAllLinkageInfo
(
@PathVariable
String
panelId
){
return
panelViewLinkageService
.
getPanelAllLinkageInfo
(
panelId
);
}
}
backend/src/main/java/io/dataease/controller/request/chart/ChartDrillRequest.java
0 → 100644
浏览文件 @
d9ebc295
package
io
.
dataease
.
controller
.
request
.
chart
;
import
io.dataease.dto.chart.ChartDimensionDTO
;
import
lombok.Data
;
import
java.util.List
;
/**
* @Author gin
* @Date 2021/8/10 12:25 下午
*/
@Data
public
class
ChartDrillRequest
{
private
List
<
ChartDimensionDTO
>
dimensionList
;
}
backend/src/main/java/io/dataease/controller/request/chart/ChartExtRequest.java
浏览文件 @
d9ebc295
...
...
@@ -13,4 +13,8 @@ import java.util.List;
@Setter
public
class
ChartExtRequest
{
private
List
<
ChartExtFilterRequest
>
filter
;
//联动过滤条件
private
List
<
ChartExtFilterRequest
>
linkageFilters
;
private
List
<
ChartDrillRequest
>
drill
;
}
backend/src/main/java/io/dataease/dto/LinkageInfoDTO.java
0 → 100644
浏览文件 @
d9ebc295
package
io
.
dataease
.
dto
;
import
java.util.List
;
/**
* Author: wangjiahao
* Date: 8/10/21
* Description:
*/
public
class
LinkageInfoDTO
{
private
String
sourceInfo
;
private
List
<
String
>
targetInfoList
;
public
String
getSourceInfo
()
{
return
sourceInfo
;
}
public
void
setSourceInfo
(
String
sourceInfo
)
{
this
.
sourceInfo
=
sourceInfo
;
}
public
List
<
String
>
getTargetInfoList
()
{
return
targetInfoList
;
}
public
void
setTargetInfoList
(
List
<
String
>
targetInfoList
)
{
this
.
targetInfoList
=
targetInfoList
;
}
}
backend/src/main/java/io/dataease/dto/chart/ChartViewDTO.java
浏览文件 @
d9ebc295
package
io
.
dataease
.
dto
.
chart
;
import
io.dataease.base.domain.ChartViewWithBLOBs
;
import
io.dataease.controller.request.chart.ChartDrillRequest
;
import
lombok.Getter
;
import
lombok.Setter
;
import
java.util.List
;
import
java.util.Map
;
/**
...
...
@@ -20,4 +22,6 @@ public class ChartViewDTO extends ChartViewWithBLOBs {
private
Boolean
isLeaf
;
private
String
pid
;
private
String
sql
;
private
boolean
drill
;
}
backend/src/main/java/io/dataease/plugins/server/XUserKeysServer.java
0 → 100644
浏览文件 @
d9ebc295
package
io
.
dataease
.
plugins
.
server
;
import
io.dataease.commons.utils.AuthUtils
;
import
io.dataease.plugins.config.SpringContextUtil
;
import
io.dataease.plugins.xpack.ukey.dto.request.XpackUkeyDto
;
import
io.dataease.plugins.xpack.ukey.service.UkeyXpackService
;
import
org.springframework.web.bind.annotation.*
;
import
javax.servlet.ServletRequest
;
import
java.util.List
;
@RequestMapping
(
"/plugin/ukey"
)
@RestController
public
class
XUserKeysServer
{
@PostMapping
(
"info"
)
public
List
<
XpackUkeyDto
>
getUserKeysInfo
()
{
UkeyXpackService
ukeyXpackService
=
SpringContextUtil
.
getBean
(
UkeyXpackService
.
class
);
Long
userId
=
AuthUtils
.
getUser
().
getUserId
();
return
ukeyXpackService
.
getUserKeysInfo
(
userId
);
}
@PostMapping
(
"validate"
)
public
String
validate
(
ServletRequest
request
)
{
// return ApiKeyHandler.getUser(WebUtils.toHttp(request));
return
null
;
}
@PostMapping
(
"generate"
)
public
void
generateUserKey
()
{
UkeyXpackService
ukeyXpackService
=
SpringContextUtil
.
getBean
(
UkeyXpackService
.
class
);
Long
userId
=
AuthUtils
.
getUser
().
getUserId
();
ukeyXpackService
.
generateUserKey
(
userId
);
}
@PostMapping
(
"delete/{id}"
)
public
void
deleteUserKey
(
@PathVariable
Long
id
)
{
UkeyXpackService
ukeyXpackService
=
SpringContextUtil
.
getBean
(
UkeyXpackService
.
class
);
ukeyXpackService
.
deleteUserKey
(
id
);
}
@PostMapping
(
"changeStatus/{id}"
)
public
void
changeStatus
(
@PathVariable
Long
id
)
{
UkeyXpackService
ukeyXpackService
=
SpringContextUtil
.
getBean
(
UkeyXpackService
.
class
);
ukeyXpackService
.
switchStatus
(
id
);
}
/*@GetMapping("active/{id}")
public void activeUserKey(@PathVariable Long id) {
UkeyXpackService ukeyXpackService = SpringContextUtil.getBean(UkeyXpackService.class);
ukeyXpackService.activeUserKey(id);
}
@GetMapping("disable/{id}")
public void disabledUserKey(@PathVariable Long id) {
UkeyXpackService ukeyXpackService = SpringContextUtil.getBean(UkeyXpackService.class);
ukeyXpackService.disableUserKey(id);
}*/
}
backend/src/main/java/io/dataease/provider/oracle/OracleQueryProvider.java
浏览文件 @
d9ebc295
...
...
@@ -632,10 +632,10 @@ public class OracleQueryProvider extends QueryProvider {
public
String
createRawQuerySQL
(
String
table
,
List
<
DatasetTableField
>
fields
)
{
String
[]
array
=
fields
.
stream
().
map
(
f
->
{
StringBuilder
stringBuilder
=
new
StringBuilder
();
stringBuilder
.
append
(
"
"
).
append
(
f
.
getOriginName
()
);
stringBuilder
.
append
(
"
\""
).
append
(
f
.
getOriginName
()).
append
(
"\""
);
return
stringBuilder
.
toString
();
}).
toArray
(
String
[]::
new
);
return
MessageFormat
.
format
(
"SELECT {0} FROM {1} ORDER BY null"
,
StringUtils
.
join
(
array
,
","
),
table
);
return
MessageFormat
.
format
(
"SELECT {0} FROM {1} ORDER BY null"
,
StringUtils
.
join
(
array
,
","
),
"\""
+
table
+
"\""
);
}
@Override
...
...
backend/src/main/java/io/dataease/service/chart/ChartViewService.java
浏览文件 @
d9ebc295
...
...
@@ -11,19 +11,12 @@ import io.dataease.commons.utils.AuthUtils;
import
io.dataease.commons.utils.BeanUtils
;
import
io.dataease.commons.utils.CommonBeanFactory
;
import
io.dataease.commons.utils.LogUtil
;
import
io.dataease.controller.request.chart.ChartExtFilterRequest
;
import
io.dataease.controller.request.chart.ChartExtRequest
;
import
io.dataease.controller.request.chart.ChartGroupRequest
;
import
io.dataease.controller.request.chart.ChartViewRequest
;
import
io.dataease.controller.request.dataset.DataSetGroupRequest
;
import
io.dataease.controller.request.dataset.DataSetTableRequest
;
import
io.dataease.controller.request.chart.*
;
import
io.dataease.datasource.provider.DatasourceProvider
;
import
io.dataease.datasource.provider.ProviderFactory
;
import
io.dataease.datasource.request.DatasourceRequest
;
import
io.dataease.datasource.service.DatasourceService
;
import
io.dataease.dto.chart.*
;
import
io.dataease.dto.dataset.DataSetGroupDTO
;
import
io.dataease.dto.dataset.DataSetTableDTO
;
import
io.dataease.dto.dataset.DataSetTableUnionDTO
;
import
io.dataease.dto.dataset.DataTableInfoDTO
;
import
io.dataease.i18n.Translator
;
...
...
@@ -197,6 +190,8 @@ public class ChartViewService {
}.
getType
());
List
<
ChartFieldCustomFilterDTO
>
fieldCustomFilter
=
new
Gson
().
fromJson
(
view
.
getCustomFilter
(),
new
TypeToken
<
List
<
ChartFieldCustomFilterDTO
>>()
{
}.
getType
());
List
<
ChartViewFieldDTO
>
drill
=
new
Gson
().
fromJson
(
view
.
getDrillFields
(),
new
TypeToken
<
List
<
ChartViewFieldDTO
>>()
{
}.
getType
());
List
<
ChartCustomFilterDTO
>
customFilter
=
new
ArrayList
<>();
for
(
ChartFieldCustomFilterDTO
ele
:
fieldCustomFilter
)
{
List
<
ChartCustomFilterDTO
>
collect
=
ele
.
getFilter
().
stream
().
map
(
f
->
{
...
...
@@ -225,6 +220,8 @@ public class ChartViewService {
// 过滤来自仪表板的条件
List
<
ChartExtFilterRequest
>
extFilterList
=
new
ArrayList
<>();
//组件过滤条件
if
(
ObjectUtils
.
isNotEmpty
(
requestList
.
getFilter
()))
{
for
(
ChartExtFilterRequest
request
:
requestList
.
getFilter
())
{
DatasetTableField
datasetTableField
=
dataSetTableFieldsService
.
get
(
request
.
getFieldId
());
...
...
@@ -241,6 +238,55 @@ public class ChartViewService {
}
}
//联动过滤条件联动条件全部加上
if
(
ObjectUtils
.
isNotEmpty
(
requestList
.
getLinkageFilters
()))
{
for
(
ChartExtFilterRequest
request
:
requestList
.
getLinkageFilters
())
{
DatasetTableField
datasetTableField
=
dataSetTableFieldsService
.
get
(
request
.
getFieldId
());
request
.
setDatasetTableField
(
datasetTableField
);
if
(
StringUtils
.
equalsIgnoreCase
(
datasetTableField
.
getTableId
(),
view
.
getTableId
()))
{
if
(
CollectionUtils
.
isNotEmpty
(
request
.
getViewIds
()))
{
if
(
request
.
getViewIds
().
contains
(
view
.
getId
()))
{
extFilterList
.
add
(
request
);
}
}
else
{
extFilterList
.
add
(
request
);
}
}
}
}
// 下钻
boolean
isDrill
=
false
;
List
<
ChartDrillRequest
>
drillRequest
=
requestList
.
getDrill
();
if
(
CollectionUtils
.
isNotEmpty
(
drillRequest
)
&&
(
drill
.
size
()
>=
drillRequest
.
size
()))
{
for
(
int
i
=
0
;
i
<
drillRequest
.
size
();
i
++)
{
ChartDrillRequest
request
=
drillRequest
.
get
(
i
);
for
(
ChartDimensionDTO
dto
:
request
.
getDimensionList
())
{
ChartViewFieldDTO
chartViewFieldDTO
=
drill
.
get
(
i
);
// 将钻取值作为条件传递,将所有钻取字段作为xAxis并加上下一个钻取字段
if
(
StringUtils
.
equalsIgnoreCase
(
dto
.
getId
(),
chartViewFieldDTO
.
getId
()))
{
isDrill
=
true
;
DatasetTableField
datasetTableField
=
dataSetTableFieldsService
.
get
(
dto
.
getId
());
ChartViewFieldDTO
d
=
new
ChartViewFieldDTO
();
BeanUtils
.
copyBean
(
d
,
datasetTableField
);
ChartExtFilterRequest
drillFilter
=
new
ChartExtFilterRequest
();
drillFilter
.
setFieldId
(
dto
.
getId
());
drillFilter
.
setValue
(
new
ArrayList
<
String
>()
{{
add
(
dto
.
getValue
());
}});
drillFilter
.
setOperator
(
"in"
);
drillFilter
.
setDatasetTableField
(
datasetTableField
);
extFilterList
.
add
(
drillFilter
);
// xAxis.add(d);
// if (i == drillRequest.size() - 1) {
// xAxis.add(drill.get(i + 1));
// }
}
}
}
}
// 获取数据集,需校验权限
DatasetTable
table
=
dataSetTableService
.
get
(
view
.
getTableId
());
if
(
ObjectUtils
.
isEmpty
(
table
))
{
...
...
@@ -339,7 +385,9 @@ public class ChartViewService {
data = (List<String[]>) cache;
}*/
// 仪表板有参数不实用缓存
if
(
CollectionUtils
.
isNotEmpty
(
requestList
.
getFilter
()))
{
if
(
CollectionUtils
.
isNotEmpty
(
requestList
.
getFilter
())
||
CollectionUtils
.
isNotEmpty
(
requestList
.
getLinkageFilters
())
||
CollectionUtils
.
isNotEmpty
(
requestList
.
getDrill
()))
{
data
=
datasourceProvider
.
getData
(
datasourceRequest
);
}
else
{
try
{
...
...
@@ -367,6 +415,9 @@ public class ChartViewService {
mapChart
=
transScatterData
(
xAxis
,
yAxis
,
view
,
data
,
extBubble
);
}
else
if
(
StringUtils
.
containsIgnoreCase
(
view
.
getType
(),
"radar"
))
{
mapChart
=
transRadarChartData
(
xAxis
,
yAxis
,
view
,
data
);
}
else
if
(
StringUtils
.
containsIgnoreCase
(
view
.
getType
(),
"text"
)
||
StringUtils
.
containsIgnoreCase
(
view
.
getType
(),
"gauge"
))
{
mapChart
=
transNormalChartData
(
xAxis
,
yAxis
,
view
,
data
);
}
else
{
mapChart
=
transChartData
(
xAxis
,
yAxis
,
view
,
data
);
}
...
...
@@ -380,6 +431,8 @@ public class ChartViewService {
BeanUtils
.
copyBean
(
dto
,
view
);
dto
.
setData
(
map
);
dto
.
setSql
(
datasourceRequest
.
getQuery
());
dto
.
setDrill
(
isDrill
);
return
dto
;
}
...
...
@@ -476,6 +529,44 @@ public class ChartViewService {
return
map
;
}
// 常规图形
private
Map
<
String
,
Object
>
transNormalChartData
(
List
<
ChartViewFieldDTO
>
xAxis
,
List
<
ChartViewFieldDTO
>
yAxis
,
ChartViewWithBLOBs
view
,
List
<
String
[]>
data
)
{
Map
<
String
,
Object
>
map
=
new
HashMap
<>();
List
<
String
>
x
=
new
ArrayList
<>();
List
<
Series
>
series
=
new
ArrayList
<>();
for
(
ChartViewFieldDTO
y
:
yAxis
)
{
Series
series1
=
new
Series
();
series1
.
setName
(
y
.
getName
());
series1
.
setType
(
view
.
getType
());
series1
.
setData
(
new
ArrayList
<>());
series
.
add
(
series1
);
}
for
(
String
[]
d
:
data
)
{
StringBuilder
a
=
new
StringBuilder
();
for
(
int
i
=
0
;
i
<
xAxis
.
size
();
i
++)
{
if
(
i
==
xAxis
.
size
()
-
1
)
{
a
.
append
(
d
[
i
]);
}
else
{
a
.
append
(
d
[
i
]).
append
(
"\n"
);
}
}
x
.
add
(
a
.
toString
());
for
(
int
i
=
xAxis
.
size
();
i
<
xAxis
.
size
()
+
yAxis
.
size
();
i
++)
{
int
j
=
i
-
xAxis
.
size
();
try
{
series
.
get
(
j
).
getData
().
add
(
new
BigDecimal
(
StringUtils
.
isEmpty
(
d
[
i
])
?
"0"
:
d
[
i
]));
}
catch
(
Exception
e
)
{
series
.
get
(
j
).
getData
().
add
(
new
BigDecimal
(
0
));
}
}
}
map
.
put
(
"x"
,
x
);
map
.
put
(
"series"
,
series
);
return
map
;
}
// radar图
private
Map
<
String
,
Object
>
transRadarChartData
(
List
<
ChartViewFieldDTO
>
xAxis
,
List
<
ChartViewFieldDTO
>
yAxis
,
ChartViewWithBLOBs
view
,
List
<
String
[]>
data
)
{
Map
<
String
,
Object
>
map
=
new
HashMap
<>();
...
...
backend/src/main/java/io/dataease/service/panel/PanelViewLinkageService.java
浏览文件 @
d9ebc295
...
...
@@ -8,6 +8,7 @@ import io.dataease.base.mapper.PanelViewLinkageMapper;
import
io.dataease.base.mapper.ext.ExtPanelViewLinkageMapper
;
import
io.dataease.commons.utils.AuthUtils
;
import
io.dataease.controller.request.panel.PanelLinkageRequest
;
import
io.dataease.dto.LinkageInfoDTO
;
import
io.dataease.dto.PanelViewLinkageDTO
;
import
io.dataease.dto.PanelViewLinkageFieldDTO
;
import
org.apache.commons.collections4.CollectionUtils
;
...
...
@@ -89,19 +90,12 @@ public class PanelViewLinkageService {
});
}
}
}
public
Map
<
String
,
List
<
String
>>
getPanelAllLinkageInfo
(
String
panelId
)
{
List
<
LinkageInfoDTO
>
info
=
extPanelViewLinkageMapper
.
getPanelAllLinkageInfo
(
panelId
);
return
Optional
.
ofNullable
(
info
).
orElse
(
new
ArrayList
<>()).
stream
().
collect
(
Collectors
.
toMap
(
LinkageInfoDTO:
:
getSourceInfo
,
LinkageInfoDTO:
:
getTargetInfoList
));
}
}
backend/src/main/resources/application.properties
浏览文件 @
d9ebc295
...
...
@@ -28,7 +28,7 @@ knife4j.enable=true
knife4j.setting.enableFooter
=
false
knife4j.setting.enableFooterCustom
=
false
knife4j.setting.footerCustomContent
=
fit2cloud 1.0-b9
knife4j.setting.enableSwaggerModels
=
false
#
knife4j.setting.enableSwaggerModels=false
knife4j.setting.enableDocumentManage
=
false
knife4j.setting.enableSearch
=
false
knife4j.setting.enableOpenApi
=
false
...
...
backend/src/main/resources/db/migration/V21__user_key.sql
0 → 100644
浏览文件 @
d9ebc295
-- ----------------------------
-- Table structure for user_key
-- ----------------------------
DROP
TABLE
IF
EXISTS
`user_key`
;
CREATE
TABLE
`user_key`
(
`id`
bigint
(
20
)
NOT
NULL
AUTO_INCREMENT
COMMENT
'ID'
,
`user_id`
bigint
(
20
)
DEFAULT
NULL
COMMENT
'用户ID'
,
`access_key`
varchar
(
50
)
NOT
NULL
COMMENT
'access_key'
,
`secret_key`
varchar
(
50
)
NOT
NULL
COMMENT
'secret key'
,
`create_time`
bigint
(
13
)
NOT
NULL
COMMENT
'创建时间'
,
`status`
varchar
(
10
)
DEFAULT
NULL
COMMENT
'状态'
,
PRIMARY
KEY
(
`id`
)
USING
BTREE
,
UNIQUE
KEY
`IDX_AK`
(
`access_key`
),
KEY
`IDX_USER_K_ID`
(
`user_id`
)
USING
BTREE
)
ENGINE
=
InnoDB
AUTO_INCREMENT
=
17
DEFAULT
CHARSET
=
utf8
ROW_FORMAT
=
COMPACT
COMMENT
=
'用户KEY'
;
\ No newline at end of file
frontend/src/api/panel/linkage.js
浏览文件 @
d9ebc295
...
...
@@ -18,3 +18,9 @@ export function saveLinkage(requestInfo) {
})
}
export
function
getPanelAllLinkageInfo
(
panelId
)
{
return
request
({
url
:
'/linkage/getPanelAllLinkageInfo/'
+
panelId
,
method
:
'get'
})
}
frontend/src/components/canvas/components/Editor/ComponentWrapper.vue
浏览文件 @
d9ebc295
...
...
@@ -102,7 +102,6 @@ export default {
})
},
elementMouseDown
(
e
)
{
debugger
// private 设置当前组件数据及状态
this
.
$store
.
commit
(
'setClickComponentStatus'
,
true
)
if
(
this
.
config
.
component
!==
'v-text'
&&
this
.
config
.
component
!==
'rect-shape'
&&
this
.
config
.
component
!==
'de-input-search'
&&
this
.
config
.
component
!==
'de-number-range'
)
{
...
...
frontend/src/components/canvas/components/Editor/Preview.vue
浏览文件 @
d9ebc295
...
...
@@ -209,7 +209,6 @@ export default {
this
.
$refs
[
'userViewDialog'
].
exportExcel
()
},
deselectCurComponent
(
e
)
{
debugger
if
(
!
this
.
isClickComponent
)
{
this
.
$store
.
commit
(
'setCurComponent'
,
{
component
:
null
,
index
:
null
})
}
...
...
frontend/src/components/canvas/custom-component/UserView.vue
浏览文件 @
d9ebc295
...
...
@@ -84,6 +84,7 @@ export default {
filter
()
{
const
filter
=
{}
filter
.
filter
=
this
.
element
.
filters
filter
.
linkageFilters
=
this
.
element
.
linkageFilters
return
filter
},
filters
()
{
...
...
@@ -91,6 +92,13 @@ export default {
if
(
!
this
.
element
.
filters
)
return
[]
return
JSON
.
parse
(
JSON
.
stringify
(
this
.
element
.
filters
))
},
linkageFilters
()
{
// 必要 勿删勿该 watch数组,哪怕发生变化 oldValue等于newValue ,深拷贝解决
if
(
!
this
.
element
.
linkageFilters
)
return
[]
console
.
log
(
'linkageFilters:'
+
JSON
.
stringify
(
this
.
element
.
linkageFilters
))
return
JSON
.
parse
(
JSON
.
stringify
(
this
.
element
.
linkageFilters
))
},
...
mapState
([
'canvasStyleData'
])
...
...
@@ -101,6 +109,13 @@ export default {
// this.getData(this.element.propValue.viewId)
isChange
(
val1
,
val2
)
&&
this
.
getData
(
this
.
element
.
propValue
.
viewId
)
},
linkageFilters
:
{
handler
(
newVal
,
oldVal
)
{
debugger
isChange
(
newVal
,
oldVal
)
&&
this
.
getData
(
this
.
element
.
propValue
.
viewId
)
},
deep
:
true
},
// deep监听panel 如果改变 提交到 store
canvasStyleData
:
{
handler
(
newVal
,
oldVla
)
{
...
...
frontend/src/components/canvas/store/copy.js
浏览文件 @
d9ebc295
...
...
@@ -41,7 +41,6 @@ export default {
data
.
id
=
generateID
()
// 如果是用户视图 测先进行底层复制
debugger
if
(
data
.
type
===
'view'
)
{
chartCopy
(
data
.
propValue
.
viewId
).
then
(
res
=>
{
const
newView
=
deepCopy
(
data
)
...
...
frontend/src/icons/svg/treemap.svg
0 → 100644
浏览文件 @
d9ebc295
<svg
t=
"1628490858856"
class=
"icon"
viewBox=
"0 0 1024 1024"
version=
"1.1"
xmlns=
"http://www.w3.org/2000/svg"
p-id=
"2380"
width=
"200"
height=
"200"
><path
d=
"M64 128h512v448H64z m0 512h512v256H64z m576-192h320v448H640z m0-320h320v256H640z"
p-id=
"2381"
></path></svg>
frontend/src/lang/en.js
浏览文件 @
d9ebc295
...
...
@@ -337,7 +337,8 @@ export default {
confirm
:
'Confirm'
,
ok
:
'Confirm'
,
cancel
:
'Cancel'
}
},
ukey_title
:
'API Keys'
},
documentation
:
{
documentation
:
'Documentation'
,
...
...
@@ -831,7 +832,15 @@ export default {
axis_label_rotate
:
'Label Rotate'
,
chart_scatter_bubble
:
'Bubble'
,
chart_scatter
:
'Scatter'
,
bubble_size
:
'Bubble Size'
bubble_size
:
'Bubble Size'
,
chart_treemap
:
'Tree Map'
,
drill
:
'Drill'
,
drag_block_treemap_label
:
'Color Label'
,
drag_block_treemap_size
:
'Color Size'
,
bubble_symbol
:
'Shape'
,
gap_width
:
'Gap Width'
,
width
:
'Width'
,
height
:
'Height'
},
dataset
:
{
sheet_warn
:
'There are multiple sheet pages, and the first one is extracted by default'
,
...
...
frontend/src/lang/tw.js
浏览文件 @
d9ebc295
...
...
@@ -337,7 +337,8 @@ export default {
confirm
:
'確認'
,
ok
:
'確認'
,
cancel
:
'取消'
}
},
ukey_title
:
'API Keys'
},
documentation
:
{
documentation
:
'文檔'
,
...
...
@@ -831,7 +832,15 @@ export default {
axis_label_rotate
:
'標簽角度'
,
chart_scatter_bubble
:
'氣泡圖'
,
chart_scatter
:
'散點圖'
,
bubble_size
:
'氣泡大小'
bubble_size
:
'氣泡大小'
,
chart_treemap
:
'矩形樹圖'
,
drill
:
'鉆取'
,
drag_block_treemap_label
:
'色塊標簽'
,
drag_block_treemap_size
:
'色塊大小'
,
bubble_symbol
:
'圖形'
,
gap_width
:
'間隔'
,
width
:
'寬度'
,
height
:
'高度'
},
dataset
:
{
sheet_warn
:
'有多個sheet頁面,默認抽取第一個'
,
...
...
frontend/src/lang/zh.js
浏览文件 @
d9ebc295
...
...
@@ -337,7 +337,8 @@ export default {
confirm
:
'确认'
,
ok
:
'确认'
,
cancel
:
'取消'
}
},
ukey_title
:
'API Keys'
},
documentation
:
{
documentation
:
'文档'
,
...
...
@@ -831,7 +832,15 @@ export default {
axis_label_rotate
:
'标签角度'
,
chart_scatter_bubble
:
'气泡图'
,
chart_scatter
:
'散点图'
,
bubble_size
:
'气泡大小'
bubble_size
:
'气泡大小'
,
chart_treemap
:
'矩形树图'
,
drill
:
'钻取'
,
drag_block_treemap_label
:
'色块标签'
,
drag_block_treemap_size
:
'色块大小'
,
bubble_symbol
:
'图形'
,
gap_width
:
'间隔'
,
width
:
'宽度'
,
height
:
'高度'
},
dataset
:
{
sheet_warn
:
'有多个 Sheet 页,默认抽取第一个'
,
...
...
frontend/src/layout/components/Topbar.vue
浏览文件 @
d9ebc295
...
...
@@ -53,6 +53,11 @@
<router-link
to=
"/person-info/index"
>
<el-dropdown-item>
{{ $t('commons.personal_info') }}
</el-dropdown-item>
</router-link>
<router-link
v-if=
"$store.getters.validate"
to=
"/ukey/index"
>
<el-dropdown-item>
{{ $t('commons.ukey_title') }}
</el-dropdown-item>
</router-link>
<router-link
to=
"/person-pwd/index"
>
<el-dropdown-item>
{{ $t('user.change_password') }}
</el-dropdown-item>
</router-link>
...
...
frontend/src/store/index.js
浏览文件 @
d9ebc295
...
...
@@ -21,7 +21,9 @@ import event from '@/components/canvas/store/event'
import
layer
from
'@/components/canvas/store/layer'
import
snapshot
from
'@/components/canvas/store/snapshot'
import
lock
from
'@/components/canvas/store/lock'
import
{
valueValid
,
formatCondition
}
from
'@/utils/conditionUtil'
import
{
valueValid
,
formatCondition
,
formatLinkageCondition
}
from
'@/utils/conditionUtil'
import
{
Condition
}
from
'@/components/widget/bean/Condition'
import
{
DEFAULT_COMMON_CANVAS_STYLE_STRING
}
from
'@/views/panel/panel'
...
...
@@ -54,7 +56,9 @@ const data = {
// 当前设置联动的组件
curLinkageView
:
null
,
// 和当前组件联动的目标组件
targetLinkageInfo
:
[]
targetLinkageInfo
:
[],
// 当前仪表板联动 下钻 上卷等信息
nowPanelTrackInfo
:
{}
},
mutations
:
{
...
animation
.
mutations
,
...
...
@@ -154,6 +158,47 @@ const data = {
state
.
componentData
[
index
]
=
element
}
},
// 添加联动 下钻 等过滤组件
addViewTrackFilter
(
state
,
data
)
{
console
.
log
(
'联动信息'
,
JSON
.
stringify
(
data
))
const
viewId
=
data
.
viewId
const
trackInfo
=
state
.
nowPanelTrackInfo
for
(
let
index
=
0
;
index
<
state
.
componentData
.
length
;
index
++
)
{
const
element
=
state
.
componentData
[
index
]
if
(
!
element
.
type
||
element
.
type
!==
'view'
)
continue
const
currentFilters
=
element
.
linkageFilters
||
[]
// 当前联动filter
data
.
dimensionList
.
forEach
(
dimension
=>
{
const
sourceInfo
=
viewId
+
'#'
+
dimension
.
id
// 获取所有目标联动信息
const
targetInfoList
=
trackInfo
[
sourceInfo
]
||
[]
targetInfoList
.
forEach
(
targetInfo
=>
{
const
targetInfoArray
=
targetInfo
.
split
(
'#'
)
const
targetViewId
=
targetInfoArray
[
0
]
// 目标视图
if
(
element
.
propValue
.
viewId
===
targetViewId
)
{
// 如果目标视图 和 当前循环组件id相等 则进行条件增减
const
targetFieldId
=
targetInfoArray
[
1
]
// 目标视图列ID
const
condition
=
new
Condition
(
''
,
targetFieldId
,
'eq'
,
[
dimension
.
value
],
[
targetViewId
])
let
j
=
currentFilters
.
length
while
(
j
--
)
{
const
filter
=
currentFilters
[
j
]
// 兼容性准备 viewIds 只会存放一个值
if
(
targetFieldId
===
filter
.
fieldId
&&
filter
.
viewIds
.
includes
(
targetViewId
))
{
currentFilters
.
splice
(
j
,
1
)
}
}
// 不存在该条件 且 条件有效 直接保存该条件
// !filterExist && vValid && currentFilters.push(condition)
currentFilters
.
push
(
condition
)
}
})
})
element
.
linkageFilters
=
currentFilters
state
.
componentData
[
index
]
=
element
}
},
setComponentWithId
(
state
,
component
)
{
for
(
let
index
=
0
;
index
<
state
.
componentData
.
length
;
index
++
)
{
const
element
=
state
.
componentData
[
index
]
...
...
@@ -189,6 +234,9 @@ const data = {
state
.
linkageSettingStatus
=
false
state
.
curLinkageView
=
null
state
.
targetLinkageInfo
=
[]
},
setNowPanelTrackInfo
(
state
,
trackInfo
)
{
state
.
nowPanelTrackInfo
=
trackInfo
}
},
modules
:
{
...
...
frontend/src/utils/conditionUtil.js
浏览文件 @
d9ebc295
...
...
@@ -30,3 +30,9 @@ export const formatCondition = obj => {
const
condition
=
new
Condition
(
component
.
id
,
fieldId
,
operator
,
value
,
viewIds
)
return
condition
}
export
const
formatLinkageCondition
=
obj
=>
{
const
{
viewIds
,
fieldId
,
value
,
operator
}
=
obj
const
condition
=
new
Condition
(
null
,
fieldId
,
operator
,
value
,
viewIds
)
return
condition
}
frontend/src/views/chart/chart/chart.js
浏览文件 @
d9ebc295
...
...
@@ -39,7 +39,9 @@ export const DEFAULT_SIZE = {
dimensionShow
:
true
,
quotaShow
:
true
,
scatterSymbol
:
'circle'
,
scatterSymbolSize
:
20
scatterSymbolSize
:
20
,
treemapWidth
:
80
,
treemapHeight
:
80
}
export
const
DEFAULT_LABEL
=
{
show
:
false
,
...
...
@@ -689,3 +691,39 @@ export const BASE_SCATTER = {
}
]
}
export
const
BASE_TREEMAP
=
{
title
:
{
text
:
''
,
textStyle
:
{
fontWeight
:
'normal'
}
},
grid
:
{
containLabel
:
true
},
tooltip
:
{},
legend
:
{
show
:
true
,
type
:
'scroll'
,
itemWidth
:
10
,
itemHeight
:
10
,
icon
:
'rect'
},
series
:
[
{
// name: '',
type
:
'treemap'
,
// radius: ['0%', '60%'],
// avoidLabelOverlap: false,
// emphasis: {
// itemStyle: {
// shadowBlur: 10,
// shadowOffsetX: 0,
// shadowColor: 'rgba(0, 0, 0, 0.5)'
// }
// },
data
:
[]
}
]
}
frontend/src/views/chart/chart/funnel/funnel.js
浏览文件 @
d9ebc295
...
...
@@ -31,8 +31,6 @@ export function baseFunnelOption(chart_option, chart) {
chart_option
.
series
[
0
].
label
=
customAttr
.
label
}
const
valueArr
=
chart
.
data
.
series
[
0
].
data
// max value
chart_option
.
series
[
0
].
max
=
Math
.
max
.
apply
(
Math
,
valueArr
)
for
(
let
i
=
0
;
i
<
valueArr
.
length
;
i
++
)
{
// const y = {
// name: chart.data.x[i],
...
...
@@ -44,7 +42,7 @@ export function baseFunnelOption(chart_option, chart) {
y
.
itemStyle
=
{
color
:
hexColorToRGBA
(
customAttr
.
color
.
colors
[
i
%
9
],
customAttr
.
color
.
alpha
)
}
y
.
type
=
'funnel'
//
y.type = 'funnel'
chart_option
.
series
[
0
].
data
.
push
(
y
)
}
}
...
...
frontend/src/views/chart/chart/treemap/treemap.js
0 → 100644
浏览文件 @
d9ebc295
import
{
hexColorToRGBA
}
from
'@/views/chart/chart/util'
import
{
componentStyle
}
from
'../common/common'
export
function
baseTreemapOption
(
chart_option
,
chart
)
{
// 处理shape attr
let
customAttr
=
{}
if
(
chart
.
customAttr
)
{
customAttr
=
JSON
.
parse
(
chart
.
customAttr
)
if
(
customAttr
.
color
)
{
chart_option
.
color
=
customAttr
.
color
.
colors
}
// tooltip
if
(
customAttr
.
tooltip
)
{
const
tooltip
=
JSON
.
parse
(
JSON
.
stringify
(
customAttr
.
tooltip
))
const
reg
=
new
RegExp
(
'
\
n'
,
'g'
)
tooltip
.
formatter
=
tooltip
.
formatter
.
replace
(
reg
,
'<br/>'
)
chart_option
.
tooltip
=
tooltip
}
}
// 处理data
if
(
chart
.
data
)
{
chart_option
.
title
.
text
=
chart
.
title
if
(
chart
.
data
.
series
.
length
>
0
)
{
// chart_option.series[0].name = chart.data.series[0].name
// size
if
(
customAttr
.
size
)
{
chart_option
.
series
[
0
].
width
=
(
customAttr
.
size
.
treemapWidth
?
customAttr
.
size
.
treemapWidth
:
80
)
+
'%'
chart_option
.
series
[
0
].
height
=
(
customAttr
.
size
.
treemapHeight
?
customAttr
.
size
.
treemapHeight
:
80
)
+
'%'
}
// label
// if (customAttr.label) {
// chart_option.series[0].label = customAttr.label
// }
const
valueArr
=
chart
.
data
.
series
[
0
].
data
for
(
let
i
=
0
;
i
<
valueArr
.
length
;
i
++
)
{
// const y = {
// name: chart.data.x[i],
// value: valueArr[i]
// }
const
y
=
valueArr
[
i
]
y
.
name
=
chart
.
data
.
x
[
i
]
// color
y
.
itemStyle
=
{
color
:
hexColorToRGBA
(
customAttr
.
color
.
colors
[
i
%
9
],
customAttr
.
color
.
alpha
)
}
// y.type = 'treemap'
chart_option
.
series
[
0
].
data
.
push
(
y
)
}
}
}
// console.log(chart_option);
componentStyle
(
chart_option
,
chart
)
return
chart_option
}
frontend/src/views/chart/components/ChartComponent.vue
浏览文件 @
d9ebc295
...
...
@@ -5,7 +5,7 @@
</
template
>
<
script
>
import
{
BASE_BAR
,
BASE_LINE
,
HORIZONTAL_BAR
,
BASE_PIE
,
BASE_FUNNEL
,
BASE_RADAR
,
BASE_GAUGE
,
BASE_MAP
,
BASE_SCATTER
}
from
'../chart/chart'
import
{
BASE_BAR
,
BASE_LINE
,
HORIZONTAL_BAR
,
BASE_PIE
,
BASE_FUNNEL
,
BASE_RADAR
,
BASE_GAUGE
,
BASE_MAP
,
BASE_SCATTER
,
BASE_TREEMAP
}
from
'../chart/chart'
import
{
baseBarOption
,
stackBarOption
,
horizontalBarOption
,
horizontalStackBarOption
}
from
'../chart/bar/bar'
import
{
baseLineOption
,
stackLineOption
}
from
'../chart/line/line'
import
{
basePieOption
,
rosePieOption
}
from
'../chart/pie/pie'
...
...
@@ -14,6 +14,7 @@ import { baseFunnelOption } from '../chart/funnel/funnel'
import
{
baseRadarOption
}
from
'../chart/radar/radar'
import
{
baseGaugeOption
}
from
'../chart/gauge/gauge'
import
{
baseScatterOption
}
from
'../chart/scatter/scatter'
import
{
baseTreemapOption
}
from
'../chart/treemap/treemap'
// import eventBus from '@/components/canvas/utils/eventBus'
import
{
uuid
}
from
'vue-uuid'
import
{
geoJson
}
from
'@/api/map/map'
...
...
@@ -59,8 +60,11 @@ export default {
},
methods
:
{
preDraw
()
{
const
viewId
=
this
.
chart
.
id
const
_store
=
this
.
$store
// 基于准备好的dom,初始化echarts实例
// 渲染echart等待dom加载完毕,渲染之前先尝试销毁具有相同id的echart 放置多次切换仪表板有重复id情况
const
that
=
this
new
Promise
((
resolve
)
=>
{
resolve
()
}).
then
(()
=>
{
// 此dom为echarts图标展示dom
this
.
myChart
=
this
.
$echarts
.
getInstanceByDom
(
document
.
getElementById
(
this
.
chartId
))
...
...
@@ -68,6 +72,19 @@ export default {
this
.
myChart
=
this
.
$echarts
.
init
(
document
.
getElementById
(
this
.
chartId
))
}
this
.
drawEcharts
()
this
.
myChart
.
off
(
'click'
)
this
.
myChart
.
on
(
'click'
,
function
(
param
)
{
console
.
log
(
JSON
.
stringify
(
param
.
data
))
const
trackFilter
=
{
viewId
:
viewId
,
dimensionList
:
param
.
data
.
dimensionList
,
quotaList
:
param
.
data
.
quotaList
}
_store
.
commit
(
'addViewTrackFilter'
,
trackFilter
)
that
.
$emit
(
'onChartClick'
,
param
)
})
})
},
drawEcharts
()
{
...
...
@@ -98,6 +115,8 @@ export default {
chart_option
=
baseGaugeOption
(
JSON
.
parse
(
JSON
.
stringify
(
BASE_GAUGE
)),
chart
)
}
else
if
(
chart
.
type
===
'scatter'
)
{
chart_option
=
baseScatterOption
(
JSON
.
parse
(
JSON
.
stringify
(
BASE_SCATTER
)),
chart
)
}
else
if
(
chart
.
type
===
'treemap'
)
{
chart_option
=
baseTreemapOption
(
JSON
.
parse
(
JSON
.
stringify
(
BASE_TREEMAP
)),
chart
)
}
if
(
chart
.
type
===
'map'
)
{
...
...
frontend/src/views/chart/components/shape-attr/SizeSelector.vue
浏览文件 @
d9ebc295
...
...
@@ -137,7 +137,7 @@
</el-form>
<el-form
v-show=
"chart.type && chart.type.includes('scatter')"
ref=
"sizeFormLine"
:disabled=
"param && !hasDataPermission('manage',param.privileges)"
:model=
"sizeForm"
label-width=
"80px"
size=
"mini"
>
<el-form-item
:label=
"$t('chart.
lin
e_symbol')"
class=
"form-item"
>
<el-form-item
:label=
"$t('chart.
bubbl
e_symbol')"
class=
"form-item"
>
<el-select
v-model=
"sizeForm.scatterSymbol"
:placeholder=
"$t('chart.line_symbol')"
@
change=
"changeBarSizeCase"
>
<el-option
v-for=
"item in lineSymbolOptions"
...
...
@@ -147,8 +147,17 @@
/>
</el-select>
</el-form-item>
<el-form-item
:label=
"$t('chart.line_symbol_size')"
class=
"form-item form-item-slider"
>
<el-slider
v-model=
"sizeForm.scatterSymbolSize"
show-input
:show-input-controls=
"false"
input-size=
"mini"
:min=
"0"
:max=
"20"
@
change=
"changeBarSizeCase"
/>
<el-form-item
:label=
"$t('chart.bubble_size')"
class=
"form-item form-item-slider"
>
<el-slider
v-model=
"sizeForm.scatterSymbolSize"
show-input
:show-input-controls=
"false"
input-size=
"mini"
:min=
"1"
:max=
"20"
@
change=
"changeBarSizeCase"
/>
</el-form-item>
</el-form>
<el-form
v-show=
"chart.type && chart.type === 'treemap'"
ref=
"sizeFormLine"
:disabled=
"param && !hasDataPermission('manage',param.privileges)"
:model=
"sizeForm"
label-width=
"80px"
size=
"mini"
>
<el-form-item
:label=
"$t('chart.width')"
class=
"form-item form-item-slider"
>
<el-slider
v-model=
"sizeForm.treemapWidth"
show-input
:show-input-controls=
"false"
input-size=
"mini"
:min=
"0"
:max=
"100"
@
change=
"changeBarSizeCase"
/>
</el-form-item>
<el-form-item
:label=
"$t('chart.height')"
class=
"form-item form-item-slider"
>
<el-slider
v-model=
"sizeForm.treemapHeight"
show-input
:show-input-controls=
"false"
input-size=
"mini"
:min=
"0"
:max=
"100"
@
change=
"changeBarSizeCase"
/>
</el-form-item>
</el-form>
</el-col>
...
...
@@ -353,6 +362,8 @@ export default {
}
if
(
customAttr
.
size
)
{
this
.
sizeForm
=
customAttr
.
size
this
.
sizeForm
.
treemapWidth
=
this
.
sizeForm
.
treemapWidth
?
this
.
sizeForm
.
treemapWidth
:
80
this
.
sizeForm
.
treemapHeight
=
this
.
sizeForm
.
treemapHeight
?
this
.
sizeForm
.
treemapHeight
:
80
}
}
},
...
...
frontend/src/views/chart/view/ChartEdit.vue
浏览文件 @
d9ebc295
差异被折叠。
点击展开。
frontend/src/views/panel/edit/index.vue
浏览文件 @
d9ebc295
...
...
@@ -192,6 +192,7 @@ import { mapState } from 'vuex'
import
{
uuid
}
from
'vue-uuid'
import
Toolbar
from
'@/components/canvas/components/Toolbar'
import
{
findOne
}
from
'@/api/panel/panel'
import
{
getPanelAllLinkageInfo
}
from
'@/api/panel/linkage'
import
PreviewFullScreen
from
'@/components/canvas/components/Editor/PreviewFullScreen'
import
Preview
from
'@/components/canvas/components/Editor/Preview'
import
AttrList
from
'@/components/canvas/components/AttrList'
...
...
@@ -363,6 +364,7 @@ export default {
const
componentDatas
=
JSON
.
parse
(
componentDataTemp
)
componentDatas
.
forEach
(
item
=>
{
item
.
filters
=
(
item
.
filters
||
[])
item
.
linkageFilters
=
(
item
.
linkageFilters
||
[])
})
this
.
$store
.
commit
(
'setComponentData'
,
this
.
resetID
(
componentDatas
))
// this.$store.commit('setComponentData', this.resetID(JSON.parse(componentDataTemp)))
...
...
@@ -375,12 +377,17 @@ export default {
const
componentDatas
=
JSON
.
parse
(
response
.
data
.
panelData
)
componentDatas
.
forEach
(
item
=>
{
item
.
filters
=
(
item
.
filters
||
[])
item
.
linkageFilters
=
(
item
.
linkageFilters
||
[])
})
this
.
$store
.
commit
(
'setComponentData'
,
this
.
resetID
(
componentDatas
))
// this.$store.commit('setComponentData', this.resetID(JSON.parse(response.data.panelData)))
const
panelStyle
=
JSON
.
parse
(
response
.
data
.
panelStyle
)
this
.
$store
.
commit
(
'setCanvasStyle'
,
panelStyle
)
this
.
$store
.
commit
(
'recordSnapshot'
)
// 记录快照
// 刷新联动信息
getPanelAllLinkageInfo
(
panelId
).
then
(
rsp
=>
{
this
.
$store
.
commit
(
'setNowPanelTrackInfo'
,
rsp
.
data
)
})
})
}
},
...
...
@@ -463,6 +470,7 @@ export default {
}
component
.
propValue
=
propValue
component
.
filters
=
[]
component
.
linkageFilters
=
[]
}
})
}
else
{
...
...
@@ -660,6 +668,7 @@ export default {
}
component
.
propValue
=
propValue
component
.
filters
=
[]
component
.
linkageFilters
=
[]
}
})
...
...
frontend/src/views/panel/list/EditPanel/index.vue
浏览文件 @
d9ebc295
...
...
@@ -134,7 +134,6 @@ export default {
return
false
}
debugger
if
(
this
.
editPanel
.
panelInfo
.
name
.
length
>
50
)
{
this
.
$warning
(
this
.
$t
(
'commons.char_can_not_more_50'
))
return
false
...
...
frontend/src/views/panel/list/PanelList.vue
浏览文件 @
d9ebc295
...
...
@@ -177,6 +177,8 @@ import { uuid } from 'vue-uuid'
import
bus
from
'@/utils/bus'
import
EditPanel
from
'./EditPanel'
import
{
addGroup
,
delGroup
,
groupTree
,
defaultTree
,
findOne
}
from
'@/api/panel/panel'
import
{
getPanelAllLinkageInfo
}
from
'@/api/panel/linkage'
import
{
mapState
}
from
'vuex'
import
{
DEFAULT_COMMON_CANVAS_STYLE_STRING
}
from
'@/views/panel/panel'
...
...
@@ -274,7 +276,10 @@ export default {
computed
:
{
panelDialogTitle
()
{
return
this
.
editPanel
.
titlePre
+
this
.
editPanel
.
titleSuf
}
},
...
mapState
([
'nowPanelTrackInfo'
])
},
watch
:
{
// 切换展示页面后 重新点击一下当前节点
...
...
@@ -517,12 +522,18 @@ export default {
const
componentDatas
=
JSON
.
parse
(
response
.
data
.
panelData
)
componentDatas
.
forEach
(
item
=>
{
item
.
filters
=
(
item
.
filters
||
[])
item
.
linkageFilters
=
(
item
.
linkageFilters
||
[])
})
this
.
$store
.
commit
(
'setComponentData'
,
this
.
resetID
(
componentDatas
))
// this.$store.commit('setComponentData', sourceInfo.type === 'custom' ? sourceInfo : this.resetID(sourceInfo))
const
temp
=
JSON
.
parse
(
response
.
data
.
panelStyle
)
this
.
$store
.
commit
(
'setCanvasStyle'
,
temp
)
this
.
$store
.
dispatch
(
'panel/setPanelInfo'
,
data
)
// 刷新联动信息
getPanelAllLinkageInfo
(
data
.
id
).
then
(
rsp
=>
{
this
.
$store
.
commit
(
'setNowPanelTrackInfo'
,
rsp
.
data
)
})
})
}
if
(
node
.
expanded
)
{
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论