学习目标
使用vue+axios+elementUI完成用户登陆、学生列表展示、新增、编辑和删除功能
用到的资料
管理系统代码(完整版项目)下载
管理系统代码(初始化项目)下载
axios异步请求
Get请求传参格式
格式一
1 2 3 4 5 6
   | axios.get('/user?id=12345&name=user') .then(function (res) {     console.log(res);  }).catch(function (err) {     console.log(err); });
  | 
 
格式二 【推荐】
1 2 3 4 5 6 7 8 9 10
   | axios.get('/user', {     params: {    id: 12345,     name: user   } }).then(function (res) {     console.log(res); }).catch(function (err) {    console.log(err); });
  | 
 
Post请求传参格式
直接传值后端获取不到数据,需要设置请求头
格式一
将数据转换拼接到URL中传给服务器,不安全
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
   | 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工具类
1 2 3 4 5 6 7 8 9 10
   | axios.post("接口地址",Qs.stringify({     currentPage:1,     pageSize:3 })).then(resp=>{     console.log(resp) }).catch(error=>{     console.log(error) }).finally(()=>{
  });
  | 
 
用户登陆
接口信息
功能:用户登陆,该接口接收username,password两个参数,如果登陆成功返回true,否则返回false
测试地址:http://localhost:8080/虚拟路径/LoginServlet?username=admin&password=123
步骤
1.给登陆按钮绑定单击事件
2.单击时校验表单,校验成功,将表单数据异步发送给后端。校验失败,给出错误提示
相关资料
表单帮助文档,进去找’表单验证’
 https://element.faas.ele.me/#/zh-CN/component/form 
错误提示框
 https://element.faas.ele.me/#/zh-CN/component/message 
代码
修改login.html页面

分页查询
接口信息
功能:分页查询学生列表,该接口接收startPage,pageSize两个参数,返回当前页需要的数据
测试地址:http://localhost:8080/虚拟路径/FindStudentByPageServlet?startPage=2&pageSize=4
效果
步骤
1.引入表格和分页组件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
   | <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>
      
 
 
 
 
 
 
 
 
 
      <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>
   | 
 
第二步 初始化表格和分页条数据
1 2 3 4 5 6 7 8 9 10 11 12 13
   | <script>     new Vue({         el: "#div",         data: {             tableData: [],             pagination: {                 currentPage: 1,                  pageSize: 5,                     total: 0                     }         }     }); </script>
   | 
 
第三步:编写方法分页查询数据以及分页组件需要的handleSizeChange和handleCurrentChange方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
   | 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();             }, }
  | 
 
第四步 组件加载完毕后初始化分页条
1 2 3
   | created: function () {     this.findByPage(); }
  | 
 
完整js代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
   | <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>
   | 
 
添加功能
接口信息
功能:更新学生
该接口接收number,name,birthday,address四个参数,更新成功返回’更新成功’,否则返回’更新失败’
测试地址:http://localhost:8080/虚拟路径/UpdateStudentServlet?number=heima00X&name=jack&birthday=2020-09-09&address=淖马村
效果

思路
1.创建一个模态框,模态框中存放一个表单。默认隐藏不显示
2.给添加按钮绑定单击事件,点击添加按钮显示模态框
2.点击添加按钮发送数据给后端,添加成功关闭模态框,并且刷新当前页
相关资料
模态框
 https://element.eleme.cn/#/zh-CN/component/dialog 
表单
 https://element.eleme.cn/#/zh-CN/component/form 
代码
第一步:创建模态框和表单
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
   |   <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对象中的属性和方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
   | 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(){
      } }
  | 
 
第二步:给页面最上的添加按钮绑定单击事件,单击时显示模态框
1
   | <el-button type="primary" @click="dialogAddFormVisible=true">添加学生</el-button>
   | 
 
第三步:编写添加的逻辑
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
   | 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('添加失败');         }     }); }
  | 
 
编辑功能
接口信息
功能:更新学生
该接口接收number,name,birthday,address四个参数,更新成功返回’更新成功’,否则返回’更新失败’
测试地址:http://localhost:8080/虚拟路径/UpdateStudentServlet?number=heima00X&name=jack&birthday=2020-09-09&address=淖马村
效果

思路
1.创建一个模态框,模态框中存放一个表单。默认隐藏不显示
2.给每一行的编辑按钮绑定单击事件,点击添加按钮显示模态框,并且将行中的数据显示到表单中
3.点击修改,将最新数据提交给后端,刷新当前页面数据
代码
第一步:创建编辑模态框和表单
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
   |  <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对象中的属性和方法
1 2 3 4
   | data:{     dialogEditFormVisible:false,     editFormData:{}, }
  | 
 
第二步:给每一行的编辑按钮添加单击事件,单击时弹出模态框并且获取行中的数据,显示到表单中
1 2 3 4 5 6
   | <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方法
1 2 3 4
   | showEditDialog:function(rowData){     this.dialogEditFormVisible = true;     this.editFormData = rowData; },
  | 
 
第三步:给更新按钮绑定单击事件并且编写更新方法
1
   | <el-button type="primary" @click="updateStudent">修改</el-button>
   | 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
   | 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('更新失败');         }     }); }
  | 
 
删除功能
接口信息
功能:删除学生
该接口接收number 1个参数,删除成功返回true,否则返回false
测试地址:http://localhost:8080/虚拟路径/DeleteStudentServlet?number=heima00X
相关资料
确认弹出框
 https://element.eleme.cn/#/zh-CN/component/message-box 
思路
1.给每一行的删除按钮绑定单击事件,单击时顺便获取当前行中的number值
2.编写方法将获取到的number值发送给后端,删除成功刷新当前页面
代码
第一步 给删除按钮绑定事件
1
   | <el-button type="danger" @click="deleteStudent(props.row.number)">删除</el-button>
   | 
 
第二步 删除并刷新页面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
   | 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: '已取消删除'         });     }); }
  |