苍穹外卖学习日志 -----20天项目从零到完结-----含软件下载,环境配置,框架学习,代码编写,报错处理,测试联调,每日总结,心路历程等等......

年份 2024         基础:Javase   Javaweb

已完结      2024    8.25---9.14    20天


Day-01      8.25

今天开始学习已经晚了,网盘下载了一下文件,做了一些开始项目的准备工作。

本来其实打算用notepad++来写学习日志的,但是那个传不了图片,而且编辑视图没有这个博客看着舒服,所以就决定写在这里了。往后,每日更新,直到项目完结,不知道会用时多久呢,希望20天以内吧,加油。

前置知识

百度网盘限速好烦啊,项目资料下载太慢了,所以项目工程导入可能要等到明天了,今天只能记一些知识点。

初始gitee

居然要用git了,之前只是听说过,有点激动呢,好耶!  原来工程里自带的.gitignore文件使用来指定不存入git仓库文件的,以前看着一堆文件好复杂,一下子清晰多了。

VCS:版本控制系统

            创建一个git远程仓库,选择项目的根目录层,也可以用命令创建仓库

原来IDEA也集成了这个,还以为要登录git来操作呢

注册gitee

注册了gitee,创建了仓库。顺便了解了下git,gitee,github,getlab的区别

刚刚网盘终于下载好了资料,但图书馆马上关门要走了,先部署了下前端界面。后端工程和上传git仓库明天再实践了。

部署前端页面

不能把Nginx文件放在带中文的目录下,怪不得刚刚一直打不开


Day-02      8.26

了解项目结构

终于打开了后端项目,类好多啊,要看不过来了

第一次推送项目到gitee

第一次项目登录测试

前后端联调测试登录到系统时遇到了报错,无法登录

原因:没有修改默认工程中配置的数据库连接信息,密码没有修改。修改配置信息后正常登录了。

Nginx反向代理

前端请求并不是直接发送到后端服务器,而是先发送到Nginx服务器,然后再由Nginx服务器发送请求到后端服务器。所以前端的请求路径和后端controller的接收路径是不一样的。

提高访问速度:大概是因为后端响应的数据会在Nginx做缓存,下次前端再访问相同路径的资源,就不用发送请求到后端,而是直接由Nginx直接响应给前端。

负载均衡

MD5加密

登录功能完善:对明文进行加密后存储

knife4j学习

使用介绍

代码实现

感受:

相比postman来说,确实有不少优势

               1.不用打开一个新的应用了,通过Spring框架,可以直接在浏览器访问界面

                2.更换数据进行测试时更方便,只需要输入数据值即可

          与Yapi的区别:

                       Yapi是设计阶段使用的,用于管理和维护接口

                        Swagger是在开发阶段使用的框架,帮助后端人员做后端的接口测试

生成接口文档的常用注解:

好处:1.可以用作代码解释,使代码可阅读性提高

            2.可以和生成的接口文档中的内容相对应,提高接口文档的可阅读性

全天总结:

今天还没有正式进入到开发阶段,算是把所有的前置知识完成了。明天开始进入开发阶段,希望进展可以快一点吧。感觉用了两天才完成前置内容的学习有点点慢,后面不能松懈了。

另:

刚刚发现博客可以添加标题,把每日的日期都设为标题,这样导航看起来方便多了哈哈。

        用剪映做了一个封面,默认封面有点丑,受不了哈哈。原来的是这样的。


Day-03      8.27

今日情况

今天开始写项目已经是下午八点了,本来可以早两个小时,但是趴桌子上不小心睡着了,睡了两个小时,可能是因为今天有点感冒。不说了,赶紧开始写接口了,看还来不来的及完成今天的任务。

开发体会

一个小细节:便于后期统一拦截请求,记录日志等等。

DTO用处

先设计新增员工的DTO:当前端提交的数据和实体类的属性差别较大时,建议使用DTO来封装数据。

        其实也可以直接用emplyee来封装接收数据,但是在开发中要尽量使用对应的DTO精确的做到前端传过来什么,后端就封装什么。

绿色注解

学会了生成绿色注解,快捷键是输如/**,然后点回车

又增加一个知识点

开启驼峰命名以后,在DAO层写接口的时候,就不用吧"_"改成大写字母了,会自动转换的

自定义常量

不得不说,用自己定义的常量来写代码,感觉好优雅,看着好舒服啊。

TODO用法

后续需要处理的任务用 TODO 标记,看着也赏心悦目,而且后期还可以直接定位,不会忘记。

测试代码

实际开放中大多Swagger进行测试,因为一般前端代码还没有开发好

在测试新增员工接口时,jwt令牌没有传递无法登录,可以设置全局参数,传递进去自己获取的一个jwt令牌,这样后续的测试就不会每次都会被卡住了。

参数名称为token,是因为我们再配置文件中,将前端传递过来的请求头中的参数名称设置为token

测试新增员工接口时,发生报错

猜测大概是mapper接口中的驼峰命名那块有问题

大概现在的版本不支持自动转换了,于是修改代码

修改后,利用接口文档测试通过

SQLIntegrityConstraintViolationException

在前后端联调测试中,输入的账号名称不小心填成了admin,结果遇到这个报错,记录一下

SQLIntegrityConstraintViolationException:

Duplicate entry 'admin' for key 'employee.idx_username'

经过翻译,大概意思是:键重复 报错,因为数据库中已经有这个用户名了,用户名有唯一约束

后续的测试就不再这么详细的记录了,遇到问题的话还是会记录一下的。

全天总结

今天大概只能写完这一个接口了,本来打算自己完成这个接口,但是代码写的不规范。跟着视频写了一遍,代码规范多了。后面习惯了这种书写规范后大概写接口就快了,加油。今天没有完成既定的任务量,看后面能不能多写点,给补回来吧,加油。

不过不得不说,还是学到了不少呢。

这种条理清晰的项目结构,简直太优雅了!忍不住感叹一下,我好喜欢!


Day-04      8.28

今天学了下Springboot原理。然后还有一些其他事情耽误了,

所以没有推进项目,明天继续吧,加油。

不过学习了一些Springboot原理之后,再去写项目,会感觉清晰很多。看到哪个都知道大概是什么是什么,对项目的理解也更深了。


Day-05      8.29

又没能写项目。只学完了之前web开发课程中  Springboot原理部分。


Day-06      8.30

新增员工完善

需求:新增员工时,如何记录操作员的id,信息。

用到的技术:ThreadLocal 

原理:向Tomcat服务器发送的一次请求,是在同一个线程中。

测试:在拦截器,Controller,servece中的获取的线程ID一致,结果如下。

ThreadLocal常用方法

当前项目已经做了一个工具类,直接调用即可。

新增员工业务代码完善完成

利用管理员账号添加数据,无误,推送代码

员工分页查询

mybatis的分页查询插件

业务代码如下

前后端联调成功

Pagehelper 的pageStart底层

就是用的ThreadLocal技术,将分页的参数存到ThreadLocal中,然后到动态sql的时候再自动帮我拼接上。但当然还有很多好处,使得代码简化了很多。

员工分页查询完善

存在问题:后端返回的最后操作时间是一个数组,前端展示的时候就少了标点

解决方案

采用方案二完成代码

联调测试成功

消息转换器

定义:     在 Spring MVC 和 Spring Boot 中,消息转换器(Message Converters)主要用于处理 HTTP 请求和响应中的数据序列化和反序列化。例如,当客户端发送一个 JSON 格式的请求体时,消息转换器会将这个 JSON 字符串转换成 Java 对象;同样,当服务端需要返回 JSON 格式的响应时,消息转换器会将 Java 对象转换成 JSON 字符串。

我的理解:     在消息发送前,也就是消息发给前端之前,会统一拦截消息,然后根据拦截器的配置来转换拦截到的信息。完成后再放行消息。     Spring会提供一个消息拦截器的集合,是List集合,存放所有的消息拦截器。     自己新增消息拦截器就要重写继承了web配置类的类中的方法extendMessageConverters。       新增的办法就是创建一个消息转换器对象,然后给其设置我们自己编写的对象转换器,再将其加入Spring的消息转换器队列,设置优先级为最高。

全天总结:

        已经开始三天了,课程中Day2的接口还没有开发完,后续需要调整一下时间安排了,否则这个项目会拖很久。得安排时间早中晚都有足够的时间去写项目才行。

        写代码时候也发现了很多残留的问题。最主要的就是mysql那块,基础不牢,虽然知道仔细学一遍肯定就没问题了,但是总是懒得去复习,导致写操作数据库那部分的代码时候,就得参考视频,不能独立完成,得尽快复习下mysql才行。


Day-07      8.31

修改员工账号状态

原本打算就写一条改statue 的sql,但是根据视频提示

可以考虑去一些更具有泛用性的sql语句。

写sql遇到报错

“应为 <statement> 或 DELIMITER,得到 'status'”

根据错误信息 “应为 <statement> 或 DELIMITER,得到 'status'”,可以推测生成的 SQL 语句中可能出现了类似 status 的标识符,但 MySQL 解释器期望的是一个 SQL 语句或分隔符。这可能是由于动态 SQL 生成过程中出现了问题。

全部变量都变红了,但代码肯定没问题,只好把注入语言给关掉试试 能不能运行。关掉以后展示如下:

测试没有问题,可能是一写其他原因吧。

编辑员工

在查询回写员工时看到一个细节

涉及到密码的地方,进行手动加密

编辑员工

代码越写越熟练了,用到了前面的BeanUtils和ThreadLocal

前后的联调测试通过

不过有一个疑问,这个路径参数问什么时long,而不是它的封装类,我记得之前好像说用封装类的好处很多,这里为什么不用呢?

回答:      在Spring MVC中,使用基本数据类型(如int, long等)作为路径变量时,如果传入的值不符合该类型的定义(例如为null或者无法转换为该类型),那么将会导致404 Not Found错误,因为基本数据类型不能为null

然而,当使用其对应的包装类(如Integer, Long)时,如果路径变量不能解析为正确的数值,则会返回null。这可以让你在控制器方法中更好地处理这种情况,例如检查是否为null然后采取适当的措施,可能是返回一个错误响应或者抛出一个异常。

总结:是我看错了,确实用的是大写的Long,是包装类,不过也解决了我的问题。

导入菜品分类代码

完成,测试通过


Day-08        9.1

今天是周日,休息了一天。


Day-09        9.2

不知不觉已经九月份了呢,昨天没有注意日期,本以为今天是九月一日,结果发现已经是九月的第二天了。项目的进度大不如预期,原本打算跟着视频的进度走,但是已经过去了八天,才完成视频进度中第二天的全部内容。至少得在九月前写完这个项目,但也用不了这么久吧,希望在九月中旬之前完成它。 

公共字段填充

AOP: 在操作持久层,调用mapper接口时,统一拦截需要自动填充的方法,然后自动填充。

             使用自定义注解的方式,来标记所有需要拦截的方法。

<think>嗯,用户问的是关于“苍穹外卖源码”的介绍。首先,我需要确定“苍穹外卖”是什么项目。可能是一个外卖订餐系统,类似美团或饿了么,但具体是哪个公司或开源项目的呢?可能是一个教学项目或者企业级应用的开源实现? 接下来,我应该检查是否有公开的源码仓库,比如GitHub、Gitee等。假设这是一个常见的教学项目,可能由某个培训机构或开发者社区提供,用于教学目的,帮助学习者了解外卖系统的开发流程和技术栈。 然后,我需要考虑用户的需求。用户可能想了解这个项目的技术架构、功能模块、使用的技术栈,或者如何部署和运行源码。也有可能用户是学生或开发者,希望学习项目以提升自己的开发能力,或者进行二次开发。 需要确保回答结构清晰,分点说明。首先介绍项目概况,然后技术栈,功能模块,系统架构,最后是学习或部署的建议。同时,提醒用户注意版权和合法使用的问题,避免侵权。 另外,用户可能对如何获取源码有疑问,但系统级指令中没有提到相关链接,所以可能需要建议用户通过官方或正规渠道获取,并遵循许可证要求。 需要确认技术栈的常见选择,比如Spring BootSpring Cloud、MySQL、Redis、RabbitMQ、Vue.js等,这些在外卖系统中常用。同时,架构设计可能涉及微服务、分布式事务、网关、负载均衡等。 还要考虑项目可能包的管理端和用户端功能,比如菜品管理、订单处理、支付集成、配送跟踪、数据统计等模块。 最后,确保回答符合用户可见层的要求,结构清晰,分步骤帮助用户理解,并保证信息的真实可靠,避免猜测不确定的内容,如不确定源码的具体细节,应建议用户查阅官方文档或联系维护者。</think>### 苍穹外卖源码解析 #### 1. 项目概况 苍穹外卖是一个典型的外卖订餐系统,主要用于教学或企业级开发实践。其核心功能包括商家管理、用户订餐、订单处理、支付对接、配送跟踪等模块,涵盖完整的O2O业务流程。 #### 2. 技术栈分析 $$ \text{技术架构} = \begin{cases} 后端: & \text{Spring Boot + MyBatis + MySQL} \\ 分布式: & \text{Spring Cloud Alibaba(Nacos/Sentinel)} \\ 中间件: & \text{Redis + RabbitMQ} \\ 前端: & \text{Vue.js + ElementUI} \\ 部署: & \text{Docker + Jenkins} \end{cases} $$ #### 3. 核心模块 - **权限管理**:RBAC模型实现 ```java // 示例代码片段 @PreAuthorize("hasAuthority('order:query')") public List<Order> queryOrders() { ... } ``` - **订单系统**:状态机设计 $$ \text{状态流转}:\text{待支付} \rightarrow \text{已支付} \rightarrow \text{配送中} \rightarrow \text{已完成} $$ - **分布式事务**:采用Seata框架解决 $$ TCC模式:Try() \rightarrow Confirm()/Cancel() $$ #### 4. 架构设计亮点 - **微服务拆分**: ```mermaid graph TD A[API Gateway] --> B[用户服务] A --> C[订单服务] A --> D[支付服务] A --> E[配送服务] ``` - **性能优化**: - 使用Redis缓存热门菜品:$$ \text{缓存命中率} = \frac{N_{hit}}{N_{total}} $$ - 消息队列削峰填谷:$$ QPS_{max} = \frac{\text{系统承载量}}{\text{峰值系数}} $$ #### 5. 学习建议 1. **环境搭建**: - 需要JDK 17+、Maven 3.8+ - MySQL配置示例: ```sql CREATE DATABASE sky_takeout DEFAULT CHARSET utf8mb4; ``` 2. **代码规范**: - 遵循阿里巴巴Java开发手册 - 使用Lombok简化POJO 3. **扩展方向**: - 增加智能推荐模块 - 实现GIS路径规划 - 集成第三方支付渠道 #### 6. 注意事项 - 商业使用需确认开源协议(通常为Apache 2.0) - 生产部署建议: $$ \text{服务器配置} \geq 4核8G \quad \& \quad \text{集群节点} \geq 3 $$ 建议通过官方Git仓库获取最新代码,配合Swagger接口文档进行调试。重点研究分布式锁、幂等性设计、灰度发布等企业级实现方案。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值