Przeglądaj źródła

登录去除手机验证码验证

laiguoran 6 lat temu
rodzic
commit
72ee8eca45

+ 222 - 73
modules/users/controllers/login_controller.js

@@ -26,7 +26,58 @@ class LoginController {
         if (sessionUser !== undefined && sessionUser.ssoId >= 0) {
             return response.redirect("/pm");
         }
+        // 判断是否有带token和ssoID参数
+        if (request.query.ssoID !== undefined && request.query.token !== undefined) {
+            let ssoID = request.query.ssoID;
+            let token = request.query.token;
+            try {
+                let userModel = new UserModel();
+                // 调用接口验证登录信息
+                let responseData = await userModel.getInfoFromSSO2(ssoID, token);
+                // 先判断返回值是否为未激活状态
+                if ( responseData === '-3') {
+                    throw '因邮箱未完成认证,账号未激活;去<a href="https://sso.smartcost.com.cn" target="_blank">激活</a>。';
+                }
+                if ( responseData === '-2') {
+                    throw 'token已过期,请重新登录Z+获取';
+                }
+                responseData = JSON.parse(responseData);
+                if (typeof responseData !== 'object') {
+                    throw 'ssoId错误或token过期';
+                }
+
+                if (responseData.length <= 0) {
+                    throw '接口返回数据错误';
+                }
+                let userData = responseData[0];
+                //还要判断account是否是专业版用户
+                let isPro = false;
+                const userInfo = await userModel.findDataByAccount(userData.mobile);
+                if (userInfo && userInfo.upgrade_list !== undefined) {
+                    for (const ul of userInfo.upgrade_list) {
+                        if (ul.isUpgrade === true) {
+                            isPro = true;
+                            break;
+                        }
+                    }
+                }
+                if (isPro) {
+                    let renderData = {
+                      ssoID: ssoID,
+                      token: token,
+                      mobile: userInfo.mobile,
+                      showMobile: userInfo.mobile.substr(0, 3) + '****' + userInfo.mobile.substr(7, 11)
+                    };
+                    response.render('users/html/login-sms', renderData);
+                    return
+                } else {
 
+                }
+            } catch (error) {
+                console.log(error)
+                return response.redirect("/login");
+            }
+        }
         response.render('users/html/login', {});
     }
 
@@ -68,34 +119,34 @@ class LoginController {
             }
 
             //还要判断account是否是专业版用户
-            let isPro = false;
-            const userInfo = await userModel.findDataByAccount(account);
-
-            if (userInfo && userInfo.upgrade_list !== undefined) {
-                for (const ul of userInfo.upgrade_list) {
-                    if (ul.isUpgrade === true) {
-                        isPro = true;
-                        break;
-                    }
-                }
-            }
-            // 专业版短信验证码验证
-            if (isPro) {
-                const codeMsg = request.session.code;
-                if (codeMsg !== undefined && request.body.code !== '') {
-                    const code = codeMsg.split('_')[0];
-                    const time = codeMsg.split('_')[1];
-                    console.log(code);
-                    console.log(request.body.code);
-                    if (Date.parse(new Date())/1000 > time+60*5 || request.body.code !== code) {
-                        return response.json({error: 3, msg: '验证码错误。'});
-                    } else {
-                        delete request.session.code;
-                    }
-                } else {
-                    return response.json({error: 3, msg: '验证码错误。'});
-                }
-            }
+            // let isPro = false;
+            // const userInfo = await userModel.findDataByAccount(account);
+            //
+            // if (userInfo && userInfo.upgrade_list !== undefined) {
+            //     for (const ul of userInfo.upgrade_list) {
+            //         if (ul.isUpgrade === true) {
+            //             isPro = true;
+            //             break;
+            //         }
+            //     }
+            // }
+            // // 专业版短信验证码验证
+            // if (isPro) {
+            //     const codeMsg = request.session.code;
+            //     if (codeMsg !== undefined && request.body.code !== '') {
+            //         const code = codeMsg.split('_')[0];
+            //         const time = codeMsg.split('_')[1];
+            //         console.log(code);
+            //         console.log(request.body.code);
+            //         if (Date.parse(new Date())/1000 > time+60*5 || request.body.code !== code) {
+            //             return response.json({error: 3, msg: '验证码错误。'});
+            //         } else {
+            //             delete request.session.code;
+            //         }
+            //     } else {
+            //         return response.json({error: 3, msg: '验证码错误。'});
+            //     }
+            // }
 
             // 判断极验验证码是否通过
             const captcha = new Captcha();
@@ -157,45 +208,24 @@ class LoginController {
     }
 
     /**
-     * 验证码注册
-     *
-     * @param {object} request
-     * @param {object} response
-     * @return {string}
+     * Z+平台专业版用户登录方式
      */
-    async captcha(request, response) {
-        const captcha = new Captcha();
-        const res = await captcha.register(request);
-        response.json(res);
-    }
-
-    /**
-     * 判断用户是否是专业版用户
-     * @param request
-     * @param response
-     * @returns {Promise<void>}
-     */
-    async accountIsPro(request, response) {
-        let res = {
-            error: 0,
-            msg: '',
-            result: false,
-        };
-        try{
-            const account = request.body.account;
-            const password = request.body.pw;
-
-            // 根据邮箱或手机号获取账号信息
+    async startupLogin(request, response) {
+        let ssoID = request.body.ssoID;
+        let token = request.body.token;
+        let preferenceSetting = {};
+        let compilationList = [];
+        try {
             let userModel = new UserModel();
+
             // 调用接口验证登录信息
-            let responseData = await userModel.getInfoFromSSO(account, password);
-            // 先判断返回值是否为未激活状态
-            if ( responseData === '-3') {
-                throw '因邮箱未完成认证,账号未激活;去<a href="https://sso.smartcost.com.cn" target="_blank">激活</a>。';
+            let responseData = await userModel.getInfoFromSSO2(ssoID, token);
+            if ( responseData === '-2') {
+                throw 'token已过期,请重新登录Z+获取';
             }
             responseData = JSON.parse(responseData);
             if (typeof responseData !== 'object') {
-                throw '邮箱/手机 或 密码错误';
+                throw 'ssoId错误或token过期';
             }
 
             if (responseData.length <= 0) {
@@ -209,26 +239,145 @@ class LoginController {
                 return response.json({error: 2,ssoId: userData.id});
             }
 
-            const userInfo = await userModel.findDataByAccount(account);
-            if (userInfo && userInfo.upgrade_list !== undefined) {
-                for (const ul of userInfo.upgrade_list) {
-                    if (ul.isUpgrade === true) {
-                        res.result = true;
-                        res.data = userInfo.mobile;
-                        break;
-                    }
+            // 专业版短信验证码验证
+            const codeMsg = request.session.code;
+            if (codeMsg !== undefined && request.body.code !== '') {
+                const code = codeMsg.split('_')[0];
+                const time = codeMsg.split('_')[1];
+                if (Date.parse(new Date())/1000 > time+60*5 || request.body.code !== code) {
+                    return response.json({error: 3, msg: '验证码错误。'});
+                } else {
+                    delete request.session.code;
                 }
             } else {
-                res.msg = '当前未存在此用户';
+                return response.json({error: 3, msg: '验证码错误。'});
             }
-        } catch (err) {
-            res.error = 1;
-            res.msg = err;
+
+            let sessionUser = {
+                ssoId: userData.id,
+                username: userData.username,
+                email: userData.useremail,
+                mobile: userData.mobile,
+            };
+
+            request.session.sessionUser = sessionUser;
+            // 记录用户数据到数据库
+            let result = await userModel.markUser(sessionUser, request);
+
+            // 获取偏好设置
+            let settingModel = new SettingModel();
+            preferenceSetting = await settingModel.getPreferenceSetting(request.session.sessionUser.id);
+            if (!result) {
+                throw '标记用户信息失败!';
+            }
+            let compilationModel = new CompilationModel();
+            if(preferenceSetting.login_ask === 1 || preferenceSetting.select_version === ''){
+                preferenceSetting.login_ask = 1;
+                compilationList = await  compilationModel.getList();
+            }
+            else{
+                compilationList = [];
+            }
+            // 获取编办信息
+            let sessionCompilation = request.session.sessionCompilation;
+
+            if (preferenceSetting.login_ask === 0 && !sessionCompilation &&
+                preferenceSetting.select_version !== '') {
+                let compilationData = await compilationModel.getCompilationById(preferenceSetting.select_version);
+                // 判断当前用户的是使用免费版还是专业版
+                let compilationVersion = await userModel.getVersionFromUpgrade(sessionUser.ssoId, preferenceSetting.select_version);
+                request.session.compilationVersion = compilationVersion;
+                request.session.sessionCompilation = compilationData;
+                if(request.session.sessionUser.latest_used !== preferenceSetting.select_version) await userModel.updateLatestUsed(request.session.sessionUser.id,preferenceSetting.select_version);
+            }
+
+        } catch (error) {
+            console.log(error);
+            return response.json({error: 1, msg: error});
         }
+        console.log(`${request.session.sessionUser.real_name}--id:${request.session.sessionUser.id}--登录了系统`);
+        response.json({
+            error: 0,
+            msg: '',
+            login_ask: preferenceSetting.login_ask,
+            compilation_list: JSON.stringify(compilationList),
+            last_page: request.session.lastPage
+        });
+    }
 
+    /**
+     * 验证码注册
+     *
+     * @param {object} request
+     * @param {object} response
+     * @return {string}
+     */
+    async captcha(request, response) {
+        const captcha = new Captcha();
+        const res = await captcha.register(request);
         response.json(res);
     }
 
+    /**
+     * 判断用户是否是专业版用户
+     * @param request
+     * @param response
+     * @returns {Promise<void>}
+     */
+    // async accountIsPro(request, response) {
+    //     let res = {
+    //         error: 0,
+    //         msg: '',
+    //         result: false,
+    //     };
+    //     try{
+    //         const account = request.body.account;
+    //         const password = request.body.pw;
+    //
+    //         // 根据邮箱或手机号获取账号信息
+    //         let userModel = new UserModel();
+    //         // 调用接口验证登录信息
+    //         let responseData = await userModel.getInfoFromSSO(account, password);
+    //         // 先判断返回值是否为未激活状态
+    //         if ( responseData === '-3') {
+    //             throw '因邮箱未完成认证,账号未激活;去<a href="https://sso.smartcost.com.cn" target="_blank">激活</a>。';
+    //         }
+    //         responseData = JSON.parse(responseData);
+    //         if (typeof responseData !== 'object') {
+    //             throw '邮箱/手机 或 密码错误';
+    //         }
+    //
+    //         if (responseData.length <= 0) {
+    //             throw '接口返回数据错误';
+    //         }
+    //
+    //         // 正确登录后 存入session
+    //         let userData = responseData[0];
+    //
+    //         if (userData.mobile === '') {
+    //             return response.json({error: 2,ssoId: userData.id});
+    //         }
+    //
+    //         const userInfo = await userModel.findDataByAccount(account);
+    //         if (userInfo && userInfo.upgrade_list !== undefined) {
+    //             for (const ul of userInfo.upgrade_list) {
+    //                 if (ul.isUpgrade === true) {
+    //                     res.result = true;
+    //                     res.data = userInfo.mobile;
+    //                     break;
+    //                 }
+    //             }
+    //         } else {
+    //             res.msg = '当前未存在此用户';
+    //         }
+    //     } catch (err) {
+    //         res.error = 1;
+    //         res.msg = err;
+    //     }
+    //
+    //     response.json(res);
+    // }
+
 }
 
 export default LoginController;

+ 32 - 0
modules/users/models/user_model.js

@@ -81,6 +81,38 @@ class UserModel extends BaseModel {
     }
 
     /**
+     * 根据用户id和token调用SSO接口获取信息
+     *
+     * @param {string} username
+     * @param {string} password
+     * @return {object}
+     */
+    async getInfoFromSSO2(ssoID, token) {
+        let postData = {
+            url: 'http://sso.smartcost.com.cn/building/api/login/auth',
+            form: {ssoID: ssoID, token: token},
+            encoding: 'utf8'
+        };
+        return new Promise(function (resolve, reject) {
+            try {
+                // 请求接口
+                Request.post(postData, function (err, postResponse, body) {
+                    if (err) {
+                        console.log('111');
+                        throw '请求错误';
+                    }
+                    if (postResponse.statusCode !== 200) {
+                        throw '通行证验证失败!';
+                    }
+                    resolve(body);
+                });
+            } catch (error) {
+                reject([]);
+            }
+        });
+    }
+
+    /**
      * 标记用户
      *
      * @param {object} userData

+ 3 - 1
modules/users/routes/login_route.js

@@ -18,8 +18,10 @@ module.exports = function (app) {
 
 // 登录操作
     router.post('/login', loginController.login);
+    // Z+平台专业版用户登录方式
+    router.post('/login/startup', loginController.startupLogin);
 
-    router.post('/accountIsPro', loginController.accountIsPro);
+    // router.post('/accountIsPro', loginController.accountIsPro);
 
     // 验证码相关
     router.get('/captcha', loginController.captcha);

+ 13 - 8
server.js

@@ -56,7 +56,8 @@ app.use(session({
 // 登录状态全局判断
 app.use(function (req, res, next) {
     let url = req.originalUrl;
-    if (/^\/login/.test(url) || /\.map|\.ico$/.test(url) || /^\/sms/.test(url) || /^\/cld/.test(url) || /^\/captcha/.test(url)  || /^\/accountIsPro/.test(url)) {
+    // if (/^\/login/.test(url) || /\.map|\.ico$/.test(url) || /^\/sms/.test(url) || /^\/cld/.test(url) || /^\/captcha/.test(url)  || /^\/accountIsPro/.test(url)) {
+    if (/^\/login/.test(url) || /\.map|\.ico$/.test(url) || /^\/sms/.test(url) || /^\/cld/.test(url) || /^\/captcha/.test(url)) {
         // 如果是登录页面或短信接口或cld接口则忽略判断数据
         next();
     } else {
@@ -64,13 +65,17 @@ app.use(function (req, res, next) {
             // 判断session
             let sessionUser = req.session.sessionUser;
             if (!sessionUser) {
-                //处理 ajax 请求 session 过期问题
-                if (req.headers["x-requested-with"] != null
-                    && req.headers["x-requested-with"] == "XMLHttpRequest"
-                    && req.url != "/login") {
-                    return res.json({ret_code: 99, ret_msg: '登录信息失效,请您重新登录'});
-                }else {
-                    throw 'session error';
+                if (req.query.ssoID !== undefined && req.query.ssoID !== null && req.query.token !== undefined && req.query.token !== null) {
+                    return res.redirect('/login' + url);
+                } else {
+                    //处理 ajax 请求 session 过期问题
+                    if (req.headers["x-requested-with"] != null
+                        && req.headers["x-requested-with"] == "XMLHttpRequest"
+                        && req.url != "/login") {
+                        return res.json({ret_code: 99, ret_msg: '登录信息失效,请您重新登录'});
+                    }else {
+                        throw 'session error';
+                    }
                 }
             }
             res.locals.sessionUser = sessionUser;

Plik diff jest za duży
+ 82 - 0
web/users/html/login-sms.html


+ 29 - 29
web/users/html/login.html

@@ -110,35 +110,35 @@
             </div>
         </div>
     </div>
-    <!--弹出手机验证码-->
-    <div class="modal fade" id="phonepass" data-backdrop="static">
-        <div class="modal-dialog" role="document">
-            <div class="modal-content">
-                <div class="modal-header">
-                    <h5 class="modal-title">验证码安全登录</h5>
-                </div>
-                <div class="modal-body">
-                    <p class="">请您提供手机验证码进行安全登录。</p>
-                    <p class="">请点击“获取验证码”,验证码将发送至手机<span id="pro_mobile"></span>,注意查收。</p>
-                    <div class="form-row">
-                        <div class="form-group col-md-8">
-                            <input type="text" class="form-control" id="smsCode" placeholder="输入验证码">
-                            <div class="invalid-feedback">
-                            </div>
-                            <input type="hidden" class="form-control" id="proMobile">
-                        </div>
-                        <div class="form-group col-md-4">
-                            <button class="btn btn-primary" id="get-code2">获取验证码</button>
-                        </div>
-                    </div>
-                </div>
-                <div class="modal-footer">
-                    <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                    <button class="btn btn-primary" id="loginPro">登录</button>
-                </div>
-            </div>
-        </div>
-    </div>
+    <!--&lt;!&ndash;弹出手机验证码&ndash;&gt;-->
+    <!--<div class="modal fade" id="phonepass" data-backdrop="static">-->
+        <!--<div class="modal-dialog" role="document">-->
+            <!--<div class="modal-content">-->
+                <!--<div class="modal-header">-->
+                    <!--<h5 class="modal-title">验证码安全登录</h5>-->
+                <!--</div>-->
+                <!--<div class="modal-body">-->
+                    <!--<p class="">请您提供手机验证码进行安全登录。</p>-->
+                    <!--<p class="">请点击“获取验证码”,验证码将发送至手机<span id="pro_mobile"></span>,注意查收。</p>-->
+                    <!--<div class="form-row">-->
+                        <!--<div class="form-group col-md-8">-->
+                            <!--<input type="text" class="form-control" id="smsCode" placeholder="输入验证码">-->
+                            <!--<div class="invalid-feedback">-->
+                            <!--</div>-->
+                            <!--<input type="hidden" class="form-control" id="proMobile">-->
+                        <!--</div>-->
+                        <!--<div class="form-group col-md-4">-->
+                            <!--<button class="btn btn-primary" id="get-code2">获取验证码</button>-->
+                        <!--</div>-->
+                    <!--</div>-->
+                <!--</div>-->
+                <!--<div class="modal-footer">-->
+                    <!--<button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>-->
+                    <!--<button class="btn btn-primary" id="loginPro">登录</button>-->
+                <!--</div>-->
+            <!--</div>-->
+        <!--</div>-->
+    <!--</div>-->
     <!-- JS. -->
     <!-- inject:js -->
     <script type="text/javascript" src="/public/web/scMathUtil.js"></script>

+ 65 - 65
web/users/js/login.js

@@ -51,47 +51,47 @@ $(document).ready(function () {
                 return false;
             }
             let account = $("#inputEmail").val();
-            let pw = $("#inputPassword").val();
+            // let pw = $("#inputPassword").val();
 
             // 判断输入的邮箱/手机是否格式正确
             if(/^1[3456789]\d{9}$/.test(account) || /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(account)) {
-                // 先判断是否是专业版用户,是的话弹出短信验证
-                $.ajax({
-                    url: '/accountIsPro',
-                    type: 'post',
-                    async: true,
-                    data: {"account": account, "pw": pw},
-                    success: function (response) {
-                        if (response.error === 0) {
-                            const ispro = response.result;
-                            if (!ispro) {
+                // // 先判断是否是专业版用户,是的话弹出短信验证
+                // $.ajax({
+                //     url: '/accountIsPro',
+                //     type: 'post',
+                //     async: true,
+                //     data: {"account": account, "pw": pw},
+                //     success: function (response) {
+                //         if (response.error === 0) {
+                //             const ispro = response.result;
+                //             if (!ispro) {
                                 login(captchaObj);
-                            } else {
-                                $('#phonepass').modal('show');
-                                $('#proMobile').val(response.data);
-                                $('#pro_mobile').text(response.data.substr(0, 3) + '****' + response.data.substr(7, 11));
-                            }
-                        } else if(response.error === 2) {
-                            $('#check_ssoId').val(response.ssoId);
-                            $('#phone').modal('show');
-                        } else {
-                            let msg = response.msg !== undefined ? response.msg : '未知错误';
-                            showError(msg, $("input"));
-                        }
-                    }
-                });
+                //             } else {
+                //                 $('#phonepass').modal('show');
+                //                 $('#proMobile').val(response.data);
+                //                 $('#pro_mobile').text(response.data.substr(0, 3) + '****' + response.data.substr(7, 11));
+                //             }
+                //         } else if(response.error === 2) {
+                //             $('#check_ssoId').val(response.ssoId);
+                //             $('#phone').modal('show');
+                //         } else {
+                //             let msg = response.msg !== undefined ? response.msg : '未知错误';
+                //             showError(msg, $("input"));
+                //         }
+                //     }
+                // });
             } else {
                 $('#emailHelp').text('您输入的 邮箱/手机 格式不对');
             }
         });
 
-        $('#loginPro').click(function () {
-            if ($('#smsCode').val() === '') {
-                showValidError('请输入验证码',$('#smsCode'));
-            } else {
-                login(captchaObj);
-            }
-        });
+        // $('#loginPro').click(function () {
+        //     if ($('#smsCode').val() === '') {
+        //         showValidError('请输入验证码',$('#smsCode'));
+        //     } else {
+        //         login(captchaObj);
+        //     }
+        // });
 
         $('#check-code').click(function () {
             const mobile = $("#mobile").val();
@@ -172,32 +172,32 @@ $(document).ready(function () {
         }
     });
 
-    $("#get-code2").click(function() {
-        const mobile = $("#proMobile").val();
-        if(!validMobile(mobile)){
-            return false;
-        }
-        const btn = $(this);
-        if(!btn.hasClass('disabled')){
-            $.ajax({
-                url: '/sms/code',
-                type: 'post',
-                data: { mobile: mobile, type: 3},
-                error: function() {
-                    showValidError('短信接口出错!',$('#smsCode'));
-                },
-                beforeSend: function() {
-                },
-                success: function(response) {
-                    if (response.err === 0) {
-                        codeSuccess(btn);
-                    } else {
-                        showValidError(response.msg,$('#smsCode'));
-                    }
-                }
-            });
-        }
-    });
+    // $("#get-code2").click(function() {
+    //     const mobile = $("#proMobile").val();
+    //     if(!validMobile(mobile)){
+    //         return false;
+    //     }
+    //     const btn = $(this);
+    //     if(!btn.hasClass('disabled')){
+    //         $.ajax({
+    //             url: '/sms/code',
+    //             type: 'post',
+    //             data: { mobile: mobile, type: 3},
+    //             error: function() {
+    //                 showValidError('短信接口出错!',$('#smsCode'));
+    //             },
+    //             beforeSend: function() {
+    //             },
+    //             success: function(response) {
+    //                 if (response.err === 0) {
+    //                     codeSuccess(btn);
+    //                 } else {
+    //                     showValidError(response.msg,$('#smsCode'));
+    //                 }
+    //             }
+    //         });
+    //     }
+    // });
 });
 
 function login(captchaObj) {
@@ -206,7 +206,7 @@ function login(captchaObj) {
     let geetest_challenge = $('input[name="geetest_challenge"]').val();
     let geetest_validate = $('input[name="geetest_validate"]').val();
     let geetest_seccode = $('input[name="geetest_seccode"]').val();
-    let code = $("#smsCode").val();
+    // let code = $("#smsCode").val();
 
     $.ajax({
         url: '/login',
@@ -217,11 +217,11 @@ function login(captchaObj) {
             "geetest_challenge": geetest_challenge,
             "geetest_validate": geetest_validate,
             "geetest_seccode": geetest_seccode,
-            "code": code,
+            // "code": code,
         },
         success: function (response) {
             if (response.error === 0) {
-                $('#phonepass').modal('hide');
+                // $('#phonepass').modal('hide');
                 const url = response.last_page !== null && response.last_page !== undefined && response.last_page !== '' ?
                     response.last_page : '/pm';
                 if (response.login_ask === 0) {
@@ -238,14 +238,14 @@ function login(captchaObj) {
                     $('#ver').modal('show');
                 }
             } else if(response.error === 2) {
-                $('#phonepass').modal('hide');
+                // $('#phonepass').modal('hide');
                 captchaObj.reset();
                 $('#check_ssoId').val(response.ssoId);
                 $('#phone').modal('show');
-            } else if(response.error === 3) {
-                showValidError(response.msg,$('#smsCode'));
+            // } else if(response.error === 3) {
+                // showValidError(response.msg,$('#smsCode'));
             } else {
-                $('#phonepass').modal('hide');
+                // $('#phonepass').modal('hide');
                 let msg = response.msg !== undefined ? response.msg : '未知错误';
                 showError(msg, $("input"));
                 captchaObj.reset();

+ 186 - 0
web/users/js/login_startup.js

@@ -0,0 +1,186 @@
+/**
+ * 登录相关js
+ *
+ * @author CaiAoLin
+ * @date 2017/6/8
+ * @version
+ */
+$(document).ready(function () {
+    $("input").blur(function () {
+        cleanError();
+        cleanValidError($(this));
+    });
+
+    $("#get-code").click(function() {
+        const mobile = $("#proMobile").val();
+        const btn = $(this);
+        if(!btn.hasClass('disabled')){
+            $.ajax({
+                url: '/sms/code',
+                type: 'post',
+                data: { mobile: mobile, type: 3},
+                error: function() {
+                    showValidError('短信接口出错!',$('#smsCode'));
+                },
+                beforeSend: function() {
+                },
+                success: function(response) {
+                    if (response.err === 0) {
+                        codeSuccess(btn);
+                    } else {
+                        showValidError(response.msg,$('#smsCode'));
+                    }
+                }
+            });
+        }
+    });
+});
+
+function login() {
+    let ssoID = $("#ssoID").val();
+    let token = $("#token").val();
+    let code = $("#smsCode").val();
+
+    $.ajax({
+        url: '/login',
+        type: 'post',
+        data: {
+            "ssoID": ssoID,
+            "token": token,
+            "code": code,
+        },
+        success: function (response) {
+            if (response.error === 0) {
+                $('#phonepass').modal('hide');
+                const url = response.last_page !== null && response.last_page !== undefined && response.last_page !== '' ?
+                    response.last_page : '/pm';
+                if (response.login_ask === 0) {
+                    location.href = url;
+                } else {
+                    response.compilation_list = response.compilation_list === undefined || response.compilation_list === '' ?
+                        null : JSON.parse(response.compilation_list);
+                    if (response.compilation_list === null || response.compilation_list.length <= 0) {
+                        location.href = url;
+                        return false;
+                    }
+                    console.log(response.compilation_list);
+                    setVersion(response.compilation_list);
+                    $('#ver').modal('show');
+                }
+            } else if(response.error === 2) {
+                $('#phonepass').modal('hide');
+                captchaObj.reset();
+                $('#check_ssoId').val(response.ssoId);
+                $('#phone').modal('show');
+            } else if(response.error === 3) {
+                showValidError(response.msg,$('#smsCode'));
+            } else {
+                $('#phonepass').modal('hide');
+                let msg = response.msg !== undefined ? response.msg : '未知错误';
+                showError(msg, $("input"));
+                captchaObj.reset();
+            }
+        },
+        error: function (result) {
+            showError('内部程序错误', null);
+        }
+    });
+}
+
+/**
+ * 获取成功后的操作
+ *
+ * @param {Object} btn - 点击的按钮
+ * @return {void}
+ */
+function codeSuccess(btn) {
+    let counter = 60;
+    btn.removeClass('btn-primary').addClass('btn-outline-secondary disabled').text(counter + '秒 重新获取');
+    btn.parents().siblings('div').children('input').removeAttr('readonly');
+
+    const countDown = setInterval(function() {
+        const countString = counter - 1 <= 0 ? '' : ' ' + (counter - 1) + '秒 ';
+        // 倒数结束后
+        if (countString === '') {
+            clearInterval(countDown);
+            btn.removeClass('btn-outline-secondary disabled').addClass('btn-primary').text('获取验证码');
+        }
+        const text = countString + '重新获取';
+        btn.text(text);
+        counter -= 1;
+    }, 1000);
+}
+
+/**
+ * 提示验证信息错误
+ *
+ * @param {string} msg
+ * @param {object} element
+ * @return {void}
+ */
+function showValidError(msg, element) {
+    if (element !== null) {
+        element.addClass('is-invalid');
+        element.siblings().text(msg);
+    }
+}
+
+/**
+ * 清除验证信息错误提示
+ *
+ * @return {void}
+ */
+function cleanValidError(element) {
+    element.removeClass('is-invalid');
+    element.siblings().text('');
+}
+
+/**
+ * 提示错误
+ *
+ * @param {string} msg
+ * @param {object} element
+ * @return {void}
+ */
+function showError(msg, element) {
+    if (element !== null) {
+        element.parent().addClass('has-danger');
+    }
+    $("#message").html(msg);
+    $("#error-tips").show("fast");
+}
+
+/**
+ * 清除错误提示
+ *
+ * @return {void}
+ */
+function cleanError() {
+    $("input").parent().removeClass('has-danger');
+    $("#message").text('');
+    $("#error-tips").hide("fast");
+}
+
+/**
+ * 设置版本信息
+ *
+ * @param {Object} versionData
+ * @return {void}
+ */
+function setVersion(versionData) {
+    let html = '';
+    for (let version of versionData) {
+        let description = version.description ? version.description : '介绍内容';
+        let tmpHtml = '<div class="col-sm-6">' +
+            '<div class="card card-block">' +
+            '<div class="card-body">' +
+            '<h3 class="card-title">'+ version.name +'</h3>' +
+            '<p class="card-text">' + description + '</p>' +
+            '<a class="btn btn-primary" href="/boot/'+ version._id.toString() +'">开始使用</a>' +
+            '</div>' +
+            '</div>' +
+            '</div>';
+        html += tmpHtml;
+    }
+    $("#version-area").html(html);
+}