三方线上美食城|基于Springboot的三方线上美食商城系统

news2024/11/25 19:51:24

作者主页:编程指南针

作者简介:Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师

主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助

收藏点赞不迷路  关注作者有好处

文末获取源码 

项目编号:BS-SC-023

前言:

随着21世纪的进步,社会的生活节奏越来越快,网络的迅速崛起,互联网已日益成为提供信息的最佳渠道和连步进去传统的流通领域,传统的餐饮业也面连着巨大的挑战,网上订餐主要是针对白领还有大学生这些特定群体,一些白领在中午时间或者晚上高峰时间就餐,许多顺客由于高峰时间拥挤根本没时间来享受美味,这样既可以提前订餐不浪费中午午休的时间,也可以和同事加深感情,更可以每天换各种各样的菜式,保证每天工作的效率和身体的健康,这些问题就产生了快捷订餐的要求,最快的方式莫过于利用计算机网络,将餐饮业和计算机网络结合起来,就形成了网上订餐系统,能足不出户,轻松闲逸地实现自己订购餐饮和食品(包括饭、菜、众饭便当等)。网上订餐不仅减少了传统店面所需面临的租金问题,还能提供24小时不打烊服务,让顾客随时随地点餐的同时,也为商家减少了许多负担。

一,项目简介

本项目主要基于Springboot框架开发和实现了一个三方的美食商城系统,主要包含买方,卖方,管理员三种用户角色,不同的角色在系统中操作的功能模块是不一样的。

买方用户需要注册登陆后方可进行相应的操作,主要包含餐品分类浏览,详情查看,加入购物车,联系商家,查看自己的订单等功能,也可对餐品进行相应评论操作。

卖房用户注册登陆后可以进行相应的售卖商品操作,主要包含添加商品,查看购买我商品的订单信息,对发布的商品进行维护管理等功能。

管理员用户登陆系统后台,主要进行用户管理,商品类型管理,商品管理,订单管理,评论管理,系统管理,角色管理,权限管理,日志管理等相关功能模块。

系统整体功能完整,实现了一个基于买房,商家和平台用户的几种不同角色的应用,很适合做毕设。

二,环境介绍

语言环境:Java:  jdk1.8

数据库:Mysql: mysql5.7

应用服务器:Tomcat:  tomcat8.5.31

开发工具:IDEA或eclipse

后台开发技术:Springboot+Mybatis

前台开发技术:Bootstrap+Ajax

三,系统展示

系统首页

注册登陆

浏览商品添加购物车

查看购物车

我的订单

个人中心

商品评论

卖家登陆

发布售卖 商品

查看己售订单

商品信息维护

后台管理系统-用户登陆

后台管理首页

菜单管理

角色管理

管理员管理

分类管理

商品管理

用户管理

新闻公告管理

订单管理

四,核心代码展示

package com.dong.controller.admin;

import com.dong.config.TitleConfig;
import com.dong.exception.CodeMsg;
import com.dong.exception.Result;
import com.dong.pojo.Category;
import com.dong.service.CategoryService;
import com.dong.utils.CategoryUtil;
import com.dong.utils.ValidataUtil;
import com.dong.vo.PageResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

/**
 * 分类管理控制器
 */
@Controller
@RequestMapping("admin/category")
public class CategoryController {

    @Autowired
    private TitleConfig titleConfig;

    @Autowired
    private CategoryService categoryService;

    @GetMapping("list")
    public String list(@RequestParam(value ="name",defaultValue = "") String name, PageResult pageResult, Model model){
        model.addAttribute("title",titleConfig.getCategoryTitle() );
        model.addAttribute("name",name );
        model.addAttribute("pageResult", categoryService.selectPage(name, pageResult));
        model.addAttribute("parentList", CategoryUtil.getParentCategory(categoryService.selectAll()));
        return "/admin/category/list";
    }

    @GetMapping("add")
    public String add(Model model){
        model.addAttribute("parentList",  CategoryUtil.getParentCategory(categoryService.selectAll()));
        return "/admin/category/add";
    }


    @PostMapping("add")
    @ResponseBody
    public Result<Boolean> add(Category category){
        CodeMsg validata = ValidataUtil.validata(category);
        if(validata.getCode()!=CodeMsg.SUCCESS.getCode()){
            return Result.exception(validata);
        }
        try {
            categoryService.saveCategory(category);
        }catch (Exception e){
            return Result.exception(CodeMsg.ADMIN_CATEGORY_ADD_ERROR);
        }
        return Result.success(true);
    }

    @GetMapping("edit")
    public String edit(Model model,@RequestParam(value = "id",required = true) Integer id){
        model.addAttribute("category", categoryService.selectCategoryById(id));
        model.addAttribute("parentList", CategoryUtil.getParentCategory(categoryService.selectAll()));
        return "/admin/category/edit";
    }

    @PutMapping("edit")
    @ResponseBody
    public Result<Boolean> edit(Category category){
        CodeMsg validata = ValidataUtil.validata(category);
        if(validata.getCode()!=CodeMsg.SUCCESS.getCode()){
            return Result.exception(validata);
        }

        try {
            categoryService.updateCategory(category);
        }catch (Exception e){
            Result.exception(CodeMsg.ADMIN_CATEGORY_EDIT_ERROR);
        }
        return Result.success(true);
    }


    @DeleteMapping("delete")
    @ResponseBody
    public Result<Boolean> delete(@RequestParam(value = "id",required = true) Integer id){
        try {
            categoryService.deleteCategory(id);
        }catch (Exception e){
            Result.exception(CodeMsg.ADMIN_CATEGORY_DELETE_ERROR);
        }
        return Result.success(true);
    }

}

package com.dong.controller.admin;

import com.dong.config.TitleConfig;
import com.dong.exception.Result;
import com.dong.service.CommentService;
import com.dong.vo.PageResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

/**
 * 评论控制器
 */
@Controller
@RequestMapping("admin/comment")
public class CommentController {

    @Autowired
    private CommentService commentService;

    @Autowired
    private TitleConfig titleConfig;

    @GetMapping("list")
    public String list(PageResult pageResult, @RequestParam(value = "name",required = false,defaultValue = " ") String name, Model model){
        model.addAttribute("title",titleConfig.getCommentTitle());
        model.addAttribute("name",name );
        model.addAttribute("pageResult",commentService.selectPage(pageResult,name));
        return "admin/comment/list";
    }

    @DeleteMapping("delete")
    @ResponseBody
    public Result<Boolean> delete(@RequestParam(value = "id",required = true)Integer id){
        commentService.deleteComment(id);
        return Result.success(true);
    }
}
package com.dong.controller.admin;

import com.dong.config.TitleConfig;
import com.dong.exception.CodeMsg;
import com.dong.exception.Result;
import com.dong.service.GoodService;
import com.dong.vo.PageResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

/**
 * 商品管理控制器
 */
@RequestMapping("admin/good")
@Controller
public class GoodController {

    @Autowired
    private GoodService goodService;
    @Autowired
    private TitleConfig titleConfig;

    @GetMapping("list")
    public String list(Model model, @RequestParam(value = "name",required = false,defaultValue = "") String name, PageResult pageResult){
        model.addAttribute("title", titleConfig.getGoodTitle());
        model.addAttribute("name",name );
        model.addAttribute("pageResult",goodService.selectPages(pageResult,name ));
        return "/admin/good/list";
    }

    @DeleteMapping("delete")
    @ResponseBody
    public Result<Boolean> delete(@RequestParam(value = "id") Integer id){
        try {
          goodService.deleteGood(id);
        } catch (Exception e) {
            return Result.exception(CodeMsg.ADMIN_GOODS_DELETE_ERROR);
        }
        return Result.success(true);
    }
}
package com.dong.controller.admin;

import com.dong.constant.SessionConstant;
import com.dong.exception.CodeMsg;
import com.dong.exception.Result;
import com.dong.listener.SessionListener;
import com.dong.pojo.User;
import com.dong.service.LogService;
import com.dong.service.UserService;
import com.dong.utils.StringUtil;
import com.dong.utils.ValidataUtil;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import java.util.Date;

/**
 * 系统控制器
 */
@Controller
@RequestMapping("system")
public class SystemController {

    @Autowired
    private UserService userService;

    @Autowired
    private LogService logService;


    Logger logger= LoggerFactory.getLogger(UserController.class);


    /**
     * 管理员登录
     * @param user
     * @param cpacha
     * @param session
     * @return
     */
    @PostMapping(value = "/login_form")
    @ResponseBody
    public Result<Boolean> Login(User user, String cpacha,HttpSession session){
        CodeMsg validata = ValidataUtil.validata(user);
        if(validata.getCode()!=CodeMsg.SUCCESS.getCode()){
            return Result.exception(validata);
        }

        if(StringUtils.isEmpty(cpacha)){
            return Result.exception(CodeMsg.CPACHA_EMPTY);
        }

        Object adminCpacha =session.getAttribute("admin_login");

       if(adminCpacha==null){
            return Result.exception(CodeMsg.SESSION_EXPIRED);
        }

        if(!cpacha.equalsIgnoreCase(adminCpacha.toString())){
            return Result.exception(CodeMsg.CPACHA_ERROR);
        }

        User users = userService.selectUserByName(user.getUsername());

        if(users==null){
            return Result.exception(CodeMsg.ADMIN_USERNAME_EXIST);
        }

        if(!users.getPassword().equals(user.getPassword())){
            return Result.exception(CodeMsg.ADMIN_PASSWORD_ERROR);
        }

        if(users.getStatus()==User.ADMIN_USER_STATUS_UNABLE){
            return Result.exception(CodeMsg.ADMIN_USER_UNABLE);
        }

        //检查一切符合,可以登录,将用户信息存放至session
        session.setAttribute(SessionConstant.USER_SESSION, users);

        //销毁验证码
        session.removeAttribute("admin_login");
        logger.info("用户成功登录,user="+users);
        logService.addLog(user.getUsername(),"【"+user.getUsername()+"】"+"用户在"+ StringUtil.dataFormat(new Date(), "yyyy-MM-dd HH:mm:ss")+"登录系统!");
        return Result.success(true);
    }

    /**
     * 后台主页
     * @param model
     * @return
     */
    @GetMapping(value = "index")
    public String index(Model model){
        model.addAttribute("userTotal", userService.selectUserTotal());
        model.addAttribute("operatorLogTotal", logService.selectLogTotal());
        model.addAttribute("operatorLogs", logService.selectRecentLog());
        model.addAttribute("onlineUserTotal", SessionListener.onlineUserCount);
        return "admin/system/index";
    }

    /**
     * 修改信息
     * @param user
     * @param session
     * @return
     */
    @PutMapping(value = "update_userinfo")
    @ResponseBody
    public Result<Boolean> update_userinfo(User user,HttpSession session){
        User users =(User) session.getAttribute(SessionConstant.USER_SESSION);
        if(userService.selectUserByName(user.getUsername()) != null){
            return  Result.exception(CodeMsg.ADMIN_USERNAME_EXIST);
        }
        users.setImage(user.getImage());
        users.setEmail(user.getEmail());
        users.setMobile(user.getMobile());
         userService.updateUser(user);
        logService.addLog(user.getUsername(),"【"+user.getUsername()+"】"+"用户在"+ StringUtil.dataFormat(new Date(), "yyyy-MM-dd HH:mm:ss")+"修改了自己的信息!");
        return Result.success(true);
    }

    /**
     * 修改密码
     * @param oldpwd
     * @param newpwd
     * @param id
     * @param session
     * @return
     */
    @PutMapping(value = "update_pwd")
    @ResponseBody
    public Result<Boolean> update_pwd(@RequestParam(value = "oldPwd",required = true) String oldpwd,
                                      @RequestParam(value = "newPwd",required = true) String newpwd,
                                      @RequestParam(value = "id",required = true) Integer id,
                                      HttpSession session){
        User user =(User) session.getAttribute(SessionConstant.USER_SESSION);
        if(!user.getPassword().equals(oldpwd)){
            return Result.exception(CodeMsg.ADMIN_USER_UPDATE_PWD_ERROR);
        }
        if(StringUtils.isEmpty(newpwd)){
            return Result.exception(CodeMsg.ADMIN_USER_UPDATE_PWD_EMPTY);
        }
        if(newpwd.length()<6){
            return Result.exception(CodeMsg.ADMIN_PASSWORD_MINLENGTH);
        }
        if(newpwd.length()>18){
            return Result.exception(CodeMsg.ADMIN_PASSWORD_MAXLENGTH);
        }
        User user1 = new User();
        user1.setId(id);
        user1.setPassword(newpwd);
        userService.updateUser(user1);
        user.setPassword(newpwd);
        logService.addLog(user.getUsername(),"【"+user.getUsername()+"】"+"用户在"+ StringUtil.dataFormat(new Date(), "yyyy-MM-dd HH:mm:ss")+"更新了自己的密码!");
        return Result.success(true);
    }

    /**
     * 退出登录
     * @param session
     * @return
     */
    @GetMapping(value = "logout")
    public String logout(HttpSession session){
        session.removeAttribute(SessionConstant.USER_SESSION);
        return "redirect:login";
    }
}

五,项目总结

在国外,许多知名餐饮企业多年前就开始提供网上订餐服务了,众所周知,肯德基、麦当劳等快餐巨头是最早开始的。现在网上订餐对餐饮企业的门槛不断降低,越来越多的餐饮企业开始提供网上订餐服务。人们只需一部电脑和一张银行卡,就可全天订座。以往一家有名的餐厅,你需要提前很多时间或安排人手前往餐厅预定,这种做法大大影响了办事效率,与现代人的生活节奏不符。如今人们只需提前登录该餐厅网站预定,而不是把大量时间浪费在无谓的路程上。网上订餐的流程一般是餐饮企业先开通网上订餐服务,再由专业的物流配送公司运送。消费者只需在网上选择餐饮企业提供的菜品,就有配送公司送货上门。网上订餐的方式已经被国外的许多家庭所认可。

在国内,2012年之前我国使用的订餐方式大都还停留在电话订餐的层次上。毋容置疑,电话订餐方便,随时打一个电话就可以预定餐品。这种订餐方式逐渐受到消费者的认可,使用量逐年增长,很多问题开始凸显出来。例如订餐效率低,信息的处理程序繁杂,耗费大量人力资源。由于这些缺点,单独的电话订餐很难满足现代人的需求。总体而言,该行业发展不够迅速,国内也缺乏龙头企业。经过这几年的初步发展和互联网技术的不断进步,网络订餐市场被迅速催化。这种双赢的模式逐渐被消费者与企业认可。网上订餐成为现在炙手可热的新兴行业,美团、饿了么等国内知名app已经成为人们生活中不可或缺的一部分。

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

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

相关文章

Neo4j 实战(一)-- Mac neo4j 安装与配置

前言 Neo4j是一个高性能的&#xff0c;Nosql图形数据库。Nosql &#xff1d;no sql&#xff0c;即与传统的将数据结构化并存储在表中的数据库不一样。Neo4j将数据存储在网络上&#xff0c;我们也可以把Neo4j视为一个图引擎。我们打交道的是一个面对对象的、灵活的网络结构而不是…

【消息中间件】RocketMQ底层如何实现生产者发送消息

目录 一、前言 二、实现生产者发送消息 1、启动生产者 1.1、RocketMQTemplate消息发送模板 1.2、afterPropertiesSet()逻辑 1.3、DefaultMQProducer#start()逻辑 2、DefaultMQProducer#start()启动逻辑 2.1、更新路由信息到本地 2.2、从本地获取主题Topic信息 2.3、数…

flink on yarn

文章目录flink sql client on yarnsession 模式Per-Job Cluster 模式flink run安装完hadoop 3.3.4之后&#xff0c;启动hadoop、yarn 将flink 1.14.6上传到各个服务器节点&#xff0c;解压 flink sql client on yarn https://nightlies.apache.org/flink/flink-docs-release…

SQL注入

目录 一、SQL注入原理 二、SQL注入的危害 三、SQL注入的分类 四、SQL注入的流程 五、总结 一、SQL注入原理 1.SQL注入产生的原因&#xff1a; 当Web应用向后台数据库传递SQL语句进行数据库操作时。如果对用户输入的参数没有经过严格的过滤处理&#xff0c;那么攻击者就可以构造…

面试真题 | 需求评审中从几个方面发现问题

面试官问题 在需求评审会议中&#xff0c;你会发现什么问题&#xff1f; 在需求评审时&#xff0c;是通过哪几个角度来进行考虑及发现问题的&#xff1f; 考察点 是否参加过需求评审 在需求评审过程中是否能提出有效的问题 4个角度发现问题 在需求评审的过程中通过以下4个…

【Vue 快速入门系列】一文透彻vue中使用axios及跨域问题的解决

文章目录一、什么是Axios&#xff1f;1.前置知识2.vue中使用axios3.Axios两种请求方式①.调用接口②.传入对象3.Axios支持的请求类型①.get请求②.post请求③.put请求④.patch请求⑤.delete请求二、跨域问题解决方案1.什么是跨域问题&#xff1f;2.解决方案一&#xff1a;在Vue…

基于微信小程序的社区心理健康服务-计算机毕业设计

项目介绍 社区心理健康服务平台小程序采用java开发语言、以及Mysql数据库等技术。系统主要分为管理员和用户、咨询师三部分&#xff0c;管理员服务端&#xff1a;首页、个人中心、用户管理、咨询师管理、心理书籍管理、相关资源管理、试卷管理、试题管理、系统管理、订单管理&…

希沃 API 网关架构演进之路

网关往期迭代与痛点 希沃网关的发展经历了四个版本的迭代。2013 年公司开始尝试互联网业务&#xff0c;那时候采用了 OpenRestyNGINX 静态配置的方式搭建了最初的网关&#xff0c;开发人员通过 SCP 来发布。与此同时一个比较严重的问题就是&#xff0c;每次上线发布都需要运维…

喜讯+1!袋鼠云数栈技术团队获“2022年度优秀开源技术团队”

近日&#xff0c;在“开源中国&#xff08;OSCHINA&#xff09;”开展的年度评选中&#xff0c;袋鼠云数栈技术团队凭借在2022年间的技术分享频率及质量、运营积极性等多方面的表现&#xff0c;荣获“2022年度优秀开源技术团队”的称号&#xff0c;这也是袋鼠云数栈技术团队连续…

umi学习总结

文章目录umi介绍umi是什么&#xff1f;umi的特性开发环境Node.js依赖管理工具目录结构路由配置路由页面跳转Link组件路由组件参数&#xff1a;路由动态参数query信息样式使用css样式dva为什么需要状态管理umi如何管理状态umi介绍 umi是什么&#xff1f; Umi&#xff0c;中文发…

自定义委托类

setItemDelegete();该函数可以自定义委托类 该例子为Qt官网的一个例子&#xff1a;使用QSpinBox来提供编辑功能 首先创建一个项目&#xff1a;名为object在项目中添加一个c类&#xff0c;类名为SpinBoxDelegate 修改该类的基类&#xff1a;更改为QImageDelegate,然后需要添加重…

12/15历史上的今天

宜找代驾 星期四 农历十一月廿二 今夜无人拥你入怀不如喝完杯中酒走入夜色中踏上回家的归途 *约翰-梅尔西藏墨脱公路嘎隆拉隧道顺利贯通 2010年12月15日&#xff0c;西藏墨脱公路控制性工程——嘎隆拉隧道顺利贯通。   2010年12月15日西藏墨脱公路控制性工程——嘎隆拉隧道…

华为开源自研AI框架昇思MindSpore应用实践:RNN实现情感分类

目录一、环境准备1.进入ModelArts官网2.使用CodeLab体验Notebook实例二、数据准备1.数据下载模块2.加载IMDB数据集2.加载预训练词向量三、数据集预处理四、模型构建1.Embedding2.RNN(循环神经网络)3.Dense4.损失函数与优化器5.训练逻辑6.评估指标和逻辑五、模型训练与保存六、模…

电脑重装系统后卡顿怎么办?教你快速解决电脑卡顿问题

​Win10电脑卡顿怎么办&#xff1f;许多用户在使用电脑的过程中发现&#xff0c;随着使用时间的增加&#xff0c;电脑会越来越卡顿。有些小伙伴就会选择重装电脑系统&#xff0c;那么我们在重装电脑之后要进行什么操作才能让电脑不卡顿呢&#xff1f; 操作方法&#xff1a; 优化…

java学生成绩管理系统源码swing(GUI) MySQL带开发教程永久学习

今天给大家演示一款由Java swing即GUI和mysql数据库实现的&#xff0c;学生成绩管理系统&#xff0c;系统采用了MVC的设计模式&#xff0c;结构层次非常清晰&#xff0c;此外&#xff0c;该项目有手把手的开发教程&#xff0c;适合刚入门Java的学生学习&#xff0c;下面我们来看…

Pr:导出设置

◆ ◆ ◆导出设置&#xff08;媒体文件&#xff09;Export Settings&#xff08;Media File&#xff09;基本设置文件名File Name指定导出的文件名。位置Location可以点击蓝色字更改导出的文件的存放位置。预设Preset选择导出预设。匹配源 Match Source预设会将大多数设置与源…

[附源码]Python计算机毕业设计高校贫困生信息管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

Mysql 查询获取 为数字的 字符串

先看示例数据: test_value 字段 为 VARVCHAR 类型 数据样例&#xff1a; 包含 纯数字&#xff0c; 带小数点的数字&#xff0c; 字符串 获取里面的纯数字 &#xff1a;使用正则匹配 函数 REGEXP &#xff0c;返回 1代表不匹配&#xff0c; 返回 0 代表匹配 包含小数点 [^0-…

两步开启研发团队专属ChatOps|极狐GitLab ChatOps 的设计与实践

本文来自&#xff1a; 彭亮 极狐(GitLab) 高级产品经理 郭旭东 极狐(GitLab) 资深创新架构师 舒文斌 极狐(GitLab) 高级网站可靠性工程师 最近几天&#xff0c;ChatGPT 真是杀疯了 &#xff01; 相信大家的朋友圈&#xff0c;已经被调戏、询问或探讨 ChatGPT 的贴子刷屏。 看到…

虹科案例 | 风电机组的预测性维护应该如何进行?

虹科预测性维护方案 在风能领域的应用 虹科案例 01 应用背景 风能是最重要的清洁能源之一&#xff0c;大力发展风电等清洁能源是实现国家可持续发展战略的必然选择。发展风电、光伏等新能源的高效运维技术已成为当前电力系统面临的重要问题之一。在风电机组单机容量较大、机组…