智能家居网站开发,成都家装设计公司排名榜,贵州网络推广公司,桂林网需求分析与设计
一#xff1a;产品原型
后台系统中可以管理菜品信息#xff0c;通过 新增功能来添加一个新的菜品#xff0c;在添加菜品时需要选择当前菜品所属的菜品分类#xff0c;并且需要上传菜品图片。
新增菜品原型#xff1a; 当填写完表单信息, 点击保存…需求分析与设计
一产品原型
后台系统中可以管理菜品信息通过 新增功能来添加一个新的菜品在添加菜品时需要选择当前菜品所属的菜品分类并且需要上传菜品图片。
新增菜品原型 当填写完表单信息, 点击保存按钮后, 会提交该表单的数据到服务端, 在服务端中需要接受数据, 然后将数据保存至数据库中。 业务规则 菜品名称必须是唯一的 菜品必须属于某个分类下不能单独存在 新增菜品时可以根据情况选择菜品的口味 每个菜品必须对应一张图片
二接口设计
根据上述原型图先**粗粒度**设计接口共包含3个接口。 - 根据类型查询分类已完成 - 文件上传已完成 - 新增菜品
接下来明确接口的请求方式、请求路径、传入参数和返回值。 口味非必须且是object[]数组可以传多个口味一个菜品可以对应多种口味
所以后端使用集合封装 三数据表设计
新增菜品其实就是将新增页面录入的菜品信息插入到dish表如果添加了口味做法还需要向dish_flavor表插入数据。所以在新增菜品时涉及到两个表
表名说明dish菜品表dish_flavor菜品口味表 1). 菜品表:dish
字段名数据类型说明备注idbigint主键自增namevarchar(32)菜品名称唯一category_idbigint分类id逻辑外键pricedecimal(10,2)菜品价格imagevarchar(255)图片路径descriptionvarchar(255)菜品描述statusint售卖状态1起售 0停售create_timedatetime创建时间update_timedatetime最后修改时间create_userbigint创建人idupdate_userbigint最后修改人id
2). 菜品口味表:dish_flavor
字段名数据类型说明备注idbigint主键自增dish_idbigint菜品id逻辑外键namevarchar(32)口味名称valuevarchar(255)口味值 代码开发
一设计DTO类
package com.sky.dto;import com.sky.entity.DishFlavor;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;Data
public class DishDTO implements Serializable {private Long id;//菜品名称private String name;//菜品分类idprivate Long categoryId;//菜品价格private BigDecimal price;//图片private String image;//描述信息private String description;//0 停售 1 起售private Integer status;//口味private ListDishFlavor flavors new ArrayList();
}
细节
注意口味用List集合封装因为前端可以传递多种口味数据对应口味实体类
口味实体类如下
/*** 菜品口味*/
Data
Builder
NoArgsConstructor
AllArgsConstructor
public class DishFlavor implements Serializable {private static final long serialVersionUID 1L;private Long id;//菜品idprivate Long dishId;//口味名称private String name;//口味数据listprivate String value;}
二Controller层
package com.sky.controller.admin;import com.sky.dto.DishDTO;
import com.sky.dto.DishPageQueryDTO;
import com.sky.entity.Dish;
import com.sky.result.PageResult;
import com.sky.result.Result;
import com.sky.service.DishService;
import com.sky.vo.DishVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Set;/*** 菜品管理*/
RestController
RequestMapping(/admin/dish)
Api(tags 菜品相关接口)
Slf4j
public class DishController {Autowiredprivate DishService dishService;/*** 新增菜品** param dishDTO* return*/PostMappingApiOperation(新增菜品)public Result save(RequestBody DishDTO dishDTO) {log.info(新增菜品{}, dishDTO);dishService.saveWithFlavor(dishDTO);//后绪步骤开发return Result.success();}
}
细节
注意接口文档上显示返回Result中data是非必须的所以Result后可以不加泛型。
三Service类事务、forEach循环
package com.sky.service.impl;Service
Slf4j
public class DishServiceImpl implements DishService {Autowiredprivate DishMapper dishMapper;Autowiredprivate DishFlavorMapper dishFlavorMapper;/*** 新增菜品和对应的口味** param dishDTO*/Transactionalpublic void saveWithFlavor(DishDTO dishDTO) {Dish dish new Dish();BeanUtils.copyProperties(dishDTO, dish);//向菜品表插入1条数据dishMapper.insert(dish);//后绪步骤实现//获取insert语句生成的主键值Long dishId dish.getId();ListDishFlavor flavors dishDTO.getFlavors();if (flavors ! null flavors.size() 0) {flavors.forEach(dishFlavor - {dishFlavor.setDishId(dishId);});//向口味表插入n条数据dishFlavorMapper.insertBatch(flavors);//后绪步骤实现}}}
细节
Service层别忘记要把DTO转换为实体对象 利用BeanUtils提供的copyProperties方法可以快速转换因为新增菜品需要操作两张数据表菜品表和口味表所以需要原子操作于是定义事务 Transactional注解又因为口味表需要菜品表的主键菜品id而菜品id是数据库负责维护的自增主键所以需要mybatis配合进行主键回填。 Long dishId dish.getId();成功的前提是mapper层set了id因为口味是非必须的请求数据所以首先需要判断集合是否为空 之后需要为口味对象赋值菜品id最后批量的插入口味表forEach方法的使用 集合.forEach(元素名-{元素所进行的操作})
四Mapper层主键回填、批量删除
dishMapper: /*** 插入菜品数据** param dish*/AutoFill(value OperationType.INSERT)void insert(Dish dish);
对应的xml文件
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.sky.mapper.DishMapperinsert idinsert useGeneratedKeystrue keyPropertyidinsert into dish (name, category_id, price, image, description, create_time, update_time, create_user, update_user,status)VALUES (#{name},#{categoryId},#{price},#{image},#{description},#{createTime},#{updateTime},#{createUser},#{updateUser},#{status})/insert
/mapper
细节
这行定义了主键回填insert idinsert useGeneratedKeystrue keyPropertyid会将id的值返回到参数列表的Dish对象dish的id属性中 dishFlavorMapper
package com.sky.mapper;import com.sky.entity.DishFlavor;
import java.util.List;Mapper
public interface DishFlavorMapper {/*** 批量插入口味数据* param flavors*/void insertBatch(ListDishFlavor flavors);}
对应的XML
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.sky.mapper.DishFlavorMapperinsert idinsertBatchinsert into dish_flavor (dish_id, name, value) VALUESforeach collectionflavors itemdf separator,(#{df.dishId},#{df.name},#{df.value})/foreach/insert
/mapper
细节
批量插入 foreach collection参数列表中传递过来的集合名 item元素名称自定义 separator下列元素的属性之间分割的分隔符 (#{df.dishId},#{df.name},#{df.value}) /foreach
形成的效果
( , , ,)