This commit is contained in:
wushumin
2026-05-11 15:28:27 +08:00
commit edd1a02157
302 changed files with 67193 additions and 0 deletions

View File

@@ -0,0 +1,296 @@
<?php
namespace app\controller\admin;
use app\support\AdminAccessService;
use support\Request;
use support\think\Db;
class AccessController
{
public function overview(Request $request)
{
$this->accessService()->bootstrapDefaults();
return api_success([
'cards' => [
[
'title' => '管理员数量',
'value' => (int)Db::name('admin_users')->count(),
'desc' => '当前后台管理员账号总数',
],
[
'title' => '启用角色',
'value' => (int)Db::name('admin_roles')->where('status', 'enabled')->count(),
'desc' => '当前启用中的角色数量',
],
[
'title' => '权限点',
'value' => (int)Db::name('admin_permissions')->count(),
'desc' => '后台模块当前可分配的权限点数量',
],
[
'title' => '角色授权',
'value' => (int)Db::name('admin_role_permissions')->count(),
'desc' => '角色与权限的关联配置总数',
],
],
]);
}
public function admins(Request $request)
{
$this->accessService()->bootstrapDefaults();
$rows = Db::name('admin_users')
->order('id', 'desc')
->select()
->toArray();
$list = array_map(function (array $item) {
$roleIds = Db::name('admin_role_relations')->where('admin_user_id', $item['id'])->column('role_id');
$roles = $roleIds
? Db::name('admin_roles')->whereIn('id', $roleIds)->column('name')
: [];
return [
'id' => (int)$item['id'],
'name' => $item['name'],
'mobile' => $item['mobile'],
'email' => $item['email'],
'status' => $item['status'],
'status_text' => $this->accessService()->statusText($item['status']),
'role_ids' => array_map('intval', $roleIds),
'role_names' => array_values($roles),
'last_login_at' => $item['last_login_at'],
'created_at' => $item['created_at'],
];
}, $rows);
return api_success(['list' => $list]);
}
public function roles(Request $request)
{
$this->accessService()->bootstrapDefaults();
$rows = Db::name('admin_roles')
->order('id', 'asc')
->select()
->toArray();
$list = array_map(function (array $item) {
$permissionIds = Db::name('admin_role_permissions')->where('role_id', $item['id'])->column('permission_id');
$permissions = $permissionIds
? Db::name('admin_permissions')->whereIn('id', $permissionIds)->column('name')
: [];
return [
'id' => (int)$item['id'],
'name' => $item['name'],
'code' => $item['code'],
'status' => $item['status'],
'status_text' => $this->accessService()->statusText($item['status']),
'permission_ids' => array_map('intval', $permissionIds),
'permission_names' => array_values($permissions),
'admin_count' => (int)Db::name('admin_role_relations')->where('role_id', $item['id'])->count(),
'created_at' => $item['created_at'],
];
}, $rows);
return api_success(['list' => $list]);
}
public function permissions(Request $request)
{
$this->accessService()->bootstrapDefaults();
$rows = Db::name('admin_permissions')
->order('module', 'asc')
->order('id', 'asc')
->select()
->toArray();
return api_success([
'list' => array_map(fn (array $item) => [
'id' => (int)$item['id'],
'name' => $item['name'],
'code' => $item['code'],
'module' => $item['module'],
'action' => $item['action'],
'module_text' => $this->accessService()->moduleText($item['module']),
], $rows),
]);
}
public function saveAdmin(Request $request)
{
$this->accessService()->bootstrapDefaults();
$id = (int)$request->input('id', 0);
$name = trim((string)$request->input('name', ''));
$mobile = trim((string)$request->input('mobile', ''));
$email = trim((string)$request->input('email', ''));
$password = trim((string)$request->input('password', ''));
$status = trim((string)$request->input('status', 'enabled'));
$roleIds = $this->normalizeIds((array)$request->input('role_ids', []));
if ($name === '' || $mobile === '') {
return api_error('管理员姓名和手机号不能为空', 422);
}
$now = date('Y-m-d H:i:s');
Db::startTrans();
try {
if ($id > 0) {
$admin = Db::name('admin_users')->where('id', $id)->find();
if (!$admin) {
Db::rollback();
return api_error('管理员不存在', 404);
}
$exists = Db::name('admin_users')
->where('mobile', $mobile)
->where('id', '<>', $id)
->find();
if ($exists) {
Db::rollback();
return api_error('管理员手机号已存在', 422);
}
Db::name('admin_users')->where('id', $id)->update([
'name' => $name,
'mobile' => $mobile,
'email' => $email,
'password' => $password !== '' ? password_hash($password, PASSWORD_BCRYPT) : $admin['password'],
'status' => $status !== '' ? $status : 'enabled',
'updated_at' => $now,
]);
$adminId = $id;
} else {
$exists = Db::name('admin_users')->where('mobile', $mobile)->find();
if ($exists) {
Db::rollback();
return api_error('管理员手机号已存在', 422);
}
$adminId = (int)Db::name('admin_users')->insertGetId([
'name' => $name,
'mobile' => $mobile,
'email' => $email,
'password' => password_hash($password !== '' ? $password : 'Admin@123456', PASSWORD_BCRYPT),
'status' => $status !== '' ? $status : 'enabled',
'last_login_at' => null,
'created_at' => $now,
'updated_at' => $now,
]);
}
Db::name('admin_role_relations')->where('admin_user_id', $adminId)->delete();
foreach ($roleIds as $roleId) {
Db::name('admin_role_relations')->insert([
'admin_user_id' => $adminId,
'role_id' => $roleId,
'created_at' => $now,
]);
}
Db::commit();
} catch (\Throwable $e) {
Db::rollback();
return api_error('管理员保存失败', 500, [
'detail' => $e->getMessage(),
]);
}
return api_success(['id' => $adminId], '管理员已保存');
}
public function saveRole(Request $request)
{
$this->accessService()->bootstrapDefaults();
$id = (int)$request->input('id', 0);
$name = trim((string)$request->input('name', ''));
$code = trim((string)$request->input('code', ''));
$status = trim((string)$request->input('status', 'enabled'));
$permissionIds = $this->normalizeIds((array)$request->input('permission_ids', []));
if ($name === '' || $code === '') {
return api_error('角色名称和编码不能为空', 422);
}
$now = date('Y-m-d H:i:s');
Db::startTrans();
try {
if ($id > 0) {
$role = Db::name('admin_roles')->where('id', $id)->find();
if (!$role) {
Db::rollback();
return api_error('角色不存在', 404);
}
$exists = Db::name('admin_roles')
->where('code', $code)
->where('id', '<>', $id)
->find();
if ($exists) {
Db::rollback();
return api_error('角色编码已存在', 422);
}
Db::name('admin_roles')->where('id', $id)->update([
'name' => $name,
'code' => $code,
'status' => $status !== '' ? $status : 'enabled',
'updated_at' => $now,
]);
$roleId = $id;
} else {
$exists = Db::name('admin_roles')->where('code', $code)->find();
if ($exists) {
Db::rollback();
return api_error('角色编码已存在', 422);
}
$roleId = (int)Db::name('admin_roles')->insertGetId([
'name' => $name,
'code' => $code,
'status' => $status !== '' ? $status : 'enabled',
'created_at' => $now,
'updated_at' => $now,
]);
}
Db::name('admin_role_permissions')->where('role_id', $roleId)->delete();
foreach ($permissionIds as $permissionId) {
Db::name('admin_role_permissions')->insert([
'role_id' => $roleId,
'permission_id' => $permissionId,
'created_at' => $now,
]);
}
Db::commit();
} catch (\Throwable $e) {
Db::rollback();
return api_error('角色保存失败', 500, [
'detail' => $e->getMessage(),
]);
}
return api_success(['id' => $roleId], '角色已保存');
}
private function normalizeIds(array $values): array
{
return array_values(array_unique(array_filter(array_map('intval', $values), fn (int $item) => $item > 0)));
}
private function accessService(): AdminAccessService
{
return new AdminAccessService();
}
}