首页 > 其他分享 >vue3实现单页crud

vue3实现单页crud

时间:2023-02-10 10:24:55浏览次数:48  
标签:load const 单页 res crud value vue3 ElMessage ref

1.介绍

主要实现单页curd,包含分页、新增、修改、删除、批量删除、条件搜索、表单校验。导入和导出暂未实现。、
本文章只是学习过程。仅供参考。

2.代码,按需复制修改即可

<template>
    <!-- 搜索栏 -->
    <div style="margin: 10px 0">
        <el-input v-model="name" style="width:300px;" placeholder="请输入名称" />
        <el-input v-model="address" placeholder="请输入地址" style="width:300px;margin-left:10px;" />
        <el-button type="primary" style="margin-left:5px;" @click="load">
            <el-icon style="vertical-align: middle">
                <Search />
            </el-icon> <span style="vertical-align: middle"> 搜索 </span>
        </el-button>
        <el-button type="warning" style="margin-left:5px;" @click="reset">
            <el-icon style="vertical-align: middle">
                <RefreshLeft />
            </el-icon> <span style="vertical-align: middle"> 重置 </span>
        </el-button>
    </div>
    <!-- 新增栏菜单 -->
    <div style="margin: 10px 0">
        <el-button type="success" @click="handleAdd">
            <el-icon style="vertical-align: middle">
                <Plus />
            </el-icon> <span style="vertical-align: middle"> 新增 </span>
        </el-button>
        <el-upload :show-file-list="false" style="display: inline-block; position: relative; top: 3px;margin-left:5px;"
            :action='`http://127.0.0.1/user/import`' :on-success="handleImportSuccess"
            :headers="{ Authorization: token }">
            <el-button type="primary">
                <el-icon style="vertical-align: middle">
                    <Bottom />
                </el-icon> <span style="vertical-align: middle"> 导入 </span>
            </el-button>
        </el-upload>
        <el-button type="primary" @click="exportData" style="margin-left:5px;">
            <el-icon style="vertical-align: middle">
                <Top />
            </el-icon> <span style="vertical-align: middle"> 导出 </span>
        </el-button>
        <el-popconfirm title="您确定删除吗?" @confirm="confirmDelBatch">
            <template #reference>
                <el-button type="danger" style="margin-left: 5px">
                    <el-icon style="vertical-align: middle">
                        <Remove />
                    </el-icon> <span style="vertical-align: middle"> 批量删除 </span>
                </el-button>
            </template>
        </el-popconfirm>
    </div>
    <!-- 表格栏 -->
    <div style="margin: 10px 0">
        <el-table :data="state.tableData" stripe border @selection-change="handleSelectionChange">
            <el-table-column type="selection" width="55" />
            <el-table-column prop="id" label="ID"></el-table-column>
            <el-table-column prop="text" label="标题"></el-table-column>
            <el-table-column prop="content" label="内容"></el-table-column>
            <!-- <el-table-column prop="imgurl" label="图片"></el-table-column> -->
            <el-table-column label="操作" width="180">
                <template #default="scope">
                    <el-button type="primary" @click="handleEdit(scope.row)">编辑</el-button>
                    <el-popconfirm title="您确定删除吗?" @confirm="del(scope.row.id)">
                        <template #reference>
                            <el-button type="danger">删除</el-button>
                        </template>
                    </el-popconfirm>
                </template>
            </el-table-column>
        </el-table>
    </div>
    <!-- 分页 -->
    <div style="margin: 10px 0">
        <el-pagination @current-change="load" @size-change="load" v-model:current-page="pageNum"
            v-model:page-size="pageSize" background :page-sizes="[2, 5, 10, 20]"
            layout="total, sizes, prev, pager, next, jumper" :total="total" />
    </div>
    <!-- 新增 -->
    <el-dialog v-model="dialogFormVisible" title="新增用户信息" width="40%">
        <el-form ref="ruleFormRef" :rules="rules" :model="state.form" label-width="80px" style="padding: 0 20px"
            status-icon>
            <!-- <el-form-item prop="id" label="ID">
                <el-input v-model="state.form.id" autocomplete="off" />
            </el-form-item> -->
            <el-form-item prop="text" label="标题">
                <el-input v-model="state.form.text" autocomplete="off" />
            </el-form-item>
        </el-form>
        <template #footer>
            <span class="dialog-footer">
                <el-button @click="dialogFormVisible = false">取消</el-button>
                <el-button type="primary" @click="save">
                    保存
                </el-button>
            </span>
        </template>
    </el-dialog>
    <!-- 新增end -->
    <!-- 修改 -->
    <el-dialog v-model="dialogFormVisibleUpdate" title="新增用户信息" width="40%">
        <el-form ref="ruleFormRef" :rules="rules" :model="state.form" label-width="80px" style="padding: 0 20px"
            status-icon>
            <el-form-item prop="id" label="ID">
                <el-input v-model="state.form.id" autocomplete="off" disable />
            </el-form-item>
            <el-form-item prop="text" label="标题">
                <el-input v-model="state.form.text" autocomplete="off" />
            </el-form-item>
            <el-form-item prop="text" label="内容">
                <el-input v-model="state.form.content" autocomplete="off" />
            </el-form-item>
        </el-form>
        <template #footer>
            <span class="dialog-footer">
                <el-button @click="dialogFormVisibleUpdate = false">取消</el-button>
                <el-button type="primary" @click="saveUpdate">
                    保存
                </el-button>
            </span>
        </template>
    </el-dialog>
    <!-- 修改end -->
</template>
<script setup>
import { nextTick, reactive, ref } from "vue";
// 引入通知
import { ElMessage } from "element-plus";
// import { findByPage } from "../../api/emo.js";
import request from "../../util/axios";
const name = ref('')
const address = ref('')
const pageNum = ref(1)
const pageSize = ref(10)
const total = ref(0)

// 定义表格数据,请求后台方法
const state = reactive({
    tableData: [],
    form: {}
})
const load = () => {
    request.post('/emo/page', {
        name: name.value,
        address: address.value,
        currentPage: pageNum.value,
        pageSize: pageSize.value
    }).then(res => {
        console.log(res)
        state.tableData = res.page.list
        total.value = res.page.totalCount
    })
}
// 调用 load方法拿到后台数据
load()


// 重置搜索框方法
const reset = () => {
    name.value = ''
    address.value = ''
    load()
}
// -------------------------------------------------------------------------------------------------------------------------------------------
// 控制新增弹框显示隐藏
const dialogFormVisible = ref(false)

// 新增方法
const handleAdd = () => {
    dialogFormVisible.value = true
    ruleFormRef.value.resetFields()
    state.form = {}
}
// 添加效验规则
const rules = reactive({
    id: [
        { required: true, message: '请输入id', trigger: 'blur' },
        { min: 3, max: 20, message: '长度在3-20之间', trigger: 'blur' },
    ],
    text: [
        { required: true, message: '请输入text', trigger: 'blur' },
    ],
})
const ruleFormRef = ref()
// 新增保存方法
const save = () => {
    ruleFormRef.value.validate(valid => {   // valid就是校验的结果
        if (valid) {
            request.post('/emo/add', state.form).then(res => {
                console.log(res)
                if (res.code === 200) {
                    ElMessage.success('保存成功')
                    dialogFormVisible.value = false
                    load()  // 刷新表格数据
                } else {
                    ElMessage.error(res.msg)
                }
            })
        }
    })
}
// -------------------------------------------------------------------------------------------------------------------------------------------
// 修改
const dialogFormVisibleUpdate = ref(false)
// 编辑触发方法
const handleEdit = (raw) => {
    dialogFormVisibleUpdate.value = true
    nextTick(() => {
        ruleFormRef.value.resetFields()
        state.form = JSON.parse(JSON.stringify(raw))
    })
}
// 修改保存方法
const saveUpdate = () => {
    // ruleFormRef.value.validate(valid => {   // valid就是校验的结果
    //     if (valid) {
    //     }
    // })
    request.post('/emo/updateById', state.form).then(res => {
        console.log(res)
        if (res.code === 200) {
            ElMessage.success('保存成功')
            dialogFormVisibleUpdate.value = false
            load()  // 刷新表格数据
        } else {
            ElMessage.error(res.msg)
        }
    })
}
// -------------------------------------------------------------------------------------------------------------------------------------------
// 删除
const del = (id) => {
    request.delete('/emo/del/' + id).then(res => {
        if (res.code === 200) {
            ElMessage.success('操作成功')
            load()  // 刷新表格数据
        } else {
            ElMessage.error(res.msg)
        }
    })
}
// -------------------------------------------------------------------------------------------------------------------------------------------
// 批量删除
const multipleSelection = ref([])

const handleSelectionChange = (val) => {
    multipleSelection.value = val
}
// 批量删除方法
const confirmDelBatch = () => {
    if (!multipleSelection.value || !multipleSelection.value.length) {
        ElMessage.warning("请选择数据")
        return
    }
    const idArr = multipleSelection.value.map(v => v.id)
    request.post('/user/del/batch', idArr).then(res => {
        if (res.code === '200') {
            ElMessage.success('操作成功')
            load()  // 刷新表格数据
        } else {
            ElMessage.error(res.msg)
        }
    })
}
// -------------------------------------------------------------------------------------------------------------------------------------------
// 导出接口
const exportData = () => {
    //   window.open(`http://${config.serverUrl}/user/export`)
    window.open(`http://127.0.0.1/user/export`)
}
</script>

<style>
th {
    background-color: aliceblue !important;
}
</style>

参考文档

标签:load,const,单页,res,crud,value,vue3,ElMessage,ref
From: https://www.cnblogs.com/sstu/p/17107975.html

相关文章

  • 50.vue3.0解决vue项目中的“Invalid Host header”
    当在网页中输入地址后发现无法打开VUE项目地址:报错InvalidHostheader解决方法:在webpack5中disableHostCheck应该被遗弃了查看文档了解到需将disableHostCheck:true......
  • 开心档-Vue3 计算属性入门篇
    Vue3计算属性计算属性关键词:computed。计算属性在处理一些复杂逻辑时是很有用的。可以看下以下反转字符串的例子:实例1<divid="app">{{message.split('').reverse().......
  • vue2和vue3的区别有哪些?
    一、Vue3与Vue2区别详述1.生命周期对于生命周期来说,整体上变化不大,只是大部分生命周期钩子名称上+“on”,功能上是类似的。不过有一点需要注意,Vue3在组合式API(Com......
  • 使用Spring的JdbcTemplate进行CRUD
    packagecom.mo;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.util.List;importjavax.annotation.Resource;importorg.junit.Test;importorg.ju......
  • vue3+element表格数据导出
    实现效果导出后的效果:步骤第一步:安装依赖npminstall--savexlsxfile-saver第二步:给表格添加id,导出的时候需要用到<!--导出按钮--><el-buttontype="pri......
  • vue3语法糖+ts组件传值
    在开发中有些功能是通用的,而且逻辑大致相同,像这种东西可以封成一个组件,比较常用的就是函数封装,组件封装,组件封装是需要引入到页面使用的,所以通常它会有一些自己的方法,父子......
  • element plus + vue3表单第一次数据未清空的bug问题解决
    使用框架:elementPlus+vue3场景描述:场景一:表单的添加和修改功能,公用同一个弹框,点击修改后,点击添加表单显示的是上次修改的数据。场景二:点击修改,数据回显到表单,然后......
  • vue3 和vue2的区别
    1.数据的响应式不同答:vue2是通过object.defineProperty()方法,get是获取属性,set是修改属性。但是新加的属性和删除的属性则没有响应式,还有就是通过数组的下标来修改值,......
  • 【vue3】父子组件通信之 vue3 defineProps,defineEmits ,defineExpose
    1、简介父组件通过v-bind绑定一个数据,然后子组件通过defineProps接受传过来的值,2、代码示例1)给Menu组件传递了一个title字符串类型是不需要v-bind<template><d......
  • 【pinia-plugin-persistedstate】Vue3 pinia 数据持久化插件 pinia-plugin-persisteds
    为什么需要持久化?刷新浏览器后,重新加载页面时会重新初始化vue、pinia,而pinia中状态的值仅在内存中存在,而刷新导致浏览器存储中的数据就没了。在实际开发中,浏览器刷新......