北斗启航科技教育平台登录系统

This commit is contained in:
2026-03-27 17:50:18 +08:00
commit bdc25653a4
215 changed files with 5299 additions and 0 deletions

182
app/service/BSide.js Normal file
View File

@@ -0,0 +1,182 @@
'use strict';
const Service = require('../core/base_service');
const fileName = "BSide";
const { Op } = require('sequelize');
const shunt = (uid) => {
return uid[uid.length - 1];
}
class BSideService extends Service {
async loginUser(name) {
const { ctx } = this;
try {
const where = { account_name: name };
const result = await ctx.model.BSide.findOne({ where });
return result || false;
} catch (error) {
const blockName = fileName + "--" + "loginUser";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async subscribe(user, client) {
const { ctx } = this;
try {
const where = {
user_uid: user.uid,
business: client.id
};
const defaults = {
user_uid: user.uid,
business: client.id,
status: 0,
type: 0,
created_at: new Date(),
updated_at: new Date(),
}
await ctx.model.BSubscribe.findOrCreate({ where, defaults });
return true;
} catch (error) {
const blockName = fileName + "--" + "subscribe";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async getUser(uid) {
const { ctx } = this;
try {
const attributes = ['status', 'role', 'account_name', 'user_name', 'phone'];
const where = { uid };
const result = await ctx.model.BSide.findOne({ attributes, where });
return result || false;
} catch (error) {
const blockName = fileName + "--" + "getUser";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async editUserManager(editMsg, userMsg) {
const { ctx } = this;
try {
delete userMsg.location;
const where = { ...userMsg };
const result = await ctx.model.BSide.update(editMsg, { where });
return result[0] == 0 ? false : result;
} catch (error) {
const blockName = fileName + "--" + "editUserManager";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async editUser(userMsg, uid) {
const { ctx } = this;
try {
const where = { uid };
const result = await ctx.model.BSide.update(userMsg, { where });
return result[0] == 0 ? false : result;
} catch (error) {
const blockName = fileName + "--" + "editUser";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async uidfinder(uid) {
const { ctx } = this;
try {
const where = { uid };
const result = await ctx.model.BSide.findOne({ where });
return result || false;
} catch (error) {
const blockName = fileName + "--" + "uidfinder";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async changePassword(uid, oldPassword, newPassword) {
const { ctx } = this;
try {
const where = { uid };
const salt = this.generateRandomString();
const setPassword = this.shaForm(newPassword, salt);
const result = await ctx.model.BSide.findOne({ where });
if(!result || result.dataValues.status == 2 || result.dataValues.password !== this.shaForm(oldPassword, this.decryptRequest(result.dataValues.salt))) return false;
const resultList = await ctx.model.BSide.update({ salt: this.encryptRequest(salt), status: 1, password: setPassword }, { where });
return resultList[0] == 0 ? false : resultList;
} catch (error) {
const blockName = fileName + "--" + "changePassword";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async resetPassword(uid, modelType, defaultPassword, password, body, resetType) {
const { ctx } = this;
try {
const uidLastCode = shunt(uid);
const modelName = uidLastCode === 'B' ? 'BSide' : 'Insiders';
const model = uidLastCode === 'B' ? ctx.model : ctx.model3;
const managerWhere = uidLastCode === 'B' ? { uid, role: 1 } : { uid, role: [3, 6, 9] };
const result = await model[modelName].findOne({ where: managerWhere });
if(!result || result.dataValues.status == 2 || result.dataValues.password !== this.shaForm(password, this.decryptRequest(result.dataValues.salt))) return false;
const salt = this.generateRandomString();
if(defaultPassword == "") {
defaultPassword = '123456';
}
const originPassword = this.shaForm(defaultPassword, salt);
let where = {};
const organization = result.organization;
const role = { [Op.not]: 1 };
if(modelType == "single") {
where = { role, organization, ...body };
delete where.location;
} else if (modelType == "multiple") {
let account_name = [], user_name = [], phone = [];
for (const key in body) {
body[key].forEach(element => {
account_name.push(element.account_name);
user_name.push(element.user_name);
phone.push(element.phone);
});
}
where = { role, organization, account_name, user_name, phone };
} else if (modelType == "all") {
where = { role, organization, };
}
let updateObj = { salt: this.encryptRequest(salt), status: 0, password: originPassword };
if(resetType == "default") {
updateObj.user_name = "";
updateObj.phone = "";
}
const resetList = await ctx.model.BSide.update(updateObj, { where });
return resetList.length == 0 ? false : resetList;
} catch (error) {
const blockName = fileName + "--" + "resetPassword";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async loginStatus(uid, login_status) {
const { ctx } = this;
try {
const where = { uid };
await ctx.model.BSide.update({ login_status }, { where });
} catch (error) {
const blockName = fileName + "--" + "loginStatus";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
}
module.exports = BSideService;

View File

@@ -0,0 +1,93 @@
'use strict';
const Service = require('../core/base_service');
const fileName = "CNTEVService";
const Dytnsapi20200217 = require('@alicloud/dytnsapi20200217');
const OpenApi = require('@alicloud/openapi-client');
const Util = require('@alicloud/tea-util');
class Client {
static createClient() {
let config = new OpenApi.Config({
// 凭证类型。
// type: 'access_key',
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
accessKeyId: "LTAI5tM3QC6kY4r23sWnsvuY",
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
accessKeySecret: "Lj9QTWVMJSTAffscjykhaKZt7RN0Xh",
// 访问的地域
// regionId: 'cn-beijing'
});
// Endpoint 请参考 https://api.aliyun.com/product/Dysmsapi
// 访问的地址
config.endpoint = `dytnsapi.aliyuncs.com`;
return new Dytnsapi20200217.default(config);
}
}
class CNTEVServiceService extends Service {
// 身份证二要素核验
async CNTEV(user_name, identity_card) {
const { ctx } = this;
try {
let client = Client.createClient();
// 创建请求对象并设置入参
let certNoTwoElementVerificationRequest = new Dytnsapi20200217.CertNoTwoElementVerificationRequest({
authCode: "3V2qgr9a2W",
certName: user_name,
certNo: identity_card,
});
// 创建运行时配置对象
let runtime = new Util.RuntimeOptions({});
runtime.readTimeout = 5000;
runtime.connectTimeout = 5000;
// 发起请求
const response = await client.certNoTwoElementVerificationWithOptions(certNoTwoElementVerificationRequest, runtime);
const { code, data } = response.body;
if (code == "OK") {
await ctx.app.redis.get('db3').set(identity_card, JSON.stringify({ user_name, real_check: data.isConsistent }), 'EX', 600);
if (data.isConsistent == "1") return { status: 1, msg: "姓名与身份证信息核验一致" };
if (data.isConsistent == "0") return { status: 0, msg: "姓名与身份证信息核验不一致" };
if (data.isConsistent == "2") return { status: 2, msg: "查无此人" };
} else {
return false;
}
} catch (error) {
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
// console.log('1===========================================')
// console.log(error.message);
if (error.message.includes("身份证号参数非法")) return { status: 400, msg: "身份证号参数非法" };
// 若捕捉到 ConnectTimeout 错误,则尝试重发
if (error.message.includes("ConnectTimeout")) return { status: 600, msg: "尝试重新核验" };
// console.log('2===========================================')
// 诊断地址
console.log(error);
// console.log('3===========================================')
// console.log(error.data);
// console.log('4===========================================')
// console.log(error.data["Recommend"]);
// Util.default.assertAsString(error.message);
const blockName = fileName + "--" + "CNTEV";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
// 身份证二要素核验结果标记
async realMark(user_name, identity_card, real_check) {
const { ctx } = this;
try {
await ctx.model5.Examinee.update({ real_check: real_check ? 1 : 2 }, { where: { user_name, identity_card } });
} catch (error) {
const blockName = fileName + "--" + "realMark";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
}
module.exports = CNTEVServiceService;

203
app/service/CSide.js Normal file
View File

@@ -0,0 +1,203 @@
'use strict';
const Service = require('../core/base_service');
const fileName = "CSide";
class CSideService extends Service {
async diffPhone(phone) {
const { ctx } = this;
try {
const where = { phone };
const result = await ctx.model2.CSide.findOne({ where });
return result || false;
} catch (error) {
const blockName = fileName + "--" + "diffPhone";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async diffEmail(email) {
const { ctx } = this;
try {
const where = { email };
const result = await ctx.model2.CSide.findOne({ where });
return result || false;
} catch (error) {
const blockName = fileName + "--" + "diffEmail";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async registered(form) {
const { ctx } = this;
try {
const user = await ctx.model2.CSide.create(form);
if (!user) {
return { code: 404, message: '注册失败', data: false };
};
return { code: 200, message: '注册成功', data: user };
} catch (error) {
const blockName = fileName + "--" + "registered";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async loginUser(name) {
const { ctx } = this;
try {
const where = { account_name: name };
const [buser, cuser] = await Promise.all([
ctx.model.BSide.findOne({ where }),
ctx.model2.CSide.findOne({ where })
]);
if (!buser && !cuser) return false;
return buser || cuser;
} catch (error) {
const blockName = fileName + "--" + "loginUser";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async subscribe(user, client) {
const { ctx } = this;
try {
const where = {
user_uid: user.uid,
business: client.id
};
const uidLastCode = user.uid[user.uid.length - 1];
const subscribeModel = {
"B": ctx.model.BSubscribe,
"C": ctx.model2.CSubscribe
};
const defaults = {
user_uid: user.uid,
business: client.id,
status: 0,
type: 0,
created_at: new Date(),
updated_at: new Date(),
};
await subscribeModel[uidLastCode].findOrCreate({ where, defaults });
return true;
} catch (error) {
const blockName = fileName + "--" + "subscribe";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async getUser(uid) {
const { ctx } = this;
try {
const attributes = ['status', 'role', 'account_name', 'user_name', 'phone', 'gender', 'age', 'email', 'address', 'post_code'];
const where = { uid };
const result = await ctx.model2.CSide.findOne({ attributes, where });
return result || false;
} catch (error) {
const blockName = fileName + "--" + "getUser";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async editUser(userMsg, uid) {
const { ctx } = this;
try {
userMsg.gender = userMsg.gender == "1" ? true : false;
const where = { uid };
const result = await ctx.model2.CSide.update(userMsg, { where });
return result[0] == 0 ? false : result;
} catch (error) {
const blockName = fileName + "--" + "editUser";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async uidfinder(uid) {
const { ctx } = this;
try {
const where = { uid };
const result = await ctx.model2.CSide.findOne({ where });
return result || false;
} catch (error) {
const blockName = fileName + "--" + "uidfinder";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async changePassword(uid, oldPassword, newPassword) {
const { ctx } = this;
try {
const where = { uid };
const salt = this.generateRandomString();
const setPassword = this.shaForm(newPassword, salt);
const result = await ctx.model2.CSide.findOne({ where });
if(!result || result.dataValues.status == 2 || result.dataValues.password !== this.shaForm(oldPassword, this.decryptRequest(result.dataValues.salt))) return false;
const resultList = await ctx.model2.CSide.update({ salt: this.encryptRequest(salt), status: 1, password: setPassword }, { where });
return resultList[0] == 0 ? false : resultList;
} catch (error) {
const blockName = fileName + "--" + "changePassword";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async resetPassword(uid, modelType, defaultPassword, password, body, resetType) {
const { ctx } = this;
try {
const uidLastCode = shunt(uid);
const modelName = uidLastCode === 'C' ? 'CSide' : 'Insiders';
const model = uidLastCode === 'C' ? ctx.model : ctx.model3;
const managerWhere = uidLastCode === 'C' ? { uid } : { uid, role: [3, 6, 9] };
const result = await model[modelName].findOne({ where: managerWhere });
if(!result || result.dataValues.status == 2 || result.dataValues.password !== this.shaForm(password, this.decryptRequest(result.dataValues.salt))) return false;
const salt = this.generateRandomString();
if(defaultPassword == "") {
defaultPassword = '123456';
}
const originPassword = this.shaForm(defaultPassword, salt);
let where = {};
if(modelType == "single") {
where = body;
} else if (modelType == "multiple") {
let account_name = [], user_name = [], phone = [];
for (const key in body) {
body[key].forEach(element => {
account_name.push(element.account_name);
user_name.push(element.user_name);
phone.push(element.phone);
});
}
where = { account_name, user_name, phone };
}
const resetList = await ctx.model2.CSide.update({ salt: this.encryptRequest(salt), status: 0, password: originPassword }, { where });
return resetList.length == 0 ? false : resetList;
} catch (error) {
const blockName = fileName + "--" + "resetPassword";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async loginStatus(uid, login_status) {
const { ctx } = this;
try {
const where = { uid };
await ctx.model.BSide.update({ login_status }, { where });
} catch (error) {
const blockName = fileName + "--" + "loginStatus";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
}
module.exports = CSideService;

151
app/service/Contest.js Normal file
View File

@@ -0,0 +1,151 @@
'use strict';
const Service = require('../core/base_service');
const fileName = "Contest";
const { Op } = require('sequelize');
class ContestService extends Service {
async loginUser(name) {
const { ctx } = this;
try {
const where = { account_name: name };
const result = await ctx.model4.Account.findOne({ where });
return result || false;
} catch (error) {
const blockName = fileName + "--" + "loginUser";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async getUser(uid) {
const { ctx } = this;
try {
const attributes = ['account_name', 'status'];
const where = { uid };
const result = await ctx.model4.Account.findOne({ attributes, where });
return result || false;
} catch (error) {
const blockName = fileName + "--" + "getUser";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async editUserManager(editMsg, userMsg) {
const { ctx } = this;
try {
delete userMsg.location;
const where = { ...userMsg };
const result = await ctx.model4.Account.update(editMsg, { where });
return result[0] == 0 ? false : result;
} catch (error) {
const blockName = fileName + "--" + "editUserManager";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async editUser(userMsg, uid) {
const { ctx } = this;
try {
const where = { uid };
const result = await ctx.model4.Account.update(userMsg, { where });
return result[0] == 0 ? false : result;
} catch (error) {
const blockName = fileName + "--" + "editUser";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async uidfinder(uid) {
const { ctx } = this;
try {
const where = { uid };
const result = await ctx.model4.Account.findOne({ where });
return result || false;
} catch (error) {
const blockName = fileName + "--" + "uidfinder";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async changePassword(uid, oldPassword, newPassword) {
const { ctx } = this;
try {
const where = { uid };
const salt = this.generateRandomString();
const setPassword = this.shaForm(newPassword, salt);
const result = await ctx.model4.Account.findOne({ where });
if(!result || result.dataValues.status == 2 || result.dataValues.password !== this.shaForm(oldPassword, this.decryptRequest(result.dataValues.salt))) return false;
const resultList = await ctx.model4.Account.update({ salt: this.encryptRequest(salt), status: 1, password: setPassword }, { where });
return resultList[0] == 0 ? false : resultList;
} catch (error) {
const blockName = fileName + "--" + "changePassword";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async resetPassword(uid, modelType, defaultPassword, password, body, resetType) {
const { ctx } = this;
try {
const managerWhere = { uid, role: [3, 6, 9] };
const result = await ctx.model3.Insiders.findOne({ where: managerWhere });
if(!result || result.dataValues.status == 2 || result.dataValues.password !== this.shaForm(password, this.decryptRequest(result.dataValues.salt))) return false;
const salt = this.generateRandomString();
if(defaultPassword == "") {
defaultPassword = '123456';
}
const originPassword = this.shaForm(defaultPassword, salt);
let where = {};
const organization = result.organization;
const role = { [Op.not]: 1 };
if(modelType == "single") {
where = { role, organization, ...body };
delete where.location;
} else if (modelType == "multiple") {
let account_name = [], user_name = [], phone = [];
for (const key in body) {
body[key].forEach(element => {
account_name.push(element.account_name);
user_name.push(element.user_name);
phone.push(element.phone);
});
}
where = { role, organization, account_name, user_name, phone };
} else if (modelType == "all") {
where = { role, organization, };
}
let updateObj = { salt: this.encryptRequest(salt), status: 0, password: originPassword };
if(resetType == "default") {
updateObj.user_name = "";
updateObj.phone = "";
}
const resetList = await ctx.model4.Account.update(updateObj, { where });
return resetList.length == 0 ? false : resetList;
} catch (error) {
const blockName = fileName + "--" + "resetPassword";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async loginStatus(uid, login_status) {
const { ctx } = this;
try {
const where = { uid };
await ctx.model4.Account.update({ login_status }, { where });
} catch (error) {
const blockName = fileName + "--" + "loginStatus";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
}
module.exports = ContestService;

166
app/service/Exam.js Normal file
View File

@@ -0,0 +1,166 @@
'use strict';
const Service = require('../core/base_service');
const fileName = "Exam";
const { Op } = require('sequelize');
class ExamService extends Service {
async loginUser(phone) {
const { ctx } = this;
try {
const where = { phone };
const result = await ctx.model5.Examinee.findOne({ where });
return result || false;
} catch (error) {
const blockName = fileName + "--" + "loginUser";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async uidfinder(uid) {
const { ctx } = this;
try {
const where = { uid };
const result = await ctx.model5.Examinee.findOne({ where });
return result || false;
} catch (error) {
const blockName = fileName + "--" + "uidfinder";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async getUser(uid) {
const { ctx } = this;
try {
const attributes = ['user_name', 'identity_card', 'real_check', 'email', 'phone', 'address', 'workplace', 'status'];
const where = { uid };
const result = await ctx.model5.Examinee.findOne({ attributes, where });
if(result.dataValues.status == 2) return false;
if(result.dataValues.real_check == 0 || result.dataValues.real_check == 2) {
const where = {
user_uid: uid,
user_name: result.dataValues.user_name,
identity_card: result.dataValues.identity_card,
};
const audit = await ctx.model5.Audit.findOne({ attributes: ['status'], where });
if (audit != null) await ctx.model5.Examinee.update({ real_check: audit.dataValues.status }, { where: { uid } });
};
return result || false;
} catch (error) {
const blockName = fileName + "--" + "getUser";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async editUser(userMsg, uid) {
const { ctx } = this;
try {
const where = { uid };
let attributes = ['user_name', 'identity_card'];
const check = await ctx.model5.Examinee.findOne({ attributes, where });
const { user_name, identity_card } = check.dataValues;
if(user_name !== userMsg.user_name || identity_card !== userMsg.identity_card) {
userMsg.real_check = 0;
};
const audit = await ctx.model5.Audit.findOne({ where: { user_uid: uid, status: 0 } });
if(audit == null) {
const auditForm = {
user_uid: uid,
user_name: userMsg.user_name,
identity_card: userMsg.identity_card,
status: 0,
created_at: new Date(),
};
await ctx.model5.Audit.create(auditForm);
} else {
const auditUpdate = {
user_name: userMsg.user_name,
identity_card: userMsg.identity_card,
created_at: new Date(),
}
await ctx.model5.Audit.update(auditUpdate, { where: { user_uid: uid, status: 0 } });
}
const result = await ctx.model5.Examinee.update(userMsg, { where });
return result[0] == 0 ? false : result;
} catch (error) {
const blockName = fileName + "--" + "editUser";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async changePassword(uid, oldPassword, newPassword) {
const { ctx } = this;
try {
const where = { uid };
const salt = this.generateRandomString();
const setPassword = this.shaForm(newPassword, salt);
const result = await ctx.model5.Examinee.findOne({ where });
if(!result || result.dataValues.status == 2 || result.dataValues.password !== this.shaForm(oldPassword, this.decryptRequest(result.dataValues.salt))) return false;
const resultList = await ctx.model5.Examinee.update({ salt: this.encryptRequest(salt), status: 1, password: setPassword }, { where });
return resultList[0] == 0 ? false : resultList;
} catch (error) {
const blockName = fileName + "--" + "changePassword";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async resetPassword(uid, modelType, defaultPassword, password, body, resetType) {
const { ctx } = this;
try {
const result = await ctx.model5.Examinee.findOne({ where: { uid, role: [6, 9] } });
if(!result || result.dataValues.status == 2 || result.dataValues.password !== this.shaForm(password, this.decryptRequest(result.dataValues.salt))) return false;
const salt = this.generateRandomString();
if(defaultPassword == "") {
defaultPassword = '123456';
}
const originPassword = this.shaForm(defaultPassword, salt);
let where = {}, role;
if(result.dataValues.password == 9) {
role = { [Op.not]: [9] };
} else {
role = { [Op.not]: [6, 9] };
}
if(modelType == "single") {
where = { role, ...body };
} else if (modelType == "multiple") {
let user_name = [], phone = [];
for (const key in body) {
body[key].forEach(element => {
user_name.push(element.user_name);
phone.push(element.phone);
});
}
where = { role, user_name, phone };
} else if (modelType == "all") {
where = { role };
}
const resetList = await ctx.model5.Examinee.update({ salt: this.encryptRequest(salt), status: 0, password: originPassword }, { where });
return resetList.length == 0 ? false : resetList;
} catch (error) {
const blockName = fileName + "--" + "resetPassword";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async loginStatus(uid, login_status) {
const { ctx } = this;
try {
const where = { uid };
await ctx.model5.Examinee.update({ login_status }, { where });
} catch (error) {
const blockName = fileName + "--" + "loginStatus";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
}
module.exports = ExamService;

133
app/service/ExamManager.js Normal file
View File

@@ -0,0 +1,133 @@
'use strict';
const Service = require('../core/base_service');
const fileName = "ExamManager";
const { Op } = require('sequelize');
class ExamManagerService extends Service {
async loginUser(name) {
const { ctx } = this;
try {
const where = { account_name: name };
const result = await ctx.model5.Manager.findOne({ where });
return result || false;
} catch (error) {
const blockName = fileName + "--" + "loginUser";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async uidfinder(uid) {
const { ctx } = this;
try {
const where = { uid };
const result = await ctx.model5.Manager.findOne({ where });
return result || false;
} catch (error) {
const blockName = fileName + "--" + "uidfinder";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async getUser(uid) {
const { ctx } = this;
try {
const attributes = ['account_name', 'role', 'status'];
const where = { uid };
const result = await ctx.model5.Manager.findOne({ attributes, where });
return result || false;
} catch (error) {
const blockName = fileName + "--" + "getUser";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async editUser(userMsg, uid) {
const { ctx } = this;
try {
const where = { uid };
const result = await ctx.model5.Manager.update(userMsg, { where });
return result[0] == 0 ? false : result;
} catch (error) {
const blockName = fileName + "--" + "editUser";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async changePassword(uid, oldPassword, newPassword) {
const { ctx } = this;
try {
const where = { uid };
const salt = this.generateRandomString();
const setPassword = this.shaForm(newPassword, salt);
const result = await ctx.model5.Manager.findOne({ where });
if(!result || result.dataValues.status == 2 || result.dataValues.password !== this.shaForm(oldPassword, this.decryptRequest(result.dataValues.salt))) return false;
const resultList = await ctx.model5.Manager.update({ salt: this.encryptRequest(salt), status: 1, password: setPassword }, { where });
return resultList[0] == 0 ? false : resultList;
} catch (error) {
const blockName = fileName + "--" + "changePassword";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async resetPassword(uid, modelType, defaultPassword, password, body, resetType) {
const { ctx } = this;
try {
const result = await ctx.model5.Manager.findOne({ where: { uid, role: [6, 9] } });
if(!result || result.dataValues.status == 2 || result.dataValues.password !== this.shaForm(password, this.decryptRequest(result.dataValues.salt))) return false;
const salt = this.generateRandomString();
if(defaultPassword == "") {
defaultPassword = '123456';
}
const originPassword = this.shaForm(defaultPassword, salt);
let where = {}, role;
if(result.dataValues.password == 9) {
role = { [Op.not]: [9] };
} else {
role = { [Op.not]: [6, 9] };
}
if(modelType == "single") {
where = { role, ...body };
} else if (modelType == "multiple") {
let account_name = [], user_name = [], phone = [];
for (const key in body) {
body[key].forEach(element => {
account_name.push(element.account_name);
user_name.push(element.user_name);
phone.push(element.phone);
});
}
where = { role, account_name, user_name, phone };
} else if (modelType == "all") {
where = { role };
}
const resetList = await ctx.model5.Manager.update({ salt: this.encryptRequest(salt), status: 0, password: originPassword }, { where });
return resetList.length == 0 ? false : resetList;
} catch (error) {
const blockName = fileName + "--" + "resetPassword";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async loginStatus(uid, login_status) {
const { ctx } = this;
try {
const where = { uid };
await ctx.model5.Manager.update({ login_status }, { where });
} catch (error) {
const blockName = fileName + "--" + "loginStatus";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
}
module.exports = ExamManagerService;

View File

@@ -0,0 +1,75 @@
'use strict';
const Service = require('../core/base_service');
const fileName = "Id2MVService";
const Cloudauth20190307 = require('@alicloud/cloudauth20190307');
const OpenApi = require('@alicloud/openapi-client');
const Util = require('@alicloud/tea-util');
class Client {
static createClient() {
let config = new OpenApi.Config({
// 凭证类型。
// type: 'access_key',
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
accessKeyId: "LTAI5tM3QC6kY4r23sWnsvuY",
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
accessKeySecret: "Lj9QTWVMJSTAffscjykhaKZt7RN0Xh",
// 访问的地域
// regionId: 'cn-beijing'
});
// Endpoint 请参考 https://api.aliyun.com/product/Dysmsapi
// 访问的地址
config.endpoint = `cloudauth.cn-beijing.aliyuncs.com`;
return new Cloudauth20190307.default(config);
}
}
class Id2MVServiceService extends Service {
// 身份二要素核验
async checkIdCard(idCard, name) {
const { ctx } = this;
try {
let client = Client.createClient();
// 创建请求对象并设置入参
let id2MetaVerifyRequest = new Cloudauth20190307.Id2MetaVerifyRequest({
paramType: "md5",
identifyNum: idCard.substring(0, 6) + this.calculateMD5(idCard.substring(6, 14)) + idCard.substring(14),
userName: this.calculateMD5(name.substring(0, 1)) + name.substring(1),
});
// 创建运行时配置对象
let runtime = new Util.RuntimeOptions({});
runtime.readTimeout = 5000;
runtime.connectTimeout = 5000;
// 发起请求
const response = await client.id2MetaVerifyWithOptions(id2MetaVerifyRequest, runtime);
const { code, data } = response.body;
if(code == "OK" && data.isConsistent == "1") return { status: 1, msg: "姓名与身份证信息核验一致" };
if(code == "OK" && data.isConsistent == "2") return { status: 2, msg: "姓名与身份证信息核验不一致" };
if(code == "OK" && data.isConsistent == "3") return { status: 3, msg: "查无此人" };
} catch (error) {
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
// console.log('1===========================================')
// console.log(error.message);
// 若捕捉到 ConnectTimeout 错误,则尝试重发
if(error.message.includes("ConnectTimeout")) return { status: 600, msg: "尝试重新核验" };
// console.log('2===========================================')
// 诊断地址
console.log(error);
// console.log('3===========================================')
// console.log(error.data);
// console.log('4===========================================')
// console.log(error.data["Recommend"]);
// Util.default.assertAsString(error.message);
const blockName = fileName + "--" + "checkIdCard";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
}
module.exports = Id2MVServiceService;

133
app/service/Insiders.js Normal file
View File

@@ -0,0 +1,133 @@
'use strict';
const Service = require('../core/base_service');
const fileName = "Insiders";
const { Op } = require('sequelize');
class InsidersService extends Service {
async loginUser(name) {
const { ctx } = this;
try {
const where = { name };
const result = await ctx.model3.Insiders.findOne({ where });
return result || false;
} catch (error) {
const blockName = fileName + "--" + "loginUser";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async uidfinder(uid) {
const { ctx } = this;
try {
const where = { uid };
const result = await ctx.model3.Insiders.findOne({ where });
return result || false;
} catch (error) {
const blockName = fileName + "--" + "uidfinder";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async getUser(uid) {
const { ctx } = this;
try {
const attributes = ['status', 'role', 'name', 'department'];
const where = { uid };
const result = await ctx.model3.Insiders.findOne({ attributes, where });
return result || false;
} catch (error) {
const blockName = fileName + "--" + "getUser";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async editUser(userMsg, uid) {
const { ctx } = this;
try {
const where = { uid };
const result = await ctx.model3.Insiders.update(userMsg, { where });
return result[0] == 0 ? false : result;
} catch (error) {
const blockName = fileName + "--" + "editUser";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async changePassword(uid, oldPassword, newPassword) {
const { ctx } = this;
try {
const where = { uid };
const salt = this.generateRandomString();
const setPassword = this.shaForm(newPassword, salt);
const result = await ctx.model3.Insiders.findOne({ where });
if(!result || result.dataValues.status == 2 || result.dataValues.password !== this.shaForm(oldPassword, this.decryptRequest(result.dataValues.salt))) return false;
const resultList = await ctx.model3.Insiders.update({ salt: this.encryptRequest(salt), status: 1, password: setPassword }, { where });
return resultList[0] == 0 ? false : resultList;
} catch (error) {
const blockName = fileName + "--" + "changePassword";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async resetPassword(uid, modelType, defaultPassword, password, body, resetType) {
const { ctx } = this;
try {
const result = await ctx.model3.Insiders.findOne({ where: { uid, role: [6, 9] } });
if(!result || result.dataValues.status == 2 || result.dataValues.password !== this.shaForm(password, this.decryptRequest(result.dataValues.salt))) return false;
const salt = this.generateRandomString();
if(defaultPassword == "") {
defaultPassword = '123456';
}
const originPassword = this.shaForm(defaultPassword, salt);
let where = {}, role;
if(result.dataValues.password == 9) {
role = { [Op.not]: [9] };
} else {
role = { [Op.not]: [6, 9] };
}
if(modelType == "single") {
where = { role, ...body };
} else if (modelType == "multiple") {
let account_name = [], user_name = [], phone = [];
for (const key in body) {
body[key].forEach(element => {
account_name.push(element.account_name);
user_name.push(element.user_name);
phone.push(element.phone);
});
}
where = { role, account_name, user_name, phone };
} else if (modelType == "all") {
where = { role };
}
const resetList = await ctx.model3.Insiders.update({ salt: this.encryptRequest(salt), status: 0, password: originPassword }, { where });
return resetList.length == 0 ? false : resetList;
} catch (error) {
const blockName = fileName + "--" + "resetPassword";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async loginStatus(uid, login_status) {
const { ctx } = this;
try {
const where = { uid };
await ctx.model.BSide.update({ login_status }, { where });
} catch (error) {
const blockName = fileName + "--" + "loginStatus";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
}
module.exports = InsidersService;

108
app/service/SMSService.js Normal file
View File

@@ -0,0 +1,108 @@
'use strict';
const Service = require('../core/base_service');
const fileName = "SMSService";
const Dysmsapi20170525 = require('@alicloud/dysmsapi20170525');
const OpenApi = require('@alicloud/openapi-client');
const Util = require('@alicloud/tea-util');
class Client {
static createClient() {
let config = new OpenApi.Config({
// 凭证类型。
// type: 'access_key',
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
accessKeyId: "LTAI5tM3QC6kY4r23sWnsvuY",
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
accessKeySecret: "Lj9QTWVMJSTAffscjykhaKZt7RN0Xh",
// 访问的地域
// regionId: 'cn-beijing'
});
// Endpoint 请参考 https://api.aliyun.com/product/Dysmsapi
// 访问的地址
config.endpoint = `dysmsapi.aliyuncs.com`;
return new Dysmsapi20170525.default(config);
}
}
class SMSServiceService extends Service {
// 向手机发送短信验证码
async sendSMS(phone) {
const { ctx } = this;
try {
const code = this.generateCodeString();
const mark = await ctx.app.redis.get('db3').get(phone);
if(mark == null) await ctx.app.redis.get('db3').set(phone, JSON.stringify({ status: 0 }), 'EX', 600);
let client = Client.createClient();
// 创建请求对象并设置入参
let sendSmsRequest = new Dysmsapi20170525.SendSmsRequest({
phoneNumbers: phone,
// signName: "身份验证",
// templateCode: "SMS_480180061",
// signName: "登录验证",
// templateCode: "SMS_487315107",
signName: "华云智联",
templateCode: "SMS_487315108",
// signName: "北京华云智联",
// templateCode: "SMS_487350086",
// signName: "北京华云智联科技",
// templateCode: "SMS_487410093",
templateParam: `{\"code\":\"${code}\"}`,
});
// 创建运行时配置对象
let runtime = new Util.RuntimeOptions({});
runtime.readTimeout = 5000;
runtime.connectTimeout = 5000;
// 发起请求
const response = await client.sendSmsWithOptions(sendSmsRequest, runtime);
if(response.body.code == "OK") {
await ctx.app.redis.get('db3').set(code, phone.toString(), 'EX', 600);
return { status: 200, msg: "验证码发送成功" };
};
} catch (error) {
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
// console.log('1===========================================')
// console.log(error.message);
// 若捕捉到 ConnectTimeout 错误,则尝试重发
if(error.message.includes("ConnectTimeout")) return { status: 600, msg: "尝试重新核验" };
// console.log('2===========================================')
// 诊断地址
console.log(error);
// console.log('3===========================================')
// console.log(error.data);
// console.log('4===========================================')
// console.log(error.data["Recommend"]);
// Util.default.assertAsString(error.message);
const blockName = fileName + "--" + "sendSMS";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
// 校验短信验证码
async checkCode(phone, code) {
const { ctx } = this;
try {
const phoneResult = await ctx.app.redis.get('db3').get(phone);
if (phoneResult == null) await ctx.app.redis.get('db3').set(phone, JSON.stringify({ status: 0 }), 'EX', 600);
else if (JSON.parse(phoneResult).status == '1') return true;
const check = await ctx.app.redis.get('db3').get(code);
if (check == null || check != phone) return false;
await ctx.app.redis.get('db3').del(code);
let remainder = await ctx.app.redis.get('db3').ttl(phone);
if (remainder < 60) remainder = 600;
await ctx.app.redis.get('db3').set(phone, JSON.stringify({ status: 1 }), 'EX', remainder);
return true;
} catch (error) {
const blockName = fileName + "--" + "checkCode";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
}
module.exports = SMSServiceService;

84
app/service/verify.js Normal file
View File

@@ -0,0 +1,84 @@
'use strict';
const Service = require('../core/base_service');
const fileName = "verify";
// const sha256 = require("crypto-js/sha256");
const { Op } = require("sequelize");
class VerifyService extends Service {
async toLogin(origin_url) {
const { ctx } = this;
try {
// const temporary = sha256(sha256(this.generateRandomString()).toString()+'temporary').toString();
// Op.regexp 正则匹配,适用于不同端用户登录同一域名的网站
// await ctx.model.Business.update({ temporary_id: temporary }, { where: { client_url: { [Op.regexp]: origin_url } } });
// const result = await ctx.model.Business.findOne({ where: { client_url: { [Op.regexp]: origin_url } } });
// Op.startsWith 包含,适用于不同端用户登录不同域名网站
// await ctx.model.Business.update({ temporary_id: temporary }, { where: { client_url: { [Op.startsWith]: origin_url } } });
const where = { client_url: { [Op.startsWith]: origin_url } };
const result = await ctx.model3.Business.findOne({ where });
return result || false;
} catch (error) {
const blockName = fileName + "--" + "toLogin";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async loginClient(client_id) {
const { ctx } = this;
try {
let checkFixedClient = false;
ctx.app.config.fixedClient.forEach(element => {
if (client_id == element) checkFixedClient = true;
});
if (checkFixedClient) {
return {
dataValues: {
client_id,
client_secret: client_id
}
};
} else {
const where = { temporary_id: client_id };
const result = await ctx.model3.Business.findOne({ where });
return result || false;
}
} catch (error) {
const blockName = fileName + "--" + "loginClient";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
async getToken(client_id) {
const { ctx } = this;
try {
let checkFixedClient = false;
ctx.app.config.fixedClient.forEach(element => {
if (client_id == element) checkFixedClient = true;
});
if (checkFixedClient) {
return {
dataValues: {
client_id,
client_secret: client_id
}
};
} else {
const where = { client_id };
const result = await ctx.model3.Business.findOne({ where });
return result || false;
}
} catch (error) {
const blockName = fileName + "--" + "getToken";
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
return 'error';
}
}
}
module.exports = VerifyService;