1P/11P项目开篇
1、安装开发工具
2P/11p 项目架构介绍
- 常见的请求:返回前端页面HTML:Model+HTML模板
- ajax异步请求:返回json数据【返回特定格式的字符串只返回Model】
- 本项目采用前后端分离架构,从视图层返回的数据是json
- 浏览器先发送请求到静态资源服务器(niginx服务器中部署静态资源文件)或静态页面,然后再页面渲染结束时;发送一个异步的ajax请求,ajax程序从controller层中得到响应的json数据,执行
- 回调函数。将数据渲染到静态页面上去。浏览器先后发送两次请求。
- 45:00:讲解项目代码目录结构【后端】
- 48:00: 前端代码结构
- mysql数据库表一共5张表
- 1、用户表
- 2、商品表
- 3、商品库存表【商品表和库存表为什么要分开,是因为要考虑到下单时扣减库存,如果不分开的话,就要在商品列表中对商品加行锁,会影响并发效率】
- 4、商品活动
- 5、订单表
- 面试题:为什么要拆分那么多层?降低耦合度。比如说dao层和业务层对数据的要求不一样,从dao层查询得到一个完整的用户数据,肯定是包含用户的密码的,但是不能将用户密码直接返回给前端页面,有风险。所以要通过有任务层去进行处理。
2p/11p 项目架构与运行
- 使用华为云服务器
- 开放端口号,在控制台,安全组中配置
- 27:00之前,部署服务器,mysql
- 安装JDK1.8
- 安装maven,修改maven的镜像地址为阿里云仓库。
- 安装idea开发工具
- 安装VSVCode
- 安装workbench【也可以在idea中进行查看】
- 打开idea,配置maven,打开项目,将项目部署。
- 修改配置文件
- 启动服务进行测试。
- 配置前端,打开vscode
- 安装插件
- 打开项目,配置后台路径
- open inlive server
- 成功。
- 再次总结流程
热点问题1:00开始
- 演示springboot快速构建项目
Spring
- Ioc的好处? 自动注入@Autowird。管理bean。
- Ioc的字面意思是控制反转,程序员自己创建对象并管理对象之间的关系叫正转。而控制反转的意思就是将创建对象管理对象的任务交给容器。就是把bean的管理的权力交给spring。好处就是降低我们程序中bean之间的耦合度,bean可以实现可插拔,如果在程序中想要置换某一个bean,非常方便。通常来说像实体类这种频繁发生变化的对象就不去用ioc去管理,而像service和dao这种单例的东西、可以复用的东西会采用ioc去管理。
- Ioc还能管理bean的作用域和生命周期!
- 自定义方法,添加以下注解即可。
- BeanFactory和applicationContext的区别?
beanfactory就是一个bean的工厂,Ioc通过它来管理bean,applicationContext继承于beanfactory,beanfactory是给内部人士用的,applicationContext是一个子接口,功能更强,给开发者使用的。
- getBean方法,applicationContext的核心功能?
springboot
- springboot如何实现自动装配?
答案
AOP的一些理解
一些注解的使用理解
SpringMvc
- SpringMvc的一些操作流程?
- 最好是看一下源码,现在看了一遍,不太理解。下次再看。
- 把这个流程背下来,跟着源码走一下断点。
Mybatis1:00,再看一次,整理一下。
- 查看mybatis源码【下次再看】
开始登录注册功能的开发【1:24开始】
3p/11p 用户登录与注册
介绍公共代码部分
后端部分
-
统一异常处理, -所有的异常抛出,在controller层统一处理。
-
统一定义返回前端json数据的格式
-
工具箱中新建方法:md5加密方法
-
还有一个日期的格式化方法
-
在controller中使用统一异常处理
-
springmvc提供一个机制,类似于aop,只针对springmvc这一层。当任何一个controller报异常时,就会调用此方法处理。
-
修改logback-spring-dev.xml中的日志文件保存位置
前端部分,使用bootstrap+jquery,轻量级的。
用户注册功能
- 先看user_info表,再看user实体类,user实体类中有非空校验,虽然在前台也有校验,但是有个别请求如果不走前台逻辑,直接通过地址栏访问,很容易就出问题,所以在后台也要做校验。
- 校验工具如下:按照工具要求对实体类进行注解。
- 上面的注解是由objectValidator使用,具体如下:
- 查看dao层。
- 查看userMapper,补充一个根据手机号查询用户的方法
- 查看service层,userservice接口
- controller层,看userController,模拟发送验证码
- 注册方法
- 登陆就是将user保存在session中。session保存在服务器上,相当于一个私人保险柜。
- 注销登录就是销毁session中的数据
- 查看登录状态
- 前端注册登录的逻辑。主要看js代码
- register.js代码。
- 注册成功后跳转到注册页面
- login.js
- 如果一旦controller报错后,直接跳转到ExceptionAdvice进行处理
- 解决跨域问题
第四节 商品列表与详情
- Aop和拦截器的区别?使用场景?
很多地方都需要去验证用户是否登录,在这样情况下,很容易就想到aop实现,但是在这种情况下,应该使用拦截器实现。Aop是面向方法名,面向方法去过滤的。拦截器是面向url去过滤的。Filter是更高层的过滤,一般不用filter。
- 定义拦截器
- 注册拦截器,配置需要拦截的路径。
- 显示登录用户的登录信息(登录状态)
主要关键是说清楚拦截器,以及拦截器的三个方法的执行时机。为什么要使用prehandle。
热点问题1:跨域问题
方法1:代理方式,不管是访问前台服务器还是后台服务器,都通过代理服务器Nigix进行访问,
- 缺点:不灵活。
方法2:通过纯前端方法解决,是一种欺骗行为,浏览器其实是要访问动态资源,但是假装访问静态资源。
- 局限性很大【请求方式只能是Get,不能是post】,不建议使用,理解就行
方法3:通过后端注解实现。只需要后台代码中允许就可以。
在前端ajax请求中设置一下:
- cookie中就可以携带允许跨域的路径。
热点问题2:cookie和session
cookie是会员卡,用户可以带走,不安全,可以篡改。session是保险柜,存放在服务器上,用户只保存一个保险柜编号,比较安全。敏感信息使用session。cookie携带的信息有限,2k。session不限制。
- cookie是手动创建的,session是tomcat自动创建的。
- session是依赖于cookie实现的,可以保存Object类型的数据。
- 注意的是session是保存在服务器的tomcat内存中,不能保存在硬盘上,在硬盘保存效率太低了。因为每次请求都要访问。
- 但是session的缺点是服务器压力过大,保存太多的session。session默认30分钟后过期。
- 搞清楚状态管理和权限管理的区别,先记住用户状态,权限管理是依赖于状态,判断用户类型,决定角色的权限。
但是上面的情况只适用于单个服务器的情况,不适用于分布式。
分布式:使用redis存储session。
多个服务器就可以共享session。
- 但是对于多客户端的情况下,使用session不能解决问题。使用tocken解决。用户请求后server1,就给他创建一个tocken