瑞吉外卖订单后台和用户端功能

项目场景:

在编写瑞吉外卖的订单功能的时候,还是按照惯例,订单的一些功能是我们自己做,毕竟都看了一百多集视频了,自己应该能写一点东西了。

遇到的坑:

后台的订单列表功能,有一个输入订单号查询的功能,看到订单号,我就直接用Long类型接收,结果碰到了一个很离谱的事情。

我们都是用lambdaQueryWrapper去查询数据库的数据的,通过eq方法对比订单号查询订单,因为我是Long类型的订单号,所以我点击搜索的时候,我发现!最后两位数不管怎么输入都能查询到这个订单!很离谱!

例如我的订单号是:1656203934211780609

我输入:

16562039342117806 00 | 16562039342117806 01 | 1656203934211780622 | 16562039342117806 65

类似的订单号

全部能将 1656203934211780609 这个订单号的数据查询出来 ,也就是 16562039342117806XX ! 很离谱吧!

解决方案:

将Long类型的订单号toString或者直接用String类型接收订单号。

下面贴上我的代码!

 1、这一行代码我使用的是number对比的也就是订单号不是通过订单ID,因为我希望订单号和ID可以区分开来,不将订单ID直接暴露出来。

lambdaQueryWrapper.eq(Orders::getNumber,number);

2、lambdaQueryWrapper的between方法 适用于 时间范围查询

        //如果 开始时间 和 结束时间 都不为空if(beginTime != null && endTime != null){//SQL : where (orderTime BETWEEN beginTime AND endTime)//添加范围内查询条件 筛选出下单时间 大于等于 开始时间 小于等于 结束时间lambdaQueryWrapper.between(Orders::getOrderTime,beginTime,endTime);}

 

 

 

3、userPage方法在前端的个人中心页面的最新订单和历史订单页面做到了复用!很强!

 注意:    使用了 OrdersDto ,我也是写这个方法的时候看到资料中有这个dto的!哈哈!

(1)、最新订单将page参数和pageSize参数都设置为1,也就是只查询一条数据,且是最新的数据,所以使用orderByDesc方法通过订单时间降序排序  。         

                                                                      

lambdaQueryWrapper.orderByDesc(Orders::getOrderTime);

 

(2)、历史订单中 page 参数 为 1 ,pageSize为5,只查询近5条订单

我们还说通过上面的代码一样进行通过订单时间倒序排序

 

userPage我们还是使用 stream流map的遍历方法编写!

package com.itheima.reggie.controller;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.common.BaseContext;
import com.itheima.reggie.common.R;
import com.itheima.reggie.dto.OrdersDto;
import com.itheima.reggie.entity.OrderDetail;
import com.itheima.reggie.entity.Orders;
import com.itheima.reggie.service.OrderDetailService;
import com.itheima.reggie.service.OrdersService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;
import java.util.stream.Collectors;@Slf4j
@RestController
@RequestMapping("/order")
public class OrderController {@Autowiredprivate OrdersService ordersService;@Autowiredprivate OrderDetailService orderDetailService;/*** 用户下单* @param orders* @return*/@PostMapping("/submit")public R<String> submit(@RequestBody Orders orders) {log.info("订单数据:{}",orders);ordersService.submit(orders);return R.success("下单成功");}/*** 后台分页查询订单* @param page* @param pageSize* @param number* @param beginTime* @param endTime* @return*/@GetMapping("/page")public R<Page> page(int page, int pageSize, String number, String beginTime, String endTime) {//分页构造器Page<Orders> pageInfo = new Page<>(page, pageSize);//条件构造器LambdaQueryWrapper<Orders> lambdaQueryWrapper = new LambdaQueryWrapper<>();//添加排序条件,根据订单时间进行排序lambdaQueryWrapper.orderByDesc(Orders::getOrderTime);//打印订单号log.info("订单号:{}",number);//如果订单号不为空if(number != null){//添加订单号比较条件lambdaQueryWrapper.eq(Orders::getNumber,number);}//如果 开始时间 和 结束时间 都不为空if(beginTime != null && endTime != null){//SQL : where (orderTime BETWEEN beginTime AND endTime)//添加范围内查询条件 筛选出下单时间 大于等于 开始时间 小于等于 结束时间lambdaQueryWrapper.between(Orders::getOrderTime,beginTime,endTime);}//进行分页查询ordersService.page(pageInfo, lambdaQueryWrapper);return R.success(pageInfo);}/***  更改订单状态* @param orders* @return*/@PutMappingpublic R<String> status(@RequestBody Orders orders) {log.info(orders.toString());ordersService.updateById(orders);return R.success("派送成功");}/*** 用户订单* @param page* @param pageSize* @return*/@GetMapping("/userPage")public R<Page> userPage(int page , int pageSize) {//分页构造器Page<Orders> pageInfo = new Page<>(page,pageSize);Page<OrdersDto> ordersDtoPage = new Page<>();//SQL:select * from orders where user_id = ? order by order_time desc//条件构造器LambdaQueryWrapper<Orders> lambdaQueryWrapper = new LambdaQueryWrapper<>();//添加用户IDlambdaQueryWrapper.eq(Orders::getUserId, BaseContext.getCurrentId());//添加排序条件,根据订单时间进行倒序lambdaQueryWrapper.orderByDesc(Orders::getOrderTime);//进行分页查询ordersService.page(pageInfo,lambdaQueryWrapper);//对象拷贝 将pageInfo 拷贝 到 orderDtoPage 忽略 recordsBeanUtils.copyProperties(pageInfo,ordersDtoPage,"records");//获取pageInfo的recordsList<Orders> records = pageInfo.getRecords();//遍历recordsList<OrdersDto> list = records.stream().map((item) -> {OrdersDto ordersDto = new OrdersDto();//将 records的数据拷贝到 ordersDtoBeanUtils.copyProperties(item,ordersDto);//SQL:select * from order_detail where order_id = ?//条件构造器LambdaQueryWrapper<OrderDetail> queryWrapper = new LambdaQueryWrapper<>();//通过records里面的订单ID [number] 对比 订单明细表的order_id 查询订单明细queryWrapper.eq(OrderDetail::getOrderId,item.getNumber());//查询出订单明细信息 列表List<OrderDetail> orderDetail = orderDetailService.list(queryWrapper);ordersDto.setOrderDetails(orderDetail);return ordersDto;}).collect(Collectors.toList());ordersDtoPage.setRecords(list);return R.success(ordersDtoPage);}
}

 退出登录:

顺便将退出登录的代码贴出来!就是一个清除session的操作。

    /*** 退出登录* @param session* @return*/@PostMapping("/loginout")public R<String> loginout(HttpSession session) {session.removeAttribute("user");return R.success("退出登录成功");}

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

瑞吉外卖 —— 2、后台登录和登出

目录 1、后台登录功能 1.1、接口分析 1.1.2、登录校验逻辑 1.2、代码 1.2.1、统一的返回结果实体类 1.2.2、controller 方法 1.3、测试 2、后台退出功能 2.1、分析 2.2、代码 3、未登录访问首页跳转到登录页面 3.1、分析 3.2、代码 1、后台登录功能 1.1、接口分析…

外卖点餐APP-02(后台--员工管理)

&#xff08;一&#xff09;登录 实现思路&#xff1a; 接收到用户登录输入的用户名和密码&#xff0c;封装到了emp对象中对密码进行MD5加密创建条件构造器添加sql查询判断条件&#xff0c;emp对象中的Username等于Employee数据表中的Username调用MyBatis-Plus的方法查询数据库…

瑞吉外卖-移动端菜品展示功能,购物车添加菜品及修改等功能,用户下单功能及历史订单派送功能

整理记录下学习整个瑞吉外卖项目&#xff0c;详细代码可在我的Gitee仓库瑞吉外卖实战克隆下载学习使用&#xff01; 12.菜品展示 12.1 需求分析 12.2 更改前台页面使其正常显示 由于购物车功能还未进行开发&#xff0c;所以修改main.js中的cartListJson函数中访问固定数据&a…

外卖点餐APP-04(后台--菜品管理)

&#xff08;一&#xff09;新增 controller层思路&#xff1a; 调用service处理响应处理结果 PostMapping public R<String> save(RequestBody DishDto dishDto){dishService.saveWithFlavors(dishDto);return R.success("新增成功&#xff01;"); } servi…

瑞吉外卖:后台系统登录和退出功能

文章目录 需求分析代码开发创建实体类导入返回结果类Rcontroller、service与mapperlogin.html防止非法访问 需求分析 点击登录按钮后&#xff0c;浏览器以POST方式向employee/login提交username和password&#xff0c;服务器经过处理后向浏览器返回某种格式的数据&#xff0c;…

服装销售数据分析

目录&#xff1a; 一、项目背景介绍 二、数据源 三、分析流程 四、分析框架 五、知识点总结 一、项目背景介绍&#xff1a; 某服装经销商经营多个女装品牌&#xff0c;每个品牌设有线下店铺。该公司老板及销售总监需在每日营业结束后查看当日销售数据。以往主要由业务员手动整…

创建报价单或销售凭证,提示无定价确定过程能被确定,消息号V1212

创建报价单&#xff0c;提示无定价确定过程能被确定&#xff0c;消息号V1212。 解决方案&#xff1a; spro 》销售和分销——》基本功能——》定价——》定价控制——》定价并分配定价过程 1&#xff09;将凭证定价程序分配给订单类型 2&#xff09;设置定价程序确定&#xff0…

ChatGPT工作提效之layedit上传多附件的解决方案(layedit赋值、layui.js底层修改、追加模式多附件上传)

ChatGPT工作提效系列文章目录 ChatGPT工作提效之初探路径独孤九剑遇强则强ChatGPT工作提效之在程序开发中的巧劲和指令(创建MySQL语句、PHP语句、Javascript用法、python的交互)ChatGPT工作提效之生成开发需求和报价单并转为Excel格式ChatGPT工作提效之小鹅通二次开发批量API对…

Zia和ChatGPT如何协同工作?

有没有集成ChatGPT的CRM系统推荐&#xff1f;Zoho CRM已经正式与ChatGPT集成。下面我们将从使用场景、使用价值和使用范围等方面切入讲述CRMAI的应用和作用。 Zia和ChatGPT如何协同工作&#xff1f; Zia和ChatGPT是不同的人工智能模型&#xff0c;在CRM中呈现出共生的关系。 …

AIGC持续火爆大模型争相推出,庞大市场造就算力供应模式演变

本图由AI生成 文/王吉伟 近期的AIGC领域仍旧火爆异常。 但火的不只是AIGC应用&#xff0c;还有巨头之间的AI竞赛&#xff0c;以及接连不断上新的AI大模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;。 面对ChatGPT带来的技术冲击&#xff0c;为了研发谷歌多…

ChatGPT实现命名实体识别(NER, named entity recognization)和词性归类

语义分析词格分类 命名实体识别(NER, named entity recognization)和词性归类是 NLP 技术中的关键一环。过去 NLP 领域有不少流行的开源项目专注在这个领域&#xff0c;如 Spacy、NLTK 等等。我们来试试 ChatGPT 在这方面的表现情况如何。我们从"四渡赤水"的百度百科…

突发!两所知名大学,曝合并!校方紧急回应:校长将亲自说明!

点击上方“3D视觉工坊”&#xff0c;选择“星标” 干货第一时间送达 来源丨联合新闻网 编辑丨3D视觉工坊 点击进入—>3D视觉工坊学习交流群 我国台湾又有“国立”大学传出合并的消息&#xff0c;台湾中山大学与台湾高雄大学传将重启合并协商&#xff0c;有网友曝光中山大学发…

从 Uber 数据泄露事件我们可以学到什么?

Uber 数据泄露始于一名黑客从暗网市场购买属于一名 Uber 员工的被盗凭证。最初尝试使用这些凭据连接到 Uber 的网络失败&#xff0c;因为该帐户受 MFA 保护。为了克服这一安全障碍&#xff0c;黑客通过 What’s App 联系了 Uber 员工&#xff0c;并假装是 Uber 的安全人员&…

点击率预估

点击率预估是广告技术的核心算法之一&#xff0c;它是很多广告算法工程师喜爱的战场。一直想介绍一下点击率预估&#xff0c;但是涉及公式和模型理论太多&#xff0c;怕说不清楚&#xff0c;读者也不明白。所以&#xff0c;这段时间花了一些时间整理点击率预估的知识&#xff0…

老鸟教你如何精确评估开发时间

一个程序员能否精确评估开发时间&#xff0c;是一件非常重要的事情。如果你掌握了这项技能&#xff0c;你在别人的眼里就会是这样&#xff1a; 靠谱经验十足对需求很了解延期风险小合格的软件工程师正规军&#xff0c;不是野路子 评估开发时间的重要性 首先&#xff0c;在一…

从FM推演各深度CTR预估模型(附代码)

作者&#xff1a; 龙心尘 && 寒小阳 时间&#xff1a;2018年7月 出处&#xff1a;https://blog.csdn.net/longxinchen_ml/article/details/81031736 https://blog.csdn.net/han_xiaoyang/article/details/81031961 声明&#xff1a;版权所有&#xff0c;转载请联系作者…

[项目管理] 如何评估工作量

1.1. 工作量估算的定义 工作量估算 即对开发软件产品所需的人力和时间的估算——人力成本是一个项目的主要成本。 我们可以根据预估的工作量决定具体由几个人、哪几个人参与该项目。 工作量通常以 人/天、人/月、人/年 的形式来衡量。 1.2. 为什么要进行工作量估算 做好工…

机器学习实战 | 综合项目-电商销量预估

作者&#xff1a;韩信子ShowMeAI 教程地址&#xff1a;https://www.showmeai.tech/tutorials/41 本文地址&#xff1a;https://www.showmeai.tech/article-detail/206 声明&#xff1a;版权所有&#xff0c;转载请联系平台与作者并注明出处 收藏ShowMeAI查看更多精彩内容 1.案例…

Python:实现进度条和时间预估

一、前言 在python当中可以用进度条来显示工作的进度&#xff0c;比如for循环的进度或者一些模型训练的进度。 在这里可以使用progressbar包以及tqdm包来实现。 使用pip install progressbar 安装progressbar包。 使用pip install tqdm安装tqdm包。 二、代码 1. progress…

如何科学预估开发时间

0. 我是前言 一个开发人员能否精确评估开发时间&#xff0c;是一件非常重要的事情。如果你掌握了这项技能&#xff0c;你在别人的眼里就会是这样&#xff1a; 1. 评估开发时间的重要性 首先&#xff0c;在一个项目中&#xff0c;所有的环节都是承上启下的&#xff0c;不管你是…