vue3+ts公司人员管理系统示例

vue3+ts公司人员管理系统示例

首先,创建一个新的 Vue 3 项目,并安装必要的依赖:

vue create company-management
cd company-management
vue add typescript
npm install element-plus

然后,在 src 目录下创建以下文件结构:

src/
  components/
    EmployeeList.vue
    EmployeeForm.vue
  types/
    Employee.ts
  App.vue
  main.ts
  1. src/types/Employee.ts 中定义 Employee 类型:
export interface Employee {
  id: number;
  name: string;
  position: string;
  department: string;
  email: string;
}
  1. src/components/EmployeeList.vue 中创建员工列表组件:
<template>
  <el-table :data="employees" style="width: 100%">
    <el-table-column prop="name" label="姓名" />
    <el-table-column prop="position" label="职位" />
    <el-table-column prop="department" label="部门" />
    <el-table-column prop="email" label="邮箱" />
    <el-table-column label="操作">
      <template #default="scope">
        <el-button size="small" @click="editEmployee(scope.row)">编辑</el-button>
        <el-button size="small" type="danger" @click="deleteEmployee(scope.row.id)">删除</el-button>
      </template>
    </el-table-column>
  </el-table>
</template>

<script lang="ts" setup>
import { defineProps, defineEmits } from 'vue';
import { Employee } from '../types/Employee';

const props = defineProps<{
  employees: Employee[];
}>();

const emit = defineEmits<{
  (e: 'edit', employee: Employee): void;
  (e: 'delete', id: number): void;
}>();

const editEmployee = (employee: Employee) => {
  emit('edit', employee);
};

const deleteEmployee = (id: number) => {
  emit('delete', id);
};
</script>
  1. src/components/EmployeeForm.vue 中创建员工表单组件:
<template>
  <el-form :model="form" label-width="120px">
    <el-form-item label="姓名">
      <el-input v-model="form.name" />
    </el-form-item>
    <el-form-item label="职位">
      <el-input v-model="form.position" />
    </el-form-item>
    <el-form-item label="部门">
      <el-input v-model="form.department" />
    </el-form-item>
    <el-form-item label="邮箱">
      <el-input v-model="form.email" />
    </el-form-item>
    <el-form-item>
      <el-button type="primary" @click="submitForm">{{ isEdit ? '更新' : '添加' }}</el-button>
    </el-form-item>
  </el-form>
</template>

<script lang="ts" setup>
import { ref, defineProps, defineEmits, watch } from 'vue';
import { Employee } from '../types/Employee';

const props = defineProps<{
  employee?: Employee;
}>();

const emit = defineEmits<{
  (e: 'submit', employee: Omit<Employee, 'id'>): void;
}>();

const form = ref<Omit<Employee, 'id'>>({
  name: '',
  position: '',
  department: '',
  email: '',
});

const isEdit = ref(false);

watch(() => props.employee, (newEmployee) => {
  if (newEmployee) {
    form.value = { ...newEmployee };
    isEdit.value = true;
  } else {
    form.value = {
      name: '',
      position: '',
      department: '',
      email: '',
    };
    isEdit.value = false;
  }
}, { immediate: true });

const submitForm = () => {
  emit('submit', form.value);
};
</script>
  1. src/App.vue 中组合所有组件:
<template>
  <el-container>
    <el-header>公司人员管理系统</el-header>
    <el-main>
      <el-row>
        <el-col :span="16">
          <h2>员工列表</h2>
          <employee-list
            :employees="employees"
            @edit="editEmployee"
            @delete="deleteEmployee"
          />
        </el-col>
        <el-col :span="8">
          <h2>{{ isEditing ? '编辑员工' : '添加员工' }}</h2>
          <employee-form
            :employee="currentEmployee"
            @submit="submitEmployee"
          />
        </el-col>
      </el-row>
    </el-main>
  </el-container>
</template>

<script lang="ts" setup>
import { ref, computed } from 'vue';
import EmployeeList from './components/EmployeeList.vue';
import EmployeeForm from './components/EmployeeForm.vue';
import { Employee } from './types/Employee';

const employees = ref<Employee[]>([
  { id: 1, name: '张三', position: '经理', department: '销售部', email: 'zhangsan@example.com' },
  { id: 2, name: '李四', position: '开发工程师', department: '技术部', email: 'lisi@example.com' },
]);

const currentEmployee = ref<Employee | undefined>();

const isEditing = computed(() => !!currentEmployee.value);

const editEmployee = (employee: Employee) => {
  currentEmployee.value = employee;
};

const deleteEmployee = (id: number) => {
  employees.value = employees.value.filter(e => e.id !== id);
};

const submitEmployee = (employee: Omit<Employee, 'id'>) => {
  if (currentEmployee.value) {
    // 更新员工
    const index = employees.value.findIndex(e => e.id === currentEmployee.value!.id);
    if (index !== -1) {
      employees.value[index] = { ...employee, id: currentEmployee.value.id };
    }
  } else {
    // 添加新员工
    const newId = Math.max(...employees.value.map(e => e.id)) + 1;
    employees.value.push({ ...employee, id: newId });
  }
  currentEmployee.value = undefined;
};
</script>

<style>
.el-header {
  background-color: #409EFF;
  color: white;
  line-height: 60px;
  text-align: center;
  font-size: 20px;
}

.el-main {
  padding: 20px;
}
</style>
  1. 最后,在 src/main.ts 中引入 Element Plus:
import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import App from './App.vue'

const app = createApp(App)
app.use(ElementPlus)
app.mount('#app')

关注微信公众号温暖前端,不定期分享前端知识点和前端资料↓↓↓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

温暖前端

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值