Files
cursoradminapiformjifengqiang/app/manager/controller/PackageAuth.php
2025-02-10 10:39:00 +08:00

918 lines
32 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
declare(strict_types=1);
namespace app\manager\controller;
use think\admin\Controller;
use think\admin\service\AdminService;
class PackageAuth extends Controller
{
/**
* 绑定数据表
* @var string
*/
protected $table = 'offer_package_auth';
/**
* 包名权限列表
* @auth true
* @menu true
*/
public function index()
{
if ($this->request->isGet()) {
// 获取所有管理员(排除超级管理员)
$users = $this->app->db->name('system_user')
->where([
['status', '=', 1], // 状态正常的用户
['authorize', 'not like', '%admin%'], // 排除admin权限组的用户
['id', '<>', '10000'] // 排除系统超管账号
])
->field('id,username,authorize')
->order('id asc')
->select()
->filter(function($user) {
// 只显示有包名管理权限的用户
return AdminService::instance()->check('package/index', $user['id']);
})
->toArray();
// 获取现有权限配置
$auths = $this->app->db->name($this->table)
->select()
->toArray();
// 整理权限数据
$authMap = [];
foreach ($auths as $auth) {
$authMap[$auth['user_id']][] = $auth['package_id'];
}
$this->assign([
'users' => $users,
'authMap' => $authMap
]);
$this->fetch();
}
}
/**
* 获取包名列表(分页)
* @auth true
*/
public function getPackageList()
{
if ($this->request->isPost()) {
try {
$page = $this->request->post('page/d', 1);
$limit = $this->request->post('limit/d', 20);
$keyword = $this->request->post('keyword/s', '');
$startTime = $this->request->post('start_time/s', '');
$endTime = $this->request->post('end_time/s', '');
$where = [];
// 只显示启用的包名
$where[] = ['status', '=', 1];
if ($keyword !== '') {
$where[] = ['package_name|name', 'like', "%{$keyword}%"];
}
// 修改时间筛选条件处理方式
if ($startTime && $endTime) {
$where[] = ['add_time', 'between', [
strtotime($startTime),
strtotime($endTime)
]];
}
// 使用正确的表名
$query = $this->app->db->name('offer_package');
// 先获取总数
$total = $query->where($where)->count();
// 获取列表数据
$list = $query->where($where)
->field('id,package_name,name,add_time,update_time,status') // 修改字段名
->order('id desc')
->page($page, $limit)
->select()
->toArray();
// 格式化时间戳
foreach ($list as &$item) {
$item['add_time'] = date('Y-m-d H:i:s', intval($item['add_time']));
$item['update_time'] = date('Y-m-d H:i:s', intval($item['update_time']));
}
// 记录调试信息
trace("包名列表查询:" . json_encode([
'where' => $where,
'page' => $page,
'limit' => $limit,
'total' => $total,
'list_count' => count($list),
'sql' => $query->getLastSql()
], JSON_UNESCAPED_UNICODE));
return json([
'code' => 0,
'msg' => '',
'count' => $total,
'data' => $list
]);
} catch (\Exception $e) {
// 详细记录异常信息
trace("获取包名列表异常:" . $e->getMessage() . "\n" . $e->getTraceAsString());
return json(['code' => 1, 'msg' => '系统异常,请稍后重试!']);
}
}
}
/**
* 获取用户包名权限
* @auth true
* @api true
*/
public function getUserAuth()
{
if ($this->request->isPost()) {
try {
$userId = $this->request->post('user_id/d', 0);
if (empty($userId)) {
return json(['code' => 0, 'info' => '请选择管理员!']);
}
// 只获取包名ID列表
$packageIds = $this->app->db->name($this->table)
->where('user_id', $userId)
->column('package_id'); // 直接返回ID数组
return json([
'code' => 1,
'info' => '获取成功!',
'data' => $packageIds // 直接返回ID数组供 getPackageDetails 使用
]);
} catch (\Exception $e) {
trace("获取用户权限异常:{$e->getMessage()}\n" . $e->getTraceAsString());
return json(['code' => 0, 'info' => '系统异常,请稍后重试!']);
}
}
}
/**
* 批量授权
* @auth true
*/
public function batchAuth()
{
if ($this->request->isPost()) {
try {
$data = $this->_vali([
'user_ids.require' => '请选择管理员!',
'package_ids.require' => '请选择包名!'
]);
// 验证所选用户是否都有包名管理权限
foreach ($data['user_ids'] as $userId) {
if (!AdminService::instance()->check('package/index', $userId)) {
return json(['code' => 0, 'info' => '选中的用户中有人没有包名管理权限!']);
}
}
// 开启事务
$this->app->db->startTrans();
try {
foreach ($data['user_ids'] as $userId) {
// 删除原有权限
$this->app->db->name($this->table)
->where('user_id', $userId)
->delete();
// 添加新权限
$insertData = [];
foreach ($data['package_ids'] as $packageId) {
$insertData[] = [
'user_id' => $userId,
'package_id' => $packageId,
'create_at' => date('Y-m-d H:i:s')
];
}
if (!empty($insertData)) {
$this->app->db->name($this->table)->insertAll($insertData);
}
}
$this->app->db->commit();
sysoplog('积分墙权限', '批量授权成功');
return json(['code' => 1, 'info' => '批量授权成功!']);
} catch (\Exception $e) {
$this->app->db->rollback();
throw $e;
}
} catch (\Exception $e) {
trace("批量授权异常:" . $e->getMessage());
return json(['code' => 0, 'info' => '系统异常请稍后重<E5908E><E9878D><EFBFBD>']);
}
}
}
/**
* 清空
* @auth true
*/
public function clearAuth()
{
if ($this->request->isPost()) {
try {
$post = $this->request->post();
// 验证用户ID
if (empty($post['user_ids']) || !is_array($post['user_ids'])) {
return json(['code' => 0, 'info' => '选择管理员!']);
}
// 开启事务
$this->app->db->startTrans();
try {
foreach ($post['user_ids'] as $userId) {
// 删除用户的所有权限
$this->app->db->name($this->table)
->where('user_id', $userId)
->delete();
}
$this->app->db->commit();
sysoplog('积分墙权限', '权限清空成功');
return json(['code' => 1, 'info' => '权限清空成功!']);
} catch (\Exception $e) {
$this->app->db->rollback();
trace('清空权限事务异常:' . $e->getMessage());
throw $e;
}
} catch (\Exception $e) {
trace("清空权限异常:" . $e->getMessage());
return json(['code' => 0, 'info' => '系统异常,请稍后重试!']);
}
}
}
/**
* 获取包名详情
*/
public function getPackageDetails()
{
if ($this->request->isPost()) {
try {
$packageIds = $this->request->post('package_ids/a', []);
// 记录请求参数
trace("getPackageDetails 请求参数:" . json_encode([
'package_ids' => $packageIds
], JSON_UNESCAPED_UNICODE));
// 如果没有包名ID返回空数组
if (empty($packageIds)) {
trace("getPackageDetails包名ID为空");
return json([
'code' => 1,
'info' => '获取成功!',
'data' => []
]);
}
// 获取包名详情
$packages = $this->app->db->name('offer_package')
->whereIn('id', $packageIds)
->field('id,package_name,name,status')
->select()
->toArray();
return json([
'code' => 1,
'info' => '获取成功!',
'data' => $packages
]);
} catch (\Exception $e) {
trace("getPackageDetails 异常:" . $e->getMessage());
trace("getPackageDetails 异常堆栈:" . $e->getTraceAsString());
return json(['code' => 0, 'info' => '系统异常,请稍后重试!#3']);
}
}
}
/**
* 获取未授权的包名列表
* @auth true
*/
public function getUnauthorizedPackages()
{
// 同时支持 GET 和 POST 请求
$userId = $this->request->param('user_id/d', 0);
$keyword = $this->request->param('keyword/s', '');
$page = $this->request->param('page/d', 1);
$limit = $this->request->param('limit/d', 10);
try {
if (empty($userId)) {
return json(['code' => 0, 'info' => '参数错误!']);
}
// 获取已授权的包名ID
$authorizedIds = $this->app->db->name($this->table)
->where('user_id', $userId)
->column('package_id');
// 构建查询条件
$where = [];
// 排除已授权的包名
if (!empty($authorizedIds)) {
$where[] = ['id', 'not in', $authorizedIds];
}
// 搜索条件
if ($keyword !== '') {
$where[] = ['package_name|name', 'like', "%{$keyword}%"];
}
// 只显示启用的包名
$where[] = ['status', '=', 1];
// 查询数据
$query = $this->app->db->name('offer_package');
// 获取总数
$total = $query->where($where)->count();
// 获取列表
$list = $query->where($where)
->field('id,package_name,name,status')
->order('status desc,id desc')
->limit(($page - 1) * $limit, $limit)
->select()
->toArray();
// 记录调试信息
trace('未授权包名查询:' . json_encode([
'user_id' => $userId,
'keyword' => $keyword,
'where' => $where,
'sql' => $query->getLastSql(),
'total' => $total,
'list_count' => count($list)
], JSON_UNESCAPED_UNICODE));
return json([
'code' => 0, // layui table 要求成功码为 0
'msg' => '', // layui table 使用 msg 而不是 info
'count' => $total,
'data' => $list
]);
} catch (\Exception $e) {
trace("获取未授权包名异常:" . $e->getMessage() . "\n" . $e->getTraceAsString());
return json(['code' => 1, 'msg' => '系统异常,请稍后重试!']); // layui table 要求失败码为非 0
}
}
/**
* 批量添加授权
* @auth true
*/
public function addAuth()
{
if ($this->request->isPost()) {
try {
$userId = $this->request->post('user_id/d', 0);
$packageIds = $this->request->post('package_ids/a');
$isAll = $this->request->post('is_all/d', 0); // 是否全部授权
if (empty($userId)) {
return json(['code' => 0, 'info' => '参数错误!']);
}
// 开启事务
$this->app->db->startTrans();
try {
if ($isAll) {
// 优化: 使用INSERT INTO SELECT语法直接插入
$sql = "INSERT INTO {$this->table} (user_id, package_id, create_at)
SELECT :user_id, id, :create_at
FROM offer_package
WHERE status = 1
AND id NOT IN (
SELECT package_id
FROM {$this->table}
WHERE user_id = :user_id2
)";
$this->app->db->execute($sql, [
'user_id' => $userId,
'user_id2' => $userId,
'create_at' => date('Y-m-d H:i:s')
]);
} else {
if (empty($packageIds)) {
return json(['code' => 0, 'info' => '请选择要授权的包名!']);
}
// 过滤掉已授权的包名
$existIds = $this->app->db->name($this->table)
->where('user_id', $userId)
->whereIn('package_id', $packageIds)
->column('package_id');
$newPackageIds = array_diff($packageIds, $existIds);
if (!empty($newPackageIds)) {
$insertData = array_map(function($packageId) use ($userId) {
return [
'user_id' => $userId,
'package_id' => $packageId,
'create_at' => date('Y-m-d H:i:s')
];
}, $newPackageIds);
$this->app->db->name($this->table)->insertAll($insertData);
}
}
$this->app->db->commit();
sysoplog('积分墙权限', '授权添加成功!');
return json(['code' => 1, 'info' => '授权添加成功!']);
} catch (\Exception $e) {
$this->app->db->rollback();
throw $e;
}
} catch (\Exception $e) {
trace("添加授权异常:" . $e->getMessage());
return json(['code' => 0, 'info' => '系统异常,请稍后重试!']);
}
}
}
/**
* 移除单个包名权限
* @auth true
*/
public function removeAuth()
{
if ($this->request->isPost()) {
try {
$userId = $this->request->post('user_id/d', 0);
$packageId = $this->request->post('package_id/d', 0);
if (empty($userId) || empty($packageId)) {
return json(['code' => 0, 'info' => '参数错误!']);
}
$result = $this->app->db->name($this->table)
->where([
'user_id' => $userId,
'package_id' => $packageId
])
->delete();
if ($result !== false) {
sysoplog('积分墙权限', '权限移除成功!');
return json(['code' => 1, 'info' => '权限移除成功!']);
} else {
return json(['code' => 0, 'info' => '权限移除失败!']);
}
} catch (\Exception $e) {
trace("移除权限异常:" . $e->getMessage());
return json(['code' => 0, 'info' => '系统异常,请稍后重试!']);
}
}
}
/**
* 首页批量授权保存
* @auth true
*/
public function batchSaveAuth()
{
if ($this->request->isPost()) {
try {
$data = $this->_vali([
'user_ids.require' => '请选择管理员!',
'package_ids.require' => '请选择包名!'
]);
// 开启事务
$this->app->db->startTrans();
try {
foreach ($data['user_ids'] as $userId) {
// 删除原有权限
$this->app->db->name($this->table)
->where('user_id', $userId)
->delete();
// 添加新权限
$insertData = [];
foreach ($data['package_ids'] as $packageId) {
$insertData[] = [
'user_id' => $userId,
'package_id' => $packageId,
'create_at' => date('Y-m-d H:i:s')
];
}
if (!empty($insertData)) {
$this->app->db->name($this->table)->insertAll($insertData);
}
}
$this->app->db->commit();
sysoplog('积分墙权限', '批量授权成功!');
return json(['code' => 1, 'info' => '批量授权成功!']);
} catch (\Exception $e) {
$this->app->db->rollback();
throw $e;
}
} catch (\Exception $e) {
trace("首页批量授权异常:" . $e->getMessage());
return json(['code' => 0, 'info' => '系统异常,请稍后重试!']);
}
}
}
/**
* 批量移除包名权限
* @auth true
*/
public function batchRemoveAuth()
{
if ($this->request->isPost()) {
try {
$userId = $this->request->post('user_id/d', 0);
$packageIds = $this->request->post('package_ids/a');
if (empty($userId) || empty($packageIds)) {
return json(['code' => 0, 'info' => '参数错误!']);
}
// 开启事务
$this->app->db->startTrans();
try {
// 批量删除权限
$result = $this->app->db->name($this->table)
->where('user_id', $userId)
->whereIn('package_id', $packageIds)
->delete();
if ($result !== false) {
$this->app->db->commit();
sysoplog('积分墙权限', '批量移除成功!');
return json(['code' => 1, 'info' => '批量移除成功!']);
} else {
$this->app->db->rollback();
return json(['code' => 0, 'info' => '批量移除失败!']);
}
} catch (\Exception $e) {
$this->app->db->rollback();
throw $e;
}
} catch (\Exception $e) {
trace("批移除权限异:" . $e->getMessage());
return json(['code' => 0, 'info' => '系统异常,请稍后重试!']);
}
}
}
/**
* 显示权限详情页面
* @auth true
*/
public function authDetail()
{
try {
$userId = input('user_id/d');
if (!$userId) {
$this->error('参数错误');
}
// 获取用户基本信息
$user = $this->app->db->name('system_user')
->where('id', $userId)
->field('id,username,status,create_at')
->find();
if (!$user) {
$this->error('用户不存在');
}
// 获取用户权限统计
$stats = [
'total' => $this->app->db->name($this->table)
->where('user_id', $userId)
->count(),
'active' => $this->app->db->name('offer_package')
->alias('p')
->join("{$this->table} a", 'p.id = a.package_id')
->where([
'a.user_id' => $userId,
'p.status' => 1
])
->count()
];
$this->assign([
'user' => $user,
'stats' => $stats,
'title' => '授权包名管理'
]);
return $this->fetch();
} catch (\Exception $e) {
$this->app->log->error("显示权限详情页面异常:{$e->getMessage()}");
$this->error('系统异常,请稍后重试!');
}
}
/**
* 获取权限详情数据
* @auth true
* @api true
*/
public function getAuthDetailData()
{
try {
$get = $this->_vali([
'user_id.require' => '用户ID不能为空',
'type.require' => '类型不能为空',
'page.default' => 1,
'limit.default' => 20,
'keyword.default' => '',
'sort.default' => 'id',
'order.default' => 'desc'
]);
// 确保分页参数为整数
$page = intval($get['page']);
$limit = intval($get['limit']);
// 构建基础查询
$query = $this->app->db->name('offer_package')
->alias('p');
if ($get['type'] === 'authorized') {
// 已授权包名查询
$query->join("{$this->table} a", 'p.id = a.package_id')
->where('a.user_id', $get['user_id']);
} else {
// 未授权包名查询
$query->whereNotExists(function($query) use ($get) {
$query->table($this->table)
->where('package_id=p.id')
->where('user_id', $get['user_id']);
})
->where('p.status', 1);
}
// 关键词搜索
if ($get['keyword'] !== '') {
$query->whereLike('p.package_name|p.name', "%{$get['keyword']}%");
}
// 获取总数
$total = $query->count();
// 获取列表数据
$list = $query->field([
'p.id',
'p.package_name',
'p.name',
'p.status',
$get['type'] === 'authorized' ? 'a.create_at' : 'p.add_time as create_at'
])
->order("{$get['sort']} {$get['order']}")
->page($page, $limit) // 使用转换后的整数值
->select()
->toArray();
// 格式化时间
foreach ($list as &$item) {
$item['create_at'] = format_datetime($item['create_at']);
$item['status_text'] = $item['status'] ? '启用' : '停用';
}
return json([
'code' => 0,
'msg' => '',
'count' => $total,
'data' => $list
]);
} catch (\Exception $e) {
trace("获取权限详情数据异常:" . $e->getMessage() . "\n" . $e->getTraceAsString());
return json(['code' => 1, 'msg' => '系统异常,请稍后重试!']);
}
}
/**
* 获取已授权的包名列表
* @auth true
*/
public function getAuthorizedPackages()
{
try {
$userId = $this->request->param('user_id/d', 0);
$keyword = $this->request->param('keyword/s', '');
$page = $this->request->param('page/d', 1);
$limit = $this->request->param('limit/d', 10);
if (empty($userId)) {
return json(['code' => 1, 'msg' => '参数错误']);
}
// 优化1: 使用子查询优化 JOIN
$query = $this->app->db->name('offer_package')
->whereExists(function($query) use ($userId) {
$query->table($this->table)
->where('package_id=offer_package.id')
->where('user_id', $userId);
})
->where('status', 1);
// 优化2: 添加索引字段的索条件
if ($keyword !== '') {
$query->where(function($query) use ($keyword) {
$query->whereOr([
['package_name', 'like', "%{$keyword}%"],
['name', 'like', "%{$keyword}%"]
]);
});
}
// 优化3: 使用子查询获取总数,避免重复JOIN
$total = $query->count();
// 优化4: 只查询需要的字段
$list = $query->field([
'id',
'package_name',
'name',
'status',
"(SELECT create_at FROM {$this->table} WHERE package_id=offer_package.id AND user_id={$userId} LIMIT 1) as create_at"
])
->order('id desc')
->page($page, $limit)
->select()
->toArray();
// 优化5: 添加缓存
$cacheKey = "auth_packages_{$userId}_{$page}_{$limit}_" . md5($keyword);
cache($cacheKey, $list, 300); // 缓存5分钟
return json([
'code' => 0,
'msg' => '',
'count' => $total,
'data' => $list
]);
} catch (\Exception $e) {
trace("获取已授权包名列表异常:" . $e->getMessage() . "\n" . $e->getTraceAsString());
return json(['code' => 1, 'msg' => '系统异常,请稍后重试!']);
}
}
/**
* 获取授权包名列表(分页)
* @auth true
* @api true
*/
public function getAuthPackageList()
{
try {
$get = $this->_vali([
'user_id.require' => '用户ID不能为空',
'page.default' => 1,
'limit.default' => 10,
'keyword.default' => '',
'status.default' => 1,
'sort.default' => 'id',
'order.default' => 'desc'
]);
// 构建基础查询
$query = $this->app->db->name('offer_package')
->alias('p')
->join("{$this->table} a", 'p.id = a.package_id')
->where([
'a.user_id' => $get['user_id'],
'p.status' => $get['status']
]);
// 关键词搜索
if ($get['keyword'] !== '') {
$query->whereLike('p.package_name|p.name', "%{$get['keyword']}%");
}
// 获取总数
$total = $query->count();
// 获取分页数据
$list = $query->field([
'p.id',
'p.package_name',
'p.name',
'p.status',
'a.create_at',
'p.update_time'
])
->order("{$get['sort']} {$get['order']}")
->limit(($get['page'] - 1) * $get['limit'], $get['limit'])
->select()
->toArray();
// 格式化时间
foreach ($list as &$item) {
$item['create_at'] = format_datetime($item['create_at']);
$item['update_time'] = format_datetime($item['update_time']);
}
// 使用缓存
$cacheKey = "auth_package_list_{$get['user_id']}_{$get['page']}_{$get['limit']}_" . md5($get['keyword']);
cache($cacheKey, [
'total' => $total,
'list' => $list
], 300); // 缓存5分钟
return json([
'code' => 0,
'msg' => 'success',
'total' => $total,
'list' => $list,
'page' => $get['page'],
'limit' => $get['limit']
]);
} catch (\Exception $e) {
$this->app->log->error("获取授权包名列表异常:{$e->getMessage()}");
return json([
'code' => 1,
'msg' => '获取数据失败:' . $e->getMessage()
]);
}
}
/**
* 获取授权包名统计
* @auth true
* @api true
*/
public function getAuthPackageStats()
{
try {
$userId = input('user_id/d', 0);
if (empty($userId)) {
return json(['code' => 1, 'msg' => '用户ID不能为空']);
}
// 获取统计数据
$stats = [
'total' => $this->app->db->name($this->table)
->where('user_id', $userId)
->count(),
'active' => $this->app->db->name('offer_package')
->alias('p')
->join("{$this->table} a", 'p.id = a.package_id')
->where([
'a.user_id' => $userId,
'p.status' => 1
])
->count(),
'latest' => $this->app->db->name($this->table)
->where('user_id', $userId)
->order('create_at desc')
->value('create_at')
];
$stats['latest'] = $stats['latest'] ? format_datetime($stats['latest']) : '';
return json([
'code' => 0,
'msg' => 'success',
'data' => $stats
]);
} catch (\Exception $e) {
$this->app->log->error("获取授权包名统计异常:{$e->getMessage()}");
return json([
'code' => 1,
'msg' => '获取统计失败:' . $e->getMessage()
]);
}
}
}