From 7022c2b52fae2ecd0ecccd314bd715b67e989099 Mon Sep 17 00:00:00 2001 From: veypi Date: Thu, 21 May 2026 01:34:37 +0800 Subject: [PATCH] refactor(ui): Replace axios with fetch in all pages and extract auth layout - Replace all $axios calls with native fetch across 8 page files - Add inline send-code button to login page code flow - Extract animated bubble background into shared auth layout - Restructure langs.json with zh-CN first, add new i18n keys - Add scoped langs.json for auth.send_code translation - Wire auth layout to login and callback routes - Fix mobile sign-up panel transform direction - Use onAuthSuccess for login/register code flows --- ui/langs.json | 420 ++++++++++++++++--------------- ui/layout/auth.html | 82 ++++++ ui/page/auth/callback.html | 70 +----- ui/page/auth/login.html | 211 +++++++--------- ui/page/sys/oauth/index.html | 35 ++- ui/page/sys/oauth/providers.html | 25 +- ui/page/sys/role/index.html | 217 +++++++++++----- ui/page/sys/settings.html | 17 +- ui/page/sys/user/index.html | 27 +- ui/page/user/profile.html | 58 +++-- ui/routes.js | 4 +- ui/ui/langs.json | 8 + 12 files changed, 687 insertions(+), 487 deletions(-) create mode 100644 ui/layout/auth.html create mode 100644 ui/ui/langs.json diff --git a/ui/langs.json b/ui/langs.json index 787db75..e1f3dff 100644 --- a/ui/langs.json +++ b/ui/langs.json @@ -1,4 +1,211 @@ { + "zh-CN": { + "auth.account": "用户名/邮箱", + "auth.back_to_login": "返回登录", + "auth.bind_account": "绑定账号", + "auth.bind_exist_desc": "将 {provider} 绑定到现有账号", + "auth.bind_existing": "绑定已有账号", + "auth.bind_login_tip": "请登录您的个人账号以保持连接", + "auth.bind_new_desc": "创建新账号并绑定 {provider}", + "auth.bind_register_tip": "输入您的个人信息,开启您的旅程", + "auth.bind_success": "绑定成功", + "auth.change_password": "修改密码", + "auth.code_login": "验证码", + "auth.code_sent": "验证码已发送", + "auth.confirm_password": "确认密码", + "auth.create_account": "创建账户", + "auth.email": "邮箱", + "auth.email_disabled": "邮箱登录未启用", + "auth.email_or_phone": "邮箱或手机号", + "auth.fill_all_fields": "请填写所有必填字段", + "auth.fill_required": "请填写所有必填项", + "auth.forgot_password": "忘记密码?", + "auth.have_account": "已有账户?", + "auth.hello_friend": "你好,朋友!", + "auth.keep_connected": "请使用您的个人信息登录,保持连接", + "auth.linked_accounts": "账号绑定", + "auth.login": "登录", + "auth.login_bind": "登录并绑定", + "auth.login_failed": "登录失败", + "auth.login_success": "登录成功", + "auth.logout": "登出", + "auth.new_password": "新密码", + "auth.no_account": "还没有账户?", + "auth.old_password": "当前密码", + "auth.password": "密码", + "auth.password_changed": "密码修改成功", + "auth.password_too_short": "密码至少8个字符", + "auth.passwords_not_match": "两次输入的密码不一致", + "auth.phone_placeholder": "请输入手机号", + "auth.register": "注册", + "auth.register_failed": "注册失败", + "auth.register_success": "注册成功", + "auth.security": "安全设置", + "auth.send_code": "发送验证码", + "auth.sign_up_bind": "注册并绑定", + "auth.sms_disabled": "手机号登录未启用", + "auth.start_journey": "输入您的个人信息,开始您的旅程", + "auth.target_and_code_required": "请输入邮箱/手机号和验证码", + "auth.target_required": "请输入邮箱或手机号", + "auth.unbind_confirm": "确定要解绑该账号吗?", + "auth.use_account": "或使用您的账户", + "auth.use_info_register": "或使用您的信息进行注册", + "auth.username": "用户名", + "auth.username_login": "用户名", + "auth.username_or_email": "用户名或邮箱", + "auth.username_required": "用户名必填", + "auth.username_too_short": "用户名至少3个字符", + "auth.verification_code": "验证码", + "auth.welcome_back": "欢迎回来!", + "common.actions": "操作", + "common.cancel": "取消", + "common.close": "关闭", + "common.create": "创建", + "common.delete": "删除", + "common.detail": "详情", + "common.edit": "编辑", + "common.forbidden": "禁止访问", + "common.not_found": "页面未找到", + "common.processing": "处理中...", + "common.remove": "移除", + "common.reset": "重置", + "common.save": "保存", + "common.save_success": "保存成功", + "common.saving": "保存中...", + "common.success": "成功", + "common.unbind": "解绑", + "nav.dashboard": "仪表盘", + "nav.home": "首页", + "nav.oauth": "OAuth应用", + "nav.oauth_providers": "身份源管理", + "nav.profile": "个人中心", + "nav.roles": "角色管理", + "nav.settings": "系统设置", + "nav.users": "用户管理", + "oauth.create": "创建", + "oauth.create_app": "创建应用", + "oauth.provider.client_id": "客户端ID", + "oauth.provider.client_secret": "客户端密钥", + "oauth.provider.code": "代码", + "oauth.provider.create": "添加身份源", + "oauth.provider.edit": "编辑身份源", + "oauth.provider.enabled": "启用", + "oauth.provider.name": "名称", + "oauth.provider.redirect_uri": "回调地址", + "org.created": "创建成功", + "org.deleted": "删除成功", + "org.required_fields": "请填写必填字段", + "org.updated": "更新成功", + "permission.level.admin": "管理", + "permission.level.create": "创建", + "permission.level.read": "读取", + "permission.level.rw": "读写", + "permission.level.write": "写入", + "role.add_permission": "添加权限", + "role.add_user": "添加用户", + "role.code": "角色代码", + "role.create": "创建角色", + "role.delete_confirm": "确定要删除该角色吗?", + "role.description": "描述", + "role.detail": "角色详情", + "role.edit": "编辑角色", + "role.name": "角色名称", + "role.no_available_permissions": "没有可用权限", + "role.no_available_users": "没有可用用户", + "role.no_permissions": "未分配权限", + "role.no_users": "未分配用户", + "role.permission_removed": "权限已移除", + "role.permissions": "权限管理", + "role.permissions_desc": "管理此角色的权限", + "role.permissions_updated": "权限已更新", + "role.remove_permission_confirm": "确定移除该权限?", + "role.remove_user_confirm": "确定将该用户从角色中移除?", + "role.search_permissions": "搜索权限...", + "role.search_placeholder": "搜索角色...", + "role.search_users": "搜索用户...", + "role.search_users_placeholder": "搜索用户名或昵称...", + "role.select_permissions": "选择权限", + "role.select_users": "选择用户", + "role.user_removed": "用户已移除", + "role.users": "用户管理", + "role.users_updated": "用户已更新", + "settings.app.id": "应用标识", + "settings.app.id_desc": "应用的唯一标识符", + "settings.app.name": "应用名称", + "settings.app.name_desc": "应用的显示名称", + "settings.auth.login_methods": "登录方式", + "settings.auth.login_methods_desc": "支持的登录方式(JSON数组)", + "settings.auth.password_fields": "密码登录字段", + "settings.auth.password_fields_desc": "密码登录支持的字段", + "settings.auth.reg_require_email": "注册需要邮箱", + "settings.auth.reg_require_email_desc": "注册时强制要求填写邮箱", + "settings.auth.reg_require_phone": "注册需要手机号", + "settings.auth.reg_require_phone_desc": "注册时强制要求填写手机号", + "settings.category.app": "应用配置", + "settings.category.auth": "认证配置", + "settings.category.code": "验证码配置", + "settings.category.email": "邮件配置", + "settings.category.security": "安全配置", + "settings.category.sms": "短信配置", + "settings.code.expiry": "验证码有效期", + "settings.code.expiry_desc": "验证码有效时间(分钟)", + "settings.code.length": "验证码长度", + "settings.code.length_desc": "验证码的位数", + "settings.code.max_attempt": "最大尝试次数", + "settings.code.max_attempt_desc": "验证码最大尝试次数", + "settings.code.max_daily_count": "单日最大发送次数", + "settings.code.max_daily_count_desc": "单日发送验证码最大次数(0禁用,-1不限制)", + "settings.code.send_interval": "发送间隔", + "settings.code.send_interval_desc": "两次发送之间的最小间隔(秒)", + "settings.email.enabled": "启用邮件", + "settings.email.enabled_desc": "启用邮件服务用于通知", + "settings.email.from": "发件人邮箱", + "settings.email.from_desc": "发件人邮箱地址", + "settings.email.from_name": "发件人名称", + "settings.email.from_name_desc": "发件人显示名称", + "settings.email.provider": "邮件服务商", + "settings.email.provider_desc": "邮件服务提供商", + "settings.email.smtp_host": "SMTP服务器", + "settings.email.smtp_host_desc": "SMTP服务器地址", + "settings.email.smtp_pass": "SMTP密码", + "settings.email.smtp_pass_desc": "SMTP认证密码", + "settings.email.smtp_port": "SMTP端口", + "settings.email.smtp_port_desc": "SMTP服务器端口", + "settings.email.smtp_user": "SMTP用户名", + "settings.email.smtp_user_desc": "SMTP认证用户名", + "settings.load_failed": "加载设置失败", + "settings.no_changes": "没有需要保存的更改", + "settings.reset_done": "设置已重置", + "settings.save_failed": "保存设置失败", + "settings.save_success": "设置保存成功", + "settings.security.bcrypt_cost": "Bcrypt强度", + "settings.security.bcrypt_cost_desc": "密码哈希强度(4-31)", + "settings.security.captcha_enabled": "启用验证码", + "settings.security.captcha_enabled_desc": "登录时显示验证码验证", + "settings.security.max_login_attempts": "最大登录尝试次数", + "settings.security.max_login_attempts_desc": "失败登录尝试的最大次数", + "settings.sms.access_key": "Access Key", + "settings.sms.access_key_desc": "API访问密钥ID", + "settings.sms.access_secret": "Access Secret", + "settings.sms.access_secret_desc": "API访问密钥密文", + "settings.sms.enabled": "启用短信", + "settings.sms.enabled_desc": "启用短信服务用于验证码", + "settings.sms.provider": "短信服务商", + "settings.sms.provider_aliyun": "阿里云", + "settings.sms.provider_desc": "短信服务提供商", + "settings.sms.provider_tencent": "腾讯云", + "settings.sms.sign_name": "短信签名", + "settings.sms.sign_name_desc": "已注册的短信签名", + "settings.sms.template_code": "模板代码", + "settings.sms.template_code_desc": "验证码模板ID", + "user.avatar_url": "头像链接", + "user.email": "邮箱", + "user.info": "基本信息", + "user.nickname": "昵称", + "user.phone": "手机号", + "user.profile": "个人资料", + "user.username": "用户名" + }, "en-US": { "auth.account": "Username/Email", "auth.back_to_login": "Back to Login", @@ -12,6 +219,7 @@ "auth.change_password": "Change Password", "auth.code_login": "Code", "auth.code_sent": "Code sent", + "auth.send_code": "Send Code", "auth.confirm_password": "Confirm Password", "auth.create_account": "Create Account", "auth.create_new": "Create New", @@ -61,13 +269,16 @@ "common.actions": "Actions", "common.bind": "Bind", "common.cancel": "Cancel", + "common.close": "Close", "common.create": "Create", "common.delete": "Delete", + "common.detail": "Detail", "common.edit": "Edit", "common.forbidden": "Forbidden", "common.id": "ID", "common.not_found": "Not Found", "common.processing": "Processing...", + "common.remove": "Remove", "common.reset": "Reset", "common.save": "Save", "common.save_success": "Saved successfully", @@ -90,9 +301,6 @@ "oauth.provider.enabled": "Enabled", "oauth.provider.name": "Name", "oauth.provider.redirect_uri": "Redirect URI", - "common.close": "Close", - "common.detail": "Detail", - "common.remove": "Remove", "org.created": "Created successfully", "org.deleted": "Deleted successfully", "org.required_fields": "Please fill in required fields", @@ -209,211 +417,5 @@ "user.profile": "User Profile", "user.search_placeholder": "Search users...", "user.username": "Username" - }, - "zh-CN": { - "auth.account": "用户名/邮箱", - "auth.back_to_login": "返回登录", - "auth.bind_account": "绑定账号", - "auth.bind_exist_desc": "将 {provider} 绑定到现有账号", - "auth.bind_existing": "绑定已有账号", - "auth.bind_login_tip": "请登录您的个人账号以保持连接", - "auth.bind_new_desc": "创建新账号并绑定 {provider}", - "auth.bind_register_tip": "输入您的个人信息,开启您的旅程", - "auth.bind_success": "绑定成功", - "auth.change_password": "修改密码", - "auth.code_login": "验证码", - "auth.code_sent": "验证码已发送", - "auth.confirm_password": "确认密码", - "auth.create_account": "创建账户", - "auth.email": "邮箱", - "auth.email_disabled": "邮箱登录未启用", - "auth.email_or_phone": "邮箱或手机号", - "auth.fill_all_fields": "请填写所有必填字段", - "auth.fill_required": "请填写所有必填项", - "auth.forgot_password": "忘记密码?", - "auth.have_account": "已有账户?", - "auth.hello_friend": "你好,朋友!", - "auth.keep_connected": "请使用您的个人信息登录,保持连接", - "auth.linked_accounts": "账号绑定", - "auth.login": "登录", - "auth.login_bind": "登录并绑定", - "auth.login_failed": "登录失败", - "auth.login_success": "登录成功", - "auth.logout": "登出", - "auth.new_password": "新密码", - "auth.no_account": "还没有账户?", - "auth.old_password": "当前密码", - "auth.password": "密码", - "auth.password_changed": "密码修改成功", - "auth.password_too_short": "密码至少8个字符", - "auth.passwords_not_match": "两次输入的密码不一致", - "auth.phone_placeholder": "请输入手机号", - "auth.register": "注册", - "auth.register_failed": "注册失败", - "auth.register_success": "注册成功", - "auth.security": "安全设置", - "auth.sign_up_bind": "注册并绑定", - "auth.sms_disabled": "手机号登录未启用", - "auth.start_journey": "输入您的个人信息,开始您的旅程", - "auth.target_and_code_required": "请输入邮箱/手机号和验证码", - "auth.target_required": "请输入邮箱或手机号", - "auth.unbind_confirm": "确定要解绑该账号吗?", - "auth.use_account": "或使用您的账户", - "auth.use_info_register": "或使用您的信息进行注册", - "auth.username": "用户名", - "auth.username_login": "用户名", - "auth.username_or_email": "用户名或邮箱", - "auth.username_required": "用户名必填", - "auth.username_too_short": "用户名至少3个字符", - "auth.verification_code": "验证码", - "auth.welcome_back": "欢迎回来!", - "common.actions": "操作", - "common.cancel": "取消", - "common.close": "关闭", - "common.create": "创建", - "common.delete": "删除", - "common.detail": "详情", - "common.edit": "编辑", - "common.remove": "移除", - "common.forbidden": "禁止访问", - "common.not_found": "页面未找到", - "common.processing": "处理中...", - "common.reset": "重置", - "common.save": "保存", - "common.save_success": "保存成功", - "common.saving": "保存中...", - "common.success": "成功", - "common.unbind": "解绑", - "nav.dashboard": "仪表盘", - "nav.home": "首页", - "nav.oauth": "OAuth应用", - "nav.oauth_providers": "身份源管理", - "nav.profile": "个人中心", - "nav.roles": "角色管理", - "nav.settings": "系统设置", - "nav.users": "用户管理", - "oauth.provider.client_id": "客户端ID", - "oauth.provider.client_secret": "客户端密钥", - "oauth.provider.code": "代码", - "oauth.provider.create": "添加身份源", - "oauth.provider.edit": "编辑身份源", - "oauth.provider.enabled": "启用", - "oauth.provider.name": "名称", - "oauth.provider.redirect_uri": "回调地址", - "oauth.create": "创建", - "oauth.create_app": "创建应用", - "org.created": "创建成功", - "org.deleted": "删除成功", - "org.required_fields": "请填写必填字段", - "org.updated": "更新成功", - "permission.level.admin": "管理", - "permission.level.create": "创建", - "permission.level.read": "读取", - "permission.level.rw": "读写", - "permission.level.write": "写入", - "role.add_permission": "添加权限", - "role.add_user": "添加用户", - "role.code": "角色代码", - "role.create": "创建角色", - "role.delete_confirm": "确定要删除该角色吗?", - "role.description": "描述", - "role.detail": "角色详情", - "role.edit": "编辑角色", - "role.name": "角色名称", - "role.no_available_permissions": "没有可用权限", - "role.no_available_users": "没有可用用户", - "role.no_permissions": "未分配权限", - "role.no_users": "未分配用户", - "role.permission_removed": "权限已移除", - "role.permissions": "权限管理", - "role.permissions_desc": "管理此角色的权限", - "role.permissions_updated": "权限已更新", - "role.remove_permission_confirm": "确定移除该权限?", - "role.remove_user_confirm": "确定将该用户从角色中移除?", - "role.search_permissions": "搜索权限...", - "role.search_placeholder": "搜索角色...", - "role.search_users": "搜索用户...", - "role.search_users_placeholder": "搜索用户名或昵称...", - "role.select_permissions": "选择权限", - "role.select_users": "选择用户", - "role.user_removed": "用户已移除", - "role.users": "用户管理", - "role.users_updated": "用户已更新", - "settings.app.id": "应用标识", - "settings.app.id_desc": "应用的唯一标识符", - "settings.app.name": "应用名称", - "settings.app.name_desc": "应用的显示名称", - "settings.auth.login_methods": "登录方式", - "settings.auth.login_methods_desc": "支持的登录方式(JSON数组)", - "settings.auth.password_fields": "密码登录字段", - "settings.auth.password_fields_desc": "密码登录支持的字段", - "settings.auth.reg_require_email": "注册需要邮箱", - "settings.auth.reg_require_email_desc": "注册时强制要求填写邮箱", - "settings.auth.reg_require_phone": "注册需要手机号", - "settings.auth.reg_require_phone_desc": "注册时强制要求填写手机号", - "settings.category.app": "应用配置", - "settings.category.auth": "认证配置", - "settings.category.code": "验证码配置", - "settings.category.email": "邮件配置", - "settings.category.security": "安全配置", - "settings.category.sms": "短信配置", - "settings.code.expiry": "验证码有效期", - "settings.code.expiry_desc": "验证码有效时间(分钟)", - "settings.code.length": "验证码长度", - "settings.code.length_desc": "验证码的位数", - "settings.code.max_attempt": "最大尝试次数", - "settings.code.max_attempt_desc": "验证码最大尝试次数", - "settings.code.max_daily_count": "单日最大发送次数", - "settings.code.max_daily_count_desc": "单日发送验证码最大次数(0禁用,-1不限制)", - "settings.code.send_interval": "发送间隔", - "settings.code.send_interval_desc": "两次发送之间的最小间隔(秒)", - "settings.email.enabled": "启用邮件", - "settings.email.enabled_desc": "启用邮件服务用于通知", - "settings.email.from": "发件人邮箱", - "settings.email.from_desc": "发件人邮箱地址", - "settings.email.from_name": "发件人名称", - "settings.email.from_name_desc": "发件人显示名称", - "settings.email.provider": "邮件服务商", - "settings.email.provider_desc": "邮件服务提供商", - "settings.email.smtp_host": "SMTP服务器", - "settings.email.smtp_host_desc": "SMTP服务器地址", - "settings.email.smtp_pass": "SMTP密码", - "settings.email.smtp_pass_desc": "SMTP认证密码", - "settings.email.smtp_port": "SMTP端口", - "settings.email.smtp_port_desc": "SMTP服务器端口", - "settings.email.smtp_user": "SMTP用户名", - "settings.email.smtp_user_desc": "SMTP认证用户名", - "settings.load_failed": "加载设置失败", - "settings.no_changes": "没有需要保存的更改", - "settings.reset_done": "设置已重置", - "settings.save_failed": "保存设置失败", - "settings.save_success": "设置保存成功", - "settings.security.bcrypt_cost": "Bcrypt强度", - "settings.security.bcrypt_cost_desc": "密码哈希强度(4-31)", - "settings.security.captcha_enabled": "启用验证码", - "settings.security.captcha_enabled_desc": "登录时显示验证码验证", - "settings.security.max_login_attempts": "最大登录尝试次数", - "settings.security.max_login_attempts_desc": "失败登录尝试的最大次数", - "settings.sms.access_key": "Access Key", - "settings.sms.access_key_desc": "API访问密钥ID", - "settings.sms.access_secret": "Access Secret", - "settings.sms.access_secret_desc": "API访问密钥密文", - "settings.sms.enabled": "启用短信", - "settings.sms.enabled_desc": "启用短信服务用于验证码", - "settings.sms.provider": "短信服务商", - "settings.sms.provider_aliyun": "阿里云", - "settings.sms.provider_desc": "短信服务提供商", - "settings.sms.provider_tencent": "腾讯云", - "settings.sms.sign_name": "短信签名", - "settings.sms.sign_name_desc": "已注册的短信签名", - "settings.sms.template_code": "模板代码", - "settings.sms.template_code_desc": "验证码模板ID", - "user.avatar_url": "头像链接", - "user.email": "邮箱", - "user.info": "基本信息", - "user.nickname": "昵称", - "user.phone": "手机号", - "user.profile": "个人资料", - "user.username": "用户名" } } \ No newline at end of file diff --git a/ui/layout/auth.html b/ui/layout/auth.html new file mode 100644 index 0000000..32e5d96 --- /dev/null +++ b/ui/layout/auth.html @@ -0,0 +1,82 @@ + + + + + + + + + +
+
+
+ + + + + + diff --git a/ui/page/auth/callback.html b/ui/page/auth/callback.html index 5b363b0..515ae9c 100644 --- a/ui/page/auth/callback.html +++ b/ui/page/auth/callback.html @@ -13,41 +13,13 @@ display: flex; justify-content: center; align-items: center; - position: relative; - background: linear-gradient(135deg, var(--color-primary-light, #e0e7ff) 0%, var(--color-primary-dark, #4338ca) 100%); font-family: var(--font-family-sans, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif); margin: 0; } - .background { - position: absolute; - width: 100%; - height: 100%; - top: 0; - left: 0; - overflow: hidden; - opacity: 0.3; - z-index: 0; - } - .bubble { - position: absolute; - bottom: -150px; - background: rgba(255, 255, 255, 0.2); - border-radius: 50%; - animation: rise linear infinite; - } - @keyframes rise { - 0% { - transform: translateY(0) rotate(0); - opacity: 0.5; - } - 100% { - transform: translateY(-120vh) rotate(360deg); - opacity: 0; - } } h1 { @@ -92,7 +64,6 @@ text-transform: uppercase; transition: transform 80ms ease-in, background-color 0.2s; cursor: pointer; - position: relative; overflow: hidden; margin-top: 10px; } @@ -140,9 +111,6 @@ transform: translate(-50%, -50%) rotate(0deg); } - 100% { - transform: translate(-50%, -50%) rotate(360deg); - } } .button-loading { @@ -183,10 +151,10 @@ } .container { + position: relative; background-color: var(--bg-color-secondary, #ffffff); border-radius: 10px; box-shadow: 0 14px 28px rgba(0, 0, 0, 0.15), 0 10px 10px rgba(0, 0, 0, 0.1); - position: relative; overflow: hidden; width: 768px; max-width: 100%; @@ -259,13 +227,13 @@ } .overlay { + position: relative; background: var(--color-primary, #4f46e5); background: linear-gradient(to right, var(--color-secondary, #7c3aed), var(--color-primary, #4f46e5)); background-repeat: no-repeat; background-size: cover; background-position: 0 0; color: #ffffff; - position: relative; left: -100%; height: 100%; width: 200%; @@ -341,9 +309,6 @@ -
- -
@@ -443,27 +408,6 @@ email: '' } - // Helper to generate bubbles - createBubbles = () => { - const bg = document.getElementById('background'); - if (!bg) return; - - const bubbleCount = 10; - for (let i = 0; i < bubbleCount; i++) { - const bubble = document.createElement('div'); - bubble.classList.add('bubble'); - - const size = Math.random() * 60 + 20 + 'px'; - bubble.style.width = size; - bubble.style.height = size; - bubble.style.left = Math.random() * 100 + '%'; - bubble.style.animationDuration = Math.random() * 10 + 5 + 's'; - bubble.style.animationDelay = Math.random() * 5 + 's'; - - bg.appendChild(bubble); - } - } - handleCallback = async () => { try { const urlParams = new URLSearchParams(window.location.search); @@ -494,20 +438,17 @@ const data = await $mod.$auth.oauthCallback(provider, code, state); - if (data.access_token || data.token) { - // Already bound, login success (token set by vbase) - $router.push('/'); - } else if (data.need_bind) { + if (data.need_bind) { // Need binding needBind = true; provider = data.provider; providerId = data.provider_id; tempToken = data.temp_token; - // Pre-fill username if available from provider (optional, depends on API) // if (data.provider_username) regForm.username = data.provider_username; - loading = false; + } else if (data.user?.id) { + $router.push('/'); } else { error = 'Unknown response state'; loading = false; @@ -560,7 +501,6 @@ diff --git a/ui/page/auth/login.html b/ui/page/auth/login.html index cb8a06e..e32a9d4 100644 --- a/ui/page/auth/login.html +++ b/ui/page/auth/login.html @@ -13,41 +13,9 @@ display: flex; justify-content: center; align-items: center; - position: relative; - background: linear-gradient(135deg, var(--color-primary-light, #e0e7ff) 0%, var(--color-primary-dark, #4338ca) 100%); font-family: var(--font-family-sans, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif); } - .background { - position: absolute; - width: 100%; - height: 100%; - top: 0; - left: 0; - overflow: hidden; - opacity: 0.3; - } - - .bubble { - position: absolute; - bottom: -150px; - background: rgba(255, 255, 255, 0.2); - border-radius: 50%; - animation: rise linear infinite; - } - - @keyframes rise { - 0% { - transform: translateY(0) rotate(0); - opacity: 0.5; - } - - 100% { - transform: translateY(-120vh) rotate(360deg); - opacity: 0; - } - } - h1 { font-weight: bold; margin: 0; @@ -89,7 +57,6 @@ text-transform: uppercase; transition: transform 80ms ease-in, background-color 0.2s; cursor: pointer; - position: relative; overflow: hidden; } @@ -117,6 +84,29 @@ cursor: not-allowed; } + /* Code input row */ + .code-input-row { + display: flex; + gap: 8px; + align-items: center; + } + + .code-input-row input { + flex: 1; + margin: 8px 0; + } + + button.send-code-btn { + width: auto; + min-width: 90px; + padding: 10px 14px; + margin: 8px 0; + white-space: nowrap; + text-transform: none; + font-size: 13px; + letter-spacing: 0; + } + /* Loading spinner */ .loading-spinner { position: absolute; @@ -179,10 +169,10 @@ } .container { + position: relative; background-color: var(--bg-color-secondary, #ffffff); border-radius: 10px; box-shadow: 0 14px 28px rgba(0, 0, 0, 0.15), 0 10px 10px rgba(0, 0, 0, 0.1); - position: relative; overflow: hidden; width: 768px; max-width: 100%; @@ -236,13 +226,13 @@ } .overlay { + position: relative; background: var(--color-primary, #4f46e5); background: linear-gradient(to right, var(--color-secondary, #7c3aed), var(--color-primary, #4f46e5)); background-repeat: no-repeat; background-size: cover; background-position: 0 0; color: #ffffff; - position: relative; left: -100%; height: 100%; width: 200%; @@ -353,7 +343,6 @@ .input-group { width: 100%; - margin: 6px 0; } .forgot-link { @@ -379,11 +368,13 @@ } .container.right-panel-active .sign-in-container { - transform: translateX(100%); + transform: translateX(-100%); } .container.right-panel-active .sign-up-container { - transform: translateX(100%); + transform: translateX(0); + opacity: 1; + z-index: 5; } .overlay-container { @@ -412,10 +403,6 @@ -
-
-
-