瑞吉外面项目实战

 1.项目整体介绍

1.软件开发流程

需求分析(产品原型)——》设计(产品文档,ui界面设计,数据库设计)——》编码阶段(项目代码)-》测试——》上线运维(上线环境配置)

2.角色分工

项目经理:对项目进行人员调动

产品经理:需求调研,产品原型

ui设计师:根据产品原型设计输出界面效果图

架构师:项目结构设计,技术选型,功能架构

开发工程师:代码实现

测试工程师:编写测试用例,输出测试报告

运维工程师:软件环境搭建,项目上线

软件环境:

开发环境(dev),测试环境(test),生产环境(pro)(上线环境,把项目部署到服务器上)

2.吉瑞外卖整体介绍

角色:

后台管理系统

后台系统普通员工

c端用户

3.数据库环境搭建

 1.数据库环境搭建reggie

1.employee员工表

2.category菜品和套餐分类表

3.dish菜品表

4.setmeal套餐表

5.setmeal_dish套餐菜品关系表

6.dish_flavor菜品口味关系表

7.user用户表

8.adress_book地址簿表

9.shopping_cart购物车表

10.orders订单表

11.order_detail订单明细表

4.开发环境搭建

1.创建一个maven项目

检查项目编码,maven仓库配置,jdk配置

2.导入spring-boot-starter-parent   parent版本控制器

3.依赖坐标

spring-boot-starter

spring-boot-starter-test

spring-boot-starter-web

mybatis-plus-boot-starter

lombok

fastjson

commos-lang  通用语言包

mysql-connector-java

druid-spring-boot-starter  druid数据源

spring-boot-maven-plugin   springbooot maven插件

4.项目配置文件application.yml

server:

        port:8080

spring:

        application:                应用

                name:reggie    yml配置文件名称reggie

        datasource:

                druid:

                        driver-class-name:

                        url:

                        username:

                        password:

mybatis-plus:
          configuration:
                   map-underscore-to-camel-case: true  映射实体,数据库表和字段匹配
                   log-impl: org.apache.ibatis.logging.stdout.StdOutIml mp输出日志

                   global-config:

                                db-config:

                                                id-type: assign_id   按照数据库id策略

5.创建主方法Application

com.itheima.reggie.ReggieApplication

@SpringBootApplication

使用@Slf4j输出日志文件信息,Log.info()

使用Log.info("")输出日志

//通过了配置文件连接数据库,启动主方法之后,就可以导入前端页面了

前端页面分为前台和后台  front/backend

6.如果前端页面不放在template/statis中是访问不到的

localhost:8080/front/index.html

设置静态资源映射        

访问前端路径,从后台开始,localhost:8080/backend/index.html为后台主页,

1.后台登录功能 

前端路径为localhost:8080/backend/page/login/login.html

点击登录发送ajax请求访问路径为localhost:8080/employee/login  为post请求

@RequestMAppering("/employee")

1.导入结果类R

放回结果为格式为T,不管后面有多少个对象,都使用通用泛型T 

查看前端传递的数据格式,为json格式{username:"admin",password:"123456"}

json键值对格式

后端接收json格式数据加@Requestbody 封装成json对象

登录完之后要把登录成功的用户对象存到request中,所以传递一个HttpServletRequest request 对象

 HttpServletRequest request

request.getSession().setAttribute("employee",emp.getId())

2.退出登录

 前端点击退出登录之后跳转到logout请求,移除session中的request域对象中的属性

httpServletRequest 

3.完善登录功能

1.创建过滤器LoginCheckFilter  

SpingMvc的过滤器filter

用户未登录不能访问index.html主页

创建过滤器LoginCheckFilter 实现Filter过滤器接口重写dofilter方法,强转为HttpServlertRequest,HttpServletResponse,request.getRequestURI()输出拦截到的路径

log.info("拦截到: {}",***)

filterChain.dofilter(request,response)

@WebFilter(filterName="loginCheckFilter")

给过滤器取名字filterName urlPattern="/*"拦截的路径

 2。定义放行的路径封装成一个字符串数据中

 3.创建一个路径匹配器,支持通配符比较

  AntPathMather PATH-MATHER

3.创建一个比对方法check比对两个数

 4.总结:拦截器

第一步判断用户访问的是否是放行路径:比如login.html

第二步判断用户访问的路径中是否存了登录的对象

存了放行filterChain.doFilter(request,response)

第三步拦截

4.新增员工

新增方法 

2.由于账号信息设置了唯一约束,所以输入重复的账号,数据库会抛异常到idea中,我们要捕获这个异常

5.异常处理

异常处理属于公共功能,所以异常处理器定义在common包下,GlobalExceptionHandler

全局异常处理器

@ControllerAdvice(anntation={RestController.class,Controller.class})

定义aopController通知,集中处理类的注解为@RestController,属于Controller类

由于最后要发json异常信息给前端,所以加注解@Responsebody

使用@Slf4j打印异常信息到控制台

@ExceptionHandler(定义异常类型,记得加。class)

方法中放回字符串对象R<String>

exceptionHandler(){

异常信息加到形参位置ex

ex.getMessage()获取异常信息

retrue R.error("失败了")

}        

打印异常详细信息 

6.员工信息分页查询

1.前端发送ajax请求,将page,pageSize,name提交到服务端

page表示查询第几页数据

pageSize表示每页数据查询几条        

2.创建mp分页插件拦截器interceptor 

创建在config.MybatisPlusConfig

 创建好page下面的方法前端传递的参数为get后面键值对的格式,所以后端直接用形式参数进行接受就行,最后打印参数到控制台

3.分页后面还会联系到搜索功能,所以传递接受的参数,page,pageSize,name

4.创建分页构造器接受参数page和pageSize

创建构造条件构造器LAmbdaQueryWrapper记得加泛型

添加querywrapper过滤条件模糊查询

querywrapper.like (StringUtils.isNotEmpty(name),Employee::getNAme,name)

添加排序字段querywrapper.orderByDesc

执行查询qmployee.page(pageInfo,queryWrapper)

retrue R.success()

7.启用/禁用员工账号

1.也就是根据id修改员工信息,这里的id是采用雪花算法设置的id,属于长整型数据,会存在精度丢失的问题,所以要对消息进行序列化,也就是将放回的对象装换成json形式,

2.创建一个对象映射器在common JacksonObjectMapper

3.在config WebMvcConfig中创建mvc框架消息转换器

8.编辑员工信息

1.回显数据

 2.通过id查询寻员工信息

3.修改方法update

9.分类管理

1.公共字段自动填充

创建时间是插入时填充字段

修改时间时插入和修改时填充字段

 4.创建类MyMetaObjectHandler源数据处理器

创建要添加的公共字段,将本来的公共字段修改功能删除 

5.要获取当前session,则要加形参HttpServletRequest,但是类中不能获取,则只能在线程中获取

查看当前前程

Thread.currentThread().getId()

6.创建BaseContext工具类,用于封装threadlocal工具类

 

通过线程threadlocal传递值

再传递到字段自动填充实现解耦合

 10.新增分类

导入分类实体类category

创建三层架构

 11.分类信息分页查询

12.删除分类

 删除方法

2.创建setmeal和dish三层架构

3.在CategoryService接口中定义自定义方法remove

实现自定义方法

注入dishservice和setmealservice

创建查询条件

4.创建自定义异常

 5.在方法中抛出我们的自定义异常

 6.在全局异处理器中捕获异常

13.修改分类

 14.新增菜品

1.文件上传和下载

 1.创建文件上传和下载的控制器CommonController

2.文件上传

3.配置一个上传路径

4.在controller中获取自定义变量

5.文件下载 

2.新增菜品

1.创建实体类DishFlavor

2.创建三层架构

3.添加菜品中显示菜品分类

,通过查询 

4.导入数据传输对象dto

5.在dishController中新增菜品方法

 6.在dishServiceImpl中重写方法对多表进行操作

 多表操作加上事务注解transactional

在启动类上加事务处理器

@EnableTranscationManagement

3.菜品信息分页查询

 3.菜品修改

1.回显菜品数据

创建自定义方法查询数据

dishService

dishServiceImpl

 dishController

2.菜品修改 

自定义修改方法

4.新增套餐

第一步根据查询菜品列表

dishcontroller

 在setmeal中新增套餐方法

setmealService

setmealServiceImpl

调用方法

 5.套餐信息分页查询

6.删除套餐 

 

2. 前台开发

1.短信服务-ailiyun短信服务

1.导入坐标

2.创建工具类SMSUtils

3.导入User三层架构

4.导入生成验证码的ValidateCodeUtils

5.改造过滤器

6.获取验证码

 用户登录

2.菜品展示 

1.查询所有菜品数据

2.查询购物车数据创建一个ShoppingCartController接受

3.重写dishController中的查询所有菜品方法,添加口味信息查询

 2.套餐分类查询方法

用于显示套餐信息

3.购物车

1.导入三层架构

2.添加到购物车

 2.查看购物车

根据用户id查询购物车信息

3.清空购物车

 4.用户下单

用户下单orders订单表

自定义sumit方法在OrdersController

操作多张表在方法上加事务注解

 下单

注意事项:

1.vant是一个基于vue2的移动端组件

2.404,405都是找不到服务器端的方法

3.创建形参HttpServletRequest request用于设置和获取session

session用于服务器之间的数据交互

cookie为客户端之间的数据交互

request.getSession.setAttribute("employee",emp.getId())

或则HttpSession session

session.setAttribute(key,value)

4.@GetMapping用于查询全部数据返回List<User>集合数据,不带参数 方法list();

@GetMapping(”/{id}“)用于查询单条数据放回User对象数据,加了路径变量id,则形参位置加     回显数据                     @PathVariable 接受路径变量中的值id           getById()方法

@PostMapping登录注册用退出的方法,新增方法,传递数据为对象形式查看请求体数据

如果为username=""&password=""则加User user自动封装成对象,如果为json格式则加requestbody 

@PutMapping  修改方法 对表单数据提交修改,接受User user,方法updateById 返回String

@DeleteMapping删除方法传递的id为参数,所以直接接受removeById(id)放回String

5.分页查询

放回R<Page>对象 路径中直接传递键值对参数,page ,pageSize,name,

6.md5加密

DigestUtils.md5DigestAsHex (password.getBytes())

7.条件查询

查询单个数据getOne放回对象格式User

项目优化

 1.导入依赖redis

 2.配置文件

 3.redis操作需要自己设置key序列化器

方便展示key

  

默认情况下redis会创建模板redistemplate加载到bean,这里我们修改默认的key序列化器

3.把我们的验证码缓存到redis中

自动注入redistemplate对象

 缓存到redis中


获取验证码 

登录成功,删除验证码  

客户端高并发操作导致数据库性能下降

缓存菜品数据

更新数据库和修改数据库数据后记得也要把缓存数据清理掉

查询所有菜品数据,先查询redis缓存中的数据,如果redis缓存数据没有,再去查询数据库数据到redis缓存中

1.首先加载redistemplate到dishcontroller中

 

动态构造key

先查询结果为list集合,传递的数据为key,通过key查询redis缓存数据,查询结果存储为对应的list集合

如果查询到了,说明缓存查询到了该数据, 放回结果

如果没有查询到,查询数据库数据存到redis缓存中

 set设置key,value,缓存时间,时间单位TimeUnit.

在putmapping也就是修改菜品后删除所有菜品的缓存数据

 或者清除某个分类的缓存数据

springcache

简化缓存

cachemanager

 

 *基础的api都是在spring-boot-starter-web

                        springmvc       

                springcontext

1.启动类加上注解

 2.autowrited自动装配

spEl表达式

方法前 

key是这个user的id,value是这个user对象,value属于哈希值

重启服务之后,内存里的数据就都丢失了

删除数据需要重新加载缓存

 

 三种都是一个效果

cacheexict:清楚缓存

 根据id查询数据

 

 满足某个条件才缓存

查询所有

这种缓存数据底层是基于map实现的,当我们停止服务器的时候,缓存就不存在了

底层缓存产品切换成我们的redis

springCache底层缓存产品切换成redis 

 配置数据源信息

这里使用的是远程的redis 

*之气springcache其实是spring-starter-web中的spring-context(spring核心依赖)中的接口CacheManage底层使用的是map实现,这里我们将 缓存产品切换成redis

缓存套餐数据

这里r对象要实现序列化接口

 删除套餐

 allentries表示我要删除这个分类下所有数据

  读写分离

mysql主从复制 

 

mysql主从复制基于自带的二进制日志文件binlog

mysql 操作会将操作记录在二进制日志文件中 binlog,从库读取主库的二进制日志文件

从库slave会将主库的数据写入到自己的日志文件中,也就是中继日志reay log

另一个线程会在中继日志中解析这个日志中的内容

最后会将这个内容重做,在自己的数据库中重新执行一遍

从库可以有一个或者多个

写主库,读从库

主从复制需要在主库和从库的my.cnf中加入数据库唯一id

修改配置文件需要重启数据库服务

在虚拟机中打开两个会话也就相当于模拟了两个数据库服务器

1.开启在my.cnf中开启mysql二进制日志文件

2.在主库中创建一个用户小明,并且授予权限

3.在从库中登录数据库之后,并且使用小明用户登录到从库        

对主库数据进行操作,从库数据也会发生改变
 

我们的聚簇索引是按顺序插入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值