- users 表加 password_hash 列;后台账号(owner+admin)密码 bcrypt 存行内, 首次登录把 env / settings 引导凭据自迁移成行哈希 - 会话 token 从用户名改为携带用户 ID,角色与停用状态每请求查库, 改角色 / 停用账号即时生效(存量会话立即 401) - 登录:先查 users 表,再走 settings 哈希 / env 引导链; admin/admin 开发模式在任何账号设过密码后失效 - 权限:系统设置、用户管理仅 owner;内容管理 admin+owner; admin 后台新增 用户 页(创建 / 重置密码 / 停用 / 删除), 设置页「登录与存储」tab 对管理员隐藏 - 账户页加修改密码表单(旧密码校验,OAuth/Passkey 首设免旧密码); 评论区管理员身份跟随各自账号,不再统一挂站主名下 - 修复:providers 为 nil 时账户页白屏(Go nil slice 序列化成 null)
41 lines
2.2 KiB
JavaScript
41 lines
2.2 KiB
JavaScript
import { createRouter, createWebHistory } from 'vue-router'
|
|
|
|
const routes = [
|
|
{ path: '/', name: 'home', component: () => import('./views/HomeView.vue') },
|
|
{ path: '/post/:slug', name: 'post', component: () => import('./views/PostView.vue') },
|
|
{ path: '/archive', name: 'archive', component: () => import('./views/ArchiveView.vue') },
|
|
{ path: '/tags', name: 'tags', component: () => import('./views/TagsView.vue') },
|
|
{ path: '/tag/:slug', name: 'tag', component: () => import('./views/TagView.vue') },
|
|
{ path: '/about', name: 'about', component: () => import('./views/AboutView.vue') },
|
|
{ path: '/projects', name: 'projects', component: () => import('./views/ProjectsView.vue') },
|
|
|
|
{ path: '/admin/login', name: 'admin-login', component: () => import('./admin/LoginView.vue') },
|
|
{
|
|
path: '/admin',
|
|
component: () => import('./admin/AdminLayout.vue'),
|
|
children: [
|
|
{ path: '', name: 'admin-dashboard', component: () => import('./admin/DashboardView.vue') },
|
|
{ path: 'posts', name: 'admin-posts', component: () => import('./admin/PostsView.vue') },
|
|
{ path: 'new', name: 'admin-new', component: () => import('./admin/EditorView.vue') },
|
|
{ path: 'files', name: 'admin-files', component: () => import('./admin/FilesView.vue') },
|
|
{ path: 'comments', name: 'admin-comments', component: () => import('./admin/CommentsView.vue') },
|
|
{ path: ':id', name: 'admin-edit', component: () => import('./admin/EditorView.vue') },
|
|
{ path: 'tags', name: 'admin-tags', component: () => import('./admin/TagsView.vue') },
|
|
{ path: 'projects', name: 'admin-projects', component: () => import('./admin/ProjectsView.vue') },
|
|
{ path: 'settings', name: 'admin-settings', component: () => import('./admin/SettingsView.vue') },
|
|
{ path: 'account', name: 'admin-account', component: () => import('./admin/AccountView.vue') },
|
|
{ path: 'users', name: 'admin-users', component: () => import('./admin/UsersView.vue') }
|
|
]
|
|
},
|
|
|
|
{ path: '/:pathMatch(.*)*', name: 'not-found', component: () => import('./views/NotFoundView.vue') }
|
|
]
|
|
|
|
export const router = createRouter({
|
|
history: createWebHistory(),
|
|
routes,
|
|
scrollBehavior(to, from, saved) {
|
|
return saved || { top: 0 }
|
|
}
|
|
})
|