当前位置: 首页 > news >正文

淘客网站怎么备案wordpress 密码重置

淘客网站怎么备案,wordpress 密码重置,苏州建设交通高等职业技术学校网站,做网站页面对PS切图文章目录 菜品管理模块开发公共字段填充自定义注解 AutoFill自定义切面 AutoFillAspect在Mapper接口的方法上加入 AutoFill 注解 新增菜品文件上传实现新增菜品实现菜品分页查询删除菜品实现修改菜品实现 菜品管理模块开发 公共字段填充 在新增员工或者新增菜品分类时需要设置… 文章目录 菜品管理模块开发公共字段填充自定义注解 AutoFill自定义切面 AutoFillAspect在Mapper接口的方法上加入 AutoFill 注解 新增菜品文件上传实现新增菜品实现菜品分页查询删除菜品实现修改菜品实现 菜品管理模块开发 公共字段填充 在新增员工或者新增菜品分类时需要设置创建时间、创建人、修改时间、修改人等字段在编辑员工或者编辑菜品分类时需要设置修改时 间、修改人等字段。这些字段属于公共字段也就是也就是在我们的系统中很多表中都会有这些字段 而针对于这些字段我们的赋值方式为 1). 在新增数据时, 将createTime、updateTime 设置为当前时间, createUser、updateUser设置为当前登录用户ID。 2). 在更新数据时, 将updateTime 设置为当前时间, updateUser设置为当前登录用户ID。 新增员工方法 /*** 新增员工** param employeeDTO*/public void save(EmployeeDTO employeeDTO) {//.......................////设置当前记录的创建时间和修改时间employee.setCreateTime(LocalDateTime.now());employee.setUpdateTime(LocalDateTime.now());//设置当前记录创建人id和修改人idemployee.setCreateUser(BaseContext.getCurrentId());//目前写个假数据后期修改employee.setUpdateUser(BaseContext.getCurrentId());///employeeMapper.insert(employee);}编辑员工方法 /*** 编辑员工信息** param employeeDTO*/public void update(EmployeeDTO employeeDTO) {//........................................///employee.setUpdateTime(LocalDateTime.now());employee.setUpdateUser(BaseContext.getCurrentId());///employeeMapper.update(employee);}新增菜品分类方法 /*** 新增分类* param categoryDTO*/ public void save(CategoryDTO categoryDTO) {//....................................////设置创建时间、修改时间、创建人、修改人category.setCreateTime(LocalDateTime.now());category.setUpdateTime(LocalDateTime.now());category.setCreateUser(BaseContext.getCurrentId());category.setUpdateUser(BaseContext.getCurrentId());///categoryMapper.insert(category); }修改菜品分类方法 /*** 修改分类* param categoryDTO*/public void update(CategoryDTO categoryDTO) {//....................................////设置修改时间、修改人category.setUpdateTime(LocalDateTime.now());category.setUpdateUser(BaseContext.getCurrentId());//categoryMapper.update(category);}需要在每一个业务方法中进行操作, 编码相对冗余、繁琐那能不能对于这些公共字段在某个地方统一处理来简化开发呢 答案是可以的我们使用AOP切面编程实现功能增强来完成公共字段自动填充功能。 spring的 aop 通过aop 面向切面编程 1 自定义注解 AutoFill 用于标识需要进行公共字段填充的方法标识 2 定义切面类 AutoFillAspect 统一拦截加入了AutoFill注解的方法 通过反射为公共字段赋值 3 在Mapper方法上加入AutoFill注解 **技术点**枚举、注解、AOP、反射 通过枚举 标识不同操作 自定义注解 AOP拦截 反射赋值 自定义注解 AutoFill 进入到sky-server模块创建com.sky.annotation包。 package com.sky.annotation;import com.sky.enumeration.OperationType;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/*** author Admin* title: AutoFill* projectName minjiang-takeaway* description: AutoFill* date 2024/1/19 9:36*//*** 自定义注解 AutoFill*/ Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public interface AutoFill {//数据库操作类型UPDATE INSERTOperationType value(); } 其中OperationType已在sky-common模块中定义 package com.sky.enumeration; /*** 数据库操作类型*/ public enum OperationType {/*** 更新操作*/UPDATE,/*** 插入操作*/INSERT }自定义切面 AutoFillAspect package com.sky.aspect;import com.sky.annotation.AutoFill; import com.sky.constant.AutoFillConstant; import com.sky.context.BaseContext; import com.sky.enumeration.OperationType; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.stereotype.Component;import java.lang.reflect.Method; import java.time.LocalDateTime;/*** author Admin* title: AutoFillAspect* projectName minjiang-takeaway* description: AutoFillAspect* date 2024/1/19 9:39*/Aspect Component Slf4j public class AutoFillAspect {/*** 切入点*/Pointcut(execution(* com.sky.mapper.*.*(..)) annotation(com.sky.annotation.AutoFill))public void autoFillPointCut() {}/*** 前置通知 在通知中进行公共字段的赋值*/Before(autoFillPointCut())public void autoFill(JoinPoint joinPoint) {log.info(开始进行公共字段填充);//获取到当前被拦截的方法上的数据库操作类型MethodSignature signature (MethodSignature) joinPoint.getSignature(); //方法签名对象AutoFill autoFill signature.getMethod().getAnnotation(AutoFill.class); //获取到方法上的注解对象OperationType operationType autoFill.value(); //获得数据库操作类型//获取当前被拦截方法的参数 实体对象Object[] args joinPoint.getArgs();if(args null || args.length 0){return;}Object entity args[0];//准备赋值的数据LocalDateTime now LocalDateTime.now();Long currentId BaseContext.getCurrentId();//根据当前不同操作类型 为对应属性通过反射进行赋值if(operationType OperationType.INSERT){//为4个公共字段赋值try{Method setCreateTime entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);Method setCreateUser entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER, Long.class);Method setUpdateTime entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);Method setUpdateUser entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);//通过反射为对象赋值setCreateTime.invoke(entity, now);setCreateUser.invoke(entity, currentId);setUpdateTime.invoke(entity, now);setUpdateUser.invoke(entity, currentId);}catch (Exception e){e.printStackTrace();}}if(operationType OperationType.UPDATE){//为两个公共字段赋值try{Method setUpdateTime entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);Method setUpdateUser entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);//通过反射为对象赋值setUpdateTime.invoke(entity, now);setUpdateUser.invoke(entity, currentId);}catch (Exception e){e.printStackTrace();}}} }在Mapper接口的方法上加入 AutoFill 注解 以CategoryMapper为例分别在新增和修改方法添加AutoFill()注解也需要EmployeeMapper做相同操作 package com.sky.mapper;Mapper public interface CategoryMapper {/*** 插入数据* param category*/Insert(insert into category(type, name, sort, status, create_time, update_time, create_user, update_user) VALUES (#{type}, #{name}, #{sort}, #{status}, #{createTime}, #{updateTime}, #{createUser}, #{updateUser}))AutoFill(value OperationType.INSERT)void insert(Category category);/*** 根据id修改分类* param category*/AutoFill(value OperationType.UPDATE)void update(Category category);}测试 新增菜品分类 有没有添加字段 create_time update_time 新增菜品 后台系统中可以管理菜品信息通过 新增功能来添加一个新的菜品在添加菜品时需要选择当前菜品所属的菜品分类并且需要上传菜品图片。 菜品名称必须是唯一的 菜品必须属于某个分类下不能单独存在 新增菜品时可以根据情况选择菜品的口味 每个菜品必须对应一张图片 接口设计 根据类型查询分类已完成 文件上传 新增菜品 新增菜品其实就是将新增页面录入的菜品信息插入到dish表如果添加了口味做法还需要向dish_flavor表插入数据。所以在新增菜品时涉及到两个表涉及到两个表dish 和 dish_flavor 文件上传实现 实现文件上传服务需要有存储的支持那么我们的解决方案将以下几种 直接将图片保存到服务的硬盘springmvc中的文件上传 优点开发便捷成本低缺点扩容困难 使用分布式文件系统进行存储 优点容易实现扩容缺点开发复杂度稍大有成熟的产品可以使用比如FastDFS,MinIO 使用第三方的存储服务例如OSS 优点开发简单拥有强大功能免维护缺点付费 在本项目选用阿里云的OSS服务进行文件存储。 实现步骤 1). 定义OSS相关配置 在sky-server模块 application-dev.yml alioss:access-key-id: LTAI5tA6FK7EkhqRRSDm22oibucket-name: zxx-sky-take-outaccess-key-secret: Pc0ikRY09HVPFsFOypCDjAhFvbmNZbendpoint: oss-cn-beijing.aliyuncs.comapplication.yml alioss:endpoint: ${sky.alioss.endpoint}access-key-id: ${sky.alioss.access-key-id}access-key-secret: ${sky.alioss.access-key-secret}bucket-name: ${sky.alioss.bucket-name}2). 读取OSS配置 在sky-common模块中已定义 package com.sky.properties;import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component;Component ConfigurationProperties(prefix sky.alioss) Data public class AliOssProperties {private String endpoint;private String accessKeyId;private String accessKeySecret;private String bucketName;}3). 生成OSS工具类对象 package com.sky.config;import com.sky.properties.AliOssProperties; import com.sky.utils.AliOssUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;/*** 配置类用于创建AliOssUtil对象*/ Configuration Slf4j public class OssConfiguration {BeanConditionalOnMissingBeanpublic AliOssUtil aliOssUtil(AliOssProperties aliOssProperties){log.info(开始创建阿里云文件上传工具类对象{},aliOssProperties);return new AliOssUtil(aliOssProperties.getEndpoint(),aliOssProperties.getAccessKeyId(),aliOssProperties.getAccessKeySecret(),aliOssProperties.getBucketName());} }其中AliOssUtil.java已在sky-common模块中定义 package com.sky.utils;import com.aliyun.oss.ClientException; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.OSSException; import lombok.AllArgsConstructor; import lombok.Data; import lombok.extern.slf4j.Slf4j; import java.io.ByteArrayInputStream;Data AllArgsConstructor Slf4j public class AliOssUtil {private String endpoint;private String accessKeyId;private String accessKeySecret;private String bucketName;/*** 文件上传** param bytes* param objectName* return*/public String upload(byte[] bytes, String objectName) {// 创建OSSClient实例。OSS ossClient new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);try {// 创建PutObject请求。ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(bytes));} catch (OSSException oe) {System.out.println(Caught an OSSException, which means your request made it to OSS, but was rejected with an error response for some reason.);System.out.println(Error Message: oe.getErrorMessage());System.out.println(Error Code: oe.getErrorCode());System.out.println(Request ID: oe.getRequestId());System.out.println(Host ID: oe.getHostId());} catch (ClientException ce) {System.out.println(Caught an ClientException, which means the client encountered a serious internal problem while trying to communicate with OSS, such as not being able to access the network.);System.out.println(Error Message: ce.getMessage());} finally {if (ossClient ! null) {ossClient.shutdown();}}//文件访问路径规则 https://BucketName.Endpoint/ObjectNameStringBuilder stringBuilder new StringBuilder(https://);stringBuilder.append(bucketName).append(.).append(endpoint).append(/).append(objectName);log.info(文件上传到:{}, stringBuilder.toString());return stringBuilder.toString();} }4). 定义文件上传接口 package com.sky.controller.admin;import com.sky.constant.MessageConstant; import com.sky.result.Result; import com.sky.utils.AliOssUtil; 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.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.UUID;/*** 通用接口*/ RestController RequestMapping(/admin/common) Api(tags 通用接口) Slf4j public class CommonController {Autowiredprivate AliOssUtil aliOssUtil;/*** 文件上传* param file* return*/PostMapping(/upload)ApiOperation(文件上传)public ResultString upload(MultipartFile file){log.info(文件上传{},file);try {//原始文件名String originalFilename file.getOriginalFilename();//截取原始文件名的后缀 dfdfdf.pngString extension originalFilename.substring(originalFilename.lastIndexOf(.));//构造新文件名称String objectName UUID.randomUUID().toString() extension;//文件的请求路径String filePath aliOssUtil.upload(file.getBytes(), objectName);return Result.success(filePath);} catch (IOException e) {log.error(文件上传失败{}, e);}return Result.error(MessageConstant.UPLOAD_FAILED);} }新增菜品实现 1). 设计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(); }2). Controller层 /*** 菜品管理*/ 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();} }3). Service层接口 package com.sky.service;import com.sky.dto.DishDTO; import com.sky.entity.Dish;public interface DishService {/*** 新增菜品和对应的口味** param dishDTO*/public void saveWithFlavor(DishDTO dishDTO);}4). Service层实现类 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);//后绪步骤实现}} }5). Mapper层 DishMapper.java中添加 /*** 插入菜品数据** param dish*/AutoFill(value OperationType.INSERT)void insert(Dish dish);在/resources/mapper中创建DishMapper.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 /mapperDishFlavorMapper.java package com.sky.mapper;import com.sky.entity.DishFlavor; import java.util.List;Mapper public interface DishFlavorMapper {/*** 批量插入口味数据* param flavors*/void insertBatch(ListDishFlavor flavors);}在/resources/mapper中创建DishFlavorMapper.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菜品分页查询 设计DTO类 package com.sky.dto;import lombok.Data; import java.io.Serializable;Data public class DishPageQueryDTO implements Serializable {private int page;private int pageSize;private String name;private Integer categoryId; //分类idprivate Integer status; //状态 0表示禁用 1表示启用}设计VO类 package com.sky.vo;import com.sky.entity.DishFlavor; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List;Data Builder NoArgsConstructor AllArgsConstructor public class DishVO 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 LocalDateTime updateTime;//分类名称private String categoryName;//菜品关联的口味private ListDishFlavor flavors new ArrayList(); }Controller层 根据接口定义创建DishController的page分页查询方法 /*** 菜品分页查询** param dishPageQueryDTO* return*/ GetMapping(/page) ApiOperation(菜品分页查询) public ResultPageResult page(DishPageQueryDTO dishPageQueryDTO) {log.info(菜品分页查询:{}, dishPageQueryDTO);PageResult pageResult dishService.pageQuery(dishPageQueryDTO);//后绪步骤定义return Result.success(pageResult); }Service层接口 /*** 菜品分页查询** param dishPageQueryDTO* return*/PageResult pageQuery(DishPageQueryDTO dishPageQueryDTO);Service层实现类 在 DishServiceImpl 中实现分页查询方法 /*** 菜品分页查询** param dishPageQueryDTO* return*/public PageResult pageQuery(DishPageQueryDTO dishPageQueryDTO) {PageHelper.startPage(dishPageQueryDTO.getPage(), dishPageQueryDTO.getPageSize());PageDishVO page dishMapper.pageQuery(dishPageQueryDTO);//后绪步骤实现return new PageResult(page.getTotal(), page.getResult());}Mapper层 在 DishMapper 接口中声明 pageQuery 方法 /*** 菜品分页查询** param dishPageQueryDTO* return*/PageDishVO pageQuery(DishPageQueryDTO dishPageQueryDTO);在 DishMapper.xml 中编写SQL select idpageQuery resultTypecom.sky.vo.DishVOselect d.* , c.name as categoryName from dish d left outer join category c on d.category_id c.idwhereif testname ! nulland d.name like concat(%,#{name},%)/ifif testcategoryId ! nulland d.category_id #{categoryId}/ifif teststatus ! nulland d.status #{status}/if/whereorder by d.create_time desc /select删除菜品实现 可以一次删除一个菜品也可以批量删除菜品 起售中的菜品不能删除 被套餐关联的菜品不能删除 删除菜品后关联的口味数据也需要删除掉 在dish表中删除菜品基本数据时同时也要把关联在dish_flavor表中的数据一块删除。 setmeal_dish表为菜品和套餐关联的中间表。 若删除的菜品数据关联着某个套餐此时删除失败。 若要删除套餐关联的菜品数据先解除两者关联再对菜品进行删除。 Controller层 根据删除菜品的接口定义在DishController中创建方法 /*** 菜品批量删除** param ids* return*/ DeleteMapping ApiOperation(菜品批量删除) public Result delete(RequestParam ListLong ids) {log.info(菜品批量删除{}, ids);dishService.deleteBatch(ids);//后绪步骤实现return Result.success(); }Service层接口 在DishService接口中声明deleteBatch方法 /*** 菜品批量删除** param ids*/void deleteBatch(ListLong ids);Service层实现类 在DishServiceImpl中实现deleteBatch方法 Autowiredprivate SetmealDishMapper setmealDishMapper;/*** 菜品批量删除** param ids*/Transactional//事务public void deleteBatch(ListLong ids) {//判断当前菜品是否能够删除---是否存在起售中的菜品for (Long id : ids) {Dish dish dishMapper.getById(id);//后绪步骤实现if (dish.getStatus() StatusConstant.ENABLE) {//当前菜品处于起售中不能删除throw new DeletionNotAllowedException(MessageConstant.DISH_ON_SALE);}}//判断当前菜品是否能够删除---是否被套餐关联了ListLong setmealIds setmealDishMapper.getSetmealIdsByDishIds(ids);if (setmealIds ! null setmealIds.size() 0) {//当前菜品被套餐关联了不能删除throw new DeletionNotAllowedException(MessageConstant.DISH_BE_RELATED_BY_SETMEAL);}//删除菜品表中的菜品数据for (Long id : ids) {dishMapper.deleteById(id);//后绪步骤实现//删除菜品关联的口味数据dishFlavorMapper.deleteByDishId(id);//后绪步骤实现}}Mapper层 在DishMapper中声明getById方法并配置SQL /*** 根据主键查询菜品** param id* return*/Select(select * from dish where id #{id})Dish getById(Long id);创建SetmealDishMapper声明getSetmealIdsByDishIds方法并在xml文件中编写SQL package com.sky.mapper;import com.sky.entity.SetmealDish; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Mapper; import java.util.List;Mapper public interface SetmealDishMapper {/*** 根据菜品id查询对应的套餐id** param dishIds* return*///select setmeal_id from setmeal_dish where dish_id in (1,2,3,4)ListLong getSetmealIdsByDishIds(ListLong dishIds); }SetmealDishMapper.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.SetmealDishMapperselect idgetSetmealIdsByDishIds resultTypejava.lang.Longselect setmeal_id from setmeal_dish where dish_id inforeach collectiondishIds itemdishId separator, open( close)#{dishId}/foreach/select /mapper在DishMapper.java中声明deleteById方法并配置SQL /*** 根据主键删除菜品数据** param id*/Delete(delete from dish where id #{id})void deleteById(Long id);在DishFlavorMapper中声明deleteByDishId方法并配置SQL /*** 根据菜品id删除对应的口味数据* param dishId*/Delete(delete from dish_flavor where dish_id #{dishId})void deleteByDishId(Long dishId);修改菜品实现 根据id查询菜品 菜品数据回显根据类型查询分类(已实现)文件上传(已实现)修改菜品 根据id查询菜品实现 Controller层 根据id查询菜品的接口定义在DishController中创建方法 /*** 根据id查询菜品** param id* return*/ GetMapping(/{id}) ApiOperation(根据id查询菜品) public ResultDishVO getById(PathVariable Long id) {log.info(根据id查询菜品{}, id);DishVO dishVO dishService.getByIdWithFlavor(id);//后绪步骤实现return Result.success(dishVO); }Service层接口 在DishService接口中声明getByIdWithFlavor方法 /*** 根据id查询菜品和对应的口味数据** param id* return*/DishVO getByIdWithFlavor(Long id);Service层实现类 在DishServiceImpl中实现getByIdWithFlavor方法 /*** 根据id查询菜品和对应的口味数据** param id* return*/public DishVO getByIdWithFlavor(Long id) {//根据id查询菜品数据Dish dish dishMapper.getById(id);//根据菜品id查询口味数据ListDishFlavor dishFlavors dishFlavorMapper.getByDishId(id);//后绪步骤实现//将查询到的数据封装到VODishVO dishVO new DishVO();BeanUtils.copyProperties(dish, dishVO);dishVO.setFlavors(dishFlavors);return dishVO;}Mapper层 在DishFlavorMapper中声明getByDishId方法并配置SQL /*** 根据菜品id查询对应的口味数据* param dishId* return*/Select(select * from dish_flavor where dish_id #{dishId})ListDishFlavor getByDishId(Long dishId);修改菜品实现 Controller层 根据修改菜品的接口定义在DishController中创建方法 /*** 修改菜品** param dishDTO* return*/PutMappingApiOperation(修改菜品)public Result update(RequestBody DishDTO dishDTO) {log.info(修改菜品{}, dishDTO);dishService.updateWithFlavor(dishDTO);return Result.success();}Service层接口 在DishService接口中声明updateWithFlavor方法 /*** 根据id修改菜品基本信息和对应的口味信息** param dishDTO*/void updateWithFlavor(DishDTO dishDTO);Service层实现类 在DishServiceImpl中实现updateWithFlavor方法 /*** 根据id修改菜品基本信息和对应的口味信息** param dishDTO*/public void updateWithFlavor(DishDTO dishDTO) {Dish dish new Dish();BeanUtils.copyProperties(dishDTO, dish);//修改菜品表基本信息dishMapper.update(dish);//删除原有的口味数据dishFlavorMapper.deleteByDishId(dishDTO.getId());//重新插入口味数据ListDishFlavor flavors dishDTO.getFlavors();if (flavors ! null flavors.size() 0) {flavors.forEach(dishFlavor - {dishFlavor.setDishId(dishDTO.getId());});//向口味表插入n条数据dishFlavorMapper.insertBatch(flavors);}}Mapper层 在DishMapper中声明update方法 /*** 根据id动态修改菜品数据** param dish*/AutoFill(value OperationType.UPDATE)void update(Dish dish);并在DishMapper.xml文件中编写SQL update idupdateupdate dishsetif testname ! nullname #{name},/ifif testcategoryId ! nullcategory_id #{categoryId},/ifif testprice ! nullprice #{price},/ifif testimage ! nullimage #{image},/ifif testdescription ! nulldescription #{description},/ifif teststatus ! nullstatus #{status},/ifif testupdateTime ! nullupdate_time #{updateTime},/ifif testupdateUser ! nullupdate_user #{updateUser},/if/setwhere id #{id} /update前后端联调测试 可使用Debug方式启动项目观察运行中步骤。 进入菜品列表查询页面对菜品的价格进行修改
http://www.laogonggong.com/news/104299.html

相关文章:

  • 网站做板块地图的办法计算机专业学做网站吗
  • 霍林郭勒市建设局网站wordpress 注册 插件
  • 微博登录网站开发易语言的网站开发系统
  • 网站案例 中企动力技术支持wordpress网站推广主题
  • 网站开发好做吗网站开发的摘要
  • 做网站和软件的团队苏州建网站的公司招
  • 兰州专业网站建设公司上海珍岛做网站怎么样
  • 在机关网站建设会上讲话成都网站备案
  • 天津市城乡和住房建设厅网站厦门图书馆网站建设
  • 在excel中怎么做邮箱网站网站关键词整体方案
  • 一般做自己的网站需要什么现在做百度快速收录的方法
  • 网站空间流量延安市住建建设网站
  • 交互型网站难做吗宁国网站开发
  • 外贸建站是什么意思广告网站模板免费下载
  • 嘉兴网站如何制作比较好的网页设计网站
  • 做头像的网站空白六安百姓网
  • 做网站 使用权 所有权互联网门户网站是什么意思
  • 伊春网站开发做雇主品牌的网站
  • 卖视频会员个人网站怎么做合肥哪家做网站不错
  • 酒店网站建设策划方案大连百度关键词优化
  • 网站jquery在线优化网站域名申请步骤
  • seo网站搜索优化网站建设创始人
  • 时尚女装网站设计成都百度搜索排名优化
  • 成都专业网站设计免费咨询廊坊网站建设公司哪家好
  • 哪种浏览器可以打开所有网站wordpress登录文件夹
  • 算命网站建设开发网站建设哪家好
  • 茶叶电子商务网站建设的结论建设标准信息网站
  • 微网站方案怎么写广东互联网产品推广技术
  • 如何解析后用二级域名做网站仿素材下载网站源码
  • 佛山手机建网站网站缩写的英文