Java项目:springboot网上点餐系统

news2025/7/11 4:06:06

作者主页:源码空间站2022

 简介:Java领域优质创作者、Java项目、学习资料、技术互助

文末获取源码

功能介绍

SpringBoot在线订餐系统项目。主要功能说明: 分为两个角色,餐厅老板、普通用户

餐厅老板可以登录,注册,可以在后台设置菜品目录,菜品详情,查看订单,用户管理,个人中心等
用户查看首页菜品信息,登录后可以点餐,形成购物车,支付后会出现订单详情
 

本系统采用的技术栈有:springboot、spring、springmvc、mybatis、shiro、jsp、javascript、layui。数据库采用mysql作为数据存储,系统中涉及到的关键表有,用户表、用户详情表、商品表、订单表、商品订单关联表、评价表等等。

本系统分为前台和后台,

前台功能有:

登录注册、修改个人信息、修改收货地址、查看商品、加购商品、结算商品,对订单进行评价、用户留言等功能;

后台功能有:

登录、商品管理、用户管理、订单管理、留言公告管理等功能。本系统中的购物车功能设计、io读写图片存放本地、订单导出、echarts插件实现订单信息统计、后台批量操作、pagehelper实现分页等细节值得学习。

环境需要

1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。

2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;
3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可
4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS;
5.是否Maven项目: 是;查看源码目录中是否包含pom.xml;若包含,则为maven项目,否则为非maven项目 

6.数据库:MySql 5.7版本;

技术栈

1. 后端:SpringBoot+MyBatis

2. 前端:Jsp+bootstrap+jQuery

使用说明

1. 使用IDEA/Eclipse/MyEclipse导入项目,Eclipse/MyEclipse导入时,若为maven项目请选择maven;

若为maven项目,导入成功后请执行maven clean;maven install命令,下载所需要的jar包;

2. 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件;
3. 将项目中application.properties配置文件中的数据库配置改为自己的配置,主要用户名、密码;
4. 配置tomcat,然后运行运行项目,输入localhost:8087 登录
5. 餐厅老板账户:admin  密码:admin

普通用户账户:miaosheng  密码:miaosheng

运行截图

前台界面

 前台界面

后台界面

代码相关

首页管理控制器

@Controller
public class HomeController {
    @Autowired
    private NoticeService noticeService;
    @Autowired
    private ProductService productService;

    @Autowired
    private LeaveService leaveService;
    @Autowired
    private EvaService evaService;

    /**
  * 跳转到首页
     * @param model
     * @return
     */
    @GetMapping(value = {"/","/index"})
    public String home(Model model) {
        //1-获取上架商品信息
        List<Product> productList = productService.findAllProductList()
                .stream().filter(product -> product.getStatus() == 1).collect(Collectors.toList());
        //2-获取有效的公告信息
        List<Notice> validNoticeList = noticeService.findAll()
                .stream().filter(notice -> notice.getStatus() == 1).collect(Collectors.toList());
        //3-获取热门商品信息
        List<Product> hotProductList = new ArrayList<>();
        productService.findProductBannerByCount(3).forEach(productBanner ->{
            Product dbProduct = productService.findProductById(productBanner.getProductId());
            if(dbProduct != null) { hotProductList.add(dbProduct);}
        });
        //4-查询两条评论
        List<Evaluate> evaluateList = evaService.find2Eva();
        //5-所有的商品种类名
        List productKindList = productService.findAllProductKindNameList();
        //6-用户留言表
        List<Leave> leaveList = leaveService.findAllLeaveList();


        model.addAttribute("productList",productList);
        model.addAttribute("noticeList",validNoticeList);
        model.addAttribute("hotProductList",hotProductList.stream().limit(3).collect(Collectors.toList()));
        model.addAttribute("evaluateList",evaluateList);
        model.addAttribute("productKindList",productKindList);
        model.addAttribute("leaveList",leaveList);
        return "/pages/index";
    }
}

 用户管理控制器

@Controller
public class UserController {
    @Autowired
    private OrderService orderService;
    @Autowired
    private UserService userService;
    @Autowired
    private EvaService evaService;
    @Autowired
    private LeaveService leaveService;

    /**
     * 去用户中心
     */
    @GetMapping("/toUserCenter")
    public String userCenter(Model model,HttpSession session){
        User user = (User) session.getAttribute("user");
        User userInfos = userService.findUserInfo(user.getId());
        model.addAttribute("userInfos",userInfos);
        return "/pages/user/user_center";
    }

    /**
     * 去我的订单
     */
    @RequestMapping("/toUserOrder")
    public String toUserOrder(@RequestParam(required=true,defaultValue="1") Integer page, HttpSession session, Model model){
        User users = (User) session.getAttribute("user");
        User user = userService.findUserInfo(users.getId());
        //PageHelper.startPage(page, pageSize);这段代码表示,程序开始分页了,page默认值是1,pageSize默认是10,意思是从第1页开始,每页显示10条记录。
        PageHelper.startPage(page, 3);
        List<Order> orderList = orderService.findOrderListByUserId(users.getId());
        PageInfo<Order> p = new PageInfo<Order>(orderList);
        model.addAttribute("page", p);
        model.addAttribute("orderList",orderList);
        model.addAttribute("user",user);
        return "/pages/user/user_orderlist";
    }    /**
     * 显示收货地址
     * @param model
     * @return
     */
    @RequestMapping("/userAddress")
    public String userAddress(Model model, HttpSession session) {

        User user = (User) session.getAttribute("user");
        User userInfos = userService.findUserInfo(user.getId());
        model.addAttribute("userInfos",userInfos);
        return "/pages/user/user_address";
    }
    /**
     *
     *更新收货地址
     */
    @RequestMapping("/updateAddress")
    public String updateAddress(User user,Model model){
        userService.updateAddress(user);
        return "redirect:/userAddress";
    }

    /**
     * 显示个人中心信息
     * @param model
     * @return
     */
    @RequestMapping("/userAccount")
    public String userAccount(Model model,HttpSession session){
        User user = (User) session.getAttribute("user");
        User userInfos = userService.findUserInfo(user.getId());
        model.addAttribute("userInfos",userInfos);
        return "/pages/user/user_account";
    }

    /**
     * 跳转修改密码界面
     * @return
     */
    @RequestMapping("/updatePassword")
    public String updatePassword(){
        return "/pages/user/user_password";
    }

    /**
     * 修改密码
     * @param oldPwd 旧密码
     * @param newPwd 新密码
     * @param comfirmPwd 确认密码
     * @param model 数据
     * @return
     */
    @RequestMapping("/savePassword")
    public String  saveAddress(
            String oldPwd, String newPwd, String comfirmPwd,Model model,HttpSession session){
       /* User user = (User) session.getAttribute("user");
        if(user == null){
            return "/login";
        }
        User userInfo = userService.findUserInfo(user.getUserId());
        String dbPwd = userInfo.getPassword();
        if(StringUtils.isEmpty(oldPwd) && StringUtils.isEmpty(newPwd) && StringUtils.isEmpty(comfirmPwd)){
            //输入为空
            model.addAttribute("errorInfo","输入为空!");
            return "/pages/user/user_password";
        }else if(!dbPwd.equals(oldPwd)){
            //旧密码不对
            model.addAttribute("errorInfo","旧密码不对!");
            return "/pages/user/user_password";
        }else if(!newPwd.equals(comfirmPwd)){
            //两次密码输入不一致
            model.addAttribute("errorInfo","两次输入密码不一致!");
            return "/pages/user/user_password";
        }else{
            //输入合法,进入修改密码
            userService.updatePwd(comfirmPwd);*/
            return "redirect:/userAccount";
    }

    /**
     * 跳转修改更换手机号界面
     * @return
     */
    @RequestMapping("/updateTel")
    public String updateTel(){
        return "/pages/user/user_telephone";
    }

    /*
     * 更换手机号
     * @param newTel
     * @return
     */
    @RequestMapping("/saveTelephone")
    public String saveTel(String newTel,Model model,HttpSession session){
        String regexMobile = "^((17[0-9])|(14[0-9])|(13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$";
        User user = (User) session.getAttribute("user");
        if(user == null){
            return "/login";
        }

        if(!newTel.matches(regexMobile)){
            model.addAttribute("msg","格式不对!");
            return "/pages/user/user_telephone";
        }
        userService.updateTel(newTel,user.getId().toString());
        model.addAttribute("msg","修改成功");
        return "redirect:/userAccount";
    }

    /**
     * 解绑手机号
     * @return
     */
    @RequestMapping("/deleteTel")
    public String deleteTel(HttpSession session){
        User user = (User) session.getAttribute("user");
        userService.deleteTel(user.getId().toString());
        return "redirect:/userAccount";
    }

    /**
     * 跳转到更换邮箱界面
     * @return
     */
    @RequestMapping("/updateEmail")
    public String updateEmail(){
        return "/pages/user/user_email";
    }

    /**
     * 更换邮箱
     * @param newEmail 新邮箱
     * @return
     */
    @RequestMapping("/saveEmail")
    public String saveEmail(String newEmail,Model model,HttpSession session){
        String regexEmail = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
        User user = (User) session.getAttribute("user");
        if(user == null){
            return "/login";
        }
        if (!newEmail.matches(regexEmail)){
            model.addAttribute("msg","格式错误!");
            return "/pages/user/user_email";
        }
        userService.updateEmail(user.getId().toString(),newEmail);
        return "redirect:/userAccount";
    }

    /**
     * 修改订单状态
     * @param status
     * @param orderId
     * @return
     */
    @RequestMapping("/updateOrderStatus")
    public String updateOrderStatus(Integer status,String orderId){
        orderService.updateOrderStatus(status,orderId);
        return "redirect:/toUserOrder";
    }

    /**
     * 跳转评价页面
     */
    @RequestMapping("/toEvaluate")
    public String toEvaluate(String orderId,Integer status,Model model){
        List<String> productNameList = new ArrayList<>();
        orderService.findProductByOrderId(orderId).forEach((product) -> {
            productNameList.add(product.getProductName());
        });
        model.addAttribute("productNameList",productNameList);
        model.addAttribute("orderId",orderId);
        model.addAttribute("status",status);
        return "/pages/user/evaluate";
    }

    /**
     * 发布评论
     */
    @RequestMapping("/saveEva")
    public String saveEva(String orderId,String content,Integer status){
        evaService.saveEva(orderId,content,status);
        return "redirect:/toEvaList";
    }

    /**
     * 用户评价列表
     * @return
     */
    @RequestMapping("/toEvaList")
    public String toEvaList(@RequestParam(required=true,defaultValue="1") Integer page,Model model){
        PageHelper.startPage(page, 4);
        List<Evaluate> evaList = evaService.findAllEvaList();
        //PageHelper.startPage(page, pageSize);这段代码表示,程序开始分页了,page默认值是1,pageSize默认是10,意思是从第1页开始,每页显示10条记录。
        PageInfo<Evaluate> p=new PageInfo<Evaluate>(evaList);
        model.addAttribute("page", p);
        model.addAttribute("evaList",evaList);
        return "/pages/user/evaluate_list";
    }

    @RequestMapping("/createLeave")
    public String createLeave(String content,HttpSession session){
        User user = (User)session.getAttribute("user");
        leaveService.createLeave(content,user);
        return "redirect:/index";
    }
    @RequestMapping("/aboutUs")
    public String aboutUs(){
        return "/pages/other/about_us";
    }
    @RequestMapping("/userLogout")
    public String userLogout(HttpSession httpSession){
        //将user对象从session域中删除
        httpSession.removeAttribute("user");
        //页面应该跳转到登陆页面
        return "redirect:/index";
    }
}

如果也想学习本系统,下面领取。回复:038springboot

 

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

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

相关文章

质量不错的蓝牙耳机有哪些?2023年值得选购的四款蓝牙耳机

现如今&#xff0c;蓝牙耳机越多人使用&#xff0c;不同于有线耳机&#xff0c;蓝牙耳机更为方便&#xff0c;没有线束的困扰&#xff0c;走到哪也不用带上手机一起&#xff0c;特别便利。然而&#xff0c;随着蓝牙耳机市场的旷大&#xff0c;各种类型各种样式的耳机五花八门&a…

C++ 实现并查集结构

前言 并查集一般用于多元素&#xff0c;多集合的查找问题&#xff1b; 听说很有用&#xff0c;但是平时好像确实没有怎么见过。。 leetcode典型例题&#xff1a;岛屿数量 一、原理 其实并查集的每个小集合就是一张有向图&#xff0c;只不过是所有子节点指向父节点的图结构。…

认证鉴权对于 API 网关的重要性

认证鉴权作为 API 网关不可或缺的能力&#xff0c;已然成为用户在选型 API 网关时考量的重要因素之一。 作者钱勇&#xff0c;API7.ai 开发工程师&#xff0c;Apache APISIX Committer 在当下云原生越发成熟的环境下&#xff0c;API 网关最核心的功能可以概括为&#xff1a;连接…

高品质蓝牙耳机排行榜,值得入手的四款蓝牙耳机分享

2023年即将到来&#xff0c;还有哪些蓝牙耳机值得大家购买呢&#xff1f;蓝牙耳机在我们日常生活中发挥着很大作用。无论是听歌还是通话&#xff0c;又或者是运动健身、玩游戏等&#xff0c;都常见大家使用。同样也伴随着蓝牙耳机市场的壮大&#xff0c;五花八门的耳机层出不穷…

【C语言进阶】进来抄作业,完善你的通讯录(软工期末大作业可用)

目录 &#x1f970;前言&#x1f970;&#xff1a; 一、输入合法性检测&#x1f920;&#xff1a; ①.对“ 联系方式 ”的合法性检测&#xff1a; ②.对“年龄”进行合法性检测&#xff1a; 二、字典排序&#x1f911;&#xff1a; 三、反馈优化&#x1f92f;&#xff1a; …

Python 圣诞树代码

一、前言 1.本章将会讲解Python编程 实现圣诞树效果&#xff01; 2.圣诞节介绍 基督教纪念耶稣诞生的重要节日。亦称耶稣圣诞节、主降生节&#xff0c;天主教亦称耶稣圣诞瞻礼。耶稣诞生的日期&#xff0c;《圣经》并无记载。公元336年罗马教会开始在12月25日过此节。12月25日…

现在转行计算机如49年入国军?

阿里&#xff0c;腾讯等互联网大厂最近不太安宁&#xff0c;裁员消息频出&#xff0c;无风不起浪&#xff0c;裁员年年有&#xff0c;今年特别多。于是不少打算入行或者已经入行计算机的同学开始担忧&#xff0c;如今入行计算机&#xff0c;怎么有点49年入国军的赶脚&#xff1…

Android面试题及答案整理(2023最新版)持续更新中......

倒霉的时候总会想起福祸相依&#xff0c;但你会发现倒霉起来没完没了&#xff0c;就是看不到传说中的“福” 年初被裁了&#xff0c;我会安慰自己&#xff0c;此处不留爷自有留爷处&#xff0c;然后踏入找工作的行列&#xff1b;没有面试邀请&#xff0c;我会告诉自己&#xf…

倒在转“码”路上的文科生,文科生也能转行做IT吗?

近期&#xff0c;一篇《倒在转“码”路上的文科生》火了。 这也让关于“文科转码”的话题引起了一番热度&#xff0c;由于大环境不佳&#xff0c;使得毕业生就业成为了一个难度&#xff0c;其中文科生相较而言&#xff0c;选择更少&#xff0c;因此&#xff0c;让不少学子有了…

Java项目:springboot酒店宾馆管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 功能介绍 springboot酒店宾馆管理系统。该系统为后管系统&#xff0c;无前台。主要分三种角色&#xff1a;管理者/工作人员/前台人员。 主要功能有&…

网络安全方向好吗?

我就在这个行业&#xff0c;今年刚毕业&#xff0c;民办二本&#xff0c;目前武汉&#xff0c;薪资就没必要说了&#xff0c;高就对了。 这个行业优势就是工资高&#xff0c;缺点就需要一直学&#xff0c;卷得要死&#xff0c;不是跟别人卷&#xff0c;而是自己卷&#xff0c;…

数据库实验3 完整性语言实验

实验3 完整性语言实验 实验3.1实体完整性实验 1.实验目的 掌握实体完整性的定义和维护方法。 2.实验内容和要求 定义实体完整性,删除实体完整性。能够写出两种方式定义实体完整性的SQL 语句:创建表时定义实体完整性﹑创建表后定义实体完整性。设计SQL语句验证完整性约束是…

LeetCode 96. 不同的二叉搜索树

LeetCode 96. 不同的二叉搜索树 给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;5示例 2&#xff1a; 输入&#x…

我,30多岁的土木工程人,终于转行了

行外人可能没法想象&#xff0c;十年前最火爆、高校录取分数最高的土木工程专业&#xff0c;现在在贴吧知乎等社交网站上&#xff0c;竟然成了一个“劝退率”最高的专业。 土木出身的工程人&#xff0c;一边吐槽“土木毁我青春”&#xff0c;一边苦口婆心的劝退还在上学的学弟学…

一本通 1276:【例9.20】编辑距离

看完题目后&#xff0c;整个人都懵了&#xff0c;这题咋整&#xff1f; 哎呀&#xff0c;知道知道&#xff0c;用动态规划做 不要慌&#xff0c;我们慢慢分析.... 目录 做题前须知 状态转移 如果 a[i] b[j] 如果 a[i] ! b[j] 做删除操作 做插入操作 做替换操作 初始…

跑步热来袭!缤跃关注运动健康生活,跨界推出差异化酒店产品!

近期&#xff0c;人民数据研究院发布《2022全民跑步运动健康报告》&#xff0c;报告中显示参与跑步人群的年龄跨度随着社会对跑步运动不断攀升的热情而增加。现代生活节奏加快、竞争压力大使得部分中青年通过运动寻求解压&#xff0c;2022年18-40岁的跑者开始成为中坚力量&…

非零基础自学Golang 第15章 Go命令行工具 15.1 编译相关指令 15.1.3 install 15.1.4 交叉编译

非零基础自学Golang 文章目录非零基础自学Golang第15章 Go命令行工具15.1 编译相关指令15.1.3 install15.1.4 交叉编译第15章 Go命令行工具 15.1 编译相关指令 15.1.3 install go install命令的作用是编译后安装&#xff0c;该命令依赖于GOPATH&#xff0c;因此不能在独立的…

网上到处转行编程成功的,现实中真的容易吗?

首先&#xff0c;我先回答&#xff0c;转行编程真的这么简单么&#xff1f;答案是极其简单&#xff0c;但是也非常艰难。 这是一句正确的废话&#xff01; 其实&#xff0c;网上到处都是转行成功的案例。而我们现在也是在互联网上咨询&#xff0c;所以得到的答案会是什么答案…

转行IT,你需要了解的真实项目研发流程是怎样的?

本文以我在阿里写bug的项目流程为例子&#xff0c;介绍软件项目的研发一般流程&#xff0c;也可以作为企业开发流程的参考&#xff0c;让想转行IT的同学提前心里有个数。 一、职位分工 一般的大厂或者互联网软件公司&#xff0c;都会有如下职位。 1、产品经理 负责产品的设计&a…

json-server的学习笔记

文章目录json-server简介1、入门环境依赖安装2、基本使用2.1 启动jsonserver2.2 **json-server相关配置参数**2.3 jsonserver中的请求方法的作用3、筛选过滤4、分页5、排序6、切片(分页)7、特殊符号8、全文搜索9、关系10、数据库11、主页12、附加功能12.1 静态文件服务器12.2 替…