LoginService.php 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. <?php
  2. namespace App\Service;
  3. use App\Model\Depart;
  4. use App\Model\Employee;
  5. use App\Model\EmployeeDepartPermission;
  6. use App\Model\EmployeeRole;
  7. use App\Model\RoleMenu;
  8. use App\Model\RoleMenuButton;
  9. use App\Model\SysMenu;
  10. use Illuminate\Support\Facades\Hash;
  11. class LoginService extends Service
  12. {
  13. public function login($data){
  14. if(empty($data['account'])) return [false, '账号不能为空'];
  15. if(empty($data['password'])) return [false, '密码不能为空'];
  16. $account = $data['account'];
  17. $password = $data['password'];
  18. $employee = Employee::where('del_time',0)
  19. ->where('account', $account)
  20. ->first();
  21. if(empty($employee)) return [false,'账号不存在或已被删除'];
  22. $employee = $employee->toArray();
  23. if(! Hash::check($password, $employee['password'])) return [false,'密码错误'];
  24. if($employee['is_admin'] == Employee::IS_ADMIN_ZERO || $employee['is_admin'] == Employee::IS_ADMIN_THREE) return [false, '账号限制登录'];
  25. //生成token
  26. list($status, $jwtToken) = TokenService::getToken($employee);
  27. if(! $status) return [false, $jwtToken];
  28. return [true, [
  29. 'token' => $jwtToken,
  30. 'employee_id' => $employee['id'],
  31. 'title' => $employee['title'],
  32. ]];
  33. }
  34. public function clogin($data){
  35. if(empty($data['account'])) return [false, '账号不能为空'];
  36. if(empty($data['password'])) return [false, '密码不能为空'];
  37. $account = $data['account'];
  38. $password = $data['password'];
  39. $employee = Employee::where('del_time',0)
  40. ->where('account', $account)
  41. ->first();
  42. if(empty($employee)) return [false,'账号不存在或已被删除'];
  43. $employee = $employee->toArray();
  44. if(! Hash::check($password, $employee['password'])) return [false,'密码错误'];
  45. if($employee['is_admin'] != Employee::IS_ADMIN_THREE) return [false, '账号限制登录'];
  46. //生成token
  47. list($status, $jwtToken) = TokenService::getToken($employee);
  48. if(! $status) return [false, $jwtToken];
  49. return [true, [
  50. 'token' => $jwtToken,
  51. 'employee_id' => $employee['id'],
  52. 'title' => $employee['title'],
  53. ]];
  54. }
  55. public static function checkUser($employee){
  56. if(empty($employee['employee_id'])) return [false, 'token错误'];
  57. if(! isset($employee['p_version'])) return [false, 'token错误'];
  58. $result = Employee::where('id', $employee['employee_id'])
  59. ->where('del_time',0)
  60. ->first();
  61. if(empty($result)) return [false, '账号不存在或已被删除'];
  62. $result = $result->toArray();
  63. if($result['is_admin'] == Employee::IS_ADMIN_ZERO || $result['is_admin'] == Employee::IS_ADMIN_THREE) return [false, '账号限制登录'];
  64. if($result['p_version'] != $employee['p_version']) return [false, '请重新登录'];
  65. return [true, $result];
  66. }
  67. public static function checkCompany($employee){
  68. $top_depart_id = $employee['top_depart_id'];
  69. if(empty($top_depart_id)) return [false, '公司信息不存在'];
  70. return [true, ''];
  71. }
  72. public static function checkRoute($employee, $request){
  73. $currentRouteName = $request->route()->getName();
  74. //没有取别名的路由需要校验
  75. if(! empty($currentRouteName)){
  76. if($currentRouteName == "only.admin"){
  77. return [false, '无接口'. $currentRouteName . '访问权限'];
  78. }else{
  79. //角色中所有的按钮
  80. $role_id = $employee['role_ids'];
  81. $bool = RoleMenuButton::from('role_menu_button as a')
  82. ->join('sys_menu_button as b', 'b.id', '=', 'a.button_id')
  83. ->whereIn('a.role_id', $role_id)
  84. ->where('b.func',$currentRouteName)
  85. ->where('a.del_time', 0)
  86. ->where('b.del_time', 0)
  87. ->exists();
  88. if(! $bool) return [false, '无接口'. $currentRouteName . '访问权限'];
  89. }
  90. }
  91. return [true, ''];
  92. }
  93. public static function getPersonDepart($employee_id) {
  94. // 1. 初始化返回结构
  95. $result = [
  96. 'top_depart_id' => 0,
  97. 'top_depart_code' => "",
  98. 'depart_id' => [],
  99. ];
  100. // 2. 基础校验
  101. if (empty($employee_id) ) return $result;
  102. $depart = EmployeeDepartPermission::from('employee_depart_permission as a')
  103. ->join('depart as c', 'c.id', '=', 'a.top_depart_id') // 公司必须存在
  104. ->leftJoin('depart as b', 'b.id', '=', 'a.depart_id') // 部门可能为0
  105. ->where('a.employee_id', $employee_id)
  106. ->where('c.is_use', Depart::IS_UES) // 公司必须启用
  107. ->select('a.depart_id', 'b.is_use as dept_use','a.top_depart_id','c.code as top_depart_code')
  108. ->get()->toArray();
  109. foreach ($depart as $value){
  110. if($value['depart_id'] && $value['dept_use'] && ! in_array($value['depart_id'], $result['depart_id'])) $result['depart_id'][] = $value['depart_id'];
  111. if($value['top_depart_id'] && ! $result['top_depart_id']) $result['top_depart_id'] = $value['top_depart_id'];
  112. if($value['top_depart_code'] && ! $result['top_depart_code']) $result['top_depart_code'] = $value['top_depart_code'];
  113. }
  114. return $result;
  115. }
  116. public static function getPersonRoleAndPermissions($employee) {
  117. // 1. 初始化返回结构
  118. $result = [
  119. 'role_ids' => [],
  120. 'menu_permissions' => []
  121. ];
  122. // 2. 是管理员账户
  123. if ($employee['is_admin'] == Employee::IS_ADMIN_TWO) {
  124. return $result;
  125. }
  126. $role_ids = EmployeeRole::from('employee_role as a')
  127. ->join('role as b', 'b.id', '=', 'a.role_id')
  128. ->where('a.del_time', 0)
  129. ->where('b.top_depart_id', $employee['top_depart_id'])
  130. ->where('a.employee_id', $employee['id'])
  131. ->pluck('a.role_id')
  132. ->unique()
  133. ->sort()
  134. ->values()
  135. ->toArray();
  136. if (empty($role_ids)) return $result;
  137. $result['role_ids'] = $role_ids;
  138. // 4. 获取合法的系统菜单 ID (用于过滤)
  139. $valid_menu_ids = SysMenu::where('del_time', 0)
  140. ->where('is_authority', '>', 0)
  141. ->pluck('id')
  142. ->toArray();
  143. // 5. 获取并合并菜单权限
  144. $role_menus = RoleMenu::where('del_time', 0)
  145. ->whereIn('role_id', $role_ids)
  146. ->select('menu_id', 'type')
  147. ->get();
  148. $permissions = [];
  149. foreach ($role_menus as $item) {
  150. // 过滤不在系统权限菜单内的记录
  151. if (!in_array($item->menu_id, $valid_menu_ids)) {
  152. continue;
  153. }
  154. // 取相同 menu_id 下最大的 type
  155. if (!isset($permissions[$item->menu_id]) || $permissions[$item->menu_id] < $item->type) {
  156. $permissions[$item->menu_id] = $item->type;
  157. }
  158. }
  159. $result['menu_permissions'] = $permissions;
  160. return $result;
  161. }
  162. }