1.将部门修改为渠道,并且所有dice_表关联渠道表
2.将所有配置表,记录表设置关联渠道 3.优化后台页面设置
This commit is contained in:
@@ -14,7 +14,7 @@ use support\Request;
|
||||
use support\Response;
|
||||
|
||||
/**
|
||||
* 部门控制器
|
||||
* 渠道控制器
|
||||
*/
|
||||
class SystemDeptController extends BaseController
|
||||
{
|
||||
@@ -33,7 +33,7 @@ class SystemDeptController extends BaseController
|
||||
* @param Request $request
|
||||
* @return Response
|
||||
*/
|
||||
#[Permission('部门数据列表', 'core:dept:index')]
|
||||
#[Permission('渠道数据列表', 'core:dept:index')]
|
||||
public function index(Request $request) : Response
|
||||
{
|
||||
$where = $request->more([
|
||||
@@ -50,7 +50,7 @@ class SystemDeptController extends BaseController
|
||||
* @param Request $request
|
||||
* @return Response
|
||||
*/
|
||||
#[Permission('部门数据读取', 'core:dept:read')]
|
||||
#[Permission('渠道数据读取', 'core:dept:read')]
|
||||
public function read(Request $request) : Response
|
||||
{
|
||||
$id = $request->input('id', '');
|
||||
@@ -68,7 +68,7 @@ class SystemDeptController extends BaseController
|
||||
* @param Request $request
|
||||
* @return Response
|
||||
*/
|
||||
#[Permission('部门数据添加', 'core:dept:save')]
|
||||
#[Permission('渠道数据添加', 'core:dept:save')]
|
||||
public function save(Request $request): Response
|
||||
{
|
||||
$data = $request->post();
|
||||
@@ -86,7 +86,7 @@ class SystemDeptController extends BaseController
|
||||
* @param Request $request
|
||||
* @return Response
|
||||
*/
|
||||
#[Permission('部门数据修改','core:dept:update')]
|
||||
#[Permission('渠道数据修改','core:dept:update')]
|
||||
public function update(Request $request): Response
|
||||
{
|
||||
$data = $request->post();
|
||||
@@ -104,23 +104,58 @@ class SystemDeptController extends BaseController
|
||||
* @param Request $request
|
||||
* @return Response
|
||||
*/
|
||||
#[Permission('部门数据删除','core:dept:destroy')]
|
||||
#[Permission('渠道数据删除','core:dept:destroy')]
|
||||
public function destroy(Request $request) : Response
|
||||
{
|
||||
$ids = $request->post('ids', '');
|
||||
if (empty($ids)) {
|
||||
return $this->fail('please select data to delete');
|
||||
}
|
||||
$deleteTables = $request->post('delete_tables', []);
|
||||
if (!is_array($deleteTables)) {
|
||||
$deleteTables = [];
|
||||
}
|
||||
$idList = is_array($ids) ? $ids : explode(',', (string) $ids);
|
||||
if (!empty($deleteTables)) {
|
||||
foreach ($idList as $deptId) {
|
||||
$this->logic->destroyWithRelations((int) $deptId, $deleteTables);
|
||||
}
|
||||
return $this->success('delete success');
|
||||
}
|
||||
$result = $this->logic->destroy($ids);
|
||||
if ($result) {
|
||||
return $this->success('delete success');
|
||||
} else {
|
||||
return $this->fail('delete failed');
|
||||
}
|
||||
return $this->fail('delete failed');
|
||||
}
|
||||
|
||||
/**
|
||||
* 可操作部门
|
||||
* 删除渠道前关联数据预览
|
||||
*/
|
||||
#[Permission('渠道数据删除', 'core:dept:destroy')]
|
||||
public function destroyPreview(Request $request): Response
|
||||
{
|
||||
$ids = $request->input('ids', '');
|
||||
if ($ids === '' || $ids === null) {
|
||||
return $this->fail('please select data');
|
||||
}
|
||||
$idList = is_array($ids) ? $ids : explode(',', (string) $ids);
|
||||
$data = $this->logic->getDestroyPreview($idList);
|
||||
return $this->success($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 为所有渠道补齐默认配置
|
||||
*/
|
||||
#[Permission('渠道数据修改', 'core:dept:update')]
|
||||
public function syncChannelConfigs(Request $request): Response
|
||||
{
|
||||
$data = $this->logic->syncAllChannelConfigs();
|
||||
return $this->success($data, 'sync success');
|
||||
}
|
||||
|
||||
/**
|
||||
* 可操作渠道
|
||||
* @param Request $request
|
||||
* @return Response
|
||||
*/
|
||||
|
||||
@@ -6,10 +6,8 @@
|
||||
// +----------------------------------------------------------------------
|
||||
namespace plugin\saiadmin\app\controller\system;
|
||||
|
||||
use plugin\saiadmin\app\model\system\SystemUserRole;
|
||||
use app\dice\helper\AdminScopeHelper;
|
||||
use plugin\saiadmin\basic\BaseController;
|
||||
use plugin\saiadmin\app\cache\UserInfoCache;
|
||||
use plugin\saiadmin\app\model\system\SystemUser;
|
||||
use plugin\saiadmin\app\validate\system\SystemRoleValidate;
|
||||
use plugin\saiadmin\app\logic\system\SystemRoleLogic;
|
||||
use plugin\saiadmin\service\Permission;
|
||||
@@ -17,13 +15,10 @@ use support\Request;
|
||||
use support\Response;
|
||||
|
||||
/**
|
||||
* 角色控制器
|
||||
* 角色控制器(按渠道隔离)
|
||||
*/
|
||||
class SystemRoleController extends BaseController
|
||||
{
|
||||
/**
|
||||
* 构造
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->logic = new SystemRoleLogic();
|
||||
@@ -31,11 +26,6 @@ class SystemRoleController extends BaseController
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据列表
|
||||
* @param Request $request
|
||||
* @return Response
|
||||
*/
|
||||
#[Permission('角色数据列表', 'core:role:index')]
|
||||
public function index(Request $request): Response
|
||||
{
|
||||
@@ -44,19 +34,14 @@ class SystemRoleController extends BaseController
|
||||
['code', ''],
|
||||
['status', ''],
|
||||
]);
|
||||
$query = $this->logic->search($where);
|
||||
$levelArr = array_column($this->adminInfo['roleList'], 'level');
|
||||
$maxLevel = max($levelArr);
|
||||
$query->where('level', '<', $maxLevel);
|
||||
$data = $this->logic->getList($query);
|
||||
$requestDeptId = AdminScopeHelper::pickRequestDeptId(
|
||||
$request->input('dept_id'),
|
||||
$request->all()
|
||||
);
|
||||
$data = $this->logic->indexList($where, $requestDeptId);
|
||||
return $this->success($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 读取数据
|
||||
* @param Request $request
|
||||
* @return Response
|
||||
*/
|
||||
#[Permission('角色数据读取', 'core:role:read')]
|
||||
public function read(Request $request): Response
|
||||
{
|
||||
@@ -64,53 +49,49 @@ class SystemRoleController extends BaseController
|
||||
$model = $this->logic->read($id);
|
||||
if ($model) {
|
||||
$data = is_array($model) ? $model : $model->toArray();
|
||||
$role = $this->logic->model->find($id);
|
||||
if ($role) {
|
||||
$this->logic->assertRoleWritable($role);
|
||||
}
|
||||
return $this->success($data);
|
||||
} else {
|
||||
return $this->fail('not found');
|
||||
}
|
||||
return $this->fail('not found');
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存数据
|
||||
* @param Request $request
|
||||
* @return Response
|
||||
*/
|
||||
#[Permission('角色数据添加', 'core:role:save')]
|
||||
public function save(Request $request): Response
|
||||
{
|
||||
$data = $request->post();
|
||||
$data['dept_id'] = $this->logic->resolveRequestDeptId(
|
||||
AdminScopeHelper::pickRequestDeptId($data['dept_id'] ?? null, $data)
|
||||
);
|
||||
$this->validate('save', $data);
|
||||
$result = $this->logic->add($data);
|
||||
if ($result) {
|
||||
return $this->success('add success');
|
||||
} else {
|
||||
return $this->fail('add failed');
|
||||
}
|
||||
return $this->fail('add failed');
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新数据
|
||||
* @param Request $request
|
||||
* @return Response
|
||||
*/
|
||||
#[Permission('角色数据修改', 'core:role:update')]
|
||||
public function update(Request $request): Response
|
||||
{
|
||||
$data = $request->post();
|
||||
$role = $this->logic->model->find($data['id'] ?? 0);
|
||||
if ($role) {
|
||||
$this->logic->assertRoleWritable($role);
|
||||
if (!isset($data['dept_id']) || $data['dept_id'] === '' || $data['dept_id'] === null) {
|
||||
$data['dept_id'] = $role->dept_id;
|
||||
}
|
||||
}
|
||||
$this->validate('update', $data);
|
||||
$result = $this->logic->edit($data['id'], $data);
|
||||
if ($result) {
|
||||
return $this->success('update success');
|
||||
} else {
|
||||
return $this->fail('update failed');
|
||||
}
|
||||
return $this->fail('update failed');
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
* @param Request $request
|
||||
* @return Response
|
||||
*/
|
||||
#[Permission('角色数据删除', 'core:role:destroy')]
|
||||
public function destroy(Request $request): Response
|
||||
{
|
||||
@@ -121,16 +102,10 @@ class SystemRoleController extends BaseController
|
||||
$result = $this->logic->destroy($ids);
|
||||
if ($result) {
|
||||
return $this->success('delete success');
|
||||
} else {
|
||||
return $this->fail('delete failed');
|
||||
}
|
||||
return $this->fail('delete failed');
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据角色获取菜单
|
||||
* @param Request $request
|
||||
* @return Response
|
||||
*/
|
||||
#[Permission('角色数据列表', 'core:role:index')]
|
||||
public function getMenuByRole(Request $request): Response
|
||||
{
|
||||
@@ -139,11 +114,6 @@ class SystemRoleController extends BaseController
|
||||
return $this->success($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 菜单权限
|
||||
* @param Request $request
|
||||
* @return Response
|
||||
*/
|
||||
#[Permission('角色菜单权限', 'core:role:menu')]
|
||||
public function menuPermission(Request $request): Response
|
||||
{
|
||||
@@ -153,16 +123,14 @@ class SystemRoleController extends BaseController
|
||||
return $this->success('operation success');
|
||||
}
|
||||
|
||||
/**
|
||||
* 可操作角色
|
||||
* @param Request $request
|
||||
* @return Response
|
||||
*/
|
||||
public function accessRole(Request $request): Response
|
||||
{
|
||||
$where = ['status' => 1];
|
||||
$data = $this->logic->accessRole($where);
|
||||
$requestDeptId = AdminScopeHelper::pickRequestDeptId(
|
||||
$request->input('dept_id'),
|
||||
$request->all()
|
||||
);
|
||||
$data = $this->logic->accessRole($where, $requestDeptId);
|
||||
return $this->success($data);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -2,129 +2,123 @@
|
||||
// +----------------------------------------------------------------------
|
||||
// | saiadmin [ saiadmin快速开发框架 ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: sai <1430792918@qq.com>
|
||||
// +----------------------------------------------------------------------
|
||||
namespace plugin\saiadmin\app\logic\system;
|
||||
|
||||
use app\dice\service\DiceChannelConfigService;
|
||||
use plugin\saiadmin\app\service\SystemRoleChannelService;
|
||||
use plugin\saiadmin\basic\think\BaseLogic;
|
||||
use plugin\saiadmin\exception\ApiException;
|
||||
use plugin\saiadmin\app\model\system\SystemDept;
|
||||
use plugin\saiadmin\app\model\system\SystemUser;
|
||||
use plugin\saiadmin\utils\Helper;
|
||||
use plugin\saiadmin\utils\Arr;
|
||||
|
||||
/**
|
||||
* 部门逻辑层
|
||||
* 渠道逻辑层(表 sa_system_dept)
|
||||
*/
|
||||
class SystemDeptLogic extends BaseLogic
|
||||
{
|
||||
/**
|
||||
* 构造函数
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->model = new SystemDept();
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加数据
|
||||
*/
|
||||
public function add($data): mixed
|
||||
{
|
||||
$data = $this->handleData($data);
|
||||
$this->model->save($data);
|
||||
return $this->model->getKey();
|
||||
$deptId = (int) $this->model->getKey();
|
||||
if ($deptId > 0) {
|
||||
(new DiceChannelConfigService())->copyDefaultConfigToDept($deptId);
|
||||
(new SystemRoleChannelService())->copyDefaultRolesToDept($deptId, false);
|
||||
}
|
||||
return $deptId;
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改数据
|
||||
*/
|
||||
public function edit($id, $data): mixed
|
||||
{
|
||||
$oldLevel = $data['level'] . $id . ',';
|
||||
$data = $this->handleData($data);
|
||||
if ($data['parent_id'] == $id) {
|
||||
throw new ApiException('Parent department cannot be the same as current department');
|
||||
}
|
||||
if (in_array($id, explode(',', $data['level']))) {
|
||||
throw new ApiException('Cannot set parent department to a child of current department');
|
||||
}
|
||||
$newLevel = $data['level'] . $id . ',';
|
||||
$deptIds = $this->model->where('level', 'like', $oldLevel . '%')->column('id');
|
||||
|
||||
return $this->transaction(function () use ($deptIds, $oldLevel, $newLevel, $data, $id) {
|
||||
$this->model->whereIn('id', $deptIds)->exp('level', "REPLACE(level, '$oldLevel', '$newLevel')")->update([]);
|
||||
return $this->model->update($data, ['id' => $id]);
|
||||
});
|
||||
return $this->model->update($data, ['id' => $id]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据删除
|
||||
*/
|
||||
public function destroy($ids): bool
|
||||
{
|
||||
$num = $this->model->where('parent_id', 'in', $ids)->count();
|
||||
if ($num > 0) {
|
||||
throw new ApiException('This department has sub-departments, please delete them first');
|
||||
} else {
|
||||
$count = SystemUser::where('dept_id', 'in', $ids)->count();
|
||||
if ($count > 0) {
|
||||
throw new ApiException('This department has users, please delete or transfer them first');
|
||||
}
|
||||
return $this->model->destroy($ids);
|
||||
$count = SystemUser::where('dept_id', 'in', $ids)->count();
|
||||
if ($count > 0) {
|
||||
throw new ApiException('This channel has users, please delete or transfer them first');
|
||||
}
|
||||
return $this->model->destroy($ids);
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据处理
|
||||
* 带关联选项删除渠道
|
||||
*/
|
||||
public function destroyWithRelations(int $deptId, array $deleteTables): bool
|
||||
{
|
||||
(new SystemRoleChannelService())->deleteRolesByDept($deptId);
|
||||
(new DiceChannelConfigService())->destroyDeptWithRelations($deptId, $deleteTables);
|
||||
return true;
|
||||
}
|
||||
|
||||
public function getDestroyPreview(array $deptIds): array
|
||||
{
|
||||
return (new DiceChannelConfigService())->getDestroyPreview($deptIds);
|
||||
}
|
||||
|
||||
public function syncAllChannelConfigs(): array
|
||||
{
|
||||
$config = (new DiceChannelConfigService())->syncAllChannelsFromDefault();
|
||||
$roles = (new SystemRoleChannelService())->syncAllChannelsFromDefault();
|
||||
return ['config' => $config, 'roles' => $roles];
|
||||
}
|
||||
|
||||
protected function handleData($data)
|
||||
{
|
||||
// 处理上级部门
|
||||
if (empty($data['parent_id']) || $data['parent_id'] == 0) {
|
||||
$data['level'] = '0';
|
||||
$data['parent_id'] = 0;
|
||||
} else {
|
||||
$parentMenu = SystemDept::findOrEmpty($data['parent_id']);
|
||||
$data['level'] = $parentMenu['level'] . $parentMenu['id'] . ',';
|
||||
}
|
||||
$data['level'] = '0';
|
||||
$data['parent_id'] = 0;
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据树形化
|
||||
* @param array $where
|
||||
* @return array
|
||||
*/
|
||||
public function tree(array $where = []): array
|
||||
{
|
||||
$query = $this->search($where);
|
||||
$request = request();
|
||||
if ($request && $request->input('tree', 'false') === 'true') {
|
||||
$query->field('id, id as value, name as label, parent_id');
|
||||
}
|
||||
$query->order('sort', 'desc');
|
||||
$query->with(['leader']);
|
||||
$data = $this->getAll($query);
|
||||
return Helper::makeTree($data);
|
||||
return $this->getAll($query);
|
||||
}
|
||||
|
||||
/**
|
||||
* 可操作部门
|
||||
* @param array $where
|
||||
* @return array
|
||||
*/
|
||||
public function accessDept(array $where = []): array
|
||||
{
|
||||
$query = $this->search($where);
|
||||
// 超级管理员(id=1)可查看全部部门,普通管理员按部门权限过滤
|
||||
if (isset($this->adminInfo['id']) && $this->adminInfo['id'] > 1) {
|
||||
$query->auth($this->adminInfo['deptList'] ?? []);
|
||||
$deptId = $this->resolveAccessibleDeptId();
|
||||
if ($deptId > 0) {
|
||||
$query->where('id', $deptId);
|
||||
} else {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
$query->field('id, id as value, name as label, parent_id');
|
||||
$query->field('id, id as value, name as label');
|
||||
$query->order('sort', 'desc');
|
||||
$data = $this->getAll($query);
|
||||
return Helper::makeTree($data);
|
||||
return $this->getAll($query);
|
||||
}
|
||||
|
||||
/**
|
||||
* 当前管理员可操作的渠道 ID(deptList 缺失时回退 dept_id)
|
||||
*/
|
||||
public function resolveAccessibleDeptId(?array $adminInfo = null): int
|
||||
{
|
||||
$adminInfo = $adminInfo ?? $this->adminInfo ?? [];
|
||||
if (empty($adminInfo['id']) || (int) $adminInfo['id'] <= 1) {
|
||||
return 0;
|
||||
}
|
||||
$deptList = $adminInfo['deptList'] ?? [];
|
||||
if (is_array($deptList) && isset($deptList['id']) && (int) $deptList['id'] > 0) {
|
||||
return (int) $deptList['id'];
|
||||
}
|
||||
$deptId = $adminInfo['dept_id'] ?? null;
|
||||
if ($deptId !== null && $deptId !== '' && (int) $deptId > 0) {
|
||||
return (int) $deptId;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,121 +6,133 @@
|
||||
// +----------------------------------------------------------------------
|
||||
namespace plugin\saiadmin\app\logic\system;
|
||||
|
||||
use app\dice\helper\AdminScopeHelper;
|
||||
use plugin\saiadmin\app\cache\UserMenuCache;
|
||||
use plugin\saiadmin\app\model\system\SystemRole;
|
||||
use plugin\saiadmin\app\service\SystemRoleChannelService;
|
||||
use plugin\saiadmin\basic\think\BaseLogic;
|
||||
use plugin\saiadmin\exception\ApiException;
|
||||
use plugin\saiadmin\utils\Helper;
|
||||
use support\think\Cache;
|
||||
use support\think\Db;
|
||||
|
||||
/**
|
||||
* 角色逻辑层
|
||||
* 角色逻辑层(按渠道 dept_id 隔离)
|
||||
*/
|
||||
class SystemRoleLogic extends BaseLogic
|
||||
{
|
||||
/**
|
||||
* 构造函数
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->model = new SystemRole();
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加数据
|
||||
* 分页列表(按渠道过滤)
|
||||
*/
|
||||
public function indexList(array $where, $requestDeptId = null): array
|
||||
{
|
||||
$query = $this->search($where);
|
||||
$this->applyDeptScope($query, $requestDeptId);
|
||||
$levelArr = array_column($this->adminInfo['roleList'] ?? [], 'level');
|
||||
if (!empty($levelArr)) {
|
||||
$maxLevel = max($levelArr);
|
||||
$query->where('level', '<', $maxLevel);
|
||||
}
|
||||
$query->where('id', '<>', SystemRoleChannelService::SUPER_ADMIN_ROLE_ID);
|
||||
return $this->getList($query);
|
||||
}
|
||||
|
||||
public function add($data): bool
|
||||
{
|
||||
$data = $this->handleData($data);
|
||||
$deptId = AdminScopeHelper::normalizeRecordDeptId($data['dept_id'] ?? null);
|
||||
$data['dept_id'] = $deptId;
|
||||
$this->assertCodeUniqueInDept($data['code'] ?? '', $deptId, null);
|
||||
return $this->model->save($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改数据
|
||||
*/
|
||||
public function edit($id, $data): bool
|
||||
{
|
||||
$model = $this->model->findOrEmpty($id);
|
||||
if ($model->isEmpty()) {
|
||||
throw new ApiException('Data not found');
|
||||
}
|
||||
$this->assertRoleWritable($model);
|
||||
$data = $this->handleData($data);
|
||||
$deptId = AdminScopeHelper::normalizeRecordDeptId($model->dept_id ?? $data['dept_id'] ?? null);
|
||||
$data['dept_id'] = $deptId;
|
||||
$this->assertCodeUniqueInDept($data['code'] ?? '', $deptId, (int) $id);
|
||||
return $model->save($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*/
|
||||
public function destroy($ids): bool
|
||||
{
|
||||
// 越权保护
|
||||
$levelArr = array_column($this->adminInfo['roleList'], 'level');
|
||||
$maxLevel = max($levelArr);
|
||||
$levelArr = array_column($this->adminInfo['roleList'] ?? [], 'level');
|
||||
$maxLevel = !empty($levelArr) ? max($levelArr) : 100;
|
||||
|
||||
$num = SystemRole::where('level', '>=', $maxLevel)->whereIn('id', $ids)->count();
|
||||
if ($num > 0) {
|
||||
throw new ApiException('Cannot operate roles with higher level than current account');
|
||||
} else {
|
||||
return $this->model->destroy($ids);
|
||||
$idList = is_array($ids) ? $ids : explode(',', (string) $ids);
|
||||
foreach ($idList as $roleId) {
|
||||
$roleId = (int) $roleId;
|
||||
if ($roleId === SystemRoleChannelService::SUPER_ADMIN_ROLE_ID) {
|
||||
throw new ApiException('Cannot delete super admin role');
|
||||
}
|
||||
$role = $this->model->find($roleId);
|
||||
if (!$role) {
|
||||
continue;
|
||||
}
|
||||
$this->assertRoleWritable($role);
|
||||
if ((int) ($role->level ?? 0) >= $maxLevel) {
|
||||
throw new ApiException('Cannot operate roles with higher level than current account');
|
||||
}
|
||||
}
|
||||
|
||||
return $this->model->destroy($ids);
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据处理
|
||||
*/
|
||||
protected function handleData($data)
|
||||
{
|
||||
// 越权保护
|
||||
$levelArr = array_column($this->adminInfo['roleList'], 'level');
|
||||
$maxLevel = max($levelArr);
|
||||
if ($data['level'] >= $maxLevel) {
|
||||
throw new ApiException('Cannot operate roles with higher level than current account');
|
||||
$levelArr = array_column($this->adminInfo['roleList'] ?? [], 'level');
|
||||
if (!empty($levelArr)) {
|
||||
$maxLevel = max($levelArr);
|
||||
if (($data['level'] ?? 0) >= $maxLevel) {
|
||||
throw new ApiException('Cannot operate roles with higher level than current account');
|
||||
}
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* 可操作角色
|
||||
* @param array $where
|
||||
* @return array
|
||||
*/
|
||||
public function accessRole(array $where = []): array
|
||||
public function accessRole(array $where = [], $requestDeptId = null): array
|
||||
{
|
||||
$query = $this->search($where);
|
||||
// 越权保护
|
||||
$levelArr = array_column($this->adminInfo['roleList'], 'level');
|
||||
$maxLevel = max($levelArr);
|
||||
$query->where('level', '<', $maxLevel);
|
||||
$this->applyDeptScope($query, $requestDeptId);
|
||||
$levelArr = array_column($this->adminInfo['roleList'] ?? [], 'level');
|
||||
if (!empty($levelArr)) {
|
||||
$maxLevel = max($levelArr);
|
||||
$query->where('level', '<', $maxLevel);
|
||||
}
|
||||
$query->where('id', '<>', SystemRoleChannelService::SUPER_ADMIN_ROLE_ID);
|
||||
$query->order('sort', 'desc');
|
||||
return $this->getAll($query);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据角色数组获取菜单
|
||||
* @param $ids
|
||||
* @return array
|
||||
*/
|
||||
public function getMenuIdsByRoleIds($ids): array
|
||||
{
|
||||
if (empty($ids))
|
||||
if (empty($ids)) {
|
||||
return [];
|
||||
}
|
||||
return $this->model->where('id', 'in', $ids)->with([
|
||||
'menus' => function ($query) {
|
||||
$query->where('status', 1)->order('sort', 'desc');
|
||||
}
|
||||
])->select()->toArray();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据角色获取菜单
|
||||
* @param $id
|
||||
* @return array
|
||||
*/
|
||||
public function getMenuByRole($id): array
|
||||
{
|
||||
$role = $this->model->findOrEmpty($id);
|
||||
if ($role->isEmpty()) {
|
||||
throw new ApiException('Data not found');
|
||||
}
|
||||
$this->assertRoleWritable($role);
|
||||
$menus = $role->menus ?: [];
|
||||
return [
|
||||
'id' => $id,
|
||||
@@ -128,14 +140,14 @@ class SystemRoleLogic extends BaseLogic
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存菜单权限
|
||||
* @param $id
|
||||
* @param $menu_ids
|
||||
* @return mixed
|
||||
*/
|
||||
public function saveMenuPermission($id, $menu_ids): mixed
|
||||
{
|
||||
$role = $this->model->findOrEmpty($id);
|
||||
if ($role->isEmpty()) {
|
||||
throw new ApiException('Data not found');
|
||||
}
|
||||
$this->assertRoleWritable($role);
|
||||
|
||||
return $this->transaction(function () use ($id, $menu_ids) {
|
||||
$role = $this->model->findOrEmpty($id);
|
||||
if ($role) {
|
||||
@@ -147,10 +159,90 @@ class SystemRoleLogic extends BaseLogic
|
||||
}
|
||||
$cache = config('plugin.saiadmin.saithink.button_cache');
|
||||
$tag = $cache['role'] . $id;
|
||||
Cache::tag($tag)->clear(); // 清理权限缓存-角色TAG
|
||||
UserMenuCache::clearMenuCache(); // 清理菜单缓存
|
||||
Cache::tag($tag)->clear();
|
||||
UserMenuCache::clearMenuCache();
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析并校验当前请求应操作的渠道 ID
|
||||
*/
|
||||
public function resolveRequestDeptId($requestDeptId): int
|
||||
{
|
||||
if ((int) ($this->adminInfo['id'] ?? 0) === 1) {
|
||||
return AdminScopeHelper::resolveConfigDeptId($this->adminInfo, $requestDeptId);
|
||||
}
|
||||
$deptLogic = new SystemDeptLogic();
|
||||
$deptLogic->init($this->adminInfo);
|
||||
return $deptLogic->resolveAccessibleDeptId();
|
||||
}
|
||||
|
||||
/**
|
||||
* 列表/下拉按渠道过滤
|
||||
*/
|
||||
protected function applyDeptScope($query, $requestDeptId = null): void
|
||||
{
|
||||
if (!$this->tableHasDeptIdColumn()) {
|
||||
return;
|
||||
}
|
||||
if ((int) ($this->adminInfo['id'] ?? 0) === 1) {
|
||||
$deptId = AdminScopeHelper::resolveConfigDeptId($this->adminInfo, $requestDeptId);
|
||||
$query->where('dept_id', $deptId);
|
||||
return;
|
||||
}
|
||||
$deptLogic = new SystemDeptLogic();
|
||||
$deptLogic->init($this->adminInfo);
|
||||
$deptId = $deptLogic->resolveAccessibleDeptId();
|
||||
if ($deptId > 0) {
|
||||
$query->where('dept_id', $deptId);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验角色属于当前可操作渠道
|
||||
*/
|
||||
public function assertRoleWritable($role): void
|
||||
{
|
||||
if (!$this->tableHasDeptIdColumn()) {
|
||||
return;
|
||||
}
|
||||
$roleDeptId = AdminScopeHelper::normalizeRecordDeptId($role->dept_id ?? null);
|
||||
if ((int) ($role->id ?? 0) === SystemRoleChannelService::SUPER_ADMIN_ROLE_ID) {
|
||||
throw new ApiException('Cannot operate super admin role');
|
||||
}
|
||||
if ((int) ($this->adminInfo['id'] ?? 0) === 1) {
|
||||
return;
|
||||
}
|
||||
$deptLogic = new SystemDeptLogic();
|
||||
$deptLogic->init($this->adminInfo);
|
||||
$scopeDeptId = $deptLogic->resolveAccessibleDeptId();
|
||||
if ($scopeDeptId > 0 && $roleDeptId !== $scopeDeptId) {
|
||||
throw new ApiException('No permission to operate this channel role');
|
||||
}
|
||||
}
|
||||
|
||||
protected function assertCodeUniqueInDept(string $code, int $deptId, ?int $excludeId): void
|
||||
{
|
||||
if ($code === '') {
|
||||
return;
|
||||
}
|
||||
$query = SystemRole::where('code', $code)->where('dept_id', $deptId);
|
||||
if ($excludeId !== null && $excludeId > 0) {
|
||||
$query->where('id', '<>', $excludeId);
|
||||
}
|
||||
if ($query->count() > 0) {
|
||||
throw new ApiException('Role code already exists in this channel');
|
||||
}
|
||||
}
|
||||
|
||||
protected function tableHasDeptIdColumn(): bool
|
||||
{
|
||||
try {
|
||||
$fields = Db::getFields((new SystemRole())->getTable());
|
||||
return isset($fields['dept_id']);
|
||||
} catch (\Throwable $e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,9 +40,16 @@ class SystemUserLogic extends BaseLogic
|
||||
{
|
||||
$query = $this->search($where);
|
||||
$query->with(['depts']);
|
||||
// 超级管理员(id=1)可查看全部用户,普通管理员按部门权限过滤
|
||||
// 超级管理员(id=1)可查看全部用户,渠道管理员按本渠道过滤
|
||||
if (isset($this->adminInfo['id']) && $this->adminInfo['id'] > 1) {
|
||||
$query->auth($this->adminInfo['deptList'] ?? []);
|
||||
$deptLogic = new SystemDeptLogic();
|
||||
$deptLogic->init($this->adminInfo);
|
||||
$deptId = $deptLogic->resolveAccessibleDeptId();
|
||||
if ($deptId > 0) {
|
||||
$query->where('dept_id', $deptId);
|
||||
} else {
|
||||
$query->auth($this->adminInfo['deptList'] ?? []);
|
||||
}
|
||||
}
|
||||
return $this->getList($query);
|
||||
}
|
||||
@@ -70,6 +77,12 @@ class SystemUserLogic extends BaseLogic
|
||||
$data = $admin->hidden(['password'])->toArray();
|
||||
$data['roleList'] = $admin->roles->toArray() ?: [];
|
||||
$data['deptList'] = $admin->depts ? $admin->depts->toArray() : [];
|
||||
if (empty($data['deptList']) && ! empty($admin->dept_id)) {
|
||||
$dept = SystemDept::find($admin->dept_id);
|
||||
if ($dept && ! $dept->isEmpty()) {
|
||||
$data['deptList'] = $dept->toArray();
|
||||
}
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
|
||||
@@ -9,15 +9,15 @@ namespace plugin\saiadmin\app\model\system;
|
||||
use plugin\saiadmin\basic\think\BaseModel;
|
||||
|
||||
/**
|
||||
* 部门模型
|
||||
* 渠道模型
|
||||
*
|
||||
* sa_system_dept 部门表
|
||||
* sa_system_dept 渠道表
|
||||
*
|
||||
* @property $id 编号
|
||||
* @property $parent_id 父级ID,0为根节点
|
||||
* @property $name 部门名称
|
||||
* @property $code 部门编码
|
||||
* @property $leader_id 部门负责人ID
|
||||
* @property $parent_id 父级ID(扁平渠道固定为0)
|
||||
* @property $name 渠道名称
|
||||
* @property $code 渠道编码
|
||||
* @property $leader_id 渠道负责人ID
|
||||
* @property $level 祖级列表,格式: 0,1,5,
|
||||
* @property $sort 排序,数字越小越靠前
|
||||
* @property $status 状态: 1启用, 0禁用
|
||||
@@ -38,24 +38,21 @@ class SystemDept extends BaseModel
|
||||
protected $table = 'sa_system_dept';
|
||||
|
||||
/**
|
||||
* 权限范围
|
||||
* 权限范围(扁平渠道,仅本渠道)
|
||||
*/
|
||||
public function scopeAuth($query, $value)
|
||||
{
|
||||
if (!empty($value) && isset($value['id'])) {
|
||||
$deptIds = [$value['id']];
|
||||
$level = $value['level'] ?? '';
|
||||
if ($level !== '' && $level !== null) {
|
||||
$deptLevel = $level . $value['id'] . ',';
|
||||
$ids = static::whereLike('level', $deptLevel . '%')->column('id');
|
||||
$deptIds = array_merge($deptIds, $ids);
|
||||
}
|
||||
$query->whereIn('id', $deptIds);
|
||||
if (is_array($value) && isset($value['id']) && (int) $value['id'] > 0) {
|
||||
$query->where('id', $value['id']);
|
||||
return;
|
||||
}
|
||||
if (is_numeric($value) && (int) $value > 0) {
|
||||
$query->where('id', (int) $value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 部门领导
|
||||
* 渠道负责人
|
||||
*/
|
||||
public function leader()
|
||||
{
|
||||
|
||||
@@ -13,7 +13,8 @@ use plugin\saiadmin\basic\think\BaseModel;
|
||||
*
|
||||
* sa_system_role 角色表
|
||||
*
|
||||
* @property $id
|
||||
* @property $id
|
||||
* @property int $dept_id 所属渠道ID,0=默认模板
|
||||
* @property $name 角色名称
|
||||
* @property $code 角色标识,如: hr_manager
|
||||
* @property $level 角色级别:用于行政控制,不可操作级别大于自己的角色
|
||||
@@ -41,6 +42,14 @@ class SystemRole extends BaseModel
|
||||
*/
|
||||
protected $table = 'sa_system_role';
|
||||
|
||||
/** 按渠道筛选 */
|
||||
public function searchDeptIdAttr($query, $value): void
|
||||
{
|
||||
if ($value !== '' && $value !== null) {
|
||||
$query->where('dept_id', '=', $value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 权限范围
|
||||
*/
|
||||
|
||||
@@ -24,7 +24,7 @@ use plugin\saiadmin\basic\think\BaseModel;
|
||||
* @property $phone 手机号
|
||||
* @property $signed 个性签名
|
||||
* @property $dashboard 工作台
|
||||
* @property $dept_id 主归属部门
|
||||
* @property $dept_id 主归属渠道
|
||||
* @property $is_super 是否超级管理员: 1是
|
||||
* @property $status 状态: 1启用, 2禁用
|
||||
* @property $remark 备注
|
||||
@@ -82,16 +82,12 @@ class SystemUser extends BaseModel
|
||||
}
|
||||
|
||||
/**
|
||||
* 权限范围 - 过滤部门用户
|
||||
* 权限范围 - 过滤同渠道用户
|
||||
*/
|
||||
public function scopeAuth($query, $value)
|
||||
{
|
||||
if (!empty($value)) {
|
||||
$deptIds = [$value['id']];
|
||||
$deptLevel = $value['level'] . $value['id'] . ',';
|
||||
$dept_ids = SystemDept::whereLike('level', $deptLevel . '%')->column('id');
|
||||
$deptIds = array_merge($deptIds, $dept_ids);
|
||||
$query->whereIn('dept_id', $deptIds);
|
||||
if (!empty($value) && isset($value['id'])) {
|
||||
$query->where('dept_id', $value['id']);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -104,7 +100,7 @@ class SystemUser extends BaseModel
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过中间表关联部门
|
||||
* 关联渠道
|
||||
*/
|
||||
public function depts()
|
||||
{
|
||||
|
||||
257
server/plugin/saiadmin/app/service/SystemRoleChannelService.php
Normal file
257
server/plugin/saiadmin/app/service/SystemRoleChannelService.php
Normal file
@@ -0,0 +1,257 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace plugin\saiadmin\app\service;
|
||||
|
||||
use plugin\saiadmin\app\model\system\SystemDept;
|
||||
use plugin\saiadmin\app\model\system\SystemRole;
|
||||
use plugin\saiadmin\exception\ApiException;
|
||||
use support\think\Db;
|
||||
|
||||
/**
|
||||
* 渠道角色:从默认模板复制指定角色、同步与删除
|
||||
*/
|
||||
class SystemRoleChannelService
|
||||
{
|
||||
/** 全局超级管理员角色,不参与渠道复制 */
|
||||
public const SUPER_ADMIN_ROLE_ID = 1;
|
||||
|
||||
/**
|
||||
* 为渠道从默认模板复制三个代理角色(缺失则补齐,不整包跳过)
|
||||
*/
|
||||
public function copyDefaultRolesToDept(int $deptId, bool $pruneExtra = false): array
|
||||
{
|
||||
if ($deptId <= 0) {
|
||||
throw new ApiException('Invalid channel id');
|
||||
}
|
||||
if (!$this->tableHasColumn('sa_system_role', 'dept_id')) {
|
||||
return ['dept_id' => $deptId, 'copied' => 0, 'skipped' => 0, 'pruned' => 0, 'message' => 'dept_id column missing'];
|
||||
}
|
||||
|
||||
$templates = $this->defaultTemplateRoles();
|
||||
if (empty($templates)) {
|
||||
return ['dept_id' => $deptId, 'copied' => 0, 'skipped' => 0, 'pruned' => 0, 'message' => 'no template roles'];
|
||||
}
|
||||
|
||||
$copied = 0;
|
||||
$skipped = 0;
|
||||
foreach ($templates as $template) {
|
||||
$template = (array) $template;
|
||||
$templateId = (int) ($template['id'] ?? 0);
|
||||
$code = (string) ($template['code'] ?? '');
|
||||
if ($templateId <= 0 || $code === '') {
|
||||
continue;
|
||||
}
|
||||
if ($this->roleExists($deptId, $code)) {
|
||||
$skipped++;
|
||||
continue;
|
||||
}
|
||||
|
||||
$newId = $this->insertRoleFromTemplate($template, $deptId);
|
||||
if ($newId > 0) {
|
||||
$this->copyRoleMenus($templateId, $newId);
|
||||
$copied++;
|
||||
}
|
||||
}
|
||||
|
||||
$pruned = 0;
|
||||
if ($pruneExtra) {
|
||||
$pruned = $this->pruneExtraChannelRoles($deptId);
|
||||
}
|
||||
|
||||
return ['dept_id' => $deptId, 'copied' => $copied, 'skipped' => $skipped, 'pruned' => $pruned];
|
||||
}
|
||||
|
||||
/**
|
||||
* 为所有已启用渠道补齐三个默认角色,并移除多余历史角色
|
||||
*/
|
||||
public function syncAllChannelsFromDefault(): array
|
||||
{
|
||||
$deptIds = SystemDept::where('status', 1)->where('id', '>', 0)->column('id');
|
||||
$result = [];
|
||||
foreach ($deptIds as $deptId) {
|
||||
$result[(int) $deptId] = $this->copyDefaultRolesToDept((int) $deptId, true);
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除渠道下全部角色及菜单关联
|
||||
*/
|
||||
public function deleteRolesByDept(int $deptId): int
|
||||
{
|
||||
if ($deptId <= 0) {
|
||||
return 0;
|
||||
}
|
||||
$roleIds = SystemRole::where('dept_id', $deptId)->column('id');
|
||||
if (empty($roleIds)) {
|
||||
return 0;
|
||||
}
|
||||
Db::name('sa_system_user_role')->whereIn('role_id', $roleIds)->delete();
|
||||
Db::name('sa_system_role_menu')->whereIn('role_id', $roleIds)->delete();
|
||||
Db::name('sa_system_role_dept')->whereIn('role_id', $roleIds)->delete();
|
||||
return SystemRole::destroy($roleIds);
|
||||
}
|
||||
|
||||
/**
|
||||
* 将用户已绑定的模板角色映射到其渠道对应角色(仅三个默认 code)
|
||||
*/
|
||||
public function remapUserRolesToChannelRoles(): int
|
||||
{
|
||||
if (!$this->tableHasColumn('sa_system_role', 'dept_id')) {
|
||||
return 0;
|
||||
}
|
||||
$codes = $this->getDefaultChannelRoleCodes();
|
||||
if (empty($codes)) {
|
||||
return 0;
|
||||
}
|
||||
$codeList = "'" . implode("','", array_map('addslashes', $codes)) . "'";
|
||||
return Db::execute(
|
||||
'UPDATE `sa_system_user_role` ur
|
||||
INNER JOIN `sa_system_user` u ON ur.user_id = u.id
|
||||
INNER JOIN `sa_system_role` r_old ON ur.role_id = r_old.id
|
||||
INNER JOIN `sa_system_role` r_new ON r_new.dept_id = u.dept_id AND r_new.code = r_old.code
|
||||
SET ur.role_id = r_new.id
|
||||
WHERE u.dept_id > 0
|
||||
AND r_old.dept_id = 0
|
||||
AND r_old.code IN (' . $codeList . ')
|
||||
AND r_old.id <> ' . self::SUPER_ADMIN_ROLE_ID
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string[]
|
||||
*/
|
||||
public function getDefaultChannelRoleCodes(): array
|
||||
{
|
||||
$codes = config('plugin.saiadmin.saithink.channel_default_role_codes', []);
|
||||
if (!is_array($codes) || $codes === []) {
|
||||
return ['yijidaili', 'erjidaili', 'sanjidaili'];
|
||||
}
|
||||
$out = [];
|
||||
foreach ($codes as $code) {
|
||||
$code = trim((string) $code);
|
||||
if ($code !== '') {
|
||||
$out[] = $code;
|
||||
}
|
||||
}
|
||||
return $out;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除渠道下不在默认三个 code 内、且未被用户绑定的角色
|
||||
*/
|
||||
public function pruneExtraChannelRoles(int $deptId): int
|
||||
{
|
||||
if ($deptId <= 0) {
|
||||
return 0;
|
||||
}
|
||||
$allowed = $this->getDefaultChannelRoleCodes();
|
||||
if (empty($allowed)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
$query = SystemRole::where('dept_id', $deptId)->whereNotIn('code', $allowed);
|
||||
$roleIds = $query->column('id');
|
||||
if (empty($roleIds)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
$usedIds = Db::name('sa_system_user_role')->whereIn('role_id', $roleIds)->column('role_id');
|
||||
$usedMap = array_flip($usedIds ?: []);
|
||||
$pruned = 0;
|
||||
foreach ($roleIds as $roleId) {
|
||||
if (isset($usedMap[$roleId])) {
|
||||
continue;
|
||||
}
|
||||
Db::name('sa_system_role_menu')->where('role_id', $roleId)->delete();
|
||||
Db::name('sa_system_role_dept')->where('role_id', $roleId)->delete();
|
||||
SystemRole::destroy($roleId);
|
||||
$pruned++;
|
||||
}
|
||||
|
||||
return $pruned;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<int, array<string, mixed>>
|
||||
*/
|
||||
private function defaultTemplateRoles(): array
|
||||
{
|
||||
$codes = $this->getDefaultChannelRoleCodes();
|
||||
if (empty($codes)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$query = Db::table('sa_system_role')
|
||||
->where('id', '<>', self::SUPER_ADMIN_ROLE_ID)
|
||||
->whereIn('code', $codes);
|
||||
if ($this->tableHasColumn('sa_system_role', 'dept_id')) {
|
||||
$query->where('dept_id', 0);
|
||||
}
|
||||
$rows = $query->order('sort', 'desc')->select()->toArray();
|
||||
if (count($rows) === count($codes)) {
|
||||
return $rows;
|
||||
}
|
||||
|
||||
// 按配置顺序返回,缺失的 code 跳过
|
||||
$byCode = [];
|
||||
foreach ($rows as $row) {
|
||||
$byCode[(string) ($row['code'] ?? '')] = $row;
|
||||
}
|
||||
$ordered = [];
|
||||
foreach ($codes as $code) {
|
||||
if (isset($byCode[$code])) {
|
||||
$ordered[] = $byCode[$code];
|
||||
}
|
||||
}
|
||||
return $ordered;
|
||||
}
|
||||
|
||||
private function insertRoleFromTemplate(array $template, int $deptId): int
|
||||
{
|
||||
unset(
|
||||
$template['id'],
|
||||
$template['create_time'],
|
||||
$template['update_time'],
|
||||
$template['delete_time']
|
||||
);
|
||||
$template['dept_id'] = $deptId;
|
||||
$now = date('Y-m-d H:i:s');
|
||||
if (!isset($template['create_time'])) {
|
||||
$template['create_time'] = $now;
|
||||
}
|
||||
if (!isset($template['update_time'])) {
|
||||
$template['update_time'] = $now;
|
||||
}
|
||||
return (int) Db::table('sa_system_role')->insertGetId($template);
|
||||
}
|
||||
|
||||
private function copyRoleMenus(int $fromRoleId, int $toRoleId): void
|
||||
{
|
||||
$menuIds = Db::name('sa_system_role_menu')->where('role_id', $fromRoleId)->column('menu_id');
|
||||
if (empty($menuIds)) {
|
||||
return;
|
||||
}
|
||||
$rows = [];
|
||||
foreach ($menuIds as $menuId) {
|
||||
$rows[] = ['role_id' => $toRoleId, 'menu_id' => $menuId];
|
||||
}
|
||||
Db::name('sa_system_role_menu')->limit(100)->insertAll($rows);
|
||||
}
|
||||
|
||||
private function roleExists(int $deptId, string $code): bool
|
||||
{
|
||||
return SystemRole::where('dept_id', $deptId)->where('code', $code)->count() > 0;
|
||||
}
|
||||
|
||||
private function tableHasColumn(string $table, string $column): bool
|
||||
{
|
||||
try {
|
||||
$fields = Db::getFields($table);
|
||||
return isset($fields[$column]);
|
||||
} catch (\Throwable $e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,7 +9,7 @@ namespace plugin\saiadmin\app\validate\system;
|
||||
use plugin\saiadmin\basic\BaseValidate;
|
||||
|
||||
/**
|
||||
* 部门验证器
|
||||
* 渠道验证器
|
||||
*/
|
||||
class SystemDeptValidate extends BaseValidate
|
||||
{
|
||||
@@ -25,7 +25,7 @@ class SystemDeptValidate extends BaseValidate
|
||||
* 定义错误信息
|
||||
*/
|
||||
protected $message = [
|
||||
'name' => '部门名称必须填写',
|
||||
'name' => '渠道名称必须填写',
|
||||
'status' => '状态必须填写',
|
||||
];
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ class SystemRoleValidate extends BaseValidate
|
||||
*/
|
||||
protected $rule = [
|
||||
'name' => 'require|max:16',
|
||||
'code' => 'require|alphaDash|unique:' . SystemRole::class,
|
||||
'code' => 'require|alphaDash|unique:' . SystemRole::class . ',code^dept_id',
|
||||
'status' => 'require',
|
||||
];
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
// +----------------------------------------------------------------------
|
||||
namespace plugin\saiadmin\basic;
|
||||
|
||||
use app\api\util\ApiLang;
|
||||
use support\Request;
|
||||
use support\Response;
|
||||
|
||||
@@ -36,6 +37,7 @@ class OpenController
|
||||
if (is_string($data)) {
|
||||
$msg = $data;
|
||||
}
|
||||
$msg = ApiLang::translate($msg, request());
|
||||
return json(['code' => 200, 'message' => $msg, 'data' => $data], $option);
|
||||
}
|
||||
|
||||
@@ -47,6 +49,7 @@ class OpenController
|
||||
*/
|
||||
public function fail(string $msg = 'fail', int $code = 400): Response
|
||||
{
|
||||
$msg = ApiLang::translate($msg, request());
|
||||
return json(['code' => $code, 'message' => $msg]);
|
||||
}
|
||||
|
||||
|
||||
@@ -50,9 +50,11 @@ Route::group('/core', function () {
|
||||
Route::get("/role/getMenuByRole", [\plugin\saiadmin\app\controller\system\SystemRoleController::class, 'getMenuByRole']);
|
||||
Route::post("/role/menuPermission", [\plugin\saiadmin\app\controller\system\SystemRoleController::class, 'menuPermission']);
|
||||
|
||||
// 部门管理
|
||||
// 渠道管理
|
||||
fastRoute("dept", \plugin\saiadmin\app\controller\system\SystemDeptController::class);
|
||||
Route::get("/dept/accessDept", [\plugin\saiadmin\app\controller\system\SystemDeptController::class, 'accessDept']);
|
||||
Route::get("/dept/destroyPreview", [\plugin\saiadmin\app\controller\system\SystemDeptController::class, 'destroyPreview']);
|
||||
Route::post("/dept/syncChannelConfigs", [\plugin\saiadmin\app\controller\system\SystemDeptController::class, 'syncChannelConfigs']);
|
||||
|
||||
// 菜单管理
|
||||
fastRoute('menu', \plugin\saiadmin\app\controller\system\SystemMenuController::class);
|
||||
@@ -90,6 +92,7 @@ Route::group('/core', function () {
|
||||
Route::put('/dice/player/DicePlayer/updateStatus', [\app\dice\controller\player\DicePlayerController::class, 'updateStatus']);
|
||||
Route::get('/dice/player/DicePlayer/getLotteryConfigOptions', [\app\dice\controller\player\DicePlayerController::class, 'getLotteryConfigOptions']);
|
||||
Route::get('/dice/player/DicePlayer/getSystemUserOptions', [\app\dice\controller\player\DicePlayerController::class, 'getSystemUserOptions']);
|
||||
Route::get('/dice/player/DicePlayer/getSystemUserTreeOptions', [\app\dice\controller\player\DicePlayerController::class, 'getSystemUserTreeOptions']);
|
||||
Route::get('/dice/player/DicePlayer/getGameUrl', [\app\dice\controller\player\DicePlayerController::class, 'getGameUrl']);
|
||||
fastRoute('dice/play_record/DicePlayRecord', \app\dice\controller\play_record\DicePlayRecordController::class);
|
||||
Route::get('/dice/play_record/DicePlayRecord/getPlayerOptions', [\app\dice\controller\play_record\DicePlayRecordController::class, 'getPlayerOptions']);
|
||||
@@ -116,6 +119,7 @@ Route::group('/core', function () {
|
||||
Route::post('/dice/reward_config/DiceRewardConfig/runWeightTest', [\app\dice\controller\reward_config\DiceRewardConfigController::class, 'runWeightTest']);
|
||||
fastRoute('dice/game/DiceGame', \app\dice\controller\game\DiceGameController::class);
|
||||
fastRoute('dice/ante_config/DiceAnteConfig', \app\dice\controller\ante_config\DiceAnteConfigController::class);
|
||||
Route::get('/dice/ante_config/DiceAnteConfig/getOptions', [\app\dice\controller\ante_config\DiceAnteConfigController::class, 'getOptions']);
|
||||
fastRoute('dice/lottery_pool_config/DiceLotteryPoolConfig', \app\dice\controller\lottery_pool_config\DiceLotteryPoolConfigController::class);
|
||||
Route::get('/dice/lottery_pool_config/DiceLotteryPoolConfig/getOptions', [\app\dice\controller\lottery_pool_config\DiceLotteryPoolConfigController::class, 'getOptions']);
|
||||
Route::get('/dice/lottery_pool_config/DiceLotteryPoolConfig/getCurrentPool', [\app\dice\controller\lottery_pool_config\DiceLotteryPoolConfigController::class, 'getCurrentPool']);
|
||||
|
||||
@@ -72,4 +72,13 @@ return [
|
||||
'attr' => 'saiadmin:reflection_cache:attr_',
|
||||
],
|
||||
|
||||
/**
|
||||
* 新建渠道时从默认模板复制的角色 code(须存在于 dept_id=0 的模板角色)
|
||||
*/
|
||||
'channel_default_role_codes' => [
|
||||
'yijidaili',
|
||||
'erjidaili',
|
||||
'sanjidaili',
|
||||
],
|
||||
|
||||
];
|
||||
|
||||
Reference in New Issue
Block a user