vue3+ts+element-plus管理系统实际开发业务之增删改查

vue3+ts+element-plus管理系统实际开发业务之增删改查


注释: 上期主要实现项目从0-1搭建上篇地址(从0实战一个 vue3+ ts+element-plus 项目),和引入常见依赖时候报错和出现的问题连接地址(vue3实战项目安装各种插件时候报错问题和解决),之后是完整的管理系统常见功能开发代码。中途有问题或者错误欢迎大家指出共同学习,

功能一: 实现一个表格增、删、改、查功能

✏️ 1. 表格、添加按钮、删除按钮、搜索框和搜索按钮、编辑按钮添加

布局使用le-row,表格使用le-table,整体使用ts+setup实现。实现代码如下图
​​在这里插入图片描述
在这里插入图片描述

📒 运行后页面效果:如下

在这里插入图片描述

✏️ 2. 使用添加按钮添加一条新纪录,逻辑点击按钮弹出带有表单的弹窗进行输入添加。实现代码如下图

![在这里插入图片描述](https://img-blog.csdnimg.cn/7474be55710c4485ba817d2af26ef83c.png

在这里插入图片描述

📒 运行后页面效果:如下

在这里插入图片描述

注释: 中途用到的表单知识

validate: 对表单进行校验,返回一个 Promise 对象,可以通过 .then() 方法获取校验结果。
resetFields: 重置表单,将表单的值恢复为初始状态。
clearValidate: 清除表单的校验结果。
setFieldsValue: 设置表单字段的值。
getFieldsValue: 获取表单字段的值。
getFieldValue: 获取指定字段的值。
getFieldsError: 获取表单字段的校验错误信息。
isFieldsTouched: 判断表单字段是否被触碰过。
isFieldsValidating: 判断表单字段是否正在进行校验。

✏️ 3. 使用删除按钮单条和批量删除表格信息

逻辑当没有选中信息时候删除按钮为禁用状态,有选中信息时候,删除按钮可点击,并且点击后弹出确认删除提示。实现代码如下图

1. 先禁用删除按钮,当有选中信息时候释放删除按钮。

在这里插入图片描述
在这里插入图片描述

📒 运行后页面效果:如下

在这里插入图片描述
在这里插入图片描述

2. 添加选中时候确认提示。

在这里插入图片描述

📒 运行后页面效果:如下

在这里插入图片描述

✏️ 4. 使用编辑按钮修改单条表格信息

逻辑: 点击编辑获取当条信息,同时打开弹窗并且把获取信息赋值给form对象,编辑信息后提交(提交和添加一样一般写在一块)

1. 点击编辑获取当条信息,同时打开弹窗并且把获取信息赋值给form对象

在这里插入图片描述
在这里插入图片描述

📒 运行后页面效果:如下

在这里插入图片描述

2. 编辑信息后提交(提交和添加一样一般写在一块)

在这里插入图片描述

最后附上完整代码


<!-- 增删改查 -->
<template>
    <!-- 搜索框 -->
    <el-row>
        <el-col :span="24">
            <el-date-picker v-model="inputDate.timeDate" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD"
                class="input-box m-2" placeholder="请选择" />
            <el-input v-model="inputDate.name" class="input-box m-2" placeholder="名字" :suffix-icon="Search" />
            <el-button type="primary" plain @click="searchClick" :icon="Search">搜索</el-button>
            <el-button type="primary" plain @click="addClick">添加</el-button>
            <el-button type="danger" plain @click="deleteClick" :icon="Delete" :disabled="disabled">删除</el-button>
        </el-col>
    </el-row>
    <!-- 引入表格 -->
    <el-table :data="tableData" @selection-change="handleSelectionChange" style="width: 100%">
        <el-table-column type="selection" width="55" />
        <el-table-column fixed prop="date" label="Date" width="150" />
        <el-table-column prop="name" label="姓名" width="120" />
        <el-table-column prop="state" label="状态" width="120" />
        <el-table-column prop="city" label="地址" width="120" />
        <el-table-column fixed="right" label="操作" width="120">
            <template #default="scope">
                <el-button link type="primary" size="small" @click="detailsClick(scope.row)">详情</el-button>
                <el-button link type="primary" size="small" @click="editorClick(scope.row)">编辑</el-button>
            </template>
        </el-table-column>
    </el-table>
    <!-- 添加弹窗 -->
    <el-dialog v-model="dialogFormVisible" :title="title">
        <el-form :model="ruleForm" ref="ruleFormRef" :rules="rules">
            <el-form-item label="姓名" label-width="140px" prop="name">
                <el-input v-model="ruleForm.name" placeholder="请输入" autocomplete="off" />
            </el-form-item>
            <el-form-item label="状态" label-width="140px" prop="state">
                <el-select v-model="ruleForm.state" placeholder="请选择">
                    <el-option label="待完成" value="1" />
                    <el-option label="已完成" value="2" />
                </el-select>
            </el-form-item>
            <el-form-item label="地址" label-width="140px" prop="city">
                <el-input v-model="ruleForm.city" placeholder="请输入" autocomplete="off" />
            </el-form-item>
            <el-form-item label="时间" label-width="140px" prop="date">
                <el-date-picker v-model="ruleForm.date" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD"
                    placeholder="请选择" />
            </el-form-item>
        </el-form>
        <template #footer>
            <span class="dialog-footer">
                <el-button @click="dialogFormVisible = false">取消</el-button>
                <el-button type="primary" @click="submitForm(ruleFormRef)">
                    提交
                </el-button>
            </span>
        </template>
    </el-dialog>
</template>
<script setup lang="ts">
import { Search, Delete } from '@element-plus/icons-vue'
import { ElMessage, ElMessageBox, FormInstance, } from 'element-plus';
import { reactive, ref } from 'vue';
const tableData = [
    {
        date: '2016-05-03',
        name: 'Tom',
        state: 'California',
        city: 'Los Angeles',
    },
    {
        date: '2016-05-02',
        name: 'Tom',
        state: 'California',
        city: 'Los Angeles',
    },
]

//---- 添加弹窗相关代码 ----
let title = ref("添加")
let dialogFormVisible = ref(false)
//获取表单实例对象
const ruleFormRef = ref<FormInstance>()
let ruleForm = reactive({
    name: '',
    state: '',
    city: '',
    date: ''
})
const rules = reactive({
    name: [
        { required: true, message: '请输入', trigger: 'blur' },
    ],
    state: [
        { required: true, message: '请输入', trigger: 'blur' },
    ],
    city: [
        { required: true, message: '请输入', trigger: 'blur' },
    ],
    date: [
        { required: true, message: '请输入', trigger: 'blur' },
    ],
})
const addClick = () => {
    console.log("添加按钮")
    title.value = "添加"
    dialogFormVisible.value = true
    ruleForm = reactive({
    name: '',
    state: '',
    city: '',
    date: '',
})
}
//提交表单信息
const submitForm = async (formEl: FormInstance | undefined) => {

    if (!formEl) return
    await formEl.validate((valid) => {
        if (valid) {
            if (title.value === "编辑") {
                console.log('提交编辑信息', ruleForm)

            } else if (title.value === "添加") {
                console.log('提交新添加信息', ruleForm)

            }
        }
    })
}
//---- 表单选中方法 ----
const handleSelectionChange = (val: []) => {
    console.log('选中按钮', val)
    if (val.length > 0) {
        disabled.value = false
        deleteDate = val
    }
}
//---- 删除按钮相关代码 ----
let disabled = ref(true)
let deleteDate = reactive([])
const deleteClick = () => {
    console.log("删除按钮,根据唯一标识符删除当前信息,一般列表更新使用的重新获取接口信息更新", deleteDate)
    ElMessageBox.confirm('是否要删除选中信息?',
        {
            confirmButtonText: '确定',
            cancelButtonText: '取消',
        }
    )
        .then(() => {
            ElMessage({
                message: '删除成功',
                type: 'success',
            })
        })
        .catch(() => {
            ElMessage({
                message: '已取消',
                type: 'warning',
            })
        })
}
//---- 查看详情相关代码 ----
const detailsClick = (row: any) => {
    console.log('详情按钮', row)
}
//---- 编辑单条信息相关代码 ----
const editorClick = (row: any) => {
    console.log('详情按钮', row)
    title.value = "编辑"
    dialogFormVisible.value = true
    ruleForm = row
}
//---- 搜索相关代码 ----
const inputDate = reactive({
    timeDate: "",
    name: "",
})
const searchClick = () => {
    console.log("搜索按钮", inputDate)
}
</script>
<style scoped lang="scss">
.input-box {
    width: 200px;
}
</style>

补充二: form提交表单内容之添加文件提交和树状结构选择人员组件

以上添加表单还有常用的就是数据文件一块提交,和树状结构使用(这里演示的树状结构为层级未知情况下,只选中人员,人员以外都为禁用状态)

✏️ 1. 添加文件类型数据

在这里插入图片描述
在这里插入图片描述

📒 运行结果如下(通过handleChange方法,可以获取到三个文件数据)

在这里插入图片描述

✏️ 2. 树结构组件使用,逻辑:先封装组件样式–>筛查数据默认禁用不需要的数据(因为是未知层级所以使用嵌套循环查询)

  • 注册组件adminTree

在这里插入图片描述
在这里插入图片描述

  • 2. 设置adminTree.vue组件样式,和初始化数据如下

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 3. 筛选数据禁用除了人员以外的其他信息,由于不确定层级所以使用重复调用遍历(至于为什么不能直接使用一般的下拉人员选择,非要使用树结构,有时候合成数据很复杂,我这只是简单例子,前后端确定的最优选择)

遇到变量提升问题,调整了部分声明顺序
在这里插入图片描述

  • 📒 运行结果如下

在这里插入图片描述
个人觉得禁用时候不明显,修改了下禁用时候显示颜色
在这里插入图片描述

  • 4. 获取选中数据,重置按钮更新数据

在这里插入图片描述

  • 📒 运行结果如下在这里插入图片描述
  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
好的,这个Demo需要分为前端页面和后端代码两部分来实现,下面我将介绍具体的实现步骤。 ## 后端代码实现 1. 创建SpringBoot项目,引入相关依赖: ```xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.0</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.5</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> </dependency> </dependencies> ``` 2. 创建数据库表,并使用Mybatis进行数据访问操作,这里使用Druid作为数据源: ```java @Mapper public interface DemoMapper { List<Demo> getDemoList(); Demo getDemoById(Integer id); int addDemo(Demo demo); int updateDemo(Demo demo); int deleteDemo(Integer id); } ``` 3. 在Controller层编写接口,提供增删改查的功能: ```java @RestController @RequestMapping("/demo") public class DemoController { @Autowired private DemoMapper demoMapper; @GetMapping("/list") public List<Demo> getDemoList() { return demoMapper.getDemoList(); } @GetMapping("/{id}") public Demo getDemoById(@PathVariable Integer id) { return demoMapper.getDemoById(id); } @PostMapping("/add") public int addDemo(@RequestBody Demo demo) { return demoMapper.addDemo(demo); } @PutMapping("/update") public int updateDemo(@RequestBody Demo demo) { return demoMapper.updateDemo(demo); } @DeleteMapping("/{id}") public int deleteDemo(@PathVariable Integer id) { return demoMapper.deleteDemo(id); } } ``` ## 前端页面实现 1. 创建Vue项目,并引入相关依赖: ```javascript import ElementPlus from 'element-plus'; import 'element-plus/lib/theme-chalk/index.css'; ``` 2. 在页面中使用Element-Plus组件,实现增删改查的功能: ```vue <template> <div class="demo"> <el-button type="primary" @click="showAddDialog">添加</el-button> <el-table :data="tableData"> <el-table-column prop="id" label="ID"></el-table-column> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> <el-table-column prop="sex" label="性别"></el-table-column> <el-table-column label="操作"> <template #default="{ row }"> <el-button type="text" @click="showUpdateDialog(row)">编辑</el-button> <el-button type="text" @click="deleteDemo(row.id)">删除</el-button> </template> </el-table-column> </el-table> <el-dialog title="添加" :visible.sync="addDialogVisible"> <el-form :model="addForm" :rules="rules"> <el-form-item label="姓名" prop="name"> <el-input v-model="addForm.name"></el-input> </el-form-item> <el-form-item label="年龄" prop="age"> <el-input v-model="addForm.age"></el-input> </el-form-item> <el-form-item label="性别" prop="sex"> <el-radio-group v-model="addForm.sex"> <el-radio label="男"></el-radio> <el-radio label="女"></el-radio> </el-radio-group> </el-form-item> </el-form> <div slot="footer"> <el-button @click="addDialogVisible = false">取消</el-button> <el-button type="primary" @click="addDemo">确定</el-button> </div> </el-dialog> <el-dialog title="编辑" :visible.sync="updateDialogVisible"> <el-form :model="updateForm" :rules="rules"> <el-form-item label="姓名" prop="name"> <el-input v-model="updateForm.name"></el-input> </el-form-item> <el-form-item label="年龄" prop="age"> <el-input v-model="updateForm.age"></el-input> </el-form-item> <el-form-item label="性别" prop="sex"> <el-radio-group v-model="updateForm.sex"> <el-radio label="男"></el-radio> <el-radio label="女"></el-radio> </el-radio-group> </el-form-item> </el-form> <div slot="footer"> <el-button @click="updateDialogVisible = false">取消</el-button> <el-button type="primary" @click="updateDemo">确定</el-button> </div> </el-dialog> </div> </template> <script> import { reactive, toRefs } from 'vue'; import axios from 'axios'; export default { name: 'Demo', setup() { const state = reactive({ tableData: [], addDialogVisible: false, updateDialogVisible: false, addForm: { name: '', age: '', sex: '男' }, updateForm: { id: '', name: '', age: '', sex: '' }, rules: { name: [ { required: true, message: '请输入姓名', trigger: 'blur' } ], age: [ { required: true, message: '请输入年龄', trigger: 'blur' } ], sex: [ { required: true, message: '请选择性别', trigger: 'change' } ] } }); const getDemoList = () => { axios.get('/demo/list').then(res => { state.tableData = res.data; }); }; const addDemo = () => { axios.post('/demo/add', state.addForm).then(() => { state.addDialogVisible = false; state.addForm = { name: '', age: '', sex: '男' }; getDemoList(); }); }; const updateDemo = () => { axios.put('/demo/update', state.updateForm).then(() => { state.updateDialogVisible = false; state.updateForm = { id: '', name: '', age: '', sex: '' }; getDemoList(); }); }; const deleteDemo = id => { axios.delete(`/demo/${id}`).then(() => { getDemoList(); }); }; const showAddDialog = () => { state.addDialogVisible = true; }; const showUpdateDialog = row => { state.updateDialogVisible = true; state.updateForm = Object.assign({}, row); }; getDemoList(); return { ...toRefs(state), getDemoList, addDemo, updateDemo, deleteDemo, showAddDialog, showUpdateDialog }; } }; </script> ``` 这样就完成了一个简单的增删改查Demo,前后端分离,前端使用VueElement-Plus实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大白菜1号

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

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

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

打赏作者

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

抵扣说明:

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

余额充值