Browse Source

1.新增同步用户数据计划任务
2.修改CLD登录逻辑

caiaolin 8 years ago
parent
commit
920f32f39b

+ 1 - 0
config/db/db_manager.js

@@ -60,5 +60,6 @@ module.exports = {
             console.log('MongoDB connection error:', err);
             process.exit(-1);
         });
+        return mg;
     }
 };

+ 95 - 0
crontab/cld_async_data.js

@@ -0,0 +1,95 @@
+/**
+ * CLD数据同步计划任务
+ *
+ * @author CaiAoLin
+ * @date 2017/7/26
+ * @version
+ */
+import ManagerModel from "../modules/users/models/manager_model";
+import DBManager from "../config/db/db_manager";
+import config from "../config/config";
+import fs from "fs";
+
+config.setToLocalDb();
+let connect = DBManager.connect();
+let counterFile = "./counter.txt";
+
+let main = async function () {
+    // 读取计数器
+    let id = fs.readFileSync(counterFile, "utf-8");
+    let CLDAsyncUrl = 'http://cld.smartcost.com.cn/api/async-user';
+
+    let managerModel = new ManagerModel();
+    try {
+        // 生成加密token
+        let [encryptToken, time] = managerModel.generateCLDToken();
+        let postData = {
+            time: time,
+            token: encryptToken,
+            last_id: id,
+            app: 'scConstruct'
+        };
+        let postOption = {
+            url: CLDAsyncUrl,
+            form: postData,
+            encoding: 'utf8'
+        };
+        let responseData = await managerModel.CLDRequest(postOption);
+        let userList = responseData;
+        if (userList.length <= 0) {
+            throw {code: 30001, msg: "没有数据"};
+        }
+
+        let usernameList = [];
+        for (let tmp of userList) {
+            usernameList.push(tmp.username);
+        }
+        // 查找对应的数据
+        let condition = {username: {"$in": usernameList}};
+        let managerData = await managerModel.findDataByCondition(condition, null, false, 'username');
+
+        // 准备插入数据库
+        let current = new Date().getTime();
+        let insertData = [];
+        let lastId = 0;
+        for (let tmp of userList) {
+            if (managerData[tmp.username] !== undefined) {
+                continue;
+            }
+            let userTmp = {
+                username: tmp.username,
+                password: '',
+                token: '',
+                create_time: current,
+                office: tmp.office,
+                can_login: 0
+            };
+            insertData.push(userTmp);
+            lastId = tmp.sid;
+        }
+
+        if (insertData.length <= 0) {
+            throw '没有需要操作的数据';
+        }
+        managerModel.setScene('cldInsert');
+        let insertResult = await managerModel.createManager(insertData);
+        if(insertResult.length > 0) {
+            // 成功则更新id
+            fs.writeFileSync(counterFile, lastId, "utf-8");
+        }
+
+    } catch (error) {
+        // 重置起始标识(如果需要循环才开启,开启后后台删除则过一段时间又会插入回数据库)
+        // let code = error.code !== undefined ? error.code : '';
+        // if (code === 30001) {
+        //     fs.writeFileSync(counterFile, 0, "utf-8");
+        // }
+        console.log(error);
+    }
+
+
+    // 用完关闭
+    connect.disconnect();
+};
+
+main();

+ 1 - 0
crontab/counter.txt

@@ -0,0 +1 @@
+62

+ 13 - 0
modules/users/controllers/login_controller.js

@@ -61,6 +61,19 @@ class LoginController extends BaseController {
                 superAdmin: managerData.super_admin
             };
             request.session.managerData = managerSession;
+
+            // 更新登录信息
+            let ip = request.connection.remoteAddress;
+            ip = ip.split(':');
+            ip = ip[3] === undefined ? '' : ip[3];
+            let updateData = {
+                login_ip: ip,
+                last_login: new Date().getTime()
+            };
+            let updateResult = managerModel.updateById(managerData._id, updateData);
+            if (!updateResult) {
+                throw '更新登录信息失败!';
+            }
         } catch (error) {
             responseData.error = error.code;
             responseData.msg = error.err;

+ 28 - 20
modules/users/models/manager_model.js

@@ -58,7 +58,6 @@ class ManagerModel extends BaseModel {
             // 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;
@@ -137,25 +136,30 @@ class ManagerModel extends BaseModel {
             let CLDLoginInfo = await this.CLDLogin(username, password, managerData);
             managerData = CLDLoginInfo;
         } else {
-            this.validPassword(password, managerData);
+            this.valid(password, managerData);
         }
 
         return managerData;
     }
 
     /**
-     * 验证密码
+     * 验证登录信息
      *
      * @param {String} password
      * @param {Object} managerData
      * @return {void}
      */
-    validPassword(password, managerData) {
+    valid(password, managerData) {
         // 没有找到对应数据
         if (managerData === null || managerData._id === undefined) {
             throw {code: 44001, err: '用户名或密码错误'};
         }
 
+        // 是否禁止登录
+        if (managerData.can_login !== 1) {
+            throw {code: 44002, err: '用户名不存在'};
+        }
+
         // 加密密码
         let encryptPassword = this.encryptPassword(managerData.token, password);
         if (encryptPassword !== managerData.password) {
@@ -176,6 +180,11 @@ class ManagerModel extends BaseModel {
         if (username === '' || password === '') {
             throw {code: 44001, err: '用户名或密码错误'};
         }
+        // 库中不存在则不允许登录,需等同步到数据后才可以继续后面的流程
+        if (!managerData) {
+            throw {code: 44003, err: '用户不存在'};
+        }
+
         let CLDUrl = 'http://cld.smartcost.com.cn/api/auth';
         // 生成加密token
         let [encryptToken, postTime] = this.generateCLDToken();
@@ -192,7 +201,7 @@ class ManagerModel extends BaseModel {
             form: postData,
             encoding: 'utf8'
         };
-        let responseData = await this.CLDLoginRequest(postOption);
+        let responseData = await this.CLDRequest(postOption);
         // 登录成功后,存在此用户则直接返回
         if (managerData) {
             return result;
@@ -207,7 +216,8 @@ class ManagerModel extends BaseModel {
             token: '',
             create_time: current,
             last_login: current,
-            office: responseData.office
+            office: responseData.office,
+            can_login: 0
         };
         result = this.db.create(insertData);
 
@@ -215,12 +225,12 @@ class ManagerModel extends BaseModel {
     }
 
     /**
-     * CLD登录请求
+     * CLD请求
      *
      * @param {Object} postOption
      * @return {Promise}
      */
-    CLDLoginRequest(postOption) {
+    CLDRequest(postOption) {
         return new Promise(function(resolve, reject) {
             // 发起请求
             Request.post(postOption, function(error, response, body) {
@@ -234,7 +244,7 @@ class ManagerModel extends BaseModel {
 
                 // 如果接口返回错误
                 if (body.err !== 0) {
-                    reject({code: body.err, err: '登录失败'});
+                    reject({code: body.err, err: '接口返回错误'});
                     return;
                 }
 
@@ -260,20 +270,18 @@ class ManagerModel extends BaseModel {
     }
 
     /**
-     * 创建管理员用户
+     * 新增管理员
      *
+     * @param {Object} data
      * @return {Promise}
      */
-    createManager() {
-        let insertData = {
-            username: 'test',
-            password: this.encryptPassword('DjfDTys2dh2', 'test123'),
-            token: 'DjfDTys2dh2',
-            create_time: new Date().getTime(),
-            role: 1,
-            super_admin: 1
-        };
-        return this.db.create(insertData);
+    async createManager(data) {
+        if (Object.keys(data).length <= 0) {
+            throw '数据格式错误';
+        }
+        let result = await this.db.create(data);
+
+        return result;
     }
 
 }

+ 0 - 1
web/users/js/login.js

@@ -55,7 +55,6 @@ $(document).ready(function() {
                 isLogin = true;
             },
             success: function(response) {
-                console.log('test');
                 isLogin = false;
                 if (response.error === 0) {
                     // 正确则跳转