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() ]); } } }