From 93090738e1d16305ef6c6ce076cddea4cb55b7c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E4=B8=81?= Date: Sat, 27 Jun 2026 00:28:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E5=90=8D=E5=AF=86=E7=A0=81=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/auth.ts | 75 +++++++++++ src/locales/en.json | 33 ++++- src/locales/ja.json | 33 ++++- src/locales/ko.json | 31 ++++- src/locales/zh-CN.json | 31 ++++- src/locales/zh-TW.json | 31 ++++- src/router/index.ts | 6 + src/views/Login.vue | 233 ++++++++++++++++++++++++++++----- src/views/Register.vue | 285 +++++++++++++++++++++++++++++++++++++++++ 9 files changed, 720 insertions(+), 38 deletions(-) create mode 100644 src/api/auth.ts create mode 100644 src/views/Register.vue diff --git a/src/api/auth.ts b/src/api/auth.ts new file mode 100644 index 0000000..6d8541b --- /dev/null +++ b/src/api/auth.ts @@ -0,0 +1,75 @@ +import { post } from './request' +import type { UserInfo } from '@/stores/user' + +export interface CaptchaData { + captchaId: string + picPath: string + captchaLength: number + openCaptcha: boolean +} + +export interface CaptchaResponse { + code: number + data?: CaptchaData + msg?: string +} + +export interface LoginResponseData { + token: string + expiresAt?: number + user?: UserInfo +} + +export interface AuthApiResponse { + code: number + data?: LoginResponseData + msg?: string +} + +export interface LoginByPasswordParams { + username: string + password: string + captcha: string + captchaId: string +} + +export interface RegisterByPasswordParams { + userName: string + passWord: string + nickName?: string + captcha: string + captchaId: string + promotionCode?: string +} + +/** POST /base/captcha */ +export async function getCaptcha(): Promise { + return post('/base/captcha') +} + +/** POST /base/login */ +export async function loginByPassword(params: LoginByPasswordParams): Promise { + return post('/base/login', params) +} + +/** POST /base/register */ +export async function registerByPassword( + params: RegisterByPasswordParams, +): Promise { + return post('/base/register', params) +} + +/** 从登录/注册响应中解析 token 与 user,供各登录方式复用 */ +export function parseLoginResponse(data: LoginResponseData | Record): { + token: string | undefined + user: UserInfo | undefined +} { + const record = data as Record + const token = record.token as string | undefined + const user = + (record.user as UserInfo | undefined) ?? + (record.ID != null || record.id != null || record.userName != null + ? (record as unknown as UserInfo) + : undefined) + return { token, user } +} diff --git a/src/locales/en.json b/src/locales/en.json index 3c2882b..9bec873 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -142,14 +142,43 @@ }, "login": { "title": "Sign In", - "desc": "Connect your wallet to sign in", + "descAccount": "Sign in with your username and password", + "descWallet": "Connect your wallet to sign in", + "tabAccount": "Account", + "tabWallet": "Wallet", + "username": "Username", + "password": "Password", + "captcha": "Captcha", + "refreshCaptcha": "Refresh captcha", + "loginBtn": "Sign In", "connecting": "Connecting...", "connectBtn": "Connect with Wallet", "signUp": "Don't have an account? Sign Up", "walletNotInstalled": "Ethereum wallet is not installed. Please install MetaMask, TokenPocket or another Ethereum wallet to continue.", "invalidAddress": "Invalid wallet address format. Please check your wallet connection.", "connectFailed": "Failed to connect with wallet. Please check your wallet and try again.", - "siweStatement": "Sign in to Alpha Market" + "loginFailed": "Sign in failed. Please check your credentials and try again.", + "credentialsRequired": "Please enter username and password.", + "captchaRequired": "Please enter the captcha.", + "captchaLoadFailed": "Failed to load captcha. Please refresh and try again.", + "siweStatement": "Sign in to Alpha Market" + }, + "register": { + "title": "Sign Up", + "desc": "Create an account to start trading", + "username": "Username", + "nickName": "Nickname (optional)", + "password": "Password", + "confirmPassword": "Confirm Password", + "captcha": "Captcha", + "refreshCaptcha": "Refresh captcha", + "submitBtn": "Create Account", + "signIn": "Already have an account? Sign In", + "passwordMismatch": "Passwords do not match.", + "credentialsRequired": "Please enter username and password.", + "captchaRequired": "Please enter the captcha.", + "captchaLoadFailed": "Failed to load captcha. Please refresh and try again.", + "failed": "Registration failed. Please try again." }, "apiKey": { "title": "API Key Management", diff --git a/src/locales/ja.json b/src/locales/ja.json index fcb2dcb..008f09d 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -142,14 +142,43 @@ }, "login": { "title": "サインイン", - "desc": "ウォレットを接続してサインイン", + "descAccount": "ユーザー名とパスワードでサインイン", + "descWallet": "ウォレットを接続してサインイン", + "tabAccount": "アカウント", + "tabWallet": "ウォレット", + "username": "ユーザー名", + "password": "パスワード", + "captcha": "認証コード", + "refreshCaptcha": "認証コードを更新", + "loginBtn": "サインイン", "connecting": "接続中...", "connectBtn": "ウォレットで接続", "signUp": "アカウントをお持ちでないですか?新規登録", "walletNotInstalled": "イーサリアムウォレットがインストールされていません。MetaMask、TokenPocket などのウォレットをインストールしてください。", "invalidAddress": "ウォレットアドレスの形式が無効です。接続を確認してください。", "connectFailed": "ウォレットの接続に失敗しました。ウォレットを確認して再試行してください。", - "siweStatement": "Alpha Market にサインイン" + "loginFailed": "サインインに失敗しました。認証情報を確認してください。", + "credentialsRequired": "ユーザー名とパスワードを入力してください。", + "captchaRequired": "認証コードを入力してください。", + "captchaLoadFailed": "認証コードの読み込みに失敗しました。更新して再試行してください。", + "siweStatement": "Alpha Market にサインイン" + }, + "register": { + "title": "新規登録", + "desc": "アカウントを作成して取引を開始", + "username": "ユーザー名", + "nickName": "ニックネーム(任意)", + "password": "パスワード", + "confirmPassword": "パスワード確認", + "captcha": "認証コード", + "refreshCaptcha": "認証コードを更新", + "submitBtn": "アカウント作成", + "signIn": "すでにアカウントをお持ちですか?サインイン", + "passwordMismatch": "パスワードが一致しません。", + "credentialsRequired": "ユーザー名とパスワードを入力してください。", + "captchaRequired": "認証コードを入力してください。", + "captchaLoadFailed": "認証コードの読み込みに失敗しました。更新して再試行してください。", + "failed": "登録に失敗しました。再試行してください。" }, "apiKey": { "title": "API Key 管理", diff --git a/src/locales/ko.json b/src/locales/ko.json index 64b0835..16f5ec3 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -142,15 +142,44 @@ }, "login": { "title": "로그인", - "desc": "지갑을 연결하여 로그인", + "descAccount": "사용자 이름과 비밀번호로 로그인", + "descWallet": "지갑을 연결하여 로그인", + "tabAccount": "계정", + "tabWallet": "지갑", + "username": "사용자 이름", + "password": "비밀번호", + "captcha": "인증 코드", + "refreshCaptcha": "인증 코드 새로고침", + "loginBtn": "로그인", "connecting": "연결 중...", "connectBtn": "지갑 연결", "signUp": "계정이 없으신가요? 회원가입", "walletNotInstalled": "이더리움 지갑이 설치되어 있지 않습니다. MetaMask, TokenPocket 등 지갑을 설치해 주세요.", "invalidAddress": "지갑 주소 형식이 올바르지 않습니다. 지갑 연결을 확인해 주세요.", "connectFailed": "지갑 연결에 실패했습니다. 지갑을 확인하고 다시 시도해 주세요.", + "loginFailed": "로그인에 실패했습니다. 계정 정보를 확인해 주세요.", + "credentialsRequired": "사용자 이름과 비밀번호를 입력해 주세요.", + "captchaRequired": "인증 코드를 입력해 주세요.", + "captchaLoadFailed": "인증 코드를 불러오지 못했습니다. 새로고침 후 다시 시도해 주세요.", "siweStatement": "Alpha Market 로그인" }, + "register": { + "title": "회원가입", + "desc": "계정을 만들고 거래를 시작하세요", + "username": "사용자 이름", + "nickName": "닉네임 (선택)", + "password": "비밀번호", + "confirmPassword": "비밀번호 확인", + "captcha": "인증 코드", + "refreshCaptcha": "인증 코드 새로고침", + "submitBtn": "계정 만들기", + "signIn": "이미 계정이 있으신가요? 로그인", + "passwordMismatch": "비밀번호가 일치하지 않습니다.", + "credentialsRequired": "사용자 이름과 비밀번호를 입력해 주세요.", + "captchaRequired": "인증 코드를 입력해 주세요.", + "captchaLoadFailed": "인증 코드를 불러오지 못했습니다. 새로고침 후 다시 시도해 주세요.", + "failed": "회원가입에 실패했습니다. 다시 시도해 주세요." + }, "apiKey": { "title": "API Key 관리", "createBtn": "Key 생성", diff --git a/src/locales/zh-CN.json b/src/locales/zh-CN.json index 38e7e10..ff53c16 100644 --- a/src/locales/zh-CN.json +++ b/src/locales/zh-CN.json @@ -142,15 +142,44 @@ }, "login": { "title": "登录", - "desc": "连接钱包以登录", + "descAccount": "使用用户名和密码登录", + "descWallet": "连接钱包以登录", + "tabAccount": "账号密码", + "tabWallet": "钱包登录", + "username": "用户名", + "password": "密码", + "captcha": "验证码", + "refreshCaptcha": "刷新验证码", + "loginBtn": "登录", "connecting": "连接中...", "connectBtn": "连接钱包", "signUp": "没有账号?立即注册", "walletNotInstalled": "未检测到以太坊钱包。请安装 MetaMask、TokenPocket 或其他以太坊钱包后重试。", "invalidAddress": "钱包地址格式无效,请检查钱包连接。", "connectFailed": "连接钱包失败,请检查钱包后重试。", + "loginFailed": "登录失败,请检查账号密码后重试。", + "credentialsRequired": "请输入用户名和密码。", + "captchaRequired": "请输入验证码。", + "captchaLoadFailed": "验证码加载失败,请刷新后重试。", "siweStatement": "登录 Alpha Market" }, + "register": { + "title": "注册", + "desc": "创建账号开始交易", + "username": "用户名", + "nickName": "昵称(可选)", + "password": "密码", + "confirmPassword": "确认密码", + "captcha": "验证码", + "refreshCaptcha": "刷新验证码", + "submitBtn": "注册", + "signIn": "已有账号?立即登录", + "passwordMismatch": "两次输入的密码不一致。", + "credentialsRequired": "请输入用户名和密码。", + "captchaRequired": "请输入验证码。", + "captchaLoadFailed": "验证码加载失败,请刷新后重试。", + "failed": "注册失败,请稍后重试。" + }, "apiKey": { "title": "API Key 管理", "createBtn": "创建 Key", diff --git a/src/locales/zh-TW.json b/src/locales/zh-TW.json index f34fca2..517f69d 100644 --- a/src/locales/zh-TW.json +++ b/src/locales/zh-TW.json @@ -142,15 +142,44 @@ }, "login": { "title": "登入", - "desc": "連接錢包以登入", + "descAccount": "使用使用者名稱和密碼登入", + "descWallet": "連接錢包以登入", + "tabAccount": "帳號密碼", + "tabWallet": "錢包登入", + "username": "使用者名稱", + "password": "密碼", + "captcha": "驗證碼", + "refreshCaptcha": "刷新驗證碼", + "loginBtn": "登入", "connecting": "連接中...", "connectBtn": "連接錢包", "signUp": "沒有帳號?立即註冊", "walletNotInstalled": "未偵測到以太坊錢包。請安裝 MetaMask、TokenPocket 或其他以太坊錢包後重試。", "invalidAddress": "錢包地址格式無效,請檢查錢包連接。", "connectFailed": "連接錢包失敗,請檢查錢包後重試。", + "loginFailed": "登入失敗,請檢查帳號密碼後重試。", + "credentialsRequired": "請輸入使用者名稱和密碼。", + "captchaRequired": "請輸入驗證碼。", + "captchaLoadFailed": "驗證碼載入失敗,請刷新後重試。", "siweStatement": "登入 Alpha Market" }, + "register": { + "title": "註冊", + "desc": "建立帳號開始交易", + "username": "使用者名稱", + "nickName": "暱稱(可選)", + "password": "密碼", + "confirmPassword": "確認密碼", + "captcha": "驗證碼", + "refreshCaptcha": "刷新驗證碼", + "submitBtn": "註冊", + "signIn": "已有帳號?立即登入", + "passwordMismatch": "兩次輸入的密碼不一致。", + "credentialsRequired": "請輸入使用者名稱和密碼。", + "captchaRequired": "請輸入驗證碼。", + "captchaLoadFailed": "驗證碼載入失敗,請刷新後重試。", + "failed": "註冊失敗,請稍後重試。" + }, "apiKey": { "title": "API Key 管理", "createBtn": "創建 Key", diff --git a/src/router/index.ts b/src/router/index.ts index ab9798f..dc8cf53 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -3,6 +3,7 @@ import { HOME_MAIN_SCROLL_STORAGE_KEY } from './scrollKeys' import Home from '../views/Home.vue' import Trade from '../views/Trade.vue' import Login from '../views/Login.vue' +import Register from '../views/Register.vue' import TradeDetail from '../views/TradeDetail.vue' import EventMarkets from '../views/EventMarkets.vue' import Wallet from '../views/Wallet.vue' @@ -39,6 +40,11 @@ const router = createRouter({ name: 'login', component: Login, }, + { + path: '/register', + name: 'register', + component: Register, + }, { path: '/trade-detail/:id', name: 'trade-detail', diff --git a/src/views/Login.vue b/src/views/Login.vue index 3f69c47..d81ebe2 100644 --- a/src/views/Login.vue +++ b/src/views/Login.vue @@ -5,20 +5,82 @@