提交 d3b15391 authored 作者: taojinlong's avatar taojinlong

datasource

上级 ce527d00
package io.dataease.base.domain;
import java.io.Serializable;
import lombok.Data;
@Data
public class Datasource implements Serializable {
private String id;
private String name;
private String desc;
private String type;
private Long createTime;
private Long updateTime;
private String configuration;
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
package io.dataease.base.mapper;
import io.dataease.base.domain.Datasource;
import io.dataease.base.domain.DatasourceExample;
import java.util.List;
import org.apache.ibatis.annotations.Param;
public interface DatasourceMapper {
long countByExample(DatasourceExample example);
int deleteByExample(DatasourceExample example);
int deleteByPrimaryKey(String id);
int insert(Datasource record);
int insertSelective(Datasource record);
List<Datasource> selectByExampleWithBLOBs(DatasourceExample example);
List<Datasource> selectByExample(DatasourceExample example);
Datasource selectByPrimaryKey(String id);
int updateByExampleSelective(@Param("record") Datasource record, @Param("example") DatasourceExample example);
int updateByExampleWithBLOBs(@Param("record") Datasource record, @Param("example") DatasourceExample example);
int updateByExample(@Param("record") Datasource record, @Param("example") DatasourceExample example);
int updateByPrimaryKeySelective(Datasource record);
int updateByPrimaryKeyWithBLOBs(Datasource record);
int updateByPrimaryKey(Datasource record);
}
\ No newline at end of file
package io.dataease.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
package io.dataease.datasource.constants;
public enum DatasourceTypes {
mysql
}
package io.dataease.datasource.controller;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import io.dataease.base.domain.Datasource;
import io.dataease.commons.utils.PageUtils;
import io.dataease.commons.utils.Pager;
import io.dataease.datasource.service.DatasourceService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
@RequestMapping("datasource")
@RestController
public class DatasourceController {
@Resource
private DatasourceService datasourceService;
@PostMapping("/add")
public Datasource addDatasource(@RequestBody Datasource Datasource) {
return datasourceService.addDatasource(Datasource);
}
@PostMapping("/validate")
public void validate(@RequestBody Datasource Datasource) throws Exception{
datasourceService.validate(Datasource);
}
@GetMapping("/list")
public List<Datasource> getDatasourceList() throws Exception {
return datasourceService.getDatasourceList(new Datasource());
}
@PostMapping("/list/{goPage}/{pageSize}")
public Pager<List<Datasource>> getDatasourceList(@RequestBody Datasource request, @PathVariable int goPage, @PathVariable int pageSize) throws Exception{
Page<Object> page = PageHelper.startPage(goPage, pageSize, true);
return PageUtils.setPageInfo(page, datasourceService.getDatasourceList(request));
}
@GetMapping("/delete/{datasourceID}")
public void deleteDatasource(@PathVariable(value = "datasourceID") String datasourceID) {
datasourceService.deleteDatasource(datasourceID);
}
@PostMapping("/update")
public void updateDatasource(@RequestBody Datasource Datasource) {
datasourceService.updateDatasource(Datasource);
}
}
package io.dataease.datasource.dto;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;
@Getter
@Setter
public class MysqlConfigrationDTO {
private String host;
private Integer port;
private String username;
private String password;
private String jdbc;
private String dataBase;
private String driver = "com.mysql.cj.jdbc.Driver";
public String getJdbc(){
if(StringUtils.isNotEmpty(jdbc)){
return jdbc;
}else {
return "jdbc:mysql://HOSTNAME:PORT/DATABASE".replace("HOSTNAME", host).replace("PORT", port.toString()).replace("DATABASE", dataBase);
}
}
}
package io.dataease.datasource.provider;
import java.util.List;
public abstract class DatasourceProvider {
protected String dataSourceConfigration;
protected String type;
public String getQuery() {
return query;
}
public void setQuery(String query) {
this.query = query;
}
protected String query;
private int resultLimit = 30000;
public String getDataSourceConfigration() {
return dataSourceConfigration;
}
public void setDataSourceConfigration(String dataSourceConfigration) {
this.dataSourceConfigration = dataSourceConfigration;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
abstract public List<String[]> getData() throws Exception;
abstract public List<String> getTables() throws Exception;
public void test() throws Exception {
getData();
}
}
package io.dataease.datasource.provider;
import com.google.gson.Gson;
import io.dataease.datasource.constants.DatasourceTypes;
import io.dataease.datasource.dto.MysqlConfigrationDTO;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.sql.*;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import io.dataease.datasource.constants.DatasourceTypes.*;
import java.util.Properties;
@Service("jdbc")
public class JdbcProvider extends DatasourceProvider{
@Override
public List<String[]> getData() throws Exception {
List<String[]> list = new LinkedList<>();
try (
Connection connection = getConnection();
Statement stat = connection.createStatement();
ResultSet rs = stat.executeQuery(getQuery())
) {
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
while (rs.next()) {
String[] row = new String[columnCount];
for (int j = 0; j < columnCount; j++) {
int columType = metaData.getColumnType(j + 1);
switch (columType) {
case java.sql.Types.DATE:
row[j] = rs.getDate(j + 1).toString();
break;
default:
row[j] = rs.getString(j + 1);
break;
}
}
list.add(row);
}
} catch (Exception e) {
throw new Exception("ERROR:" + e.getMessage(), e);
}
return list;
}
@Override
public List<String> getTables() throws Exception {
List<String> tables = new ArrayList<>();
String queryStr = "show tables";
try (Connection con = getConnection(); Statement ps = con.createStatement()) {
ResultSet resultSet = ps.executeQuery(queryStr);
while (resultSet.next()){
tables.add(resultSet.getString(1));
}
} catch (Exception e) {
throw new Exception("ERROR: " + e.getMessage(), e);
}
return tables;
}
@Override
public void test() throws Exception {
String queryStr = "show tables";
try (Connection con = getConnection(); Statement ps = con.createStatement()) {
ResultSet resultSet = ps.executeQuery(queryStr);
} catch (Exception e) {
throw new Exception("ERROR: " + e.getMessage(), e);
}
}
private Connection getConnection() throws Exception {
String username = null;
String password = null;
String driver = null;
String jdbcurl = null;
DatasourceTypes datasourceType = DatasourceTypes.valueOf(getType());
switch (datasourceType){
case mysql:
MysqlConfigrationDTO mysqlConfigrationDTO = new Gson().fromJson(getDataSourceConfigration(), MysqlConfigrationDTO.class);
username = mysqlConfigrationDTO.getUsername();
password = mysqlConfigrationDTO.getPassword();
driver = mysqlConfigrationDTO.getDriver();
jdbcurl = mysqlConfigrationDTO.getJdbc();
break;
default:
break;
}
Class.forName(driver);
Properties props = new Properties();
props.setProperty("user", username);
if (StringUtils.isNotBlank(password)) {
props.setProperty("password", password);
}
return DriverManager.getConnection(jdbcurl, props);
}
}
package io.dataease.datasource.provider;
import io.dataease.datasource.constants.DatasourceTypes;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class ProviderFactory implements ApplicationContextAware {
private static ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.context = applicationContext;
}
public static DatasourceProvider getProvider(String type){
DatasourceTypes datasourceType = DatasourceTypes.valueOf(type);
switch (datasourceType){
case mysql:
return context.getBean("jdbc", DatasourceProvider.class);
default:
return context.getBean("jdbc", DatasourceProvider.class);
}
}
}
package io.dataease.datasource.service;
import com.google.gson.Gson;
import io.dataease.base.domain.*;
import io.dataease.base.mapper.*;
import io.dataease.datasource.dto.MysqlConfigrationDTO;
import io.dataease.datasource.provider.DatasourceProvider;
import io.dataease.datasource.provider.JdbcProvider;
import io.dataease.datasource.provider.ProviderFactory;
import org.apache.commons.lang3.StringUtils;
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.UUID;
import java.util.stream.Collectors;
@Service
@Transactional(rollbackFor = Exception.class)
public class DatasourceService {
@Resource
private DatasourceMapper datasourceMapper;
public Datasource addDatasource(Datasource datasource) {
long currentTimeMillis = System.currentTimeMillis();
datasource.setId(UUID.randomUUID().toString());
datasource.setUpdateTime(currentTimeMillis);
datasource.setCreateTime(currentTimeMillis);
datasourceMapper.insertSelective(datasource);
return datasource;
}
public List<Datasource> getDatasourceList(Datasource request)throws Exception{
DatasourceExample example = new DatasourceExample();
DatasourceExample.Criteria criteria = example.createCriteria();
if (StringUtils.isNotBlank(request.getName())) {
criteria.andNameLike(StringUtils.wrapIfMissing(request.getName(), "%"));
}
if (StringUtils.isNotBlank(request.getType())) {
criteria.andTypeEqualTo(request.getType());
}
example.setOrderByClause("update_time desc");
return datasourceMapper.selectByExample(example);
}
public void deleteDatasource(String datasourceId) {
datasourceMapper.deleteByPrimaryKey(datasourceId);
}
public void updateDatasource(Datasource datasource) {
datasource.setCreateTime(null);
datasource.setUpdateTime(System.currentTimeMillis());
datasourceMapper.updateByPrimaryKeySelective(datasource);
}
public void validate(Datasource datasource)throws Exception {
DatasourceProvider datasourceProvider = ProviderFactory.getProvider(datasource.getType());
datasourceProvider.setDataSourceConfigration(datasource.getConfiguration());
datasourceProvider.test();
}
}
CREATE TABLE `datasource` (
`id` varchar(50) NOT NULL DEFAULT '' COMMENT 'ID',
`name` varchar(50) NOT NULL COMMENT '名称',
`desc` varchar(50) NOT NULL COMMENT '描述',
`type` varchar(50) NOT NULL COMMENT '类型',
`configuration` longtext NOT NULL COMMENT '详细信息',
`create_time` bigint(13) NOT NULL COMMENT 'Create timestamp',
`update_time` bigint(13) NOT NULL COMMENT 'Update timestamp',
PRIMARY KEY (`id`)
)
...@@ -64,11 +64,8 @@ ...@@ -64,11 +64,8 @@
<!--要生成的数据库表 --> <!--要生成的数据库表 -->
<table tableName="auth_source"/> <table tableName="datasource"/>
<table tableName="swagger_url_project"/>
<!--<table tableName="test_plan_api_scenario"/>-->
<!--<table tableName="test_plan"/>-->
<!--<table tableName="api_scenario_report"/>-->
</context> </context>
</generatorConfiguration> </generatorConfiguration>
...@@ -7,6 +7,11 @@ export default { ...@@ -7,6 +7,11 @@ export default {
content: () => import('@/business/components/settings/Setting') content: () => import('@/business/components/settings/Setting')
}, },
children: [ children: [
{
path: 'datasource',
component: () => import('@/business/components/settings/system/Datasource'),
meta: {system: true, title: 'commons.datasource'}
},
{ {
path: 'user', path: 'user',
component: () => import('@/business/components/settings/system/User'), component: () => import('@/business/components/settings/system/User'),
......
...@@ -192,7 +192,8 @@ export default { ...@@ -192,7 +192,8 @@ export default {
module: { module: {
select_module: "选择模块", select_module: "选择模块",
default_module: "默认模块", default_module: "默认模块",
} },
datasource: '数据连接'
}, },
license: { license: {
title: '授权管理', title: '授权管理',
...@@ -1521,5 +1522,54 @@ export default { ...@@ -1521,5 +1522,54 @@ export default {
delete_prompt: '此操作会删除认证源,是否继续?', delete_prompt: '此操作会删除认证源,是否继续?',
title: '认证设置', title: '认证设置',
auth_name_valid: '名称不支持特殊字符', auth_name_valid: '名称不支持特殊字符',
} },
datasource: {
create: '新建数据连接',
type: '类型',
please_choose_type: '请选择数据源类型',
data_base: '数据库名称',
user_name: '用户名',
password: '密码',
host: '主机',
port: '端口',
please_input_data_base: '请输入数据库名称',
please_input_user_name: '请输入用户名',
please_input_password: '请输入密码',
please_input_host: '请输入主机',
please_input_port: '请输入端口',
modify: '修改组织',
delete: '删除组织',
delete_confirm: '删除该组织会关联删除该组织下的所有资源(如:相关工作空间,项目,测试用例等),确定要删除吗?',
input_name: '请输入名称',
input_desc: '请输入描述',
select_organization: '请选择组织',
search_by_name: '根据名称搜索',
special_characters_are_not_supported: '格式错误(不支持特殊字符,且不能以\'-\'开头结尾)',
none: '无组织',
select: '选择组织',
delete_warning: '删除该组织将同步删除该组织下所有相关工作空间和相关工作空间下的所有项目,以及项目中的所有用例、接口测试、性能测试等,确定要删除吗?',
service_integration: '服务集成',
defect_manage: '缺陷管理平台',
message_settings: '消息设置',
message: {
jenkins_task_notification: 'Jenkins接口调用任务通知',
test_plan_task_notification: '测试计划任务通知',
test_review_task_notice: '测试评审任务通知',
create_new_notification: '创建新通知',
mail_template_example: '邮件模版',
robot_template: '机器人模版',
select_events: '选择事件',
defect_task_notification: '缺陷任务通知',
select_receiving_method: '选择接收方式',
mail: '邮件',
nail_robot: '钉钉机器人',
enterprise_wechat_robot: '企业微信机器人',
notes: '1.钉钉和企业群里新建一个自定义机器人,然后复制 webhook 地址在我们平台上;\n' +
' 2.机器人选择为群机器人,安全验证选择“自定义关键词” :"任务通知";\n' +
' 3.选择接收人时必须是你所建的群里包含的人,接收人手机号为必填项且为钉钉企业所使用的手机号,',
message: '事件,接收人,接收方式为必填项',
message_webhook: '接收方式为钉钉和企业机器人时,webhook为必填项',
template: "模版"
},
},
}; };
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论