122 lines
3.8 KiB
PHP
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 ?? [],
|
|
];
|
|
}
|
|
}
|