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:
45
scripts/data/ErrorCode.gd
Normal file
45
scripts/data/ErrorCode.gd
Normal 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)
|
||||
1
scripts/data/ErrorCode.gd.uid
Normal file
1
scripts/data/ErrorCode.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cfrgxhalop5rg
|
||||
66
scripts/data/UserData.gd
Normal file
66
scripts/data/UserData.gd
Normal 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]
|
||||
1
scripts/data/UserData.gd.uid
Normal file
1
scripts/data/UserData.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bxcp8nyo8mha7
|
||||
Reference in New Issue
Block a user