微信小程序毕业设计-餐厅点餐系统项目开发实战(附源码+论文)

news2024/11/24 17:56:17

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。

💞当前专栏:微信小程序毕业设计

精彩专栏推荐👇🏻👇🏻👇🏻

🎀 Python毕业设计
🌎Java毕业设计

开发运行环境

①前端:微信小程序开发工具

② 后端:Java

  • 框架:springboot
  • JDK版本:JDK1.8
  • 服务器:tomcat7
  • 数据库:mysql 5.7
  • 数据库工具:Navicat12
  • 开发软件:eclipse/myeclipse/idea
  • Maven包:Maven3.3.9
  • 浏览器:谷歌浏览器

演示视频

原版高清演示视频-编号:185
https://pan.quark.cn/s/b2f44f423421

源码下载地址:

https://download.csdn.net/download/2301_76953549/89227565

论文目录

【如需全文请按文末获取联系】
在这里插入图片描述
在这里插入图片描述

一、项目简介

本次开发一套餐厅点餐微信小程序有管理员,后厨,用户三个角色。管理员功能有个人中心,管理员管理,后厨管理,餐桌管理,菜品名称管理,新闻类型名称管理,菜品信息管理,菜品信息评价管理,菜品信息订单管理,新闻信息管理,用户管理,轮播图管理。用户可以注册登录,查看菜品并且订购菜品等操作。

二、系统设计

2.1软件功能模块设计

在管理员功能模块确定下来的基础上,对管理员各个功能进行设计,确定管理员功能的详细模块。绘制的管理员功能结构见下图。
在这里插入图片描述

2.2数据库设计

(2)用户实体属性图通过Visio工具绘制,绘制结果展示如下:
在这里插入图片描述
(3)餐桌实体属性图通过Visio工具绘制,绘制结果展示如下:
在这里插入图片描述

(1)管理员实体属性图通过Visio工具绘制,绘制结果展示如下:
在这里插入图片描述

三、系统项目部分截图

3.1管理员后台功能实现

用户管理
管理员可以对用户信息进行添加,修改,删除,查询操作。
在这里插入图片描述
餐桌管理
管理员可以对餐桌信息进行添加,修改,删除,查询操作。
在这里插入图片描述
菜品信息管理
管理员可以对菜品信息信息进行添加,修改,删除,查询操作,还可以对菜品库存操作和上下架操作。
在这里插入图片描述

3.2微信小程序功能实现

首页
微信小程序输入正确的账号密码后就会默认进入首页显示界面。首页主要有轮播图,搜索框,以及下面的导航为主要组成部分。
在这里插入图片描述
菜品信息
用户可以通过菜品类型搜索和查看菜品信息。
在这里插入图片描述
菜品详情
用户点击菜品信息可以看到菜品详情介绍,可以加入购物车或者立即购买操作。
在这里插入图片描述

四、部分核心代码


package com.controller;

import java.io.File;
import java.math.BigDecimal;
import java.net.URL;
import java.text.SimpleDateFormat;
import com.alibaba.fastjson.JSONObject;
import java.util.*;
import org.springframework.beans.BeanUtils;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.context.ContextLoader;
import javax.servlet.ServletContext;
import com.service.TokenService;
import com.utils.*;
import java.lang.reflect.InvocationTargetException;

import com.service.DictionaryService;
import org.apache.commons.lang3.StringUtils;
import com.annotation.IgnoreAuth;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.entity.*;
import com.entity.view.*;
import com.service.*;
import com.utils.PageUtils;
import com.utils.R;
import com.alibaba.fastjson.*;

/**
 * 菜品评价
 * 后端接口
 * @author
 * @email
*/
@RestController
@Controller
@RequestMapping("/goodsCommentback")
public class GoodsCommentbackController {
    private static final Logger logger = LoggerFactory.getLogger(GoodsCommentbackController.class);

    @Autowired
    private GoodsCommentbackService goodsCommentbackService;


    @Autowired
    private TokenService tokenService;
    @Autowired
    private DictionaryService dictionaryService;

    //级联表service
    @Autowired
    private GoodsService goodsService;
    @Autowired
    private YonghuService yonghuService;

    @Autowired
    private HouchuService houchuService;


    /**
    * 后端列表
    */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){
        logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
        String role = String.valueOf(request.getSession().getAttribute("role"));
        if(StringUtil.isEmpty(role))
            return R.error(511,"权限为空");
        else if("用户".equals(role))
            params.put("yonghuId",request.getSession().getAttribute("userId"));
        else if("后厨".equals(role))
            params.put("houchuId",request.getSession().getAttribute("userId"));
        if(params.get("orderBy")==null || params.get("orderBy")==""){
            params.put("orderBy","id");
        }
        PageUtils page = goodsCommentbackService.queryPage(params);

        //字典表数据转换
        List<GoodsCommentbackView> list =(List<GoodsCommentbackView>)page.getList();
        for(GoodsCommentbackView c:list){
            //修改对应字典表字段
            dictionaryService.dictionaryConvert(c, request);
        }
        return R.ok().put("data", page);
    }

    /**
    * 后端详情
    */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") Long id, HttpServletRequest request){
        logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
        GoodsCommentbackEntity goodsCommentback = goodsCommentbackService.selectById(id);
        if(goodsCommentback !=null){
            //entity转view
            GoodsCommentbackView view = new GoodsCommentbackView();
            BeanUtils.copyProperties( goodsCommentback , view );//把实体数据重构到view中

                //级联表
                GoodsEntity goods = goodsService.selectById(goodsCommentback.getGoodsId());
                if(goods != null){
                    BeanUtils.copyProperties( goods , view ,new String[]{ "id", "createTime", "insertTime", "updateTime"});//把级联的数据添加到view中,并排除id和创建时间字段
                    view.setGoodsId(goods.getId());
                }
                //级联表
                YonghuEntity yonghu = yonghuService.selectById(goodsCommentback.getYonghuId());
                if(yonghu != null){
                    BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createTime", "insertTime", "updateTime"});//把级联的数据添加到view中,并排除id和创建时间字段
                    view.setYonghuId(yonghu.getId());
                }
            //修改对应字典表字段
            dictionaryService.dictionaryConvert(view, request);
            return R.ok().put("data", view);
        }else {
            return R.error(511,"查不到数据");
        }

    }

    /**
    * 后端保存
    */
    @RequestMapping("/save")
    public R save(@RequestBody GoodsCommentbackEntity goodsCommentback, HttpServletRequest request){
        logger.debug("save方法:,,Controller:{},,goodsCommentback:{}",this.getClass().getName(),goodsCommentback.toString());

        String role = String.valueOf(request.getSession().getAttribute("role"));
        if(StringUtil.isEmpty(role))
            return R.error(511,"权限为空");
        else if("用户".equals(role))
            goodsCommentback.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));

        goodsCommentback.setInsertTime(new Date());
        goodsCommentback.setCreateTime(new Date());
        goodsCommentbackService.insert(goodsCommentback);
        return R.ok();
    }

    /**
    * 后端修改
    */
    @RequestMapping("/update")
    public R update(@RequestBody GoodsCommentbackEntity goodsCommentback, HttpServletRequest request){
        logger.debug("update方法:,,Controller:{},,goodsCommentback:{}",this.getClass().getName(),goodsCommentback.toString());

        String role = String.valueOf(request.getSession().getAttribute("role"));
//        if(StringUtil.isEmpty(role))
//            return R.error(511,"权限为空");
//        else if("用户".equals(role))
//            goodsCommentback.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
        //根据字段查询是否有相同数据
        Wrapper<GoodsCommentbackEntity> queryWrapper = new EntityWrapper<GoodsCommentbackEntity>()
            .eq("id",0)
            ;

        logger.info("sql语句:"+queryWrapper.getSqlSegment());
        GoodsCommentbackEntity goodsCommentbackEntity = goodsCommentbackService.selectOne(queryWrapper);
        goodsCommentback.setUpdateTime(new Date());
        if(goodsCommentbackEntity==null){
            //  String role = String.valueOf(request.getSession().getAttribute("role"));
            //  if("".equals(role)){
            //      goodsCommentback.set
            //  }
            goodsCommentbackService.updateById(goodsCommentback);//根据id更新
            return R.ok();
        }else {
            return R.error(511,"表中有相同数据");
        }
    }

    /**
    * 删除
    */
    @RequestMapping("/delete")
    public R delete(@RequestBody Integer[] ids){
        logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());
        goodsCommentbackService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }


    /**
     * 批量上传
     */
    @RequestMapping("/batchInsert")
    public R save( String fileName){
        logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName);
        try {
            List<GoodsCommentbackEntity> goodsCommentbackList = new ArrayList<>();//上传的东西
            Map<String, List<String>> seachFields= new HashMap<>();//要查询的字段
            Date date = new Date();
            int lastIndexOf = fileName.lastIndexOf(".");
            if(lastIndexOf == -1){
                return R.error(511,"该文件没有后缀");
            }else{
                String suffix = fileName.substring(lastIndexOf);
                if(!".xls".equals(suffix)){
                    return R.error(511,"只支持后缀为xls的excel文件");
                }else{
                    URL resource = this.getClass().getClassLoader().getResource("static/upload/" + fileName);//获取文件路径
                    File file = new File(resource.getFile());
                    if(!file.exists()){
                        return R.error(511,"找不到上传文件,请联系管理员");
                    }else{
                        List<List<String>> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件
                        dataList.remove(0);//删除第一行,因为第一行是提示
                        for(List<String> data:dataList){
                            //循环
                            GoodsCommentbackEntity goodsCommentbackEntity = new GoodsCommentbackEntity();
//                            goodsCommentbackEntity.setGoodsId(Integer.valueOf(data.get(0)));   //菜品 要改的
//                            goodsCommentbackEntity.setYonghuId(Integer.valueOf(data.get(0)));   //用户 要改的
//                            goodsCommentbackEntity.setGoodsCommentbackText(data.get(0));                    //评价内容 要改的
//                            goodsCommentbackEntity.setReplyText(data.get(0));                    //回复内容 要改的
//                            goodsCommentbackEntity.setInsertTime(date);//时间
//                            goodsCommentbackEntity.setUpdateTime(new Date(data.get(0)));          //回复时间 要改的
//                            goodsCommentbackEntity.setCreateTime(date);//时间
                            goodsCommentbackList.add(goodsCommentbackEntity);


                            //把要查询是否重复的字段放入map中
                        }

                        //查询是否重复
                        goodsCommentbackService.insertBatch(goodsCommentbackList);
                        return R.ok();
                    }
                }
            }
        }catch (Exception e){
            return R.error(511,"批量插入数据异常,请联系管理员");
        }
    }





    /**
    * 前端列表
    */
    @IgnoreAuth
    @RequestMapping("/list")
    public R list(@RequestParam Map<String, Object> params, HttpServletRequest request){
        logger.debug("list方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));

        // 没有指定排序字段就默认id倒序
        if(StringUtil.isEmpty(String.valueOf(params.get("orderBy")))){
            params.put("orderBy","id");
        }
        PageUtils page = goodsCommentbackService.queryPage(params);

        //字典表数据转换
        List<GoodsCommentbackView> list =(List<GoodsCommentbackView>)page.getList();
        for(GoodsCommentbackView c:list)
            dictionaryService.dictionaryConvert(c, request); //修改对应字典表字段
        return R.ok().put("data", page);
    }

    /**
    * 前端详情
    */
    @RequestMapping("/detail/{id}")
    public R detail(@PathVariable("id") Long id, HttpServletRequest request){
        logger.debug("detail方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
        GoodsCommentbackEntity goodsCommentback = goodsCommentbackService.selectById(id);
            if(goodsCommentback !=null){


                //entity转view
                GoodsCommentbackView view = new GoodsCommentbackView();
                BeanUtils.copyProperties( goodsCommentback , view );//把实体数据重构到view中

                //级联表
                    GoodsEntity goods = goodsService.selectById(goodsCommentback.getGoodsId());
                if(goods != null){
                    BeanUtils.copyProperties( goods , view ,new String[]{ "id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段
                    view.setGoodsId(goods.getId());
                }
                //级联表
                    YonghuEntity yonghu = yonghuService.selectById(goodsCommentback.getYonghuId());
                if(yonghu != null){
                    BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段
                    view.setYonghuId(yonghu.getId());
                }
                //修改对应字典表字段
                dictionaryService.dictionaryConvert(view, request);
                return R.ok().put("data", view);
            }else {
                return R.error(511,"查不到数据");
            }
    }


    /**
    * 前端保存
    */
    @RequestMapping("/add")
    public R add(@RequestBody GoodsCommentbackEntity goodsCommentback, HttpServletRequest request){
        logger.debug("add方法:,,Controller:{},,goodsCommentback:{}",this.getClass().getName(),goodsCommentback.toString());
        goodsCommentback.setInsertTime(new Date());
        goodsCommentback.setCreateTime(new Date());
        goodsCommentbackService.insert(goodsCommentback);
        return R.ok();
        }


}

五、获取源码或论文

如需对应的论文或源码,以及其他定制需求,也可以下方微❤联系。

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

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

相关文章

单机小游戏好上架的应用市场有哪些?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

长尾式差分放大电路调零

长尾式放大电路用了两个参数相同的三极管&#xff0c;但实际上并没有完全相同的三极管&#xff0c;所以为了提高差分放大电路的对称性(一边电流增加多少&#xff0c;另一边电流减小多少&#xff0c;即能在电阻Re上产生的压降不变(后面做虚地处理))&#xff0c;在下图中加入可调…

【CT】LeetCode手撕—143. 重排链表

目录 题目1- 思路2- 实现⭐143. 重排链表——题解思路 3- ACM 实现 题目 原题连接&#xff1a;143. 重排链表 1- 思路 模式识别&#xff1a;重排链表 ——> 逆向 ——> ① 找到中间节点 ——> ②逆置 mid.next 链表——> ③遍历 2- 实现 ⭐143. 重排链表——题解…

Vue72-路由传参1

一、需求 点击哪个消息&#xff0c;就展示哪个消息的详情 这是一个三级路由&#xff01; 给路由组件&#xff1a;detail.vue传递消息数据。 二、代码步骤 2-1、编写路由组件 从$route.query属性里面获取传参 2-2、编写路由规则 2-3、编写路由标签&#xff0c;传参 1、to的字…

做好海外ASO优化的7大核心要素你了解几个?

海外App进行ASO优化时&#xff0c;需要综合考虑多个方面以确保应用在应用商店中获得更高的曝光率和下载量。以下是一些关键的ASO优化步骤&#xff0c;结合参考文章中的相关信息进行详细阐述&#xff1a; 1.关键词优化 调研目标市场的用户行为和检索习惯&#xff0c;挖掘与应用…

让你的 Python 代码更快的小技巧

我们经常听到 “Python 太慢了”&#xff0c;“Python 性能不行”这样的观点。但是&#xff0c;只要掌握一些编程技巧&#xff0c;就能大幅提升 Python 的运行速度。 今天就让我们一起来看下让 Python 性能更高的 9 个小技巧 python学习资料分享&#xff08;无偿&#xff09;…

PXE自动平台 搭建 银河麒麟 UEFI x86_64 ARM64

1. PXE自动化 原理 要实现PXE自动安装需要以下组件&#xff1a; DHCP服务&#xff1a;服务器通过网络启动时自动分配IP地址。TFTP服务&#xff1a;提供服务器启动下载启动引导EFI。HTTP服务&#xff1a;操作系统镜像下载。 各组件工作原理如下[1]&#xff1a; 开PXE后&…

Android-app自动更新总结(已适配9-0)(1)

} //检查版本号&#xff0c;第一次请求(post)&#xff0c;&#xff0c;&#xff0c;UpdateAppBean根据服务器返回生成 private void requestAppUpdate(int version, final DataRequestListener listener) { OkGo.post(Const.HOST_URL Const.UPDATEAPP).params(“version”, v…

leetcode 动态规划 (基础版) 下降路径最小和

题目&#xff1a; 题解&#xff1a; 这题和三角型路径和相似&#xff0c;但这题无法在像哪一题一样通过换一个方向逃避下标特判。所以这道题就写一个下标特判的方案。特殊的下标是每一行的第一个元素和最后一个元素&#xff0c;它们由头上的一个元素和左上和右上中的其中一个…

ArcGIS与Excel分区汇总统计三调各地类面积!数据透视表与汇总统计!

​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 点击学习——>遥感影像综合处理4大遥感软件ArcGISENVIErdaseCognition 01 需求说明 介绍一下ArcGIS与Excel统计分区各地类的三调地类面积。 ArcGIS统计分析不会&#x…

Xshell7免费版下载安装使用

​一、下载安装​ 1.打开官网下载 https://www.xshell.com/zh/free-for-home-school/ 2.选择合适的下载路径&#xff0c;点击下载按钮&#xff0c;然后按照提示完成安装。 二、Xshell7的使用&#xff0c;Xhell连接Linux 1.连接之前&#xff0c;确保在Linux中开启SSH。参考&a…

大数据存储技术笔记

目录 大数据的特性 HDFS 读流程的基本步骤 HDFS 写流程的基本步骤 Mapreduce的执行过程 MapReduce 中 combiner 作用 hadoop 调度器及其工作方法 Hive 中内部表与外部表区别(创建删除角度) Hadoop 的 2 个主要组件及其功能 Hadoop MapReduce 的工作流程 正常工作的 ha…

百余App通过蚂蚁数科mPaaS启动鸿蒙开发测试

6月21日&#xff0c;在华为开发者大会主论坛上&#xff0c;蚂蚁数科mPaaS公布了三方生态共建进展&#xff1a;华夏银行、广发银行、中石油、中国移动等200余App启动鸿蒙开发测试。此前&#xff0c;该产品已全量适配鸿蒙100余个SDK&#xff0c;并提供20余项安全能力&#xff0c;…

vue3中h函数的使用

h函数是用于创建一个 vnodes &#xff0c;它既可以用于创建原生元素&#xff0c;也可以创建组件&#xff0c;其渲染后的效果等同于使用模版语言来进行创建。 h函数的传参如下&#xff1a; // 完整参数签名 function h(type: string | Component,props?: object | null,child…

XMLXXE实体注入

XML&XXE实体注入 原理 XML被设计为传输和存储数据&#xff0c;XML文档结构包括XML声明、DTD文档类型定义&#xff08;可选&#xff09;、文档元素&#xff0c;其焦点是数据的内容&#xff0c;其把数据从HTML分离&#xff0c;是独立于软件和硬件的信息传输工具。等同于JSO…

h5兼容问题 复制粘贴移动端无法粘贴复制内容

const selectText (textbox, startIndex, stopIndex) > {if (textbox.createTextRange) {//ieconst range textbox.createTextRange();range.collapse(true);range.moveStart(character, startIndex);//起始光标range.moveEnd(character, stopIndex - startIndex);//结束光…

Web渗透:XSS-DOM-based XSS

DOM-based XSS&#xff08;基于DOM的跨站脚本攻击&#xff09;是一种XSS攻击类型&#xff0c;其特点是恶意脚本通过操作文档对象模型&#xff08;DOM&#xff09;直接在客户端执行&#xff0c;而无需经过服务器的处理。这种攻击主要利用客户端JavaScript代码中的漏洞&#xff0…

如何利用数据仓库进行业务分析:一名大数据工程师的视角

在大数据时代&#xff0c;数据的有效利用对企业的成功至关重要。 本文将基于上面的流程图&#xff0c;详细介绍如何利用数据仓库进行业务分析&#xff0c;并提供实际的例子和代码演示&#xff0c;以帮助读者更好地理解和应用相关技术。 数据仓库的基本流程 上图展示了一个典…

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验6 生成树协议STP的功能

一、实验目的 1.验证以太网交换机生成树协议的功能&#xff1b; 2.理解网络环路对网络的负面效应&#xff1b; 3.理解生成树协议的作用。 二、实验要求 1.使用Cisco Packet Tracer仿真平台&#xff1b; 2.观看B站湖科大教书匠仿真实验视频&#xff0c;完成对应实验。 三、实…