@TOC
springboot347基于web的铁路订票管理系统--论文
研究背景
近年来,由于计算机技术和互联网技术的飞速发展,所有企事业单位内部都是数字化、信息化、无纸化的发展趋势,随着这种趋势的发展,各种决策系统、辅助系统也应运而生,其中,铁路订票管理系统就是其中的重要组成部分。
铁路订票管理工作向来都是社会上不可或缺的一部分,然而多年以来人们大都习惯使用传统方法,即人工来完成铁路订票的管理,但是这种方法存在着工作效率低以及保密性差的问题,同时还会生成大量的文本和数据,在检索数据时极大不便。随着科技发展进步,我们已进入了信息化社会,仅仅依靠传统的表格管理方式已不能适应时代的要求。因此使用计算机来进行接手传统方式的铁路订票管理已经势在必行。
而通过计算机技术来实现的铁路订票管理系统拥有对信息的快速检索、保存了大量的铁路订票信息、信息系统保存的稳定性高和维护成本低等优点,对铁路订票管理的工作效率也能提高。如今,传统的人工管理方法、文件和图表打印等信息传输方法已经不能满足当下的发展需求,计算机科学与互联网技术的蓬勃发展,颠覆了人们的生活以及思维方式。铁路订票管理系统的出现,利用信息技术将铁路订票管理融于办公平台中,成为提高管理水平的有利手段,将会成为未来铁路订票管理的新模式。
1.2 课题研究意义
在当下,办公自动化以一种迅速并不可阻挡的速度在慢慢遍布到社会的每一个角落中,而铁路订票管理系统正是办公自动化的一个小小分支,解决了传统铁路订票管理中繁杂且重复的操作,提高了工作的效率。
对于火车站来说,铁路订票管理系统对于管理人员进行管理来说是非常重要的,站在管理者的角度也一样。铁路订票管理系统应该做到让管理人员进行快捷的信息查询以及对信息的处理功能。然而,大多数还没有使用电子化管理来进行铁路订票工作的意识,还是使用传统的人工管理方法。如今,伴随着计算机科学的不断发展,互联网科技的日渐成熟,计算机所带来的种种优势已经逐渐为人们所认识,它已经应用在社会中的各个领域中并且越来越重要,利用计算机将铁路订票信息进行电子化、系统化的管理能将铁路订票管理的效率提上一个台阶。所以,开发一套基于web的铁路订票管理系统,将信息进行电子化、系统化的管理,代替了传统的人工管理方式,提升了工作效率。
- 无纸化办公,节省了时间,减少了纸张的浪费同时节约了成本。
- 加快了信息传输的过程,使铁路订票管理更规范和科学。
- 利用计算机处理速度快、信息存储量大的特点,将管理工作信息化,可以积累和管理大量的数据。
- 对数据进行有效并且集中的管理,实现了用户信息的共享,使管理工作可以从传统的人工管理中解放出来,提升了工作的效率,使其有更多的时间去完成更多的工作,来提高自身的业务素质。
1.3 课题研究内容
本系统结合现今铁路订票管理系统的功能模块以及设计方式进行分析,使用Java语言和SpringBoot框架进行开发设计,具体研究内容如下:
- 用户可以进入系统进行个人信息修改,对车票预订管理、车票退票管理等进行操作。
- 管理员登录系统后,可以对个人信息进行修改,对用户管理、火车类型管理、火车信息管理、车票预订管理、车票退票管理、系统管理等功能进行管理;
2 系统开发环境及相关技术
2.1 系统开发环境
本管理系统采用的集成开发环境为IntelliJ IDEA,使用Java等语言及SpringBoot框架进行开发,其中硬件环境和软件环境如下:
- 硬件环境
处理器:Intel(R) Core(TM) i5-7400 CPU @ 3.00GHz 3.00GHz
内存:8GB
- 软件环境
操作系统:windows 10 64位操作系统
开发工具:IntelliJ IDEA 2019.1
2.2 系统开发技术
铁路订票管理系统采用B/S(Browser/Server)架构和MVC模型进行设计开发。在B/S架构下,用户在浏览器端进行使用,主要工作通过服务器端进行实现,用户通过网站进行访问大大节约了成本。本系统使用Java等语言同时运用了SpringBoot框架进行开发,使用MySQL进行数据存储。
2.2.1 Java编程语言
Java语言作为现在主流编程语言之一,就是因为它有很多自己的特点和优势。Java语言具有以下几个特点:
(1)跨平台性
平时所说的一次编译,到处执行,指的就是这个跨平台性。Java的源代码编译后会生成字节码文件,这些文件可以被Java虚拟机执行,得到想要的结果。在设备上安装对应的虚拟机,Java的字节码文件就可以运行。
(2)面向对象
Java是一个面向对象的编程语言。面向对象是指把属性和方法进行封装,通过创建的对象调用里面的方法,实现一些功能。
(3)多线程
Java是支持多线程的,它允许在一个程序中同时开启多个线程,同时处理多个任务,这样可以提高它的效率。
Java语言对于开发工具要求不高,有专业的编程工具Eclipse会更顺利编程,但是,没有专业的编程软件,用记事本也能进行编辑。
2.2.2 SpringBoot框架
Spring Boot是由Pivotal的开发团队在2013年开发的一个免费、轻量级、开源的系统框架。SpringBoot的主要设计思想是约定大于配置,因此SpringBoot在设计时几乎达到零配置。SpringBoot集成了业界的开源框架。
SpringBoot是一个非常强大的后台框架,因为SpringBoot的开发基本上不需要写配置文件,所以利用SpringBoot来构建网站的后台环境,在SpringBoot的YML配置文件中写项目启动端口,项目就可以启动了。项目的Java和静态文件由SpringBoot管理。
2.2.3 MySQL数据库
MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),关系数据库将数据保存在不同的表中,提高了灵活性,它使用最常用的结构化查询语言(SQL)进行数据库管理。MySQL因其具有速度快、体积小、总体拥有成本低和开放源码的优点而备受关注。没有数据库就没有Web系统,Mysql数据库是数据库中比较常用的,这都是源于它的特点。
(1)Mysql是相比于Oracle更轻量、更简洁便于使用,在服务部署方面相对复杂度低,更利于毕设系统的开发。
(2)Mysql是免费开源的,对个人开发系统很友好。
(3)Mysql占用空间内存比较小,发行版安装后不到100兆。
(4)Mysql可以使用Sql语言进行调用,学习成本较低。
(5)Mysql可支持互联网数据共享也支持数据安全设置,防止数据泄露。
(6)Mysql运行到各种版本的操作系统中无论是服务器上,还是我们开发用的笔记本上。
(7)Mysql运行速度很快。
2.2.4 B/S结构
B/S结构就是指系统客户端与服务器分离,客户端通过浏览器访问服务端进行操作[10]。
B/S结构目前广泛应用于绝大部分系统搭建中,这种结构摒弃C/S结构客户端服务端不分离的缺点,具有更多的优势:
(1)跨平台性:B/S的标准由标准化组织确立,适用于绝大多数的系统搭建,通用于应用之间。
(2)低维护成本:客户端和服务器端分离,减轻了两端的压力,尤其是客户端,对客户端设备,硬件、软件要求都比较低,并且系统需要升级或维护时,只需要在服务器端升级或维护就可以,使相应的费用减少。
3 系统需求分析
在当今的社会生活中,互联网已经变得非常普遍和重要。充分利用互联网大数据等技术可以解决很多问题。目前,铁路订票管理也面临着自身的问题。根据这一普遍现象,铁路订票制度的出现需求巨大。该系统可以很好地解决这些问题。系统中这两类用户的数据在系统中非常关键,因此系统数据应该被组织起来,因为数据是以某种格式存储的,而不是无序的。其概念是,它可以根据长期稳定的格式在计算机内存中共享。数据库管理系统主要用于保存、修改和添加索引数据以及设置数据库。为了确保系统数据管理的顺利进行,一些有能力的处理器可以在不需要专业人员处理的情况下管理数据。创建数据表时,可以调整、重新组织和重建数据表中的数据,以确保数据可靠性。在数据库系统设计中,MySQL主要用于实现数据的集中管理。各方面表现良好。
2.1 可行性分析
根据铁路订票管理系统的功能,通过对经济效益、技术难点和管理方法进行全面的可行性分析,提供准确的可行性依据。以下是本系统的可行性分析:
- 经济可行性
使用了免费版的IntelliJ IDEA节省了开发成本,在购买服务器后部署项目便能通过浏览器进行访问。
- 技术可行性
本管理系统采用B/S架构和MVC模型进行设计,通过分层分包的方法,有利于日常的维护,同时降低了代码之间的耦合。
- 管理可行性
本管理系统要求管理难度低,只需要有管理员就能够对个人中心、用户管理、火车类型管理、火车信息管理、车票预订管理、车票退票管理、系统管理等信息等进行删除、修改和添加操作。
3.2 功能需求分析
铁路订票管理系统综合网络空间开发设计要求。目的是将铁路订票通过网络平台将传统管理方式转换为在线上管理,完成铁路订票的方便快捷、安全性高、交易规范做了保障,目标明确。铁路订票管理系统可以将功能划分为用户的使用功能和管理员功能。
(1)、用户关键功能包含用户注册登录,个人信息修改,对车票预订管理、车票退票管理等功能进行操作。用户用例如下:
图3-1 用户用例图
(2)、管理员的功能是最高的,可以对系统所在功能进行查看,修改和删除,包括用户功能。管理员用例如下:
图3-2管理员用例图
3.3 系统流程分析
3.3.1 登录流程
每个用户都有专属的密码和账号,在输入合法的账号和密码之后即可进入系统。登录流程如图3-3所示:
图3-3 登录流程图
3.3.2 添加信息流程
管理层人员有添加角色和用户等功能。添加信息流程如图3-4所示:
图3-4 添加信息流程图
3.3.3 收藏信息流程
在铁路订票管理系统中,用户登录后,浏览铁路订票信息详情界面能进行信息收藏,用户收藏信息的流程图如图3-5所示:
图3-5 用户收藏信息流程图
4 系统设计
4.1 功能模块设计
铁路订票管理系统按照权限的类型进行划分,分为用户和管理员两个模块。管理员模块主要针对整个系统的管理进行设计,提高了管理的效率和标准。主要功能包括个人中心、用户管理、火车类型管理、火车信息管理、车票预订管理、车票退票管理、系统管理等;系统的总体模块设计如下图所示:
图4-1 系统总体模块设计
4.2 系统数据库设计
4.2.1 数据库系统
本系统采用MySQL来进行数据库的管理。MySQL数据库具有体积小、速度快、成本低等优点。具备同时处理数千万条记录,实现大型数据库的高并发读写和高效读写需求[9]。
4.2.2 数据库概念设计
概念模型用于对信息世界建模,并与指定的数据库管理系统分离。它有助于将真实世界的事物抽象为适合于数据库管理系统的数据库模型。人们倾向于将现实世界抽象为信息世界,再把信息世界变成机器世界。也就是说,将现实世界的目标抽象成独立于专用计算机软件和专用数据库管理系统的信息结构的数据模型,然后将物理模型转化为适合电子计算机的数据库管理系统。事实上,数据模型是从真实世界到机器世界的中间层。
信息世界的基本要素包括实体和关联。现实存在且彼此可区别的事物称为实体[13]。实体可以是实际的人、事或物,还可以是抽象化的概念或联络。以下是对部分主要的关键实体如下:
火车信息实体属性图如下所示。
图4-2火车信息实体属性图
车票预订实体属性图如下所示。
图4-3车票预订实体属性图
车票退票实体属性图如下所示。
图4-4车票退票实体属性图
用户实体属性图如下所示。
图4-5用户实体属性图
公告资讯实体属性图如下所示。
图4-5公告资讯实体属性图
4.2.3 数据表设计
本设计根据数据表管理系统的具体流程进行管理,方便用户和管理员对数据的添加、删除、修改和查询等操作。
4.2.4 数据表的建立
系统采用Navicat Premium对数据库进行操作,数据库管理操作简单,数据处理能力强。数据表建立如下:
表4-1:token表
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
userid | bigint | 用户id | |||
username | varchar | 100 | 用户名 | ||
tablename | varchar | 100 | 表名 | ||
role | varchar | 100 | 角色 | ||
token | varchar | 200 | 密码 | ||
addtime | timestamp | 新增时间 | CURRENT_TIMESTAMP | ||
expiratedtime | timestamp | 过期时间 | CURRENT_TIMESTAMP |
表4-2:关于我们
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
title | varchar | 200 | 标题 | ||
subtitle | varchar | 200 | 副标题 | ||
content | longtext | 4294967295 | 内容 | ||
picture1 | longtext | 4294967295 | 图片1 | ||
picture2 | longtext | 4294967295 | 图片2 | ||
picture3 | longtext | 4294967295 | 图片3 |
表4-3:收藏表
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
userid | bigint | 用户id | |||
refid | bigint | 商品id | |||
tablename | varchar | 200 | 表名 | ||
name | varchar | 200 | 名称 | ||
picture | longtext | 4294967295 | 图片 | ||
type | varchar | 200 | 类型(1:收藏,21:赞,22:踩,31:竞拍参与,41:关注) | 1 | |
inteltype | varchar | 200 | 推荐类型 | ||
remark | varchar | 200 | 备注 |
表4-4:公告资讯
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
title | varchar | 200 | 标题 | ||
introduction | longtext | 4294967295 | 简介 | ||
picture | longtext | 4294967295 | 图片 | ||
content | longtext | 4294967295 | 内容 |
表4-5:火车信息
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
chexuhao | varchar | 200 | 车序号 | ||
huocheleixing | varchar | 200 | 火车类型 | ||
checi | varchar | 200 | 车次 | ||
qidianzhan | varchar | 200 | 起点站 | ||
zhongdianzhan | varchar | 200 | 终点站 | ||
kaicheshijian | datetime | 开车时间 | |||
daozhanshijian | datetime | 到站时间 | |||
chepiaoleixing | varchar | 200 | 车票类型 | ||
zuoweileixing | varchar | 200 | 座位类型 | ||
liechetupian | longtext | 4294967295 | 列车图片 | ||
chepiaojiage | int | 车票价格 | |||
liecheluxian | longtext | 4294967295 | 列车路线 |
表4-6:火车类型
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
huocheleixing | varchar | 200 | 火车类型 |
表4-7:火车信息评论表
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
refid | bigint | 关联表id | |||
userid | bigint | 用户id | |||
avatarurl | longtext | 4294967295 | 头像 | ||
nickname | varchar | 200 | 用户名 | ||
content | longtext | 4294967295 | 评论内容 | ||
reply | longtext | 4294967295 | 回复内容 |
表4-8:配置文件
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
name | varchar | 100 | 配置参数名称 | ||
value | varchar | 100 | 配置参数值 |
表4-9:车票预订
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
yudingbianhao | varchar | 200 | 预订编号 | ||
chexuhao | varchar | 200 | 车序号 | ||
huocheleixing | varchar | 200 | 火车类型 | ||
checi | varchar | 200 | 车次 | ||
qidianzhan | varchar | 200 | 起点站 | ||
zhongdianzhan | varchar | 200 | 终点站 | ||
kaicheshijian | datetime | 开车时间 | |||
daozhanshijian | datetime | 到站时间 | |||
chepiaoleixing | varchar | 200 | 车票类型 | ||
zuoweileixing | varchar | 200 | 座位类型 | ||
chepiaojiage | int | 车票价格 | |||
yudingshijian | datetime | 预订时间 | |||
yudingbeizhu | longtext | 4294967295 | 预订备注 | ||
yonghuzhanghao | varchar | 200 | 用户账号 | ||
yonghuxingming | varchar | 200 | 用户姓名 | ||
sfsh | varchar | 200 | 是否审核 | 待审核 | |
shhf | longtext | 4294967295 | 审核回复 | ||
ispay | varchar | 200 | 是否支付 | 未支付 |
表4-10:用户
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
yonghuzhanghao | varchar | 200 | 用户账号 | ||
mima | varchar | 200 | 密码 | ||
yonghuxingming | varchar | 200 | 用户姓名 | ||
xingbie | varchar | 200 | 性别 | ||
yonghudianhua | varchar | 200 | 用户电话 | ||
touxiang | longtext | 4294967295 | 头像 |
表4-11:车票退票
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
tuipiaobianhao | varchar | 200 | 退票编号 | ||
chexuhao | varchar | 200 | 车序号 | ||
huocheleixing | varchar | 200 | 火车类型 | ||
checi | varchar | 200 | 车次 | ||
qidianzhan | varchar | 200 | 起点站 | ||
zhongdianzhan | varchar | 200 | 终点站 | ||
kaicheshijian | datetime | 开车时间 | |||
daozhanshijian | datetime | 到站时间 | |||
chepiaoleixing | varchar | 200 | 车票类型 | ||
zuoweileixing | varchar | 200 | 座位类型 | ||
chepiaojiage | int | 车票价格 | |||
tuipiaoshijian | datetime | 退票时间 | |||
tuipiaobeizhu | longtext | 4294967295 | 退票备注 | ||
yonghuzhanghao | varchar | 200 | 用户账号 | ||
yonghuxingming | varchar | 200 | 用户姓名 | ||
sfsh | varchar | 200 | 是否审核 | 待审核 | |
shhf | longtext | 4294967295 | 审核回复 |
表4-12:用户表
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
username | varchar | 100 | 用户名 | ||
password | varchar | 100 | 密码 | ||
role | varchar | 100 | 角色 | 管理员 | |
addtime | timestamp | 新增时间 | CURRENT_TIMESTAMP |
5 系统实现
5.1系统功能实现
当人们打开系统的网址后,首先看到的就是首页界面。在这里,人们能够看到系统的导航条,通过导航条导航进入各功能展示页面进行操作。系统首页界面如图5-1所示:
图5-1 系统首页界面
系统注册:在系统注册页面的输入栏中输入用户注册信息进行注册操作,系统注册页面如图5-2所示:
图5-2系统注册页面
火车信息:在火车信息页面的输入栏中选择火车类型和车票类型,输入车次、起点站和终点站进行查询,可以查看到火车详细信息,并根据需要进行预订、评论或收藏操作;火车信息页面如图5-3所示:
图5-3火车信息详细页面
个人中心:在个人中心页面通过填写个人详细信息进行更新信息操作;还可以对我的收藏进行详细操作;如图5-4所示:
图5-4个人中心界面
5.2后台模块实现
后台用户登录,在登录页面选择需要登录的角色,在正确输入用户名和密码后,进入操作系统进行操作;如图5-5所示。
图5-5 后台登录界面
5.2.1管理员模块实现
管理员进入主页面,主要功能包括对个人中心、用户管理、火车类型管理、火车信息管理、车票预订管理、车票退票管理、系统管理等进行操作。管理员主页面如图5-6所示:
图5-6 管理员主界面
管理员点击用户管理。在用户页面输入用户账号和选择性别进行查询、新增或删除用户列表,并根据需要对用户详情信息进行详情、修改或删除操作;如图5-7所示:
图5-7用户管理界面
管理员点击火车类型管理。在火车类型页面输入类型信息进行查询、新增或删除火车类型列表,并根据需要对火车类型详情信息进行修改或删除操作;如图5-8所示:
图5-8火车类型管理界面
管理员点击火车信息管理。在火车信息页面选择火车类型和车票类型,输入车次、起点站和终点站进行查询、新增或删除火车信息列表,并根据需要对火车详情信息进行详情、修改、查看评论或删除操作;如图5-9所示:
图5-9火车信息管理界面
管理员点击车票退票管理。在车票退票页面输入火车类型、车次、起点站、终点站、车票类型和选择是否通过进行查询或删除车票退票列表,并根据需要对车票退票详情信息进行详情、修改或删除操作;如图5-10所示:
图5-10车票退票管理界面
管理员点击系统管理。在公告资讯页面输入标题进行查询、新增或删除公告资讯列表,并根据需要对公告资讯详情信息进行详情、修改或删除操作;还可以对关于我们、系统简介和轮播图管理进行详细操作;如图5-11所示:
图5-11系统管理界面
5.2.2用户模块实现
用户进入系统可以对个人中心、车票预订管理、车票退票管理等功能进行操作。用户主页面如图5-12所示:
图5-12 用户主界面
用户点击车票预订管理。在车票预订页面输入火车类型、车次、起点站、终点站、车票类型和选择是否通过进行查询或删除车票预订列表,并根据需要对车票预订详细信息进行详情、退票、修改或删除操作。如图5-13所示:
图5-13车票预订管理界面
用户点击车票退票管理。在车票退票页面输入火车类型、车次、起点站、终点站、车票类型和选择是否通过进行查询或删除车票退票列表,并根据需要对车票退票详细信息进行详情、修改或删除操作。如图5-14所示:
图5-14车票退票管理界面
系统测试
NewsController.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.transaction.annotation.Transactional;
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.NewsEntity;
import com.entity.view.NewsView;
import com.service.NewsService;
import com.service.TokenService;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.MD5Util;
import com.utils.MPUtil;
import com.utils.CommonUtil;
import java.io.IOException;
/**
* 公告资讯
* 后端接口
* @author
* @email
* @date 2023-01-05 15:26:04
*/
@RestController
@RequestMapping("/news")
public class NewsController {
@Autowired
private NewsService newsService;
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params,NewsEntity news,
HttpServletRequest request){
EntityWrapper<NewsEntity> ew = new EntityWrapper<NewsEntity>();
PageUtils page = newsService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, news), params), params));
return R.ok().put("data", page);
}
/**
* 前端列表
*/
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params,NewsEntity news,
HttpServletRequest request){
EntityWrapper<NewsEntity> ew = new EntityWrapper<NewsEntity>();
PageUtils page = newsService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, news), params), params));
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/lists")
public R list( NewsEntity news){
EntityWrapper<NewsEntity> ew = new EntityWrapper<NewsEntity>();
ew.allEq(MPUtil.allEQMapPre( news, "news"));
return R.ok().put("data", newsService.selectListView(ew));
}
/**
* 查询
*/
@RequestMapping("/query")
public R query(NewsEntity news){
EntityWrapper< NewsEntity> ew = new EntityWrapper< NewsEntity>();
ew.allEq(MPUtil.allEQMapPre( news, "news"));
NewsView newsView = newsService.selectView(ew);
return R.ok("查询公告资讯成功").put("data", newsView);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
NewsEntity news = newsService.selectById(id);
return R.ok().put("data", news);
}
/**
* 前端详情
*/
@IgnoreAuth
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id){
NewsEntity news = newsService.selectById(id);
return R.ok().put("data", news);
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody NewsEntity news, HttpServletRequest request){
news.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(news);
newsService.insert(news);
return R.ok();
}
/**
* 前端保存
*/
@RequestMapping("/add")
public R add(@RequestBody NewsEntity news, HttpServletRequest request){
news.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(news);
newsService.insert(news);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
@Transactional
public R update(@RequestBody NewsEntity news, HttpServletRequest request){
//ValidatorUtils.validateEntity(news);
newsService.updateById(news);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
newsService.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<NewsEntity> wrapper = new EntityWrapper<NewsEntity>();
if(map.get("remindstart")!=null) {
wrapper.ge(columnName, map.get("remindstart"));
}
if(map.get("remindend")!=null) {
wrapper.le(columnName, map.get("remindend"));
}
int count = newsService.selectCount(wrapper);
return R.ok().put("count", count);
}
}
BaiduUtil.java
package com.utils;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.json.JSONObject;
/**
* 类说明 :
*/
public class BaiduUtil {
/**
* 根据经纬度获得省市区信息
* @param lon 纬度
* @param lat 经度
* @param coordtype 经纬度坐标系
* @return
*/
public static Map<String, String> getCityByLonLat(String key, String lng, String lat) {
String location = lat + "," + lng;
try {
//拼装url
String url = "http://api.map.baidu.com/reverse_geocoding/v3/?ak="+key+"&output=json&coordtype=wgs84ll&location="+location;
String result = HttpClientUtils.doGet(url);
JSONObject o = new JSONObject(result);
Map<String, String> area = new HashMap<>();
area.put("province", o.getJSONObject("result").getJSONObject("addressComponent").getString("province"));
area.put("city", o.getJSONObject("result").getJSONObject("addressComponent").getString("city"));
area.put("district", o.getJSONObject("result").getJSONObject("addressComponent").getString("district"));
area.put("street", o.getJSONObject("result").getJSONObject("addressComponent").getString("street"));
return area;
}catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 获取API访问token
* 该token有一定的有效期,需要自行管理,当失效时需重新获取.
* @param ak - 百度云官网获取的 API Key
* @param sk - 百度云官网获取的 Securet Key
* @return assess_token
*/
public static String getAuth(String ak, String sk) {
// 获取token地址
String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
String getAccessTokenUrl = authHost
// 1. grant_type为固定参数
+ "grant_type=client_credentials"
// 2. 官网获取的 API Key
+ "&client_id=" + ak
// 3. 官网获取的 Secret Key
+ "&client_secret=" + sk;
try {
URL realUrl = new URL(getAccessTokenUrl);
// 打开和URL之间的连接
HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
connection.setRequestMethod("GET");
connection.connect();
// 获取所有响应头字段
Map<String, List<String>> map = connection.getHeaderFields();
// 遍历所有的响应头字段
for (String key : map.keySet()) {
System.err.println(key + "--->" + map.get(key));
}
// 定义 BufferedReader输入流来读取URL的响应
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String result = "";
String line;
while ((line = in.readLine()) != null) {
result += line;
}
/**
* 返回结果示例
*/
System.err.println("result:" + result);
org.json.JSONObject jsonObject = new org.json.JSONObject(result);
String access_token = jsonObject.getString("access_token");
return access_token;
} catch (Exception e) {
System.err.printf("获取token失败!");
e.printStackTrace(System.err);
}
return null;
}
}
MD5Util.java
package com.utils;
import cn.hutool.crypto.digest.DigestUtil;
public class MD5Util {
/**
* @param text明文
* @param key密钥
* @return 密文
*/
// 带秘钥加密
public static String md5(String text) {
// 加密后的字符串
String md5str = DigestUtil.md5Hex(text);
return md5str;
}
}
HomeComment.vue
<template>
<div class="home-comment">
<div class="title">用户留言</div>
<div class="comment-list">
<div v-for="(item,index) in list" v-bind:key="index" class="comment-item">
<div class="user-content">
<el-image
class="avator"
:src="item.avator"
></el-image>
<span class="user">{{item.name}}</span>
</div>
<div class="comment">{{item.content}}</div>
<div class="create-time">{{item.createTime}}</div>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
list: [
{
name: "MaskLin",
avator:
"https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg",
content:
"你以为只要长得漂亮就有男生喜欢?你以为只要有了钱漂亮妹子就自己贴上来了?你以为学霸就能找到好工作?我告诉你吧,这些都是真的!",
createTime: "5月02日 00:00"
},
{
name: "MaskLin",
avator:
"https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg",
content: "作者太帅了",
createTime: "5月04日 00:00"
},
{
name: "MaskLin",
avator:
"https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg",
content: "作者太帅了",
createTime: "5月04日 00:00"
},
{
name: "MaskLin",
avator: "https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg",
content: "作者太帅了",
createTime: "5月04日 00:00"
}
]
};
}
};
</script>
<style lang="scss" scoped>
.home-comment {
background: #ffffff;
.title {
font-size: 18px;
color: #666;
font-weight: bold;
padding: 10px;
border-bottom: 1px solid #eeeeee;
}
.comment-list {
padding: 10px;
.comment-item {
padding: 10px;
border-bottom: 1px solid #eeeeee;
.user-content {
display: flex;
align-items: center;
.user {
font-size: 18px;
color: #666;
font-weight: bold;
line-height: 50px;
margin-left: 10px;
}
.avator {
width: 50px;
height: 50px;
border-radius: 50%;
}
}
.comment {
margin-top: 10px;
font-size: 14px;
color: #888888;
}
.create-time {
margin-top: 15px;
font-size: 14px;
color: #888888;
}
}
}
}
</style>