Browse Source

新增项目版登陆功能

olym 7 years ago
parent
commit
0949b39995

+ 17 - 4
app/controller/login_controller.js

@@ -31,12 +31,25 @@ module.exports = app => {
          * @return {void}
          */
         async login(ctx) {
-            const username = ctx.request.body.username;
-            const password = ctx.request.body.password;
+            let loginType = ctx.request.body.type;
 
             try {
-                const sso = new SSO(ctx);
-                const result = await sso.loginValid(username, password);
+                let result = false;
+                loginType = parseInt(loginType);
+                if (loginType === 1) {
+                    // 演示版登陆
+                    const username = ctx.request.body.username;
+                    const password = ctx.request.body.password;
+                    const sso = new SSO(ctx);
+                    result = await sso.loginValid(username, password);
+                } else {
+                    // 项目版登陆
+                    result = await ctx.service.projectAccount.accountLogin(ctx.request.body);
+                }
+
+                if (!result) {
+                    throw '登录失败';
+                }
             } catch (error) {
                 console.log(error);
             }

+ 4 - 6
app/lib/sso.js

@@ -43,17 +43,15 @@ class SSO {
             };
 
             const responseData = await this.ctx.helper.sendRequest(this.authUrl, postData);
-
             if (responseData.length <= 0) {
                 throw '接口返回错误:' + responseData.err;
             }
             // 如果验证成功,则新增SSO数据到数据库
-            if (responseData.data !== '') {
-                const addResult = await this.ctx.service.customer.addSSOUser(responseData[0]);
-                if (!addResult) {
-                    console.log('sso user add error');
-                }
+            const addResult = await this.ctx.service.customer.addSSOUser(responseData[0]);
+            if (!addResult) {
+                console.log('sso user add error');
             }
+
             result = true;
         } catch (error) {
             console.log('sso:' + error);

+ 7 - 3
app/service/customer.js

@@ -43,12 +43,16 @@ module.exports = app => {
          */
         async addSSOUser(data) {
             let result = false;
-            if (Object.keys(data).length <= 0) {
+            if (Object.keys(data).length <= 0 || data.useremail === undefined) {
                 return result;
             }
 
-            // 先查找是否成功
-
+            // 先查找是否存在
+            const customerData = await this.db.get(this.tableName, { email: data.useremail });
+            if (customerData !== null) {
+                // 存在则直接返回结果
+                return true;
+            }
             const insertData = {
                 email: data.useremail,
                 mobile: data.mobile,

+ 57 - 0
app/service/project.js

@@ -0,0 +1,57 @@
+'use strict';
+
+/**
+ * 项目数据模型
+ *
+ * @author CaiAoLin
+ * @date 2017/11/16
+ * @version
+ */
+
+const SqlBuilder = require('../lib/sql_builder');
+module.exports = app => {
+
+    class Project extends app.BaseService {
+
+        /**
+         * 构造函数
+         *
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
+        constructor(ctx) {
+            super(ctx);
+            this.tableName = 'project';
+            // 状态相关
+            this.status = {
+                TRY: 1,
+                NORMAL: 2,
+                DISABLE: 3,
+            };
+        }
+
+        /**
+         * 根据项目code获取项目数据
+         *
+         * @param {String} code - 项目code
+         * @return {Object} - 返回项目数据
+         */
+        async getProjectByCode(code) {
+            // 获取项目状态为非禁止的项目
+            const sqlBuilder = new SqlBuilder();
+            sqlBuilder.setAndWhere('code', {
+                value: this.db.escape(code),
+                operate: '=',
+            });
+            sqlBuilder.setAndWhere('status', {
+                value: this.status.DISABLE,
+                operate: '<',
+            });
+            const [sql, sqlParam] = sqlBuilder.build(this.tableName);
+            const projectData = await this.db.queryOne(sql, sqlParam);
+            return projectData;
+        }
+    }
+
+    return Project;
+};

+ 103 - 0
app/service/project_account.js

@@ -0,0 +1,103 @@
+'use strict';
+
+/**
+ * 项目账号数据模型
+ *
+ * @author CaiAoLin
+ * @date 2017/11/16
+ * @version
+ */
+
+// 加密类
+const crypto = require('crypto');
+const SSO = require('../lib/sso');
+module.exports = app => {
+
+    class ProjectAccount extends app.BaseService {
+
+        /**
+         * 构造函数
+         *
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
+        constructor(ctx) {
+            super(ctx);
+            this.tableName = 'project_account';
+        }
+
+        /**
+         * 数据验证规则
+         *
+         * @param {String} scene - 场景
+         * @return {Object} - 返回数据
+         */
+        rule(scene) {
+            let rule = {};
+            switch (scene) {
+                case 'login':
+                    rule = {
+                        account: { type: 'string', required: true, min: 2 },
+                        project_password: { type: 'string', required: true, min: 4 },
+                        project: { type: 'string', required: true, min: 13 },
+                    };
+                    break;
+                default:
+                    break;
+            }
+
+            return rule;
+        }
+
+        /**
+         * 账号登录
+         *
+         * @param {Object} data - 表单post数据
+         * @return {Boolean} - 返回登录结果
+         */
+        async accountLogin(data) {
+            let result = false;
+            try {
+                // 验证数据
+                const rule = this.rule('login');
+                this.ctx.validate(rule, data);
+
+                // 查找项目数据
+                const projectData = await this.ctx.service.project.getProjectByCode(data.project.toString());
+                if (projectData === null) {
+                    throw '不存在项目数据';
+                }
+
+                // 查找对应数据
+                const accountData = await this.db.get(this.tableName, {
+                    account: data.account,
+                    project_id: projectData.id,
+                });
+
+                if (accountData === null) {
+                    throw '不存在对应用户数据';
+                }
+
+                // 判断密码
+                if (accountData.is_admin === 1) {
+                    // 管理员则用sso通道判断
+                    const sso = new SSO(this.ctx);
+                    result = await sso.loginValid(data.account, data.project_password.toString());
+                } else {
+                    // 加密密码
+                    const encryptPassword = crypto.createHmac('sha1', data.account).update(data.project_password)
+                        .digest().toString('base64');
+                    result = encryptPassword === accountData.password;
+                }
+
+            } catch (error) {
+                console.log(error);
+                result = false;
+            }
+
+            return result;
+        }
+    }
+
+    return ProjectAccount;
+};

+ 32 - 10
app/view/login/login.ejs

@@ -14,28 +14,40 @@
     <!--演示版-->
     <form class="form-signin" method="post" action="">
         <h1 class="d-flex justify-content-center mb-4">计量支付</h1>
-        <nav class="nav nav-tabs nav-justified mb-3" role="tablist">
-            <a class="nav-item nav-link active" data-toggle="tab" href="#preview" role="tab">演示版登录</a>
-            <a class="nav-item nav-link" data-toggle="tab" href="#paid" role="tab">项目版登录</a>
+        <nav class="nav nav-tabs nav-justified mb-3" role="tablist" id="login-tab">
+            <a class="nav-item nav-link active" data-toggle="tab" data-type="1" href="#preview" role="tab">演示版登录</a>
+            <a class="nav-item nav-link" data-toggle="tab" data-type="2" href="#paid" role="tab">项目版登录</a>
         </nav>
         <div class="tab-content">
             <div class="tab-pane active" id="preview" role="tabpanel">
                 <div class="form-group">
-                    <input id="username" name="username" class="form-control " placeholder="通行账号 邮箱/手机" value="laiku123@qq.com" required="" autofocus="">
+                    <input id="username" name="username" class="form-control " placeholder="通行账号 邮箱/手机" value="laiku123@qq.com" autofocus="">
                 </div>
                 <div class="form-group">
-                    <input id="password" name="password" class="form-control " placeholder="输入密码" value="19930523" required="" type="password">
+                    <input id="password" name="password" class="form-control " placeholder="输入密码" value="19930523" type="password">
+                </div>
+            </div>
+            <div class="tab-pane" id="paid" role="tabpanel">
+                <div class="form-group">
+                    <input id="project" class="form-control" name="project" placeholder="项目编号" autofocus="" />
                 </div>
                 <div class="form-group">
-                    <button class="btn btn-primary btn-block" type="submit">登录</button>
-                    <input type="hidden" name="_csrf" value="<%= ctx.csrf %>">
+                    <input id="account" class="form-control" name="account" placeholder="输入账号" autofocus="" />
                 </div>
-                <div class="pt-1 d-flex justify-content-center">
-                    <a href="http://sso.smartcost.com.cn/getpasswd" target="_blank" class="mr-3">忘记密码</a>
-                    <a href="http://sso.smartcost.com.cn/reg" target="_blank">免费注册</a>
+                <div class="form-group">
+                    <input id="project-password" name="project_password" class="form-control" placeholder="输入密码" type="password" />
                 </div>
             </div>
         </div>
+        <div class="form-group">
+            <button class="btn btn-primary btn-block" type="submit">登录</button>
+            <input type="hidden" name="_csrf" value="<%= ctx.csrf %>" />
+            <input type="hidden" name="type" value="1" />
+        </div>
+        <div class="pt-1 d-flex justify-content-center">
+            <a href="http://sso.smartcost.com.cn/getpasswd" target="_blank" class="mr-3">忘记密码</a>
+            <a href="http://sso.smartcost.com.cn/reg" target="_blank">免费注册</a>
+        </div>
     </form>
     <!--项目版-->
 </div>
@@ -44,6 +56,16 @@
 <script src="/public/js/popper/popper.min.js"></script>
 <script src="/public/js/bootstrap/bootstrap.min.js"></script>
 <script src="/public/js/global.js"></script>
+<script type="text/javascript">
+$(document).ready(function() {
+    $("#login-tab a[data-toggle='tab']").on('shown.bs.tab', function () {
+        let type = $(this).data('type');
+        type = parseInt(type);
+        type = isNaN(type) || type <= 0 ? 1 : type;
+        $("input[name='type']:hidden").val(type);
+    });
+});
+</script>
 </body>
 
 </html>