项目介绍
本项目(瑞吉外卖)是专门为餐饮企业(餐厅,饭店)定制的一款软件产品,包括系统管理后台和移动端应用两部分。其中系统管理后台主要是提供给餐饮行业内部人员使用,可以对餐厅的菜品,套餐,订单等进行管理维护。移动端应用主要提供给消费者使用,可以浏览菜品,添加购物车,下单等。
本项目共分为3期进行开发:
- 第一期主要实现基本需求,其中移动端应用通过H5实现,用户可以通过手机浏览器访问。
- 第二期主要争对移动端应用进行改进,使用微信小程序实现,用户使用起来方便。
- 第三期主要争对系统进行优化升级,提高系统的访问性能。
产品原型展示
**产品原型:**就是一款产品成型之前的一个简单的框架,就是将页面的排版布局展现出来,使产品的初步构思有一个可视化的展示。通过原型展示,可以更加直观的了解项目的需求和提供的功能。
项目中已经提供了产品原型:
注意事项:产品原型主要是用来展示项目的功能,并不是最终的页面效果。
技术选型
功能架构
角色
- 后台系统管理员:登录后台管理系统,拥有后台系统中的所有操作权限
- 后台系统普通员工:登录后台管理系统,对菜品,套餐。订单等进行管理
- C端用户:登录移动端用户,可以浏览菜品,添加购物车,设置地址,在线下单
开发环境搭建
- 数据库表的含义
- maven的环境搭建
<properties>
<mysql-verson>8.0.28</mysql-verson>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<!--配置文件application.yml可以提供提示-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<!--配置热部署-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--导入可以转化JSON-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
<!--导入工具类-->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.23</version>
</dependency>
<!-- mybatis-plus插件,这里不需要再引入mybatis的依赖,它会自动维护 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
<!--Lombok引入-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.0</version>
</parent>
- application.yml
server:
8080
spring:
datasource:
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/reggie
username: root
password: 123456
mybatis-plus:
configuration:
# 开启日志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 在映射实体或者属性时,将数据库中的表名和字段名的下划线去掉,使用驼峰命名法映射
map-underscore-to-camel-case: true
global-config:
db-config:
# 使用雪花算法
id-type: assign_id
- 配置静态资源映射
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
/**
* 配置静态资源映射
* @param registry
*/
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/backend/**").addResourceLocations("classpath:/backend/");
registry.addResourceHandler("/front/**").addResourceLocations("classpath:/front/");
}
}
后台登录开发
处理逻辑
登录开发:
* 1.将页面提交的密码password进行md5加密处理
* 2.根据页面提交的用户名username查询数据库
* 3.如果没有查询到则返回登录失败结果
* 4.密码比对,如果不一致则返回登录失败结果
* 5.查看员工状态,如果为已禁用状态,则返回员工已禁用结果
* 6.登录成功,将员工id存入Session并返回登录成功结果
处理流程
代码实现
(登录网址:http://localhost:8080/backend/page/login/login.html)
@PostMapping("/login")
public R<Employee> login(HttpServletRequest request, @RequestBody Employee employee){
// 因为前端返回的用户名和密码是使用JSON数据发送,所以必须要使用@RequestBody而不是直接使用实体类来接收
log.info(employee.toString());
// 1.将页面提交的密码password进行md5加密处理
String password = employee.getPassword();
password = DigestUtils.md5DigestAsHex(password.getBytes());
// 2.根据页面提交的用户名username查询数据库
QueryWrapper<Employee> queryWrapper = new QueryWrapper<Employee>();
queryWrapper.eq("username", employee.getUsername());
// 使用getOne方法是因为在数据库中使用了username唯一标识unique
Employee emp = employeeService.getOne(queryWrapper);
// 3.如果没有查询到则返回登录失败结果
if (emp == null){
return R.error("登录失败");
}
// 4.密码比对,如果不一致则返回登录失败结果
if (!emp.getPassword().equals(password)){
return R.error("密码错误");
}
// 5.查看员工状态,如果为已禁用状态,则返回员工已禁用结果
if (emp.getStatus() == 0){
return R.error("账号被禁用");
}
// 6.登录成功,将员工id存入Session并返回登录成功结果
request.setAttribute("employee", emp.getId());
return R.success(emp);
}
注意:方法中只能使用**@RequestBody**来接受数据,因为前端传递的是JSON数据
@RequestBody和@RequestParam的区别:
- @RequestParam指定的参数可以为普通元素,数组,集合,对象等等(@RequestBody是接受请求体中的数据,@RequestParam接受的是key-value的数据所以参数可以为上面提到的几种)。
- 如果参数放在请求体中,application/json传入后台中,则数据只能使用@RequestBody来接受,如果不放在请求体中则两者都可以使用。
后台推出登录开发
需求分析
代码实现
/**
* 员工退出
* @param request
* @return
*/
@PostMapping("/logout")
public R<String> logout(HttpServletRequest request){
// 清理网页中登录的用户ID
request.getSession().removeAttribute("employee");
return R.success("退出成功");
}