【datasource】更新多数据源功能,以及一些测试接口

pull/64/head
fengshuonan 2021-01-23 23:49:56 +08:00
parent 4bdc3282a2
commit 0f58f0aea4
15 changed files with 499 additions and 3 deletions

View File

@ -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>

View File

@ -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) {

View File

@ -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";
}
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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;
}
}

View File

@ -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());
}
}

View File

@ -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());
}
}

View File

@ -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;
}
}

View File

@ -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);

View File

@ -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
}

View File

@ -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);
}
});
});

View File

@ -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;
});
});

View File

@ -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">&#xe615;</i>搜索</button>
<button id="btnAdd" class="layui-btn icon-btn"><i class="layui-icon">&#xe654;</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>
@}

View File

@ -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/>
oraclejdbc:oracle:thin:\@127.0.0.1:1521:ORCLCDB<br/>
sql serverjdbc:jtds:sqlserver://127.0.0.1:1433;DatabaseName=guns<br/>
pg sqljdbc:postgresql://127.0.0.1:5432/guns<br/>
mysqljdbc: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>&emsp;提交&emsp;</button>
<button type="reset" class="layui-btn layui-btn-primary" ew-event="closeDialog">&emsp;取消&emsp;</button>
</div>
</form>
@}