UserWeb.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. <?php
  2. namespace app\api\model\user;
  3. use app\common\model\user\Grade as GradeModel;
  4. use app\common\model\user\Sms as SmsModel;
  5. use think\facade\Cache;
  6. use app\common\model\user\User as UserModel;
  7. /**
  8. * 用户模型类
  9. */
  10. class UserWeb extends UserModel
  11. {
  12. private $token;
  13. /**
  14. * 隐藏字段
  15. */
  16. protected $hidden = [
  17. 'open_id',
  18. 'is_delete',
  19. 'app_id',
  20. 'create_time',
  21. 'update_time'
  22. ];
  23. /**
  24. * 用户登录
  25. */
  26. public function login($data)
  27. {
  28. if(!$this->check($data)){
  29. return false;
  30. }
  31. $user = $this->where('mobile', '=', $data['mobile'])->find();
  32. if(!$user){
  33. $this->save([
  34. 'mobile' => $data['mobile'],
  35. 'reg_source' => 'h5',
  36. //默认等级
  37. 'grade_id' => GradeModel::getDefaultGradeId(),
  38. 'app_id' => self::$app_id
  39. ]);
  40. $user_id = $this['user_id'];
  41. $mobile = $data['mobile'];
  42. }else{
  43. $user_id = $user['user_id'];
  44. $mobile = $user['mobile'];
  45. }
  46. // 生成token (session3rd)
  47. $this->token = $this->token($mobile);
  48. // 记录缓存, 30天
  49. Cache::tag('cache')->set($this->token, $user_id, 86400 * 30);
  50. return $user_id;
  51. }
  52. /**
  53. * 验证
  54. */
  55. private function check($data)
  56. {
  57. //判断验证码是否过期、是否正确
  58. $sms_model = new SmsModel();
  59. $sms_record_list = $sms_model
  60. ->where('mobile', '=', $data['mobile'])
  61. ->order(['create_time' => 'desc'])
  62. ->limit(1)->select();
  63. if(count($sms_record_list) == 0){
  64. $this->error = '未查到短信发送记录';
  65. return false;
  66. }
  67. $sms_model = $sms_record_list[0];
  68. if((time() - strtotime($sms_model['create_time']))/60 > 30){
  69. $this->error = '短信验证码超时';
  70. return false;
  71. }
  72. if($sms_model['code'] != $data['code']){
  73. $this->error = '验证码不正确';
  74. return false;
  75. }
  76. return true;
  77. }
  78. /**
  79. * 绑定手机
  80. */
  81. public function bindMobile($user, $data){
  82. if(!$this->check($data)){
  83. return false;
  84. }
  85. return $user->save([
  86. 'mobile' => $data['mobile']
  87. ]);
  88. }
  89. /**
  90. * 获取token
  91. */
  92. public function getToken()
  93. {
  94. return $this->token;
  95. }
  96. /**
  97. * 生成用户认证的token
  98. */
  99. private function token($openid)
  100. {
  101. $app_id = self::$app_id;
  102. // 生成一个不会重复的随机字符串
  103. $guid = \getGuidV4();
  104. // 当前时间戳 (精确到毫秒)
  105. $timeStamp = microtime(true);
  106. // 自定义一个盐
  107. $salt = 'token_salt';
  108. return md5("{$app_id}_{$timeStamp}_{$openid}_{$guid}_{$salt}");
  109. }
  110. }