## 东莞理工学院网络空间安全学院
| **课程名称:** | 企业级开发框架专题 | **学期**:2020秋季 |
| :----------------- | :-------------------------------------------: | :------------------: |
| **实验名称**: |期末大作业:基于微信小程序的新零售移动电商系统设计与实验 | **实验序号**:期末大作业 |
| **组长姓名**:xxx | **组长学号**:xxx | **班级**:xxx |
| **实验地址**:xxx | **实验日期**:2020-12-10 | **指导老师**:xxx |
| **教师评语**:XXX | **实验成绩**:XXX | **同组同学**:xxx
## 期末大作业:基于微信小程序的新零售移动电商系统设计与实验
<br> **基于小程序和Spring Boot的奶茶点单系统**
### 一.项目背景
<br> 受新冠疫情影响,消费者闭门不出,线下门店纷纷关闭,实体经济收到重大冲击。除了疫情的挑战,传统
<br>零售与传统电商,一直被效率、场景、管控等问题困扰。
<br> 新零售赋能传统零售转型升级。线上商城与线下门店的交易无缝缝合,通过技术改变消费者的习惯,集合
<br>结合高效的物流配送,极大提高消费者的购物体验。基于微信的生态圈用户流量,让平台更快的传播获客,吸引
<br>海量用户资源。
### 二.需求分析
<br>本项目需要分为两个客户端:
1. **用户端**
![输入图片说明](https://images.gitee.com/uploads/images/2021/0108/204756_2c80bc8a_4796963.png "屏幕截图.png")
2. **后台管理端**
![输入图片说明](https://images.gitee.com/uploads/images/2021/0108/205013_17ee09ba_4796963.png "屏幕截图.png")
![输入图片说明](https://images.gitee.com/uploads/images/2021/0108/205103_b6c610bc_4796963.png "屏幕截图.png")
### 三.技术栈
#### 客户端
微信小程序
#### 后台前端
React,Ant组件库
#### 后台后端
SpringBoot,Mysql
### 四.具体实现
#### 客户端
客户端采用小程序为客户提供图形界面,方便客户查看商品,下订单,查看订单状态
#### 前端
##### 1.登录:
客户可以使用微信一键登录进入小程序,小程序会保存用户的登录信息
![输入图片说明](https://images.gitee.com/uploads/images/2021/0110/061934_35dc0c9b_4796963.png "屏幕截图.png")
![输入图片说明](https://images.gitee.com/uploads/images/2021/0110/062023_c926fdc2_4796963.png "屏幕截图.png")
##### 2.首页(展示推荐信息,公告图片):
![输入图片说明](https://images.gitee.com/uploads/images/2021/0110/064927_97975e2d_4796963.png "屏幕截图.png")
##### 3.点单页面
点单页面为客户展示商品列表以供选购
![输入图片说明](https://images.gitee.com/uploads/images/2021/0110/071637_eafb6713_4796963.png "屏幕截图.png")
##### 4.购物车页面
客户可以在购物车页面查看自己选购了那些商品,并提供下单入口
![输入图片说明](https://images.gitee.com/uploads/images/2021/0110/072110_a16121dc_4796963.png "屏幕截图.png")
##### 5.订单页面
订单页面向客户展示了客户的历史订单,以及未完成订单
![输入图片说明](https://images.gitee.com/uploads/images/2021/0110/072514_6da64baa_4796963.png "屏幕截图.png")
##### 6.客户个人信息页面
客户可以在这个页面查看自己的个人信息,退出登录
![输入图片说明](https://images.gitee.com/uploads/images/2021/0110/073044_8880c001_4796963.png "屏幕截图.png")
##### 小程序端操作说明
##### 7.下订单
![输入图片说明](https://images.gitee.com/uploads/images/2021/0110/073452_8ae3054b_4796963.png "屏幕截图.png")
##### 8.在购物车结算
![输入图片说明](https://images.gitee.com/uploads/images/2021/0110/073526_d7ac4866_4796963.png "屏幕截图.png")
##### 9.支付
![输入图片说明](https://images.gitee.com/uploads/images/2021/0110/073548_2b708853_4796963.png "屏幕截图.png")
##### 10.未取餐订单
支付以后可以在未取餐订单中查看已下订单
![输入图片说明](https://images.gitee.com/uploads/images/2021/0110/074203_94674fad_4796963.png "屏幕截图.png")
#### 后端
后端主要提供的功能:
##### 1.“为你推荐”接口
在首页中随机显示8款奶茶
```java
@GetMapping("recommend")
@ApiOperation(value = " 首页“为你推荐”")
public List<Milktea> recommend() {
随机选择8款奶茶向用户推荐
Integer nums = 8;
Integer start = 1;
Integer end = countMilktea();
//1.创建集合容器对象
List list = new ArrayList();
List ret = new ArrayList();
//2.创建Random对象
Random r = new Random();
//循环将得到的随机数进行判断,如果随机数不存在于集合中,则将随机数放入集合中,如果存在,则将随机数丢弃不做操作,进行下一次循环,直到集合长度等于nums
while (list.size() != nums) {
Integer num = r.nextInt(end - start) + start;
if (!list.contains(num)) {
list.add(num);
}
}
for (Object l : list) {
NumberFormat formatter = NumberFormat.getNumberInstance();
String s = formatter.format(Integer.parseInt(l.toString()));
// System.out.println(s);
ret.add(selectOneMilktea(s));
}
return ret;
}
```
mapper语句:
```xml
<select id="selectMilkteaById" resultType="com.demo01.demo.entity.Milktea">
select *
from milktea
where id = #{id}
</select>
```
##### 2.按种类排序返回全部奶茶接口
用于小程序点单页面按照种类显示奶茶。先获取奶茶的种类数,然后根据种类id将全部奶茶按照种类装到各个数组中,再将这些数组装到一个大数组中
```java
@GetMapping("selectAllByType")
@ApiOperation(value = "返回全部的奶茶 会按奶茶种类排序")
public List<List<Milktea>> selectAllByType(String type) {
List<List<Milktea>> res= new ArrayList<List<Milktea>>();
int countType = countType();
for (int i = 0; i < countType; i++) {
List<Milktea> temp = selectByType(Integer.toString(i+1) );
res.add(temp);
}
return res;
}
```
mapper语句:
```xml
<select id="selectByType" resultType="com.demo01.demo.entity.Milktea">
select *
from milktea
where type = #{type}
</select>
```
##### 3.用户登录接口
用于用户使用微信进行登录的接口。先判断从小程序获得的openid是否为空,为空则登录失败返回空值,否则查询数据库该openid是否已存入数据库,未存入则将该openid与用户昵称插入数据库并且后端返回存有openid该用户对象,否则只更新用户昵称并返回存有对应用户信息的用户对象。
```java
@PostMapping("login")
@ApiOperation(value = "登录")
public User login(@RequestBody LoginInfoDTO loginInfoDTO) {
String openid = loginInfoDTO.getOpenid();
String nickname = loginInfoDTO.getNickname();
User res = userService.login(openid);
if (res.getOpenid() != null) {
res.setNickname(nickname);
userService.setNickName(res);
}
return res;
}
//userService.login(String openid)方法
@Override
public User login(String openid) {
if (openid.equals("")) {
System.out.println("ID是空的,无法登陆");
return new User();
}
User successUser = userMapper.login(openid);
if (null == successUser) {
this.logon(openid);
User user = new User();
user.setOpenid(openid);
return user;