Vue综合案例与axios

简介: Vue综合案例与axios

1 学习目标

使用vue+axios+elementUI完成用户登陆、学生列表展示、新增、编辑和删除功能

2 axios异步请求

2.1 Get请求传参格式

格式一

axios.get('/user?id=12345&name=user')
.then(function (res) {
    console.log(res);
 }).catch(function (err) {
    console.log(err);
});

格式二 【推荐】

axios.get('/user', {  //params参数必写 , 如果没有参数传{}也可以
  params: { 
  id: 12345,
    name: user
  }
}).then(function (res) {
    console.log(res);
}).catch(function (err) {
   console.log(err);
});

2.2 Post请求传参格式

直接传值后端获取不到数据,需要设置请求头

格式一

将数据转换拼接到URL中传给服务器,不安全

axios({
    headers: {
        'Content-Type': 'application/json;'
    },
    method: 'post',
    transformRequest: [function (data) {
        return JSON.stringify(data)
    }],
    url: '接口地址',
    params: {//表单数据
    }
}).then(resp=>{
}).catch(function (error) {
    console.log(error);
}).finally(()=>{
})

格式二 【推荐】

URL中不会显示数据,更安全,需要导入Qs工具类

下载Qs工具类

axios.post("接口地址",Qs.stringify({
    currentPage:1,
    pageSize:3
})).then(resp=>{
    console.log(resp)
}).catch(error=>{
    console.log(error)
}).finally(()=>{
});

3 用户登陆

3.1 接口信息

功能:用户登陆,该接口接收username,password两个参数,如果登陆成功返回true,否则返回false

测试地址:http://localhost:8080/虚拟路径/LoginServlet?username=admin&password=123

3.2 步骤

1.给登陆按钮绑定单击事件

2.单击时校验表单,校验成功,将表单数据异步发送给后端。校验失败,给出错误提示

3.3 相关资料

表单帮助文档,进去找’表单验证’

https://element.faas.ele.me/#/zh-CN/component/form

错误提示框

https://element.faas.ele.me/#/zh-CN/component/message

3.4 代码

修改login.html页面

4 分页查询

4.1 接口信息

功能:分页查询学生列表,该接口接收startPage,pageSize两个参数,返回当前页需要的数据

测试地址:http://localhost:8080/虚拟路径/FindStudentByPageServlet?startPage=2&pageSize=4

4.2 效果

4.3 步骤

1.引入表格和分页组件

<el-table :data="tableData">
        <el-table-column prop="number" label="学号" width="120">
        </el-table-column>
        <el-table-column prop="name" label="姓名" width="120">
        </el-table-column>
        <el-table-column prop="birthday" label="生日" width="140">
        </el-table-column>
        <el-table-column prop="address" label="地址">
        </el-table-column>
        <el-table-column label="操作" width="180">
            <template slot-scope="props">
                <el-button type="warning">编辑</el-button>
                <el-button type="danger">删除</el-button>
            </template>
        </el-table-column>
    </el-table>
    <!--
    分页组件
    @size-change: 当改变每页条数时触发的函数
    @current-change:当改变页码时触发的函数
    current-page :默认的页码
    :page-sizes:每页条数选择框中显示的值
    :page-size : 默认的每页条数
    layout: 分页组件的布局
    total(总条数), sizes(每页条数), prev(上一页), pager(所有的页码), next(下一页), jumper(跳转页码)
    :total: 总条数
    -->
    <el-pagination
            @size-change="handleSizeChange"
            @current-change="handleCurrentChange"
            :current-page="pagination.currentPage"
            :page-sizes="[3,5,8]"
            :page-size="pagination.pageSize"
            layout="total, sizes, prev, pager, next, jumper"
            :total="pagination.total">
    </el-pagination>

第二步 初始化表格和分页条数据

<script>
    new Vue({
        el: "#div",
        data: {
            tableData: [],//表格数据
            pagination: {
                currentPage: 1, //当前页
                pageSize: 5,    //每页显示条数
                total: 0        //总条数
            }
        }
    });
</script>

第三步:编写方法分页查询数据以及分页组件需要的handleSizeChange和handleCurrentChange方法

methods: {
    /*分页查询*/
    findByPage: function () {
        axios.get("FindStudentByPageServlet", {
            params: {
                pageSize: this.pagination.pageSize,
                currentPage: this.pagination.currentPage
            }
        }).then(resp => {
            this.tableData = resp.data.list;//设置表格数据
            this.pagination.total = resp.data.total;//设置总条数
        });
    },
        //改变每页条数时执行的函数
        handleSizeChange(pageSize) {
            //修改分页查询的参数
            this.pagination.pageSize = pageSize;
            //重新执行查询
            this.findByPage();
        },
            //改变页码时执行的函数
            handleCurrentChange(pageNum) {
                //修改分页查询的参数
                this.pagination.currentPage = pageNum;
                //重新执行查询
                this.findByPage();
            },
}

第四步 组件加载完毕后初始化分页条

created: function () {
    this.findByPage();
}

4.4 完整js代码

<script>
    new Vue({
        el: "#div",
        data: {
            tableData: [],//表格数据
            pagination: {
                currentPage: 1, //当前页
                pageSize: 5,    //每页显示条数
                total: 0        //总条数
            }
        },
        methods: {
            /*分页查询*/
            findByPage: function () {
                axios.get("FindStudentByPageServlet", {
                    params: {
                        pageSize: this.pagination.pageSize,
                        currentPage: this.pagination.currentPage
                    }
                }).then(resp => {
                    this.tableData = resp.data.list;//设置表格数据
                    this.pagination.currentPage = resp.data.pageNum;//设置当前页
                    this.pagination.total = resp.data.total;//设置总条数
                });
            },
            //改变每页条数时执行的函数
            handleSizeChange(pageSize) {
                //修改分页查询的参数
                this.pagination.pageSize = pageSize;
                //重新执行查询
                this.findByPage();
            },
            //改变页码时执行的函数
            handleCurrentChange(pageNum) {
                //修改分页查询的参数
                this.pagination.currentPage = pageNum;
                //重新执行查询
                this.findByPage();
            },
        },
        created: function () {
            this.findByPage();
        }
    });
</script>

5 添加功能

5.1 接口信息

功能:更新学生

该接口接收number,name,birthday,address四个参数,更新成功返回’更新成功’,否则返回’更新失败’

测试地址:http://localhost:8080/虚拟路径/UpdateStudentServlet?number=oldlu00X&name=jack&birthday=2020-09-09&address=淖马村

5.2 效果

5.3 思路

1.创建一个模态框,模态框中存放一个表单。默认隐藏不显示

2.给添加按钮绑定单击事件,点击添加按钮显示模态框

2.点击添加按钮发送数据给后端,添加成功关闭模态框,并且刷新当前页

5.4 相关资料

模态框

https://element.eleme.cn/#/zh-CN/component/dialog

表单

https://element.eleme.cn/#/zh-CN/component/form

5.5 代码

第一步:创建模态框和表单

 <!--dialogAddFormVisible表示对话框的状态,显示还是隐藏-->
<el-dialog title="新增学生" :visible.sync="dialogAddFormVisible" @closed="$refs['addForm'].resetFields()">
    <el-form :model="formData" :rules="rules" ref="addForm" label-width="100px" class="demo-ruleForm">
        <el-form-item label="学生学号" prop="number">
            <el-input v-model="formData.number"></el-input>
        </el-form-item>
        <el-form-item label="学生姓名" prop="name">
            <el-input v-model="formData.name"></el-input>
        </el-form-item>
        <el-form-item label="学生生日" prop="birthday">
            <el-input v-model="formData.birthday" type="date"></el-input>
        </el-form-item>
        <el-form-item label="学生地址" prop="address">
            <el-input v-model="formData.address"></el-input>
        </el-form-item>
        <el-form-item align="right">
            <el-button type="primary" @click="addStudent">添加</el-button>
            <el-button @click="$refs['addForm'].resetFields()">重置</el-button>
        </el-form-item>
    </el-form>
</el-dialog>

Vue对象中的属性和方法:

data: {
    dialogAddFormVisible: false,//新增学生对话框状态,默认隐藏
    formData:{},//新增学生的表单数据
    rules: {//表单校验规则
        number: [
            {required: true, message: '请输入学号', trigger: 'blur'},
            {min: 2, max: 10, message: '长度在 2 到 10 个字符', trigger: 'blur'}
        ],
        name: [
            {required: true, message: '请输入姓名', trigger: 'blur'},
            {min: 2, max: 10, message: '长度在 2 到 10 个字符', trigger: 'blur'}
        ],
        birthday: [
            {required: true, message: '请选择日期', trigger: 'change'}
        ],
        address: [
            {required: true, message: '请输入地址', trigger: 'blur'},
            {min: 2, max: 200, message: '长度在 2 到 200 个字符', trigger: 'blur'}
        ],
    }
},
methods: {
    addStudent:function(){
    }
}

第二步:给页面最上的添加按钮绑定单击事件,单击时显示模态框

<el-button type="primary" @click="dialogAddFormVisible=true">添加学生</el-button>

第三步:编写添加的逻辑

addStudent:function(){
    axios.get("AddStudentServlet",{
        params:this.formData
    }).then(resp=>{
        if(resp.data){//添加成功
            this.$message({
                message: '添加成功',
                type: 'success'
            });
            //刷新表格数据
            this.findByPage();
            //隐藏弹出框
            this.dialogAddFormVisible = false;
        }else{
            this.$message.error('添加失败');
        }
    });
}

6 编辑功能

6.1 接口信息

功能:更新学生

该接口接收number,name,birthday,address四个参数,更新成功返回’更新成功’,否则返回’更新失败’

测试地址:http://localhost:8080/虚拟路径/UpdateStudentServlet?number=oldlu00X&name=jack&birthday=2020-09-09&address=淖马村

6.2 效果

6.3 思路

1.创建一个模态框,模态框中存放一个表单。默认隐藏不显示

2.给每一行的编辑按钮绑定单击事件,点击添加按钮显示模态框,并且将行中的数据显示到表单中

3.点击修改,将最新数据提交给后端,刷新当前页面数据

6.4 代码

第一步:创建编辑模态框和表单

<!--dialogAddFormVisible表示对话框的状态,显示还是隐藏-->
<el-dialog title="编辑学生" :visible.sync="dialogEditFormVisible" @closed="$refs['editForm'].resetFields()">
    <el-form :model="editFormData" :rules="rules" ref="editForm" label-width="100px" class="demo-ruleForm">
        <el-form-item label="学生学号" prop="number">
            <el-input v-model="editFormData.number"></el-input>
        </el-form-item>
        <el-form-item label="学生姓名" prop="name">
            <el-input v-model="editFormData.name"></el-input>
        </el-form-item>
        <el-form-item label="学生生日" prop="birthday">
            <el-input v-model="editFormData.birthday" type="date"></el-input>
        </el-form-item>
        <el-form-item label="学生地址" prop="address">
            <el-input v-model="editFormData.address"></el-input>
        </el-form-item>
        <el-form-item align="right">
            <el-button type="primary">修改</el-button>
        </el-form-item>
    </el-form>
</el-dialog>

Vue对象中的属性和方法

data:{
    dialogEditFormVisible:false,
    editFormData:{},
}

第二步:给每一行的编辑按钮添加单击事件,单击时弹出模态框并且获取行中的数据,显示到表单中

<el-table-column label="操作" width="180">
    <template slot-scope="props" >  
        <el-button type="warning" @click="showEditDialog(props.row)">编辑</el-button>
        <el-button type="danger">删除</el-button>
    </template>
</el-table-column>

Vue对象中的showEditDialog方法

showEditDialog:function(rowData){//rowData就是行中的数据,表示当前学生对象
    this.dialogEditFormVisible = true;
    this.editFormData = rowData;
},

第三步:给更新按钮绑定单击事件并且编写更新方法

<el-button type="primary" @click="updateStudent">修改</el-button>
updateStudent:function(){//更新功能
    axios.get("UpdateStudentServlet",{
        params:this.editFormData
    }).then(resp=>{
        if(resp.data){//添加成功
            this.$message({
                message: '更新成功',
                type: 'success'
            });
            //刷新表格数据
            this.findByPage();
            this.dialogAddFormVisible = false;
        }else{
            this.$message.error('更新失败');
        }
    });
}

7 删除功能

7.1 接口信息

功能:删除学生

该接口接收number 1个参数,删除成功返回true,否则返回false

测试地址:http://localhost:8080/虚拟路径/DeleteStudentServlet?number=oldlu00X

7.2 相关资料

确认弹出框

https://element.eleme.cn/#/zh-CN/component/message-box

7.3 思路

1.给每一行的删除按钮绑定单击事件,单击时顺便获取当前行中的number值

2.编写方法将获取到的number值发送给后端,删除成功刷新当前页面

7.4 代码

第一步 给删除按钮绑定事件

<el-button type="danger" @click="deleteStudent(props.row.number)">删除</el-button>

第二步 删除并刷新页面

deleteStudent:function(n){
    console.log(n)
    this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
    }).then(() => {
        axios.get("DeleteStudentServlet", {
            params: {
                number:n
            }
        }).then(resp => {
            this.$message({
                message: '删除成功',
                type: 'success'
            });
            //刷新表格数据
            this.findByPage();
        });
    }).catch(() => {
        this.$message({
            type: 'info',
            message: '已取消删除'
        });
    });
}

8 关闭浏览器窗口之前弹出提示

需求:叉掉浏览器窗口,弹出提示,确认后才会关闭窗口

mounted() {
    window.addEventListener('beforeunload', e => this.beforeunloadHandler(e))
},
 methods: {
    beforeunloadHandler(e) {
      this._beforeUnload_time = new Date().getTime()
      e = e || window.event
      if (e) {
        e.returnValue = '关闭提示'
      }
      return '关闭提示'
    },
}

效果:

注意:为避免意外弹出窗口,除非页面已与之交互,否则浏览器可能不会显示在beforeunload事件中创建的提示,甚至根本不会显示它们。

目录
相关文章
|
2月前
|
资源调度 JavaScript
|
2月前
|
缓存 JavaScript 搜索推荐
|
1月前
|
分布式计算 JavaScript 前端开发
vue学习第8章(vue的购物车案例)
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。自学前端2年半,正向全栈进发。本篇分享一个综合练习小demo,包括目录结构、HTML、JS及CSS代码,通过增删商品实现总价计算。关注我,获取更多前端知识!🎉🎉🎉
31 1
|
2月前
|
存储 缓存 JavaScript
vue表单案例练习:vue表单创建一行数据及删除数据的实现与理解
vue表单案例练习:vue表单创建一行数据及删除数据的实现与理解
49 2
|
2月前
|
前端开发 JavaScript 安全
在vue前端开发中基于refreshToken和axios拦截器实现token的无感刷新
在vue前端开发中基于refreshToken和axios拦截器实现token的无感刷新
160 4
|
2月前
|
JavaScript
《进阶篇第9章》学习vuex知识点后练习:求和案例_纯vue版代码
《进阶篇第9章》学习vuex知识点后练习:求和案例_纯vue版代码
19 1
|
3月前
|
JavaScript
vue 中 axios 的安装及使用
本文介绍了在Vue项目中安装和使用axios的方法。首先通过命令`npm install axios --save-dev`安装axios,然后在组件的`created`生命周期钩子中使用`axios.get`异步获取数据,并将获取的数据更新到组件的`data`中。文中提供了完整的示例代码,包括安装命令、验证安装成功的步骤、Vue组件的模板、脚本和样式。
vue 中 axios 的安装及使用
|
2月前
|
JavaScript
【有手就行系列】Vue快速入门案例
【有手就行系列】Vue快速入门案例
32 0
|
2月前
|
JavaScript API 开发工具
vue尚品汇商城项目-day02【11.对axios二次封装+12.接口统一管理】
vue尚品汇商城项目-day02【11.对axios二次封装+12.接口统一管理】
36 0