分享一套基于SSM的美食推荐管理系统(源码+文档+部署)

大家好,今天给大家分享一套基于SSM的美食推荐管理系统

开发语言:Java
数据库:MySQL
技术:Spring+SpringMvc+MyBatis
工具:IDEA/Ecilpse、Navicat、Maven

博主介绍: 一名Java全栈工程师,专注于Java全栈技术!
主要技术: SpringCloud Alibaba、SpringBoot、SSM、Html、Css、Vue、小程序、uni-app等设计与开发。
获取源码: @

目录

  • 基于SSM的美食推荐管理系统
    • 一、演示效果
    • 二、前言
    • 三、系统关键技术
    • 四、系统设计
    • 五、系统功能设计
    • 六、部分代码
    • 七、文档参考
  • 热门推荐

基于SSM的美食推荐管理系统

一、演示效果

在这里插入图片描述

二、前言

21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准确、快速、完善,并能提高工作管理效率,促进其发展。
论文主要是对美食推荐管理系统进行了介绍,包括研究的现状,还有涉及的开发背景,然后还对系统的设计目标进行了论述,还有系统的需求,以及整个的设计方案,对系统的设计以及实现,也都论述的比较细致,最后对美食推荐管理系统进行了一些具体测试。
本文以JSP为开发技术,实现了一个美食推荐管理系统。美食推荐管理系统的主要使用者分为管理员;个人中心、用户管理、美食分类管理、热门美食管理、美食教程管理、美食店铺管理、美食社区、系统管理,前台首页;首页、热门美食、美食教程、美食店铺、美食社区、美食资讯、我的、跳转到后台,用户;个人中心、美食教程管理、我的收藏管理等功能。通过这些功能模块的设计,基本上实现了整个美食推荐管理系统的过程。
具体在系统设计上,采用了B/S的结构,同时,也使用JSP技术在动态页面上进行了设计,后台上采用Mysql数据库,是一个非常优秀的美食推荐管理系统。

关键词 :美食推荐管理系统;JSP技术;Mysql数据库;B/S结构

三、系统关键技术

JSP技术、JAVA、MYSQL、B/S结构、SSM等等

四、系统设计

系统结构设计
在这里插入图片描述

五、系统功能设计

5.1前台首页功能模块
美食推荐管理系统,在系统首页可以查看首页、热门美食、美食教程、美食店铺、美食社区、美食资讯、我的、跳转到后台等内容,如图5-1所示。
在这里插入图片描述

图5-1前台首页功能界面图

用户注册,在注册页面可以填写用户名、密码、姓名、联系电话等信息进行注册,如图5-2所示。
在这里插入图片描述

图5-2用户注册界面图

用户登录,在登录页面通过填写账号、密码等信息完成登录,如图5-3所示。在热门美食页面通过查看美食名称、分类、图片、材料、美食特色等信息进行点我收藏操作,如图5-4所示。
在这里插入图片描述

图5-3用户登录界面图

在这里插入图片描述

图5-4热门美食界面图

个人中心,在个人中心页面通过填写用户名、密码、姓名、头像、性别、联系电话等信息更新信息、退出登录,如图5-5所示。在美食店铺页面通过查看店铺名称、图片、营业时间、联系人、联系电话、店铺地址、店铺介绍、经典菜品等信息进行点我收藏操作,如图5-6所示。
在这里插入图片描述

图5-5个人中心界面图

在这里插入图片描述

图5-6美食店铺界面图

5.2管理员功能模块
管理员登录,通过填写用户名、密码进行登录,如图5-7所示。
在这里插入图片描述

图5-7管理员登录界面图

管理员登录进入美食推荐管理系统可以查看个人中心、用户管理、美食分类管理、热门美食管理、美食教程管理、美食店铺管理、美食社区、系统管理等信息。
用户管理,在用户管理页面中可以通过查看用户名、姓名、头像、性别、联系电话等内容进行修改、删除,如图5-8所示。还可以根据需要对美食分类管理进行详情,修改等详细操作,如图5-9所示。
在这里插入图片描述

图5-8用户管理界面图

在这里插入图片描述

图5-9美食分类管理界面图

热门美食管理,在热门美食管理页面中可以查看美食名称、分类、图片、材料、美食特色等信息,并可根据需要对已有热门美食管理进行修改或删除等操作,如图5-10所示。
在这里插入图片描述

图5-10热门美食管理界面图

美食店铺管理,在美食店铺管理页面中可以查看店铺名称、图片、营业时间、联系人、联系电话、店铺地址、店铺介绍、经典菜品等信息,并可根据需要对已有美食店铺管理进行修改或删除等详细操作,如图5-11所示。
在这里插入图片描述

图5-11美食店铺管理界面图

美食资讯管理,在美食资讯管理页面中可以查看标题、简介、图片、内容等内容,并且根据需要对已有美食资讯管理进行详情,修改或删除等详细操作,如图5-12所示。
在这里插入图片描述

图5-12美食资讯管理界面图

轮播图;该页面为轮播图管理界面。管理员可以在此页面进行首页轮播图的管理,通过新建操作可在轮播图中加入新的图片,还可以对以上传的图片进行修改操作,以及图片的删除操作,如图5-13所示。
在这里插入图片描述

图5-13轮播图管理界面图

5.3用户功能模块
用户登录进入美食推荐管理系统可以查看个人中心、美食教程管理、我的收藏管理等内容。
个人信息,在个人信息页面中通过查看用户名、密码、姓名、头像、性别、联系电话等信息,还可以根据需要对个人信息进行修改,如图5-14所示。
在这里插入图片描述

图5-14个人信息界面图

美食教程管理,在美食教程管理页面中可以查看美食名称、分类、图片、用料、烹饪方法、烹饪时长、美食特色、制作方法、小贴士、发布日期、用户名等信息,并且根据需要对已有美食教程管理进行查看删除等其他详细操作,如图5-15所示。
在这里插入图片描述

图5-15美食教程管理界面图

我的收藏管理,在我的收藏管理页面中可以查看用户id、收藏id、表名、收藏名称、收藏图片等信息,并且根据需要对已有我的收藏管理进行查看删除等其他详细操作,如图5-16所示。
在这里插入图片描述

图5-16我的收藏管理界面图

六、部分代码


package com.controller;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;

import com.utils.ValidatorUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.annotation.IgnoreAuth;

import com.entity.NewsEntity;
import com.entity.view.NewsView;

import com.service.NewsService;
import com.service.TokenService;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.MD5Util;
import com.utils.MPUtil;
import com.utils.CommonUtil;


/**
 * 美食资讯
 * 后端接口
 * @author 
 * @email 
 * @date 2021-03-22 10:16:10
 */
@RestController
@RequestMapping("/news")
public class NewsController {
    @Autowired
    private NewsService newsService;
    


    /**
     * 后端列表
     */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params,NewsEntity news, 
		HttpServletRequest request){

        EntityWrapper<NewsEntity> ew = new EntityWrapper<NewsEntity>();
    	PageUtils page = newsService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, news), params), params));
		request.setAttribute("data", page);
        return R.ok().put("data", page);
    }
    
    /**
     * 前端列表
     */
	@IgnoreAuth
    @RequestMapping("/list")
    public R list(@RequestParam Map<String, Object> params,NewsEntity news, HttpServletRequest request){
        EntityWrapper<NewsEntity> ew = new EntityWrapper<NewsEntity>();
    	PageUtils page = newsService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, news), params), params));
		request.setAttribute("data", page);
        return R.ok().put("data", page);
    }

	/**
     * 列表
     */
    @RequestMapping("/lists")
    public R list( NewsEntity news){
       	EntityWrapper<NewsEntity> ew = new EntityWrapper<NewsEntity>();
      	ew.allEq(MPUtil.allEQMapPre( news, "news")); 
        return R.ok().put("data", newsService.selectListView(ew));
    }

	 /**
     * 查询
     */
    @RequestMapping("/query")
    public R query(NewsEntity news){
        EntityWrapper< NewsEntity> ew = new EntityWrapper< NewsEntity>();
 		ew.allEq(MPUtil.allEQMapPre( news, "news")); 
		NewsView newsView =  newsService.selectView(ew);
		return R.ok("查询美食资讯成功").put("data", newsView);
    }
	
    /**
     * 后端详情
     */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") Long id){
        NewsEntity news = newsService.selectById(id);
        return R.ok().put("data", news);
    }

    /**
     * 前端详情
     */
	@IgnoreAuth
    @RequestMapping("/detail/{id}")
    public R detail(@PathVariable("id") Long id){
        NewsEntity news = newsService.selectById(id);
        return R.ok().put("data", news);
    }
    



    /**
     * 后端保存
     */
    @RequestMapping("/save")
    public R save(@RequestBody NewsEntity news, HttpServletRequest request){
    	news.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
    	//ValidatorUtils.validateEntity(news);

        newsService.insert(news);
        return R.ok();
    }
    
    /**
     * 前端保存
     */
    @RequestMapping("/add")
    public R add(@RequestBody NewsEntity news, HttpServletRequest request){
    	news.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
    	//ValidatorUtils.validateEntity(news);

        newsService.insert(news);
        return R.ok();
    }

    /**
     * 修改
     */
    @RequestMapping("/update")
    public R update(@RequestBody NewsEntity news, HttpServletRequest request){
        //ValidatorUtils.validateEntity(news);
        newsService.updateById(news);//全部更新
        return R.ok();
    }
    

    /**
     * 删除
     */
    @RequestMapping("/delete")
    public R delete(@RequestBody Long[] ids){
        newsService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }
    
    /**
     * 提醒接口
     */
	@RequestMapping("/remind/{columnName}/{type}")
	public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, 
						 @PathVariable("type") String type,@RequestParam Map<String, Object> map) {
		map.put("column", columnName);
		map.put("type", type);
		
		if(type.equals("2")) {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			Calendar c = Calendar.getInstance();
			Date remindStartDate = null;
			Date remindEndDate = null;
			if(map.get("remindstart")!=null) {
				Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
				c.setTime(new Date()); 
				c.add(Calendar.DAY_OF_MONTH,remindStart);
				remindStartDate = c.getTime();
				map.put("remindstart", sdf.format(remindStartDate));
			}
			if(map.get("remindend")!=null) {
				Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
				c.setTime(new Date());
				c.add(Calendar.DAY_OF_MONTH,remindEnd);
				remindEndDate = c.getTime();
				map.put("remindend", sdf.format(remindEndDate));
			}
		}
		
		Wrapper<NewsEntity> wrapper = new EntityWrapper<NewsEntity>();
		if(map.get("remindstart")!=null) {
			wrapper.ge(columnName, map.get("remindstart"));
		}
		if(map.get("remindend")!=null) {
			wrapper.le(columnName, map.get("remindend"));
		}


		int count = newsService.selectCount(wrapper);
		return R.ok().put("count", count);
	}
	
	


}



七、文档参考

在这里插入图片描述

热门推荐

分享一套基于SSM的KTV点歌系统(源码+文档+部署)

分享一套基于SSM的高校二手交易平台系统(源码+文档+部署)

分享一套基于SSM的高校四六级报名管理系统(源码+文档+部署)

分享一套基于SSM的九宫格日志网站(源码+文档+部署)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/745707.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

各大广告商竞相厮杀下,诞生了一个偏门的副业方式

前段时间&#xff0c;想买摩托车&#xff0c;但是媳妇不让买&#xff0c;所以我打算偷偷买&#xff0c;然后萌生了去摆摊赚钱的想法&#xff0c;但是还没有实施就在网上接触到了“某赚”APP&#xff0c;于是一发不可收拾&#xff0c;用我的话来说&#xff0c;我做的不是副业&am…

腾讯云 轻量应用服务器 部署私有化大模型

1. 进入控制台后,找到我们购买的服务器,然后点击登录 服务器 - 轻量云 - 控制台 (tencent.com) 2. 安装系统 面板输入 curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sudo bash quick_start.sh 命令解释: 从F…

解密城市酷选为何异军突起!打造消费新潮流的排队免单模式

一、城市酷选平台简介 在数字化浪潮席卷全球的今天&#xff0c;城市酷选作为一个前沿的消费平台&#xff0c;凭借其独特的排队免单模式&#xff0c;成功吸引了众多消费者和商家的目光。该平台不仅整合了线上线下的资源&#xff0c;更通过数字化手段&#xff0c;为消费者提供了…

一文读懂RSTP流媒体传输原理

什么是流&#xff1f; 流&#xff08;Streaming&#xff09;&#xff1a;近年在Internet上出现的新概念&#xff0c;定义非常广泛&#xff0c;主要是指通过网络传输多媒体数据的技术总称。 流式传输分为两种&#xff1a;顺序流式传输 (Progressive Streaming)和实时流式传输 (R…

408数据结构-图的应用1-最小生成树 自学知识点整理

前置知识&#xff1a;图的遍历 图的应用是408初试历年考查的重点。不过一般而言&#xff0c;这部分内容直接以算法设计题形式考查的可能性极小&#xff0c;更多的是结合图的实例来考查算法的具体操作过程&#xff0c;要求掌握的是手推模拟给定图的各个算法执行过程。此外&#…

华为Pura70支持5G功能吗?看完你就清楚了

随着 5G 技术的普及&#xff0c;现在智能手机市场中的大部分新品都已经支持 5G 网络。相较于 4G&#xff0c;5G 不仅带来了更快的网速&#xff0c;更为用户带来了全新的使用体验。 然而&#xff0c;华为作为智能手机市场的佼佼者&#xff0c;其产品线中的部分手机在配置上却有…

程序运行包与源码的区别

在软件开发和信息技术领域&#xff0c;程序运行包&#xff08;Executable Package&#xff09;与源码&#xff08;Source Code&#xff09;是两个至关重要的概念。它们各自在软件开发、部署和维护过程中扮演着不同的角色&#xff0c;且有着显著的区别。本文旨在深入探讨程序运行…

数字图像分析(第二部分)

文章目录 第8章 图像分割图像分割定义阈值分割依赖像素的阈值选取Otsus方法依赖区域的阈值选取依赖坐标的阈值选取变化阈值法区域生长法分裂合并方法分水岭算法聚类分割算法K-meansAP算法Graph cut第9章 图像特征表达基于全局特征的图像表达直方图GIST基于局部特征的图像表达简…

【ppt技巧】有哪些方法可以实现?PPT转换为图片!

将ppt文件转换为图片都有哪些方法可以实现&#xff1f;其实很简单&#xff0c;一起来看一下如何操作吧&#xff01; 方法一&#xff1a; 使用格式转换器&#xff0c;有些文件格式转换器&#xff0c;支持ppt转换为图片。 方法二&#xff1a; 不需要转换器&#xff0c;直接在…

最长上升子序列模型——AcWing 272. 最长公共上升子序列

最长上升子序列模型 定义 给定一个序列&#xff0c;如整数序列或字符序列&#xff0c;最长上升子序列是指其中最长的子序列&#xff0c;满足子序列中的元素依次递增。最长上升子序列模型是一种在给定序列中寻找最长上升子序列的问题模型。 运用情况 该模型常用于解决与序列…

44岁过气港姐晚晚熬通宵开直播,情路坎坷生两胎老公身份成迷

曾经的「9料」港姐冠军杨思琦近年将工作重心转向内地&#xff0c;狠心抛下一儿一女在香港&#xff0c;只身一人定居广州靠当主播维持生计。 相信有不少网友都留意到&#xff0c;杨思琦几乎晚晚都通宵直播&#xff0c;睡觉前看她在卖力劲歌热舞与其他直播主PK赚钱&#xff0c;一…

jenkins环境搭建--关于jenkins在Ubuntu下的安装篇(一)

在ubuntu下使用命令进行下载安装包&#xff1a; 关于jenkins的安装有多种&#xff0c;可以借助docker容器进行安装&#xff0c;也可以通过传统方法手动一步步的进行安装&#xff0c;以下介绍手动一步步的安装方法&#xff0c;后续我们将解释关于jenkins的相关配置以及实战使用…

Linux系统中文件权限详解

一、Linux文件权限设计 Linux系统中任何内容都可以用文件表示&#xff0c;其对文件设计了一套权限进行管理&#xff1b;文件权限共有11个字符&#xff0c;从左向右共分为5段&#xff08;每段的具体说明如下表Linux权限设计说明所示&#xff09;&#xff1a; Linux权限设计说明 …

基于SSM+Jsp的雅博书城在线系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

基于FreeRTOS+STM32CubeMX+LCD1602+MCP4141(SPI接口)的数字电位器Proteus仿真

一、仿真原理图: 二、运行效果: 三、软件部分: 1)、SPI读写: 2)、初始化部分: void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Initializes the CPU, AHB and APB busses clocks …

STM32存储左右互搏 模拟U盘桥接QSPI总线FATS读写FLASH W25QXX

STM32存储左右互搏 模拟U盘桥接QSPI总线FATS读写FLASH W25QXX STM32的USB接口可以模拟成为U盘&#xff0c;通过FATS文件系统对连接的存储单元进行U盘方式的读写。 这里介绍STM32CUBEIDE开发平台HAL库模拟U盘桥接Quad SPI总线FATS读写W25Q各型号FLASH的例程。 FLASH是常用的一种…

Pikachu靶场--SSRF

参考借鉴&#xff1a;pikachu靶场练习——SSRF详解_pikachu ssrf-CSDN博客 SSRF(curl) 先了解一下curl curl是一个非常实用的、用来与服务器之间传输数据的工具&#xff1b;支持的协议包括 (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, PO…

C语言——链表专题

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 点击主页&#xff1a;optimistic_chen和专栏&#xff1a;c语言&#xff0c; 创作不易&#xff0c;大佬们点赞鼓…

【算法专题--链表】旋转链表 -- 高频面试题(图文详解,小白一看就懂!!)

目录 一、前言 二、题目描述 三、解题方法 ⭐解题思路---闭合为环 &#x1f34d; 案例图解 四、总结与提炼 五、共勉 一、前言 旋转链表 这道题&#xff0c;可以说是--链表专题--&#xff0c;最经典的一道题&#xff0c;也是在面试中频率最高的一道题目&#x…

Kotlin 中的内联函数

1 inline 内联函数&#xff1a;消除 Lambda 带来的运行时开销。 举例来说&#xff1a; fun main() {val num1 100val num2 80val result num1AndNum2(num1, num2) { n1, n2 ->n1 n2} }fun num1AndNum2(num1: Int, num2: Int, operation: (Int, Int) -> Int): Int …