Java课程设计项目-servlet+jsp美食系统、菜品管理系统

news2024/12/26 21:13:51

文章目录

  • Java课程设计项目-servlet+jsp美食系统
    • 一、项目介绍
    • 二、技术介绍
      • 2.1 环境需要
      • 2.2 技术栈
    • 环境需要
    • 三、功能实现
      • 3.1登录注册
      • 3.2首页菜品展示、轮播图
      • 3.3美食菜品分类、查询
      • 3.4作品动态、个人简介、菜品收藏
      • 3.5创建菜谱、添加步骤
    • 四、系统代码展示
      • 4.1项目架构(MVC)
      • 4.2部分代码展示
  • 获取源码

Java课程设计项目-servlet+jsp美食系统

一、项目介绍

项目功能包含:

  1. 用户登录、注册
  2. 首页菜品展示、轮播图
  3. 美食菜品分类、查询
  4. 作品动态、个人简介、菜品收藏
  5. 创建菜谱、添加步骤

二、技术介绍

2.1 环境需要

  • 运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。
  • IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;
  • tomcat环境:Tomcat 7.x,8.x,9.x版本均可
  • 硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS;
  • 数据库:MySql 5.7版本;
  • 是否Maven项目:否;

2.2 技术栈

环境需要

  • Serverlet+JSP+CSS+JavaScript+mysql

三、功能实现

3.1登录注册

在这里插入图片描述

3.2首页菜品展示、轮播图

在这里插入图片描述

3.3美食菜品分类、查询

在这里插入图片描述

3.4作品动态、个人简介、菜品收藏

在这里插入图片描述

3.5创建菜谱、添加步骤

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

四、系统代码展示

4.1项目架构(MVC)

在这里插入图片描述

4.2部分代码展示

RecipeServiceImpl

package yjf.psyd.service.impl;

import java.io.File;
import java.util.List;

import yjf.psyd.bean.Recipe;
import yjf.psyd.bean.RecipeStep;
import yjf.psyd.bean.User;
import yjf.psyd.dao.RecipeDao;
import yjf.psyd.dao.impl.RecipeDaoImpl;
import yjf.psyd.service.RecipeService;

public class RecipeServiceImpl implements RecipeService {

	// 声明Dao层对象,多态
	RecipeDao rd = new RecipeDaoImpl();

	// 创建菜谱
	@Override
	public int createRecipeService(String createDate, String title, String info, String material,
			List<String> stepInfos, List<String> categorys, String coverFilePath, List<String> stepFilesPath, User user) {
		return rd.createRecipeDao(createDate, title, info, material, stepInfos, categorys, coverFilePath, stepFilesPath,
				user);
	}

	// 菜谱详情
	@Override
	public Recipe recipeDetailService(String recipeId,User user) {
		return rd.recipeDetailDao(recipeId,user);
	}

	// 菜谱步骤详情
	@Override
	public RecipeStep recipeStepDetailService(String recipeId) {
		return rd.recipeStepDetailDao(recipeId);
	}

	// 删除菜谱
	@Override
	public int DeleteRecipeService(String recipeId) {
		return rd.DeleteRecipeDao(recipeId);
	}

	// 插入收藏菜谱
	@Override
	public int insertCollectionRecipe(String recipeId,User user) {
		return rd.insertCollectionRecipeDao(recipeId,user);
	}

	// 删除收藏菜谱
	@Override
	public int deleteCollectionRecipe(String recipeId, User user) {
		return rd.deleteCollectionRecipeDao(recipeId,user);
	}

	
}

PageDaoImpl

package yjf.psyd.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import yjf.psyd.bean.CategoryPage;
import yjf.psyd.bean.CategoryPageDetail;
import yjf.psyd.bean.HomePage;
import yjf.psyd.bean.HomePageDetail;
import yjf.psyd.bean.Page;
import yjf.psyd.bean.PageDetail;
import yjf.psyd.bean.SearchPage;
import yjf.psyd.bean.SearchPageDetail;
import yjf.psyd.bean.User;
import yjf.psyd.dao.PageDao;
import yjf.psyd.util.DbConnection;

public class PageDaoImpl implements PageDao {

	// 请求首页PopRecipe数据
	@Override
	public Page indexPopRecipeDao(int index) {
		// 声明jdbc变量
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		// 声明对象、变量
		Page p = new Page();
		int count = -1;
		List<PageDetail> pageDetail = new ArrayList<>();
		try {
			// 获取链接
			conn = DbConnection.getConnection();
			// 创建sql命令
			String sql = "select count(1) from recipe";
			String sql1 = "SELECT * FROM recipe,user_createrecipe  WHERE recipe.id=user_createrecipe.createRecipe ORDER BY recipe.id DESC limit ?,10;";
			// 创建sql命令对象
			ps = conn.prepareStatement(sql);
			// 执行sql语句
			rs = ps.executeQuery();
			if (rs != null) {
				while (rs.next()) {
					p.setTotleCount(rs.getInt(1));
				}
			}
			ps = conn.prepareStatement(sql1);
			// 给占位符赋值
			ps.setInt(1, index);
			rs = ps.executeQuery();
			if (rs != null) {
				while (rs.next()) {
					PageDetail pd = new PageDetail(rs.getInt("id"), rs.getString("title"), rs.getString("coverPath"),
							rs.getInt("userId"), rs.getString("username"));
					pageDetail.add(pd);
					p.setPageDetail(pageDetail);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 关闭链接
			DbConnection.closeDB(conn, ps, rs);
		}
		// 返回结果
		return p;
	}

	// 请求homepage分页数据
	@Override
	public HomePage homePageDao(String userId, int createCp, int collectionCp) {
		// 声明jdbc变量
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		// 声明对象、变量
		HomePage hp = new HomePage();
		List<HomePageDetail> createDetail = new ArrayList<>();
		List<HomePageDetail> collectionDetail = new ArrayList<>();
		try {
			// 获取链接
			conn = DbConnection.getConnection();
			// 创建sql命令
			String sql = "SELECT count(1) FROM user,user_createrecipe,recipe where user.id=user_createrecipe.userId and recipe.id = user_createrecipe.createRecipe and user.id = ?;";
			String sql1 = "SELECT * FROM user,user_createrecipe,recipe where user.id=user_createrecipe.userId and recipe.id = user_createrecipe.createRecipe and user.id = ? ORDER BY recipe.id DESC limit ?,6;";
			String sql2 = "SELECT count(1) FROM user,user_collection,recipe where user.id=user_collection.userId and recipe.id = user_collection.collection and user.id = ?;";
			String sql3 = "SELECT * FROM user,user_collection,recipe where user.id=user_collection.userId and recipe.id = user_collection.collection and user.id = ? ORDER BY recipe.id DESC limit ?,6;";
			String sql4 = "SELECT * FROM user WHERE id = ?;";
			// 创建sql命令对象
			ps = conn.prepareStatement(sql);
			// 给占位符赋值
			ps.setString(1, userId);
			// 执行sql语句
			rs = ps.executeQuery();
			if (rs != null) {
				while (rs.next()) {
					hp.setCreateTotleCount(rs.getInt(1));
				}
			}

			ps = conn.prepareStatement(sql1);
			// 给占位符赋值
			ps.setString(1, userId);
			ps.setInt(2, (createCp - 1) * 6);
			// 执行sql语句
			rs = ps.executeQuery();
			if (rs != null) {
				while (rs.next()) {
					HomePageDetail hpd = new HomePageDetail(rs.getInt("recipe.id"), rs.getString("title"),
							rs.getString("coverPath"));
					createDetail.add(hpd);
					hp.setCreateDetail(createDetail);
				}
			}

			ps = conn.prepareStatement(sql2);
			// 给占位符赋值
			ps.setString(1, userId);
			// 执行sql语句
			rs = ps.executeQuery();
			if (rs != null) {
				while (rs.next()) {
					hp.setCollectionTotleCount(rs.getInt(1));
				}
			}

			ps = conn.prepareStatement(sql3);
			// 给占位符赋值
			ps.setString(1, userId);
			ps.setInt(2, (collectionCp - 1) * 6);
			// 执行sql语句
			rs = ps.executeQuery();
			if (rs != null) {
				while (rs.next()) {
					HomePageDetail hpd1 = new HomePageDetail(rs.getInt("recipe.id"), rs.getString("title"),
							rs.getString("coverPath"));
					collectionDetail.add(hpd1);
					hp.setCollectionDetail(collectionDetail);
				}
			}

			ps = conn.prepareStatement(sql4);
			// 给占位符赋值
			ps.setString(1, userId);
			// 执行sql语句
			rs = ps.executeQuery();
			if (rs != null) {
				while (rs.next()) {

					hp.setUsername(rs.getString("username"));
					hp.setCreateDate(rs.getString("createDate"));
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 关闭链接
			DbConnection.closeDB(conn, ps, rs);
		}
		// 返回结果
		return hp;
	}

	// 请求category分页数据
	@Override
	public CategoryPage categoryPageDao(String item, int categoryCp) {
		// 声明jdbc变量
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		// 声明对象、变量
		CategoryPage cp = new CategoryPage();
		List<CategoryPageDetail> categoryPageDetail = new ArrayList<>();
		try {
			// 获取链接
			conn = DbConnection.getConnection();
			// 创建sql命令
			String sql = "SELECT count(*) FROM recipe,recipe_category,category WHERE recipe.id = recipe_category.recipeId and recipe_category.category = category.id and category.id = ?";
			String sql1 = "SELECT * FROM recipe,user_createrecipe,recipe_category,category WHERE recipe.id = recipe_category.recipeId and recipe_category.category = category.id and recipe.id = user_createrecipe.createRecipe and category.id = ? ORDER BY recipeId DESC LIMIT ?,8";
			// 创建sql命令对象
			ps = conn.prepareStatement(sql);
			// 给占位符赋值
			ps.setString(1, item);
			// 执行sql语句
			rs = ps.executeQuery();
			if (rs != null) {
				while (rs.next()) {
					cp.setTotleCount(rs.getInt(1));
				}
			}
			ps = conn.prepareStatement(sql1);
			// 给占位符赋值
			ps.setString(1, item);
			ps.setInt(2, (categoryCp - 1) * 8);
			rs = ps.executeQuery();
			if (rs != null) {
				while (rs.next()) {
					CategoryPageDetail cpd = new CategoryPageDetail(rs.getInt("recipeId"), rs.getString("title"),
							rs.getString("coverPath"), rs.getInt("userId"), rs.getString("username"));
					categoryPageDetail.add(cpd);
					cp.setCategoryPageDetail(categoryPageDetail);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 关闭链接
			DbConnection.closeDB(conn, ps, rs);
		}
		// 返回结果
		return cp;
	}

	// 请求搜索分页
	@Override
	public SearchPage searchPageDao(int searchCp,String searchKeyword) {
		// 声明jdbc变量
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		// 声明对象、变量
		SearchPage sp = new SearchPage();
		List<SearchPageDetail> searchPageDetail = new ArrayList<>();
		try {
			// 获取链接
			conn = DbConnection.getConnection();
			// 创建sql命令
			String sql = "SELECT count(1) FROM recipe,user_createrecipe WHERE title LIKE '%"+searchKeyword+"%' AND recipe.id = user_createrecipe.createRecipe";
			String sql1 = "SELECT * FROM recipe,user_createrecipe WHERE title LIKE '%"+searchKeyword+"%' AND recipe.id = user_createrecipe.createRecipe ORDER BY recipe.id DESC LIMIT ?,8"; 
			// 创建sql命令对象
			ps = conn.prepareStatement(sql);
			// 执行sql语句
			rs = ps.executeQuery();
			if (rs != null) {
				while (rs.next()) {
					sp.setTotleCount(rs.getInt(1));
				}
			}
			ps = conn.prepareStatement(sql1);
			// 给占位符赋值
			ps.setInt(1, (searchCp - 1) * 8);
			rs = ps.executeQuery();
			if (rs != null) {
				while (rs.next()) {
					SearchPageDetail spd = new SearchPageDetail(rs.getInt("recipe.id"), rs.getString("title"),
							rs.getString("coverPath"), rs.getInt("userId"), rs.getString("username"));
					searchPageDetail.add(spd);
					sp.setSearchPageDetail(searchPageDetail);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 关闭链接
			DbConnection.closeDB(conn, ps, rs);
		}
		// 返回结果
		return sp;
	}
}

RecipeCollectionServlet

package yjf.psyd.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.mysql.cj.Session;

import yjf.psyd.bean.User;
import yjf.psyd.service.RecipeService;
import yjf.psyd.service.impl.RecipeServiceImpl;

@WebServlet("/recipeCollection")
public class RecipeCollectionServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public RecipeCollectionServlet() {
		super();
	}
	
	// 处理菜谱收藏功能
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// 1、获取请求信息
		String status = req.getParameter("status");
		String RecipeId = req.getParameter("RecipeId");

		// 获取session对象
		HttpSession hs = req.getSession();
		// 把session中的值传到user对象中
		User user = (User) hs.getAttribute("user");

		RecipeService rs = new RecipeServiceImpl();
		// 2、判断status状态
		if (status.equals("false")) {
			// 3、处理请求结果;插入收藏菜谱
			int index = rs.insertCollectionRecipe(RecipeId, user);
			if(index>0) {
				resp.getWriter().write("{\"index\":" + index + "}");
			}
		} else {
			// 3、处理请求结果:删除收藏菜谱
			int index = rs.deleteCollectionRecipe(RecipeId, user);
			if(index>0) {
				resp.getWriter().write("{\"index\":" + index + "}");
			}
		}
	}

}

获取源码

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

掌握时间,从`datetime`开始

文章目录 掌握时间&#xff0c;从datetime开始第一部分&#xff1a;背景介绍第二部分&#xff1a;datetime库是什么&#xff1f;第三部分&#xff1a;如何安装这个库&#xff1f;第四部分&#xff1a;简单库函数使用方法1. 获取当前日期和时间2. 创建特定的日期3. 计算两个日期…

前端技术(23) : 聊天页面

来源: GPT生成之后微调 效果图 HTML代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>聊天</t…

ubuntu的matlab使用心得

1.读取视频 v VideoReader(2222.mp4);出问题&#xff0c;报错&#xff1a; matlab 错误使用 VideoReader/initReader (第 734 行) 由于出现意外错误而无法读取文件。原因: Unable to initialize the video properties 出错 audiovideo.internal.IVideoReader (第 136 行) init…

基于SpringBoot+Vue框架的在线考试系统的设计与实现

基于SpringBootVue框架的在线考试系统的设计与实现 系统合集跳转 源码获取链接 一、系统环境 运行环境: 最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 IDE环境&#xff1a; Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以 tomcat环…

软错误防护技术在车规MCU中应用

在大气层内&#xff0c;宇宙射线粒子与大气分子发生核反应生成大气中子。大气中子入射微电子器件或电路将会诱发单粒子效应&#xff08;SEE&#xff09;&#xff0c;效应类型主要有单粒子翻转&#xff08;SEU&#xff09;、单粒子瞬态&#xff08;SET&#xff09;、单粒子锁定&…

【数据中心建设资料】数据中心安全建设解决方案,数据中心整理解决方案,数据中心如何做到安全保障,数据中台全方案(Word全原件)

第一章 解决方案 1.1 建设需求 1.2 建设思路 1.3 总体方案 信息安全系统整体部署架构图 1.3.1 IP准入控制系统 1.3.2 防泄密技术的选择 1.3.3 主机账号生命周期管理系统 1.3.4 数据库账号生命周期管理系统 1.3.5 双因素认证系统 1.3.6 数据库审计系统 1.3.7 数据脱敏系统 1.3.8…

WLAN AutoConfig服务假死?重启服务恢复网络连接!

目录 背景&#xff1a; 过程&#xff1a; 可能引起原因&#xff1a; 具体解决步骤&#xff1a; 方法一&#xff1a; 方法二&#xff1a; 总结&#xff1a; 背景&#xff1a; 这个问题困扰我好长一段时间了&#xff0c;每次下班将电脑关机后&#xff0c;次日早上电脑开机…

Hadoop生态圈框架部署 伪集群版(六)- MySQL安装配置

文章目录 前言一、MySQL安装与配置1. 安装MySQL2. 安装MySQL服务器3. 启动MySQL服务并设置开机自启动4. 修改MySQL初始密码登录5. 设置允许MySQL远程登录6. 登录MySQL 卸载1. 停止MySQL服务2. 卸载MySQL软件包3. 删除MySQL配置文件及数据目录 前言 在本文中&#xff0c;我们将…

运用蓝光三维扫描仪的艺术与科技的完美融合-石膏头像模型3D扫描真实复刻

石膏头像具有独特的魅力&#xff0c;每一处细节都彰显着艺术之美。无论是深邃的眼神&#xff0c;还是精致的轮廓&#xff0c;都让人陶醉其中。 随着雕塑形式的日渐丰富&#xff0c;越来越多的新材料和新的塑造手法被运用到雕塑创作中&#xff0c;蓝光三维扫描技术的应用&#…

【大语言模型】ACL2024论文-24 图像化歧义:Winograd Schema 挑战的视觉转变

【大语言模型】ACL2024论文-24 图像化歧义&#xff1a;Winograd Schema 挑战的视觉转变 目录 文章目录 【大语言模型】ACL2024论文-24 图像化歧义&#xff1a;Winograd Schema 挑战的视觉转变目录摘要研究背景问题与挑战如何解决核心创新点算法模型实验效果&#xff08;包含重要…

深入浅出:Gin框架路由与HTTP请求处理

深入浅出&#xff1a;Gin框架路由与HTTP请求处理 引言 在Web开发中&#xff0c;路由和HTTP请求处理是构建API的核心部分。Gin框架作为Go语言中最受欢迎的Web框架之一&#xff0c;提供了简洁而强大的工具来处理这些任务。本文将深入浅出地介绍如何使用Gin框架进行路由定义、处…

vscode + cmake 管理员权限调试

Ubuntu 22.04 使用 VsCode CMake 开发 ICMP ping 功能&#xff0c;执行到下面的语句时报错&#xff1a; socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); --------------------------------------- 程序报错&#xff1a; Operation not permitted 查找原因&#xff0c;需要管理员权…

MATLAB数学建模之画图汇总

MATLAB是一种强大的数学软件&#xff0c;广泛应用于工程计算、控制设计、信号处理等领域。在数学建模中&#xff0c;MATLAB的绘图功能可以帮助我们直观地展示数据和模型结果。 1. 二维数据曲线图 1.1 绘制二维曲线的基本函数 plot函数用于绘制二维平面上的线性坐标曲线图&am…

李飞飞首个“空间智能”模型发布:一张图,生成一个3D世界 | LeetTalk Daily

“LeetTalk Daily”&#xff0c;每日科技前沿&#xff0c;由LeetTools AI精心筛选&#xff0c;为您带来最新鲜、最具洞察力的科技新闻。 在人工智能技术迅速发展的背景下&#xff0c;李飞飞创立的世界实验室于近期发布了首个“空间智能”模型&#xff0c;这一创新成果引发了3D生…

力扣--543.二叉树的直径

题目 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 代码 /** Definition for a binary tree node.public…

你是如何找bug的?bug分析的正确打开方式

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Bug严重级别(Severity&#xff0c;Bug级别)&#xff1a;是指因缺陷引起的故障对软件产品的影响程度&#xff0c;由测试人员指定。 A-Crash&#xff1a;造成系统或…

QT获取tableview选中的行和列的值

查询数据库数据放入tableview&#xff08;tableView_database&#xff09;后 QSqlQueryModel* sql_model new QSqlQueryModel(this);sql_model->setQuery("select * from dxxxb_move_lot_tab");sql_model->setHeaderData(0, Qt::Horizontal, tr("id&quo…

Github 2024-12-01 开源项目月报 Top20

根据Github Trendings的统计,本月(2024-12-01统计)共有20个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10TypeScript项目9Go项目2HTML项目1Shell项目1Jupyter Notebook项目1屏幕截图转代码应用 创建周期:114 天开发语言:TypeScript, Py…

python调用GPT-4o实时音频 Azure OpenAI GPT-4o Audio and /realtime

发现这块网上信息很少&#xff0c;记录一下 微软azure入口 https://learn.microsoft.com/zh-cn/azure/ai-services/openai/realtime-audio-quickstart?pivotsprogramming-language-ai-studio sdk文档 https://github.com/azure-samples/aoai-realtime-audio-sdk?tabread…

tomcat+jdbc报错怎么办?

1. 虽然mysql8.0以上的不用手动添加driver类&#xff0c;但是一旦加上driver类&#xff0c;就要手动添加了 不然会报找不到driver类的错误 2. java.lang.RuntimeException: java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:xXX?serverTimezoneU…