完整教程:springboot226经方药食两用服务平台设计与实现
博主介绍:专注于Java(springboot ssm 等开发框架) vue .net php phython node.js uniapp 微信小代码 等诸多技术领域和毕业任务实战、企业信息化系统建设,从业十五余年开发设计教学工作
☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟
我的博客空间发布了2000+毕设题目 方便大家学习使用
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人
文末下方有源码获取地址
1绪论
1.1研究背景与意义
信息化管理模式是将行业中的工作流程由人工服务,逐渐转换为利用计算机技术的信息化管理服务。此种管理模式发展迅速,利用起来非常简单容易,用户甚至不用掌握相关的专业知识,根据教程指导即可正常使用相关的环境,因而被越来越多的用户所启用。由于相关行业管理信息化,这就使得管理工作不在受到时间和区域的限制,随时随地即可完成相关的工作任务和结果[1]。就目前而言,管理信息化在现代社会中非常流行,使用比较广泛。早在20世纪70年代末,就出现了早期的电子商务,相关的公司企业使用计算机建立专用的内部网络,借助内部网络完成相应的采购、销售等活动,加快相关的企业之间的交易速度,提高了工作效率[2]。
当下,许多行业采用互联网技术将工作流程信息化、数字化,提高了相关人员的服务质量和效率,节约了相关行业的人力、财力、物力等资源,与此同时,人们获取外界的相关信息核心依赖于主流的信息化技术和工具。人们对生活的需求也在不断的发生着变化,为了应对用户的多样化需求,许多相关的第三产业应运而生,管理信息化也逐渐的流行起来,比如电子商务行业。本人通过查询大量学习资料,了解根本的构建系统的基本背景和关键任务,学习与掌握Java语言、web技术、AJAX技能、HTML语言等开发技术,设计系统功能模块,以及MySQL数据库的相关语法和工具,创建和存储材料表格,反映和关联表格之间相互存在的关系,由此对经方药食两用服务平台进行研发和实现。
1.2国内外研究现状
大概在20世纪90年代,我国才开始研发经方药食两用服务平台,与一些发达国家相比,体系研发起步比较晚。当时的计算机技术刚开始发展起来,国家经济力量比较薄弱,各地区的经济发展水平不平衡,再加上相关的网络应用技术不太先进,我国也使用了一段较长的时间对网络信息化管理进行探索[3]。近些年,因为国家非常重视和支持第三产业的发展,以及人们的日常生活需求越来越离不开信息管理工艺的应用,所以我国的信息管理系统行业发展速度非常快,并且相关的体制法规也正在不断地被完善和改进。新时代背景下,根据人们的相关需求,不断地促进着相关产业的产生与发展,一系列电子产品、应用软件、信息管理系统等新时代的产物逐渐出现在人们的视野中,并且在近几年发展迅速,日渐趋于成熟[4]。
与国内相比,国外经方药食两用服务平台领域发展较早。国外的计算机技术发展比较成熟,于是体系相关的设计也比较完善。19世纪60年代左右,国外就开始研发经方药食两用服务平台,并且不久之后,迅速将其投入市场进行使用。美国、英国等一些发达国家敏捷发展计算机技术,促进了经方药食两用服务平台管理行业信息化建设[5]。而后随着相关的技术不断地发展,覆盖面非常广泛,应用领域比较多,促进着经方药食两用服务平台等相关的信息管理系统不断地发展和完善,并且其所设计的系统功能结构也比较合理、全面。相对而言,国外框架的研发在相关领域上还是占据着较大的优势[6]。因此,我们需要吸收国外系统开发领域中的较好的技术精华,发展我国的信息化管理系统,使得其面向大众,能够更好的、更全面的服务于相关的工作人员。
1.3研究内容
现今,互联网在我们的日常生活占据着日益重要的地位,我们也越来越离不开对移动设备、电脑等上网设备的使用。传统的经方药食两用服务平台模式主要依靠管理人员纯手工记录的相关信息,比较繁琐,不方便查找,也非常容易出现错误。如今,如果再通过手工记录药方,将大大不利于经方药食两用服务平台行业管理相关的经方药食两用服务平台信息,严重影响经方药食两用服务平台行业的发展。因此,本人结合传统的经方药食两用服务平台业务模式和先进的电子信息管理模式,使用Java语言编程设计功能模块,AJAX实现前台和后台之间的交互,MySQL数据库创建和存储数据表格,对经方药食两用服务平台进行设计和开发。本架构的设计有利于相关行业实现最大化的资源管理与共享,促进相关行业的信息交流、分工合作,提高相关工作人员的工作效率,最终构建整个经方药食两用服务平台行业服务的信息化管理。
1.4论文结构
本文围绕着经方药食两用服务平台的整个研发过程,展开了详细的描述和说明,设计和实现本系统的主要工作有:第一分析研究背景、研究状态,其次介绍设计系统时使用到的相关技术,接着通过系统分析确定系统的作用需求,接着通过编码工作详细设计和实现系统,最后再通过架构测试,找出系统存在的问题和解决问题的办法,不断地修改和完善系统。论文内容的组织结构设计如下。
第一章绪论,依据介绍本系统的研究背景、研究现状等内容,帮助用户了解和认识本系统的发展过程。
第二章相关手艺介绍,主要介绍了Java语言、B/S模式、MySQL数据库等相关的开发技术,为后期系统的功能完成给出技术上的支持。
第三章系统分析,分析用户的使用需求,以及框架实现的可行性,最后通过用例建模分析与系统相关的参与者及其用例之间的关系。
第四章环境设计,首要根据架构总体功能设计,确定将要设计的系统功能模块,设计相关的材料表格。
第五章系统完成,凭借相关的功能模块运行图,展现出系统的主要功能模块管理流程。
第六章系统测试,主要使用功能测试的方式,测试系统的相关功能运行和使用的具体情况。
第七章总结与展望,通过本文的各章节描述总结得出,基本上完成了平台的设计,展望未来将学习和应用更加先进的技术,提高框架的实用性,使得平台更好的服务于使用人员。
1.5本章小结
本章首要介绍了课题的研究背景与意义,研究现状,研究内容等内容,结果介绍了本论文的组织结构设计。信息化管理模式顺应了信息化时代的变化,本人以现在主流的管理模式为前提,根据使用者的相关需求,设计出一款符合大众需求的经方药食两用服务平台。
2理论基础
2.1 B/S模式
B/S模式(Browser/Server)是一种比较常用的网络结构模式[7]。B/S模式是由模型、视图、控制器(Model-View-Controller,MVC)结构组成[8]。模型主要是指业务模型,视图主要是指用户界面,控制器主要是控制保证视图和模型的同步执行。B/S模式的三层结构是相互独立的,换句话说,当某一个模块发生修改和更新,其不会对其他模块产生影响。根据B/S的这一特点,可以将对业务逻辑的处理以及约束条件集中到中间层中,便于前端增加对模型和方法的调用和复用。并且可以直接通过中间层对数据库进行相关的操作处理,大大减少了数据库的连接数,节省了计算机的对相关的资源配置空间。
使用B/S模式可能节省系统资源配置,提高研发工作效率,减少开发时间,因而大大提高了我们开发软件的可能性。B/S模式有针对性的改变了传统的客户端/服务器模式(Client/Server,C/S模式),也可以说这是对C/S模式进行了扩展。在这种结构模式中,用户不用再向使用C/S模式一样,下载客户端,其许可直接通过运用浏览器的方式,打开网站地址,即可访问和使用相关的系统效果服务。
2.2 IDEA开发环境
软件开发运用的编程语言有许多种,而每种编程语言需要凭借与其相对应的编写平台进行编译和运行。IDEA平台都是目前比较常用的制作环境。IDEA平台是开源的,具有功能强大、可扩展性强等特点,许可应用于C/S模式软件的创建,但是它所占据的内存容量比较大,运行较慢,并且其并未提供Tomcat服务器,运行过程中需要将代码发布到Tomcat服务器中,测试使用的时间较长,故而不太适用于B/S模式软件的开发。
建立在IDEA平台的基础之上,增加了许多的应用插件,比如Tomcat插件、mail组件等。IDEA平台增加了Tomcat插件,代码编写完成或者更新完成时,程序员无需将代码发布到Tomcat服务器中,可以直接凭借调试建立程序的运行。IDEA平台增加了Mail组件,该组件可以为本程序供应标准的邮件方法,便于开发人员完成与邮件特性相关的编译工作。IDEA平台占据的内存空间较小,同时其也具有较高的可扩展性,编程人员行根据需要添加和使用相关的插件。能够支持主流的开源产品和相关的编写框架,被广泛运用到相关的移动体系、web应用系统等构建中。相比于IDEA平台,本系统比较适合使用IDEA平台进行编程和开发。就是IDEA平台
2.3 MySQL数据库
MySQL是一种小型的关系型数据库管理系统,因为其运行速度快,占用内存空间小,并且源代码也是开源的,运行和维护成本低,系统性能稳定,受到了许多开发人员的喜爱[9]。考虑到MySQL数据库开发成本低,功能齐全等因素,大多中小型网站选择使用MySQL数据库管理材料信息。
MySQL数据库除了支持上述SQL Server数据库能支持的编程语言外,还支持Scheme、Eiffel等其他编程语言,故而MySQL数据库受欢迎程度比SQL Server数据库更高。就是SQL Server也是近几年使用较多的关系型数据库,其与MySQL数据库存在的不同之处关键有,在环境方面,SQL Server数据库比较适合于.NET环境,而MySQL数据库适用于几乎所有的语言;在成本方面,SQL Server数据库是商业化的,其运行多个数据库可许证,虽然有一个免费版,但是只能让你对关系型数据库管理系统有一定的认识与了解,熟悉相关的使用流程。如果要想使用SQL Server数据库的话,就需要支付相关费用,而MySQL数据库是开源的,其对于用户来说,运用是完全免费;在实际应用方面,SQL Server数据库和MySQL数据库均承受Java语言、PHP语言、C++语言等多种编程语言,可
2.4 Java语言
Java语言是一种面向对象的编程语言,其主要具有继承、封装、多态等特征,从而提高编程工作效率,实现软件的设计和开发[10]。继承机制可能继承相关的类和方法,新的类可以在继承已经定义的类的相关特性基础上,扩展自己新的素材和功能,进而提高自身的能力。封装机制可以提高程序的安全性,其隐藏对象的相关属性和行为,对外只给出一个接口,用户直接依据访问相应的接口来实现自己需要的机制操作。多态机制可以描述对象的多样性,简单的来说就是引用相同的对象做不同的事务。Java语言具有安全高效的优点,并且其通过依靠Java虚拟机,能够实现跨平台操作[11]。Java语言比较容易学习和掌握,就目前软件开发所利用的开发类语言而言,Java语言比较受程序员喜爱,应用比较广泛。
2.5本章小结
本章主导介绍了实现经方药食两用服务平台的相关理论基础以及开发工具。本环境采用B/S模式,使用Java语言、AJAX技术、MySQL数据库等软件,设计系统功能、页面布局、后台数据等。开发本系统所使用的相关技术操作简单、容易掌握,Java语言具有跨平台性,可以支持在不同的浏览器使用本体系,MySQL数据库是开源的,减少了本架构的开发成本。
3需求分析
3.1功能需求分析
需求分析过程是系统能否成功投入市场,也能否被用户所接受和使用的非常关键的一个步骤。功能需求分析是借助设计系统作用来实现相关的业务事项,详细分析用户的实际需要,确定需要设计的相关业务事项,其是系统实现的关键,本系统存在的主要功能需求包括用户注册管理、用户信息管理、客房信息管理等。
3.2技术需求分析
本环境必须使用Java语言编码设计相关的功能模块,MySQL数据库创建和存储信息表格,AJAX实现前台和后台之间的交互,并且应该在IDEA开发环境中,编写相关的Java代码等系统软件文件,使用MySQL数据库存储数据信息,然后通过启用连接代码完成与MySQL数据库的搭建工作,再通过使用开发环境中的Tomcat插件,搞定与Tomcat服务器的发布工作,最后通过与Tomcat服务器的交互行为允许实现代码调试工作。满足以上相关的技术需求,本系统才可以在浏览器上进行访问和使用。
3.3数据需求分析
非常重点的一步,首要依据信息的来源、信息的有效性、信息的扩充性、信息的真实性等内容筛选素材。数据需求分析阶段,为系统的开发工作做好进一步准备,便于更好的设计和完成系统。就是在设计系统功能模块时,需要收集与系统有关的数据信息,并且对采集的内容信息进行组织和存储,分析系统功能设计,筛选有价值的数据,而后形成数据字典。其中,从庞大的数据信息中筛选出有价值的数据是比较耗时,也
3.4安全需求分析
安全需求分析是在系统使用过程中对性能的具体要求,对功能需求的一个补充内容,也是对功能需求的一个补充内容,主要包括响应需求、安全性需求、稳定性需求、可扩展性需求等内容。安全需求是在体系功能需求以外的其他必要的需求内容,其不论在系统设计过程,还是在系统投入市场过程,都起到了极其重要的作用。
3.5可行性分析
3.5.1经济可行性
经济可行性是决定是否研发系统的关键性因素。我们主导通过比较实际的收益和成本的方法,来确定一个系统是否具有经济可行性。在使用环境的过程中,当获得的收益大于开发的成本时,说明此系统的研发在经济上是可行的。由于本系统的开发使用的技术基本上是开源的,获得技术上的支持是没有多少困难的,在软件搭建方面所花费的成本是很低的,甚至不需要花费成本。研发系统的成本主要是来自调研、硬件和技术人员等方面。假如架构中需要存储的数据量不是很大,仅得配置一台普通的服务器,即可满足相关需求。假设需要存储的数据量很大,则需要配置一台具有独立作用的服务器,比如管理数据库要求单独的数据库服务器,负责接入网站需要web服务器等等,但是一台服务器的价格是比较贵的。考虑到数据量和成本,我们启用小型集群服务器,这样既可以充分利用相关的资源,又可以让系统正常访问服务器。
3.5.2技术可行性
Java语言具有跨平台性,本系统重要通过Java语言进行编码实现的,所以本环境可以承受在多个操作系统或者多个浏览器上运行和使用[14]。MySQL数据库是可以被免费使用的,并且MySQL数据库的日常运行和维护工作比较简单,这样有利于降低本系统的开发成本[15]。在学校期间,本人已经学习和掌握了Java语言、MySQL数据库、AJAX技术等相关的技巧相关知识以及用法,因此在技术可行性方面,本系统是可以实现被设计与完成的。
3.5.3操作可行性
本框架所采用网络结构是B/S模式,对于开发人员来说,可以直接复用相关的代码,或者稍微对原代码进行修改,使得其满足于本平台的相关需求,如此便可大大节约了创建时间,在最优最短的时间内完成对系统的设计。对于用户来说,在传统的模式下,要求下载客户端才可应用系统。现在,在新型的模式下,启用本系统,就不需要下载,直接选择浏览器打开网址,即可访问和使用本框架。并且,用户可以根据自身的工作需要,选择相关的菜单按钮操作本系统。在系统的一些功能模块中,本人还添加了相关的使用提示信息,方便用户更好更快的了解和使用本架构。因此,本架构的设计和实现是具备操作可行性的。
3.6本章小结
耗时最长的一个环节,系统的整个设计和实现过程主要依赖于需求分析报告。调查收集出不同用户对本系统的相关运用需求,由此设计相关的功能模块,从而期望达成用户满意度较高的实用型系统。本章核心从功能需求、技术需求、资料需求、安全需求、可行性分析等方面,对系统进行需求分析,确保设计出一款实用价值比较高的管理系统。就是需求分析在软件开发周期中
4系统设计
4.1系统功能设计
本系统主要通过使用Java语言编码设计架构能力,MySQL数据库管理数据,AJAX技术设计简洁的、友好的网址页面,然后在IDEA开发平台中,编写相关的Java代码材料,接着通过连接语言完成与数据库的搭建工作,再通过平台提供的Tomcat插件完成信息的交互,最后在浏览器中打开框架网址便可采用本系统。本系统的应用角色许可被分为用户和管理员,用户具有注册、查看信息、留言信息等功能,管理员具有修改用户信息,发布新闻等功能,系统总体功能设计图如图4-1所示。

图4-1系统总体效果设计图
4.2.1 数据库概念设计
4.2.2逻辑设计
将与系统相关的数据信息,设计成为方便数据库存储和管理的基本表格的形式,具体内容如下。就是本系统使用MySQL数据库管理与系统相关的资料信息。逻辑设计阶段是将上一个阶段中的概念数据模型,转换为方便数据库进行存储的关系模型,即基本表的形式,方便开发人员后期对数据模型进行优化和管理[20]。逻辑设计阶段是整个数据库设计设计的关键,与系统有关的信息将会在这一阶段中被存储在数据库中,当用户应用本系统进行相关的能力操作时,与之有关的数据信息所在的核心表会发生相应的更新变化。数据库的逻辑设计阶段主要任务
表4.1字典表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | dic_code | String | 字段 | 是 |
3 | dic_name | String | 字段名 | 是 |
4 | code_index | Integer | 编码 | 是 |
5 | index_name | String | 编码名字 | 是 |
6 | super_id | Integer | 父字段id | 是 |
7 | beizhu | String | 备注 | 是 |
8 | create_time | Date | 创建时间 | 是 |
表4.2中医翻译表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | fanyi_zhongwen_name | String | 中文 | 是 |
3 | fanyi_yingwen_name | String | 英文 | 是 |
4 | fanyi_content | String | 例句翻译 | 是 |
5 | fanyi_delete | Integer | 逻辑删除 | 是 |
6 | create_time | Date | 创建时间 | 是 |
表4.3单页数据表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | single_seach_name | String | 名字 | 是 |
3 | single_seach_types | Integer | 数据类型 | 是 |
4 | single_seach_content | String | 内容 | 是 |
5 | create_time | Date | 创建时间 | 是 |
表4.4文章表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | yonghu_id | Integer | 用户 | 是 |
3 | wenzhang_uuid_number | String | 文章编号 | 是 |
4 | wenzhang_name | String | 文章名称 | 是 |
5 | wenzhang_photo | String | 文章照片 | 是 |
6 | wenzhang_types | Integer | 文章类型 | 是 |
7 | wenzhang_clicknum | Integer | 热度 | 是 |
8 | wenzhang_content | String | 文章内容 | 是 |
9 | shangxia_types | Integer | 是否上架 | 是 |
10 | wenzhang_delete | Integer | 逻辑删除 | 是 |
11 | create_time | Date | 创建时间 | 是 |
表4.5文章收藏表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | wenzhang_id | Integer | 文章 | 是 |
3 | yonghu_id | Integer | 用户 | 是 |
4 | wenzhang_collection_types | Integer | 类型 | 是 |
5 | insert_time | Date | 收藏时间 | 是 |
6 | create_time | Date | 创建时间 | 是 |
表4.6文章留言表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | wenzhang_id | Integer | 文章 | 是 |
3 | yonghu_id | Integer | 用户 | 是 |
4 | wenzhang_liuyan_text | String | 留言内容 | 是 |
5 | insert_time | Date | 留言时间 | 是 |
6 | reply_text | String | 回复内容 | 是 |
7 | update_time | Date | 回复时间 | 是 |
8 | create_time | Date | 创建时间 | 是 |
表4.7药方表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | yaofang_uuid_number | String | 药方编号 | 是 |
3 | yaofang_name | String | 药方名 | 是 |
4 | yaofang_photo | String | 药方照片 | 是 |
5 | yaofang_types | Integer | 药方类型 | 是 |
6 | yaofang_laiyuan | String | 方剂来源 | 是 |
7 | yaofang_zuozhe | String | 作者 | 是 |
8 | yaofang_chengshuniandai | String | 成书年代 | 是 |
9 | yaofang_text | String | 原文 | 是 |
10 | yaofang_zucheng | String | 方剂组成 | 是 |
11 | yaofang_yaoshiliangyong | String | 药食两用 | 是 |
12 | yaofang_gongxiao | String | 功效 | 是 |
13 | yaofang_zhuzhizheng | String | 主治证 | 是 |
14 | yaofang_zhengzhuang | String | 症状 | 是 |
15 | yaofang_yongfa | String | 用法/服法 | 是 |
16 | jixing_types | Integer | 剂型 | 是 |
17 | yaofang_yinjing | String | 引经 | 是 |
18 | yaofang_clicknum | Integer | 热度 | 是 |
19 | yaofang_content | String | 药方详情 | 是 |
20 | shangxia_types | Integer | 是否上架 | 是 |
21 | yaofang_delete | Integer | 逻辑删除 | 是 |
22 | create_time | Date | 创建时间 | 是 |
表4.8药方收藏表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | yaofang_id | Integer | 药方 | 是 |
3 | yonghu_id | Integer | 用户 | 是 |
4 | yaofang_collection_types | Integer | 类型 | 是 |
5 | insert_time | Date | 收藏时间 | 是 |
6 | create_time | Date | 创建时间 | 是 |
表4.9药食两用药材表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | yaoshiliangyongyaocai_uuid_number | String | 药材编号 | 是 |
3 | yaoshiliangyongyaocai_name | String | 药材名称 | 是 |
4 | yaoshiliangyongyaocai_photo | String | 药材照片 | 是 |
5 | yaoshiliangyongyaocai_types | Integer | 药材类型 | 是 |
6 | yaoshiliangyongyaocai_gongxiao | String | 功效 | 是 |
7 | yaoshiliangyongyaocai_clicknum | Integer | 热度 | 是 |
8 | yaoshiliangyongyaocai_content | String | 药食两用药材详情 | 是 |
9 | shangxia_types | Integer | 是否上架 | 是 |
10 | yaoshiliangyongyaocai_delete | Integer | 逻辑删除 | 是 |
11 | create_time | Date | 创建时间 | 是 |
表4.10药食两用药材收藏表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | yaoshiliangyongyaocai_id | Integer | 药食两用药材 | 是 |
3 | yonghu_id | Integer | 用户 | 是 |
4 | yaoshiliangyongyaocai_collection_types | Integer | 类型 | 是 |
5 | insert_time | Date | 收藏时间 | 是 |
6 | create_time | Date | 创建时间 | 是 |
表4.11用户表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | yonghu_name | String | 用户姓名 | 是 |
3 | yonghu_phone | String | 用户手机号 | 是 |
4 | yonghu_id_number | String | 用户身份证号 | 是 |
5 | yonghu_photo | String | 用户头像 | 是 |
6 | yonghu_email | String | 电子邮箱 | 是 |
7 | create_time | Date | 创建时间 | 是 |
表4.12管理员表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | username | String | 用户名 | 是 |
3 | password | String | 密码 | 是 |
4 | role | String | 角色 | 是 |
5 | addtime | Date | 新增时间 | 是 |
4.3本章小结
5系统实现
5.1管理员功能模块实现
5.1.1管理员登录
管理员行选择任一浏览器打开网址,输入信息无误后,以管理员的身份行使相关的管理权限,管理员登录界面设计如图5-1所示。
图5-1管理员登录界面
5.1.2药方管理
管理员可以通过选择药方管理,管理相关的药方信息记录,比如进行查看药方信息标题,修改药方信息来源等操作,药方管理界面设计如图5-2所示。
图5-2药方管理界面
5.1.3文章管理
管理员可能借助选择文章管理,管理相关的文章信息记录,比如进行查看文章详情,删除错误的文章信息,发布文章等操作,文章管理界面如图5-3所示。
图5-3 文章管理界面
package com.controller;
import java.io.File;
import java.math.BigDecimal;
import java.net.URL;
import java.text.SimpleDateFormat;
import com.alibaba.fastjson.JSONObject;
import java.util.*;
import org.springframework.beans.BeanUtils;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.context.ContextLoader;
import javax.servlet.ServletContext;
import com.service.TokenService;
import com.utils.*;
import java.lang.reflect.InvocationTargetException;
import com.service.DictionaryService;
import org.apache.commons.lang3.StringUtils;
import com.annotation.IgnoreAuth;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.entity.*;
import com.entity.view.*;
import com.service.*;
import com.utils.PageUtils;
import com.utils.R;
import com.alibaba.fastjson.*;
/**
* 文章
* 后端接口
* @author
* @email
*/
@RestController
@Controller
@RequestMapping("/wenzhang")
public class WenzhangController {
private static final Logger logger = LoggerFactory.getLogger(WenzhangController.class);
@Autowired
private WenzhangService wenzhangService;
@Autowired
private TokenService tokenService;
@Autowired
private DictionaryService dictionaryService;
//级联表service
@Autowired
private YonghuService yonghuService;
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map params, HttpServletRequest request){
logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
String role = String.valueOf(request.getSession().getAttribute("role"));
if(false)
return R.error(511,"永不会进入");
else if("用户".equals(role))
params.put("yonghuId",request.getSession().getAttribute("userId"));
params.put("wenzhangDeleteStart",1);params.put("wenzhangDeleteEnd",1);
if(params.get("orderBy")==null || params.get("orderBy")==""){
params.put("orderBy","id");
}
PageUtils page = wenzhangService.queryPage(params);
//字典表数据转换
List list =(List)page.getList();
for(WenzhangView c:list){
//修改对应字典表字段
dictionaryService.dictionaryConvert(c, request);
}
return R.ok().put("data", page);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id, HttpServletRequest request){
logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
WenzhangEntity wenzhang = wenzhangService.selectById(id);
if(wenzhang !=null){
//entity转view
WenzhangView view = new WenzhangView();
BeanUtils.copyProperties( wenzhang , view );//把实体数据重构到view中
//级联表
YonghuEntity yonghu = yonghuService.selectById(wenzhang.getYonghuId());
if(yonghu != null){
BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createTime", "insertTime", "updateTime"});//把级联的数据添加到view中,并排除id和创建时间字段
view.setYonghuId(yonghu.getId());
}
//修改对应字典表字段
dictionaryService.dictionaryConvert(view, request);
return R.ok().put("data", view);
}else {
return R.error(511,"查不到数据");
}
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody WenzhangEntity wenzhang, HttpServletRequest request){
logger.debug("save方法:,,Controller:{},,wenzhang:{}",this.getClass().getName(),wenzhang.toString());
String role = String.valueOf(request.getSession().getAttribute("role"));
if(false)
return R.error(511,"永远不会进入");
else if("用户".equals(role))
wenzhang.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
Wrapper queryWrapper = new EntityWrapper()
.eq("yonghu_id", wenzhang.getYonghuId())
.eq("wenzhang_uuid_number", wenzhang.getWenzhangUuidNumber())
.eq("wenzhang_name", wenzhang.getWenzhangName())
.eq("wenzhang_types", wenzhang.getWenzhangTypes())
.eq("wenzhang_clicknum", wenzhang.getWenzhangClicknum())
.eq("shangxia_types", wenzhang.getShangxiaTypes())
.eq("wenzhang_delete", wenzhang.getWenzhangDelete())
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
WenzhangEntity wenzhangEntity = wenzhangService.selectOne(queryWrapper);
if(wenzhangEntity==null){
wenzhang.setWenzhangClicknum(1);
wenzhang.setShangxiaTypes(2);
wenzhang.setWenzhangDelete(1);
wenzhang.setCreateTime(new Date());
wenzhangService.insert(wenzhang);
return R.ok();
}else {
return R.error(511,"表中有相同数据");
}
}
/**
* 后端修改
*/
@RequestMapping("/update")
public R update(@RequestBody WenzhangEntity wenzhang, HttpServletRequest request){
logger.debug("update方法:,,Controller:{},,wenzhang:{}",this.getClass().getName(),wenzhang.toString());
String role = String.valueOf(request.getSession().getAttribute("role"));
// if(false)
// return R.error(511,"永远不会进入");
// else if("用户".equals(role))
// wenzhang.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
//根据字段查询是否有相同数据
Wrapper queryWrapper = new EntityWrapper()
.notIn("id",wenzhang.getId())
.andNew()
.eq("yonghu_id", wenzhang.getYonghuId())
.eq("wenzhang_uuid_number", wenzhang.getWenzhangUuidNumber())
.eq("wenzhang_name", wenzhang.getWenzhangName())
.eq("wenzhang_types", wenzhang.getWenzhangTypes())
.eq("wenzhang_clicknum", wenzhang.getWenzhangClicknum())
.eq("shangxia_types", wenzhang.getShangxiaTypes())
.eq("wenzhang_delete", wenzhang.getWenzhangDelete())
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
WenzhangEntity wenzhangEntity = wenzhangService.selectOne(queryWrapper);
if("".equals(wenzhang.getWenzhangPhoto()) || "null".equals(wenzhang.getWenzhangPhoto())){
wenzhang.setWenzhangPhoto(null);
}
if(wenzhangEntity==null){
wenzhangService.updateById(wenzhang);//根据id更新
return R.ok();
}else {
return R.error(511,"表中有相同数据");
}
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Integer[] ids){
logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());
ArrayList list = new ArrayList<>();
for(Integer id:ids){
WenzhangEntity wenzhangEntity = new WenzhangEntity();
wenzhangEntity.setId(id);
wenzhangEntity.setWenzhangDelete(2);
list.add(wenzhangEntity);
}
if(list != null && list.size() >0){
wenzhangService.updateBatchById(list);
}
return R.ok();
}
/**
* 批量上传
*/
@RequestMapping("/batchInsert")
public R save( String fileName, HttpServletRequest request){
logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName);
Integer yonghuId = Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
List wenzhangList = new ArrayList<>();//上传的东西
Map> seachFields= new HashMap<>();//要查询的字段
Date date = new Date();
int lastIndexOf = fileName.lastIndexOf(".");
if(lastIndexOf == -1){
return R.error(511,"该文件没有后缀");
}else{
String suffix = fileName.substring(lastIndexOf);
if(!".xls".equals(suffix)){
return R.error(511,"只支持后缀为xls的excel文件");
}else{
URL resource = this.getClass().getClassLoader().getResource("static/upload/" + fileName);//获取文件路径
File file = new File(resource.getFile());
if(!file.exists()){
return R.error(511,"找不到上传文件,请联系管理员");
}else{
List> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件
dataList.remove(0);//删除第一行,因为第一行是提示
for(List data:dataList){
//循环
WenzhangEntity wenzhangEntity = new WenzhangEntity();
// wenzhangEntity.setYonghuId(Integer.valueOf(data.get(0))); //用户 要改的
// wenzhangEntity.setWenzhangUuidNumber(data.get(0)); //文章编号 要改的
// wenzhangEntity.setWenzhangName(data.get(0)); //文章名称 要改的
// wenzhangEntity.setWenzhangPhoto("");//详情和图片
// wenzhangEntity.setWenzhangTypes(Integer.valueOf(data.get(0))); //文章类型 要改的
// wenzhangEntity.setWenzhangClicknum(Integer.valueOf(data.get(0))); //热度 要改的
// wenzhangEntity.setWenzhangContent("");//详情和图片
// wenzhangEntity.setShangxiaTypes(Integer.valueOf(data.get(0))); //是否上架 要改的
// wenzhangEntity.setWenzhangDelete(1);//逻辑删除字段
// wenzhangEntity.setCreateTime(date);//时间
wenzhangList.add(wenzhangEntity);
//把要查询是否重复的字段放入map中
//文章编号
if(seachFields.containsKey("wenzhangUuidNumber")){
List wenzhangUuidNumber = seachFields.get("wenzhangUuidNumber");
wenzhangUuidNumber.add(data.get(0));//要改的
}else{
List wenzhangUuidNumber = new ArrayList<>();
wenzhangUuidNumber.add(data.get(0));//要改的
seachFields.put("wenzhangUuidNumber",wenzhangUuidNumber);
}
}
//查询是否重复
//文章编号
List wenzhangEntities_wenzhangUuidNumber = wenzhangService.selectList(new EntityWrapper().in("wenzhang_uuid_number", seachFields.get("wenzhangUuidNumber")).eq("wenzhang_delete", 1));
if(wenzhangEntities_wenzhangUuidNumber.size() >0 ){
ArrayList repeatFields = new ArrayList<>();
for(WenzhangEntity s:wenzhangEntities_wenzhangUuidNumber){
repeatFields.add(s.getWenzhangUuidNumber());
}
return R.error(511,"数据库的该表中的 [文章编号] 字段已经存在 存在数据为:"+repeatFields.toString());
}
wenzhangService.insertBatch(wenzhangList);
return R.ok();
}
}
}
}catch (Exception e){
e.printStackTrace();
return R.error(511,"批量插入数据异常,请联系管理员");
}
}
/**
* 前端列表
*/
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map params, HttpServletRequest request){
logger.debug("list方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
// 没有指定排序字段就默认id倒序
if(StringUtil.isEmpty(String.valueOf(params.get("orderBy")))){
params.put("orderBy","id");
}
PageUtils page = wenzhangService.queryPage(params);
//字典表数据转换
List list =(List)page.getList();
for(WenzhangView c:list)
dictionaryService.dictionaryConvert(c, request); //修改对应字典表字段
return R.ok().put("data", page);
}
/**
* 前端详情
*/
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id, HttpServletRequest request){
logger.debug("detail方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
WenzhangEntity wenzhang = wenzhangService.selectById(id);
if(wenzhang !=null){
//点击数量加1
wenzhang.setWenzhangClicknum(wenzhang.getWenzhangClicknum()+1);
wenzhangService.updateById(wenzhang);
//entity转view
WenzhangView view = new WenzhangView();
BeanUtils.copyProperties( wenzhang , view );//把实体数据重构到view中
//级联表
YonghuEntity yonghu = yonghuService.selectById(wenzhang.getYonghuId());
if(yonghu != null){
BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段
view.setYonghuId(yonghu.getId());
}
//修改对应字典表字段
dictionaryService.dictionaryConvert(view, request);
return R.ok().put("data", view);
}else {
return R.error(511,"查不到数据");
}
}
/**
* 前端保存
*/
@RequestMapping("/add")
public R add(@RequestBody WenzhangEntity wenzhang, HttpServletRequest request){
logger.debug("add方法:,,Controller:{},,wenzhang:{}",this.getClass().getName(),wenzhang.toString());
Wrapper queryWrapper = new EntityWrapper()
.eq("yonghu_id", wenzhang.getYonghuId())
.eq("wenzhang_uuid_number", wenzhang.getWenzhangUuidNumber())
.eq("wenzhang_name", wenzhang.getWenzhangName())
.eq("wenzhang_types", wenzhang.getWenzhangTypes())
.eq("wenzhang_clicknum", wenzhang.getWenzhangClicknum())
.eq("shangxia_types", wenzhang.getShangxiaTypes())
.eq("wenzhang_delete", wenzhang.getWenzhangDelete())
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
WenzhangEntity wenzhangEntity = wenzhangService.selectOne(queryWrapper);
if(wenzhangEntity==null){
wenzhang.setWenzhangDelete(1);
wenzhang.setCreateTime(new Date());
wenzhangService.insert(wenzhang);
return R.ok();
}else {
return R.error(511,"表中有相同数据");
}
}
}
5.1.4文章类型管理
管理员可以经过选择文章类型管理,管理相关的文章类型信息,比如查看所有文章类型,删除无用文章类型,修改文章类型,添加文章类型等执行,文章类型管理界面设计如图5-4所示。
图5-4文章类型管理界面
大家点赞、收藏、关注、评论啦 其他的定制服务 商务合作 下方联系卡片↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 或者私信作者