黑马瑞吉外卖软件开发整体流程(六)(新增套餐、套餐分页、删除套餐、短信发送和手机验证码登录)


一 新增套餐

在这里插入图片描述

在这里插入图片描述

1.1 交互过程

在这里插入图片描述

1.2 代码开发

SetmealController
  package cn.hncj.reggie.controller;

import cn.hncj.reggie.common.R;
import cn.hncj.reggie.dto.SetmealDto;
import cn.hncj.reggie.service.SetmealDishService;
import cn.hncj.reggie.service.SetmealService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created on 2022/6/28.
 * 套餐管理
 * @author Hou chaof
 */
@RestController
@RequestMapping("/setmeal")
@Slf4j
public class SetmealController {
    @Autowired
    private SetmealService setmealService;

    @Autowired
    private SetmealDishService setmealDishService;


    /**
    * Description:新增套餐
    * @date:2022/6/28 13:35
    * @params: [cn.hncj.reggie.dto.SetmealDto]
    * @return: cn.hncj.reggie.common.R<java.lang.String>
    */
    @PostMapping
    public R<String> save(@RequestBody SetmealDto setmealDto) {
        log.info("套餐信息:{}",setmealDto);
        setmealService.saveWithDish(setmealDto);

        return R.success("新增套餐成功");
    }
}

SetmealServiceImpl
package cn.hncj.reggie.service.impl;


import cn.hncj.reggie.dto.SetmealDto;
import cn.hncj.reggie.entity.Setmeal;

import cn.hncj.reggie.entity.SetmealDish;
import cn.hncj.reggie.mapper.SetmealMapper;
import cn.hncj.reggie.service.SetmealDishService;
import cn.hncj.reggie.service.SetmealService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sun.org.apache.regexp.internal.RE;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

/**
 * Created on 2022/6/22.
 *
 * @author Hou chaof
 */
@Slf4j
@Service
public class SetmealServiceImpl extends ServiceImpl<SetmealMapper, Setmeal> implements SetmealService {
    @Autowired
    private SetmealDishService setmealDishService;

    /**
     * Description:新增套餐,同时需要保存套餐和菜品的关联关系
     *
     * @date:2022/6/28 14:00
     * @params: [cn.hncj.reggie.dto.SetmealDto]
     * @return: void
     */
    @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);
    }
}

二 套餐分页

在这里插入图片描述

SetmealController中,新增get请求的分页功能
/**
    * Description:套餐分页查询
    * @date:2022/6/28 14:31
    * @params: [int, int, java.lang.String]
    * @return: cn.hncj.reggie.common.R<com.baomidou.mybatisplus.extension.plugins.pagination.Page>
    */
    @GetMapping("/page")
    public R<Page> page(int page, int pageSize, String name) {
        //构造分页构造器
        Page<Setmeal> pageInfo = new Page<>(page, pageSize);
        Page<SetmealDto> dtoPage = new Page<>();
        LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();
        //添加查询条件,根据name进行模糊查询
        queryWrapper.like(name != null, Setmeal::getName, name);
        //添加排序条件,根据更新时间降序排列
        queryWrapper.orderByDesc(Setmeal::getUpdateTime);
        setmealService.page(pageInfo, queryWrapper);

        //对象拷贝
        BeanUtils.copyProperties(pageInfo,dtoPage,"records");
        List<Setmeal> records = pageInfo.getRecords();
        List<SetmealDto> list=records.stream().map((item)->{
            SetmealDto setmealDto = new SetmealDto();
            BeanUtils.copyProperties(item,setmealDto);
            //分类id
            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());
        dtoPage.setRecords(list);
        return R.success(dtoPage);
    }

三 删除套餐

在这里插入图片描述

实现类SetmealServiceImpl
/**
     * Description:删除套餐,同时需要删除套餐和菜品的关联数据
     * @date:2022/6/28 17:14
     * @params: [java.util.List<java.lang.Long>]
     * @return: void
     */
    @Transactional
    @Override
    public void removeWithDish(List<Long> ids) {
        //查询套餐状态,确定是否可以删除
        LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper();
        //不能删除,抛出业务异常
        queryWrapper.in(Setmeal::getId,ids);
        queryWrapper.eq(Setmeal::getStatus, 1);
        int count = this.count(queryWrapper);
        if (count>0){
            throw new CustomException("套餐正在售卖中,不能删除");
        }
        //可以删除,先删除套餐表中的数据  setmeal
        this.removeByIds(ids);
        //删除关系表中的数据 setmeal_dish
        LambdaQueryWrapper<SetmealDish> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.in(SetmealDish::getSetmealId, ids);
        setmealDishService.remove(lambdaQueryWrapper);
    }
SetmealController
/**
    * Description: 删除套餐
    * @date:2022/6/28 15:44
    * @params: [java.util.List<java.lang.Long>]
    * @return: cn.hncj.reggie.common.R<java.lang.String>
    */
    @DeleteMapping
    public R<String> delete(@RequestParam List<Long> ids) {
        log.info("ids:{}",ids);
        setmealService.removeWithDish(ids);
        return R.success("套餐数据删除成功");
    }

四 短信发送

4.1 代码开发

1.导入maven坐标
2.调用API
 <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>2.1.0</version>
        </dependency>
package cn.hncj.reggie.utils;

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;

/**
 * 短信发送工具类
 */
public class SMSUtils {

	/**
	 * 发送短信
	 * @param signName 签名
	 * @param templateCode 模板
	 * @param phoneNumbers 手机号
	 * @param param 参数
	 */
	public static void sendMessage(String signName, String templateCode,String phoneNumbers,String param){
		DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "", "");
		IAcsClient client = new DefaultAcsClient(profile);

		SendSmsRequest request = new SendSmsRequest();
		request.setSysRegionId("cn-hangzhou");
		request.setPhoneNumbers(phoneNumbers);
		request.setSignName(signName);
		request.setTemplateCode(templateCode);
		request.setTemplateParam("{\"code\":\""+param+"\"}");
		try {
			SendSmsResponse response = client.getAcsResponse(request);
			System.out.println("短信发送成功");
		}catch (ClientException e) {
			e.printStackTrace();
		}
	}

}

4.2 交互过程(模拟验证码,没买阿里云)

在这里插入图片描述

4.3 移动端用户登录

/**
    * Description:移动端用户登录
    * @date:2022/6/28 21:51
    * @params: [cn.hncj.reggie.entity.User, javax.servlet.http.HttpSession]
    * @return: cn.hncj.reggie.common.R<java.lang.String>
    */
    @PostMapping("/login")
    public R<User> login(@RequestBody Map map, HttpSession session) {
        log.info(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) {
                //判断当前手机号对应的用户是否为新用户,如果是新用户j就自动完成注册
                user= new User();
                user.setPhone(phone);
                user.setStatus(1);
                userService.save(user);
            }
            session.setAttribute("user",user.getId());
            return R.success(user);
        }

        return R.error("登录失败");
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值