egg-xc-base
Version:
a base framework with egg.js
507 lines (482 loc) • 16.6 kB
JavaScript
;
const moment = require('moment');
const underscore = require('underscore')
module.exports = {
db: {
// 直接执行sql 默认获取db1
async doQuery(_sql, service,disableLog = false) {
try {
const result = await service.app.mysql.get('db1').query(_sql);
if(!disableLog){
service.logger.info(`${_sql.replace(/\t|\n|\v|\r|\f|\s+/g," ")}-->Success!`);
}
return result;
} catch (error) {
service.logger.error(`${_sql.replace(/\t|\n|\v|\r|\f|\s+/g," ")}-->Error!`);
service.logger.error(error);
return null;
}
},
// 直接执行sql 默认获取db1 抛出错误
async doQueryError(_sql, service,disableLog = false) {
try {
const result = await service.app.mysql.get('db1').query(_sql);
if(!disableLog){
service.logger.info(`${_sql.replace(/\t|\n|\v|\r|\f|\s+/g," ")}-->Success!`);
}
return result;
} catch (error) {
service.logger.error(`${_sql.replace(/\t|\n|\v|\r|\f|\s+/g," ")}-->Error!`);
service.logger.error(error);
throw new service.app.dbError(error.message);
}
},
// 获取事物
async tran(service, cb) {
try {
return await service.app.mysql.get('db1').beginTransactionScope(cb, service.ctx);
} catch (error) {
service.ctx.logger.error('rollback!');
service.logger.error(error);
return null;
}
},
// 获取事物 抛出Error
async tranError(service, cb) {
try {
return await service.app.mysql.get('db1').beginTransactionScope(cb, service.ctx);
} catch (error) {
service.ctx.logger.error('rollback!');
service.ctx.logger.error(error);
throw new service.app.dbError().for(error);
}
},
// 事物中执行sql
async doQueryTran(_sql, conn, service) {
let result = null;
try {
result = await conn.query(_sql);
service.logger.info(`${_sql.replace(/\t|\n|\v|\r|\f|\s+/g," ")}-->Success!`);
} catch (error) {
service.logger.error(`${_sql.replace(/\t|\n|\v|\r|\f|\s+/g," ")}-->Error!`);
service.ctx.logger.error(error);
throw new service.app.dbError(error.message);
}
return result;
},
// 多数据源执行sql
async doQueryConn(_sql, conn, service) {
try {
const result = await conn.query(_sql);
service.logger.info(`${_sql.replace(/\t|\n|\v|\r|\f|\s+/g," ")}-->Success!`);
return result;
} catch (error) {
service.logger.error(`${_sql.replace(/\t|\n|\v|\r|\f|\s+/g," ")}-->Error!`);
service.logger.error(error);
return null;
}
},
// 多数据源执行sql 抛出错误
async doQueryConnError(_sql, conn, service) {
try {
const result = await conn.query(_sql);
service.logger.info(`${_sql.replace(/\t|\n|\v|\r|\f|\s+/g," ")}-->Success!`);
return result;
} catch (error) {
service.logger.error(`${_sql.replace(/\t|\n|\v|\r|\f|\s+/g," ")}-->Error!`);
service.ctx.logger.error(error);
throw new service.app.dbError().for(error);
}
},
// 多数据源获取事物
async tranConn(service, conn, cb) {
try {
return await conn.beginTransactionScope(cb, service.ctx);
} catch (error) {
service.ctx.logger.error('rollback!');
service.logger.error(error);
return null;
}
},
// 多数据源获取事物 抛出Error
async tranConnError(service, conn, cb) {
try {
return await conn.beginTransactionScope(cb, service.ctx);
} catch (error) {
service.ctx.logger.error('rollback!');
service.ctx.logger.error(error);
throw new service.app.dbError().for(error);
}
},
formatTime(time){
return `from_unixtime(CONVERT(${time}/1000, UNSIGNED INTEGER),'%Y-%m-%d %H:%i:%S')`
}
},
time: {
// 获取当前时间格式 YYYY-MM-DD HH:mm:ss.SSS
getCurrentTime() {
return moment().format('YYYY-MM-DD HH:mm:ss.SSS');
},
},
async httpGet(url){
const result = await this.ctx.curl(url, {
dataType: 'json',
});
if (result.status != 200) {
this.ctx.logger.error(`${url}-->Error!status=${result.status}`);
throw new this.ctx.app.serverError(`${url} Error!status=${result.status}`);
} else {
this.ctx.logger.info(`${url}-->Success!`)
return result.data;
}
},
async httpPost(url,body){
const result = await this.ctx.curl(url, {
method: 'POST',
dataType: 'json',
contentType: 'json',
rejectUnauthorized: false,
data: body,
});
if (result.status != 200) {
this.ctx.logger.error(`${url}-->Error!status=${result.status}`);
throw new this.ctx.app.serverError(`${url} get Error!status=${result.status}`);
} else {
this.ctx.logger.info(`${url}-->Success!`)
return result.data;
}
},
async httpPut(url,body){
const result = await this.ctx.curl(url, {
method: 'PUT',
dataType: 'json',
contentType: 'json',
rejectUnauthorized: false,
data: body,
});
if (result.status != 200) {
this.ctx.logger.error(`${url}-->Error!status=${result.status}`);
throw new this.ctx.app.serverError(`${url} get Error!status=${result.status}`);
} else {
this.ctx.logger.info(`${url}-->Success!`)
return result.data;
}
},
async httpDel(url){
const result = await this.ctx.curl(url, {
method: 'DELETE',
dataType: 'json',
});
if (result.status != 200) {
this.ctx.logger.error(`${url}-->Error!status=${result.status}`);
throw new this.ctx.app.serverError(`${url} Error!status=${result.status}`);
} else {
this.ctx.logger.info(`${url}-->Success!`)
return result.data;
}
},
async httpGetOptions(url,options){
const result = await this.ctx.curl(url, Object.assign({
method: 'GET',
dataType: 'json',
},options));
if (result.status != 200) {
this.ctx.logger.error(`${url}-->Error!status=${result.status}`);
throw new this.ctx.app.serverError(`${url} get Error!status=${result.status}`);
} else {
this.ctx.logger.info(`${url}-->Success!`)
return result.data;
}
},
async httpPostOptions(url,body,options){
const result = await this.ctx.curl(url, Object.assign({
method: 'POST',
dataType: 'json',
contentType: 'json',
data: body,
},options));
if (result.status != 200) {
this.ctx.logger.error(`${url}-->Error!status=${result.status}`);
throw new this.ctx.app.serverError(`${url} get Error!status=${result.status}`);
} else {
this.ctx.logger.info(`${url}-->Success!`)
return result.data;
}
},
async httpPutOptions(url,body,options){
const result = await this.ctx.curl(url, Object.assign({
method: 'PUT',
dataType: 'json',
contentType: 'json',
data: body,
},options));
if (result.status != 200) {
this.ctx.logger.error(`${url}-->Error!status=${result.status}`);
throw new this.ctx.app.serverError(`${url} get Error!status=${result.status}`);
} else {
this.ctx.logger.info(`${url}-->Success!`)
return result.data;
}
},
async httpDelOptions(url,options){
const result = await this.ctx.curl(url, Object.assign({
method: 'DELETE',
dataType: 'json',
},options));
if (result.status != 200) {
this.ctx.logger.error(`${url}-->Error!status=${result.status}`);
throw new this.ctx.app.serverError(`${url} get Error!status=${result.status}`);
} else {
this.ctx.logger.info(`${url}-->Success!`)
return result.data;
}
},
async findLastKey (obj) {
var la = ""
for(var i in obj){
la = i
}
return la
},
async isArray(v){
return toString.apply(v) === '[object Array]';
},
async cloneArray (array){
if(!this.ctx.helper.isArray(array)){
return array
}else{
var r = []
for(var i in array){
r.push(underscore.clone(array[i]))
}
return r
}
},
async filterInsertSql(tablename,array) {
if(!array || !this.ctx.helper.isArray(array)||array.length == 0 ){
return null
}
var keyArr = []
for(var obj of array){
for(var key in obj ){
if(keyArr.indexOf(key) == -1){
keyArr.push(key)
}
}
}
for(var key of keyArr){
for(var v of array){
if( !(v[key] || v[key] == 0) ){
v[key] = null
}
}
}
var nArray = await this.ctx.helper.cloneArray(array)
array = []
for(var v of nArray){
var obj = {}
for(var k of keyArr){
obj[k] = v[k]
}
array.push(obj)
}
var preV = keyArr.join(',')
var pre = `insert into ${tablename} (${preV}) values `
var re = ""
for( var i = 0 ; i < array.length; i ++) {
var result = "("
var obj = array[i]
for(var k in obj){
switch(typeof obj[k]){
case 'string':
result+="'"+obj[k]+"'"
break
case 'boolean':
result+="'"+obj[k]+"'"
break
case 'number':
result+=obj[k]
break
case 'object':
result+=obj[k]
break
}
if( k!=await this.ctx.helper.findLastKey(obj)){
result+=','
}
}
result += ")"
re += result
if(i!=array.length - 1){
re += ','
}
}
return pre + re
},
//如果所以冲突则保留原值
async filterInsertSqlD(tablename,array) {
if(!array || !this.ctx.helper.isArray(array)||array.length == 0 ){
return null
}
let dObj = array[0]
let dStr = ``
for(let k in dObj){
dStr+=`${k}=${k},`
}
dStr = dStr.substr(0,dStr.length-1)
var keyArr = []
for(var obj of array){
for(var key in obj ){
if(keyArr.indexOf(key) == -1){
keyArr.push(key)
}
}
}
for(var key of keyArr){
for(var v of array){
if( !(v[key] || v[key] == 0) ){
v[key] = null
}
}
}
var nArray = await this.ctx.helper.cloneArray(array)
array = []
for(var v of nArray){
var obj = {}
for(var k of keyArr){
obj[k] = v[k]
}
array.push(obj)
}
var preV = keyArr.join(',')
var pre = `insert into ${tablename} (${preV}) values `
var re = ""
for( var i = 0 ; i < array.length; i ++) {
var result = "("
var obj = array[i]
for(var k in obj){
switch(typeof obj[k]){
case 'string':
result+="'"+obj[k]+"'"
break
case 'boolean':
result+="'"+obj[k]+"'"
break
case 'number':
result+=obj[k]
break
case 'object':
result+=obj[k]
break
}
if( k!=await this.ctx.helper.findLastKey(obj)){
result+=','
}
}
result += ")"
re += result
if(i!=array.length - 1){
re += ','
}
}
return pre + re + ` on duplicate key update `+dStr
},
//如果所以冲突则保留新值
async filterInsertSqlN(tablename,array) {
if(!array || !this.ctx.helper.isArray(array)||array.length == 0 ){
return null
}
let dObj = array[0]
let dStr = ``
for(let k in dObj){
dStr+=`${k}=values(${k}),`
}
dStr = dStr.substr(0,dStr.length-1)
var keyArr = []
for(var obj of array){
for(var key in obj ){
if(keyArr.indexOf(key) == -1){
keyArr.push(key)
}
}
}
for(var key of keyArr){
for(var v of array){
if( !(v[key] || v[key] == 0) ){
v[key] = null
}
}
}
var nArray = await this.ctx.helper.cloneArray(array)
array = []
for(var v of nArray){
var obj = {}
for(var k of keyArr){
obj[k] = v[k]
}
array.push(obj)
}
var preV = keyArr.join(',')
var pre = `insert into ${tablename} (${preV}) values `
var re = ""
for( var i = 0 ; i < array.length; i ++) {
var result = "("
var obj = array[i]
for(var k in obj){
switch(typeof obj[k]){
case 'string':
result+="'"+obj[k]+"'"
break
case 'boolean':
result+="'"+obj[k]+"'"
break
case 'number':
result+=obj[k]
break
case 'object':
result+=obj[k]
break
}
if( k!=await this.ctx.helper.findLastKey(obj)){
result+=','
}
}
result += ")"
re += result
if(i!=array.length - 1){
re += ','
}
}
return pre + re + ` on duplicate key update `+dStr
},
async filterInsert (array) {
var re = ""
for( var i = 0 ; i < array.length; i ++) {
var result = "("
var obj = array[i]
for(var k in obj){
result+="'"+obj[k]+"'"
if( k!=await this.ctx.helper.findLastKey(obj)){
result+=','
}
}
result += ")"
re += result
if(i!=array.length - 1){
re += ','
}
}
return re
},
async getImageBase64(url){
let result = await this.ctx.curl(url);
let data = result.data
return data.toString('base64')
},
async getImageBase64Ext(url){
let result = await this.ctx.curl(url);
let data = result.data
let ext = result.headers["content-type"]
return `data:${ext};base64,${data.toString('base64')}`
}
};