feat:实现登录系统和用户认证功能

- 添加登录场景(login_scene.tscn)和主菜单场景(main_menu_scene.tscn)
- 实现认证管理器(AuthManager)用于用户登录和会话管理
- 添加核心服务:加密服务、存储服务、网络服务
- 配置项目主场景为登录场景
- 添加自动加载服务到项目配置
- 添加开发环境配置(VSCode、Claude)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-23 01:15:33 +08:00
parent 8ed260b413
commit d623c705b6
28 changed files with 1455 additions and 0 deletions

45
scripts/data/ErrorCode.gd Normal file
View File

@@ -0,0 +1,45 @@
class_name ErrorCode
## 错误码定义
## 用于统一管理登录系统中的所有错误码和错误消息
# 成功
const SUCCESS: int = 0
# 网络相关错误 (1000-1999)
const NETWORK_ERROR: int = 1001
const TIMEOUT: int = 1002
const SERVER_ERROR: int = 1003
# 输入验证错误 (2000-2999)
const INVALID_INPUT: int = 2001
const INVALID_USERNAME: int = 2002
const INVALID_PASSWORD: int = 2003
const PASSWORDS_NOT_MATCH: int = 2004
# 认证相关错误 (3000-3999)
const WRONG_CREDENTIALS: int = 3001
const USER_NOT_FOUND: int = 3002
const ACCOUNT_DISABLED: int = 3003
const TOKEN_EXPIRED: int = 3004
const TOKEN_INVALID: int = 3005
# 错误消息映射
const MESSAGES: Dictionary = {
NETWORK_ERROR: "网络连接失败,请检查网络设置",
TIMEOUT: "请求超时,请稍后重试",
SERVER_ERROR: "服务器错误,请稍后重试",
INVALID_INPUT: "用户名或密码不能为空",
INVALID_USERNAME: "用户名格式不正确3-16个字符",
INVALID_PASSWORD: "密码格式不正确6-20个字符",
PASSWORDS_NOT_MATCH: "两次输入的密码不一致",
WRONG_CREDENTIALS: "用户名或密码错误",
USER_NOT_FOUND: "用户不存在",
ACCOUNT_DISABLED: "账号已被禁用",
TOKEN_EXPIRED: "登录已过期,请重新登录",
TOKEN_INVALID: "登录状态无效,请重新登录"
}
## 获取错误消息
static func getMessage(errorCode: int) -> String:
return MESSAGES.get(errorCode, "未知错误 (代码: %d)" % errorCode)

View File

@@ -0,0 +1 @@
uid://cfrgxhalop5rg

66
scripts/data/UserData.gd Normal file
View File

@@ -0,0 +1,66 @@
class_name UserData
## 用户数据类
## 用于存储用户的基本信息
var id: String = ""
var username: String = ""
var nickname: String = ""
var email: String = ""
var phone: String = ""
var avatarUrl: String = ""
var role: int = 1
var createdAt: String = ""
# 兼容旧字段
var level: int = 1
var exp: int = 0
var createTime: int = 0
## 从字典创建 UserData 对象
static func fromDict(data: Dictionary) -> UserData:
var userData = UserData.new()
# 新字段(处理可能为 null 的值)
userData.id = str(data.get("id", ""))
userData.username = _getStringOrEmpty(data, "username")
userData.nickname = _getStringOrEmpty(data, "nickname")
userData.email = _getStringOrEmpty(data, "email")
userData.phone = _getStringOrEmpty(data, "phone")
userData.avatarUrl = _getStringOrEmpty(data, "avatar_url", _getStringOrEmpty(data, "avatarUrl"))
userData.role = int(data.get("role", 1))
userData.createdAt = _getStringOrEmpty(data, "created_at", _getStringOrEmpty(data, "createdAt"))
# 兼容旧字段
userData.level = data.get("level", 1)
userData.exp = data.get("exp", 0)
userData.createTime = data.get("create_time", data.get("createTime", 0))
return userData
## 辅助方法:从字典中获取字符串,如果为 null 则返回空字符串
static func _getStringOrEmpty(data: Dictionary, key: String, defaultValue: String = "") -> String:
var value = data.get(key, defaultValue)
if value == null:
return ""
return str(value)
## 转换为字典
func toDict() -> Dictionary:
return {
"id": id,
"username": username,
"nickname": nickname,
"email": email,
"phone": phone,
"avatar_url": avatarUrl,
"role": role,
"created_at": createdAt,
"level": level,
"exp": exp,
"create_time": createTime
}
## 打印用户信息(用于调试)
func toString() -> String:
return "UserData(id=%s, username=%s, nickname=%s, role=%d)" % [id, username, nickname, role]

View File

@@ -0,0 +1 @@
uid://bxcp8nyo8mha7