@TOC
springboot582流浪猫狗救助救援网站_4a4i2--论文
第一章 绪 论
1.1研究背景
随着经济发展,各类电子产品普及千家万户。网民数量不断增加,网络显然已经成为了人际交流的重要形式。回顾近一个世纪的科技发展史,各类新的信息发布手段均随着时代洪流更新。旧时代是广播,报纸,电视,它们随发展依次取代对方,当今社会网络可将许多事情由繁化简,网络媒体相较于上述媒介,具有许多独特优点,因此网络媒体在我们的生活中所占地位逐渐上升,其重要性毋庸置疑。
起初通过HTML静态网页直接进行流浪猫狗救助救援管理,具有即时性,无时空限制,蕴含丰富信息等特点,完美契合流浪猫狗救助救援时效性、信息量大等需求。但随着Internet的进一步发展,实时信息不断变更,增加,交互性需求增大,静态网页显得难以胜任。流浪猫狗救助救援网站的设计从最初简单的静态网页设计,到现在的基于B/S模式的流浪猫狗救助救援网站,已经逐渐形成了一个系统化、规范化的设计理念。因此需要一种动态的平台实现流浪猫狗救助救援管理。并且该系统应成为一个不单只是提供信息浏览服务,还要给予用户实用的交互功能。
本文在此背景下,设计基于B/S(浏览器和服务器)的流浪猫狗救助救援网站,提供用户强大的多方面互动,创造更多实际价值。
1.2系统研究现状
我国信息技术虽然起步较晚,但发展速度迅猛,如今已经跻身世界信息大国的行列。现在我们的生活离不开信息技术,人们可以利用计算机、互联网进行网上购物、视频学习、互动交流,信息技术已经渗透到我们的生活中,随着计算机技术、网络技术的迅速发展,研究并实现流浪猫狗救助救援网站是现代理论和科学技术相结合的产物。国内信息化发展趋势越来越快,我国信息化建设也随之迅速发展,通过信息系统对大量复杂数据进行管理代替传统人工管理,很大程度的提升管理效率。目前流浪猫狗救助救援网站基本实现了应用网络进行管理,使用各种技术、实现各种不同附加功能的系统数量众多。但随着近年来互联网技术的不断完善和更新,一些不适应当代信息化发展的技术正在被淘汰,而采用老旧技术实现的系统将出现维护困难的境况。因此符合现在社会发展的系统开发十分必要,流浪猫狗救助救援网站的设计和开发仍然有很大的进步空间。
国外部分发达国家的信息技术起步较早,以技术为基础引领的各行各业的变革产生时间也较早。信息化的理念由世界知名的美国麻省理工学院提出,接下来的三四十年随着网络技术的飞速发展,终于在全美形成了一系列非常完善成熟的信息化平台,自此美国国内大部分都实现了管理信息化。虽然制度存在不同,但由于美国信息化管理的起步时间早,积累经验多,有关流浪猫狗救助救援网站的研究技术经验仍然值得世界学习。
1.3 研究意义
本文结合目前基于B/S动态网页的流行技术和流浪猫狗救助救援管理传统流程,充分融合开发目的和系统各个功能的实现,实现在设计好的,美观的动态网页上实时,抛弃修改底层代码实现管理流浪猫狗救助救援信息,加快流浪猫狗救助救援管理速度。通过将流浪猫狗救助救援呈现在网站上,让用户联网登录对应网址就能浏览流浪猫狗救助救援信息,保质保量完成流浪猫狗救助救援管理并实现交互。
本系统对比以前主要有如下优点:
(1)实现无纸化流浪猫狗救助救援,节约人力资源与森林资源,避免浪费。
(2)减少流浪猫狗救助救援管理步骤,通过登录管理员后台,在设计好的人机交互页面直接进行流浪猫狗救助救援管理,简单易行,省时省力。
(3)系统长期保存流浪猫狗救助救援信息,浏览者可随时随地观看旧时流浪猫狗救助救援信息,了解舆论事件发展,保证流浪猫狗救助救援持续性。
(4)浏览者在对应流浪猫狗救助救援信息下进行评论,充分交换对流浪猫狗救助救援管理事件上的看法。
1.4 研究方法和设计思路
1.4.1研究方法
该流浪猫狗救助救援网站在Windows平台下完成开发,采用java编程语言开发,将应用程序部署于Tomcat上,加之MySQL接口来实现交互式响应服务器上的数据,将最终效果呈现于服务器上。运用MySQL数据库,使用Navicat premium连接数据库,从而实现数据库各个功能以友好的图形化界面展示。使用springboot框架,来降低各个层间解耦合,从而便捷高效完成开发。
1.4.2设计思路
该流浪猫狗救助救援网站应能够完成流浪猫狗救助救援信息发布的需求,程序安全,操作应简单易行,通过简洁美观的前端页面引导即可完成操作。从多角度多方面思考理解大众用户的功能需求,思考系统应该具备的核心功能模块,并完成相应开发。流浪猫狗救助救援网站应使用便捷,通过简单的日常浏览器即可使用该系统,方便管理者随时根据事件的发生快速更新主页,也方便浏览者随时随地查看。
3 大学本科毕业设计(论文)
第二章 开发工具和开发技术
2.1开发工具
本系统开发使用到的工具包括Tomcat,MySQL和Vision,下边对它们进行简单的介绍。
(1)Tomcat;Java Web应用程序开发中常用的应用服务器,我们可以将自己开发好的项目部署到Tomcat中进行运行测试,重点是Tomcat体积很小,不需要复杂的安装和配置,下载之后可以直接使用,非常方便。
(2)MySQL数据库;一种项目开发中常用的关系型数据库,因为体积小、开源、免费、简单易学、安装简单等特点[8],深受开发人员的喜爱,是大多数互联网公司的首选。将系统中的数据统一存储到这个数据库中,然后借助程序将这些数据读取出来,显示在页面上。
(3)Vision;Office办公组件之一,安装之后,可以用来绘制相应的图形,帮助我们更好的理解系统的情况,建立对系统清晰的认识,是开发中最常使用的建模工具。
2.2 开发技术
本系统在后台使用Java语言实现跨平台的处理,以B/S的结构方式以及springboot框架进行开发,数据库使用MySQL。
2.2.1 Java语言
Java 语言是一门受众很广的语言,来自Sun Microsystems公司,Java可运行在很多平台,相较于C++语言,不仅吸收了C++很多优点,还摈弃了里面许多晦涩难懂的概念,Java的优点很多,可面向对象开发,平台多样性以及可移植性很高,目前市面上很多大型网站项目都使用Java编写,由此可知Java的受欢迎程度很高。
2.2.2 Spring Boot框架
Spring Boot是由Pivota公司的团队在Spring框架的基础上所开发出的一个轻量级应用框架,其设计目的是为了简化使用传统Spring框架开发时初始搭建、配置、开发、测试和部署等复杂的流程,满足快速、敏捷开发的需要[[49]。传统Spring框架开启某些特性或引入第三方依赖时,需要配置大量的XML文件,比较繁琐且非常容易出错。而SpringBoot的理念则是“约定大于配置”,它集成了大量第三方依赖的配置,再配合内部自动装配的机制,仅需在Maven工程的POM文件中添加相关依赖即可实现开箱即用的效果,这使得开发人员更加专注于实现业务逻辑,而不是繁琐的配置。此外,Spring Boot内置了S ervlet容器如Tomcat和Jetty,项目可以直接通过} ar命令在本地启动,无需打包成wa:文件再部署到服务器上,大大减少了测试和部署的成本。目前,Spring Boot己经成为了后端服务器应用开发的主流技术[[50],其特点和优势总结如下:
(1)简化配置,遵循“约定大于配置”的理念,减少了样板代码、注释和XML配置文件的编写。
(2)内置Servlet容器,可在本地独立运行项目,方便测试和部署。
(3)自动装配,可以非常方便地与Spring生态系统中其他框架或第三方依赖集成。
(4)便于快速构建项目,尤其适合构建本系统。
2.2.3 B/S架构
B/S结构就是指系统客户端与服务器分离,客户端通过浏览器访问服务端进行操作。
B/S结构目前广泛应用于绝大部分系统搭建中,这种结构摒弃C/S结构客户端服务端不分离的缺点,具有更多的优势:
(1)跨平台性:B/S的标准由标准化组织确立,适用于绝大多数的系统搭建,通用于应用之间。
(2)低维护成本:客户端和服务器端分离,减轻了两端的压力,尤其是客户端,对客户端设备,硬件、软件要求都比较低,并且系统需要升级或维护时,只需要在服务器端升级或维护就可以,使相应的费用减少。
第三章 需求分析
在软件的命周期中,需求分析是其中关键的一环。需求分析过程中不仅要对系统应该实现的功能提出准确和完善的请求,还要考虑需求的可行性。需求分析对设计和实现一个系统具有决定性的重大意义。只有充分完整的需求分析才能为后续的系统开发过程和实现成果奠定基础。
3.1 需求描述
根据日常实际需要,一方面需要在系统中实现基础信息的管理,同时还需要结合实际情况的需要,提供流浪猫狗救助救援管理功能,方便流浪猫狗救助救援管理工作的展开,综合考虑,本套系统应该满足如下要求:
首先,在系统中需要实现对基础信息,包括登录注册、个人信息修改等信息的管理,这些是系统的基础信息,和系统中其他内容密切相关。
然后,系统中需要实现对用户信息的管理,允许管理员对用户信息进行必要的设置,同时要避免管理员对个人信息进行操作,保障用户的信息安全。
3.2可行性分析
3.2.1技术可行性分析
技术可行性分析基于现在web水平、软硬件水平能否开发出流浪猫狗救助救援网站,经过对市面常见流浪猫狗救助救援网站了解研究对比,以及此次流浪猫狗救助救援网站的估测,预计在技术方面开发本流浪猫狗救助救援网站是可行的。第一,java语言发展成熟且市面十分流行,由java完成本流浪猫狗救助救援网站的开发、调试,结合市面成熟的集成开发软件辅助开发,且本电脑配置win10系统,足够满足本次流浪猫狗救助救援网站开发。第二,验证技术发展迅速,使得本流浪猫狗救助救援网站安全性很高。综上所诉,开发本流浪猫狗救助救援网站完全可行。
3.2.2 经济可行性分析
经济可行性分析,就是分析在现有经济情况下能否完成本流浪猫狗救助救援网站的开发。下面对本系统开发、运行、维护的相关费用评估,以及投入到社会完成系统可能费用进行估算。网络资源丰富,本流浪猫狗救助救援网站只需使用任选一开源服务器即可,此方面无需投入费用。开发阶段,由于本流浪猫狗救助救援网站不属于大型系统,常规的电脑就可完成开发,不用购置相关硬件设备。软件方面,本系统只需使用网上免费下载的软件即可完成开发,这些软件在使用时简单易懂,无需培训,因此这方面也无需投入费用。由于本系统不属于大型系统,运行时候电费可以忽略不记。流浪猫狗救助救援网站作为自己毕设,由本人开发即可完成,无需人力费用。综上,整个系统开发花费很少,所以本流浪猫狗救助救援网站在经济上可行。
3.2.3 环境运行可行性分析
软件在能否在客户端使用并发挥效益的制约关键就是运行环境。计算机普及,现在人们接触各类系统频繁,日常生活使用计算机无障碍。并且该流浪猫狗救助救援网站页面简单,通过显示页面引导即可完成本流浪猫狗救助救援网站删除、增加、修改等功能。对计算机要求低,门槛低,通过常用浏览器即可使用本流浪猫狗救助救援网站。因此在运行环境方面,本流浪猫狗救助救援网站易于接受,是可行的。
3.2.4 法律可行性分析
法律可行性分析,即分析本流浪猫狗救助救援网站是否与各类法律相悖。本流浪猫狗救助救援网站使用市面开源免费软件开发,且作为个人毕设,无商用,均为本人自主开发,并且页面设计合理,发布的流浪猫狗救助救援要求符合常规。整个系统无抵触法律法规的问题。因此在法律上,本流浪猫狗救助救援网站可行。
3.3 系统功能需求分析
(1)系统的通用功能包括用户登录和密码修改,是两个角色共同需要使用的功能,用例分析如图3-1所示。
图3-1 系统通用功能用例分析图
(2)管理员可以对个人中心、用户管理、宠物分类管理、知识类型管理、流浪猫狗管理、领养信息管理、流浪猫狗知识管理、团队信息管理、活动分类管理、活动信息管理、志愿申请管理、系统管理等进行基本的信息管理。其用例分析如图3-2所示。
图3-2 管理员用例图
(3) 用户进入系统可以对个人中心、领养信息管理、志愿申请管理等功能进行操作,用例分析如图3-3所示。
图3-3用户用例图
3.4 非功能性需求分析
除了系统应具有的功能外,用户对使用该系统的体验也是关键,系统中应贯穿非功能需求。为提升浏览游客观感及使用体验,本系统要具有易用性和美观性。通过页面的简单提示就可完成操作,流浪猫狗救助救援展示界面应该清楚简洁,使游客通过美观的前台页面能快速定位想要浏览的流浪猫狗救助救援信息。后台界面也应简约,让小管理者通过简易操作完成管理目标流浪猫狗救助救援需求。其次是系统加载速度和响应时间,当游客点击流浪猫狗救助救援信息后,必须快速展示流浪猫狗救助救援具体内容对应网页,最好两秒内,否则游客很可能失去兴趣,退出本系统页面并更换浏览方式,失去系统对应网址的流量。然后是兼容性,由于现在流行的浏览器版本很多,同时游客数量巨大,不同管理者也有可能使用不同操作系统,因此本流浪猫狗救助救援网站应能够在多类不同浏览器上打开也不影响页面展示和访问效果。最后是稳定性,当管理者完成流浪猫狗救助救援发布操作时,流浪猫狗救助救援网站应能够稳定完成流浪猫狗救助救援展示页面的更新和数据库保存工作,以免工作白费和数据丢失。
3.5 系统流程分析
3.5.1 登录流程
每个用户都有专属的密码和账号,在输入合法的账号和密码之后即可进入系统。登录流程如图3-4所示:
图3-4登录流程图
3.5.2 添加信息流程
管理层人员有添加信息功能。添加信息流程如图3-5所示:
图3-5 添加信息流程图
3.5.3 删除流程
用户可以选择把自己发布的信息删掉,选择要删除的信息确认之后,删除信息的操作就完成了。删除信息流程图如图3-6所示。
图3-6 删除信息流程图
3.6 本章小结
本章首先对整个系统进行了详细的需求描述,然后按照这些要求对系统的角色和功能进行了详细的分析,并对这些要求进行了详细的说明。同时为保证需求分析的全面性,还对系统的一些非功能性需求进行描述和对系统流程进行分析,为以后的系统的开发提供了一个比较完善的参考依据。
14
第四章 系统设计
4.1 系统总体设计
系统的建设可以为流浪猫狗救助救援管理提供帮助,通过对一些基础信息管理实现针对性的安排,可以按照用户的角色权限使不同用户角色看到不一样的信息界面。现根据需求阶段的分析,我们可以大致确定系统需要包含的功能如下图所示:
系统总体结构图如下,见图4-1。
图4-1 系统总体结构图
4.2 数据库设计
数据库能直观反映表现系统的需求,数据库的设计能否切实符合系统的需求关系到整个系统最终的呈现结果。通过之前的分析梳理,明确了系统中需要包含的功能和要求。系统中除了涉及对数据库的增加、删除、查询、修改的基础操作较多,还要理清实体间的对应关系,据此完成表结构的设计与实现。
4.2.1 数据库逻辑设计
为了更直观阐明数据库的设计,使用 Vision 绘制的流浪猫狗救助救援网站数据模型E-R实体属性图。根据系统需求设计了以下几个主要实体。
宠物资讯实体属性图,如图4-2所示。
图4-2宠物资讯实体属性图
流浪猫狗知识实体属性图,如图4-3所示。
图4-3流浪猫狗知识实体属性图
流浪猫狗实体属性图,如图4-4所示。
图4-4流浪猫狗实体属性图
领养信息实体属性图,如图4-5所示。
图4-5领养信息实体属性图
4.2.2 数据库表设计
在关系数据E-R图中,分析并创建数据表,数据表用来记录信息,数据表关系由多个数据表组成,下面介绍的是数据表各个字段信息如下表所示。
表4-1:用户表
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
username | varchar | 100 | 用户名 | ||
password | varchar | 100 | 密码 | ||
role | varchar | 100 | 角色 | 管理员 | |
addtime | timestamp | 新增时间 | CURRENT_TIMESTAMP |
表4-2: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-3:流浪猫狗评论表
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
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-4:活动信息评论表
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
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-5:收藏表
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
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-6:配置文件
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
name | varchar | 100 | 配置参数名称 | ||
value | varchar | 100 | 配置参数值 |
表4-7:宠物资讯
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
title | varchar | 200 | 标题 | ||
introduction | longtext | 4294967295 | 简介 | ||
picture | longtext | 4294967295 | 图片 | ||
content | longtext | 4294967295 | 内容 |
表4-8:宠物分类
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
chongwufenlei | varchar | 200 | 宠物分类 |
表4-9:流浪猫狗知识
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
zhishibiaoti | varchar | 200 | 知识标题 | ||
zhishileixing | varchar | 200 | 知识类型 | ||
chongwutupian | longtext | 4294967295 | 宠物图片 | ||
xingtaitezheng | varchar | 200 | 形态特征 | ||
shenghuoxixing | varchar | 200 | 生活习性 | ||
xunyangfangfa | longtext | 4294967295 | 驯养方法 | ||
zhuyishixiang | varchar | 200 | 注意事项 | ||
zhishineirong | longtext | 4294967295 | 知识内容 | ||
fabushijian | datetime | 发布时间 |
表4-10:志愿申请
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
shenqingbianhao | varchar | 200 | 申请编号 | ||
tuanduimingcheng | varchar | 200 | 团队名称 | ||
tuanduidizhi | varchar | 200 | 团队地址 | ||
zhanghao | varchar | 200 | 账号 | ||
xingming | varchar | 200 | 姓名 | ||
xingbie | varchar | 200 | 性别 | ||
shoujihaoma | varchar | 200 | 手机号码 | ||
kongxianshijian | varchar | 200 | 空闲时间 | ||
shenqingyuanyin | varchar | 200 | 申请原因 | ||
shenqingneirong | longtext | 4294967295 | 申请内容 | ||
shenqingriqi | date | 申请日期 | |||
sfsh | varchar | 200 | 是否审核 | 待审核 | |
shhf | longtext | 4294967295 | 审核回复 |
表4-11:关于我们
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
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-12:流浪猫狗
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
chongwumingcheng | varchar | 200 | 宠物名称 | ||
chongwufenlei | varchar | 200 | 宠物分类 | ||
chongwuxingbie | varchar | 200 | 宠物性别 | ||
tupian | longtext | 4294967295 | 图片 | ||
nianling | int | 年龄 | |||
xingqing | varchar | 200 | 性情 | ||
aihao | varchar | 200 | 爱好 | ||
zhuangtai | varchar | 200 | 状态 | ||
shentizhuangkuang | varchar | 200 | 身体状况 | ||
yimiaojilu | longtext | 4294967295 | 疫苗记录 | ||
lingyangjilu | longtext | 4294967295 | 领养记录 | ||
clicktime | datetime | 最近点击时间 |
表4-13:知识类型
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
zhishileixing | varchar | 200 | 知识类型 |
表4-14:领养信息
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
chongwumingcheng | varchar | 200 | 宠物名称 | ||
chongwufenlei | varchar | 200 | 宠物分类 | ||
chongwuxingbie | varchar | 200 | 宠物性别 | ||
nianling | varchar | 200 | 年龄 | ||
xingqing | varchar | 200 | 性情 | ||
aihao | varchar | 200 | 爱好 | ||
shenqingpingzheng | longtext | 4294967295 | 申请凭证 | ||
shenqingyuanyin | longtext | 4294967295 | 申请原因 | ||
shenqingriqi | date | 申请日期 | |||
zhanghao | varchar | 200 | 账号 | ||
xingming | varchar | 200 | 姓名 | ||
shoujihaoma | varchar | 200 | 手机号码 | ||
sfsh | varchar | 200 | 是否审核 | 待审核 | |
shhf | longtext | 4294967295 | 审核回复 |
表4-15:用户
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
zhanghao | varchar | 200 | 账号 | ||
mima | varchar | 200 | 密码 | ||
xingming | varchar | 200 | 姓名 | ||
xingbie | varchar | 200 | 性别 | ||
youxiang | varchar | 200 | 邮箱 | ||
shoujihaoma | varchar | 200 | 手机号码 | ||
touxiang | longtext | 4294967295 | 头像 |
表4-15:活动信息
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
huodongmingcheng | varchar | 200 | 活动名称 | ||
huodongtupian | longtext | 4294967295 | 活动图片 | ||
huodongfenlei | varchar | 200 | 活动分类 | ||
huodongdizhi | varchar | 200 | 活动地址 | ||
huodongriqi | date | 活动日期 | |||
baomingrenshu | int | 报名人数 | |||
zhuyishixiang | varchar | 200 | 注意事项 | ||
tuanduimingcheng | varchar | 200 | 团队名称 | ||
tuanduidizhi | varchar | 200 | 团队地址 | ||
huodongjianjie | longtext | 4294967295 | 活动简介 | ||
huodongneirong | longtext | 4294967295 | 活动内容 | ||
faburiqi | date | 发布日期 |
表4-17:活动分类
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
huodongfenlei | varchar | 200 | 活动分类 |
表4-18:团队信息
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
tuanduimingcheng | varchar | 200 | 团队名称 | ||
tuanduifengmian | longtext | 4294967295 | 团队封面 | ||
tuanduidizhi | varchar | 200 | 团队地址 | ||
tuanduirenshu | int | 团队人数 | |||
tuanduikouhao | varchar | 200 | 团队口号 | ||
fuzeren | varchar | 200 | 负责人 | ||
chuangjianriqi | date | 创建日期 | |||
lianxifangshi | varchar | 200 | 联系方式 | ||
tuanduixiangqing | longtext | 4294967295 | 团队详情 |
4.3 本章小结
这一章着重介绍了整个系统的设计。确定了系统的功能结构,并在此基础上完成了数据库的设计。
第五章 详细设计与实现
5.1系统功能实现
当人们打开系统的网址后,首先看到的就是首页界面。在这里,人们能够看到系统的导航条,通过导航条导航进入各功能展示页面进行操作。系统首页界面如图5-1所示:
图5-1 系统首页界面
流浪猫狗:在流浪猫狗页面的输入栏中输入宠物名称、选择宠物分类、宠物性别和选择状态进行查询,可以查看到流浪猫狗详细信息,并根据需要进行宠物领养、评论或收藏操作;流浪猫狗页面如图5-2所示:
图5-2流浪猫狗详细页面
流浪猫狗知识:在流浪猫狗知识页面的输入栏中输入知识标题、形态特征和选择知识类型进行查询,可以查看到流浪猫狗知识详细信息,并根据需要进行评论或收藏操作;流浪猫狗知识页面如图5-3所示:
图5-3流浪猫狗知识详细页面
团队信息:在团队信息页面的输入栏中输入团队名称、团队地址和负责人进行查询,可以查看到团队详细信息,并根据需要进行申请、评论或收藏操作;团队信息页面如图5-4所示:
图5-4团队信息详细页面
活动信息:在活动信息页面的输入栏中输入活动名称、活动地址、团队名称和选择活动分类进行查询,可以查看到活动详细信息,并根据需要进行评论或收藏操作;活动信息页面如图5-5所示:
图5-5活动信息详细页面
个人中心:在个人中心通过填写个人详细信息进行更新信息操作,还可以对我的收藏进行详细操作;如图5-6所示:
图5-6个人中心界面
5.2后台模块实现
后台用户登录,在登录页面选择需要登录的角色,在正确输入用户名和密码后,进入操作系统进行操作;如图5-7所示。
图5-7后台登录界面
5.2.1管理员模块实现
管理员进入主页面,主要功能包括对个人中心、用户管理、宠物分类管理、知识类型管理、流浪猫狗管理、领养信息管理、流浪猫狗知识管理、团队信息管理、活动分类管理、活动信息管理、志愿申请管理、系统管理等进行操作。管理员主页面如图5-8所示:
图5-8 管理员主界面
管理员点击用户管理。在用户页面输入账号和姓名进行查询、新增或删除用户列表,并根据需要对用户详情信息进行详情、修改或删除操作;如图5-9所示:
图5-9用户管理界面
管理员点击流浪猫狗管理。在流浪猫狗页面输入宠物名称、选择宠物分类、宠物性别和状态进行查询、宠物类别统计、领养状态统计、新增或删除流浪猫狗列表,并根据需要对流浪猫狗详情信息进行详情、修改、查看评价或删除操作;如图5-10所示:
图5-10流浪猫狗管理界面
管理员点击领养信息管理。在领养信息页面输入宠物名称、宠物分类、姓名和选择是否通过进行查询或删除领养信息列表,并根据需要对领养详情信息进行详情、修改或删除操作;如图5-11所示:
图5-11领养信息管理界面
管理员点击流浪猫狗知识管理。在流浪猫狗知识页面输入知识标题、形态特征和选择知识类型进行查询、新增或删除流浪猫狗知识列表,并根据需要对流浪猫狗知识详情信息进行详情、修改、查看评论或删除操作;如图5-12所示:
图5-12流浪猫狗知识管理界面
管理员点击团队信息管理。在团队信息页面输入团队名称、团队地址和负责人进行查询、新增或删除团队信息列表,并根据需要对团队详情信息进行详情、活动、修改、查看评论或删除操作;如图5-13所示:
图5-13团队信息管理界面
管理员点击活动信息管理。在活动信息页面输入活动名称、活动地址、团队名称和选择活动分类进行查询或删除活动信息列表,并根据需要对活动详情信息进行详情、修改、查看评论或删除操作;如图5-14所示:
图5-14活动信息管理界面
管理员点击志愿申请管理。在志愿申请页面输入团队名称、姓名和选择是否通过进行查询、每日申请人数统计或删除志愿申请列表,并根据需要对志愿申请详情信息进行详情、修改或删除操作;如图5-15所示:
图5-15志愿申请管理界面
管理员点击系统管理。在宠物资讯页面输入标题进行查询、新增或删除宠物资讯列表,并根据需要对宠物资讯详情信息进行详情、修改或删除操作;还可以对轮播图管理、关于我们和系统简介进行详细操作;如图5-16所示:
图5-16系统管理界面
5.2.2用户功能实现
用户进入系统可以对个人中心、领养信息管理、志愿申请管理等功能进行操作。用户主页面如图5-17所示:
图5-17 用户主界面
用户点击志愿申请管理。在志愿申请页面输入团队名称、姓名和选择是否通过进行查询、新增或删除志愿申请列表,并根据需要对志愿申请详情信息进行详情、修改或删除操作;如图5-18所示:
图5-18志愿申请管理界面
5.3 本章小结
本章主要基于前面系统设计的内容,详细介绍了管理员和用户两个角色对流浪猫狗救助救援网站的主要功能界面进行详细介绍和展示。
ChongwufenleiController.java
package com.controller;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.text.ParseException;
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.ChongwufenleiEntity;
import com.entity.view.ChongwufenleiView;
import com.service.ChongwufenleiService;
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-05-04 23:10:31
*/
@RestController
@RequestMapping("/chongwufenlei")
public class ChongwufenleiController {
@Autowired
private ChongwufenleiService chongwufenleiService;
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params,ChongwufenleiEntity chongwufenlei,
HttpServletRequest request){
EntityWrapper<ChongwufenleiEntity> ew = new EntityWrapper<ChongwufenleiEntity>();
PageUtils page = chongwufenleiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, chongwufenlei), params), params));
return R.ok().put("data", page);
}
/**
* 前端列表
*/
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params,ChongwufenleiEntity chongwufenlei,
HttpServletRequest request){
EntityWrapper<ChongwufenleiEntity> ew = new EntityWrapper<ChongwufenleiEntity>();
PageUtils page = chongwufenleiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, chongwufenlei), params), params));
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/lists")
public R list( ChongwufenleiEntity chongwufenlei){
EntityWrapper<ChongwufenleiEntity> ew = new EntityWrapper<ChongwufenleiEntity>();
ew.allEq(MPUtil.allEQMapPre( chongwufenlei, "chongwufenlei"));
return R.ok().put("data", chongwufenleiService.selectListView(ew));
}
/**
* 查询
*/
@RequestMapping("/query")
public R query(ChongwufenleiEntity chongwufenlei){
EntityWrapper< ChongwufenleiEntity> ew = new EntityWrapper< ChongwufenleiEntity>();
ew.allEq(MPUtil.allEQMapPre( chongwufenlei, "chongwufenlei"));
ChongwufenleiView chongwufenleiView = chongwufenleiService.selectView(ew);
return R.ok("查询宠物分类成功").put("data", chongwufenleiView);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
ChongwufenleiEntity chongwufenlei = chongwufenleiService.selectById(id);
return R.ok().put("data", chongwufenlei);
}
/**
* 前端详情
*/
@IgnoreAuth
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id){
ChongwufenleiEntity chongwufenlei = chongwufenleiService.selectById(id);
return R.ok().put("data", chongwufenlei);
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody ChongwufenleiEntity chongwufenlei, HttpServletRequest request){
chongwufenlei.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(chongwufenlei);
chongwufenleiService.insert(chongwufenlei);
return R.ok();
}
/**
* 前端保存
*/
@RequestMapping("/add")
public R add(@RequestBody ChongwufenleiEntity chongwufenlei, HttpServletRequest request){
chongwufenlei.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(chongwufenlei);
chongwufenleiService.insert(chongwufenlei);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
@Transactional
public R update(@RequestBody ChongwufenleiEntity chongwufenlei, HttpServletRequest request){
//ValidatorUtils.validateEntity(chongwufenlei);
chongwufenleiService.updateById(chongwufenlei);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
chongwufenleiService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
}
LiulangmaogouController.java
package com.controller;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.text.ParseException;
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.LiulangmaogouEntity;
import com.entity.view.LiulangmaogouView;
import com.service.LiulangmaogouService;
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;
import com.service.StoreupService;
import com.entity.StoreupEntity;
/**
* 流浪猫狗
* 后端接口
* @author
* @email
* @date 2023-05-04 23:10:31
*/
@RestController
@RequestMapping("/liulangmaogou")
public class LiulangmaogouController {
@Autowired
private LiulangmaogouService liulangmaogouService;
@Autowired
private StoreupService storeupService;
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params,LiulangmaogouEntity liulangmaogou,
HttpServletRequest request){
EntityWrapper<LiulangmaogouEntity> ew = new EntityWrapper<LiulangmaogouEntity>();
PageUtils page = liulangmaogouService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, liulangmaogou), params), params));
return R.ok().put("data", page);
}
/**
* 前端列表
*/
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params,LiulangmaogouEntity liulangmaogou,
HttpServletRequest request){
EntityWrapper<LiulangmaogouEntity> ew = new EntityWrapper<LiulangmaogouEntity>();
PageUtils page = liulangmaogouService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, liulangmaogou), params), params));
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/lists")
public R list( LiulangmaogouEntity liulangmaogou){
EntityWrapper<LiulangmaogouEntity> ew = new EntityWrapper<LiulangmaogouEntity>();
ew.allEq(MPUtil.allEQMapPre( liulangmaogou, "liulangmaogou"));
return R.ok().put("data", liulangmaogouService.selectListView(ew));
}
/**
* 查询
*/
@RequestMapping("/query")
public R query(LiulangmaogouEntity liulangmaogou){
EntityWrapper< LiulangmaogouEntity> ew = new EntityWrapper< LiulangmaogouEntity>();
ew.allEq(MPUtil.allEQMapPre( liulangmaogou, "liulangmaogou"));
LiulangmaogouView liulangmaogouView = liulangmaogouService.selectView(ew);
return R.ok("查询流浪猫狗成功").put("data", liulangmaogouView);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
LiulangmaogouEntity liulangmaogou = liulangmaogouService.selectById(id);
liulangmaogou.setClicktime(new Date());
liulangmaogouService.updateById(liulangmaogou);
return R.ok().put("data", liulangmaogou);
}
/**
* 前端详情
*/
@IgnoreAuth
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id){
LiulangmaogouEntity liulangmaogou = liulangmaogouService.selectById(id);
liulangmaogou.setClicktime(new Date());
liulangmaogouService.updateById(liulangmaogou);
return R.ok().put("data", liulangmaogou);
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody LiulangmaogouEntity liulangmaogou, HttpServletRequest request){
liulangmaogou.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(liulangmaogou);
liulangmaogouService.insert(liulangmaogou);
return R.ok();
}
/**
* 前端保存
*/
@RequestMapping("/add")
public R add(@RequestBody LiulangmaogouEntity liulangmaogou, HttpServletRequest request){
liulangmaogou.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(liulangmaogou);
liulangmaogouService.insert(liulangmaogou);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
@Transactional
public R update(@RequestBody LiulangmaogouEntity liulangmaogou, HttpServletRequest request){
//ValidatorUtils.validateEntity(liulangmaogou);
liulangmaogouService.updateById(liulangmaogou);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
liulangmaogouService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
/**
* 前端智能排序
*/
@IgnoreAuth
@RequestMapping("/autoSort")
public R autoSort(@RequestParam Map<String, Object> params,LiulangmaogouEntity liulangmaogou, HttpServletRequest request,String pre){
EntityWrapper<LiulangmaogouEntity> ew = new EntityWrapper<LiulangmaogouEntity>();
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", "clicktime");
params.put("order", "desc");
PageUtils page = liulangmaogouService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, liulangmaogou), params), params));
return R.ok().put("data", page);
}
/**
* 协同算法(按收藏推荐)
*/
@RequestMapping("/autoSort2")
public R autoSort2(@RequestParam Map<String, Object> params,LiulangmaogouEntity liulangmaogou, HttpServletRequest request){
String userId = request.getSession().getAttribute("userId").toString();
String inteltypeColumn = "chongwufenlei";
List<StoreupEntity> storeups = storeupService.selectList(new EntityWrapper<StoreupEntity>().eq("type", 1).eq("userid", userId).eq("tablename", "liulangmaogou").orderBy("addtime", false));
List<String> inteltypes = new ArrayList<String>();
Integer limit = params.get("limit")==null?10:Integer.parseInt(params.get("limit").toString());
List<LiulangmaogouEntity> liulangmaogouList = new ArrayList<LiulangmaogouEntity>();
//去重
if(storeups!=null && storeups.size()>0) {
for(StoreupEntity s : storeups) {
liulangmaogouList.addAll(liulangmaogouService.selectList(new EntityWrapper<LiulangmaogouEntity>().eq(inteltypeColumn, s.getInteltype())));
}
}
EntityWrapper<LiulangmaogouEntity> ew = new EntityWrapper<LiulangmaogouEntity>();
params.put("sort", "id");
params.put("order", "desc");
PageUtils page = liulangmaogouService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, liulangmaogou), params), params));
List<LiulangmaogouEntity> pageList = (List<LiulangmaogouEntity>)page.getList();
if(liulangmaogouList.size()<limit) {
int toAddNum = (limit-liulangmaogouList.size())<=pageList.size()?(limit-liulangmaogouList.size()):pageList.size();
for(LiulangmaogouEntity o1 : pageList) {
boolean addFlag = true;
for(LiulangmaogouEntity o2 : liulangmaogouList) {
if(o1.getId().intValue()==o2.getId().intValue()) {
addFlag = false;
break;
}
}
if(addFlag) {
liulangmaogouList.add(o1);
if(--toAddNum==0) break;
}
}
} else if(liulangmaogouList.size()>limit) {
liulangmaogouList = liulangmaogouList.subList(0, limit);
}
page.setList(liulangmaogouList);
return R.ok().put("data", page);
}
/**
* (按值统计)
*/
@RequestMapping("/value/{xColumnName}/{yColumnName}")
public R value(@PathVariable("yColumnName") String yColumnName, @PathVariable("xColumnName") String xColumnName,HttpServletRequest request) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("xColumn", xColumnName);
params.put("yColumn", yColumnName);
EntityWrapper<LiulangmaogouEntity> ew = new EntityWrapper<LiulangmaogouEntity>();
List<Map<String, Object>> result = liulangmaogouService.selectValue(params, ew);
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);
}
/**
* (按值统计(多))
*/
@RequestMapping("/valueMul/{xColumnName}")
public R valueMul(@PathVariable("xColumnName") String xColumnName,@RequestParam String yColumnNameMul, HttpServletRequest request) {
String[] yColumnNames = yColumnNameMul.split(",");
Map<String, Object> params = new HashMap<String, Object>();
params.put("xColumn", xColumnName);
List<List<Map<String, Object>>> result2 = new ArrayList<List<Map<String,Object>>>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
EntityWrapper<LiulangmaogouEntity> ew = new EntityWrapper<LiulangmaogouEntity>();
for(int i=0;i<yColumnNames.length;i++) {
params.put("yColumn", yColumnNames[i]);
List<Map<String, Object>> result = liulangmaogouService.selectValue(params, ew);
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)));
}
}
}
result2.add(result);
}
return R.ok().put("data", result2);
}
/**
* (按值统计)时间统计类型
*/
@RequestMapping("/value/{xColumnName}/{yColumnName}/{timeStatType}")
public R valueDay(@PathVariable("yColumnName") String yColumnName, @PathVariable("xColumnName") String xColumnName, @PathVariable("timeStatType") String timeStatType,HttpServletRequest request) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("xColumn", xColumnName);
params.put("yColumn", yColumnName);
params.put("timeStatType", timeStatType);
EntityWrapper<LiulangmaogouEntity> ew = new EntityWrapper<LiulangmaogouEntity>();
List<Map<String, Object>> result = liulangmaogouService.selectTimeStatValue(params, ew);
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);
}
/**
* (按值统计)时间统计类型(多)
*/
@RequestMapping("/valueMul/{xColumnName}/{timeStatType}")
public R valueMulDay(@PathVariable("xColumnName") String xColumnName, @PathVariable("timeStatType") String timeStatType,@RequestParam String yColumnNameMul,HttpServletRequest request) {
String[] yColumnNames = yColumnNameMul.split(",");
Map<String, Object> params = new HashMap<String, Object>();
params.put("xColumn", xColumnName);
params.put("timeStatType", timeStatType);
List<List<Map<String, Object>>> result2 = new ArrayList<List<Map<String,Object>>>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
EntityWrapper<LiulangmaogouEntity> ew = new EntityWrapper<LiulangmaogouEntity>();
for(int i=0;i<yColumnNames.length;i++) {
params.put("yColumn", yColumnNames[i]);
List<Map<String, Object>> result = liulangmaogouService.selectTimeStatValue(params, ew);
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)));
}
}
}
result2.add(result);
}
return R.ok().put("data", result2);
}
/**
* 分组统计
*/
@RequestMapping("/group/{columnName}")
public R group(@PathVariable("columnName") String columnName,HttpServletRequest request) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("column", columnName);
EntityWrapper<LiulangmaogouEntity> ew = new EntityWrapper<LiulangmaogouEntity>();
List<Map<String, Object>> result = liulangmaogouService.selectGroup(params, ew);
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);
}
/**
* 总数量
*/
@RequestMapping("/count")
public R count(@RequestParam Map<String, Object> params,LiulangmaogouEntity liulangmaogou, HttpServletRequest request){
EntityWrapper<LiulangmaogouEntity> ew = new EntityWrapper<LiulangmaogouEntity>();
int count = liulangmaogouService.selectCount(MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, liulangmaogou), params), params));
return R.ok().put("data", count);
}
}
HuodongxinxiServiceImpl.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.HuodongxinxiDao;
import com.entity.HuodongxinxiEntity;
import com.service.HuodongxinxiService;
import com.entity.vo.HuodongxinxiVO;
import com.entity.view.HuodongxinxiView;
@Service("huodongxinxiService")
public class HuodongxinxiServiceImpl extends ServiceImpl<HuodongxinxiDao, HuodongxinxiEntity> implements HuodongxinxiService {
@Override
public PageUtils queryPage(Map<String, Object> params) {
Page<HuodongxinxiEntity> page = this.selectPage(
new Query<HuodongxinxiEntity>(params).getPage(),
new EntityWrapper<HuodongxinxiEntity>()
);
return new PageUtils(page);
}
@Override
public PageUtils queryPage(Map<String, Object> params, Wrapper<HuodongxinxiEntity> wrapper) {
Page<HuodongxinxiView> page =new Query<HuodongxinxiView>(params).getPage();
page.setRecords(baseMapper.selectListView(page,wrapper));
PageUtils pageUtil = new PageUtils(page);
return pageUtil;
}
@Override
public List<HuodongxinxiVO> selectListVO(Wrapper<HuodongxinxiEntity> wrapper) {
return baseMapper.selectListVO(wrapper);
}
@Override
public HuodongxinxiVO selectVO(Wrapper<HuodongxinxiEntity> wrapper) {
return baseMapper.selectVO(wrapper);
}
@Override
public List<HuodongxinxiView> selectListView(Wrapper<HuodongxinxiEntity> wrapper) {
return baseMapper.selectListView(wrapper);
}
@Override
public HuodongxinxiView selectView(Wrapper<HuodongxinxiEntity> wrapper) {
return baseMapper.selectView(wrapper);
}
}
BreadCrumbs.vue
<template>
<div class="breadcrumb-preview">
<el-breadcrumb :style='{"fontSize":"14px","lineHeight":"1"}' separator="Ξ">
<transition-group name="breadcrumb" class="box">
<el-breadcrumb-item v-for="(item,index) in levelList" :key="item.path">
<span v-if="item.redirect==='noRedirect'||index==levelList.length-1" class="no-redirect">{{ item.name }}</span>
<a v-else @click.prevent="handleLink(item)">{{ item.name }}</a>
</el-breadcrumb-item>
</transition-group>
</el-breadcrumb>
</div>
</template>
<script>
import pathToRegexp from 'path-to-regexp'
import { generateTitle } from '@/utils/i18n'
export default {
data() {
return {
levelList: null
}
},
watch: {
$route() {
this.getBreadcrumb()
}
},
created() {
this.getBreadcrumb()
},
methods: {
generateTitle,
getBreadcrumb() {
// only show routes with meta.title
let route = this.$route
let matched = route.matched.filter(item => item.meta)
const first = matched[0]
matched = [{ path: '/index' }].concat(matched)
this.levelList = matched.filter(item => item.meta)
},
isDashboard(route) {
const name = route && route.name
if (!name) {
return false
}
return name.trim().toLocaleLowerCase() === 'Index'.toLocaleLowerCase()
},
pathCompile(path) {
// To solve this problem https://github.com/PanJiaChen/vue-element-admin/issues/561
const { params } = this.$route
var toPath = pathToRegexp.compile(path)
return toPath(params)
},
handleLink(item) {
const { redirect, path } = item
if (redirect) {
this.$router.push(redirect)
return
}
this.$router.push(path)
},
}
}
</script>
<style lang="scss" scoped>
.el-breadcrumb {
& /deep/ .el-breadcrumb__separator {
margin: 0 9px;
color: #FF8C51;
font-weight: 500;
}
& /deep/ .el-breadcrumb__inner a {
color: #FF8C51;
display: inline-block;
}
& /deep/ .el-breadcrumb__inner {
color: #FF8C51;
display: inline-block;
}
}
</style>