Initial commit: ThinkPHP refactor (tp)

Made-with: Cursor
This commit is contained in:
nepiedg
2026-04-02 02:13:12 +00:00
commit 166940d5a6
127 changed files with 22225 additions and 0 deletions
+201
View File
@@ -0,0 +1,201 @@
<?php
declare(strict_types=1);
namespace app\api\service;
use app\api\common\Jwt;
use app\api\model\Member;
/**
* 认证服务
* 处理用户登录、注册、Token 管理等
*/
class AuthService
{
/**
* 用户登录
* @param string $username 用户名
* @param string $password 密码
* @return array
* @throws \Exception
*/
public function login(string $username, string $password): array
{
// 查找用户
$member = Member::findByUsername($username);
if (!$member) {
throw new \Exception('用户名或密码错误', 4001);
}
// 检查是否被禁用
if ($member->isDisabled()) {
$member->logLogin(false, 'password');
throw new \Exception('账号已被禁用', 4002);
}
// 验证密码
if (!$member->verifyPassword($password)) {
$member->logLogin(false, 'password');
throw new \Exception('用户名或密码错误', 4001);
}
// 检查是否过期
if ($member->isExpired()) {
$member->logLogin(false, 'password');
throw new \Exception('账号已过期,请联系客服续费', 4003);
}
// 密码升级:旧MD5格式自动升级为bcrypt
if (strlen($member->password) === 32) {
$member->upgradePassword($password);
}
// 记录登录日志
$member->logLogin(true, 'password');
// 生成 Token
$token = Jwt::encode([
'userid' => $member->userid,
'username' => $member->username,
'v_type' => $member->v_type,
]);
$refreshToken = Jwt::refreshToken($member->userid);
// 返回用户信息
return [
'token' => $token,
'refresh_token' => $refreshToken,
'expires_in' => config('jwt.expire', 604800),
'user' => [
'userid' => $member->userid,
'username' => $member->username,
'v_type' => $member->v_type,
'endtime' => $member->endtime,
'formtypeid' => $member->formtypeid,
],
];
}
/**
* 用户注册
* @param string $username 用户名
* @param string $password 密码
* @param string|null $email 邮箱
* @param int|null $formtypeid 代理商ID
* @return array
* @throws \Exception
*/
public function register(string $username, string $password, ?string $email = null, ?int $formtypeid = null): array
{
// 检查用户名是否已存在
$exists = Member::findByUsername($username);
if ($exists) {
throw new \Exception('用户名已存在', 4004);
}
// 创建用户
$member = new Member();
$member->username = $username;
$member->password = password_hash($password, PASSWORD_DEFAULT);
$member->email = $email;
$member->formtypeid = $formtypeid ?? 0;
$member->v_type = 0; // 默认套餐
$member->disabled = 0;
$member->endtime = 0;
$member->regtime = time();
$member->regip = request()->ip();
if (!$member->save()) {
throw new \Exception('注册失败,请稍后重试', 5001);
}
// 自动登录
return $this->login($username, $password);
}
/**
* 刷新 Token
* @param string $refreshToken
* @return array
* @throws \Exception
*/
public function refreshToken(string $refreshToken): array
{
$payload = Jwt::decode($refreshToken);
if (!$payload || ($payload['type'] ?? '') !== 'refresh') {
throw new \Exception('无效的刷新令牌', 4005);
}
$member = Member::findByUserid($payload['userid']);
if (!$member || $member->isDisabled()) {
throw new \Exception('用户不存在或已被禁用', 4002);
}
// 生成新 Token
$token = Jwt::encode([
'userid' => $member->userid,
'username' => $member->username,
'v_type' => $member->v_type,
]);
return [
'token' => $token,
'expires_in' => config('jwt.expire', 604800),
];
}
/**
* 获取用户信息
* @param int $userid
* @return array
* @throws \Exception
*/
public function getUserInfo(int $userid): array
{
$member = Member::findByUserid($userid);
if (!$member) {
throw new \Exception('用户不存在', 4006);
}
// 获取套餐信息
$productInfo = $member->getProductInfo();
return [
'userid' => $member->userid,
'username' => $member->username,
'v_type' => $member->v_type,
'endtime' => $member->endtime,
'formtypeid' => $member->formtypeid,
'disabled' => $member->disabled,
'product' => $productInfo ? [
'v_type' => $productInfo['v_type'] ?? null,
'video_num' => $productInfo['video_num'] ?? 0,
'account_num' => $productInfo['account_num'] ?? 0,
] : null,
];
}
/**
* 修改密码
* @param int $userid
* @param string $oldPassword
* @param string $newPassword
* @return bool
* @throws \Exception
*/
public function changePassword(int $userid, string $oldPassword, string $newPassword): bool
{
$member = Member::findByUserid($userid);
if (!$member) {
throw new \Exception('用户不存在', 4006);
}
if (!$member->verifyPassword($oldPassword)) {
throw new \Exception('原密码错误', 4007);
}
$member->password = password_hash($newPassword, PASSWORD_DEFAULT);
return $member->save();
}
}