1、使用Promise,重写red.getJSON /red.post, 解决"回调地狱"问题

2、修改 数据源管理/平台信息管理
This commit is contained in:
2019-04-04 17:47:29 +08:00
parent 3de47eea46
commit 696222fcf0
15 changed files with 283 additions and 38 deletions

View File

@@ -42,9 +42,9 @@ function getServiceDetail({name}, callback) {
}); });
}*/ }*/
const meta = { const meta = {
getPlats: (callback) => { /*getPlats: (callback) => {
red.getJSON("/meta/plat_list", {}, json => callback(json)); red.getJSON("/meta/plat_list", {}, json => callback(json));
}, },*/
getTableList(callback) { getTableList(callback) {
red.getJSON("/meta/tablelist",{}, json => callback(json)); red.getJSON("/meta/tablelist",{}, json => callback(json));
}, },

17
root/api/plat.js Normal file
View File

@@ -0,0 +1,17 @@
const plat = {
platList(params) { // 平台列表
return red.getX('/plat/list', params)
},
platSave({plat}) {
return red.postX('/plat/save', {plat})
},
dbList(params) { // 数据源列表
return red.getX('/plat/db_list', params)
},
dbSave({plat}) {
return red.postX('/plat/db_save', {plat})
},
}

View File

@@ -90,6 +90,7 @@
<script src="./res/zui/js/zui.js" defer></script> <script src="./res/zui/js/zui.js" defer></script>
<script src="./res/js/red.js" defer></script> <script src="./res/js/red.js" defer></script>
<script src="./api/meta.js" defer></script> <script src="./api/meta.js" defer></script>
<script src="./api/plat.js" defer></script>
<script src="./res/zui/lib/sortable/zui.sortable.js" defer></script> <script src="./res/zui/lib/sortable/zui.sortable.js" defer></script>
<!--<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>--> <!--<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>-->
<script type="module"> <script type="module">

View File

@@ -100,13 +100,14 @@
</row> </row>
<script> <script>
let {dbList, dbSave} = plat
var vm = new Vue({ var vm = new Vue({
el: ".plat", el: ".plat",
data: { data: {
cfg: { cfg: {
title: "数据中心 管理", title: "数据中心 管理",
cols: [ cols: [
{col: "_id", label: "ID"},
{col: "name", label: "数据平台名称"}, {col: "name", label: "数据平台名称"},
{col: "url", label: "数据平台连接地址"}, {col: "url", label: "数据平台连接地址"},
{col: "user", label: "用户"}, {col: "user", label: "用户"},
@@ -150,7 +151,11 @@
}, },
methods: { methods: {
findList: function () { findList: function () {
var para = { dbList().then(res => {
vm.list = res;
})
/*var para = {
doc:"db_plat", doc:"db_plat",
shows: JSON.stringify(["_id", "name", "url", "user", "pwd", "catalogs", "remark", "status"]) shows: JSON.stringify(["_id", "name", "url", "user", "pwd", "catalogs", "remark", "status"])
}; };
@@ -159,7 +164,7 @@
json.rows[i]["pulse"] = ""; json.rows[i]["pulse"] = "";
} }
vm.list = json; vm.list = json;
}) })*/
}, },
update: function (kv, row) { update: function (kv, row) {
red.post("/meta/save", { red.post("/meta/save", {
@@ -178,14 +183,20 @@
$('#myModal').modal({moveable: true}); $('#myModal').modal({moveable: true});
}, },
save: function (row) { save: function (row) {
red.post("/meta/save", { dbSave({plat: row}).then(() => {
red.showMsg({msg: "操作成功"})
$('#myModal').modal('hide')
vm.findList()
})
/* red.post("/meta/save", {
_id: row._id || "db_plat", _id: row._id || "db_plat",
doc: JSON.stringify(row) doc: JSON.stringify(row)
}, function (json) { }, function (json) {
red.showMsg(); red.showMsg();
$('#myModal').modal('hide'); $('#myModal').modal('hide');
vm.findList(); vm.findList();
}); }); */
}, },
loadCatalogs: function () { loadCatalogs: function () {
vm.catalogs = []; vm.catalogs = [];
@@ -198,13 +209,13 @@
}); });
}, },
dbPulse: function (row) { dbPulse: function (row) {
row["check"] = true; /*row["check"] = true;
$.getJSON("/_db/pulse", { $.getJSON("/_db/pulse", {
dbPlatId: row._id dbPlatId: row._id
}, function (json) { }, function (json) {
row["pulse"] = json.body; row["pulse"] = json.body;
row["check"] = false; row["check"] = false;
}); });*/
} }
}, },
mounted: function () { mounted: function () {

View File

@@ -76,13 +76,14 @@
</row> </row>
<script> <script>
let { platList, platSave } = plat;
var vm = new Vue({ var vm = new Vue({
el: ".plat", el: ".plat",
data: { data: {
cfg: { cfg: {
title: "业务平台 管理", title: "业务平台 管理",
cols: [ cols: [
{col: "_id", label: "ID"},
{col: "name", label: "业务名称"}, {col: "name", label: "业务名称"},
{col: "token", label: "Token"}, {col: "token", label: "Token"},
{col: "remark", label: "说明"}, {col: "remark", label: "说明"},
@@ -100,15 +101,9 @@
}, },
methods: { methods: {
findList: function () { findList () {
var para = { platList().then(res => {
doc:"sys_plat", vm.list = res
shows: JSON.stringify(["_id", "_key", "name", "token","remark", "status"]),
filter: JSON.stringify([{col:"status",type:"!=",value:-1}]),
};
red.getJSON("/meta/find", para, function (json) {
vm.list = json;
red.setData("sysPlats", json.rows);
}) })
}, },
update: function (kv, row) { update: function (kv, row) {
@@ -127,14 +122,10 @@
$('#myModal').modal({moveable: true}); $('#myModal').modal({moveable: true});
}, },
save: function (row) { save: function (row) {
red.post("/meta/save", { platSave({plat: row}).then(() => {
_id: row._id || "sys_plat", red.showMsg({msg: "操作成功"})
doc: JSON.stringify(row) $('#myModal').modal('hide')
}, function (json) { })
red.showMsg();
$('#myModal').modal('hide');
vm.findList();
});
} }
}, },
mounted: function () { mounted: function () {

View File

@@ -51,6 +51,44 @@ var red = {
callback(data) callback(data)
}) })
}, },
getX(url, params) {
return new Promise((resolve, reject) => {
axios.get(url, params).then(res => {
let data = res.data || {}
red.loginCheck(data)
if (data.code == -1) {
red.showMsg({type:"error", msg: data.message})
return;
}
if (data.code == 0) {
data = data.body
}
resolve(data)
})
})
},
postX(url, params) {
return new Promise(resolve => {
axios({
url,
method: 'post',
params,
}).then(res => {
let data = res.data || {}
red.loginCheck(data)
if (data.code == -1) {
red.showMsg({type:"error", msg: data.message})
return;
}
if (data.code == 0) {
data = data.body
}
resolve(data)
});
})
},
post: function(url, params, callback) { post: function(url, params, callback) {
params["platToken"] = red.getPlatToken() params["platToken"] = red.getPlatToken()
axios.post(url, params).then(res => { axios.post(url, params).then(res => {

View File

@@ -102,10 +102,11 @@
<script src="../res/js/red.js" defer></script> <script src="../res/js/red.js" defer></script>
<script src="../res/libs/axios.min.js" defer></script> <script src="../res/libs/axios.min.js" defer></script>
<script src="../api/meta.js"></script> <script src="../api/meta.js"></script>
<script src="../api/plat.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue"></script> <script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script type="module"> <script type="module">
import { login } from '../api/user.js' import { login } from '../api/user.js'
let { getPlats } = meta; let { platList } = plat;
var vm = new Vue({ var vm = new Vue({
el: ".login", el: ".login",
@@ -122,14 +123,15 @@
loginCheck: function ({username, pwd}) { loginCheck: function ({username, pwd}) {
login({username, pwd}, function (json) { login({username, pwd}, function (json) {
if (json.code == 0) { if (json.code == 0) {
getPlats(function (json) { platList().then(res => {
let rows = res.rows
red.showMsg({msg:"请选择业务平台"}) red.showMsg({msg:"请选择业务平台"})
vm.sysPlats = json; vm.sysPlats = rows;
if (!vm.sysPlat) { if (!vm.sysPlat) {
vm.sysPlat = json[0]; vm.sysPlat = rows[0];
} }
red.setData("sysPlats", json); red.setData("sysPlats", rows);
setTimeout(function () { setTimeout(function () {
vm.choose = true; vm.choose = true;
}, 500); }, 500);

View File

@@ -4,6 +4,8 @@ import com.arangodb.ArangoCollection;
import com.arangodb.ArangoDBException; import com.arangodb.ArangoDBException;
import com.arangodb.ArangoDatabase; import com.arangodb.ArangoDatabase;
import com.arangodb.entity.DocumentCreateEntity; import com.arangodb.entity.DocumentCreateEntity;
import net.tccn.base.PageBean;
import org.redkale.source.Flipper;
import javax.persistence.Table; import javax.persistence.Table;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
@@ -160,7 +162,7 @@ public abstract class Doc<T extends Doc> {
this.db = arangoSource.db(table.catalog()); this.db = arangoSource.db(table.catalog());
this.collection = arangoSource.collection(this); this.collection = arangoSource.collection(this);
} }
public final static <T extends Doc> T dao(Class<T> type) { protected final static <T extends Doc> T dao(Class<T> type) {
if (daos.get(type) == null) { if (daos.get(type) == null) {
try { try {
@@ -188,6 +190,16 @@ public abstract class Doc<T extends Doc> {
collection.updateDocument(this.getKey(), this.toDoc()); collection.updateDocument(this.getKey(), this.toDoc());
} }
public <T extends Doc> PageBean<T> findPage(T t, Flipper flipper) {
if (flipper == null) {
flipper = new Flipper();
}
List<T> list = find(t, flipper.getOffset(), flipper.getLimit());
long count = count(t);
return PageBean.by(list, count);
}
public T findFirst(T t) { public T findFirst(T t) {
return findFirst(arangoSource.parseAql(t, 0, 1), (Class<T>) t.getClass()); return findFirst(arangoSource.parseAql(t, 0, 1), (Class<T>) t.getClass());
} }
@@ -198,6 +210,9 @@ public abstract class Doc<T extends Doc> {
return find(t, 0, 1000); return find(t, 0, 1000);
} }
public <T extends Doc> List<T> find(T t, int offset, int pn) { public <T extends Doc> List<T> find(T t, int offset, int pn) {
if (t == null) {
t = (T) this;
}
return find(arangoSource.parseAql(t, offset, pn), (Class<T>)this.getClass()); return find(arangoSource.parseAql(t, offset, pn), (Class<T>)this.getClass());
} }
@@ -226,6 +241,9 @@ public abstract class Doc<T extends Doc> {
return count(this); return count(this);
} }
public <T extends Doc> long count(T t) { public <T extends Doc> long count(T t) {
if (t == null) {
t = (T) this;
}
return db.query(arangoSource.parseAqlCount(t), long.class).first(); return db.query(arangoSource.parseAqlCount(t), long.class).first();
} }
//ok //ok

View File

@@ -15,6 +15,8 @@ public class DbExecutors {
String[] sqls = PARSER.parse(fBean); String[] sqls = PARSER.parse(fBean);
return PageBean.by(Arrays.asList(Kv.of("findSql:", sqls[0]).set("countSql", sqls[1]) ), 0); return PageBean.by(Arrays.asList(Kv.of("findSql:", sqls[0]).set("countSql", sqls[1]) ), 0);
} }
} }

View File

@@ -0,0 +1,96 @@
package net.tccn.plat;
import net.tccn.base.arango.Doc;
import org.redkale.convert.json.JsonConvert;
import javax.persistence.Table;
import java.util.List;
/**
* 数据库平台
* @author: liangxianyou at 2018/11/14 12:58.
*/
@Table(name = "db_plat", catalog = "db_dev")
public class DbPlat extends Doc<DbPlat> {
public static DbPlat dao = dao(DbPlat.class);
private String name; //名称
private String cate; //类型 mysql|ArangoDb
private String remark; //备注
private String url; //数据库连接地址
private String user; //账号
private String pwd; //密码
private List<String> catalogs; //库
private Integer status;//状态 1启用 0 未启用
//------------- setter/getter ---------------
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCate() {
return cate;
}
public void setCate(String cate) {
this.cate = cate;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public List<String> getCatalogs() {
return catalogs;
}
public void setCatalogs(List<String> catalogs) {
this.catalogs = catalogs;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
@Override
public String toString() {
return JsonConvert.root().convertTo(this);
}
//-------------------------------------------------------------------------
}

View File

@@ -0,0 +1,69 @@
package net.tccn.plat;
import net.tccn.base.JBean;
import net.tccn.base.Kv;
import net.tccn.base.PageBean;
import net.tccn.service.BaseService;
import org.redkale.net.http.RestMapping;
import org.redkale.net.http.RestService;
import org.redkale.source.Flipper;
import org.redkale.util.Comment;
import java.util.Map;
@RestService(name = "plat", automapping = true, comment = "业务/数据平台")
public class PlatService extends BaseService {
@RestMapping(name = "list", comment = "平台列表")
public JBean list(SysPlat plat, Flipper flipper) {
JBean jBean = new JBean();
PageBean<SysPlat> page = SysPlat.dao.findPage(plat, flipper);
return jBean.setBody(page);
}
@Comment("平台信息保存")
public JBean save(SysPlat plat) {
if (plat.getKey() == null) {
plat.save();
} else {
plat.update();
}
return new JBean();
}
@RestMapping(name = "info", comment = "平台详情")
public void info(int key) {
}
//------------------------
@RestMapping(name = "db_list", comment = "数据源列表")
public JBean dbList(DbPlat plat, Flipper flipper) {
JBean jBean = new JBean();
PageBean<DbPlat> page = DbPlat.dao.findPage(plat, flipper);
return jBean.setBody(page);
}
@RestMapping(name = "db_save", comment = "数据源信息保存")
public JBean dbSave(String plat) {
Map map = gson.fromJson(plat, Map.class);
DbPlat dbPlat = Kv.toBean(map, DbPlat.class);
// todo: Kv.toBean 的内部属性深度转换,
/*if (dbPlat.getKey() == null) {
dbPlat.save();
} else {
dbPlat.update();
}*/
return new JBean().setBody(dbPlat);
}
}

View File

@@ -1,4 +1,4 @@
package net.tccn.dbq.qtask; package net.tccn.plat;
import net.tccn.base.arango.Doc; import net.tccn.base.arango.Doc;

View File

@@ -4,7 +4,7 @@ import net.tccn.base.JBean;
import net.tccn.base.Kv; import net.tccn.base.Kv;
import net.tccn.dbq.Field; import net.tccn.dbq.Field;
import net.tccn.dbq.jdbc.api.DbAccount; import net.tccn.dbq.jdbc.api.DbAccount;
import net.tccn.dbq.qtask.SysPlat; import net.tccn.plat.SysPlat;
import net.tccn.meta.MetaKit; import net.tccn.meta.MetaKit;
import net.tccn.meta.MetaService; import net.tccn.meta.MetaService;
import net.tccn.meta.MetaTable; import net.tccn.meta.MetaTable;

View File

@@ -4,7 +4,7 @@ import net.tccn.base.JBean;
import net.tccn.base.Kv; import net.tccn.base.Kv;
import net.tccn.dbq.jdbc.api.DbAccount; import net.tccn.dbq.jdbc.api.DbAccount;
import net.tccn.dbq.qtask.Qtask; import net.tccn.dbq.qtask.Qtask;
import net.tccn.dbq.qtask.SysPlat; import net.tccn.plat.SysPlat;
import org.redkale.net.http.RestMapping; import org.redkale.net.http.RestMapping;
import org.redkale.net.http.RestParam; import org.redkale.net.http.RestParam;
import org.redkale.net.http.RestService; import org.redkale.net.http.RestService;

View File

@@ -131,7 +131,7 @@ public class RunTest<T> {
}).min().orElseGet(()-> 0); }).min().orElseGet(()-> 0);
System.out.println(xx); System.out.println(xx);
}
} }
}