当前位置:首页 > VUE

vue 实现审批流程

2026-01-18 18:55:18VUE

实现审批流程的基本思路

审批流程通常涉及多个步骤,如提交申请、部门审批、上级审批等。Vue.js 适合构建此类动态流程,结合状态管理和组件化设计可以实现灵活的审批系统。

使用 Vuex 管理审批状态

审批流程的状态管理是关键。Vuex 提供集中式存储,适合管理多步骤审批的状态。

// store/modules/approval.js
const state = {
  currentStep: 1,
  steps: [
    { id: 1, name: '提交申请', status: 'pending' },
    { id: 2, name: '部门审批', status: 'waiting' },
    { id: 3, name: '上级审批', status: 'waiting' }
  ]
}

const mutations = {
  APPROVE_STEP(state, stepId) {
    state.steps.find(step => step.id === stepId).status = 'approved'
    state.currentStep += 1
  },
  REJECT_STEP(state, stepId) {
    state.steps.find(step => step.id === stepId).status = 'rejected'
  }
}

动态渲染审批步骤组件

根据当前步骤动态渲染不同审批组件,保持界面与状态同步。

<template>
  <div class="approval-flow">
    <div v-for="step in steps" :key="step.id" 
         :class="['step', step.status]">
      {{ step.name }}
    </div>

    <component :is="currentComponent" @approve="handleApprove" @reject="handleReject"/>
  </div>
</template>

<script>
export default {
  computed: {
    steps() {
      return this.$store.state.approval.steps
    },
    currentComponent() {
      const step = this.$store.state.approval.currentStep
      return () => import(`@/components/Step${step}`)
    }
  },
  methods: {
    handleApprove() {
      this.$store.commit('APPROVE_STEP', this.$store.state.approval.currentStep)
    },
    handleReject() {
      this.$store.commit('REJECT_STEP', this.$store.state.approval.currentStep)
    }
  }
}
</script>

审批流程可视化

使用进度条或流程图增强用户体验,清晰展示审批进度。

<template>
  <div class="progress-container">
    <div v-for="(step, index) in steps" :key="step.id" class="step-node">
      <div class="connector" v-if="index > 0" :class="{ active: step.status !== 'waiting' }"></div>
      <div class="node" :class="step.status"></div>
      <div class="step-label">{{ step.name }}</div>
    </div>
  </div>
</template>

<style scoped>
.progress-container {
  display: flex;
  justify-content: space-between;
}
.node {
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background: #ccc;
}
.node.approved {
  background: #4CAF50;
}
.node.rejected {
  background: #F44336;
}
.connector {
  flex-grow: 1;
  height: 2px;
  background: #ccc;
  margin-top: 9px;
}
.connector.active {
  background: #4CAF50;
}
</style>

与后端API集成

审批流程通常需要持久化数据,通过axios与后端API交互。

// api/approval.js
import axios from 'axios'

export default {
  submitApplication(data) {
    return axios.post('/api/approval/submit', data)
  },
  approveStep(stepId) {
    return axios.post(`/api/approval/${stepId}/approve`)
  },
  getApprovalStatus(approvalId) {
    return axios.get(`/api/approval/${approvalId}/status`)
  }
}

权限控制实现

不同审批步骤可能需要不同权限,使用路由守卫控制访问。

// router.js
router.beforeEach((to, from, next) => {
  const requiresApprover = to.matched.some(record => record.meta.requiresApprover)
  const userRole = store.state.user.role

  if (requiresApprover && userRole !== 'approver') {
    next('/forbidden')
  } else {
    next()
  }
})

审批历史记录

记录审批操作历史,方便追踪和审计。

<template>
  <div class="approval-history">
    <div v-for="(log, index) in history" :key="index" class="log-entry">
      <span class="timestamp">{{ log.timestamp }}</span>
      <span class="action">{{ log.action }}</span>
      <span class="actor">{{ log.actor }}</span>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      history: []
    }
  },
  created() {
    this.fetchHistory()
  },
  methods: {
    async fetchHistory() {
      const response = await this.$api.approval.getHistory(this.approvalId)
      this.history = response.data
    }
  }
}
</script>

响应式设计考虑

确保审批流程在不同设备上都能良好显示。

/* 响应式布局 */
@media (max-width: 768px) {
  .progress-container {
    flex-direction: column;
    align-items: flex-start;
  }
  .step-node {
    display: flex;
    align-items: center;
    margin-bottom: 10px;
  }
  .connector {
    width: 2px;
    height: 20px;
    margin: 0 9px;
  }
}

vue 实现审批流程

标签: 流程vue
分享给朋友:

相关文章

vue前端实现下载进度

vue前端实现下载进度

实现下载进度条的基本思路 在Vue中实现下载进度条,通常需要结合XMLHttpRequest或Fetch API来监听下载进度事件。通过计算已下载数据与总数据的比例,动态更新进度条的显示。 使用X…

vue实现一个tab栏

vue实现一个tab栏

Vue 实现 Tab 栏 基础实现(选项式 API) <template> <div class="tab-container"> <div class="t…

vue实现打印二维码

vue实现打印二维码

安装二维码生成库 使用 qrcode 或 vue-qrcode 库生成二维码。通过 npm 安装: npm install qrcode vue-qrcode 生成二维码 在 Vue 组…

vue   实现单选

vue 实现单选

Vue 实现单选功能 在 Vue 中实现单选功能可以通过多种方式,以下是几种常见的方法: 使用原生 <input type="radio"> 绑定 v-model 通过 v-model…

vue实现星星

vue实现星星

实现星星评分的Vue组件 使用Vue实现星星评分功能可以通过组件化方式完成,以下是一个完整的实现方案: 模板部分 <template> <div class="star-ra…

vue实现计时

vue实现计时

Vue 实现计时功能 在 Vue 中实现计时功能可以通过多种方式完成,以下是几种常见的方法: 使用 setInterval 实现基础计时器 通过 setInterval 和 clearInterva…