This commit is contained in:
fengchuanhn@gmail.com
2026-05-15 18:50:42 +08:00
parent 584d4c47a1
commit 28b2b4d686
9 changed files with 218 additions and 53 deletions

View File

@@ -1,24 +1,25 @@
import { defineStore } from "pinia";
import { loginApi, logoutApi, registerApi } from "../api/auth.js";
const USERS_KEY = "aiclient_users";
const TOKEN_KEY = "aiclient_token";
const USER_KEY = "aiclient_current_user";
function loadUsers() {
try {
const raw = localStorage.getItem(USERS_KEY);
return raw ? JSON.parse(raw) : [];
} catch {
return [];
function applyTokenResponse(store, res, fallbackMessage) {
if (!res.ok) {
return { ok: false, message: res.message || fallbackMessage };
}
}
function saveUsers(users) {
localStorage.setItem(USERS_KEY, JSON.stringify(users));
}
const data = res.data;
if (!data?.access_token || !data?.user) {
return { ok: false, message: "服务器返回数据异常" };
}
function createToken(username) {
return btoa(`${username}:${Date.now()}`);
store.setSession(data.access_token, {
id: data.user.id,
username: data.user.username,
});
return { ok: true, message: res.message || fallbackMessage };
}
export const useAuthStore = defineStore("auth", {
@@ -39,7 +40,21 @@ export const useAuthStore = defineStore("auth", {
},
actions: {
register({ username, password, confirmPassword }) {
setSession(accessToken, user) {
this.token = accessToken;
this.currentUser = user;
localStorage.setItem(TOKEN_KEY, accessToken);
localStorage.setItem(USER_KEY, JSON.stringify(user));
},
clearSession() {
this.token = "";
this.currentUser = null;
localStorage.removeItem(TOKEN_KEY);
localStorage.removeItem(USER_KEY);
},
async register({ username, password, confirmPassword }) {
const name = username?.trim();
if (!name || !password) {
return { ok: false, message: "用户名和密码不能为空" };
@@ -51,51 +66,36 @@ export const useAuthStore = defineStore("auth", {
return { ok: false, message: "密码长度至少为 6 位" };
}
const users = loadUsers();
if (users.some((u) => u.username === name)) {
return { ok: false, message: "用户名已存在" };
}
const res = await registerApi({
username: name,
password,
confirmPassword,
});
users.push({ username: name, password });
saveUsers(users);
return this.login({ username: name, password });
return applyTokenResponse(this, res, "注册成功");
},
login({ username, password }) {
async login({ username, password }) {
const name = username?.trim();
if (!name || !password) {
return { ok: false, message: "用户名和密码不能为空" };
}
const users = loadUsers();
const user = users.find((u) => u.username === name);
if (!user || user.password !== password) {
return { ok: false, message: "用户名或密码错误" };
const res = await loginApi({
username: name,
password,
});
return applyTokenResponse(this, res, "登录成功");
},
async logout() {
const token = this.token;
if (token) {
await logoutApi(token);
}
const token = createToken(name);
const currentUser = { username: name };
this.token = token;
this.currentUser = currentUser;
localStorage.setItem(TOKEN_KEY, token);
localStorage.setItem(USER_KEY, JSON.stringify(currentUser));
return { ok: true, message: "登录成功" };
},
logout() {
this.token = "";
this.currentUser = null;
localStorage.removeItem(TOKEN_KEY);
localStorage.removeItem(USER_KEY);
this.clearSession();
return { ok: true, message: "已退出登录" };
},
// 预留:后续对接 Tauri invoke / HTTP API
async loginWithApi(_credentials) {
return { ok: false, message: "API 登录尚未实现" };
},
},
});