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

View File

@@ -0,0 +1,124 @@
extends Node
## 存储服务
## 负责本地配置的读写包括用户账号、密码、Token 等
# 配置文件路径
const CONFIG_PATH: String = "user://user_config.cfg"
# ConfigFile 实例
var _config: ConfigFile
func _ready():
_config = ConfigFile.new()
_loadConfig()
## 加载配置文件
func _loadConfig() -> void:
var error = _config.load(CONFIG_PATH)
if error != OK and error != ERR_FILE_NOT_FOUND:
push_error("加载配置文件失败: " + str(error))
## 保存配置文件
func _saveConfig() -> void:
var error = _config.save(CONFIG_PATH)
if error != OK:
push_error("保存配置文件失败: " + str(error))
## 保存键值对
func save(section: String, key: String, value: Variant) -> void:
_config.set_value(section, key, value)
_saveConfig()
## 读取值
func getValue(section: String, key: String, defaultValue: Variant = null) -> Variant:
return _config.get_value(section, key, defaultValue)
## 保存账号信息(包括加密的密码)
func saveAccount(username: String, password: String, remember: bool) -> void:
save("account", "last_username", username)
if remember and not password.is_empty():
# 加密密码后保存
var encryptedPassword = EncryptionService.encrypt(password)
save("account", "saved_password", encryptedPassword)
save("account", "remember_password", true)
else:
# 不记住密码,清除保存的密码
clearSavedPassword()
## 读取保存的账号信息
func loadAccount() -> Dictionary:
var username = getValue("account", "last_username", "")
var rememberPassword = getValue("account", "remember_password", false)
var encryptedPassword = getValue("account", "saved_password", "")
var result = {
"username": username,
"remember_password": rememberPassword
}
# 如果记住密码,解密密码
if rememberPassword and not encryptedPassword.is_empty():
var decryptedPassword = EncryptionService.decrypt(encryptedPassword)
result["password"] = decryptedPassword
else:
result["password"] = ""
return result
## 清除保存的密码
func clearSavedPassword() -> void:
save("account", "saved_password", "")
save("account", "remember_password", false)
## 保存 Token
func saveToken(token: String, expireTime: int = 0) -> void:
save("auth", "token", token)
save("auth", "expire_time", expireTime)
## 读取 Token
func loadToken() -> Dictionary:
var token = getValue("auth", "token", "")
var expireTime = getValue("auth", "expire_time", 0)
return {
"token": token,
"expire_time": expireTime
}
## 清除 Token
func clearToken() -> void:
save("auth", "token", "")
save("auth", "expire_time", 0)
## 保存用户信息
func saveUserData(userData: UserData) -> void:
if userData == null:
return
save("user", "id", userData.id)
save("user", "username", userData.username)
save("user", "email", userData.email)
save("user", "level", userData.level)
save("user", "exp", userData.exp)
save("user", "avatar_url", userData.avatarUrl)
## 读取用户信息
func loadUserData() -> UserData:
var userData = UserData.new()
userData.id = str(getValue("user", "id", ""))
userData.username = getValue("user", "username", "")
userData.email = getValue("user", "email", "")
userData.level = getValue("user", "level", 1)
userData.exp = getValue("user", "exp", 0)
userData.avatarUrl = getValue("user", "avatar_url", "")
return userData if not userData.id.is_empty() else null
## 清除所有用户数据
func clearAll() -> void:
clearSavedPassword()
clearToken()
_config.clear()
_saveConfig()