25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

userController.js 5.6 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. /*
  2. * @Description: 用户模块控制器
  3. * @Author: hai-27
  4. * @Date: 2020-02-07 16:51:56
  5. * @LastEditors: hai-27
  6. * @LastEditTime: 2020-03-27 16:03:09
  7. */
  8. const rp = require('request-promise');
  9. const userDao = require('../models/dao/userDao');
  10. const { checkUserInfo, checkUserName } = require('../middleware/checkUserInfo');
  11. module.exports = {
  12. /**
  13. * 用户登录
  14. * @param {Object} ctx
  15. */
  16. Login: async ctx => {
  17. let { userName, password } = ctx.request.body;
  18. // 校验用户信息是否符合规则
  19. if (!checkUserInfo(ctx, userName, password)) {
  20. return;
  21. }
  22. // 连接数据库根据用户名和密码查询用户信息
  23. let user = await userDao.Login(userName, password);
  24. // 结果集长度为0则代表没有该用户
  25. if (user.length === 0) {
  26. ctx.body = {
  27. code: '004',
  28. msg: '用户名或密码错误'
  29. }
  30. return;
  31. }
  32. // 数据库设置用户名唯一
  33. // 结果集长度为1则代表存在该用户
  34. if (user.length === 1) {
  35. const loginUser = {
  36. user_id: user[0].user_id,
  37. userName: user[0].userName
  38. };
  39. // 保存用户信息到session
  40. ctx.session.user = loginUser;
  41. ctx.body = {
  42. code: '001',
  43. user: loginUser,
  44. msg: '登录成功'
  45. }
  46. return;
  47. }
  48. //数据库设置用户名唯一
  49. //若存在user.length != 1 || user.length!=0
  50. //返回未知错误
  51. //正常不会出现
  52. ctx.body = {
  53. code: '500',
  54. msg: '未知错误'
  55. }
  56. },
  57. /**
  58. * 微信小程序用户登录
  59. * @param {Object} ctx
  60. */
  61. miniProgramLogin: async ctx => {
  62. const appid = 'wxeb6a44c58ffde6c6';
  63. const secret = '9c40f33cf627f2e3a42f38b25e0687cc';
  64. let { code } = ctx.request.body;
  65. const api = `https://api.weixin.qq.com/sns/jscode2session?appid=${ appid }&secret=${ secret }&js_code=${ code }&grant_type=authorization_code`;
  66. // 通过 wx.login 接口获得临时登录凭证 code 后
  67. // 传到开发者服务器调用此接口完成登录流程。
  68. const res = await rp.get({
  69. json: true,
  70. uri: api
  71. })
  72. const { session_key, openid } = res;
  73. // 连接数据库根据用户名查询用户信息
  74. let user = await userDao.FindUserName(openid);
  75. if (user.length === 0) {
  76. // 结果集长度为0则代表不存在该用户,先注册
  77. try {
  78. // 连接数据库插入用户信息
  79. let registerResult = await userDao.Register(openid, openid);
  80. if (registerResult.affectedRows === 1) {
  81. // 操作所影响的记录行数为1,则代表注册成功
  82. await login();// 登录
  83. }
  84. } catch (error) {
  85. console.log(error)
  86. }
  87. } else if (user.length === 1) {
  88. // 如果已经存在,直接登录
  89. await login();
  90. } else {
  91. ctx.body = {
  92. code: '500',
  93. msg: '未知错误'
  94. }
  95. }
  96. async function login () {
  97. // 连接数据库根据用户名和密码查询用户信息
  98. let tempUser = await userDao.Login(openid, openid);
  99. if (tempUser.length === 0) {
  100. // 登录失败
  101. ctx.body = {
  102. code: '004',
  103. msg: '登录失败'
  104. }
  105. return;
  106. }
  107. if (tempUser.length === 1) {
  108. // 登录成功
  109. const loginUser = {
  110. user_id: tempUser[0].user_id,
  111. openId: openid,
  112. sessionKey: session_key
  113. };
  114. // 保存用户信息到session
  115. ctx.session.user = loginUser;
  116. ctx.body = {
  117. code: '001',
  118. userId: tempUser[0].user_id,
  119. msg: '登录成功'
  120. }
  121. return;
  122. }
  123. }
  124. },
  125. /**
  126. * 查询是否存在某个用户名,用于注册时前端校验
  127. * @param {Object} ctx
  128. */
  129. FindUserName: async ctx => {
  130. let { userName } = ctx.request.body;
  131. // 校验用户名是否符合规则
  132. if (!checkUserName(ctx, userName)) {
  133. return;
  134. }
  135. // 连接数据库根据用户名查询用户信息
  136. let user = await userDao.FindUserName(userName);
  137. // 结果集长度为0则代表不存在该用户,可以注册
  138. if (user.length === 0) {
  139. ctx.body = {
  140. code: '001',
  141. msg: '用户名不存在,可以注册'
  142. }
  143. return;
  144. }
  145. //数据库设置用户名唯一
  146. //结果集长度为1则代表存在该用户,不可以注册
  147. if (user.length === 1) {
  148. ctx.body = {
  149. code: '004',
  150. msg: '用户名已经存在,不能注册'
  151. }
  152. return;
  153. }
  154. //数据库设置用户名唯一,
  155. //若存在user.length != 1 || user.length!=0
  156. //返回未知错误
  157. //正常不会出现
  158. ctx.body = {
  159. code: '500',
  160. msg: '未知错误'
  161. }
  162. },
  163. Register: async ctx => {
  164. let { userName, password } = ctx.request.body;
  165. // 校验用户信息是否符合规则
  166. if (!checkUserInfo(ctx, userName, password)) {
  167. return;
  168. }
  169. // 连接数据库根据用户名查询用户信息
  170. // 先判断该用户是否存在
  171. let user = await userDao.FindUserName(userName);
  172. if (user.length !== 0) {
  173. ctx.body = {
  174. code: '004',
  175. msg: '用户名已经存在,不能注册'
  176. }
  177. return;
  178. }
  179. try {
  180. // 连接数据库插入用户信息
  181. let registerResult = await userDao.Register(userName, password);
  182. // 操作所影响的记录行数为1,则代表注册成功
  183. if (registerResult.affectedRows === 1) {
  184. ctx.body = {
  185. code: '001',
  186. msg: '注册成功'
  187. }
  188. return;
  189. }
  190. // 否则失败
  191. ctx.body = {
  192. code: '500',
  193. msg: '未知错误,注册失败'
  194. }
  195. } catch (error) {
  196. reject(error);
  197. }
  198. }
  199. };