SSM整合项目(显示+添加+修改家居)

文章目录

    • 1.显示全部家居
        • 1.需求分析
        • 2.思路分析
        • 3.编写Service层
          • 1.FurnService.java 添加方法
          • 2.FurnServiceImpl.java 实现方法
          • 3.单元测试
        • 4.编写Controller层
          • 1.FurnController.java 添加方法
          • 2.postman完成测试
        • 5.前端展示家居
          • 1.HomeView.vue 修改el-table使其prop跟Furn的属性名对应
          • 2.HomeView.vue 添加方法获取所有家居信息
          • 3.使用vue生命周期函数created,当model加载完毕之后调用list()设置model
          • 4.结果展示
    • 2.新增家居
        • 1.HomeView.vue 修改save方法,调用list刷新家居
        • 2.结果展示
    • 3.拦截response并做统一处理
        • 1.修改request.js,编写response拦截器
        • 2.修改 HomeView.vue
    • 4.修改家居
        • 1.需求分析
        • 2.思路分析
        • 3.编写Service层
          • 1.FurnService.java 添加方法
          • 2.FurnServiceImpl.java 实现方法
          • 3.单元测试
          • 4.没有设置img_path的值但是确更新了
          • 5.问题分析
        • 4.编写Controller层
          • 1.FurnController.java 添加方法
          • 2.postman测试
          • 3.数据库
          • 4.前端信息
        • 5.回显表单数据
          • 1.HomeView.vue 为编辑按钮绑定点击事件,传入当前行的数据
          • 2.HomeView.vue 添加方法,进行表单回显
          • 3.结果展示
        • 6.点击确定,更新数据,弹出提示框
          • 1.HomeView.vue 点击确定按钮仍然执行save方法
          • 2.HomeView.vue 编写save方法,并与新增的逻辑区分
          • 3.结果展示

1.显示全部家居

1.需求分析

image-20240311085537239

2.思路分析

image-20240311085636215

3.编写Service层
1.FurnService.java 添加方法
        //返回所有家居信息
        public List<Furn> findAll();
2.FurnServiceImpl.java 实现方法
    @Override
    public List<Furn> findAll() {
        //传入的是null就代表返回所有信息
        return furnMapper.selectByExample(null);
    }
3.单元测试
    @Test
    public void findAll() {
        List<Furn> all = furnService.findAll();
        for (Furn furn : all) {
            System.out.println(furn);
        }
    }

image-20240311090718592

4.编写Controller层
1.FurnController.java 添加方法
    @ResponseBody
    @RequestMapping("/furns")
    public Msg listFurns() {
        //从后端获取所有信息
        List<Furn> all = furnService.findAll();
        //封装成功的Msg并返回
        return Msg.success().add("furList", all);
    }
2.postman完成测试

image-20240311091628345

5.前端展示家居
1.HomeView.vue 修改el-table使其prop跟Furn的属性名对应
    <el-table :data="tableData" stripe style="width: 90%">
      <el-table-column
          prop="id"
          label="ID" sortable
      >
      </el-table-column>
      <el-table-column
          prop="name"
          label="家居名" >
      </el-table-column>
      <el-table-column
          prop="maker"
          label="厂家">
      </el-table-column>
      <el-table-column
          prop="price"
          label="价格">
      </el-table-column>
      <el-table-column
          prop="sales"
          label="销量">
      </el-table-column>
      <el-table-column
          prop="stock"
          label="库存">
      </el-table-column>
      <el-table-column fixed="right" label="操作" width="100">
        <template #default="scope">
          <el-button @click="handleEdit(scope.row)" type="text">编辑</el-button>
          <el-button type="text">删除</el-button>
        </template>
      </el-table-column>
    </el-table>

2.HomeView.vue 添加方法获取所有家居信息
    //请求返回所有家居
    list() {
      request.get("/api/furns").then(
          res => {
            console.log(res)
            this.tableData = res.data.extend.furnList
          }
      )
    }
3.使用vue生命周期函数created,当model加载完毕之后调用list()设置model

image-20240311094436360

4.结果展示

image-20240311094524371

2.新增家居

1.HomeView.vue 修改save方法,调用list刷新家居

image-20240311094953320

2.结果展示

image-20240311095209717

image-20240311095222384

3.拦截response并做统一处理

1.修改request.js,编写response拦截器
//response拦截器,统一处理返回结果,总之这样前端得到的数据就是response.data了
request.interceptors.response.use(
    response => {
        let res = response.data
        //如果response是文件类型的就直接返回
        if (response.config.responseType === 'blob') {
            return res
        }
        //如果data是string类型的就转换成json
        if (typeof res === 'string') {
            res = res ? JSON.parse(res) : res
        }
        return res
    }
)
2.修改 HomeView.vue

image-20240311101321267

4.修改家居

1.需求分析

image-20240311101435337

2.思路分析

image-20240311101652089

3.编写Service层
1.FurnService.java 添加方法
        //修改家居
        public void update(Furn furn);
2.FurnServiceImpl.java 实现方法
    @Override
    public void update(Furn furn) {
        furnMapper.updateByPrimaryKeySelective(furn);
    }
3.单元测试
    @Test
    public void update() {
        Furn furn = new Furn();
        furn.setId(1);
        furn.setName("修改家居");
        furnService.update(furn);
    }
4.没有设置img_path的值但是确更新了

image-20240311103144894

5.问题分析
  • 由于在Furn中有默认值,则生成的img_path就有默认值
  • 解决方法,在调用update方法之前将Furn对象的img_path置空

image-20240311103742121

4.编写Controller层
1.FurnController.java 添加方法
    @ResponseBody
    @RequestMapping("/update")
    public Msg update(@RequestBody  Furn furn) {
        //更新数据
        furnService.update(furn);
        //如果没有异常则返回成功信息
        return Msg.success();
    }
2.postman测试

image-20240311105225996

3.数据库

image-20240311105241953

4.前端信息

image-20240311105302873

5.回显表单数据
1.HomeView.vue 为编辑按钮绑定点击事件,传入当前行的数据

image-20240311114601162

2.HomeView.vue 添加方法,进行表单回显
    //将这行的数据绑定到提示框并回显
    handleEdit(row) {
      //绑定到提示框
      //将这个row对象(是一个代理对象)转换成JSON格式然后直接绑定到提示框
      this.form = JSON.parse(JSON.stringify(row));
      //显示提示框
      this.dialogVisible = true;
    }

3.结果展示

image-20240311114752935

6.点击确定,更新数据,弹出提示框
1.HomeView.vue 点击确定按钮仍然执行save方法

image-20240311114836084

2.HomeView.vue 编写save方法,并与新增的逻辑区分
    //当用户输入完要添加的信息之后会点击确定,此时会触发这个save方法
    save() {
      //如果form有id则说明这个提示框是修改的提示框
      if (this.form.id) {
        //向后端发送请求,进行修改家居
        request.post("/api/update", this.form).then(
            res => {
              //code是200则表示修改成功
              if (res.code === 200) {
                //弹出更新成功的消息框
                this.$message(
                    {
                      type: "success",
                      message: "更新成功!"
                    }
                )
              } else {
                //修改失败
                //弹出更新失败的消息框
                this.$message(
                    {
                      type: "error",
                      message: "更新失败!"
                    }
                )
              }
              //刷新数据
              this.list()
              //关闭提示框
              this.dialogVisible = false
            }
        )
      }
      else {
        //如果form没有id则说明这个提示框是新增的提示框
        //发送post请求并携带form这个js对象的数据,会以json格式进行发送
        request.post("/api/save", this.form).then(
            res => {
              console.log("res=", res);
              this.dialogVisible = false;
              //调用list方法,刷新家居信息
              this.list();
            }
        )
      }

    }
3.结果展示

image-20240311115037525

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/450990.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PLC远程故障诊断

随着工业自动化水平的不断提升&#xff0c;可编程逻辑控制器&#xff08;PLC&#xff09;在生产线控制、设备自动化等领域发挥着越来越重要的作用。然而&#xff0c;PLC在运行过程中难免会出现故障&#xff0c;影响生产线的稳定运行。因此&#xff0c;如何迅速、准确地诊断并解…

有c语言基础,如何快速学会C++核心知识?

有c语言基础&#xff0c;如何快速学会C核心知识&#xff1f; 在开始前我分享下我的经历&#xff0c;我刚入行时遇到一个好公司和师父&#xff0c;给了我机会&#xff0c;一年时间从3k薪资涨到18k的&#xff0c; 我师父给了一些 电气工程师学习方法和资料&#xff0c;让我不断提…

Python deepFM推荐系统,推荐算法,deepFM源码实战,deepFM代码模板

1.DeepFM介绍&#xff1a; DeepFM&#xff08;Deep Factorization Machine&#xff09;是一种结合了深度学习和因子分解机的推荐模型。它在CTR&#xff08;点击率&#xff09;预测任务中表现出色&#xff0c;并能够有效地处理稀疏特征。 DeepFM模型由两个部分组成&#xff1a;因…

截断表

oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 截断表 事务处理本身是保护数据完整性的一个手段&#xff0c;但是在使用事务处理的过程之中需要注意一点 在用户更新数据后还未进行事务提交时&#xff0c;如果发生了 DDL…

1688 API接口在数据分析与营销决策中的应用探索

在当今数字化快速发展的时代&#xff0c;数据分析与营销决策已成为企业运营中不可或缺的重要环节。而1688 API接口&#xff0c;作为阿里巴巴旗下的一个强大的数据交互平台&#xff0c;为企业在数据分析与营销决策方面提供了丰富的数据源和灵活的操作方式。本文将深入探讨1688 A…

https代理相对socks5代理有什么优势?

随着互联网的快速发展&#xff0c;代理服务已成为许多人在访问敏感或地理位置受限的网站时所依赖的工具。其中&#xff0c;HTTPS代理和SOCKS5代理是两种最常用的代理服务类型。本文将探讨HTTPS代理相对SOCKS5代理的优势。 1、安全性 HTTPS代理使用SSL/TLS协议对客户端和代理服…

RabbitMQ - 01 - 快速入门

目录 界面总览 创建队列 选择默认交换机 发布消息 查看消息 通过实现以下目标快速入门 界面总览 RabbitMQ Management 界面总览 通道: 传输消息的通道 路由: 接收和路由(分发)消息 队列: 存储消息 消息队列的流程: 生产者将消息发送给路由,路由分发消息到各个队列存储…

Android Kotlin知识汇总(四)Kotlin 协程实践

Kotlin的重要优势及特点之——结构化并发 Kotlin 协程是一种并发设计模式&#xff0c;可以在 Android 平台上让异步代码像阻塞代码一样易于使用。协程可大幅简化后台任务管理&#xff0c;例如网络调用、本地数据访问等任务的管理。 简单来说&#xff0c;协程就是一种轻量级的非…

Windows从0到1部署项目

文章目录 1.创建虚拟机2.文件的传输--共享文件夹共享文件夹的访问 3.安装jdk&#xff0c;Tomcat3.1jdk的安装与配置配置环境变量 3.2Tomcat的安装与配置 4.安装mysql数据库5.下载nginx6.虚拟域名 因为Windows项目部署有很多操作都是博主之前做过的了&#xff0c;所及就只放了博…

何恺明教授在MIT的第一课,双语字幕1080P看resnet作者亲自讲解resnet

这几天AI圈最火的话题莫过于何恺明大神在MIT的首场教学了 何恺明&#xff08;Kaiming He&#xff09;教授于3月7日走上讲台&#xff0c;完成了他在麻省理工学院的首场教学&#xff0c;这标志着他教学生涯中的一个重要时刻。作为麻省理工学院电气工程与计算机科学系&#xff08…

批处理自动找木马文件路径

背景&#xff1a;如果主机不多&#xff0c;应急有通报的木马病毒样本可能存在的路径&#xff0c;一个个翻就太累。 直接整成一个文档&#xff0c;如果存在那个可以着重主机了。当然木马查杀记录也不能忘记看下。 1. 双击打开 cmd.bat 2. 输入list.bat 3. 文件存在输出路径…

SQLiteC/C++接口详细介绍之sqlite3类(四)

上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;三&#xff09; 下一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;五&#xff09;&#xff08;暂未发表&#xff09; 编写不易&#xff0c;有用的朋友点个赞或加粉一下万分感谢&#xff01;300…

three.js 按键W前进、S退后、A左转、D右转运动

效果&#xff1a;W 键 前进&#xff1b;S 键后退&#xff1b;A 键左转&#xff1b;D 键右转&#xff1b;使用了 tween.js 动画库&#xff1b; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left">&…

ctfshow-XXE(web373-web378)

目录 XXE&#xff08;外部实体注入攻击&#xff09; web373 web374 web375 web376 web377 web378 知识点 XXE&#xff08;外部实体注入攻击&#xff09; XXE这几关有个前提flag在根目录下文件名为flag web373 <?php error_reporting(0); libxml_disable_entity_…

商铺办理房产证需缴纳的交易费用有哪些材料?

一、商铺办理房产证收费标准 一般来说&#xff0c;商铺办理房产证时需要缴纳的交易费用包括&#xff1a;交易费、登记费、验资费、营业税、个人所得税、契税等。 每个城市的缴费标准会有所不同。 具体缴纳费用需要咨询当地房管局。 1、契税&#xff1a;房屋交易额的5%。 &…

BUUCTF-----[SWPU2019]Web1

打开页面&#xff0c;原本以为是二次注入,结果不是&#xff0c;先注册一个账户 在申请发布广告中&#xff0c;发现反射性xss(然而没有什么用) 在广告申请名字中发现注入点 开始注入 通过一系列的测试&#xff0c;发现系统过滤了#&#xff0c;or&#xff0c;空格 orde…

C语言 - 各种自定义数据类型

1.结构体 把不同类型的数据组合成一个整体 所占内存长度是各成员所占内存的总和 typedef struct XXX { int a; char b; }txxx; txxx data; typedef struct XXX { int a:1; int b:1; …

如果电脑缺少dll文件怎么解决?如何快速解决dll丢失问题

最近有小伙伴问电脑老是缺少dll文件&#xff0c;这种问题到底要怎么去解决呢&#xff1f;其实这种现象是正常的&#xff0c;为啥说正常呢&#xff0c;下面我们会给大家详细的讲解dll为啥会缺少&#xff0c;然后还会讲解电脑缺少dll文件怎么解决的方法&#xff0c;好了&#xff…

Linux: 预备

计算机结构基础 由于速度原因, CPU不直接与外设打交道, 而是通过内存进行交互.(CPU速度 >> 外设) 操作系统: 内核 (管理软硬件) shell(给用户使用操作系统的方式) 操作系统封装了用户操作接口 相比于系统接口,使用更简单跨平台性: 不同的操作系统,其系统调用接口是不同…

代码随想录 贪心算法-难度题目-其他题目

目录 53.最大子数组和 134.加油站 968.监控二叉树 53.最大子数组和 53. 最大子数组和 中等 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个…