酒旅项目总结
一. 项目介绍
近年来,随着社会的快速发展,各地的旅客量迅速增加,宾馆数量也随之急剧增加,这就使得当用户面对如此多的酒店时不知道该如何选取,哪个酒店更适合自己,这样就需要有一种方便快捷的方式,可以让用户随时随地可以获取到符合自身需求的酒店信息,这就是我们今天所做的酒旅项目。
这个项目是基于微信的小程序,在当今时代,手机几乎就是人们的生活必需品,而微信又基本成为了手机的一个基本功能,所以基于微信的小程序对于用户来说十分友好,当用户外出旅行或工作,都可以随时获取到自己所处位置的所有酒店信息,可以让用户进行各种纬度的比较,选择出适合自己的酒店。
二. 项目需求分析
一个预定酒店的程序,那就肯定涉及到用户,酒店(商家),平台三个部分,所有以我们需要有:
-
前台系统
用户前台服务系统(用于用户订购)
-
后台系统
酒店(商家)后台服务系统(用于酒店管理自身基本信息,房间数量,评价等)
平台后台服务系统(用户管理用户,酒店,一些平台公告等)
组织结构
hotel-parent ├── config -- 配置中心存储配置 ├── docunment -- 项目文件 ├── project-admin -- 后台管理系统服务 ├── project-auth -- 基于Spring Security Oauth2的统一的认证中心 ├── project-common -- 工具类及通用代码块 ├── project-gateway -- 基于Spring Cloud Gateway的微服务API网关服务 ├── project-job -- 分布式调度系统 ├── project-mbg -- MyBatisGenerator 生成的数据库操作代码模块 ├── project-monitor -- 基于spring Boot Admin 的微服务监控中心 ├── project-portal -- 前台门户系统服务 └── project-search -- 基于Elasticsearch的商品搜索系统服务
三. 系统架构图
架构图的简析
1.Nginx 作用:反向代理 负载均衡 前端程序一般部署在Nginx中
Nginx是一款轻量级的HTTP服务器,采用事件驱动的异步非阻塞处理方式框架,这让其具有极好的IO性能,时常用于服务端的反向代理和负载均衡 。
好处:
- 轻松支持 https
- 解决前后端跨域问题
- 前后端解耦,方便维护以及负载均衡
- Nginx静态资源处理性能要比后端常用的容器高数倍
- Nginx接收外部访问,类似于后端服务的防火墙,更安全
2.Gateway API 网关
微服务系统中,所有前端请求首先要通过网关,才能访问后端的业务功能。API 网关是一个处于应用程序或服务(提供 REST API 接口服务)之前的系统,用来管理授权、访问控制和流量限制等,这样 REST API 接口服务就被 API 网关保护起来,对所有的调用者透明。因此,隐藏在 API 网关后面的业务系统就可以专注于创建和管理服务,而不用去处理这些策略性的基础设施。
3.Nacos 微服务注册与配置中心 相当于cloud的config Eureka Bus
微服务系统中,所有的微服务都要注册到Nacos中,方便我们管理,同时只有注册了以后,微服务之间才可以调用。我们也可以将微服务的配置文件按照一定的格式放置与配置中心,当我们修改配置文件时,不需要在程序中修改,只要在配置中心修改即可,微服务会自动获取,不用重新启动。
4.Ribbon OpenFeign 用于微服务之间的调用,负载均衡
某个服务服务未注册时,通过Ribbon的方式可以调用该微服务中的接口,而openFeign必须是注册的微服务才行
5.Sentinel 熔断降级
在调用微服务时,微服务可能发生某些意外,造成微服务不可用,这时候就需要熔断降级
四.我所负责模块
在整个项目中,我负责微信小程序用户登录的模块
1.技术选型(后端技术)
技术 | 说明 |
---|---|
SpringBoot | 容器+MVC框架 |
MyBatis-Plus | ORM框架 |
SpringSecurity | 认证和授权框架 |
OAuth2 | OAuth2授权支持 |
JWT | JWT登录支持 |
Lombok | 简化对象封装根据 |
Hutool | Java工具类库 |
knife4j | 文档生成工具 |
Hibernator-Validator | 验证框架 |
2.登录流程图
3.数据库设计
user_info 用户信息表
user_login_info 用户登录表
数据库设计注意事项:
- 金钱使用bigint
- 一般情况下数据库必须有createTime updateTime deleted 字段
- 数据类型一般设置长度
- 字段尽量不为空
- 一个表索引不要太多,也不能没有
- 数据库设计的三大范式(不一定全部遵循,可以适当冗余)
- 时间设置使用timestamp
4.接口设计
微信小程序登录接口
响应示例
5.代码的编写
controller层代码
/**
* 用户登录 前端控制器
* @author 宋宏章
* @since 2022-04-17
*/
@RestController
@RequestMapping("/login")
public class UserLoginController {
@Resource
private PasswordEncoder passwordEncoder;
@Autowired
private IUserLoginService loginService;
/**
* 用户登录
* @param loginRequestDTO 登录请求DTO
* @return map 令牌+用户信息Id
* @author 宋宏章
*/
@PostMapping
public CommonResult<Map> login(@NotNull LoginRequestDTO loginRequestDTO){
return loginService.login(loginRequestDTO);
}
/**
* 通过用户名查询用户登录信息
* @param username
* @return 用户对象
* @author 宋宏章
*/
@GetMapping("/username")
public CommonResult<UserLogin> getUserByUsername(@RequestParam("username") @NotNull String username){
UserLogin user = loginService.getUserByUsername(username);