login_controller.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. /**
  2. * 登录相关控制器
  3. *
  4. * @author CaiAoLin
  5. * @date 2017/6/8
  6. * @version
  7. */
  8. import UserModel from "../models/user_model";
  9. import SettingModel from "../models/setting_model";
  10. import CompilationModel from "../models/compilation_model";
  11. // import Captcha from "../models/captcha";
  12. // 验证码
  13. const Captcha = require("../models/captcha");
  14. class LoginController {
  15. /**
  16. * 登录页面
  17. *
  18. * @param {object} request
  19. * @param {object} response
  20. * @return {void}
  21. */
  22. async index(request, response) {
  23. // 判断是否有带token和ssoID参数
  24. if (request.query.ssoID !== undefined && request.query.token !== undefined) {
  25. let ssoID = request.query.ssoID;
  26. let token = request.query.token;
  27. let preferenceSetting = {};
  28. let compilationList = [];
  29. try {
  30. let userModel = new UserModel();
  31. // 调用接口验证登录信息
  32. let responseData = await userModel.getInfoFromSSO2(ssoID, token);
  33. // 先判断返回值是否为未激活状态
  34. if ( responseData === '-3') {
  35. throw '因邮箱未完成认证,账号未激活;去<a href="https://sso.smartcost.com.cn" target="_blank">激活</a>。';
  36. }
  37. if ( responseData === '-2') {
  38. throw 'token已过期,请重新登录Z+获取';
  39. }
  40. responseData = JSON.parse(responseData);
  41. if (typeof responseData !== 'object') {
  42. throw 'ssoId错误或token过期';
  43. }
  44. if (responseData.length <= 0) {
  45. throw '接口返回数据错误';
  46. }
  47. let userData = responseData[0];
  48. let sessionUser = {
  49. ssoId: userData.id,
  50. username: userData.username,
  51. email: userData.useremail,
  52. mobile: userData.mobile,
  53. isUserActive: userData.isUserActive,
  54. };
  55. request.session.sessionUser = sessionUser;
  56. // 记录用户数据到数据库
  57. let result = await userModel.markUser(sessionUser, request);
  58. // 获取偏好设置
  59. let settingModel = new SettingModel();
  60. preferenceSetting = await settingModel.getPreferenceSetting(request.session.sessionUser.id);
  61. if (!result) {
  62. throw '标记用户信息失败!';
  63. }
  64. let compilationModel = new CompilationModel();
  65. if (preferenceSetting.login_ask === 1 || preferenceSetting.select_version === ''){
  66. preferenceSetting.login_ask = 1;
  67. compilationList = await compilationModel.getList();
  68. } else {
  69. compilationList = [];
  70. }
  71. // 获取编办信息
  72. let sessionCompilation = request.session.sessionCompilation;
  73. if (preferenceSetting.login_ask === 0 && !sessionCompilation &&
  74. preferenceSetting.select_version !== '') {
  75. let compilationData = await compilationModel.getCompilationById(preferenceSetting.select_version);
  76. // 判断当前用户的是使用免费版还是专业版
  77. let compilationVersion = await userModel.getVersionFromUpgrade(sessionUser.ssoId, preferenceSetting.select_version);
  78. request.session.compilationVersion = compilationVersion;
  79. request.session.sessionCompilation = compilationData;
  80. if(request.session.sessionUser.latest_used !== preferenceSetting.select_version) await userModel.updateLatestUsed(request.session.sessionUser.id,preferenceSetting.select_version);
  81. }
  82. console.log(`${request.session.sessionUser.real_name}--id:${request.session.sessionUser.id}--登录了系统`);
  83. if (preferenceSetting.login_ask === 1 || preferenceSetting.select_version === '') {
  84. let renderData = {
  85. versionData: compilationList,
  86. };
  87. response.render('users/html/login-ver', renderData);
  88. } else {
  89. return response.redirect("/pm");
  90. }
  91. } catch (error) {
  92. console.log(error)
  93. return response.redirect("/login");
  94. }
  95. } else {
  96. let sessionUser = request.session.sessionUser;
  97. if (sessionUser !== undefined && sessionUser.ssoId >= 0) {
  98. return response.redirect("/pm");
  99. } else {
  100. response.render('users/html/login', {});
  101. }
  102. }
  103. }
  104. /**
  105. * 登录操作
  106. *
  107. * @param {object} request
  108. * @param {object} response
  109. * @return {string}
  110. */
  111. async login(request, response) {
  112. let account = request.body.account;
  113. let password = request.body.pw;
  114. let preferenceSetting = {};
  115. let compilationList = [];
  116. try {
  117. // 调用接口验证登录信息
  118. let userModel = new UserModel();
  119. let responseData = await userModel.getInfoFromSSO(account, password);
  120. responseData = JSON.parse(responseData);
  121. if (typeof responseData !== 'object') {
  122. throw '邮箱/手机 或 密码错误';
  123. }
  124. if (responseData.length <= 0) {
  125. throw '接口返回数据错误';
  126. }
  127. // 正确登录后 存入session
  128. let userData = responseData[0];
  129. if (userData.mobile === '') {
  130. return response.json({error: 2,ssoId: userData.id});
  131. }
  132. //还要判断account是否是专业版用户
  133. // let isPro = true;
  134. // const userInfo = await userModel.findDataByAccount(account);
  135. //
  136. // if (userInfo && userInfo.upgrade_list !== undefined) {
  137. // for (const ul of userInfo.upgrade_list) {
  138. // if (ul.isUpgrade === true) {
  139. // isPro = true;
  140. // break;
  141. // }
  142. // }
  143. // }
  144. // 专业版短信验证码验证
  145. // if (isPro) {
  146. // const codeMsg = request.session.code;
  147. // if (codeMsg !== undefined && request.body.code !== '') {
  148. // const code = codeMsg.split('_')[0];
  149. // const time = codeMsg.split('_')[1];
  150. // console.log(code);
  151. // console.log(request.body.code);
  152. // if (Date.parse(new Date())/1000 > time+60*5 || request.body.code !== code) {
  153. // return response.json({error: 3, msg: '验证码错误。'});
  154. // } else {
  155. // delete request.session.code;
  156. // }
  157. // } else {
  158. // return response.json({error: 3, msg: '验证码错误。'});
  159. // }
  160. // }
  161. // 判断极验验证码是否通过
  162. const captcha = new Captcha();
  163. const captchResult = await captcha.validate(request);
  164. if (!captchResult) {
  165. throw '极验验证码错误';
  166. }
  167. let sessionUser = {
  168. ssoId: userData.id,
  169. username: userData.username,
  170. email: userData.useremail,
  171. mobile: userData.mobile,
  172. isUserActive: userData.isUserActive,
  173. };
  174. request.session.sessionUser = sessionUser;
  175. // 记录用户数据到数据库
  176. let result = await userModel.markUser(sessionUser, request);
  177. // 获取偏好设置
  178. let settingModel = new SettingModel();
  179. preferenceSetting = await settingModel.getPreferenceSetting(request.session.sessionUser.id);
  180. if (!result) {
  181. throw '标记用户信息失败!';
  182. }
  183. let compilationModel = new CompilationModel();
  184. if(preferenceSetting.login_ask === 1 || preferenceSetting.select_version === ''){
  185. preferenceSetting.login_ask = 1;
  186. compilationList = await compilationModel.getList();
  187. }
  188. else{
  189. compilationList = [];
  190. }
  191. // 获取编办信息
  192. let sessionCompilation = request.session.sessionCompilation;
  193. if (preferenceSetting.login_ask === 0 && !sessionCompilation &&
  194. preferenceSetting.select_version !== '') {
  195. let compilationData = await compilationModel.getCompilationById(preferenceSetting.select_version);
  196. // 判断当前用户的是使用免费版还是专业版
  197. let compilationVersion = await userModel.getVersionFromUpgrade(sessionUser.ssoId, preferenceSetting.select_version);
  198. request.session.compilationVersion = compilationVersion;
  199. request.session.sessionCompilation = compilationData;
  200. if(request.session.sessionUser.latest_used !== preferenceSetting.select_version) await userModel.updateLatestUsed(request.session.sessionUser.id,preferenceSetting.select_version);
  201. }
  202. } catch (error) {
  203. console.log(error);
  204. return response.json({error: 1, msg: error});
  205. }
  206. request.session.online_start_time = +new Date();
  207. console.log(`${request.session.sessionUser.real_name}--id:${request.session.sessionUser.id}--登录了系统`);
  208. response.json({
  209. error: 0,
  210. msg: '',
  211. login_ask: preferenceSetting.login_ask,
  212. compilation_list: JSON.stringify(compilationList),
  213. last_page: request.session.lastPage
  214. });
  215. }
  216. /**
  217. * 验证码注册
  218. *
  219. * @param {object} request
  220. * @param {object} response
  221. * @return {string}
  222. */
  223. async captcha(request, response) {
  224. const captcha = new Captcha();
  225. const res = await captcha.register(request);
  226. response.json(res);
  227. }
  228. /**
  229. * 判断用户是否是专业版用户
  230. * @param request
  231. * @param response
  232. * @returns {Promise<void>}
  233. */
  234. // async accountIsPro(request, response) {
  235. // let res = {
  236. // error: 0,
  237. // msg: '',
  238. // result: false,
  239. // };
  240. // try{
  241. // const account = request.body.account;
  242. // const password = request.body.pw;
  243. //
  244. // // 根据邮箱或手机号获取账号信息
  245. // let userModel = new UserModel();
  246. // // 调用接口验证登录信息
  247. // let responseData = await userModel.getInfoFromSSO(account, password);
  248. // console.log(responseData);
  249. // // 先判断返回值是否为未激活状态
  250. // if ( responseData === '-3') {
  251. // throw '因邮箱未完成认证,账号未激活;去<a href="https://sso.smartcost.com.cn" target="_blank">激活</a>。';
  252. // }
  253. // responseData = JSON.parse(responseData);
  254. // if (typeof responseData !== 'object') {
  255. // throw '邮箱/手机 或 密码错误';
  256. // }
  257. //
  258. // if (responseData.length <= 0) {
  259. // throw '接口返回数据错误';
  260. // }
  261. //
  262. // // 正确登录后 存入session
  263. // let userData = responseData[0];
  264. //
  265. // if (userData.mobile === '') {
  266. // return response.json({error: 2,ssoId: userData.id});
  267. // }
  268. //
  269. // // const userInfo = await userModel.findDataByAccount(account);
  270. // // if (userInfo && userInfo.upgrade_list !== undefined) {
  271. // // for (const ul of userInfo.upgrade_list) {
  272. // // if (ul.isUpgrade === true) {
  273. // // res.result = true;
  274. // // res.data = userInfo.mobile;
  275. // // break;
  276. // // }
  277. // // }
  278. // // } else {
  279. // // res.msg = '当前未存在此用户';
  280. // // }
  281. // res.result = true;
  282. // // if (userInfo) {
  283. // // res.data = userInfo.mobile;
  284. // // } else {
  285. // res.data = userData.mobile;
  286. // // }
  287. // } catch (err) {
  288. // res.error = 1;
  289. // res.msg = err;
  290. // }
  291. //
  292. // response.json(res);
  293. // }
  294. }
  295. export default LoginController;