Login.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. <?php
  2. namespace App\Http\Controllers\Manager;
  3. use App\Models\Manager\AdminUser;
  4. use App\Http\Requests\Manager\Login as Request;
  5. use App\Models\Manager\AuthRule;
  6. use App\Facades\Servers\Encrypts\AccessToken;
  7. use App\Models\Manager\Personnel\User as UserModel;
  8. use App\Facades\Servers\Sms\VerifyCode as Sms;
  9. use Illuminate\Support\Facades\Cache;
  10. /**
  11. * 管理后台登录控制器
  12. * @author 唐远望
  13. * @version 1.0
  14. * @date 2025-12-02
  15. *
  16. * */
  17. class Login extends Manager
  18. {
  19. /**
  20. * 登录方法 /manager/login/index
  21. * @author 唐远望
  22. * @version 1.0
  23. * @date 2025-12-02
  24. * @param string username 登录账号
  25. * @param string password 登录密码
  26. *
  27. * */
  28. public function index(Request $Request, AdminUser $AdminUser, UserModel $UserModel)
  29. {
  30. // 验证规则
  31. $Request->scene('login')->validate();
  32. // 接收数据
  33. $username = $Request->input('username', '');
  34. // 接收数据
  35. $password = $Request->input('password', '');
  36. if (strtolower($username) == 'admin') {
  37. // 查询用户
  38. $admin = $AdminUser->orWhere('username', $username)->first(['uid', 'username', 'phone', 'status', 'password', 'insert_time', 'update_time']);
  39. // 用户不存在
  40. if (!$admin) return json_send(['code' => 'error', 'msg' => '密码错误或账号不存在']);
  41. // 用户不存在
  42. if ($admin['status']) return json_send(['code' => 'error', 'msg' => '该账号已停用']);
  43. // 转数组
  44. $admin = $admin->toArray();
  45. // 比对密码
  46. if (md5($password) != $admin['password']) return json_send(['code' => 'error', 'msg' => '密码错误或账号不存在']);
  47. // 登录
  48. $accessToken = $AdminUser->Login($admin['uid'], 'manager');
  49. // 比对密码
  50. if (isset($accessToken['error'])) return json_send(['code' => 'error', 'msg' => '登录失败', 'data' => $accessToken['data']]);
  51. // 获取权限列表
  52. $accessToken['username'] = $admin['username'];
  53. $accessToken['is_system_admin'] = 1;
  54. // 获取权限列表
  55. } else {
  56. $admin = $UserModel->where('User_code', $username)->first(['company_id', 'id as uid', 'name as username', 'mobile as phone', 'status', 'password', 'insert_time', 'update_time']);
  57. // 用户不存在
  58. if (!$admin) return json_send(['code' => 'error', 'msg' => '密码错误或账号不存在']);
  59. // 用户不存在
  60. if ($admin['status']) return json_send(['code' => 'error', 'msg' => '该账号已停用']);
  61. // 转数组
  62. $admin = $admin->toArray();
  63. // 比对密码
  64. if (md5($password) != $admin['password']) return json_send(['code' => 'error', 'msg' => '密码错误或账号不存在']);
  65. // 登录
  66. $accessToken = $UserModel->Login($admin['uid'], $admin['company_id'], 'manager');
  67. // 比对密码
  68. if (isset($accessToken['error'])) return json_send(['code' => 'error', 'msg' => '登录失败', 'data' => $accessToken['data']]);
  69. // 获取权限列表
  70. $accessToken['username'] = $admin['username'];
  71. $accessToken['is_system_admin'] = 0;
  72. }
  73. // 表单令牌
  74. return json_send(['code' => 'success', 'msg' => '登录成功', 'data' => $accessToken]);
  75. }
  76. /**
  77. * 获取用户页面权限 /manager/login/auth_rules'
  78. * @author 唐远望
  79. * @version 1.0
  80. * @date 2026-01-30
  81. * @param string username 登录账号
  82. * @param string password 登录密码
  83. *
  84. */
  85. public function auth_rules(Request $Request, AuthRule $AuthRule)
  86. {
  87. $access_token = $Request->input('access_token', '');
  88. if (!isset($access_token)) return json_send(['code' => 'error', 'msg' => '缺少参数']);
  89. $auth_rules = [];
  90. if ($access_token['is_admin'] == 0) {
  91. $auth_rules = '';
  92. } else {
  93. $auth_rules = $AuthRule->getAuthList($access_token['uid'], '1', 'manager');
  94. }
  95. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $auth_rules]);
  96. }
  97. /**
  98. * 登录方法 /manager/login/out
  99. * @author 唐远望
  100. * @version 1.0
  101. * @date 2025-12-02
  102. * @param string username 登录账号
  103. * @param string password 登录密码
  104. *
  105. * */
  106. public function out(Request $Request, AdminUser $AdminUser, UserModel $UserModel)
  107. {
  108. $token = $Request->input('access_token_manager', '');
  109. // 解码
  110. $userInfo = AccessToken::decode($token);
  111. // 验证规则
  112. $uid = $userInfo['uid'];
  113. $is_admin = $userInfo['is_admin'];
  114. if ($is_admin == '1') {
  115. // 退出登录
  116. $AdminUser->LoginOut($uid, 'manager');
  117. } else {
  118. $UserModel->LoginOut($uid, 'manager');
  119. }
  120. // 表单令牌
  121. return json_send(['code' => 'success', 'msg' => '退出成功', 'data' => '']);
  122. }
  123. /**
  124. * 手机号码登录 /manager/login/mobile
  125. * @author 唐远望
  126. * @version 1.0
  127. * @date 2025-12-04
  128. * @param string mobile 手机号码
  129. * @param string password 登录密码
  130. *
  131. */
  132. public function mobile(Request $Request, AuthRule $AuthRule, UserModel $UserModel)
  133. {
  134. // 验证规则
  135. $Request->scene('mobile')->validate();
  136. // 接收数据
  137. $phone = $Request->input('phone', '');
  138. // 接收数据
  139. $password = $Request->input('password', '');
  140. // 查询用户
  141. $admin = $UserModel->where('mobile', $phone)->first(['company_id', 'id as uid', 'name as username', 'mobile as phone', 'status', 'password', 'insert_time', 'update_time']);
  142. // 用户不存在
  143. if (!$admin) return json_send(['code' => 'error', 'msg' => '密码错误或账号不存在']);
  144. // 用户不存在
  145. if ($admin['status']) return json_send(['code' => 'error', 'msg' => '该账号已停用']);
  146. // 转数组
  147. $admin = $admin->toArray();
  148. // 比对密码
  149. if (md5($password) != $admin['password']) return json_send(['code' => 'error', 'msg' => '密码错误或账号不存在']);
  150. // 登录
  151. $accessToken = $UserModel->Login($admin['uid'], $admin['company_id'], 'manager');
  152. // 比对密码
  153. if (isset($accessToken['error'])) return json_send(['code' => 'error', 'msg' => '登录失败', 'data' => $accessToken['data']]);
  154. // 获取权限列表
  155. $accessToken['username'] = $admin['username'];
  156. $accessToken['is_system_admin'] = 0;
  157. // 表单令牌
  158. return json_send(['code' => 'success', 'msg' => '登录成功', 'data' => $accessToken]);
  159. }
  160. /**
  161. * 发送验证码
  162. * @author 唐远望
  163. * @version 1.0
  164. * @date 2026-01-15
  165. * @param string phone 手机号码
  166. *
  167. */
  168. public function send_code(Request $Request, UserModel $UserModel)
  169. {
  170. // 验证规则
  171. $Request->scene('send_code')->validate();
  172. // 接收数据
  173. $mobile = request('phone', '');
  174. if (!$mobile) return json_send(['code' => 'error', 'msg' => '请先填写手机号']);
  175. // 获取数据
  176. $session = Cache::get('loginSmsCode_' . $mobile);
  177. // 如果有数据,并且验证码创建的时间在一分钟之内
  178. if ($session && time() - $session['create_time'] < 60) return json_send(['code' => 'error', 'msg' => '请稍后再试']);
  179. // 查询用户
  180. $admin = $UserModel->query()->where('mobile', $mobile)->first(['status']);
  181. if ($admin && $admin['status']) return json_send(['code' => 'error', 'msg' => '用户已被停用']);
  182. $code = strval(rand(100000, 999999));
  183. $result = Sms::sendCode($mobile, $code);
  184. if (isset($result['error'])) return json_send(['code' => 'error', 'msg' => $result['error']]);
  185. $session = ['code' => $code, 'mobile' => $mobile, 'create_time' => time()];
  186. Cache::put('loginSmsCode_' . $mobile, $session, 120);
  187. return json_send(['code' => 'success', 'msg' => '发送成功', 'data' => '']);
  188. }
  189. /**
  190. * 邮箱登录 /manager/login/email
  191. * @author 唐远望
  192. * @version 1.0
  193. * @date 2025-12-04
  194. * @param string email 邮箱号码
  195. * @param string password 登录密码
  196. *
  197. */
  198. public function email(Request $Request, UserModel $UserModel)
  199. {
  200. // 验证规则
  201. $Request->scene('email')->validate();
  202. // 接收数据
  203. $email = $Request->input('email', '');
  204. // 接收数据
  205. $password = $Request->input('password', '');
  206. // 查询用户
  207. $admin = $UserModel->where('email', $email)->first(['company_id', 'id as uid', 'name as username', 'mobile as phone', 'status', 'password', 'insert_time', 'update_time']);
  208. // 用户不存在
  209. if (!$admin) return json_send(['code' => 'error', 'msg' => '密码错误或账号不存在']);
  210. // 用户不存在
  211. if ($admin['status']) return json_send(['code' => 'error', 'msg' => '该账号已停用']);
  212. // 转数组
  213. $admin = $admin->toArray();
  214. // 比对密码
  215. if (md5($password) != $admin['password']) return json_send(['code' => 'error', 'msg' => '密码错误或账号不存在']);
  216. // 登录
  217. $accessToken = $UserModel->Login($admin['uid'], $admin['company_id'], 'manager');
  218. // 比对密码
  219. if (isset($accessToken['error'])) return json_send(['code' => 'error', 'msg' => '登录失败', 'data' => $accessToken['data']]);
  220. // 获取权限列表
  221. $accessToken['username'] = $admin['username'];
  222. $accessToken['is_system_admin'] = 0;
  223. // 表单令牌
  224. return json_send(['code' => 'success', 'msg' => '登录成功', 'data' => $accessToken]);
  225. }
  226. /**
  227. * 手机验证码登录 /manager/login/mobile_code
  228. * @author 唐远望
  229. * @version 1.0
  230. * @date 2026-01-15
  231. * @param string mobile 手机号码
  232. * @param string code 验证码
  233. *
  234. */
  235. public function mobile_code(Request $Request, UserModel $UserModel)
  236. {
  237. // 验证规则
  238. $Request->scene('mobile_code')->validate();
  239. // 接收数据
  240. $phone = $Request->input('phone', '');
  241. // 接收数据
  242. $code = $Request->input('code', '');
  243. // 获取数据
  244. $session = Cache::get('loginSmsCode_' . $phone);
  245. if (!$session) return json_send(['code' => 'error', 'msg' => '请先获取手机号验证码']);
  246. if ($session['code'] != $code || $session['mobile'] != $phone) return json_send(['code' => 'error', 'msg' => '验证码错误']);
  247. // 查询用户
  248. $admin = $UserModel->where('mobile', $phone)->first(['company_id', 'id as uid', 'name as username', 'mobile as phone', 'status', 'password', 'insert_time', 'update_time']);
  249. // 用户不存在
  250. if (!$admin) return json_send(['code' => 'error', 'msg' => '账号不存在']);
  251. // 用户不存在
  252. if ($admin['status']) return json_send(['code' => 'error', 'msg' => '该账号已停用']);
  253. // 转数组
  254. $admin = $admin->toArray();
  255. // 登录
  256. $accessToken = $UserModel->Login($admin['uid'], $admin['company_id'], 'manager');
  257. // 比对密码
  258. if (isset($accessToken['error'])) return json_send(['code' => 'error', 'msg' => '登录失败', 'data' => $accessToken['data']]);
  259. // 获取权限列表
  260. $accessToken['username'] = $admin['username'];
  261. $accessToken['is_system_admin'] = 0;
  262. // 表单令牌
  263. return json_send(['code' => 'success', 'msg' => '登录成功', 'data' => $accessToken]);
  264. }
  265. }