feat(auth): enforce admin permissions in UI

Add can()/router meta, HomePage module filtering, Admins permission
matrix, and hide write actions when the user lacks *:write.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-10 15:30:26 +03:30
co-authored by Cursor
parent 8d0b65f087
commit df83af90e8
15 changed files with 590 additions and 84 deletions
+17 -3
View File
@@ -4,6 +4,7 @@ import { useRoute, useRouter } from 'vue-router'
import { message, Modal } from 'ant-design-vue'
import { ArrowRightOutlined, PlusOutlined, SearchOutlined } from '@ant-design/icons-vue'
import api from '@/api/http'
import { useAuthStore } from '@/stores/auth'
type Tenant = {
id: string
@@ -23,6 +24,7 @@ type Tenant = {
const route = useRoute()
const router = useRouter()
const auth = useAuthStore()
const loading = ref(false)
const rows = ref<Tenant[]>([])
const q = ref('')
@@ -32,6 +34,10 @@ const product = computed(() => {
return p === 'khanegi' ? 'khanegi' : 'hamkar'
})
const canWrite = computed(() =>
product.value === 'hamkar' ? auth.can('hamkar:write') : auth.can('khanegi:write'),
)
const title = computed(() => (product.value === 'hamkar' ? 'همکار' : 'خانگی'))
const subtitle = computed(() =>
product.value === 'hamkar'
@@ -110,7 +116,7 @@ onMounted(load)
>
<template #prefix><SearchOutlined /></template>
</a-input>
<a-button type="primary" @click="addVersion">
<a-button v-if="canWrite" type="primary" @click="addVersion">
<PlusOutlined /> نسخه جدید
</a-button>
</div>
@@ -173,12 +179,20 @@ onMounted(load)
>
ظاهر اپ
</a-button>
<a-button danger ghost style="flex: 0 0 auto" @click="remove(item)">حذف</a-button>
<a-button
v-if="canWrite"
danger
ghost
style="flex: 0 0 auto"
@click="remove(item)"
>
حذف
</a-button>
</div>
</article>
</div>
<a-empty v-else description="نسخه‌ای ثبت نشده" style="margin: 32px 0">
<a-button type="primary" @click="addVersion">افزودن اولین نسخه</a-button>
<a-button v-if="canWrite" type="primary" @click="addVersion">افزودن اولین نسخه</a-button>
</a-empty>
</a-spin>
</div>