mirror of https://gitee.com/stylefeng/guns
【datasource】更新多数据源功能,以及一些测试接口
parent
4bdc3282a2
commit
0f58f0aea4
7
pom.xml
7
pom.xml
|
@ -127,6 +127,13 @@
|
|||
<version>1.0.0</version>
|
||||
</dependency>
|
||||
|
||||
<!--多数据源配置-->
|
||||
<dependency>
|
||||
<groupId>cn.stylefeng.roses</groupId>
|
||||
<artifactId>ds-container-spring-boot-starter</artifactId>
|
||||
<version>1.0.0</version>
|
||||
</dependency>
|
||||
|
||||
<!--数据库驱动,可根据自己需要自行删减-->
|
||||
<dependency>
|
||||
<groupId>mysql</groupId>
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package cn.stylefeng.guns;
|
||||
|
||||
import cn.stylefeng.roses.kernel.db.starter.GunsDataSourceAutoConfiguration;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
|
@ -12,7 +13,7 @@ import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration;
|
|||
* @date 2020/12/1 17:50
|
||||
*/
|
||||
@Slf4j
|
||||
@SpringBootApplication(scanBasePackages = {"cn.stylefeng"}, exclude = FlywayAutoConfiguration.class)
|
||||
@SpringBootApplication(scanBasePackages = {"cn.stylefeng"}, exclude = {FlywayAutoConfiguration.class, GunsDataSourceAutoConfiguration.class})
|
||||
public class GunsApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
package cn.stylefeng.guns.modular.datasource;
|
||||
|
||||
import cn.stylefeng.roses.kernel.resource.api.annotation.ApiResource;
|
||||
import cn.stylefeng.roses.kernel.resource.api.annotation.GetResource;
|
||||
import org.springframework.stereotype.Controller;
|
||||
|
||||
/**
|
||||
* 多数据源界面
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2021/1/23 21:45
|
||||
*/
|
||||
@Controller
|
||||
@ApiResource(name = "多数据源界面")
|
||||
public class DataSourceViewController {
|
||||
|
||||
/**
|
||||
* 多数据源列表界面
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2021/1/23 21:45
|
||||
*/
|
||||
@GetResource(name = "多数据源列表界面", path = "/view/datasource")
|
||||
public String indexView() {
|
||||
return "/modular/datasource/datasource.html";
|
||||
}
|
||||
|
||||
/**
|
||||
* 多数据源新增界面
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2021/1/23 21:59
|
||||
*/
|
||||
@GetResource(name = "多数据源新增界面", path = "/view/datasource/add")
|
||||
public String addView() {
|
||||
return "/modular/datasource/datasource_add.html";
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
package cn.stylefeng.guns.modular.datasource.test;
|
||||
|
||||
import cn.stylefeng.guns.modular.datasource.test.service.TranTestService;
|
||||
import cn.stylefeng.roses.kernel.resource.api.annotation.ApiResource;
|
||||
import cn.stylefeng.roses.kernel.resource.api.annotation.GetResource;
|
||||
import cn.stylefeng.roses.kernel.rule.pojo.response.SuccessResponseData;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
/**
|
||||
* 测试多数据源
|
||||
*
|
||||
* @author stylefeng
|
||||
* @date 2018/7/20 23:39
|
||||
*/
|
||||
@RestController
|
||||
@ApiResource(name = "测试多数据源")
|
||||
public class TestMultiTranController {
|
||||
|
||||
@Resource
|
||||
private TranTestService testMultiDbService;
|
||||
|
||||
@GetResource(name = "测试多数据源成功", path = "/tran/multi/success")
|
||||
public Object testSuccess() {
|
||||
testMultiDbService.beginTest();
|
||||
return new SuccessResponseData();
|
||||
}
|
||||
|
||||
@GetResource(name = "测试多数据源失败", path = "/tran/multi/fail")
|
||||
public Object testFail() {
|
||||
testMultiDbService.beginTestFail();
|
||||
return new SuccessResponseData();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
package cn.stylefeng.guns.modular.datasource.test;
|
||||
|
||||
import cn.stylefeng.guns.modular.datasource.test.service.TranTestService;
|
||||
import cn.stylefeng.roses.kernel.resource.api.annotation.ApiResource;
|
||||
import cn.stylefeng.roses.kernel.resource.api.annotation.GetResource;
|
||||
import cn.stylefeng.roses.kernel.rule.pojo.response.SuccessResponseData;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
/**
|
||||
* 测试单数据源回滚
|
||||
*
|
||||
* @author stylefeng
|
||||
* @date 2018/7/20 23:39
|
||||
*/
|
||||
@RestController
|
||||
@ApiResource(name = "测试单数据源")
|
||||
public class TestSingleTranController {
|
||||
|
||||
@Resource
|
||||
private TranTestService testMultiDbService;
|
||||
|
||||
@GetResource(name = "测试单数据源事务成功", path = "/tran/single/success")
|
||||
public Object testSuccess() {
|
||||
testMultiDbService.testSingleSuccess();
|
||||
return new SuccessResponseData();
|
||||
}
|
||||
|
||||
@GetResource(name = "测试单数据源事务失败", path = "/tran/single/fail")
|
||||
public Object testFail() {
|
||||
testMultiDbService.testSingleFail();
|
||||
return new SuccessResponseData();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
package cn.stylefeng.guns.modular.datasource.test.factory;
|
||||
|
||||
import cn.hutool.core.util.RandomUtil;
|
||||
import cn.stylefeng.roses.kernel.system.modular.user.entity.SysUser;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 创建一个用于测试数据源的用户
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2021/1/23 23:29
|
||||
*/
|
||||
public class NormalUserFactory {
|
||||
|
||||
/**
|
||||
* 创建一个用于测试数据源的用户
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2021/1/23 23:29
|
||||
*/
|
||||
public static SysUser createAnUser() {
|
||||
SysUser user = new SysUser();
|
||||
user.setAccount(RandomUtil.randomString(5));
|
||||
user.setPassword(RandomUtil.randomString(5));
|
||||
user.setCreateTime(new Date());
|
||||
user.setUpdateTime(new Date());
|
||||
user.setCreateUser(1L);
|
||||
user.setSex("M");
|
||||
user.setUpdateUser(1L);
|
||||
user.setRealName(RandomUtil.randomString(5));
|
||||
return user;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
package cn.stylefeng.guns.modular.datasource.test.service;
|
||||
|
||||
import cn.stylefeng.guns.modular.datasource.test.factory.NormalUserFactory;
|
||||
import cn.stylefeng.roses.kernel.dsctn.api.annotation.DataSource;
|
||||
import cn.stylefeng.roses.kernel.system.modular.user.entity.SysUser;
|
||||
import cn.stylefeng.roses.kernel.system.modular.user.mapper.SysUserMapper;
|
||||
import cn.stylefeng.roses.kernel.system.modular.user.service.SysUserService;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
/**
|
||||
* Guns数据库操作
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2021/1/23 23:29
|
||||
*/
|
||||
@Service
|
||||
public class GunsDbService extends ServiceImpl<SysUserMapper, SysUser> {
|
||||
|
||||
@Resource
|
||||
private SysUserService sysUserService;
|
||||
|
||||
@DataSource(name = "master")
|
||||
public void gunsDb() {
|
||||
sysUserService.save(NormalUserFactory.createAnUser());
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
package cn.stylefeng.guns.modular.datasource.test.service;
|
||||
|
||||
import cn.stylefeng.guns.modular.datasource.test.factory.NormalUserFactory;
|
||||
import cn.stylefeng.roses.kernel.dsctn.api.annotation.DataSource;
|
||||
import cn.stylefeng.roses.kernel.system.modular.user.entity.SysUser;
|
||||
import cn.stylefeng.roses.kernel.system.modular.user.mapper.SysUserMapper;
|
||||
import cn.stylefeng.roses.kernel.system.modular.user.service.SysUserService;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
/**
|
||||
* 其他数据库操作
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2021/1/23 23:30
|
||||
*/
|
||||
@Service
|
||||
public class OtherDbService extends ServiceImpl<SysUserMapper, SysUser> {
|
||||
|
||||
@Resource
|
||||
private SysUserService sysUserService;
|
||||
|
||||
@DataSource(name = "test")
|
||||
public void otherDb() {
|
||||
sysUserService.save(NormalUserFactory.createAnUser());
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,46 @@
|
|||
package cn.stylefeng.guns.modular.datasource.test.service;
|
||||
|
||||
import cn.stylefeng.guns.modular.datasource.test.factory.NormalUserFactory;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
/**
|
||||
* 测试多数据源操作
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2021/1/23 23:30
|
||||
*/
|
||||
@Service
|
||||
public class TranTestService {
|
||||
|
||||
@Resource
|
||||
private GunsDbService gunsDbService;
|
||||
|
||||
@Resource
|
||||
private OtherDbService otherDbService;
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void testSingleSuccess() {
|
||||
gunsDbService.save(NormalUserFactory.createAnUser());
|
||||
}
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void testSingleFail() {
|
||||
gunsDbService.save(NormalUserFactory.createAnUser());
|
||||
int i = 1 / 0;
|
||||
}
|
||||
|
||||
public void beginTest() {
|
||||
gunsDbService.gunsDb();
|
||||
otherDbService.otherDb();
|
||||
}
|
||||
|
||||
public void beginTestFail() {
|
||||
gunsDbService.gunsDb();
|
||||
otherDbService.otherDb();
|
||||
int i = 1 / 0;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
INSERT INTO `sys_menu` VALUES (1352966403623342082, 1339550467939639317, '[-1],[1339550467939639317],', '多数据源', 'datasources', 'system', 'Y', 50.50, 1, NULL, '/view/datasources', 'layui-icon-star-fill', NULL, 'icon-default', NULL, 0, NULL, 'N', '2021-01-23 21:08:22', 1339550467939639299, NULL, NULL);
|
||||
INSERT INTO `sys_menu` VALUES (1352966403623342082, 1339550467939639317, '[-1],[1339550467939639317],', '多数据源', 'datasources', 'system', 'Y', 50.50, 1, NULL, '/view/datasource', 'layui-icon-star-fill', NULL, 'icon-default', NULL, 0, NULL, 'N', '2021-01-23 21:08:22', 1339550467939639299, NULL, NULL);
|
||||
INSERT INTO `sys_role_menu` VALUES (1352966446510100482, 1339550467939639303, 1352966403623342082, '2021-01-23 21:08:32', 1339550467939639299, NULL, NULL);
|
||||
|
||||
INSERT INTO `sys_menu` VALUES (1352968673144459265, 1339550467939639317, '[-1],[1339550467939639317],', '多语言配置', 'languages', 'system', 'Y', 50.60, 1, NULL, '/view/languages', 'layui-icon-star-fill', NULL, 'icon-default', NULL, 0, NULL, 'N', '2021-01-23 21:17:23', 1339550467939639299, NULL, NULL);
|
||||
|
|
|
@ -16,4 +16,13 @@
|
|||
padding: 10px 20px;
|
||||
background-color: #fff;
|
||||
box-shadow: 0 -1px 2px 0 rgba(0, 0, 0, .05);
|
||||
}
|
||||
}
|
||||
|
||||
.layui-fluid {
|
||||
padding-bottom: 70px
|
||||
}
|
||||
|
||||
.layui-card {
|
||||
padding-bottom: 20px
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,105 @@
|
|||
layui.use(['table', 'admin', 'HttpRequest', 'func'], function () {
|
||||
var $ = layui.$;
|
||||
var table = layui.table;
|
||||
var HttpRequest = layui.HttpRequest;
|
||||
var admin = layui.admin;
|
||||
var func = layui.func;
|
||||
|
||||
/**
|
||||
* 数据库信息表管理
|
||||
*/
|
||||
var DatabaseInfo = {
|
||||
tableId: "databaseInfoTable"
|
||||
};
|
||||
|
||||
/**
|
||||
* 初始化表格的列
|
||||
*/
|
||||
DatabaseInfo.initColumn = function () {
|
||||
return [[
|
||||
{type: 'checkbox'},
|
||||
{field: 'dbId', hide: true, title: '主键id'},
|
||||
{field: 'dbName', align: "center", sort: true, title: '数据库名称'},
|
||||
{field: 'jdbcDriver', align: "center", sort: true, title: '驱动类型', minWidth: 182},
|
||||
{field: 'username', align: "center", sort: true, title: '账号'},
|
||||
{field: 'password', align: "center", sort: true, title: '密码'},
|
||||
{field: 'jdbcUrl', align: "center", sort: true, title: 'jdbc的url'},
|
||||
{field: 'remarks', align: "center", sort: true, title: '备注'},
|
||||
{field: 'createTime', align: "center", sort: true, title: '创建时间', minWidth: 160},
|
||||
{align: 'center', toolbar: '#tableBar', title: '操作'}
|
||||
]];
|
||||
};
|
||||
|
||||
/**
|
||||
* 点击查询按钮
|
||||
*/
|
||||
DatabaseInfo.search = function () {
|
||||
var queryData = {};
|
||||
queryData['dbName'] = $("#dbName").val();
|
||||
table.reload(DatabaseInfo.tableId, {
|
||||
where: queryData, page: {curr: 1}
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 弹出添加对话框
|
||||
*/
|
||||
DatabaseInfo.openAddDlg = function () {
|
||||
func.open({
|
||||
height: 680,
|
||||
title: '添加数据源',
|
||||
content: Feng.ctxPath + '/view/datasource/add',
|
||||
tableId: DatabaseInfo.tableId
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 点击删除
|
||||
*
|
||||
* @param data 点击按钮时候的行数据
|
||||
*/
|
||||
DatabaseInfo.onDeleteItem = function (data) {
|
||||
var operation = function () {
|
||||
var request = new HttpRequest(Feng.ctxPath + "/databaseInfo/delete", 'post', function (data) {
|
||||
Feng.success("删除成功!");
|
||||
table.reload(DatabaseInfo.tableId);
|
||||
}, function (data) {
|
||||
Feng.error("删除失败!" + data.message + "!");
|
||||
});
|
||||
request.set("dbId", data.dbId);
|
||||
request.start(true);
|
||||
};
|
||||
Feng.confirm("是否删除?", operation);
|
||||
};
|
||||
|
||||
// 渲染表格
|
||||
var tableResult = table.render({
|
||||
elem: '#' + DatabaseInfo.tableId,
|
||||
url: Feng.ctxPath + '/databaseInfo/page',
|
||||
page: true,
|
||||
height: "full-158",
|
||||
cellMinWidth: 100,
|
||||
parseData: Feng.parseData,
|
||||
cols: DatabaseInfo.initColumn()
|
||||
});
|
||||
|
||||
// 搜索按钮点击事件
|
||||
$('#btnSearch').click(function () {
|
||||
DatabaseInfo.search();
|
||||
});
|
||||
|
||||
// 添加按钮点击事件
|
||||
$('#btnAdd').click(function () {
|
||||
DatabaseInfo.openAddDlg();
|
||||
});
|
||||
|
||||
// 工具条点击事件
|
||||
table.on('tool(' + DatabaseInfo.tableId + ')', function (obj) {
|
||||
var data = obj.data;
|
||||
var layEvent = obj.event;
|
||||
|
||||
if (layEvent === 'delete') {
|
||||
DatabaseInfo.onDeleteItem(data);
|
||||
}
|
||||
});
|
||||
});
|
|
@ -0,0 +1,23 @@
|
|||
layui.use(['form', 'admin', 'HttpRequest'], function () {
|
||||
var $ = layui.jquery;
|
||||
var HttpRequest = layui.HttpRequest;
|
||||
var form = layui.form;
|
||||
var admin = layui.admin;
|
||||
|
||||
//表单提交事件
|
||||
form.on('submit(btnSubmit)', function (data) {
|
||||
var request = new HttpRequest(Feng.ctxPath + "/databaseInfo/add", 'post', function (data) {
|
||||
admin.closeThisDialog();
|
||||
Feng.success("添加成功!");
|
||||
admin.putTempData('formOk', true);
|
||||
}, function (data) {
|
||||
admin.closeThisDialog();
|
||||
Feng.error("添加失败!" + data.message)
|
||||
});
|
||||
request.set(data.field);
|
||||
request.start(true);
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
});
|
|
@ -0,0 +1,33 @@
|
|||
@layout("/layout/_container.html",{js:["/assets/modular/datasource/datasource.js"]}){
|
||||
|
||||
<div class="layui-body-header">
|
||||
<span class="layui-body-header-title">数据库信息表管理</span>
|
||||
</div>
|
||||
|
||||
<div class="layui-fluid">
|
||||
<div class="layui-row layui-col-space15">
|
||||
<div class="layui-col-sm12 layui-col-md12 layui-col-lg12">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-form toolbar">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline">
|
||||
<input id="dbName" class="layui-input" type="text" placeholder="名称"/>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<button id="btnSearch" class="layui-btn icon-btn"><i class="layui-icon"></i>搜索</button>
|
||||
<button id="btnAdd" class="layui-btn icon-btn"><i class="layui-icon"></i>添加</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<table class="layui-table" id="databaseInfoTable" lay-filter="databaseInfoTable"></table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="tableBar">
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="delete">删除</a>
|
||||
</script>
|
||||
@}
|
|
@ -0,0 +1,63 @@
|
|||
@layout("/layout/_form.html",{js:["/assets/modular/datasource/datasource_add.js"]}){
|
||||
<form class="layui-form" id="databaseInfoForm" lay-filter="databaseInfoForm">
|
||||
<div class="layui-fluid">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<input name="dbId" type="hidden"/>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">数据库名称<span style="color: red;">*</span></label>
|
||||
<div class="layui-input-block">
|
||||
<input id="dbName" name="dbName" placeholder="数据库名称" type="text" class="layui-input" lay-verify="required" required autocomplete="off"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">JDBC驱动<span style="color: red;">*</span></label>
|
||||
<div class="layui-input-block">
|
||||
<select name="jdbcDriver">
|
||||
<option value="com.mysql.cj.jdbc.Driver">Mysql</option>
|
||||
<option value="oracle.jdbc.OracleDriver">Oracle</option>
|
||||
<option value="net.sourceforge.jtds.jdbc.Driver">Sql Server</option>
|
||||
<option value="org.postgresql.Driver">Postgre Sql</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">JDBC账号<span style="color: red;">*</span></label>
|
||||
<div class="layui-input-block">
|
||||
<input id="username" name="username" placeholder="账号" type="text" class="layui-input" lay-verify="required" required autocomplete="off"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">JDBC密码<span style="color: red;">*</span></label>
|
||||
<div class="layui-input-block">
|
||||
<input id="password" name="password" placeholder="密码" type="text" class="layui-input" lay-verify="required" required autocomplete="off"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">JDBC URL<span style="color: red;">*</span></label>
|
||||
<div class="layui-input-block">
|
||||
<input id="jdbcUrl" name="jdbcUrl" placeholder="jdbc的url" type="text" class="layui-input" lay-verify="required" required autocomplete="off"/>
|
||||
</div>
|
||||
<div class="layui-form-mid layui-word-aux" style="margin-left: 120px;">参考:<br/>
|
||||
oracle:jdbc:oracle:thin:\@127.0.0.1:1521:ORCLCDB<br/>
|
||||
sql server:jdbc:jtds:sqlserver://127.0.0.1:1433;DatabaseName=guns<br/>
|
||||
pg sql:jdbc:postgresql://127.0.0.1:5432/guns<br/>
|
||||
mysql:jdbc:mysql://127.0.0.1:3306/guns?autoReconnect=true&useUnicode=true<br/>&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=CTT
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">备注</label>
|
||||
<div class="layui-input-block">
|
||||
<input id="remarks" name="remarks" placeholder="备注" type="text" class="layui-input" autocomplete="off"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group-bottom text-center">
|
||||
<button class="layui-btn" lay-filter="btnSubmit" lay-submit> 提交 </button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary" ew-event="closeDialog"> 取消 </button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
@}
|
Loading…
Reference in New Issue