vite+vue项目之后台系统写新增

120 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第17天,点击查看活动详情


写在前面

上篇文章介绍了如何在vite+vue项目的后台系统中写列表、分页、查询,本篇文章介绍如何在vite+vue项目的后台系统中写新增

完整源码:项目gitee地址

在线演示:演示地址

账号:admin
密码:admin

新增

新增的弹出框用element plus的el-dialog实现

点击新增按钮后,显示新增用户的弹出框,:

<el-dialog v-model="addEditShow" v-if="addEditShow" title="新增" width="480px">
    <add-edit :editItem="editItem" ref="AddEditRef"></add-edit>
    <template #footer>
        <span class="dialog-footer">
            <el-button @click="addEditShow = false">取 消</el-button>
            <el-button type="primary" @click="handleSubmit">
                确 定
            </el-button>
        </span>
    </template>
</el-dialog>
...
import AddEdit from './AddEdit.vue'
import { getUser, postUser } from '@/api/SystemSet/UserManage'
...
let addEditShow = ref(false)
let editItem = ref(null)
const AddEditRef = ref()

const handleAdd = () => {
    addEditShow.value = true
    editItem.value = null
}

const handleSubmit = async () => {
    await AddEditRef.value.ruleFormRef.validate((valid: any, fields: any) => {
        if (valid) {
            let form = AddEditRef.value.ruleForm
            postUser(form).then((res: any) => {
                if (res.code === 0) {
                    getTableData()
                    addEditShow.value = false
                    ElMessage({
                        message: res.msg,
                        type: "success",
                    });
                }
            })
        } else {
            console.log('error submit!', fields)
        }
    })
}

在该页面引入了AddEdit.vue文件,AddEdit.vue文件包含新增的表单的代码,表单用element plus的el-form组件, AddEdit.vue代码如下,表单需要填写的字段有用户名、姓名、性别、手机号、岗位、所属部门、角色,全部设置为必填项,表单里用到了element-plus的el-input、el-select、el-cascader组件,角色列表roleIds和组织列表orgIds的数据是前端写的假数据。同时在该页面使用defineExpose方法将ruleFormRef和ruleForm传递给父组件,父组件的handleSubmit方法中通过refs调用,这和vue2的父子之间通信有出入,但是应该挺好理解:

<template>
    <el-form ref="ruleFormRef" :model="ruleForm" :rules="rules" label-width="80px" status-icon>
        <el-form-item label="用户名" prop="userName">
            <el-input v-model="ruleForm.userName" placeholder="请输入用户名" />
        </el-form-item>
        <el-form-item label="姓名" prop="realName">
            <el-input v-model="ruleForm.realName" placeholder="请输入姓名" />
        </el-form-item>
        <el-form-item label="性别" prop="gender">
            <el-select v-model="ruleForm.gender" placeholder="请选择性别">
                <el-option label="男" :value="0" />
                <el-option label="女" :value="1" />
            </el-select>
        </el-form-item>
        <el-form-item label="手机号" prop="mobile">
            <el-input v-model="ruleForm.mobile" placeholder="请输入手机号" />
        </el-form-item>
        <el-form-item label="岗位" prop="post">
            <el-input v-model="ruleForm.post" placeholder="请输入岗位" />
        </el-form-item>
        <el-form-item label="所属部门" prop="orgId">
            <el-cascader v-model="ruleForm.orgId" :options="orgIds" :props="{
                checkStrictly: true, value: 'id', label: 'name',emitPath: false
            }" clearable placeholder="请选择所属部门" />
        </el-form-item>
        <el-form-item label="角色" prop="roleIdList">
            <el-select v-model="ruleForm.roleIdList" placeholder="请选择角色" multiple filterable collapse-tags
                collapse-tags-tooltip>
                <el-option :label="item.name" :value="item.id" v-for="(item, index) in roleIds" :key="index" />
            </el-select>
        </el-form-item>
    </el-form>
</template>

<script setup lang="ts">
import { reactive, ref } from 'vue'
import type { FormInstance, FormRules } from 'element-plus'

const ruleFormRef = ref<FormInstance>()
const ruleForm = reactive({
    userName: '',
    realName: '',
    gender: '',
    mobile: '',
    post: '',
    orgId: '',
    roleIdList: []
})

const rules = reactive<FormRules>({
    userName: [
        { required: true, message: '请输入用户名', trigger: 'change' },
    ],
    realName: [
        { required: true, message: '请输入姓名', trigger: 'change' },
    ],
    gender: [
        { required: true, message: '请选择性别', trigger: 'change' },
    ],
    mobile: [
        { required: true, message: '请输入手机号', trigger: 'change' },
    ],
    post: [
        { required: true, message: '请输入岗位', trigger: 'change' },
    ],
    orgId: [
        { required: true, message: '请选择所属部门', trigger: 'change' },
    ],
    roleIdList: [
        { required: true, message: '请选择角色', trigger: 'change' },
    ],
})

const orgIds = [
    {
        id: 1,
        name: '研发部',
    },
    {
        id: 4,
        name: '销售部',
        children: [
            {
                id: 2,
                name: '销售1部',
            },
            {
                id: 3,
                name: '销售2部',
            },
        ],
    },
]

const roleIds = [
    { name: '管理员', id: 1 },
    { name: '开发人员', id: 2 },
    { name: '销售人员', id: 3 }
]

defineExpose({
    ruleFormRef,
    ruleForm
})
</script>

<style lang="less" scoped>
.el-select,
:deep(.el-cascader) {
    width: 100%;
}
</style>

api\SystemSet\UserManage.ts文件中模拟了新增用户的接口,增加的代码如下,完整代码可去gitee上将项目clone下来看:

/**
 * 新增用户
 * @method postUser
 */
export const postUser = (data: any) => {
    //模拟接口
    return new Promise((resolve, reject) => {
        userList.unshift({
            ...data,
            orgName: orgs.find(el => el.id === data.orgId)?.name,
            roleNameList: roleIds.filter(el => data.roleIdList.includes(el.id)).map(el => el.name),
            createTime: getCurTime(),
            id: userList.length + 1
        })
        resolve({
            code: 0,
            msg: '新增成功!'
        })
    })
}

下面是新增用户的表单的图片:

1670309911357.png

写在最后

以上就是在在vite+vue项目的后台系统中写新增的代码和说明