文章目录
- 前言
- 项目启动与项目设计
- 环境搭建
- 实现登录
- 实现登录接口
前言
很久之前写了黑马苍穹外卖的项目 最近翻了下 项目技术栈 大致就是 springboot mybatis redis 前端分为后管和
小程序那套 记录下之前的实现过程和笔记 当作强化学习吧。
项目地址 https://gitee.com/lyh1999/minjiang-takeout
项目启动与项目设计
启动redis文件夹下的redis-server.exe
idea启动application
pc端后管项目运行 点击 nginx 下 nginx.exe 访问http://localhost:80 即可
注意 nginx目录不能有中文
小程序端 微信开发者工具运行前端项目代码 看效果
单商户外卖平台实现 为餐厅 饭店实现的软件产品
功能模块划分
管理端
员工管理 分类管理 菜品管理 套餐管理
订单管理 工作台 数据统计 来单提醒
用户端
微信登录 商品浏览 购物车 用户下单
微信支付 历史订单 地址管理 用户催单
技术选型
用户层 nodejs vuejs elementUI 微信小程序 apache echarts
网关层 Nginx
应用层 Spring Boot Spring MVC Spring Task(定时任务)
httpclient Spring Cache (缓存)
JWT (登录认证) 阿里云 OSS (对象存储服务) Swagger
POI (操作excel) WebSocket消息通信
数据层 MySQL Redis(缓存中间件) mybatis pagehelper(分页)
spring data redis
工具 git maven Junit postman/apifox
环境搭建
前端项目 运行环境 nginx localhost:80
前端运行启动 双击nginx.exe 访问 localhost:80
后端运行启动 skyApplication
后端项目架构 sky-common sky-pojo sky-server
sky-common 公共模块
这个模块通常用来存放所有其他模块共用的工具类、常量、配置文件等资源。比如日期处理工具、字符串操作工具、日志工具、自定义异常类、全局配置等。
sky-pojo java 对象模块
POJO 是 Plain Old Java Object 的缩写,指的是简单的Java对象,不依赖任何框架或库,只包含属性(成员变量)以及对应的getter和setter方法。存放实体类或者数据传输对象(DTO),用于表示业务中的概念模型,例如用户信息、订单信息等。这些POJO类可以在不同的层之间传递数据,如服务层到表现层。
sky-server
模块包含了应用程序的核心业务逻辑和服务端接口实现。这可能包括控制器(如果使用Spring MVC的话)、服务层、DAO层等。
它负责处理来自客户端的请求,调用必要的业务逻辑,并返回响应给客户端。此外,还可能涉及到事务管理、安全控制等功能。
实现登录
mysql数据导入 sky.sql
我采用的是dbeaver 导入sql文件 连接数据源 执行创建数据库
前后端联调 后端登录功能实现
controller 1 接收并封装参数 2 调用service方法查询数据库 3 封装结果并响应
service 1调用mapper查询数据库 2 密码对比 3 返回结果
mapper底层实现 1 select * from employee where usename = ?
给 新项目 导入maven
File->New->Module from Existing Sources 导入项目的pom.xml
idea编译项目 Lifecycle(生命周期) => compile (编译)
启动项目 启动类 sky-server src>main>java>skyApplication
修改数据库账户密码配置
sky-server/src/main/resources/application-dev.yml 将里面的账户密码修改为本地数据库的账户密码
启动nginx 打开前端网站 点击登录 测试连接
controller.admin 下 bug编译 可以进行断点调试 前端传入employeeLoginDTO对象信息
实现登录接口
EmployeeController
@RestController
@RequestMapping("/admin/employee")
@Slf4j
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
@Autowired
private JwtProperties jwtProperties;
/**
* 登录
*
* @param employeeLoginDTO
* @return
*/
@PostMapping("/login")
public Result<EmployeeLoginVO> login(@RequestBody EmployeeLoginDTO employeeLoginDTO) {
log.info("员工登录:{}", employeeLoginDTO);
Employee employee = employeeService.login(employeeLoginDTO);
//登录成功后,生成jwt令牌
Map<String, Object> claims = new HashMap<>();
claims.put(JwtClaimsConstant.EMP_ID, employee.getId());
String token = JwtUtil.createJWT(
jwtProperties.getAdminSecretKey(),
jwtProperties.getAdminTtl(),
claims);
EmployeeLoginVO employeeLoginVO = EmployeeLoginVO.builder()
.id(employee.getId())
.userName(employee.getUsername())
.name(employee.getName())
.token(token)
.build();
return Result.success(employeeLoginVO);
}
/**
* 退出
*
* @return
*/
@PostMapping("/logout")
public Result<String> logout() {
return Result.success();
}
}
EmployeeService
public interface EmployeeService {
/**
* 员工登录
* @param employeeLoginDTO
* @return
*/
Employee login(EmployeeLoginDTO employeeLoginDTO);
}
EmployeeServiceImpl
public class EmployeeServiceImpl implements EmployeeService {
@Autowired
private EmployeeMapper employeeMapper;
/**
* 员工登录
*
* @param employeeLoginDTO
* @return
*/
public Employee login(EmployeeLoginDTO employeeLoginDTO) {
String username = employeeLoginDTO.getUsername();
String password = employeeLoginDTO.getPassword();
//1、根据用户名查询数据库中的数据
Employee employee = employeeMapper.getByUsername(username);
//2、处理各种异常情况(用户名不存在、密码不对、账号被锁定)
if (employee == null) {
//账号不存在
throw new AccountNotFoundException(MessageConstant.ACCOUNT_NOT_FOUND);
}
//密码比对
// TODO 后期需要进行md5加密,然后再进行比对
// 先对输入的密码进行md5加密
password = DigestUtils.md5DigestAsHex(password.getBytes());
if (!password.equals(employee.getPassword())) {
//密码错误
throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);
}
if (employee.getStatus() == StatusConstant.DISABLE) {
//账号被锁定
throw new AccountLockedException(MessageConstant.ACCOUNT_LOCKED);
}
//3、返回实体对象
return employee;
}
}
EmployeeMapper
@Mapper
public interface EmployeeMapper {
/**
* 根据用户名查询员工
* @param username
* @return
*/
@Select("select * from employee where username = #{username}")
Employee getByUsername(String username);
}
EmployeeController => EmployeeService => EmployeeServiceImpl => EmployeeMapper
代码底层还是依靠sql 来实现 也即所谓的crud 增删改查吧