diff --git a/app/Console/Commands/AdminGenerator.php b/app/Console/Commands/AdminGenerator.php index 82622bb..398786f 100644 --- a/app/Console/Commands/AdminGenerator.php +++ b/app/Console/Commands/AdminGenerator.php @@ -35,7 +35,7 @@ class AdminGenerator extends Command 'mobile' => '09119533286', 'password' => Hash::make('hatame14'), 'image' => '', - 'status' => 'active', + 'status' => 1, ]); $this->info('hatame created successfully.'); diff --git a/app/Enums/AdminStatus.php b/app/Enums/AdminStatus.php new file mode 100644 index 0000000..deafd41 --- /dev/null +++ b/app/Enums/AdminStatus.php @@ -0,0 +1,10 @@ +applySearch() + ->applySort() + ->latest() + ->paginate(2); + + return view('admin.admins.index',compact('admins')) ; + } + + public function create() + { + return view('admin.admins.create'); + } + public function store(AdminStoreRequest $request) + { + $adminData=$request->validated(); + $adminData['password']=Hash::make($adminData['password']); + + Admin::create($adminData); + + return redirect() + ->route('admin.admins.index') + ->with('success','مدیر جدید با موفقیت اضافه شد.'); + } + + public function edit(Admin $admin) + { + return view('admin.admins.edit',compact('admin')); + } + public function update( AdminUpdateRequest $request,Admin $admin) + { + $adminData=$request->validated(); + + if ($request->filled('password')) { + + $adminData['password'] = Hash::make($adminData['password']); + + } else { + + unset($adminData['password']); + + } + + $admin->update($adminData); + + return redirect() + ->route('admin.admins.index') + ->with('success','اطلاعات مدیر با موفقیت ویرایش شد.'); + + } + + public function destroy(Admin $admin) + { + $admin->delete(); + + return redirect()->route('admin.admins.index') + ->with('مدیر با موفقیت حذف شد. '); + } +} diff --git a/app/Http/Controllers/Admin/Auth/AuthController.php b/app/Http/Controllers/Admin/Auth/AuthController.php index 3c0b1e6..9177d0c 100644 --- a/app/Http/Controllers/Admin/Auth/AuthController.php +++ b/app/Http/Controllers/Admin/Auth/AuthController.php @@ -2,17 +2,37 @@ namespace App\Http\Controllers\Admin\Auth; +use App\Enums\AdminStatus; use App\Http\Controllers\Controller; -use Illuminate\Http\Request; +use App\Http\Requests\Admin\Auth\LoginPostRequest; +use App\Models\Admin; + use Illuminate\Support\Facades\Auth; class AuthController extends Controller { public function login() { - return view('admin.auth.login'); + $rawLayout = true; + $title='ورود به حساب کاربری'; + return view('admin.auth.login',compact('rawLayout','title')); } - public function loginPost() + public function loginPost(LoginPostRequest $request) { + $loginData=$request->validated(); + + $admins=Admin::query() + ->where('username',$request->input('username')) + ->where('status',AdminStatus::Active) + ->first(); + + if (!$admins){ + return back()->withErrors([ + 'general' => 'اطلاعات وارد شده نامعتبر است' + ]); + } + + Auth::guard('admin')->login($admins); + return redirect()->route('admin.dashboard.index'); } public function logout() diff --git a/app/Http/Controllers/Admin/Auth/DashboardController.php b/app/Http/Controllers/Admin/Auth/DashboardController.php index 6f51a5d..118797f 100644 --- a/app/Http/Controllers/Admin/Auth/DashboardController.php +++ b/app/Http/Controllers/Admin/Auth/DashboardController.php @@ -3,8 +3,25 @@ namespace App\Http\Controllers\Admin\Auth; use App\Http\Controllers\Controller; +use App\Models\Admin; +use App\Models\Flight; +use App\Models\Tour; +use App\Models\User; class DashboardController extends Controller { - // + public function index() + { + $adminsCount = Admin::count(); + + $usersCount = User::count(); + + $toursCount = Tour::count(); + + $flightsCount = Flight::count(); + + return view('admin.dashboard',compact('adminsCount', + 'usersCount','toursCount','flightsCount' + )); + } } diff --git a/app/Http/Controllers/CommentController.php b/app/Http/Controllers/CommentController.php index 8a9c411..76344f2 100644 --- a/app/Http/Controllers/CommentController.php +++ b/app/Http/Controllers/CommentController.php @@ -10,16 +10,15 @@ class CommentController extends Controller { public function index() { + $withoutHero=true; + $comments=Comment::query() ->where('user_id',auth()->id()) ->with('tour') ->latest() ->paginate(4); - return view('account.users.comments.index', [ - 'comments' => $comments, - 'withoutHero' => true - ]); + return view('account.users.comments.index',compact('withoutHero','comments')); } public function store(CommentStoreRequest $request) diff --git a/app/Http/Controllers/FavoriteController.php b/app/Http/Controllers/FavoriteController.php index 21086df..2fbdd6b 100644 --- a/app/Http/Controllers/FavoriteController.php +++ b/app/Http/Controllers/FavoriteController.php @@ -9,15 +9,14 @@ class FavoriteController extends Controller { public function index() { + $withoutHero=true; + $favorites = Favorite::with('favoritable') ->where('user_id', auth()->id()) ->latest() ->get(); - return view('account.users.favorite.index', [ - 'favorites' => $favorites, - 'withoutHero' => true - ]); + return view('account.users.favorite.index',compact('withoutHero','favorites')); } public function store(Request $request) { Favorite::firstOrCreate([ diff --git a/app/Http/Controllers/IndexController.php b/app/Http/Controllers/IndexController.php deleted file mode 100644 index ec950ad..0000000 --- a/app/Http/Controllers/IndexController.php +++ /dev/null @@ -1,14 +0,0 @@ -|string> + */ + public function rules(): array + { + return [ + 'first_name'=>[ + 'required', + 'string', + 'max:50' + ], + 'last_name'=>[ + 'required', + 'string', + 'max:50' + ], + 'username'=>[ + 'required', + 'string', + ], + 'email'=>[ + 'required', + 'email', + ], + 'mobile'=>[ + 'required', + ], + 'password'=>[ + 'nullable', + 'min:8' + ], + 'status'=>[ + 'required', + ], + ]; + } +} diff --git a/app/Http/Requests/Admin/Auth/LoginPostRequest.php b/app/Http/Requests/Admin/Auth/LoginPostRequest.php new file mode 100644 index 0000000..ed30e8b --- /dev/null +++ b/app/Http/Requests/Admin/Auth/LoginPostRequest.php @@ -0,0 +1,40 @@ +|string> + */ + public function rules(): array + { + return [ + 'username'=>[ + 'required', + 'string', + 'min:3', + 'max:50' + ], + 'password'=>[ + 'required', + 'string', + 'min:8', + 'max:255' + ] + ]; + } +} diff --git a/app/Http/Requests/AdminStoreRequest.php b/app/Http/Requests/AdminStoreRequest.php new file mode 100644 index 0000000..a2b70bc --- /dev/null +++ b/app/Http/Requests/AdminStoreRequest.php @@ -0,0 +1,59 @@ +|string> + */ + public function rules(): array + { + return [ + 'first_name'=>[ + 'required', + 'string', + 'max:50' + ], + 'last_name'=>[ + 'required', + 'string', + 'max:50' + ], + 'username'=>[ + 'required', + 'string', + 'unique:admins,username' + ], + 'email'=>[ + 'required', + 'email', + 'unique:admins,email' + ], + 'mobile'=>[ + 'required', + 'unique:admins,mobile' + ], + 'password'=>[ + 'required', + 'min:8' + ], + 'status'=>[ + 'required', + ], + ]; + } +} diff --git a/app/Models/Admin.php b/app/Models/Admin.php index 26cb7e6..a1b96f8 100644 --- a/app/Models/Admin.php +++ b/app/Models/Admin.php @@ -7,8 +7,9 @@ namespace App\Models; use Carbon\Carbon; -use Illuminate\Database\Eloquent\Collection; -use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Attributes\Scope; + use Illuminate\Database\Eloquent\Collection; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Foundation\Auth\User; @@ -54,8 +55,42 @@ class Admin extends User 'image', 'status' ]; + #[Scope] + protected function applySearch(Builder $query): void + { + $request = request(); - public function roles() + if ($request->filled('keyword')) { + $keyword = $request->input('keyword'); + + $query->whereAny([ + 'first_name', + 'last_name', + ], 'LIKE', "%$keyword%"); + } + } + + #[Scope] + protected function applySort(Builder $query): void + { + $sort = request('sort'); + + match ($sort) { + + 'first_name_asc' => + $query->orderBy('first_name', 'asc'), + + 'first_name_desc' => + $query->orderBy('first_name', 'desc'), + + 'newest' => + $query->orderBy('created_at', 'desc'), + + default => + $query->orderBy('created_at', 'desc'), + + }; + } public function roles() { return $this->belongsToMany(Role::class, 'admin_roles'); } diff --git a/bootstrap/app.php b/bootstrap/app.php index 10c2408..e32b1bf 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -18,8 +18,22 @@ return Application::configure(basePath: dirname(__DIR__)) health: '/up', ) ->withMiddleware(function (Middleware $middleware) { - $middleware->redirectGuestsTo(fn (Request $request) => route('auth.login.index')); - $middleware->redirectUsersTo(fn (Request $request) => route('admin.dashboard.index')); + $middleware->redirectGuestsTo(function (Request $request) { + + if ($request->is('admin/*')) { + return route('admin.auth.login.index'); + } + return route('auth.login.index'); + }); + + $middleware->redirectUsersTo(function (Request $request) { + + if ($request->is('admin/*')) { + return route('admin.dashboard.index'); + } + + return route('index'); + }); $middleware->alias([ 'admin' => AdminMiddleware::class, ]); diff --git a/public/assets/admin/css.style.css b/public/assets/admin/css.style.css new file mode 100644 index 0000000..17f595e --- /dev/null +++ b/public/assets/admin/css.style.css @@ -0,0 +1,92 @@ +body { + background: #f5f6fa; + font-family: Vazirmatn, sans-serif; +} + + +/* Sidebar */ + +.sidebar { + width: 260px; + min-height: 100vh; + background: #111827; + color: white; + position: fixed; + right: 0; + top: 0; +} + + +.sidebar .logo { + padding: 25px 15px; + text-align: center; +} + + +.sidebar a { + color: #cbd5e1; + text-decoration: none; + display: block; + padding: 13px 20px; + transition: .3s; +} + + +.sidebar a:hover { + background: #1f2937; + color: white; +} + + + +/* Main Content */ + +.content { + margin-right: 260px; +} + + + +/* Navbar */ + +.navbar-admin { + + height: 70px; + background: white; + box-shadow: 0 2px 10px rgba(0,0,0,.08); + +} + + + +/* Cards */ + + +.card-box { + + border: none; + border-radius: 18px; + box-shadow: 0 5px 20px rgba(0,0,0,.05); + transition: .3s; + +} + + +.card-box:hover { + + transform: translateY(-5px); + +} + + + +/* Footer */ + + +.admin-footer { + + text-align: center; + padding: 20px; + color: #6b7280; + +} diff --git a/resources/views/admin/admins/create.blade.php b/resources/views/admin/admins/create.blade.php index f11ca0e..97b6146 100644 --- a/resources/views/admin/admins/create.blade.php +++ b/resources/views/admin/admins/create.blade.php @@ -1,3 +1,132 @@ -
| شناسه | +نام | +نام خانوادگی | +نام کاربری | +ایمیل | +وضعیت | +عملیات | +
|---|---|---|---|---|---|---|
| {{ $admin->id }} | + +{{ $admin->first_name }} | + +{{ $admin->last_name }} | + +{{ $admin->username }} | + +{{ $admin->email }} | + + ++ + @if($admin->status) + + + فعال + + + @else + + + غیرفعال + + + @endif + + | + + ++ + + ویرایش + + + + + + | + +
| + رکوردی پیدا نشد + | +||||||
+ هنوز فعالیتی ثبت نشده است. +
+ + +