📋 构建“银行级审批系统前端架构”:Vue 3 + Naive UI 实战封装

5 阅读2分钟

📋 构建“银行级审批系统前端架构”:Vue 3 + Naive UI 实战封装

✅ 为什么写这篇?

在汇丰这样的金融机构,审批系统贯穿风控、信贷、财务、客户变更等多个业务场景。
一个通用型前端审批框架,能极大提高开发效率、提升权限控制精度。
本篇带你用 Vue 3 + Naive UI,打造一个“可复用 + 权限驱动 + 状态可追踪”的审批系统。


📌 场景还原

不同用户在审批系统中看到的字段、操作按钮、审批流节点都不一样。你需要根据用户角色动态渲染页面,同时统一处理“通过 / 驳回 / 备注”等动作。


📦 技术选型

技术用途
Vue 3 + Composition API前端组件逻辑封装
Naive UIUI 框架
Pinia状态管理
Vite构建工具

🧱 组件结构设计

ApprovalPage.vue
├── ApprovalForm.vue          // 动态表单(字段权限控制)
├── ApprovalTimeline.vue      // 审批流程图(展示每个节点状态)
├── ApprovalActions.vue       // 操作按钮(权限控制)

🧪 实战代码展示

1️⃣ 动态字段权限渲染(ApprovalForm.vue
<template>
  <n-form :model="formModel">
    <n-form-item v-for="field in visibleFields" :key="field.key" :label="field.label">
      <n-input v-model:value="formModel[field.key]" :disabled="!field.editable" />
    </n-form-item>
  </n-form>
</template>

<script setup>
import { ref, computed } from 'vue'

const formModel = ref({
  name: '汇丰客户A',
  amount: 100000,
  comment: ''
})

const userRole = 'reviewer' // 可动态从用户信息获取

const fieldPermissions = {
  name: { editable: false, roles: ['admin', 'reviewer'] },
  amount: { editable: userRole === 'admin', roles: ['admin'] },
  comment: { editable: true, roles: ['admin', 'reviewer', 'manager'] }
}

const visibleFields = computed(() => {
  return Object.entries(formModel.value).map(([key, value]) => ({
    key,
    label: key.toUpperCase(),
    editable: fieldPermissions[key]?.editable,
  })).filter(f => fieldPermissions[f.key]?.roles.includes(userRole))
})
</script>
2️⃣ 动态按钮权限控制(ApprovalActions.vue
<template>
  <n-space>
    <n-button v-if="canApprove" @click="approve">通过</n-button>
    <n-button v-if="canReject" @click="reject" type="error">驳回</n-button>
  </n-space>
</template>

<script setup>
const userRole = 'reviewer'

const canApprove = userRole === 'reviewer' || userRole === 'manager'
const canReject = userRole !== 'guest'

function approve() {
  console.log('✅ 审批通过')
}

function reject() {
  console.log('❌ 审批驳回')
}
</script>
3️⃣ 审批流程时间线组件(ApprovalTimeline.vue
<template>
  <n-timeline>
    <n-timeline-item
      v-for="(item, index) in flow"
      :key="index"
      :title="item.node"
      :content="item.status"
      :time="item.time"
      :type="item.status === '通过' ? 'success' : item.status === '驳回' ? 'error' : 'default'"
    />
  </n-timeline>
</template>

<script setup>
const flow = [
  { node: '提交人', status: '提交', time: '2025-05-16 10:00' },
  { node: '初审', status: '通过', time: '2025-05-16 11:30' },
  { node: '终审', status: '待处理', time: '' }
]
</script>

🖥️ 页面展示结果

✅ 表单中字段按角色权限自动启用/禁用
✅ 不同角色看到的操作按钮不同
✅ 时间线实时展示审批进度


⚠️ 常见错误点

错误点描述
❌ 权限配置与角色匹配失效未正确处理角色的 editable 映射
❌ 页面按钮未响应权限变更权限变化后未刷新状态
❌ 审批时间线数据结构设计不清晰审批状态字段命名不一致

🎯 总结

  • 本文实现了银行通用审批页面的前端结构
  • 使用了 Naive UI、组合式 API、动态权限渲染
  • 支持灵活复用在不同类型的审批任务中