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

郑州外贸网站推广seo广告投放

郑州外贸网站推广,seo广告投放,合肥珍岛公司做网站推广怎么样,广州app外包公共字段自动填充 这些字段在每张表基本都有,手动进行填充效率低,且后期维护更改繁琐 使用到注解AOP主要 先答应一个AutoFill注解 再定义一个切面类进行通知 对应代码 用到了枚举类和反射 package com.sky.aspect; /*** 自定义切面类&#xff0c…

公共字段自动填充

这些字段在每张表基本都有,手动进行填充效率低,且后期维护更改繁琐
在这里插入图片描述
在这里插入图片描述
使用到注解+AOP主要
先答应一个AutoFill注解
在这里插入图片描述

再定义一个切面类进行通知
在这里插入图片描述
对应代码
用到了枚举类和反射

package com.sky.aspect;
/***  自定义切面类,实现公共字段自动填充*/
@Aspect
@Component
@Slf4j
public class AutoFillAspect {/*** 切入点*///不仅需要符合切入点表达式,且要满足方法上有对应注解@Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)")public void auotFillPointCut(){}/*** 前置通知,在通知中进行公共字段赋值*/@Before("auotFillPointCut()")public void autoFill(JoinPoint joinPoint){log.info("开始进行公共字段的自动填充...");//获取方法上的数据库操作类型(决定是否需修改CreateUser和CreateTime)MethodSignature signature = (MethodSignature) joinPoint.getSignature();//方法签名对象AutoFill annotation = signature.getMethod().getAnnotation(AutoFill.class);//获得方法上的注解对象OperationType value = annotation.value();//获取数据库的操作类型//获取方法上的参数--实体参数Object[] args = joinPoint.getArgs();if (args==null || args.length==0){return;}Object entity=args[0];//可能接收不同实体,因为是公共字段,可能员工,菜品什么的都有,所以用object//准备赋值数据LocalDateTime now = LocalDateTime.now();Long currentId = BaseContext.getCurrentId();//根据当前不同的操作类型,为对应属性进行赋值if(value==OperationType.INSERT){try {//通过反射获取对应的方法Method setCreateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);Method setCreateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER, Long.class);Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);//再进行赋值setCreateTime.invoke(entity,now);setUpdateTime.invoke(entity,now);setCreateUser.invoke(entity,currentId);setUpdateUser.invoke(entity,currentId);} catch (Exception e) {e.printStackTrace();}}else if(value==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注解
所以我们在对应mapper文件的insert和update操作做上加上@AutoFill注解并且指定value(操作类型)
在这里插入图片描述
然后我们就可以把之前service中设置UpdateTime和UpdateUser以及Create的全都可以注释/删除
进行测试
我这里测试过了
提交推送即可

增加菜品业务

需求分析

涉及到我们的菜品分类的回查
还有文件上传图片可以用阿里云的oss实现
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码开发

文件上传功能

先开发一个阿里云的服务
在这里插入图片描述
先写配置文件,来写我们的域名,bucket名,秘钥id和密码
在这里插入图片描述
第三方bean,写个配置类
配置上对应的参数
在这里插入图片描述
再写Commoncontroller
在这里插入图片描述

@RestController
@RequestMapping("/admin/common")
@Api(tags = "通用接口")
@Slf4j
public class CommonController {@Autowiredprivate AliOssUtil aliOssUtil;@ApiOperation("文件上传")@PostMapping("/upload")public Result<String> upload(MultipartFile file){log.info("文件上传:{}",file);try {//获取原始文件名String originalFilename = file.getOriginalFilename();//截取原始文件名后缀 xxx.jpgString substring = originalFilename.substring(originalFilename.lastIndexOf('.'));String uuid = UUID.randomUUID().toString();//构造新文件名String name=uuid+substring;String filePath = aliOssUtil.upload(file.getBytes(), name);//返回值为文件请求路径return Result.success(filePath);} catch (IOException e) {log.error("文件上传失败:{}",e);}return Result.error(MessageConstant.UPLOAD_FAILED);}}

这样就可以了,完成文件上传操作,用到了阿里云oss,不知道怎么用可以看一下我之前的文件上传博客
把对应权限改为公开权限就可以在别的地方看到对应图片

新增菜品开发

controller

@RestController
@RequestMapping("/admin/dish")
@Slf4j
@Api(tags = "菜品相关接口")
public class DishController {@Autowiredprivate DishService dishService;@PostMapping@ApiOperation("新增菜品")public Result save(@RequestBody DishDTO dishDTO){log.info("新增菜品:{}",dishDTO);dishService.savewithFlavor(dishDTO);return Result.success();}
}

在这里插入图片描述
Service

@Service
@Slf4j
public class DishServiceImpl implements DishService {@Autowiredprivate DishMapper dishMapper;@Autowiredprivate DishFlavorMapper dishFlavorMapper;/*** 新增菜品和对应的口味数据* @param dishDTO*/@Transactional//事务注解,因为有两次操作的,一次修改菜品表,一次是口味表public void savewithFlavor(DishDTO dishDTO) {Dish dish = new Dish();BeanUtils.copyProperties(dishDTO,dish);//向菜品表插入1条数据dishMapper.insert(dish);//获取insert语句生产的主键值Long id = dish.getId();//向口味表插入n条数据List<DishFlavor> flavors = dishDTO.getFlavors();if(flavors != null && flavors.size() > 0) {for (DishFlavor flavor:flavors) {flavor.setDishId(id);}dishFlavorMapper.insertBatch(flavors);}}
}

在这里插入图片描述
解释一下,分开两个表插入的其实是,所以我们要加上@Transactional的注解,进行一个事务操作,还要创建两个mapper

DishMapper

@Mapper
public interface DishMapper {/*** 根据分类id查询菜品数量* @param categoryId* @return*/@Select("select count(id) from dish where category_id = #{categoryId}")Integer countByCategoryId(Long categoryId);@AutoFill(value = OperationType.INSERT)void insert(Dish dish);}

对应xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sky.mapper.DishMapper"><insert id="insert" useGeneratedKeys="true" keyProperty="id">insert 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>

DishFlavorMapper

@Mapper
public interface DishFlavorMapper {/*** 批量插入口味数据* @param flavors*/@AutoFill(value = OperationType.INSERT)void insertBatch(List<DishFlavor> flavors);
}

对应xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sky.mapper.DishFlavorMapper"><insert id="insertBatch">insert into dish_flavor(dish_id,name,value) values<foreach collection="flavors" item="df" separator=",">(#{df.dishId},#{df.name},#{df.value})</foreach></insert>
</mapper>

然后就是前后端联调
我联调成功了
记得在insert操作上加@AutoFill不然不会自动加入创建人那些公共字段

菜品分页查询

需求分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码开发

controller
在这里插入图片描述
service
在这里插入图片描述
mapper+xml
在这里插入图片描述
在这里插入图片描述
测试成功
主要看能不能显示出菜品名称

易漏点

dish表里无菜品分类名称这一个字段的,需要返回DishVO对象
但有category_id这个字段,可以在category里面查到
需要从category里查
这里设计到多表查询了,而且是以一个表的字段匹配另一个表
这里直接用了左外连接进行查询

删除菜品功能开发

需求分析

注意点
两点
1.在套餐内菜品不能直接删除
2.删除对应的菜品对应的口味表也要删除
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码开发

controller
在这里插入图片描述
service
在这里插入图片描述
对应涉及到根据ID查询的mapper就不放图片了,也用不到xml文件
像根据id查询菜品,根据id删除菜品,还有口味表中的根据菜品id删除口味都简单,直接注解实现即可

mapper
因为要根据菜品的id查询套餐的id
setmealmapper

在这里插入图片描述

在这里插入图片描述
测试
自己测试试试
根据对应的业务规则

修改菜品业务功能

设计根据id回显和修改操作
不仅涉及菜品表还涉及菜品口味表
controller
在这里插入图片描述
service
id获取菜品信息
在这里插入图片描述
修改菜品信息
注意:这里修改口味表情况比较多,我们就用事务注解+删除原口味+新增口味的方法完成
在这里插入图片描述
mapper
用到的基本都是之前定义的
就新增这个修改菜品基本信息的
在这里插入图片描述

http://www.tj-hxxt.cn/news/84677.html

相关文章:

  • 郑州app网站开发百度人气榜
  • 网站建设后期服务收费标准朋友圈推广广告
  • 上海建筑设计有限公司网站seo入门基础教程书籍
  • 贵州毕节建设局网站官网网站排名软件
  • 云服务器做网站查收录网站
  • 网站打开速度慢是什么原因百度推广多少钱一个月
  • 长春火车站防疫政策石家庄百度seo代理
  • 廊坊高端品牌网站建设google官网入口注册
  • 二级域名网站建设规范app推广多少钱一单
  • 中国建设教育协会报名网站推广平台排行榜有哪些
  • 十堰网站建设公司百度投诉中心电话
  • 国外门户网站设计南京网络推广优化哪家好
  • 做网站创业今日新闻国家大事
  • 旅游网站建设的背景意义网站免费高清素材软件
  • 胶南网站制作网页设计培训教程
  • 网站标题栏软文营销步骤
  • 亚马逊官网首页长岭网站优化公司
  • 外贸经济平台代销到哪里买网络营销推广优化
  • 做的网站怎么打开是白板网络营销成功的案例分析
  • 国内b2c网站有哪些百度搜索关键词推广
  • 做网站需要规划好什么长沙网站关键词排名
  • asp网站建设教案郑州网站制作公司哪家好
  • 做导航网站把别人的网址链接过来要经过允许吗whois域名查询
  • 基于wamp的动态网站开发重庆百度快速优化
  • 租用的网站空间的缺点sem是什么意思啊
  • 自己怎么做引流推广厦门百度推广排名优化
  • 能免费做网站吗谷歌搜索引擎怎么才能用
  • 百度网站官网口碑营销的经典案例
  • wordpress update sql广东短视频seo营销
  • 地方门户网站有哪些淘宝交易指数换算工具