This commit is contained in:
chaosBreaking
2019-08-31 14:59:13 +08:00
commit dc5423d356
65 changed files with 3813 additions and 0 deletions

53
src/service/index.js Normal file
View File

@@ -0,0 +1,53 @@
const event = require('events');
const serviceMap = require('./serviceMap');
const { auth } = require('./middleware');
// const Provider = require('../common/Provider')
class ServiceManager extends event {
constructor(props = {}) {
mylog.info('初始化服务控制器...');
super(props);
this._map = serviceMap;
this.middleWares = [
auth
];
}
static getInstance() {
if(!ServiceManager.instance) {
ServiceManager.instance = new ServiceManager();
}
return ServiceManager.instance;
}
get ServiceMap() {
return this._map;
}
/**
*
* @desc 注册一个服务
* @param {*} [service={}]
* @param {String} path // 路由地址
* @param {String} type // HTTP请求类型['GET','POST','PUT'...]
* @param {Function} handler //处理函数
* @memberof ServiceManager
*/
regist(service = {}) {
const { version, ...main } = service;
this._map[version].push(main);
}
mountService(route, version) {
mylog.info('开始挂载中间价...');
this.middleWares.map(fn => {
route.use(fn);
});
mylog.info('开始挂载服务...');
if (this.ServiceMap[version] && this.ServiceMap[version].length !== 0) {
this.ServiceMap[version].map(service => {
route[service.method.toLowerCase()](service.url, service.controller);
});
}
return route;
}
}
module.exports = ServiceManager.getInstance();

27
src/service/middleware.js Normal file
View File

@@ -0,0 +1,27 @@
const { inject } = require('../common/Provider');
const { verifyToken, createToken } = require('../utils/jwt');
const ignoreToken = ['/sign/check', '/sign/in', '/sign/up', '/sign/forget', '/sign/send', '/sign/changePwd', '/sign/code'];
module.exports = {
auth: inject(function (SysConfig) {
const { JWT_SECRET } = SysConfig;
return async (req, res, next) => {
const token = req.headers.token;
if(!ignoreToken.includes(req.path)) {
if (token) {
const deToken = await verifyToken(token, JWT_SECRET);
if(deToken) {
res.locals.user = deToken.data;
// 换发新token存在问题如果上一个token没过期其他人截获了的话会不会被盗用
res.set('token', createToken({
userId: deToken.userId
}, JWT_SECRET, {}));
return next();
}
}
return res.status(403).send('unauthorized');
} else {
next();
}
};
})
};

20
src/service/serviceMap.js Normal file
View File

@@ -0,0 +1,20 @@
// 根服务map读取所有模块导出的服务map按照版本进行切分后提供给ServiceManager
const fs = require('fs');
fs.readdirSync('./src/modules').map(m => {
if (fs.existsSync(`./src/modules/${m}/${m}.service.js`)) {
require(`../modules/${m}/${m}.service.js`);
}
});
const modules = module.children
.reduce((acc, c) => {
if (c && c.exports && c.exports.length) {
return acc.concat(c.exports);
}
return acc;
}, []).filter(m => m.controller !== undefined);
module.exports = {
v1: modules
};