此项目根据黑马程序员视频所写
视频地址:
黑马程序员Java项目实战《瑞吉外卖》,轻松掌握springboot + mybatis plus开发核心技术的真java实战项目_哔哩哔哩_bilibili
这些与前面功能类似
芝士需实现以下内容:
1.新增套餐
/**
* 根据条件查询对应菜品数据
* @param dish
* @return
*/
@GetMapping("/list")
public R<List<Dish>> 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);
return R.success(list);
}
新增操作:
setmealController
/**
* 新增套餐
* @param setmealDto
* @return
*/
@PostMapping
public R<String> save(@RequestBody SetmealDto setmealDto){
setmealService.saveWithDish(setmealDto);
return R.success("新增套餐成功!");
}
impl:
@Override
@Transactional
public void saveWithDish(SetmealDto setmealDto) {
//保存套餐基本信息,操作setmeal,执行insert操作
this.save(setmealDto);
List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();
setmealDishes.stream().map((item)->{
item.setSetmealId(setmealDto.getId());
return item;
}).collect(Collectors.toList());
//保存套餐和菜品的关联信息,操作setmeal_dish,执行insert操作
setmealDishService.saveBatch(setmealDishes);
}
2.套餐信息分页查询
同前面分页相似
@GetMapping("/page")
public R<Page> page(int page, int pageSize, String name){
//构造分页构造器
Page<Setmeal> pageInfo=new Page<>(page,pageSize);
Page<SetmealDto> pageDtoInfo=new Page<>();
//构造条件构造器
LambdaQueryWrapper<Setmeal> queryWrapper=new LambdaQueryWrapper<>();
//根据name进行模糊查询
queryWrapper.like(!StringUtils.isEmpty(name),Setmeal::getName,name);
//添加排序条件,根据sort进行排序
queryWrapper.orderByDesc(Setmeal::getUpdateTime);
//进行分页查询
setmealService.page(pageInfo,queryWrapper);
//对象拷贝
BeanUtils.copyProperties(pageInfo,pageDtoInfo,"records");
List<Setmeal> records=pageInfo.getRecords();
List<SetmealDto> list= records.stream().map((item)->{
SetmealDto setmealDto=new SetmealDto();
BeanUtils.copyProperties(item,setmealDto);
Long categoryId = item.getCategoryId();
//根据id查分类对象
Category category = categoryService.getById(categoryId);
if(category!=null){
String categoryName = category.getName();
setmealDto.setCategoryName(categoryName);
}
return setmealDto;
}).collect(Collectors.toList());
pageDtoInfo.setRecords(list);
return R.success(pageDtoInfo);
}
3.删除、起售、停售套餐
@Override
@Transactional
public void deleteWithDish(List<Long> ids) {
//查询套餐是否可以删除
LambdaQueryWrapper<Setmeal> lqw = new LambdaQueryWrapper<>();
lqw.in(Setmeal::getId, ids);
lqw.eq(Setmeal::getStatus, 1);
int count = this.count(lqw);
//不能删除抛出异常
if(count>0){
throw new CustomException("选中的套餐为启售状态,不能删除");
}
//删除套餐表的数据
this.removeByIds(ids);
//删除关系表的数据
LambdaQueryWrapper<SetmealDish> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.in(SetmealDish::getSetmealId, ids);
setmealDishService.remove(lambdaQueryWrapper);
}
4.手机登录
1)短信发送
上面信息即templateCode,自行加入工具类
!!!上面密钥需加入到工具类中
代码开发:
使用阿里云短信服务发送短信,可以参照官方提供的文档即可。
具体开发步骤:
1、导入maven坐标
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.16</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.1.0</version>
</dependency>
2.调用API
一连串导入。。。
前端代码有缺失,需要在两个地方加入代码
login.js:
function sendMsgApi(data) {
return $axios({
'url':'/user/sendMsg',
'method':'post',
data
})
}
login.html:
补充工具类中密钥:
填写上面获取的信息
controller
@Autowired
private UserService userService;
/**
* 发送手机验证码
* @param user
* @return
*/
@PostMapping("/sendMsg")
private R<String> sendMsg(@RequestBody User user, HttpSession session){
//获取手机号
String phone=user.getPhone();
if(!StringUtils.isEmpty(phone)) {
//生成随机的4位验证码
String code = ValidateCodeUtils.generateValidateCode(4).toString();
log.info("code={}",code);
//调用阿里云提供的短信服务API完成发送短信
SMSUtils.sendMessage("瑞吉外卖","填写上面自己注册的信息",phone,code);
//需要将生成的验证码保存到Session
session.setAttribute(phone,code);
return R.success("手机验证码短信发送成功");
}
return R.error("手机短信发送失败");
}
@PostMapping("/login")
public R<User> login(@RequestBody Map map, HttpSession session) {
log.info("map:{}", map.toString());
//获取手机号
String phone = map.get("phone").toString();
//获取验证码
String code = map.get("code").toString();
//从Session中获取保存的验证码
Object codeInSession = session.getAttribute(phone);
//进行验证码比对(页面提交的验证码和Session中保存的验证码比对)
if (codeInSession != null && codeInSession.equals(code)) {
//如果能够比对成功,说明登录成功
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(User::getPhone, phone);
User user = userService.getOne(queryWrapper);
if (user == null) {
//判断当前手机号是否为新用户,如果是新用户则自动完成注册
user = new User();
user.setPhone(phone);
user.setStatus(1);
userService.save(user);
}
session.setAttribute("user",user.getId());
return R.success(user);
}
return R.error("登陆失败");
}
如果还获取不了信息换浏览器
登录成功界面: