- 新增后台登录图形验证码功能,完善登录安全防护 - 新增登录rememberMe参数,控制Refresh Token的会话持久化策略 - 实现OSS私有桶媒体URL自动签名,统一处理图片资源的临时访问签名 - 新增素材库数据库表与上传API,规范媒体资源管理流程 - 统一前端UI图标使用@element-plus/icons-vue,重构布局图标组件 - 登录页新增验证码输入、刷新功能,添加账号记忆与记住密码逻辑 - 更新全套文档,补充API契约、技术决策记录与集成流程说明 - 修复多个业务页面的图标展示问题,新增认证流程相关测试用例
73 lines
2.1 KiB
TypeScript
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 };
|
|
});
|