Files
wushu/ht/tapi.php
2026-03-30 02:35:31 +08:00

287 lines
7.4 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
/**
* 统一API接口
* 支持POST和GET请求方式
* 提供用户登录、注册、获取用户信息等功能
*/
// 引入必要文件
require_once 'inc/pubs.php';
require_once 'inc/sqls.php';
// 设置响应头
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization');
// 处理OPTIONS预检请求
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
http_response_code(200);
exit;
}
// 获取请求参数支持GET和POST
function getRequestParams() {
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
return $_GET;
} elseif ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (isset($_SERVER['CONTENT_TYPE']) && strpos($_SERVER['CONTENT_TYPE'], 'application/json') !== false) {
$json = file_get_contents('php://input');
return json_decode($json, true) ?: [];
}
return $_POST;
}
return [];
}
// 获取请求参数
$params = getRequestParams();
// 获取操作类型
$action = isset($params['act']) ? $params['act'] : '';
// 实例化数据库操作类
$db = new DB();
// 根据操作类型执行相应操作
switch ($action) {
// 用户登录
case 'login':
handleLogin($params, $db);
break;
// 用户注册
case 'register':
handleRegister($params, $db);
break;
// 获取用户信息
case 'getUserInfo':
handleGetUserInfo($params, $db);
break;
// 更新用户标识
case 'updateUserIdentifier':
handleUpdateUserIdentifier($params, $db);
break;
// 用户登出
case 'logout':
handleLogout();
break;
// 未知操作
default:
apiResponse(1, '未知操作');
break;
}
/**
* 处理用户登录
* @param array $params 请求参数
* @param DB $db 数据库操作对象
*/
function handleLogin($params, $db) {
// 获取参数
$username = isset($params['username']) ? safeFilter($params['username']) : '';
$password = isset($params['password']) ? $params['password'] : '';
// 参数验证
if (empty($username) || empty($password)) {
apiResponse(1, '账号和密码不能为空');
}
// 查询用户
$user = $db->getOne('users', "username = '$username'");
// 验证用户和密码
if (!$user || !password_verify($password, $user['password'])) {
apiResponse(1, '账号或密码错误');
}
// 验证用户状态
if ($user['status'] != 1) {
apiResponse(1, '账号已被禁用,请联系管理员');
}
// 更新最后登录时间
$db->update('users', [
'logtime' => date('Y-m-d H:i:s')
], "id = {$user['id']}");
// 记录登录日志
writeLog($user['id'], 'login', '用户登录');
// 存储session
session_start();
$_SESSION['user'] = $user;
// 移除敏感信息
unset($user['password']);
apiResponse(0, '登录成功', $user);
}
/**
* 处理用户注册
* @param array $params 请求参数
* @param DB $db 数据库操作对象
*/
function handleRegister($params, $db) {
// 获取参数
$username = isset($params['username']) ? safeFilter($params['username']) : '';
$password = isset($params['password']) ? $params['password'] : '';
$userIdentifier = isset($params['user_identifier']) ? safeFilter($params['user_identifier']) : '';
// 参数验证
if (empty($username) || empty($password)) {
apiResponse(1, '账号和密码不能为空');
}
// 验证账号格式(手机号/邮箱/微信号)
$phoneRegex = '/^1[3456789]\d{9}$/';
$emailRegex = '/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/';
$wechatRegex = '/^[a-zA-Z0-9_-]{6,20}$/';
if (!preg_match($phoneRegex, $username) && !preg_match($emailRegex, $username) && !preg_match($wechatRegex, $username)) {
apiResponse(1, '请输入正确的手机号、邮箱或微信号');
}
// 验证密码长度
if (strlen($password) < 6) {
apiResponse(1, '密码长度不能少于6位');
}
// 检查用户名是否已存在
$existUser = $db->getOne('users', "username = '$username'");
if ($existUser) {
apiResponse(1, '该账号已被注册');
}
// 密码加密
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
// 添加用户
$userId = $db->insert('users', [
'username' => $username,
'password' => $hashedPassword,
'irole' => 0, // 普通用户
'status' => 1, // 正常状态
'regtime' => date('Y-m-d H:i:s'),
'user_identifier' => $userIdentifier
]);
if (!$userId) {
apiResponse(1, '注册失败,请稍后重试');
}
// 记录注册日志
writeLog($userId, 'register', '用户注册');
apiResponse(0, '注册成功');
}
/**
* 处理获取用户信息
* @param array $params 请求参数
* @param DB $db 数据库操作对象
*/
function handleGetUserInfo($params, $db) {
// 检查登录状态
$user = checkLogin();
if (!$user) {
apiResponse(1, '请先登录');
}
// 获取最新的用户信息
$userInfo = $db->getOne('users', "id = {$user['id']}");
if (!$userInfo) {
apiResponse(1, '用户不存在');
}
// 移除敏感信息
unset($userInfo['password']);
apiResponse(0, '获取成功', $userInfo);
}
/**
* 处理更新用户标识
* @param array $params 请求参数
* @param DB $db 数据库操作对象
*/
function handleUpdateUserIdentifier($params, $db) {
// 检查登录状态
$user = checkLogin();
if (!$user) {
apiResponse(1, '请先登录');
}
// 获取参数
$userIdentifier = isset($params['user_identifier']) ? safeFilter($params['user_identifier']) : '';
// 验证用户标识长度
if (strlen($userIdentifier) > 100) {
apiResponse(1, '用户标识长度不能超过100个字符');
}
// 更新用户标识
$result = $db->update('users', [
'user_identifier' => $userIdentifier
], "id = {$user['id']}");
if (!$result) {
apiResponse(1, '更新失败,请稍后重试');
}
// 记录日志
writeLog($user['id'], 'update_identifier', '更新用户标识');
// 获取更新后的用户信息
$updatedUser = $db->getOne('users', "id = {$user['id']}");
// 移除敏感信息
unset($updatedUser['password']);
// 更新session
session_start();
$_SESSION['user'] = $updatedUser;
apiResponse(0, '更新成功', $updatedUser);
}
/**
* 处理用户登出
*/
function handleLogout() {
session_start();
// 记录登出日志
if (isset($_SESSION['user']) && !empty($_SESSION['user']['id'])) {
writeLog($_SESSION['user']['id'], 'logout', '用户登出');
}
// 清除session
unset($_SESSION['user']);
session_destroy();
apiResponse(0, '登出成功');
}
/**
* 统一API响应格式
* @param int $code 状态码0表示成功非0表示失败
* @param string $msg 提示信息
* @param array $data 返回数据
*/
function apiResponse($code = 0, $msg = '', $data = []) {
echo json_encode([
'code' => $code,
'msg' => $msg,
'data' => $data
], JSON_UNESCAPED_UNICODE);
exit;
}