谷粒商城学习笔记(四)

本文用来记录实现功能的一些代码。

分布式项目工作流程:

以user中的部分代码为例,讲一下代码的书写构造。
将gmall-user项目拆分成gmall-user-web和gmall-user-service两个项目之后。
将bean和service类都集成到gmall-api项目中。
配置文件都封装到util后缀的项目中。
在子项目中的pom依赖中进行配置依赖。
在这里插入图片描述
首先是前端gmall-user-web项目中的UserController文件:

@Controller //注意这里要使用controller注释
public class UserController {

    @Reference
    UserService userService;  //这里是api项目中的UserService这个类

    @RequestMapping("getReceiveAddressByMemberId") //前端给到getReceiveAddressByMemberId这个方法,使用RequestMapping处理请求地址映射
    @ResponseBody //使用ResponseBody修饰符使得返回结果不会被解析为跳转路径,而是直接写入HTTP 响应正文中
    public List<UmsMemberReceiveAddress> getReceiveAddressByMemberId(String memberId){//返回一个list,这个方法调用service中的同名方法
        //service接口类放在api项目中,实现放在service项目中的impl中
        List<UmsMemberReceiveAddress> umsMemberReceiveAddresses = userService.getReceiveAddressByMemberId(memberId);
        return umsMemberReceiveAddresses;
    }


    @RequestMapping("getAllUser")
    @ResponseBody
    public List<UmsMember> getAllUser(){
        List<UmsMember> umsMembers = userService.getAllUser();
        return umsMembers;
    }

    @RequestMapping("index")
    @ResponseBody
    public String index(){
        return "hello user";
    }


接着是UserService接口(在api项目中):

public interface UserService {
    List<UmsMember> getAllUser();

    List<UmsMemberReceiveAddress> getReceiveAddressByMemberId(String memberId);
}

接着通过UserServiceImpl实现这个接口(在service项目中):

@Service
public class UserServiceImpl implements UserService {//在这里UserServiceImpl实现UserService接口

    @Autowired
    UserMapper userMapper;//自动注入我们的通用mapper

    @Autowired
    UmsMemberReceiveAddressMapper umsMemberReceiveAddressMapper;

    @Override
    public List<UmsMember> getAllUser() {

        //测试通用Mapper
        List<UmsMember> userMemberList = userMapper.selectAll();//userMapper.selectAllUser();
        return userMemberList;
    }

    @Override
    public List<UmsMemberReceiveAddress> getReceiveAddressByMemberId(String memberId) {

        // 封装的参数对象
        UmsMemberReceiveAddress umsMemberReceiveAddress = new UmsMemberReceiveAddress();
        umsMemberReceiveAddress.setMemberId(memberId);
        List<UmsMemberReceiveAddress> umsMemberReceiveAddresses = umsMemberReceiveAddressMapper.select(umsMemberReceiveAddress);

//        Example example = new Example(UmsMemberReceiveAddress.class);
//        example.createCriteria().andEqualTo("memberId",memberId);
//        List<UmsMemberReceiveAddress> umsMemberReceiveAddresses = umsMemberReceiveAddressMapper.selectByExample(example);
//        //example与update一起用,更新的时候用,查询的时候不能用

        return umsMemberReceiveAddresses;
    }

这里是调用了我们基于通用mapper写好的mapper方法完成单表的查询:


import com.atguigu.gmall.bean.UmsMemberReceiveAddress;
import tk.mybatis.mapper.common.Mapper;
public interface UmsMemberReceiveAddressMapper extends Mapper<UmsMemberReceiveAddress> {
}

package com.atguigu.gmall.user.mapper;
import com.atguigu.gmall.bean.UmsMember;
import tk.mybatis.mapper.common.Mapper;
import java.util.List;

//通用Mapper
public interface UserMapper extends Mapper<UmsMember> {
}

整体的流程:

首先是web项目中的controller类获得前端界面的请求地址映射。
然后controller类里面定义的同名方法会返回api项目中的service接口中的返回结果。
service接口则是通过service项目中的impl方法进行实现。
impl方法会调用我们写好的基于通用mapper写的关于单表查询的方法。

– controller放在web中,impl和mapper放在service项目中,bean和service接口放在api中

user项目中

1、返回所有用户

 @Override
    public List<UmsMember> getAllUser() {
        List<UmsMember> userMemberList = userMapper.selectAll();
        return userMemberList;
    }

2、根据给定的memberId查询收件地址

使用映射做一个查询,查询哪个条件不为空,就封装成一个list对象,返回结果。
首先是new一个UmsMemberReceiveAddress()对象
然后使用bean类中的setMemberId方法将memberId这个id赋值给当前对象
然后通过通用mapper查询这个对象。
将当前这个memberid下的地址封装成一个list返回。

 @Override
    public List<UmsMemberReceiveAddress> getReceiveAddressByMemberId(String memberId) {
        // 封装的参数对象
        UmsMemberReceiveAddress umsMemberReceiveAddress = new UmsMemberReceiveAddress();
        umsMemberReceiveAddress.setMemberId(memberId);
        List<UmsMemberReceiveAddress> umsMemberReceiveAddresses = umsMemberReceiveAddressMapper.select(umsMemberReceiveAddress);   
        return umsMemberReceiveAddresses;
    }

manage项目中

1、分类查询

这里是查询三级分类的代码。
一级分类直接在pmsBaseCatalog1Mapper中selectall
		Mapper 封装PmsBaseCatalog1对象
		--public interface PmsBaseCatalog1Mapper extends Mapper<PmsBaseCatalog1> {}

二级分类是在给定一级分类idcatalog1Id的情况下进行查询
		同之前一样还是通过映射的形式进行查询
		先new一个二级分类对象
		然后将一级分类的id set进去
		然后查询非空的,返回封装成一个list

三级分类同二级分类查询
		给定一个二级分类id
@Service
public class CatalogServiceImpl implements CatalogService {
    @Autowired
    PmsBaseCatalog1Mapper pmsBaseCatalog1Mapper;

    @Autowired
    PmsBaseCatalog2Mapper pmsBaseCatalog2Mapper;

    @Autowired
    PmsBaseCatalog3Mapper pmsBaseCatalog3Mapper;


    @Override
    public List<PmsBaseCatalog1> getCatalog1() {
        return pmsBaseCatalog1Mapper.selectAll();
    }

    @Override
    public List<PmsBaseCatalog2> getCatalog2(String catalog1Id) {

        PmsBaseCatalog2 pmsBaseCatalog2 = new PmsBaseCatalog2();
        pmsBaseCatalog2.setCatalog1Id(catalog1Id);
        List<PmsBaseCatalog2> pmsBaseCatalog2s = pmsBaseCatalog2Mapper.select(pmsBaseCatalog2);
        return pmsBaseCatalog2s;
    }

    @Override
    public List<PmsBaseCatalog3> getCatalog3(String catalog2Id) {
        PmsBaseCatalog3 pmsBaseCatalog3 = new PmsBaseCatalog3();
        pmsBaseCatalog3.setCatalog2Id(catalog2Id);
        List<PmsBaseCatalog3> pmsBaseCatalog3s = pmsBaseCatalog3Mapper.select(pmsBaseCatalog3);
        return pmsBaseCatalog3s;
    }
}

2、平台属性的保存、查询、修改

@Service
public class AttrServiceImpl implements AttrService {

    @Autowired
    PmsBaseAttrInfoMapper pmsBaseAttrInfoMapper;
    @Autowired
    PmsBaseAttrValueMapper pmsBaseAttrValueMapper;
    @Autowired
    PmsBaseSaleAttrMapper pmsBaseSaleAttrMapper;

/*
*根据三级分类id查询属性列表:
*       首先是通过三级分类id查询属性pmsBaseAttrInfos
*
*       然后对每一个baseAttrInfo更新结果list
*       都是先set一个id,然后select这个id对应的属性
*       然后通过setAttrValueList方法设置对应的属性值
*
* */


    @Override
    public List<PmsBaseAttrInfo> attrInfoList(String catalog3Id) {

        PmsBaseAttrInfo pmsBaseAttrInfo = new PmsBaseAttrInfo();
        pmsBaseAttrInfo.setCatalog3Id(catalog3Id);
        List<PmsBaseAttrInfo> pmsBaseAttrInfos = pmsBaseAttrInfoMapper.select(pmsBaseAttrInfo);

        for (PmsBaseAttrInfo baseAttrInfo : pmsBaseAttrInfos) {
            List<PmsBaseAttrValue> pmsBaseAttrValues = new ArrayList<>();
            PmsBaseAttrValue pmsBaseAttrValue = new PmsBaseAttrValue();
            pmsBaseAttrValue.setAttrId(baseAttrInfo.getId());
            pmsBaseAttrValues = pmsBaseAttrValueMapper.select(pmsBaseAttrValue);
            baseAttrInfo.setAttrValueList(pmsBaseAttrValues);
        }

        return pmsBaseAttrInfos;
    }
/*保存属性信息
    先进行一个判断,使用getId方法查询当前属性的id
    如果为空是保存操作,如果非空说明已经存在,是修改操作

    保存---
            首先将属性保存进数据库,使用通用Mapper的insertSelective方法,将非空的数据加入数据库
            属性值是通过pmsBaseAttrInfo查询到一个属性值列表,然后通过foreach依次加入数据库

    修改---
            修改属性-- 新建一个example对象,然后比较二者的id,然后通用Mapper更新属性信息
            修改属性值列表--
                    同样还是new一个新的对象,设置为当前id,然后删除这个id对应的所有属性值
                    然后再foreach依次插入
*
* */
    @Override
    public String saveAttrInfo(PmsBaseAttrInfo pmsBaseAttrInfo) {

        String id = pmsBaseAttrInfo.getId();
        if(StringUtils.isBlank(id)){//如果id为空,则是保存操作

            //保存属性
            pmsBaseAttrInfoMapper.insertSelective(pmsBaseAttrInfo);//insertSelective表示是否将null,选择非null加入数据库


            //保存属性值
            List<PmsBaseAttrValue> attrValueList = pmsBaseAttrInfo.getAttrValueList();
            for (PmsBaseAttrValue pmsBaseAttrValue : attrValueList) {
                pmsBaseAttrValue.setAttrId(pmsBaseAttrInfo.getId());

                pmsBaseAttrValueMapper.insertSelective(pmsBaseAttrValue);

            }

        }else{//如果id不空,则是修改操作

            //修改属性
            Example example = new Example(PmsBaseAttrInfo.class);
            example.createCriteria().andEqualTo("id", pmsBaseAttrInfo.getId());
            pmsBaseAttrInfoMapper.updateByExampleSelective(pmsBaseAttrInfo, example);

            //修改属性值
            //按照属性id删除所有属性值
            PmsBaseAttrValue pmsBaseAttrValueDel = new PmsBaseAttrValue();
            pmsBaseAttrValueDel.setAttrId(pmsBaseAttrInfo.getId());//为属性值设置一个id
            pmsBaseAttrValueMapper.delete(pmsBaseAttrValueDel);//按照这个id删除所有属性值
            //删除后,将新的属性值循环插入
            List<PmsBaseAttrValue> attrValueList = pmsBaseAttrInfo.getAttrValueList();

            for (PmsBaseAttrValue pmsBaseAttrValue : attrValueList) {
                pmsBaseAttrValueMapper.insertSelective(pmsBaseAttrValue);
            }
        }
        return "success";
    }

//给定属性id,返回属性值列表。逻辑同之前一样,使用一个映射查询不为空的数据,并封装成一个list返回结果
    @Override
    public List<PmsBaseAttrValue> getAttrValueList(String attrId) {

        PmsBaseAttrValue pmsBaseAttrValue = new PmsBaseAttrValue();
        pmsBaseAttrValue.setAttrId(attrId);
        List<PmsBaseAttrValue> pmsBaseAttrValues = pmsBaseAttrValueMapper.select(pmsBaseAttrValue);
        return pmsBaseAttrValues;
    }

//查询平台属性列表 --直接调用通用MapperselectAll方法
    @Override
    public List<PmsBaseSaleAttr> baseSaleAttrList() {
        return pmsBaseSaleAttrMapper.selectAll();
    }

3、SPU管理

@Service
public class SpuServiceImpl implements SpuService {

    @Autowired
    PmsProductInfoMapper pmsProductInfoMapper;

    @Autowired
    PmsProductImageMapper pmsProductImageMapper;

    @Autowired
    PmsProductSaleAttrMapper pmsProductSaleAttrMapper;

    @Autowired
    PmsProductSaleAttrValueMapper pmsProductSaleAttrValueMapper;

/*      根据给定的三级分类ID
        通过之前相同的方法进行SpuList的查询
* */

    @Override
    public List<PmsProductInfo> spuList(String catalog3Id) {

        PmsProductInfo pmsProductInfo = new PmsProductInfo();
        pmsProductInfo.setCatalog3Id(catalog3Id);
        List<PmsProductInfo> pmsProductInfos = pmsProductInfoMapper.select(pmsProductInfo);

        return pmsProductInfos;
    }
    /*
            给定pmsProductInfo保存Spu信息
            首先通过通用Mapper保存pmsProductInfo进数据库
            然后get到商品的id

    * */
    @Override
    public void saveSpuInfo(PmsProductInfo pmsProductInfo) {

        // 保存商品信息
        pmsProductInfoMapper.insertSelective(pmsProductInfo);

        // 生成商品主键
        String productId = pmsProductInfo.getId();

        // 保存商品图片信息   -- 从给定的信息中get到图片列表,然后依次setid然后插入到数据库--通用Mapper完成
        List<PmsProductImage> spuImageList = pmsProductInfo.getSpuImageList();
        for (PmsProductImage pmsProductImage : spuImageList) {
            pmsProductImage.setProductId(productId);
            pmsProductImageMapper.insertSelective(pmsProductImage);
        }

        // 保存销售属性信息  --从给定信息中get到销售属性列表,分别往数据库中插入属性和属性值 setProductId--insertSelective
        List<PmsProductSaleAttr> spuSaleAttrList = pmsProductInfo.getSpuSaleAttrList();
        for (PmsProductSaleAttr pmsProductSaleAttr : spuSaleAttrList) {
            pmsProductSaleAttr.setProductId(productId);
            pmsProductSaleAttrMapper.insertSelective(pmsProductSaleAttr);

            // 保存销售属性值
            List<PmsProductSaleAttrValue> spuSaleAttrValueList = pmsProductSaleAttr.getSpuSaleAttrValueList();
            for (PmsProductSaleAttrValue pmsProductSaleAttrValue : spuSaleAttrValueList) {
                pmsProductSaleAttrValue.setProductId(productId);
                pmsProductSaleAttrValueMapper.insertSelective(pmsProductSaleAttrValue);
            }
        }

    }

    /**
     * 这里是获取spu数据库中的图片列表
     * 通过给定的spuId,返回id对应的图片
     * @param spuId
     * @return
     */

    @Override
    public List<PmsProductImage> spuImageList(String spuId) {
        PmsProductImage pmsProductImage = new PmsProductImage();
        pmsProductImage.setProductId(spuId);
        List<PmsProductImage> pmsProductImages = pmsProductImageMapper.select(pmsProductImage);

        return pmsProductImages;
    }

    /**
     * 通过给定的SpuId查询spu销售属性列表
     * 首先还是new一个销售属性对象,然后setID给这个对象,然后通过通用mapper查询为这个id的属性列表
     *
     * 对每一个销售属性查询对应的销售属性值
     * 同样先new一个PmsProductSaleAttrValue对象,然后给商品设置给定的id,给销售属性设置为当前属性的id
     * 然后select
     * 最后setSpuSaleAttrValueList
     *
     * 返回完成查询之后的销售属性列表
     *
     * @param spuId
     * @return
     */

    @Override
    public List<PmsProductSaleAttr> spuSaleAttrList(String spuId) {

        PmsProductSaleAttr pmsProductSaleAttr = new PmsProductSaleAttr();
        pmsProductSaleAttr.setProductId(spuId);
        List<PmsProductSaleAttr> PmsProductSaleAttrs = pmsProductSaleAttrMapper.select(pmsProductSaleAttr);

        for (PmsProductSaleAttr productSaleAttr : PmsProductSaleAttrs) {
            PmsProductSaleAttrValue pmsProductSaleAttrValue = new PmsProductSaleAttrValue();
            pmsProductSaleAttrValue.setProductId(spuId);
            pmsProductSaleAttrValue.setSaleAttrId(productSaleAttr.getSaleAttrId());// 销售属性id用的是系统的字典表中id,不是销售属性表的主键
            List<PmsProductSaleAttrValue> pmsProductSaleAttrValues = pmsProductSaleAttrValueMapper.select(pmsProductSaleAttrValue);
            productSaleAttr.setSpuSaleAttrValueList(pmsProductSaleAttrValues);
        }

        return PmsProductSaleAttrs;
    }

}

4、SKU信息插入


@Service
public class SkuServiceImpl implements SkuService {

    @Autowired
    PmsSkuInfoMapper pmsSkuInfoMapper;

    @Autowired
    PmsSkuAttrValueMapper pmsSkuAttrValueMapper;

    @Autowired
    PmsSkuSaleAttrValueMapper pmsSkuSaleAttrValueMapper;

    @Autowired
    PmsSkuImageMapper pmsSkuImageMapper;


    /**
     * 在相应的Spu信息这里添加保存Sku信息
     * 将skuinfo插入到数据库中
     *分别保存平台属性关联--销售属性关联-- sku的图片信息。
     *
     *
     * @param pmsSkuInfo
     */
    @Override
    public void saveSkuInfo(PmsSkuInfo pmsSkuInfo) {

        //插入skuInfo
        int i = pmsSkuInfoMapper.insertSelective(pmsSkuInfo); //定义一个i有点奇怪
        String skuId = pmsSkuInfo.getId();//这里要get一个skuId

        /**
         * 下面是同样的插入代码--保存sku信息
         * get
         * set
         * insertSelective
         *
         */

        //插入平台属性关联
        List<PmsSkuAttrValue> pmsSkuAttrValues = pmsSkuInfo.getSkuAttrValueList();
        for (PmsSkuAttrValue pmsSkuAttrValue : pmsSkuAttrValues) {
            pmsSkuAttrValue.setSkuId(skuId);
            pmsSkuAttrValueMapper.insertSelective(pmsSkuAttrValue);
        }


        //插入销售属性关联
        List<PmsSkuSaleAttrValue> skuSaleAttrValueList = pmsSkuInfo.getSkuSaleAttrValueList();
        for (PmsSkuSaleAttrValue pmsSkuSaleAttrValue : skuSaleAttrValueList) {
            pmsSkuSaleAttrValue.setSkuId(skuId);
            pmsSkuSaleAttrValueMapper.insertSelective(pmsSkuSaleAttrValue);
        }

        //插入图片信息
        List<PmsSkuImage> skuImageList = pmsSkuInfo.getSkuImageList();
        for (PmsSkuImage pmsSkuImage : skuImageList) {
            pmsSkuImage.setSkuId(skuId);
            pmsSkuImageMapper.insertSelective(pmsSkuImage);
        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值