Deploy / deploy (build, debian, 22) (push) Canceled after 0s
- 所有页面共用顶栏(教程 / 挑战 / 自由创作 / 作品展,右边“教学”和用户菜单); 没登录时顶栏有“登录”按钮,关掉登录框不再白屏;/submission/:id 全屏页不带顶栏 - 后台改成“教学”侧栏,分出题 / 班级 / 管理三组;“全部提交”留在侧栏里打开; admin 也能进作品展管理(后端本来就允许) - 路由按角色守卫:meta.role 为 staff / super,学生和 admin 进不了无权页面 - 配色只在 theme.ts 定义,同时生成 --wp-* CSS 变量和 Naive UI 主题,暗色值先定好 - 图标改用打包进来的 lucide(断网也能显示),去掉 @iconify/vue 和 PUBLIC_ICONIFY_URL; 代码字体换成打包的 JetBrains Mono,编辑器默认字号 24 → 16 - 教程面板去掉和顶栏重复的切换和图标按钮,图标按钮都补上文字或提示 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
32 lines
810 B
TypeScript
32 lines
810 B
TypeScript
import { Account } from "../api"
|
|
import { Role } from "../utils/type"
|
|
import { user } from "./user"
|
|
|
|
let loading: Promise<void> | null = null
|
|
|
|
// 取一次当前登录用户(路由守卫要按角色判断,可能比 App 挂载还早)
|
|
export function loadUser(): Promise<void> {
|
|
if (user.loaded) return Promise.resolve()
|
|
loading ??= Account.getMyProfile()
|
|
.then((data) => {
|
|
user.username = data.username
|
|
user.role = data.role
|
|
})
|
|
.catch(() => {})
|
|
.finally(() => {
|
|
user.loaded = true
|
|
loading = null
|
|
})
|
|
return loading
|
|
}
|
|
|
|
export async function logout() {
|
|
// token 已经先清掉了,退出请求失败(比如断网)界面也要显示为已退出
|
|
try {
|
|
await Account.logout()
|
|
} finally {
|
|
user.username = ""
|
|
user.role = Role.Normal
|
|
}
|
|
}
|