Commit 5ced773c by 蒋勇

d

parent 215fefeb
......@@ -8,7 +8,7 @@
"type": "node",
"request": "launch",
"name": "Launch Program",
"program": "${workspaceFolder}/bigdata/main.js"
"program": "${workspaceFolder}/center-manage/main.js"
}
]
}
\ No newline at end of file
......@@ -3,11 +3,20 @@ const uuidv4 = require('uuid/v4');
const settings = require("../../config/settings");
class APIBase{
constructor() {
super();
this.cacheManager = system.getObject("db.common.cacheManager");
}
async doexec(gname, methodname, pobj, query, req) {
try {
console.log("**********************************************")
console.log(req.headers)
let custtags=req.headers["x-consumetag"].split("|");
req.xctx={
appkey:req.headers["x-appkey"],
companyid:custtags[0].split("_")[1],
password:custtags[1].split("_")[1],
username:req.headers["x-consumer-username"],
credid:req.headers["x-credential-identifier"]
}
var rtn = await this[methodname](pobj, query, req);
return rtn;
} catch (e) {
......
......@@ -9,6 +9,22 @@ class AccessAuthAPI extends APIBase {
this.authUtils = system.getObject("util.businessManager.authUtils");
this.userSve = system.getObject("service.auth.userSve");
}
//不从平台应用列表入口登录时
//先要调用平台登录接口
//返回token,利用这个token再去登录某个具体APP
//会话存储具体APP的用户信息
//每个前端应用打开时,先检查是否存在token
//如果存在,就去访问获取用户信息,---调用本接口--即刻
//进入或登录某个具体应用
//前提是已经具备了统一管理的账号,并且已经在统一管理账号登录,客户端具备了token
//进入某个具体应用时,需要指定 x-appkey请求头
//
async loginToApp(p,q,req){
let appkey=req.xctx.appkey;
}
classDesc() {
return {
groupName: "auth",
......
var APIBase = require("../../api.base");
var system = require("../../../system");
var settings = require("../../../../config/settings");
class AppAPI extends APIBase {
constructor() {
super();
this.appS = system.getObject("service.common.appSve");
}
async create(pobj,q,req){
// console.log("oooooooooooooooooooooooooooooooooooooooooooooooo")
// console.log(req.xctx)
let rtn=this.appS.create(pobj,q,req);
return system.getResult(rtn);
}
async del(pobj,q,req){
let rtn=this.appS.delete(pobj,q,req);
return system.getResult(rtn);
}
classDesc() {
return {
groupName: "auth",
groupDesc: "认证相关的包",
name: "AccessAuthAPI",
desc: "关于认证的类",
exam: `
post http://p.apps.com/api/auth/accessAuth/getAccessKey
{
appKey:xxxxx,
secret:yyyyyy
}
`,
};
}
methodDescs() {
return [
];
}
exam() {
return ``
}
}
module.exports = AppAPI;
......@@ -12,7 +12,9 @@ class CtlBase {
return ClassObj["name"].substring(0, ClassObj["name"].lastIndexOf("Ctl")).toLowerCase() + "Sve";
}
async setContextParams(pobj, qobj, req) {
req.xctx={
appkey:req.headers["x-appkey"],
}
}
async doexec(methodname, pobj, query, req) {
try {
......
......@@ -3,14 +3,10 @@ const http = require("http")
const querystring = require('querystring');
var settings = require("../../../../config/settings");
const CtlBase = require("../../ctl.base");
const logCtl = system.getObject("web.common.oplogCtl");
var cacheBaseComp = null;
class UserCtl extends CtlBase {
constructor() {
super("auth", CtlBase.getServiceName(UserCtl));
//this.loginS=system.getObject("service.userSve");
this.acS = system.getObject("service.auth.accountSve");
this.companyS = system.getObject("service.common.companySve");
}
async initNewInstance(queryobj, req) {
......@@ -19,287 +15,36 @@ class UserCtl extends CtlBase {
return system.getResultSuccess(rtn);
}
//获取验证码,发送给指定手机
async fetchVcode(pobj, qobj, req) {
var mobile = pobj.u;
//生成一个验证码,发送
// var vcode = await this.service.getUidStr(6, 10);
// await this.smsS.sendMsg(mobile, vcode);
return system.getResult({ vcodestr: "123" });
}
async checkLogin(gobj, qobj, req) {
//当前如果缓存中存在user,还是要检查当前user所在的域名,如果不和来访一致,则退出重新登录
if (req.session.user) {
var x = null;
if (req.session.user.Roles) {
x = req.session.user.Roles.map(r => { return r.code });
}
var tmp = {
id: req.session.user.id,
userName: req.session.user.userName,
nickName: req.session.user.nickName,
mobile: req.session.user.mobile,
isAdmin: req.session.user.isAdmin,
isSuper:req.session.user.isSuper,
created_at: req.session.user.created_at,
email: req.session.user.email,
headUrl: req.session.user.headUrl,
roles: x ? x.join(",") : "",
owner:req.session.user?req.session.user.owner:null,
tanentor_id:req.session.user?req.session.user.tanentor_id:null,
}
return system.getResult(tmp, "操作成功", req);
} else {
req.session.user = null;
//req.session.destroy();
return system.getResult(null, "操作失败", req);
}
async sendVCode(pobj, qobj, req) {
var mobile = pobj.mobile;
let v=await this.smsS.sendVCode(mobile);
return system.getResult({ vcodestr: v });
}
async exit(pobj, qobj, req) {
if(req.session.app.id==settings.platformid){
req.session.user = null;
req.session.tocompany=null;
req.session.destroy();
return system.getResultSuccess({ "env": settings.env });
}else{
req.session.user=req.session.originalUID;
req.session.app=req.session.originalAPP;
return system.getResultSuccess({ "env": settings.env });
}
}
/**
*
* //用户重名检查--account
*
* 先按照username和password检查,是否存在account,
* 如果不存在account(第一次注册),检查查询字符串中是否存在appkey,
* 如果不存在说明是平台用户注册,就从会话中取出app_id
*
* 如果存在(已经注册过)
* 检查查询字符串appkey,如果存在,那么就按照appkey和userName和password去查看是否存在用户
* 如果存在,提示已经有同名用户存在;
* 如果不存在,那么就创建app下的用户
* 如果不存在,就按照会话中app_id去查看是否存在用户
*
*/
//重名检查,检查是否有
async checkSameName(pobj, qobj, req) {
var uname = pobj.uname;
//按照appid查询出app
var rtn = await this.service.checkSameName(uname, req.appid);
async pmregister(pobj, qobj, req) {
//平台注册设置平台的应用ID
pobj.app_id=settings.pmappid;
var rtn=await this.service.pmregister(pobj);
return system.getResult(rtn);
}
/**
* 查询某一个应用管理员信息
* @param {*} pobj
* @param {*} qobj
* @param {*} req
*/
async findAppAdmin(pobj, qobj, req) {
var appid = pobj.appid;
var user = await this.service.findOne({ isAdmin: true, app_id: appid });
return system.getResult(user);
}
async register(pobj, qobj, req) {
var appid = req.session.app.id;
var jumpUrl = req.session.app.authUrl;
var fmuser = pobj.u;
fmuser.app_id = req.appid;
if (!fmuser.userName) {
return system.getResult(null, "用户名不能为空");
}
if (!fmuser.mobile) {
return system.getResult(null, "手机号不能为空");
}
if (!fmuser.password) {
return system.getResult(null, "密码不能为空");
}
if (appid == settings.platformid){//如果是开放平台应用注册,设置所属公司
fmuser.owner_id=settings.platformid;
}else{//否则 todo
if(!fmuser.owner_id && req.session.tocompany){
fmuser.owner_id=req.tocompanyid;
}
}
var ruser = await this.service.register(fmuser);
if (ruser) {
if (appid != settings.platformid) {//说明是委托注册或登录
// this.redisClient.setWithEx(req.session.id,ruser,3600);
await this.cacheManager["OpenCodeCache"].cache(req.session.id, ruser, 30);
jumpUrl = jumpUrl + "?code=" + req.session.id;
} else {
//登录
req.session.user = ruser;
//设置系统默认公司
var pcompany=await this.companyS.findById(settings.platformcompanyid);
req.session.company=pcompany;
}
return system.getResultSuccess({ user: ruser, jumpUrl: jumpUrl });
} else {
return system.getResult(null, "用户已存在, 请修改并重试");
}
}
//管理员新增用户,设置默认密码
async create(pobj, queryobj, req) {
pobj.appid = req.appid;
pobj.owner_id=req.tocompanyid;
//新增用户时,获取当前用户的租户id
pobj.tanentor_id=req.session.user.tanentor_id;
var rtn=await this.service.createUser(pobj);
var rtn=await this.service.register(pobj);
return system.getResult(rtn);
}
/**
* inuser 当前的req.session.app不是平台时,退出按钮关闭的是
* req.session.inuser
* @param {*} req
*/
async authByCode(req) {
var opencode = req.query.code;
var user = await this.service.authByCode(opencode);
if (user) {
req.session.originalUID=req.session.user;
req.session.originalAPP=req.session.app;
req.session.user = user;//防止覆盖租户的session
req.session.tocompany=user.owner;//从应用中导航到平台管理,平台完成登录
} else {
req.session.user = null;
}
return user;
}
// async bindCompany(p,q,req){
// var cmpinfo=p.u;
// var cmp=await this.service.bindCompany(cmpinfo,req.session.user.id);
// req.session.company=cmp;
// return system.getResult(cmp);
// }
//非开放平台登录方法
async goLoginForApp(p,q,req){
//判断应用的类型,如果是非UI应用
//那么需要直接进入当前应用为上下文
var app=p;
var appid=app.id;
var jumpUrl = app.authUrl;
var usercurrent=req.session.user;
var pobj={};
pobj.u={
userName:usercurrent.userName,
password:usercurrent.password,
mobile:usercurrent.mobile,
app_id:appid,
isNavto:true,
owner_id:req.session.tocompany?req.session.tocompany.id:null
}
var existedUser = await this.service.getUserByUserNamePwd(pobj.u);
if (existedUser != null) {
await this.cacheManager["OpenCodeCache"].cache(req.session.id, existedUser, 60);
jumpUrl = jumpUrl + "?code=" + req.session.id;
//如果非web应用,直接进入后台
return system.getResult({ user: existedUser, jumpUrl: jumpUrl });
}else {
return system.getResultFail(-1, "账号或密码有误.");
}
async pmlogin(pobj, qobj, req) {
//平台注册设置平台的应用ID
let rtn=await this.service.pmlogin(pobj, qobj,req);
return system.getResult(rtn);
}
async sysManageForApp(pobj, qobj, req){
var user=req.session.user;
var u={userName:user.userName,password:user.password,mobile:user.mobile,owner_id:pobj.id};
var appid = req.session.app.id;
var jumpUrl = req.session.app.authUrl;
if (req.session.toapp) {
jumpUrl = req.session.toapp.authUrl;
u.isNavto=true;
//state为p_app表中appkey
} else{
u.isNavto=false;
}
//登录其它应用,是当前应用的用户要进入其它应用,上下文是当前应用,用户是当前应用的用户
//这种场景是重用目标应用时,比如管理平台重用
//非重用目标应用,需要切换为目标应用的用户
//而要进入其它应用切换身份,需要在设置上下文时,设为目标应用的ID
u.app_id = appid;
var existedUser = await this.service.getUserByUserNamePwd(u);
if (existedUser != null) {
if (appid != settings.platformid) {//非平台应用
await this.cacheManager["OpenCodeCache"].cache(req.session.id, existedUser, 60);
jumpUrl = jumpUrl + "?code=" + req.session.id;
if (req.session.toapp) {
//srcKey是进入到平台管理后,显示来源APP的信息;进入其它应用时,也传递以备后用
jumpUrl = jumpUrl + "&srcKey=" + req.session.app.appkey;
}
}
if (!existedUser.isEnabled) {
return system.getResultFail(system.waitAuditApp, "您的账户处于待审核等待启用状态.");
}else{
return system.getResult({ user: existedUser, jumpUrl: jumpUrl });
}
}else{
return system.getResultFail(-1, "无权进入本系统,请联系服务提供商");
}
async pmloginByVCode(pobj, qobj, req){
let rtn=this.service.pmloginByVCode(pobj, qobj);
return system.getResult(rtn);
}
async login(pobj, qobj, req) {
var appid = req.session.app.id;
var jumpUrl = req.session.app.authUrl;
if (req.session.toapp) {
jumpUrl = req.session.toapp.authUrl;
pobj.u.isNavto=true;
//state为p_app表中appkey
} else{
pobj.u.isNavto=false;
}
//登录其它应用,是当前应用的用户要进入其它应用,上下文是当前应用,用户是当前应用的用户
//这种场景是重用目标应用时,比如管理平台重用
//非重用目标应用,需要切换为目标应用的用户
//而要进入其它应用切换身份,需要在设置上下文时,设为目标应用的ID
pobj.u.app_id = appid;
if(req.session.toapp && req.session.toapp.id!=settings.platformid){
pobj.u.app_id=req.session.toapp.id;
}
if(!pobj.u.owner_id){//说明不是从平台界面,利用go进入,所以是自主登录
pobj.u.owner_id=pobj.tocompanyid;
}
var existedUser = await this.service.getUserByUserNamePwd(pobj.u);
if (existedUser != null) {
if (appid != settings.platformid) {//非平台应用
await this.cacheManager["OpenCodeCache"].cache(req.session.id, existedUser, 60);
jumpUrl = jumpUrl + "?code=" + req.session.id;
if (req.session.toapp) {
//srcKey是进入到平台管理后,显示来源APP的信息;进入其它应用时,也传递以备后用
jumpUrl = jumpUrl + "&srcKey=" + req.session.app.appkey;
}
} else {
req.session.user = existedUser;
//查询出companys信息,缓存当前的compnay,todo 放到service
var pcompany=await this.companyS.findById(settings.platformcompanyid);
req.session.company=pcompany;
//设置平台登录后默认要去往的租户公司
//查看用户身上是否有tanentor_id值,如果没有,说明是平台租户
var maproleids= existedUser.Roles.map((r)=>r.id);
var istanentorpassrole=maproleids.indexOf(settings.passroleid)>=0 || maproleids.indexOf(settings.commonroleid)>=0;
if(istanentorpassrole && !existedUser.isAdmin && !existedUser.isSuper){
var coms=existedUser.companies;
if(coms && coms.length>1){//因为平台默认公司的存在
var comfinds=coms.find((item)=>{
return item.usercompany.isCurrent==true;
});
if(comfinds){
req.session.tocompany=comfinds;
}
}
}else{
req.session.tocompany=existedUser.owner;
}
}
if (!existedUser.isEnabled) {
return system.getResultFail(system.waitAuditApp, "您的账户处于待审核等待启用状态.");
}
return system.getResult({ user: existedUser, jumpUrl: jumpUrl });
} else {
return system.getResultFail(-1, "账号或密码有误.");
}
async sendVCode(pobj, qobj,req){
let rtn=await this.service.sendVCode(pobj, qobj);
return system.getResult(rtn);
}
}
module.exports = UserCtl;
......@@ -53,6 +53,8 @@ class DbFactory{
this.db.models.org.belongsTo(this.db.models.company,{constraints: false,});
this.db.models.auth.belongsTo(this.db.models.company,{constraints: false,});
this.db.models.route.belongsTo(this.db.models.app,{constraints: false,});
this.db.models.plugin.belongsTo(this.db.models.app,{constraints: false,});
}
//async getCon(){,用于使用替换table模型内字段数据使用
getCon(){
......
......@@ -9,11 +9,19 @@ const md5 = require("MD5");
var dbf=system.getObject("db.common.connection");
var db=dbf.getCon();
db.sync({force:true}).then(async ()=>{
const User=db.models.user;
User.create({userName:"sm",password:md5("123"+ "_" + settings.salt),isSuper:true,isAdmin:true,isEnabled:true,nickName:"superman"}).then(function(u){
console.log("sync complete...");
const apps=await system.getObject("service.common.appSve");
let appnew=await apps.create( {
"name":"center-app",
"domainName":"t9.com",
"backend":"cm.com"
});
let Role=db.models["role"];
await Role.create({code:"ta",name:"租户",app_id:appnew.id,company_id:settings.pmcompanyid})
const us=await system.getObject("service.auth.userSve");
let usuper=await us.pmregister({userName:"sm",password:"951753",isSuper:true,isAdmin:true,isEnabled:true,nickName:"superman",app_id:appnew.id,company_id:settings.id})
//创建role
// if(settings.env=="prod"){
......
const system = require("../../../system");
const settings = require("../../../../config/settings");
const appconfig=system.getSysConfig();
module.exports = (db, DataTypes) => {
return db.define("plugin", {
name: {
type: DataTypes.STRING,
allowNull: false,
},//和user的from相同,在注册user时,去创建
}, {
paranoid: true,//假的删除
underscored: true,
version: true,
freezeTableName: true,
//freezeTableName: true,
// define the table's name
tableName: 'p_plugin',
validate: {
},
indexes: [
// Create a unique index on email
// {
// unique: true,
// fields: ['email']
// },
//
// // Creates a gin index on data with the jsonb_path_ops operator
// {
// fields: ['data'],
// using: 'gin',
// operator: 'jsonb_path_ops'
// },
//
// // By default index name will be [table]_[fields]
// // Creates a multi column partial index
// {
// name: 'public_by_author',
// fields: ['author', 'status'],
// where: {
// status: 'public'
// }
// },
//
// // A BTREE index with a ordered field
// {
// name: 'title_index',
// method: 'BTREE',
// fields: ['author', {attribute: 'title', collate: 'en_US', order: 'DESC', length: 5}]
// }
]
});
}
const system = require("../../../system");
const settings = require("../../../../config/settings");
const appconfig=system.getSysConfig();
module.exports = (db, DataTypes) => {
return db.define("route", {
name: {
type: DataTypes.STRING,
allowNull: false,
},//和user的from相同,在注册user时,去创建
center_id: {
type: DataTypes.STRING,
allowNull: false,
},//和user的from相同,在注册user时,去创建
}, {
paranoid: true,//假的删除
underscored: true,
version: true,
freezeTableName: true,
//freezeTableName: true,
// define the table's name
tableName: 'p_route',
validate: {
},
indexes: [
// Create a unique index on email
// {
// unique: true,
// fields: ['email']
// },
//
// // Creates a gin index on data with the jsonb_path_ops operator
// {
// fields: ['data'],
// using: 'gin',
// operator: 'jsonb_path_ops'
// },
//
// // By default index name will be [table]_[fields]
// // Creates a multi column partial index
// {
// name: 'public_by_author',
// fields: ['author', 'status'],
// where: {
// status: 'public'
// }
// },
//
// // A BTREE index with a ordered field
// {
// name: 'title_index',
// method: 'BTREE',
// fields: ['author', {attribute: 'title', collate: 'en_US', order: 'DESC', length: 5}]
// }
]
});
}
......@@ -6,11 +6,13 @@ class UserService extends ServiceBase {
constructor() {
super("auth", ServiceBase.getDaoName(UserService));
this.companyDao=system.getObject("db.common.companyDao");
this.roleDao=system.getObject("db.common.roleDao");
}
//平台注册,默认角色,不具备平台级别的管理或运营功能
//注册接口
//封装kongurl
async register(p,q){
async pmregister(p,q){
var self=this;
let tmppwd=p.password;
if(!tmppwd){
......@@ -22,8 +24,13 @@ class UserService extends ServiceBase {
let cmp=await self.companyDao.create({name:p.userName+"的公司"},t);
p.company_id=cmp.id;
let u=await self.dao.create(p,t)
//设置默认角色,租户
//设置默认普通角色,由于有了租户概念,所以注册时,需要知道当前租户和应用的id 才可以设置默认角色 todo
var role = await self.roleDao.model.findOne({ where: { code: "ta" }, transaction: t });
await u.setRoles([role], { transaction: t });
//创建统一账号
let cred=await self.cregister(u.userName,cmp.id)
let cred=await self.cregister(u.userName,cmp.id,p.password)
console.log("......................................");
console.log(cred.consumer.id);
if(cred){
......@@ -43,18 +50,29 @@ class UserService extends ServiceBase {
}
});
}
//平台登录
//登录接口封装kong-url
//登录路由放行
//p里面含有appkey,company_id,userName,password
async login(p,q){
async pmlogin(p,q,req){
var self=this;
//先要按照用户名,在统一账户中查找存在性
//如果不存在
let consumer=await this.cget(UserService.consumerUrl(p.userName));
if(!consumer.data){
return null;
}else{
let password=consumer.data.tags[1].split("_")[1];
let inpassword=this.getEncryptStr(p.password);
if(password!=inpassword){
return null;
}
}
var rtn={}
return this.db.transaction(async function (t) {
p.password=this.getEncryptStr(p.password);
let userfind=await self.dao.findOne(p);
let userfind=await self.dao.findOne({userName:p.userName,app_id:settings.pmappid,company_id:settings.pmcompanyid});
if(userfind){
let token= self.cmakejwt(userfind.jwtkey,userfind.jwtsecret,null);
let token= await self.cmakejwt(userfind.jwtkey,userfind.jwtsecret,null);
rtn.token=token;
rtn.user=userfind;
return rtn;
......@@ -63,49 +81,56 @@ class UserService extends ServiceBase {
}
})
}
//平台注册与登录
//用户验证码登录
//
async loginByVCode(p,q,req){
async pmloginByVCode(p,q,req){
var rtn={}
//检查传递过来的手机验证码是否与缓存的一致
let mobile=p.mobile;
let vcode=p.vcode;
let cachevcode=await this.cacheManager ["vcodeCache"].getCache(mobile,60000)
if(vcode!==cachevcode){
let cachevcode=await this.cacheManager ["VCodeCache"].getCache(mobile,60)
if(vcode!=cachevcode.vcode){
return null;
}else{
//检查是否在库里存在
//appkey--company_id---需要控制器基类里设置到p对象里
let user=await this.findOne({userName:mobile,appkey:p.appkey,company_id:p.company_id})
let user=await this.findOne({userName:mobile,app_id:settings.pmappid,company_id:settings.pmcompanyid})
if(user){
//生成token
let token= await this.cmakejwt(user.jwtkey,user.jwtsecret,null);
rtn.token=token;
rtn.user=user;
return rtn;
}else{
//先按照用户名查续身份信息,获取key,secret,
let u=await this.register({userName:mobile,appkey:p.appkey,company_id:p.company_id});
let u=await this.pmregister({userName:mobile,nickName:mobile});
let token= await this.cmakejwt(u.jwtkey,u.jwtsecret,null);
rtn.token=token;
rtn.user=u;
return rtn;
}
}
//不一致那么就
}
//发送手机验证码并缓存
async sendVCode(p,q,req){
let mobile=p.mobile;
let vcodeobj=this.cacheManager ["vcodeCache"].cache(mobile,null,60000);
let vcodeobj=await this.cacheManager ["VCodeCache"].cache(mobile,null,60);
return vcodeobj.vcode;
}
async reSendVCode(p,q,req){
let mobile=p.mobile;
await this.cacheManager ["vcodeCache"].invalidate(mobile);
let vcodeobj=await this.cacheManager ["vcodeCache"].cache(mobile,null,60000);
await this.cacheManager ["VCodeCache"].invalidate(mobile);
let vcodeobj=await this.cacheManager ["VCodeCache"].cache(mobile,null,60);
return vcodeobj.vcode;
}
//创建统一账号及jwt身份
async cregister(uname,cmpid){
async cregister(uname,cmpid,pass){
try{
var rtn2=null;
let rtn=await system.postJsonTypeReq(UserService.newConsumerUrl(),{username:uname,tags:["cmp_"+cmpid]})
let rtn=await system.postJsonTypeReq(UserService.newConsumerUrl(),{username:uname,tags:["cmp_"+cmpid,"pass_"+pass]})
console.log(rtn)
if(rtn.statusCode==409){
throw new Error("已经存在相同的统一账号名称!");
......@@ -135,8 +160,8 @@ class UserService extends ServiceBase {
return promise;
}
//只要登录 生成新的访问jwttoken
async cmakejwt(uname,opts){
var token =await this.jwtsign('a36c3049b36249a3c9f8891cb127243c', 'e71829c351aa4242c2719cbfbe671c09',opts);
async cmakejwt(key,secret,opts){
var token =await this.jwtsign(key, secret,opts);
return token;
}
......@@ -165,14 +190,14 @@ class UserService extends ServiceBase {
}
module.exports = UserService;
// (async ()=>{
let u=new UserService();
// // let x=await u.cregister("jiangong")
// // console.log(x)
// // let x=await u.cunregister("jiangong")
// // console.log(x)
// // let t=await u.cmakejwt()
// // console.log(t)
let ux=u.register({userName:"jiangyong3",password:"123"})
console.log(ux);
// })()
\ No newline at end of file
// // (async ()=>{
// let u=new UserService();
// // // let x=await u.cregister("jiangong")
// // // console.log(x)
// // // let x=await u.cunregister("jiangong")
// // // console.log(x)
// // // let t=await u.cmakejwt()
// // // console.log(t)
// let ux=u.register({userName:"jiangyong3",password:"123"})
// console.log(ux);
// // })()
\ No newline at end of file
const system=require("../../../system");
const settings=require("../../../../config/settings");
const ServiceBase=require("../../sve.base")
var WXPay = require('wx-pay');
const uuidv4 = require('uuid/v4');
class ApiTradeService extends ServiceBase{
constructor(){
super("common",ServiceBase.getDaoName(ApiTradeService));
this.appS=system.getObject("service.common.appSve");
}
async create(tradeObj){
var self=this;
return this.db.transaction(async function (t){
//获取缓存二个值,一个是赠送次数,一个是调用价格,取目标应用的appkey
var pconfig=await self.cacheManager["PConfigCache"].cache(tradeObj.destappkey,null,null);
var apiInitGift = pconfig.find(item => {
return item.configType === "apiInitGift";
});
var apiCallPrice = pconfig.find(item => {
return item.configType === "apiCallPrice";
});
var callCache=await self.cacheManager["ApiCallCountCache"].getApiCallCount(tradeObj.srcappkey,tradeObj.op);
var callAccuCache=await self.cacheManager["ApiAccuCache"].getApiCallAccu(tradeObj.srcappkey+"_"+tradeObj.destappkey);
//需要每次增加计数之前,通知目标app,目前的计数值,由目标APP来决定是否准许访问
var appdest=await self.cacheManager["AppCache"].cache(tradeObj.destappkey);
if(appdest.id!=settings.platformid){
var recvCountNotityUrl=appdest.notifyCacheCountUrl;
self.apiCallWithAk(recvCountNotityUrl,callAccuCache);
}else{
self.appS.recvNotificationForCacheCount(callAccuCache);
}
var calledCount=Number(callCache.callcount);
var balance=Number(callCache.amount);
if(calledCount>Number(apiInitGift?apiInitGift.configValue:0)){//调用次数大于免费次数
tradeObj.amount=Number(apiCallPrice?apiCallPrice.configValue:0);
}else{
tradeObj.amount=0;
}
//解决日志大于4000写入的问题
if(tradeObj.params.length>3980){
tradeObj.params=tradeObj.params.substring(0,3980);
}
var apitrade=await self.dao.model.create(tradeObj,{transaction:t});
//按照调用方法缓存
await self.cacheManager["ApiCallCountCache"].addCallCount(tradeObj.srcappkey,tradeObj.op,1);
await self.cacheManager["ApiCallCountCache"].addCallBalance(tradeObj.srcappkey,tradeObj.op,tradeObj.amount);
//累计缓存调用次数和金额
await self.cacheManager["ApiAccuCache"].addCallCount(tradeObj.srcappkey+"_"+tradeObj.destappkey,1);
await self.cacheManager["ApiAccuCache"].addCallBalance(tradeObj.srcappkey+"_"+tradeObj.destappkey,tradeObj.amount);
// await self.cacheManager["ApiCircuitBreakers"].addCallCount(-1);
return apitrade;
});
}
async beforesel(tradeObj){
var self=this;
var callCaches=await self.cacheManager["ApiCircuitBreakers"].getApiCall();
var calledCounts=Number(callCaches.callcount);
if( calledCounts>100 ){
// return {status:-1,msg:"服务器繁忙,请稍候再试",data:null};
}
else {
// await self.cacheManager["ApiCircuitBreakers"].addCallCount(1);
}
var callCache=await self.cacheManager["ApiCircuitBreakerCache"].getApiCall(tradeObj.appkey);
var calledCount=Number(callCache.callcount);
if( calledCount>1000 ){
return {status:-1,msg:"调用次数太多,请稍候再试",data:null};
}
else {
var result=await self.cacheManager["ApiCircuitBreakerCache"].addCallCount(tradeObj.appkey,1);
}
return {status:1,msg:"OK"};
}
}
module.exports=ApiTradeService;
......@@ -6,6 +6,7 @@ class AppService extends ServiceBase {
constructor() {
super("common", ServiceBase.getDaoName(AppService));
this.userS = system.getObject("service.auth.userSve");
this.routeDao=system.getObject("db.common.routeDao");
}
async getApp(appkey) {
return this.cacheManager["AppCache"].cache(appkey, null);
......@@ -43,20 +44,32 @@ class AppService extends ServiceBase {
return dicRtn;
}
//创建应用
//每个应用建立两个路由,一个api路由
//对api路由启用jwt插件
async create(pobj, qobj, req) {
var self = this;
return this.db.transaction(async function (t) {
console.log(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
var app = await self.dao.create(pobj, t);
//创建后台应用服务
console.log(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
let svobj=await self.cjsonregister(AppService.newServiceUrl(),{name:app.name,url:"http://"+app.backend})
//添加路由
let routeobj=await self.cjsonregister(AppService.newRouteUrl(app.name),{name:app.name,hosts:[app.domainName]})
if(svobj && routeobj){
let routeapi=await self.cjsonregister(AppService.newRouteUrl(app.name),{name:app.name+"_api",hosts:[app.domainName],paths:["/api"],strip_path:false})
let r1=await self.routeDao.create({name:app.name,center_id:routeobj.id},t);
let r2=await self.routeDao.create({name:app.name+"_api",center_id:routeapi.id},t);
//给api路由启动插件
await self.cjsonregister(AppService.bindPluginUrl(app.name+"_api"),{name:"jwt"})
if(svobj && routeobj && r1 && r2){
try{
app.appkey=svobj.id;
await app.save({transaction:t});
}catch(e){
await self.cdel(AppService.routeUrl(app.name))
await self.cdel(AppService.routeUrl(app.name+"_api"))
await self.cdel(AppService.serviceUrl(app.name))
}
}else{
......@@ -72,6 +85,8 @@ class AppService extends ServiceBase {
await self.dao.delete(pobj,t)
//删除路由
await self.cdel(AppService.routeUrl(pobj.name));
//删除api路由
await self.cdel(AppService.routeUrl(pobj.name+"_api"));
//删除服务
await self.cdel(AppService.serviceUrl(pobj.name));
return {}
......@@ -85,20 +100,20 @@ class AppService extends ServiceBase {
}
}
module.exports = AppService;
(async ()=>{
let u=new AppService();
// let x=await u.cregister("jiangong")
// console.log(x)
// let x=await u.cunregister("jiangong")
// console.log(x)
// let t=await u.cmakejwt()
// console.log(t)
//let ux=await u.cjsonregister(AppService.newRouteUrl("test-service2"),{name:"test-service2",hosts:["ttest1.com"]})
//let ux=await u.cjsonregister(AppService.newServiceUrl(),{name:"test-service3",url:"http://zhichan.gongsibao.com"})
//let ux=await u.cdel(AppService.routeUrl("test-service2"))
//let ux=await u.cdel(AppService.serviceUrl("test-service2"))
// let ux=await u.create({name:"test4-service",backend:"zhichan-service",domainName:"domain.com"})
// console.log(ux);
// let delrtn=await u.delete({id:2,name:"test4-service"})
// console.log(delrtn);
})()
\ No newline at end of file
// (async ()=>{
// let u=new AppService();
// // let x=await u.cregister("jiangong")
// // console.log(x)
// // let x=await u.cunregister("jiangong")
// // console.log(x)
// // let t=await u.cmakejwt()
// // console.log(t)
// //let ux=await u.cjsonregister(AppService.newRouteUrl("test-service2"),{name:"test-service2",hosts:["ttest1.com"]})
// //let ux=await u.cjsonregister(AppService.newServiceUrl(),{name:"test-service3",url:"http://zhichan.gongsibao.com"})
// //let ux=await u.cdel(AppService.routeUrl("test-service2"))
// //let ux=await u.cdel(AppService.serviceUrl("test-service2"))
// // let ux=await u.create({name:"test4-service",backend:"zhichan-service",domainName:"domain.com"})
// // console.log(ux);
// // let delrtn=await u.delete({id:2,name:"test4-service"})
// // console.log(delrtn);
// })()
\ No newline at end of file
const system = require("../../../system");
const ServiceBase = require("../../sve.base");
const settings = require("../../../../config/settings");
const appconfig = system.getSysConfig();
class AppService extends ServiceBase {
constructor() {
super("common", ServiceBase.getDaoName(AppService));
this.userS = system.getObject("service.auth.userSve");
}
async getApp(appkey) {
return this.cacheManager["AppCache"].cache(appkey, null);
}
async findAllApps(uid) {
var apps=null;
var dicRtn = {};
var wheresql= {};
if(uid){
wheresql[this.db.Op.and]={
[this.db.Op.or]:
[
{isPublish:false, creator_id: uid},
{isEnabled: true,isPublish:true}
],
};
apps = await this.dao.model.findAll({
where: wheresql,
attributes: ['id', 'name', 'appkey', 'showimgUrl', 'appType', 'docUrl','homePage'] });
}else{
wheresql= {isEnabled: true,isPublish:true};
apps = await this.dao.model.findAll({
where: wheresql,
attributes: ['id', 'name', 'appkey', 'showimgUrl', 'appType', 'docUrl','homePage'] });
}
for (var app of apps) {
var tmk = uiconfig.config.pdict.app_type[app.appType];
if (!dicRtn[tmk]) {
dicRtn[tmk] = [];
dicRtn[tmk].push(app);
} else {
dicRtn[tmk].push(app);
}
}
return dicRtn;
}
//创建应用
//每个应用建立两个路由,一个api路由
//对api路由启用jwt插件
async create(pobj, qobj, req) {
var self = this;
return this.db.transaction(async function (t) {
var app = await self.dao.create(pobj, t);
//创建后台应用服务
let svobj=await self.cjsonregister(AppService.newServiceUrl(),{name:app.name,url:"http://"+app.backend})
//添加路由
let routeobj=await self.cjsonregister(AppService.newRouteUrl(app.name),{name:app.name,hosts:[app.domainName]})
let routeapi=await self.cjsonregister(AppService.newRouteUrl(app.name),{name:app.name+"_api",hosts:[app.domainName],paths:["/api"],strip_path:false})
//给api路由启动插件
if(svobj && routeobj){
try{
app.appkey=svobj.id;
await app.save({transaction:t});
}catch(e){
await self.cdel(AppService.routeUrl(app.name))
await self.cdel(AppService.routeUrl(app.name+"_api"))
await self.cdel(AppService.serviceUrl(app.name))
}
}else{
throw new Error("创建应用服务失败");
}
return app;
});
}
//删除应用
async delete(pobj, qobj){
var self=this;
return this.db.transaction(async function (t) {
await self.dao.delete(pobj,t)
//删除路由
await self.cdel(AppService.routeUrl(pobj.name));
//删除api路由
await self.cdel(AppService.routeUrl(pobj.name+"_api"));
//删除服务
await self.cdel(AppService.serviceUrl(pobj.name));
return {}
})
}
async findAndCountAll(obj) {
var self = this;
const apps = await super.findAndCountAll(obj);
return apps;
}
}
module.exports = AppService;
// (async ()=>{
// let u=new AppService();
// // let x=await u.cregister("jiangong")
// // console.log(x)
// // let x=await u.cunregister("jiangong")
// // console.log(x)
// // let t=await u.cmakejwt()
// // console.log(t)
// //let ux=await u.cjsonregister(AppService.newRouteUrl("test-service2"),{name:"test-service2",hosts:["ttest1.com"]})
// //let ux=await u.cjsonregister(AppService.newServiceUrl(),{name:"test-service3",url:"http://zhichan.gongsibao.com"})
// //let ux=await u.cdel(AppService.routeUrl("test-service2"))
// //let ux=await u.cdel(AppService.serviceUrl("test-service2"))
// // let ux=await u.create({name:"test4-service",backend:"zhichan-service",domainName:"domain.com"})
// // console.log(ux);
// // let delrtn=await u.delete({id:2,name:"test4-service"})
// // console.log(delrtn);
// })()
\ No newline at end of file
const system = require("../../../system");
const ServiceBase = require("../../sve.base");
const settings = require("../../../../config/settings");
const appconfig = system.getSysConfig();
class RouteService extends ServiceBase {
constructor() {
super("common", ServiceBase.getDaoName(AppService));
}
//创建应用
//每个应用建立两个路由,一个api路由
//对api路由启用jwt插件
async create(serviceName, routedata, req) {
var self = this;
return this.db.transaction(async function (t) {
var rtn=null;
try {
//添加路由
let routeobj = await self.cjsonregister(AppService.newRouteUrl(serviceName), { name: routedata.name, hosts: routedata.hosts, paths: routedata.paths, strip_path: routedata.isstrip })
routedata.center_id = routeobj.id;
rtn = await self.dao.create(routedata, t);
} catch (e) {
await self.cdel(AppService.routeUrl(routedata.name));
}
return rtn;
});
}
async findAndCountAll(obj) {
var self = this;
const apps = await super.findAndCountAll(obj);
return apps;
}
}
module.exports = RouteService;
// (async ()=>{
// let u=new AppService();
// // let x=await u.cregister("jiangong")
// // console.log(x)
// // let x=await u.cunregister("jiangong")
// // console.log(x)
// // let t=await u.cmakejwt()
// // console.log(t)
// //let ux=await u.cjsonregister(AppService.newRouteUrl("test-service2"),{name:"test-service2",hosts:["ttest1.com"]})
// //let ux=await u.cjsonregister(AppService.newServiceUrl(),{name:"test-service3",url:"http://zhichan.gongsibao.com"})
// //let ux=await u.cdel(AppService.routeUrl("test-service2"))
// //let ux=await u.cdel(AppService.serviceUrl("test-service2"))
// // let ux=await u.create({name:"test4-service",backend:"zhichan-service",domainName:"domain.com"})
// // console.log(ux);
// // let delrtn=await u.delete({id:2,name:"test4-service"})
// // console.log(delrtn);
// })()
\ No newline at end of file
......@@ -128,6 +128,10 @@ class ServiceBase {
return null;
}
}
async cget(opurl){
let rtn=await system.getReq(opurl)
return rtn;
}
async cjsonregister(opurl,opts){
try{
let rtn=await system.postJsonTypeReq(opurl,opts)
......@@ -160,6 +164,9 @@ class ServiceBase {
return null;
}
}
static bindPluginUrl(rname){
return settings.kongurl+"routes/"+rname+"/plugins";
}
static newRouteUrl(sname){
return settings.kongurl+"services/"+sname+"/routes";
}
......
......@@ -40,16 +40,24 @@ class System {
return promise;
}
static async getReq(url,qdata){
let rtn={}
let promise=new Promise(function(resv,rej){
request.get({
url: url,
json: true,
qs: qdata
}, function(error, response, body) {
if (!error && response.statusCode == 200) {
resv(body);
}else{
rej(error)
}
rtn.statusCode=response.statusCode;
if (!error) {
if(body){
rtn.data=body
}else{
rtn.data=null
}
resv(rtn);
}else{
rej(error);
}
});
})
return promise;
......@@ -194,7 +202,6 @@ class System {
//判断文件的存在性
//如果不存在,需要查看packageName
//如果packageName=web.service,dao
//
if (System.objTable[objabspath] != null) {
return System.objTable[objabspath];
} else {
......@@ -209,6 +216,9 @@ class System {
let modelname=filename.substring(0,filename.lastIndexOf("Dao"))
return System.register(objabspath, ClassObj,modelname);
}
if(ClassObj.name.indexOf("Ctl")>=0){
console.log(ClassObj.name);
}
return System.register(objabspath, ClassObj,groupName,filename);
}
}
......
......@@ -26,13 +26,6 @@ module.exports = function (app) {
app.use(function(err,req,res){
console.log("prod error handler................................>>>>>>>>>>>>>>>>>");
console.log(err);
logCtl.error({
optitle:"environment 调用异常error:",
op:classPath+"/"+methodName,
content:e.toString(),
clientIp:system.get_client_ip(req),
agent:req.headers["user-agent"],
});
//logerApp.error("prod error handler",err);
res.send("link admin");
});
......
......@@ -27,12 +27,13 @@ module.exports = function (app) {
});
});
app.post('/api/:gname/:qname/:method', function (req, res) {
// var classPath = req.params["qname"];
var classPath = req.params["qname"];
var methodName = req.params["method"];
var gname=req.params["gname"];
var params = [];
classPath=gname+"."+classPath;
console.log("====================");
console.log(classPath);
var tClientIp = System.get_client_ip(req);
req.clientIp = tClientIp;
req.uagent= req.headers["user-agent"];
......
var url = require("url");
var system = require("../../base/system");
var metaCtl=system.getObject("web.common.metaCtl");
var userCtl=system.getObject("web.auth.userCtl");
module.exports = function (app) {
app.get('/web/:gname/:qname/:method', function (req, res) {
var classPath = req.params["qname"];
......
......@@ -16,8 +16,10 @@ var settings = {
salt: "%iatpD1gcxz7iF#B",
defaultpwd:"gsb2020",
basepath : path.normalize(path.join(__dirname, '../..')),
port : process.env.NODE_PORT || 4001,
port : process.env.NODE_PORT || 80,
kongurl:"http://127.0.0.1:8001/",
pmappid:1,
pmcompanyid:1,
redis:function(){
if(this.env=="dev"){
var localsettings=require("./localsettings");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment