Files
2026-07-22 10:18:59 +08:00

122 lines
3.8 KiB
PHP

<?php
namespace app\controller\api;
use app\model\User;
use app\service\JwtService;
use app\service\SettingsService;
class Auth extends BaseApi
{
public function register()
{
$allow = SettingsService::get('allow_register', true);
if ($allow !== true && $allow !== 'true') {
return $this->error('当前不允许注册');
}
$input = $this->request->post();
$username = trim($input['username'] ?? '');
$email = trim($input['email'] ?? '');
$password = $input['password'] ?? '';
if (strlen($username) < 3 || strlen($username) > 50) {
return $this->error('用户名长度需 3-50 个字符');
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return $this->error('邮箱格式不正确');
}
if (strlen($password) < 6) {
return $this->error('密码至少 6 位');
}
if (User::where('username', $username)->whereOr('email', $email)->find()) {
return $this->error('用户名或邮箱已存在');
}
$user = User::create([
'username' => $username,
'email' => $email,
'password_hash' => password_hash($password, PASSWORD_BCRYPT),
'nickname' => $username,
'membership_level_id' => 1,
]);
$token = JwtService::generateToken(['user_id' => $user->id]);
return $this->success([
'token' => $token,
'user' => $this->formatUser($user->id),
], '注册成功');
}
public function login()
{
$input = $this->request->post();
$account = trim($input['account'] ?? '');
$password = $input['password'] ?? '';
if (!$account || !$password) {
return $this->error('请输入账号和密码');
}
$user = User::where(function ($query) use ($account) {
$query->where('username', $account)->whereOr('email', $account);
})->where('status', 'active')->find();
if (!$user || !password_verify($password, $user->password_hash)) {
return $this->error('账号或密码错误', 401);
}
$user->save(['last_login_at' => date('Y-m-d H:i:s')]);
$token = JwtService::generateToken(['user_id' => $user->id]);
return $this->success([
'token' => $token,
'user' => $this->formatUser($user->id),
], '登录成功');
}
public function me()
{
return $this->success($this->authUser());
}
public function updateProfile()
{
$user = $this->authUser();
$nickname = trim($this->request->put('nickname', ''));
if ($nickname) {
User::where('id', $user['id'])->update(['nickname' => $nickname]);
}
return $this->success($this->formatUser($user['id']));
}
public function logout()
{
return $this->success(null, '已退出');
}
private function formatUser(int $userId): array
{
$user = User::with(['membership'])->find($userId);
$level = $user->membership;
return [
'id' => $user->id,
'username' => $user->username,
'email' => $user->email,
'nickname' => $user->nickname,
'avatar' => $user->avatar,
'role' => $user->role,
'membership_name' => $level?->name,
'membership_slug' => $level?->slug,
'max_conversations' => $level?->max_conversations,
'max_messages_per_day' => $level?->max_messages_per_day,
'membership_permissions' => $level?->permissions ?? [],
];
}
}