User.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. <?php
  2. namespace app\controller;
  3. use app\BaseController;
  4. use think\facade\Db;
  5. use phpu\facade\ThinkCaptcha;
  6. use Ramsey\Uuid\Uuid;
  7. use think\captcha\facade\Captcha;
  8. class User extends BaseController
  9. {
  10. protected $noNeedLogin = ['login', 'loginV2', 'logout', 'register', 'getSystemAvatar', 'getRegisterCaptchaImage', 'getLoginCaptchaImage', 'checkUsernameExists'];
  11. //登录
  12. public function login()
  13. {
  14. $username = $this->request->post('username'); //用户名
  15. $password = $this->request->post('password'); //密码
  16. //$captcha = $this->request->post('captcha'); //图形验证码,如果输错了需要重新刷新验证码图片
  17. if (empty($username) || empty($password)) {
  18. $this->fail(500, '参数校验错误');
  19. }
  20. // if (!ThinkCaptcha::check($captcha, 'login', 0)) {
  21. // $this->fail(501, '验证码错误');
  22. // }
  23. $data = Db::table('tb_user')
  24. ->where(['username' => $username])
  25. ->where(['password' => md5($password)])
  26. ->find();
  27. if (!$data) {
  28. $this->fail(502, '用户名或密码错误');
  29. }
  30. //检测是否激活
  31. if ($data['state'] == 0) {
  32. $this->fail(503, '账号未激活,请前往您的邮箱地址:' . $data['email'] . ',进行验证通过~');
  33. }
  34. //检测是否被封号
  35. if ($data['state'] == 2) {
  36. $this->fail(504, '您的账号已被封停~');
  37. }
  38. //更新登录信息
  39. Db::table('tb_user')
  40. ->where(['id' => $data['id']])
  41. ->update([
  42. 'login_count' => $data['login_count'] + 1,
  43. 'last_login_ip' => $this->request->ip(),
  44. 'last_login' => time(),
  45. ]);
  46. //写登录日志
  47. Db::table('tb_user_login_log')
  48. ->insert([
  49. 'user_id' => $data['id'],
  50. 'ip' => $this->request->ip(),
  51. 'user_agent' => $this->request->header('user-agent'),
  52. 'created_at' => time(),
  53. ]);
  54. //写登录Token
  55. $token = Uuid::uuid4()->toString();
  56. Db::table('tb_user_token')
  57. ->insert([
  58. 'user_id' => $data['id'],
  59. 'token' => $token,
  60. 'expired_at' => time() + 24 * 60 * 60,
  61. ]);
  62. $this->success('success', [
  63. 'token' => $token
  64. ]);
  65. }
  66. //登录
  67. public function loginV2()
  68. {
  69. $username = $this->request->post('username'); //用户名
  70. $password = $this->request->post('password'); //密码
  71. //$captcha = $this->request->post('captcha'); //图形验证码,如果输错了需要重新刷新验证码图片
  72. if (empty($username) || empty($password)) {
  73. $this->fail(500, '参数校验错误');
  74. }
  75. // if (!ThinkCaptcha::check($captcha, 'login', 0)) {
  76. // $this->fail(501, '验证码错误');
  77. // }
  78. $data = Db::table('tb_user')
  79. ->where(['username' => $username])
  80. ->where(['password' => md5($password)])
  81. ->find();
  82. if (!$data) {
  83. $this->fail(502, '用户名或密码错误');
  84. }
  85. //检测是否激活
  86. if ($data['state'] == 0) {
  87. $this->fail(503, '账号未激活,请前往您的邮箱地址:' . $data['email'] . ',进行验证通过~');
  88. }
  89. //检测是否被封号
  90. if ($data['state'] == 2) {
  91. $this->fail(504, '您的账号已被封停~');
  92. }
  93. //更新登录信息
  94. Db::table('tb_user')
  95. ->where(['id' => $data['id']])
  96. ->update([
  97. 'login_count' => $data['login_count'] + 1,
  98. 'last_login_ip' => $this->request->ip(),
  99. 'last_login' => time(),
  100. ]);
  101. //写登录日志
  102. Db::table('tb_user_login_log')
  103. ->insert([
  104. 'user_id' => $data['id'],
  105. 'ip' => $this->request->ip(),
  106. 'user_agent' => $this->request->header('user-agent'),
  107. 'created_at' => time(),
  108. ]);
  109. //写登录Token
  110. $token = Uuid::uuid4()->toString();
  111. Db::table('tb_user_token')
  112. ->insert([
  113. 'user_id' => $data['id'],
  114. 'token' => $token,
  115. 'expired_at' => time() + 24 * 60 * 60,
  116. ]);
  117. $this->success('success', [
  118. 'token' => $token
  119. ]);
  120. }
  121. //退出登录
  122. public function logout()
  123. {
  124. $token = $this->request->post('token');
  125. if (empty($token)) {
  126. $this->fail(500, 'token参数校验错误');
  127. }
  128. Db::table('tb_user_token')
  129. ->where(['token' => $token])
  130. ->delete();
  131. $this->success('success', null);
  132. }
  133. //修改密码,修改成功后token会释放,需要转跳到登录页重新登录
  134. public function changePwd()
  135. {
  136. $oldPassword = $this->request->post('oldPassword');
  137. $newPassword = $this->request->post('newPassword');
  138. if (empty($oldPassword) || empty($newPassword)) {
  139. $this->fail(500, '参数校验错误');
  140. }
  141. $user = $this->getUser();
  142. $data = Db::table('tb_user')
  143. ->where(['id' => $user->user_id])
  144. ->where(['password' => md5($oldPassword)])
  145. ->find();
  146. if (!$data) {
  147. $this->fail(501, '当前密码错误');
  148. }
  149. Db::table('tb_user')
  150. ->where(['id' => $user->user_id])
  151. ->update([
  152. 'password' => md5($newPassword),
  153. ]);
  154. //释放token,Token会立马失效
  155. Db::table('tb_user_token')
  156. ->where(['token' => $user->token])
  157. ->delete();
  158. $this->success('success', null);
  159. }
  160. //获取系统自带头像
  161. public function getSystemAvatar()
  162. {
  163. $data = Db::table('tb_system_avatar')
  164. ->order('id ASC')
  165. ->select();
  166. $this->success('success', $data);
  167. }
  168. //获取注册验证码图片
  169. public function getRegisterCaptchaImage()
  170. {
  171. return ThinkCaptcha::printImg('register');
  172. //return Captcha::create('register');
  173. }
  174. //获取登录验证码图片
  175. public function getLoginCaptchaImage()
  176. {
  177. return ThinkCaptcha::printImg('login');
  178. }
  179. //检查用户名是否存在(被注册)
  180. public function checkUsernameExists()
  181. {
  182. $username = $this->request->post('username');
  183. if (empty($username)) {
  184. $this->fail('用户名不能为空');
  185. }
  186. $exists = true;
  187. $user = Db::table('tb_user')
  188. ->where(['username' => $username])
  189. ->find();
  190. if (!$user) {
  191. $exists = false;
  192. }
  193. $this->success('success', [
  194. 'isUsernameExists' => $exists,
  195. ]);
  196. }
  197. //注册
  198. public function register()
  199. {
  200. $username = $this->request->post('username'); //用户名
  201. $password = $this->request->post('password'); //密码
  202. $avatar = $this->request->post('avatar'); //头像
  203. $email = $this->request->post('email'); //邮箱账号
  204. $captcha = $this->request->post('captcha'); //图形验证码,如果输错了需要重新刷新验证码图片
  205. if (empty($username) || empty($password) || !is_numeric($avatar) || empty($email)) {
  206. $this->fail(500, '参数校验错误');
  207. }
  208. // var_dump(Captcha::check($captcha, 'register'));
  209. // echo ThinkCaptcha::check($captcha, 'register', 0);
  210. // exit();
  211. // if (!ThinkCaptcha::check($captcha, 'register')) {
  212. // $this->fail(501, '验证码错误');
  213. // }
  214. $user = Db::table('tb_user')
  215. ->where(['username' => $username])
  216. ->find();
  217. if ($user) {
  218. $this->fail(502, '用户名已经被注册');
  219. }
  220. //拦截邮箱是否被注册
  221. $emailUser = Db::table('tb_user')
  222. ->where(['email' => $email])
  223. ->find();
  224. if ($emailUser) {
  225. $this->fail(503, '邮箱账号已经被使用过了~');
  226. }
  227. Db::table('tb_user')
  228. ->insert([
  229. 'username' => $username, //用户名
  230. 'password' => md5($password), //密码
  231. 'created_at' => time(), //创建时间
  232. 'last_login' => time(), //上次登录时间
  233. 'login_count' => 0, //登录次数
  234. 'avatar' => 'system://' . $avatar, //头像URL
  235. 'state' => 1, //状态 0:未激活 1:正常 2:封号
  236. 'balance' => 0, //余额
  237. 'email' => $email, //邮箱账号
  238. 'is_email_verified' => 0, //邮箱是否认证 0:未认证 1:已认证
  239. 'score' => 0, //积分数量
  240. 'gold' => 0, //金币数量
  241. 'exp' => 0, //经验值
  242. ]);
  243. $this->success('success', null);
  244. }
  245. //取用户信息
  246. public function getUserInfo()
  247. {
  248. $user = Db::table('tb_user')
  249. ->where(['id' => $this->getUser()->user_id])
  250. ->find();
  251. //解析获取头像url
  252. if (str_starts_with($user['avatar'], 'system://')) {
  253. $data = explode('//', $user['avatar']);
  254. $avatarId = intval($data[1]);
  255. $avatar = Db::table('tb_system_avatar')
  256. ->where(['id' => $avatarId])
  257. ->find();
  258. $user['avatar'] = $avatar['image_url'];
  259. }
  260. unset($user['password']);
  261. $this->success('success', $user);
  262. }
  263. //上传头像
  264. public function uploadAvatar()
  265. {
  266. $file = $this->request->file('file');
  267. if (empty($file)) {
  268. $this->fail(500, '上传的图片文件不能为空');
  269. }
  270. // 使用验证器验证上传的文件
  271. validate(['file' => [
  272. // 限制文件大小(单位b),这里限制为2M
  273. 'fileSize' => 2 * 1024 * 1024,
  274. // 限制文件后缀,多个后缀以英文逗号分割
  275. 'fileExt' => 'jpg,jpeg,png',
  276. ]])->check(['file' => $file]);
  277. $saveName = \think\facade\Filesystem::disk('public')->putFile('avatar', $file);
  278. Db::table('tb_user')
  279. ->where(['id' => $this->getUser()->user_id])
  280. ->update([
  281. 'avatar' => $this->request->scheme() . '://' . $this->request->host() . '/storage/' . $saveName,
  282. ]);
  283. $this->success('success', [
  284. 'filePath' => $this->request->scheme() . '://' . $this->request->host() . '/storage/' . $saveName,
  285. ]);
  286. }
  287. }