Grant senior_editor oil editing, PDF export, and public recipe management
Some checks failed
PR Preview / teardown-preview (pull_request) Has been skipped
Test / unit-test (push) Successful in 4s
Test / build-check (push) Successful in 3s
PR Preview / test (pull_request) Successful in 4s
PR Preview / deploy-preview (pull_request) Successful in 20s
Test / e2e-test (push) Failing after 1m2s

Add canManage computed (senior_editor + admin) to auth store and use it
for oil edit/delete buttons, PDF export, and public recipe section
visibility. Backend already allowed these operations for senior_editor.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-07 11:59:49 +00:00
parent 2bec4a2d26
commit 6563a6f7d2
3 changed files with 7 additions and 3 deletions

View File

@@ -18,6 +18,9 @@ export const useAuthStore = defineStore('auth', () => {
// Getters // Getters
const isLoggedIn = computed(() => user.value.id !== null) const isLoggedIn = computed(() => user.value.id !== null)
const isAdmin = computed(() => user.value.role === 'admin') const isAdmin = computed(() => user.value.role === 'admin')
const canManage = computed(() =>
['senior_editor', 'admin'].includes(user.value.role)
)
const canEdit = computed(() => const canEdit = computed(() =>
['editor', 'senior_editor', 'admin'].includes(user.value.role) ['editor', 'senior_editor', 'admin'].includes(user.value.role)
) )
@@ -91,6 +94,7 @@ export const useAuthStore = defineStore('auth', () => {
user, user,
isLoggedIn, isLoggedIn,
isAdmin, isAdmin,
canManage,
canEdit, canEdit,
isBusiness, isBusiness,
initToken, initToken,

View File

@@ -118,7 +118,7 @@
@click="viewMode = 'drop'" @click="viewMode = 'drop'"
>滴价</button> >滴价</button>
</div> </div>
<button v-if="auth.isAdmin" class="btn-pdf" @click="exportPDF" title="导出PDF"> <button v-if="auth.canManage" class="btn-pdf" @click="exportPDF" title="导出PDF">
📄 📄
</button> </button>
</div> </div>
@@ -159,7 +159,7 @@
<div class="oil-chip-volume" v-if="getMeta(name)?.dropCount"> <div class="oil-chip-volume" v-if="getMeta(name)?.dropCount">
{{ volumeLabel(getMeta(name).dropCount) }} {{ volumeLabel(getMeta(name).dropCount) }}
</div> </div>
<div class="oil-actions" v-if="auth.isAdmin" @click.stop> <div class="oil-actions" v-if="auth.canManage" @click.stop>
<button class="btn-icon-sm" @click="editOil(name)" title="编辑"></button> <button class="btn-icon-sm" @click="editOil(name)" title="编辑"></button>
<button class="btn-icon-sm" @click="removeOil(name)" title="删除">🗑</button> <button class="btn-icon-sm" @click="removeOil(name)" title="删除">🗑</button>
</div> </div>

View File

@@ -91,7 +91,7 @@
</div> </div>
<!-- Public Recipes Section (admin/senior_editor only) --> <!-- Public Recipes Section (admin/senior_editor only) -->
<div v-if="auth.isAdmin || auth.user.role === 'senior_editor'" class="recipe-section"> <div v-if="auth.canManage" class="recipe-section">
<h3 class="section-title">🌿 公共配方库 ({{ publicRecipes.length }})</h3> <h3 class="section-title">🌿 公共配方库 ({{ publicRecipes.length }})</h3>
<div class="recipe-list"> <div class="recipe-list">
<div <div