基于 JAVASSM 框架沙县小吃点餐系统

基于 JAVASSM 框架(即 Java + Spring + Spring MVC + MyBatis)开发一个沙县小吃点餐系统。
在这里插入图片描述

步骤一:需求分析

明确系统需要实现的功能,比如:

  • 用户注册和登录
  • 浏览菜单
  • 添加菜品到购物车
  • 下单并支付
  • 订单管理
  • 后台管理(菜品管理、订单管理等)

步骤二:设计数据库

使用 MySQL 数据库存储系统数据。设计数据库表结构如下:

用户表(users)
  • id (INT, 主键, 自增)
  • username (VARCHAR)
  • password (VARCHAR)
  • email (VARCHAR)
  • phone (VARCHAR)
菜品表(dishes)
  • id (INT, 主键, 自增)
  • name (VARCHAR)
  • price (DECIMAL)
  • description (TEXT)
  • image_url (VARCHAR)
购物车表(cart_items)
  • id (INT, 主键, 自增)
  • user_id (INT, 外键)
  • dish_id (INT, 外键)
  • quantity (INT)
订单表(orders)
  • id (INT, 主键, 自增)
  • user_id (INT, 外键)
  • total_price (DECIMAL)
  • order_time (DATETIME)
  • status (VARCHAR)
订单详情表(order_details)
  • id (INT, 主键, 自增)
  • order_id (INT, 外键)
  • dish_id (INT, 外键)
  • quantity (INT)
  • price (DECIMAL)

步骤三:选择开发工具

使用 IntelliJ IDEA 或 Eclipse 作为开发环境。

步骤四:搭建项目结构

  1. 创建 Maven 项目。
  2. 添加必要的依赖项(Spring、Spring MVC、MyBatis、MySQL 驱动等)。

步骤五:配置文件

application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/sandwich_shop?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Drivermybatis.mapper-locations=classpath:mapper/*.xml
spring-mvc.xml
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><context:component-scan base-package="com.sandwichshop"/><mvc:annotation-driven/><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/"/><property name="suffix" value=".jsp"/></bean></beans>
mybatis-config.xml
<configuration><mappers><mapper resource="mapper/UserMapper.xml"/><mapper resource="mapper/DishMapper.xml"/><!-- 其他 Mapper 文件 --></mappers>
</configuration>

步骤六:编写实体类

User.java
package com.sandwichshop.entity;public class User {private int id;private String username;private String password;private String email;private String phone;// Getters and Setters
}
Dish.java
package com.sandwichshop.entity;public class Dish {private int id;private String name;private double price;private String description;private String imageUrl;// Getters and Setters
}

步骤七:编写 DAO 层

UserMapper.java
package com.sandwichshop.mapper;import com.sandwichshop.entity.User;
import org.apache.ibatis.annotations.*;@Mapper
public interface UserMapper {@Select("SELECT * FROM users WHERE username = #{username} AND password = #{password}")User login(@Param("username") String username, @Param("password") String password);@Insert("INSERT INTO users(username, password, email, phone) VALUES(#{username}, #{password}, #{email}, #{phone})")@Options(useGeneratedKeys = true, keyProperty = "id")void register(User user);
}
DishMapper.java
package com.sandwichshop.mapper;import com.sandwichshop.entity.Dish;
import org.apache.ibatis.annotations.*;import java.util.List;@Mapper
public interface DishMapper {@Select("SELECT * FROM dishes")List<Dish> getAllDishes();@Select("SELECT * FROM dishes WHERE id = #{id}")Dish getDishById(int id);@Insert("INSERT INTO dishes(name, price, description, image_url) VALUES(#{name}, #{price}, #{description}, #{imageUrl})")@Options(useGeneratedKeys = true, keyProperty = "id")void addDish(Dish dish);@Update("UPDATE dishes SET name=#{name}, price=#{price}, description=#{description}, image_url=#{imageUrl} WHERE id=#{id}")void updateDish(Dish dish);@Delete("DELETE FROM dishes WHERE id=#{id}")void deleteDish(int id);
}

步骤八:编写 Service 层

UserService.java
package com.sandwichshop.service;import com.sandwichshop.entity.User;
import com.sandwichshop.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public User login(String username, String password) {return userMapper.login(username, password);}public void register(User user) {userMapper.register(user);}
}
DishService.java
package com.sandwichshop.service;import com.sandwichshop.entity.Dish;
import com.sandwichshop.mapper.DishMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class DishService {@Autowiredprivate DishMapper dishMapper;public List<Dish> getAllDishes() {return dishMapper.getAllDishes();}public Dish getDishById(int id) {return dishMapper.getDishById(id);}public void addDish(Dish dish) {dishMapper.addDish(dish);}public void updateDish(Dish dish) {dishMapper.updateDish(dish);}public void deleteDish(int id) {dishMapper.deleteDish(id);}
}

步骤九:编写 Controller 层

UserController.java
package com.sandwichshop.controller;import com.sandwichshop.entity.User;
import com.sandwichshop.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;@Controller
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/login")public String showLoginForm() {return "login";}@PostMapping("/login")public String handleLogin(@RequestParam("username") String username, @RequestParam("password") String password, Model model) {User user = userService.login(username, password);if (user != null) {model.addAttribute("user", user);return "home";} else {model.addAttribute("error", "Invalid username or password");return "login";}}@GetMapping("/register")public String showRegisterForm() {return "register";}@PostMapping("/register")public String handleRegister(User user) {userService.register(user);return "redirect:/login";}
}
DishController.java
package com.sandwichshop.controller;import com.sandwichshop.entity.Dish;
import com.sandwichshop.service.DishService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;import java.util.List;@Controller
public class DishController {@Autowiredprivate DishService dishService;@GetMapping("/menu")public String showMenu(Model model) {List<Dish> dishes = dishService.getAllDishes();model.addAttribute("dishes", dishes);return "menu";}@GetMapping("/dish/{id}")public String showDishDetails(@RequestParam("id") int id, Model model) {Dish dish = dishService.getDishById(id);model.addAttribute("dish", dish);return "dishDetails";}@GetMapping("/addDish")public String showAddDishForm() {return "addDish";}@PostMapping("/addDish")public String handleAddDish(Dish dish) {dishService.addDish(dish);return "redirect:/menu";}@GetMapping("/editDish/{id}")public String showEditDishForm(@RequestParam("id") int id, Model model) {Dish dish = dishService.getDishById(id);model.addAttribute("dish", dish);return "editDish";}@PostMapping("/editDish")public String handleEditDish(Dish dish) {dishService.updateDish(dish);return "redirect:/menu";}@GetMapping("/deleteDish/{id}")public String handleDeleteDish(@RequestParam("id") int id) {dishService.deleteDish(id);return "redirect:/menu";}
}

步骤十:前端页面

使用 JSP 或 Thymeleaf 创建前端页面。以下是简单的 JSP 示例:

login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Login</title>
</head>
<body>
<h2>Login</h2>
<form action="${pageContext.request.contextPath}/login" method="post">Username: <input type="text" name="username"><br>Password: <input type="password" name="password"><br><input type="submit" value="Login">
</form>
<c:if test="${not empty error}"><p style="color: red">${error}</p>
</c:if>
</body>
</html>
menu.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head><title>Menu</title>
</head>
<body>
<h2>Menu</h2>
<table><tr><th>Name</th><th>Price</th><th>Description</th><th>Image</th></tr><c:forEach items="${dishes}" var="dish"><tr><td>${dish.name}</td><td>${dish.price}</td><td>${dish.description}</td><td><img src="${dish.imageUrl}" alt="${dish.name}" width="100"></td></tr></c:forEach>
</table>
<a href="${pageContext.request.contextPath}/addDish">Add New Dish</a>
</body>
</html>

步骤十一:测试与调试

对每个功能进行详细测试,确保所有功能都能正常工作。

步骤十二:部署与发布

编译最终版本的应用程序,并准备好 WAR 文件供 Tomcat 或其他应用服务器部署。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

apt的编译安装(古老通讯)

Ubuntu系统的防火墙关闭&#xff1a; ufw disable 第一步&#xff1a;Ubuntu 安装依赖环境 apt -y install libpcre3-dev zlib1g-dev libssl-dev build-essential 如果出现无法下载则在末尾处假如 --fix missing如下图所示 出现下图则为安装成功 第二步&#xff1a; useradd…

基于微信小程序的校园失物招领系统的研究与实现(V4.0)

博主介绍&#xff1a;✌stormjun、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…

有向无环图的拓扑排序——CSP-J1真题讲解

【题目】 考虑一个有向无环图&#xff0c;该图包括4条有向边&#xff1a;(1,2)&#xff0c;(1,3)&#xff0c;(2,4)&#xff0c;和(3,4)。以下哪个选项是这个有向无环图的一个有效的拓扑排序&#xff1f;&#xff08; &#xff09; A. 4, 2, 3, 1 B. 1, 2, 3, 4 C. 1, 2, 4…

selenium操作已开启的浏览器,方便调试

一、谷歌浏览器配置&#xff1a; 在所安装的谷歌下面&#xff0c;执行下面命令&#xff0c;打开谷歌浏览器&#xff0c;用来selenium的操作&#xff1a; 注意事项&#xff1a;端口需要不被占用&#xff0c;--user-data-dir"D:\workspace\chrome-data"这个路径需要有…

DAY75WEB 攻防-验证码安全篇接口滥用识别插件复用绕过宏命令填入滑块类

知识点&#xff1a; 1、验证码简单机制-验证码过于简单可爆破 2、验证码重复使用-验证码验证机制可绕过 3、验证码智能识别-验证码图形码被可识别 4、验证码接口调用-验证码触发接口可枚举 图片验证码-识别插件-登录爆破&接口枚举 验证码识别绕过等技术适用于&#x…

微信小程序生成二维码

目前是在开发小程序端 --> 微信小程序。然后接到需求&#xff1a;根据 form 表单填写内容生成二维码&#xff08;第一版&#xff1a;表单目前需要客户进行自己输入&#xff0c;然后点击生成按钮实时生成二维码&#xff0c;不需要向后端请求&#xff0c;不存如数据库&#xf…

海的回忆:海滨学院班级记忆录技术实现

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

注册页面设计(表单基础)

HTML表单是网页中用于收集用户输入信息的区域&#xff0c;它包含了一系列交互控件&#xff0c;允许用户输入数据&#xff0c;并将这些数据发送到Web服务器进行处理。以下是HTML表单的基础知识&#xff1a; 一、表单的基本结构 HTML表单由<form>标签定义&#xff0c;表单…

003-Kotlin界面开发之声明式编程范式

概念本源 在界面程序开发中&#xff0c;有两个非常典型的编程范式&#xff1a;命令式编程和声明式编程。命令式编程是指通过编写一系列命令来描述程序的运行逻辑&#xff0c;而声明式编程则是通过编写一系列声明来描述程序的状态。在命令式编程中&#xff0c;程序员需要关心程…

OPENAI官方prompt文档解析

官方文档地址:https://platform.openai.com/docs/guides/gpt-best-practices 文档中文版来源:OpenAI 官方提示工程指南 [译] | 宝玉的分享 (baoyu.io) 1.写清楚说明 如果prompt给的范围十分模糊或是过于宽泛,那么GPT就会开始猜测您想要的内容,从而导致生成的结果偏离预期. …

代理IP地址和端口是什么?怎么进行设置?

保护个人隐私、突破地域限制、提升网络安全性是我们不断追求的目标。而代理IP地址和端口就是一种实现这些目标的重要工具。但是&#xff0c;你可能对它是什么&#xff0c;以及如何设置感到困惑。别担心&#xff0c;本文将为你揭开这些神秘的面纱&#xff0c;让你轻松掌握这项技…

【uniapp3】分享一个自己写的h5日历组件

简言 分享一下自己基于uniapp写的日历组件。如果不太满足你的需求&#xff0c;可以自己改造。 日历 实现分析&#xff1a; 页面显示 - 分为顶部显示和日历显示&#xff0c;我这里做了多行和单行显示两种情况&#xff0c;主要是当时看着手机的日历做的&#xff0c;手机上的…

rhce作业4

问题&#xff1a; 1.搭建dns服务器能够对自定义的正向或者反向域完成数据解析查询。 2.配置从DNS服务器&#xff0c;对主dns服务器进行数据备份。 配置&#xff1a; 主服务器配置 安装 关闭防火墙 主配置文件定义正反向解析域 正向解析资源记录文件 反向解析记录文件 重启…

MybatisPlus入门(八)MybatisPlus-DQL编程控制

一、字段映射与表名映射 数据库表和实体类名称一样自动关联&#xff0c;数据库表和实体类有部分情况不一样。 问题一&#xff1a;表名与编码开发设计不同步&#xff0c;表名和实体类名称不一致。 解决办法&#xff1a; 在模型类上方&#xff0c;使用TableName注解&#xf…

摩尔斯电码

偏方记忆法 F .._. 滴滴打滴 很费钱 F 费 R ._. 滴打滴 洗发水广告 滴答滴&#xff0c;滴答滴 大家好才是正的好 G 和Q 可以一起记忆有相通点 把G 也看成一个圈&#xff0c;相交的地方一个点&#xff0c;因为圈没满缺一个_ K 和 Y 可以一起记忆 把K躺着看…

Vue Router进阶详解

导航守卫 若依框架登录鉴权详解&#xff08;动态路由&#xff09;_若依鉴权-CSDN博客 完整的导航解析流程 导航被触发&#xff1a; 当用户点击页面中的链接、使用编程式导航&#xff08;如router.push或router.replace&#xff09;或手动输入URL时&#xff0c;导航流程被触发。…

如何在Linux命令行中使用GhatGPT

2、验明正身&#xff0c;证明我的所在地是国内 3、第一次提问 4、第二次提问 5、问他一首古诗 6、话不多说&#xff0c;现在来展示他的安装过程 7、输入GitHub的网址 https://github.com/aandrew-me/tgpt 8、详情页向下翻 9、到终端输入 下列命令&#xff0c;等待安装&#x…

iOS灵动岛动画小组件怎么播放动画

这个灵动岛相关的展示位置分几个地方&#xff1a; 紧凑型&#xff0c;最小化&#xff0c;扩展型&#xff0c;还有锁屏位置 我们先来看一下我这边实现的动画效果 demo下载&#xff1a; iOS灵动岛GIF动画 灵动岛样式 灵动岛有三种渲染模式&#xff1a; 第一种是 紧凑型&…

【electron+vue3】使用JustAuth实现第三方登录(前后端完整版)

实现过程 去第三方平台拿到client-id和client-secret&#xff0c;并配置一个能够外网访问回调地址redirect-uri供第三方服务回调搭建后端服务&#xff0c;引入justauth-spring-boot-starter直接在配置文件中定义好第一步的三个参数&#xff0c;并提供获取登录页面的接口和回调…

vscode makfile编译c程序

编译工具安装 为了在 Windows 上安装 GCC&#xff0c;您需要安装 MinGW-w64。 MinGW-w64 是一个开源项目&#xff0c;它为 Windows 系统提供了一个完整的 GCC 工具链&#xff0c;支持编译生成 32 位和 64 位的 Windows 应用程序。 1. 下载MinGW-w64源代码&#xff0c;如图点…