SSM(Vue3+ElementPlus+Axios+SSM前后端分离)--功能实现【四】

简介: SSM(Vue3+ElementPlus+Axios+SSM前后端分离)--功能实现【四】

SSM–功能实现


实现功能06-修改家居信息


需求分析/图解

0e419ceaae5dd26a59edd712f1ef3de6.png


思路分析


  1. 完成后台代码从dao -> serivce -> controller , 并对每层代码进行测试
  2. 完成前台代码, 回显家居信息,再使用axios 发送http / ajax 请求,更新数据, 将数据绑定显示


代码实现


  1. 修改FurnService.java 和FurnServiceImpl.java, 增加update 方法


修改FurnService.java

public void update(Furn furn);


修改FurnServiceImpl.java,

@Override
public void update(Furn furn) {
//因为传入的furn 的字段不一定是完整的,所以使用updateByPrimaryKeySelective
  furnMapper.updateByPrimaryKeySelective(furn);
}


  1. 修改FurnServiceTest.java ,测试update
 @Test
    public void update() {
        Furn furn = new Furn();
        furn.setId(1);
        furn.setName("北欧风格小桌子~~");
        furn.setMaker("小猪家居");
        //因为imgPath属性有一个默认值,
        //所以如果我们不希望生成update 语句有对imgPath 字段修改,就显式的设置null
        furn.setImgPath(null);
        furnService.update(furn);
        System.out.println("修改OK");
    }


  1. 修改FurnController.java , 处理修改请求, 并使用Postman 完成测试
   @PutMapping("/update")
    @ResponseBody
    public Msg update(@RequestBody Furn furn) {
        furnService.update(furn);
        return Msg.success();
    }


  1. 修改HomeView.vue , 编写handleEdit 方法, 回显数据并测试
handleEdit(row) {
    //说明
    //1. JSON.stringify(row) 将row 转成json 字符串
    //2. JSON.parse(xx) 将字符串转成json 对象
    //3. 为什么这样做? 其实JSON.parse(JSON.stringify(row)) 就是对row 进行了深拷贝
    //4. 这样表格中的行数据和弹出框的数据就是独立的了
        this.form = JSON.parse(JSON.stringify(row))
        this.dialogVisible = true
    }
    //触发handleEdit 方法
    <el-button size="mini" @click="handleEdit(scope.row)" type="primary">编辑</el-button>


可以测试一下, 点击编辑, 回显数据


6514440481d428a152c15cc040de6405.png3fb24348b951aadfa59313a72423a730.png

  1. 修改HomeView.vue , 修改save 方法, 处理修改请求, 说明更新成功的消息框, 不需要做额外处理, 直接使用this.$message 即可.
save() {
    //增加处理修改逻辑
    if (this.form.id) {
        request.put("/api/update", this.form).then(res => {
            if (res.code === 200) {//如果code 为200
                this.$message({ //弹出更新成功的消息框
                    type: "success",
                    message: "更新成功"
                })
            } else {
                this.$message({//弹出更新失败信息
                    type: "error",
                    message: res.msg
                })
            }
            this.list() //刷新列表
            this.dialogVisible = false
        })
    } else {//添加
        //=======说明======
        //1. 将form 表单提交给/api/save 的接口
        //2. /api/save 等价http://localhost:10001/save
        //3. 如果成功,就进入then 方法
        //4. res 就是返回的信息
        //5. 查看Mysql 看看数据是否保存
        request.post("/api/save", this.form).then(res => {
            this.dialogVisible = false
            this.list()
        })
    }
}


  1. 完成测试, 浏览器http://localhost:10000/


注意事项和细节


1.使用<template #default=“scope”>可以在外部获取组件内的数据,值为scope,那么由scope.row就可以得到数据了,根据得到的数据执行业务处理。。


2.调用list() 刷新数据需要注意的地方说明


list在添加数据时,显示页面不会马上更新需要手动刷新,数据库的数据在完成操作时会联动更新。因为异步处理,put发出请求本质是一个回调,当request发出put请求后,箭头函数对应的是一个回调机制。意思是说如果是异步的话,把对应的数据发过去不会等到回调函数结束就直接往下走,直接执行下面的lis刷新。而你操作的那一条数据有可能还没有修改到数据库。这就解释了为什么没有报错对话框就消失了,list因为他刷新时没有看到最新数据,取得还是上一次的数据。因为他是异步的,所以不会等回调,他是两条线执行,他直接往下走,等另一个接收请求处理完回到回调函数时,list方法早就执行完毕了。所以有可能没有拿到最新数据。他在本地执行,速度比回调快多了,所以往往拿不到。我们只要把代码拿上去,放在回调里面就可以了。

image.png



实现功能07-删除家居信息


需求分析/图解


249a81a0ea7af6357a662552f0e89c48.png


思路分析


  1. 完成后台代码从dao -> serivce -> controller , 并对每层代码进行测试
  2. 完成前台代码,使用axios 发送http Ajax 请求,删除数据, 将数据绑定显示


代码实现


  1. 修改FurnService.java 和FurnServiceImpl.java, 增加del 方法


修改FurnService.java

public void del(Integer id);


修改FurnServiceImpl.java

@Override
public void del(Integer id) {
  furnMapper.deleteByPrimaryKey(id);
}


2.修改FurnServiceTest.java ,测试del.

 @Test
public void del() {
   furnService.del(1);
   System.out.println("del ok");
}


  1. 修改FurnController.java , 处理删除请求, 并使用Postman 完成测试
@DeleteMapping("/del/{id}")
@ResponseBody
public Msg del(@PathVariable Integer id) {
    System.out.println("del id= " + id);
    furnService.del(id);
    return Msg.success();
}


  1. 修改HomeView.vue , 编写handleDel 方法, 完成删除
  handleDel(id) {
      // console.log("id-", id)
      request.delete("/api/del/" + id).then(res => {
        if (res.code === 200) {//删除成功
          //提示一个成功的消息框
          this.$message(
              {
                type: "success",
                message: res.msg
              }
          )
        } else { //删除失败
          //提示一个错误的消息框
          this.$message(
              {
                type: "error",
                message: res.msg
              }
          )
        }
        //刷新页面数据
        this.list()
      })
    }
    <!--  响应删除点击
        说明:
              1、这里通过 handleEdit(scope.row)
              2, 可以将当前行数据传递给handleEdit
        -->
        <template #default="scope">
          <el-button type="text" @click="handleEdit(scope.row)">编辑</el-button>
          <!--  说明
              1. 如果你点击的确定,就会触发handleDel
              2. 如果你点击的是取消,就不会触发handleDel
          -->
          <el-popconfirm title="确认删除吗?" @confirm="handleDel(scope.row.id)">
            <template #reference>
              <el-button size="small" type="danger">删除</el-button>
            </template>
          </el-popconfirm>
        </template>


  1. 完成测试测试


实现功能08-分页显示列表


需求分析/图解


3a9b6714a29752b74332d1858e54e1da.png


思路分析


后台使用MyBatis PageHelper 插件完成分页查询, 前端我们使用分页组件。

修改FurnController , 增加处理分页显示代码API/接口。

完成前台代码,加入分页导航,并将分页请求和后台接口结合。

说明:有了现在的MyBatis PageHelper和前端的分页组件,完成分页就非常的方便,但是底层的分页模型和前面我们的java web原生项目一样。


代码实现

  1. 修改pom.xml 加入分页插件
<!-- 引入mybatis pageHelper 分页插件-->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.2.1</version>
</dependency>


  1. 修改mybatis-config.xml, 配置分页拦截器
<!-- plugins 标签要放在typeAliases 标签后面-->
<plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
        <!-- 分页合理化,如果pageNum > pages,就让他查询最后一页。
        如果pageNum < 0,就查询第一页-->
        <property name="reasonable" value="true"/>
    </plugin>
</plugins>


  1. 修改FurnController.java 增加分页查询处理
 /**
     * 分页请求接口
     *
     * @param pageNum:  要显示第几页 : 默认为1
     * @param pageSize: 每页要显示几条记录:默认为5
     * @return
     */
    @ResponseBody
    @RequestMapping("/furnsByPage")
    public Msg listFurnsByPage(@RequestParam(defaultValue = "1") Integer pageNum,
                               @RequestParam(defaultValue = "5") Integer pageSize) {
        //设置分页参数
        //解读
        //1.调用findAll是完成查询,底层会进行物理分页,而不是逻辑分页
        //2.会根据分页参数来计算 limit ?, ?, 在发出SQL语句时,会带limit
        //3.我们后面会给大家抓取SQL
        PageHelper.startPage(pageNum, pageSize);
        List<Furn> furnList = furnService.findAll();
        //将分页查询的结果,封装到PageInfo
        //PageInfo 对象包含了分页的各个信息,比如当前页面pageNum , 共有多少记录
        //...
        PageInfo pageInfo = new PageInfo(furnList, pageSize);
        //将pageInfo封装到Msg对象,返回
        return Msg.success().add("pageInfo", pageInfo);
    }


  1. 使用Postman 进行测试,看看分页查询是否OK

a181c3f0132121c52de146d3fc19d70e.png

  1. 修改HomeView.vue , 完成分页导航显示、分页请求

ce3f14e5929c4128b27718c40f4462dd.png


f326b37eb2f64a738b57699351d5c03b.png


//增加element-plus 分页控件
<div style="margin: 10px 0">
    <el-pagination
@size-change="handlePageSizeChange"
    @current-change="handleCurrentChange"
    :current-page="currentPage"
    :page-sizes="[5,10]"
    :page-size="pageSize"
    layout="total, sizes, prev, pager, next, jumper"
:total="total">
</el-pagination>
</div >
</div >
</template >
    //增加分页初始化数据
    data() {
    return {
        currentPage: 1,
        pageSize: 5,
        total: 10,
        //修改list(), 换成分页请求数据
        list() { //请求显示家居列表-不带检索
            request.get("/api/furnsByPage", {
                params: {
                    pageNum: this.currentPage,
                    pageSize: this.pageSize
                }
            }).then(res => {
                //绑定tableData, 显示在表格
                this.tableData = res.extend.pageInfo.list
                this.total = res.extend.pageInfo.total
            })
        }
        //增加方法, 处理记录的变化, 这两个方法是和分页控件绑定的.
        //处理每页显示多少条记录变化
        handlePageSizeChange(pageSize) {
            this.pageSize = pageSize
            this.list()
        }
        ,
        //处理当前页变化, 比如点击分页连接,或者go to 第几页
        handleCurrentChange(pageNum) {
            this.currentPage = pageNum
            this.list()
        }


完成测试


启动项目后台服务furns_ssm

启动项目前台ssm_vue


分页显示效果

测试分页显示效果, 浏览器: http://localhost:9875/

4aa2aad4215147fb8064210546ffe288.png

相关文章
|
1天前
|
JSON 前端开发 JavaScript
Vue3 Ajax(axios)
Vue3 Ajax(axios)
|
1天前
|
JavaScript
vue封装axios(用interceptors封装)
vue封装axios(用interceptors封装)
13 0
|
1天前
|
前端开发 JavaScript 数据格式
vue3中axios添加请求和响应的拦截器
vue3中axios添加请求和响应的拦截器
13 1
|
1天前
|
缓存 前端开发 JavaScript
前端vue3分享——项目封装axios、vite使用env环境变量
前端vue3分享——项目封装axios、vite使用env环境变量
23 0
|
1天前
|
JSON JavaScript 前端开发
< 每日份知识快餐:axios是什么?如何在Vue中 封装 axios ? >
本文介绍了前端开发中常用的HTTP客户端库Axios,它基于Promise,支持浏览器和Node.js,特点是功能强大、支持Promise API和并发请求,并能拦截请求和响应。文章强调了理解Axios的内部原理和优化使用的重要性,不仅讲解了基本的安装、导入和使用方法,还阐述了为何选择Axios,包括其丰富的配置选项和良好的浏览器支持。此外,文章探讨了封装Axios的必要性,以减少重复代码和提高代码维护性,并给出了设置接口请求前缀、请求头、超时时间以及封装请求方法和拦截器的示例。通过封装,开发者可以更高效地管理和使用Axios,适应不同项目需求。
|
1天前
|
JSON 前端开发 JavaScript
Vue+Axios+SpringBoot后端同时接收文件和json作为请求参数
Vue+Axios+SpringBoot后端同时接收文件和json作为请求参数
38 0
|
1天前
|
前端开发 应用服务中间件 nginx
Vue+SpringBoot+Axios的跨域问题
Vue+SpringBoot+Axios的跨域问题
21 0
|
1天前
|
JavaScript
vue element upload组件配合axios实现用 “Content-Type“: “multipart/form-data“上传方式导入xls文件
vue element upload组件配合axios实现用 “Content-Type“: “multipart/form-data“上传方式导入xls文件
|
1天前
|
JSON 前端开发 JavaScript
3分钟让你学会axios在vue项目中的基本用法(建议收藏)
3分钟让你学会axios在vue项目中的基本用法(建议收藏)
86 0
|
1天前
|
XML JavaScript 前端开发
axios如何在vue中使用
axios如何在vue中使用
30 1