ypora激活使用指南(2024):
原文链接:https://zhuanlan.zhihu.com/p/692454473
或者:https://blog.csdn.net/qjkewdmgkq/article/details/139335063 Typora破解
项目链接:
尚硅谷Java项目【尚庭公寓】从0开始Java项目实战_哔哩哔哩_bilibili
参考链接:https://www.cnblogs.com/gaodiyuanjin/p/18623825
数据库准备
- 保留图像时,保存图像地址就可以
- 数据表不是越多越好,可以用中间表来实现俩个表之间的联立
- 这样方便查数据但是却带来性能问题
- 而减少表的jion但是提高性能,以冗余来换去性能
- 采用MySQL,InnoDB存储引擎
- 物理删除和逻辑删除
- 逻辑删除有一个标记,后面会过滤掉
- 大数据时代,数据比较重要,被删除的数据也很重要
接口定义
- 根据页面的信息,每个模块需要什么接口,哪些可以共用一个接口
- 但终归是增删改查,但是看需要通过什么来查询信息,是有条件还是查询全部
- 根据ID删除属性和值,根据分页查询列表,比如嵌套的列表,省市县等
- 上传图像功能
根据ID查询房间详细信息
(用作修改时的表单回显)- 登录功能:获取图形验证码,请求登录,获取登录用户信息
-
增删改查,一般保存是不向后台新增ID的,该增加是有的
准备开发环境
两台Linux虚拟机
在其中一台,部署MySQL,Redis,MinIO
技术储备
MyBatis Plus快速入门
创建一个表,设置它的编码方式
CREATE DATABASE hello_mp CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
前面设定字符集,后面设定字符集的排序规则
id设置了自动增长,bigint比int有更长的字符设定
comment是对数据库对象的描述
primary是把id设置为主键
引入Maven依赖的时候,groupId一般写反向域名格式,来避免进行冲突
配置MySQL的时候,下面的URL是虚拟机的IP地址
创建实体时,Ctrl加v直接生成对应实体类
实体类注解:
通用Mapper
通用service
继承泛型接口,需要传入实体类
通过继承通用mapper接口和通用service接口
只不过方法略有区别
但是,实际上,mapper方法是封装在service接口下的
都是先定义一个接口,然后再定义一个实现类
条件构造器
MyBatis Plus共提供了两类构造器,分别是`QueryWrapper`和`UpdateWrapper`。其中`QueryWrapper`主要用于查询、删除操作,`UpdateWrapper`主要用于更新操作
QueryWrapper支持链式操作
考虑优先级的情况,匿名的子类对象可以替换成lambda表达式
LambdaWrapperTest类
传入的格式不一样
分页插件
总结:
简单的查询可以用通用Mapper和通用service
复杂的查询需要用条件构造器和分页插件
MyBatisX插件
使用它可根据数据库快速生成Entity
、Mapper
、Mapper.xml
、Service
、ServiceImpl
等代码
MinIO
对象存储服务
可以上传图片什么的,为其分配一个ID,即url,端点加绝对路径
Redis
概念:
基于内存储存,存储性能速度惊人,通过键值对储存,通常用作缓存服务
特点:
高性能,支持多种数据结构,持久化,灵活的数据过期策略
持久化方式:
定期快照 :有时间间隔,但是不实时,只能恢复最近的快照,容易数据丢失
实时记录写操作日志:恢复的时候比较慢,写操作太多
应用场景:
用作缓存,缓存可以显著提升访问速度,降低数据库压力。
Redis常用数据类型及命令:
通用命令
string命令
string类型常用于缓存、计数器等场景。
比如点击率什么的
list类型
-
社交应用中,可使用list缓存每个用户发布的最新的N条记录。
一般缓存最近的十条记录
-
list可用作异步消息队列。
放到list里面的慢慢处理,一边push,一边pop
set
和list类型相似,set类型也可用来存储多个string类型的元素,但与list类型不同,set中的元素是无序的,且set中不会包含相同元素。
set可用于计算共同关注好友,随机抽奖系统等等
hash
hash类型类似于Java语言中的HashMap
,可用于存储键值对。
hash类型可用于缓存对象等。
zset
zset(sorted set)被称为有序集合,同set相似,zset中也不会包含相同元素,但不同的是,zset中的元素是有序的。并且zset中的元素并非像list一样按照元素的插入顺序排序,而是按照每个元素的分数(score)排序。
zset主要用于各种排行榜。
SpringBoot整合Redis
Spring Data Redis 中有一个十分重要的类——RedisTemplate
,它封装了与Redis进行的交互的各种方法,我们主要用使用它与Redis进行交互
但是出现序列化方式问题
Redis中的key和value均是以二进制的形式存储的,因此客户端输入的key和value都会经过序列化之后才发往Redis服务端。而RedisTemplate所使用序列化方式和命令行客户端采用序列化方式不相同,进而导致序列化之后的二进制数据不同,所以才会导致上述的现象。
为解决上述问题,可使用StringRedisTemplate
代替RedisTemplate
,因为StringRedisTemplate
使用的序列化器和命令行所使用的序列化器是相同的。
spring-boot-starter-data-redis
同样提供了StringRedisTemplate
的自动配置,因此我们也可以直接将其注入到自己的类中。
Knife4j
Knife4j是一个用于生成和展示API文档的工具,同时它还提供了在线调试的功能
和Springboot集成,通过注解可以生成接口文档
和swagger性质差不多
项目初始化
数据库连接和SQL文件的导入
创建Maven工程
注意Maven的继承和聚合的性质
创建工程
- 就是搭框架,包括生成API、各种插件、依赖、注解、统一管理注解和依赖版本(扫描)、返回值、响应码
- 还有各种继承和抽象类、泛型
- web相关依赖和test相关依赖
- Maven,打包成可执行的JAR文件
- 配置服务器端口,创建springboot的启动类
- 配置Mybatis-Plus:启动类和MySQL驱动
- 在主要模块配置Knife4j配置
- 后台管理系统和移动端的接口配置并不相同,所以需各自编写一个配置类。
- 在完成上述配置后,便可使用一些逆向工具自动生成基础代码了(例如实体类、mapper、service等),在使用Mybatis-Plus作为存储层框架时,推荐使用IDEA中的Mybatis X插件
-
实体类中的公共字段(例如
id
、create_time
、update_time
、is_deleted
)抽取到一个基类,进行统一管理,然后让各实体类继承该基类。 -
实体类中的状态字段(例如
status
)或类型字段(例如type
),全部使用枚举类型。 -
所有的实体类均实现了
Serializable
接口,方便对实体对象进行缓存。 -
所有的
Mapper
接口均没有使用@Mapper
注解,而是使用@MapperScan
注解统一扫描。
公寓信息管理
登录模块
两种常用的认证方案:
一.session
在服务器端创建一个session对象将标识保存在这个对象中
若用户数量多 就会使服务端受压
借此使用负载均衡(类似中转站) 将各种不同请求发给相应的多台服务器(集群)
此处要使用登陆共享(即将登录的信息存储在Redis中)
二.Token(JWT令牌)
登陆状态保存到客户端 服务器无须保存
客户端发起的每个请求自身携带登陆状态
JWT是一种轻量级的安全传输方式 为一个字符串
由三部分组成 .分隔 header payload(负载) signature(签名)
例如:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJ1c2VybmFtZSI6Ind3dy5iZWpzb24uY29tIiwic3ViIjoiZGVtbyIsImlhdCI6MTczNDUwMDYzNywibmJmIjoxNzM0NTAwNjM3LCJleHAiOjE3MzQ1ODcwMzd9.
HdeGpO61iaiN7ODgpNrYIXuMIJIpHJ5e6cc4UsPDd7g