UserController.php 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. <?php
  2. namespace App\Http\Controllers\API;
  3. use App\Http\Controllers\Controller;
  4. use App\Http\Requests\API\User\AdminUpdateRequest;
  5. use App\Http\Requests\API\User\BatchCreateRequest;
  6. use App\Http\Requests\API\User\CreateCompanyUserRequest;
  7. use App\Http\Requests\API\User\CreateRequest;
  8. use App\Http\Requests\API\User\UpdateRequest;
  9. use App\Http\Resources\API\UserInfoResource;
  10. use App\Http\Resources\API\UserSimpleResource;
  11. use App\Models\Company;
  12. use App\Models\Department;
  13. use App\Models\Enums\RequirementStatus;
  14. use App\Models\Menu;
  15. use App\Models\Permission;
  16. use App\Models\Role;
  17. use App\Models\Scopes\CompanyScope;
  18. use App\Models\User;
  19. use Illuminate\Contracts\Encryption\DecryptException;
  20. use Illuminate\Database\Query\Builder;
  21. use Illuminate\Http\Request;
  22. use Illuminate\Support\Facades\Auth;
  23. use Illuminate\Support\Facades\Cache;
  24. use Illuminate\Support\Facades\Crypt;
  25. use Illuminate\Support\Facades\DB;
  26. use Illuminate\Support\Facades\Hash;
  27. use function Laravel\Prompts\password;
  28. use function Nette\Utils\isEmpty;
  29. class UserController extends Controller
  30. {
  31. public function details()
  32. {
  33. $user = Auth::user();
  34. $menus = Menu::query()->where("group", \request("group", "web"))
  35. ->get();
  36. // ->filter(fn(Menu $menu) => Auth::user()->can($menu->permission));
  37. $userPerminssion=$user->role->permissions->pluck('name')->toArray();
  38. $flattenedPaths = [];
  39. foreach ($menus as $index=> $menu) {
  40. if(in_array($menu->permission,$userPerminssion)){
  41. $individualPaths = explode(',', $menu->path);
  42. $flattenedPaths = array_merge($flattenedPaths, $individualPaths);
  43. }
  44. }
  45. $userHasMenu=Menu::query()->whereIn('id',$flattenedPaths)->pluck('name')->toArray();
  46. $user->menus = $userHasMenu;
  47. return new UserInfoResource($user);
  48. }
  49. public function assignRole(Request $request, string $id)
  50. {
  51. $user = User::query()->findOrFail($id);
  52. $roleName = $request->get('role_name');
  53. if ($roleName) {
  54. $role = Role::query()->where("guard_name", "api")->where('name', $roleName)->firstOrFail();
  55. $user->role_id = $role->id;
  56. $user->save();
  57. }
  58. $roles = $roleName ? [$roleName] : [];
  59. $user->syncRoles($roles);
  60. return $this->noContent();
  61. }
  62. public function index(Request $request){
  63. $pageSize=$request->get('page_size') ?? 10;
  64. $sort=$request->input('sort','desc');
  65. $users = User::query()->allowed()->with(['department'])->filter($request->all())->orderBy('created_at',$sort)->paginate($pageSize);
  66. if(Auth::user()->super_admin){
  67. $users->transform(function (User $user) {
  68. $user->display_id = $user->id;
  69. return $user;
  70. });
  71. return UserSimpleResource::collection($users);
  72. }
  73. return UserSimpleResource::collection($users);
  74. }
  75. public function publicSearch(Request $request){
  76. $pageSize=$request->get('page_size') ?? 10;
  77. $sort=$request->input('sort','desc');
  78. //这里公共查询如超级管理员在邮件抄送时会看到其他公司用户不合适
  79. $company_id = $request->input('company_id',Auth::user()->company_id);
  80. $user=User::query()
  81. ->where('company_id',$company_id)
  82. ->filter($request->all())->orderBy('created_at',$sort)->paginate($pageSize);
  83. return UserSimpleResource::collection($user);
  84. }
  85. /**
  86. * add a new User
  87. * @return \Illuminate\Http\Response
  88. */
  89. public function store(CreateRequest $request){
  90. $password = Hash::make($request->password);
  91. $userRequest=$request->all();
  92. $userRequest['password']=$password;
  93. $user=User::create([
  94. ...$userRequest,
  95. 'created_by' => Auth::id(),
  96. ]);
  97. // TODO:发送邮箱给目标用户
  98. $roleId = $request->get('role_id');
  99. $role = Role::query()->findOrFail($roleId);
  100. $user->syncRoles($role);
  101. return $this->created();
  102. }
  103. /**
  104. * batchCreate User,为ditto时参考上一条
  105. * @return \Illuminate\Http\Response
  106. */
  107. public function batchStore(BatchCreateRequest $request){
  108. $userData = $request->users;
  109. DB::transaction(function () use ($userData) {
  110. foreach ($userData as $k => $data) {
  111. $user = new User();
  112. if ($k != 0) {
  113. // $userData[$k]["department_id"] = $userData[$k]["department_id"] == 'ditto' ? $userData[$k - 1]["department_id"] : $userData[$k]["department_id"];
  114. $userData[$k]["role_id"] = $userData[$k]["role_id"] == 'ditto' ? $userData[$k - 1]["role_id"] : $userData[$k]["role_id"];
  115. }
  116. $userData[$k]['password'] = Hash::make($userData[$k]['password']);
  117. $role = Role::query()->findOrFail($userData[$k]["role_id"]);
  118. $user->syncRoles($role);
  119. $user->fill([
  120. ...$userData[$k],
  121. 'created_by' => Auth::id(),
  122. ]);
  123. // TODO:发送邮箱给目标用户
  124. $user->save();
  125. }
  126. });
  127. // TODO:发送邮箱给目标用户
  128. return $this->created();
  129. }
  130. /**
  131. * enable or ban users 启用或禁用用户
  132. * @param Request $request
  133. * @return \Illuminate\Http\Response
  134. */
  135. public function status(Request $request,string $status){
  136. User::query()->allowed()->whereIn('id', $request->user_id)->update(['status' => $status]);
  137. return $this->created();
  138. }
  139. public function destroy(string $id)
  140. {
  141. $user = User::query()->allowed()->findOrFail($id);
  142. $user->delete();
  143. return $this->noContent();
  144. }
  145. public function show(string $id)
  146. {
  147. $company = Company::query()->where("id", Auth::user()->company_id)->orWhere('parent_id', Auth::user()->company_id)->pluck("id");
  148. $user = User::query()->whereIn('company_id',$company->toArray())->findOrFail($id);
  149. return new UserInfoResource($user);
  150. }
  151. public function update(UpdateRequest $request,string $id)
  152. {
  153. $user = User::allowed()->findOrFail($id);
  154. $newPassword=null;
  155. // 如果用户是超级管理员或具有相应权限
  156. if (Auth::user()->super_admin || Auth::user()->can('user.assign-role')) {
  157. $user->fill([
  158. ...$request->except(['username']),
  159. 'password' => $request->password ? Hash::make($request->password) : $user->password,
  160. ]);
  161. $roleId = $request->get('role_id');
  162. if ($roleId) {
  163. $role = Role::findOrFail($roleId);
  164. $user->syncRoles([$role]);
  165. }
  166. } else {
  167. // 如果用户不是超级管理员且没有编辑角色的权限
  168. $user->fill([
  169. ...$request->except(['role_id', 'department_id', 'company_id']),
  170. 'password' => $request->password ? Hash::make($request->password) : $user->password,
  171. ]);
  172. }
  173. $user->save();
  174. return $this->noContent();
  175. }
  176. // public function byDepartment(Request $request){
  177. // $departmentIds = $request->get("department", []);
  178. //
  179. // $emptyResponse = $this->success([
  180. // 'data' => [],
  181. // ]);
  182. //
  183. // if (! $departmentIds) {
  184. // return $emptyResponse;
  185. // }
  186. //
  187. // $users = User::query()->filter($request->all())->where('company_id',Auth::user()->company_id)->whereIn("department_id",$departmentIds)->get();
  188. //
  189. // return UserSimpleResource::collection($users);
  190. //
  191. // }
  192. // /**
  193. // * @param CreateRequest $request
  194. // * @return \Illuminate\Http\Response
  195. // * 修改个人信息
  196. // */
  197. // public function updateInfo(UpdateRequest $request)
  198. // {
  199. // $user = User::findOrFail(Auth::user()->id);
  200. // $user->fill([
  201. // ...$request->except(['username','role_id','department_id','company_id'])
  202. // ]);
  203. // $user->save();
  204. // return $this->noContent();
  205. // }
  206. //
  207. // /**
  208. // * @param AdminUpdateRequest $request 修改主体
  209. // * @param string $id 用户id
  210. // * @return \Illuminate\Http\Response
  211. // * 超管修改用户的信息
  212. // */
  213. // public function updateUserInfo(AdminUpdateRequest $request, string $id)
  214. // {
  215. // $user = User::findOrFail($id);
  216. // $user->fill([
  217. // ...$request->all()
  218. // ]);
  219. // $user->save();
  220. // return $this->noContent();
  221. //
  222. // }
  223. // /**
  224. // * 注册用户
  225. // * @return \Illuminate\Http\Response
  226. // */
  227. // public function registerCompanyUser(CreateCompanyUserRequest $request){
  228. // $password = Hash::make($request->password);
  229. // $userRequest=$request->all();
  230. // $userRequest['password']=$password;
  231. // User::create([
  232. // ...$userRequest,
  233. // 'created_by' => Auth::id(),
  234. // ]);
  235. // return $this->created();
  236. // }
  237. }