【百战商城】学习笔记1.31_后端接口编写

96 阅读5分钟

接口9:添加商品

1、首先看给到的参数

![image-20230131143627689](D:\Program Files\pic\image-20230131143627689.png)

这些参数涉及到3个表 分别是:tb_item tb_item_desc tb_item_param_item

所以需要三个表一起操作,==一起完成或者一起失败==

按照理解是需要用三个参数接收参数,分别是 TbItem item 、TbItemDesc itemDesc 、 TbItemParamItem itemParamItem

(这里按照我的理解是,比如说用itemdesc接收,它就只会接收itemDesc,其他的就不管,然后再在后面新添缺少的属性值就可以,所以针对这一群参数,用三个对象就能==全部接收==,而且只接收自己有的属性值)

2、service层

public interface ItemService {
    BaizhanResult insertTbItem(TbItem item, TbItemDesc itemDesc, TbItemParamItem itemParamItem);
}

impl层

/**
     * 新增商品,本地事务。保证三张表格数据同时新增成功,同时新增失败。
     * @param item
     * @param itemDesc
     * @param itemParamItem
     * @return
     */
    @Override
    @Transactional(rollbackFor = {DaoException.class})
    public BaizhanResult insertTbItem(TbItem item, TbItemDesc itemDesc, TbItemParamItem itemParamItem) {
        try {
            // 完善所有要新增的数据的内容。
            Long itemId = IDUtils.genItemId();
            Date now = new Date();

            // 参数信息缺少 id 状态status 创建时间 更新时间
            item.setId(itemId);
            item.setStatus(1); // 数据库中表格数据的状态字段。 1-正常;2-下架;3-删除
            item.setCreated(now);
            item.setUpdated(now);

            // 参数信息缺少 itemid 创建时间 更新时间
            itemDesc.setItemId(itemId);
            itemDesc.setCreated(now);
            itemDesc.setUpdated(now);

            // 参数信息缺少 id itemid 创建时间 更新时间
            itemParamItem.setId(IDUtils.genItemId());
            itemParamItem.setItemId(itemId);
            itemParamItem.setCreated(now);
            itemParamItem.setUpdated(now);

            // 新增数据到数据库、
            // 新增商品
            int rows = itemMapper.insert(item);
            if (rows != 1) {
                throw new DaoException("新增商品 - 新增商品到数据库错误");
            }

            rows = itemDescMapper.insert(itemDesc);
            if (rows != 1) {
                throw new DaoException("新增商品 - 新增商品详情到数据库错误");
            }

            rows = itemParamItemMapper.insert(itemParamItem);
            if (rows != 1) {
                throw new DaoException("新增商品 - 新增商品规格到数据库错误");
            }
            // 只有三个都成功才成功
            return BaizhanResult.ok();
        }catch (DaoException e){
            // 手工抛出的异常
            throw e;
        }catch (Exception e){
            throw new DaoException("新增商品时发生错误:" + e.getMessage(), e);
        }
    }

注意:1、由于自定义异常是运行时异常,不需要写rollbackfor 如果是受检异常(继承Exception),必须写rollbackfor=“java.lang.Exception”

​ 2、前面注入三个表的mapper层,用于操作三个表

@Autowired
private TbItemMapper itemMapper;
@Autowired
private TbItemDescMapper itemDescMapper;
@Autowired
private TbItemParamItemMapper itemParamItemMapper;

控制层

/**
     * 新增商品
     * @param item 商品基本信息 tb_item
     * @param itemDesc 商品详情信息,图文介绍 tb_item_desc
     * @param itemParamItem 商品规格数据, tb_item_param_item
     * @return
     */
    @PostMapping("/backend/item/insertTbItem")
    public BaizhanResult insertTbItem(TbItem item, TbItemDesc itemDesc,
                                      TbItemParamItem itemParamItem){
        try {
            log.info("新增商品到数据库");
            return itemService.insertTbItem(item, itemDesc, itemParamItem);
        }catch (Exception e){
            log.error(e.getMessage());
            return BaizhanResult.error("服务器忙,请稍后重试");
        }
    }

接口10:删除商品

删除商品就是更改一下状态 status=3,以及更新 更新时间updatetime,用的是itemMapper.updateById

impl层

/**
     * 根据主键删除商品。标记删除。修改状态status=3
     * @param id
     * @return
     */
    @Override
    @Transactional(rollbackFor = {DaoException.class})
    public BaizhanResult deleteItemById(Long id) {
        try {
            TbItem item = itemMapper.selectById(id);
            // 设置要更新的数据
            item.setStatus(3); // 删除状态
            item.setUpdated(new Date()); // 更新时间
                int rows = itemMapper.updateById(item);
            if (rows != 1) {
                throw new DaoException("删除商品失败,id=" + id);
            }
            return BaizhanResult.ok();
        }catch (DaoException e){
            throw e;
        }catch (Exception e){
            throw new DaoException("删除商品错误," + e.getMessage(), e);
        }
    }

控制层

/**
     * 根据主键删除商品
     * @param id
     * @return
     */
    @PostMapping("/backend/item/deleteItemById")
    public BaizhanResult deleteItemById(Long id){
        try {
            log.info("删除商品:" + id);
            return itemService.deleteItemById(id);
        }catch (Exception e){
            log.error(e.getMessage());
            return BaizhanResult.error("服务器忙,请稍后重试");
        }
    }

注意:1、同样的,impl层接收参数也可以用item对象接

接口11:上架商品

更改状态

用id

impl层

/**
     * 商品上架,修改状态status=1
     * @param id
     * @return
     */
    @Override
    public BaizhanResult onshelfItemById(Long id) {
        try {
            TbItem item = itemMapper.selectById(id);
            // 设置要更新的数据
            item.setStatus(1); // 上架状态
            item.setUpdated(new Date()); // 更新时间
            int rows = itemMapper.updateById(item);
            if (rows != 1) {
                throw new DaoException("上架商品失败,id=" + id);
            }
            return BaizhanResult.ok();
        }catch (DaoException e){
            throw e;
        }catch (Exception e){
            throw new DaoException("上架商品错误," + e.getMessage(), e);
        }
    }   

控制层

/**
     * 商品上架
     * @param id 要上架的商品主键
     * @return
     */
    @PostMapping("/backend/item/onshelfItemById")
    public BaizhanResult onshelfItemById(Long id){
        try{
            log.info("商品上架,id = " + id);
            return itemService.onshelfItemById(id);
        }catch (Exception e){
            log.error(e.getMessage());
            return BaizhanResult.error("服务器忙,请稍后重试");
        }
    }

用对象接

impl层

/**
     * 商品上架,修改状态status=1
     * @param tbItem
     * @return
     */
    @Override
    public BaizhanResult onshelfItemById(TbItem tbItem) {
        try {
			// TbItem item = itemMapper.selectById(id);
            // 设置要更新的数据
            tbItem.setStatus(1); // 上架状态
            tbItem.setUpdated(new Date()); // 更新时间
            int rows = itemMapper.updateById(tbItem);
            if (rows != 1) {
                throw new DaoException("上架商品失败");
            }
            return BaizhanResult.ok();
        }catch (DaoException e){
            throw e;
        }catch (Exception e){
            throw new DaoException("上架商品错误," + e.getMessage(), e);
        }
    }

接口12:下架商品

impl层

@Override
    public BaizhanResult offshelfItemById(Long id) {
        try {
            TbItem item = itemMapper.selectById(id);
            // 设置要更新的数据
            item.setStatus(2); // 下架状态
            item.setUpdated(new Date()); // 更新时间
            int rows = itemMapper.updateById(item);
            if (rows != 1) {
                throw new DaoException("下架商品失败,id=" + id);
            }
            return BaizhanResult.ok();
        }catch (DaoException e){
            throw e;
        }catch (Exception e){
            throw new DaoException("下架商品错误," + e.getMessage(), e);
        }
    }

控制层

/**
     * 商品下架
     * @param id 要下架的商品主键
     * @return
     */
    @PostMapping("/backend/item/offshelfItemById")
    public BaizhanResult offshelfItemById(Long id){
        try{
            log.info("商品下架, id  = " + id);
            return itemService.offshelfItemById(id);
        }catch (Exception e){
            log.error(e.getMessage());
            return BaizhanResult.error("服务器忙,请稍后重试");
        }
    }

接口13:预更新商品

参数是 id,返回数据需要4个对象值

我的想法是:注入4个mapper,然后依次查item(判断是否存在)、itemcat、itemdesc、itemparmitem,最后返回键值对,键为名称,值为对象即可

需要注意的是返回map的时候,键名称一定要和接口文档中key相同,不能乱写,便于前端拿到数据进行映射

注入mapper

@Autowired
private TbItemMapper itemMapper;
@Autowired
private TbItemDescMapper itemDescMapper;
@Autowired
private TbItemParamItemMapper itemParamItemMapper;
@Autowired
private TbItemCatMapper itemCatMapper;

impl层

/**
     * 预更新商品
     * @param id 要更新的商品主键
     * @return
     */
    @Override
    public BaizhanResult preUpdateItem(Long id) {
        try {
            // 查询商品
            TbItem item = itemMapper.selectById(id);

            // 查询商品类型
            if (item == null) {
                throw new DaoException("预更新商品错误, 查询商品失败, id = " + id);
            }
            TbItemCat itemCat = itemCatMapper.selectById(item.getCid());

            // 查询商品详情
            TbItemDesc itemDesc = itemDescMapper.selectById(item.getId());

            // 查询商品规格
            QueryWrapper<TbItemParamItem> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("item_id", item.getId());
            TbItemParamItem itemParamItem = itemParamItemMapper.selectOne(queryWrapper);

            // 处理返回结果
            Map<String, Object> result = new HashMap<>();
            result.put("itemCat", itemCat);
            result.put("item", item);
            result.put("itemDesc", itemDesc);
            result.put("itemParamItem", itemParamItem);

            return BaizhanResult.ok(result);
        }catch (DaoException e){
            throw e;
        }catch (Exception e){
            throw new DaoException("预更新商品错误:" + e.getMessage(), e);
        }
    }

控制层

/**
     * 预更新处理,根据商品主键,查询商品相关数据。
     * @param id
     * @return
     */
    @PostMapping("/backend/item/preUpdateItem")
    public BaizhanResult preUpdateItem(Long id){
        try {
            log.info("预更新商品,id = " + id);
            return itemService.preUpdateItem(id);
        }catch (Exception e){
            log.error(e.getMessage());
            return BaizhanResult.error("服务器忙,请稍后重试");
        }
    }

接口14:修改(更新)商品信息

根据参数可知:需要操作三个表,所以用到三个mapper

@Autowired
private TbItemMapper itemMapper;
@Autowired
private TbItemDescMapper itemDescMapper;
@Autowired
private TbItemParamItemMapper itemParamItemMapper;

impl层

/**
     * 更新商品
     * @param item
     * @param itemDesc
     * @param itemParamItem
     * @return
     */
    @Override
    @Transactional(rollbackFor = {DaoException.class})
    public BaizhanResult updateTbItem(TbItem item, TbItemDesc itemDesc, TbItemParamItem itemParamItem) {
        try {
            // 完善要更新的商品的数据
            Date now = new Date(); // 当前时间,即更新时间。
            item.setUpdated(now);

            itemDesc.setItemId(item.getId()); // 商品主键即商品详情主键
            itemDesc.setUpdated(now); // 更新时间

            itemParamItem.setUpdated(now);
            itemParamItem.setItemId(item.getId());

            // 更新商品
            int rows = itemMapper.updateById(item);
            if (rows != 1) {
                throw new DaoException("更新商品 - 更新商品到数据库错误");
            }

            // 更新商品详情
            rows = itemDescMapper.updateById(itemDesc);
            if (rows != 1) {
                throw new DaoException("更新商品 - 更新商品详情到数据库错误");
            }

            // 更新商品规格,条件更新。当商品主键等于要更新的商品主键时,更新商品规格
            QueryWrapper<TbItemParamItem> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("item_id", item.getId());
            // 第一个参数是修改后的对象,第二个参数是修改的条件
            rows = itemParamItemMapper.update(itemParamItem, queryWrapper);
            if (rows != 1) {
                throw new DaoException("更新商品 - 更新商品规格到数据库错误");
            }

            return BaizhanResult.ok();
        }catch (DaoException e){
            throw e;
        }catch (Exception e){
            throw new DaoException("更新商品错误, " + e.getMessage(), e);
        }
    }

控制层

/**
     * 更新商品
     * mybatis-plus更新数据的时候,回判断,要更新的数据的属性是否是null或'0'.
     * 如果是,则忽略此字段的更新。如果不是,则更新字段新数据。
     * @param item 商品基本数据
     * @param itemDesc 商品详情
     * @param itemParamItem 商品规格
     * @return
     */
    @PostMapping("/backend/item/updateTbItem")
    public BaizhanResult updateTbItem(TbItem item, TbItemDesc itemDesc,
                                      TbItemParamItem itemParamItem){
        try {
            log.info("更新商品,id = " + item.getId());
            return itemService.updateTbItem(item, itemDesc, itemParamItem);
        }catch (Exception e){
            log.error(e.getMessage());
            return BaizhanResult.error("服务器忙,请稍后重试");
        }
    }

注意:1、所有 ==根据id== 进行查询、更新、删除操作时,都需要判断是否存在数据

2、itemParamItemMapper.update() 第一个参数是修改后的对象,第二个参数是修改的条件

3、搞清楚接收对象 ==已填充和待填充的属性==