【瑞吉外卖】学习笔记-day6:(一)导入用户地址簿相关功能及菜品展示
导入用户地址簿相关功能:
需求分析:
- 地址簿,指的是移动端消费者用户的地址信息
- 用户登录成功后可以维护自己的地址信息
- 同一个用户可以有多个地址信息,但是只能有一个默认地址。
页面展示:
数据模型:
用户的地址信息会存储在address_book表(地址簿表)中:
代码开发:
- 实体类AddressBook
- Mapper接口AddressBookMapper
- 业务层接口AddressBookService
- 业务层实现类AddressBookServicelmpl
- 控制层AddressBookController
实体AddressBook:
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;/*** 地址簿*/
@Data
public class AddressBook implements Serializable {private static final long serialVersionUID = 1L;private Long id;//用户idprivate Long userId;//收货人private String consignee;//手机号private String phone;//性别 0 女 1 男private String sex;//省级区划编号private String provinceCode;//省级名称private String provinceName;//市级区划编号private String cityCode;//市级名称private String cityName;//区级区划编号private String districtCode;//区级名称private String districtName;//详细地址private String detail;//标签private String label;//是否默认 0 否 1是private Integer isDefault;//创建时间@TableField(fill = FieldFill.INSERT)private LocalDateTime createTime;//更新时间@TableField(fill = FieldFill.INSERT_UPDATE)private LocalDateTime updateTime;//创建人@TableField(fill = FieldFill.INSERT)private Long createUser;//修改人@TableField(fill = FieldFill.INSERT_UPDATE)private Long updateUser;//是否删除private Integer isDeleted;
}
AddressBookMapper接口:
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.itzq.reggie.entity.AddressBook;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface AddressBookMapper extends BaseMapper<AddressBook> {
}
AddressBookService业务接口:
import com.baomidou.mybatisplus.extension.service.IService;
import com.itheima.reggie.entity.AddressBook;public interface AddressBookService extends IService<AddressBook> {
}
AddressBookServiceImpl业务接口实现类:
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.reggie.entity.AddressBook;
import com.itheima.reggie.mapper.AddressBookMapper;
import com.itheima.reggie.service.AddressBookService;
import org.springframework.stereotype.Service;@Service
public class AddressBookServiceImpl extends ServiceImpl<AddressBookMapper, AddressBook> implements AddressBookService {
}
控制层AddressBookController:
@RestController
@RequestMapping("/addressBook")
@Slf4j
public class AddressBookController {@Autowiredprivate AddressBookService addressBookService;
}
增加功能:
1、新增地址
/*** 新增地址*/@PostMappingpublic R<AddressBook> save(@RequestBody AddressBook addressBook) {addressBook.setUserId(BaseContext.getCurrentId());log.info("addressBook:{}", addressBook);addressBookService.save(addressBook);return R.success(addressBook);}
2、设置默认地址
/*** 设置默认地址*/@PutMapping("default")public R<AddressBook> setDefault(@RequestBody AddressBook addressBook) {log.info("addressBook:{}", addressBook);LambdaUpdateWrapper<AddressBook> wrapper = new LambdaUpdateWrapper<>();//设置用户id,设置默认地址初始值为0(不是默认地址)wrapper.eq(AddressBook::getUserId, BaseContext.getCurrentId());wrapper.set(AddressBook::getIsDefault, 0);//SQL:update address_book set is_default = 0 where user_id = ?addressBookService.update(wrapper);//将指定地址改为1(设置成默认地址)addressBook.setIsDefault(1);//SQL:update address_book set is_default = 1 where id = ?addressBookService.updateById(addressBook);return R.success(addressBook);}
对应数据库中is_default字段:1为默认地址
3、根据id查询地址
/*** 根据id查询地址*/@GetMapping("/{id}")public R get(@PathVariable Long id) {AddressBook addressBook = addressBookService.getById(id);if (addressBook != null) {return R.success(addressBook);} else {return R.error("没有找到该对象");}}
4、查询默认地址
/*** 查询默认地址*/@GetMapping("default")public R<AddressBook> getDefault() {LambdaQueryWrapper<AddressBook> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(AddressBook::getUserId, BaseContext.getCurrentId());queryWrapper.eq(AddressBook::getIsDefault, 1);//SQL:select * from address_book where user_id = ? and is_default = 1AddressBook addressBook = addressBookService.getOne(queryWrapper);if (null == addressBook) {return R.error("没有找到该对象");} else {return R.success(addressBook);}}
5、查询指定用户的全部地址
/*** 查询指定用户的全部地址*/@GetMapping("/list")public R<List<AddressBook>> list(AddressBook addressBook) {addressBook.setUserId(BaseContext.getCurrentId());log.info("addressBook:{}", addressBook);//条件构造器LambdaQueryWrapper<AddressBook> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(null != addressBook.getUserId(), AddressBook::getUserId, addressBook.getUserId());queryWrapper.orderByDesc(AddressBook::getUpdateTime);//SQL:select * from address_book where user_id = ? order by update_time descreturn R.success(addressBookService.list(queryWrapper));}
遗留待实现的功能:修改和删除地址
菜品展示:
需求分析:
- 用户登录成功后跳转到系统首页,在首页需要根据分类来展示菜品和套餐
- 如果菜品设置了口味信息,需要展示选择规格按钮,否则显示+按钮
交互流程:
- 页面(front/index.html)发送ajax请求,获取分类数据(菜品分类和套餐分类)
- 页面发送ajax请求,获取第一个分类下的菜品或者套餐
开发菜品展示功能,其实就是在服务端编写代码去处理前端页面发送的这2次请求即可
注意:首页加载完成后,页面还发送了一次ajax请求用于加载购物车数据,,前端代码要求他俩必须同时都成功,前端页面才能够渲染成功,所以此处可以将这次请求的地址暂时修改一下,从静态json文件获取数据,等后续开发购物车功能时再修改回来,如下:
//获取购物车内商品的集合
function cartListApi(data) {return $axios({// 'url': '/shoppingCart/list','url':'/front/cartData.json','method': 'get',params:{...data}})
}
cartData.json:
{"code":1,"msg":null,"data":[],"map":{}}
修改DishController中的list方法:返回时包含菜品口味信息
@GetMapping("/list")
public R<List<DishDto>> list(Dish dish) {//构造查询条件LambdaQueryWrapper<Dish> lambdaQueryWrapper = new LambdaQueryWrapper<>();//添加条件,查询状态为1的(起售状态)lambdaQueryWrapper.eq(Dish::getStatus, 1);lambdaQueryWrapper.eq(dish.getCategoryId() != null, Dish::getCategoryId, dish.getCategoryId());//条件排序条件lambdaQueryWrapper.orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime);List<Dish> list = dishService.list(lambdaQueryWrapper);List<DishDto> dishDtoList = list.stream().map((item) -> {DishDto dishDto = new DishDto();BeanUtils.copyProperties(item, dishDto);Long categoryId = item.getCategoryId();//根据id查分类对象Category category = categoryService.getById(categoryId);if (category != null) {String categoryName = category.getName();dishDto.setCategoryName(categoryName);}//当前菜品idLong dishId = item.getId();LambdaQueryWrapper<DishFlavor> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(DishFlavor::getDishId, dishId);//SQL: select* from dishflavor where dish_id=?;List<DishFlavor> dishFlavorlist = dishFlavorService.list(queryWrapper);dishDto.setFlavors(dishFlavorlist);return dishDto;}).collect(Collectors.toList());return R.success(dishDtoList);
}
在SetmealController里添加list方法显示套餐信息:
@GetMapping("/list")
public R<List<Setmeal>> list(Setmeal setmeal){LambdaQueryWrapper<Setmeal> queryWrapper=new LambdaQueryWrapper<>();queryWrapper.eq(setmeal.getCategoryId()!=null,Setmeal::getCategoryId,setmeal.getCategoryId());queryWrapper.eq(setmeal.getStatus()!=null,Setmeal::getStatus,setmeal.getStatus());queryWrapper.orderByDesc(Setmeal::getUpdateTime);List<Setmeal> list = setmealService.list(queryWrapper);return R.success(list);
}
【瑞吉外卖】学习笔记-day6:(一)导入用户地址簿相关功能及菜品展示相关推荐
- 瑞吉外卖项目:移动端导入用户地址簿与菜品展示功能实现
一. 移动端导入用户地址簿 1. 需求分析 用户登录移动端,需要消费者填写并维护自己的地址信息,此功能需要实现一个用户可以有多个地址但是只能存在一个默认的地址. 数据模型 涉及的一张地址表:addre ...
- 【瑞吉外卖开发笔记】
瑞吉外卖开发笔记 源码地址 一.业务开发Day01 1.软件开发整体介绍 软件开发流程 角色分工 软件环境 2.瑞奇外卖项目介绍 项目介绍 产品原型展示 技术选型 功能架构 角色 3.环境搭建 开发环 ...
- 瑞吉外卖项目笔记+踩坑1——基础功能
导航: [黑马Java笔记+踩坑汇总]JavaSE+JavaWeb+SSM+SpringBoot+瑞吉外卖+SpringCloud/SpringCloudAlibaba+黑马旅游+谷粒商城 目录 1 ...
- 瑞吉外卖day01笔记
一. 软件开发整体介绍 作为一名软件开发工程师,我们需要了解在软件开发过程中的开发流程, 以及软件开发过程中涉及到的岗位角色,角色的分工.职责, 并了解软件开发中涉及到的三种软件环境.那么这一小节,我 ...
- 瑞吉外卖项目——起售、停售和批量起售、停售菜品功能
需求分析 当点击停售按钮时菜品无法售卖.选中多个菜品时点击批量停售,这些选择的菜品停止售卖. 接收路径中的变量status和请求体中的参数,参数用long数组接收, 根据接收到的参数status和id ...
- 瑞吉外卖(27)-查看购物车信息、清空购物车功能开发
文章目录 代码开发 查看购物车信息 修改前端请求 编写ShoppingCartController.java 注意createtime字段 功能测试 清空购物车 自己的思路与代码 分析前端请求 Sho ...
- 瑞吉外卖-全网最全笔记-Day06
业务开发Day6-01-本章内容介绍 目录 导入用户地址簿相关功能代码 菜品展示 购物车 下单 效果展示 业务开发Day6-02-导入用户地址簿相关代码 需求分析 地址簿,指的是移动端消费者用户的地址 ...
- 黑马瑞吉外卖、菩提阁学习总结
一.项目基础 技术选型: 用户层:H5.Vue.js.ElementUI.微信小程序 网关层:Nginx 应用层:SpringBoot.SpringMVC.SpringSession.Spring.S ...
- Java实战项目《瑞吉外卖》
目录 <瑞吉外卖>后台管理系统开发 软件开发整体介绍 1.软件开发流程 2.角色分工 3.软件环境 瑞吉外卖项目介绍 1.项目介绍 2.产品原型展示 3.技术选型 4.功能架构 5.角色 ...
最新文章
- 实验四-常用图像增强方法
- 数据库迁移用到的命令
- windowserver2008官方不提供POP3服务
- [SHOI2017]组合数问题
- 记录kafka-flink bug
- sqlyog表添加列_如何用数据透视表求差,而不是求和?
- Swift傻傻分不清楚系列(六)集合类型
- JavaScript对象的创建总结
- NLP《词汇表示方法(三)word2vec》
- usb 键盘码表_键盘鼠标对应码表-delphi键值
- 魅族 android 文件传输,魅族手机跟安卓设备如何实现wifi互传
- 微信小程序背景图片 模拟器正常显示 真机无法显示
- 程序员自我修养阅读笔记——Windows PE/COFF
- Unity Shader零基础入门2:环境光、漫反射、高光
- Python 编码检测与编码转换
- torch.bmm 函数
- 小学生计算能力测试系统设计
- 计算机房精密空调术语,精密空调8大制冷形式,40个专业术语
- SecureCRT for linux安装教学
- MYSQL数据累加后出现断层问题
热门文章
- 蓝牙计算机操作与设置在哪里,ThinkPad蓝牙的设置方法步骤
- (漫画)一只蝙蝠的自述在朋友圈火了:千万不要再吃野味了!
- mysql tpcc 测试结果分析_tpcc-mysql运行结果解读
- Android Studio汉化(插件教程)
- Java毕设项目车牌信息管理系统计算机(附源码+系统+数据库+LW)
- Google Earth Engine APP——MODIS海洋表明温度chart图简单工具
- 28335 CAN 接受邮箱中断配置,解决进不了中断函数的问题
- 高通研发出无线充电系统
- LRC软件测试简历,Lrc歌词编辑器
- 江苏高等学校计算机等级考试中心,江苏省高等学校计算机等级考试中心