返回

vue3实现部门的管理

前端

前言

在现代企业中,组织架构是不可或缺的一部分,它定义了公司的结构、职责和汇报关系。部门作为组织架构中的基本单元,其维护和管理尤为重要。本文将使用vue3构建一个部门管理系统,实现部门信息的增删改查和拖拽排序功能。

构建部门数据模型

首先,我们需要定义一个部门数据模型,它将包含部门的基本信息,如部门名称、上级部门、排序等。

export interface Department {
  id: number;
  name: string;
  parentId: number;
  level: number;
  sort: number;
  sortAll: number;
  children: Department[];
}

维护部门信息

有了数据模型,我们就可以开始维护部门信息了。我们使用vuex作为状态管理工具,定义一个名为"department"的模块来管理部门数据。

import { defineStore } from 'pinia';
import { Department } from '@/models/department';

export const useDepartmentStore = defineStore('department', {
  state: () => ({
    departments: [] as Department[],
  }),
  getters: {
    getDepartmentById: (state) => (id: number) => state.departments.find((d) => d.id === id),
  },
  actions: {
    addDepartment(department: Department) {
      this.departments.push(department);
    },
    updateDepartment(department: Department) {
      const index = this.departments.findIndex((d) => d.id === department.id);
      if (index !== -1) {
        this.departments[index] = department;
      }
    },
    deleteDepartment(id: number) {
      const index = this.departments.findIndex((d) => d.id === id);
      if (index !== -1) {
        this.departments.splice(index, 1);
      }
    },
  },
});

内置类型转换

为了简化操作,我们将内置类型转换功能。当用户输入非数字类型的值时,系统会自动将其转换为数字类型。

export const toNumber = (value: string) => {
  return parseInt(value, 10) || 0;
};

自动设置字段

我们还可以自动设置一些字段,如parentID、level、sort和sortAll。

export const setFields = (department: Department, parentId: number = 0) => {
  department.parentId = parentId;
  department.level = parentId === 0 ? 0 : 1 + this.getDepartmentById(parentId).level;
  department.sort = 0;
  department.sortAll = `${department.parentId}.${department.sort}`;
};

扩展性

为了提高系统的可扩展性,我们提供了一个扩展机制,允许用户添加自定义字段和方法。

export const extendDepartment = (department: Department, customFields: any) => {
  Object.assign(department, customFields);
};

拖拽排序

最后,我们实现拖拽排序功能。我们使用vue-draggable-resizable组件来实现这一功能。

<template>
  <draggable-resizable
    v-model="departments"
    :group="group"
    :item-key="department => department.id"
    @end="handleEnd"
  >
    <template #item="{ element, index }">
      <div class="item">
        {{ department.name }}
      </div>
    </template>
  </draggable-resizable>
</template>

<script>
import { ref } from 'vue';
import { DraggableResizable } from 'vue-draggable-resizable';
import { setFields, useDepartmentStore } from '@/store/department';

export default {
  components: { DraggableResizable },
  setup() {
    const departmentStore = useDepartmentStore();
    const departments = ref(departmentStore.departments);
    const group = 'departments';

    const handleEnd = (e) => {
      // 更新排序
      departments.value.forEach((d, i) => {
        d.sort = i;
        d.sortAll = `${d.parentId}.${d.sort}`;
        departmentStore.updateDepartment(d);
      });
    };

    return {
      departments,
      group,
      handleEnd,
    };
  },
};
</script>

结语

本文介绍了如何使用vue3构建一个部门管理系统,涵盖了部门信息的维护、内置类型转换、自动设置字段、扩展性和拖拽排序等功能。该系统可以根据需要进行扩展和定制,满足各种组织架构的管理需求。