|
@@ -8,10 +8,31 @@
|
|
|
import BaseModel from "../../common/base/base_model";
|
|
|
import ManagerSchema from "./schemas/manager";
|
|
|
import crypto from "crypto";
|
|
|
+import Request from "request";
|
|
|
|
|
|
class ManagerModel extends BaseModel {
|
|
|
|
|
|
/**
|
|
|
+ * 超级用户用户名
|
|
|
+ *
|
|
|
+ * @var {String}
|
|
|
+ */
|
|
|
+ adminUsername = 'admin';
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 用户权限
|
|
|
+ *
|
|
|
+ * @var
|
|
|
+ */
|
|
|
+ permission = {
|
|
|
+ 'manager': '用户管理',
|
|
|
+ 'notify': '通知管理',
|
|
|
+ 'stdBillsmain': '清单规则编辑器',
|
|
|
+ 'rationRepository': '定额编辑器',
|
|
|
+ 'report': '报表模板',
|
|
|
+ };
|
|
|
+
|
|
|
+ /**
|
|
|
* 构造函数
|
|
|
*
|
|
|
* @return {void}
|
|
@@ -34,6 +55,13 @@ class ManagerModel extends BaseModel {
|
|
|
case 'changePassword':
|
|
|
this.model.schema.path('password').required(true);
|
|
|
break;
|
|
|
+ // CLD新增
|
|
|
+ case 'cldInsert':
|
|
|
+ this.model.schema.path('username').required(true);
|
|
|
+ this.model.schema.path('last_login').required(true);
|
|
|
+ this.model.schema.path('create_time').required(true);
|
|
|
+ this.model.schema.path('office').required(true);
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -95,6 +123,143 @@ class ManagerModel extends BaseModel {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+ * 登录信息校验
|
|
|
+ *
|
|
|
+ * @param {String} username
|
|
|
+ * @param {String} password
|
|
|
+ * @return {Promise}
|
|
|
+ */
|
|
|
+ async validLogin(username, password) {
|
|
|
+ let managerData = await this.findDataByCondition({username: username});
|
|
|
+
|
|
|
+ // 如果不是超级管理员登录则走CLD接口登录流程
|
|
|
+ if (username !== this.adminUsername) {
|
|
|
+ let CLDLoginInfo = await this.CLDLogin(username, password, managerData);
|
|
|
+ managerData = CLDLoginInfo;
|
|
|
+ } else {
|
|
|
+ this.validPassword(password, managerData);
|
|
|
+ }
|
|
|
+
|
|
|
+ return managerData;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证密码
|
|
|
+ *
|
|
|
+ * @param {String} password
|
|
|
+ * @param {Object} managerData
|
|
|
+ * @return {void}
|
|
|
+ */
|
|
|
+ validPassword(password, managerData) {
|
|
|
+ // 没有找到对应数据
|
|
|
+ if (managerData === null || managerData._id === undefined) {
|
|
|
+ throw {code: 44001, err: '用户名或密码错误'};
|
|
|
+ }
|
|
|
+
|
|
|
+ // 加密密码
|
|
|
+ let encryptPassword = this.encryptPassword(managerData.token, password);
|
|
|
+ if (encryptPassword !== managerData.password) {
|
|
|
+ throw {code: 44001, err: '用户名或密码错误'};
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * CLD登录
|
|
|
+ *
|
|
|
+ * @param {String} username
|
|
|
+ * @param {String} password
|
|
|
+ * @param {Object} managerData
|
|
|
+ * @return {Promise}
|
|
|
+ */
|
|
|
+ async CLDLogin(username, password, managerData) {
|
|
|
+ let result = managerData;
|
|
|
+ if (username === '' || password === '') {
|
|
|
+ throw {code: 44001, err: '用户名或密码错误'};
|
|
|
+ }
|
|
|
+ let CLDUrl = 'http://cld.smartcost.com.cn/api/auth';
|
|
|
+ // 生成加密token
|
|
|
+ let [encryptToken, postTime] = this.generateCLDToken();
|
|
|
+ let postData = {
|
|
|
+ username: username,
|
|
|
+ password: password,
|
|
|
+ time: postTime,
|
|
|
+ token: encryptToken,
|
|
|
+ app: 'scConstruct'
|
|
|
+ };
|
|
|
+
|
|
|
+ let postOption = {
|
|
|
+ url: CLDUrl,
|
|
|
+ form: postData,
|
|
|
+ encoding: 'utf8'
|
|
|
+ };
|
|
|
+ let responseData = await this.CLDLoginRequest(postOption);
|
|
|
+ // 登录成功后,存在此用户则直接返回
|
|
|
+ if (managerData) {
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 不存在则新增
|
|
|
+ this.setScene('cldInsert');
|
|
|
+ let current = new Date().getTime();
|
|
|
+ let insertData = {
|
|
|
+ username: username,
|
|
|
+ password: '',
|
|
|
+ token: '',
|
|
|
+ create_time: current,
|
|
|
+ last_login: current,
|
|
|
+ office: responseData.office
|
|
|
+ };
|
|
|
+ result = this.db.create(insertData);
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * CLD登录请求
|
|
|
+ *
|
|
|
+ * @param {Object} postOption
|
|
|
+ * @return {Promise}
|
|
|
+ */
|
|
|
+ CLDLoginRequest(postOption) {
|
|
|
+ return new Promise(function(resolve, reject) {
|
|
|
+ // 发起请求
|
|
|
+ Request.post(postOption, function(error, response, body) {
|
|
|
+ if (error || response.statusCode !== 200) {
|
|
|
+ console.log(response.statusCode + ':' + error);
|
|
|
+ reject({code: 44002, err: '接口请求出错'});
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ body = JSON.parse(body);
|
|
|
+
|
|
|
+ // 如果接口返回错误
|
|
|
+ if (body.err !== 0) {
|
|
|
+ reject({code: body.err, err: '登录失败'});
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ resolve(body.data);
|
|
|
+ });
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成CLD Token
|
|
|
+ *
|
|
|
+ * @return {Array}
|
|
|
+ */
|
|
|
+ generateCLDToken() {
|
|
|
+ // 加密内容
|
|
|
+ let token = 'sc@ConS!tru@ct*88';
|
|
|
+ let currentTime = new Date().getTime();
|
|
|
+ currentTime = parseFloat(currentTime / 1000).toFixed(0);
|
|
|
+
|
|
|
+ let encryptToken = this.encryptPassword(token, (token + currentTime));
|
|
|
+
|
|
|
+ return [encryptToken, currentTime];
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
* 创建管理员用户
|
|
|
*
|
|
|
* @return {Promise}
|