forked from moyin/whale-town-front
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:
124
scripts/managers/StorageService.gd
Normal file
124
scripts/managers/StorageService.gd
Normal 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()
|
||||
Reference in New Issue
Block a user