【项目-Java】苍穹外卖Day1(二)-苍穹外卖项目介绍


【项目-Java】苍穹外卖Day1(二)-苍穹外卖项目介绍

项目介绍

1
2
3
4
5
本项目(苍穹外卖)是专门为餐饮企业(餐厅、饭店)定制的一款软件产品
包括 系统管理后台 和 小程序端应用 两部分

其中系统管理后台主要提供给餐饮企业内部员工使用,可以对餐厅的分类、菜品、套餐、订单、员工等进行管理维护,对餐厅的各类数据进行统计,同时也可进行来单语音播报功能
小程序端主要提供给消费者使用,可以在线浏览菜品、添加购物车、下单、支付、催单等

系统管理后台和小程序端应用

功能架构图

管理端功能

  • 员工登录/退出
  • 员工信息管理
  • 分类管理
  • 菜品管理
  • 套餐管理
  • 菜品口味管理
  • 订单管理
  • 数据统计
  • 来单提醒

用户端功能

  • 微信登录
  • 收件人地址管理
  • 用户历史订单查询
  • 菜品规格查询
  • 购物车功能
  • 下单
  • 支付
  • 分类及菜品浏览

产品原型

  • 产品原型,用于展示项目的业务功能,一般由产品经理进行设计

注意事项: 产品原型主要用于展示项目的功能,并不是最终的页面效果

两份产品原型

  • 管理端原型图

管理端原型图

  • 用户端原型图

用户端原型图

管理端

  • 餐饮企业内部员工使用
  • 主要功能:
模块描述
登录/退出内部员工必须登录后,才可以访问系统管理后台
员工管理管理员可以在系统后台对员工信息进行管理,包含查询、新增、编辑、禁用等功能
分类管理主要对当前餐厅经营的 菜品分类 或 套餐分类 进行管理维护, 包含查询、新增、修改、删除等功能
菜品管理主要维护各个分类下的菜品信息,包含查询、新增、修改、删除、启售、停售等功能
套餐管理主要维护当前餐厅中的套餐信息,包含查询、新增、修改、删除、启售、停售等功能
订单管理主要维护用户在移动端下的订单信息,包含查询、取消、派送、完成,以及订单报表下载等功能
数据统计主要完成对餐厅的各类数据统计,如营业额、用户数量、订单等

用户端

  • 移动端应用主要提供给消费者使用
  • 主要功能:
模块描述
登录/退出用户需要通过微信授权后登录使用小程序进行点餐
点餐-菜单在点餐界面需要展示出菜品分类/套餐分类, 并根据当前选择的分类加载其中的菜品信息, 供用户查询选择
点餐-购物车用户选中的菜品就会加入用户的购物车, 主要包含 查询购物车、加入购物车、删除购物车、清空购物车等功能6
订单支付用户选完菜品/套餐后, 可以对购物车菜品进行结算支付, 这时就需要进行订单的支付
个人信息在个人中心页面中会展示当前用户的基本信息, 用户可以管理收货地址, 也可以查询历史订单数据

技术选型

  • 用户层网关层应用层数据层 这几个方面进行介绍
  • 主要用于展示项目中使用到的技术框架和中间件等

技术选型

用户层

  • 本项目中在构建系统管理后台的前端页面,用到H5Vue.jsElementUIapache echarts(展示图表)等技术。而在构建移动端应用时,我们会使用到微信小程序

网关层

  • Nginx主要用来作为Http服务器,部署静态资源,访问性能高
  • Nginx中还有两个比较重要的作用: 反向代理和负载均衡
  • 在进行项目部署时,要实现Tomcat的负载均衡,就可以通过Nginx来实现

应用层

  • SpringBoot: 快速构建Spring项目, 采用 “约定优于配置” 的思想, 简化Spring项目的配置开发
  • SpringMVCSpringMVCspring框架的一个模块,springmvcspring无需通过中间整合层进行整合,可以无缝集成
  • Spring Task: 由Spring提供的定时任务框架
  • httpclient: 主要实现了对http请求的发送
  • Spring Cache: 由Spring提供的数据缓存框架
  • JWT: 用于对应用程序上的用户进行身份验证的标记
  • 阿里云OSS: 对象存储服务,在项目中主要存储文件,如图片等
  • Swagger: 可以自动的帮助开发人员生成接口文档,并对接口进行测试
  • POI: 封装了对Excel表格的常用操作
  • WebSocket: 一种通信网络协议,使客户端和服务器之间的数据交换更加简单,用于项目的来单、催单功能实现

数据层

  • MySQL:关系型数据库, 本项目的核心业务数据都会采用MySQL进行存储
  • Redis: 基于key-value格式存储的内存数据库, 访问速度快, 经常使用它做缓存
  • Mybatis: 本项目持久层将会使用Mybatis开发
  • pagehelper: 分页插件
  • spring data redis: 简化java代码操作RedisAPI

工具

  • git: 版本控制工具, 在团队协作中, 使用该工具对项目中的代码进行管理
  • maven: 项目构建工具
  • junit:单元测试工具,开发人员功能实现完毕后,需要通过junit对功能进行单元测试
  • postman: 接口测工具,模拟用户发起的各类HTTP请求,获取对应的响应结果

开发环境搭建

开发环境搭建

前端环境搭建

前端工程基于nginx

前端工程基于nginx

sky目录中存放了管理端的前端资源

sky目录中存放管理端的前端资源

启动nginx,访问测试

后端环境搭建

熟悉项目结构

  • 后端工程基于 maven进行项目构建,并且进行分模块开发

后端项目结构1

后端项目结构2

工程模块说明
序号名称说明
1sky-take-outmaven父工程,统一管理依赖版本,聚合其他子模块
2sky-common子模块,存放公共类,例如:工具类、常量类、异常类等
3sky-pojo子模块,存放实体类、VO、DTO等
4sky-server子模块,后端服务,存放配置文件、Controller、Service、Mapper等
sky-common
  • 模块中存放的是一些公共类,可以供其他模块使用

sky-common

  • 分析sky-common模块的每个包的作用
名称说明
constant存放相关常量类
context存放上下文类
enumeration项目的枚举类存储
exception存放自定义异常类
json处理json转换的类
properties存放SpringBoot相关的配置属性类
result返回结果类的封装
utils常用工具类
sky-pojo
  • 模块中存放的是一些 entityDTOVO

sky-pojo

  • 分析sky-pojo模块的每个包的作用
名称说明
Entity实体,通常和数据库中的表对应
DTO数据传输对象,通常用于程序中各层之间传递数据
VO视图对象,为前端展示数据提供的对象
POJO普通Java对象,只有属性和对应的getter和setter
sky-server
  • 模块中存放的是 配置文件配置类拦截器controllerservicemapper启动类

sky-server

  • 分析sky-server模块的每个包的作用
名称说明
config存放配置类
controller存放controller类
interceptor存放拦截器类
mapper存放mapper接口
service存放service类
SkyApplication启动类

Git版本控制

  1. 创建Git本地仓库

创建Git本地仓库1

创建Git本地仓库2

  1. 创建Git远程仓库
  1. 将本地文件推送到Git远程仓库

    (1) 提交文件至本地仓库

  • 忽略以下类型文件

忽略以下类型文件

  • 开始提交

开始提交

  • 中间出现:点击commit

(2)添加Git远程仓库地址

  • 复制远程地址
  • 添加地址

添加Git远程仓库地址1

添加Git远程仓库地址2

(3) 推送

推送到远程仓库

数据库环境搭建

  1. 从资料中找到sky.sql,点击该sql文件直接可创建数据库,所以不需要提前创建数据库,直接导入该文件执行即可

  2. 执行sky.sql文件

执行sky.sql文件1

执行sky.sql文件2

  1. 执行完成,共创建11张表

脚本执行完成

  • 每张表的说明
序号表名中文名
1employee员工表
2category分类表
3dish菜品表
4dish_flavor菜品口味表
5setmeal套餐表
6setmeal_dish套餐菜品关系表
7user用户表
8address_book地址表
9shopping_cart购物车表
10orders订单表
11order_detail订单明细表

参考资料中:《数据库设计文档》

前后端联调

  • 后端的初始工程中已经实现了登录功能,直接进行前后端联调测试即可

  • 实现思路:

实现思路

Controller层

在sky-server模块中,com.sky.controller.admin.EmployeeController

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
* 登录
*
* @param employeeLoginDTO
* @return
*/

@PostMapping("/login")
public Result<EmployeeLoginVO> login(@RequestBody EmployeeLoginDTO employeeLoginDTO) {
log.info("员工登录:{}", employeeLoginDTO);
//调用service方法查询数据库
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);
}

Service层

在sky-server模块中,com.sky.service.impl.EmployeeServiceImpl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
* 员工登录
*
* @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);
}

//密码比对
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;
}

Mapper层

在sky-server模块中,com.sky.mapper.EmployeeMapper

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.sky.mapper;

import com.sky.entity.Employee;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface EmployeeMapper {

/**
* 根据用户名查询员工
* @param username
* @return
*/
@Select("select * from employee where username = #{username}")
Employee getByUsername(String username);

}

nginx反向代理和负载均衡

前端请求地址

  • 后端接口地址

后端接口地址

通过nginx请求到后端

nginx反向代理

  • 将前端发送的动态请求由 nginx转发到后端服务器

nginx

好处
  • 提高访问速度

      • 因为nginx本身可以进行缓存,如果访问的同一接口,并且做了数据缓存,nginx就直接可把数据返回,不需要真正地访问服务端,从而提高访问速度。
  • 进行负载均衡

      • 所谓负载均衡,就是把大量的请求按照我们指定的方式均衡的分配给集群中的每台服务器。
  • 保证后端服务安全

      • 因为一般后台服务地址不会暴露,所以使用浏览器不能直接访问,可以把nginx作为请求访问的入口,请求到达nginx后转发到具体的服务中,从而保证后端服务的安全。

nginx代理

  • Copyrights © 2024-2025 brocademaple
  • 访问人数: | 浏览次数:

      请我喝杯咖啡吧~

      支付宝
      微信