外卖项目06---套餐管理业务开发(移动端的后台代码编辑开发)

news2024/9/22 5:29:59

菜品展示、购物车、下单

目录

一、导入用户地址簿相关功能代码 90

1.1需求分析 90

1.2数据模型 90

1.3导入功能代码 90

二、菜品展示 91

2.1需求分析 91

2.2商品展示---代码开发---梳理交互过程 92

2.3菜品展示---代码开发---修改DishController的list方法并测试 93

2.4菜品展示---代码开发---创建SetmealController的list方法并测试 94

三、购物车 95

3.1需求分析 95

3.2数据模型 95

3.3代码开发---梳理交互过程 95

3.4代码开发---准备工作 95

3.5购物车---代码开发---添加购物车 96 

3.6购物车---代码开发---查看购物车&清空购物车 97

四、用户下单 98

4.1需求分析 98

4.2数据模型 98

4.3用户下单---代码开发---梳理交互过程&准备工作 99

​编辑

4.4用户下单---准备工作 99 

​编辑

4.5用户下单---代码开发 100 

4.6用户下单---代码开发(在OrderServiceImpl驱动类实现层实现submit方法实现)101

4.7用户下的那---代码开发(向订单表中进行数据的单条插入,订单明细多条数据插入,清空购物车数据)102


一、导入用户地址簿相关功能代码 90

1.1需求分析 90

1.2数据模型 90

1.3导入功能代码 90

二、菜品展示 91

2.1需求分析 91

2.2商品展示---代码开发---梳理交互过程 92

两个需求分析: 

在客户端请求数据的展示:

前端部分的功能展示:和上面的两次list对应的关系 

前端设置的是,这两部分同时正确的前提下,才能够在前端页面渲染成功。

目前的情况是:请求购物车的加载失败,所以这条渲染才没能够成功。

修改购物车请求的内容:

进行修改后:如果界面没有显示,可以使用ctrl+f5,进行刷新浏览器的缓存

2.3菜品展示---代码开发---修改DishController的list方法并测试 93

本部分功能主要实现的是,在移动端的界面能够进行点击“选择规格”后,会弹出口味的信息

本部分代码的实现,采用的就是之前展示菜品还要展示菜品对应的名称,这种类型的代码形式。

 本部分代码实现:

    /**
     * 根据条件查询对应的菜品数据
     * @param dish
     * @return
     */
    @GetMapping("/list")
    public R<List<DishDto>> list(Dish dish){//这个部分传递的参数,可以是Long categoryid,
                                        // 但是可以将其进行扩展使用,使用Dish类中的参数,它包含了很多的参数信息,包含categoryid
        //构造查询条件
        LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(dish.getCategoryId() != null , Dish::getCategoryId,dish.getCategoryId());
                                                            //该部分是设置一个判断语句,确定id传递过来,并不是空的指针
        //添加排序条件
        queryWrapper.orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime);
                                        //使用了两个判断条件,一个是根据sort进行升序排序,如果sort排序一致,再根据更新时间进行降序判断
        //添加条件,查询状态为1(起售状态)的菜品
        queryWrapper.eq(Dish::getStatus,1);
        List<Dish> list = dishService.list(queryWrapper);//使用该方法,获取得到了一个集合

        List<DishDto> dishDtoList = list.stream().map((item)->{
            DishDto dishDto = new DishDto();
            BeanUtils.copyProperties(item,dishDto);

            Long categoryId = item.getCategoryId();//分类id
            //根据id查询分类对象
            Category category = categoryService.getById(categoryId);

            if(category != null){
                String categoryName = category.getName();
                dishDto.setCategoryName(categoryName);
            }
            //当前菜品的id
            Long dishId = item.getId();
            //实现SQL语句:select * from dish_flavor where dish_id = ?
            LambdaQueryWrapper<DishFlavor> lambdaQueryWrapper = new LambdaQueryWrapper<>();
            lambdaQueryWrapper.eq(DishFlavor::getDishId,dishId);

            List<DishFlavor> dishFlavorList = dishFlavorService.list(lambdaQueryWrapper);
            dishDto.setFlavors(dishFlavorList);//将上面查询得到的结果设置到dishDto中
            return dishDto;//将处理后的数据结果返回出去
        }).collect(Collectors.toList());
        return R.success(dishDtoList);
    }

2.4菜品展示---代码开发---创建SetmealController的list方法并测试 94

本部分需要解决的问题:套餐点击后出现接口异常。

        对应的请求路径信息如下所示:但是之前程序代码编写的过程中并没有该该部分,所以需要进行编写该部分的代码。需要在setmealController中创建list方法。

        本部分实际上就是通过IDEA编写代码,能够从数据库内根据自己需要的条件信息,来判断,获取得到对应的数据信息,进行反馈给移动端。

本部分实现的效果:

 本部分的代码:在setmealController中添加list方法

    /**
     *根据条件查询套餐数据
     * @param setmeal
     * @return
     */
    @GetMapping("/list")
    public R<List<Setmeal>> list(Setmeal setmeal){
        //SQL 筛选判断,两个等值判断+一个根据更新时间顺序进行降序排列
        LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(setmeal.getCategoryId() != null,Setmeal::getCategoryId,setmeal.getCategoryId());
        queryWrapper.eq(setmeal.getStatus() != null,Setmeal::getStatus,setmeal.getStatus());

        List<Setmeal> list = setmealService.list(queryWrapper);


        return R.success(list);
    }

三、购物车 95

3.1需求分析 95

将菜品或者菜品套餐添加到购物车,都是使用的同一个模型 

注:一共有三个需求进行填写 

3.2数据模型 95

3.3代码开发---梳理交互过程 95

3.4代码开发---准备工作 95

3.5购物车---代码开发---添加购物车 96 

效果实现:实现商品添加购物车添加成功的功能

 发送请求时,会有如下的操作指示:

实现效果:

1、菜品能够直接添加,并且能够在购物车内进行数量的增加

2、套餐的添加

本部分代码如下所示:

    /**
     * 添加购物车
     * @param shoppingCart
     * @return
     */
    @PostMapping("/add")
    public R<ShoppingCart> add(@RequestBody ShoppingCart shoppingCart){
        log.info("购物车数据:{}",shoppingCart);

        //设置用户id,指定当前是哪个用户的购物车数据
        Long currentId = BaseContext.getCurrentId();
        shoppingCart.setUserId(currentId);

        Long dishId = shoppingCart.getDishId();

        LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ShoppingCart::getUserId,currentId);

        if(dishId != null){
            //添加到购物车的是菜品
            queryWrapper.eq(ShoppingCart::getDishId,dishId);

        }else{
            //添加到购物车的是套餐
            queryWrapper.eq(ShoppingCart::getSetmealId,shoppingCart.getSetmealId());
        }

        //查询当前菜品或者套餐是否在购物车中
        //SQL:select * from shopping_cart where user_id = ? and dish_id/setmeal_id = ?
        ShoppingCart cartServiceOne = shoppingCartService.getOne(queryWrapper);

        if(cartServiceOne != null){
            //如果已经存在,就在原来数量基础上加一
            Integer number = cartServiceOne.getNumber();
            cartServiceOne.setNumber(number + 1);
            shoppingCartService.updateById(cartServiceOne);
        }else{
            //如果不存在,则添加到购物车,数量默认就是一
            shoppingCart.setNumber(1);
            shoppingCart.setCreateTime(LocalDateTime.now());
            shoppingCartService.save(shoppingCart);
            cartServiceOne = shoppingCart;
        }

        return R.success(cartServiceOne);
    }

3.6购物车---代码开发---查看购物车&清空购物车 97

不同的用户,拥有相互隔离的数据信息,之间不会进行干扰。

本部分实现的效果:在购物车进行查看,添加数量,并且能够看到对应的钱数发生改变。

本部分代码:

    /**
     * 查看购物车
     * @return
     */
    @GetMapping("/list")
    public R<List<ShoppingCart>> list(){
        log.info("查看购物车...");

        LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ShoppingCart::getUserId,BaseContext.getCurrentId());//查询条件判断
        queryWrapper.orderByAsc(ShoppingCart::getCreateTime);//根据时间进行降序排序

        List<ShoppingCart> list = shoppingCartService.list(queryWrapper);

        return R.success(list);
    }

本部分实现在购物车部分对菜品的数量进行删减

本部分的代码如下所示:

    /**
     * 清空购物车
     * @return
     */
    @DeleteMapping("/clean")
    public R<String> clean(){
        //SQL: delete from shopping_cart where user_id = ?
        LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ShoppingCart::getUserId,BaseContext.getCurrentId());
        
        shoppingCartService.remove(queryWrapper);
        
        return R.success("清空购物车成功");
    }

四、用户下单 98

4.1需求分析 98

实现用户的结账支付。

4.2数据模型 98

 

4.3用户下单---代码开发---梳理交互过程&准备工作 99

移动端处理后的点击“去支付” 功能后发送的请求信息内容。

4.4用户下单---准备工作 99 

4.5用户下单---代码开发 100 

点击“去支付”之后,请求相应的内容如下所示:

如果数据处理过程中,处理的比较复杂,可以在驱动实现的Service服务层进行数据的方法的创建,随后再对应的驱动实现类进行使用。最终在对应的Controller层进行调用使用。

本部分主要

步骤一:实现简单在OrderController层方法搭建submit提交的框架:并调用后面两个步骤的内容的调用。

@Slf4j
@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private OrderService orderService;


    /**
     * 用户下单
     * @param orders
     * @return
     */
    @PostMapping("/submit")
    public R<String> submit(@RequestBody Orders orders){
        log.info("订单数据:{}",orders);
        orderService.submit(orders);
        return R.success("下单成功");
    }
}

步骤二:

由于操作复杂在service层的接口层进行创建一个新的submit方法

public interface OrderService extends IService<Orders> {

    /**
     * 用户下单
     * @param orders
     */
    public void submit(Orders orders);
}

步骤三:在OrderServiceImpl驱动类实现层进行方法的编写。

4.6用户下单---代码开发(在OrderServiceImpl驱动类实现层实现submit方法实现)101

注本部分是要实现对多个表进行操作处理,需要使用处理多个数据库,即启动AOP事务的运行,所以使用注解@Transactional

实现前面的内容,只有下面的这些内容没有实现

4.7用户下的那---代码开发(向订单表中进行数据的单条插入,订单明细多条数据插入,清空购物车数据)102

1、订单表中数据单条插入

向表中插入数据则需要插入所插入表中的所有数据内容属性,进行编辑设置。

所有在请求中没有反馈的数据,需要在程序代码中进行插入设置。

 代码实现:

@Service
@Slf4j
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Orders> implements OrderService {

    @Autowired
    private ShoppingCartService shoppingCartService;

    @Autowired
    private UserService userService;

    @Autowired
    private AddressBookService addressBookService;

    @Autowired
    private OrderDetailService orderDetailService;

    /**
     * 用户下单
     * @param orders
     */
    @Transactional
    public void submit(Orders orders) {
        //获得当前用户id
        Long userId = BaseContext.getCurrentId();

        //查询当前用户的购物车数据
        LambdaQueryWrapper<ShoppingCart> wrapper = new LambdaQueryWrapper<>();//SQL:查询内容
        wrapper.eq(ShoppingCart::getUserId,userId);
        List<ShoppingCart> shoppingCarts = shoppingCartService.list(wrapper);

        if(shoppingCarts == null || shoppingCarts.size() == 0){//进行异常的报错,当购物车的中没有物品时
            throw new CustomException("购物车为空,不能下单");
        }

        //查询用户数据
        User user = userService.getById(userId);

        //查询地址数据
        Long addressBookId = orders.getAddressBookId();
        AddressBook addressBook = addressBookService.getById(addressBookId);
        if(addressBook == null){
            throw new CustomException("用户地址信息有误,不能下单");
        }

        long orderId = IdWorker.getId();//订单号

        AtomicInteger amount = new AtomicInteger(0); //使用amount来作为购物车计算金额的计算,进行累加的处理
                                                        // 使用原子类型的,保证高并发、多线程时候使用的安全

        //该部分是实现多条数据保存的操作处理,设置为集合List
        List<OrderDetail> orderDetails = shoppingCarts.stream().map((item) -> {
            OrderDetail orderDetail = new OrderDetail();
            orderDetail.setOrderId(orderId);
            orderDetail.setNumber(item.getNumber());
            orderDetail.setDishFlavor(item.getDishFlavor());
            orderDetail.setDishId(item.getDishId());
            orderDetail.setSetmealId(item.getSetmealId());
            orderDetail.setName(item.getName());
            orderDetail.setImage(item.getImage());
            orderDetail.setAmount(item.getAmount());
            amount.addAndGet(item.getAmount().multiply(new BigDecimal(item.getNumber())).intValue());//菜品或者套餐的总金额
            return orderDetail;
        }).collect(Collectors.toList());


        //下面是将Orders类中的属性数据信息进行填充,例如:id、number等等
        orders.setId(orderId);
        orders.setOrderTime(LocalDateTime.now());
        orders.setCheckoutTime(LocalDateTime.now());
        orders.setStatus(2);
        orders.setAmount(new BigDecimal(amount.get()));//总金额
        orders.setUserId(userId);
        orders.setNumber(String.valueOf(orderId));
        orders.setUserName(user.getName());
        orders.setConsignee(addressBook.getConsignee());
        orders.setPhone(addressBook.getPhone());
        orders.setAddress((addressBook.getProvinceName() == null ? "" : addressBook.getProvinceName())
                + (addressBook.getCityName() == null ? "" : addressBook.getCityName())
                + (addressBook.getDistrictName() == null ? "" : addressBook.getDistrictName())
                + (addressBook.getDetail() == null ? "" : addressBook.getDetail()));
        //向订单表插入数据,一条数据
        this.save(orders);

        //向订单明细表插入数据,多条数据
        orderDetailService.saveBatch(orderDetails);

        //清空购物车数据
        shoppingCartService.remove(wrapper);
    }
}

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

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

相关文章

OpenGL原理与实践——核心模式(二):Shader变量、Shader类的封装以及EBO

目录 Shader内的一些关键字 向量 举例&#xff1a;shader之间的数据传输&#xff0c;并实现渐变颜色 举例&#xff1a;C向shader传输数据的过程 代码整理——shader类的封装 加入颜色信息 索引绘制——EBO 整体代码以及渲染结果 Shader内的一些关键字 in&#xff1a;上…

网站被劫持勒索怎么办

互联网出现后的几十年时间里&#xff0c;世界便由一张张网串联了起来&#xff0c;给我们的生活带来了无限的便利。但在互联网飞速发展的同时&#xff0c;恶意网络攻击也随之而来&#xff0c;近年来&#xff0c;互联网攻击事件频发&#xff0c;不法分子利用常见的DDoS攻击、CC攻…

【生成式网络】入门篇(二):GAN的 代码和结果记录

GAN非常经典&#xff0c;我就不介绍具体原理了&#xff0c;直接上代码。 感兴趣的可以阅读&#xff0c;里面有更多变体。 https://github.com/rasbt/deeplearning-models/tree/master/pytorch_ipynb/gan GAN 在 MINIST上的代码和效果 import os # os.chdir(os.path.dirname(_…

springBoot集成websocket实现消息实时推送提醒

在浏览某些网页的时候&#xff0c;例如 WebQQ、京东在线客服服务、CSDN私信消息等类似的情况下&#xff0c;我们可以在网页上进行在线聊天&#xff0c;或者即时消息的收取与回复&#xff0c;可见&#xff0c;这种功能的需求由来已久&#xff0c;并且应用广泛,和pc端web系统待办…

新建anaconda使用jupyter出现的一系列问题

1&#xff0c;运行一段机器学习代码&#xff0c;报缺少h5py的错误. 使用conda install h5py1.8.0 安装无法安装&#xff0c;因为当前环境的python版本是3.9&#xff0c;只能用3.7及以下的版本。无奈只能新建一个conda 环境。 2&#xff0c;新建一个 python3.7的conda 环境。运行…

「风控算法服务平台」高性能在线推理服务设计与实现

本文作者&#xff1a;郁昌存 来自京东科技-风险管理中心 一、背景/目标 1&#xff09; 风控智能化体系建设依赖大量深度学习/机器学习模型进行实时在线的风险识别、智能决策。要求可以将算法模型快速部署为在线服务&#xff0c;供决策引擎调用。 2&#xff09; 风控决策引擎…

文献 | 教师主观幸福感变迁:横断历史研究的视角

Hello&#xff0c;大家好&#xff01; 这里是壹脑云科研圈&#xff0c;我是莹~ 疫情带来的社会经济变化正在改变着我们的求职意向&#xff0c;越来越多的人参与到考公考编的大军中。其中&#xff0c;教师这一职业的稳定性和社会认同度吸引了越来越多的年轻人参加教资考试。 教…

Linux Top 详细介绍,包含task排序

Linux Top 当我们在终端输入 top 命令时&#xff0c;会弹出一个变化的页面&#xff0c;打印出当前系统的大量重要指标&#xff0c;以及很多进程当前的运行情况&#xff1a; 可以看到&#xff0c;top 命令主要是两部分&#xff0c;第一部分为 头部指标&#xff0c;打印的是当…

磨金石教育摄影技能干货分享|那些酷炫的照片是怎么拍出来的?

在网上我们经常会看到一些非常有创意&#xff0c;非常炫酷的照片。喜欢摄影的朋友肯定会想&#xff0c;这样的照片怎么拍呢&#xff1f;由于照片的创意度很高&#xff0c;导致很多人想模仿却不知道怎么模仿。以前学的那些构图、选景等技巧&#xff0c;好像不太够用。 今天我们…

2022年文化艺术品产权交易所研究报告

第一章 文化艺术品产权交易所发展概述 1.1 文交所概念 文化产权交易所&#xff08;简称“文交所”&#xff09;从事文化产权交易及相关投融资服务工作&#xff0c;促进文化产业要素跨行业、跨地域、跨所有制流动。文交所从事的创新业务主要是文化艺术品的份额化&#xff0c;即…

idea 配置ssm项目后配置文件的简要解析及功能类之间的联系

注&#xff1a;本文不包含怎么配置 idea ssm 项目&#xff0c;仅做个人向配置好之后&#xff0c;对于各个文件的分析及跳转之间的的浅解析&#xff08;之前照着配的文章找不到了qwq&#xff09;。 叠甲&#xff1a;新手&#xff0c;刚学&#xff0c;不太会&#xff0c;如有错请…

初识Python_数据容器_字符串str

一、再识字符串字符串---字符的容器。一个字符串可以存放任意数量的字符1、字符串的下标&#xff08;索引&#xff09;和其他容器如&#xff1a;列表、元组一样&#xff0c;字符串也可以通过下标进行访问从前向后 下标从0开始从后向前&#xff0c;下标从-1开始同元组一样&#…

11个精美网页——Web前端开发技术课程大作业,期末考试,Dreamweaver简单网页制作

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 精彩专栏推荐&#x1f4…

罗茨气体流量计的结构设计

目 录 摘 要 I ABSTRACT II 1绪 论 1 1.1 引言 1 1.2 罗茨气体流量计的特点 1 1.&#xff13;罗茨气体流量计的应用场合[3] 2 1.4 发展前景[5] 6 2罗茨气体流量计的工作及结构原理 7 2.1 罗茨气体流量计的工作原理[3] 7 2.2罗茨气体流量计的结构原理 7 2.2.1 罗茨气体流量计的结…

echarts——实现3D地图+3D柱状图 效果——粗糙代码记录——技能提升

最近看到同事在弄下面的这个图&#xff0c;这个图是从网上看到的&#xff0c;是某个网站的收费项目&#xff1a; 收费模板&#xff1a;&#xffe5;29.9元购买&#xff0c;且必须是高级版尊享版才能够购买这个。。。 死贵&#xff01;&#xff01;&#xff01; 所以&#xf…

多臂PEG衍生物——8-Arm PEG-N3,8-Arm PEG-Azide,八臂-PEG-叠氮

多臂PEG衍生物八臂-聚乙二醇-叠氮&#xff0c;化学试剂其英文名为8-Arm PEG-Azide&#xff0c;8-Arm PEG-N3&#xff0c;它所属分类为Azide PEG Multi-arm PEGs。 八臂PEG叠氮的分子量均可定制&#xff0c;有&#xff1a;八臂-peg 5k-叠氮、八臂PEG 2k叠氮、叠氮-聚乙二醇 10k…

19 06-读取DTC扩展数据记录

诊断协议那些事儿 诊断协议那些事儿专栏系列文章&#xff0c;19服务作为UDS中子功能最多的服务&#xff0c;一共有28种子功能&#xff0c;本文将介绍常用的19 06服务&#xff1a;读取DTC扩展数据。 关联文章&#xff1a; 19服务List 19 01-通过状态掩码读取DTC数目 19 02-检…

PL/Java的安装及使用

安装步骤 1.1 下载相应扩展包 https://network.pivotal.io/products/vmware-tanzu-greenplum#/releases/1193700 1.2 上传并安装pljava-2.0.4-gp6-rhel7_x86_64.gppkg [gpadmingp_master ~]$ gppkg -i pljava-2.0.4-gp6-rhel7_x86_64.gppkg 重启数据库 [gpadmingp_master ~]$…

企业管理中,商业智能BI主要做哪些事情?

开门见山的告诉大家&#xff0c;在企业管理中商业智能BI 主要就做三件事&#xff1a;拉通数据、整合数据、数据可视化展现。 技术角度的商业智能BI 从技术的角度来讲&#xff0c;商业智能BI是一套完整的由数据仓库、查询报表、数据分析等组成的数据类技术解决方案。它有一个非…

【计算机毕业设计】23.图书馆管理系统源码

一、系统截图&#xff08;需要演示视频可以私聊&#xff09; 1 绪论 1.1 开发背景 图书馆管理系统的特点是从图书管理的角度出发&#xff0c;用集中的数据库将几乎所有与图书相关的数据统一管理起来&#xff0c;形成了集成的信息源。有好的用户界面&#xff0c;强有力的报表生…