Files
WonderQ-Project/WonderQ-Admin-UI-Vue/src/stores/auth.ts
duanshuwen 6245159e7c feat: 添加后台登录验证码、记住密码功能,优化媒体资源与前端规范
- 新增后台登录图形验证码功能,完善登录安全防护
- 新增登录rememberMe参数,控制Refresh Token的会话持久化策略
- 实现OSS私有桶媒体URL自动签名,统一处理图片资源的临时访问签名
- 新增素材库数据库表与上传API,规范媒体资源管理流程
- 统一前端UI图标使用@element-plus/icons-vue,重构布局图标组件
- 登录页新增验证码输入、刷新功能,添加账号记忆与记住密码逻辑
- 更新全套文档,补充API契约、技术决策记录与集成流程说明
- 修复多个业务页面的图标展示问题,新增认证流程相关测试用例
2026-08-27 07:50:59 +08:00

73 lines
2.1 KiB
TypeScript

import { computed, ref } from "vue";
import { defineStore } from "pinia";
import * as api from "@/api/client";
import type { AdminMenu, AdminProfile, AdminUser } from "@/types";
export const useAuthStore = defineStore("auth", () => {
const user = ref<AdminUser | null>(null);
const menus = ref<AdminMenu[]>([]);
const permissions = ref<string[]>([]);
const initialized = ref(false);
const loading = ref(false);
const isAuthenticated = computed(() => Boolean(user.value && api.getAccessToken()));
function applyProfile(profile: AdminProfile) {
user.value = profile.user;
menus.value = profile.menus;
permissions.value = profile.permissions;
}
async function loadProfile() {
const profile = await api.getProfile();
applyProfile(profile);
menus.value = await api.getRouters();
}
async function bootstrap() {
if (initialized.value) return;
loading.value = true;
try {
const session = await api.refreshAccessToken();
user.value = session.user;
await loadProfile();
} catch {
api.setAccessToken(null);
user.value = null;
menus.value = [];
permissions.value = [];
} finally {
initialized.value = true;
loading.value = false;
}
}
async function login(email: string, password: string, captchaId: string, captchaCode: string, rememberMe = false) {
loading.value = true;
try {
const session = await api.login(email, password, captchaId, captchaCode, rememberMe);
api.setAccessToken(session.accessToken || session.token);
user.value = session.user;
await loadProfile();
} finally {
loading.value = false;
}
}
async function logout() {
try {
await api.logout();
} finally {
api.setAccessToken(null);
user.value = null;
menus.value = [];
permissions.value = [];
}
}
function hasPermission(permission: string) {
return permissions.value.includes("*") || permissions.value.includes(permission);
}
return { user, menus, permissions, initialized, loading, isAuthenticated, bootstrap, login, logout, hasPermission };
});