validated(); $username = $credentials['username']; $password = $credentials['password']; $ip = $request->ip(); $user = User::where('username', $username)->first(); if ($user) { // 用户存在,验证密码 if (Hash::check($password, $user->password)) { // Bcrypt 验证通过 $this->performLogin($user, $ip); return response()->json(['status' => 'success', 'message' => '登录成功']); } // 退化为 MD5 验证(兼容原 ASP 系统的老密码) if (md5($password) === $user->password) { // MD5 验证通过,升级密码为 Bcrypt $user->password = Hash::make($password); $user->save(); $this->performLogin($user, $ip); return response()->json(['status' => 'success', 'message' => '登录成功,且安全策略已自动升级']); } // 密码错误 return response()->json([ 'status' => 'error', 'message' => '密码错误,请重试。', ], 422); } // --- 核心:第一次登录即为注册 --- $newUser = User::create([ 'username' => $username, 'password' => Hash::make($password), 'first_ip' => $ip, 'last_ip' => $ip, 'user_level' => 1, // 默认普通用户等级 'sex' => 0, // 默认性别: 0保密 1男 2女 // 如果原表里还有其他必填字段,在这里初始化默认值 ]); $this->performLogin($newUser, $ip); return response()->json(['status' => 'success', 'message' => '注册并登录成功!']); } /** * 执行实际的登录操作并记录时间、IP 等。 */ private function performLogin(User $user, string $ip): void { Auth::login($user); // 更新最后登录IP和时间 $user->update([ 'last_ip' => $ip, 'log_time' => now(), 'in_time' => now(), ]); // 可选:将用户登录状态也同步写入原有的 IpLog 模型,以便数据归档查询 \App\Models\IpLog::create([ 'ip' => $ip, 'sdate' => now(), 'uuname' => $user->username, ]); } /** * 退出登录,清除会话后跳转回登录首页 */ public function logout(Request $request): \Illuminate\Http\RedirectResponse { if (Auth::check()) { $user = Auth::user(); // 记录退出时间 $user->update(['out_time' => now()]); } Auth::logout(); $request->session()->invalidate(); $request->session()->regenerateToken(); return redirect('/')->with('success', '您已成功退出聊天室,欢迎下次再来!'); } }