尚品汇-(十一)

news2024/12/22 22:40:02

(1)spu保存

这个页面选择了手机之后,会调用查询分类品牌的接口,显示品牌,在分类品牌中添加了两个品牌后也会在这里显示出来 

销售属性名称需要查询base_sale_attr表:

实体类:BaseSaleAttr

package com.atguigu.gmall.model.product;

import com.atguigu.gmall.model.base.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/**
 * <p>
 * BaseSaleAttr
 * </p>
 *
 */
@Data
@ApiModel(description = "销售属性")
@TableName("base_sale_attr")
public class BaseSaleAttr extends BaseEntity {
	
	private static final long serialVersionUID = 1L;
	
	@ApiModelProperty(value = "销售属性名称")
	@TableField("name")
	private String name;

}

加载销售属性

创建mapper:BaseSaleAttrMapper 

@Mapper
public interface BaseSaleAttrMapper extends BaseMapper<BaseSaleAttr> {
}

继续在MangeService添加接口


/**
 * 查询所有的销售属性数据
 * @return
 */
List<BaseSaleAttr> getBaseSaleAttrList();

实现类

@Autowired
private BaseSaleAttrMapper baseSaleAttrMapper;

@Override
public List<BaseSaleAttr> getBaseSaleAttrList() {
    return baseSaleAttrMapper.selectList(null);
}

继续在控制器SpuManageController添加接口:

@RestController
@RequestMapping("admin/product")
public class SpuManageController {

    // 引入服务层
    @Autowired
    private ManageService manageService;

    // 销售属性http://api.gmall.com/admin/product/baseSaleAttrList
    @GetMapping("baseSaleAttrList")
    public Result baseSaleAttrList(){
        // 查询所有的销售属性集合
        List<BaseSaleAttr>  baseSaleAttrList = manageService.getBaseSaleAttrList();

        return Result.ok(baseSaleAttrList);
    }
}

(2)保存后台代码

实体类:SpuInfo 

package com.atguigu.gmall.model.product;

import com.atguigu.gmall.model.base.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.List;

/**
 * <p>
 * SpuInfo
 * </p>
 *
 */
@Data
@ApiModel(description = "SpuInfo")
@TableName("spu_info")
public class SpuInfo extends BaseEntity {
	
	private static final long serialVersionUID = 1L;
	
	@ApiModelProperty(value = "商品名称")
	@TableField("spu_name")
	private String spuName;

	@ApiModelProperty(value = "商品描述(后台简述)")
	@TableField("description")
	private String description;

	@ApiModelProperty(value = "三级分类id")
	@TableField("category3_id")
	private Long category3Id;

	@ApiModelProperty(value = "品牌id")
	@TableField("tm_id")
	private Long tmId;

	// 销售属性集合
	@TableField(exist = false)
	private List<SpuSaleAttr> spuSaleAttrList;

	// 商品的图片集合
	@TableField(exist = false)
	private List<SpuImage> spuImageList;

	// 商品的海报图片集合
	@TableField(exist = false)
	private List<SpuPoster> spuPosterList;
}

SpuImage :spu图片实体类

package com.atguigu.gmall.model.product;

import com.atguigu.gmall.model.base.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/**
 * <p>
 * SpuImage
 * </p>
 *
 */
@Data
@ApiModel(description = "Spu图片")
@TableName("spu_image")
public class SpuImage extends BaseEntity {
	
	private static final long serialVersionUID = 1L;
	
	@ApiModelProperty(value = "商品id")
	@TableField("spu_id")
	private Long spuId;

	@ApiModelProperty(value = "图片名称")
	@TableField("img_name")
	private String imgName;

	@ApiModelProperty(value = "图片路径")
	@TableField("img_url")
	private String imgUrl;

}

 SpuPoster :spu海报实体类

package com.atguigu.gmall.model.product;

import com.atguigu.gmall.model.base.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/**
 * <p>
 * SpuPoster
 * </p>
 *

 */
@Data
@ApiModel(description = "SpuPoster")
@TableName("spu_poster")
public class SpuPoster extends BaseEntity {
	
	private static final long serialVersionUID = 1L;
	
	@ApiModelProperty(value = "商品id")
	@TableField("spu_id")
	private Long spuId;

	@ApiModelProperty(value = "文件名称")
	@TableField("img_name")
	private String imgName;

	@ApiModelProperty(value = "文件路径")
	@TableField("img_url")
	private String imgUrl;

}

 SpuSaleAttr :销售属性实体类

package com.atguigu.gmall.model.product;

import com.atguigu.gmall.model.base.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.List;

/**
 * <p>
 * SpuSaleAttr
 * </p>
 *
 */
@Data
@ApiModel(description = "销售属性")
@TableName("spu_sale_attr")
public class SpuSaleAttr extends BaseEntity {
	
	private static final long serialVersionUID = 1L;
	
	@ApiModelProperty(value = "商品id")
	@TableField("spu_id")
	private Long spuId;

	@ApiModelProperty(value = "销售属性id")
	@TableField("base_sale_attr_id")
	private Long baseSaleAttrId;

	@ApiModelProperty(value = "销售属性名称(冗余)")
	@TableField("sale_attr_name")
	private String saleAttrName;

	// 销售属性值对象集合
	@TableField(exist = false)
	List<SpuSaleAttrValue> spuSaleAttrValueList;

}

SpuSaleAttrValue :销售属性值实体类

package com.atguigu.gmall.model.product;

import com.atguigu.gmall.model.base.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;


/**
 * <p>
 * SpuSaleAttrValue
 * </p>
 *
 */
@Data
@ApiModel(description = "销售属性值")
@TableName("spu_sale_attr_value")
public class SpuSaleAttrValue extends BaseEntity {
	
	private static final long serialVersionUID = 1L;
	
	@ApiModelProperty(value = "商品id")
	@TableField("spu_id")
	private Long spuId;

	@ApiModelProperty(value = "销售属性id")
	@TableField("base_sale_attr_id")
	private Long baseSaleAttrId;

	@ApiModelProperty(value = "销售属性值名称")
	@TableField("sale_attr_value_name")
	private String saleAttrValueName;

	@ApiModelProperty(value = "销售属性名称(冗余)")
	@TableField("sale_attr_name")
	private String saleAttrName;

	// 是否是默认选中状态
//	@TableField("sale_attr_name")
//	String isChecked;
	@TableField(exist = false)
	String isChecked;

}

 

创建mapper

建立对应的mapper 文件

SpuImageMapper、SpuSaleAttrMapper SpuSaleAttrValueMapper SpuPosterMapper

@Mapper
public interface SpuImageMapper extends BaseMapper<SpuImage> {
}
@Mapper
public interface SpuSaleAttrMapper extends BaseMapper<SpuSaleAttr> {

}
@Mapper
public interface SpuSaleAttrValueMapper extends BaseMapper<SpuSaleAttrValue> {
}
@Mapper
public interface SpuPosterMapper extends BaseMapper<SpuPoster> {
}

继续添加在接口添加代码

/**
 * 保存商品数据
 * @param spuInfo
 */
void saveSpuInfo(SpuInfo spuInfo);

实现类:

@Override
@Transactional(rollbackFor = Exception.class)
public void saveSpuInfo(SpuInfo spuInfo) {
    /*
        spuInfo;
        spuImage;
        spuSaleAttr;
        spuSaleAttrValue;
        spuPoster
     */
    //保存spu信息
    spuInfoMapper.insert(spuInfo);


  //保存图片
    //  获取到spuImage 集合数据
    List<SpuImage> spuImageList = spuInfo.getSpuImageList();
    //  判断不为空
    if (!CollectionUtils.isEmpty(spuImageList)){
        //  循环遍历
        for (SpuImage spuImage : spuImageList) {
            //  需要将spuId 赋值
            spuImage.setSpuId(spuInfo.getId());
            //  保存spuImge
            spuImageMapper.insert(spuImage);
        }
    }

//保存销售属性
    //  获取销售属性集合
    List<SpuSaleAttr> spuSaleAttrList = spuInfo.getSpuSaleAttrList();
    //  判断
    if (!CollectionUtils.isEmpty(spuSaleAttrList)){
        //  循环遍历
        for (SpuSaleAttr spuSaleAttr : spuSaleAttrList) {
            //  需要将spuId 赋值
            spuSaleAttr.setSpuId(spuInfo.getId());
            spuSaleAttrMapper.insert(spuSaleAttr);


        //保存销售属性值
            //  再此获取销售属性值集合
            List<SpuSaleAttrValue> spuSaleAttrValueList = spuSaleAttr.getSpuSaleAttrValueList();
            //  判断
            if (!CollectionUtils.isEmpty(spuSaleAttrValueList)){
                //  循环遍历
                for (SpuSaleAttrValue spuSaleAttrValue : spuSaleAttrValueList) {
                    //   需要将spuId, sale_attr_name 赋值
                    spuSaleAttrValue.setSpuId(spuInfo.getId());
                    spuSaleAttrValue.setSaleAttrName(spuSaleAttr.getSaleAttrName());
                    spuSaleAttrValueMapper.insert(spuSaleAttrValue);
                }
            }
        }
    }


//保存海报

    //  获取到posterList 集合数据
    List<SpuPoster> spuPosterList = spuInfo.getSpuPosterList();
    //  判断不为空
    if (!CollectionUtils.isEmpty(spuPosterList)){
        for (SpuPoster spuPoster : spuPosterList) {
            //  需要将spuId 赋值
            spuPoster.setSpuId(spuInfo.getId());
            //  保存spuPoster
            spuPosterMapper.insert(spuPoster);
        }
    }
}

继续在控制器添加代码

/**
 * 保存spu
 * @param spuInfo
 * @return
 */
@PostMapping("saveSpuInfo")
public Result saveSpuInfo(@RequestBody SpuInfo spuInfo){
    // 调用服务层的保存方法
    manageService.saveSpuInfo(spuInfo);
    return Result.ok();
}

(3)spu表关系:

 

 

 

 

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

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

相关文章

前端三件套开发模版——产品介绍页面

今天有空&#xff0c;使用前端三件套html、css、js制作了一个非常简单的产品制作页面&#xff0c;与大家分享&#xff0c;希望可以满足大家应急的需求。本页面可以对产品进行“抢购”、对产品进行介绍&#xff0c;同时可以安排一张产品的高清大图&#xff0c;我也加入了页面的背…

Nordic 52832作为HID 键盘连接配对电视/投影后控制没反应问题的分析和解决

问题现象&#xff1a;我们的一款HID键盘硬件一直都工作的很好&#xff0c;连接配对后使用起来和原装键盘效果差不多&#xff0c;但是后面陆续有用户反馈家里的电视等蓝牙设备配对连接我们的键盘后&#xff0c;虽然显示已连接&#xff0c;但实际上控制不了。设备涉及到了好些品牌…

Golang | Leetcode Golang题解之第213题打家劫舍II

题目&#xff1a; 题解&#xff1a; func _rob(nums []int) int {first, second : nums[0], max(nums[0], nums[1])for _, v : range nums[2:] {first, second second, max(firstv, second)}return second }func rob(nums []int) int {n : len(nums)if n 1 {return nums[0]}…

Tekla Structures钢结构详图设计软件下载;Tekla Structures高效、准确的合作平台

Tekla Structures&#xff0c;它不仅集成了先进的三维建模技术&#xff0c;还融入了丰富的工程实践经验&#xff0c;为设计师、工程师和建筑商提供了一个高效、准确的合作平台。 在建筑项目的整个生命周期中&#xff0c;Tekla Structures都发挥着举足轻重的作用。从规划阶段开始…

部署nginx服务用于浏览服务器目录并实现账号密码认证登录

1、背景&#xff1a; 因公司业务需求&#xff0c;部署一套数据库备份中心服务&#xff0c;但是因为备份的数据库很多&#xff0c;有项目经理要求能经常去查看备份数据库情况及下载备份数据文件的需求。根据该需求&#xff0c;需要在备份数据库的服务器上部署一个nginx服务&…

mac中如何恢复因为破解脚本导致的IDEA无法启动的问题

问题 为了在mac中安装免费的2024版idea&#xff0c;导致下载了一个脚本&#xff0c;使用这个脚本后&#xff0c;但是发现idea还没有破解&#xff0c;相反导致idea无法启动&#xff0c;每次点击&#xff0c;都会弹出“cannot start IDE…” 问题排查 在访达中点击mac的应用程…

实时数仓Hologres OLAP场景核心能力介绍

作者&#xff1a;赵红梅 Hologres PD OLAP典型应用场景与痛点 首先介绍典型的OLAP场景以及在这些场景上的核心痛点&#xff0c;OLAP典型应用场景很多&#xff0c;总结有四类&#xff1a;第一类是BI报表分析类&#xff0c;例如BI报表&#xff0c;实时大屏&#xff0c;数据中台等…

java项目总结2

3.了解Java的内存分配 4.重载 定义&#xff1a;在一个类中&#xff0c;有相同名的&#xff0c;但是却是不同参数&#xff08;返回类型可以不一样&#xff09; 重载的优点&#xff1a; 1.减少定义方法时使用的单词 2.减少调用方法时候的麻烦&#xff08;比如sum的返回两个数的…

云计算【第一阶段(22)】Linux的进程和计划任务管理

目录 一、查看进程 1.1、程序和进程的关系 1.2、查看进程 1.2.1、静态查看进程信息ps ​编辑 1.2.1.1、实验 1.2.2、动态查看进程信息top 1.2.2.1、实验 1.2.2.2、top 命令全屏操作界面快捷键 1.2.3、pgrep根据特定条件查询进程pid信息 1.2.4、pstree命令以树形结构列出…

工程安全监测仪器:振弦采集仪的应用与发展

工程安全监测仪器&#xff1a;振弦采集仪的应用与发展 振弦采集仪是一种常见的工程安全监测仪器&#xff0c;广泛应用于建筑、桥梁、隧道、地铁等工程项目中。它通过监测振弦的振动变化&#xff0c;可以及时发现结构变形或损坏情况&#xff0c;为工程的安全运行提供重要数据支…

【前端实现】在父组件中调用公共子组件:注意事项逻辑示例 + 将后端数组数据格式转换为前端对象数组形式 + 增加和删除行

【前端】在父组件中调用公共子组件的实现方法 写在最前面一、调用公共子组件子组件CommonRow.vue父组件ParentComponent.vue 二、实现功能1. 将后端数组数据格式转换为前端对象数组形式2. 增加和删除row 三、小结 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2…

优化页面加载时间

注&#xff1a;机翻&#xff0c;未校对。 本文年代久远&#xff0c;除了少部分不合时宜的&#xff0c;其他仍有借鉴意义。 Optimizing Page Load Time 优化页面加载时间 It is widely accepted that fast-loading pages improve the user experience. In recent years, many …

数组-螺旋矩阵

M螺旋矩阵 ||&#xff08;leetcode59&#xff09; /*** param {number} n* return {number[][]}*/ var generateMatrix function(n) {const maxNum n * n;let curNum 1;const matrix new Array(n).fill(0).map(() > new Array(n).fill(0));let row 0,column 0;const d…

06 threeJs-gui 界面库

1.引入GUI 如果需要使用lil-gui界面库对页面进行辅助调试和数值设置&#xff0c;则需在项目中进行引入&#xff0c;例如&#xff1a; import { GUI } from ../../build/three/examples/&#xff1b;/libs/lil-gui.module.min.js 2.实例化 交互界面 3.对需要在交互界面显示的数…

redis学习(001 介绍)

黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 总时长 42:48:00 共175P 此文章包含第1p-第p4的内容 文章目录 介绍差异对比事务区别 认识redis 介绍 两种键值对方式对比 差异对比 事务区别 认识redis

uniapp 封装请求

新建request文件夹 下新建index.js 和index.js 或者创建units文件放入index.js 和api文件夹放入index.js(api.js)//看公司规范 1. index.js // 全局请求封装 // const base_url http://localhost:8080/devapi var base_url process.env.NODE_ENV development ? http://…

Ubuntu24.04(22.04+版本通用)Miniconda与Isaacgym

1. ubuntu24.04安装minicondda mkdir -p ~/miniconda3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh解释下这段代码 bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3~/miniconda3/miniconda.sh: 指向Mi…

UE5 02-给物体一个扭矩力

需要注意的是: 1.弹簧臂 可以使用绝对旋转 这样就可以不跟随父物体Player的旋转 2.弹簧臂 进行碰撞测试勾选,当这个弹簧线被遮挡,摄像机会切换到碰撞点位置 进行碰撞测试勾选,当这个弹簧线被遮挡,摄像机不会切换到碰撞点位置

SD-WebUI视频重绘:TemporalKit+EbsynthUtility避坑指南

AI视频重绘&#xff0c;在当下大家并不陌生。我们的实现方式大致可以分为三种: 第三方平台和discord上转绘&#xff0c;如DomoAI &#xff0c;GoEnhance AI 等。 优点&#xff1a;效果佳&#xff0c;门槛低。 缺点&#xff1a;需要科学上网&#xff0c;和支付一定的使用费用。…

Android设备信息(DevInfo)

软件介绍 设备信息&#xff08;DevInfo&#xff09;一款评分非常不错的手机硬件及各种信息检测应用&#xff0c;安卓设备硬件检测工具。可以全面查看手机的各种信息、包括&#xff1a;Android系统版本的详细信息、芯片CPU处理器的详细信息、全球卫星定位、测试功能、硬件温度、…