login_controller.js 15 KB

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