diff --git a/apps/jingrow/frontend/src/app/main.ts b/apps/jingrow/frontend/src/app/main.ts index 631fd35..8a11251 100644 --- a/apps/jingrow/frontend/src/app/main.ts +++ b/apps/jingrow/frontend/src/app/main.ts @@ -15,23 +15,29 @@ import '../assets/styles/main.css' // Font Awesome: 全局引入图标字体样式 import '@fortawesome/fontawesome-free/css/all.min.css' -const app = createApp(App) - -app.use(createPinia()) -// 初始化认证状态(需要在pinia初始化之后) import { useAuthStore } from '../shared/stores/auth' -const authStore = useAuthStore() -authStore.initAuth() - -// 在路由使用前注册工具路由,避免路由匹配时的警告 import { useToolsStore } from '../shared/stores/tools' -const toolsStore = useToolsStore() -toolsStore.initToolRoutes(router) +import { usePermissionStore } from '../shared/stores/permissions' +import '../shared/utils/fetchInterceptor' +const app = createApp(App) +const pinia = createPinia() + +app.use(pinia) app.use(router) app.use(naive) -// 初始化fetch拦截器(需要在pinia初始化之后) -import '../shared/utils/fetchInterceptor' +async function bootstrap() { + const authStore = useAuthStore() + await authStore.initAuth() -app.mount('#app') + const toolsStore = useToolsStore() + toolsStore.initToolRoutes(router) + + const permissionStore = usePermissionStore() + await permissionStore.loadPermissions().catch(() => {}) + + app.mount('#app') +} + +bootstrap() diff --git a/apps/jingrow/frontend/src/core/pagetype/default.vue b/apps/jingrow/frontend/src/core/pagetype/default.vue index 3084386..8e9c8c3 100644 --- a/apps/jingrow/frontend/src/core/pagetype/default.vue +++ b/apps/jingrow/frontend/src/core/pagetype/default.vue @@ -288,11 +288,13 @@ import { downloadImageToLocal } from '@/shared/api/common' import { usePageTypeSlug } from '@/shared/utils/slug' import { resolvePagetypeToolbarOverride } from '@/core/registry/pagetypeOverride' import DefaultToolbar from '@/core/pagetype/default_toolbar.vue' +import { usePermissionStore } from '@/shared/stores/permissions' const route = useRoute() const router = useRouter() const message = useMessage() const dialog = useDialog() +const permissionStore = usePermissionStore() // 使用组合式函数处理URL slug const { pagetypeSlug, entity } = usePageTypeSlug(route) @@ -304,6 +306,7 @@ const isNew = computed(() => { return idValue === 'new' || idValue.startsWith('new-') }) const canEdit = ref(false) +const canRead = computed(() => permissionStore.canRead(entity.value)) const record = ref({}) const originalRecord = ref({}) @@ -826,9 +829,10 @@ async function loadMeta() { metaFields.value = data?.fields || [] pageMeta.value = data || {} - - - canEdit.value = true // 默认支持编辑 + + // 权限:默认读取后端权限,决定是否可编辑 + const pagetypeName = entity.value + canEdit.value = permissionStore.canWrite(pagetypeName) // 设置默认活动标签:显示第一个标签页 if (tabs.value.length > 0) { diff --git a/apps/jingrow/frontend/src/core/pagetype/default_list.vue b/apps/jingrow/frontend/src/core/pagetype/default_list.vue index a8707e9..d7eeffc 100644 --- a/apps/jingrow/frontend/src/core/pagetype/default_list.vue +++ b/apps/jingrow/frontend/src/core/pagetype/default_list.vue @@ -24,7 +24,8 @@ createRecordHandler, handleDeleteSelected, router, - t + t, + canEdit: canEditList, }" :entity="entity" :search-query="searchQuery" @@ -44,6 +45,7 @@ :view-mode="viewMode" :selected-keys="selectedKeys" :loading="loading" + :can-edit="canEditList" @update:search-query="searchQuery = $event" @update:view-mode="viewMode = $event" @reload="reload" @@ -424,15 +426,18 @@ import { resolvePagetypeListActionsOverride } from '@/core/registry/pagetypeOverride' import { downloadImageToLocal } from '@/shared/api/common' +import { usePermissionStore } from '@/shared/stores/permissions' const route = useRoute() const router = useRouter() const message = useMessage() const dialog = useDialog() +const permissionStore = usePermissionStore() // 使用组合式函数处理URL slug const { pagetypeSlug, entity } = usePageTypeSlug(route) const title = computed(() => entity.value) +const canEditList = computed(() => permissionStore.canWrite(entity.value)) // 覆盖组件引用(子组件覆盖,整体覆盖由 ListPage.vue 处理) const toolbarComponent = shallowRef(null) diff --git a/apps/jingrow/frontend/src/core/pagetype/default_list_toolbar.vue b/apps/jingrow/frontend/src/core/pagetype/default_list_toolbar.vue index 66203ea..064029e 100644 --- a/apps/jingrow/frontend/src/core/pagetype/default_list_toolbar.vue +++ b/apps/jingrow/frontend/src/core/pagetype/default_list_toolbar.vue @@ -30,7 +30,7 @@