diff --git a/app/Http/Controllers/Admin/BaseController.php b/app/Http/Controllers/Admin/BaseController.php new file mode 100644 index 0000000..1e4b608 --- /dev/null +++ b/app/Http/Controllers/Admin/BaseController.php @@ -0,0 +1,37 @@ + $id]; + $validator = Validator::make($data, [ + 'id' => 'required|numeric' + ], [ + 'id.required' => __('validation.admin_role.id_empty'), + 'id.numeric' => __('validation.admin_role.id_numeric') + ]); + if ($validator->fails()) { + throw new ValidationException($validator); + } + if (!$model::query()->where('id', $id)->exists()) { + throw new Exception(__('exception.exception_handler.resource')); + }; + } + +} diff --git a/app/Http/Controllers/Admin/IndexController.php b/app/Http/Controllers/Admin/IndexController.php index b05a8bb..cbaadc4 100644 --- a/app/Http/Controllers/Admin/IndexController.php +++ b/app/Http/Controllers/Admin/IndexController.php @@ -2,7 +2,6 @@ namespace App\Http\Controllers\Admin; -use App\Http\Controllers\Controller; use App\Services\AdminMenuService; use App\Services\ApiResponseService; use Exception; @@ -10,7 +9,7 @@ use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; -class IndexController extends Controller +class IndexController extends BaseController { /** * @var ApiResponseService diff --git a/app/Http/Controllers/Admin/RolesController.php b/app/Http/Controllers/Admin/RolesController.php index 7adf0d8..2044810 100644 --- a/app/Http/Controllers/Admin/RolesController.php +++ b/app/Http/Controllers/Admin/RolesController.php @@ -3,7 +3,6 @@ namespace App\Http\Controllers\Admin; use App\Exceptions\CustomException; -use App\Http\Controllers\Controller; use App\Models\AdminRoleMenu; use App\Models\AdminRoles; use App\Services\AdminMenuService; @@ -15,7 +14,7 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\Validator; use Illuminate\Validation\ValidationException; -class RolesController extends Controller +class RolesController extends BaseController { /** * @var ApiResponseService @@ -134,10 +133,7 @@ class RolesController extends Controller 'remark.max' => __('validation.admin_role.r_max'), ]; if ($id) { - $data['id'] = $id; - $rules['id'] = 'required|numeric'; - $messages['id.required'] = __('validation.admin_role.id_empty'); - $messages['id.numeric'] = __('validation.admin_role.id_numeric'); + $this->validateId($id, AdminRoles::class); } $validator = Validator::make($data, $rules, $messages); @@ -152,45 +148,16 @@ class RolesController extends Controller */ public function show(string $id): JsonResponse { - try { - $data = [ - 'menu_list' => (new AdminMenuService())->getMenuTreeCacheList( - AdminRoleMenu::getMenuIdArr($id) - ), - 'item' => AdminRoles::query() - ->where('id', $id) - ->get() - ->toArray() - ]; - return $this->responseService->success($data); - } catch (Exception $e) { - return $this->responseService->systemError( - __('exception.get_data_failed') . ':' . $e->getMessage() - ); - } + return $this->extracted($id); } /** - * Show the form for editing the specified resource. + * @param string $id + * @return JsonResponse */ public function edit(string $id): JsonResponse { - try { - $data = [ - 'menu_list' => (new AdminMenuService())->getMenuTreeCacheList( - AdminRoleMenu::getMenuIdArr($id) - ), - 'item' => AdminRoles::query() - ->where('id', $id) - ->get() - ->toArray() - ]; - return $this->responseService->success($data); - } catch (Exception $e) { - return $this->responseService->systemError( - __('exception.get_data_failed') . ':' . $e->getMessage() - ); - } + return $this->extracted($id); } /** @@ -204,9 +171,7 @@ class RolesController extends Controller { try { $this->saveValidator($request->all(), $id); - $this->AdminRolesService->updateModel($request->all(), $id); - return $this->responseService->success( null, __('admin.update_succeeded') @@ -229,8 +194,8 @@ class RolesController extends Controller public function destroy(string $id): JsonResponse { try { + $this->validateId($id, AdminRoles::class); $this->AdminRolesService->deleteModel($id); - return $this->responseService->success( null, __('admin.delete_succeeded') @@ -243,4 +208,29 @@ class RolesController extends Controller ); } } + + /** + * @param string $id + * @return JsonResponse + */ + protected function extracted(string $id): JsonResponse + { + try { + $this->validateId($id, AdminRoles::class); + $data = [ + 'menu_list' => (new AdminMenuService())->getMenuTreeCacheList( + AdminRoleMenu::getMenuIdArr($id) + ), + 'item' => AdminRoles::query() + ->where('id', $id) + ->get() + ->toArray() + ]; + return $this->responseService->success($data); + } catch (Exception $e) { + return $this->responseService->systemError( + __('exception.get_data_failed') . ':' . $e->getMessage() + ); + } + } } diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index 18f6c4b..ad87b19 100644 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -3,7 +3,6 @@ namespace App\Http\Controllers\Admin; use App\Exceptions\CustomException; -use App\Http\Controllers\Controller; use App\Models\AdminRoles; use App\Models\AdminUsers; use App\Services\ApiResponseService; @@ -14,7 +13,7 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\Validator; use Illuminate\Validation\ValidationException; -class UserController extends Controller +class UserController extends BaseController { /** * @var ApiResponseService @@ -59,11 +58,7 @@ class UserController extends Controller $total = $query->count(); $items = $query->latest()->forPage($page, $perPage)->get()->each( function ($item) { - $item['status_str'] = $item['status'] ? __('admin.normal') - : __('admin.freeze'); - $item['role_name'] = $item->roles->value('name'); - unset($item['roles']); - return $item; + return $this->AdminUserModelService->optionItem($item); } ); @@ -89,9 +84,8 @@ class UserController extends Controller { try { $data = [ - 'roles_list' => [], - 'permissions_list' => [], - 'packing_list' => [] + 'roles_list' => AdminRoles::getRolesList(), + 'packing_list' => $this->getPackingList() ]; return $this->responseService->success($data); } catch (Exception $e) { @@ -101,6 +95,21 @@ class UserController extends Controller } } + protected function getPackingList(): array + { + return [ + [ + 'id' => 1, + 'name' => '停车场1' + ], + + [ + 'id' => 2, + 'name' => '停车场1' + ] + ]; + } + /** * @param Request $request * @return JsonResponse @@ -111,10 +120,11 @@ class UserController extends Controller { try { $this->saveValidator($request->all()); - - $model = $this->AdminUserModelService->createModel($request->all()); - - return $this->responseService->success($model, '创建用户成功'); + $this->AdminUserModelService->createModel($request->all()); + return $this->responseService->success( + null, + __('admin.save_succeeded') + ); } catch (ValidationException|CustomException $e) { throw $e; } catch (Exception $e) { @@ -138,6 +148,7 @@ class UserController extends Controller 'role_id' => 'required|numeric', 'packing_id' => 'required|numeric', 'password' => 'required|between:12,30', + 'email' => 'email' ]; $messages = [ 'username.required' => __('validation.admin_user.l_a_empty'), @@ -147,12 +158,13 @@ class UserController extends Controller 'packing_id.required' => __('validation.admin_user.s_p_empty'), 'password.required' => __('validation.admin_user.p_empty'), 'password.between' => __('validation.admin_user.p_between'), + 'email.email' => __('validation.admin_user.email'), ]; if ($id) { - $data['id'] = $id; - $rules['id'] = 'required|numeric'; - $messages['id.required'] = __('validation.admin_user.id_empty'); - $messages['id.numeric'] = __('validation.admin_user.id_numeric'); + $this->validateId($id, AdminUsers::class); + $rules['status'] = 'required|in:0,1'; + $messages['status.required'] = __('validation.admin_user.s_empty'); + $messages['status.in'] = __('validation.admin_user.s_in'); } $validator = Validator::make($data, $rules, $messages); @@ -167,8 +179,10 @@ class UserController extends Controller public function show(string $id): JsonResponse { try { + $this->validateId($id, AdminUsers::class); $model = AdminUsers::findOrFail($id); - return $this->responseService->success($model); + $item = $this->AdminUserModelService->optionItem($model); + return $this->responseService->success($item); } catch (Exception $e) { return $this->responseService->systemError( __('exception.get_data_failed') . ':' . $e->getMessage() @@ -182,12 +196,12 @@ class UserController extends Controller public function edit(string $id): JsonResponse { try { + $item = AdminUsers::findOrFail($id); + $item = $this->AdminUserModelService->optionItem($item, 1); $data = [ - 'item' => AdminUsers::query() - ->where('id', $id) - ->get() - ->toArray(), - 'roles' => AdminRoles::getRolesList() + 'item' => $item, + 'role_list' => AdminRoles::getRolesList(), + 'packing_list' => $this->getPackingList() ]; return $this->responseService->success($data); } catch (Exception $e) { @@ -213,7 +227,7 @@ class UserController extends Controller return $this->responseService->success( null, - __('controller.rule.update_success') + __('admin.update_succeeded') ); } catch (ValidationException|CustomException $e) { throw $e; @@ -234,8 +248,10 @@ class UserController extends Controller { try { $this->AdminUserModelService->deleteModel($id); - - return $this->responseService->success(null, '删除数据模型成功'); + return $this->responseService->success( + null, + __('admin.delete_succeeded') + ); } catch (CustomException $e) { throw $e; } catch (Exception $e) { diff --git a/app/Models/AdminRoleUsers.php b/app/Models/AdminRoleUsers.php index 50e0e9f..04f4df8 100644 --- a/app/Models/AdminRoleUsers.php +++ b/app/Models/AdminRoleUsers.php @@ -9,4 +9,11 @@ use Illuminate\Database\Eloquent\Model; class AdminRoleUsers extends Model { use HasFactory; + + protected $table = 'admin_role_users'; + + protected $fillable = [ + 'role_id', + 'user_id' + ]; } diff --git a/app/Models/AdminRoles.php b/app/Models/AdminRoles.php index f816c70..e610d63 100644 --- a/app/Models/AdminRoles.php +++ b/app/Models/AdminRoles.php @@ -20,8 +20,7 @@ class AdminRoles extends Model */ protected $fillable = [ - 'name', - 'slug' + 'name' ]; /** @@ -31,13 +30,15 @@ class AdminRoles extends Model protected $hidden = [ 'updated_at', - 'deleted_at' + 'deleted_at', ]; public static function getRolesList(): array { $where = ['status' => 1]; - return self::query()->where($where)->select()->get()->toArray(); + $columns = ['id', 'name']; + return self::query()->where($where)->select($columns)->get() + ->toArray(); } public function adminUsers(): BelongsToMany diff --git a/app/Models/AdminUsers.php b/app/Models/AdminUsers.php index 0b5641f..fc4243c 100644 --- a/app/Models/AdminUsers.php +++ b/app/Models/AdminUsers.php @@ -22,6 +22,9 @@ class AdminUsers extends Model 'username', 'name', 'password', + 'position', + 'status', + 'avatar' ]; /** @@ -32,6 +35,7 @@ class AdminUsers extends Model = [ 'password', 'remember_token', + 'locale', 'deleted_at', 'updated_at' ]; diff --git a/app/Services/AdminUsersService.php b/app/Services/AdminUsersService.php index 5eae1f8..f23646f 100644 --- a/app/Services/AdminUsersService.php +++ b/app/Services/AdminUsersService.php @@ -5,6 +5,8 @@ namespace App\Services; use App\Models\AdminRoleUsers; use App\Models\AdminUsers; use Exception; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Hash; @@ -26,38 +28,46 @@ final class AdminUsersService } /** + * @param array $data + * @return Builder|Model * @throws Exception */ - public function createModel(array $data): AdminUsers + public function createModel(array $data): Builder|Model { try { DB::beginTransaction(); - $model = AdminUsers::create([ + if (AdminUsers::query()->where('username', $data['username']) + ->exists() + ) { + throw new Exception(__('service.admin_user.name_exists')); + } + + $model = AdminUsers::query()->create([ 'username' => $data['username'], 'password' => Hash::make($data['password']), 'name' => $data['name'], 'avatar' => '', - 'email' => $data['email'], + 'email' => $data['email'] ?? '', + 'position' => $data['position'] ?? '', 'status' => 1, 'created_at' => get_datetime() ]); $user_id = $model->id; - // 角色id - $role_id = $data['role_id']; - $AdminRoleUsers = AdminRoleUsers::create([ - 'user_id' => $user_id, - 'role_id' => $role_id - ]); - // 职位id - $permission_id = $data['permission_id']; - // - $packing_id = $data['packing']; - $this->logService->logCreated($model, '创建用户'); + // 角色id + $AdminRoleUsers = AdminRoleUsers::query()->create([ + 'role_id' => $data['role_id'], + 'user_id' => $user_id, + 'created_at' => get_datetime() + ]); $this->logService->logCreated($AdminRoleUsers, '创建用户关联角色'); + // 停车场id + $packing_id = $data['packing_id']; + + DB::commit(); return $model; } catch (Exception $e) { DB::rollBack(); @@ -76,37 +86,50 @@ final class AdminUsersService try { DB::beginTransaction(); - if (AdminUsers::query()->where('username', $data['username'])->exists()) { - throw new Exception(__('service.admin_role.role_exists')); + $existsWhere = [ + ['username', '=', $data['username']], + ['id', '<>', $id] + ]; + if (AdminUsers::query()->where($existsWhere)->exists()) { + throw new Exception(__('service.admin_user.name_exists')); } $model = AdminUsers::findOrFail($id); + $oldValue = $model->toArray(); $model->update([ 'username' => $data['username'], 'password' => Hash::make($data['password']), 'name' => $data['name'], 'avatar' => '', - 'email' => $data['email'], + 'email' => $data['email'] ?? '', + 'position' => $data['position'] ?? '', 'status' => $data['status'], 'created_at' => get_datetime() ]); // 角色id $role_id = $data['role_id']; - $DelAdminRoleUsers = AdminRoleUsers::where('user_id', $id)->select(); - $DelAdminRoleUsers->delete(); - $AddAdminRoleUsers = AdminRoleUsers::create([ - 'user_id' => $id, - 'role_id' => $role_id - ]); - // 职位id - $permission_id = $data['permission_id']; + $oldAdminRoleUsers = AdminRoleUsers::query()->where('user_id', $id) + ->get()->toArray(); + $updateData = [ + 'role_id' => $role_id, + 'updated_at' => get_datetime() + ]; + AdminRoleUsers::query()->where('user_id', $id)->update($updateData); + $newAdminRoleUsers = $oldAdminRoleUsers; + $newAdminRoleUsers['role_id'] = $role_id; + $newAdminRoleUsers['updated_at'] = $updateData['updated_at']; + $this->logService->logUpdatedData( + new AdminRoleUsers(), + $oldAdminRoleUsers, + '更新用户关联角色', + $newAdminRoleUsers + ); // - $packing_id = $data['packing']; + $packing_id = $data['packing_id']; + $this->logService->logUpdated($model, $oldValue, '更新用户'); - $this->logService->logCreated($model, '创建用户'); - $this->logService->logDeleted($DelAdminRoleUsers, '删除用户关联角色'); - $this->logService->logCreated($AddAdminRoleUsers, '创建用户关联角色'); + DB::commit(); return $model; } catch (Exception $e) { DB::rollBack(); @@ -130,11 +153,16 @@ final class AdminUsersService $model->delete(); - $oldAdminRoleUser = AdminRoleUsers::where(['user_id' => $id])->select(); - - $this->logService->logDeleted($oldAdminRoleUser, '删除用户关联角色'); - - $oldAdminRoleUser->delete(); + // 删除用户关联角色 + $oldAdminRoleUser = AdminRoleUsers::query()->where( + ['user_id' => $id] + )->select()->get()->toArray(); + AdminRoleUsers::query()->where(['user_id' => $id])->delete(); + $this->logService->logDeletedData( + new AdminRoleUsers(), + '删除用户关联角色', + $oldAdminRoleUser + ); DB::commit(); return true; @@ -143,4 +171,23 @@ final class AdminUsersService throw $e; } } + + /** + * @param $item + * @param int $is_edit + * @return mixed + */ + public function optionItem($item, int $is_edit = 0): mixed + { + $item['status_str'] = $item['status'] ? __('admin.normal') + : __('admin.freeze'); + $item['role_name'] = $item->roles->value('name'); + $item['packing_name'] = ''; + if ($is_edit) { + $item['role_id'] = $item['roles'][0]['id']; + $item['packing_id'] = ''; + } + unset($item['roles']); + return $item; + } } diff --git a/app/Services/ApiResponseService.php b/app/Services/ApiResponseService.php index 5ffd197..7ef54af 100644 --- a/app/Services/ApiResponseService.php +++ b/app/Services/ApiResponseService.php @@ -8,13 +8,12 @@ final class ApiResponseService { /** * 成功响应 - * - * @param mixed $data - * @param string $message - * @param int $statusCode + * @param mixed|null $data + * @param string $message + * @param int $statusCode * @return JsonResponse */ - public function success($data = null, string $message = '', int $statusCode = 200): JsonResponse + public function success(mixed $data = null, string $message = '', int $statusCode = 200): JsonResponse { return response()->json([ 'error' => 0, @@ -22,7 +21,7 @@ final class ApiResponseService 'message' => $message, ], $statusCode); } - + /** * 错误响应 * @@ -39,7 +38,7 @@ final class ApiResponseService 'message' => $message, ], $statusCode); } - + /** * 系统错误响应 * @@ -51,7 +50,7 @@ final class ApiResponseService { return $this->error($message, 500, $statusCode); } - + /** * 未授权响应 * @@ -63,7 +62,7 @@ final class ApiResponseService { return $this->error($message, 401, $statusCode); } - + /** * 业务错误响应 * @@ -76,4 +75,4 @@ final class ApiResponseService { return $this->error($message, $errorCode, $statusCode); } -} \ No newline at end of file +} diff --git a/app/Services/OperationLogService.php b/app/Services/OperationLogService.php index 4c96987..2714033 100644 --- a/app/Services/OperationLogService.php +++ b/app/Services/OperationLogService.php @@ -105,6 +105,26 @@ final class OperationLogService ); } + /** + * 记录数据更新操作 + * + * @param Model $model 关联模型 + * @param array $oldValues 旧值 + * @param string $description 操作描述 + * @param array $data 数据 + * @return AdminOperationLog + */ + public function logUpdatedData(Model $model, array $oldValues, string $description = '更新记录', array $data = []): AdminOperationLog + { + return $this->log( + 'update', + $description, + $model, + $oldValues, + $data + ); + } + /** * 记录删除操作 * @@ -124,7 +144,7 @@ final class OperationLogService } /** - * 记录删除操作 + * 记录数据删除操作 * * @param Model $model 关联模型 * @param string $description 操作描述 diff --git a/database/migrations/2026_01_27_084640_create_admin_table.php b/database/migrations/2026_01_27_084640_create_admin_table.php index 311f087..ef04b62 100644 --- a/database/migrations/2026_01_27_084640_create_admin_table.php +++ b/database/migrations/2026_01_27_084640_create_admin_table.php @@ -17,10 +17,11 @@ return new class extends Migration $table->string('password', 60)->comment('密码'); $table->string('name')->comment('姓名'); $table->string('avatar')->nullable()->comment('头像'); - $table->string('email')->comment('电子邮箱'); + $table->string('email')->nullable()->comment('电子邮箱'); $table->string('remember_token', 100)->nullable()->comment('记住令牌'); $table->tinyInteger('status')->default(1)->comment('状态 0冻结 1正常'); $table->string('locale', 10)->nullable()->comment('语言'); + $table->string('position')->nullable()->comment('职位'); $table->softDeletes(); $table->timestamps(); $table->innoDb(); diff --git a/resources/lang/en/admin.php b/resources/lang/en/admin.php index f4b56af..5217e19 100644 --- a/resources/lang/en/admin.php +++ b/resources/lang/en/admin.php @@ -54,6 +54,7 @@ return [ 'save_succeeded' => 'Save succeeded !', 'refresh_succeeded' => 'Refresh succeeded !', 'login_successful' => 'Login successful', + 'logout_successful' => 'Logout successful', 'choose' => 'Choose', 'choose_file' => 'Select file', 'choose_image' => 'Select image', @@ -104,4 +105,6 @@ return [ 'prev' => 'Prev', 'next' => 'Next', 'quick_create' => 'Quick create', + 'freeze' => 'freeze', + 'normal' => 'normal' ]; diff --git a/resources/lang/zh-CN/admin.php b/resources/lang/zh-CN/admin.php index a5bf82a..2da0d43 100644 --- a/resources/lang/zh-CN/admin.php +++ b/resources/lang/zh-CN/admin.php @@ -54,6 +54,7 @@ return [ 'save_succeeded' => '保存成功 !', 'refresh_succeeded' => '刷新成功 !', 'login_successful' => '登录成功 !', + 'logout_successful' => '登出成功 !', 'choose' => '选择', 'choose_file' => '选择文件', 'choose_image' => '选择图片', @@ -102,5 +103,7 @@ return [ 'menu_titles' => [], 'prev' => '上一步', 'next' => '下一步', - 'quick_create' => '快速创建' + 'quick_create' => '快速创建', + 'freeze' => '冻结', + 'normal' => '正常' ]; diff --git a/resources/lang/zh-TW/admin.php b/resources/lang/zh-TW/admin.php index 6380da6..ffcd271 100644 --- a/resources/lang/zh-TW/admin.php +++ b/resources/lang/zh-TW/admin.php @@ -54,6 +54,7 @@ return [ 'save_succeeded' => '儲存成功!', 'refresh_succeeded' => '成功重新整理!', 'login_successful' => '成功登入!', + 'logout_successful' => '成功登出!', 'choose' => '選擇', 'choose_file' => '選擇檔案', 'choose_image' => '選擇圖片', @@ -102,4 +103,6 @@ return [ 'prev' => '上一步', 'next' => '下一步', 'quick_create' => '快速創建', + 'freeze' => '凍結', + 'normal' => '正常' ];