Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
D
dataease
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
njgzx
dataease
Commits
544ea07e
提交
544ea07e
authored
5月 23, 2022
作者:
wangjiahao
浏览文件
操作
浏览文件
下载
差异文件
Merge remote-tracking branch 'origin/dev' into dev
# Conflicts: # frontend/src/views/chart/chart/util.js # frontend/src/views/chart/view/ChartEdit.vue # frontend/src/views/chart/view/ChartStyle.vue
上级
9041866e
3889eff0
全部展开
隐藏空白字符变更
内嵌
并排
正在显示
33 个修改的文件
包含
1234 行增加
和
78 行删除
+1234
-78
DeLogAnnotationHandler.java
...ain/java/io/dataease/auth/aop/DeLogAnnotationHandler.java
+1
-0
SysLogConstants.java
...n/java/io/dataease/commons/constants/SysLogConstants.java
+5
-2
DriverMgmController.java
...o/dataease/controller/datasource/DriverMgmController.java
+126
-0
DriverDTO.java
backend/src/main/java/io/dataease/dto/DriverDTO.java
+9
-0
ExtSysLogMapper.xml
backend/src/main/java/io/dataease/ext/ExtSysLogMapper.xml
+22
-0
ProviderFactory.java
...d/src/main/java/io/dataease/provider/ProviderFactory.java
+1
-2
JdbcProvider.java
...in/java/io/dataease/provider/datasource/JdbcProvider.java
+0
-0
ChartViewService.java
...main/java/io/dataease/service/chart/ChartViewService.java
+0
-0
DataSetTableService.java
...java/io/dataease/service/dataset/DataSetTableService.java
+1
-1
DatasourceService.java
...ava/io/dataease/service/datasource/DatasourceService.java
+9
-2
DriverService.java
...in/java/io/dataease/service/datasource/DriverService.java
+176
-0
V35__1.11.sql
backend/src/main/resources/db/migration/V35__1.11.sql
+21
-0
datasource.js
frontend/src/api/system/datasource.js
+57
-0
en.js
frontend/src/lang/en.js
+15
-0
tw.js
frontend/src/lang/tw.js
+15
-0
zh.js
frontend/src/lang/zh.js
+15
-0
bar_antv.js
frontend/src/views/chart/chart/bar/bar_antv.js
+5
-0
funnel_antv.js
frontend/src/views/chart/chart/funnel/funnel_antv.js
+3
-0
line_antv.js
frontend/src/views/chart/chart/line/line_antv.js
+5
-0
pie_antv.js
frontend/src/views/chart/chart/pie/pie_antv.js
+5
-0
radar_antv.js
frontend/src/views/chart/chart/radar/radar_antv.js
+4
-0
scatter_antv.js
frontend/src/views/chart/chart/scatter/scatter_antv.js
+3
-0
util.js
frontend/src/views/chart/chart/util.js
+121
-0
ColorSelectorExt.vue
...rc/views/chart/components/shape-attr/ColorSelectorExt.vue
+0
-0
Group.vue
frontend/src/views/chart/group/Group.vue
+1
-0
ChartEdit.vue
frontend/src/views/chart/view/ChartEdit.vue
+10
-0
ChartStyle.vue
frontend/src/views/chart/view/ChartStyle.vue
+27
-3
DriverForm.vue
frontend/src/views/system/datasource/DriverForm.vue
+294
-0
DsConfiguration.vue
frontend/src/views/system/datasource/DsConfiguration.vue
+73
-25
DsForm.vue
frontend/src/views/system/datasource/DsForm.vue
+37
-5
DsMain.vue
frontend/src/views/system/datasource/DsMain.vue
+8
-1
DsTree.vue
frontend/src/views/system/datasource/DsTree.vue
+165
-36
index.vue
frontend/src/views/system/plugin/index.vue
+0
-1
没有找到文件。
backend/src/main/java/io/dataease/auth/aop/DeLogAnnotationHandler.java
浏览文件 @
544ea07e
...
...
@@ -43,6 +43,7 @@ public class DeLogAnnotationHandler {
befores
.
add
(
SysLogConstants
.
OPERATE_TYPE
.
DELETE
.
getValue
());
befores
.
add
(
SysLogConstants
.
OPERATE_TYPE
.
UNSHARE
.
getValue
());
befores
.
add
(
SysLogConstants
.
OPERATE_TYPE
.
UNAUTHORIZE
.
getValue
());
befores
.
add
(
SysLogConstants
.
OPERATE_TYPE
.
UPLOADFILE
.
getValue
());
}
private
SysLogDTO
exec
(
JoinPoint
point
,
DeLog
deLog
)
throws
Exception
{
...
...
backend/src/main/java/io/dataease/commons/constants/SysLogConstants.java
浏览文件 @
544ea07e
...
...
@@ -21,7 +21,8 @@ public class SysLogConstants {
UNAUTHORIZE
(
7
,
"OPERATE_TYPE_UNAUTHORIZE"
),
CREATELINK
(
8
,
"OPERATE_TYPE_CREATELINK"
),
DELETELINK
(
9
,
"OPERATE_TYPE_DELETELINK"
),
MODIFYLINK
(
10
,
"OPERATE_TYPE_MODIFYLINK"
);
MODIFYLINK
(
10
,
"OPERATE_TYPE_MODIFYLINK"
),
UPLOADFILE
(
11
,
"OPERATE_TYPE_UPLOADFILE"
);
private
Integer
value
;
private
String
name
;
OPERATE_TYPE
(
Integer
value
,
String
name
)
{
...
...
@@ -52,7 +53,9 @@ public class SysLogConstants {
/*LINK(5, "SOURCE_TYPE_LINK"),*/
USER
(
6
,
"SOURCE_TYPE_USER"
),
DEPT
(
7
,
"SOURCE_TYPE_DEPT"
),
ROLE
(
8
,
"SOURCE_TYPE_ROLE"
);
ROLE
(
8
,
"SOURCE_TYPE_ROLE"
),
DRIVER
(
9
,
"SOURCE_TYPE_DRIVER"
),
DRIVER_FILE
(
10
,
"SOURCE_TYPE_DRIVER_FILE"
);
private
Integer
value
;
private
String
name
;
...
...
backend/src/main/java/io/dataease/controller/datasource/DriverMgmController.java
0 → 100644
浏览文件 @
544ea07e
package
io
.
dataease
.
controller
.
datasource
;
import
io.dataease.auth.annotation.DeLog
;
import
io.dataease.commons.constants.SysLogConstants
;
import
io.dataease.dto.DriverDTO
;
import
io.dataease.plugins.common.base.domain.DeDriver
;
import
io.dataease.plugins.common.base.domain.DeDriverDetails
;
import
io.dataease.service.datasource.DriverService
;
import
io.swagger.annotations.ApiImplicitParam
;
import
io.swagger.annotations.ApiImplicitParams
;
import
io.swagger.annotations.ApiOperation
;
import
org.apache.shiro.authz.annotation.RequiresPermissions
;
import
org.springframework.web.bind.annotation.*
;
import
org.springframework.web.multipart.MultipartFile
;
import
springfox.documentation.annotations.ApiIgnore
;
import
javax.annotation.Resource
;
import
java.util.List
;
import
java.util.stream.Collectors
;
@ApiIgnore
@RequestMapping
(
"driver"
)
@RestController
public
class
DriverMgmController
{
@Resource
private
DriverService
driverService
;
@RequiresPermissions
(
"datasource:read"
)
@ApiOperation
(
"驱动列表"
)
@PostMapping
(
"/list"
)
public
List
<
DriverDTO
>
listDeDriver
()
throws
Exception
{
return
driverService
.
list
();
}
@RequiresPermissions
(
"datasource:read"
)
@ApiOperation
(
"删除驱动"
)
@PostMapping
(
"/delete"
)
@DeLog
(
operatetype
=
SysLogConstants
.
OPERATE_TYPE
.
DELETE
,
sourcetype
=
SysLogConstants
.
SOURCE_TYPE
.
DRIVER
,
positionIndex
=
0
,
positionKey
=
"type"
,
value
=
"id"
)
public
void
delete
(
@RequestBody
DeDriver
deDriver
)
throws
Exception
{
driverService
.
delete
(
deDriver
.
getId
());
}
@RequiresPermissions
(
"datasource:read"
)
@ApiOperation
(
"驱动列表"
)
@GetMapping
(
"/list/{type}"
)
public
List
<
DriverDTO
>
listDeDriver
(
@PathVariable
String
type
)
throws
Exception
{
return
listDeDriver
().
stream
().
filter
(
driverDTO
->
driverDTO
.
getType
().
equalsIgnoreCase
(
type
)).
collect
(
Collectors
.
toList
());
}
@RequiresPermissions
(
"datasource:read"
)
@ApiOperation
(
"添加驱动"
)
@PostMapping
(
"/save"
)
@DeLog
(
operatetype
=
SysLogConstants
.
OPERATE_TYPE
.
CREATE
,
sourcetype
=
SysLogConstants
.
SOURCE_TYPE
.
DRIVER
,
positionIndex
=
0
,
positionKey
=
"type"
,
value
=
"id"
)
public
DeDriver
save
(
@RequestBody
DeDriver
deDriver
)
throws
Exception
{
return
driverService
.
save
(
deDriver
);
}
@RequiresPermissions
(
"datasource:read"
)
@ApiOperation
(
"更新驱动"
)
@PostMapping
(
"/update"
)
@DeLog
(
operatetype
=
SysLogConstants
.
OPERATE_TYPE
.
MODIFY
,
sourcetype
=
SysLogConstants
.
SOURCE_TYPE
.
DRIVER
,
positionIndex
=
0
,
positionKey
=
"type"
,
value
=
"id"
)
public
DeDriver
update
(
@RequestBody
DeDriver
deDriver
)
throws
Exception
{
return
driverService
.
update
(
deDriver
);
}
@RequiresPermissions
(
"datasource:read"
)
@ApiOperation
(
"驱动文件列表"
)
@GetMapping
(
"/listDriverDetails/{id}"
)
public
List
<
DeDriverDetails
>
listDriverDetails
(
@PathVariable
String
id
)
throws
Exception
{
return
driverService
.
listDriverDetails
(
id
);
}
@RequiresPermissions
(
"datasource:read"
)
@ApiOperation
(
"删除驱动文件"
)
@PostMapping
(
"/deleteDriverFile"
)
@DeLog
(
operatetype
=
SysLogConstants
.
OPERATE_TYPE
.
DELETE
,
sourcetype
=
SysLogConstants
.
SOURCE_TYPE
.
DRIVER_FILE
,
positionIndex
=
0
,
positionKey
=
"deDriverId"
,
value
=
"id"
)
public
void
deleteDriverFile
(
@RequestBody
DeDriverDetails
deDriverDetails
)
throws
Exception
{
driverService
.
deleteDriverFile
(
deDriverDetails
.
getId
());
}
@RequiresPermissions
(
"datasource:read"
)
@ApiOperation
(
"驱动文件上传"
)
@PostMapping
(
"file/upload"
)
@DeLog
(
operatetype
=
SysLogConstants
.
OPERATE_TYPE
.
UPLOADFILE
,
sourcetype
=
SysLogConstants
.
SOURCE_TYPE
.
DRIVER_FILE
,
positionIndex
=
0
,
positionKey
=
"deDriverId"
,
value
=
"id"
)
@ApiImplicitParams
({
@ApiImplicitParam
(
name
=
"file"
,
value
=
"文件"
,
required
=
true
,
dataType
=
"MultipartFile"
),
@ApiImplicitParam
(
name
=
"id"
,
value
=
"驱动D"
,
required
=
true
,
dataType
=
"String"
)
})
public
DeDriverDetails
excelUpload
(
@RequestParam
(
"id"
)
String
id
,
@RequestParam
(
"file"
)
MultipartFile
file
)
throws
Exception
{
return
driverService
.
saveJar
(
file
,
id
);
}
}
backend/src/main/java/io/dataease/dto/DriverDTO.java
0 → 100644
浏览文件 @
544ea07e
package
io
.
dataease
.
dto
;
import
io.dataease.plugins.common.base.domain.DeDriver
;
import
lombok.Data
;
@Data
public
class
DriverDTO
extends
DeDriver
{
private
String
typeDesc
;
}
backend/src/main/java/io/dataease/ext/ExtSysLogMapper.xml
浏览文件 @
544ea07e
...
...
@@ -112,6 +112,28 @@
</where>
</if>
<if
test=
"type == 9"
>
id, name
from de_driver
<where>
id in
<foreach
collection=
"ids"
item=
"id"
index=
"index"
open=
"("
separator=
","
close=
")"
>
#{id}
</foreach>
</where>
</if>
<if
test=
"type == 10"
>
id, name
from de_driver
<where>
id in
<foreach
collection=
"ids"
item=
"id"
index=
"index"
open=
"("
separator=
","
close=
")"
>
#{id}
</foreach>
</where>
</if>
</select>
...
...
backend/src/main/java/io/dataease/provider/ProviderFactory.java
浏览文件 @
544ea07e
package
io
.
dataease
.
provider
;
import
com.google.gson.Gson
;
import
io.dataease.plugins.common.constants.DatasourceTypes
;
import
io.dataease.plugins.common.dto.datasource.DataSourceType
;
import
io.dataease.plugins.config.SpringContextUtil
;
...
...
@@ -25,7 +24,7 @@ public class ProviderFactory implements ApplicationContextAware {
for
(
final
DatasourceTypes
d:
DatasourceTypes
.
values
())
{
final
ConfigurableListableBeanFactory
beanFactory
=
((
ConfigurableApplicationContext
)
context
).
getBeanFactory
();
if
(
d
.
isDatasource
()){
DataSourceType
dataSourceType
=
new
DataSourceType
(
d
.
getType
(),
d
.
getName
(),
false
,
d
.
getExtraParams
(),
d
.
getCalculationMode
());
DataSourceType
dataSourceType
=
new
DataSourceType
(
d
.
getType
(),
d
.
getName
(),
false
,
d
.
getExtraParams
(),
d
.
getCalculationMode
()
,
d
.
isJdbc
()
);
if
(
dataSourceType
.
getType
().
equalsIgnoreCase
(
"oracle"
)){
dataSourceType
.
setCharset
(
d
.
getCharset
());
}
...
...
backend/src/main/java/io/dataease/provider/datasource/JdbcProvider.java
浏览文件 @
544ea07e
差异被折叠。
点击展开。
backend/src/main/java/io/dataease/service/chart/ChartViewService.java
浏览文件 @
544ea07e
差异被折叠。
点击展开。
backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java
浏览文件 @
544ea07e
...
...
@@ -2270,7 +2270,7 @@ public class DataSetTableService {
record
.
setSyncStatus
(
JobStatus
.
Error
.
name
());
example
.
clear
();
example
.
createCriteria
().
andSyncStatusEqualTo
(
JobStatus
.
Underway
.
name
())
.
andIdIn
(
datasetTableTasks
.
stream
().
map
(
DatasetTableTask:
:
getTable
Id
).
collect
(
Collectors
.
toList
()));
.
andIdIn
(
jobStoppeddDatasetTables
.
stream
().
map
(
DatasetTable:
:
get
Id
).
collect
(
Collectors
.
toList
()));
datasetTableMapper
.
updateByExampleSelective
(
record
,
example
);
//TaskLog
...
...
backend/src/main/java/io/dataease/service/datasource/DatasourceService.java
浏览文件 @
544ea07e
...
...
@@ -27,11 +27,13 @@ import io.dataease.i18n.Translator;
import
io.dataease.plugins.common.base.domain.*
;
import
io.dataease.plugins.common.base.mapper.DatasetTableMapper
;
import
io.dataease.plugins.common.base.mapper.DatasourceMapper
;
import
io.dataease.plugins.common.constants.DatasourceCalculationMode
;
import
io.dataease.plugins.common.constants.DatasourceTypes
;
import
io.dataease.plugins.common.dto.datasource.DataSourceType
;
import
io.dataease.plugins.common.dto.datasource.TableDesc
;
import
io.dataease.plugins.common.request.datasource.DatasourceRequest
;
import
io.dataease.plugins.config.SpringContextUtil
;
import
io.dataease.plugins.datasource.entity.JdbcConfiguration
;
import
io.dataease.plugins.datasource.provider.Provider
;
import
io.dataease.provider.ProviderFactory
;
import
io.dataease.provider.datasource.ApiProvider
;
...
...
@@ -41,10 +43,8 @@ import io.dataease.service.sys.SysAuthService;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.apache.commons.lang3.ObjectUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.core.env.Environment
;
import
org.springframework.data.redis.core.RedisTemplate
;
import
org.springframework.data.redis.core.StringRedisTemplate
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
...
...
@@ -131,6 +131,13 @@ public class DatasourceService {
datasourceDTO
.
setCalculationMode
(
dataSourceType
.
getCalculationMode
());
}
});
if
(!
datasourceDTO
.
getType
().
equalsIgnoreCase
(
DatasourceTypes
.
api
.
toString
())){
JdbcConfiguration
configuration
=
new
Gson
().
fromJson
(
datasourceDTO
.
getConfiguration
(),
JdbcConfiguration
.
class
);
if
(
StringUtils
.
isNotEmpty
(
configuration
.
getCustomDriver
())
&&
!
configuration
.
getCustomDriver
().
equalsIgnoreCase
(
"default"
)){
datasourceDTO
.
setCalculationMode
(
DatasourceCalculationMode
.
DIRECT
);
}
}
if
(
datasourceDTO
.
getType
().
equalsIgnoreCase
(
DatasourceTypes
.
mysql
.
toString
())){
datasourceDTO
.
setConfiguration
(
JSONObject
.
toJSONString
(
new
Gson
().
fromJson
(
datasourceDTO
.
getConfiguration
(),
MysqlConfiguration
.
class
))
);
}
...
...
backend/src/main/java/io/dataease/service/datasource/DriverService.java
0 → 100644
浏览文件 @
544ea07e
package
io
.
dataease
.
service
.
datasource
;
import
io.dataease.commons.utils.BeanUtils
;
import
io.dataease.commons.utils.DeFileUtils
;
import
io.dataease.dto.DriverDTO
;
import
io.dataease.plugins.common.base.domain.DeDriver
;
import
io.dataease.plugins.common.base.domain.DeDriverDetails
;
import
io.dataease.plugins.common.base.domain.DeDriverDetailsExample
;
import
io.dataease.plugins.common.base.mapper.DeDriverDetailsMapper
;
import
io.dataease.plugins.common.base.mapper.DeDriverMapper
;
import
io.dataease.plugins.datasource.provider.ExtendedJdbcClassLoader
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.web.multipart.MultipartFile
;
import
javax.annotation.Resource
;
import
java.io.File
;
import
java.io.FileOutputStream
;
import
java.io.IOException
;
import
java.lang.reflect.Modifier
;
import
java.net.URL
;
import
java.util.ArrayList
;
import
java.util.Enumeration
;
import
java.util.List
;
import
java.util.UUID
;
import
java.util.jar.JarEntry
;
import
java.util.jar.JarFile
;
@Transactional
(
rollbackFor
=
Exception
.
class
)
@Service
public
class
DriverService
{
private
static
String
DRIVER_PATH
=
"/opt/dataease/drivers/custom/"
;
@Resource
private
DeDriverMapper
deDriverMapper
;
@Resource
private
DeDriverDetailsMapper
deDriverDetailsMapper
;
@Resource
private
DatasourceService
datasourceService
;
public
List
<
DriverDTO
>
list
()
throws
Exception
{
List
<
DriverDTO
>
driverDTOS
=
new
ArrayList
<>();
deDriverMapper
.
selectByExample
(
null
).
forEach
(
deDriver
->
{
DriverDTO
driverDTO
=
new
DriverDTO
();
BeanUtils
.
copyBean
(
driverDTO
,
deDriver
);
datasourceService
.
types
().
forEach
(
dataSourceType
->
{
if
(
dataSourceType
.
getType
().
equalsIgnoreCase
(
deDriver
.
getType
()))
{
driverDTO
.
setTypeDesc
(
dataSourceType
.
getName
());
}
});
driverDTOS
.
add
(
driverDTO
);
});
return
driverDTOS
;
}
public
void
delete
(
String
driverId
)
{
deDriverMapper
.
deleteByPrimaryKey
(
driverId
);
DeDriverDetailsExample
example
=
new
DeDriverDetailsExample
();
example
.
createCriteria
().
andDeDriverIdEqualTo
(
driverId
);
deDriverDetailsMapper
.
deleteByExample
(
example
);
DeFileUtils
.
deleteFile
(
DRIVER_PATH
+
driverId
+
"/"
);
}
public
DeDriver
save
(
DeDriver
deDriver
)
{
deDriver
.
setCreateTime
(
System
.
currentTimeMillis
());
deDriver
.
setId
(
UUID
.
randomUUID
().
toString
());
deDriverMapper
.
insert
(
deDriver
);
return
deDriver
;
}
public
DeDriver
update
(
DeDriver
deDriver
)
{
deDriverMapper
.
updateByPrimaryKey
(
deDriver
);
return
deDriver
;
}
public
List
<
DeDriverDetails
>
listDriverDetails
(
String
driverId
)
{
DeDriverDetailsExample
example
=
new
DeDriverDetailsExample
();
example
.
createCriteria
().
andDeDriverIdEqualTo
(
driverId
);
return
deDriverDetailsMapper
.
selectByExampleWithBLOBs
(
example
);
}
public
void
deleteDriverFile
(
String
driverFileId
)
{
DeDriverDetails
deDriverDetails
=
deDriverDetailsMapper
.
selectByPrimaryKey
(
driverFileId
);
DeFileUtils
.
deleteFile
(
DRIVER_PATH
+
deDriverDetails
.
getDeDriverId
()
+
"/"
+
deDriverDetails
.
getFileName
());
deDriverDetailsMapper
.
deleteByPrimaryKey
(
driverFileId
);
}
public
DeDriverDetails
saveJar
(
MultipartFile
file
,
String
driverId
)
throws
Exception
{
String
filename
=
file
.
getOriginalFilename
();
String
dirPath
=
DRIVER_PATH
+
driverId
+
"/"
;
String
filePath
=
dirPath
+
filename
;
saveFile
(
file
,
dirPath
,
filePath
);
List
<
String
>
jdbcList
=
new
ArrayList
<>();
String
version
=
""
;
// ExtendedJdbcClassLoader extendedJdbcClassLoader = new ExtendedJdbcClassLoader(new URL[]{new File(filePath).toURI().toURL()}, null);
// for (String className : getClassNameFrom(filePath)) {
// if (isChildClass(className, java.sql.Driver.class, extendedJdbcClassLoader)) {
// jdbcList.add(className);
// version = classVersion(extendedJdbcClassLoader, className);
// }
// }
DeDriverDetails
deDriverDetails
=
new
DeDriverDetails
();
deDriverDetails
.
setId
(
UUID
.
randomUUID
().
toString
());
deDriverDetails
.
setDeDriverId
(
driverId
);
deDriverDetails
.
setVersion
(
version
);
deDriverDetails
.
setFileName
(
filename
);
deDriverDetails
.
setDriverClass
(
String
.
join
(
","
,
jdbcList
));
deDriverDetailsMapper
.
insert
(
deDriverDetails
);
return
deDriverDetails
;
}
private
List
<
String
>
getClassNameFrom
(
String
jarName
)
{
List
<
String
>
fileList
=
new
ArrayList
<
String
>();
try
{
JarFile
jarFile
=
new
JarFile
(
new
File
(
jarName
));
Enumeration
<
JarEntry
>
en
=
jarFile
.
entries
();
// 枚举获得JAR文件内的实体,即相对路径
while
(
en
.
hasMoreElements
())
{
String
name1
=
en
.
nextElement
().
getName
();
if
(!
name1
.
endsWith
(
".class"
))
{
//不是class文件
continue
;
}
String
name2
=
name1
.
substring
(
0
,
name1
.
lastIndexOf
(
".class"
));
String
name3
=
name2
.
replaceAll
(
"/"
,
"."
);
fileList
.
add
(
name3
);
}
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
return
fileList
;
}
public
boolean
isChildClass
(
String
className
,
Class
parentClazz
,
ExtendedJdbcClassLoader
extendedJdbcClassLoader
)
{
if
(
className
==
null
)
return
false
;
Class
clazz
=
null
;
try
{
clazz
=
extendedJdbcClassLoader
.
loadClass
(
className
);
if
(
Modifier
.
isAbstract
(
clazz
.
getModifiers
()))
{
//抽象类忽略
return
false
;
}
if
(
Modifier
.
isInterface
(
clazz
.
getModifiers
()))
{
//接口忽略
return
false
;
}
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
return
false
;
}
return
parentClazz
.
isAssignableFrom
(
clazz
);
}
private
String
classVersion
(
ExtendedJdbcClassLoader
extendedJdbcClassLoader
,
String
className
)
throws
Exception
{
Class
clazz
=
extendedJdbcClassLoader
.
loadClass
(
className
);
return
clazz
.
getPackage
().
getImplementationVersion
();
}
private
String
saveFile
(
MultipartFile
file
,
String
dirPath
,
String
filePath
)
throws
Exception
{
File
p
=
new
File
(
dirPath
);
if
(!
p
.
exists
())
{
p
.
mkdirs
();
}
File
f
=
new
File
(
filePath
);
FileOutputStream
fileOutputStream
=
new
FileOutputStream
(
f
);
fileOutputStream
.
write
(
file
.
getBytes
());
fileOutputStream
.
flush
();
fileOutputStream
.
close
();
return
filePath
;
}
}
backend/src/main/resources/db/migration/V35__1.11.sql
浏览文件 @
544ea07e
ALTER
TABLE
`panel_group`
ADD
COLUMN
`status`
varchar
(
255
)
NULL
DEFAULT
'publish'
COMMENT
'1.publish--发布 2.unpublished--未发布'
AFTER
`mobile_layout`
;
CREATE
TABLE
`de_driver`
(
`id`
varchar
(
50
)
NOT
NULL
COMMENT
'主键'
,
`name`
varchar
(
50
)
NOT
NULL
COMMENT
'用户ID'
,
`create_time`
bigint
(
13
)
NOT
NULL
COMMENT
'创健时间'
,
`type`
varchar
(
255
)
DEFAULT
NULL
COMMENT
'数据源类型'
,
`driver_class`
varchar
(
255
)
DEFAULT
NULL
COMMENT
'驱动类'
,
`desc`
varchar
(
255
)
DEFAULT
NULL
COMMENT
'描述'
,
PRIMARY
KEY
(
`id`
)
USING
BTREE
)
ENGINE
=
InnoDB
DEFAULT
CHARSET
=
utf8mb4
COMMENT
=
'驱动'
;
CREATE
TABLE
`de_driver_details`
(
`id`
varchar
(
50
)
NOT
NULL
COMMENT
'主键'
,
`de_driver_id`
varchar
(
50
)
NOT
NULL
COMMENT
'驱动主键'
,
`file_name`
varchar
(
255
)
DEFAULT
NULL
COMMENT
'名称'
,
`version`
varchar
(
255
)
DEFAULT
NULL
COMMENT
'版本'
,
`driver_class`
longtext
DEFAULT
NULL
COMMENT
'驱动类'
,
PRIMARY
KEY
(
`id`
)
USING
BTREE
)
ENGINE
=
InnoDB
DEFAULT
CHARSET
=
utf8mb4
COMMENT
=
'驱动详情'
;
UPDATE
`sys_menu`
SET
`sub_count`
=
1
WHERE
`menu_id`
=
40
;
INSERT
INTO
`sys_menu`
(
`menu_id`
,
`pid`
,
`sub_count`
,
`type`
,
`title`
,
`name`
,
`component`
,
`menu_sort`
,
`icon`
,
`path`
,
`i_frame`
,
`cache`
,
`hidden`
,
`permission`
,
`create_by`
,
`update_by`
,
`create_time`
,
`update_time`
)
VALUES
(
401
,
40
,
0
,
2
,
'查看系统模板'
,
NULL
,
NULL
,
999
,
NULL
,
NULL
,
0
,
0
,
0
,
'sys-template:read'
,
NULL
,
NULL
,
1614930862373
,
1614930862373
);
...
...
frontend/src/api/system/datasource.js
浏览文件 @
544ea07e
...
...
@@ -15,6 +15,13 @@ export function listDatasource() {
method
:
'get'
})
}
export
function
listDrivers
()
{
return
request
({
url
:
'/driver/list'
,
loading
:
true
,
method
:
'post'
})
}
export
function
listDatasourceType
()
{
return
request
({
url
:
'/datasource/types'
,
...
...
@@ -29,6 +36,13 @@ export function listDatasourceByType(type) {
method
:
'get'
})
}
export
function
listDriverByType
(
type
)
{
return
request
({
url
:
'/driver/list/'
+
type
,
loading
:
true
,
method
:
'get'
})
}
export
function
addDs
(
data
)
{
return
request
({
url
:
'datasource/add/'
,
...
...
@@ -91,4 +105,47 @@ export function checkApiDatasource(data) {
})
}
export
function
addDriver
(
data
)
{
return
request
({
url
:
'/driver/save'
,
method
:
'post'
,
loading
:
true
,
data
})
}
export
function
listDriverDetails
(
id
)
{
return
request
({
url
:
'/driver/listDriverDetails/'
+
id
,
method
:
'get'
,
loading
:
true
})
}
export
function
deleteDriverFile
(
data
)
{
return
request
({
url
:
'/driver/deleteDriverFile'
,
method
:
'post'
,
loading
:
true
,
data
})
}
export
function
delDriver
(
data
)
{
return
request
({
url
:
'driver/delete'
,
loading
:
true
,
method
:
'post'
,
data
})
}
export
function
updateDriver
(
data
)
{
return
request
({
url
:
'driver/update/'
,
loading
:
true
,
method
:
'post'
,
data
})
}
export
default
{
dsGrid
,
addDs
,
editDs
,
delDs
,
validateDs
,
listDatasource
,
getSchema
}
frontend/src/lang/en.js
浏览文件 @
544ea07e
...
...
@@ -1328,7 +1328,22 @@ export default {
sql_ds_union_error
:
'Direct connect SQL dataset can not be union'
,
api_data
:
'API dataset'
},
driver
:{
driver
:
'Driver'
,
please_choose_driver
:
'Please choose driver'
,
mgm
:
'Driver'
,
add
:
'ADD Driver'
,
modify
:
'Modify'
,
show_info
:
'Driver info'
,
file_name
:
'File name'
,
version
:
'version'
},
datasource
:
{
auth_method
:
'Auth method'
,
passwd
:
'UserName Password'
,
kerbers_info
:
'Please make sure krb5 Conf, KeyTab key, added to path: /opt/dataease/conf'
,
client_principal
:
'Client Principal'
,
keytab_Key_path
:
'Keytab Key Path'
,
datasource
:
'Data Source'
,
please_select_left
:
'Please select the data source from the left'
,
show_info
:
'Data Source Info'
,
...
...
frontend/src/lang/tw.js
浏览文件 @
544ea07e
...
...
@@ -1328,7 +1328,22 @@ export default {
sql_ds_union_error
:
'直連模式下SQL數據集,不支持關聯'
,
api_data
:
'API 數據集'
},
driver
:{
driver
:
'驅動'
,
please_choose_driver
:
'青選擇驅動'
,
mgm
:
'驅動管理'
,
add
:
'添加驅動'
,
modify
:
'修改'
,
show_info
:
'驅動信息'
,
file_name
:
'文件名'
,
version
:
'版本'
},
datasource
:
{
auth_method
:
'認證方式'
,
passwd
:
'用户名密码'
,
kerbers_info
:
'请确保 krb5.Conf、Keytab Key,已经添加到路径:/opt/dataease/conf'
,
client_principal
:
'Client Principal'
,
keytab_Key_path
:
'Keytab Key Path'
,
datasource
:
'數據源'
,
please_select_left
:
'請從左側選擇數據源'
,
show_info
:
'數據源信息'
,
...
...
frontend/src/lang/zh.js
浏览文件 @
544ea07e
...
...
@@ -1330,7 +1330,22 @@ export default {
sql_ds_union_error
:
'直连模式下SQL数据集,不支持关联'
,
api_data
:
'API 数据集'
},
driver
:{
driver
:
'驱动'
,
please_choose_driver
:
'请选择驱动'
,
mgm
:
'驱动管理'
,
add
:
'添加驱动'
,
modify
:
'修改'
,
show_info
:
'驱动信息'
,
file_name
:
'文件名'
,
version
:
'版本'
},
datasource
:
{
auth_method
:
'认证方式'
,
passwd
:
'用户名密码'
,
kerbers_info
:
'请确保 krb5.Conf、Keytab Key,已经添加到路径:/opt/dataease/conf'
,
client_principal
:
'Client Principal'
,
keytab_Key_path
:
'Keytab Key Path'
,
datasource
:
'数据源'
,
please_select_left
:
'请从左侧选择数据源'
,
show_info
:
'数据源信息'
,
...
...
frontend/src/views/chart/chart/bar/bar_antv.js
浏览文件 @
544ea07e
...
...
@@ -10,6 +10,7 @@ import {
getSlider
,
getAnalyse
}
from
'@/views/chart/chart/common/common_antv'
import
{
antVCustomColor
}
from
'@/views/chart/chart/util'
export
function
baseBarOptionAntV
(
plot
,
container
,
chart
,
action
,
isGroup
,
isStack
)
{
// theme
...
...
@@ -98,6 +99,8 @@ export function baseBarOptionAntV(plot, container, chart, action, isGroup, isSta
}
else
{
delete
options
.
isStack
}
// custom color
options
.
color
=
antVCustomColor
(
chart
)
// 开始渲染
if
(
plot
)
{
...
...
@@ -198,6 +201,8 @@ export function hBaseBarOptionAntV(plot, container, chart, action, isGroup, isSt
}
else
{
delete
options
.
isStack
}
// custom color
options
.
color
=
antVCustomColor
(
chart
)
// 开始渲染
if
(
plot
)
{
...
...
frontend/src/views/chart/chart/funnel/funnel_antv.js
浏览文件 @
544ea07e
import
{
getLabel
,
getLegend
,
getPadding
,
getTheme
,
getTooltip
}
from
'@/views/chart/chart/common/common_antv'
import
{
Funnel
}
from
'@antv/g2plot'
import
{
antVCustomColor
}
from
'@/views/chart/chart/util'
export
function
baseFunnelOptionAntV
(
plot
,
container
,
chart
,
action
)
{
// theme
...
...
@@ -62,6 +63,8 @@ export function baseFunnelOptionAntV(plot, container, chart, action) {
const
s
=
JSON
.
parse
(
JSON
.
stringify
(
customAttr
.
size
))
}
}
// custom color
options
.
color
=
antVCustomColor
(
chart
)
// 开始渲染
if
(
plot
)
{
...
...
frontend/src/views/chart/chart/line/line_antv.js
浏览文件 @
544ea07e
...
...
@@ -10,6 +10,7 @@ import {
getSlider
,
getAnalyse
}
from
'@/views/chart/chart/common/common_antv'
import
{
antVCustomColor
}
from
'@/views/chart/chart/util'
export
function
baseLineOptionAntV
(
plot
,
container
,
chart
,
action
)
{
// theme
...
...
@@ -90,6 +91,8 @@ export function baseLineOptionAntV(plot, container, chart, action) {
}
}
}
// custom color
options
.
color
=
antVCustomColor
(
chart
)
// 开始渲染
if
(
plot
)
{
...
...
@@ -184,6 +187,8 @@ export function baseAreaOptionAntV(plot, container, chart, action) {
}
}
}
// custom color
options
.
color
=
antVCustomColor
(
chart
)
// 开始渲染
if
(
plot
)
{
...
...
frontend/src/views/chart/chart/pie/pie_antv.js
浏览文件 @
544ea07e
...
...
@@ -7,6 +7,7 @@ import {
}
from
'@/views/chart/chart/common/common_antv'
import
{
Pie
,
Rose
}
from
'@antv/g2plot'
import
{
antVCustomColor
}
from
'@/views/chart/chart/util'
export
function
basePieOptionAntV
(
plot
,
container
,
chart
,
action
)
{
// theme
...
...
@@ -84,6 +85,8 @@ export function basePieOptionAntV(plot, container, chart, action) {
options
.
innerRadius
=
parseFloat
(
parseInt
(
s
.
pieInnerRadius
)
/
100
)
}
}
// custom color
options
.
color
=
antVCustomColor
(
chart
)
// 开始渲染
if
(
plot
)
{
...
...
@@ -165,6 +168,8 @@ export function basePieRoseOptionAntV(plot, container, chart, action) {
options
.
innerRadius
=
parseFloat
(
parseInt
(
s
.
pieInnerRadius
)
/
100
)
}
}
// custom color
options
.
color
=
antVCustomColor
(
chart
)
// 开始渲染
if
(
plot
)
{
...
...
frontend/src/views/chart/chart/radar/radar_antv.js
浏览文件 @
544ea07e
import
{
getLabel
,
getLegend
,
getPadding
,
getTheme
,
getTooltip
}
from
'@/views/chart/chart/common/common_antv'
import
{
Radar
}
from
'@antv/g2plot'
import
{
antVCustomColor
}
from
'@/views/chart/chart/util'
export
function
baseRadarOptionAntV
(
plot
,
container
,
chart
,
action
)
{
// theme
...
...
@@ -132,6 +133,9 @@ export function baseRadarOptionAntV(plot, container, chart, action) {
options
.
xAxis
=
xAxis
options
.
yAxis
=
yAxis
// custom color
options
.
color
=
antVCustomColor
(
chart
)
// 开始渲染
if
(
plot
)
{
plot
.
destroy
()
...
...
frontend/src/views/chart/chart/scatter/scatter_antv.js
浏览文件 @
544ea07e
...
...
@@ -11,6 +11,7 @@ import {
}
from
'@/views/chart/chart/common/common_antv'
import
{
Scatter
}
from
'@antv/g2plot'
import
{
antVCustomColor
}
from
'@/views/chart/chart/util'
export
function
baseScatterOptionAntV
(
plot
,
container
,
chart
,
action
)
{
// theme
...
...
@@ -86,6 +87,8 @@ export function baseScatterOptionAntV(plot, container, chart, action) {
options
.
shape
=
s
.
scatterSymbol
}
}
// custom color
options
.
color
=
antVCustomColor
(
chart
)
// 开始渲染
if
(
plot
)
{
...
...
frontend/src/views/chart/chart/util.js
浏览文件 @
544ea07e
...
...
@@ -2263,3 +2263,124 @@ export function customSort(custom, data) {
return
joinArr
.
concat
(
subArr
)
}
export
function
customColor
(
custom
,
res
,
colors
)
{
const
result
=
[]
for
(
let
i
=
0
;
i
<
res
.
length
;
i
++
)
{
const
r
=
res
[
i
]
let
flag
=
false
for
(
let
j
=
0
;
j
<
custom
.
length
;
j
++
)
{
const
c
=
custom
[
j
]
if
(
r
.
name
===
c
.
name
)
{
flag
=
true
result
.
push
(
c
)
}
}
if
(
!
flag
)
{
result
.
push
(
r
)
}
}
return
result
}
export
function
getColors
(
chart
,
colors
,
reset
)
{
// 自定义颜色,先按照没有设定的情况,并排好序,当做最终结果
let
seriesColors
=
[]
let
series
if
(
chart
.
type
.
includes
(
'stack'
))
{
if
(
chart
.
data
)
{
const
data
=
chart
.
data
.
datas
const
stackData
=
[]
for
(
let
i
=
0
;
i
<
data
.
length
;
i
++
)
{
const
s
=
data
[
i
]
stackData
.
push
(
s
.
category
)
}
const
sArr
=
stackData
.
filter
(
function
(
item
,
index
,
stackData
)
{
return
stackData
.
indexOf
(
item
,
0
)
===
index
})
for
(
let
i
=
0
;
i
<
sArr
.
length
;
i
++
)
{
const
s
=
sArr
[
i
]
seriesColors
.
push
({
name
:
s
,
color
:
colors
[
i
%
colors
.
length
],
isCustom
:
false
})
}
}
}
else
if
(
chart
.
type
.
includes
(
'bar'
)
||
chart
.
type
.
includes
(
'line'
)
||
chart
.
type
.
includes
(
'scatter'
)
||
chart
.
type
.
includes
(
'radar'
))
{
if
(
Object
.
prototype
.
toString
.
call
(
chart
.
yaxis
)
===
'[object Array]'
)
{
series
=
JSON
.
parse
(
JSON
.
stringify
(
chart
.
yaxis
))
}
else
{
series
=
JSON
.
parse
(
chart
.
yaxis
)
}
for
(
let
i
=
0
;
i
<
series
.
length
;
i
++
)
{
const
s
=
series
[
i
]
seriesColors
.
push
({
name
:
s
.
name
,
color
:
colors
[
i
%
colors
.
length
],
isCustom
:
false
})
}
}
else
{
if
(
chart
.
data
)
{
const
data
=
chart
.
data
.
datas
// data 的维度值,需要根据自定义顺序排序
// let customSortData
// if (Object.prototype.toString.call(chart.customSort) === '[object Array]') {
// customSortData = JSON.parse(JSON.stringify(chart.customSort))
// } else {
// customSortData = JSON.parse(chart.customSort)
// }
// if (customSortData && customSortData.length > 0) {
// data = customSort(customSortData, data)
// }
for
(
let
i
=
0
;
i
<
data
.
length
;
i
++
)
{
const
s
=
data
[
i
]
seriesColors
.
push
({
name
:
s
.
field
,
color
:
colors
[
i
%
colors
.
length
],
isCustom
:
false
})
}
}
}
// 如果有自定义,则与上述中的结果合并。
// res,custom,以custom为准,去掉res中不存在的,并将custom中name一样的color赋值给res,不存在的name,即新增值,使用i % colors.length,从配色方案中选
if
(
!
reset
)
{
let
sc
=
null
if
(
Object
.
prototype
.
toString
.
call
(
chart
.
customAttr
)
===
'[object Object]'
)
{
sc
=
JSON
.
parse
(
JSON
.
stringify
(
chart
.
customAttr
)).
color
.
seriesColors
}
else
{
sc
=
JSON
.
parse
(
chart
.
customAttr
).
color
.
seriesColors
}
if
(
sc
&&
sc
.
length
>
0
)
{
seriesColors
=
customColor
(
sc
,
seriesColors
)
}
// 根据isCustom字段,修正color
for
(
let
i
=
0
;
i
<
seriesColors
.
length
;
i
++
)
{
if
(
!
seriesColors
[
i
].
isCustom
)
{
seriesColors
[
i
].
color
=
colors
[
i
%
colors
.
length
]
}
}
}
return
seriesColors
}
export
function
antVCustomColor
(
chart
)
{
const
colors
=
[]
if
(
chart
.
customAttr
)
{
const
customAttr
=
JSON
.
parse
(
chart
.
customAttr
)
// color
if
(
customAttr
.
color
)
{
const
c
=
JSON
.
parse
(
JSON
.
stringify
(
customAttr
.
color
))
const
customColors
=
getColors
(
chart
,
c
.
colors
,
false
)
for
(
let
i
=
0
;
i
<
customColors
.
length
;
i
++
)
{
colors
.
push
(
hexColorToRGBA
(
customColors
[
i
].
color
,
c
.
alpha
))
}
}
}
return
colors
}
frontend/src/views/chart/components/shape-attr/ColorSelectorExt.vue
0 → 100644
浏览文件 @
544ea07e
差异被折叠。
点击展开。
frontend/src/views/chart/group/Group.vue
浏览文件 @
544ea07e
...
...
@@ -822,6 +822,7 @@ export default {
view
.
customFilter
=
JSON
.
stringify
([])
view
.
drillFields
=
JSON
.
stringify
([])
view
.
extBubble
=
JSON
.
stringify
([])
view
.
viewFields
=
JSON
.
stringify
([])
this
.
setChartDefaultOptions
(
view
)
const
_this
=
this
post
(
'/chart/view/newOne/'
+
this
.
panelInfo
.
id
,
view
,
true
).
then
(
response
=>
{
...
...
frontend/src/views/chart/view/ChartEdit.vue
浏览文件 @
544ea07e
...
...
@@ -658,6 +658,8 @@
:chart=
"chart"
:properties=
"chartProperties"
:property-inner-all=
"chartPropertyInnerAll"
:dimension-data=
"dimensionData"
:quota-data=
"quotaData"
@
calcStyle=
"calcStyle"
@
onColorChange=
"onColorChange"
@
onSizeChange=
"onSizeChange"
...
...
@@ -1083,6 +1085,7 @@ export default {
yaxisExt
:
[],
extStack
:
[],
drillFields
:
[],
viewFields
:
[],
extBubble
:
[],
show
:
true
,
type
:
'bar'
,
...
...
@@ -1535,6 +1538,7 @@ export default {
this
.
view
=
JSON
.
parse
(
JSON
.
stringify
(
view
))
// stringify json param
view
.
xaxis
=
JSON
.
stringify
(
view
.
xaxis
)
view
.
viewFields
=
JSON
.
stringify
(
view
.
viewFields
)
view
.
xaxisExt
=
JSON
.
stringify
(
view
.
xaxisExt
)
view
.
yaxis
=
JSON
.
stringify
(
view
.
yaxis
)
view
.
yaxisExt
=
JSON
.
stringify
(
view
.
yaxisExt
)
...
...
@@ -1594,6 +1598,7 @@ export default {
const
view
=
this
.
buildParam
(
true
,
'chart'
,
false
,
switchType
)
if
(
!
view
)
return
viewEditSave
(
this
.
panelInfo
.
id
,
view
).
then
(()
=>
{
this
.
getData
(
this
.
param
.
id
)
bus
.
$emit
(
'view-in-cache'
,
{
type
:
'propChange'
,
viewId
:
this
.
param
.
id
})
})
},
...
...
@@ -1602,6 +1607,7 @@ export default {
// 将视图传入echart...组件
const
view
=
JSON
.
parse
(
JSON
.
stringify
(
this
.
view
))
view
.
xaxis
=
JSON
.
stringify
(
this
.
view
.
xaxis
)
view
.
viewFields
=
JSON
.
stringify
(
this
.
view
.
viewFields
)
view
.
xaxisExt
=
JSON
.
stringify
(
this
.
view
.
xaxisExt
)
view
.
yaxis
=
JSON
.
stringify
(
this
.
view
.
yaxis
)
view
.
yaxisExt
=
JSON
.
stringify
(
this
.
view
.
yaxisExt
)
...
...
@@ -1666,6 +1672,7 @@ export default {
}).
then
(
response
=>
{
this
.
initTableData
(
response
.
data
.
tableId
)
this
.
view
=
JSON
.
parse
(
JSON
.
stringify
(
response
.
data
))
this
.
view
.
viewFields
=
this
.
view
.
viewFields
?
JSON
.
parse
(
this
.
view
.
viewFields
)
:
[]
this
.
view
.
xaxis
=
this
.
view
.
xaxis
?
JSON
.
parse
(
this
.
view
.
xaxis
)
:
[]
this
.
view
.
xaxisExt
=
this
.
view
.
xaxisExt
?
JSON
.
parse
(
this
.
view
.
xaxisExt
)
:
[]
this
.
view
.
yaxis
=
this
.
view
.
yaxis
?
JSON
.
parse
(
this
.
view
.
yaxis
)
:
[]
...
...
@@ -1716,6 +1723,7 @@ export default {
this
.
initTableData
(
response
.
data
.
tableId
)
}
this
.
view
=
JSON
.
parse
(
JSON
.
stringify
(
response
.
data
))
this
.
view
.
viewFields
=
this
.
view
.
viewFields
?
JSON
.
parse
(
this
.
view
.
viewFields
)
:
[]
this
.
view
.
xaxis
=
this
.
view
.
xaxis
?
JSON
.
parse
(
this
.
view
.
xaxis
)
:
[]
this
.
view
.
xaxisExt
=
this
.
view
.
xaxisExt
?
JSON
.
parse
(
this
.
view
.
xaxisExt
)
:
[]
this
.
view
.
yaxis
=
this
.
view
.
yaxis
?
JSON
.
parse
(
this
.
view
.
yaxis
)
:
[]
...
...
@@ -2412,6 +2420,8 @@ export default {
this
.
view
.
customAttr
.
label
.
position
=
'middle'
}
}
// reset custom colors
this
.
view
.
customAttr
.
color
.
seriesColors
=
[]
},
valueFormatter
(
item
)
{
...
...
frontend/src/views/chart/view/ChartStyle.vue
浏览文件 @
544ea07e
...
...
@@ -5,7 +5,7 @@
style=
"overflow:auto;border-right: 1px solid #e6e6e6;height: 100%;width: 100%;"
class=
"attr-style theme-border-class"
:component-name=
"view.type + '-style'"
:obj=
"
{view, param, chart}"
:obj=
"
{view, param, chart
, dimensionData, quotaData
}"
/>
<div
v-else
...
...
@@ -29,8 +29,17 @@
<el-row>
<span
class=
"padding-lr"
>
{{
$t
(
'chart.shape_attr'
)
}}
</span>
<el-collapse
v-model=
"attrActiveNames"
class=
"style-collapse"
>
<el-collapse-item
name=
"color"
:title=
"$t('chart.color')"
>
<color-selector-ext
v-if=
"view.render && view.render === 'antv' && (view.type.includes('bar') || view.type.includes('line') || view.type.includes('pie') || view.type === 'funnel' || view.type === 'radar' || view.type === 'scatter')"
:param=
"param"
class=
"attr-selector"
:chart=
"chart"
@
onColorChange=
"onColorChange"
/>
<el-collapse-item
name=
"color"
v-show=
"showPropertiesCollapse(['color-selector'])"
:title=
"$t('chart.color')"
>
<color-selector
v-else
:param=
"param"
class=
"attr-selector"
:chart=
"chart"
...
...
@@ -274,6 +283,7 @@
<
script
>
import
PluginCom
from
'@/views/system/plugin/PluginCom'
import
ColorSelector
from
'@/views/chart/components/shape-attr/ColorSelector'
import
ColorSelectorExt
from
'@/views/chart/components/shape-attr/ColorSelectorExt'
import
SizeSelector
from
'@/views/chart/components/shape-attr/SizeSelector'
import
SizeSelectorAntV
from
'@/views/chart/components/shape-attr/SizeSelectorAntV'
import
LabelSelector
from
'@/views/chart/components/shape-attr/LabelSelector'
...
...
@@ -315,7 +325,13 @@ export default {
TotalCfg
,
TooltipSelectorAntV
,
TooltipSelector
,
LabelSelectorAntV
,
LabelSelector
,
SizeSelectorAntV
,
SizeSelector
,
ColorSelector
,
PluginCom
LabelSelectorAntV
,
LabelSelector
,
SizeSelectorAntV
,
SizeSelector
,
ColorSelector
,
PluginCom
,
ColorSelectorExt
},
props
:
{
chart
:
{
...
...
@@ -334,6 +350,14 @@ export default {
type
:
Array
,
required
:
true
},
dimensionData
:
{
type
:
Array
,
required
:
true
},
quotaData
:
{
type
:
Array
,
required
:
true
},
propertyInnerAll
:
{
type
:
Object
,
required
:
true
...
...
@@ -358,7 +382,7 @@ export default {
},
methods
:
{
showProperties
(
property
)
{
return
this
.
properties
.
includes
(
property
)
return
this
.
properties
&&
this
.
properties
.
length
&&
this
.
properties
.
includes
(
property
)
},
showPropertiesCollapse
(
propertiesInfo
)
{
let
includeCount
=
0
...
...
frontend/src/views/system/datasource/DriverForm.vue
0 → 100644
浏览文件 @
544ea07e
<
template
>
<layout-content>
<template
v-slot:header
>
<el-icon
name=
"back"
class=
"back-button"
@
click
.
native=
"backToList"
/>
{{
params
&&
params
.
id
&&
params
.
showModel
&&
params
.
showModel
===
'show'
&&
!
canEdit
?
$t
(
'driver.show_info'
)
:
$t
(
'driver.modify'
)
}}
<el-button
v-if=
"canEdit"
size=
"mini"
style=
"float: right;"
type=
"primary"
@
click=
"save"
>
{{
$t
(
'commons.save'
)
}}
</el-button>
<el-button
v-else
size=
"mini"
style=
"float: right;"
type=
"primary"
@
click=
"changeEdit"
>
{{
$t
(
'commons.edit'
)
}}
</el-button>
</
template
>
<div>
<el-form
ref=
"driverForm"
:model=
"driverForm"
:rules=
"rule"
size=
"small"
:disabled=
"params && params.id && params.showModel && params.showModel === 'show' && !canEdit"
label-width=
"180px"
label-position=
"right"
>
<el-form-item
:label=
"$t('commons.name')"
prop=
"name"
>
<el-input
v-model=
"driverForm.name"
autocomplete=
"off"
/>
</el-form-item>
<el-form-item
:label=
"$t('commons.description')"
prop=
"desc"
>
<el-input
v-model=
"driverForm.desc"
autocomplete=
"off"
/>
</el-form-item>
<el-form-item
:label=
"$t('datasource.type')"
prop=
"type"
>
<el-select
v-model=
"driverForm.type"
:placeholder=
"$t('datasource.please_choose_type')"
class=
"select-width"
disabled
filterable
>
<el-option
v-for=
"item in dsTypes"
:key=
"item.type"
:label=
"item.name"
:value=
"item.type"
/>
</el-select>
</el-form-item>
<!-- <el-form-item :label="$t('driver.driver')" >-->
<!-- <el-select-->
<!-- v-model="driverForm.driverClass"-->
<!-- :placeholder="$t('driver.please_choose_driver')"-->
<!-- class="select-width"-->
<!-- filterable-->
<!-- >-->
<!-- <el-option-->
<!-- v-for="item in driverClassList"-->
<!-- :key="item"-->
<!-- :label="item"-->
<!-- :value="item"-->
<!-- />-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<el-form-item
:label=
"$t('driver.driver')"
>
<el-input
v-model=
"driverForm.driverClass"
autocomplete=
"off"
/>
</el-form-item>
</el-form>
<el-upload
:action=
"baseUrl+'driver/file/upload'"
:multiple=
"true"
:show-file-list=
"false"
:file-list=
"fileList"
:data=
"params"
accept=
".jar"
:before-upload=
"beforeUpload"
:on-success=
"uploadSuccess"
:on-error=
"uploadFail"
name=
"file"
:headers=
"headers"
style=
"float: right;"
>
<el-button
size=
"mini"
type=
"primary"
style=
"float: right;"
:disabled=
"uploading"
>
<span
v-if=
"!uploading"
style=
"font-size: 12px;"
>
{{ $t('dataset.upload_file') }}
</span>
<span
v-if=
"uploading"
style=
"font-size: 12px;"
><i
class=
"el-icon-loading"
/>
{{ $t('dataset.uploading') }}
</span>
</el-button>
</el-upload>
<fu-table
:data=
"driverFiles"
>
<el-table-column
prop=
"fileName"
:label=
"$t('driver.file_name')"
/>
<el-table-column
prop=
"version"
:label=
"$t('driver.version')"
/>
<fu-table-operations
:buttons=
"buttons"
:label=
"$t('commons.operating')"
fix
/>
</fu-table>
</div>
</layout-content>
</template>
<
script
>
import
LayoutContent
from
'@/components/business/LayoutContent'
import
i18n
from
'@/lang/index'
import
ApiHttpRequestForm
from
'@/views/system/datasource/ApiHttpRequestForm'
import
DsConfiguration
from
"@/views/system/datasource/DsConfiguration"
;
import
PluginCom
from
'@/views/system/plugin/PluginCom'
import
{
deleteDriverFile
,
listDriverDetails
,
updateDriver
}
from
"@/api/system/datasource"
;
import
{
delUser
}
from
"@/api/system/user"
;
import
{
$alert
}
from
"@/utils/message"
;
import
store
from
"@/store"
;
import
{
getToken
}
from
"@/utils/auth"
;
const
token
=
getToken
()
export
default
{
name
:
'DriverForm'
,
components
:
{
DsConfiguration
,
LayoutContent
,
ApiHttpRequestForm
,
PluginCom
},
props
:
{
params
:
{
type
:
Object
,
default
:
null
},
tData
:
{
type
:
Array
,
default
:
null
},
dsTypes
:
{
type
:
Array
,
default
:
null
}
},
data
()
{
return
{
disabled
:
false
,
driverForm
:
{
id
:
''
,
name
:
''
,
desc
:
''
,
type
:
''
,
driverClass
:
''
},
datasourceType
:
{},
driverClassList
:
[],
rule
:
{
name
:
[{
required
:
true
,
message
:
i18n
.
t
(
'datasource.input_name'
),
trigger
:
'blur'
},
{
min
:
2
,
max
:
50
,
message
:
i18n
.
t
(
'datasource.input_limit_2_25'
,
[
2
,
25
]),
trigger
:
'blur'
}],
desc
:
[{
required
:
true
,
message
:
i18n
.
t
(
'datasource.input_name'
),
trigger
:
'blur'
},
{
min
:
2
,
max
:
200
,
message
:
i18n
.
t
(
'datasource.input_limit_2_25'
,
[
2
,
25
]),
trigger
:
'blur'
}],
type
:
[{
required
:
true
,
message
:
i18n
.
t
(
'datasource.please_choose_type'
),
trigger
:
'blur'
}]
},
canEdit
:
false
,
driverFiles
:
[],
btnDisabled
:
false
,
buttons
:
[
{
label
:
this
.
$t
(
'commons.delete'
),
icon
:
'el-icon-delete'
,
type
:
'danger'
,
click
:
this
.
deleteDriverFile
,
disabled
:
this
.
btnDisabled
}
],
uploading
:
false
,
baseUrl
:
process
.
env
.
VUE_APP_BASE_API
,
headers
:
{
Authorization
:
token
,
'Accept-Language'
:
i18n
.
locale
.
replace
(
'_'
,
'-'
)
},
fileList
:
[]
}
},
created
()
{
const
row
=
this
.
params
this
.
driverForm
=
JSON
.
parse
(
JSON
.
stringify
(
row
))
this
.
disabled
=
this
.
params
&&
this
.
params
.
id
&&
this
.
params
.
showModel
&&
this
.
params
.
showModel
===
'show'
&&
!
this
.
canEdit
this
.
listDriverDetails
()
},
mounted
()
{
},
methods
:
{
beforeUpload
(
file
)
{
this
.
uploading
=
true
},
uploadSuccess
(
response
,
file
,
fileList
)
{
this
.
uploading
=
false
this
.
listDriverDetails
()
},
uploadFail
(
response
,
file
,
fileList
)
{
let
myError
=
response
.
toString
()
myError
=
myError
.
replace
(
'Error: '
,
''
)
if
(
myError
.
indexOf
(
'AuthenticationException'
)
>=
0
){
const
message
=
i18n
.
t
(
'login.tokenError'
)
$alert
(
message
,
()
=>
{
store
.
dispatch
(
'user/logout'
).
then
(()
=>
{
location
.
reload
()
})
},
{
confirmButtonText
:
i18n
.
t
(
'login.re_login'
),
showClose
:
false
})
return
}
const
errorMessage
=
JSON
.
parse
(
myError
).
message
this
.
uploading
=
false
this
.
$message
({
type
:
'error'
,
message
:
errorMessage
,
showClose
:
true
})
},
deleteDriverFile
(
row
){
deleteDriverFile
(
row
).
then
(
res
=>
{
this
.
$success
(
this
.
$t
(
'commons.delete_success'
))
this
.
listDriverDetails
()
})
},
listDriverDetails
(){
listDriverDetails
(
this
.
driverForm
.
id
).
then
(
res
=>
{
this
.
driverFiles
=
res
.
data
this
.
driverClassList
=
[]
this
.
driverFiles
.
forEach
(
driverFile
=>
{
this
.
driverClassList
=
this
.
driverClassList
.
concat
(
driverFile
.
driverClass
.
split
(
','
))
})
})
},
changeEdit
()
{
this
.
canEdit
=
true
this
.
formType
=
'modify'
this
.
disabled
=
this
.
params
&&
this
.
params
.
id
&&
this
.
params
.
showModel
&&
this
.
params
.
showModel
===
'show'
&&
!
this
.
canEdit
},
save
(){
updateDriver
(
this
.
driverForm
).
then
(
res
=>
{
this
.
$success
(
i18n
.
t
(
'commons.success'
))
this
.
canEdit
=
false
})
},
reset
()
{
this
.
$refs
.
dsForm
.
resetFields
()
},
backToList
()
{
this
.
$emit
(
'switch-component'
,
{})
},
refreshType
(
form
)
{
this
.
$emit
(
'refresh-type'
,
DsForm
)
},
handleClick
(
tab
,
event
)
{}
}
}
</
script
>
<
style
scoped
>
.el-input
{
width
:
300px
;
}
.el-select
{
width
:
300px
;
}
.ms-http-input
{
width
:
500px
;
margin-top
:
5px
;
}
.tip
{
padding
:
3px
5px
;
font-size
:
16px
;
border-radius
:
0
;
border-left
:
4px
solid
#409EFF
;
margin
:
5px
5px
10px
5px
;
}
.el-select
>>>
input
{
padding-right
:
10px
;
}
.el-select
>>>
.el-input__suffix
{
right
:
0
;
}
.dialog-css
>>>
.el-dialog__header
{
padding
:
10px
20px
0px
;
}
.dialog-css
>>>
.el-dialog__body
{
padding
:
10px
20px
10px
;
}
.dialog-footer
>>>
.el-dialog__footer
{
padding
:
10px
10px
10px
;
}
</
style
>
frontend/src/views/system/datasource/DsConfiguration.vue
浏览文件 @
544ea07e
...
...
@@ -3,13 +3,13 @@
<el-row>
<el-col>
<el-form
ref=
"DsConfig"
:model=
"form"
:rules=
"rule"
size=
"small"
:disabled=
"disabled"
label-width=
"180px"
label-position=
"right"
ref=
"DsConfig"
:model=
"form"
:rules=
"rule"
size=
"small"
:disabled=
"disabled"
label-width=
"180px"
label-position=
"right"
>
<el-form-item
v-if=
"form.type == 'api'"
:label=
"$t('datasource.data_table')"
>
<el-col>
...
...
@@ -77,7 +77,8 @@
</div>
<el-form-item
:label=
"$t('datasource.data_path')"
prop=
"dataPath"
>
<el-input
:placeholder=
"$t('datasource.data_path_desc')"
v-model=
"apiItem.dataPath"
autocomplete=
"off"
/>
<el-input
:placeholder=
"$t('datasource.data_path_desc')"
v-model=
"apiItem.dataPath"
autocomplete=
"off"
/>
</el-form-item>
</el-form>
</el-row>
...
...
@@ -103,7 +104,10 @@
</el-tabs>
</el-row>
<div
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"next"
:disabled=
"disabledNext"
v-show=
"active === 1"
>
{{ $t('fu.steps.next') }}
</el-button>
<el-button
@
click=
"next"
:disabled=
"disabledNext"
v-show=
"active === 1"
>
{{
$t('fu.steps.next')
}}
</el-button>
<el-button
@
click=
"before"
v-show=
"active === 2"
>
{{ $t('fu.steps.prev') }}
</el-button>
<el-button
@
click=
"saveItem"
v-show=
"active === 2"
>
{{ $t('commons.save') }}
</el-button>
</div>
...
...
@@ -125,20 +129,55 @@
<el-input
v-model=
"form.configuration.dataBase"
autocomplete=
"off"
/>
</el-form-item>
<el-form-item
v-if=
"form.type=='oracle' && form.type !== 'api'"
:label=
"$t('datasource.oracle_connection_type')"
<el-form-item
v-if=
"form.type=='oracle' && form.type !== 'api'"
:label=
"$t('datasource.oracle_connection_type')"
prop=
"configuration.connectionType"
>
<el-radio
v-model=
"form.configuration.connectionType"
label=
"sid"
>
{{ $t('datasource.oracle_sid') }}
</el-radio>
<el-radio
v-model=
"form.configuration.connectionType"
label=
"sid"
>
{{
$t('datasource.oracle_sid')
}}
</el-radio>
<el-radio
v-model=
"form.configuration.connectionType"
label=
"serviceName"
>
{{ $t('datasource.oracle_service_name') }}
</el-radio>
</el-form-item>
<el-form-item
v-if=
"form.type !== 'es' && form.type !== 'api'"
<el-form-item
v-if=
"form.type=='hive' "
:label=
"$t('datasource.auth_method')"
>
<el-select
v-model=
"form.configuration.authMethod"
class=
"select-width"
>
<el-option
v-for=
"item in authMethodList"
:key=
"item.id"
:label=
"item.label"
:value=
"item.id"
/>
</el-select>
</el-form-item>
<el-form-item
v-if=
"form.type === 'hive' && form.configuration.authMethod === 'kerberos'"
:label=
"$t('datasource.client_principal')"
>
<el-input
v-model=
"form.configuration.username"
autocomplete=
"off"
/>
</el-form-item>
<el-form-item
v-if=
"form.type === 'hive' && form.configuration.authMethod === 'kerberos'"
:label=
"$t('datasource.keytab_Key_path')"
>
<el-input
v-model=
"form.configuration.password"
autocomplete=
"off"
show-password
/>
<p>
{{$t('datasource.kerbers_info')}}
</p>
</el-form-item>
<span
v-if=
"form.type === 'hive' && form.configuration.authMethod === 'kerberos'"
>
</span>
<el-form-item
v-if=
"form.type !== 'es' && form.type !== 'api' && form.configuration.authMethod !== 'kerberos'"
:label=
"$t('datasource.user_name')"
>
<el-input
v-model=
"form.configuration.username"
autocomplete=
"off"
/>
</el-form-item>
<el-form-item
v-if=
"form.type !== 'es' && form.type !== 'api'"
<el-form-item
v-if=
"form.type !== 'es' && form.type !== 'api'
&& form.configuration.authMethod !== 'kerberos'
"
:label=
"$t('datasource.password')"
>
<el-input
v-model=
"form.configuration.password"
autocomplete=
"off"
show-password
/>
</el-form-item>
...
...
@@ -164,21 +203,26 @@
</el-form-item>
<el-form-item
v-if=
"form.type=='oracle' || form.type=='sqlServer' || form.type=='pg' || form.type=='redshift' || form.type=='db2'"
>
<el-button
icon=
"el-icon-plus"
size=
"mini"
@
click=
"getSchema()"
>
{{ $t('datasource.get_schema') }}
</el-button>
v-if=
"form.type=='oracle' || form.type=='sqlServer' || form.type=='pg' || form.type=='redshift' || form.type=='db2'"
>
<el-button
icon=
"el-icon-plus"
size=
"mini"
@
click=
"getSchema()"
>
{{
$t('datasource.get_schema')
}}
</el-button>
</el-form-item>
<el-form-item
v-if=
"form.type=='oracle' || form.type=='sqlServer' || form.type=='pg' || form.type=='redshift' || form.type=='db2'"
:label=
"$t('datasource.schema')"
>
<el-select
v-model=
"form.configuration.schema"
filterable
:placeholder=
"$t('datasource.please_choose_schema')"
v-if=
"form.type=='oracle' || form.type=='sqlServer' || form.type=='pg' || form.type=='redshift' || form.type=='db2'"
:label=
"$t('datasource.schema')"
>
<el-select
v-model=
"form.configuration.schema"
filterable
:placeholder=
"$t('datasource.please_choose_schema')"
class=
"select-width"
>
<el-option
v-for=
"item in schemas"
:key=
"item"
:label=
"item"
:value=
"item"
/>
</el-select>
</el-form-item>
<el-form-item
v-if=
"form.type=='oracle'"
:label=
"$t('datasource.charset')"
>
<el-select
v-model=
"form.configuration.charset"
filterable
:placeholder=
"$t('datasource.please_choose_charset')"
<el-select
v-model=
"form.configuration.charset"
filterable
:placeholder=
"$t('datasource.please_choose_charset')"
class=
"select-width"
>
<el-option
v-for=
"item in datasourceType.charset"
:key=
"item"
:label=
"item"
:value=
"item"
/>
</el-select>
...
...
@@ -208,7 +252,6 @@
<
script
>
import
i18n
from
"@/lang"
;
import
{
checkApiDatasource
,
getSchema
}
from
"@/api/system/datasource"
;
import
ApiHttpRequestForm
from
'@/views/system/datasource/ApiHttpRequestForm'
...
...
@@ -367,15 +410,20 @@ export default {
{
label
:
this
.
$t
(
'dataset.location'
),
value
:
5
}
],
height
:
500
,
disabledNext
:
false
disabledNext
:
false
,
authMethodList
:
[
{
id
:
'passwd'
,
label
:
i18n
.
t
(
'datasource.passwd'
)
},
{
id
:
'kerberos'
,
label
:
'Kerberos'
}]
}
},
created
()
{
},
watch
:
{
},
watch
:
{},
methods
:
{
getSchema
()
{
this
.
$refs
.
DsConfig
.
validate
(
valid
=>
{
...
...
frontend/src/views/system/datasource/
f
orm.vue
→
frontend/src/views/system/datasource/
DsF
orm.vue
浏览文件 @
544ea07e
...
...
@@ -41,6 +41,23 @@
</el-select>
</el-form-item>
<el-form-item
v-if=
"datasourceType.isJdbc"
:label=
"$t('driver.driver')"
>
<el-select
v-model=
"form.configuration.customDriver"
:placeholder=
"$t('driver.please_choose_driver')"
class=
"select-width"
filterable
>
<el-option
v-for=
"item in driverList"
:key=
"item.id"
:label=
"item.name"
:value=
"item.id"
:disabled=
"!item.driverClass"
/>
</el-select>
</el-form-item>
<ds-configuration
ref=
"dsConfig"
v-if=
"!datasourceType.isPlugin"
:datasource-type=
'datasourceType'
:form=
"form"
:disabled=
"params && params.id && params.showModel && params.showModel === 'show' && !canEdit"
></ds-configuration>
<plugin-com
ref=
"pluginDsConfig"
v-if=
"datasourceType.isPlugin"
:component-name=
"datasourceType.type"
:obj=
"{form, disabled }"
/>
...
...
@@ -70,7 +87,15 @@
<
script
>
import
LayoutContent
from
'@/components/business/LayoutContent'
import
{
addDs
,
editDs
,
getSchema
,
validateDs
,
validateDsById
,
checkApiDatasource
}
from
'@/api/system/datasource'
import
{
addDs
,
editDs
,
getSchema
,
validateDs
,
validateDsById
,
checkApiDatasource
,
listDriverByType
}
from
'@/api/system/datasource'
import
{
$confirm
}
from
'@/utils/message'
import
i18n
from
'@/lang/index'
import
ApiHttpRequestForm
from
'@/views/system/datasource/ApiHttpRequestForm'
...
...
@@ -227,7 +252,8 @@ export default {
{
label
:
this
.
$t
(
'dataset.location'
),
value
:
5
}
],
height
:
500
,
disabledNext
:
false
disabledNext
:
false
,
driverList
:
[]
}
},
...
...
@@ -235,7 +261,7 @@ export default {
if
(
this
.
params
&&
this
.
params
.
id
)
{
const
row
=
this
.
params
this
.
edit
(
row
)
this
.
changeType
()
this
.
changeType
(
true
)
}
else
{
this
.
create
()
if
(
this
.
params
&&
this
.
params
.
type
)
{
...
...
@@ -492,13 +518,19 @@ export default {
}
})
},
changeType
()
{
changeType
(
init
)
{
for
(
let
i
=
0
;
i
<
this
.
dsTypes
.
length
;
i
++
)
{
if
(
this
.
dsTypes
[
i
].
type
===
this
.
form
.
type
)
{
if
(
this
.
form
.
type
!==
'api'
){
if
(
this
.
form
.
type
!==
'api'
&&
!
init
){
this
.
form
.
configuration
.
extraParams
=
this
.
dsTypes
[
i
].
extraParams
}
this
.
datasourceType
=
this
.
dsTypes
[
i
]
if
(
this
.
datasourceType
.
isJdbc
){
listDriverByType
(
this
.
datasourceType
.
type
).
then
(
res
=>
{
this
.
driverList
=
res
.
data
this
.
driverList
.
push
({
id
:
'default'
,
name
:
'Default'
,
driverClass
:
'Default'
})
})
}
}
}
},
...
...
frontend/src/views/system/datasource/DsMain.vue
浏览文件 @
544ea07e
...
...
@@ -22,7 +22,8 @@ import DeMainContainer from '@/components/dataease/DeMainContainer'
import
DeContainer
from
'@/components/dataease/DeContainer'
import
DeAsideContainer
from
'@/components/dataease/DeAsideContainer'
import
DsTree
from
'./DsTree'
import
DsForm
from
'./form'
import
DsForm
from
'./DsForm'
import
DriverForm
from
"./DriverForm"
;
import
DataHome
from
'./DataHome'
export
default
{
...
...
@@ -56,6 +57,12 @@ export default {
this
.
tData
=
tData
this
.
dsTypes
=
dsTypes
break
case
'DriverForm'
:
this
.
component
=
DriverForm
this
.
param
=
componentParam
this
.
tData
=
tData
this
.
dsTypes
=
dsTypes
break
default
:
this
.
component
=
DataHome
this
.
param
=
null
...
...
frontend/src/views/system/datasource/DsTree.vue
浏览文件 @
544ea07e
<
template
xmlns:el-col=
"http://www.w3.org/1999/html"
>
<el-col
class=
"tree-style"
>
<el-col>
<el-row
class=
"title-css"
>
<span
class=
"title-text"
>
{{
$t
(
'commons.datasource'
)
}}
</span>
<el-button
icon=
"el-icon-plus"
type=
"text"
size=
"mini"
style=
"float: right;"
@
click=
"addFolder"
/>
<el-row>
<el-tabs
v-model=
"showView"
@
tab-click=
"changeTab"
type=
"card"
>
<el-tab-pane
v-for=
"(item, index) in editableTabs"
:key=
"item.name"
:label=
"item.title"
:name=
"item.name"
>
</el-tab-pane>
</el-tabs>
</el-row>
<el-row>
<el-button
icon=
"el-icon-plus"
type=
"text"
size=
"mini"
style=
"float: left;"
@
click=
"addFolder"
/>
</el-row>
<el-divider
/>
<el-row>
<el-form>
<el-form-item
class=
"form-item"
>
...
...
@@ -44,16 +39,16 @@
<span
slot-scope=
"
{ node, data }" class="custom-tree-node-list father">
<span
style=
"display: flex;flex: 1;width: 0;"
>
<span
v-if=
"data.type !== 'folder' && data.status !== 'Error' && data.status !== 'Warning'"
>
<svg-icon
icon-class=
"datasource"
class=
"ds-icon-scene"
/>
<svg-icon
icon-class=
"datasource"
class=
"ds-icon-scene"
/>
</span>
<span
v-if=
"data.status === 'Error'"
>
<svg-icon
icon-class=
"exclamationmark"
class=
"ds-icon-scene"
/>
<svg-icon
icon-class=
"exclamationmark"
class=
"ds-icon-scene"
/>
</span>
<span
v-if=
"data.status === 'Warning'"
>
<svg-icon
icon-class=
"exclamationmark2"
class=
"ds-icon-scene"
/>
<svg-icon
icon-class=
"exclamationmark2"
class=
"ds-icon-scene"
/>
</span>
<span
v-if=
"data.type === 'folder'"
>
<i
class=
"el-icon-folder"
/>
<i
class=
"el-icon-folder"
/>
</span>
<span
v-if=
" data.status === 'Error'"
...
...
@@ -110,11 +105,57 @@
</el-tree>
</div>
</el-col>
<el-dialog
v-dialogDrag
:title=
"dialogTitle"
:visible=
"editDriver"
:show-close=
"false"
width=
"50%"
append-to-body
>
<el-form
ref=
"driverForm"
:model=
"driverForm"
label-position=
"right"
label-width=
"100px"
:rules=
"rule"
>
<el-form-item
:label=
"$t('commons.name')"
prop=
"name"
>
<el-input
v-model=
"driverForm.name"
/>
</el-form-item>
<el-form-item
:label=
"$t('commons.description')"
prop=
"desc"
>
<el-input
v-model=
"driverForm.desc"
/>
</el-form-item>
<el-form-item
:label=
"$t('datasource.type')"
prop=
"type"
>
<el-select
v-model=
"driverForm.type"
:placeholder=
"$t('datasource.please_choose_type')"
class=
"select-width"
:disabled=
"disabledModifyType"
filterable
>
<el-option
v-for=
"item in dsTypes"
:key=
"item.type"
:label=
"item.name"
:value=
"item.type"
/>
</el-select>
</el-form-item>
</el-form>
<div
slot=
"footer"
class=
"dialog-footer"
>
<el-button
size=
"mini"
@
click=
"close()"
>
{{
$t
(
'commons.cancel'
)
}}
</el-button>
<el-button
type=
"primary"
size=
"mini"
@
click=
"saveDriver(driverForm)"
>
{{
$t
(
'commons.save'
)
}}
</el-button>
</div>
</el-dialog>
</el-col>
</el-col>
</
template
>
<
script
>
import
{
listDatasource
,
listDatasourceByType
,
delDs
,
listDatasourceType
}
from
'@/api/system/datasource'
import
{
mapGetters
}
from
'vuex'
import
i18n
from
"@/lang"
;
import
{
listDatasource
,
listDatasourceByType
,
delDs
,
listDatasourceType
,
listDrivers
,
addDriver
,
delDriver
,
listDriverByType
}
from
'@/api/system/datasource'
export
default
{
name
:
'DsTree'
,
...
...
@@ -130,7 +171,27 @@ export default {
tData
:
[],
dsTypes
:
[],
showSearchInput
:
false
,
key
:
''
key
:
''
,
showView
:
'Datasource'
,
dialogTitle
:
''
,
editDriver
:
false
,
driverForm
:
{
name
:
''
,
desc
:
''
,
type
:
''
},
disabledModifyType
:
false
,
rule
:
{
name
:
[{
required
:
true
,
message
:
i18n
.
t
(
'datasource.input_name'
),
trigger
:
'blur'
},
{
min
:
2
,
max
:
50
,
message
:
i18n
.
t
(
'datasource.input_limit_2_25'
,
[
2
,
25
]),
trigger
:
'blur'
}],
desc
:
[{
required
:
true
,
message
:
i18n
.
t
(
'datasource.input_name'
),
trigger
:
'blur'
},
{
min
:
2
,
max
:
200
,
message
:
i18n
.
t
(
'datasource.input_limit_2_25'
,
[
2
,
25
]),
trigger
:
'blur'
}],
type
:
[{
required
:
true
,
message
:
i18n
.
t
(
'datasource.please_choose_type'
),
trigger
:
'blur'
}]
},
editableTabs
:
[{
title
:
i18n
.
t
(
'commons.datasource'
),
name
:
'Datasource'
}]
}
},
watch
:
{
...
...
@@ -138,14 +199,22 @@ export default {
this
.
$refs
.
myDsTree
.
filter
(
val
)
}
},
computed
:
{
...
mapGetters
([
'user'
])
},
created
()
{
this
.
queryTreeDatas
()
this
.
datasourceTypes
()
if
(
this
.
user
.
isAdmin
)
{
this
.
editableTabs
.
push
({
title
:
i18n
.
t
(
'driver.mgm'
),
name
:
'Driver'
})
}
},
// mounted() {
// this.queryTreeDatas()
// this.datasourceTypes()
// },
methods
:
{
filterNode
(
value
,
data
)
{
if
(
!
value
)
return
true
...
...
@@ -159,9 +228,16 @@ export default {
this
.
showSearchInput
=
false
},
queryTreeDatas
()
{
listDatasource
().
then
(
res
=>
{
this
.
tData
=
this
.
buildTree
(
res
.
data
)
})
if
(
this
.
showView
===
'Datasource'
)
{
listDatasource
().
then
(
res
=>
{
this
.
tData
=
this
.
buildTree
(
res
.
data
)
})
}
if
(
this
.
showView
===
'Driver'
)
{
listDrivers
().
then
(
res
=>
{
this
.
tData
=
this
.
buildTree
(
res
.
data
)
})
}
},
datasourceTypes
()
{
listDatasourceType
().
then
(
res
=>
{
...
...
@@ -169,8 +245,9 @@ export default {
})
},
refreshType
(
datasource
)
{
const
method
=
this
.
showView
===
'Datasource'
?
listDatasourceByType
:
listDriverByType
let
typeData
=
[]
listDatasourceByType
(
datasource
.
type
).
then
(
res
=>
{
method
(
datasource
.
type
).
then
(
res
=>
{
typeData
=
this
.
buildTree
(
res
.
data
)
if
(
typeData
.
length
===
0
)
{
const
index
=
this
.
tData
.
findIndex
(
item
=>
{
...
...
@@ -220,10 +297,31 @@ export default {
},
addFolder
()
{
this
.
switchMain
(
'DsForm'
,
{},
this
.
tData
,
this
.
dsTypes
)
if
(
this
.
showView
===
'Driver'
)
{
this
.
dialogTitle
=
this
.
$t
(
'driver.driver'
)
this
.
editDriver
=
true
// this.switchMain('DriverForm', {}, this.tData, this.dsTypes)
}
else
{
this
.
switchMain
(
'DsForm'
,
{},
this
.
tData
,
this
.
dsTypes
)
}
},
changeTab
()
{
this
.
expandedArray
=
[]
this
.
tData
=
[]
this
.
queryTreeDatas
()
},
addFolderWithType
(
data
)
{
this
.
switchMain
(
'DsForm'
,
{
type
:
data
.
id
},
this
.
tData
,
this
.
dsTypes
)
if
(
this
.
showView
===
'Driver'
)
{
this
.
driverForm
.
type
=
data
.
id
this
.
dialogTitle
=
this
.
$t
(
'driver.driver'
)
// this.editDriver = false
this
.
editDriver
=
true
// this.switchMain(switchMain'DriverForm', {}, this.tData, this.dsTypes)
}
else
{
this
.
switchMain
(
'DsForm'
,
{
type
:
data
.
id
},
this
.
tData
,
this
.
dsTypes
)
}
},
nodeClick
(
node
,
data
)
{
if
(
node
.
type
===
'folder'
)
return
...
...
@@ -231,7 +329,7 @@ export default {
},
clickFileMore
(
param
)
{
const
{
optType
,
data
}
=
param
const
{
optType
,
data
}
=
param
switch
(
optType
)
{
case
'edit'
:
this
.
edit
(
data
)
...
...
@@ -244,14 +342,18 @@ export default {
}
},
beforeClickFile
(
optType
,
data
,
node
)
{
return
{
optType
,
data
,
node
}
return
{
optType
,
data
,
node
}
},
edit
(
row
)
{
this
.
switchMain
(
'DsForm'
,
row
,
this
.
tData
,
this
.
dsTypes
)
},
showInfo
(
row
)
{
const
param
=
{
...
row
.
data
,
...{
showModel
:
'show'
}}
this
.
switchMain
(
'DsForm'
,
param
,
this
.
tData
,
this
.
dsTypes
)
const
param
=
{...
row
.
data
,
...{
showModel
:
'show'
}}
if
(
this
.
showView
===
'Datasource'
)
{
this
.
switchMain
(
'DsForm'
,
param
,
this
.
tData
,
this
.
dsTypes
)
}
else
{
this
.
switchMain
(
'DriverForm'
,
param
,
this
.
tData
,
this
.
dsTypes
)
}
},
_handleDelete
(
datasource
)
{
this
.
$confirm
(
this
.
$t
(
'datasource.delete_warning'
),
''
,
{
...
...
@@ -259,8 +361,9 @@ export default {
cancelButtonText
:
this
.
$t
(
'commons.cancel'
),
type
:
'warning'
}).
then
(()
=>
{
const
parma
=
{
type
:
datasource
.
type
,
id
:
datasource
.
id
}
delDs
(
parma
).
then
(
res
=>
{
const
parma
=
{
type
:
datasource
.
type
,
id
:
datasource
.
id
}
const
method
=
this
.
showView
===
'Datasource'
?
delDs
:
delDriver
method
(
parma
).
then
(
res
=>
{
if
(
res
.
success
)
{
this
.
$success
(
this
.
$t
(
'commons.delete_success'
))
this
.
switchMain
(
'DataHome'
,
{},
this
.
tData
,
this
.
dsTypes
)
...
...
@@ -301,7 +404,33 @@ export default {
})
})
})
}
},
close
()
{
this
.
$refs
[
'driverForm'
].
resetFields
()
this
.
editDriver
=
false
this
.
driverForm
=
{
name
:
''
,
desc
:
''
,
type
:
''
}
},
saveDriver
(
driverForm
)
{
this
.
$refs
[
'driverForm'
].
validate
((
valid
)
=>
{
if
(
valid
)
{
addDriver
(
driverForm
).
then
(
res
=>
{
this
.
$message
({
message
:
this
.
$t
(
'dataset.save_success'
),
type
:
'success'
,
showClose
:
true
})
this
.
refreshType
(
driverForm
)
this
.
close
()
})
}
else
{
return
false
}
})
},
}
}
</
script
>
...
...
frontend/src/views/system/plugin/index.vue
浏览文件 @
544ea07e
...
...
@@ -8,7 +8,6 @@
@
search=
"search"
>
<template
#
toolbar
>
<el-upload
:action=
"baseUrl+'api/plugin/upload'"
:multiple=
"false"
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论