Skip to content

完整 Schema 示例

订单列表表格

json
{
  "version": "1.0",
  "id": "order-table",
  "name": "订单列表",
  "type": "DataTable",
  "permission": "order:list:view",
  "dicts": {
    "orderStatus": [
      { "label": "待处理", "value": "pending", "color": "warning" },
      { "label": "已完成", "value": "done", "color": "success" },
      { "label": "已取消", "value": "cancelled", "color": "info" }
    ]
  },
  "externalDeps": {
    "dicts": [],
    "functions": [
      { "key": "fetchDeptList", "type": "api", "description": "获取部门列表" },
      { "key": "searchUser", "type": "remote", "description": "搜索用户" },
      { "key": "uploadImage", "type": "upload:image", "description": "上传图片" },
      { "key": "uploadFile", "type": "upload:file", "description": "上传文件" }
    ],
    "permissions": [
      { "code": "order:list:view", "name": "查看订单列表", "scope": "type", "target": "order-table" },
      { "code": "order:cost:view", "name": "查看订单成本", "scope": "cell:view", "target": "cost" },
      { "code": "order:amount:edit", "name": "编辑订单金额", "scope": "cell:edit", "target": "amount" },
      { "code": "order:create", "name": "新增订单", "scope": "action", "target": "create" },
      { "code": "order:view", "name": "查看订单详情", "scope": "action", "target": "view" },
      { "code": "order:edit", "name": "编辑订单", "scope": "action", "target": "edit" },
      { "code": "order:delete", "name": "删除订单", "scope": "action", "target": "delete" }
    ]
  },
  "props": {
    "columns": [
      { "key": "orderNo", "label": "订单号", "cell": "text", "displayAs": "copy", "column": { "width": 180, "fixed": "left" } },
      { "key": "amount", "label": "金额", "cell": "currency", "column": { "sortable": true, "align": "right" }, "permission": { "view": true, "edit": "order:amount:edit" } },
      { "key": "cost", "label": "成本", "cell": "currency", "permission": { "view": "order:cost:view", "edit": "order:cost:view" } },
      { "key": "status", "label": "状态", "cell": "enum", "cellProps": { "options": "dict:orderStatus" }, "displayAs": "tag" },
      { "key": "department", "label": "所属部门", "cell": "enum", "cellProps": { "options": "api:fetchDeptList", "labelKey": "name", "valueKey": "id" } },
      { "key": "assignee", "label": "负责人", "cell": "enum", "cellProps": { "options": "remote:searchUser", "labelKey": "name", "valueKey": "id", "displayLabelKey": "assigneeName" }, "displayAs": "text" },
      { "key": "photos", "label": "商品图片", "cell": "image", "cellProps": { "multiple": true, "limit": 5, "width": 40, "height": 40 } },
      { "key": "attachments", "label": "附件", "cell": "file", "cellProps": { "multiple": true, "limit": 10, "accept": ".pdf,.docx,.xlsx" } },
      { "key": "content", "label": "内容", "cell": "detail", "cellProps": { "trigger": "button", "buttonText": "查看详情", "mode": "text", "dialogTitle": "内容详情" } },
      { "key": "createTime", "label": "创建时间", "cell": "datetime", "cellProps": { "format": "YYYY-MM-DD" }, "column": { "sortable": true } }
    ],
    "pagination": { "enabled": true, "pageSize": 20, "pageSizes": [10, 20, 50, 100] },
    "selection": { "enabled": true, "rowKey": "id" },
    "toolbarActions": [
      { "key": "create", "label": "新增", "permission": "order:create", "trigger": "createForm" },
      { "key": "batchDelete", "label": "批量删除", "permission": "order:delete", "batch": true, "confirm": "确认删除选中的订单?" }
    ],
    "rowActions": [
      { "key": "view", "label": "查看", "permission": "order:view" },
      { "key": "edit", "label": "编辑", "permission": "order:edit", "trigger": "updateForm" },
      { "key": "delete", "label": "删除", "permission": "order:delete", "danger": true, "confirm": "确认删除?" }
    ],
    "rowActionStyle": { "type": "link", "maxVisible": 3 },
    "createForm": {
      "title": "新增订单",
      "width": "800px",
      "keepAfterSubmit": false,
      "layout": { "columns": 2, "labelWidth": "100px" },
      "fields": ["amount", "status", "department", "assignee", "photos", "attachments", "content"],
      "overrides": {
        "amount": { "permission": { "edit": true } },
        "content": { "span": 2 }
      },
      "rules": {
        "amount": [{ "required": true, "message": "请输入金额" }],
        "status": [{ "required": true, "message": "请选择状态" }]
      }
    },
    "updateForm": {
      "title": "编辑订单",
      "width": "800px",
      "layout": { "columns": 2, "labelWidth": "100px" },
      "fields": ["orderNo", "amount", "status", "department", "assignee", "photos", "attachments", "content"],
      "overrides": {
        "orderNo": { "disabled": true },
        "amount": { "permission": { "edit": "order:amount:edit" } },
        "content": { "span": 2 }
      },
      "rules": {
        "amount": [{ "required": true, "message": "请输入金额" }]
      }
    }
  }
}

订单搜索表单

json
{
  "version": "1.0",
  "id": "order-search",
  "name": "订单搜索",
  "type": "Form",
  "dicts": {
    "orderStatus": [
      { "label": "待处理", "value": "pending" },
      { "label": "已完成", "value": "done" },
      { "label": "已取消", "value": "cancelled" }
    ]
  },
  "props": {
    "layout": {
      "columns": 3,
      "labelWidth": "80px",
      "collapsible": true,
      "defaultCollapsed": true,
      "visibleRows": 1
    },
    "fields": [
      { "key": "keyword", "label": "关键词", "cell": "text", "cellProps": { "placeholder": "订单号 / 客户名" } },
      { "key": "status", "label": "状态", "cell": "enum", "cellProps": { "options": "dict:orderStatus" } },
      { "key": "dateRange", "label": "创建日期", "cell": "dateRange", "cellProps": { "startKey": "startDate", "endKey": "endDate" } }
    ],
    "buttons": { "submitText": "搜索", "resetText": "重置", "showReset": true }
  }
}

订单详情

json
{
  "version": "1.0",
  "id": "order-detail",
  "name": "订单详情",
  "type": "Descriptions",
  "permission": "order:detail:view",
  "dicts": {
    "orderStatus": [
      { "label": "待处理", "value": "pending", "color": "warning" },
      { "label": "已完成", "value": "done", "color": "success" },
      { "label": "已取消", "value": "cancelled", "color": "info" }
    ]
  },
  "externalDeps": {
    "dicts": [],
    "functions": [],
    "permissions": [
      { "code": "order:detail:view", "name": "查看订单详情", "scope": "type", "target": "order-detail" },
      { "code": "order:cost:view", "name": "查看订单成本", "scope": "cell:view", "target": "cost" }
    ]
  },
  "props": {
    "column": 2,
    "items": [
      { "key": "orderNo", "label": "订单号", "cell": "text", "displayAs": "copy" },
      { "key": "amount", "label": "金额", "cell": "currency" },
      { "key": "cost", "label": "成本", "cell": "currency", "permission": { "view": "order:cost:view" } },
      { "key": "status", "label": "状态", "cell": "enum", "cellProps": { "options": "dict:orderStatus" }, "displayAs": "tag" },
      { "key": "assigneeName", "label": "负责人", "cell": "text" },
      { "key": "photos", "label": "商品图片", "cell": "image", "cellProps": { "multiple": true, "width": 80, "height": 80 } },
      { "key": "attachments", "label": "附件", "cell": "file", "cellProps": { "multiple": true } },
      { "key": "content", "label": "内容", "cell": "detail", "cellProps": { "trigger": "link", "buttonText": "查看完整内容", "mode": "text" } },
      { "key": "createTime", "label": "创建时间", "cell": "datetime", "cellProps": { "format": "YYYY-MM-DD HH:mm:ss" } },
      { "key": "remark", "label": "备注", "cell": "text" }
    ]
  }
}

业务页面组装

vue
<template>
  <div class="order-page">
    <SchemlyRenderer
      :schema="searchSchema"
      :providers="providers"
      @submit="onSearch"
      @reset="onReset"
    />
    <SchemlyRenderer
      :schema="tableSchema"
      :data="tableData"
      :providers="providers"
      :loading="loading"
      @action="onAction"
      @createSubmit="onCreateSubmit"
      @updateSubmit="onUpdateSubmit"
      @sort-change="onSortChange"
      @page-change="onPageChange"
      @selection-change="onSelectionChange"
    />
  </div>
</template>

<script setup>
import { ref } from 'vue'
import searchSchema from './schemas/order-search.json'
import tableSchema from './schemas/order-table.json'

const tableData = ref([])
const loading = ref(false)

const providers = {
  dicts: {},
  functions: {
    fetchDeptList: () => api.getDepartments(),
    searchUser: (query) => api.searchUser({ keyword: query }),
    uploadImage: (file) => api.uploadImage(file),
    uploadFile: (file) => api.uploadFile(file)
  },
  auth: {
    hasPermission: (code) => currentUser.permissions.includes(code)
  },
  actionControl: (row) => ({
    edit: row.status !== 'done',
    delete: row.createdBy === currentUser.id
  })
}

const onSearch = ({ values }) => {
  loading.value = true
  api.fetchOrderList(values).then(res => {
    tableData.value = res.data
    loading.value = false
  })
}

const onReset = () => {
  onSearch({ values: {} })
}

const onAction = ({ key, row, rows }) => {
  if (key === 'view') router.push(`/order/${row.id}`)
  if (key === 'delete') api.deleteOrder(row.id).then(() => refresh())
  if (key === 'batchDelete') api.batchDeleteOrders(rows.map(r => r.id)).then(() => refresh())
}

const onCreateSubmit = ({ values }) => {
  api.createOrder(values).then(() => refresh())
}

const onUpdateSubmit = ({ values, row }) => {
  api.updateOrder(row.id, values).then(() => refresh())
}

const onSortChange = ({ key, order }) => {
  // 重新请求排序数据
}

const onPageChange = ({ page, pageSize }) => {
  // 重新请求分页数据
}

const onSelectionChange = ({ rows }) => {
  // 记录选中行
}
</script>

Released under the MIT License.