Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
D
dataease
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
njgzx
dataease
Commits
5b86ad09
提交
5b86ad09
authored
9月 15, 2021
作者:
taojinlong
浏览文件
操作
浏览文件
下载
差异文件
refactor: 解决冲突
上级
e1b32c68
2c8a476a
全部展开
隐藏空白字符变更
内嵌
并排
正在显示
70 个修改的文件
包含
1405 行增加
和
146 行删除
+1405
-146
.gitignore
.gitignore
+1
-0
pom.xml
backend/pom.xml
+4
-4
AuthApi.java
backend/src/main/java/io/dataease/auth/api/AuthApi.java
+5
-2
TokenInfo.java
backend/src/main/java/io/dataease/auth/entity/TokenInfo.java
+2
-0
F2CLogoutFilter.java
...rc/main/java/io/dataease/auth/filter/F2CLogoutFilter.java
+0
-1
AuthServer.java
...end/src/main/java/io/dataease/auth/server/AuthServer.java
+22
-1
AuthUserService.java
...c/main/java/io/dataease/auth/service/AuthUserService.java
+4
-0
AuthUserServiceImpl.java
...va/io/dataease/auth/service/impl/AuthUserServiceImpl.java
+21
-0
DynamicMenuServiceImpl.java
...io/dataease/auth/service/impl/DynamicMenuServiceImpl.java
+0
-1
ShiroServiceImpl.java
.../java/io/dataease/auth/service/impl/ShiroServiceImpl.java
+7
-1
JWTUtils.java
backend/src/main/java/io/dataease/auth/util/JWTUtils.java
+22
-10
SysUser.java
backend/src/main/java/io/dataease/base/domain/SysUser.java
+3
-0
SysUserExample.java
...src/main/java/io/dataease/base/domain/SysUserExample.java
+70
-0
SysUserMapper.xml
...d/src/main/java/io/dataease/base/mapper/SysUserMapper.xml
+23
-5
AuthMapper.java
...src/main/java/io/dataease/base/mapper/ext/AuthMapper.java
+2
-0
AuthMapper.xml
.../src/main/java/io/dataease/base/mapper/ext/AuthMapper.xml
+4
-0
AuthConstants.java
...ain/java/io/dataease/commons/constants/AuthConstants.java
+1
-0
DefaultLicenseService.java
...va/io/dataease/commons/license/DefaultLicenseService.java
+5
-2
DateUtils.java
...nd/src/main/java/io/dataease/commons/utils/DateUtils.java
+2
-2
ExcelReaderUtil.java
.../main/java/io/dataease/commons/utils/ExcelReaderUtil.java
+2
-2
LoadjarUtil.java
...src/main/java/io/dataease/plugins/config/LoadjarUtil.java
+8
-0
ControllerLoader.java
...ain/java/io/dataease/plugins/loader/ControllerLoader.java
+95
-0
ModuleClassLoader.java
...in/java/io/dataease/plugins/loader/ModuleClassLoader.java
+25
-1
PluginCommonServer.java
...n/java/io/dataease/plugins/server/PluginCommonServer.java
+39
-2
SSOServer.java
...d/src/main/java/io/dataease/plugins/server/SSOServer.java
+85
-0
XLdapServer.java
...src/main/java/io/dataease/plugins/server/XLdapServer.java
+1
-1
XOidcServer.java
...src/main/java/io/dataease/plugins/server/XOidcServer.java
+59
-0
ChartViewService.java
...main/java/io/dataease/service/chart/ChartViewService.java
+10
-5
DataSetTableService.java
...java/io/dataease/service/dataset/DataSetTableService.java
+42
-14
SysUserService.java
...src/main/java/io/dataease/service/sys/SysUserService.java
+50
-0
SystemParameterService.java
...va/io/dataease/service/system/SystemParameterService.java
+2
-2
V26__de1.3.sql
backend/src/main/resources/db/migration/V26__de1.3.sql
+21
-0
messages_en_US.properties
backend/src/main/resources/i18n/messages_en_US.properties
+2
-0
messages_zh_CN.properties
backend/src/main/resources/i18n/messages_zh_CN.properties
+3
-1
messages_zh_TW.properties
backend/src/main/resources/i18n/messages_zh_TW.properties
+3
-1
package.json
frontend/package.json
+1
-0
user.js
frontend/src/api/system/user.js
+1
-1
user.js
frontend/src/api/user.js
+7
-0
index.vue
frontend/src/components/DeDrag/index.vue
+1
-1
index.vue
frontend/src/components/Notification/index.vue
+2
-1
Preview.vue
frontend/src/components/canvas/components/Editor/Preview.vue
+17
-10
index.vue
frontend/src/components/canvas/components/Editor/index.vue
+8
-5
TextAttr.vue
frontend/src/components/canvas/components/TextAttr.vue
+10
-2
Toolbar.vue
frontend/src/components/canvas/components/Toolbar.vue
+1
-13
UserView.vue
frontend/src/components/canvas/custom-component/UserView.vue
+14
-3
component-list.js
.../src/components/canvas/custom-component/component-list.js
+5
-2
liquid.svg
frontend/src/icons/svg/liquid.svg
+1
-0
en.js
frontend/src/lang/en.js
+62
-1
tw.js
frontend/src/lang/tw.js
+0
-0
zh.js
frontend/src/lang/zh.js
+32
-1
settings.js
frontend/src/settings.js
+3
-0
index.js
frontend/src/store/index.js
+3
-0
auth.js
frontend/src/utils/auth.js
+10
-0
request.js
frontend/src/utils/request.js
+5
-1
chart.js
frontend/src/views/chart/chart/chart.js
+8
-1
liquid.js
frontend/src/views/chart/chart/liquid/liquid.js
+104
-0
util.js
frontend/src/views/chart/chart/util.js
+9
-0
ChartComponentG2.vue
frontend/src/views/chart/components/ChartComponentG2.vue
+162
-0
TitleSelector.vue
.../views/chart/components/component-style/TitleSelector.vue
+2
-2
ChartDragItem.vue
...nd/src/views/chart/components/drag-item/ChartDragItem.vue
+60
-1
LabelSelector.vue
...d/src/views/chart/components/shape-attr/LabelSelector.vue
+3
-3
SizeSelector.vue
...nd/src/views/chart/components/shape-attr/SizeSelector.vue
+55
-2
TableNormal.vue
frontend/src/views/chart/components/table/TableNormal.vue
+1
-1
ChartEdit.vue
frontend/src/views/chart/view/ChartEdit.vue
+0
-0
index.vue
frontend/src/views/login/index.vue
+25
-32
index.vue
frontend/src/views/panel/edit/index.vue
+1
-2
PanelList.vue
frontend/src/views/panel/list/PanelList.vue
+76
-1
PanelViewShow.vue
frontend/src/views/panel/list/PanelViewShow.vue
+1
-1
PluginCom.vue
frontend/src/views/system/plugin/PluginCom.vue
+69
-0
index.vue
frontend/src/views/system/user/index.vue
+1
-1
没有找到文件。
.gitignore
浏览文件 @
5b86ad09
...
...
@@ -40,6 +40,7 @@ yarn-error.log*
pnpm-debug.log*
# Editor directories and files
.lh
.idea
.vscode
*.suo
...
...
backend/pom.xml
浏览文件 @
5b86ad09
...
...
@@ -252,11 +252,11 @@
<version>
20171018
</version>
</dependency>
<dependency>
<
!--<
dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
</dependency>
-->
<!-- 反射工具包 -->
<dependency>
<groupId>
net.oneandone.reflections8
</groupId>
...
...
@@ -337,10 +337,10 @@
<version>
5.7.4
</version>
</dependency>
<dependency>
<
!--<
dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-ldap</artifactId>
</dependency>
</dependency>
-->
<dependency>
<groupId>
ru.yandex.clickhouse
</groupId>
...
...
backend/src/main/java/io/dataease/auth/api/AuthApi.java
浏览文件 @
5b86ad09
...
...
@@ -4,9 +4,7 @@ import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import
io.dataease.auth.api.dto.CurrentUserDto
;
import
io.dataease.auth.api.dto.LoginDto
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiModelProperty
;
import
io.swagger.annotations.ApiOperation
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
...
...
@@ -46,4 +44,9 @@ public interface AuthApi {
@PostMapping
(
"/isOpenLdap"
)
boolean
isOpenLdap
();
@ApiOperation
(
"是否开启oidc"
)
@PostMapping
(
"/isOpenOidc"
)
boolean
isOpenOidc
();
}
backend/src/main/java/io/dataease/auth/entity/TokenInfo.java
浏览文件 @
5b86ad09
...
...
@@ -13,6 +13,8 @@ public class TokenInfo implements Serializable {
private
Long
userId
;
/* private String idToken; */
public
String
format
(){
return
username
+
","
+
userId
;
}
...
...
backend/src/main/java/io/dataease/auth/filter/F2CLogoutFilter.java
浏览文件 @
5b86ad09
...
...
@@ -4,7 +4,6 @@ import org.apache.shiro.subject.Subject;
import
org.apache.shiro.web.filter.authc.LogoutFilter
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
javax.servlet.ServletRequest
;
import
javax.servlet.ServletResponse
;
...
...
backend/src/main/java/io/dataease/auth/server/AuthServer.java
浏览文件 @
5b86ad09
...
...
@@ -21,17 +21,19 @@ import io.dataease.plugins.util.PluginUtils;
import
io.dataease.plugins.xpack.ldap.dto.request.LdapValidateRequest
;
import
io.dataease.plugins.xpack.ldap.dto.response.ValidateResult
;
import
io.dataease.plugins.xpack.ldap.service.LdapXpackService
;
import
io.dataease.plugins.xpack.oidc.service.OidcXpackService
;
import
org.apache.commons.lang3.ObjectUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.shiro.SecurityUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.RequestBody
;
import
org.springframework.web.bind.annotation.RestController
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
javax.servlet.http.HttpServletRequest
;
@RestController
public
class
AuthServer
implements
AuthApi
{
...
...
@@ -113,6 +115,16 @@ public class AuthServer implements AuthApi {
@Override
public
String
logout
()
{
String
token
=
ServletUtils
.
getToken
();
if
(
isOpenOidc
())
{
HttpServletRequest
request
=
ServletUtils
.
request
();
String
idToken
=
request
.
getHeader
(
"IdToken"
);
if
(
StringUtils
.
isNotBlank
(
idToken
))
{
OidcXpackService
oidcXpackService
=
SpringContextUtil
.
getBean
(
OidcXpackService
.
class
);
oidcXpackService
.
logout
(
idToken
);
}
}
if
(
StringUtils
.
isEmpty
(
token
)
||
StringUtils
.
equals
(
"null"
,
token
)
||
StringUtils
.
equals
(
"undefined"
,
token
))
{
return
"success"
;
}
...
...
@@ -144,6 +156,15 @@ public class AuthServer implements AuthApi {
return
open
;
}
@Override
public
boolean
isOpenOidc
()
{
Boolean
licValid
=
PluginUtils
.
licValid
();
if
(!
licValid
)
return
false
;
return
authUserService
.
supportOidc
();
}
/*@Override
public Boolean isLogin() {
return null;
...
...
backend/src/main/java/io/dataease/auth/service/AuthUserService.java
浏览文件 @
5b86ad09
...
...
@@ -13,6 +13,8 @@ public interface AuthUserService {
SysUserEntity
getUserByName
(
String
username
);
SysUserEntity
getUserBySub
(
String
sub
);
List
<
String
>
roles
(
Long
userId
);
List
<
String
>
permissions
(
Long
userId
);
...
...
@@ -23,6 +25,8 @@ public interface AuthUserService {
boolean
supportLdap
();
Boolean
supportOidc
();
}
backend/src/main/java/io/dataease/auth/service/impl/AuthUserServiceImpl.java
浏览文件 @
5b86ad09
...
...
@@ -10,6 +10,8 @@ import io.dataease.commons.constants.AuthConstants;
import
io.dataease.commons.utils.LogUtil
;
import
io.dataease.plugins.config.SpringContextUtil
;
import
io.dataease.plugins.xpack.ldap.service.LdapXpackService
;
import
io.dataease.plugins.xpack.oidc.service.OidcXpackService
;
import
org.apache.commons.lang3.ObjectUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.cache.annotation.CacheEvict
;
...
...
@@ -19,6 +21,7 @@ import org.springframework.stereotype.Service;
import
javax.annotation.Resource
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Optional
;
import
java.util.stream.Collectors
;
...
...
@@ -49,6 +52,11 @@ public class AuthUserServiceImpl implements AuthUserService {
return
authMapper
.
findUserByName
(
username
);
}
@Override
public
SysUserEntity
getUserBySub
(
String
sub
)
{
return
authMapper
.
findUserBySub
(
sub
);
}
@Override
public
List
<
String
>
roles
(
Long
userId
){
return
authMapper
.
roleCodes
(
userId
);
...
...
@@ -107,8 +115,21 @@ public class AuthUserServiceImpl implements AuthUserService {
@Override
public
boolean
supportLdap
()
{
Map
<
String
,
LdapXpackService
>
beansOfType
=
SpringContextUtil
.
getApplicationContext
().
getBeansOfType
((
LdapXpackService
.
class
));
if
(
beansOfType
.
keySet
().
size
()
==
0
)
return
false
;
LdapXpackService
ldapXpackService
=
SpringContextUtil
.
getBean
(
LdapXpackService
.
class
);
if
(
ObjectUtils
.
isEmpty
(
ldapXpackService
))
return
false
;
return
ldapXpackService
.
isOpen
();
}
@Override
public
Boolean
supportOidc
()
{
Map
<
String
,
OidcXpackService
>
beansOfType
=
SpringContextUtil
.
getApplicationContext
().
getBeansOfType
((
OidcXpackService
.
class
));
if
(
beansOfType
.
keySet
().
size
()
==
0
)
return
false
;
OidcXpackService
oidcXpackService
=
SpringContextUtil
.
getBean
(
OidcXpackService
.
class
);
if
(
ObjectUtils
.
isEmpty
(
oidcXpackService
))
return
false
;
return
oidcXpackService
.
isSuuportOIDC
();
}
}
backend/src/main/java/io/dataease/auth/service/impl/DynamicMenuServiceImpl.java
浏览文件 @
5b86ad09
...
...
@@ -13,7 +13,6 @@ import org.apache.commons.collections4.CollectionUtils;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
javax.annotation.Resource
;
import
java.util.ArrayList
;
import
java.util.List
;
...
...
backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java
浏览文件 @
5b86ad09
...
...
@@ -56,9 +56,15 @@ public class ShiroServiceImpl implements ShiroService {
// filterChainDefinitionMap.put("/axios.map", ANON);
filterChainDefinitionMap
.
put
(
"/api/auth/login"
,
ANON
);
filterChainDefinitionMap
.
put
(
"/api/auth/logout"
,
ANON
);
//
filterChainDefinitionMap.put("/api/auth/logout", ANON);
filterChainDefinitionMap
.
put
(
"/api/auth/validateName"
,
ANON
);
filterChainDefinitionMap
.
put
(
"/api/auth/isOpenLdap"
,
ANON
);
filterChainDefinitionMap
.
put
(
"/api/auth/isOpenOidc"
,
ANON
);
filterChainDefinitionMap
.
put
(
"/api/pluginCommon/component/*"
,
ANON
);
filterChainDefinitionMap
.
put
(
"/plugin/oidc/authInfo"
,
ANON
);
filterChainDefinitionMap
.
put
(
"/sso/callBack*"
,
ANON
);
filterChainDefinitionMap
.
put
(
"/unauth"
,
ANON
);
filterChainDefinitionMap
.
put
(
"/display/**"
,
ANON
);
filterChainDefinitionMap
.
put
(
"/tokenExpired"
,
ANON
);
...
...
backend/src/main/java/io/dataease/auth/util/JWTUtils.java
浏览文件 @
5b86ad09
...
...
@@ -2,16 +2,18 @@ package io.dataease.auth.util;
import
com.auth0.jwt.JWT
;
import
com.auth0.jwt.JWTVerifier
;
import
com.auth0.jwt.JWTCreator.Builder
;
import
com.auth0.jwt.algorithms.Algorithm
;
import
com.auth0.jwt.exceptions.JWTDecodeException
;
import
com.auth0.jwt.interfaces.DecodedJWT
;
import
com.auth0.jwt.interfaces.Verification
;
import
io.dataease.auth.entity.TokenInfo
;
import
io.dataease.auth.entity.TokenInfo.TokenInfoBuilder
;
import
io.dataease.commons.utils.CommonBeanFactory
;
import
io.dataease.exception.DataEaseException
;
import
org.apache.commons.lang3.ObjectUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.core.env.Environment
;
import
java.util.Date
;
...
...
@@ -34,10 +36,13 @@ public class JWTUtils {
*/
public
static
boolean
verify
(
String
token
,
TokenInfo
tokenInfo
,
String
secret
)
{
Algorithm
algorithm
=
Algorithm
.
HMAC256
(
secret
);
JWTVerifier
verifier
=
JWT
.
require
(
algorithm
)
Verification
verification
=
JWT
.
require
(
algorithm
)
.
withClaim
(
"username"
,
tokenInfo
.
getUsername
())
.
withClaim
(
"userId"
,
tokenInfo
.
getUserId
())
.
build
();
.
withClaim
(
"userId"
,
tokenInfo
.
getUserId
());
/* if (StringUtils.isNotBlank(tokenInfo.getIdToken())) {
verification.withClaim("idToken", tokenInfo.getIdToken());
} */
JWTVerifier
verifier
=
verification
.
build
();
verifier
.
verify
(
token
);
return
true
;
}
...
...
@@ -50,10 +55,15 @@ public class JWTUtils {
DecodedJWT
jwt
=
JWT
.
decode
(
token
);
String
username
=
jwt
.
getClaim
(
"username"
).
asString
();
Long
userId
=
jwt
.
getClaim
(
"userId"
).
asLong
();
// String idToken = jwt.getClaim("idToken").asString();
if
(
StringUtils
.
isEmpty
(
username
)
||
ObjectUtils
.
isEmpty
(
userId
)
){
DataEaseException
.
throwException
(
"token格式错误!"
);
}
TokenInfo
tokenInfo
=
TokenInfo
.
builder
().
username
(
username
).
userId
(
userId
).
build
();
TokenInfoBuilder
tokenInfoBuilder
=
TokenInfo
.
builder
().
username
(
username
).
userId
(
userId
);
/* if (StringUtils.isNotBlank(idToken)) {
tokenInfoBuilder.idToken(idToken);
} */
TokenInfo
tokenInfo
=
tokenInfoBuilder
.
build
();
return
tokenInfo
;
}
...
...
@@ -107,12 +117,14 @@ public class JWTUtils {
try
{
Date
date
=
new
Date
(
System
.
currentTimeMillis
()+
EXPIRE_TIME
);
Algorithm
algorithm
=
Algorithm
.
HMAC256
(
secret
);
// 附带username信息
return
JWT
.
create
()
Builder
builder
=
JWT
.
create
()
.
withClaim
(
"username"
,
tokenInfo
.
getUsername
())
.
withClaim
(
"userId"
,
tokenInfo
.
getUserId
())
.
withExpiresAt
(
date
)
.
sign
(
algorithm
);
.
withClaim
(
"userId"
,
tokenInfo
.
getUserId
());
/* if (StringUtils.isNotBlank(tokenInfo.getIdToken())) {
builder.withClaim("idToken", tokenInfo.getIdToken());
} */
return
builder
.
withExpiresAt
(
date
).
sign
(
algorithm
);
}
catch
(
Exception
e
)
{
return
null
;
}
...
...
backend/src/main/java/io/dataease/base/domain/SysUser.java
浏览文件 @
5b86ad09
...
...
@@ -39,5 +39,7 @@ public class SysUser implements Serializable {
private
Integer
from
;
private
String
sub
;
private
static
final
long
serialVersionUID
=
1L
;
}
\ No newline at end of file
backend/src/main/java/io/dataease/base/domain/SysUserExample.java
浏览文件 @
5b86ad09
...
...
@@ -1213,6 +1213,76 @@ public class SysUserExample {
addCriterion
(
"`from` not between"
,
value1
,
value2
,
"from"
);
return
(
Criteria
)
this
;
}
public
Criteria
andSubIsNull
()
{
addCriterion
(
"sub is null"
);
return
(
Criteria
)
this
;
}
public
Criteria
andSubIsNotNull
()
{
addCriterion
(
"sub is not null"
);
return
(
Criteria
)
this
;
}
public
Criteria
andSubEqualTo
(
String
value
)
{
addCriterion
(
"sub ="
,
value
,
"sub"
);
return
(
Criteria
)
this
;
}
public
Criteria
andSubNotEqualTo
(
String
value
)
{
addCriterion
(
"sub <>"
,
value
,
"sub"
);
return
(
Criteria
)
this
;
}
public
Criteria
andSubGreaterThan
(
String
value
)
{
addCriterion
(
"sub >"
,
value
,
"sub"
);
return
(
Criteria
)
this
;
}
public
Criteria
andSubGreaterThanOrEqualTo
(
String
value
)
{
addCriterion
(
"sub >="
,
value
,
"sub"
);
return
(
Criteria
)
this
;
}
public
Criteria
andSubLessThan
(
String
value
)
{
addCriterion
(
"sub <"
,
value
,
"sub"
);
return
(
Criteria
)
this
;
}
public
Criteria
andSubLessThanOrEqualTo
(
String
value
)
{
addCriterion
(
"sub <="
,
value
,
"sub"
);
return
(
Criteria
)
this
;
}
public
Criteria
andSubLike
(
String
value
)
{
addCriterion
(
"sub like"
,
value
,
"sub"
);
return
(
Criteria
)
this
;
}
public
Criteria
andSubNotLike
(
String
value
)
{
addCriterion
(
"sub not like"
,
value
,
"sub"
);
return
(
Criteria
)
this
;
}
public
Criteria
andSubIn
(
List
<
String
>
values
)
{
addCriterion
(
"sub in"
,
values
,
"sub"
);
return
(
Criteria
)
this
;
}
public
Criteria
andSubNotIn
(
List
<
String
>
values
)
{
addCriterion
(
"sub not in"
,
values
,
"sub"
);
return
(
Criteria
)
this
;
}
public
Criteria
andSubBetween
(
String
value1
,
String
value2
)
{
addCriterion
(
"sub between"
,
value1
,
value2
,
"sub"
);
return
(
Criteria
)
this
;
}
public
Criteria
andSubNotBetween
(
String
value1
,
String
value2
)
{
addCriterion
(
"sub not between"
,
value1
,
value2
,
"sub"
);
return
(
Criteria
)
this
;
}
}
public
static
class
Criteria
extends
GeneratedCriteria
{
...
...
backend/src/main/java/io/dataease/base/mapper/SysUserMapper.xml
浏览文件 @
5b86ad09
...
...
@@ -19,6 +19,7 @@
<result
column=
"update_time"
jdbcType=
"BIGINT"
property=
"updateTime"
/>
<result
column=
"language"
jdbcType=
"VARCHAR"
property=
"language"
/>
<result
column=
"from"
jdbcType=
"INTEGER"
property=
"from"
/>
<result
column=
"sub"
jdbcType=
"VARCHAR"
property=
"sub"
/>
</resultMap>
<sql
id=
"Example_Where_Clause"
>
<where>
...
...
@@ -81,7 +82,7 @@
<sql
id=
"Base_Column_List"
>
user_id, dept_id, username, nick_name, gender, phone, email, `password`, is_admin,
enabled, create_by, update_by, pwd_reset_time, create_time, update_time, `language`,
`from`
`from`
, sub
</sql>
<select
id=
"selectByExample"
parameterType=
"io.dataease.base.domain.SysUserExample"
resultMap=
"BaseResultMap"
>
select
...
...
@@ -119,13 +120,15 @@
email, `password`, is_admin,
enabled, create_by, update_by,
pwd_reset_time, create_time, update_time,
`language`, `from`)
`language`, `from`, sub
)
values (#{userId,jdbcType=BIGINT}, #{deptId,jdbcType=BIGINT}, #{username,jdbcType=VARCHAR},
#{nickName,jdbcType=VARCHAR}, #{gender,jdbcType=VARCHAR}, #{phone,jdbcType=VARCHAR},
#{email,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, #{isAdmin,jdbcType=BIT},
#{enabled,jdbcType=BIGINT}, #{createBy,jdbcType=VARCHAR}, #{updateBy,jdbcType=VARCHAR},
#{pwdResetTime,jdbcType=BIGINT}, #{createTime,jdbcType=BIGINT}, #{updateTime,jdbcType=BIGINT},
#{language,jdbcType=VARCHAR}, #{from,jdbcType=INTEGER})
#{language,jdbcType=VARCHAR}, #{from,jdbcType=INTEGER}, #{sub,jdbcType=VARCHAR}
)
</insert>
<insert
id=
"insertSelective"
parameterType=
"io.dataease.base.domain.SysUser"
>
insert into sys_user
...
...
@@ -181,6 +184,9 @@
<if
test=
"from != null"
>
`from`,
</if>
<if
test=
"sub != null"
>
sub,
</if>
</trim>
<trim
prefix=
"values ("
suffix=
")"
suffixOverrides=
","
>
<if
test=
"userId != null"
>
...
...
@@ -234,6 +240,9 @@
<if
test=
"from != null"
>
#{from,jdbcType=INTEGER},
</if>
<if
test=
"sub != null"
>
#{sub,jdbcType=VARCHAR},
</if>
</trim>
</insert>
<select
id=
"countByExample"
parameterType=
"io.dataease.base.domain.SysUserExample"
resultType=
"java.lang.Long"
>
...
...
@@ -296,6 +305,9 @@
<if
test=
"record.from != null"
>
`from` = #{record.from,jdbcType=INTEGER},
</if>
<if
test=
"record.sub != null"
>
sub = #{record.sub,jdbcType=VARCHAR},
</if>
</set>
<if
test=
"_parameter != null"
>
<include
refid=
"Update_By_Example_Where_Clause"
/>
...
...
@@ -319,7 +331,8 @@
create_time = #{record.createTime,jdbcType=BIGINT},
update_time = #{record.updateTime,jdbcType=BIGINT},
`language` = #{record.language,jdbcType=VARCHAR},
`from` = #{record.from,jdbcType=INTEGER}
`from` = #{record.from,jdbcType=INTEGER},
sub = #{record.sub,jdbcType=VARCHAR}
<if
test=
"_parameter != null"
>
<include
refid=
"Update_By_Example_Where_Clause"
/>
</if>
...
...
@@ -375,6 +388,9 @@
<if
test=
"from != null"
>
`from` = #{from,jdbcType=INTEGER},
</if>
<if
test=
"sub != null"
>
sub = #{sub,jdbcType=VARCHAR},
</if>
</set>
where user_id = #{userId,jdbcType=BIGINT}
</update>
...
...
@@ -395,7 +411,8 @@
create_time = #{createTime,jdbcType=BIGINT},
update_time = #{updateTime,jdbcType=BIGINT},
`language` = #{language,jdbcType=VARCHAR},
`from` = #{from,jdbcType=INTEGER}
`from` = #{from,jdbcType=INTEGER},
sub = #{sub,jdbcType=VARCHAR}
where user_id = #{userId,jdbcType=BIGINT}
</update>
</mapper>
\ No newline at end of file
backend/src/main/java/io/dataease/base/mapper/ext/AuthMapper.java
浏览文件 @
5b86ad09
...
...
@@ -25,6 +25,8 @@ public interface AuthMapper {
SysUserEntity
findUserByName
(
@Param
(
"username"
)
String
username
);
SysUserEntity
findUserBySub
(
@Param
(
"sub"
)
String
sub
);
List
<
CurrentRoleDto
>
roles
(
@Param
(
"userId"
)
Long
userId
);
...
...
backend/src/main/java/io/dataease/base/mapper/ext/AuthMapper.xml
浏览文件 @
5b86ad09
...
...
@@ -28,6 +28,10 @@
select user_id, username,nick_name, dept_id, password, enabled,email, phone, language ,is_admin from sys_user where username = #{username}
</select>
<select
id=
"findUserBySub"
resultMap=
"baseMap"
>
select user_id, username,nick_name, dept_id, password, enabled,email, phone, language ,is_admin from sys_user where sub = #{sub}
</select>
<select
id=
"roleCodes"
resultType=
"String"
>
select r.id from sys_role r
left join sys_users_roles sur on sur.role_id = r.role_id
...
...
backend/src/main/java/io/dataease/commons/constants/AuthConstants.java
浏览文件 @
5b86ad09
...
...
@@ -6,6 +6,7 @@ public class AuthConstants {
public
final
static
String
USER_CACHE_NAME
=
"users_info"
;
public
final
static
String
USER_ROLE_CACHE_NAME
=
"users_roles_info"
;
public
final
static
String
USER_PERMISSION_CACHE_NAME
=
"users_permissions_info"
;
public
final
static
String
ID_TOKEN_KEY
=
"IdToken"
;
}
backend/src/main/java/io/dataease/commons/license/DefaultLicenseService.java
浏览文件 @
5b86ad09
...
...
@@ -45,9 +45,12 @@ public class DefaultLicenseService {
}
return
f2CLicenseResponse
;
}
catch
(
Exception
e
){
e
.
printStackTrace
();
return
F2CLicenseResponse
.
invalid
(
e
.
getMessage
());
LogUtil
.
error
(
e
.
getMessage
());
// e.printStackTrace();
// return F2CLicenseResponse.invalid(e.getMessage());
return
F2CLicenseResponse
.
noRecord
();
}
}
...
...
backend/src/main/java/io/dataease/commons/utils/DateUtils.java
浏览文件 @
5b86ad09
...
...
@@ -95,7 +95,7 @@ public class DateUtils {
}
public
static
void
main
(
String
[]
args
)
throws
Exception
{
/*
public static void main(String[] args) throws Exception {
// System.out.println("start:");
Date paramTime = getTime(getTimeString(new Long("1607672440731")));
...
...
@@ -110,7 +110,7 @@ public class DateUtils {
// System.out.println(getTimeString(--countTimeLong));
}
}
*/
/**
...
...
backend/src/main/java/io/dataease/commons/utils/ExcelReaderUtil.java
浏览文件 @
5b86ad09
...
...
@@ -68,8 +68,8 @@ public class ExcelReaderUtil {
}
}
public
static
void
main
(
String
[]
args
)
throws
Exception
{
/*
public static void main(String[] args) throws Exception {
String file ="Metersphere_case_DataEase功能用例.xlsx";
ExcelReaderUtil.readExcel(file, new FileInputStream("/Users/taojinlong/Desktop/" + file));
}
}
*/
}
backend/src/main/java/io/dataease/plugins/config/LoadjarUtil.java
浏览文件 @
5b86ad09
...
...
@@ -2,6 +2,7 @@ package io.dataease.plugins.config;
import
io.dataease.base.domain.MyPlugin
;
import
io.dataease.plugins.loader.ClassloaderResponsity
;
import
io.dataease.plugins.loader.ControllerLoader
;
import
io.dataease.plugins.loader.ModuleClassLoader
;
import
io.dataease.plugins.loader.MybatisLoader
;
import
org.springframework.beans.factory.annotation.Autowired
;
...
...
@@ -19,6 +20,9 @@ public class LoadjarUtil {
@Autowired
private
MybatisLoader
mybatisLoader
;
@Autowired
private
ControllerLoader
controllerLoader
;
public
List
<?>
loadJar
(
String
jarPath
,
MyPlugin
myPlugin
)
throws
Exception
{
File
jar
=
new
File
(
jarPath
);
URI
uri
=
jar
.
toURI
();
...
...
@@ -34,6 +38,10 @@ public class LoadjarUtil {
Thread
.
currentThread
().
setContextClassLoader
(
classLoader
);
classLoader
.
initBean
();
mybatisLoader
.
loadMybatis
(
myPlugin
);
List
<
String
>
controllers
=
classLoader
.
getRegisteredController
();
controllerLoader
.
registerController
(
controllers
);
ClassloaderResponsity
.
getInstance
().
addClassLoader
(
moduleName
,
classLoader
);
...
...
backend/src/main/java/io/dataease/plugins/loader/ControllerLoader.java
0 → 100644
浏览文件 @
5b86ad09
package
io
.
dataease
.
plugins
.
loader
;
import
io.dataease.commons.utils.LogUtil
;
import
io.dataease.plugins.config.SpringContextUtil
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.ClassUtils
;
import
org.springframework.util.ReflectionUtils
;
import
org.springframework.web.servlet.mvc.method.RequestMappingInfo
;
import
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
;
import
java.lang.reflect.Method
;
import
java.util.List
;
@Component
public
class
ControllerLoader
{
/**
* 去掉Controller的Mapping
* @param controllerBeanName
*/
private
void
unregisterController
(
String
controllerBeanName
){
final
RequestMappingHandlerMapping
requestMappingHandlerMapping
=(
RequestMappingHandlerMapping
)
SpringContextUtil
.
getBean
(
"requestMappingHandlerMapping"
);
if
(
requestMappingHandlerMapping
!=
null
){
String
handler
=
controllerBeanName
;
Object
controller
=
SpringContextUtil
.
getBean
(
handler
);
if
(
controller
==
null
){
return
;
}
final
Class
<?>
targetClass
=
controller
.
getClass
();
ReflectionUtils
.
doWithMethods
(
targetClass
,
new
ReflectionUtils
.
MethodCallback
()
{
public
void
doWith
(
Method
method
)
{
Method
specificMethod
=
ClassUtils
.
getMostSpecificMethod
(
method
,
targetClass
);
try
{
Method
createMappingMethod
=
RequestMappingHandlerMapping
.
class
.
getDeclaredMethod
(
"getMappingForMethod"
,
Method
.
class
,
Class
.
class
);
createMappingMethod
.
setAccessible
(
true
);
RequestMappingInfo
requestMappingInfo
=(
RequestMappingInfo
)
createMappingMethod
.
invoke
(
requestMappingHandlerMapping
,
specificMethod
,
targetClass
);
if
(
requestMappingInfo
!=
null
)
{
requestMappingHandlerMapping
.
unregisterMapping
(
requestMappingInfo
);
}
}
catch
(
Exception
e
){
e
.
printStackTrace
();
}
}
},
ReflectionUtils
.
USER_DECLARED_METHODS
);
}
}
/**
* 注册Controller
* @param controllerBeanName
* @throws Exception
*/
private
void
registerController
(
String
controllerBeanName
)
throws
Exception
{
final
RequestMappingHandlerMapping
requestMappingHandlerMapping
=(
RequestMappingHandlerMapping
)
SpringContextUtil
.
getBean
(
"requestMappingHandlerMapping"
);
if
(
requestMappingHandlerMapping
!=
null
){
String
handler
=
controllerBeanName
;
Object
controller
=
SpringContextUtil
.
getBean
(
handler
);
if
(
controller
==
null
){
return
;
}
unregisterController
(
controllerBeanName
);
//注册Controller
Method
method
=
requestMappingHandlerMapping
.
getClass
().
getSuperclass
().
getSuperclass
().
getDeclaredMethod
(
"detectHandlerMethods"
,
Object
.
class
);
method
.
setAccessible
(
true
);
method
.
invoke
(
requestMappingHandlerMapping
,
handler
);
}
}
public
void
registerController
(
List
<
String
>
beanNames
)
{
beanNames
.
forEach
(
name
->
{
try
{
registerController
(
name
);
}
catch
(
Exception
e
)
{
// e.printStackTrace();
LogUtil
.
error
(
e
);
}
});
}
}
backend/src/main/java/io/dataease/plugins/loader/ModuleClassLoader.java
浏览文件 @
5b86ad09
...
...
@@ -7,10 +7,14 @@ import org.apache.ibatis.session.SqlSessionFactory;
import
org.apache.ibatis.type.TypeAliasRegistry
;
import
org.springframework.beans.factory.config.BeanDefinition
;
import
org.springframework.beans.factory.support.BeanDefinitionBuilder
;
import
org.springframework.core.annotation.AnnotatedElementUtils
;
import
org.springframework.stereotype.Component
;
import
org.springframework.stereotype.Controller
;
import
org.springframework.stereotype.Repository
;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.StringUtils
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
java.io.ByteArrayOutputStream
;
import
java.io.IOException
;
import
java.io.InputStream
;
...
...
@@ -35,6 +39,8 @@ public class ModuleClassLoader extends URLClassLoader {
//需要注册的spring bean的name集合
private
List
<
String
>
registeredBean
=
new
ArrayList
<>();
private
List
<
String
>
registeredController
=
new
ArrayList
<>();
//构造
public
ModuleClassLoader
(
URL
[]
urls
,
ClassLoader
parent
)
{
...
...
@@ -150,8 +156,12 @@ public class ModuleClassLoader extends URLClassLoader {
beanName
=
StringUtils
.
uncapitalize
(
beanName
);
SpringContextUtil
.
getBeanFactory
().
registerBeanDefinition
(
beanName
,
beanDefinition
);
if
(
isHandler
(
cla
))
{
registeredController
.
add
(
beanName
);
}
registeredBean
.
add
(
beanName
);
// System.out.println("注册bean:"+beanName);
}
}
...
...
@@ -164,6 +174,10 @@ public class ModuleClassLoader extends URLClassLoader {
return
registeredBean
;
}
public
List
<
String
>
getRegisteredController
()
{
return
registeredController
;
}
/**
* 方法描述 判断class对象是否带有spring的注解
...
...
@@ -184,6 +198,9 @@ public class ModuleClassLoader extends URLClassLoader {
if
(
Modifier
.
isAbstract
(
cla
.
getModifiers
())){
return
false
;
}
if
(
isHandler
(
cla
))
{
return
true
;
}
if
(
cla
.
getAnnotation
(
Component
.
class
)!=
null
){
return
true
;
...
...
@@ -194,8 +211,15 @@ public class ModuleClassLoader extends URLClassLoader {
if
(
cla
.
getAnnotation
(
Service
.
class
)!=
null
){
return
true
;
}
if
(
cla
.
getAnnotation
(
Service
.
class
)!=
null
){
return
true
;
}
return
false
;
}
protected
boolean
isHandler
(
Class
<?>
beanType
)
{
return
AnnotatedElementUtils
.
hasAnnotation
(
beanType
,
Controller
.
class
)
||
AnnotatedElementUtils
.
hasAnnotation
(
beanType
,
RequestMapping
.
class
);
}
}
backend/src/main/java/io/dataease/plugins/server/PluginCommonServer.java
浏览文件 @
5b86ad09
...
...
@@ -2,6 +2,7 @@ package io.dataease.plugins.server;
import
io.dataease.commons.utils.ServletUtils
;
import
io.dataease.plugins.common.dto.PluginSysMenu
;
import
io.dataease.plugins.common.service.PluginComponentService
;
import
io.dataease.plugins.common.service.PluginMenuService
;
import
io.dataease.plugins.config.SpringContextUtil
;
import
org.springframework.web.bind.annotation.GetMapping
;
...
...
@@ -9,7 +10,6 @@ import org.springframework.web.bind.annotation.PathVariable;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
springfox.documentation.annotations.ApiIgnore
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.BufferedInputStream
;
import
java.io.IOException
;
...
...
@@ -25,7 +25,7 @@ import java.util.concurrent.atomic.AtomicReference;
public
class
PluginCommonServer
{
@GetMapping
(
"/async/{menuId}"
)
public
void
component
Info
(
@PathVariable
Long
menuId
)
{
public
void
menu
Info
(
@PathVariable
Long
menuId
)
{
Map
<
String
,
PluginMenuService
>
pluginMenuServiceMap
=
SpringContextUtil
.
getApplicationContext
().
getBeansOfType
(
PluginMenuService
.
class
);
pluginMenuServiceMap
.
values
().
stream
().
forEach
(
service
->
{
AtomicReference
<
PluginSysMenu
>
atomicReference
=
new
AtomicReference
<>();
...
...
@@ -65,4 +65,41 @@ public class PluginCommonServer {
return
;
});
}
@GetMapping
(
"/component/{componentName}"
)
public
void
componentInfo
(
@PathVariable
String
componentName
)
{
Map
<
String
,
PluginComponentService
>
beansOfType
=
SpringContextUtil
.
getApplicationContext
().
getBeansOfType
(
PluginComponentService
.
class
);
beansOfType
.
values
().
stream
().
forEach
(
service
->
{
List
<
String
>
components
=
service
.
components
();
if
(
components
.
contains
(
componentName
))
{
HttpServletResponse
response
=
ServletUtils
.
response
();
BufferedInputStream
bis
=
null
;
InputStream
inputStream
=
null
;
OutputStream
os
=
null
;
//输出流
try
{
inputStream
=
service
.
vueResource
(
componentName
);
byte
[]
buffer
=
new
byte
[
1024
];
os
=
response
.
getOutputStream
();
bis
=
new
BufferedInputStream
(
inputStream
);
int
i
=
bis
.
read
(
buffer
);
while
(
i
!=
-
1
){
os
.
write
(
buffer
,
0
,
i
);
i
=
bis
.
read
(
buffer
);
}
os
.
flush
();
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
finally
{
try
{
bis
.
close
();
inputStream
.
close
();
os
.
close
();
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
}
return
;
}
});
}
}
backend/src/main/java/io/dataease/plugins/server/SSOServer.java
0 → 100644
浏览文件 @
5b86ad09
package
io
.
dataease
.
plugins
.
server
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.stream.Collectors
;
import
javax.servlet.http.Cookie
;
import
javax.servlet.http.HttpServletResponse
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Controller
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestParam
;
import
org.springframework.web.servlet.ModelAndView
;
import
io.dataease.auth.entity.SysUserEntity
;
import
io.dataease.auth.entity.TokenInfo
;
import
io.dataease.auth.service.AuthUserService
;
import
io.dataease.auth.util.JWTUtils
;
import
io.dataease.commons.exception.DEException
;
import
io.dataease.commons.utils.CodingUtil
;
import
io.dataease.commons.utils.ServletUtils
;
import
io.dataease.plugins.config.SpringContextUtil
;
import
io.dataease.plugins.xpack.display.dto.response.SysSettingDto
;
import
io.dataease.plugins.xpack.oidc.dto.SSOToken
;
import
io.dataease.plugins.xpack.oidc.dto.SSOUserInfo
;
import
io.dataease.plugins.xpack.oidc.service.OidcXpackService
;
import
io.dataease.service.sys.SysUserService
;
@RequestMapping
(
"/sso"
)
@Controller
public
class
SSOServer
{
@Autowired
private
AuthUserService
authUserService
;
@Autowired
private
SysUserService
sysUserService
;
@GetMapping
(
"/callBack"
)
public
ModelAndView
callBack
(
@RequestParam
(
"code"
)
String
code
,
@RequestParam
(
"state"
)
String
state
)
{
Map
<
String
,
OidcXpackService
>
beansOfType
=
SpringContextUtil
.
getApplicationContext
().
getBeansOfType
((
OidcXpackService
.
class
));
if
(
beansOfType
.
keySet
().
size
()
==
0
)
{
DEException
.
throwException
(
"缺少oidc插件"
);
}
OidcXpackService
oidcXpackService
=
SpringContextUtil
.
getBean
(
OidcXpackService
.
class
);
Boolean
suuportOIDC
=
oidcXpackService
.
isSuuportOIDC
();
if
(!
suuportOIDC
)
{
DEException
.
throwException
(
"未开启oidc"
);
}
Map
<
String
,
String
>
config
=
config
(
oidcXpackService
);
SSOToken
ssoToken
=
oidcXpackService
.
requestSsoToken
(
config
,
code
,
state
);
SSOUserInfo
ssoUserInfo
=
oidcXpackService
.
requestUserInfo
(
config
,
ssoToken
.
getAccessToken
());
SysUserEntity
sysUserEntity
=
authUserService
.
getUserBySub
(
ssoUserInfo
.
getSub
());
if
(
null
==
sysUserEntity
){
sysUserService
.
saveOIDCUser
(
ssoUserInfo
);
sysUserEntity
=
authUserService
.
getUserBySub
(
ssoUserInfo
.
getSub
());
}
TokenInfo
tokenInfo
=
TokenInfo
.
builder
().
userId
(
sysUserEntity
.
getUserId
()).
username
(
sysUserEntity
.
getUsername
()).
build
();
String
realPwd
=
CodingUtil
.
md5
(
sysUserService
.
defaultPWD
());
String
token
=
JWTUtils
.
sign
(
tokenInfo
,
realPwd
);
ServletUtils
.
setToken
(
token
);
HttpServletResponse
response
=
ServletUtils
.
response
();
Cookie
cookie_token
=
new
Cookie
(
"Authorization"
,
token
);
cookie_token
.
setPath
(
"/"
);
Cookie
cookie_id_token
=
new
Cookie
(
"IdToken"
,
ssoToken
.
getIdToken
());
cookie_id_token
.
setPath
(
"/"
);
Cookie
cookie_ac_token
=
new
Cookie
(
"AccessToken"
,
ssoToken
.
getAccessToken
());
cookie_ac_token
.
setPath
(
"/"
);
response
.
addCookie
(
cookie_token
);
response
.
addCookie
(
cookie_id_token
);
response
.
addCookie
(
cookie_ac_token
);
ModelAndView
modelAndView
=
new
ModelAndView
(
"redirect:/"
);
return
modelAndView
;
}
private
Map
<
String
,
String
>
config
(
OidcXpackService
oidcXpackService
)
{
List
<
SysSettingDto
>
sysSettingDtos
=
oidcXpackService
.
oidcSettings
();
Map
<
String
,
String
>
config
=
sysSettingDtos
.
stream
().
collect
(
Collectors
.
toMap
(
SysSettingDto:
:
getParamKey
,
SysSettingDto:
:
getParamValue
));
return
config
;
}
}
backend/src/main/java/io/dataease/plugins/server/XLdapServer.java
浏览文件 @
5b86ad09
...
...
@@ -10,7 +10,7 @@ import org.springframework.web.bind.annotation.*;
import
java.util.List
;
@RequestMapping
(
"/
api
/ldap"
)
@RequestMapping
(
"/
plugin
/ldap"
)
@RestController
public
class
XLdapServer
{
...
...
backend/src/main/java/io/dataease/plugins/server/XOidcServer.java
0 → 100644
浏览文件 @
5b86ad09
package
io
.
dataease
.
plugins
.
server
;
import
io.dataease.plugins.config.SpringContextUtil
;
import
io.dataease.plugins.xpack.display.dto.response.SysSettingDto
;
import
io.dataease.plugins.xpack.oidc.service.OidcXpackService
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.web.bind.annotation.*
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
@RequestMapping
(
"/plugin/oidc"
)
@RestController
public
class
XOidcServer
{
@PostMapping
(
"/info"
)
public
List
<
SysSettingDto
>
getOidcInfo
()
{
OidcXpackService
oidcXpackService
=
SpringContextUtil
.
getBean
(
OidcXpackService
.
class
);
return
oidcXpackService
.
oidcSettings
();
}
@PostMapping
(
"/save"
)
public
void
save
(
@RequestBody
List
<
SysSettingDto
>
settings
)
{
OidcXpackService
oidcXpackService
=
SpringContextUtil
.
getBean
(
OidcXpackService
.
class
);
oidcXpackService
.
save
(
settings
);
}
@PostMapping
(
value
=
"/authInfo"
)
public
Map
<
String
,
Object
>
authInfo
()
{
OidcXpackService
oidcXpackService
=
SpringContextUtil
.
getBean
(
OidcXpackService
.
class
);
Map
<
String
,
Object
>
result
=
new
HashMap
<
String
,
Object
>();
List
<
SysSettingDto
>
oidcSettings
=
oidcXpackService
.
oidcSettings
();
Map
<
String
,
String
>
authParam
=
new
HashMap
<>();
authParam
.
put
(
"response_type"
,
"code"
);
authParam
.
put
(
"state"
,
"state"
);
// authParam.put("redirect_uri", "http://localhost:9528");
oidcSettings
.
forEach
(
param
->
{
if
(
StringUtils
.
isNotBlank
(
param
.
getParamKey
()))
{
if
(
StringUtils
.
equals
(
param
.
getParamKey
(),
"oidc.authEndpoint"
))
{
result
.
put
(
"authEndpoint"
,
param
.
getParamValue
());
}
if
(
StringUtils
.
equals
(
param
.
getParamKey
(),
"oidc.scope"
))
{
authParam
.
put
(
"scope"
,
param
.
getParamValue
());
}
if
(
StringUtils
.
equals
(
param
.
getParamKey
(),
"oidc.clientId"
))
{
authParam
.
put
(
"client_id"
,
param
.
getParamValue
());
}
}
});
result
.
put
(
"authParam"
,
authParam
);
return
result
;
}
}
backend/src/main/java/io/dataease/service/chart/ChartViewService.java
浏览文件 @
5b86ad09
...
...
@@ -208,7 +208,9 @@ public class ChartViewService {
customFilter
.
addAll
(
collect
);
}
if
(
StringUtils
.
equalsIgnoreCase
(
"text"
,
view
.
getType
())
||
StringUtils
.
equalsIgnoreCase
(
"gauge"
,
view
.
getType
()))
{
if
(
StringUtils
.
equalsIgnoreCase
(
"text"
,
view
.
getType
())
||
StringUtils
.
equalsIgnoreCase
(
"gauge"
,
view
.
getType
())
||
StringUtils
.
equalsIgnoreCase
(
"liquid"
,
view
.
getType
()))
{
xAxis
=
new
ArrayList
<>();
if
(
CollectionUtils
.
isEmpty
(
yAxis
))
{
ChartViewDTO
dto
=
new
ChartViewDTO
();
...
...
@@ -327,7 +329,7 @@ public class ChartViewService {
QueryProvider
qp
=
ProviderFactory
.
getQueryProvider
(
ds
.
getType
());
if
(
StringUtils
.
equalsIgnoreCase
(
table
.
getType
(),
"db"
))
{
datasourceRequest
.
setTable
(
dataTableInfoDTO
.
getTable
());
if
(
StringUtils
.
equalsIgnoreCase
(
"text"
,
view
.
getType
())
||
StringUtils
.
equalsIgnoreCase
(
"gauge"
,
view
.
getType
()))
{
if
(
StringUtils
.
equalsIgnoreCase
(
"text"
,
view
.
getType
())
||
StringUtils
.
equalsIgnoreCase
(
"gauge"
,
view
.
getType
())
||
StringUtils
.
equalsIgnoreCase
(
"liquid"
,
view
.
getType
())
)
{
datasourceRequest
.
setQuery
(
qp
.
getSQLSummary
(
dataTableInfoDTO
.
getTable
(),
yAxis
,
customFilter
,
extFilterList
));
}
else
if
(
StringUtils
.
containsIgnoreCase
(
view
.
getType
(),
"stack"
))
{
datasourceRequest
.
setQuery
(
qp
.
getSQLStack
(
dataTableInfoDTO
.
getTable
(),
xAxis
,
yAxis
,
customFilter
,
extFilterList
,
extStack
,
ds
));
...
...
@@ -339,7 +341,7 @@ public class ChartViewService {
datasourceRequest
.
setQuery
(
qp
.
getSQL
(
dataTableInfoDTO
.
getTable
(),
xAxis
,
yAxis
,
customFilter
,
extFilterList
,
ds
));
}
}
else
if
(
StringUtils
.
equalsIgnoreCase
(
table
.
getType
(),
"sql"
))
{
if
(
StringUtils
.
equalsIgnoreCase
(
"text"
,
view
.
getType
())
||
StringUtils
.
equalsIgnoreCase
(
"gauge"
,
view
.
getType
()))
{
if
(
StringUtils
.
equalsIgnoreCase
(
"text"
,
view
.
getType
())
||
StringUtils
.
equalsIgnoreCase
(
"gauge"
,
view
.
getType
())
||
StringUtils
.
equalsIgnoreCase
(
"liquid"
,
view
.
getType
())
)
{
datasourceRequest
.
setQuery
(
qp
.
getSQLSummaryAsTmp
(
dataTableInfoDTO
.
getSql
(),
yAxis
,
customFilter
,
extFilterList
));
}
else
if
(
StringUtils
.
containsIgnoreCase
(
view
.
getType
(),
"stack"
))
{
datasourceRequest
.
setQuery
(
qp
.
getSQLAsTmpStack
(
dataTableInfoDTO
.
getSql
(),
xAxis
,
yAxis
,
customFilter
,
extFilterList
,
extStack
));
...
...
@@ -354,7 +356,7 @@ public class ChartViewService {
DataTableInfoDTO
dt
=
new
Gson
().
fromJson
(
table
.
getInfo
(),
DataTableInfoDTO
.
class
);
List
<
DataSetTableUnionDTO
>
list
=
dataSetTableUnionService
.
listByTableId
(
dt
.
getList
().
get
(
0
).
getTableId
());
String
sql
=
dataSetTableService
.
getCustomSQLDatasource
(
dt
,
list
,
ds
);
if
(
StringUtils
.
equalsIgnoreCase
(
"text"
,
view
.
getType
())
||
StringUtils
.
equalsIgnoreCase
(
"gauge"
,
view
.
getType
()))
{
if
(
StringUtils
.
equalsIgnoreCase
(
"text"
,
view
.
getType
())
||
StringUtils
.
equalsIgnoreCase
(
"gauge"
,
view
.
getType
())
||
StringUtils
.
equalsIgnoreCase
(
"liquid"
,
view
.
getType
())
)
{
datasourceRequest
.
setQuery
(
qp
.
getSQLSummaryAsTmp
(
sql
,
yAxis
,
customFilter
,
extFilterList
));
}
else
if
(
StringUtils
.
containsIgnoreCase
(
view
.
getType
(),
"stack"
))
{
datasourceRequest
.
setQuery
(
qp
.
getSQLAsTmpStack
(
sql
,
xAxis
,
yAxis
,
customFilter
,
extFilterList
,
extStack
));
...
...
@@ -386,7 +388,7 @@ public class ChartViewService {
String
tableName
=
"ds_"
+
table
.
getId
().
replaceAll
(
"-"
,
"_"
);
datasourceRequest
.
setTable
(
tableName
);
QueryProvider
qp
=
ProviderFactory
.
getQueryProvider
(
ds
.
getType
());
if
(
StringUtils
.
equalsIgnoreCase
(
"text"
,
view
.
getType
())
||
StringUtils
.
equalsIgnoreCase
(
"gauge"
,
view
.
getType
()))
{
if
(
StringUtils
.
equalsIgnoreCase
(
"text"
,
view
.
getType
())
||
StringUtils
.
equalsIgnoreCase
(
"gauge"
,
view
.
getType
())
||
StringUtils
.
equalsIgnoreCase
(
"liquid"
,
view
.
getType
())
)
{
datasourceRequest
.
setQuery
(
qp
.
getSQLSummary
(
tableName
,
yAxis
,
customFilter
,
extFilterList
));
}
else
if
(
StringUtils
.
containsIgnoreCase
(
view
.
getType
(),
"stack"
))
{
datasourceRequest
.
setQuery
(
qp
.
getSQLStack
(
tableName
,
xAxis
,
yAxis
,
customFilter
,
extFilterList
,
extStack
,
ds
));
...
...
@@ -458,6 +460,9 @@ public class ChartViewService {
map
.
putAll
(
mapChart
);
map
.
putAll
(
mapTableNormal
);
List
<
DatasetTableField
>
sourceFields
=
dataSetTableFieldsService
.
getFieldsByTableId
(
view
.
getTableId
());
map
.
put
(
"sourceFields"
,
sourceFields
);
ChartViewDTO
dto
=
new
ChartViewDTO
();
BeanUtils
.
copyBean
(
dto
,
view
);
dto
.
setData
(
map
);
...
...
backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java
浏览文件 @
5b86ad09
...
...
@@ -805,21 +805,35 @@ public class DataSetTableService {
String
f
=
field
.
substring
(
0
,
field
.
length
()
-
1
);
StringBuilder
join
=
new
StringBuilder
();
List
<
DataSetTableUnionDTO
>
unions
=
new
ArrayList
<>();
for
(
DataTableInfoCustomUnion
dataTableInfoCustomUnion
:
dataTableInfoDTO
.
getList
())
{
for
(
DataSetTableUnionDTO
dto
:
list
)
{
// 被关联表和自助数据集的表相等
if
(
StringUtils
.
equals
(
dto
.
getTargetTableId
(),
dataTableInfoCustomUnion
.
getTableId
()))
{
DatasetTableField
sourceField
=
dataSetTableFieldsService
.
get
(
dto
.
getSourceTableFieldId
());
DatasetTableField
targetField
=
dataSetTableFieldsService
.
get
(
dto
.
getTargetTableFieldId
());
if
(
ObjectUtils
.
isEmpty
(
sourceField
)
||
ObjectUtils
.
isEmpty
(
targetField
))
{
DEException
.
throwException
(
Translator
.
get
(
"i18n_dataset_field_delete"
));
}
unions
.
add
(
dto
);
}
}
}
if
(
CollectionUtils
.
isNotEmpty
(
unions
))
{
for
(
int
i
=
0
;
i
<
unions
.
size
();
i
++)
{
DataSetTableUnionDTO
dto
=
unions
.
get
(
i
);
DatasetTableField
sourceField
=
dataSetTableFieldsService
.
get
(
dto
.
getSourceTableFieldId
());
DatasetTableField
targetField
=
dataSetTableFieldsService
.
get
(
dto
.
getTargetTableFieldId
());
if
(
ObjectUtils
.
isEmpty
(
sourceField
)
||
ObjectUtils
.
isEmpty
(
targetField
))
{
DEException
.
throwException
(
Translator
.
get
(
"i18n_dataset_field_delete"
));
}
if
(
i
==
0
)
{
join
.
append
(
convertUnionTypeToSQL
(
dto
.
getSourceUnionRelation
()))
.
append
(
DorisTableUtils
.
dorisName
(
dto
.
getTargetTableId
()))
.
append
(
" ON "
)
.
append
(
DorisTableUtils
.
dorisName
(
dto
.
getSourceTableId
())).
append
(
"."
).
append
(
sourceField
.
getDataeaseName
())
.
append
(
" = "
)
.
append
(
DorisTableUtils
.
dorisName
(
dto
.
getTargetTableId
())).
append
(
"."
).
append
(
targetField
.
getDataeaseName
());
}
else
{
join
.
append
(
" AND "
)
.
append
(
DorisTableUtils
.
dorisName
(
dto
.
getSourceTableId
())).
append
(
"."
).
append
(
sourceField
.
getDataeaseName
())
.
append
(
" = "
)
.
append
(
DorisTableUtils
.
dorisName
(
dto
.
getTargetTableId
())).
append
(
"."
).
append
(
targetField
.
getDataeaseName
());
}
}
}
...
...
@@ -865,25 +879,39 @@ public class DataSetTableService {
String
f
=
field
.
substring
(
0
,
field
.
length
()
-
1
);
StringBuilder
join
=
new
StringBuilder
();
List
<
DataSetTableUnionDTO
>
unions
=
new
ArrayList
<>();
for
(
DataTableInfoCustomUnion
dataTableInfoCustomUnion
:
dataTableInfoDTO
.
getList
())
{
for
(
DataSetTableUnionDTO
dto
:
list
)
{
// 被关联表和自助数据集的表相等
if
(
StringUtils
.
equals
(
dto
.
getTargetTableId
(),
dataTableInfoCustomUnion
.
getTableId
()))
{
DatasetTableField
sourceField
=
dataSetTableFieldsService
.
get
(
dto
.
getSourceTableFieldId
());
DatasetTableField
targetField
=
dataSetTableFieldsService
.
get
(
dto
.
getTargetTableFieldId
());
if
(
ObjectUtils
.
isEmpty
(
sourceField
)
||
ObjectUtils
.
isEmpty
(
targetField
))
{
DEException
.
throwException
(
Translator
.
get
(
"i18n_dataset_field_delete"
));
}
DatasetTable
sourceTable
=
datasetTableMapper
.
selectByPrimaryKey
(
dto
.
getSourceTableId
());
String
sourceTableName
=
new
Gson
().
fromJson
(
sourceTable
.
getInfo
(),
DataTableInfoDTO
.
class
).
getTable
();
DatasetTable
targetTable
=
datasetTableMapper
.
selectByPrimaryKey
(
dto
.
getTargetTableId
());
String
targetTableName
=
new
Gson
().
fromJson
(
targetTable
.
getInfo
(),
DataTableInfoDTO
.
class
).
getTable
();
unions
.
add
(
dto
);
}
}
}
if
(
CollectionUtils
.
isNotEmpty
(
unions
))
{
for
(
int
i
=
0
;
i
<
unions
.
size
();
i
++)
{
DataSetTableUnionDTO
dto
=
unions
.
get
(
i
);
DatasetTableField
sourceField
=
dataSetTableFieldsService
.
get
(
dto
.
getSourceTableFieldId
());
DatasetTableField
targetField
=
dataSetTableFieldsService
.
get
(
dto
.
getTargetTableFieldId
());
if
(
ObjectUtils
.
isEmpty
(
sourceField
)
||
ObjectUtils
.
isEmpty
(
targetField
))
{
DEException
.
throwException
(
Translator
.
get
(
"i18n_dataset_field_delete"
));
}
DatasetTable
sourceTable
=
datasetTableMapper
.
selectByPrimaryKey
(
dto
.
getSourceTableId
());
String
sourceTableName
=
new
Gson
().
fromJson
(
sourceTable
.
getInfo
(),
DataTableInfoDTO
.
class
).
getTable
();
DatasetTable
targetTable
=
datasetTableMapper
.
selectByPrimaryKey
(
dto
.
getTargetTableId
());
String
targetTableName
=
new
Gson
().
fromJson
(
targetTable
.
getInfo
(),
DataTableInfoDTO
.
class
).
getTable
();
if
(
i
==
0
)
{
join
.
append
(
convertUnionTypeToSQL
(
dto
.
getSourceUnionRelation
()))
.
append
(
String
.
format
(
keyword
,
targetTableName
))
.
append
(
" ON "
)
.
append
(
String
.
format
(
keyword
,
sourceTableName
)).
append
(
"."
).
append
(
String
.
format
(
keyword
,
sourceField
.
getOriginName
()))
.
append
(
" = "
)
.
append
(
String
.
format
(
keyword
,
targetTableName
)).
append
(
"."
).
append
(
String
.
format
(
keyword
,
targetField
.
getOriginName
()));
}
else
{
join
.
append
(
" AND "
)
.
append
(
String
.
format
(
keyword
,
sourceTableName
)).
append
(
"."
).
append
(
String
.
format
(
keyword
,
sourceField
.
getOriginName
()))
.
append
(
" = "
)
.
append
(
String
.
format
(
keyword
,
targetTableName
)).
append
(
"."
).
append
(
String
.
format
(
keyword
,
targetField
.
getOriginName
()));
}
}
}
...
...
backend/src/main/java/io/dataease/service/sys/SysUserService.java
浏览文件 @
5b86ad09
...
...
@@ -22,6 +22,8 @@ import io.dataease.controller.sys.response.SysUserGridResponse;
import
io.dataease.controller.sys.response.SysUserRole
;
import
io.dataease.i18n.Translator
;
import
io.dataease.plugins.common.entity.XpackLdapUserEntity
;
import
io.dataease.plugins.xpack.oidc.dto.SSOUserInfo
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.apache.commons.lang3.ObjectUtils
;
import
org.apache.commons.lang3.StringUtils
;
...
...
@@ -31,6 +33,8 @@ import org.springframework.stereotype.Service;
import
org.springframework.transaction.annotation.Transactional
;
import
javax.annotation.Resource
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.stream.Collectors
;
...
...
@@ -82,6 +86,7 @@ public class SysUserService {
@Transactional
public
int
save
(
SysUserCreateRequest
request
)
{
checkUsername
(
request
);
checkEmail
(
request
);
SysUser
user
=
BeanUtils
.
copyBean
(
new
SysUser
(),
request
);
long
now
=
System
.
currentTimeMillis
();
user
.
setCreateTime
(
now
);
...
...
@@ -102,6 +107,34 @@ public class SysUserService {
return
insert
;
}
@Transactional
public
void
saveOIDCUser
(
SSOUserInfo
ssoUserInfo
)
{
long
now
=
System
.
currentTimeMillis
();
SysUser
sysUser
=
new
SysUser
();
sysUser
.
setUsername
(
ssoUserInfo
.
getUsername
());
sysUser
.
setNickName
(
ssoUserInfo
.
getNickName
());
sysUser
.
setEmail
(
ssoUserInfo
.
getEmail
());
sysUser
.
setPassword
(
CodingUtil
.
md5
(
DEFAULT_PWD
));
sysUser
.
setCreateTime
(
now
);
sysUser
.
setUpdateTime
(
now
);
sysUser
.
setEnabled
(
1L
);
sysUser
.
setLanguage
(
"zh_CN"
);
sysUser
.
setFrom
(
2
);
sysUser
.
setSub
(
ssoUserInfo
.
getSub
());
sysUserMapper
.
insert
(
sysUser
);
SysUser
dbUser
=
findOne
(
sysUser
);
if
(
null
!=
dbUser
&&
null
!=
dbUser
.
getUserId
())
{
// oidc默认角色是普通员工
List
<
Long
>
roleIds
=
new
ArrayList
<
Long
>();
roleIds
.
add
(
2L
);
saveUserRoles
(
dbUser
.
getUserId
(),
roleIds
);
}
}
public
String
defaultPWD
()
{
return
DEFAULT_PWD
;
}
@Transactional
public
void
saveLdapUsers
(
LdapAddRequest
request
)
{
long
now
=
System
.
currentTimeMillis
();
...
...
@@ -115,6 +148,7 @@ public class SysUserService {
sysUser
.
setCreateTime
(
now
);
sysUser
.
setUpdateTime
(
now
);
sysUser
.
setEnabled
(
request
.
getEnabled
());
sysUser
.
setLanguage
(
"zh_CN"
);
sysUser
.
setFrom
(
1
);
return
sysUser
;
}).
collect
(
Collectors
.
toList
());
...
...
@@ -145,6 +179,7 @@ public class SysUserService {
@Transactional
public
int
update
(
SysUserCreateRequest
request
)
{
checkUsername
(
request
);
checkEmail
(
request
);
if
(
StringUtils
.
isEmpty
(
request
.
getPassword
()))
{
request
.
setPassword
(
null
);
}
...
...
@@ -287,4 +322,19 @@ public class SysUserService {
throw
new
RuntimeException
(
Translator
.
get
(
"i18n_username_exists"
));
}
}
private
void
checkEmail
(
SysUserCreateRequest
request
)
{
SysUserExample
sysUserExample
=
new
SysUserExample
();
SysUserExample
.
Criteria
criteria
=
sysUserExample
.
createCriteria
();
if
(
request
.
getUserId
()
!=
null
)
{
criteria
.
andUserIdNotEqualTo
(
request
.
getUserId
());
}
criteria
.
andEmailEqualTo
(
request
.
getEmail
());
List
<
SysUser
>
sysUsers
=
sysUserMapper
.
selectByExample
(
sysUserExample
);
if
(
CollectionUtils
.
isNotEmpty
(
sysUsers
))
{
throw
new
RuntimeException
(
Translator
.
get
(
"i18n_email_exists"
));
}
}
}
backend/src/main/java/io/dataease/service/system/SystemParameterService.java
浏览文件 @
5b86ad09
...
...
@@ -229,9 +229,9 @@ public class SystemParameterService {
}
public
static
void
main
(
String
[]
args
)
{
/*
public static void main(String[] args) {
String info="[{\"paramKey\":\"base.url\",\"paramValue\":null,\"type\":\"text\",\"sort\":1,\"file\":null,\"fileName\":null},{\"paramKey\":\"base.title\",\"paramValue\":\"DataEase Title\",\"type\":\"text\",\"sort\":3,\"file\":null,\"fileName\":null},{\"paramKey\":\"base.logo\",\"paramValue\":\"DataEase\",\"type\":\"text\",\"sort\":4,\"file\":null,\"fileName\":\"favicon.icon.png\"}]";
List<SystemParameterDTO> temp = JSON.parseArray(info,SystemParameterDTO.class);
// System.out.println("===>");
}
}
*/
}
backend/src/main/resources/db/migration/V26__de1.3.sql
浏览文件 @
5b86ad09
...
...
@@ -31,3 +31,24 @@ INSERT INTO `sys_menu` VALUES (60, 1, 0, 1, '导入LDAP用户', 'system-user-imp
ALTER
TABLE
`datasource`
ADD
COLUMN
`compute_type`
VARCHAR
(
45
)
NULL
DEFAULT
'ALL'
COMMENT
'数据计算模式'
AFTER
`status`
;
update
datasource
set
compute_type
=
'ALL'
;
BEGIN
;
INSERT
INTO
`system_parameter`
VALUES
(
'ldap.url'
,
NULL
,
'text'
,
1
);
INSERT
INTO
`system_parameter`
VALUES
(
'ldap.dn'
,
NULL
,
'text'
,
2
);
INSERT
INTO
`system_parameter`
VALUES
(
'ldap.password'
,
NULL
,
'password'
,
3
);
INSERT
INTO
`system_parameter`
VALUES
(
'ldap.ou'
,
NULL
,
'text'
,
4
);
INSERT
INTO
`system_parameter`
VALUES
(
'ldap.mapping'
,
NULL
,
'text'
,
6
);
INSERT
INTO
`system_parameter`
VALUES
(
'ldap.open'
,
NULL
,
'text'
,
7
);
INSERT
INTO
`system_parameter`
VALUES
(
'oidc.authEndpoint'
,
NULL
,
'text'
,
1
);
INSERT
INTO
`system_parameter`
VALUES
(
'oidc.tokenEndpoint'
,
NULL
,
'text'
,
2
);
INSERT
INTO
`system_parameter`
VALUES
(
'oidc.userinfoEndpoint'
,
NULL
,
'text'
,
3
);
INSERT
INTO
`system_parameter`
VALUES
(
'oidc.logoutEndpoint'
,
NULL
,
'text'
,
4
);
INSERT
INTO
`system_parameter`
VALUES
(
'oidc.clientId'
,
NULL
,
'text'
,
5
);
INSERT
INTO
`system_parameter`
VALUES
(
'oidc.secret'
,
NULL
,
'password'
,
6
);
INSERT
INTO
`system_parameter`
VALUES
(
'oidc.scope'
,
NULL
,
'text'
,
7
);
INSERT
INTO
`system_parameter`
VALUES
(
'oidc.redirectUrl'
,
NULL
,
'text'
,
8
);
INSERT
INTO
`system_parameter`
VALUES
(
'oidc.open'
,
NULL
,
'text'
,
9
);
COMMIT
;
ALTER
TABLE
`sys_user`
ADD
COLUMN
`sub`
varchar
(
255
)
COMMENT
'oidc用户ID'
AFTER
`from`
;
backend/src/main/resources/i18n/messages_en_US.properties
浏览文件 @
5b86ad09
...
...
@@ -198,6 +198,7 @@ authsource_configuration_is_null=Authentication source configuration cannot be e
删除角色=Delete
Role
删除连接=Delete
Connection
显示设置=Display
系统参数=System
Param
参数管理=Parameter
数据源=Data
Source
数据源表单=Data
source
form
...
...
@@ -243,6 +244,7 @@ i18n_union_field_exists=The same field can't in two dataset
i18n_cron_time_error
=
Start time can't greater then end time
i18n_auth_source_be_canceled
=
This Auth Resource Already Be Canceled,Please Connect Admin
i18n_username_exists
=
ID is already exists
i18n_email_exists
=
Email is already exists
i18n_ds_name_exists
=
Datasource name used
i18n_sync_job_exists
=
There is already a synchronization task running, please try again later
i18n_datasource_check_fail
=
Invalid,please check config
...
...
backend/src/main/resources/i18n/messages_zh_CN.properties
浏览文件 @
5b86ad09
...
...
@@ -198,6 +198,7 @@ authsource_configuration_is_null=认证源配置不能为空
删除角色=删除角色
删除连接=删除连接
显示设置=显示设置
系统参数=系统参数
数据源=数据源
数据源表单=数据源表单
数据集=数据集
...
...
@@ -233,7 +234,7 @@ i18n_chart_count=记录数*
i18n_excel_have_merge_region
=
Excel 存在合并单元格
i18n_cron_expression_error
=
Cron 表达式校验错误
i18n_same_folder_can_not_repeat
=
同一目录下该名称已被使用
i18n_select_diff_folder
=
请选择不
通
的目录
i18n_select_diff_folder
=
请选择不
同
的目录
i18n_default_panel
=
默认仪表板
i18n_panel_list
=
仪表板
i18n_processing_data
=
正在处理数据,稍后刷新
...
...
@@ -242,6 +243,7 @@ i18n_union_field_exists=两个数据集之间关联不能出现多次相同字
i18n_cron_time_error
=
开始时间不能大于结束时间
i18n_auth_source_be_canceled
=
本用户当前资源所有授权权限已经被取消,如需再次开通,请联系管理员
i18n_username_exists
=
用户 ID 已存在
i18n_email_exists
=
邮箱已存在
i18n_ds_name_exists
=
数据源名称已被使用
i18n_sync_job_exists
=
已经有同步任务在运行,稍后重试
i18n_datasource_check_fail
=
校验失败,请检查配置信息
...
...
backend/src/main/resources/i18n/messages_zh_TW.properties
浏览文件 @
5b86ad09
...
...
@@ -200,6 +200,7 @@ authsource_configuration_is_null=認證源配置不能為空
删除角色=刪除角色
刪除连接=刪除鏈接
显示设置=顯示設置
系统参数=系統參數
参数管理=參數管理
数据源=數據源
数据源表单=數據源表單
...
...
@@ -236,7 +237,7 @@ i18n_chart_count=記錄數*
i18n_excel_have_merge_region
=
Excel存在合並單元格
i18n_cron_expression_error
=
Cron表達式校驗錯誤
i18n_same_folder_can_not_repeat
=
同一目錄下該名稱已被使用
i18n_select_diff_folder
=
请选择不
通
的目录
i18n_select_diff_folder
=
请选择不
同
的目录
i18n_default_panel
=
默認儀表板
i18n_panel_list
=
儀表板
i18n_processing_data
=
正在處理數據,稍後刷新
...
...
@@ -245,6 +246,7 @@ i18n_union_field_exists=兩個數據集之間關聯不能出現多次相同字
i18n_cron_time_error
=
開始時間不能大於結束時間
i18n_auth_source_be_canceled
=
本用户当前资源所有授权权限已经被取消,如需再次开通,请联系管理员
i18n_username_exists
=
用戶ID已存在
i18n_email_exists
=
郵箱已存在
i18n_ds_name_exists
=
數據源名稱已被使用
i18n_sync_job_exists
=
已經有同步任務在運行,稍後重試
i18n_datasource_check_fail
=
校驗失敗,請檢查配置信息
...
...
frontend/package.json
浏览文件 @
5b86ad09
...
...
@@ -15,6 +15,7 @@
"svgo"
:
"svgo -f src/icons/svg --config=src/icons/svgo.yml"
},
"dependencies"
:
{
"@antv/g2plot"
:
"^2.3.32"
,
"@riophae/vue-treeselect"
:
"0.4.0"
,
"@tinymce/tinymce-vue"
:
"^3.2.8"
,
"axios"
:
"^0.21.1"
,
...
...
frontend/src/api/system/user.js
浏览文件 @
5b86ad09
...
...
@@ -100,7 +100,7 @@ export function roleGrid(pageIndex, pageSize, data) {
export
function
ldapUsers
(
data
)
{
return
request
({
url
:
'/
api
/ldap/users'
,
url
:
'/
plugin
/ldap/users'
,
method
:
'post'
,
loading
:
true
})
...
...
frontend/src/api/user.js
浏览文件 @
5b86ad09
...
...
@@ -57,3 +57,10 @@ export function ldapStatus() {
method
:
'post'
})
}
export
function
oidcStatus
()
{
return
request
({
url
:
'/api/auth/isOpenOidc'
,
method
:
'post'
})
}
frontend/src/components/DeDrag/index.vue
浏览文件 @
5b86ad09
...
...
@@ -610,7 +610,7 @@ export default {
const
rect
=
this
.
$el
.
parentNode
.
getBoundingClientRect
()
this
.
parentX
=
rect
.
x
this
.
parentY
=
rect
.
y
return
[
Math
.
round
(
parseFloat
(
style
.
getPropertyValue
(
'width'
),
10
)),
Math
.
round
(
parseFloat
(
style
.
getPropertyValue
(
'height'
),
10
))
]
return
[
Math
.
round
(
parseFloat
(
style
.
getPropertyValue
(
'width'
),
10
)),
100000
]
}
if
(
typeof
this
.
parent
===
'string'
)
{
const
parentNode
=
document
.
querySelector
(
this
.
parent
)
...
...
frontend/src/components/Notification/index.vue
浏览文件 @
5b86ad09
...
...
@@ -199,6 +199,7 @@ export default {
query
(
currentPage
,
pageSize
,
param
).
then
(
response
=>
{
this
.
data
=
response
.
data
.
listObject
this
.
paginationConfig
.
total
=
response
.
data
.
itemCount
this
.
count
=
this
.
paginationConfig
.
total
}).
catch
(()
=>
{
const
token
=
getToken
()
if
(
!
token
||
token
===
'null'
||
token
===
'undefined'
)
{
...
...
@@ -232,7 +233,7 @@ export default {
right
:
178px
;
top
:
8px
;
background
:
red
;
//
color: #fff;
color
:
#fff
;
border-radius
:
17px
;
padding
:
4px
7px
;
font-size
:
16px
;
...
...
frontend/src/components/canvas/components/Editor/Preview.vue
浏览文件 @
5b86ad09
...
...
@@ -110,12 +110,16 @@ export default {
}
}
}
if
(
this
.
canvasStyleData
.
selfAdaption
)
{
style
=
{
overflow
:
'hidden'
,
...
style
}
}
// if (this.canvasStyleData.selfAdaption) {
// style = {
// overflow: 'hidden',
// ...style
// }
// }
// style = {
// overflow-x :'hidden',
// ...style
// }
return
style
},
// 此处单独计算componentData的值 不放入全局mapState中
...
...
@@ -168,10 +172,13 @@ export default {
const
canvasWidth
=
document
.
getElementById
(
'canvasInfoTemp'
).
offsetWidth
this
.
scaleWidth
=
canvasWidth
*
100
/
parseInt
(
this
.
canvasStyleData
.
width
)
// 获取宽度比
this
.
scaleHeight
=
canvasHeight
*
100
/
parseInt
(
this
.
canvasStyleData
.
height
)
// 获取高度比
if
(
this
.
showType
===
'width'
)
{
this
.
scaleHeight
=
this
.
scaleWidth
this
.
mainHeight
=
this
.
canvasStyleData
.
height
*
this
.
scaleHeight
/
100
+
'px'
}
this
.
scaleHeight
=
this
.
scaleWidth
// this.mainHeight = this.canvasStyleData.height * this.scaleHeight / 100 + 'px'
// if (this.showType === 'width') {
// this.scaleHeight = this.scaleWidth
// this.mainHeight = this.canvasStyleData.height * this.scaleHeight / 100 + 'px'
// }
this
.
handleScaleChange
()
},
resetID
(
data
)
{
...
...
frontend/src/components/canvas/components/Editor/index.vue
浏览文件 @
5b86ad09
<
template
>
<div
v-if=
"showDrag"
id=
"editor"
class=
"editor"
:class=
"[
...
...
@@ -13,7 +12,7 @@
@mousedown="handleMouseDown"
>
<!-- 网格线 -->
<Grid
v-if=
"canvasStyleData.auxiliaryMatrix&&!linkageSettingStatus"
:matrix-style=
"matrixStyle"
/
>
<!--
<Grid
v-if=
"canvasStyleData.auxiliaryMatrix&&!linkageSettingStatus"
:matrix-style=
"matrixStyle"
/>
--
>
<!-- 仪表板联动清除按钮-->
<canvas-opt-bar
/>
...
...
@@ -217,10 +216,10 @@ export default {
width
:
80
,
height
:
20
},
// 矩阵数量 默认 12
* 24
// 矩阵数量 默认 12
8 * 72
matrixCount
:
{
x
:
24
,
y
:
72
x
:
80
,
y
:
45
},
customStyleHistory
:
null
,
showDrag
:
true
,
...
...
@@ -556,6 +555,9 @@ export default {
if
(
this
.
canvasStyleData
.
matrixCount
)
{
this
.
matrixCount
=
this
.
canvasStyleData
.
matrixCount
}
// 1.3 版本重新设计仪表板定位方式,基准画布宽高为 1600*900 宽度自适应当前画布获取缩放比例scaleWidth
// 高度缩放比例scaleHeight = scaleWidth 基础矩阵为128*72 矩阵原始宽度12.5*12.5 矩阵高度可以调整
if
(
this
.
outStyle
.
width
&&
this
.
outStyle
.
height
)
{
// 矩阵计算
if
(
!
this
.
canvasStyleData
.
selfAdaption
)
{
...
...
@@ -643,6 +645,7 @@ export default {
position
:
relative
;
/*background: #fff;*/
margin
:
auto
;
overflow-x
:
hidden
;
background-size
:
100%
100%
!
important
;
/*transform-style:preserve-3d;*/
.lock
{
...
...
frontend/src/components/canvas/components/TextAttr.vue
浏览文件 @
5b86ad09
...
...
@@ -49,6 +49,14 @@
<el-input
v-model=
"innerOpacity"
type=
"number"
size=
"mini"
min=
"0"
max=
"100"
step=
"10"
@
change=
"styleChange"
/>
</div>
<el-tooltip
:content=
"$t('panel.borderRadius')"
>
<i
style=
"float: left;margin-top: 3px;margin-left: 2px;"
class=
"icon iconfont icon-fangxing-"
/>
</el-tooltip>
<div
style=
"width: 70px;float: left;margin-top: 2px;margin-left: 2px;"
>
<el-input
v-model=
"styleInfo.borderRadius"
type=
"number"
size=
"mini"
min=
"0"
max=
"100"
step=
"1"
@
change=
"styleChange"
/>
</div>
<div
style=
"width: 20px;float: left;margin-top: 2px;margin-left: 10px;"
>
<div
style=
"width: 16px;height: 18px"
>
<el-tooltip
:content=
"$t('panel.color')"
>
...
...
@@ -173,7 +181,7 @@ export default {
ps
=
x
+
60
}
// 防止toolbar超出边界
const
xGap
=
ps
+
49
5
-
this
.
canvasWidth
const
xGap
=
ps
+
56
5
-
this
.
canvasWidth
// console.log('canvasWidth:' + this.canvasWidth + ';xGap:' + xGap)
if
(
xGap
>
0
)
{
return
ps
-
xGap
...
...
@@ -205,7 +213,7 @@ export default {
.el-card-main
{
height
:
34px
;
z-index
:
10
;
width
:
55
0px
;
width
:
62
0px
;
position
:
absolute
;
}
...
...
frontend/src/components/canvas/components/Toolbar.vue
浏览文件 @
5b86ad09
...
...
@@ -17,18 +17,6 @@
<el-switch
v-model=
"canvasStyleData.auxiliaryMatrix"
:width=
"35"
name=
"auxiliaryMatrix"
/>
<span>
{{
$t
(
'panel.matrix_design'
)
}}
</span>
</div>
<div
class=
"canvas-config"
style=
"margin-right: 10px"
>
<el-switch
v-model=
"canvasStyleData.selfAdaption"
:width=
"35"
name=
"selfAdaption"
/>
<span>
{{
$t
(
'panel.canvas_self_adaption'
)
}}
</span>
</div>
<div
class=
"canvas-config"
style=
"margin-right: 55px"
>
<span>
{{
$t
(
'panel.canvas_size'
)
}}
</span>
<input
v-model=
"canvasStyleData.width"
:disabled=
"canvasStyleData.selfAdaption"
>
<span>
*
</span>
<input
v-model=
"canvasStyleData.height"
:disabled=
"canvasStyleData.selfAdaption"
>
</div>
<!--
<div
class=
"canvas-config"
style=
"margin-right: 10px"
>
-->
<!--
<span>
{{
$t
(
'panel.canvas_scale'
)
}}
</span>
-->
<!--
<input
v-model=
"scale"
@
input=
"handleScaleChange"
>
%-->
...
...
@@ -383,7 +371,7 @@ export default {
float
:
right
;
height
:
35px
;
line-height
:
35px
;
min-width
:
9
00px
;
min-width
:
5
00px
;
/*background: #fff;*/
/*border-bottom: 1px solid #ddd;*/
...
...
frontend/src/components/canvas/custom-component/UserView.vue
浏览文件 @
5b86ad09
...
...
@@ -16,7 +16,8 @@
{{
$t
(
'chart.chart_error_tips'
)
}}
</div>
</div>
<chart-component
v-if=
"httpRequest.status &&chart.type && !chart.type.includes('table') && !chart.type.includes('text')"
:ref=
"element.propValue.id"
class=
"chart-class"
:chart=
"chart"
:track-menu=
"trackMenu"
@
onChartClick=
"chartClick"
/>
<chart-component
v-if=
"httpRequest.status &&chart.type && !chart.type.includes('table') && !chart.type.includes('text') && renderComponent() === 'echarts'"
:ref=
"element.propValue.id"
class=
"chart-class"
:chart=
"chart"
:track-menu=
"trackMenu"
@
onChartClick=
"chartClick"
/>
<chart-component-g2
v-if=
"httpRequest.status &&chart.type && !chart.type.includes('table') && !chart.type.includes('text') && renderComponent() === 'g2'"
:ref=
"element.propValue.id"
class=
"chart-class"
:chart=
"chart"
:track-menu=
"trackMenu"
@
onChartClick=
"chartClick"
/>
<!--
<chart-component
:ref=
"element.propValue.id"
class=
"chart-class"
:chart=
"chart"
:track-menu=
"trackMenu"
@
onChartClick=
"chartClick"
/>
-->
<table-normal
v-if=
"httpRequest.status &&chart.type && chart.type.includes('table')"
:ref=
"element.propValue.id"
:show-summary=
"chart.type === 'table-normal'"
:chart=
"chart"
class=
"table-class"
/>
<label-normal
v-if=
"httpRequest.status && chart.type && chart.type.includes('text')"
:ref=
"element.propValue.id"
:chart=
"chart"
class=
"table-class"
/>
...
...
@@ -43,9 +44,10 @@ import { deepCopy } from '@/components/canvas/utils/utils'
import
{
getToken
,
getLinkToken
}
from
'@/utils/auth'
import
DrillPath
from
'@/views/chart/view/DrillPath'
import
{
areaMapping
}
from
'@/api/map/map'
import
ChartComponentG2
from
'@/views/chart/components/ChartComponentG2'
export
default
{
name
:
'UserView'
,
components
:
{
ChartComponent
,
TableNormal
,
LabelNormal
,
DrillPath
},
components
:
{
ChartComponent
,
TableNormal
,
LabelNormal
,
DrillPath
,
ChartComponentG2
},
props
:
{
element
:
{
type
:
Object
,
...
...
@@ -119,7 +121,7 @@ export default {
trackMenu
()
{
const
trackMenuInfo
=
[]
let
linkageCount
=
0
this
.
chart
.
data
&&
this
.
chart
.
data
.
fields
&&
this
.
chart
.
data
.
f
ields
.
forEach
(
item
=>
{
this
.
chart
.
data
&&
this
.
chart
.
data
.
sourceFields
&&
this
.
chart
.
data
.
sourceF
ields
.
forEach
(
item
=>
{
const
sourceInfo
=
this
.
chart
.
id
+
'#'
+
item
.
id
if
(
this
.
nowPanelTrackInfo
[
sourceInfo
])
{
linkageCount
++
...
...
@@ -262,6 +264,7 @@ export default {
this
.
chart
.
drillFields
=
this
.
chart
.
drillFields
?
JSON
.
parse
(
this
.
chart
.
drillFields
)
:
[]
if
(
!
response
.
data
.
drill
)
{
this
.
drillClickDimensionList
.
splice
(
this
.
drillClickDimensionList
.
length
-
1
,
1
)
this
.
resetDrill
()
}
this
.
drillFilters
=
JSON
.
parse
(
JSON
.
stringify
(
response
.
data
.
drillFilters
))
this
.
drillFields
=
JSON
.
parse
(
JSON
.
stringify
(
response
.
data
.
drillFields
))
...
...
@@ -434,6 +437,14 @@ export default {
this
.
destroyTimeMachine
()
},
200
)
}
},
renderComponent
()
{
if
(
this
.
chart
.
type
===
'liquid'
)
{
return
'g2'
}
else
{
return
'echarts'
}
}
}
}
...
...
frontend/src/components/canvas/custom-component/component-list.js
浏览文件 @
5b86ad09
...
...
@@ -57,8 +57,11 @@ const list = [
fontWeight
:
400
,
lineHeight
:
''
,
letterSpacing
:
0
,
textAlign
:
'left'
,
color
:
'#000000'
textAlign
:
'center'
,
color
:
'#000000'
,
verticalAlign
:
'middle'
,
backgroundColor
:
'#ffffff'
,
borderRadius
:
0
}
},
{
...
...
frontend/src/icons/svg/liquid.svg
0 → 100644
浏览文件 @
5b86ad09
<svg
t=
"1631072907294"
class=
"icon"
viewBox=
"0 0 1024 1024"
version=
"1.1"
xmlns=
"http://www.w3.org/2000/svg"
p-id=
"3122"
width=
"200"
height=
"200"
><path
d=
"M512 51.2C257.504 51.2 51.2 257.504 51.2 512S257.504 972.8 512 972.8 972.8 766.496 972.8 512 766.496 51.2 512 51.2m0 42.624c230.592 0 418.176 187.584 418.176 418.176 0 230.592-187.584 418.176-418.176 418.176-230.592 0-418.176-187.584-418.176-418.176C93.824 281.408 281.408 93.824 512 93.824"
p-id=
"3123"
></path><path
d=
"M757.92 598.88c-56.704 0-113.856-13.6-164.352-39.296-37.408-19.04-70.016-46.016-100.224-74.848-29.536-28.16-58.944-52.8-98.944-64.992-17.472-5.312-69.76-20.448-129.472 1.024a190.624 190.624 0 0 0-75.872 50.304A187.264 187.264 0 0 0 153.6 528.96c10.88 190.304 168.32 341.44 361.536 341.44 175.328 0 321.568-124.32 355.264-289.504a362.048 362.048 0 0 1-112.48 17.984"
p-id=
"3124"
></path></svg>
frontend/src/lang/en.js
浏览文件 @
5b86ad09
...
...
@@ -130,6 +130,8 @@ export default {
re_login
:
'Login again'
},
commons
:
{
search
:
'Search'
,
folder
:
'Folder'
,
no_target_permission
:
'No permission'
,
success
:
'Success'
,
switch_lang
:
'Switch Language Success'
,
...
...
@@ -431,6 +433,11 @@ export default {
fixedHeader
:
'Fixed Header'
,
sidebarLogo
:
'Sidebar Logo'
},
sysParams
:
{
display
:
'Display Setting'
,
ldap
:
'LDAP Setting'
,
oidc
:
'OIDC Setting'
},
license
:
{
i18n_no_license_record
:
'No License Record'
,
i18n_license_is_empty
:
'License is empty.'
,
...
...
@@ -498,6 +505,47 @@ export default {
change_password
:
'Change Password'
,
search_by_name
:
'Search by name'
},
ldap
:
{
url
:
'LDAP url'
,
dn
:
'LDAP DN'
,
password
:
'Password'
,
ou
:
'OU'
,
filter
:
'filter'
,
mapping
:
'LDAP mapping'
,
open
:
'Enable LDAP Authentication'
,
input_url
:
'Please key LDAP url'
,
input_dn
:
'Please key DN'
,
input_password
:
'Please key password'
,
input_ou
:
'Please key OU'
,
input_filter
:
'Please key filter'
,
input_mapping
:
'Please key LDAP mapping'
,
input_username
:
'Please key username'
,
input_url_placeholder
:
'Please key url (like ldap://localhost:389)'
,
input_ou_placeholder
:
'Please key OU '
,
input_filter_placeholder
:
'Please key filter'
,
input_mapping_placeholder
:
'like:{"username":"uid","name":"sn","email":"mail"}'
,
test_connect
:
'Test connect'
,
edit
:
'Edit'
,
login_success
:
'Login success'
,
url_cannot_be_empty
:
'LDAP url can not be empty'
,
dn_cannot_be_empty
:
'LDAP DN can not be empty'
,
ou_cannot_be_empty
:
'LDAP OU can not be empty'
,
filter_cannot_be_empty
:
'LDAP filter can not be empty'
,
mapping_cannot_be_empty
:
'LDAP mapping can not be empty'
,
password_cannot_be_empty
:
'LDAP password can not be empty'
,
import_ldap
:
'Import LDAP User'
},
oidc
:
{
auth_endpoint
:
'Please key AuthEndpoint'
,
token_endpoint
:
'Please key TokenEndpoint'
,
userinfo_endpoint
:
'Please key UserinfoEndpoint'
,
logout_endpoint
:
'Please key logoutEndpoint'
,
clientId
:
'Please key ClientId'
,
secret
:
'Please key Secret'
,
scope
:
'Please key scope'
,
redirectUrl
:
'Please key redirectUrl'
,
open
:
'Enable OIDC Authentication'
},
role
:
{
menu_authorization
:
'Menu Authorization'
,
data_authorization
:
'Data Authorization'
,
...
...
@@ -862,7 +910,20 @@ export default {
yAxis_main
:
'Main Vertical Axis'
,
yAxis_ext
:
'Ext Vertical Axis'
,
total
:
'Total'
,
items
:
'Items'
items
:
'Items'
,
chart_liquid
:
'Liquid'
,
drag_block_progress
:
'Progress'
,
liquid_max
:
'End Value'
,
liquid_outline_border
:
'Border Width'
,
liquid_outline_distance
:
'Border Distance'
,
liquid_wave_length
:
'Wave Length'
,
liquid_wave_count
:
'Wave Count'
,
liquid_shape
:
'Shape'
,
liquid_shape_circle
:
'Circle'
,
liquid_shape_diamond
:
'Diamond'
,
liquid_shape_triangle
:
'Triangle'
,
liquid_shape_pin
:
'Pin'
,
liquid_shape_rect
:
'Rect'
},
dataset
:
{
sheet_warn
:
'There are multiple sheet pages, and the first one is extracted by default'
,
...
...
frontend/src/lang/tw.js
浏览文件 @
5b86ad09
差异被折叠。
点击展开。
frontend/src/lang/zh.js
浏览文件 @
5b86ad09
...
...
@@ -130,6 +130,8 @@ export default {
re_login
:
'重新登录'
},
commons
:
{
search
:
'搜索'
,
folder
:
'目录'
,
no_target_permission
:
'没有权限'
,
success
:
'成功'
,
switch_lang
:
'切换语言成功'
,
...
...
@@ -431,6 +433,11 @@ export default {
fixedHeader
:
'固定 Header'
,
sidebarLogo
:
'侧边栏 Logo'
},
sysParams
:
{
display
:
'显示设置'
,
ldap
:
'LDAP设置'
,
oidc
:
'OIDC设置'
},
license
:
{
i18n_no_license_record
:
'没有 License 记录'
,
i18n_license_is_empty
:
'License 为空'
,
...
...
@@ -530,6 +537,17 @@ export default {
mapping_cannot_be_empty
:
'LDAP 用户属性映射不能为空'
,
password_cannot_be_empty
:
'LDAP 密码不能为空'
},
oidc
:
{
auth_endpoint
:
'请输入AuthEndpoint'
,
token_endpoint
:
'请输入TokenEndpoint'
,
userinfo_endpoint
:
'请输入UserinfoEndpoint'
,
logout_endpoint
:
'请输入logoutEndpoint'
,
clientId
:
'请输入ClientId'
,
secret
:
'请输入Secret'
,
scope
:
'请输入scope'
,
redirectUrl
:
'请输入redirectUrl'
,
open
:
'启用OIDC认证'
},
role
:
{
menu_authorization
:
'菜单授权'
,
data_authorization
:
'数据授权'
,
...
...
@@ -893,7 +911,20 @@ export default {
yAxis_main
:
'主纵轴'
,
yAxis_ext
:
'副纵轴'
,
total
:
'共'
,
items
:
'条数据'
items
:
'条数据'
,
chart_liquid
:
'水波图'
,
drag_block_progress
:
'进度指示'
,
liquid_max
:
'目标值'
,
liquid_outline_border
:
'边框粗细'
,
liquid_outline_distance
:
'边框间隔'
,
liquid_wave_length
:
'水波长度'
,
liquid_wave_count
:
'水波数量'
,
liquid_shape
:
'形状'
,
liquid_shape_circle
:
'圆形'
,
liquid_shape_diamond
:
'菱形'
,
liquid_shape_triangle
:
'三角形'
,
liquid_shape_pin
:
'气球'
,
liquid_shape_rect
:
'矩形'
},
dataset
:
{
sheet_warn
:
'有多个 Sheet 页,默认抽取第一个'
,
...
...
frontend/src/settings.js
浏览文件 @
5b86ad09
...
...
@@ -3,6 +3,9 @@ module.exports = {
RefreshTokenKey
:
'refreshauthorization'
,
LinkTokenKey
:
'LINK-PWD-TOKEN'
,
title
:
'DataEase'
,
/* for sso */
IdTokenKey
:
'IdToken'
,
AccessTokenKey
:
'AccessToken'
,
/**
* @type {boolean} true | false
...
...
frontend/src/store/index.js
浏览文件 @
5b86ad09
...
...
@@ -79,6 +79,9 @@ const data = {
},
setCanvasStyle
(
state
,
style
)
{
if
(
style
)
{
style
[
'selfAdaption'
]
=
true
}
state
.
canvasStyleData
=
style
},
...
...
frontend/src/utils/auth.js
浏览文件 @
5b86ad09
...
...
@@ -3,8 +3,16 @@ import Config from '@/settings'
const
TokenKey
=
Config
.
TokenKey
const
IdTokenKey
=
Config
.
IdTokenKey
const
AccessTokenKey
=
Config
.
AccessTokenKey
const
linkTokenKey
=
Config
.
LinkTokenKey
export
function
getIdToken
()
{
return
Cookies
.
get
(
IdTokenKey
)
}
export
function
getToken
()
{
return
Cookies
.
get
(
TokenKey
)
}
...
...
@@ -14,6 +22,8 @@ export function setToken(token) {
}
export
function
removeToken
()
{
Cookies
.
remove
(
IdTokenKey
)
Cookies
.
remove
(
AccessTokenKey
)
return
Cookies
.
remove
(
TokenKey
)
}
...
...
frontend/src/utils/request.js
浏览文件 @
5b86ad09
...
...
@@ -2,7 +2,7 @@ import axios from 'axios'
// import { MessageBox, Message } from 'element-ui'
import
store
from
'@/store'
import
{
$alert
,
$error
}
from
'./message'
import
{
getToken
}
from
'@/utils/auth'
import
{
getToken
,
getIdToken
}
from
'@/utils/auth'
import
Config
from
'@/settings'
import
i18n
from
'@/lang'
import
{
tryShowLoading
,
tryHideLoading
}
from
'./loading'
...
...
@@ -23,6 +23,10 @@ const service = axios.create({
service
.
interceptors
.
request
.
use
(
config
=>
{
// do something before request is sent
const
idToken
=
getIdToken
()
if
(
idToken
)
{
config
.
headers
[
Config
.
IdTokenKey
]
=
idToken
}
if
(
store
.
getters
.
token
)
{
// let each request carry token
...
...
frontend/src/views/chart/chart/chart.js
浏览文件 @
5b86ad09
...
...
@@ -42,7 +42,14 @@ export const DEFAULT_SIZE = {
scatterSymbol
:
'circle'
,
scatterSymbolSize
:
20
,
treemapWidth
:
80
,
treemapHeight
:
80
treemapHeight
:
80
,
liquidMax
:
100
,
liquidSize
:
80
,
liquidOutlineBorder
:
4
,
liquidOutlineDistance
:
8
,
liquidWaveLength
:
128
,
liquidWaveCount
:
3
,
liquidShape
:
'circle'
}
export
const
DEFAULT_LABEL
=
{
show
:
false
,
...
...
frontend/src/views/chart/chart/liquid/liquid.js
0 → 100644
浏览文件 @
5b86ad09
import
{
Liquid
}
from
'@antv/g2plot'
import
{
digToHex
}
from
'@/views/chart/chart/util'
import
{
DEFAULT_SIZE
}
from
'@/views/chart/chart/chart'
export
function
baseLiquid
(
plot
,
container
,
chart
)
{
let
value
=
0
const
colors
=
[]
let
max
,
radius
,
outlineBorder
,
outlineDistance
,
waveLength
,
waveCount
,
bgColor
,
shape
,
labelContent
,
title
if
(
chart
.
data
)
{
if
(
chart
.
data
.
series
.
length
>
0
)
{
value
=
chart
.
data
.
series
[
0
].
data
[
0
].
value
}
}
let
customAttr
=
{}
if
(
chart
.
customAttr
)
{
customAttr
=
JSON
.
parse
(
chart
.
customAttr
)
// color
if
(
customAttr
.
color
)
{
const
c
=
JSON
.
parse
(
JSON
.
stringify
(
customAttr
.
color
))
const
alpha
=
digToHex
(
parseInt
(
c
.
alpha
))
c
.
colors
.
forEach
(
ele
=>
{
colors
.
push
(
ele
.
concat
(
alpha
))
})
}
// size
if
(
customAttr
.
size
)
{
const
size
=
JSON
.
parse
(
JSON
.
stringify
(
customAttr
.
size
))
max
=
size
.
liquidMax
?
size
.
liquidMax
:
DEFAULT_SIZE
.
liquidMax
radius
=
parseFloat
((
size
.
liquidSize
?
size
.
liquidSize
:
DEFAULT_SIZE
.
liquidSize
)
/
100
)
outlineBorder
=
parseInt
(
size
.
liquidOutlineBorder
?
size
.
liquidOutlineBorder
:
DEFAULT_SIZE
.
liquidOutlineBorder
)
outlineDistance
=
parseInt
((
size
.
liquidOutlineDistance
||
size
.
liquidOutlineDistance
===
0
)
?
size
.
liquidOutlineDistance
:
DEFAULT_SIZE
.
liquidOutlineDistance
)
waveLength
=
parseInt
(
size
.
liquidWaveLength
?
size
.
liquidWaveLength
:
DEFAULT_SIZE
.
liquidWaveLength
)
waveCount
=
parseInt
(
size
.
liquidWaveCount
?
size
.
liquidWaveCount
:
DEFAULT_SIZE
.
liquidWaveCount
)
shape
=
size
.
liquidShape
?
size
.
liquidShape
:
DEFAULT_SIZE
.
liquidShape
}
// label
if
(
customAttr
.
label
)
{
const
label
=
JSON
.
parse
(
JSON
.
stringify
(
customAttr
.
label
))
if
(
label
.
show
)
{
labelContent
=
{
style
:
({
percent
})
=>
({
fontSize
:
parseInt
(
label
.
fontSize
),
color
:
label
.
color
})
}
}
else
{
labelContent
=
false
}
}
}
let
customStyle
if
(
chart
.
customStyle
)
{
customStyle
=
JSON
.
parse
(
chart
.
customStyle
)
if
(
customStyle
.
background
)
{
bgColor
=
customStyle
.
background
.
color
.
concat
(
digToHex
(
parseInt
(
customStyle
.
background
.
alpha
)))
}
if
(
customStyle
.
text
)
{
const
t
=
JSON
.
parse
(
JSON
.
stringify
(
customStyle
.
text
))
if
(
t
.
show
)
{
title
=
{
formatter
:
()
=>
{
return
chart
.
title
},
style
:
({
percent
})
=>
({
fontSize
:
parseInt
(
t
.
fontSize
),
color
:
t
.
color
,
fontWeight
:
t
.
isBolder
?
'bold'
:
'normal'
,
fontStyle
:
t
.
isItalic
?
'italic'
:
'normal'
})
}
}
else
{
title
=
false
}
}
}
// 开始渲染
if
(
plot
)
{
plot
.
destroy
()
}
plot
=
new
Liquid
(
container
,
{
theme
:
{
styleSheet
:
{
brandColor
:
colors
[
0
],
paletteQualitative10
:
colors
,
backgroundColor
:
bgColor
}
},
percent
:
(
parseFloat
(
value
)
/
parseFloat
(
max
)),
radius
:
radius
,
shape
:
shape
,
outline
:
{
border
:
outlineBorder
,
distance
:
outlineDistance
},
wave
:
{
length
:
waveLength
,
count
:
waveCount
},
statistic
:
{
title
:
title
,
content
:
labelContent
}
})
plot
.
render
()
return
plot
}
frontend/src/views/chart/chart/util.js
浏览文件 @
5b86ad09
...
...
@@ -17,3 +17,12 @@ export function hexColorToRGBA(hex, alpha) {
return
'rgb(0,0,0)'
}
}
export
function
digToHex
(
dig
)
{
let
prefix
=
''
const
num
=
parseInt
(
dig
*
2.55
)
if
(
num
<
16
)
{
prefix
=
'0'
}
return
prefix
.
concat
(
num
.
toString
(
16
).
toUpperCase
())
}
frontend/src/views/chart/components/ChartComponentG2.vue
0 → 100644
浏览文件 @
5b86ad09
<
template
>
<div
style=
"display: flex;"
>
<view-track-bar
ref=
"viewTrack"
:track-menu=
"trackMenu"
class=
"track-bar"
:style=
"trackBarStyleTime"
@
trackClick=
"trackClick"
/>
<div
:id=
"chartId"
style=
"width: 100%;height: 100%;overflow: hidden;"
:style=
"
{ borderRadius: borderRadius}" />
</div>
</
template
>
<
script
>
import
{
baseLiquid
}
from
'@/views/chart/chart/liquid/liquid'
// import eventBus from '@/components/canvas/utils/eventBus'
import
{
uuid
}
from
'vue-uuid'
import
ViewTrackBar
from
'@/components/canvas/components/Editor/ViewTrackBar'
export
default
{
name
:
'ChartComponentG2'
,
components
:
{
ViewTrackBar
},
props
:
{
chart
:
{
type
:
Object
,
required
:
true
},
filter
:
{
type
:
Object
,
required
:
false
,
default
:
function
()
{
return
{}
}
},
trackMenu
:
{
type
:
Array
,
required
:
false
,
default
:
function
()
{
return
[
'drill'
]
}
}
},
data
()
{
return
{
myChart
:
null
,
chartId
:
uuid
.
v1
(),
showTrackBar
:
true
,
trackBarStyle
:
{
position
:
'absolute'
,
left
:
'0px'
,
top
:
'0px'
},
pointParam
:
null
,
dynamicAreaCode
:
null
,
borderRadius
:
'0px'
}
},
computed
:
{
trackBarStyleTime
()
{
return
this
.
trackBarStyle
}
},
watch
:
{
chart
:
{
handler
(
newVal
,
oldVla
)
{
this
.
preDraw
()
},
deep
:
true
},
resize
()
{
this
.
drawEcharts
()
}
},
mounted
()
{
this
.
preDraw
()
},
methods
:
{
preDraw
()
{
// 基于准备好的dom,初始化echarts实例
// 渲染echart等待dom加载完毕,渲染之前先尝试销毁具有相同id的echart 放置多次切换仪表板有重复id情况
new
Promise
((
resolve
)
=>
{
resolve
()
}).
then
(()
=>
{
// 此dom为echarts图标展示dom
// this.myChart = this.$echarts.getInstanceByDom(document.getElementById(this.chartId))
// if (!this.myChart) {
// this.myChart = this.$echarts.init(document.getElementById(this.chartId))
// }
this
.
drawEcharts
()
// this.myChart.off('click')
// this.myChart.on('click', function(param) {
// that.pointParam = param
// if (that.trackMenu.length
<
2
)
{
// 只有一个事件直接调用
// that.trackClick(that.trackMenu[0])
// } else { // 视图关联多个事件
// that.trackBarStyle.left = param.event.offsetX + 'px'
// that.trackBarStyle.top = (param.event.offsetY - 15) + 'px'
// that.$refs.viewTrack.trackButtonClick()
// }
// })
})
},
drawEcharts
()
{
const
chart
=
this
.
chart
// type
if
(
chart
.
type
===
'liquid'
)
{
this
.
myChart
=
baseLiquid
(
this
.
myChart
,
this
.
chartId
,
chart
)
}
this
.
setBackGroundBorder
()
// console.log(JSON.stringify(chart_option))
},
// myEcharts(option) {
// // 指定图表的配置项和数据
// const chart = this.myChart
// this.setBackGroundBorder()
// setTimeout(chart.setOption(option, true), 500)
// window.onresize = function() {
// chart.resize()
// }
// },
setBackGroundBorder
()
{
if
(
this
.
chart
.
customStyle
)
{
const
customStyle
=
JSON
.
parse
(
this
.
chart
.
customStyle
)
if
(
customStyle
.
background
)
{
this
.
borderRadius
=
(
customStyle
.
background
.
borderRadius
||
0
)
+
'px'
}
}
},
chartResize
()
{
// 指定图表的配置项和数据
// const chart = this.myChart
// chart.resize()
},
trackClick
(
trackAction
)
{
const
param
=
this
.
pointParam
if
(
!
param
||
!
param
.
data
||
!
param
.
data
.
dimensionList
)
{
// 地图提示没有关联字段 其他没有维度信息的 直接返回
if
(
this
.
chart
.
type
===
'map'
)
{
this
.
$warning
(
this
.
$t
(
'panel.no_drill_field'
))
}
return
}
const
linkageParam
=
{
viewId
:
this
.
chart
.
id
,
dimensionList
:
this
.
pointParam
.
data
.
dimensionList
,
quotaList
:
this
.
pointParam
.
data
.
quotaList
}
switch
(
trackAction
)
{
case
'drill'
:
this
.
$emit
(
'onChartClick'
,
this
.
pointParam
)
break
case
'linkage'
:
this
.
$store
.
commit
(
'addViewTrackFilter'
,
linkageParam
)
break
default
:
break
}
}
}
}
</
script
>
<
style
scoped
>
</
style
>
frontend/src/views/chart/components/component-style/TitleSelector.vue
浏览文件 @
5b86ad09
...
...
@@ -24,14 +24,14 @@
<el-form-item
:label=
"$t('chart.text_color')"
class=
"form-item"
>
<el-color-picker
v-model=
"titleForm.color"
class=
"color-picker-style"
@
change=
"changeTitleStyle"
/>
</el-form-item>
<el-form-item
:label=
"$t('chart.text_h_position')"
class=
"form-item"
>
<el-form-item
v-show=
"chart.type && chart.type !== 'liquid'"
:label=
"$t('chart.text_h_position')"
class=
"form-item"
>
<el-radio-group
v-model=
"titleForm.hPosition"
size=
"mini"
@
change=
"changeTitleStyle"
>
<el-radio-button
label=
"left"
>
{{
$t
(
'chart.text_pos_left'
)
}}
</el-radio-button>
<el-radio-button
label=
"center"
>
{{
$t
(
'chart.text_pos_center'
)
}}
</el-radio-button>
<el-radio-button
label=
"right"
>
{{
$t
(
'chart.text_pos_right'
)
}}
</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item
v-show=
"chart.type && !chart.type.includes('table')"
:label=
"$t('chart.text_v_position')"
class=
"form-item"
>
<el-form-item
v-show=
"chart.type && !chart.type.includes('table')
&& chart.type !== 'liquid'
"
:label=
"$t('chart.text_v_position')"
class=
"form-item"
>
<el-radio-group
v-model=
"titleForm.vPosition"
size=
"mini"
@
change=
"changeTitleStyle"
>
<el-radio-button
label=
"top"
>
{{
$t
(
'chart.text_pos_top'
)
}}
</el-radio-button>
<el-radio-button
label=
"center"
>
{{
$t
(
'chart.text_pos_center'
)
}}
</el-radio-button>
...
...
frontend/src/views/chart/components/drag-item/ChartDragItem.vue
浏览文件 @
5b86ad09
...
...
@@ -49,7 +49,45 @@
</el-dropdown-menu>
</el-dropdown>
</el-dropdown-item>
<el-dropdown-item
v-show=
"conf && conf.includes('sort')"
>
<el-dropdown-item
v-show=
"item.deType === 1"
>
<el-dropdown
placement=
"right-start"
size=
"mini"
style=
"width: 100%"
@
command=
"dateStyle"
>
<span
class=
"el-dropdown-link inner-dropdown-menu"
>
<span>
<i
class=
"el-icon-c-scale-to-original"
/>
<span>
{{
$t
(
'chart.dateStyle'
)
}}
</span>
<span
class=
"summary-span-item"
>
(
{{
$t
(
'chart.'
+
item
.
dateStyle
)
}}
)
</span>
</span>
<i
class=
"el-icon-arrow-right el-icon--right"
/>
</span>
<el-dropdown-menu
slot=
"dropdown"
>
<el-dropdown-item
:command=
"beforeDateStyle('y')"
>
{{
$t
(
'chart.y'
)
}}
</el-dropdown-item>
<el-dropdown-item
:command=
"beforeDateStyle('y_M')"
>
{{
$t
(
'chart.y_M'
)
}}
</el-dropdown-item>
<el-dropdown-item
:command=
"beforeDateStyle('y_M_d')"
>
{{
$t
(
'chart.y_M_d'
)
}}
</el-dropdown-item>
<el-dropdown-item
:command=
"beforeDateStyle('H_m_s')"
>
{{
$t
(
'chart.H_m_s'
)
}}
</el-dropdown-item>
<el-dropdown-item
:command=
"beforeDateStyle('y_M_d_H_m')"
>
{{
$t
(
'chart.y_M_d_H_m'
)
}}
</el-dropdown-item>
<el-dropdown-item
:command=
"beforeDateStyle('y_M_d_H_m_s')"
>
{{
$t
(
'chart.y_M_d_H_m_s'
)
}}
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</el-dropdown-item>
<el-dropdown-item
v-show=
"item.deType === 1"
>
<el-dropdown
placement=
"right-start"
size=
"mini"
style=
"width: 100%"
@
command=
"datePattern"
>
<span
class=
"el-dropdown-link inner-dropdown-menu"
>
<span>
<i
class=
"el-icon-timer"
/>
<span>
{{
$t
(
'chart.datePattern'
)
}}
</span>
<span
class=
"summary-span-item"
>
(
{{
$t
(
'chart.'
+
item
.
datePattern
)
}}
)
</span>
</span>
<i
class=
"el-icon-arrow-right el-icon--right"
/>
</span>
<el-dropdown-menu
slot=
"dropdown"
>
<el-dropdown-item
:command=
"beforeDatePattern('date_sub')"
>
{{
$t
(
'chart.date_sub'
)
}}
(1990-01-01)
</el-dropdown-item>
<el-dropdown-item
:command=
"beforeDatePattern('date_split')"
>
{{
$t
(
'chart.date_split'
)
}}
(1990/01/01)
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</el-dropdown-item>
<el-dropdown-item
v-show=
"conf && conf.includes('sort')"
:divided=
"item.deType === 1"
>
<el-dropdown
placement=
"right-start"
size=
"mini"
style=
"width: 100%"
@
command=
"sort"
>
<span
class=
"el-dropdown-link inner-dropdown-menu"
>
<span>
...
...
@@ -143,6 +181,27 @@ export default {
removeItem
()
{
this
.
item
.
index
=
this
.
index
this
.
$emit
(
'onItemRemove'
,
this
.
item
)
},
dateStyle
(
param
)
{
// console.log(param)
this
.
item
.
dateStyle
=
param
.
type
this
.
$emit
(
'onItemChange'
,
this
.
item
)
},
beforeDateStyle
(
type
)
{
return
{
type
:
type
}
},
datePattern
(
param
)
{
// console.log(param)
this
.
item
.
datePattern
=
param
.
type
this
.
$emit
(
'onItemChange'
,
this
.
item
)
},
beforeDatePattern
(
type
)
{
return
{
type
:
type
}
}
}
}
...
...
frontend/src/views/chart/components/shape-attr/LabelSelector.vue
浏览文件 @
5b86ad09
...
...
@@ -17,12 +17,12 @@
<el-form-item
:label=
"$t('chart.text_color')"
class=
"form-item"
>
<el-color-picker
v-model=
"labelForm.color"
class=
"color-picker-style"
@
change=
"changeLabelAttr"
/>
</el-form-item>
<el-form-item
:label=
"$t('chart.label_position')"
class=
"form-item"
>
<el-form-item
v-show=
"chart.type && chart.type !== 'liquid'"
:label=
"$t('chart.label_position')"
class=
"form-item"
>
<el-select
v-model=
"labelForm.position"
:placeholder=
"$t('chart.label_position')"
@
change=
"changeLabelAttr"
>
<el-option
v-for=
"option in labelPosition"
:key=
"option.value"
:label=
"option.name"
:value=
"option.value"
/>
</el-select>
</el-form-item>
<el-form-item
class=
"form-item"
>
<el-form-item
v-show=
"chart.type && chart.type !== 'liquid'"
class=
"form-item"
>
<span
slot=
"label"
>
<span
class=
"span-box"
>
<span>
{{
$t
(
'chart.content_formatter'
)
}}
</span>
...
...
@@ -126,7 +126,7 @@ export default {
},
init
()
{
const
arr
=
[]
for
(
let
i
=
10
;
i
<=
2
0
;
i
=
i
+
2
)
{
for
(
let
i
=
10
;
i
<=
4
0
;
i
=
i
+
2
)
{
arr
.
push
({
name
:
i
+
''
,
value
:
i
+
''
...
...
frontend/src/views/chart/components/shape-attr/SizeSelector.vue
浏览文件 @
5b86ad09
...
...
@@ -165,6 +165,7 @@
</el-form>
<el-form
v-show=
"chart.type && chart.type === 'chart-mix'"
ref=
"sizeFormBar"
:disabled=
"param && !hasDataPermission('manage',param.privileges)"
:model=
"sizeForm"
label-width=
"80px"
size=
"mini"
>
<el-divider
content-position=
"center"
class=
"divider-style"
>
{{
$t
(
'chart.chart_bar'
)
}}
</el-divider>
<el-form-item
:label=
"$t('chart.adapt')"
class=
"form-item"
>
<el-checkbox
v-model=
"sizeForm.barDefault"
@
change=
"changeBarSizeCase"
>
{{
$t
(
'chart.adapt'
)
}}
</el-checkbox>
</el-form-item>
...
...
@@ -174,7 +175,7 @@
<el-form-item
:label=
"$t('chart.bar_gap')"
class=
"form-item form-item-slider"
>
<el-slider
v-model=
"sizeForm.barGap"
:disabled=
"sizeForm.barDefault"
show-input
:show-input-controls=
"false"
input-size=
"mini"
:min=
"0"
:max=
"5"
:step=
"0.1"
@
change=
"changeBarSizeCase"
/>
</el-form-item>
<el-divider
/
>
<el-divider
content-position=
"center"
class=
"divider-style"
>
{{
$t
(
'chart.chart_line'
)
}}
</el-divider
>
<el-form-item
:label=
"$t('chart.line_width')"
class=
"form-item form-item-slider"
>
<el-slider
v-model=
"sizeForm.lineWidth"
show-input
:show-input-controls=
"false"
input-size=
"mini"
:min=
"0"
:max=
"10"
@
change=
"changeBarSizeCase"
/>
</el-form-item>
...
...
@@ -203,7 +204,7 @@
<el-form-item
:label=
"$t('chart.line_area')"
class=
"form-item"
>
<el-checkbox
v-model=
"sizeForm.lineArea"
@
change=
"changeBarSizeCase"
>
{{
$t
(
'chart.show'
)
}}
</el-checkbox>
</el-form-item>
<el-divider
/
>
<el-divider
content-position=
"center"
class=
"divider-style"
>
{{
$t
(
'chart.chart_scatter'
)
}}
</el-divider
>
<el-form-item
:label=
"$t('chart.bubble_symbol')"
class=
"form-item"
>
<el-select
v-model=
"sizeForm.scatterSymbol"
:placeholder=
"$t('chart.line_symbol')"
@
change=
"changeBarSizeCase"
>
<el-option
...
...
@@ -218,6 +219,37 @@
<el-slider
v-model=
"sizeForm.scatterSymbolSize"
show-input
:show-input-controls=
"false"
input-size=
"mini"
:min=
"1"
:max=
"40"
@
change=
"changeBarSizeCase"
/>
</el-form-item>
</el-form>
<el-form
v-show=
"chart.type && chart.type === 'liquid'"
ref=
"sizeFormLine"
:disabled=
"param && !hasDataPermission('manage',param.privileges)"
:model=
"sizeForm"
label-width=
"80px"
size=
"mini"
>
<el-form-item
:label=
"$t('chart.liquid_shape')"
class=
"form-item"
>
<el-select
v-model=
"sizeForm.liquidShape"
:placeholder=
"$t('chart.liquid_shape')"
@
change=
"changeBarSizeCase"
>
<el-option
v-for=
"item in liquidShapeOptions"
:key=
"item.value"
:label=
"item.name"
:value=
"item.value"
/>
</el-select>
</el-form-item>
<el-form-item
:label=
"$t('chart.liquid_max')"
class=
"form-item form-item-slider"
>
<el-input-number
v-model=
"sizeForm.liquidMax"
:min=
"1"
size=
"mini"
@
change=
"changeBarSizeCase"
/>
</el-form-item>
<el-form-item
:label=
"$t('chart.radar_size')"
class=
"form-item form-item-slider"
>
<el-slider
v-model=
"sizeForm.liquidSize"
show-input
:show-input-controls=
"false"
input-size=
"mini"
:min=
"1"
:max=
"100"
@
change=
"changeBarSizeCase"
/>
</el-form-item>
<el-form-item
:label=
"$t('chart.liquid_outline_border')"
class=
"form-item form-item-slider"
>
<el-slider
v-model=
"sizeForm.liquidOutlineBorder"
show-input
:show-input-controls=
"false"
input-size=
"mini"
:min=
"1"
:max=
"20"
@
change=
"changeBarSizeCase"
/>
</el-form-item>
<el-form-item
:label=
"$t('chart.liquid_outline_distance')"
class=
"form-item form-item-slider"
>
<el-slider
v-model=
"sizeForm.liquidOutlineDistance"
show-input
:show-input-controls=
"false"
input-size=
"mini"
:min=
"0"
:max=
"20"
@
change=
"changeBarSizeCase"
/>
</el-form-item>
<el-form-item
:label=
"$t('chart.liquid_wave_length')"
class=
"form-item form-item-slider"
>
<el-slider
v-model=
"sizeForm.liquidWaveLength"
show-input
:show-input-controls=
"false"
input-size=
"mini"
:min=
"10"
:max=
"500"
@
change=
"changeBarSizeCase"
/>
</el-form-item>
<el-form-item
:label=
"$t('chart.liquid_wave_count')"
class=
"form-item form-item-slider"
>
<el-slider
v-model=
"sizeForm.liquidWaveCount"
show-input
:show-input-controls=
"false"
input-size=
"mini"
:min=
"2"
:max=
"10"
@
change=
"changeBarSizeCase"
/>
</el-form-item>
</el-form>
</el-col>
</div>
</
template
>
...
...
@@ -250,6 +282,13 @@ export default {
{
name
:
this
.
$t
(
'chart.line_symbol_pin'
),
value
:
'pin'
},
{
name
:
this
.
$t
(
'chart.line_symbol_arrow'
),
value
:
'arrow'
}
],
liquidShapeOptions
:
[
{
name
:
this
.
$t
(
'chart.liquid_shape_circle'
),
value
:
'circle'
},
{
name
:
this
.
$t
(
'chart.liquid_shape_diamond'
),
value
:
'diamond'
},
{
name
:
this
.
$t
(
'chart.liquid_shape_triangle'
),
value
:
'triangle'
},
{
name
:
this
.
$t
(
'chart.liquid_shape_pin'
),
value
:
'pin'
},
{
name
:
this
.
$t
(
'chart.liquid_shape_rect'
),
value
:
'rect'
}
],
fontSize
:
[]
}
},
...
...
@@ -279,6 +318,14 @@ export default {
this
.
sizeForm
.
treemapWidth
=
this
.
sizeForm
.
treemapWidth
?
this
.
sizeForm
.
treemapWidth
:
80
this
.
sizeForm
.
treemapHeight
=
this
.
sizeForm
.
treemapHeight
?
this
.
sizeForm
.
treemapHeight
:
80
this
.
sizeForm
.
radarSize
=
this
.
sizeForm
.
radarSize
?
this
.
sizeForm
.
radarSize
:
80
this
.
sizeForm
.
liquidShape
=
this
.
sizeForm
.
liquidShape
?
this
.
sizeForm
.
liquidShape
:
DEFAULT_SIZE
.
liquidShape
this
.
sizeForm
.
liquidMax
=
this
.
sizeForm
.
liquidMax
?
this
.
sizeForm
.
liquidMax
:
DEFAULT_SIZE
.
liquidMax
this
.
sizeForm
.
liquidSize
=
this
.
sizeForm
.
liquidSize
?
this
.
sizeForm
.
liquidSize
:
DEFAULT_SIZE
.
liquidSize
this
.
sizeForm
.
liquidOutlineBorder
=
this
.
sizeForm
.
liquidOutlineBorder
?
this
.
sizeForm
.
liquidOutlineBorder
:
DEFAULT_SIZE
.
liquidOutlineBorder
this
.
sizeForm
.
liquidOutlineDistance
=
(
this
.
sizeForm
.
liquidOutlineDistance
||
this
.
sizeForm
.
liquidOutlineDistance
===
0
)
?
this
.
sizeForm
.
liquidOutlineDistance
:
DEFAULT_SIZE
.
liquidOutlineDistance
this
.
sizeForm
.
liquidWaveLength
=
this
.
sizeForm
.
liquidWaveLength
?
this
.
sizeForm
.
liquidWaveLength
:
DEFAULT_SIZE
.
liquidWaveLength
this
.
sizeForm
.
liquidWaveCount
=
this
.
sizeForm
.
liquidWaveCount
?
this
.
sizeForm
.
liquidWaveCount
:
DEFAULT_SIZE
.
liquidWaveCount
}
}
},
...
...
@@ -326,4 +373,10 @@ export default {
.el-divider--horizontal
{
margin
:
10px
0
}
.divider-style
>>>
.el-divider__text
{
color
:
#606266
;
font-size
:
12px
;
font-weight
:
400
;
padding
:
0
10px
;
}
</
style
>
frontend/src/views/chart/components/table/TableNormal.vue
浏览文件 @
5b86ad09
...
...
@@ -33,7 +33,7 @@
<el-row
v-show=
"chart.type === 'table-info'"
class=
"table-page"
>
<span
class=
"total-style"
>
{{ $t('chart.total') }}
<span>
{{
chart.data.tableRow.length
}}
</span>
<span>
{{
(chart.data
&&
chart.data.tableRow)?chart.data.tableRow.length:0
}}
</span>
{{ $t('chart.items') }}
</span>
<el-pagination
...
...
frontend/src/views/chart/view/ChartEdit.vue
浏览文件 @
5b86ad09
差异被折叠。
点击展开。
frontend/src/views/login/index.vue
浏览文件 @
5b86ad09
...
...
@@ -15,11 +15,11 @@
{{
$t
(
'login.welcome'
)
+
(
uiInfo
&&
uiInfo
[
'ui.title'
]
&&
uiInfo
[
'ui.title'
].
paramValue
||
' DataEase'
)
}}
</div>
<div
class=
"login-form"
>
<el-form-item>
<el-radio-group
v-
model=
"loginForm.l
oginType"
>
<el-radio
v-if=
"openLdap"
:label=
"0"
size=
"mini"
>
普通登录
</el-radio>
<el-radio
v-if=
"
openLdap
"
:label=
"1"
size=
"mini"
>
LDAP
</el-radio>
<el-form-item
v-if=
"loginTypes.length > 1"
>
<el-radio-group
v-
if=
"loginTypes.length > 1"
v-model=
"loginForm.loginType"
@
change=
"changeL
oginType"
>
<el-radio
:label=
"0"
size=
"mini"
>
普通登录
</el-radio>
<el-radio
v-if=
"
loginTypes.includes(1)
"
:label=
"1"
size=
"mini"
>
LDAP
</el-radio>
<el-radio
v-if=
"loginTypes.includes(2)"
:label=
"2"
size=
"mini"
>
OIDC
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
prop=
"username"
>
...
...
@@ -56,41 +56,20 @@
</el-col>
</el-row>
</div>
<plugin-com
v-if=
"loginTypes.includes(2) && loginForm.loginType === 2"
ref=
"SSOComponent"
component-name=
"SSOComponent"
/>
</div>
</
template
>
<
script
>
import
{
encrypt
}
from
'@/utils/rsaEncrypt'
import
{
ldapStatus
}
from
'@/api/user'
import
{
ldapStatus
,
oidcStatus
}
from
'@/api/user'
import
{
getSysUI
}
from
'@/utils/auth'
import
PluginCom
from
'@/views/system/plugin/PluginCom'
export
default
{
name
:
'Login'
,
components
:
{
PluginCom
},
data
()
{
// const validateUsername = (rule, value, callback) => {
// const userName = value.trim()
// validateUserName({ userName: userName }).then(res => {
// if (res.data) {
// callback()
// } else {
// callback(this.$t('login.username_error'))
// }
// }).catch(() => {
// callback(this.$t('login.username_error'))
// })
// // if (!validUsername(value)) {
// // callback(new Error('Please enter the correct user name'))
// // } else {
// // callback()
// // }
// }
// const validatePassword = (rule, value, callback) => {
// if (value.length
<
8
)
{
// callback(this.$t('login.password_error'))
// } else {
// callback()
// }
// }
return
{
loginForm
:
{
loginType
:
0
,
...
...
@@ -108,7 +87,7 @@ export default {
loginImageUrl
:
null
,
loginLogoUrl
:
null
,
axiosFinished
:
false
,
openLdap
:
true
loginTypes
:
[
0
]
}
},
computed
:
{
...
...
@@ -126,7 +105,15 @@ export default {
},
beforeCreate
()
{
ldapStatus
().
then
(
res
=>
{
this
.
openLdap
=
res
.
success
&&
res
.
data
if
(
res
.
success
&&
res
.
data
)
{
this
.
loginTypes
.
push
(
1
)
}
})
oidcStatus
().
then
(
res
=>
{
if
(
res
.
success
&&
res
.
data
)
{
this
.
loginTypes
.
push
(
2
)
}
})
},
created
()
{
...
...
@@ -169,6 +156,12 @@ export default {
return
false
}
})
},
changeLoginType
(
val
)
{
if
(
val
!==
2
)
return
this
.
$nextTick
(()
=>
{
})
}
}
}
...
...
frontend/src/views/panel/edit/index.vue
浏览文件 @
5b86ad09
...
...
@@ -96,7 +96,6 @@
<div
id=
"canvasInfo"
:class=
"
{'style-hidden':canvasStyleData.selfAdaption}"
class=
"content this_canvas"
@
drop=
"handleDrop"
@
dragover=
"handleDragOver"
...
...
@@ -839,7 +838,7 @@ export default {
}
}
.style-hidden
{
overflow
:
hidden
;
overflow
-x
:
hidden
;
}
</
style
>
frontend/src/views/panel/list/PanelList.vue
浏览文件 @
5b86ad09
<
template
xmlns:el-col=
"http://www.w3.org/1999/html"
>
<el-col
style=
"padding: 0 5px 0 5px;"
>
<el-col>
<el-row
style=
"margin-bottom: 10px"
>
<el-col
:span=
"16"
>
<el-input
v-model=
"filterText"
size=
"mini"
:placeholder=
"$t('commons.search')"
prefix-icon=
"el-icon-search"
clearable
/>
</el-col>
<el-col
:span=
"8"
>
<el-dropdown>
<el-button
size=
"mini"
type=
"primary"
>
{{
searchMap
[
searchType
]
}}
<i
class=
"el-icon-arrow-down el-icon--right"
/>
</el-button>
<el-dropdown-menu
slot=
"dropdown"
>
<el-dropdown-item
@
click
.
native=
"searchTypeClick('all')"
>
全部
</el-dropdown-item>
<el-dropdown-item
@
click
.
native=
"searchTypeClick('folder')"
>
目录
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<!--
<el-select-->
<!-- v-model="searchType"-->
<!-- default-first-option-->
<!-- size="mini"-->
<!-- >-->
<!--
<el-option-->
<!-- v-for="item in searchTypeList"-->
<!-- :key="item.value"-->
<!-- :label="item.label"-->
<!-- :value="item.value"-->
<!-- />-->
<!--
</el-select>
-->
</el-col>
</el-row>
<el-row>
<span
class=
"header-title"
>
{{
$t
(
'panel.default_panel'
)
}}
</span>
<div
class=
"block"
>
...
...
@@ -11,6 +46,7 @@
node-key=
"id"
:highlight-current=
"activeTree==='system'"
:expand-on-click-node=
"true"
:filter-node-method=
"filterNode"
@
node-click=
"nodeClick"
>
<span
slot-scope=
"
{ node, data }" class="custom-tree-node father">
...
...
@@ -59,6 +95,7 @@
node-key=
"id"
:highlight-current=
"activeTree==='self'"
:expand-on-click-node=
"true"
:filter-node-method=
"filterNode"
@
node-click=
"nodeClick"
>
<span
slot-scope=
"
{ node, data }" class="custom-tree-node-list father">
...
...
@@ -294,7 +331,14 @@ export default {
moveDialogTitle
:
''
,
moveInfo
:
{},
tGroup
:
{},
tGroupData
:
[]
// 所有目录
tGroupData
:
[],
// 所有目录
searchPids
:
[],
// 查询命中的pid
filterText
:
''
,
searchType
:
'all'
,
searchMap
:
{
all
:
this
.
$t
(
'commons.all'
),
folder
:
this
.
$t
(
'commons.folder'
)
}
}
},
computed
:
{
...
...
@@ -311,6 +355,16 @@ export default {
if
(
newVal
===
'PanelMain'
&&
this
.
lastActiveNode
&&
this
.
lastActiveNodeData
)
{
this
.
activeNodeAndClickOnly
(
this
.
lastActiveNodeData
)
}
},
filterText
(
val
)
{
this
.
searchPids
=
[]
this
.
$refs
.
default_panel_tree
.
filter
(
val
)
this
.
$refs
.
panel_list_tree
.
filter
(
val
)
},
searchType
(
val
)
{
this
.
searchPids
=
[]
this
.
$refs
.
default_panel_tree
.
filter
(
this
.
filterText
)
this
.
$refs
.
panel_list_tree
.
filter
(
this
.
filterText
)
}
},
mounted
()
{
...
...
@@ -710,6 +764,27 @@ export default {
targetGroup
(
val
)
{
this
.
tGroup
=
val
this
.
groupMoveConfirmDisabled
=
false
},
filterNode
(
value
,
data
)
{
if
(
!
value
)
return
true
if
(
this
.
searchType
===
'folder'
)
{
if
(
data
.
nodeType
===
'folder'
&&
data
.
label
.
indexOf
(
value
)
!==
-
1
)
{
this
.
searchPids
.
push
(
data
.
id
)
return
true
}
if
(
this
.
searchPids
.
indexOf
(
data
.
pid
)
!==
-
1
)
{
if
(
data
.
nodeType
===
'folder'
)
{
this
.
searchPids
.
push
(
data
.
id
)
}
return
true
}
}
else
{
return
data
.
label
.
indexOf
(
value
)
!==
-
1
}
return
false
},
searchTypeClick
(
searchTypeInfo
)
{
this
.
searchType
=
searchTypeInfo
}
}
}
...
...
frontend/src/views/panel/list/PanelViewShow.vue
浏览文件 @
5b86ad09
...
...
@@ -56,7 +56,7 @@
<el-row
class=
"panel-design-preview"
>
<div
id=
"imageWrapper"
ref=
"imageWrapper"
style=
"width: 100%;height: 100%"
>
<fullscreen
style=
"height: 100%;background: #f7f8fa;overflow-y: auto"
:fullscreen
.
sync=
"fullscreen"
>
<Preview
v-if=
"showMain"
:in-screen=
"!fullscreen"
:show-type=
"
canvasStyleData.selfAdaption?'full':
'width'"
/>
<Preview
v-if=
"showMain"
:in-screen=
"!fullscreen"
:show-type=
"'width'"
/>
</fullscreen>
</div>
</el-row>
...
...
frontend/src/views/system/plugin/PluginCom.vue
0 → 100644
浏览文件 @
5b86ad09
<
template
>
<div>
<async-component
v-if=
"showAsync"
:url=
"url"
@
execute-axios=
"executeAxios"
@
on-add-languanges=
"addLanguages"
@
plugin-call-back=
"pluginCallBack"
/>
<div
v-else
>
<h1>
未知组件无法展示
</h1>
</div>
</div>
</
template
>
<
script
>
import
AsyncComponent
from
'@/components/AsyncComponent'
import
i18n
from
'@/lang'
import
bus
from
'@/utils/bus'
import
{
execute
}
from
'@/api/system/dynamic'
export
default
{
name
:
'PluginCom'
,
components
:
{
AsyncComponent
},
props
:
{
componentName
:
{
type
:
String
,
default
:
null
}
},
data
()
{
return
{
showAsync
:
false
,
baseUrl
:
'/api/pluginCommon/component/'
,
url
:
null
}
},
created
()
{
if
(
this
.
componentName
)
{
this
.
showAsync
=
true
this
.
url
=
this
.
baseUrl
+
this
.
componentName
}
else
{
this
.
showAsync
=
false
}
},
methods
:
{
// hasLicense
executeAxios
(
options
)
{
execute
(
options
).
then
(
res
=>
{
if
(
options
.
callBack
)
{
options
.
callBack
(
res
)
}
}).
catch
(
e
=>
{
if
(
options
.
callBack
)
{
options
.
callBack
(
e
)
}
})
},
addLanguages
(
options
)
{
for
(
const
key
in
i18n
.
messages
)
{
if
(
Object
.
hasOwnProperty
.
call
(
i18n
.
messages
,
key
))
{
const
element
=
options
[
key
]
i18n
.
mergeLocaleMessage
(
key
,
element
)
}
}
},
pluginCallBack
(
param
)
{
const
{
eventName
,
eventParam
}
=
param
bus
.
$emit
(
eventName
,
eventParam
)
}
}
}
</
script
>
frontend/src/views/system/user/index.vue
浏览文件 @
5b86ad09
...
...
@@ -22,7 +22,7 @@
<!-- <el-table-column prop="gender" :label="$t('commons.gender')" width="60" /> -->
<el-table-column
prop=
"from"
:label=
"$t('user.source')"
width=
"80"
>
<
template
slot-scope=
"scope"
>
<div>
{{
scope
.
row
.
from
===
0
?
'LOCAL'
:
'LDAP
'
}}
</div>
<div>
{{
scope
.
row
.
from
===
0
?
'LOCAL'
:
scope
.
row
.
from
===
1
?
'LDAP'
:
'OIDC
'
}}
</div>
</
template
>
</el-table-column>
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论