SSM整合项目(添加家居)

文章目录

    • 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
  • 因为如果不写这个注解,他会认为你返回的一个数据是要找一个页面

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

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

相关文章

【QT+QGIS跨平台编译】之七十:【QGIS_Analysis跨平台编译】—【qgsrastercalcparser.cpp生成】

文章目录 一、Bison二、生成来源三、构建过程一、Bison GNU Bison 是一个通用的解析器生成器,它可以将注释的无上下文语法转换为使用 LALR (1) 解析表的确定性 LR 或广义 LR (GLR) 解析器。Bison 还可以生成 IELR (1) 或规范 LR (1) 解析表。一旦您熟练使用 Bison,您可以使用…

C语言内存管理-数据段与代码段

数据段细分成如下几个区域&#xff1a; .bss 段&#xff1a;存放未初始化的静态数据&#xff0c;它们将被系统自动初始化为0.data段&#xff1a;存放已初始化的静态数据.rodata段&#xff1a;存放常量数据代码段细分成如下几个区域&#xff1a; .text段&#xff1a;存放用户代码…

南洋理工发布多模态金融交易Agent,平均利润提高36%!

金融市场是经济稳定的基石&#xff0c;它不仅促进了资本的分配&#xff0c;还提供了风险管理的机制。随着市场的不断演变&#xff0c;传统的基于规则的交易系统由于缺乏适应市场波动的能力而表现不佳。尽管基于强化学习的系统显示出更好的适应性&#xff0c;但它们在处理多模态…

LVGL:渐变方案

仿照qt的QGradient::Preset渐变类型写的&#xff0c;因为lvgl只支持水平/垂直渐变&#xff0c;且只支持两种颜色的渐变&#xff0c;所以有些类型的渐变未能实现&#xff0c;有些则缺少中间颜色。 代码&#xff1a; namespace Gradient { enum Preset {WarmFlame 1,NightFade…

allegro PCB设计心得笔记(二) -- ERROR(SPMHUT-144): Illegal arc specification

使用Allegro PCB Editor设计PCB&#xff0c;其中使用了中文丝印&#xff0c;设计完成后&#xff0c;进行Tools -> Database Check&#xff0c;提示如下错误&#xff1a; 对PCB文件进行反复检查&#xff0c;也没有找到具体问题&#xff0c;但是删除中文丝印封装后&#xff0c…

安卓玩机工具推荐----MTK芯片读写分区 备份分区 恢复分区 制作线刷包 工具操作解析

安卓玩机工具推荐----高通芯片9008端口读写分区 备份分区 恢复分区 制作线刷包 工具操作解析 安卓玩机工具推荐----ADB状态读写分区 备份分区 恢复分区 查看分区号 工具操作解析 前面做了两期教程。分别解析了下ADB端口与高通9008端口备份分区一些基础的常识&#xff0c;那么…

【Oracle之DataGuard的初步学习】

** 以下所有均是基于11G版本的 ** 一、DataGuard的部署方式 DG的部署最常用的方式就是直接在备库端部署一个空库然后再设置参数&#xff0c;但是这样做在初始同步时如果数据量过大会耗费较长的时间&#xff1b;相对来说这中方式比较简单不易出错。 还有一种方式就是通过rman的备…

okcc呼叫中心的客服代表应该具备哪些条件?

对每个企业管理者来说&#xff0c;选择最高效和最理想的呼叫中心提供商来简化他们的客户服务操作是一项关键工作内容。除了要确保提供商拥有处理这一重要任务所需的技术和资源之外&#xff0c;确定他们是否具备最高质量的合适人员来执行这项任务同样很重要。 客户服务代表是每…

多核多cluster多系统之间缓存一致性概述

目录 1.思考和质疑2.怎样去维护多核多系统缓存的一致性2.1多核缓存一致性2.2多Master之间的缓存一致性2.3dynamIQ架构同一个core中的L1和L2 cache 3.MESI协议的介绍4.ACE维护的缓存一致性5.软件定义的缓存和替换策略6.动图示例 本文转自 周贺贺&#xff0c;baron&#xff0c;代…

jvm八股

文章目录 运行时数据区域Java堆对象创建对象的内存布局对象的访问定位句柄直接指针 GC判断对象是否已死引用计数算法可达性分析算法 引用的类别垃圾收集算法分代收集理论标记清除算法标记复制算法标记整理算法 实现细节并发的可达性分析 垃圾收集器serial收集器ParNew收集器Par…

虾皮Shopee商品详情数据采集,item_get-根据ID取商品详情

Shopee&#xff08;虾皮&#xff09;是一个流行的东南亚电商平台&#xff0c;许多商家和开发者都对其商品详情数据感兴趣。为了采集Shopee上的商品详情数据&#xff0c;特别是根据商品ID获取商品详情&#xff0c;通常需要使用Shopee提供的API接口或者通过爬虫技术。然而&#x…

【Docker安装教程】Docker安装Redis详解

安装Redis前我们必须要保证Docker运行OK&#xff0c;如何安装Docker参考《CentOS 7 上的 Docker 安装与配置》 步骤 1: 拉取 Redis 镜像 首先&#xff0c;确保你已经安装了 Docker。然后&#xff0c;使用以下命令拉取最新的 Redis 镜像&#xff1a; docker pull redis](http…

强烈安利!FastReport 商业图形库,炫酷可视化报告开发首选~

FastReport Business Graphics .NET&#xff0c;是一款基于fastreport报表开发控件的商业图形库&#xff0c;借助 FastReport 商业图形库&#xff0c;您可以可视化不同的分层数据&#xff0c;构建业务图表以进行进一步分析和决策。利用数据呈现领域专家针对 .NET 7、.NET Core、…

微信小程序-分包

分包 1.什么是分包 分包指的是把一个完整的小程序项目&#xff0c;按照需求划分为不同的子包&#xff0c;在构建时打包成不同的分包&#xff0c;用户在使用时按需进行加载。 2.分包的好处 对小程序进行分包的好处主要有以下两点&#xff1a; 可以优化小程序首次启动的下载时间…

【Python】进阶学习:基于Matplotlib--使用plt.savefig()实现图形文件的保存

【Python】进阶学习&#xff1a;基于Matplotlib–使用plt.savefig()实现图形文件的保存 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程…

jvisualvm 工具的使用

文章目录 Visual GC 插件下载代码示例说明spaces 区域PermHeap Graphs 区域Compile Time&#xff08;编译时间&#xff09;Class Loader Time&#xff08;类加载时间&#xff09;GC TimeEden Space&#xff08;Eden 区&#xff09;Survivor 0 / Survivor 1&#xff08;S0 和 S1…

python 导入excel空间三维坐标 生成三维曲面地形图 5-4、线条平滑曲面且可通过面观察柱体变化(四)

环境 python:python-3.12.0-amd64 包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 scipy 1.12.0 import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from scipy.interpolate import griddata from matplotlib.c…

MySQL数据库在Windows和Linux中由于大小写默认规则不同,出现大小写问题如何解决?

Windows和Linux差异&#xff1a;在Windows上&#xff0c;lower_case_table_names默认为1&#xff0c;而在Linux上&#xff0c;默认值通常为0。因此&#xff0c;在Linux上更改这个设置更常见&#xff0c;以确保与Windows环境的兼容性或实现特定的大小写敏感性需求。 操作系统的大…

【活动】探索人工智能的“迷惑瞬间”:真实体验与技术挑战

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 标题&#xff1a;探索人工智能的“迷惑瞬间”&#xff1a;真实体验与技术挑战引言…

深入理解React中的useReducer:管理复杂状态逻辑的利器

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…