Tài liệu

Trang cấu hình

Trang cấu hình Ví dụ này quản lý bảng cấu hình một bản ghi từ admin console. Bảng Tạo app_settings với isSingleRecord=true . Trường Kiểu Ghi chú siteName string Tên công khai supportEmail string Thêm quy tắc định dạng email webhookSecret string isEncrypted=true , isPublished=fals

Trang cấu hình

Ví dụ này quản lý bảng cấu hình một bản ghi từ admin console.

Bảng

Tạo app_settings với isSingleRecord=true.

Trường Kiểu Ghi chú
siteName string Tên công khai
supportEmail string Thêm quy tắc định dạng email
webhookSecret string isEncrypted=true, isPublished=false

Page Extension

Dùng FormEditor cho cấu hình dựa trên bảng thay vì tự dựng từng input.

<template>
  <div class="space-y-4">
    <FormEditorLazy
      v-if="record"
      table-name="app_settings"
      :model-value="record"
      :includes="['siteName', 'supportEmail', 'webhookSecret']"
      @submit="save"
    />
    <LoadingState v-else-if="pending" />
    <ErrorState v-else-if="error" :error="error" />
  </div>
</template>

<script setup>
const { registerPageHeader } = usePageHeaderRegistry();
registerPageHeader({
  title: 'Application Settings',
  description: 'Manage runtime settings',
  leadingIcon: '',
  variant: 'minimal'
});

const record = ref(null);
const pending = ref(false);
const error = ref(null);

const load = async () => {
  pending.value = true;
  error.value = null;
  try {
    const response = await $fetch('/api/app_settings', { query: { limit: 1 } });
    record.value = response.data?.[0] || {};
  } catch (err) {
    error.value = err;
  } finally {
    pending.value = false;
  }
};

const save = async (value) => {
  const id = value.id || record.value?.id;
  if (id) {
    await $fetch(`/api/app_settings/${id}`, { method: 'PATCH', body: value });
  } else {
    await $fetch('/api/app_settings', { method: 'POST', body: value });
  }
  await load();
};

onMounted(load);
</script>

Chỉ người dùng có quyền route cấu hình mới nên thấy mục menu này.