
《苍穹外卖》项目学习记录
文章平均质量分 61
记录学习苍穹外卖项目的所学知识。
蝴蝶不愿意
这个平台把我写的一些文章私自改成VIP,我不在这里写了,换成GitHub了。
展开
-
《苍穹外卖》项目学习记录-Swagger
注意:1.要设置静态资源映射,如果不设置我们再来请求doc.html的时候spring mvc这个框架它并不认为我们请求的是一个静态资源,它以为我们请求的是某个control,也就是说它并不认为这是一个静态的页面,它认为这是一个动态的请求,它请求到control里去我们没有这个control所以页面报了404。使用Swagger只需要按照它的规范去定义接口及相关接口的信息,就可以做到生成接口文档,以及在线接口调试页面。这个项目的Tomcat端口是8080所以接口文档的访问网址是。* 设置静态资源映射。原创 2025-01-21 18:29:28 · 479 阅读 · 0 评论 -
《苍穹外卖》项目学习记录 Day2-新增员工
在Web应用中,每个请求通常都会被分配到不同线程处理,ThreadLocal可以用来存储当前请求的上下文信息,比如用户ID、请求时间等,这些信息可以在同一个请求处理过程中多次使用,特别是一个请求嵌套调用很多方法的时候可以使用,但是不同请求之间是互相独立的。如果你创建了一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个本地拷贝,多个线程操作这个变量的时候,实际操作自己本地内存里面的变量,从而起到线程隔离的作用,避免了线程安全问题。),用JSON格式的数据提交这些表单项。原创 2025-01-22 17:44:03 · 831 阅读 · 0 评论 -
《苍穹外卖》项目学习记录Day2-员工分页查询
把每页的页码和每页的记录数传给分页插件开始进行分页,这个插件它是基于mybatis的拦截器来实现,也就是它会把我们后边的一条sql语句进行一个动态的拼接,它会动态的把这个limit关键字给我们拼进去,并且把limit后面两个参数动态的去计算,我们把每页的页码和每页的记录数传给它了,它会动态的去算,给我们拼进后边那条sql语句当中,最终实现了分页查询。GET请求不会修改服务器上的资源,主要用于查询操作)。我们需要把页码和每一页的记录数提交过去,可以根据员工的姓名来查询,所以姓名也是一个查询的参数。原创 2025-01-23 01:44:14 · 635 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day2启用禁用员工账号
这里我们可以省略也可以写它的别名也就是Employee,因为我们在配置文件里面整体扫描了com.sky.entity这个包,而我们这个实体类Employee是在这个包里面,那我们就统一扫描到为所有的实体类创建别名,所以我们可以在这里写别名而不用完整的去写整个类名。为了修改的通用性,我们建议把这个update语句写成一个动态的,也就是说我不只是修改这个status,我根据传进来参数的不同可以修改多个字段,这时候传递status和id就不合适,我们应该传递一个实体类(Employee)。原创 2025-01-23 11:50:47 · 292 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day2编辑员工
因为我们的update方法需要传入的参数是Employee,所以要对它进行对象属性拷贝转成一个Employee对象。因为是修改操作,所以要设置修改时间和修改人的id。我们这里可以看到它需要根据员工的id进行页面回显,所以对它进行修改第一步需要先根据id来查,这对应一个接口,然后在这个表单页面来进行信息的修改,修改完后点击保存按钮,最后真正去修改到我们的数据库,这就是第二个接口。编辑员工的信息是一个修改类的操作所以我们这里用PUT请求(PUT:用于替换目标资源的所有当前表示。·根据id查询员工信息。原创 2025-01-23 15:06:55 · 223 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day3公共字段自动填充
思路:首先我们先获得被拦截的方法上的注解,得到数据库的操作类型是insert操作还是update操作,然后获取被拦截方法的所有参数(这里我们防止出现空指针异常做了处理,判断是否有参数,没有参数说明不需要对其进行公共字段填充直接return返回),根据下标(0)获取实体对象,准备需要赋值的数据,先判断数据库操作类型,对这个实体对象进行反射处理获得它的set方法,为相应的公共字段进行填充处理。我们做了一个约定把实体对象作为第一个参数,我们接下来要获取就获取第一个就可以了。原创 2025-01-23 17:56:30 · 578 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day3新增菜品
把这个集合对象传进去由动态sql进行批量插入,我们在这个地方插入的时候也需要把dish_id也给它插进去,而我们当前传过来的这个数据这里面没有dish_id,前端不能把这个dish_id传过来,因为当前是新增菜品,这个菜品还没有添加完,那它这个dish_id根本没有值(dish_id是菜品的id是一个逻辑外键,菜品的id由数据库去维护是自增的)。我们这个文件名称还带有后缀(.jpg)我们需要动态的把我们这个原始文件名的后缀截取出来,然后跟UUID生成的文件名拼起来成为一个新的文件名。Java中的工具类。原创 2025-01-24 17:49:16 · 1050 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day3菜品分页查询
这两个数据名相同我们在进行数据封装的时候会出问题,它在封装这个DishVO数据时就会对应错,也就是说这个categoryName是封装不上的,因为我们在封装的时候字段名和属性名应该是对应的。因为我们菜品表里面没有categoryName只存了一个分类id,现在页面要展示分类的名称,所以我们专门设计了一个DishVo,这样我们把这个DishVo转成JSON数据给到前端,前端就可以正常展示。·<if>:用于判断条件是否成立。2.分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。原创 2025-01-24 19:12:52 · 177 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day3删除菜品
我们当前要删除菜品是知道菜品id的,我们可以根据这个dish_id来查setmeal_id,如果能查上来就说明这个菜品被套餐关联了,这个时候就不允许删除。当我们删除菜品之前需要先判断当前这个菜品是不是被某个套餐关联了,所以要查套餐与菜品的关系表(setmeal_dish),通过查询这个关系表来判断当前要删除的这个菜品是否被某个套餐关联。遍历ids将每一个id取出来,根据这个id来查菜品数据从而判断该菜品是起售还是停售(需求分析:起售的菜品不能被删除),status为1表示起售,为0表示停售。原创 2025-01-24 23:19:15 · 822 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day3修改菜品
修改菜品表比较简单直接发一个update语句就可以了,关联的口味表就有几种情况, 我们有可能把口味删掉加一些新的口味,有可能没改,有可能是追加的,也有可能是删除了。所有这里我们用了一种比较简单的处理方式,把当前这个菜品原先关联的口味数据全都统一删掉,然后再按照当前传过来的这个口味数据,重新再来插入一遍数据。插入口味数据前我们要先判断传过来的口味数据有没有值,插入口味数据之前我们也要设置一下dish_id,因为这个口味数据可能是新增出来的,这时候dish_id还没有值,最后进行口味数据批量插入。原创 2025-01-25 16:52:36 · 687 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day5Redis入门
Redis与MySQL的区别:Redis是将数据存到内存里面而MySQL是将数据通过数据文件的方式存在磁盘上,本质是磁盘存储而Redis属于内存存储,除此之外,MySQL是通过二维表这种方式来存储数据。如果我们连接的不是本地的Redis,而是其他地方的Redis,包括这个端口号可能也不是6379,如何使用客户端来连接?我们设置了密码再来执行命令的时候报错了,提示认证是需要的,这时候我们再来执行命令就需要提供密码。这样就连接到当前Redis服务,默认连接本地的Redis并且使用的是默认的端口号:6379。原创 2025-01-25 20:28:59 · 159 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day5Redis常用命令_字符串操作命令
SETEX key seconds value 设置指定key的值,并将 key 的过期时间设为 seconds 秒。·SETNX key value 只有在 key 不存在时设置 key 的值。·SET key value 设置指定key的值。·GET key 获取指定key的值。插入一条数据,指定key,指定value。获取不存在的key,会返回null。key已经失效,自动删除key。原创 2025-01-25 21:13:20 · 130 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day5Redis常用命令_哈希操作命令
HSET key field value 将哈希表 key 中的字段 field 的值设为 value。·HDEL key field 删除存储在哈希表中的指定字段。·HGET key field 获取存储在哈希表中指定字段的值。·HKEYS key 获取哈希表中所有字段。·HVALS key 获取哈希表中所有值。原创 2025-01-25 21:40:45 · 164 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day5Redis常用命令_列表操作命令
这里的l是left也就是说我们从列表的左侧插入数据,RPOP从列表的右侧来移除元素,删除的同时给这个命令返回被删除的值。·LPUSH key value1 [value2] 将一个或多个值插入到列表头部(左边)·LRANGE key start stop 获取列表指定范围内的元素。·RPOP key 移除并获取列表最后一个元素(右边)·LLEN key 获取列表长度。按照插入的顺序排好序。原创 2025-01-25 23:43:05 · 130 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day5Redis常用命令_集合操作命令
SADD key member1 [member2] 向集合添加一个或多个成员。·SREM key member1 [member2] 删除集合中一个或多个成员。·SUNION key1 [key2] 返回所有给定集合的并集。SINTER key1 [key2] 返回给定所有集合的交集。set集合是无序不重复的,它里面的元素不能重复,如果重复,插入失败。·SMEMBERS key 返回集合中的所有成员。原创 2025-01-26 15:50:21 · 153 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day5Redis常用命令_有序集合操作命令
ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment。·ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合中指定区间内的成员。·ZREM key member [member ...] 移除有序集合中的一个或多个成员。·默认情况按升序来排列,图像界面默认降序排列。原创 2025-01-26 16:11:01 · 186 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day5Redis常用命令_通用命令
KEYS pattern 查找所有符合给定模式( pattern)的 key。·KEYS * 返回Redis数据库里面所有的key。·KEYS set* 返回以set字符串开头的key。·DEL key 该命令用于在 key 存在是删除 key。·EXISTS key 检查给定 key 是否存在。·TYPE key 返回 key 所储存的值的类型。原创 2025-01-26 16:28:08 · 265 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day5在Java中操作Redis_Spring Data Redis
redis连接工厂对象不需要我们自己去创建,我们已经引入了redis的坐标,它会把redis连接工厂对象给我们创建好并且放到Spring容器当中,所以在这我们只需要声明一下就可以把它注进来。这里我们不建议直接把配置项的值配置到application.yml文件里面去,建议使用引用这种方式,这样当我们项目上线的时候就容易切换,因为我们在开发环境、生产环境、测试环境下,可能使用的这个Redis不是同一个。我们这里把Redis的值配置到dev里面去,主配置文件(application.yml)通过引用的方式。原创 2025-01-26 17:30:06 · 482 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day5在Java中操作Redis_Spring Data Redis
Redis里面的String跟Java里面的String不完全相同,也就是说我们在调用这个方法的时候,这个value可以给任意类型,最终它都会把这个对象进行一个序列化,转成Redis当中的String来进行存储。1.lpush -> leftPushAll(插入多个)/leftPush(插入一个)·在Java中操作String类型。·操作有序集合类型的数据。·操作哈希类型的数据。·操作列表类型的数据。·操作集合类型的数据。原创 2025-01-26 18:27:11 · 397 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day5店铺营业状态设置
先分析一下需要设计几个接口,要修改当前营业状态,这对应一个接口,我们可以看到店铺的状态,所以需要一个查询类接口,去查询当前店铺营业状态。商家这一端需要查询店铺营业状态,在小程序用户那一端也需要查询,商家管理端查询店铺营业状态和小程序用户端可以使用同一个查询接口,但是我们项目中给它设计了两不同查询个接口,因为我们当前这个项目,对于这些接口路径,做了一个约定。不同类型的操作数,首先自动转换为表达式中最高级别的数据类型然后进行运算,运算的结果是最高级别的数据类型,简称低级别自动转换为高级别。原创 2025-01-26 23:53:27 · 628 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day6HttpClient入门
JSON参数:JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数,需要使用@RequestBody标识。函数名称:function(形参列表){} => 函数名称(形参列表){}由于其语法简单,层次结构鲜明,现多用于作为数据的载体,在网络中进行数据传输。·逻辑值(true或false) ·数组(在方括号中)>间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源。·数字(整型或浮点) ·字符串(在双引号中)属性名1:属性值1,原创 2025-01-27 15:05:28 · 379 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day6微信小程序开发入门
拿到这个openid之后我们就可以自定义登录状态,自定义登录态就是我们需要去记录当前这个微信用户他的一些信息,比如说我可以把这个openid存到数据库,同时我还可以为这个微信用户来产生一个token(登录令牌),因为这个小程序还会持续不断地来请求我们这个后端服务,比如说他要添加购物车或者下单等等,这个时候我们都需要知道当前这个微信用户是谁,我们就需要为当前微信用户来生成一个token返回给这个小程序。不同的主体注册微信小程序,能开发的功能是不一样的,也就是开放的权限不一样。请求的参数是下面几个。原创 2025-01-27 17:27:11 · 555 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day6微信登录
我们这个微信登录不需要用户自己去注册,我们直接来获得这个微信用户的openid,也就是微信用户的唯一标识,这样能够知道当前这个微信用户是谁。要完成微信登录,我们其实最终就是要获得这个微信用户的openid,要获得这个openid我们就要使用到它的一个临时的登录凭证也就是code授权码,所以这个接口就是小程序这一端给我们后端发送请求,并且把这个授权码提交过来,我们拿到这个授权码就可以去调微信的接口服务,我们需要给这个微信用户返回一个token(登录令牌),令牌里面就包含openid(微信用户唯一标识)。原创 2025-01-27 21:45:40 · 1181 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day7缓存菜品
修改菜品如果是修改了分类,那就影响到了两份缓存数据,也就是原先的分类会少一个,修改后的分类会多一个,如果修改的是菜品名称,价格这些属性则只会影响一份缓存数据。数据库中菜品数据有变更时清理缓存数据,如果不清理会造成我们这个数据的不一致,比如说在商家管理端把某一个菜品的价格改了,如果不清理对应的缓存,因为管理端改了菜品价格修改的是MySQL数据库里面数据,但是小程序展示出来的是读取缓存Redis里面的数据,Redis里面的数据没有改,所以小程序里面展示的还是原来的价格。2.如果存在,直接返回,无须查询数据库。原创 2025-01-28 19:21:54 · 1571 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day7缓存套餐
它会拿到这个key到Redis当中来查询有没有相应的数据,如果查到了它就会直接使用这个缓存数据,就不会再去调用getById方法,如果没有查询到,它就会通过反射来调这个方法,这个方法里面就是去查数据库,把这个数据返回,这个时候它就会把返回结果缓存起来,等下一次再查询相同数据的时候,缓存中就有了。因为id是自增的所以只输入age和name就可以了,在插入完之后它会把主键值赋值到user对象上,它是先插入到数据库,插入到数据库之后id就有值了,然后再去操作缓存数据,这个时候它就能取到id的值。原创 2025-01-29 16:33:17 · 1332 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day7添加购物车
我们设计这些冗余字段就可以提高我们的查询速度,我们在购物车里面要展示商品的名称、图片、价格,如果没有这些冗余字段,我们在查询数据的时候,除了要查询购物车表还需要联合去查询菜品表或者是套餐表,相当于两张表的连接查询,有了冗余字段之后就变成了单表查询,直接查询购物车表就可以了,所以它的查询速度会快很多。要将商品添加到购物车,具体添加的是哪个商品呢?选的是那些商品,这就需要有商品的id字段,我们的商品分成了两种,一个是菜品,一个是套餐,为了更清晰我们设计了两个字段,一个菜品id,一个是套餐id。原创 2025-01-29 21:33:09 · 1252 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day7查看购物车
这是一个查询类的操作所以请求方式是GET方式,我们不需要提交任何参数,因为我们是查询当前用户的所有的购物车数据,每一次业务操作的时候都会在请求头里面携带一个token(我们前面设计了一个拦截器来拦截令牌token,然后把user_id封装到BaseContext里面去),后端通过解析这个token就能拿到user_id。ThreadLocal为每个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问。原创 2025-01-29 23:10:22 · 230 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day7清空购物车
这个功能实现比较简单,只需要向数据库发送一条根据用户的id也就是user_id,去删除对应的用户购物表数据的SQL就可以。user_id都是4代表的是同一个用户。原创 2025-01-30 14:59:19 · 273 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day7导入地址簿模块功能代码
一个用户可以有多个收货地址,但是只能有一个默认地址,这个默认地址的作用就是当用户下单的时候默认使用这个地址。用户也可以点击新增收货地址,在弹出来的页面可以填写一个新的地址,填写完后点击保存地址向数据库插入一条新增地址的信息。用户可以对已经填写好的收货地址进行修改,如果这个地址不用了也可以点击删除地址按钮把这个地址删除掉。因为对于同一个用户他的所有地址来说,只能有一个是默认地址,现在提交过来一个地址设置成默认地址,那么在设置这个默认地址之前可能用户已经有了一个默认地址。·查询当前用户所有的地址信息。原创 2025-01-30 15:55:44 · 520 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day7用户下单
涉及两张表的操作,要保证数据的一致性(出现异常订单表里面插入了数据,订单明细表插入数据失败,导致数据不一致),所以要加@Transactional注解,要么全成功要么全失败,当执行完所有的操作才会提交事务,如果出现异常会进行事务回滚。如果查上来购物车数据,说明该用户的购物车不为空可以下单,如果查不上来购物车数据,说明该用户的购物车是空的不能下单。每个商品数量是多少?这些数据来自于用户的购物车,因为点餐的时候用户是先将商品加到购物车当中,然后才能提交订单,所以用户购买的商品种类和数量是由购物车数据来决定的。原创 2025-01-30 20:34:10 · 1504 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day8订单支付
不仅仅是这一次接口调用,支付成功之后微信后台会给我们推送消息,也就是说微信后台会调用我们这个商户系统,这个交互过程当中也会涉及到一些数据的交互,数据的传输,那这个数据如何保证安全。2.微信后台会调用我们的商户系统给我们推送支付的结果,那这个地方我们就会遇到一个问题,就是微信后台它怎么就能调用到我们的商户系统,它这个调用过程本质上也是一个Http请求,我们当前商户系统的ip地址就是自己的笔记本的ip地址,而我们自己的笔记本ip地址只是一个局域网内的一个ip地址,微信后台其实是调用不到的。原创 2025-01-31 23:09:21 · 1794 阅读 · 2 评论 -
《苍穹外卖》项目学习记录-Day10Spring Task
还有一类订单需要处理,比如说订单已经派送出去了,用户已经收到货了,这个时候我们需要去点击完成按钮来修改这个订单的状态,订单的状态就更新成已完成这种状态。如果派送中的订单一直不点击完成,那么它就会一直处于这种派送中的状态,而线下用户早已收到货了,那这个订单一直处于派送中,这显然是不合理的。我们的业务规则就是,如果这个订单超时我们就要把这个订单取消掉,这个过程由程序自动去完成,所以这个业务功能就是超时订单的定时处理。如果指定了是几号,周几这个位置就需要写一个问号,如果指定了是周几,日这个位置就需要写一个问号。原创 2025-02-01 16:38:29 · 622 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day10订单状态定时处理
查询订单表把派送中的订单查询出来,也就是订单的状态为派送中,我们是查上一个工作日也就是当前时间减去一个小时,因为它是凌晨一点触发的。遍历集合把数据库查出来的超时订单状态修改成已取消状态,设置取消原因为订单超时,自动取消,设置取消时间为当前时间。查询订单表把超时的订单查询出来,也就是订单的状态为待付款,下单的时间已经超过了15分钟。遍历集合把数据库查出来的派送中订单状态修改成已完成状态。利用Cron表达式生成器生成Cron表达式。原创 2025-02-01 17:50:20 · 544 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day10WebSocket介绍
它们是双向的数据交互,浏览器可以给客户端发送消息,客户端可以给浏览器发送消息。服务器跟浏览器建立连接的过程,这个连接其实就是一个WebSocket的长连接。建立连接,服务端给客户端发送消息。客户端给服务端发送消息。原创 2025-02-01 19:28:47 · 214 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day10来单提醒
它是先请求到来nginx,由nginx反向代理转发到了我们后端,也就是说WebSocket这一次请求通过nginx进行了一次转发,才转发到了后端。前提是我们提前在nginx配置好了这个路径,这样客户端跟服务端握好手了,这个长连接就建立好了。是用户下了某个单或者催促某个订单,这个时候才会有相应的提醒,具体当前提醒的是哪个订单,我们也需要把这个订单id给提交过来。content:表示具体的提醒内容,提示框会显示文字,这些文字就是我们具体推过来的这个内容content。原创 2025-02-01 21:35:15 · 852 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day11营业额统计
请求方式为GET方式,因为营业额统计本质上是一个查询类的操作, 查询相应的数据,最终把数据整合好,然后返回给前端。接口的请求参数有哪些,我们要统计营业额具体是统计哪个时间段之内的呢,应该通过参数传过来比较合理,比如说想统计近七日的,那近七日是几月几号到几月几号呢,这就需要通过参数传过来,然后后端根据它提交过来的这个参数,来查询这个时间段之内的统计数据。统计这一天的营业额,假设这一天一个订单也没有,这个营业额统计出来是null,所以它如果返回的是null的话我们把它转成0。静态方法,根据当前时间创建对象。原创 2025-02-02 18:02:18 · 1397 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day11用户统计
StringUtils.join()是Apache Commons Lang库中的一个方法,用于将数组、集合或迭代器中的元素连接成一个字符串,并通过指定的分隔符分隔这些元素。返回的数据由前端这个折线图来约定的,也就是说折线图对这个数据有这样的要求,我们去适应前端的这个数据格式,也就是前端需要什么样的数据,我们后端给它什么样的数据。统计指定时间区间之内的每一天的用户数量,每一天的用户数量包含两部分,一个是用户的总量,一个是新增用户数量。·array:要连接的数组或集合。·数组:可以是任何类型的数组。原创 2025-02-02 19:08:54 · 730 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day11订单统计
2.有初始值:T reduce(T identity, BinaryOperator<T> accumulator)。public static <T> Stream<T> of(T...values) 获取当前接收数据的Stream流。static <T> Stream<T> concat(Stream a,Stream b) 合并a和b两个流为一个流。public static <T> Stream<T> stream(T[] array) 获取当前数组的Stream流。原创 2025-02-02 23:28:19 · 1515 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day11销量排名统计
所以这条sql语句应该为查询order_detail表和orders表,查询菜品或套餐的名字以及对应的销售的份数,当order_detail.order_id =orders.id的时候并且orders表中的status字段=5,也就是已完成的订单,而且是在指定的时间段内,进行分组查询,根据销量降序排序,查询销量前10个的商品。转换后元素会形成一个新的流。public static <T> Stream<T> of(T...values) 获取当前接收数据的Stream流。原创 2025-02-03 18:24:59 · 1237 阅读 · 0 评论 -
《苍穹外卖》项目学习记录-Day12Apache POI介绍
我们操作excel文件主要有两种操作方式,一个是可以从一个已有的文件里面来读取文件的内容,还有一个就是可以向一个excel文件当中来写入内容。·入门案例2 通过POI读取Excel文件中的内容。·入门案例1 通过POI创建一个Excel文件。原创 2025-02-03 23:18:58 · 310 阅读 · 0 评论