forked from datawhale/whale-town-front
- 添加登录场景(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>
125 lines
3.4 KiB
GDScript
125 lines
3.4 KiB
GDScript
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()
|