【计算机毕业设计】美食烹饪互动平台

发布时间:2024-12-12 23:23

厨房岛台可以增加烹饪互动,也是不错的设计元素 #生活知识# #家庭生活# #厨房设计#

一、前言

如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统美食信息管理难度大,容错率低,管理人员处理数据费工费时,所以专门为解决这个难题开发了一个美食烹饪互动平台,可以解决许多问题。
美食烹饪互动平台可以实现美食知识类型管理,美食管理,美食留言管理,美食收藏管理,美食知识管理,用户管理等功能。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。
美食烹饪互动平台可以提高美食信息管理问题的解决效率,优化美食信息处理流程,保证美食信息数据的安全,它是一个非常可靠,非常安全的应用程序。
二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。在互联网诞生之前,地域位置往往是人们思想上不可跨域的鸿沟,信息的传播速度极慢,信息处理的速度和要求还是通过人们骑马或者是信鸽传递,这些信息传递都是不可控制的,中间很有可能丢失,信息的传递水平决定了人们生活的水平。如今大家都在使用互联网软件产品,从内部管理设置计算机管理,提高内部信息化的管理水准,从外部市场也可以用计算机获取相关数据进行处理,如今各行各业已经严重依赖于计算机了。
本课题研究和开发美食烹饪互动平台,让安装在计算机上的该系统变成管理人员的小帮手,提高美食信息处理速度,规范美食信息处理流程,让管理人员的产出效益更高。
传统处理数据,必须是一张张纸,然后处理完毕又是统计在一张张纸上面,不断的重复处理,最终有个结果给最高层作为参考,这个模式在互联网没有出现之前,是一种常见的事情,信息管理的效率提不上去,人多不一定力量大,因为人多肯定更加消耗资源,并且因为人类需要休息,需要管理,思想会不统一,会偷懒,所以人们研究出专门帮助人们计算的机器,就是计算机的前身,到了互联网时代,人们发现完全可以让程序供应商提供解决方案,自己挑选自己合适的方案来提高自己的产出比。所以在日常工作和生活中会发现各种各样方便人们的工具。
本课题研发的美食烹饪互动平台,就是提供美食信息处理的解决方案,它可以短时间处理完信息,并且这些信息都有专门的存储设备,而且数据的备份和迁移都可以设定为无人值守,从人力角度和信息处理角度以及信息安全角度,美食烹饪互动平台是完胜传统纸质操作的。

二、说明文档

推荐使用:谷歌浏览器

前台登录页面
http://localhost:8080/meishipengrenhudong/front/index.html

后台登录页面
http://localhost:8080/meishipengrenhudong/admin/dist/index.html

管理员 账户:admin 密码:admin
用户 账户:a1 密码:123456
用户 账户:a2 密码:123456
用户 账户:a3 密码:123456

在src\main\resources\application.yml中编辑

url: jdbc:mysql://127.0.0.1:3306/meishipengrenhudong?useUnicode=true&characterEncoding=utf-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8 username: root 数据库用户名 root password: 123456用户密码 123456 123

图片存放路径: src\main\webapp\upload 里面上传图片名里面不能有中文

三、系统功能设计

美食烹饪互动平台根据使用权限的角度进行功能分析,并运用用例图来展示各个权限需要操作的功能。
管理员权限操作的功能包括管理美食,对美食留言进行回复,管理美食知识信息,管理美食知识类型,管理用户,管理公告等。在这里插入图片描述

在这里插入图片描述
用户权限操作的功能包括在线观看美食做法视频,查看美食食材信息以及美食详细介绍信息,查看美食知识以及公告信息等。在这里插入图片描述
管理员功能结构,管理员权限操作的功能包括管理美食,对美食留言进行回复,管理美食知识信息,管理美食知识类型,管理用户,管理公告等。在这里插入图片描述
用户权限操作的功能包括在线观看美食做法视频,查看美食食材信息以及美食详细介绍信息,查看美食知识以及公告信息等。在这里插入图片描述

四、系统数据库设计

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

五、系统效果

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

六、核心代码

package com.thread; /** * 线程执行方法(做一些项目启动后 一直要执行的操作,比如根据时间自动更改订单状态,比如订单签收30天自动收货功能,比如根据时间来更改状态) */ public class MyThreadMethod extends Thread { public void run() { while (!this.isInterrupted()) {// 线程未中断执行循环 try { Thread.sleep(5000); //每隔2000ms执行一次 } catch (InterruptedException e) { e.printStackTrace(); } // ------------------ 开始执行 --------------------------- // System.out.println("线程执行中:" + System.currentTimeMillis()); } } }

1234567891011121314151617181920

package com.ServletContextListener; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.entity.DictionaryEntity; import com.service.DictionaryService; import com.thread.MyThreadMethod; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; import javax.servlet.ServletContextListener; import javax.servlet.ServletContextEvent; import javax.servlet.annotation.WebListener; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 字典初始化监视器 用的是服务器监听,每次项目启动,都会调用这个类 */ @WebListener public class DictionaryServletContextListener implements ServletContextListener { private static final Logger logger = LoggerFactory.getLogger(DictionaryServletContextListener.class); private MyThreadMethod myThreadMethod; @Override public void contextDestroyed(ServletContextEvent sce) { logger.info("----------服务器停止----------"); } @Override public void contextInitialized(ServletContextEvent sce) { ApplicationContext appContext = WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext()); logger.info("----------字典表初始化开始----------"); DictionaryService dictionaryService = (DictionaryService)appContext.getBean("dictionaryService"); List<DictionaryEntity> dictionaryEntities = dictionaryService.selectList(new EntityWrapper<DictionaryEntity>()); Map<String, Map<Integer,String>> map = new HashMap<>(); for(DictionaryEntity d :dictionaryEntities){ Map<Integer, String> m = map.get(d.getDicCode()); if(m ==null || m.isEmpty()){ m = new HashMap<>(); } m.put(d.getCodeIndex(),d.getIndexName()); map.put(d.getDicCode(),m); } sce.getServletContext().setAttribute("dictionaryMap", map); logger.info("----------字典表初始化完成----------"); logger.info("----------线程执行开始----------"); if (myThreadMethod == null) { myThreadMethod = new MyThreadMethod(); myThreadMethod.start(); // servlet 上下文初始化时启动线程myThreadMethod } logger.info("----------线程执行结束----------"); } }

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162

package com.controller; import java.io.File; import java.math.BigDecimal; import java.net.URL; import java.text.SimpleDateFormat; import com.alibaba.fastjson.JSONObject; import java.util.*; import org.springframework.beans.BeanUtils; import javax.servlet.http.HttpServletRequest; import org.springframework.web.context.ContextLoader; import javax.servlet.ServletContext; import com.service.TokenService; import com.utils.*; import java.lang.reflect.InvocationTargetException; import com.service.DictionaryService; import org.apache.commons.lang3.StringUtils; import com.annotation.IgnoreAuth; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.mapper.Wrapper; import com.entity.*; import com.entity.view.*; import com.service.*; import com.utils.PageUtils; import com.utils.R; import com.alibaba.fastjson.*; /** * 美食 * 后端接口 * @author * @email */ @RestController @Controller @RequestMapping("/meishi") public class MeishiController { private static final Logger logger = LoggerFactory.getLogger(MeishiController.class); @Autowired private MeishiService meishiService; @Autowired private TokenService tokenService; @Autowired private DictionaryService dictionaryService; //级联表service @Autowired private YonghuService yonghuService; /** * 后端列表 */ @RequestMapping("/page") public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){ logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params)); String role = String.valueOf(request.getSession().getAttribute("role")); if(false) return R.error(511,"永不会进入"); else if("用户".equals(role)) params.put("yonghuId",request.getSession().getAttribute("userId")); params.put("meishiDeleteStart",1);params.put("meishiDeleteEnd",1); if(params.get("orderBy")==null || params.get("orderBy")==""){ params.put("orderBy","id"); } PageUtils page = meishiService.queryPage(params); //字典表数据转换 List<MeishiView> list =(List<MeishiView>)page.getList(); for(MeishiView c:list){ //修改对应字典表字段 dictionaryService.dictionaryConvert(c, request); } return R.ok().put("data", page); } /** * 后端详情 */ @RequestMapping("/info/{id}") public R info(@PathVariable("id") Long id, HttpServletRequest request){ logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id); MeishiEntity meishi = meishiService.selectById(id); if(meishi !=null){ //entity转view MeishiView view = new MeishiView(); BeanUtils.copyProperties( meishi , view );//把实体数据重构到view中 //级联表 YonghuEntity yonghu = yonghuService.selectById(meishi.getYonghuId()); if(yonghu != null){ BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createTime", "insertTime", "updateTime"});//把级联的数据添加到view中,并排除id和创建时间字段 view.setYonghuId(yonghu.getId()); } //修改对应字典表字段 dictionaryService.dictionaryConvert(view, request); return R.ok().put("data", view); }else { return R.error(511,"查不到数据"); } } /** * 后端保存 */ @RequestMapping("/save") public R save(@RequestBody MeishiEntity meishi, HttpServletRequest request){ logger.debug("save方法:,,Controller:{},,meishi:{}",this.getClass().getName(),meishi.toString()); String role = String.valueOf(request.getSession().getAttribute("role")); if(false) return R.error(511,"永远不会进入"); else if("用户".equals(role)) meishi.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")))); Wrapper<MeishiEntity> queryWrapper = new EntityWrapper<MeishiEntity>() .eq("yonghu_id", meishi.getYonghuId()) .eq("meishi_uuid_number", meishi.getMeishiUuidNumber()) .eq("meishi_name", meishi.getMeishiName()) .eq("meishi_video", meishi.getMeishiVideo()) .eq("meishi_types", meishi.getMeishiTypes()) .eq("meishi_clicknum", meishi.getMeishiClicknum()) .eq("meishi_shicai_text", meishi.getMeishiShicaiText()) .eq("shangxia_types", meishi.getShangxiaTypes()) .eq("meishi_delete", meishi.getMeishiDelete()) ; logger.info("sql语句:"+queryWrapper.getSqlSegment()); MeishiEntity meishiEntity = meishiService.selectOne(queryWrapper); if(meishiEntity==null){ meishi.setZanNumber(0); meishi.setCaiNumber(0); meishi.setMeishiClicknum(1); meishi.setShangxiaTypes(1); meishi.setMeishiDelete(1); meishi.setCreateTime(new Date()); meishiService.insert(meishi); return R.ok(); }else { return R.error(511,"表中有相同数据"); } } /** * 后端修改 */ @RequestMapping("/update") public R update(@RequestBody MeishiEntity meishi, HttpServletRequest request){ logger.debug("update方法:,,Controller:{},,meishi:{}",this.getClass().getName(),meishi.toString()); String role = String.valueOf(request.getSession().getAttribute("role")); // if(false) // return R.error(511,"永远不会进入"); // else if("用户".equals(role)) // meishi.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")))); //根据字段查询是否有相同数据 Wrapper<MeishiEntity> queryWrapper = new EntityWrapper<MeishiEntity>() .notIn("id",meishi.getId()) .andNew() .eq("yonghu_id", meishi.getYonghuId()) .eq("meishi_uuid_number", meishi.getMeishiUuidNumber()) .eq("meishi_name", meishi.getMeishiName()) .eq("meishi_video", meishi.getMeishiVideo()) .eq("zan_number", meishi.getZanNumber()) .eq("cai_number", meishi.getCaiNumber()) .eq("meishi_types", meishi.getMeishiTypes()) .eq("meishi_clicknum", meishi.getMeishiClicknum()) .eq("meishi_shicai_text", meishi.getMeishiShicaiText()) .eq("shangxia_types", meishi.getShangxiaTypes()) .eq("meishi_delete", meishi.getMeishiDelete()) ; logger.info("sql语句:"+queryWrapper.getSqlSegment()); MeishiEntity meishiEntity = meishiService.selectOne(queryWrapper); if("".equals(meishi.getMeishiPhoto()) || "null".equals(meishi.getMeishiPhoto())){ meishi.setMeishiPhoto(null); } if("".equals(meishi.getMeishiVideo()) || "null".equals(meishi.getMeishiVideo())){ meishi.setMeishiVideo(null); } if(meishiEntity==null){ meishiService.updateById(meishi);//根据id更新 return R.ok(); }else { return R.error(511,"表中有相同数据"); } } /** * 删除 */ @RequestMapping("/delete") public R delete(@RequestBody Integer[] ids){ logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString()); ArrayList<MeishiEntity> list = new ArrayList<>(); for(Integer id:ids){ MeishiEntity meishiEntity = new MeishiEntity(); meishiEntity.setId(id); meishiEntity.setMeishiDelete(2); list.add(meishiEntity); } if(list != null && list.size() >0){ meishiService.updateBatchById(list); } return R.ok(); } /** * 批量上传 */ @RequestMapping("/batchInsert") public R save( String fileName, HttpServletRequest request){ logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName); Integer yonghuId = Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { List<MeishiEntity> meishiList = new ArrayList<>();//上传的东西 Map<String, List<String>> seachFields= new HashMap<>();//要查询的字段 Date date = new Date(); int lastIndexOf = fileName.lastIndexOf("."); if(lastIndexOf == -1){ return R.error(511,"该文件没有后缀"); }else{ String suffix = fileName.substring(lastIndexOf); if(!".xls".equals(suffix)){ return R.error(511,"只支持后缀为xls的excel文件"); }else{ URL resource = this.getClass().getClassLoader().getResource("static/upload/" + fileName);//获取文件路径 File file = new File(resource.getFile()); if(!file.exists()){ return R.error(511,"找不到上传文件,请联系管理员"); }else{ List<List<String>> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件 dataList.remove(0);//删除第一行,因为第一行是提示 for(List<String> data:dataList){ //循环 MeishiEntity meishiEntity = new MeishiEntity(); // meishiEntity.setYonghuId(Integer.valueOf(data.get(0))); //用户 要改的 // meishiEntity.setMeishiUuidNumber(data.get(0)); //美食编号 要改的 // meishiEntity.setMeishiName(data.get(0)); //美食名称 要改的 // meishiEntity.setMeishiPhoto("");//详情和图片 // meishiEntity.setMeishiVideo(data.get(0)); //美食做法 要改的 // meishiEntity.setZanNumber(Integer.valueOf(data.get(0))); //赞 要改的 // meishiEntity.setCaiNumber(Integer.valueOf(data.get(0))); //踩 要改的 // meishiEntity.setMeishiTypes(Integer.valueOf(data.get(0))); //美食类型 要改的 // meishiEntity.setMeishiClicknum(Integer.valueOf(data.get(0))); //游览量 要改的 // meishiEntity.setMeishiShicaiText(data.get(0)); //相关食材 要改的 // meishiEntity.setMeishiContent("");//详情和图片 // meishiEntity.setShangxiaTypes(Integer.valueOf(data.get(0))); //是否上架 要改的 // meishiEntity.setMeishiDelete(1);//逻辑删除字段 // meishiEntity.setCreateTime(date);//时间 meishiList.add(meishiEntity); //把要查询是否重复的字段放入map中 //美食编号 if(seachFields.containsKey("meishiUuidNumber")){ List<String> meishiUuidNumber = seachFields.get("meishiUuidNumber"); meishiUuidNumber.add(data.get(0));//要改的 }else{ List<String> meishiUuidNumber = new ArrayList<>(); meishiUuidNumber.add(data.get(0));//要改的 seachFields.put("meishiUuidNumber",meishiUuidNumber); } } //查询是否重复 //美食编号 List<MeishiEntity> meishiEntities_meishiUuidNumber = meishiService.selectList(new EntityWrapper<MeishiEntity>().in("meishi_uuid_number", seachFields.get("meishiUuidNumber")).eq("meishi_delete", 1)); if(meishiEntities_meishiUuidNumber.size() >0 ){ ArrayList<String> repeatFields = new ArrayList<>(); for(MeishiEntity s:meishiEntities_meishiUuidNumber){ repeatFields.add(s.getMeishiUuidNumber()); } return R.error(511,"数据库的该表中的 [美食编号] 字段已经存在 存在数据为:"+repeatFields.toString()); } meishiService.insertBatch(meishiList); return R.ok(); } } } }catch (Exception e){ e.printStackTrace(); return R.error(511,"批量插入数据异常,请联系管理员"); } } /** * 前端列表 */ @IgnoreAuth @RequestMapping("/list") public R list(@RequestParam Map<String, Object> params, HttpServletRequest request){ logger.debug("list方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params)); // 没有指定排序字段就默认id倒序 if(StringUtil.isEmpty(String.valueOf(params.get("orderBy")))){ params.put("orderBy","meishi_clicknum"); } PageUtils page = meishiService.queryPage(params); //字典表数据转换 List<MeishiView> list =(List<MeishiView>)page.getList(); for(MeishiView c:list) dictionaryService.dictionaryConvert(c, request); //修改对应字典表字段 return R.ok().put("data", page); } /** * 前端详情 */ @RequestMapping("/detail/{id}") public R detail(@PathVariable("id") Long id, HttpServletRequest request){ logger.debug("detail方法:,,Controller:{},,id:{}",this.getClass().getName(),id); MeishiEntity meishi = meishiService.selectById(id); if(meishi !=null){ //点击数量加1 meishi.setMeishiClicknum(meishi.getMeishiClicknum()+1); meishiService.updateById(meishi); //entity转view MeishiView view = new MeishiView(); BeanUtils.copyProperties( meishi , view );//把实体数据重构到view中 //级联表 YonghuEntity yonghu = yonghuService.selectById(meishi.getYonghuId()); if(yonghu != null){ BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段 view.setYonghuId(yonghu.getId()); } //修改对应字典表字段 dictionaryService.dictionaryConvert(view, request); return R.ok().put("data", view); }else { return R.error(511,"查不到数据"); } } /** * 前端保存 */ @RequestMapping("/add") public R add(@RequestBody MeishiEntity meishi, HttpServletRequest request){ logger.debug("add方法:,,Controller:{},,meishi:{}",this.getClass().getName(),meishi.toString()); Wrapper<MeishiEntity> queryWrapper = new EntityWrapper<MeishiEntity>() .eq("yonghu_id", meishi.getYonghuId()) .eq("meishi_uuid_number", meishi.getMeishiUuidNumber()) .eq("meishi_name", meishi.getMeishiName()) .eq("meishi_video", meishi.getMeishiVideo()) .eq("zan_number", meishi.getZanNumber()) .eq("cai_number", meishi.getCaiNumber()) .eq("meishi_types", meishi.getMeishiTypes()) .eq("meishi_clicknum", meishi.getMeishiClicknum()) .eq("meishi_shicai_text", meishi.getMeishiShicaiText()) .eq("shangxia_types", meishi.getShangxiaTypes()) .eq("meishi_delete", meishi.getMeishiDelete()) ; logger.info("sql语句:"+queryWrapper.getSqlSegment()); MeishiEntity meishiEntity = meishiService.selectOne(queryWrapper); if(meishiEntity==null){ meishi.setMeishiDelete(1); meishi.setCreateTime(new Date()); meishiService.insert(meishi); return R.ok(); }else { return R.error(511,"表中有相同数据"); } } }

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390

网址:【计算机毕业设计】美食烹饪互动平台 https://www.yuejiaxmz.com/news/view/457361

相关内容

【计算机毕业设计】215美食烹饪互动平台
基于springboot技术的美食烹饪互动平台的设计与实现
springboot215基于springboot技术的美食烹饪互动平台的设计与实现
springboot基于springboot技术的美食烹饪互动平台的设计与实现
基于SpringBoot+Vue+SSM技术的美食烹饪互动平台的设计与实现资源下载
基于springboot技术的美食烹饪互动平台的设计与实现二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生
【开题报告】基于Springboot+vue中华美食菜谱系统设计与实现(程序+源码+论文) 计算机毕业设计
【计算机毕业设计】287校园二手书交易平台
【计算机毕业设计】163美食推荐商城
【计算机毕业设计】314学生二手书籍交易平台

随便看看