242 lines
6.1 KiB
JavaScript
242 lines
6.1 KiB
JavaScript
const token = require("../api/service/token");
|
||
const logsUtil = require("../tool/logs");
|
||
const xml2js = require("xml2js");
|
||
const nodeExcel = require("excel-export");
|
||
const UUID = require("uuid");
|
||
const config = require("../config/config");
|
||
|
||
const builder = new xml2js.Builder({
|
||
headless: true,
|
||
allowSurrogateChars: true,
|
||
rootName: "xml",
|
||
cdata: true,
|
||
});
|
||
|
||
module.exports = function () {
|
||
return async (ctx, next) => {
|
||
// 合并对象 兼容处理参数
|
||
ctx.get = (id) => {
|
||
let obj = Object.assign({}, ctx.request.query, ctx.request.body);
|
||
if (obj && typeof obj === "string") {
|
||
obj = JSON.parse(obj);
|
||
}
|
||
|
||
let value = obj[id] === undefined ? "" : obj[id];
|
||
return value;
|
||
};
|
||
|
||
ctx.getQuery = () => {
|
||
return ctx.request.query;
|
||
};
|
||
|
||
ctx.getIp = () => {
|
||
let req = ctx.req;
|
||
let ip = "";
|
||
let forwardedIpsStr = req.headers["x-forwarded-for"];
|
||
if (forwardedIpsStr) {
|
||
//如果有,则将头信息中第一个地址拿出,该地址就是真实的客户端IP;
|
||
let forwardedIps = forwardedIpsStr.split(",");
|
||
ip = forwardedIps[0];
|
||
} else {
|
||
ip = req.connection.remoteAddress || req.socket.remoteAddress || req.connection.socket.remoteAddress;
|
||
}
|
||
|
||
return ip;
|
||
};
|
||
|
||
ctx.getBody = () => {
|
||
let obj = Object.assign({}, ctx.body, ctx.request.body);
|
||
if (obj && typeof obj === "string") {
|
||
obj = JSON.parse(obj);
|
||
}
|
||
return obj;
|
||
};
|
||
|
||
ctx.getXml = () => {
|
||
let getxml = ctx.request.body;
|
||
return new Promise(async (resolveT, rejectT) => {
|
||
let paramsJson = null;
|
||
|
||
const parseObj = await new Promise(function (resolve) {
|
||
xml2js.parseString(getxml, { explicitArray: false }, function (err, json) {
|
||
if (err) throw err;
|
||
return resolve(json);
|
||
});
|
||
});
|
||
|
||
if (parseObj.xml) delete parseObj.xml._;
|
||
paramsJson = parseObj.xml;
|
||
|
||
console.log("getXml", paramsJson);
|
||
resolveT(paramsJson);
|
||
});
|
||
};
|
||
|
||
// admin
|
||
ctx.getAdminUserId = () => {
|
||
let adminToken = ctx.header["admin-token"];
|
||
if (adminToken) {
|
||
let userInfo = token.parse(adminToken);
|
||
if (userInfo) {
|
||
return userInfo.id;
|
||
}
|
||
}
|
||
return 0;
|
||
};
|
||
|
||
ctx.getAdminProjectId = () => {
|
||
let id = ctx.header["admin-project"];
|
||
if (id) {
|
||
return id;
|
||
}
|
||
return 0;
|
||
};
|
||
|
||
// 获取小程序id
|
||
ctx.getPappletUserId = () => {
|
||
// 模拟用户登陆
|
||
let userId = ctx.request.query["userId206"];
|
||
if (userId) {
|
||
return userId;
|
||
}
|
||
|
||
let appletToken = ctx.header["applet-token"];
|
||
if (appletToken) {
|
||
let userInfo = token.parse(appletToken);
|
||
if (userInfo.weixin_openid && userInfo.id) {
|
||
return userInfo.id;
|
||
}
|
||
}
|
||
return 0;
|
||
};
|
||
|
||
ctx.getSessionKey = () => {
|
||
let appletToken = ctx.header["applet-token"];
|
||
if (appletToken) {
|
||
let userInfo = token.parse(appletToken);
|
||
if (userInfo.session_key) {
|
||
return userInfo.session_key;
|
||
}
|
||
}
|
||
|
||
return "";
|
||
};
|
||
|
||
// 获取分页排序
|
||
ctx.getPageSize = () => {
|
||
let pageOption = ctx.get("pageOption");
|
||
|
||
if (pageOption && typeof pageOption === "string") {
|
||
pageOption = JSON.parse(pageOption);
|
||
}
|
||
|
||
let page = pageOption.page || 1;
|
||
let size = pageOption.pageSize || 20;
|
||
return {
|
||
limit: size,
|
||
offset: size * (page - 1),
|
||
};
|
||
};
|
||
|
||
// 获取订单排序相关 [['sale_price','desc']]
|
||
ctx.getOrder = (key) => {
|
||
key = key || "order";
|
||
let order = ctx.get(key);
|
||
if (Array.isArray(order)) {
|
||
return order;
|
||
} else {
|
||
try {
|
||
order = eval("(" + order + ")");
|
||
} catch (e) {
|
||
console.warn("error " + e.message);
|
||
order = [];
|
||
}
|
||
return order;
|
||
}
|
||
};
|
||
|
||
//返回自定义code
|
||
ctx.json = (code, message, data) => {
|
||
ctx.response.type = "application/json";
|
||
let resObj = {
|
||
code,
|
||
message,
|
||
data,
|
||
};
|
||
|
||
ctx.response.body = resObj;
|
||
};
|
||
|
||
ctx.jsonToXml = (return_code, return_msg) => {
|
||
ctx.response.type = "application/xml";
|
||
let resObj = {
|
||
return_code,
|
||
return_msg,
|
||
};
|
||
|
||
const xmlOption = builder.buildObject(resObj);
|
||
ctx.response.body = xmlOption;
|
||
};
|
||
|
||
ctx.downFile = ({ title, cols, rows }) => {
|
||
let fileName = title + "_" + UUID.v4() + ".xlsx";
|
||
let result = nodeExcel.execute({ cols, rows });
|
||
let data = new Buffer.from(result, "binary");
|
||
ctx.set("Content-Type", "application/vnd.openxmlformats");
|
||
ctx.set("Content-Disposition", "attachment; filename=" + fileName);
|
||
ctx.set("filename", fileName);
|
||
ctx.body = data;
|
||
};
|
||
|
||
// 成功请求
|
||
ctx.success = (data) => {
|
||
ctx.json(0, "请求成功!", data);
|
||
};
|
||
|
||
// 失败请求
|
||
ctx.fail = (msg) => {
|
||
let message = msg || "请求失败!";
|
||
ctx.json(-1, message, {});
|
||
};
|
||
|
||
//token 失效
|
||
ctx.tokenFail = (data) => {
|
||
ctx.json(-2, "非法请求,或登录已超时!", data);
|
||
};
|
||
|
||
console.log(`Process API ${ctx.request.method} ${ctx.request.url}...`);
|
||
|
||
let allowUrls = config.allowUrls;
|
||
try {
|
||
// 登录注册不需要验证token
|
||
const checkApi = (path) => {
|
||
let isCheck = false;
|
||
for (let i = 0; i < allowUrls.length; i++) {
|
||
let url = allowUrls[i];
|
||
if (path.indexOf(url) > -1) {
|
||
isCheck = true;
|
||
}
|
||
}
|
||
return isCheck;
|
||
};
|
||
|
||
if (checkApi(ctx.request.path)) {
|
||
return await next();
|
||
} else {
|
||
if (ctx.request.path.indexOf("/admin_api/") > -1) {
|
||
let id = ctx.getAdminUserId();
|
||
if (id) {
|
||
return await next();
|
||
}
|
||
} else if (ctx.request.path.indexOf("/api/") > -1) {
|
||
return await next();
|
||
}
|
||
return ctx.tokenFail(); // 非法请求
|
||
}
|
||
} catch (e) {
|
||
logsUtil.ctxError(e, ctx);
|
||
return ctx.fail(e.message);
|
||
}
|
||
};
|
||
};
|