Browse Source

通道管理权限

master
wanghongjun 2 weeks ago
parent
commit
4f686170b6
  1. 238
      app/Http/Controllers/Admin/ChannelPermissionsController.php
  2. 34
      app/Models/AdminChannelRole.php
  3. 56
      app/Models/ParkingChannel.php
  4. 141
      app/Services/AdminChannelRoleService.php
  5. 34
      database/migrations/2026_06_03_143449_create_admin_channel_role_table.php
  6. 5
      database/seeders/AdminMenuSeeder.php
  7. 5
      resources/lang/en/log.php
  8. 3
      resources/lang/en/service.php
  9. 5
      resources/lang/en/validation.php
  10. 5
      resources/lang/zh-CN/log.php
  11. 3
      resources/lang/zh-CN/service.php
  12. 5
      resources/lang/zh-CN/validation.php
  13. 5
      resources/lang/zh-TW/log.php
  14. 3
      resources/lang/zh-TW/service.php
  15. 5
      resources/lang/zh-TW/validation.php
  16. 9
      routes/admin/api.php

238
app/Http/Controllers/Admin/ChannelPermissionsController.php

@ -0,0 +1,238 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Exceptions\CustomException;
use App\Models\AdminChannelRole;
use App\Models\ParkingChannel;
use App\Services\AdminChannelRoleService;
use App\Services\AdminTranslationService;
use App\Services\ApiResponseService;
use App\Services\ParkingAdminUserService;
use Exception;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\ValidationException;
class ChannelPermissionsController extends BaseController
{
protected string $menuUri = 'channelPermissions';
/**
* @var AdminChannelRoleService
*/
protected AdminChannelRoleService $service;
/**
* 构造函数
* @param ApiResponseService $responseService
* @param AdminChannelRoleService $service
*/
public function __construct(
ApiResponseService $responseService,
AdminChannelRoleService $service
) {
parent::__construct($responseService);
$this->service = $service;
}
/**
* @param Request $request
* @return JsonResponse
*/
public function index(Request $request): JsonResponse
{
try {
$query = AdminChannelRole::query();
$memberTypeArr = ParkingAdminUserService::$memberType;
$statusArr = AdminChannelRoleService::getStatus();
// 分页
$page = $request->input('page', 1);
$perPage = $request->input('per_page', 10);
$total = $query->count();
$items = $query->latest()->forPage($page, $perPage)->get()->each(
function ($item) use ($memberTypeArr, $statusArr) {
$item['channel_list'] = ParkingChannel::getChannelData(
$item['channel_ids']
);
$item['member_type_str']
= $memberTypeArr[$item['member_type']];
$item['status_str'] = $statusArr[$item['status']];
return $item;
}
);
return $this->responseService->success([
'items' => $items,
'total' => $total,
'page' => $page,
'per_page' => $perPage,
'last_page' => ceil($total / $perPage),
]);
} catch (Exception $e) {
$m_prefix = __('exception.exception_handler.resource');
return $this->responseService->systemError(
$m_prefix . ':' . $e->getMessage()
);
}
}
/**
* @return JsonResponse
*/
public function create(): JsonResponse
{
try {
$data = [
'member_type_list' => get_select_data(
ParkingAdminUserService::$memberType
),
'channel_list' => ParkingChannel::getData(),
'status_list' => get_select_data(
AdminChannelRoleService::getStatus()
)
];
return $this->responseService->success($data);
} catch (Exception $e) {
return $this->responseService->systemError(
__('exception.get_data_failed') . ':' . $e->getMessage()
);
}
}
/**
* @param Request $request
* @return JsonResponse
* @throws CustomException
* @throws ValidationException
*/
public function store(Request $request): JsonResponse
{
try {
$this->saveValidator($request->all());
$this->service->createModel($request->all());
return $this->responseService->success(
null,
__('admin.save_succeeded')
);
} catch (ValidationException|CustomException $e) {
throw $e;
} catch (Exception $e) {
return $this->responseService->systemError(
__('admin.operation_failed') . ':'
. $e->getMessage()
);
}
}
/**
* @param array $data
* @param int $id
* @return void
* @throws ValidationException
*/
protected function saveValidator(array $data, int $id = 0): void
{
$rules = [
'member_type' => 'required',
'channel_ids' => 'required|array'
];
$messages = [
'member_type.required' => __(
'validation.channel_permissions.m_empty'
),
'channel_ids.required' => __(
'validation.channel_permissions.c_empty'
),
'channel_ids.array' => __(
'validation.channel_permissions.c_array'
)
];
if ($id) {
$this->validateId($id, AdminChannelRole::class);
}
$validator = Validator::make($data, $rules, $messages);
if ($validator->fails()) {
throw new ValidationException($validator);
}
}
/**
* @param string $id
* @return JsonResponse
*/
public function edit(string $id): JsonResponse
{
try {
$this->validateId($id, AdminChannelRole::class);
$data = [
'member_type_list' => get_select_data(
ParkingAdminUserService::$memberType
),
'channel_list' => ParkingChannel::getData(),
'status_list' => get_select_data(
AdminChannelRoleService::getStatus()
),
'item' => AdminChannelRole::query()->find($id)
];
return $this->responseService->success($data);
} catch (Exception $e) {
return $this->responseService->systemError(
__('exception.get_data_failed') . ':' . $e->getMessage()
);
}
}
/**
* @param Request $request
* @param string $id
* @return JsonResponse
* @throws CustomException
* @throws ValidationException
*/
public function update(Request $request, string $id): JsonResponse
{
try {
$this->saveValidator($request->all(), $id);
$this->service->updateModel($request->all(), $id);
return $this->responseService->success(
null,
__('admin.update_succeeded')
);
} catch (ValidationException|CustomException $e) {
throw $e;
} catch (Exception $e) {
return $this->responseService->systemError(
__('admin.operation_failed') . ':'
. $e->getMessage()
);
}
}
/**
* @param string $id
* @return JsonResponse
* @throws CustomException
* @throws ValidationException
*/
public function destroy(string $id): JsonResponse
{
try {
$this->validateId($id, AdminChannelRole::class);
$this->service->deleteModel($id);
return $this->responseService->success(
null,
__('admin.delete_succeeded')
);
} catch (ValidationException|CustomException $e) {
throw $e;
} catch (Exception $e) {
return $this->responseService->systemError(
__('admin.operation_failed') . ':'
. $e->getMessage()
);
}
}
}

34
app/Models/AdminChannelRole.php

@ -0,0 +1,34 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class AdminChannelRole extends Model
{
use HasFactory, SoftDeletes;
protected $table = 'admin_channel_role';
protected $fillable
= [
'member_type',
'status',
'describe',
'channel_ids'
];
protected $hidden
= [
'created_at',
'updated_at',
'deleted_at'
];
public function getChannelIdsAttribute($value): array
{
return $value ? explode(',', $value) : [];
}
}

56
app/Models/ParkingChannel.php

@ -2,6 +2,7 @@
namespace App\Models;
use App\Services\AdminTranslationService;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
@ -12,19 +13,48 @@ class ParkingChannel extends Model
protected $table = 'parking_channel';
protected $fillable = [
'name',
'type',
'position',
'parking_id',
'guard_booth_id',
'third_party_channel'
];
protected $hidden = [
'updated_at',
'deleted_at'
];
protected $fillable
= [
'name',
'type',
'position',
'parking_id',
'guard_booth_id',
'third_party_channel'
];
protected $hidden
= [
'updated_at',
'deleted_at'
];
public static function getData()
{
return self::query()->select(['id', 'name'])->get()->each(function ($item) {
$item['name'] = AdminTranslationService::getTranslationTypeName(
$item['id'],
6,
$item['name']
);
return $item;
});
}
public static function getChannelData($ids)
{
return self::query()->whereIn('id', $ids)->select(
['id', 'name']
)->get()->each(function ($item) {
$item['name'] = AdminTranslationService::getTranslationTypeName(
$item['id'],
6,
$item['name']
);
return $item;
});
}
public function getCreatedAtAttribute($value): string
{

141
app/Services/AdminChannelRoleService.php

@ -0,0 +1,141 @@
<?php
namespace App\Services;
use App\Models\AdminChannelRole;
use Exception;
use Illuminate\Support\Facades\DB;
class AdminChannelRoleService extends BaseService
{
protected string $menuTitle = 'channel_permissions';
private static array $statusArr = ['disabled', 'enable'];
/**
* @return array|string[]
*/
public static function getStatus(): array
{
$statusArr = self::$statusArr;
foreach ($statusArr as $key => $value) {
$statusArr[$key] = __('admin.' . $value);
}
return $statusArr;
}
/**
* @param array $data
* @throws Exception
*/
public function createModel(array $data)
{
try {
DB::beginTransaction();
$existsWhere = [
['member_type', '=', $data['member_type']]
];
if (AdminChannelRole::query()->where($existsWhere)->exists()
) {
throw new Exception(
__('service.' . $this->menuTitle . '.type_exists')
);
}
$channel_ids = implode(',', $data['channel_ids']);
$model = AdminChannelRole::query()->create([
'member_type' => $data['member_type'],
'status' => $data['status'] ?? 1,
'describe' => $data['describe'] ?? '',
'channel_ids' => $channel_ids ?? '',
'created_at' => get_datetime()
]);
$this->logService->logCreated(
$model,
$this->menuTitle . '.create'
);
DB::commit();
return $model;
} catch (Exception $e) {
DB::rollBack();
throw $e;
}
}
/**
* @param array $data
* @param int $id
* @throws Exception
*/
public function updateModel(array $data, int $id)
{
try {
DB::beginTransaction();
// 验证
$existsWhere = [
['member_type', '=', $data['member_type']],
['id', '<>', $id]
];
if (AdminChannelRole::query()->where($existsWhere)->exists()
) {
throw new Exception(
__('service.' . $this->menuTitle . '.reason_exists')
);
}
// 更新
$model = AdminChannelRole::query()->findOrFail($id);
$oldValues = $model->toArray();
$channel_ids = implode(',', $data['channel_ids']);
$model->update([
'member_type' => $data['member_type'],
'status' => $data['status'] ?? 1,
'describe' => $data['describe'] ?? '',
'channel_ids' => $channel_ids ?? '',
'updated_at' => get_datetime()
]);
$this->logService->logUpdated(
$model,
$oldValues,
$this->menuTitle . '.update'
);
DB::commit();
return $model;
} catch (Exception $e) {
DB::rollBack();
throw $e;
}
}
/**
* @param $id
* @return bool
* @throws Exception
*/
public function deleteModel($id): bool
{
try {
DB::beginTransaction();
$model = AdminChannelRole::query()->findOrFail($id);
$this->logService->logDeleted($model, $this->menuTitle . '.delete');
$model->delete();
DB::commit();
return true;
} catch (Exception $e) {
DB::rollBack();
throw $e;
}
}
}

34
database/migrations/2026_06_03_143449_create_admin_channel_role_table.php

@ -0,0 +1,34 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('admin_channel_role', function (Blueprint $table) {
$table->id();
$table->tinyInteger('member_type')->default(1)->comment('会员类型');
$table->tinyInteger('status')->default(1)->comment('状态');
$table->string('describe', 255)->default('')->comment('描述');
$table->text('channel_ids')->comment('允许通道');
$table->timestamps();
$table->softDeletes();
$table->innoDb();
$table->comment('通道权限');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('admin_channel_role');
}
};

5
database/seeders/AdminMenuSeeder.php

@ -522,7 +522,10 @@ class AdminMenuSeeder extends Seeder
'uri' => 'channelPermissions',
'page_uri' => '/user/channelPermissions',
'child' => [
'read_only' => 'channelPermissions.index'
'read_only' => 'channelPermissions.index',
'add' => 'channelPermissions.store',
'edit' => 'channelPermissions.update',
'delete' => 'channelPermissions.destroy'
]
]
]

5
resources/lang/en/log.php

@ -116,5 +116,10 @@ return [
'create' => 'Create exit reason',
'update' => 'Update the reason for departure',
'delete' => 'Delete exit reason'
],
'channel_permissions' => [
'create' => 'Create channel permissions',
'update' => 'Update channel permissions',
'delete' => 'Delete channel permissions'
]
];

3
resources/lang/en/service.php

@ -110,5 +110,8 @@ return [
],
'departure_management' => [
'reason_exists' => 'Reason for departure already exists'
],
'channel_permissions' => [
'type_exists' => 'Channel membership type already exists'
]
];

5
resources/lang/en/validation.php

@ -149,5 +149,10 @@ return [
],
'departure_management' => [
'n_empty' => 'Reason for departure cannot be empty',
],
'channel_permissions' => [
'm_empty' => 'Member type cannot be empty',
'c_empty' => 'Allow channel not to be empty',
'c_array' => 'Allow channel data to be an array'
]
];

5
resources/lang/zh-CN/log.php

@ -116,5 +116,10 @@ return [
'create' => '创建离场原因',
'update' => '更新离场原因',
'delete' => '删除离场原因'
],
'channel_permissions' => [
'create' => '创建通道权限',
'update' => '更新通道权限',
'delete' => '删除通道权限'
]
];

3
resources/lang/zh-CN/service.php

@ -110,5 +110,8 @@ return [
],
'departure_management' => [
'reason_exists' => '离场原因已存在'
],
'channel_permissions' => [
'type_exists' => '通道会员类型已存在'
]
];

5
resources/lang/zh-CN/validation.php

@ -149,5 +149,10 @@ return [
],
'departure_management' => [
'n_empty' => '离场原因不能为空',
],
'channel_permissions' => [
'm_empty' => '会员类型不能为空',
'c_empty' => '允许通道不能为空',
'c_array' => '允许通道数据必须是数组'
]
];

5
resources/lang/zh-TW/log.php

@ -116,5 +116,10 @@ return [
'create' => '創建離場原因',
'update' => '更新離場原因',
'delete' => '删除離場原因'
],
'channel_permissions' => [
'create' => '創建通道許可權',
'update' => '更新通道許可權',
'delete' => '删除通道許可權'
]
];

3
resources/lang/zh-TW/service.php

@ -110,5 +110,8 @@ return [
],
'departure_management' => [
'reason_exists' => '離場原因已存在'
],
'channel_permissions' => [
'type_exists' => '通道會員類型已存在'
]
];

5
resources/lang/zh-TW/validation.php

@ -149,5 +149,10 @@ return [
],
'departure_management' => [
'n_empty' => '離場原因不能為空',
],
'channel_permissions' => [
'm_empty' => '會員類型不能為空',
'c_empty' => '允許通道不能為空',
'c_array' => '允許通道數據必須是數組'
]
];

9
routes/admin/api.php

@ -34,6 +34,7 @@ use App\Http\Controllers\Admin\RegionalManagementController;
use App\Http\Controllers\Admin\ParkingChannelController;
use App\Http\Controllers\Admin\GuardBoothManagementController;
use App\Http\Controllers\Admin\ParkingDepartureReasonController;
use App\Http\Controllers\Admin\ChannelPermissionsController;
Route::group(['prefix' => 'admin'], function () {
@ -282,6 +283,14 @@ Route::group(['prefix' => 'admin'], function () {
Route::put('/users/{id}', [UserController::class, 'update']);
Route::delete('/users/{id}', [UserController::class, 'destroy']);
Route::get('/users/rule', [UserController::class, 'rule']);
// 通道权限管理
Route::get('/channelPermissions', [ChannelPermissionsController::class, 'index']);
Route::get('/channelPermissions/create', [ChannelPermissionsController::class, 'create']);
Route::post('/channelPermissions', [ChannelPermissionsController::class, 'store']);
Route::get('/channelPermissions/edit/{id}', [ChannelPermissionsController::class, 'edit']);
Route::put('/channelPermissions/{id}', [ChannelPermissionsController::class, 'update']);
Route::delete('/channelPermissions/{id}', [ChannelPermissionsController::class, 'destroy']);
Route::get('/channelPermissions/rule', [ChannelPermissionsController::class, 'rule']);
});
// 导出
Route::get('/vipList/import_template', [VipListController::class, 'importTemplate']);

Loading…
Cancel
Save