最新要闻
- 看点:杲杲冬日光明暖真可爱什么意思-杲杲冬日光明暖真可爱
- 男子报案在香港中环码头遭遇抢劫 其周杰伦演唱会门票被抢走
- 世嘉公布《魔界战记7》角色“彼岸绝胜斋”中文版介绍影像 为最恶毒剑士
- 人气手游《赛马娘》樱花进王1/7比例手办现已开定 将于10月发售
- 《爱恋冰果室》即将登陆XboxS 为恋爱经营模拟游戏
- 【世界新视野】4月新能源销量排名:最亮眼的 竟然不是比亚迪
- 当前速读:为什么面粉没有以前的香?加了添加剂安全吗?
- 焦点信息:员工病假15年起诉IBM:认为工资无法赶上通胀
- 舞台剧《全职猎人》在东京银河剧场举行公开彩排 讲述小杰等人故事
- 《圣斗士星矢》真人电影在北美上映 烂番茄新鲜度已降至17%
- 《塞尔达传说:王国之泪》官方推出系列周边 包括T恤与水杯等产品
- 小岛秀夫纪录片即将上线翠贝卡电影节首映 时长约为90分钟
- 《SD高达激斗同盟》新DLC水星的魔女现已发售 国区定价为48元
- 90后跆拳道女运动员娜娜摆摊卖水果 积极向上态度引发网友赞叹
- 中国恒大公告:许家印成被执行人,涉及金额超 60 亿元-世界热门
- 某考研机构欲花百万请孟羽童代言 网友热议:赢麻了|当前快报
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
瑞吉外卖day4
菜品管理业务开发
文件上传与下载
文件上传
介绍
服务端要接收客户端页面上传的文件,通常都会使用Apache的两个组件
(资料图片)
1.commons-file upload
2.commons-io
Spring框架在spring-web包中对文件上传进行了封装。只需要在Controller的方法中声明一个MultipartFile类型的参数即可接受上传的文件
代码实现
@Value("${reggie.path}") private String basePath; @PostMapping("/upload") public Rupload(MultipartFile file){ //file是一个临时文件,需要把他转存到指定文件,否则本次请求完成后会被删除 log.info("上传的文件{}",file.toString()); //原始文件名 String originalFilename = file.getOriginalFilename(); String suffix = originalFilename.substring(originalFilename.lastIndexOf(".")); //使用uuid重新生成文件名,防止文件名重复造成文件被覆盖 String fileName = UUID.randomUUID().toString()+suffix; //创建一个目录对象 File dir = new File(basePath); //判断当前目录是否存在 if (!dir.exists()){ //目录不存在 创建目录 dir.mkdirs(); } try { file.transferTo(new File(basePath+fileName)); } catch (IOException e) { throw new RuntimeException(e); } return R.success(fileName); }
upload方法里的形参名要保证与前端提交的表单名一致
在yml配置文件中定义路径变量path
文件下载
代码实现
@GetMapping("/download") public void download(String name, HttpServletResponse response){ try { //输入流 通过输入流读取文件内容 FileInputStream fileInputStream = new FileInputStream(new File(basePath+name)); //输出流 通过输出流将文件写回浏览器 在浏览器展示图片 ServletOutputStream outputStream = response.getOutputStream(); response.setContentType("image/jpeg");//设置文件写入类型 int len = 0; byte[] bytes = new byte[1024]; while ((len=fileInputStream.read(bytes))!=-1){//len:m每次读取的有效字节数当len=-1表示读取到文件末尾 outputStream.write(bytes,0,len);//**写出指定长度字节数组**:`write(byte[] b, int off, int len)` ,每次写出从off索引开始,len个字节, outputStream.flush(); } outputStream.close(); fileInputStream.close(); } catch (FileNotFoundException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } }
新增菜品功能
需求分析
后台系统中可以管理菜品信息,通过新增功能来添加一个新的菜品,在添加菜品时需要选择当前菜品所属菜品分类,并且需要上传菜品图片,在移动端会按照菜品分类来展示对应的菜品信息
数据模型
代码开发
准备工作:
实体类DishFlavor
Mapper接口DishFlavorMapper
业务层接口DishFlavorService
业务层实现类 DishFlavorServicelmpl控制层 DishController
交互过程:
1、页面(backend/page/food/ add.html)发送ajax请求,请求服务端获取菜品分类数据并展示到下拉框中
/** * * @param category * @return */ @GetMapping("/list") public R> list(Category category){ //条件构造器 LambdaQueryWrapper
queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(category.getType()!=null,Category::getType,category.getType()); queryWrapper.orderByAsc(Category::getSort).orderByDesc(Category::getUpdateTime); List list = categoryService.list(queryWrapper); return R.success(list); }
2、页面发送请求进行图片上传,请求服务端将图片保存到服务器
3、页面发送请求进行图片下载,将上传的图片进行回显
4、点击保存按钮,发送ajax请求,将菜品相关数据以json形式提交到服务端
前端提交的json数据与dish实体类不是一一对应,需要定义dishDao类来接受数据
DTO:全称为Data Transfer Object,即数据传输对象,一般用于展示层和服务层之间的数据传输
@Datapublic class DishDto extends Dish { private Listflavors = new ArrayList<>(); private String categoryName; private Integer copies;}
菜品信息分页查询
代码开发-梳理交互
1、页面(backend/page/food/list.html)发送ajax请求,将分页查询参数(page、pageSize,name)提交到服务端,获取分页数据2、页面发送请求,请求服务端进行图片下载,用于页面图片展示
代码实现
/*** 菜品分页查询* @param page* @param pageSize* @param name* @return*/@GetMapping("/page")public Rpage(int page,int pageSize,String name){//构造分页构造器对象Page pageInfo = new Page<>(page,pageSize);Page dishDtoPage = new Page<>();//构造查询构造器对象LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();queryWrapper.like(name!=null,Dish::getName,name);queryWrapper.orderByDesc(Dish::getUpdateTime);dishService.page(pageInfo,queryWrapper);//对象拷贝BeanUtils.copyProperties(pageInfo,dishDtoPage,"records");List records = pageInfo.getRecords();List list= records.stream().map((item)->{DishDto dishDto = new DishDto();BeanUtils.copyProperties(item,dishDto);Long categoryId = item.getCategoryId();//根据id查询分类对象Category category=categoryService.getById(categoryId);if (category!=null){String categoryName = category.getName();dishDto.setCategoryName(categoryName);}return dishDto;}).collect(Collectors.toList());dishDtoPage.setRecords(list);return R.success(dishDtoPage);}
前端渲染页面需要categoryName参数。实体类dish中无对应属性,所以不能直接将获取到的pageInfo响应给客户端。再声明泛型为DishDao的Page对象。将pageInfo中的属性拷贝到dishDaoPage中返回给客户端,但由于pageInfo中的records属性中寸的是dish对象,需要单独处理,将records中的dish对象转换为dishDao对象存到新集合中。最后将dishDaoPage返回给前端。
修改菜品
需求分析
在菜品管理列表页面点击修改按钮,跳转到修改菜品页面,在修改页面回显菜品相关信息并进行修改,点击确定按钮完成相关操作
代码实现
页面的回显信息中包含菜品口味,因此服务端应向客户端返回dishDto类型的数据,在dishService中声明getByIdWithFlavor方法,根据id查询菜品信息以及菜品口味信息封装成dishDto对象,返回
@Override public DishDto getByIdWithFlavor(Long id) { Dish dish = this.getById(id); DishDto dishDto = new DishDto(); BeanUtils.copyProperties(dish,dishDto); //查询当前菜品的口味信息 LambdaQueryWrapperqueryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(DishFlavor::getDishId,dish.getId()); List list = dishFlavorService.list(queryWrapper); dishDto.setFlavors(list); return dishDto; }
调用dishSer中的getByIdWithFlavor方法,将返回值响应给客户端,实现数据回显
@GetMapping("/{id}") public Rget(@PathVariable Long id){ DishDto byIdWithFlavor = dishService.getByIdWithFlavor(id); return R.success(byIdWithFlavor); }
将修改后的数据保存到数据库中,需要分别更新菜品表和菜品口味表。
菜品口味表的更新分两步,第一步先将当前口味表中对应的数据删除,再添加客户端提交过来的数据实现数据更新
@Override public void updateWithFlavor(DishDto dishDto) { //更新dish表基本信息 this.updateById(dishDto); //清理当前菜品口味对应数据-----dishFlavor表对应的删除操作 LambdaQueryWrapperqueryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(DishFlavor::getDishId,dishDto.getId()); dishFlavorService.remove(queryWrapper); //添加提交过来的口味数据 List flavors = dishDto.getFlavors(); flavors = flavors.stream().map((item)->{ item.setDishId(dishDto.getId()); return item; }).collect(Collectors.toList()); dishFlavorService.saveBatch(flavors); }
/** * 修改菜品 * @param dishDto * @return */ @PutMapping public Rupdate(@RequestBody DishDto dishDto){ log.info(dishDto.toString()); dishService.updateWithFlavor(dishDto); return R.success("修改菜品成功"); }
关键词:
瑞吉外卖day4
看点:杲杲冬日光明暖真可爱什么意思-杲杲冬日光明暖真可爱
男子报案在香港中环码头遭遇抢劫 其周杰伦演唱会门票被抢走
世嘉公布《魔界战记7》角色“彼岸绝胜斋”中文版介绍影像 为最恶毒剑士
人气手游《赛马娘》樱花进王1/7比例手办现已开定 将于10月发售
《爱恋冰果室》即将登陆XboxS 为恋爱经营模拟游戏
【世界新视野】4月新能源销量排名:最亮眼的 竟然不是比亚迪
当前速读:为什么面粉没有以前的香?加了添加剂安全吗?
焦点信息:员工病假15年起诉IBM:认为工资无法赶上通胀
舞台剧《全职猎人》在东京银河剧场举行公开彩排 讲述小杰等人故事
《圣斗士星矢》真人电影在北美上映 烂番茄新鲜度已降至17%
《塞尔达传说:王国之泪》官方推出系列周边 包括T恤与水杯等产品
小岛秀夫纪录片即将上线翠贝卡电影节首映 时长约为90分钟
《SD高达激斗同盟》新DLC水星的魔女现已发售 国区定价为48元
90后跆拳道女运动员娜娜摆摊卖水果 积极向上态度引发网友赞叹
【世界新视野】Python学习之五_字符串处理生成查询SQL
spring框架_@AutoWiredAnnotationBeanPostProcessor执行分析 今日聚焦
中国恒大公告:许家印成被执行人,涉及金额超 60 亿元-世界热门
某考研机构欲花百万请孟羽童代言 网友热议:赢麻了|当前快报
男子剪鼻毛致鼻腔感染住院12天 医生提醒:非常危险|每日信息
全球看点:将乔峰、郭靖等改写成大学生!金庸生前诉江南案终审宣判:获赔188万
Hyper Demon拆解 当前速看
新疆维吾尔自治区阿勒泰市2023-05-13 12:01发布暴雨蓝色预警 全球热闻
女子辞年薪50万工作照顾瘫痪奶奶:只想陪她走完最后一程-全球微头条
世界快播:国人最爱买啥车?2023新车购买意向研报出炉:比亚迪夺冠
券后9块9!汤臣倍健维生素D钙片大促:手慢真的无
环球新动态:苏享茂家属称收到翟欣欣660万还款,后者被判退还千万财物
热门:恒大汽车公告:剥离地产业务因资金不足已暂缓生产恒驰5
世界快资讯丨理想城市NOA测试画面曝光 马斯克:看起来有点眼熟
世界热门:AI出来后第一个失业的是孙燕姿?歌迷齐呼:等你的演唱会
天天速讯:夜莺初探四·mtail插件采集日志指标
《首次公开募股(IPO)企业品牌建设指南》标准立项暨“IPO企业品牌辅导专项行动”正式启动_动态
撑起国产芯片!华为继续摸索半导体核心技术:新专利带来更高效封装 天天微头条
伐木累暗示速激12
怎样查询个人养老保险缴纳的情况信息 怎样查询个人养老保险缴纳的情况|信息
当前资讯!男童酒店客房误食用过的安全套 家长与酒店吵翻:网友直呼太巧合
90后宝爸拽脚倒提1岁女儿摸金鱼 妈妈称没危险:网友吐槽为啥要摸 世界微资讯
今日热议:广西:5月13日至15日开展高考志愿填报演练
世界快播:分布式系统常见问题
百度手机曝光:后置双摄+4G网络 世界快资讯
骁龙888再就业!荣耀新平板入网:13英寸超大LCD屏_全球速看
德普拿下超级香水合约
速递!AI出来后第一个失业的是孙燕姿:为什么说她的音色不受法律保护
天天最资讯丨中国地形地貌最全的省份:你可能想不到
专家称睡满8小时是误区:张朝阳曾称四小时足够 睡多浪费
项目一个不留!OPPO放弃ZEKU自研芯片业务:多大代价都是最小代价 世界快资讯
法网公布奖金分配:总额提升12.3%,低排位选手获利,冠军230万欧-世界今日报
全球今热点:地位远超iPhone!苹果Reality Pro头显12月大规模量产:售价超2万
环球快播:小白也能辨别!买独显轻薄本必须要看的四大规格
马斯克:当Linda Yaccarino准备好时,我们会在Twitter Spaces进行实时音频对话,欢迎提问任何事情。-每日报道
有赞一面:亿级用户DAU日活统计,有几种方案?-每日速递
每日快播:gazebo+rviz 仿真
OPPO放弃自研芯片!马里亚纳X/Y官网页面悄然404_环球微速讯
天天快报!国外玩家质疑《塞尔达传说:王国之泪》涉嫌抄袭:照搬游戏机制
二次圆满成功!中国可重复火箭发动机传喜讯 今头条
在美国加州 我亲眼见到了Google对AI的孤注一掷_每日热闻
性能秒RTX 4060?AMD新显卡性能实测 光追是短板 今日报
庄河市气象局发布雷电黄色预警【III级/较重】【2023-05-13】
成都惠蓉保报销有等待期吗? 当前播报
4K【龙与地下城:侠盗荣耀】
苹果MacBook新专利公布 掌托与触控板位置实现触控交互
深圳一公司通知母亲节放假3天 每位员工将收到一套礼盒
全国多地气温开始火速上升 北方将迎来今年首轮高温天气过程
电影《灌篮高手》宣布密钥延期 将延长上映至6月19日
DC电影公布《闪电侠》国内首波口碑 将于6月16日全国上映
bilibili云剪辑将于今年5月31日下线 其访问入口关闭
电视剧《庆余年2》宣布正式开机 其海报细节涉嫌抄袭国外艺术家
林志颖首次现身珠海赛车场 身体状态颇为不错
京都动画工作室纵火杀人案9月5日公审 为平成时代最致命案件
迪士尼真人巨制《小美人鱼》即将上映 现已宣布内地版配唱阵容
当前关注:第三章.数据库系统(重点)
使用Pandoc构建Acm模板-焦点简讯
Epic下周神秘游戏喜加4:不是老头环、大表哥2|世界要闻
6死20余伤!广州宝马X3撞人案动机公开:发泄个人情绪 焦点信息
苏丹首都喀土穆等地的武装冲突12日仍在持续|每日速递
剑指 Offer 03. 数组中重复的数字-头条
REITs审核关注事项优化 突出以“管资产”为核心
【新华解读】科创50ETF期权上市启动 丰富市场风险管理工具
先到先停!上海一男子交停车费,回来没有车位停,觉得保安在狡辩
卫士重生_世界新动态
《塞尔达传说:王国之泪》被玩家仅用94分钟通关|当前消息
树状数组--动态维护区间操作-新动态
记一次C++后台开发面试拷打过程
目录
快报:中国第二个陨石坑证实!10万年来最大规模的撞击
【世界报资讯】覆盖全球!我国自主研发的全球风暴潮、海啸监测预警系统正式上线运行
开心麻花进军人工智能领域 成立数字科技有限公司_天天热推荐
96核Zen4史无前例 AMD下代锐龙线程撕裂者被偷跑:再等4个月
离职前月薪不足一万 工作21小时!孟羽童去年统计为格力带货近400万_今日热闻
泛“舟”银河 再赴“天宫”——天舟六号货运飞船发射升空侧记_全球热闻
使用键盘控制gazebo小车模型运动-环球快报
环球讯息:桐柏农商银行:行长进万企 助力乡村振兴
全球观焦点:女硕士求职客服岗位被婉拒!HR教改简历
世界微速讯:危险!无人驾驶第一股 面临强制退市
喜大普奔!曝半幅式方向盘车辆不被允许上工信部公告 全球热消息
能跑100km!一文看懂小牛G400电动车:35L座桶堪比20寸行李箱
专家:我国网络建设可满足4K/8K视频分发 标清机顶盒拖了后腿 天天即时
博菲电气(001255.SZ):拟发行可转债募资不超3.9亿元 投于年产70000吨新能源复合材料制品建设项目|精选
redis持久化之AOF|速看料
勘设股份: 勘设股份关于向特定对象发行股票申请文件的审核问询函回复(修订稿)及募集说明书等申请文件更新的提示性公告 每日动态