登录注册

This commit is contained in:
liu
2026-07-15 12:07:32 +08:00
parent 9eed7c87f6
commit 93c65b56f6
9 changed files with 1231 additions and 51 deletions
+69 -5
View File
@@ -4,6 +4,7 @@ namespace App\Http\Controllers;
use App\Http\Requests\UserRegisterRequest;
use App\Models\UserModel;
use App\Services\Wechat\MiniProgramService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
@@ -16,11 +17,9 @@ use Modules\Common\Trait\RequestJson;
class IndexController
{
use RequestJson;
// 权限验证白名单
protected array $noPermission = ['index', 'login', 'register', 'mail'];
/** 获取首页信息 */
#[GetRoute('/index')]
#[GetRoute('/index', false)]
public function index(): JsonResponse
{
$web_setting = site_config('web');
@@ -29,7 +28,7 @@ class IndexController
}
/** 用户登录 */
#[PostRoute('/login')]
#[PostRoute('/login', false)]
public function login(Request $request): JsonResponse
{
$credentials = $request->validate([
@@ -46,7 +45,7 @@ class IndexController
}
/** 用户注册 */
#[PostRoute('/register')]
#[PostRoute('/register', false)]
public function register(UserRegisterRequest $request): JsonResponse
{
$data = $request->validated();
@@ -60,4 +59,69 @@ class IndexController
return $this->error('创建用户失败');
}
/**
* 小程序登录
*
* 仅需 code 完成 openid 换取,首次登录使用默认昵称和头像,
* 用户信息后续通过编辑接口完善。
*/
#[PostRoute('/wx/login', false)]
public function loginMiniProgram(Request $request, MiniProgramService $miniProgram): JsonResponse
{
$validated = $request->validate([
'code' => 'required|string',
'phoneCode' => 'nullable|string',
]);
// 1. 通过 code 换取 openid、session_key、unionid
$session = $miniProgram->codeToSession($validated['code']);
// 2. 构建用户数据,昵称/头像/性别使用默认值
$userData = [
'openid' => $session['openid'],
'unionid' => $session['unionid'] ?? '',
'username' => 'wx_'.uniqid(),
'nickname' => '微信用户',
'avatar' => '',
'gender' => 0,
'password' => '',
];
// 3. 解密手机号
if (! empty($validated['phoneCode'])) {
try {
$phoneInfo = $miniProgram->getPhoneNumber($validated['phoneCode']);
$userData['mobile'] = $phoneInfo['phone_info']['purePhoneNumber'] ?? '';
} catch (\Throwable) {
// 手机号解密失败不阻塞登录
}
}
// 4. 查找或创建用户
$user = UserModel::firstOrCreate(
['openid' => $userData['openid']],
$userData
);
// 5. 更新已有用户缺失的手机号和 unionid
$needUpdate = false;
foreach (['mobile', 'unionid'] as $field) {
if (! empty($userData[$field]) && empty($user->$field)) {
$user->$field = $userData[$field];
$needUpdate = true;
}
}
if ($needUpdate) {
$user->save();
}
// 6. 创建 Sanctum token
$token = $user->createToken($user->username)->toArray();
return $this->success([
'token' => $token['plainTextToken'],
'user' => $user->toArray(),
], __('user.login_success'));
}
}
+30 -35
View File
@@ -21,48 +21,43 @@ class UserController
#[GetRoute]
public function getUserInfo(): JsonResponse
{
$info = auth()->user();
return $this->success(compact('info'));
}
$user = UserModel::query()->find(auth()->id());
#[PostRoute('/logout')]
public function logout(): JsonResponse
{
$user_id = auth('users')->id();
$model = new UserModel;
if ($model->logout($user_id)) {
return $this->success('退出登录成功');
} else {
return $this->error($model->getErrorMsg());
if (! $user) {
return $this->error('用户不存在');
}
$data = $user->toArray();
// 手机号脱敏:13812345678 → 138****5678
if (! empty($data['mobile'])) {
$data['mobile'] = substr_replace($data['mobile'], '****', 3, 4);
}
// 邮箱脱敏:test@example.com → t***@example.com
if (! empty($data['email'])) {
$parts = explode('@', $data['email']);
$parts[0] = substr($parts[0], 0, 1).'***';
$data['email'] = implode('@', $parts);
}
return $this->success($data);
}
#[PutRoute]
public function setUserInfo(UserUpdateInfoRequest $request): JsonResponse
{
UserModel::where('user_id', auth('user')->id())->update($request->validated());
return $this->error('更新成功');
}
#[PostRoute('/setPwd')]
public function setPassword(Request $request): JsonResponse
/** 编辑用户信息(头像、昵称、性别) */
#[PutRoute('/profile')]
public function updateProfile(Request $request): JsonResponse
{
$data = $request->validate([
'oldPassword' => 'required|string|max:20',
'newPassword' => 'required|string|min:6|max:20',
'rePassword' => 'required|same:newPassword',
'avatar' => 'required|string|max:500',
'nickname' => 'required|string|max:32',
'gender' => 'required|integer|in:0,1,2',
]);
$user_id = auth('user')->id();
$user = UserModel::query()->find($user_id);
if (! password_verify($data['oldPassword'], $user['password'])) {
return $this->error('旧密码不正确!');
}
$user->password = password_hash($data['newPassword'], PASSWORD_DEFAULT);
if ($user->save()) {
return $this->success('更新成功');
}
return $this->error('更新失败');
$user = UserModel::query()->find(auth()->id());
$user->update($data);
return $this->success($user->toArray(), '更新成功');
}
}