安康旅游网站的设计与实现

springboot092安康旅游网站的设计与实现

第一章 绪论

1.1 研究现状

时代的发展,我们迎来了数字化信息时代,它正在渐渐的改变着人们的工作、学习以及娱乐方式。计算机网络,Internet扮演着越来越重要的角色,人们已经离不开网络了,大量的图片、文字、视频冲击着我们的视觉。

随着社会生产力的发展,人们的生活水平越来越高。旅游,越来越成为人们一种休闲娱乐的方式。喧嚣的都市,高强度的工作与生活,让很多人身心疲惫。而旅游,则可以调节身心、恢复疲惫和增加人们的阅历。在旅游度假区,既可以了解当地的人文情怀,又可以在碧水蓝天间忘却烦恼。所以,旅游越来越受人民的欢迎。根据联合国世界旅游组织最新发布的《世界旅游晴雨表》,2015年国际游客人数相比2014年增长了4.4%,达到11.84亿人次。随着社会和经济的发展,旅游业已成长为世界经济中发展势头最强劲和规模最大的产业之一。

因此,为了给用户提供一个便利的查看安康旅游信息、景点购票、酒店预订的平台,开发了本基于JSP的安康旅游网站。

1.2 设计原则

在开始开发项目之前,必须要先考虑项目的实用性、科学性,以及该项目是否能够真正让用户受益并尽可能的发挥项目的作用。因此,在开发前,通过以下几条原则对项目进行判断:

(1)可行性原则。项目需要保证经济可行性和技术可行性,这包括了项目在浏览端、服务端等方面上的经济和技术上是可以达成的。

(2)适应性原则。项目要保证可维护性和可扩展性,这是每个非短期项目都需要考虑的,并且不论是维护还是扩展,都必须要建立在适应用户的正常需求的基础上。

(3)安全性及保密性原则。要充分保证用户信息的安全性和保密性,不能因为开发上的疏忽,导致用户的信息泄露。

(4)系统工程原则。为了确保项目的整体性,在项目调查、项目分析、项目设计、项目开发的过程中,都需遵从项目工程的方法和步骤逐步进行。

(5)统一规划、分期实施、逐步完善原则。项目开发的过程中,要按照规划、分期实施,特别是要注意在项目开发过程中要有条理,从点到面,一步步完善,不要贪图进度,要循环渐进的对项目进行开发。

1.3 研究内容

根据基于JSP的安康旅游网站编写的论文主要阐述了基于JSP的安康旅游网站的开发过程中使用的技术,首先进行系统需求分析,进而进行系统设计,最后才是系统功能实现以及测试几个部分,在开始编写论文之前亲自到图书馆借阅JSP书籍,MYSQL数据库书籍等编程书籍,然后针对开发的基于JSP的安康旅游网站,去网上查找了很多别人做好的系统,根据他们的功能设计进行自己的系统的系统功能结构设计,出具需求报告,最后才是进行程序编码,系统完成后才能进行测试和最后的验收工作,程序开发流程大致如此。

这次编写的论文包含了6个部分的内容,具体内容如下:

第一部分绪论:文章主要从课题背景以及设计原则综合阐述了开发此系统的必要性。

第二部分相关技术:系统开发用到的各种技术都大致做出了简介

第三部分系统分析:从可行性分析和功能需求分析等角度综合研究了此次开发的系统

第四部分系统设计:功能模块设计和数据库设计这两部分内容都有专门的表格和图片表示

第五部分系统实现:进行系统主要功能模块的界面展示

第六部分系统测试:检验程序是否达到预期目标

第二章 相关技术简介

2.1 JSP技术

JSP的全名为JAVA SERVER PAGE,是一家硅谷的公司在90年代发布的。之后,JSP被推为一种动态网页的技术标准。作为一种开发技术,它将Java的代码被其嵌入静态页面中,让网页的静态变为动态。作为一个框架,JSP在HTML网页文件插入了Java 程序片段(Scriptlet)[4],这样就可以控制数据库并且根据客户端的请求生成对应的HTML、XML及其他的网页文件给客户端。Java编程语言就是它的脚本语言,因为它的特性,我们可以建立以Java作为编程语言的安全的、能多平台执行的动态网页。

JSP是一种动态网页技术,使用java作为它的脚本语言,它为web页面的动态显示提供了更加便捷的方法,它可以减少网页的请求次数,同时可以在多平台上开发,拥有更好的兼容性[7][8]。*.jsp是JSP的文件后缀 ,它可以响应来自客户机的请求,同时动态生成HTML、XML或其他文档格式。是一种典型的Web网页技术标准[9]。它有着Java技术简单易用,以工作流为导向,安全可靠,不升级到平台,是以Java编写脚本的,可以在页面通过<% %>插入Java代码,方便使用。Web页面JSP在整个Java服务器应用程序HTTP中提供了与库单元的接口。

其特性可简述为以下:

(1)相比以前的技术,能有效的添加动态网页的内容;

(2)拥有和Java一样的在多平台被开发的优势,基本上不受环境的限制,也就是说不用因为平台环境的因素而对代码进行修改;

(3)由于是根据Java语言来作为脚本的,所以拥有它的相对易用性;

(4)它具有JavaBean和标签库的可被多次反复的利用的功能代码;

(5)被功能强且性能良好的工具所支持。

JSP以Java servlet作为技术基础,JSP和Java servlet相配合可完成大中型的Web应用程序的开发[8]。与Java一样,完全面向对象,主要面对了近年因特网发展的特点。由于其兼容性和安全可靠,企业间还可以通过它使用Java技术相互配合,实现分层开发。

2.2 Java技术

Java是一种非常常用的编程语言,在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中,Java的身影无处不在,并且拥有旺盛的生命力[2]。Java的跨平台能力十分强大,只需一次编译,任何地方都可以运行。除此之外,它还拥有简单的语法和实用的类库,让编程人员可以尽可能将精力集中在问题的求解上,并且许多开源项目和科研成果都是采用它实现的。

在1995年这一年的5月份,著名的Sun Microsystems公司在程序开发设计上面郑重推出一种面向对象开发的程序设计语言——Java,最开始的时候Java是由詹姆斯.高斯林这位伟大的JAVA之父来进行主导[1],但是在后来由于各种原因,让甲骨文公司这个针对商业程序创建了oracle大型数据库的公司收购了Java。Java的平台总共算下来有3个,分别为javaME和javaSE以及javaEE这3个java平台。下面将对其进行分别介绍。

(1)在电脑桌面程序的开发上面需要选择JavaME,这个用得也比较多。

(2)企业也会根据工作以及业务需要开发各种软件,那么就会选用JavcEE这个支持企业版软件的开发的Java平台,JavcEE主攻运用在企业领域上面的web应用,JavcEE也在javaSE的基础上获得了比如jsp技术 ,Servlet技术等程序开发技术的支持[15]。

(3)现在生活中手机的普及化,也使得手机端这样的移动设备的软件的兴起,JavaME这个迷你版java平台就能运用于移动端的软件开发操作。

2.3 MYSQL数据库

MySQL是典型的关系数据库系统,拥有开源免费、稳定、高效等特点,一直是中小型web项目的最佳数据库选择。MySQL作为当今IT领域使用人数最多的开源关系型数据库软件之一,在2018年的数据库使用率排名中位居第二,仅次于目前为止最成功的商业版数据库Orcle[2]。MySQL最大的优势之一就是无偿使用,这也是它成功的关键。

MySQL支持标准化数据库查询语言SQL。MySQL是一款非常适合个人开发者或小型组织开发团体的数据库管理系统,因为它是开源并且免费的,体积小、速度快、成本低以及其最重要的一点开放源码,深受程序设计人员的喜爱,这也让它成为了许许多多中小型开发网站数据库的首选,同时提供了多种开发的连接API。MySQL将数据的存放按照记录之间的关系存放到了不同的表中,减少了数据的冗余并且提高了开发的工作效率。MySQL支持开发中需要用的大型数据库,并能处理数以万计的记录。因为MySQL是开源的软件,所以在项目的预算中的时候不用花费额外的资金,大大降低了开发的总体成本,这也是MySQL数据库在中小型企业和独立的开发者中广泛流行的原因[5]。

2.4 B/S结构

此次设计的网络结构模式B/S结构(Browser/Server)。B/S架构也称为B/S模式,是一种服务器以及浏览器架构模式[13]。B/S的工作模式都是先由浏览器请求,服务器再响应。B/S体系结构解决了异构系统中的连接难题,大大改善了系统的开放性,让系统的扩展和维护更加简单;同时,B/S体系结构操作也比较容易,界面全都为浏览器模式,容易分发数据的捕获程序。只要安装通用的浏览器(如WWW浏览器)就能通过Web服务器与数据库进行数据交互。此结构的好处之一在于由于它使用的统一的浏览器,使其可以在不同的地方且不需要用专门的软件进行操作,实现了不论你使用怎样的接入网的方式都可以对公共的数据进行调用和浏览。

相对于C/S模式,B/S模式是对C/S模式应用的扩展,B/S模式不用对不同的计算机安装不同应用程序,还有安全性的要求及对模式上手难度都比前者更好。B/S模式可以让客户机的压力大大减轻,工作的负荷被合理的分配了。其B/S架构图如下图所示:

图2.1 B/S模式架构图

2.5 Spring Boot框架

Spring Boot 是由 Pivotal 团队开发的框架,其作用是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置,简单理解就是springboot并不是什么新型的框架,而是整合了spring,springmvc等框架,默认了很多配置,从而减少了开发者的开发时间。Spring Boot 简化了基于 Spring 的应用开发,通过少量的代码就能创建一个独立的、产品级别的 Spring 应用。 Spring Boot 为 Spring 平台及第三方库提供开箱即用的设置。

Spring Boot的特点

(1)创建独立的Spring应用程序

(2)内嵌Tomcat应用服务器,容器会认出war包自动完成部署操作

(3)简化了Maven软件项目管理工具的配置流程

(4)实现自动配置Spring框架

(5)提供生产就绪型功能

第三章 系统分析

3.1可行性分析

对所有的系统来说,都有可能会受到时间和空间上的制约。所以,我们在设计每一个项目的时候,必须对该系统实行可行性分析,这样不但能够降低项目的危害,还能改降低人力、物力和财力的损耗。下面对技术、经济、操作和法律四个方面进行介绍。

3.1.1技术可行性

技术可行性是指学习的技术是否能够完成本项目,如果团队本身没有相关的技术储备,而又能够迅速掌握此类技术,那项目应该达不到我们的设计要求。本文将开发的系统,将采用的关键技术包括JSP技术、Java编程语言、Spring Boot框架、MYSQL数据库存储技术等。大学时将这些技术已经学习掌握,因此,就技术层面而言,该项目的开发是有保障的。

3.1.2 操作可行性

操作可行性主要是针对系统用户而言,一个系统再完美,技术再先进,用户不去使用,或者用户根本不会使用,该系统存在的价值也是不大的。本系统拟采用的是B/S架构,用户只要通过点击浏览器即可轻松访问,而用户对浏览器操作非常熟练,所以从用户的角度而言,没有任何学习成本,因此,操作上是可行性的。

3.1.3 经济可行性

项目需要考虑花费问题,我们必须考虑系统开发中所有的花费进行计算,我们要考虑到系统需不需要太大的资金。二是系统开发后期维护相关的费用大不大。本系统采用我们开源的技术没进行设计,再设计中没有太多的花费,只需要一台电脑便可以进行开发,因此,该项目的实施在经济上完全可行。

3.1.4 法律可行性

本基于JSP的安康旅游网站开发的所有技术资料都为合法,知识产权问题不会发生在开发过程中,而且没有抄袭其他相关系统,不会有侵犯版权的问题。另外,基于JSP的安康旅游网站设计与开发所采用的操作和工作方式符合工作人员的日常习惯,而且操作方便灵活,便于管理。所以在开发过程中不会涉及法律责任,具有可行性;

综上所述,该基于JSP的安康旅游网站在建设上不存在较大的障碍,各方面都能够保障系统的顺利开发。

3.2系统性能分析

系统除了功能结构设计以外还需要附加需求的分析,非功能需求分析,主要是包括界面、数据库问题、框架等,需要满足非功能性能的需求,保证系统运行起来的时候能够达到最佳的效果,保证稳定性和安全性。

(1)数据底层统一。数据传输中需要进行数据处理,在查询数据存储上达到最佳效果。

(2)界面风格统一。图片需要进行PS处理,文字需要统一格式大小。

(3)数据库。每个模块都需要独立,各个模块之间相互配合,形成一个整体,包装各个功能合理化的配置,需要考虑开放端口,满足可扩展性。

3.3系统功能分析

本基于JSP的安康旅游网站主要包括游客功能模块和管理员功能模块两大部分,下面分别介绍其功能:

(1)管理员功能模块

管理员是这两类用户中权限最高的,管理员登录后可对系统进行全面管理,确保系统正常稳定运行,管理员主要功能包括个人中心、游客管理、景点信息管理、省区管理、市区管理、地区管理、旅游线路管理、酒店信息管理、特产管理、景点购票订单管理、购票取消订单管理、酒店订单管理、酒店取消订单管理、特产订单管理、特产取消订单管理、留言板管理、我的收藏管理和系统管理。

(2)游客功能模块

游客进入系统可查看系统信息,包括首页、景点信息、旅游线路、酒店信息、特产、旅游新闻公告、留言反馈等,注册登录后主要功能模块包括个人中心、旅游线路管理、景点购票订单管理、购票取消订单管理、酒店订单管理、酒店取消订单管理、特产订单管理、特产取消订单管理以及我的收藏管理。

3.4系统流程分析

3.4.1注册流程

未有账号的游客可进行注册操作,游客注册流程图如图3.1所示。

图3.1注册流程图

3.4.2 登录流程

登录模块主要满足了管理员和游客的权限登录,用户登录流程图如图3.2所示。

图3.2 登录流程图

3.5系统架构分析

基于JSP的安康旅游网站的结构我们采用B/S架构来实现。采用B/S程序架构首要条件是我们要把安康旅游网站的数据库和程序放到远程服务器上,只需要在一个服务器上对程序和数据库进行配置,就可以在任何联通这台服务器的电脑上使用架设好的系统。这样的结构打破了时间和地域的限制,用户在使用安康旅游网站的时候变得非常方便。下图就非常明白的展现了基于JSP的安康旅游网站的网络系统结构。

图3.3 基于JSP的安康旅游网站架构设计图

第四章 系统设计

4.1系统结构设计

对于本系统的开发设计,先自上向下,将一个完整的系统分解成许多个小系统来进行实现;再自下向上,将所有的“零件”组装成一个大的、完整的系统。因此这里面的许多个小功能块都要对将要实现的功能进行划分,同时还要给其他的小功能模块提供调用的接口,以便于最后将所有的功能块组合起来。

本基于JSP的安康旅游网站主要实现了游客功能模块和管理员功能模块两大部分,系统结构图如图4-1所示。

图4.1 系统功能结构图

4.2系统顺序图设计

(1)登录顺序图

登录模块主要满足了管理员和游客的权限登录,登录模块的顺序图如图4.2所示。

图4.2用户登录顺序图

(2)添加信息顺序图

管理员和游客登录后均可进行信息的添加操作,添加信息顺序图如图4.3所示

图4.3添加信息顺序图

4.3数据库设计

本基于JSP的安康旅游网站采用的是MYSQL数据库,数据存储快,因为安康旅游网站,主要的就是对信息的管理,信息内容比较多,这就需要好好的设计一个好的数据库,分类要清楚,不能添加信息的时候,造成信息太过混乱,设计好的数据库首先就需要先把各个实体之间的关系表达明确。

4.3.1 数据库实体(E-R图)

E-R图是一种描述显示数据类型间的关系的数据描述方法,E-R图可以完整地映射出现实模型的关系。E-R图中的三个最为重要的元素就是实体、属性、关系。E-R图即由这三点组成。

实体:E-R图中数据的实体,用矩形表示上面为实体名,下面为实体属性,实体包含主外键等关系。

属性:E-R图中的属性,是指实体的属性,实体由多条属性所构成,属性拥有自己的数据类型,数据大小。属性的优劣决定了E-R图中实体的健全性、完整性。

关系:E-R图中的关系是指实体之间的关系,用菱形来表示实体间的关系,这些菱形关系的联系上有着一对多或多对多的数据联系,这些构成了E-R图的关系,E-R图的关系紧密连接了实体,使实体间的关联性更加的显著、易懂。本基于JSP的安康旅游网站的E-R图如下所示:

1.管理员信息实体属性图如图4.4所示:

图4.4 管理员信息实体属性图

2.景点信息信息实体属性图如图4.5所示:

图4.5 景点信息信息实体属性图

3.酒店信息实体属性图如图4.6所示:

图4.6 酒店信息实体属性图

4.游客信息实体属性图如图4.7所示:

图4.7 游客信息实体属性图

5.旅游线路信息实体属性图如图4.8所示:

图4.8 旅游线路信息实体属性图

4.3.2 数据库表设计

本基于JSP的安康旅游网站需要后台数据库,采用MYSQL数据库系统进行数据的储存,下面介绍数据库中的各个表的详细信息。各个表的设计结果如下:

表4.1 users管理员信息表

字段名数据类型是否允许空字段含义
idbigint(20)NOT NULL编号
username`varchar(100)NULL用户名
passwordvarchar(100)NULL密码
rolevarchar(100)NULL角色
addtimetimestampNULL新增时间

表4.2 jingdianxinxi景点信息表

字段名数据类型是否允许空字段含义
idbigint(20)NOT NULL编号
addtimetimestampNULL创建时间
jingdianmingchengvarchar(200)NULL景点名称
jingdiandengjivarchar(200)NULL景点等级
jingdianjieshaovarchar(200)NULL景点介绍
suozaishengquvarchar(200)NULL所在省区
suozaichengshivarchar(200)NULL所在城市
suozaidiquvarchar(200)NULL所在地区
meitiankaifangshijiandatetimeNULL每天开放时间
meitianguanbishijiandatetimeNULL每天关闭时间
beizhuvarchar(200)NULL备注
jiageint(11)NULL价格
tupianvarchar(200)NULL图片
thumbsupnumint(11)NULL赞数
crazilynumint(11)NULL踩数
clicktimedatetimeNULL最近点击时间
clicknum`int(11)NULL点击次数

表4.3 jiudianxinxi酒店信息表

字段名数据类型是否允许空字段含义
idbigint(20)NOT NULL编号
addtimetimestampNULL创建时间
`jiudianmingchengvarchar(200)NULL酒店名称
jiudianjieshaolongtextNULL酒店介绍
fangjianshuint(11)NULL房间数
suozaishengquvarchar(200)NULL所在省区
suozaichengshivarchar(200)NULL所在城市
suozaidiquvarchar(200)NULL所在地区
jiudianjiageint(11)NULL酒店价格
tupianvarchar(200)NULL图片
thumbsupnumint(11)NULL赞数
crazilynumint(11)NULL踩数
clicktimedatetimeNULL最近点击时间
clicknum`int(11)NULL点击次数

表4.4 youke游客信息表

字段名数据类型是否允许空字段含义
idbigint(20)NOT NULL编号
addtimetimestampNULL创建时间
youkezhanghaovarchar(200)NULL游客账号
mimavarchar(200)NULL密码
youkexingmingvarchar(200)NULL游客姓名
xingbievarchar(200)NULL性别
lianxifangshivarchar(200)NULL联系方式
shenfenzhengvarchar(200)NULL身份证
youxiangvarchar(200)NULL邮箱
touxiangvarchar(200)NULL头像

表4.5 lvyouxianlu旅游线路信息表

字段名数据类型是否允许空字段含义
idbigint(20)NOT NULL编号
addtimetimestampNULL创建时间
youkezhanghaovarchar(200)NULL游客账号
youkexingmingvarchar(200)NULL游客姓名
xianluguihuavarchar(200)NULL线路规划
xianlutupianvarchar(200)NULL线路图片

第五章 系统实现

5.1登录模块的实现

用户要想进入本系统,必须通过正确的用户名和密码,选择登录类型进行登录操作,在登录时系统会以用户名、密码和登录类型为参数进行登录信息的验证,信息正确则登录进入对应用户功能界面可进行功能处理,反之登录失败,系统登录界面展示如图5.1所示。

图5.1 系统登录界面

5.2管理员功能模块的实现

5.2.1景点信息管理界面

管理员可添加、修改和删除景点信息信息,景点信息管理界面展示如图5.2所示,添加景点信息信息界面展示如图5.3所示。

图5.2 景点信息管理界面

图5.3 添加景点信息信息界面

5.2.2酒店信息管理界面

管理员可增删改查酒店信息,酒店信息管理界面展示如图5.4所示。

图5.4 酒店信息管理界面

5.2.3特产管理界面

管理员可增删改查特产信息,特产管理界面展示如图5.5所示。

图5.5 特产管理界面

5.2.4游客管理界面

管理员可查看、添加、修改和删除游客信息,游客管理界面展示如图5.6所示。

图5.6 游客管理界面

5.2.5景点购票订单管理界面

管理员可查看景点购票订单信息,并可对其进行审核、修改和删除操作,景点购票订单管理界面展示如图5.7所示。

图5.7 景点购票订单管理界面

5.3游客功能模块的实现

5.3.1系统主界面

游客进入本系统可查看系统信息,系统主界面展示如图5.8所示。

图5.8 系统主界面

5.3.2游客注册界面

未有账号的游客可进入注册界面进行注册操作,游客注册界面展示如图5.9所示。

图5.9 游客注册界面

5.3.3景点信息详情界面

游客可选择景点信息查看景点信息详情信息,登录后可进行购票操作,景点信息详情界面展示如图5.10所示。

图5.10景点信息详情界面

5.3.4酒店详情界面

游客可选择酒店查看详情信息,登录后可进行预订下单操作,酒店详情界面展示如图5.11所示。

图5.11酒店详情界面

5.3.5特产详情界面

游客可选择特产查看详情信息,登录后可进行购买操作,特产详情界面展示如图5.12所示。

图5.12 特产详情界面

GoupiaoquxiaodingdanController.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.GoupiaoquxiaodingdanEntity;
import com.entity.view.GoupiaoquxiaodingdanView;

import com.service.GoupiaoquxiaodingdanService;
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-04-30 11:47:11
 */
@RestController
@RequestMapping("/goupiaoquxiaodingdan")
public class GoupiaoquxiaodingdanController {
    @Autowired
    private GoupiaoquxiaodingdanService goupiaoquxiaodingdanService;
    


    /**
     * 后端列表
     */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params,GoupiaoquxiaodingdanEntity goupiaoquxiaodingdan,
		HttpServletRequest request){
		String tableName = request.getSession().getAttribute("tableName").toString();
		if(tableName.equals("youke")) {
			goupiaoquxiaodingdan.setYoukezhanghao((String)request.getSession().getAttribute("username"));
		}
        EntityWrapper<GoupiaoquxiaodingdanEntity> ew = new EntityWrapper<GoupiaoquxiaodingdanEntity>();
		PageUtils page = goupiaoquxiaodingdanService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, goupiaoquxiaodingdan), params), params));

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

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

	 /**
     * 查询
     */
    @RequestMapping("/query")
    public R query(GoupiaoquxiaodingdanEntity goupiaoquxiaodingdan){
        EntityWrapper< GoupiaoquxiaodingdanEntity> ew = new EntityWrapper< GoupiaoquxiaodingdanEntity>();
 		ew.allEq(MPUtil.allEQMapPre( goupiaoquxiaodingdan, "goupiaoquxiaodingdan")); 
		GoupiaoquxiaodingdanView goupiaoquxiaodingdanView =  goupiaoquxiaodingdanService.selectView(ew);
		return R.ok("查询购票取消订单成功").put("data", goupiaoquxiaodingdanView);
    }
	
    /**
     * 后端详情
     */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") Long id){
        GoupiaoquxiaodingdanEntity goupiaoquxiaodingdan = goupiaoquxiaodingdanService.selectById(id);
        return R.ok().put("data", goupiaoquxiaodingdan);
    }

    /**
     * 前端详情
     */
    @RequestMapping("/detail/{id}")
    public R detail(@PathVariable("id") Long id){
        GoupiaoquxiaodingdanEntity goupiaoquxiaodingdan = goupiaoquxiaodingdanService.selectById(id);
        return R.ok().put("data", goupiaoquxiaodingdan);
    }
    



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

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

    /**
     * 删除
     */
    @RequestMapping("/delete")
    public R delete(@RequestBody Long[] ids){
        goupiaoquxiaodingdanService.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<GoupiaoquxiaodingdanEntity> wrapper = new EntityWrapper<GoupiaoquxiaodingdanEntity>();
		if(map.get("remindstart")!=null) {
			wrapper.ge(columnName, map.get("remindstart"));
		}
		if(map.get("remindend")!=null) {
			wrapper.le(columnName, map.get("remindend"));
		}

		String tableName = request.getSession().getAttribute("tableName").toString();
		if(tableName.equals("youke")) {
			wrapper.eq("youkezhanghao", (String)request.getSession().getAttribute("username"));
		}

		int count = goupiaoquxiaodingdanService.selectCount(wrapper);
		return R.ok().put("count", count);
	}
	


}

TokenServiceImpl.java

package com.service.impl;


import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.springframework.stereotype.Service;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.dao.TokenDao;
import com.entity.TokenEntity;
import com.entity.TokenEntity;
import com.service.TokenService;
import com.utils.CommonUtil;
import com.utils.PageUtils;
import com.utils.Query;


/**
 * token
 */
@Service("tokenService")
public class TokenServiceImpl extends ServiceImpl<TokenDao, TokenEntity> implements TokenService {

	@Override
	public PageUtils queryPage(Map<String, Object> params) {
		Page<TokenEntity> page = this.selectPage(
                new Query<TokenEntity>(params).getPage(),
                new EntityWrapper<TokenEntity>()
        );
        return new PageUtils(page);
	}

	@Override
	public List<TokenEntity> selectListView(Wrapper<TokenEntity> wrapper) {
		return baseMapper.selectListView(wrapper);
	}

	@Override
	public PageUtils queryPage(Map<String, Object> params,
			Wrapper<TokenEntity> wrapper) {
		 Page<TokenEntity> page =new Query<TokenEntity>(params).getPage();
	        page.setRecords(baseMapper.selectListView(page,wrapper));
	    	PageUtils pageUtil = new PageUtils(page);
	    	return pageUtil;
	}

	@Override
	public String generateToken(Long userid,String username, String tableName, String role) {
		TokenEntity tokenEntity = this.selectOne(new EntityWrapper<TokenEntity>().eq("userid", userid).eq("role", role));
		String token = CommonUtil.getRandomString(32);
		Calendar cal = Calendar.getInstance();   
    	cal.setTime(new Date());   
    	cal.add(Calendar.HOUR_OF_DAY, 1);
		if(tokenEntity!=null) {
			tokenEntity.setToken(token);
			tokenEntity.setExpiratedtime(cal.getTime());
			this.updateById(tokenEntity);
		} else {
			this.insert(new TokenEntity(userid,username, tableName, role, token, cal.getTime()));
		}
		return token;
	}

	@Override
	public TokenEntity getTokenEntity(String token) {
		TokenEntity tokenEntity = this.selectOne(new EntityWrapper<TokenEntity>().eq("token", token));
		if(tokenEntity == null || tokenEntity.getExpiratedtime().getTime()<new Date().getTime()) {
			return null;
		}
		return tokenEntity;
	}
}

CommonController.java
package com.controller;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
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 com.annotation.IgnoreAuth;
import com.baidu.aip.face.AipFace;
import com.baidu.aip.face.MatchRequest;
import com.baidu.aip.util.Base64Util;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.entity.ConfigEntity;
import com.service.CommonService;
import com.service.ConfigService;
import com.utils.BaiduUtil;
import com.utils.FileUtil;
import com.utils.R;

/**
 * 通用接口
 */
@RestController
public class CommonController{
	@Autowired
	private CommonService commonService;
	
	@Autowired
	private ConfigService configService;
	
	private static AipFace client = null;
	
	private static String BAIDU_DITU_AK = null;
	
	@RequestMapping("/location")
	public R location(String lng,String lat) {
		if(BAIDU_DITU_AK==null) {
			BAIDU_DITU_AK = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "baidu_ditu_ak")).getValue();
			if(BAIDU_DITU_AK==null) {
				return R.error("请在配置管理中正确配置baidu_ditu_ak");
			}
		}
		Map<String, String> map = BaiduUtil.getCityByLonLat(BAIDU_DITU_AK, lng, lat);
		return R.ok().put("data", map);
	}
	
	/**
	 * 人脸比对
	 * 
	 * @param face1 人脸1
	 * @param face2 人脸2
	 * @return
	 */
	@RequestMapping("/matchFace")
	public R matchFace(String face1, String face2) {
		if(client==null) {
			/*String AppID = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "AppID")).getValue();*/
			String APIKey = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "APIKey")).getValue();
			String SecretKey = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "SecretKey")).getValue();
			String token = BaiduUtil.getAuth(APIKey, SecretKey);
			if(token==null) {
				return R.error("请在配置管理中正确配置APIKey和SecretKey");
			}
			client = new AipFace(null, APIKey, SecretKey);
			client.setConnectionTimeoutInMillis(2000);
			client.setSocketTimeoutInMillis(60000);
		}
		JSONObject res = null;
		try {
			File file1 = new File(ResourceUtils.getFile("classpath:static/upload").getAbsolutePath()+"/"+face1);
			File file2 = new File(ResourceUtils.getFile("classpath:static/upload").getAbsolutePath()+"/"+face2);
			String img1 = Base64Util.encode(FileUtil.FileToByte(file1));
			String img2 = Base64Util.encode(FileUtil.FileToByte(file2));
			MatchRequest req1 = new MatchRequest(img1, "BASE64");
			MatchRequest req2 = new MatchRequest(img2, "BASE64");
			ArrayList<MatchRequest> requests = new ArrayList<MatchRequest>();
			requests.add(req1);
			requests.add(req2);
			res = client.match(requests);
			System.out.println(res.get("result"));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			return R.error("文件不存在");
		} catch (IOException e) {
			e.printStackTrace();
		} 
		return R.ok().put("data", com.alibaba.fastjson.JSONObject.parse(res.get("result").toString()));
	}
    
	/**
	 * 获取table表中的column列表(联动接口)
	 * @param table
	 * @param column
	 * @return
	 */
	@IgnoreAuth
	@RequestMapping("/option/{tableName}/{columnName}")
	public R getOption(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName,String level,String parent) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("table", tableName);
		params.put("column", columnName);
		if(StringUtils.isNotBlank(level)) {
			params.put("level", level);
		}
		if(StringUtils.isNotBlank(parent)) {
			params.put("parent", parent);
		}
		List<String> data = commonService.getOption(params);
		return R.ok().put("data", data);
	}
	
	/**
	 * 根据table中的column获取单条记录
	 * @param table
	 * @param column
	 * @return
	 */
	@IgnoreAuth
	@RequestMapping("/follow/{tableName}/{columnName}")
	public R getFollowByOption(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName, @RequestParam String columnValue) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("table", tableName);
		params.put("column", columnName);
		params.put("columnValue", columnValue);
		Map<String, Object> result = commonService.getFollowByOption(params);
		return R.ok().put("data", result);
	}
	
	/**
	 * 修改table表的sfsh状态
	 * @param table
	 * @param map
	 * @return
	 */
	@RequestMapping("/sh/{tableName}")
	public R sh(@PathVariable("tableName") String tableName, @RequestBody Map<String, Object> map) {
		map.put("table", tableName);
		commonService.sh(map);
		return R.ok();
	}
	
	/**
	 * 获取需要提醒的记录数
	 * @param tableName
	 * @param columnName
	 * @param type 1:数字 2:日期
	 * @param map
	 * @return
	 */
	@IgnoreAuth
	@RequestMapping("/remind/{tableName}/{columnName}/{type}")
	public R remindCount(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName, 
						 @PathVariable("type") String type,@RequestParam Map<String, Object> map) {
		map.put("table", tableName);
		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));
			}
		}
		
		int count = commonService.remindCount(map);
		return R.ok().put("count", count);
	}
	
	/**
	 * 单列求和
	 */
	@IgnoreAuth
	@RequestMapping("/cal/{tableName}/{columnName}")
	public R cal(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("table", tableName);
		params.put("column", columnName);
		Map<String, Object> result = commonService.selectCal(params);
		return R.ok().put("data", result);
	}
	
	/**
	 * 分组统计
	 */
	@IgnoreAuth
	@RequestMapping("/group/{tableName}/{columnName}")
	public R group(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("table", tableName);
		params.put("column", columnName);
		List<Map<String, Object>> result = commonService.selectGroup(params);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		for(Map<String, Object> m : result) {
			for(String k : m.keySet()) {
				if(m.get(k) instanceof Date) {
					m.put(k, sdf.format((Date)m.get(k)));
				}
			}
		}
		return R.ok().put("data", result);
	}
	
	/**
	 * (按值统计)
	 */
	@IgnoreAuth
	@RequestMapping("/value/{tableName}/{xColumnName}/{yColumnName}")
	public R value(@PathVariable("tableName") String tableName, @PathVariable("yColumnName") String yColumnName, @PathVariable("xColumnName") String xColumnName) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("table", tableName);
		params.put("xColumn", xColumnName);
		params.put("yColumn", yColumnName);
		List<Map<String, Object>> result = commonService.selectValue(params);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		for(Map<String, Object> m : result) {
			for(String k : m.keySet()) {
				if(m.get(k) instanceof Date) {
					m.put(k, sdf.format((Date)m.get(k)));
				}
			}
		}
		return R.ok().put("data", result);
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值