LoginService.php 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | LARAVEL8.0 框架 [ LARAVEL ][ RXThinkCMF ]
  4. // +----------------------------------------------------------------------
  5. // | 版权所有 2017~2021 LARAVEL研发中心
  6. // +----------------------------------------------------------------------
  7. // | 官方网站: http://www.laravel.cn
  8. // +----------------------------------------------------------------------
  9. // | Author: laravel开发员 <laravel.qq.com>
  10. // +----------------------------------------------------------------------
  11. namespace App\Services\Common;
  12. use App\Helpers\Jwt;
  13. use App\Models\ActionLogModel;
  14. use App\Models\UserModel;
  15. use App\Services\BaseService;
  16. use Carbon\Carbon;
  17. use Illuminate\Support\Facades\Session;
  18. use Illuminate\Support\Facades\Validator;
  19. use Gregwar\Captcha\CaptchaBuilder;
  20. use Gregwar\Captcha\PhraseBuilder;
  21. use Ramsey\Uuid\Uuid;
  22. /**
  23. * 登录服务类
  24. * @author laravel开发员
  25. * @since 2020/11/10
  26. * Class LoginService
  27. * @package App\Services\Common
  28. */
  29. class LoginService extends BaseService
  30. {
  31. /**
  32. * 构造函数
  33. * @author laravel开发员
  34. * @since 2020/11/10
  35. * LoginService constructor.
  36. */
  37. public function __construct()
  38. {
  39. $this->model = new UserModel();
  40. }
  41. /**
  42. * 获取验证码
  43. * @author laravel开发员
  44. * @since 2020/11/10
  45. */
  46. public function captcha()
  47. {
  48. $phrase = new PhraseBuilder;
  49. // 设置验证码位数
  50. $code = $phrase->build(4);
  51. // 生成验证码图片的Builder对象,配置相应属性
  52. $builder = new CaptchaBuilder($code, $phrase);
  53. // 设置背景颜色25,25,112
  54. $builder->setBackgroundColor(255, 255, 255);
  55. // 设置倾斜角度
  56. $builder->setMaxAngle(25);
  57. // 设置验证码后面最大行数
  58. $builder->setMaxBehindLines(10);
  59. // 设置验证码前面最大行数
  60. $builder->setMaxFrontLines(10);
  61. // 设置验证码颜色
  62. $builder->setTextColor(230, 81, 175);
  63. // 可以设置图片宽高及字体
  64. $builder->build($width = 165, $height = 45, $font = null);
  65. // 获取验证码的内容
  66. $phrase = $builder->getPhrase();
  67. // 把内容存入 cache,10分钟后过期
  68. $key = Uuid::uuid1()->toString();
  69. $this->model->setCache($key, $phrase, Carbon::now()->addMinutes(10));
  70. // 组装接口数据
  71. $data = [
  72. 'key' => $key,
  73. 'captcha' => $builder->inline(),
  74. ];
  75. return message("操作成功", true, $data);
  76. }
  77. /**
  78. * 系统登录
  79. * @return mixed
  80. * @since 2020/11/10
  81. * @author laravel开发员
  82. */
  83. public function login()
  84. {
  85. // 参数
  86. $param = request()->all();
  87. // 用户名
  88. $username = trim($param['username']);
  89. // 密码
  90. $password = trim($param['password']);
  91. // 验证规则
  92. $rules = [
  93. 'username' => 'required|min:2|max:20',
  94. 'password' => 'required|min:6|max:20',
  95. 'captcha' => ['required'],
  96. ];
  97. // 规则描述
  98. $messages = [
  99. 'required' => ':attribute为必填项',
  100. 'min' => ':attribute长度不符合要求',
  101. 'captcha.required' => '验证码不能为空',
  102. ];
  103. // 验证
  104. $validator = Validator::make($param, $rules, $messages, [
  105. 'username' => '用户名称',
  106. 'password' => '登录密码'
  107. ]);
  108. if ($validator->fails()) {
  109. $errors = $validator->errors()->getMessages();
  110. foreach ($errors as $key => $value) {
  111. return message($value[0], false);
  112. }
  113. }
  114. // 验证码校验
  115. $key = trim($param['key']);
  116. $captcha = $this->model->getCache($key);
  117. if (strtolower($captcha) != strtolower($param['captcha'])) {
  118. return message("请输入正确的验证码", false);
  119. }
  120. // 用户验证
  121. $info = $this->model->getOne([
  122. ['username', '=', $username],
  123. ]);
  124. if (!$info) {
  125. return message('您的登录用户名不存在', false);
  126. }
  127. // 密码校验
  128. $password = get_password($password . $username);
  129. //var_dump($password);
  130. if ($password != $info['password']) {
  131. return message("您的登录密码不正确", false);
  132. }
  133. // 使用状态校验
  134. if ($info['status'] != 1) {
  135. return message("您的帐号已被禁用", false);
  136. }
  137. // 设置日志标题
  138. ActionLogModel::setTitle("登录系统");
  139. ActionLogModel::record();
  140. // JWT生成token
  141. $jwt = new Jwt();
  142. $token = $jwt->getToken($info['id']);
  143. // 结果返回
  144. $result = [
  145. 'access_token' => $token,
  146. ];
  147. return message('登录成功', true, $result);
  148. }
  149. /**
  150. * 退出系统
  151. * @return array
  152. * @since 2020/11/12
  153. * @author laravel开发员
  154. */
  155. public function logout()
  156. {
  157. // 清空SESSION值
  158. session()->put("userId", null);
  159. // 记录退出日志
  160. ActionLogModel::setTitle("注销系统");
  161. // 创建退出日志
  162. ActionLogModel::record();
  163. return message();
  164. }
  165. /**
  166. * 删除七天之前标记软删除的数据
  167. */
  168. public function delete()
  169. {
  170. // 设置日志标题
  171. ActionLogModel::setRecord(session('userId'), ['type' => 1, 'title' => "删除登录记录信息", 'content' => json_encode(request()->post(), 256), 'module' => 'admin']);
  172. ActionLogModel::record();
  173. $this->model->where('mark', 0)->where('update_time', '<=', time() - 7 * 86400)->delete();
  174. return parent::delete();
  175. }
  176. }