Commit 553674c0 by 蒋勇

d

parent ddb0b99d
...@@ -23,6 +23,7 @@ class UserCtl extends CtlBase { ...@@ -23,6 +23,7 @@ class UserCtl extends CtlBase {
async exit(pobj, qobj, req) { async exit(pobj, qobj, req) {
} }
//注册时,分为两种类型,一种是普通pr,一种是租户
async pmregister(pobj, qobj, req) { async pmregister(pobj, qobj, req) {
//平台注册设置平台的应用ID //平台注册设置平台的应用ID
pobj.app_id=settings.pmappid; pobj.app_id=settings.pmappid;
......
...@@ -10,16 +10,17 @@ var dbf=system.getObject("db.common.connection"); ...@@ -10,16 +10,17 @@ var dbf=system.getObject("db.common.connection");
var db=dbf.getCon(); var db=dbf.getCon();
db.sync({force:true}).then(async ()=>{ db.sync({force:true}).then(async ()=>{
const apps=await system.getObject("service.common.appSve"); const apps=await system.getObject("service.common.appSve");
const usS=await system.getObject("service.auth.userSve");
let appnew=await apps.create( { let appnew=await apps.create( {
"name":"center-app", "name":"center-app",
"domainName":"t9.com", "domainName":"t9.com",
"backend":"cm.com" "backend":"192.168.4.1"
}); });
let Role=db.models["role"]; let Role=db.models["role"];
await Role.create({code:"ta",name:"租户",app_id:appnew.id,company_id:settings.pmcompanyid}) await Role.create({code:"ta",name:"租户",app_id:appnew.id,company_id:settings.pmcompanyid})
await Role.create({code:"pr",name:"个人",app_id:appnew.id,company_id:settings.pmcompanyid}) await Role.create({code:"pr",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}) let usuper=await usS.pmregister({userName:"sm",password:"951753",isSuper:true,isAdmin:true,isEnabled:true,nickName:"superman",app_id:appnew.id,company_id:settings.id})
......
...@@ -7,6 +7,10 @@ module.exports = (db, DataTypes) => { ...@@ -7,6 +7,10 @@ module.exports = (db, DataTypes) => {
type: DataTypes.STRING, type: DataTypes.STRING,
allowNull: false, allowNull: false,
},//和user的from相同,在注册user时,去创建 },//和user的from相同,在注册user时,去创建
companykey: {
type: DataTypes.STRING,
allowNull: false,
},//和user的from
}, { }, {
paranoid: true,//假的删除 paranoid: true,//假的删除
underscored: true, underscored: true,
......
...@@ -5,8 +5,8 @@ const jwt = require('jsonwebtoken'); ...@@ -5,8 +5,8 @@ const jwt = require('jsonwebtoken');
class UserService extends ServiceBase { class UserService extends ServiceBase {
constructor() { constructor() {
super("auth", ServiceBase.getDaoName(UserService)); super("auth", ServiceBase.getDaoName(UserService));
this.companyDao=system.getObject("db.common.companyDao"); this.companyDao = system.getObject("db.common.companyDao");
this.roleDao=system.getObject("db.common.roleDao"); this.roleDao = system.getObject("db.common.roleDao");
} }
//平台注册,默认角色,不具备平台级别的管理或运营功能 //平台注册,默认角色,不具备平台级别的管理或运营功能
...@@ -14,41 +14,55 @@ class UserService extends ServiceBase { ...@@ -14,41 +14,55 @@ class UserService extends ServiceBase {
//封装kongurl //封装kongurl
//前端需要选择用户类型,如果企业用户,那么就设置角色为租户 //前端需要选择用户类型,如果企业用户,那么就设置角色为租户
//如果是个人类型,那么就设置角色为普通 //如果是个人类型,那么就设置角色为普通
//注册成功返回租户公司或个人所属租户的companykey
async pmregister(p,q){ //注册有两种类型,一种是租户注册,一种是租户帮助个人注册,需要传递公司的key
var self=this; async pmregister(p, q) {
let tmppwd=p.password; var self = this;
if(!tmppwd){ let tmppwd = p.password;
tmppwd=settings.defaultpwd; if (!tmppwd) {
} tmppwd = settings.defaultpwd;
p.password=this.getEncryptStr(tmppwd); }
p.password = this.getEncryptStr(tmppwd);
return this.db.transaction(async function (t) { return this.db.transaction(async function (t) {
//创建一个默认公司,公司名称xxxx的公司 //对于租户类型注册,创建一个默认公司,公司名称xxxx的公司
let cmp=await self.companyDao.create({name:p.userName+"的公司"},t); //如果非租户类型,需要按照传递进来的公司companykey,来查询公司,按照companykey缓存到redis
p.company_id=cmp.id; let cmpkey = self.getUUID();
let u=await self.dao.create(p,t) let rolecode = p.rolecode ? p.rolecode : "ta";
if (rolecode == "ta") {//如果注册时,角色是租户,那么需要创建默认公司
let cmp = await self.companyDao.create({ name: p.userName + "的公司", companykey: cmpkey }, t);
p.company_id = cmp.id;
} else {
cmpkey = p.companykey;//否则是租户协助创建个人访客,采用租户获得的公司key
//按照公司key,获取公司 to do cache
let compfind = await self.companyDao.model.findOne({ where: { companykey: cmpkey }, transaction: t })
p.company_id = compfind.id;
}
let u = await self.dao.create(p, t)
//设置默认角色,租户 //设置默认角色,租户
//设置默认普通角色,由于有了租户概念,所以注册时,需要知道当前租户和应用的id 才可以设置默认角色 todo //设置默认普通角色,由于有了租户概念,所以注册时,需要知道当前租户和应用的id 才可以设置默认角色 todo
var role = await self.roleDao.model.findOne({ where: { code: "ta" }, transaction: t });
var role = await self.roleDao.model.findOne({ where: { code: rolecode }, transaction: t });
await u.setRoles([role], { transaction: t }); await u.setRoles([role], { transaction: t });
//创建统一账号 //创建统一账号
let cred=await self.cregister(u.userName,cmp.id,p.password) let cred = await self.cregister(u.userName, p.company_id, p.password)
console.log("......................................"); console.log("......................................");
console.log(cred.consumer.id); console.log(cred.consumer.id);
if(cred){ if (cred) {
u.center_id=cred.consumer.id; u.center_id = cred.consumer.id;
u.jwtkey=cred.key; u.jwtkey = cred.key;
u.jwtsecret=cred.secret; u.jwtsecret = cred.secret;
try{
await u.save({transaction:t}); try {
}catch(e){ await u.save({ transaction: t });
} catch (e) {
console.log(e); console.log(e);
await self.cunregister(p.userName); await self.cunregister(p.userName);
throw new Error("保存用户失败"); throw new Error("保存用户失败");
} }
return u; return { user: u, companykey: cmpkey };
}else{ } else {
throw new Error("创建统一账号失败"); throw new Error("创建统一账号失败");
} }
}); });
...@@ -57,29 +71,34 @@ class UserService extends ServiceBase { ...@@ -57,29 +71,34 @@ class UserService extends ServiceBase {
//登录接口封装kong-url //登录接口封装kong-url
//登录路由放行 //登录路由放行
//p里面含有appkey,company_id,userName,password //p里面含有appkey,company_id,userName,password
async pmlogin(p,q,req){ async pmlogin(p, q, req) {
var self=this; var self = this;
//先要按照用户名,在统一账户中查找存在性 //先要按照用户名,在统一账户中查找存在性
//如果不存在 //如果不存在
let consumer=await this.cget(UserService.consumerUrl(p.userName)); let consumer = await this.cget(UserService.consumerUrl(p.userName));
if(!consumer.data){ if (!consumer.data) {
return null; return null;
}else{ } else {
let password=consumer.data.tags[1].split("_")[1]; let password = consumer.data.tags[1].split("_")[1];
let inpassword=this.getEncryptStr(p.password); let inpassword = this.getEncryptStr(p.password);
if(password!=inpassword){ if (password != inpassword) {
return null; return null;
} }
} }
var rtn={} var rtn = {}
return this.db.transaction(async function (t) { return this.db.transaction(async function (t) {
let userfind=await self.dao.findOne({userName:p.userName,app_id:settings.pmappid,company_id:settings.pmcompanyid}); //先
if(userfind){ let userfind = await self.dao.model.findOne({
let token= await self.cmakejwt(userfind.jwtkey,userfind.jwtsecret,null); where: { userName: p.userName, app_id: settings.pmappid },
rtn.token=token; include: [{ model: self.db.models.company, raw: true, attributes: ["companykey"] }]
rtn.user=userfind; });
if (userfind) {
let token = await self.cmakejwt(userfind.jwtkey, userfind.jwtsecret, null);
rtn.token = token;
rtn.user = userfind;
return rtn; return rtn;
}else{ } else {
return null; return null;
} }
}) })
...@@ -87,75 +106,79 @@ class UserService extends ServiceBase { ...@@ -87,75 +106,79 @@ class UserService extends ServiceBase {
//平台注册与登录 //平台注册与登录
//用户验证码登录 //用户验证码登录
// //
async pmloginByVCode(p,q,req){ async pmloginByVCode(p, q, req) {
var rtn={} var rtn = {}
//检查传递过来的手机验证码是否与缓存的一致 //检查传递过来的手机验证码是否与缓存的一致
let mobile=p.mobile; let mobile = p.mobile;
let vcode=p.vcode; let vcode = p.vcode;
let cachevcode=await this.cacheManager ["VCodeCache"].getCache(mobile,60) let cachevcode = await this.cacheManager["VCodeCache"].getCache(mobile, 60)
if(vcode!=cachevcode.vcode){ if (vcode != cachevcode.vcode) {
return null; return null;
}else{ } else {
//检查是否在库里存在 //检查是否在库里存在
//appkey--company_id---需要控制器基类里设置到p对象里 //appkey--company_id---需要控制器基类里设置到p对象里
let user=await this.findOne({userName:mobile,app_id:settings.pmappid,company_id:settings.pmcompanyid}) let user = await this.dao.model.findOne({
if(user){ where: { userName: mobile, app_id: settings.pmappid },
include: [{ model: this.db.models.company, raw: true, attributes: ["companykey"] }]
}
);
if (user) {
//生成token //生成token
let token= await this.cmakejwt(user.jwtkey,user.jwtsecret,null); let token = await this.cmakejwt(user.jwtkey, user.jwtsecret, null);
rtn.token=token; rtn.token = token;
rtn.user=user; rtn.user = user;
return rtn; return rtn;
}else{ } else {
//先按照用户名查续身份信息,获取key,secret, //先按照用户名查续身份信息,获取key,secret,
let u=await this.pmregister({userName:mobile,nickName:mobile}); let u = await this.pmregister({ userName: mobile, nickName: mobile });
let token= await this.cmakejwt(u.jwtkey,u.jwtsecret,null); let token = await this.cmakejwt(u.jwtkey, u.jwtsecret, null);
rtn.token=token; rtn.token = token;
rtn.user=u; rtn.user = u;
return rtn; return rtn;
} }
} }
//不一致那么就 //不一致那么就
} }
//发送手机验证码并缓存 //发送手机验证码并缓存
async sendVCode(p,q,req){ async sendVCode(p, q, req) {
let mobile=p.mobile; let mobile = p.mobile;
let vcodeobj=await this.cacheManager ["VCodeCache"].cache(mobile,null,60); let vcodeobj = await this.cacheManager["VCodeCache"].cache(mobile, null, 60);
return vcodeobj.vcode; return vcodeobj.vcode;
} }
async reSendVCode(p,q,req){ async reSendVCode(p, q, req) {
let mobile=p.mobile; let mobile = p.mobile;
await this.cacheManager ["VCodeCache"].invalidate(mobile); await this.cacheManager["VCodeCache"].invalidate(mobile);
let vcodeobj=await this.cacheManager ["VCodeCache"].cache(mobile,null,60); let vcodeobj = await this.cacheManager["VCodeCache"].cache(mobile, null, 60);
return vcodeobj.vcode; return vcodeobj.vcode;
} }
//创建统一账号及jwt身份 //创建统一账号及jwt身份
async cregister(uname,cmpid,pass){ async cregister(uname, cmpid, pass) {
try{ try {
var rtn2=null; var rtn2 = null;
let rtn=await system.postJsonTypeReq(UserService.newConsumerUrl(),{username:uname,tags:["cmp_"+cmpid,"pass_"+pass]}) let rtn = await system.postJsonTypeReq(UserService.newConsumerUrl(), { username: uname, tags: ["cmp_" + cmpid, "pass_" + pass] })
console.log(rtn) console.log(rtn)
if(rtn.statusCode==409){ if (rtn.statusCode == 409) {
throw new Error("已经存在相同的统一账号名称!"); throw new Error("已经存在相同的统一账号名称!");
}else{ } else {
//创建身份 //创建身份
rtn2=await system.post3wFormTypeReq(UserService.newJwtCredUrl(uname)) rtn2 = await system.post3wFormTypeReq(UserService.newJwtCredUrl(uname))
} }
if(rtn.statusCode==201 && rtn2.statusCode==201){ if (rtn.statusCode == 201 && rtn2.statusCode == 201) {
return rtn2.data; return rtn2.data;
} }
return null; return null;
}catch(e){ } catch (e) {
console.log(e); console.log(e);
return null; return null;
} }
} }
async jwtsign(plkey,secretstr,opts){ async jwtsign(plkey, secretstr, opts) {
let promise=new Promise(function(resv,rej){ let promise = new Promise(function (resv, rej) {
jwt.sign({ iss: plkey },secretstr,opts,function(err,rtn){ jwt.sign({ iss: plkey }, secretstr, opts, function (err, rtn) {
if(err){ if (err) {
rej(err); rej(err);
}else{ } else {
resv(rtn); resv(rtn);
} }
}); });
...@@ -163,31 +186,31 @@ class UserService extends ServiceBase { ...@@ -163,31 +186,31 @@ class UserService extends ServiceBase {
return promise; return promise;
} }
//只要登录 生成新的访问jwttoken //只要登录 生成新的访问jwttoken
async cmakejwt(key,secret,opts){ async cmakejwt(key, secret, opts) {
var token =await this.jwtsign(key, secret,opts); var token = await this.jwtsign(key, secret, opts);
return token; return token;
} }
//删除统一账号 //删除统一账号
async cunregister(uname){ async cunregister(uname) {
try{ try {
let rtn=await system.delReq(UserService.consumerUrl(uname)) let rtn = await system.delReq(UserService.consumerUrl(uname))
if(rtn.statusCode==204){ if (rtn.statusCode == 204) {
return {}; return {};
} }
return null; return null;
}catch(e){ } catch (e) {
return null; return null;
} }
} }
//登录统一账号 //登录统一账号
async clogin(uname){ async clogin(uname) {
//检查是否存在重名 //检查是否存在重名
} }
//按用户名查询统一用户 //按用户名查询统一用户
async findCUser(uname){ async findCUser(uname) {
} }
} }
......
...@@ -49,20 +49,16 @@ class AppService extends ServiceBase { ...@@ -49,20 +49,16 @@ class AppService extends ServiceBase {
async create(pobj, qobj, req) { async create(pobj, qobj, req) {
var self = this; var self = this;
return this.db.transaction(async function (t) { return this.db.transaction(async function (t) {
console.log(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
var app = await self.dao.create(pobj, t); 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 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 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}) 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 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); let r2=await self.routeDao.create({name:app.name+"_api",center_id:routeapi.id},t);
//给api路由启动插件 //给api路由启动插件
await self.cjsonregister(AppService.bindPluginUrl(app.name+"_api"),{name:"jwt"}) await self.cjsonregister(AppService.bindPluginUrl(app.name+"_api"),{name:"jwt"})
if(svobj && routeobj && r1 && r2){ if(svobj && routeobj && r1 && r2){
try{ try{
app.appkey=svobj.id; app.appkey=svobj.id;
......
...@@ -4,7 +4,7 @@ const settings = require("../../../../config/settings"); ...@@ -4,7 +4,7 @@ const settings = require("../../../../config/settings");
const appconfig = system.getSysConfig(); const appconfig = system.getSysConfig();
class RouteService extends ServiceBase { class RouteService extends ServiceBase {
constructor() { constructor() {
super("common", ServiceBase.getDaoName(AppService)); super("common", ServiceBase.getDaoName(RouteService));
} }
//创建应用 //创建应用
......
const system = require("../system"); const system = require("../system");
var moment = require('moment'); var moment = require('moment');
const settings = require("../../config/settings"); const settings = require("../../config/settings");
const uuidv4 = require('uuid/v4');
class ServiceBase { class ServiceBase {
constructor(gname, daoName) { constructor(gname, daoName) {
//this.dbf=system.getObject("db.connection"); //this.dbf=system.getObject("db.connection");
this.db = system.getObject("db.common.connection").getCon(); this.db = system.getObject("db.common.connection").getCon();
this.cacheManager = system.getObject("db.common.cacheManager"); this.cacheManager = system.getObject("db.common.cacheManager");
console.log(">>>>>>>>>>>>>>..",daoName)
this.daoName = daoName; this.daoName = daoName;
this.dao = system.getObject("db." + gname + "." + daoName); this.dao = system.getObject("db." + gname + "." + daoName);
this.restS = system.getObject("util.restClient"); this.restS = system.getObject("util.restClient");
...@@ -18,10 +20,16 @@ class ServiceBase { ...@@ -18,10 +20,16 @@ class ServiceBase {
var md5 = this.md5(str + "_" + settings.salt); var md5 = this.md5(str + "_" + settings.salt);
return md5.toString().toLowerCase(); return md5.toString().toLowerCase();
} }
getUUID() {
var uuid = uuidv4();
var u = uuid.replace(/\-/g, "");
return u;
}
static getDaoName(ClassObj) { static getDaoName(ClassObj) {
return ClassObj["name"].substring(0, ClassObj["name"].lastIndexOf("Service")).toLowerCase() + "Dao"; console.log(">>>>>>>>>>>>>>>>>>>>>>>>>>>..");
let rtnstr=ClassObj["name"].substring(0, ClassObj["name"].lastIndexOf("Service")).toLowerCase() + "Dao";
console.log(">>>>>>>>>>>>>>>>>>>>>>>>>>>..",rtnstr);
return rtnstr;
} }
async findAndCountAll(obj) { async findAndCountAll(obj) {
const apps = await this.dao.findAndCountAll(obj); const apps = await this.dao.findAndCountAll(obj);
......
...@@ -199,9 +199,11 @@ class System { ...@@ -199,9 +199,11 @@ class System {
} }
var objabspath = classpath + "/" + filename + ".js"; var objabspath = classpath + "/" + filename + ".js";
//判断文件的存在性 //判断文件的存在性
//如果不存在,需要查看packageName //如果不存在,需要查看packageName
//如果packageName=web.service,dao //如果packageName=web.service,dao
if (System.objTable[objabspath] != null) { if (System.objTable[objabspath] != null) {
return System.objTable[objabspath]; return System.objTable[objabspath];
} else { } else {
......
...@@ -17,7 +17,7 @@ var settings = { ...@@ -17,7 +17,7 @@ var settings = {
defaultpwd:"gsb2020", defaultpwd:"gsb2020",
basepath : path.normalize(path.join(__dirname, '../..')), basepath : path.normalize(path.join(__dirname, '../..')),
port : process.env.NODE_PORT || 80, port : process.env.NODE_PORT || 80,
kongurl:"http://127.0.0.1:8001/", kongurl:"http://192.168.4.119:8001/",
pmappid:1, pmappid:1,
pmcompanyid:1, pmcompanyid:1,
redis:function(){ redis:function(){
......
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