年份 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接口时,统一拦截需要自动填充的方法,然后自动填充。
使用自定义注解的方式,来标记所有需要拦截的方法。