如何使用ssm实现校园美食交流系统+vue

news2024/11/15 21:22:50

@TOC

ssm026校园美食交流系统+vue

第1章 概述

1.1 研究背景

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

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

1.2 研究目的

为了解决好这个校园美食交流系统,也更好的能够维护校园美食交流系统中出现的问题,同时也能够让用户能够正确的了解本校园美食交流系统。所以设计本系统。

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

提高校园美食交流系统的管理效率,实现管理上的井井有条。

实现用户通过计算机平台及时更新校园美食交流系统信息,实现校园美食交流系统等。

解决传统校园美食交流系统存在的弊端。

1.3 研究内容

在目前所使用的软件开发主要是应用的java,校园美食交流系统开发来看它具有很大的意义,具体该系统的主要任务是:

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

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

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

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

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

第二章 开发技术介绍

2.1 Java技术

Java技术它是一个容易让人学会和使用的一门服务器语言。它在编程的过程当中只需要很少的知识就能建立起一个真正的交互站点。对于这个教程来说它并不需要你完全去了解这种语言,只要能快速融入web站点就可以,还可以进行一些基本知识的编程就可以。

现代社会中,使用Java语言做动态网页是最常用的,主要是Java比较简单易懂,用户掌握的web 服务器编写脚本。Java语言技术在编程技术中具有一定的安全性和跨平台性功能,并且它可以直接支持分布式的网络应用和效率。在Java语言技术当中它的功能是方便简单的。对于这个语言技术来说它就像万花筒一样在进行开发的时候可以随机进行组合最后变成不同颜色的花瓣。随着现在互联网的快速发展和电子商务的不断发展,在各行各业的设施基础上都开始应用到了计算机,对于过去传统的的管理方式和客户需求都不能满足现在正常的供求关系,所以我们必须通过添加现在的新技术来满足客户的需求。从目前来看,Java技术已经在动态网页中应用的是比较广泛的一门技术。

Java语言具有非常多种的特性:(1)跨平台的无关性;(2)面向对象; (3)安全性得以保障;(4)支持多个任务;(5)多种编写方式,代码编写简单。对比其他的低级语言、高级语言,Java语言具有明显的显著优势以及未来开阔的前景,可以广泛的应用在个人笔记本电脑、大数据、大型游戏等等。

Java语言具有面向对象的特性,并且易于理解。关于对象,其实可以理解成每一种事物都是一种对象,包括我们人类自身都是一种对象。利用面向对象语言的基本特征来解决软件开发中的实际问题,为有效软件开发提供了技术支持。

2.2 Mysql数据库

Mysql是一个多用户、多线程的服务器,采用SQL的数据库,数据库管理系统是基于SQL的客户以及服务器模式的关系,它的优点有强大的功能、操作简单、管理方便、可靠安全、运行较快、多线程、跨平台性、完全网络化、稳定性等,非常适合Web站点或者其他应用软件,在数据库后端的开发。此外,利用许多语言,可以编写和访问Mysql数据库的程序。Mysql数据库也是开放源代码的,开发者越来越喜欢使用Mysql关系数据库,应用范围也被推而广之。这是由于速度快和易用性, Web站点或应用软件的数据库后端的开发也都在使用它。

mysql 数据库它有很多的优点,例如它在操作上能够让人通俗易懂、功能强大、信息储存量高等优点。所以被用户广泛应用,对于mysql数据库来说它一般主要是对数据进行编码和查询,而且在很多的设计当中都应用到了该数据库,在此过程当中我们可以对常规的数据进行查询和组合,所以我们在进行使用mysql数据库的时候只要对编写一小段的数据就能实现相应的功能。数据库,就是数据存储的储藏室,只不过数据是存储在计算机上的,而不是现实中的储藏室,数据的存放是按固定格式,而不是无序的,则定义就是 :长期有固定格式,可以共享的存储在计算机存储器上。数据库管理主要包括数据表的建立,数据存储、修改和增加数据,为了使数据库系统能够正常运行,相关人员进行的管理工作。数据表的建立,可以对数据表中的数据进行调整,数据的重新组合及重新构造,保证数据的安全性。

2.3 B/S结构

BROWSER/SERVER程序架构方式是使用电脑中安装的各种浏览器来进行访问和使用的,相比C/S的程序结构不需要进行程序的安装就可以直接使用。BROWSER/SERVER架构的运行方式是在远程的服务器上进行安装一个,然后在任何接入互联网的电脑上访问和使用。BROWSER/SERVER架构的开发方式给用户带来了极大的便利,在任何时间和地点都可以使用开发的程序系统。

在B/S的结构中,用户可以在任何可以上网的地方访问和使用系统网站的功能,没有地域和时间等方面的限制,B/S结构是把程序完整放置到计算机网络的服务器上,通过计算机互联网给用户提供远程的网络服务。在三层体系结构的B/S系统中,通过浏览器,会员可以对很多服务器发出请求, B/S系统会很大程度的降低工作量,用户只需要安装运行较少的客户端即可,大量的工作将由服务器承担,另外,服务器也完成包括访问数据库,执行应用程序的工作等等。

B/S结构主要有三层,分别为数据层、控制逻辑层和视图层。用户通过视图层,让控制层调用数据层的数据,从而达到整个访问过程。三层相互独立,维护方便,使用安全,三层有互相调用,提高效率。

2.4 SSM框架

当今流行的“SSM组合框架”是Spring + SpringMVC + MyBatis的缩写,受到很多的追捧,“组合SSM框架”是强强联手、各司其职、协调互补的团队精神。web项目的框架,通常更简单的数据源。Spring属于一个轻量级的反转控制框架(IoC),但它也是一个面向表面的容器(AOP)。SpringMVC常常用于控制器的分类工作模式,与模型对象分开,程序对象的作用与自动取款机进行处理。这种解耦治疗使整个系统的个性化变得更加容易。MyBatis是一个良好的可持续性框架,支持普通SQL查询,同时允许对存储过程的高级映射进行数据的优化处理。大型Java Web应用程序的由于开发成本太高,开发后难以维护和开发过程中一些难以解决的问题,而采用“SSM组合框架”,它允许建立业务层次结构,并为这个问题提供良好的解决方案。

第三章 系统分析

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

3.1 可行性分析

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

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

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

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

3.1.1 技术可行性

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

3.1.2 经济可行性

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

3.1.3 操作可行性

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

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

3.2 系统性能分析

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

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

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

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

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

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

3.3 系统功能需求分析

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

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

本课题要求实现一套校园美食交流系统的开发与实现,主要实现功能包括;管理员:首页、个人中心、美食分类管理、美食信息管理、用户管理、管理员管理、论坛中心、系统管理,

前台首页:首页、美食信息、论坛中心、美食资讯、个人中心、后台管理、网站建议,用户:首页、个人中心、我的收藏管理。

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

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

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

图3-2用户用例图

  1. 前台首页用例需求如图3-3所示:

图3-3前台首页用例图

3.4 业务流程分析

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

图3-4系统开发流程图

3.4.1登录流程

为了保证系统的安全,用户要想进入校园美食交流系统必须进行登录操作,用户登录流程图如图3-5所示

图3-5 登录流程图

第四章 系统设计

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表

列名数据类型长度约束
idint11NOT NULL
usernamevarchar50default NULL
pwdvarchar50default NULL
cxvarchar50default NULL

表4-2 meishifenlei表

列名数据类型长度约束
idint11NOT NULL
addtimevarchar50default NULL
fenleivarchar50default NULL

表4-3:meishixinxi表

列名数据类型长度约束
idint11NOT NULL
addtimevarchar50default NULL
meishimingchengvarchar50default NULL
fenleivarchar50default NULL
tupianvarchar50default NULL
kouweivarchar50default NULL
tesevarchar50default NULL
shipinvarchar50default NULL
xiangqingvarchar50default NULL

表4-4 yonghu表

列名数据类型长度约束
idint11NOT NULL
addtimevarchar50default NULL
yonghumingvarchar50default NULL
mimavarchar50default NULL
xingmingvarchar50default NULL
xingbievarchar50default NULL
touxiangvarchar50default NULL
shoujivarchar50default NULL
youxiangvarchar50default NULL

第五章 系统功能实现

5.1登录

管理员登录,通过填写用户名、密码、角色等信息,输入完成后选择登录即可进入校园美食交流系统,如图5-1所示。

图5-1管理员登录界面图

5.2管理员功能实现

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.3前台首页功能实现

校园美食交流系统,在系统首页可以查看首页、美食信息、论坛中心、美食资讯、个人中心、后台管理、网站建议等内容,如图5-8所示。

图5-8系统功能界面图

5.3.1登录、用户注册

登录、用户注册,用户通过输入用户名、密码、姓名、手机、邮箱等信息进行注册、登录,如图5-9所示。

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

5.3.2美食信息

美食信息进行填写美食名称、分类、图片、口味、特色、视频等信息进行点我收藏操作如图5-10所示。

图5-10美食信息界面图

5.3.3个人中心

个人中心,在个人中心页面可以填写用户名、密码、姓名、性别、头像、手机、邮箱等内容进行更新信息、退出登录,如图5-11所示。

图5-11个人中心界面图

5.3.4论坛中心

论坛中心,在论坛中心页面可以填写标题、类型、内容等内容进行发布帖子,如图5-12所示。

图5-12论坛中心界面图

5.4用户功能实现

5.4.1个人信息

用户进入个人信息可以查看用户名、密码、姓名、性别、头像、手机、邮箱等操作。个人信息效果图如图5-13所示。

图5-13个人信息界面图

5.4.2我的收藏管理

用户对我的收藏管理进行查看收藏名称、收藏图片等操作。我的收藏管理效果图如图5-14所示。

图5-14我的收藏管理界面图

FileController.java
package com.controller;

import java.io.File;
import java.io.IOException;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
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,HttpServletRequest request) throws Exception {
		if (file.isEmpty()) {
			throw new EIException("上传文件不能为空");
		}
		String fileExt = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")+1);
		String fileName = new Date().getTime()+"."+fileExt;
		File dest = new File(request.getSession().getServletContext().getRealPath("/upload")+"/"+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 void download(@RequestParam String fileName, HttpServletRequest request, HttpServletResponse response) {
		try {
			File file = new File(request.getSession().getServletContext().getRealPath("/upload")+"/"+fileName);
			if (file.exists()) {
				response.reset();
				response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName+"\"");
				response.setHeader("Cache-Control", "no-cache");
				response.setHeader("Access-Control-Allow-Credentials", "true");
				response.setContentType("application/octet-stream; charset=UTF-8");
				IOUtils.write(FileUtils.readFileToByteArray(file), response.getOutputStream());
			}

		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
}

ConfigServiceImpl.java

package com.service.impl;


import java.util.Map;

import org.springframework.stereotype.Service;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.dao.ConfigDao;
import com.entity.ConfigEntity;
import com.entity.UserEntity;
import com.service.ConfigService;
import com.utils.PageUtils;
import com.utils.Query;


/**
 * 系统用户
 */
@Service("configService")
public class ConfigServiceImpl extends ServiceImpl<ConfigDao, ConfigEntity> implements ConfigService {
	@Override
	public PageUtils queryPage(Map<String, Object> params) {
		Page<ConfigEntity> page = this.selectPage(
                new Query<ConfigEntity>(params).getPage(),
                new EntityWrapper<ConfigEntity>()
        );
        return new PageUtils(page);
	}
}

MPUtil.java
package com.utils;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;

import cn.hutool.core.bean.BeanUtil;

import com.baomidou.mybatisplus.mapper.Wrapper;

/**
 * Mybatis-Plus工具类
 */
public class MPUtil {
	public static final char UNDERLINE = '_';

	
	//mybatis plus allEQ 表达式转换
		public static Map allEQMapPre(Object bean,String pre) {
		   Map<String, Object> map =BeanUtil.beanToMap(bean);
		  return camelToUnderlineMap(map,pre);
	   }

		//mybatis plus allEQ 表达式转换
		public static Map allEQMap(Object bean) {
		   Map<String, Object> map =BeanUtil.beanToMap(bean);
		   return camelToUnderlineMap(map,"");
	   }

		public static Wrapper allLikePre(Wrapper wrapper,Object bean,String pre) {
			   Map<String, Object> map =BeanUtil.beanToMap(bean);
			   Map result = camelToUnderlineMap(map,pre);
			 
			return genLike(wrapper,result);
		}
	
		public static Wrapper allLike(Wrapper wrapper,Object bean) {
			  Map result = BeanUtil.beanToMap(bean, true, true);			 
			return genLike(wrapper,result);
		}
	
	
		public static Wrapper genLike( Wrapper wrapper,Map param) {
			Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator();
			int i=0;
			while (it.hasNext()) {
				if(i>0) wrapper.and();
				Map.Entry<String, Object> entry = it.next();
				String key = entry.getKey();
				String value = (String) entry.getValue();
				wrapper.like(key, value);
				i++;
			}
			return wrapper;
		}
		
		public static Wrapper likeOrEq(Wrapper wrapper,Object bean) {
			  Map result = BeanUtil.beanToMap(bean, true, true);			 
			return genLikeOrEq(wrapper,result);
		}
		
		public static Wrapper genLikeOrEq( Wrapper wrapper,Map param) {
			Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator();
			int i=0;
			while (it.hasNext()) {
				if(i>0) wrapper.and();
				Map.Entry<String, Object> entry = it.next();
				String key = entry.getKey();
				if(entry.getValue().toString().contains("%")) {
					wrapper.like(key, entry.getValue().toString().replace("%", ""));
				} else {
					wrapper.eq(key, entry.getValue());
				}
				i++;
			}
			return wrapper;
		}
		
		public static Wrapper allEq(Wrapper wrapper,Object bean) {
			  Map result = BeanUtil.beanToMap(bean, true, true);			 
			return genEq(wrapper,result);
		}
	
	
		public static Wrapper genEq( Wrapper wrapper,Map param) {
			Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator();
			int i=0;
			while (it.hasNext()) {
				if(i>0) wrapper.and();
				Map.Entry<String, Object> entry = it.next();
				String key = entry.getKey();
				wrapper.eq(key, entry.getValue());
				i++;
			}
			return wrapper;
		}
	
	
		public static Wrapper between(Wrapper wrapper,Map<String, Object> params) {
			for(String key : params.keySet()) {
				String columnName = "";
				if(key.endsWith("_start")) {
					columnName = key.substring(0, key.indexOf("_start"));
					if(StringUtils.isNotBlank(params.get(key).toString())) {
						wrapper.ge(columnName, params.get(key));
					}
				}
				if(key.endsWith("_end")) {
					columnName = key.substring(0, key.indexOf("_end"));
					if(StringUtils.isNotBlank(params.get(key).toString())) {
						wrapper.le(columnName, params.get(key));
					}
				}
			}
			return wrapper;
		}
	
		public static Wrapper sort(Wrapper wrapper,Map<String, Object> params) {
			String order = "";
			if(params.get("order") != null && StringUtils.isNotBlank(params.get("order").toString())) {
				order = params.get("order").toString();
			}
			if(params.get("sort") != null && StringUtils.isNotBlank(params.get("sort").toString())) {
				if(order.equalsIgnoreCase("desc")) {
					wrapper.orderDesc(Arrays.asList(params.get("sort")));
				} else {
					wrapper.orderAsc(Arrays.asList(params.get("sort")));
				}
			}
			return wrapper;
		}
	
	
	/**
	 * 驼峰格式字符串转换为下划线格式字符串
	 * 
	 * @param param
	 * @return
	 */
	public static String camelToUnderline(String param) {
		if (param == null || "".equals(param.trim())) {
			return "";
		}
		int len = param.length();
		StringBuilder sb = new StringBuilder(len);
		for (int i = 0; i < len; i++) {
			char c = param.charAt(i);
			if (Character.isUpperCase(c)) {
				sb.append(UNDERLINE);
				sb.append(Character.toLowerCase(c));
			} else {
				sb.append(c);
			}
		}
		return sb.toString();
	}

	public static void main(String[] ages) {
		System.out.println(camelToUnderline("ABCddfANM"));
	}
	
	public static Map camelToUnderlineMap(Map param, String pre) {

		Map<String, Object> newMap = 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 = camelToUnderline(key);
			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());
			}
		}
		return newMap;
	}
}

声明

本博客适用于广泛的学术和教育用途,包括但不限于个人学习、开发设计,产品设计。仅供学习参考,旨在为读者提供深入理解和学术研究的材料。

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

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

相关文章

【MySQL】 黑马 MySQL进阶 笔记

文章目录 存储引擎MySQL的体系结构存储引擎概念存储引擎特点InnoDBMyISAMMemory 存储引擎选择 索引概述结构B Tree(多路平衡查找树)B TreeHash为什么InnoDB存储引擎选择使用Btree索引结构? 分类思考题 语法SQL性能分析&#xff08;索引相关&#xff09;SQL执行频率慢查询日志p…

VMware Workstation Pro 下载

文章目录 VMware Workstation ProVMware下载与安装 VMware Workstation Pro VMware Workstation Pro 对个人用户已经完全免费&#xff01; VMware下载与安装 第一步&#xff1a;进入vmware的官网 VMWare已被收购&#xff0c;因此它会跳到&#xff0c; Broadcom 注册页面&…

[Meachines] [Easy] granny IIS 6.0+CVE-2017-7269+进程迁移+MS15-051权限提升

信息收集 IP AddressOpening Ports10.10.10.15TCP:80 $ nmap -p- 10.10.10.15 --min-rate 1000 -sC -sV -Pn PORT STATE SERVICE VERSION 80/tcp open http Microsoft IIS httpd 6.0 |_http-server-header: Microsoft-IIS/6.0 | http-methods: |_ Potentially risky…

移动式气象站:科技赋能,监测天气

在自然灾害频发、气候变化日益显著的今天&#xff0c;准确、及时地获取气象信息对于农业生产、城市规划、交通运输以及灾害预警等领域至关重要。传统固定气象站虽能提供稳定的观测数据&#xff0c;但在偏远地区、灾害现场或快速变化的环境中&#xff0c;其局限性逐渐显现。为此…

怎么都在劝我用通义灵码

听朋友说最近通义灵码有个活动&#xff0c;分享体验心得就有机会抽 iPhone 15。而且通过活动第一次使用通义灵码的新用户&#xff0c;还人均送一个“显眼包”。 有点儿心动了。点开活动页面一看&#xff0c;好家伙&#xff0c;好几百人都在劝我用通义灵码。 来看看他们是怎么说…

Winxvideo AI(AI视频编辑软件) v3.5 中文免安装版

Winxvideo AI是一款基于人工智能技术开发的视频编辑软件。 软件截图&#xff1a; 使用说明&#xff1a; 解压后&#xff0c;双击start_xvideo.bat来运行软件 下载地址&#xff1a;压缩包 解压密码&#xff1a;helloh 下载时可能会有广告&#xff0c;忽略&#xff0c;等下载…

深入学习SQL优化的第三天

目录 聚合函数 排序和分组 聚合函数 1251. 平均售价 表&#xff1a;Prices------------------------ | Column Name | Type | ------------------------ | product_id | int | | start_date | date | | end_date | date | | price | int …

【题解】【排序】—— [NOIP1998 提高组] 拼数

【题解】【排序】—— [NOIP1998 提高组] 拼数 [NOIP1998 提高组] 拼数题目描述输入格式输出格式输入输出样例输入 #1输出 #1输入 #2输出 #2 提示 1.题意解析2.AC代码 [NOIP1998 提高组] 拼数 题目描述 设有 n n n 个正整数 a 1 … a n a_1 \dots a_n a1​…an​&#xff0…

第41篇 使用数码管实现计数器<二>

Q&#xff1a;如何设计汇编语言程序实现手动控制计数器&#xff1f; A&#xff1a;在本实验程序中&#xff0c;使用轮询法读取Data寄存器获取KEY的状态&#xff0c;当未按下任何KEY时&#xff0c;Data寄存器中的值为0&#xff0c;当按下按键KEY[i]时&#xff0c;Data寄存器中…

Circuitjs 创建自定义逻辑(Custom Logic)器件

您可以使用 自定义逻辑芯片 来实现自己的简单逻辑器件. 位于“菜单–绘制–数字芯片–添加自定义逻辑”下, 或者是"右键–数字芯片–添加自定义逻辑". 视频简介: Circuitjs 自定义逻辑电路(custom logic)功能简介 一个具体示例 来看一个具体的示例, 通过它来讲述 自…

【案例56】安全设备导致请求被拦截

问题现象 访问相关报表 第二次访问发现有相关的连接问题 问题分析 服务器访问相关节点&#xff0c;发现相关节点无此问题。从客户的客户端访问缺有问题。在nclog中发现如下日志&#xff0c;链接被重置。 直接访问服务器无丢包现象。客户端未开防火墙。装了杀毒软件已经卸载。…

vue3 实现历史步骤记录

通过vueuse中的 useManualRefHistory&#xff0c;快速实现历史操作记录 所需环境&#xff1a; vue 实现目标 历史记录撤销重做记录覆盖 代码原理 把键盘监听事件挂载在document上&#xff0c;当键盘事件发生时&#xff0c;依次匹配事先订阅的快捷键/单按键事件&#xff0c…

在定义的接口前加前缀路径

前因 在一个服务中&#xff0c;既定义了app端接口&#xff0c;又定义了pc端接口&#xff0c;为了方便区分&#xff0c;可以在项目里建立一个名为"app"、"pc"的文件夹&#xff0c;分别为app、pc提供接口。当app和pc接口一致时&#xff0c;写完一端接口后&a…

Axure设计之动态条形图教程(中继器)

在Axure RP中&#xff0c;中继器是一个非常强大的工具&#xff0c;它允许我们动态地展示数据&#xff0c;并且可以轻松实现复杂的交互效果。本文将详细介绍如何使用中继器来制作一个动态条形图&#xff0c;并展示其在实际项目中的应用。 一、效果预览 预览地址&#xff1a;http…

BC131 矩阵相等判定(c语言)

1.描述 :KiKi得到了两个n行m列的矩阵&#xff0c;他想知道两个矩阵是否相等&#xff0c;请你回答他。 (当两个矩阵对应数组元素都相等时两个矩阵相等)。 // //输入描述&#xff1a; //第一行包含两个整数n和m&#xff0c;表示两个矩阵包含n行m列&#xff0c;用空格分隔。 // //…

深刻理解JDK中线程池的使用

一、线程池状态 线程结构关系 ThreadPoolExecutor使用int的高3位来表示线程池状态,低29位标识线程数量. 注意 : 第一位为符号位,所以RUNNING状态为负数,最小. 这些信息存储在一个原子变量ctl中,目的是将线程池状态与线程个数合二为一,这样就可以用一次cas原子操作进行赋值. /…

如何从零编程实现《黑神话:悟空》

随着游戏行业的不断发展&#xff0c;越来越多的技术被应用于游戏的开发之中。其中&#xff0c;《黑神话&#xff1a;悟空》作为一款备受期待的动作冒险游戏&#xff0c;不仅以其精美的画面和丰富的剧情吸引了无数玩家的关注&#xff0c;还因其背后的技术实现了独特的游戏体验。…

怎么生成一个springboot的项目

这个很简单,只是想记录一下使用springboot的创建工具去创建项目 创建完成之后,删除一些不必要的东西 确认springboot的版本号,我这里要用2.4.0 刷新一下maven,等待下载完成就完成了

T6:好莱坞明星识别

文章目录 **T6周&#xff1a;好莱坞明星识别****一、前期工作**1.设置GPU&#xff08;用CPU可忽略该步骤&#xff09;2.导入数据3.查看数据 **二、数据预处理**1.加载数据2.可视化数据3.配置数据集 **三、构建CNN网络模型****四、编译模型****五、训练模型****六、模型评估****…

Circuitjs 分支电路(子电路, subcircuit)功能简介

在 circuitjs 中, 可以使用 分支电路 来实现自定义的"黑盒"器件. 分支电路 也称为 子电路(subcircuit). 因为菜单上已经叫成了 分支电路, 以下均称为 分支电路. 通过分支电路, 可以实现对电路的封装与抽象, 从而达到模块化并简化电路的目的. 更进一步的, 被抽象的黑盒…