- MatchMate 是一个基于Vue3+Spring Boot2的移动端网站,旨在帮助人们找到适合各种活动的合作伙伴,例如运动、爱好或商业企业。
- 该网站使用复杂的匹配算法,考虑用户的偏好、兴趣、技能以及位置和可用性。
- 用户可以创建个人资料,搜索潜在的合作伙伴,并通过网站与他们进行沟通。
- 用户可以创建或加入群组,找到属于自己的小圈子。
- MatchMate 易于使用、可靠且安全,已经帮助数千人找到了他们的完美匹配。
- 账号:wqx11
- 密码:12345678
假如我们项目部署在两台服务器上,我们称之为A服务器和B服务器。这时我们用户登录A服务器,随之用户的session(用户登陆信息)也存在了A服务器。但是如果我们用户也去登了B服务器,但是我们B服务器上没有用户的信息,所以用户此时在B服务器这还得重新登录,降低了用户体验。
所以此时我们就可以考虑能不能把用户的session信息存到一个公有的数据库里,当我们需要这个session信息时,我们都让它从我们这个公有的数据库里面拿。
- 引入redis依赖,安装redis
- 引入 spring-session 和 redis 的整合,使得自动将 session 存储到 redis 中
- 修改 spring-session 存储配置
spring.session.store-type
默认是 none,表示存储在单台服务器 store-type: redis,表示从 redis 读写 session
当用户第一次登录我们的系统时,我们可能需要执行整个数据库的查询操作。这时候用户的等待时间不可避免的被拉长,但是当用户第二次刷新我们的系统,我们可以引入redis缓存,将用户第一次登录所需要的信息存到我们的redis缓存中,因为redis是一个基于内存存取的数据库,所以存取效率特别高。这时候,用户的等待时间也会随着存取效率的提升而减小,从而提高用户的体验。
提前预知我们的重点用户可能进行的操作,并将操作的结果提前存储在我们的redis缓存中,提高重点用户的体验
- 开启spring boot 的Scheduler定时任务
- 在要进行缓存预热的方法上加上@Scheduled(cron = "0 32 22 _ _ *")注解,并使用cron表达式指定方法执行的频率
当我们的项目部署在多台服务器上,也就是每台服务器上都有一个定时任务的代码,在每天的同一时间开始同时"打鸣"。这就会造成资源的浪费或者脏数据的产生。
使用redisson分布式锁控制定时任务的执行,保证同一时间只有一台服务器抢到锁并执行定时任务。
- 引入Redisson依赖
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.19.1</version>
</dependency>
- 编写RedissonConfig文件
- 在开启定时任务方法里编写分布式锁代码
@Scheduled(cron = "0 12 1 * * *") //自己设置时间测试
public void doCacheRecommendUser() {
//获取一个分布式锁对象
RLock lock = redissonClient.getLock("shayu:precachejob:docache:lock");
try {
// 只有一个线程能获取到锁
//lock.tryLock(0, -1, TimeUnit.MILLISECONDS)
//Redisson 的 tryLock 方法默认会启用看门狗机制
//看门狗机制会在获取锁成功后启动一个后台线程,定期检查当前线程是否持有锁,如果持有锁,则会自动续期锁的持有时间,从而避免锁的过期和释放。
//第一个参数 0 表示等待获取锁的时间,如果为 0,则表示不等待直接返回获取锁的结果。
//第二个参数 -1 表示锁的持有时间,如果为 -1,则表示锁的持有时间为无限长。则看门狗就会一直运行下去,直到当前线程释放锁
//第三个参数 TimeUnit.MILLISECONDS 表示时间单位为毫秒。
if (lock.tryLock(0, -1, TimeUnit.MILLISECONDS)) {
//写缓存,默认30s过期
try {
} catch (Exception e) {
}
}
}
} catch (InterruptedException e) {
log.error("doCacheRecommendUser error", e);
} finally {
// 只能释放自己的锁
if (lock.isHeldByCurrentThread()) {
System.out.println("unLock: " + Thread.currentThread().getId());
lock.unlock();
}
}
}
}
- Vue 3 开发框架(提高页面开发的效率)
- Vant UI(基于 Vue 的移动端组件库)(React 版 Zent)
- Vite 2(打包工具,快!)
- Nginx 来单机部署
- Java 编程语言 + SpringBoot 框架
- SpringMVC + MyBatis + MyBatis Plus(提高开发效率)
- MySQL 数据库
- Redis 缓存
- Swagger + Knife4j 接口文档
- sql
- create_table.sql:项目建表sql
- src
- main
- java
- common :通用工具包
- BaseResponse : 通用返回类
- ErrorCode :错误码枚举类
- PageRequest:分页请求封装类
- ResultUtils:返回工具类
- config
- SwaggerConfig : 接口文档配置
- RedisTempleConfig:自定义redis序列化
- RedissonConfig:redisson配置
- WebMvcConfg:配置跨域
- contant:常量包
- UserConstant: 用户常量类
- common :通用工具包
- java
- main
通过使用UserConstant接口,可以将用户相关的常量进行统一管理,从而方便在代码中进行使用
- controller
- TeamController:队伍处理逻辑接口
- UserController:用户处理逻辑接口
- exception:异常处理
- BusinessException:自定义异常类
通过使用BusinessException类,可以方便地处理业务异常,并将异常信息进行统一管理。在代码中,可以通过抛出BusinessException异常来表示业务异常,并在异常处理中进行相应的处理。
- GlobalExceptionHandler:全局异常处理器
@RestControllerAdvice注解来标识该类为全局异常处理器,通过使用 @ExceptionHandler(BusinessException.class) 和@ExceptionHandler(RuntimeException.class)来分别自动调用业务异常处理方法和运行时异常处理方法。
- job
- PreCacheJob
使用redisson分布式锁和RedisTemplate来实现缓存预热。提高重点用户的体验感
- mapper:Mybatis Plus数据访问接口
- TagMapper
- TeamMapper
- UserMapper
- UserTeamMapper
- model:模型层
- domain:实体
- Team:队伍实体类
- User:用户实体类
- UserTeam:用户队伍关系实体类
- dto:数据传输
- TeamQuery:队伍查询封装类
- enums
- TeamStatusEnum
队伍状态枚举类,0-公开 1-私有 2-加密
- request:参数请求包
为什么需要请求参数包装类? 1. 请求参数名称 / 类型和实体类不一样 2. 有一些参数用不到,如果要自动生成接口文档,会增加理解成本 3. 有些字段需要隐藏,不能返回给前端
- DeleteRequest:删除请求体
- TeamAddRequest:用户创建队伍请求体
- TeamJoinRequest:用户加入队伍请求体
- TeamQuitRequest:用户退出队伍请求体
- TeamUpdateRequest:队伍更新请求体
- UserLoginRequest:用户登录请求体
- UserRegisterRequest:用户注册请求体
- VO
- TeamUserVO: 队伍和用户信息封装类
- UserVO: 用户包装类(脱敏)
- scripts
- XingQiuTableUserInfo
将表格与对象关联起来
- InsertUsers
批量插入用户
- ImportExcel
导入表格,两种方式读
1. 绑定监听器 2. 同步读
- TableListener
读Excel监听器,在读文件的时候绑定监听器
- service:业务逻辑实现层
- impl
- TeamServiceImpl: 队伍接口实现类
- UserServiceImpl:用户接口实现类
- UserTeamServiceImpl:用户队伍接口实现类
- TeamService:队伍业务接口
- UserService:用户业务接口
- UserTeamService:用户队伍业务接口
- utils:工具包
- AlgorithmUtils
编辑距离算法,实现智能匹配相似用户
- yupoApplication: Spring Boot 应用程序的启动类
- resource:资源文件
- mapper: 存放mybatis的sql配置文件
- application.yml
Spring Boot主配置文件,这个文件通常包含了应用程序的基本配置,例如数据库连接、日志记录、端口号等信息。这个文件中的配置适用于所有的环境,包括开发、测试和生产环境。
- application-prod.yml
针对生产环境的配置文件。这个文件中包含了一些特定于生产环境的配置信息,例如数据库连接池大小、缓存配置、安全配置等。这个文件中的配置会覆盖
application.yml
中的相同配置,以适应生产环境的需求。
- test: Spring Boot的单元测试
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/你的数据库名字
username: 你的数据库账号
password: 你的数据库密码
redis:
port: 你的redis端口
host: 你的redis地址
database: 1 #默认是0
- 启动yupoApplication