'use strict'; /** * 登录页面控制器 * * @author CaiAoLin * @date 2017/11/15 * @version */ const URL = require('url'); const maintainConst = require('../const/maintain'); module.exports = app => { class LoginController extends app.BaseController { /** * 登录页面 * * @param {Object} ctx - egg全局页面 * @return {void} */ async index(ctx) { if (ctx.helper.isMobile(ctx.request.header['user-agent'])) { ctx.redirect('/wap'); return; } const errorMessage = ctx.session.loginError; // 显示完删除 ctx.session.loginError = null; // 获取系统维护信息 const maintainData = await ctx.service.maintain.getDataById(1); if (!ctx.app.config.is_debug) { await ctx.service.maintain.syncMaintainData(); } const renderData = { maintainData, maintainConst, errorMessage, }; await ctx.render('login/login.ejs', renderData); } /** * 登录操作 * * @param {Object} ctx - egg全局变量 * @return {void} */ async login(ctx) { let loginType = ctx.request.body.type; try { loginType = parseInt(loginType); const result = await ctx.service.projectAccount.accountLogin(ctx.request.body, loginType); if (!result) { throw '用户名或密码错误'; } if (result === 2) { throw '该账号已被停用,请联系销售人员'; } // 调用 rotateCsrfSecret 刷新用户的 CSRF token ctx.rotateCsrfSecret(); // 判断是否已经有对应用户信息,没有则跳转初始化页面 const needBoot = await ctx.service.customer.isNeedBoot(ctx.request.body); const url = needBoot ? '/boot' : '/dashboard'; const query = URL.parse(ctx.request.header.referer, true).query; ctx.redirect(query.referer ? query.referer : url); } catch (error) { this.log(error); ctx.session.loginError = error; ctx.redirect('/login'); } } /** * 退出登录 * * @param {Object} ctx - egg全局变量 * @return {void} */ async logout(ctx) { // 删除session并跳转 ctx.session = null; ctx.redirect('/'); } /** * 获取项目名 * * @param {Object} ctx - egg全局context * @return {void} */ async projectName(ctx) { const response = { err: 0, msg: '', }; const code = ctx.query.code; try { const data = await ctx.service.project.getProjectByCode(code); if (data) { response.data = data.name; } else { throw '项目不存在'; } } catch (err) { response.err = 1; response.msg = err; } ctx.body = response; } /** * 忘记密码-重置密码 * @param ctx * @returns {Promise} */ async resetPassword(ctx) { const response = { err: 0, index: 0, msg: '', }; const code = ctx.request.body.code; const name = ctx.request.body.name; try { const data = await ctx.service.project.getProjectByCode(code); if (data) { const pa = await ctx.service.projectAccount.getDataByCondition({ account: name, project_id: data.id }); if (!pa) { response.index = 2; throw '登录账号不存在,请检查是否输入错误。'; } if (!pa.auth_mobile) { response.index = 2; throw '登录账号还没有认证手机,请联系项目管理员。'; } // 重置密码并发短信 const newpwd = ctx.helper.generateRandomString(6, 2); console.log(newpwd); const result = await ctx.service.projectAccount.resetPassword(pa.id, newpwd); if (!result) { throw '修改密码失败'; } response.data = { pName: data.name, name: pa.name, mobile: pa.auth_mobile.substr(0, 3) + '****' + pa.auth_mobile.substr(7), account: pa.account, }; } else { response.index = 1; throw '项目不存在,请检查是否输入有误。'; } } catch (err) { response.err = 1; response.msg = err; } ctx.body = response; } /** * 接口登录页面 * * @param {Object} ctx - egg全局页面 * @return {void} */ async port(ctx) { // 获取系统维护信息 const maintainData = await ctx.service.maintain.getDataById(1); if (!ctx.app.config.is_debug) { await ctx.service.maintain.syncMaintainData(); } let pa; try { if (ctx.session.loginError !== null) { throw ctx.session.loginError; } if (!ctx.query.mobile) { throw '参数有误'; } pa = await ctx.service.projectAccount.getDataByCondition({ mobile: ctx.query.mobile, project_id: ctx.projectData.id }); if (!pa) { throw '您无权限登录系统。'; } if (pa.bind === 0) { // 先绑定再登录 throw ''; } else { if (pa.enable !== 1) { throw '该账号已被停用,请联系销售人员'; } const result = await ctx.service.projectAccount.accountLogin({ project: ctx.projectData, accountData: pa }, 3); if (!result) { throw '登录出错'; } ctx.redirect('/dashboard'); } } catch (error) { this.log(error); ctx.session.loginError = error; } const errorMessage = ctx.session.loginError; // 显示完删除 ctx.session.loginError = null; const renderData = { maintainData, maintainConst, errorMessage, projectData: ctx.projectData, accountData: pa, }; await ctx.render('login/login_port.ejs', renderData); } /** * 登录操作 * * @param {Object} ctx - egg全局变量 * @return {void} */ async loginPort(ctx) { let loginType = ctx.request.body.type; try { loginType = parseInt(loginType); const data = await ctx.service.project.getProjectByCode(ctx.request.body.projectCode.toString().trim()); if (data === null) { throw '不存在项目数据'; } if (data.custom === 0) { throw '无法通过接口登录本系统'; } if (data && data.custom === 1) { const pa = await ctx.service.projectAccount.getDataById(ctx.request.body.accountId); if (!pa) { throw '您无权限登录系统。'; } if (pa.enable !== 1) { throw '该账号已被停用,请联系销售人员'; } const updateData = { bind: 1, }; await ctx.service.projectAccount.update(updateData, { id: pa.id }); const result = await ctx.service.projectAccount.accountLogin({ project: data, accountData: pa }, loginType); if (!result) { throw '绑定登录出错,请使用账号密码登录'; } ctx.redirect('/dashboard'); } } catch (error) { this.log(error); ctx.session.loginError = error; ctx.redirect('/login'); } } } return LoginController; };