* @package Laravue * @version 1.0 */ namespace App\Http\Controllers; use App\Http\Resources\PermissionResource; use App\Http\Requests\UsersRequest; use App\Http\Resources\UserResource; use App\Laravue\JsonResponse; use App\Laravue\Models\Permission; use App\Laravue\Models\Role; use App\Laravue\Models\User; use App\Laravue\Models\Users; use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\ResourceCollection; use Illuminate\Support\Arr; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Hash; use Validator; /** * Class UserController * * @package App\Http\Controllers */ class UserController extends Controller { const ITEM_PER_PAGE = 15; /** * Display a listing of the user resource. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response|ResourceCollection */ public function index(Request $request) { $searchParams = $request->all(); $userQuery = User::query(); $limit = Arr::get($searchParams, 'limit', static::ITEM_PER_PAGE); $role = Arr::get($searchParams, 'role', ''); $keyword = Arr::get($searchParams, 'keyword', ''); if (!empty($role)) { $userQuery->whereHas('roles', function($q) use ($role) { $q->where('name', $role); }); } if (!empty($keyword)) { $userQuery->where('name', 'LIKE', '%' . $keyword . '%'); $userQuery->where('email', 'LIKE', '%' . $keyword . '%'); } return UserResource::collection($userQuery->paginate($limit)); } /** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { $validator = Validator::make( $request->all(), array_merge( $this->getValidationRules(), [ 'password' => ['required', 'min:6'], 'confirmPassword' => 'same:password', ] ) ); if ($validator->fails()) { return response()->json(['errors' => $validator->errors()], 403); } else { $params = $request->all(); $user = User::create([ 'name' => $params['name'], 'email' => $params['email'], 'password' => Hash::make($params['password']), ]); $role = Role::findByName($params['role']); $user->syncRoles($role); return new UserResource($user); } } /** * Display the specified resource. * * @param User $user * @return UserResource|\Illuminate\Http\JsonResponse */ public function show(User $user) { return new UserResource($user); } /** * Update the specified resource in storage. * * @param Request $request * @param User $user * @return UserResource|\Illuminate\Http\JsonResponse */ public function update(Request $request, User $user) { if ($user === null) { return response()->json(['error' => 'User not found'], 404); } if ($user->isAdmin()) { return response()->json(['error' => 'Admin can not be modified'], 403); } $validator = Validator::make($request->all(), $this->getValidationRules(false)); if ($validator->fails()) { return response()->json(['errors' => $validator->errors()], 403); } else { $email = $request->get('email'); $found = User::where('email', $email)->first(); if ($found && $found->id !== $user->id) { return response()->json(['error' => 'Email has been taken'], 403); } $user->name = $request->get('name'); $user->email = $email; $user->save(); return new UserResource($user); } } /** * Update the specified resource in storage. * * @param Request $request * @param User $user * @return UserResource|\Illuminate\Http\JsonResponse */ public function updatePermissions(Request $request, User $user) { if ($user === null) { return response()->json(['error' => 'User not found'], 404); } if ($user->isAdmin()) { return response()->json(['error' => 'Admin can not be modified'], 403); } $permissionIds = $request->get('permissions', []); $rolePermissionIds = array_map( function($permission) { return $permission['id']; }, $user->getPermissionsViaRoles()->toArray() ); $newPermissionIds = array_diff($permissionIds, $rolePermissionIds); $permissions = Permission::allowed()->whereIn('id', $newPermissionIds)->get(); $user->syncPermissions($permissions); return new UserResource($user); } /** * Remove the specified resource from storage. * * @param User $user * @return \Illuminate\Http\Response */ public function destroy(User $user) { if ($user->isAdmin()) { response()->json(['error' => 'Ehhh! Can not delete admin user'], 403); } try { $user->delete(); } catch (\Exception $ex) { response()->json(['error' => $ex->getMessage()], 403); } return response()->json(null, 204); } /** * Get permissions from role * * @param User $user * @return array|\Illuminate\Http\Resources\Json\AnonymousResourceCollection */ public function permissions(User $user) { try { return new JsonResponse([ 'user' => PermissionResource::collection($user->getDirectPermissions()), 'role' => PermissionResource::collection($user->getPermissionsViaRoles()), ]); } catch (\Exception $ex) { response()->json(['error' => $ex->getMessage()], 403); } } /** * @param bool $isNew * @return array */ private function getValidationRules($isNew = true) { return [ 'name' => 'required', 'email' => $isNew ? 'required|email|unique:users' : 'required|email', 'roles' => [ 'required', 'array' ], ]; } // 后台管理用户列表 public function HUserList(Request $request){ $pagenNum=$request->input('page')-1;//页数 $limit = $request->input('limit'); $users = DB::table('BackgroundUser as b') ->where('b.state','=','2') ->join('areachina as p', 'b.provinceid', '=', 'p.areaid') ->join('areachina as c', 'b.cityid', '=', 'c.areaid') ->join('areachina as a', 'b.areaid', '=', 'a.areaid') ->orderBy('b.id', 'desc') ->select('b.username','b.nickname','b.contacts_name','b.contacts_phone','b.email','b.state','a.area_name as area','c.area_name as city','p.area_name as province') ->offset($pagenNum) ->limit($limit) ->get(); if ($users){ return $this->jsonSuccessData($users); }else{ return $this->jsonErrorData(105,'获取失败'); } } //新增用户 public function addUser(Request $request){ //获取用户列表 $userdata=$request->all(); $validator = Validator::make( $request->all(), array_merge( $this->getValidationRules(), [ 'username'=>'required|between:3,25|regex:/^[A-Za-z0-9\-\_]+$/|unique:BackgroundUser,username', 'password'=>'required|string|min:6', 'phone'=> 'required|regex:/^1[3465789]\d{9}$/|unique:phone', 'email'=>'email', ] ) ); if ($validator->fails()) { return response()->json(['errors' => $validator->errors()], 403); }else{ foreach ($userdata as $k =>$val){ if (!is_null($val)){ $type = new Users(); $arr = $type->getTypeAllToArray($userdata); return $this->jsonSuccessData($arr); }else{ return $this->jsonErrorData(105,'完善表单信息'); } } } } }