SSM整合项目(添加家居)

news2024/11/15 11:14:49

文章目录

    • 1.需求分析
    • 2.设计结构
    • 3.编写Service层
        • 1.创建文件夹
        • 2.FurnService.java
        • 3.FurnServiceImpl.java
        • 4.单元测试 FurnServiceTest.java
        • 5.指定默认图片位置
          • 1.Furn.java 为imgPath设置默认值
          • 2.Furn.java 的全参构造器内判断imgPath是否为空
    • 4.返回json数据的通用类com/sun/furn/bean/Msg.java
    • 5.编写Controller层
        • com/sun/furn/controller/FurnController.java
    • 6.使用postman测试
        • 1.后端引入处理json数据的依赖jackson
        • 2.pom.xml
        • 3.设置Content-Type
        • 4.进行测试
    • 7.点击新增,前端显示添加表单
        • 1.HomeView.vue在div结束之前添加提示框显示表单
        • 2.为新增按钮绑定一个点击事件
        • 3.设置数据池
        • 4.结果展示,点击新增
        • 5.解决bug,当点击取消之后再次点击新增数据仍然存在
    • 8.创建Axios Request对象发送请求给后台
        • 1.前端项目安装Axios
          • 1.在IDEA的命令行,的前端项目文件夹输入 `npm i axios -S`
          • 2.无法识别nodejs,直接使用命令行到前端项目文件夹执行命令
        • 2.创建工具文件封装axios request对象
          • 1.创建一个js工具文件src/utils/request.js
          • 2.编写工具文件,封装axios request对象设置Content-Type为json
        • 3.跨域问题
          • 1.修改HomeView.vue在methods中编写save方法将表单数据提交到后端
          • 2.出现跨域问题
          • 3.跨域问题分析
          • 4.解决跨域问题
            • 1.修改vue.config.js,设置代理,解决跨域问题
            • 2.修改HomeView.vue
          • 5.成功返回数据
    • 9.添加家居注意事项
        • 1.在使用postman测试的时候需要指定Content-Type否则会报错415
        • 2.表单数据的名字需要与后端对象的属性名一致
        • 3.点击弹出提示框时记得清除提示框的数据,防止第二次填写的时候数据仍然存在
        • 4.如果需要将json请求自动封装到javabean中需要指定@RequestBody否则会报错500
        • 5.如果后端需要返回json数据需要在方法上配置@ReponseBody否则会报错404

1.需求分析

image-20240310143040581

2.设计结构

3.编写Service层

1.创建文件夹

image-20240310151514230

2.FurnService.java
package com.sun.furn.service;

import com.sun.furn.bean.Furn;

/**
 * @author 孙显圣
 * @version 1.0
 */
public interface FurnService {
    //增加一条记录
    public void save(Furn furn);
}

3.FurnServiceImpl.java
package com.sun.furn.service.impl;

import com.sun.furn.bean.Furn;
import com.sun.furn.dao.FurnMapper;
import com.sun.furn.service.FurnService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * @author 孙显圣
 * @version 1.0
 */
@Service
public class FurnServiceImpl implements FurnService {
    //注入一个FurnMapper的代理对象
    @Resource
    private FurnMapper furnMapper;
    @Override
    public void save(Furn furn) {
        furnMapper.insertSelective(furn);
    }
}

4.单元测试 FurnServiceTest.java
package com.sun.furn.service;


import com.sun.furn.bean.Furn;

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.math.BigDecimal;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class FurnServiceTest {
    //获取ioc容器
    private ApplicationContext ioc;
    //获取针对FurnService接口的代理对象
    private FurnService furnService;

    //初始化方法,在所有测试方法之前执行

    @Before
    public void init() {
        //读取sping配置文件,获取ioc容器,此时所有的单例bean已经被反射创建bean对象,依赖注入,初始化完毕
        ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取针对FurnService接口的代理对象
        furnService = ioc.getBean(FurnService.class);
    }

    @Test
    public void save() {
        Furn furn = new Furn(null, "桌子", "熊猫家居", new BigDecimal(12.3), 21, 11, "assets/images/product-image/14.jpg");
        furnService.save(furn);
    }


}

image-20240310151656078

5.指定默认图片位置
1.Furn.java 为imgPath设置默认值

image-20240310153533633

2.Furn.java 的全参构造器内判断imgPath是否为空

image-20240310153614795

4.返回json数据的通用类com/sun/furn/bean/Msg.java

package com.sun.furn.bean;

import java.util.HashMap;
import java.util.Map;

/**
 * 返回数据到前端的通用类
 * @author 孙显圣
 * @version 1.0
 */
public class Msg {
    //状态码
    private int code;
    //成功或失败的信息
    private String msg;
    //要返回的信息(一个map就是一个json对象)
    private Map<String, Object> extend = new HashMap<>();

    //静态方法,获取成功的Msg对象
    public static Msg success() {
        Msg success = new Msg();
        //设置状态码和成功的信息
        success.setMsg("success");
        success.setCode(200);
        return success;
    }

    //静态方法,获取失败的Msg对象
    public static Msg fail() {
        Msg fail = new Msg();
        fail.setCode(400);
        fail.setMsg("fail");
        return fail;
    }

    //添加要返回的信息到Msg,并且返回这个对象
    public Msg add(String key, Object value) {
        extend.put(key, value);
        //在使用这个add之前一定是要有一个这个Msg类型的对象
        //当这个对象调用这个实例方法时,为这个对象的属性添加一个值,然后直接返回this就是当前对象
        return this;
    }


    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Map<String, Object> getExtend() {
        return extend;
    }

    public void setExtend(Map<String, Object> extend) {
        this.extend = extend;
    }
}

5.编写Controller层

com/sun/furn/controller/FurnController.java
package com.sun.furn.controller;

import com.sun.furn.bean.Furn;
import com.sun.furn.bean.Msg;
import com.sun.furn.service.FurnService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;

/**
 * @author 孙显圣
 * @version 1.0
 */

@Controller //单例bean注入容器
public class FurnController {
    @Resource //依赖注入,指向针对FurnService接口的代理对象
    private FurnService furnService;

    @ResponseBody //将结果转换成json字符串返回
    @PostMapping("/save")
    public Msg save(@RequestBody Furn furn) { //将接受到的json字符串转换成Furn对象
        furnService.save(furn);
        //如果没有报错,则返回成功的Msg对象
        return Msg.success();
    }


}

6.使用postman测试

1.后端引入处理json数据的依赖jackson

image-20240310162343190

2.pom.xml
  <!--  引入jackson,用于处理json数据-->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.12.4</version>
    </dependency>
3.设置Content-Type

image-20240310163912085

4.进行测试

image-20240310164023346

7.点击新增,前端显示添加表单

1.HomeView.vue在div结束之前添加提示框显示表单
  • 注意:表单属性的名字必须与Furn的属性名一致
    <!--添加提示框-->
    <el-dialog title="提示" v-model="dialogVisible" width="30%">
      <el-form :model="form" label-width="120px">
        <!--注意:表单的属性名字必须与Furn的属性名一致-->
        <el-form-item label="家居名">
          <el-input v-model="form.name" style="width: 80%"></el-input>
        </el-form-item>
        <el-form-item label="厂商">
          <el-input v-model="form.maker" style="width: 80%"></el-input>
        </el-form-item>
        <el-form-item label="价格">
          <el-input v-model="form.price" style="width: 80%"></el-input>
        </el-form-item>
        <el-form-item label="销量">
          <el-input v-model="form.sales" style="width: 80%"></el-input>
        </el-form-item>
        <el-form-item label="库存">
          <el-input v-model="form.stock" style="width: 80%"></el-input>
        </el-form-item>
      </el-form>
      <template #footer>
        <span class="dialog-footer">
        <el-button @click="dialogVisible = false">取 消</el-button>
        <el-button type="primary" @click="save">确 定</el-button>
        </span>
      </template>
    </el-dialog>
2.为新增按钮绑定一个点击事件

image-20240310172833504

3.设置数据池
  • 注意:这里的表单对象不需要设置属性,因为在使用表单名.属性的时候就会自动设置属性值
  • 这里虽然是单向绑定,但是效果确跟双向绑定类似

image-20240310172911990

4.结果展示,点击新增

image-20240310173059067

5.解决bug,当点击取消之后再次点击新增数据仍然存在

image-20240310174148562

8.创建Axios Request对象发送请求给后台

1.前端项目安装Axios
1.在IDEA的命令行,的前端项目文件夹输入 npm i axios -S

image-20240310174909585

2.无法识别nodejs,直接使用命令行到前端项目文件夹执行命令

image-20240310183144839

2.创建工具文件封装axios request对象
1.创建一个js工具文件src/utils/request.js

image-20240310194207606

2.编写工具文件,封装axios request对象设置Content-Type为json
//引入axios
import axios from "axios";
//通过axios创建request对象
const request = axios.create({
    timeout: 5000 //设置超时时长为5秒
})
//创建request的拦截器,在请求之前做统一的处理,这里是设置Content-Type
request.interceptors.request.use(config => {
    config.headers['Content-Type'] = 'application/json;charset=utf-8'
    return config
}, error => {
    //如果出错则不继续执行
    return Promise.reject(error)
})

//导出
export default request

3.跨域问题
1.修改HomeView.vue在methods中编写save方法将表单数据提交到后端

image-20240310203040542

image-20240310201025214

2.出现跨域问题

image-20240310201115834

3.跨域问题分析
  • localhost:9999去请求localhost:8080
  • 是浏览器阻止了localhost:9999的请求而不是localhost:8080拒绝了请求
4.解决跨域问题
1.修改vue.config.js,设置代理,解决跨域问题
  • 这里的target就是要请求的后端网址的一部分,至少要包括http://localhost:8080
const {defineConfig} = require('@vue/cli-service')
module.exports = defineConfig({
    transpileDependencies: true
})
module.exports = {
    devServer: {
        port: 9999, //启动端口
        //设置代理,解决跨域问题
        proxy: {
            '/api': {
                target: 'http://localhost:8080/ssm', //这样设置/api就代表了http://localhost:8080/ssm
                changeOrigin: true, //是否设置同源,这样浏览器就允许跨域访问
                pathRewrite: { //路径重写
                    '/api': '' //选择忽略拦截器里面的单词
                }

            }
        }
    }
}

2.修改HomeView.vue

image-20240310203013218

5.成功返回数据

image-20240310203121149

9.添加家居注意事项

1.在使用postman测试的时候需要指定Content-Type否则会报错415
2.表单数据的名字需要与后端对象的属性名一致
3.点击弹出提示框时记得清除提示框的数据,防止第二次填写的时候数据仍然存在
4.如果需要将json请求自动封装到javabean中需要指定@RequestBody否则会报错500
5.如果后端需要返回json数据需要在方法上配置@ReponseBody否则会报错404
  • 因为如果不写这个注解,他会认为你返回的一个数据是要找一个页面

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FreeRTOS操作系统学习——调试与优化

本文介绍 在FreeRTOS中&#xff0c;我们经常会运用到栈这个技术&#xff0c;我们对某个任务分配空间时&#xff0c;往往不确定分配多大空间的栈。任务拿到分配的栈后&#xff0c;大多数情况下&#xff0c;使用率都达不到80%&#xff0c;为了节省栈空间的开销&#xff0c;我们可…

k8s部署InfluxDB

&#xff08;作者&#xff1a;陈玓玏&#xff09; 1. 拉取镜像 docker pull influxdb #拉取镜像 docker run -d influxdb:latest #后台运行容器 docker exec -it 89b /bin/bash #进入容器&#xff0c;89b是容器ID的前三位 cd /usr/bin #进入容器后&#xff0c;进入此文件夹…

GNN/GCN自己学习

一、图的基本组成 V&#xff1a;点&#xff08;特征&#xff09; E&#xff1a;边 U&#xff1a;图&#xff08;全局特征&#xff09; 二、用途 整合特征&#xff08;embedding)&#xff0c;做重构 三、邻接矩阵 以图像为例&#xff0c;每个像素点周围都有邻居&#xff0c;…

HTML CSS入门:从基础到实践

&#x1f310; HTML & CSS入门&#xff1a;从基础到实践 &#x1f3a8; &#x1f4d6; 引言 HTML和CSS是构建网页的基石。HTML&#xff08;超文本标记语言&#xff09;用于创建网页内容&#xff0c;而CSS&#xff08;层叠样式表&#xff09;则用于美化这些内容。无论你是…

【嵌入式——QT】QPainter基本绘图

【嵌入式——QT】QPainter基本绘图 QPainter与QPaintDevicepaintEvent事件和绘图区QPainter主要属性QPen主要功能QBrush主要功能QPainter绘制基本图形方法图示代码示例 QPainter与QPaintDevice QPainter是用来进行绘图操作的类&#xff0c;QPaintDevice是一个可以使用QPainter…

RabbitMQ 模拟实现【一】:需求分析

文章目录 消息队列消息队列消息队列的作用图解生产者消费者模型BrokerSever 内部涉及的关键概念交换机功能消费的实现方式数据存储方式网络通信消息应答模式 消息队列模拟实现Gitee网址 消息队列 采用 SpringBoot 框架实现 消息队列 通常说的消息队列&#xff0c;简称MQ&am…

AP AUTOSAR 执行管理与状态管理的交互

本系列文章将从以下六个方面来介绍AP平台核心技术: 接下来,让我们来看第4个部分: 第四部分 执行管理与状态管理的交互 4.1 执行管理与状态管理的交互

这个班要不还是别上了吧。

先不提代码写得对不对。咱就是说&#xff0c;打印语句都出不来&#xff0c;搞个chuanchuan哟。 &#xff08;谁能给我解释一下。。&#x1f643;&#xff09;

Stable Diffusion 模型下载:Juggernaut(主宰、真实、幻想)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 该模型是一个真实模型&#xff0c;并且具有幻想和创意色彩。 作者述&#xff1a;我选取了…

腾讯t-design 实现图片预览组件的显示和使用

腾讯t-design 发布了 下面介绍一个组件的使用 图片预览 <template><div><div class"tdesign-demo-image-viewer__base"><t-image-viewer :images"[img]"><template #trigger"{ open }"><div class"tde…

【智能算法】非洲秃鹫优化算法(AVOA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.代码实现4.参考文献 1.背景 2021年&#xff0c;Abdollahzadeh等人受到非洲秃鹫自然捕食行为启发&#xff0c;提出了非洲秃鹫优化算法(African Vultures Optimization Algorithm, AVOA)。 2.算法原理 2.1算法思想 AVOA模拟了…

13.WEB渗透测试--Kali Linux(一)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;12.WEB渗透测试-Linux系统管理、安全加固&#xff08;下&#xff09;-CSDN博客 kali由 Of…

python爬虫实战——抖音

目录 1、分析主页作品列表标签结构 2、进入作品页前 判断作品是视频作品还是图文作品 3、进入视频作品页面&#xff0c;获取视频 4、进入图文作品页面&#xff0c;获取图片 5、完整参考代码 6、获取全部作品的一种方法 本文主要使用 selenium.webdriver&#xff08;Firef…

【js刷题:数据结构数组篇之移除元素】

移除元素 一、题目二、思路三、方法1.暴力解法2.双指针法定义快指针和慢指针代码展示 三、力扣刷题1.删除排序数组中的重复项 一、题目 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额…

vivo统一接入网关VUA转发性能优化实践

作者&#xff1a;vivo 互联网服务器团队 - Qiu Xiangcun 本文将探讨如何通过使用Intel QuickAssist Technology&#xff08;QAT&#xff09;来优化VUA的HTTPS转发性能。我们将介绍如何使用QAT通过硬件加速来提高HTTPS转发的性能&#xff0c;并探讨QAT在不同应用场景中的表现。最…

重学SpringBoot3-内容协商机制

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-内容协商机制 ContentNegotiationConfigurer接口配置内容协商URL参数Accept头使用Url扩展名 自定义内容协商格式步骤1: 注册自定义媒体类型步骤2: 实现H…

AI实战:借助Python与PaddleOCR,实现高精度文本检测与识别

1、引言 欢迎来到今天的教程&#xff1a;“驾驭PaddleOCR&#xff0c;解锁Python文字识别新技能”。在本篇文章中&#xff0c;我们将手把手教你如何安装及使用这款强大的Python库&#xff0c;轻松应对各类图像中的文字识别问题。 2、安装PaddleOCR 首先确保你的环境中已安装…

苹果电脑下载crossover对电脑有影响吗 crossover mac 好用吗CrossOver虚拟机 CrossOver打游戏

苹果电脑下载crossover对电脑有影响吗&#xff1f; 在苹果电脑下载安装crossover对电脑没有什么影响&#xff0c;并且可以解决macOS系统不能安装Windows应用程序的问题。相较于虚拟机和双系统而言&#xff0c;crossover安装软件更简单&#xff0c;占用内存也更小。下面我们来看…

Css基础——精灵图(sprites)和字体图标

1、精灵图 1.1、精灵图的由来 一个网页中往往会应用很多小的背景图像作为修饰&#xff0c;当网页中的图像过多时&#xff0c;服务器就会频繁地接收和发送 请求图片&#xff0c;造成服务器请求压力过大&#xff0c;这将大大降低页面的加载速度。 因此&#xff0c;为了有效地减…

可行性研究报告模板

1业务需求可行性分析 2技术可行性分析 2.1规范化原则 2.2高度的兼容性和可移植性 2.3人性化、适用性 2.4标准化统一设计原则 2.5先进安全可扩展性原则 3开发周期可行性分析 4人力资源可行性分析 5成本分析 6收益分析 7结论 软件项目全套资料获取下载&#xff1a;软件开发全套资…