Files
pk10/App/Controllers/Admin/UserController.php
T

360 lines
10 KiB
PHP
Executable File
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
namespace App\Controllers\Admin;
use App\Core\AdminBaseController;
use Db\Database;
class UserController extends AdminBaseController {
/**
* 构造函数 - 验证管理员权限
*/
public function __construct() {
$this->checkLogin();
}
/**
* 用户列表页面
*/
public function index() {
$this->checkAdmin();
$db = new Database();
// 只查询普通用户,排除管理员
$users = $db->select('users', '*', [
'role[!]' => 'admin',
'ORDER' => ['id' => 'DESC']
]);
$this->render('Admin/user.php', [
'users' => $users,
'title' => '用户管理'
]);
}
/**
* 获取单个用户数据(用于编辑和详情)
*/
public function get($id) {
header('Content-Type: application/json');
if (empty($id) || !is_numeric($id)) {
echo json_encode([
'success' => false,
'message' => '无效的用户ID'
]);
return;
}
$db = new Database();
$user = $db->get('users', '*', [
'id' => $id
]);
if ($user) {
// 移除密码字段,避免泄露
unset($user['password']);
echo json_encode([
'success' => true,
'data' => $user
]);
} else {
echo json_encode([
'success' => false,
'message' => '用户不存在'
]);
}
}
public function update() {
header('Content-Type: application/json');
$data = $_POST;
if (empty($data)) {
echo json_encode([
'success' => false,
'message' => '未接收到数据'
]);
return;
}
$db = new Database();
$id = isset($data['id']) ? (int)$data['id'] : 0;
$isEditMode = $id > 0;
$username = trim($data['username'] ?? '');
$email = trim($data['email'] ?? '');
$role = $data['role'] ?? 'user';
$status = isset($data['status']) ? (int)$data['status'] : 0;
if (empty($username) || empty($email)) {
echo json_encode([
'success' => false,
'message' => '用户名和邮箱不能为空'
]);
return;
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo json_encode([
'success' => false,
'message' => '邮箱格式不正确'
]);
return;
}
// 统一查重(排除当前 ID
$exists = $db->get('users', '*', [
'AND' => [
'OR' => [
'username' => $username,
'email' => $email
],
'id[!]' => $id
]
]);
if ($exists) {
if ($exists['username'] === $username) {
$msg = '用户名已存在';
} elseif ($exists['email'] === $email) {
$msg = '邮箱已被使用';
} else {
$msg = '用户名或邮箱已被占用';
}
echo json_encode([
'success' => false,
'message' => $msg
]);
return;
}
// 准备数据
$userData = [
'username' => $username,
'email' => $email,
'role' => $role,
'status' => $status,
'updated_at' => date('Y-m-d H:i:s')
];
try {
if ($isEditMode) {
// 如果密码不为空,更新密码
if (!empty($data['password'])) {
if (strlen($data['password']) < 8) {
echo json_encode([
'success' => false,
'message' => '密码长度至少8位'
]);
return;
}
$userData['password'] = password_hash($data['password'], PASSWORD_DEFAULT);
}
$db->update('users', $userData, ['id' => $id]);
$message = '用户更新成功';
} else {
// 新增时必须有密码
if (empty($data['password']) || strlen($data['password']) < 8) {
echo json_encode([
'success' => false,
'message' => '密码长度至少8位'
]);
return;
}
$userData['password'] = password_hash($data['password'], PASSWORD_DEFAULT);
$userData['created_at'] = date('Y-m-d H:i:s');
$id = $db->insert('users', $userData);
$message = '用户创建成功';
}
echo json_encode([
'success' => true,
'message' => $message,
'data' => ['id' => $id]
]);
} catch (\Exception $e) {
echo json_encode([
'success' => false,
'message' => '操作失败:' . $e->getMessage()
]);
}
}
/**
* 调整用户余额
*/
public function adjustBalance($id) {
header('Content-Type: application/json');
if (empty($id) || !is_numeric($id)) {
echo json_encode([
'success' => false,
'message' => '无效的用户ID'
]);
return;
}
$rawData = file_get_contents('php://input');
$data = json_decode($rawData, true);
if (json_last_error() !== JSON_ERROR_NONE) {
echo json_encode([
'success' => false,
'message' => '数据格式错误'
]);
return;
}
$amount = isset($data['amount']) ? floatval($data['amount']) : 0;
$action = $data['action'] ?? ''; // 'increase' or 'decrease'
if ($amount <= 0) {
echo json_encode([
'success' => false,
'message' => '金额必须大于0'
]);
return;
}
if (!in_array($action, ['increase', 'decrease'])) {
echo json_encode([
'success' => false,
'message' => '无效的操作类型'
]);
return;
}
$db = new Database();
// 获取当前用户信息
$user = $db->get('users', ['id', 'balance', 'username'], [
'id' => $id,
'role[!]' => 'admin' // 只能调整普通用户的余额
]);
if (!$user) {
echo json_encode([
'success' => false,
'message' => '用户不存在或无法操作'
]);
return;
}
$currentBalance = floatval($user['balance'] ?? 0);
$newBalance = $action === 'increase'
? $currentBalance + $amount
: $currentBalance - $amount;
// 检查减少后余额不能为负数
if ($newBalance < 0) {
echo json_encode([
'success' => false,
'message' => '余额不足,当前余额:' . number_format($currentBalance, 2)
]);
return;
}
try {
$db->medoo->pdo->beginTransaction();
// 更新用户余额
$db->update('users', [
'balance' => $newBalance,
'updated_at' => date('Y-m-d H:i:s')
], ['id' => $id]);
// 写入资金流水
// 修改这里:使用 manual_deposit 和 manual_withdraw 区分人工操作
$transactionType = $action === 'increase' ? 'manual_deposit' : 'manual_withdraw';
$transactionAmount = $action === 'increase' ? $amount : -$amount;
$description = $action === 'increase' ? '管理员手动增加余额' : '管理员手动减少余额';
$db->insert('transactions', [
'user_id' => $id,
'type' => $transactionType,
'amount' => $transactionAmount,
'balance_before' => $currentBalance,
'balance_after' => $newBalance,
'description' => $description,
'created_at' => date('Y-m-d H:i:s')
]);
$db->medoo->pdo->commit();
$actionText = $action === 'increase' ? '增加' : '减少';
echo json_encode([
'success' => true,
'message' => "余额{$actionText}成功",
'data' => [
'old_balance' => $currentBalance,
'new_balance' => $newBalance,
'amount' => $amount
]
]);
} catch (\Exception $e) {
$db->medoo->pdo->rollBack();
echo json_encode([
'success' => false,
'message' => '操作失败:' . $e->getMessage()
]);
}
}
/**
* 删除用户
*/
public function delete($id) {
header('Content-Type: application/json');
if (empty($id) || !is_numeric($id)) {
echo json_encode([
'success' => false,
'message' => '无效的用户ID'
]);
return;
}
// 禁止删除自己
session_start();
if ($id == $_SESSION['user_id']) {
echo json_encode([
'success' => false,
'message' => '不能删除当前登录用户'
]);
return;
}
$db = new Database();
$userExists = $db->get('users', 'id', [
'id' => $id
]);
if (!$userExists) {
echo json_encode([
'success' => false,
'message' => '用户不存在'
]);
return;
}
try {
$db->delete('users', [
'id' => $id
]);
echo json_encode([
'success' => true,
'message' => '用户已删除'
]);
} catch (\Exception $e) {
echo json_encode([
'success' => false,
'message' => '删除失败:' . $e->getMessage()
]);
}
}
}