点餐平台网站

@TOC

springboot0763点餐平台网站

第1章 概述

1.1 研究背景

随着现代网络技术发展,对于点餐平台网站现在正处于网络发展的阶段,所以对它的要求也是比较严格的,要从这个系统的功能和用户实际需求来进行对系统制定开发的发展方式,依靠网络技术的的快速发展和现代通讯技术的结合为用户带来方便,可以方便管理员网上管理,点餐平台网站信息,还可以通过这些技术实现发布点餐平台网站等过程。当今社会互联网急速发展,电子商务系统也在国内爆炸式的发展起来。这种网络模式对长期使用互联网社会产生了深远的影响,在这种社会环境下开发一个适用于用户都可以操作的、简单的、便捷的点餐平台网站的发展前景是非常好的。

点餐平台网站是一个典型的管理系统,在整个系统的发展来看包括数据库的设计、分析、连接、功能实现和系统维护以及用户的正确操作方式,对于上述的问题我们根据用户的实际情况来设计出一个典型的点餐平台网站,在一定的基础上保证了这个系统的完整性和安全性。在整个系统程序当中的功能我们要保证用户方便使用而且易于操作的特点。在当今社会当中随着现代科学技术网络的快速发展和用户对网络技术意识不断提高,网络给用户带来强大的功能早已经被用户所接受,就拿这个点餐平台网站来说,在整个系统当中开发它的要求是越来越高,同时所用的软件环境也是要不断提高。对于这个点餐平台网站来说它已经满足现代化的信息化、潮流化的管理。能够有效的提高点餐平台网站人员的工作效率和工作信心。

1.2 研究目的

为了解决好这个点餐平台网站,也更好的能够维护点餐平台网站中出现的问题,同时也能够让用户能够正确的了解本点餐平台网站。所以设计本系统。

本系统主要根据用户的需求做出分析,让用户更好的在线查看菜品信息等,管理员后台管理系统数据等功能。从这个系统的操作来说,能够有效的进行信息的添加、修改、查询、删除一些点餐平台网站信息,在一定的程序上能够实现了自动化。设计该系统的主要目的是为实现通过网络来减少人力和财力的投入,不断提高工作效率。最终我们希望通过点餐平台网站可以达到以下目的:

提高点餐平台网站的管理效率,实现管理上的井井有条。

实现用户通过计算机平台及时查看网站点餐平台网站信息,实现点餐平台网站等。

解决传统点餐平台网站存在的弊端。

1.3 研究内容

在目前所使用的软件开发主要是应用的java,点餐平台网站开发来看它具有很大的意义,具体该系统的主要任务是:

(1)对于这个系统网络环境它主要是让用户学会多种需求和业务上的流程以及各个角色的功能问题,同时对每一个业务和技术做出了解。

(2)对于这系统的整个程序应用做出高效的升级、扩展和维护。

(3)掌握系统的整体设计和结构计划,在一定的需求方面上满足用户的需求,确保在各个层次当中各功能的紧密配合后最终的功能实现,同时保证这个程序的独立性和各层次之间的紧密联系。

(4)在整个系统框架的设计我们要进行深入的学习和设计,保证这个系统在使用过程中的灵活性和了扩展性,同时不断提高系统的安全性和满足用户的实际需求。

从这个点餐平台网站来看主要是满足用户的各自需求,同时根据这两方面进行了深入的研究,就拿本系统来说主要是对点餐平台网站的背景选题意义、市场需求、数据库分析、功能模块的介绍和所用的开发技术来进行研发和介绍的。最后在对该系统做出测试分析和总结。

第二章开发技术介绍

2.1相关技术

点餐平台网站是在Java + MySQL开发环境的基础上开发的。Java是一种服务器端脚本语言,易于学习,实用且面向用户。全球超过35%的Java驱动的互联网站点使用Java。MySQL是一个数据库管理系统,因为它的体积小但速度快,成本低,或者开源受到中小型网站的青睐。因此,Java + MySQL作为一个成熟的开发环境,可以满足点餐平台网站设计和开发所需的稳定性,安全性和可扩展性要求。

2.2 JAVA技术

JAVA语言是目前软件市场上应用最广泛的语言开发程序。可以在多种平台上运用的,兼容性比较强,适应市面上大多数操作系统,不会出现乱码的现像,其扩展性和维护性都更好,具有分析问题和解决问题的能力,是面向过程的程序设计方便我们编写的代码更强壮。

JAVA相对其它语言来说,比较简单,编译起来更方便一些,安全可靠性高。不完全统计,现在全世界大约有2000多万人在使用它,JAVA既可以镶嵌使用又可以独力的使用。JAVA大致可以分成两个部分,一种部分是JAVA负责的编译,另一种是JAVA负责的运行。JAVA和C++语言很相像,但JAVA在编程时是一种以对象为导向的方式来进行编译的,使得编出来的软件可以单机使用,也可以在互联网上使用,检查出错更为方便。JAVA分布式、体系结构中立的特点也使得其存储更快,编议更简单。面向对象包括四个特点,一是封装,就是说在定义类的时候可以实现一定的功能和属性。二是抽象,属于类的一种,可以把一个具有共同属性的类封装在一个抽象里,便于简单编议。三是继承,顾名思义就是带有前者的特性。还有一个就是多态的特点,可以多种一起运用,表现了它可扩展性好。

2.3 MySQL数据库

数据库是系统开发过程中不可或缺的一部分。 在WEB应用方面,MySQL AB开发了一个具有很大优势的MySQL关系数据库管理系统。 MySQL可以将数据存储在不同的表中,这非常灵活,并且还可以提高系统在实际应用中的速度。 数据库访问最常用于标准SQL语言,MySQL用于SQL语言,因此它具有高度兼容性。数据库的操作是必不可少的,包括对数据库表的增加、删除、修改、查询等功能。现如今,数据库可以分为关系型数据库和非关系型数据库,Mysql属于关系性数据库,Mysql数据库是一款小型的关系型数据库,它以其自身特点:体积小、速度快、成本低等,Mysql数据库是目前最受欢迎的开源数据库。

在WEB应用技术中, Mysql数据库支持不同的操作系统平台,虽然在不同平台下的安装和配置都不相同,但是差别也不是很大,Mysql在Windows平台下两种安装方式,二进制版和免安装版。安装完Mysql数据库之后,需要启动服务进程,相应的用户就可以连接数据库,用户可通过命令行或者图形界面工具登录数据库。

2.4 Tomcat介绍

Tomcat 虽然是Apache的扩展,但是它们都是可以独立运行的,二者是不互相干扰的。当配置正确的时候,Apache服务器为HTML页面的运行提供技术支持,Tomcat 的任务则是运行Servle和Java 页面。Tomca也具有一定的HTML页面处理功能。Tomcat属于一种轻型的服务器,所以说在中小网站中并不具有普适性。但是当程序员需要开发或调试Java 程序时,则通常会将该服务器作为首选。对于一个仅具有计算机基础知识的人来说,计算机系统具有一个好的Apache服务器,可以很好的对HTML 页面进行访问。Tomcat是非常受欢迎的服务器,因为它具有较好的扩展性,而且在运行的时候不需要太多的系统资源,拥有程序员所需要的收发邮件功能,还能够支持负载平衡,该程序能够不断的更新,程序员能够根据自己的需要增加新的功能。

2.5 SpringBoot框架

Spring Boot是Pivotal团队的一个新框架,旨在简化新Spring应用程序的初始设置和开发。该框架使用特定的配置方法,无需开发人员定义样板配置。通过这种方式,Spring Boot旨在成为蓬勃发展的快速应用程序开发领域的领导者。 Spring Boot特点: 1、创建一个单独的Spring应用程序; 2、嵌入式Tomcat,无需部署WAR文件; 3、简化Maven配置; 4、自动配置Spring; 5、提供生产就绪功能,如指标,健康检查和外部配置; 6、绝对没有代码生成和XML的配置要求; 安装步骤: 最基本的是,Spring Boot是一个可以被任何项目的构建系统使用的库集合。 为简单起见,该框架还提供了一个命令行界面,可用于运行和测试Boot应用程序。 可以从Spring存储库手动下载和安装框架的已发布版本,包括集成的CLI(命令行界面)。 更简单的方法是使用Groovy enVironment Manager(GVM),它负责处理Boot版本的安装和管理。 可以从GVM命令行GVM install springboot安装Boot及其CLI。 在OS X上安装Boot时可以使用Homebrew包管理器。要完成安装,首先使用brew tap pivotal / tap切换到pivotal存储库,然后执行brew install springboot命令。

第三章 系统分析

整个系统的功能模块主要是对各个项目元素组合、分解和更换做出对应的单元,最后在根据各个系统模块来做出一个简单的原则,系统的整体设计是根据用户的需求来进行设计的。为了更好的服务于用户要从点餐平台网站的设计与实现方面上做出相应的功能模块和内部信息保持一致的联系。所以我们在设计时候要避免一些代码的相互的重复和耦合的情况发生。

3.1 可行性分析

可行性分析主要是针对这个项目开发是否有意义和价值观来进行的全面分析,在分析的过程当中发现这个系统所存在的不足之处。就拿这次点餐平台网站的设计与实现来说主要是针对一些用户在发布点餐平台网站信息时遇到不方便的操作和问题来进行解决问题的,最后能够让点餐平台网站开发得到最大的用处。而且对于用户方面我们可以提供给一个简单方便操作的点餐平台网站。所以我们要计算开发这个系统它能否有效的解决好这个系统经济问题,在开发完成以后所带来的利益是否大于开发过成当中的成本。所以可行性的研究与分析是这个系统在开发和设计上是必不可缺少的一部分。从该系统文章的全部来看,我们要从以下几个方面进行分析:

技术可行性:在技术方面我们要从现有自己掌握的技术能否设计出我们当初所预定的目标。

经济可行性:在这次系统开发和设计过程当中所用的经费是否大于以后给社会带来的价值观。

操作可行性:系统在用户使用过程当中是否方便、简单,能否达到大部分的用户会使用。

3.1.1 技术可行性

技术的可行性分析主要是针对开发该系统所用到技术进行分析,对于点餐平台网站的设计,可以在任何一个地方都进行使用和管理。通过当前我们所学的程序开发和语言介绍利用以上的技术开发该系统是比较合适的。而且我们在使用的数据库也是要保证这个系统的完整性、数据安全性好的条件。

3.1.2 经济可行性

经济可行性主要是决定这个系统是否具有价值存在,是否具有开发意义,如果开发的项目不能够节约物品和资源,反而使用的大量的人力、财力和物力不成正比甚至小于投资成本,那么该项目是不具备开发意义和价值的。在开发本项目的初期,节约成本是最基本的,设计和开发都是由本人一人完成的,并且在开发中使我学习到了很多的知识,也开拓了自己的眼界,在通过可行性分析之后,该项目的利大于弊,所以该项目是具有开发意义和价值的。

3.1.3 操作可行性

点餐平台网站的开发登录界面它是我们最常见的一种登录窗口来完成的,用户可以使电脑来进行登录并简单的访问不需要做任何的操作。对于此次的系统开发它主要是基于Spring Boot框架和java技术及MySQL数据库来完成,让系统开发更加完美和完善,所以我们开出的系统界面更加人性化,用户使用也更加方便。而且系统在使用过程当中也拥有方便操作、易管理等特点。

经过以上的叙述,所以开发此系统在经济上、技术上是满足开发条件的。

3.2 系统性能分析

1.如果我们想要对前后台处理的层次分明那么我们就要采用Spring Boot框架来进行系统的开发这样就可以方便用户的使用。

2.对于系统的开发和设计我们就要采用大家日常所需要的要求,这样一来可以提高系统的适用性也能保证系统利用价值。对于一个系统来说一个好的框架是很重要的,因为一个好的框架它可以提高系统的稳定和高效性。

3.在系统界面上也要设计一个方便快捷的登录界面,这样就可以提高用户对系统操作性和适用性。

4.在系统模块设计当中我们要对系统各个模块进行合理简化和设计,这样就能提高系统使用性。

5.对于一个完整的系统来说对于它的测评和测试是比较重要的,所以我们在软件设计程序中要保持软件占用的时间和速度快的特点。

6.对于这个系统来说我们首先要考虑所设计出的系统它具有那些突破和体现,所以我们尽力去改进这个系统去适应用户。

3.3 系统功能需求分析

对于一个新的网站来说开发新网站我们就要做出这个系统的任务需求分析,因为对系统分析的质量好坏它可以决定这个网站开发的意义,俗话说得好一个好的开头是成功的一半,对于开发这个点餐平台网站来说前期的分析是比较重要的,所以任务分析它可以决定这系统的开展和设计,这样就可以保证用户满意性。

任务的需求它能决定这个系统开发过程当中一个重要环节,所以我们在系统开发过程所用质量是比较重要的,因为我们在系统应用过程当中不一定那会出现问题,所以我们在进行对系统分析是比较重要的,因为它可以决定这个系统功能和需求。

本课题要求实现一套点餐平台网站的开发与实现,主要实现功能包括管理员:首页、个人中心、用户管理、菜品分类管理、菜品信息管理、菜品评价管理、系统管理、订单管理,用户;首页、个人中心、菜品评价管理、我的收藏管理、订单管理。

(1)管理员用例需求如图3-1所示:

图3-1管理员用例需求图

  1. 用户用例需求如图3-2所示:

图3-2用户用例图

3.4 业务流程分析

在系统流程分析当中调查分析它是比较重要的环节,因为在这个系统当中它都涉及到每个环节的业务流程,所以从点餐平台网站的整体设计上要保证各个信息的正确输入和输出以及对数据储存的完整,并结合实际的操作步骤来绘制出具体的流程图。具体流程图如下图3-3所示:

图3-3系统开发流程图

3.4.1登录流程

为了保证系统的安全,用户要想进入点餐平台网站必须进行登录操作,用户登录流程图如图3-4所示

图3-4 登录流程图

第四章 系统设计

4.1 系统的功能结构图

通过系统需求分析,本点餐平台网站的功能结构设计如图4-1所示:

图4-1 系统功能图

4.2 系统数据库设计

4.2.1 数据库E-R图

在该系统的信息中,由于数据库的支持,我们可以对数据库进行收集、整理、更新和加工等操作。由于数据库的存储功能强大,所以数据库已经成为了计算机必不可少的一部分,一个数据库的好坏直接影响该系统的质量和效率。一个系统中的数据库是必不可少的,并且起着决定性因素。通过之前的系统分析,可以规划出本系统中使用的主要等,下面设计出这几个关键实体的实体关系图:

(1)菜品信息实体E-R图如图4-2所示:

图4-2 菜品信息实体图

(2)订单信息实体E-R图如图4-3所示:

图4-3 订单信息实体图

(3)菜品评价信息实体E- R图,如图4-4所示:

图4-4菜品评价信息实体图

4.2.2 数据表字段设计

每个数据库的使用都是隔开的,当它们在程序中运行时,他们就会与自己相关的协议和用户端进行通讯。而且系统会自动将这些数据进行连接。如果我们想要对某个数据库进行了解,那么我们就应选择该桥段,然后就会自动讲解。在点击完成按钮之后就会自动在对话框内弹出数据源的名称,然后进行下一步操作,输入正确的密码和账号进行登录。根据系统功能设计的要求和功能模块的划分,点餐平台网站的设计与实现一共涉及到多个数据表。下面就介绍一下各别主要数据库表的设计结构及其功能建立数据库表:

表4-1 allusers表

列名 数据类型 长度 约束
id int 11 NOT NULL
username varchar 50 default NULL
pwd varchar 50 default NULL
cx varchar 50 default NULL

表4-2 caipinpingjia表

列名 数据类型 长度 约束
id int 11 NOT NULL
addtime varchar 50 default NULL
dingdanbianhao varchar 50 default NULL
caipinmingcheng varchar 50 default NULL
caipinfenlei varchar 50 default NULL
pingfen varchar 50 default NULL
tianjiatupian varchar 50 default NULL
pingjianeirong varchar 50 default NULL
pingjiariqi varchar 50 default NULL
yonghuming varchar 50 default NULL
sfsh varchar 50 default NULL
shhf varchar 50 default NULL

表4-3:caipinxinxi表

列名 数据类型 长度 约束
id int 11 NOT NULL
addtime varchar 50 default NULL
caipinmingcheng varchar 50 default NULL
caipinfenlei varchar 50 default NULL
tupian varchar 50 default NULL
cailiao varchar 50 default NULL
fenliang varchar 50 default NULL
caipinjieshao varchar 50 default NULL

表4-4:yonghu表

列名 数据类型 长度 约束
id int 11 NOT NULL
addtime varchar 50 default NULL
yonghuming varchar 50 default NULL
mima varchar 50 default NULL
xingming varchar 50 default NULL
touxiang varchar 50 default NULL
xingbie varchar 50 default NULL
lianxidianhua varchar 50 default NULL

第五章 系统功能实现

5.1管理员登录

管理员登录,通过填写用户名、密码、角色等信息,输入完成后选择登录即可进入点餐平台网站,如图5-1所示。

5.2管理员功能实现 图5-1管理员登录界面图

5.2.1 用户管理

管理员对用户管理获取用户名、姓名、头像、性别、联系电话并进行详情、删除、修改。用户管理效果图如图5-2所示。

图5-2用户管理界面图

5.2.2 菜品分类管理

管理员对菜品分类管理查看菜品分类等信息进行详情、删除、修改操作。菜品分类管理效果图如图5-3所示。

图5-3菜品分类管理界面图

5.2.3轮播图管理

轮播图;该页面为轮播图管理界面。管理员可以在此页面进行首页轮播图的管理,通过新建操作可在轮播图中加入新的图片,还可以对以上传的图片进行修改操作,以及图片的删除操作。轮播图管理效果图如图5-4所示。

图5-4轮播图管理界面图

5.2.4 菜品信息管理

管理员对菜品信息管理进行查看菜品名称、菜品分类、图片、材料、份量、价格等信息进行详情、删除、修改操作。菜品信息管理效果图如图5-5所示。

图5-5菜品信息管理界面图

5.2.5 菜品资讯

管理员对菜品资讯进行查看标题、简介、图片等信息进行详情、删除、修改操作。菜品资讯效果图如图5-6所示。

图5-6菜品资讯界面图

5.2.6订单管理

管理员对订单管理进行查看订单编号、商品名称、商品图片、购买数量、价格/积分、折扣价格、总价格/总积分、折扣总价格、支付类型、状态、地址等信息进行详情、删除、修改操作。订单管理效果图如图5-7所示。

图5-7订单管理界面图

5.2.7菜品评价管理

管理员对菜品评价管理进行查看订单编号、菜品名称、菜品分类、评分、添加图片、评价内容、评价日期、用户名、审核回复、审核状态、审核等信息进行详情、删除、修改操作。菜品评价管理效果图如图5-8所示。

图5-8菜品评价管理界面图

5.3用户功能实现

点餐平台网站,在系统可以查看首页、个人中心、菜品评价管理、我的收藏管理、订单管理等内容,如图5-9所示。

图5-9用户功能界面图

5.3.1菜品评价管理

用户对菜品评价管理进行查看订单编号、菜品名称、菜品分类、评分、添加图片、评价内容、评价日期、用户名、审核回复、审核状态并进行详情、修改操作,如图5-10所示。

图5-10菜品评价管理界面图

5.3.2订单管理

用户对订单管理进行查看订单编号、商品名称、商品图片、购买数量、价格/积分、折扣价格、总价格/总积分、折扣总价格、支付类型、状态、地址并进行详情操作如图5-11所示。

图5-11订单管理界面图

5.4前台首页功能实现

5.4.1 点餐平台网站,在系统首页可以查看首页、菜品信息、菜品资讯、个人中心、后台管理、购物车、在线客服等内容,如图5-12所示。

图5-12系统功能界面图

5.4.2、用户登录、用户注册,在注册页面通过填写用户名、密码、姓名、联系电话等内容进行注册、登录,如图5-13所示。

图5-13用户注册、用户登录界面图

5.4.3菜品信息,在菜品信息页面通过查看菜品名称、菜品分类、图片、材料、份量、价格等信息进行添加到购物车、立即购买,如图5-14所示。

图5-14菜品信息界面图

5.4.4个人中心,在个人中心页面中可以填写用户名、密码、姓名、性别、联系电话、余额等信息进行更新信息、退出登录,如图5-15所示。

图5-15个人中心界面图

5.4.5收货地址添加,在收货地址添加页面中可以填写联系人、手机号码、默认地址、选择地址等详细信息进行添加,如图5-16所示。

图5-16收货地址添加界面图

CaipinxinxiController.java
package com.controller;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;

import com.utils.ValidatorUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.annotation.IgnoreAuth;

import com.entity.CaipinxinxiEntity;
import com.entity.view.CaipinxinxiView;

import com.service.CaipinxinxiService;
import com.service.TokenService;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.MD5Util;
import com.utils.MPUtil;
import com.utils.CommonUtil;


/**
 * 菜品信息
 * 后端接口
 * @author 
 * @email 
 * @date 2021-03-22 15:00:19
 */
@RestController
@RequestMapping("/caipinxinxi")
public class CaipinxinxiController {
    @Autowired
    private CaipinxinxiService caipinxinxiService;
    


    /**
     * 后端列表
     */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params,CaipinxinxiEntity caipinxinxi,
		HttpServletRequest request){
        EntityWrapper<CaipinxinxiEntity> ew = new EntityWrapper<CaipinxinxiEntity>();
		PageUtils page = caipinxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, caipinxinxi), params), params));

        return R.ok().put("data", page);
    }
    
    /**
     * 前端列表
     */
	@IgnoreAuth
    @RequestMapping("/list")
    public R list(@RequestParam Map<String, Object> params,CaipinxinxiEntity caipinxinxi, HttpServletRequest request){
        EntityWrapper<CaipinxinxiEntity> ew = new EntityWrapper<CaipinxinxiEntity>();
		PageUtils page = caipinxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, caipinxinxi), params), params));
        return R.ok().put("data", page);
    }

	/**
     * 列表
     */
    @RequestMapping("/lists")
    public R list( CaipinxinxiEntity caipinxinxi){
       	EntityWrapper<CaipinxinxiEntity> ew = new EntityWrapper<CaipinxinxiEntity>();
      	ew.allEq(MPUtil.allEQMapPre( caipinxinxi, "caipinxinxi")); 
        return R.ok().put("data", caipinxinxiService.selectListView(ew));
    }

	 /**
     * 查询
     */
    @RequestMapping("/query")
    public R query(CaipinxinxiEntity caipinxinxi){
        EntityWrapper< CaipinxinxiEntity> ew = new EntityWrapper< CaipinxinxiEntity>();
 		ew.allEq(MPUtil.allEQMapPre( caipinxinxi, "caipinxinxi")); 
		CaipinxinxiView caipinxinxiView =  caipinxinxiService.selectView(ew);
		return R.ok("查询菜品信息成功").put("data", caipinxinxiView);
    }
	
    /**
     * 后端详情
     */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") Long id){
        CaipinxinxiEntity caipinxinxi = caipinxinxiService.selectById(id);
		caipinxinxi.setClicknum(caipinxinxi.getClicknum()+1);
		caipinxinxi.setClicktime(new Date());
		caipinxinxiService.updateById(caipinxinxi);
        return R.ok().put("data", caipinxinxi);
    }

    /**
     * 前端详情
     */
	@IgnoreAuth
    @RequestMapping("/detail/{id}")
    public R detail(@PathVariable("id") Long id){
        CaipinxinxiEntity caipinxinxi = caipinxinxiService.selectById(id);
		caipinxinxi.setClicknum(caipinxinxi.getClicknum()+1);
		caipinxinxi.setClicktime(new Date());
		caipinxinxiService.updateById(caipinxinxi);
        return R.ok().put("data", caipinxinxi);
    }
    



    /**
     * 后端保存
     */
    @RequestMapping("/save")
    public R save(@RequestBody CaipinxinxiEntity caipinxinxi, HttpServletRequest request){
    	caipinxinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
    	//ValidatorUtils.validateEntity(caipinxinxi);
        caipinxinxiService.insert(caipinxinxi);
        return R.ok();
    }
    
    /**
     * 前端保存
     */
    @RequestMapping("/add")
    public R add(@RequestBody CaipinxinxiEntity caipinxinxi, HttpServletRequest request){
    	caipinxinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
    	//ValidatorUtils.validateEntity(caipinxinxi);
        caipinxinxiService.insert(caipinxinxi);
        return R.ok();
    }

    /**
     * 修改
     */
    @RequestMapping("/update")
    public R update(@RequestBody CaipinxinxiEntity caipinxinxi, HttpServletRequest request){
        //ValidatorUtils.validateEntity(caipinxinxi);
        caipinxinxiService.updateById(caipinxinxi);//全部更新
        return R.ok();
    }
    

    /**
     * 删除
     */
    @RequestMapping("/delete")
    public R delete(@RequestBody Long[] ids){
        caipinxinxiService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }
    
    /**
     * 提醒接口
     */
	@RequestMapping("/remind/{columnName}/{type}")
	public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, 
						 @PathVariable("type") String type,@RequestParam Map<String, Object> map) {
		map.put("column", columnName);
		map.put("type", type);
		
		if(type.equals("2")) {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			Calendar c = Calendar.getInstance();
			Date remindStartDate = null;
			Date remindEndDate = null;
			if(map.get("remindstart")!=null) {
				Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
				c.setTime(new Date()); 
				c.add(Calendar.DAY_OF_MONTH,remindStart);
				remindStartDate = c.getTime();
				map.put("remindstart", sdf.format(remindStartDate));
			}
			if(map.get("remindend")!=null) {
				Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
				c.setTime(new Date());
				c.add(Calendar.DAY_OF_MONTH,remindEnd);
				remindEndDate = c.getTime();
				map.put("remindend", sdf.format(remindEndDate));
			}
		}
		
		Wrapper<CaipinxinxiEntity> wrapper = new EntityWrapper<CaipinxinxiEntity>();
		if(map.get("remindstart")!=null) {
			wrapper.ge(columnName, map.get("remindstart"));
		}
		if(map.get("remindend")!=null) {
			wrapper.le(columnName, map.get("remindend"));
		}


		int count = caipinxinxiService.selectCount(wrapper);
		return R.ok().put("count", count);
	}
	
	/**
     * 前端智能排序
     */
	@IgnoreAuth
    @RequestMapping("/autoSort")
    public R autoSort(@RequestParam Map<String, Object> params,CaipinxinxiEntity caipinxinxi, HttpServletRequest request,String pre){
        EntityWrapper<CaipinxinxiEntity> ew = new EntityWrapper<CaipinxinxiEntity>();
        Map<String, Object> newMap = new HashMap<String, Object>();
        Map<String, Object> param = new HashMap<String, Object>();
		Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator();
		while (it.hasNext()) {
			Map.Entry<String, Object> entry = it.next();
			String key = entry.getKey();
			String newKey = entry.getKey();
			if (pre.endsWith(".")) {
				newMap.put(pre + newKey, entry.getValue());
			} else if (StringUtils.isEmpty(pre)) {
				newMap.put(newKey, entry.getValue());
			} else {
				newMap.put(pre + "." + newKey, entry.getValue());
			}
		}
		params.put("sort", "clicknum");
        params.put("order", "desc");
		PageUtils page = caipinxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, caipinxinxi), params), params));
        return R.ok().put("data", page);
    }


}

DiscusscaipinxinxiServiceImpl.java
package com.service.impl;

import org.springframework.stereotype.Service;
import java.util.Map;
import java.util.List;

import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.utils.PageUtils;
import com.utils.Query;


import com.dao.DiscusscaipinxinxiDao;
import com.entity.DiscusscaipinxinxiEntity;
import com.service.DiscusscaipinxinxiService;
import com.entity.vo.DiscusscaipinxinxiVO;
import com.entity.view.DiscusscaipinxinxiView;

@Service("discusscaipinxinxiService")
public class DiscusscaipinxinxiServiceImpl extends ServiceImpl<DiscusscaipinxinxiDao, DiscusscaipinxinxiEntity> implements DiscusscaipinxinxiService {
	
	
    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        Page<DiscusscaipinxinxiEntity> page = this.selectPage(
                new Query<DiscusscaipinxinxiEntity>(params).getPage(),
                new EntityWrapper<DiscusscaipinxinxiEntity>()
        );
        return new PageUtils(page);
    }
    
    @Override
	public PageUtils queryPage(Map<String, Object> params, Wrapper<DiscusscaipinxinxiEntity> wrapper) {
		  Page<DiscusscaipinxinxiView> page =new Query<DiscusscaipinxinxiView>(params).getPage();
	        page.setRecords(baseMapper.selectListView(page,wrapper));
	    	PageUtils pageUtil = new PageUtils(page);
	    	return pageUtil;
 	}
    
    @Override
	public List<DiscusscaipinxinxiVO> selectListVO(Wrapper<DiscusscaipinxinxiEntity> wrapper) {
 		return baseMapper.selectListVO(wrapper);
	}
	
	@Override
	public DiscusscaipinxinxiVO selectVO(Wrapper<DiscusscaipinxinxiEntity> wrapper) {
 		return baseMapper.selectVO(wrapper);
	}
	
	@Override
	public List<DiscusscaipinxinxiView> selectListView(Wrapper<DiscusscaipinxinxiEntity> wrapper) {
		return baseMapper.selectListView(wrapper);
	}

	@Override
	public DiscusscaipinxinxiView selectView(Wrapper<DiscusscaipinxinxiEntity> wrapper) {
		return baseMapper.selectView(wrapper);
	}

}

FileController.java
package com.controller;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.UUID;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import com.annotation.IgnoreAuth;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.entity.ConfigEntity;
import com.entity.EIException;
import com.service.ConfigService;
import com.utils.R;

/**
 * 上传文件映射表
 */
@RestController
@RequestMapping("file")
@SuppressWarnings({"unchecked","rawtypes"})
public class FileController{
	@Autowired
    private ConfigService configService;
	/**
	 * 上传文件
	 */
	@RequestMapping("/upload")
	public R upload(@RequestParam("file") MultipartFile file,String type) throws Exception {
		if (file.isEmpty()) {
			throw new EIException("上传文件不能为空");
		}
		String fileExt = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")+1);
		File path = new File(ResourceUtils.getURL("classpath:static").getPath());
		if(!path.exists()) {
		    path = new File("");
		}
		File upload = new File(path.getAbsolutePath(),"/upload/");
		if(!upload.exists()) {
		    upload.mkdirs();
		}
		String fileName = new Date().getTime()+"."+fileExt;
		File dest = new File(upload.getAbsolutePath()+"/"+fileName);
		file.transferTo(dest);
		if(StringUtils.isNotBlank(type) && type.equals("1")) {
			ConfigEntity configEntity = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "faceFile"));
			if(configEntity==null) {
				configEntity = new ConfigEntity();
				configEntity.setName("faceFile");
				configEntity.setValue(fileName);
			} else {
				configEntity.setValue(fileName);
			}
			configService.insertOrUpdate(configEntity);
		}
		return R.ok().put("file", fileName);
	}
	
	/**
	 * 下载文件
	 */
	@IgnoreAuth
	@RequestMapping("/download")
	public ResponseEntity<byte[]> download(@RequestParam String fileName) {
		try {
			File path = new File(ResourceUtils.getURL("classpath:static").getPath());
			if(!path.exists()) {
			    path = new File("");
			}
			File upload = new File(path.getAbsolutePath(),"/upload/");
			if(!upload.exists()) {
			    upload.mkdirs();
			}
			File file = new File(upload.getAbsolutePath()+"/"+fileName);
			if(file.exists()){
				/*if(!fileService.canRead(file, SessionManager.getSessionUser())){
					getResponse().sendError(403);
				}*/
				HttpHeaders headers = new HttpHeaders();
			    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);    
			    headers.setContentDispositionFormData("attachment", fileName);    
			    return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return new ResponseEntity<byte[]>(HttpStatus.INTERNAL_SERVER_ERROR);
	}
	
}

IndexAside.vue
<template>
  <el-aside class="index-aside" width="200px">
    <div class="index-aside-inner">
      <el-menu default-active="1">
        <el-menu-item @click="menuHandler('/')" index="1">
          <!-- <i class="el-icon-s-home"></i> -->
          首页
        </el-menu-item>
        <sub-menu
          v-for="menu in menuList"
          :key="menu.menuId"
          :menu="menu"
          :dynamicMenuRoutes="dynamicMenuRoutes"
        ></sub-menu>
      </el-menu>
    </div>
  </el-aside>
</template>
<script>
import SubMenu from "@/components/index/IndexAsideSub";
export default {
  data() {
    return {
      menuList: [],
      dynamicMenuRoutes: []
    };
  },
  components: {
    SubMenu
  },
  mounted() {
    // 获取动态菜单数据并且渲染
    this.menuList = JSON.parse(sessionStorage.getItem("menuList") || "[]");
    this.dynamicMenuRoutes = JSON.parse(
      sessionStorage.getItem("dynamicMenuRoutes") || "[]"
    );
  },
  methods: {
    menuHandler(path) {
      this.$router.push({ path: path });
    }
  }
};
</script>
<style lang="scss" scoped>
.index-aside {
  margin-top: 80px;
  overflow: hidden;
  .index-aside-inner {
    width: 217px;
    height: 100%;
    overflow-y: scroll;
  }
}
</style>