🙊作者简介:多年编程开发经验,专注java技术领域和毕业设计项目实战,系统定制、远程部署调试、代码讲解、代码修改
🍅擅长语言:springboot、ssm、vue、html、jsp、php、python、爬虫、小程序、安卓app
⬇️源码获取:文末可以获取源码+数据库+文档
⚡感兴趣的可以先收藏+关注,后续会更新更多项目资料,所有项目均配有开发文档和安装配置教程
摘 要
通过移动互联网这几年的发展,单独的开发某些APP已经到了日暮西山的地步,原因不在于单个的APP功能丰富与否,而是因为用户生态体系的问题。使用智能手机的用户经过多年的使用习惯,已经越来越不喜欢安装各种的APP,除了正常生活和工作所必须的APP,不喜欢因为喜欢某些内容而被强制安装APP软件了。最近几年,随着微信生态的布局,通过开发微信小程序接口,让广大用户可以通过微信直接访问小程序,不需要去专门安装那些APP,这一点让很多用户喜爱,基本上只要能转向微信生态的业务,许多企业都已经开始拥抱微信小程序。本课题就是研究和实现一款基于微信小程序的疫苗预约系统。
基于微信小程序的疫苗预约系统通过MySQL数据库与微信开发者工具进行开发,基于微信小程序的疫苗预约系统能够实现论坛管理,公告信息管理,疫苗信息管理,疫苗评价管理,疫苗收藏管理,疫苗预约管理,用户管理等功能。
基于微信小程序的疫苗预约系统让疫苗信息,疫苗预约信息等相关信息集中在后台让管理员管理,让用户在小程序端预约疫苗,查看疫苗预约信息,该系统让信息管理变得高效,也让用户预约疫苗,查看疫苗预约等信息变得越来越方便。
关键字:基于微信小程序的疫苗预约系统,疫苗信息,疫苗预约
第一章 绪论
1.1 选题背景
目前随着智能手机的不断普及,基本上可以达到人均一台智能手机的地步,在这样的背景下,各行各业如何把自己的服务提供到手机终端上,是一个问题。智能手机的好处就是有各种各样的软件,并且交互性很好,用户使用起来方便,在智能手机刚开始的前几年,有很多行业已经开始提前布局移动终端,占领了相当大的市场,不仅提高了客户满意度,也提高了市场知名度,但是随着时代的发展,如果还一直开发移动终端的软件,会导致用户手机里面需要安装各种各样的软件,用户已经从刚开始的新奇,变成了现在的厌烦,手机内存太小,安装太多东西,或者非强制性的软件,用户都不想安装了。面对如今的用户需求情况,依然开发APP软件已经是一种战略性失败。在国内目前市场上所有的智能手机里面肯定安装得有微信,微信已经变成了智能手机通讯的代名词,而微信推出了微信小程序,不需要用户注册账号,也不需要用户安装多余的软件,只需要通过微信软件就可以访问小程序,对用户极其友善,所以很多企业都瞄准了微信小程序。本课题就是在这样的大环境下研究和实现一款基于微信小程序的疫苗预约系统。
1.2 选题意义
首先用户可以不需要安装各种各样的APP,只需要一个微信就可以各种访问程序,用户不需要注册各种信息,微信提供了用户一键访问,并且可以在微信里面对小程序进行删除,定位,搜索,以及收藏,微信小程序是目前最火的一个开发方向。很多商家只需要开发出微信小程序,自己部署服务端,然后有任何需要推广的只需要让用户点击微信小程序访问即可,不仅仅给商家提供了一个十多亿用户的平台,也给用户减轻了安装各种APP的负担,并且微信所在的腾讯公司也能获得利润,微信小程序是一款多赢的选择。
本课题研究的基于微信小程序的疫苗预约系统前后台分离,让疫苗信息,疫苗预约信息等相关信息集中在后台让管理员管理,让用户在小程序端预约疫苗,查看疫苗预约信息,该系统让信息管理变得高效,也让用户预约疫苗,查看疫苗预约等信息变得越来越方便。
1.3 研究内容
本文将从分析,设计,实现,测试等角度来阐述本系统。
绪论:介绍本系统开发的背景,意义;
开发环境:介绍本系统的配置环境以及开发技术;
系统分析:介绍本系统的功能,性能以及可行性;
系统设计:介绍本系统的数据库的设计以及功能结构的设计;
系统实现:介绍本系统的实现界面以及实现的功能;
系统测试:介绍本系统的功能测试以及测试结果;
第二章 开发环境
开发本系统需要配置开发环境,除了需要开发者安装相应的软件外,也需要对开发中运用的技术进行了解和掌握。
2.1 Java语言
Java语言是目前最流行的语言之一,不仅可以做桌面窗口形式的程序,还可以做浏览器访问的程序,目前最流行的就是用Java语言作为基础,做各种程序的后台处理。Java语言是操作变量的语言,而变量则是Java对于数据存在形式的定义,变量用来操作内存,而内存则牵扯到计算机安全问题,这样Java语言反而有了免疫直接针对用Java语言开发出来的程序的病毒,有效的提高了Java语言开发出来程序的生存能力。Java是具有动态运行能力的一种语言,Java的类不仅仅可以用Java核心提供的基础类,还可以进行重写,这样会让Java的功能变得更加丰富,甚至可以编写一些功能模块进行封装,然后其他项目如果需要用到这些可以复用的功能,完全可以直接引用,然后在用得地方调用方法即可。Java是一种开源的语言,可以对Java里面的各种类以及引用方法进行追溯,甚至可以对已经编译过的语言进行反编译,这样不仅仅提高学习的效率,并且可以学习其他从业者提供的优雅的编程方式。Java语言发展到现在,已经在各个行业扎根,学习Java可以从事的行业很多,并且学习的方法很多,网上有很多免费的教程,甚至有些高深的知识也只需要付费就可以进行学习,而不是像Java语言之初,每一个编程人员都需要用记事本进行手动编码,现在有很多集成开发环境帮助Java从业者。选择Java语言进行编程,是一种很好的解决问题的方式。
2.2 MYSQL数据库
一般学习程序开发的人员如果学习数据库的话,肯定是要学习MySQL数据库,MySQL数据库通过这么多年的不断发展,社区版本都是免费的,最重要的是小巧,占用电脑空间比较小,让更多的开发人员可以不需要更换更高级的电脑就可以进行学习。学习只是一个方面,最重要的是MySQL市场占有率是世界第一,基本上十个公司就有七八个用得MySQL数据库。MySQL的优点不只是这么粗浅,MySQL首先是开源的,只要不是商用就不用花钱,并且大型的数据也是支持的,只要是市面上存在的操作系统,MySQL都可以有对应的版本可供使用。因为MySQL是开源的,如果有对MySQL有特殊需求的甚至可以自己修改源码,达到符合自己使用的目的。MySQL数据库好处多多,最重要的一点符合本设计的开发需求,可以说本设计只用到了MySQL的一些基础功能,而这点基础功能就完全够用。MySQL学习的教程网上很多,许多关于入门的教程就完全可以达到普通程序员的开发水平,只需要把基本的知识学会了,到公司里面也只是根据不同的业务逻辑进行不同的语句编写而已。
2.3 Eclipse开发工具
Eclipse是开源免费的,仅仅这样理解也许会给人一种免费没有好货的感觉,其实不是这样的。Eclipse是一个开发源代码的开发工具,这样会很安全,因为是开源的,如果对使用者的电脑有害,肯定能找到原因所在,所以这一点安全方面是不用担心的。Eclipse是不用安装的,这样就不用对系统盘增加压力,可以放到任何一个盘里,使用的时候打开,不用的时候关闭,不会偷偷的在后台运行,不需要增加注册表负担,启动还必须依靠Java的JDK才可以启动,有效的避免了一些病毒入侵,如果病毒入侵改变了源代码,就不能运行了,只能重新删除文件夹重新解压一份新的Eclipse即可,用起来很安全。Eclipse发展到现在,已经可以支持其他的开发语言了,家族越来越强大,功能越来越多,最重要的还是没有收费,这一点就让新手开发者省下很多的资金用来培养自己的学习,而不用花钱买了开发软件才发现自己不适合进行开发,永远免费的策略可以永远让人有想使用的机会。最重要的是Eclipse并不是免费功能就不够用,恰恰相反,不仅功能强大,用起来完全符合本设计的开发需求,所以选用了Eclipse作为开发工具。
2.4 SSM框架
首先SSM框架是指的三个框架,第一个S是Spring MVC的首字母,主要是作为控制视图层的一种框架,第二个S是Spring框架的意思,主要是用来作为Web层,这一层主要是用来获取浏览器提交的一些信息并且把提交的信息处理后反馈给Spring MVC来控制不同的显示页面和内容;第三个M是的意思是MyBatis框架,主要是做为持久层用得,把数据对象转换成数据库表里的值,或者从数据库获取相应的数据转换成对应的Java对象让程序可以有效的进行转换和处理。三个框架可以有效的进行结合,实现不同的作用,起到了承上启下的作用。
2.5微信开发者工具
微信开发者工具并不是用来开发微信的一款软件,而是专门用来开发依附于微信的微信小程序和微信公众号的。现如今国内人口差不多14个亿,仅仅微信用户就12个亿之多,基本上覆盖了国内能使用智能手机的所有人群。微信功能相当丰富,可以聊天,视频,移动支付,甚至可以缴各种费用,依靠微信的庞大用户群体,不管是政府机关还是商业公司,都希望借助于微信使用者的庞大用户群体,简化各种支付或者信息推送渠道,让使用微信的人群不用太麻烦就可以完成正常生活的所有操作,极大的方便了人民群众。微信开发者工具就是在聆听到这样的呼唤声而诞生的,为了满足人们的需求,腾讯专门开发出来这个开发工具让其他公司进行使用,并且开放了很多接口以及使用方法,微信开发者工具变得越来越强大。
第三章 系统分析
这个阶段,需要依靠大量的资料作为研究本系统的基础数据,除了分析系统开发可行问题之外,还要再通过调查本系统针对的目标人群的需求来确定本系统功能,并在本系统的性能上做出进一步分析。
3.1可行性分析
在项目进行开发之前,必须要有可行性分析报告,分别从技术角度,经济角度,操作角度上面进行分析,经过可行性分析是实现科学开发的必要步骤。
3.1.1技术可行性
从技术的角度出发,目前采用开发的技术完全能满足系统开发需要。目前市场上有现成的软件开发工具和开发技术,这些可以保证系统开发的顺利进展。
3.1.2操作可行性
基于微信小程序的疫苗预约系统是根据用户经常使用的页面操作流程来进行设计的,并且页面保证统一,从视觉角度和操作角度上都能达到使用要求。
3.1.3经济可行性
在本次开发过程中,因为需要通过电脑来进行配置开发的环境,通过对技术的分析,发现目前正在使用的电脑是可以满足开发需要的,并不需要太多的金钱对电脑进行更换。所以,从经济角度上分析,可以满足开发要求。
从以上三个角度来进行分析论证,证明了基于微信小程序的疫苗预约系统是可以正常开发并且使用的。
3.2系统流程分析
从系统的角色上分析,每个用户角色都代表了不同的账号身份,而不同的身份则代表着功能的异同,所以首先要区分用户的角色身份问题。设置用户登录需要输入账号和密码,输入的信息必须与数据库里已经存在的账号密码信息进行比对,只有正确的账号和密码才可以进行下一步的页面显示操作,如果不正确的账号密码,则拒绝用户登录,也代表着用户没有继续访问的权限,系统是无法继续提供服务的。
图3-1 操作流程图
任何一个系统都有一个操作流程,本设计里面,对于任何数据的存储都有一定的合法要求,只有符合设定要求的数据才可以进行存储。具体步骤参考下图。
图3-2 添加信息流程图
数据的存储并不是一成不变的,当需要对已经存在的数据进行改变的时候,同样也遵循着操作流程,想更改数据首先要确定更改之前的数据是什么,然后输入新的数据是否合法,都要符合流程,只有合法数据才可以被更新到数据库里存储。具体步骤参考下图。
图3-3 修改信息流程图
删除操作,在数据存储方面是一件比较慎重的事件,很有可能会产生失误操作,所以一般删除操作的时候都要提示是否删除,确定删除才会更新数据库内容,实现删除目的。具体步骤参考下图。
图3-4 删除信息流程图
3.3系统性能分析
系统在使用过程中,用户会享受到系统带来的便利。那么如何保持在长时间的使用过程中,不出现乱七八糟的问题,让使用系统变成一种操作上的享受,使用上的便捷,这就是需要考虑的问题。以下主要从系统的性能分析上面进行描述,从数据完整以及数据安全,包括系统的可扩展等方面进行介绍。
3.3.1系统安全性
注册用户与游客用户的区别就在于是否有账号,如果有账号,那么就有相关的注册用户权限,有账号就有密码,密码是保证账号安全性的前提,游客只能浏览一些公共性信息,如果需要用户登录才能观看的信息,那么也需要使用账号登录的。对于系统安全性上面,主要考虑角色的密码加密问题,这样可以防止有效的密码数据拦截后的破解工作。一般密码如果有安全性要求的话,是可以考虑加密存储。密码的加密存储大致有两种设计方法,一种是密码在前台提交后就用Java Script进行MD5加密,然后直接提交密文,这样的好处是密文传输的安全性,另一种是提交密码后在后台处理的过程中对密码进行加密或者解密,这样会增加后台的处理负担。一般都居中考虑,如果登录的话会把密码在后台进行加密与数据库密码进行对比。目前常用的加密方式是MD5加密方式。
3.3.2数据完整性
系统进行开发的最重要的目的就是数据的处理,计算机有其擅长数据的存储以及处理工作,所以数据的完整性是必须保证的,不然系统的存在是没有必要的。数据不管是设计还是存储,都必须完整,从数据的输入就从各个方面保证数据的合法性,违规数据不能直接提交的。数据处理逻辑也会保证数据的加工正常,进而进行数据存储,也会保证数据设计的合理,这些都是有数据设定要求的。目前对数据的存储采用的关系型数据库,关系型数据库有多年的历史,功能强大,迁移备份以及无人值守都可以进行自动备份的。
3.3.3系统可扩展性
系统是有必要存在扩展性的。在设计之初就要考虑可能存在的业务,所以对系统的设计就要模块化设计,这样需要进行扩展的时候,只要在对应模块进行增加,对应逻辑进行调试即可。系统可扩展性的提升会让系统增加不必要的工作量,让程序设计更加符合规范。
3.4系统功能分析
本系统在功能分析上,主要是根据目标用户群的角度进行分析,为了便于展示分析结果,这里就使用用例图进行功能展示。
管理员用例图的绘制结果见图3-5。管理员登录进入本系统操作的功能包括管理疫苗信息,管理疫苗评价信息,管理疫苗收藏信息,管理疫苗预约信息,管理论坛,管理公告信息等。
图3-5 管理员用例图
用户用例图的绘制结果见图3-6。用户登录进入本系统操作的功能包括预约疫苗,对账户进行充值,评价预约的疫苗,查看疫苗预约信息,发布帖子,管理发布的帖子等。
图3-6 用户用例图
第四章 系统设计
到目前为止,市面上已经存在了各种各样的软件系统,从系统的分类着手,主要应用范围倾向于办公系统,娱乐系统,社交系统,然后下面有很多比较细的分支系统。很多系统已经经过了市场的考验,针对不同的业务场景已经开始出现了业务模块化,程序员减代码化的各种设计方式。到目前为止,当要设计一个系统的时候,首先根据业务模型基本上都可以在网上找到类似的模板,然后根据具体业务具体分析,进而实现具体功能,大众的就是最好的,毕竟符合市场主流的就代表着肯定符合常规操作流程。
4.1 系统设计目标
系统设计的时候,就要制定需要达成的目标。在功能上,要严格符合设计需求,不仅仅要减少操作步骤,也要符合预期。因此,在规范化的今天设计出符合项目要求的系统,必须要达到下面设定的目标。
第一个目标就是友好性:友好性主要体现在用户使用过程中,不会对系统的操作产生一种不满,减少操作者的愤怒,这是相当重要的一个体现。前几年好多软件在这个友好性方面失去了市场,就是因为在友好性这方面没有做好。国内互联网发展初期,软件设计的目的就是能用就行,至于友好性的对比,那是不存在的,因为硬件效率比较低,计算机属于新兴行业,所以大哥不说二哥,都是不友好的。随着计算机硬件的提升,很多开发者开始注意到要牺牲一定的计算器性能来提升友好性,因为计算机发展到现在,第一印象很重要,一个软件设计的不好看,会让大部分人对其产生质疑,所以要在友好性上面下很大功夫进行雕琢。
第二个目标就是安全性:安全性其实贯穿着整个软件行业的发展史,计算机就是为解决人类重复性计算以及数据存储的目的而诞生的,很多行业都需要计算机来进行计算,减少出错几率,并且把数据保留,可以实时查询,所以数据的安全性也很重要。
只要保证数据安全性的前提,开发出符合功能需求的友好界面操作,那么就达到了系统设计的目的。
4.2功能结构设计
本系统主要是基于数据的增加,修改,删除等操作,使用者能够通过提前设定的登录功能进入指定的操作区,这里对使用者设计的功能进行结构展示。
管理员功能结构图的绘制结果见图4-1。管理员登录进入本系统操作的功能包括管理疫苗信息,管理疫苗评价信息,管理疫苗收藏信息,管理疫苗预约信息,管理论坛,管理公告信息等。
图4-1 管理员功能结构图
用户功能结构图的绘制结果见图4-2。用户登录进入本系统操作的功能包括预约疫苗,对账户进行充值,评价预约的疫苗,查看疫苗预约信息,发布帖子,管理发布的帖子等。
图4-2 用户功能结构图
4.3数据库设计
如果说设计系统的功能很重要,那么设计该系统的数据库将更重要,毕竟系统服务于用户,数据库服务于系统,用户访问系统,操作系统的所有数据都要依赖于数据库,而系统的数据几乎都是保存在数据库中的,所以,一个高质量的程序,必然拥有一个安全,快速响应,稳定可靠的数据库。本系统的MySQL数据库可以通过SQL语言来实现对系统数据的管理,包括在指定表中插入数据,在规定的表中更改数据,以及删除指定表中的部分数据等操作。一般来说,像MySQL这样的关系型数据库,对于结构化查询语言SQL都能很好的进行支持。在编程中,通过合理运用SQL语言便能操作数据库的各种数据,真是非常方便快捷!
4.3.1 数据库概念设计
本节内容主要是使用图形的方式来描述数据库中的实体,每个实体的相应属性,还有实体之间的相互联系,常用的Visio工具即可满足绘制E-R图的需求。E-R图是由矩形,椭圆,菱形等图形元素组成,矩形框中主要写实体的名称,椭圆框中主要是登记该实体的属性,而菱形框中主要是登记实体之间的联系名称,最后使用实心线段把这些图形元素进行连接,即可完成E-R图的绘制。当初步得到一个E-R图时,需要进行检查,使用分析的方式去修改,重构E-R图,以达到消除数据冗余,或者是消除实体间联系冗余的目的。从而保持数据库的完整性,以及降低数据库维护上面的难度。
(1)使用Visio这样的常用的实体属性图绘制工具来绘制疫苗实体属性图,绘制结果见图4-3。
图4-3 疫苗实体属性图
(2)使用Visio这样的常用的实体属性图绘制工具来绘制疫苗预约实体属性图,绘制结果见图4-4。
图4-4 疫苗预约实体属性图
(3)使用Visio这样的常用的实体属性图绘制工具来绘制管理员实体属性图,绘制结果见图4-5。
图4-5 管理员实体属性图
(4)使用Visio这样的常用的实体属性图绘制工具来绘制用户实体属性图,绘制结果见图4-6。
图4-6 用户实体属性图
(5)绘制的上述实体间存在的联系见图4-7。
图4-7 实体间关系E-R图
4.3.2 数据库物理设计
本系统数据在数据库中都是通过各种二维表进行记录保存的,在数据库中设计这样的二维表也是比较重要的内容,因为它影响着数据的存储效率。在设计二维表也就是关系模型之前,一些有关二维表方面的常用概念需要进行充分了解。
关系:一张具体的数据表即表示关系,关系的名称与数据表的名称保持一致;
元组:数据表中,每行显示的数据即代表元组;
属性:数据表中,每列表示的数据即代表属性;
关键字:数据表中,为了与其他数据表进行区分,则需要在每张表中进行主键的设置;
通过上节内容可以知晓数据库中的各个实体,并通过一定方式把这些实体表示的内容进行数据表的转换,通常来说,每个实体都会对应一张具体的数据表,在本系统指定的数据库中创建命名好的数据库,才可以对数据表进行创建与设计。基于微信小程序的疫苗预约系统数据表设计结果展示如下:
表4-1 论坛表
字段 | 注释 | 类型 | 空 |
id (主键) | 主键 | int(11) | 否 |
forum_name | 帖子标题 | varchar(200) | 是 |
yonghu_id | 用户 | int(11) | 是 |
users_id | 管理员 | int(11) | 是 |
forum_content | 发布内容 | text | 是 |
super_ids | 父id | int(11) | 是 |
forum_state_types | 帖子状态 | int(11) | 是 |
insert_time | 发帖时间 | timestamp | 是 |
update_time | 修改时间 | timestamp | 是 |
create_time | 创建时间 | timestamp | 是 |
表4-2 公告信息表
字段 | 注释 | 类型 | 空 |
id (主键) | 主键 | int(11) | 否 |
news_name | 公告标题 | varchar(200) | 是 |
news_types | 公告类型 | int(11) | 是 |
news_photo | 公告图片 | varchar(200) | 是 |
insert_time | 添加时间 | timestamp | 是 |
news_content | 公告详情 | text | 是 |
create_time | 创建时间 | timestamp | 是 |
表4-3 管理员表
字段 | 注释 | 类型 | 空 |
id (主键) | 主键 | bigint(20) | 否 |
username | 用户名 | varchar(100) | 否 |
password | 密码 | varchar(100) | 否 |
role | 角色 | varchar(100) | 是 |
addtime | 新增时间 | timestamp | 否 |
表4-4 疫苗信息表
字段 | 注释 | 类型 | 空 |
id (主键) | 主键 | int(11) | 否 |
yimiao_name | 疫苗名称 | varchar(200) | 是 |
yimiao_types | 疫苗类型 | int(11) | 是 |
yimiao_photo | 疫苗图片 | varchar(200) | 是 |
yimiao_kucun_number | 剩余数量 | int(11) | 是 |
yimiao_new_money | 疫苗价格 | decimal(10,2) | 是 |
yimiao_renqun | 适宜接种人群 | varchar(200) | 是 |
yimiao_text | 接种前后禁忌 | text | 是 |
yimiao_content | 疫苗详情 | text | 是 |
yimiao_delete | 逻辑删除 | int(11) | 是 |
create_time | 创建时间 | timestamp | 是 |
表4-5 疫苗收藏表
字段 | 注释 | 类型 | 空 |
id (主键) | 主键 | int(11) | 否 |
yimiao_id | 疫苗 | int(11) | 是 |
yonghu_id | 用户 | int(11) | 是 |
yimiao_collection_types | 类型 | int(11) | 是 |
insert_time | 收藏时间 | timestamp | 是 |
create_time | 创建时间 | timestamp | 是 |
表4-6 疫苗评价表
字段 | 注释 | 类型 | 空 |
id (主键) | 主键 | int(11) | 否 |
yimiao_id | 疫苗 | int(11) | 是 |
yonghu_id | 用户 | int(11) | 是 |
yimiao_commentback_text | 评价内容 | text | 是 |
insert_time | 评价时间 | timestamp | 是 |
reply_text | 回复内容 | text | 是 |
update_time | 回复时间 | timestamp | 是 |
create_time | 创建时间 | timestamp | 是 |
表4-7 疫苗预约表
字段 | 注释 | 类型 | 空 |
id (主键) | 主键 | int(11) | 否 |
yimiao_order_uuid_number | 订单号 | varchar(200) | 是 |
yimiao_id | 疫苗 | int(11) | 是 |
yonghu_id | 用户 | int(11) | 是 |
buy_number | 预约数量 | int(11) | 是 |
yimiao_order_true_price | 实付价格 | decimal(10,2) | 是 |
yimiao_order_types | 订单类型 | int(11) | 是 |
insert_time | 创建时间 | timestamp | 是 |
create_time | 创建时间 | timestamp | 是 |
表4-8 用户表
字段 | 注释 | 类型 | 空 |
id (主键) | 主键 | int(11) | 否 |
username | 账户 | varchar(200) | 是 |
password | 密码 | varchar(200) | 是 |
yonghu_name | 用户姓名 | varchar(200) | 是 |
yonghu_photo | 头像 | varchar(200) | 是 |
yonghu_phone | 手机号 | varchar(200) | 是 |
yonghu_email | 电子邮箱 | varchar(200) | 是 |
sex_types | 性别 | int(11) | 是 |
new_money | 余额 | decimal(10,2) | 是 |
yonghu_delete | 假删 | int(11) | 是 |
create_time | 创建时间 | timestamp | 是 |
第五章 系统实现
这里主要是对系统设计实现进行描述,通过系统的设计和数据库的设计,通过编码后变成了可以进行操作的界面,让一切想法变成了结果,通过文字和具体程序操作界面的截图之间的配合,可以把功能更直观的描述起来。
5.1管理员功能实现
5.1.1 论坛管理
管理员进入如图5-1所示的论坛管理界面之后,管理员点击信息显示栏中最右侧的修改,删除帖子按钮可依次完成论坛帖子信息的修改,删除等操作,管理员也能在当前界面查看论坛帖子回复信息。
图5-1 论坛管理界面
5.1.2 疫苗信息管理
管理员进入如图5-2所示的疫苗信息管理界面之后,管理员点击信息显示栏中最右侧的修改,删除,增加库存,减少库存按钮可依次完成疫苗信息的修改,删除,疫苗库存增加,疫苗库存减少等操作。
图5-2 疫苗信息管理界面
5.1.3 疫苗评价管理
管理员进入如图5-3所示的疫苗评价管理界面之后,管理员点击信息显示栏右侧的回复,删除按钮可依次完成疫苗评价信息回复,删除等操作。
图5-3 疫苗评价管理界面
5.1.4 疫苗预约管理
管理员进入如图5-4所示的疫苗预约管理界面之后,管理员点击信息显示栏中最右侧的详情,删除按钮可依次完成疫苗预约信息的详情查看,删除操作,管理员在本界面也能查询疫苗预约信息等。
图5-4 疫苗预约管理界面
5.2用户功能实现
5.2.1 疫苗信息
用户进入如图5-5所示的疫苗信息界面之后,用户查看疫苗剩余数量,疫苗接种前后禁忌,适宜接种人群等信息,用户可以对能够预定的疫苗进行预约。
图5-5 疫苗信息界面
5.2.2 订单确认
用户进入如图5-6所示的订单确认界面之后,用户点击确认支付就可以支付订单。进入订单确认界面前,需要用户对疫苗进行预定,才可以进入订单确认界面。
图5-6 订单确认界面
5.2.3 我的疫苗预约
用户进入如图5-7所示的我的疫苗预约界面之后,用户可以查看疫苗预约信息,有已经评价的疫苗预约信息,有已支付的疫苗预约信息,有退款的疫苗预约信息等。
图5-7 我的疫苗预约界面
5.2.4 我的发帖
用户进入如图5-8所示的我的发帖界面之后,用户点击新增按钮即可编辑发布自己的帖子,本模块显示的帖子都是用户本人发布的帖子,用户可以修改,可以删除帖子。
图5-8 我的发帖界面
5.2.5 用户充值
用户进入如图5-9所示的用户充值界面之后,用户输入充值金额,然后提交就能对账户进行充值。
图5-9 用户充值界面
第六章 系统测试
在整个系统完成之后,就需要进入系统测试环节。在系统测试环节的主要任务就是用不同的测试方法,使用不同的测试用例,来引出系统出现的问题,只要测试出问题,才可以让程序员有目的性的对问题进行解决,最终让问题越来越少,才能让用户验收程序。
6.1系统测试的特点
系统测试,是有一定的特点,并且根据这些特定也有相关的描述信息,下面就是对这些测试的特点来进行阐述:
第一点:完整的测试,就是在用户的角度上,通过不同的权限,来测试不同的模块,最终判断程序的优劣性。
第二点:测试主要从程序的设计架构方面来进行测试,也需要从业务操作流程方面测试。
第三点:测试不是想一出是一出,要有严谨的测试步骤,测试目的,只有科学的测试方法才能产生科学的测试结果,能很好的对出错几率进行降低。
总的来说,系统测试不仅仅是让功能符合,还要在突发情况下有相应的配套表现,只要考虑的多,做的多,系统运行过程中才能更加平稳。
6.2 系统功能测试
本章节主要是测试部分,选用一些常规操作进行测试,看测试效果是否达到程序设计预期。
6.2.1 用户登录测试
一般都要进行登录测试,登录测试是所有功能里面最基础也是重要的部分,只有合法的登录才可以进行对应权限的操作,不合法的登录肯定是不让用户进行下一步操作的。具体步骤参考下图。
表6-1 用户登录测试表
测试功能 | 操作流程 | 测试的数据 | 结果 | 是否符合要求 |
用户登录 | 用户填写账号,填写密码,数据填写完成之后点击登录按钮 | 账号和密码保证一个出错一个正确 | 不能登录 | 是 |
账号和密码都正确 | 登录成功 | 是 |
6.2.2 疫苗查询功能测试
查询功能是一个常用的功能,通过条件查询可以获得自己所需的内容,条件输入也需要输入正确的已经存在的条件才可以有获取结果,对不同的获取条件返回不同的结果集。
表6-2 疫苗查询功能测试表
测试功能 | 操作流程 | 测试的数据 | 结果 | 是否符合要求 |
疫苗查询功能 | 在查询界面的数据输入框中登记关键词然后搜索 | 疫苗名称有误或为空 | 不能查询 | 是 |
疫苗名称信息正确 | 查询成功 | 是 |
6.3 系统测试结果
经过整体性测试,基于微信小程序的疫苗预约系统测试无误,符合设计预期,同时也符合操作性设定以及易维护性设定,并且在数据的安全性保障上也有很好的体现。基于微信小程序的疫苗预约系统已经可以使用。
结 论
开发与实现基于微信小程序的疫苗预约系统已经花费了半年时间,在这期间,作为学生的我收获了很多知识。因为独自开发基于微信小程序的疫苗预约系统,仅仅依靠在校期间学到的软件开发方面的知识显然是不行的,还需要通过其他的学习渠道进行程序开发类知识的拓展,比如去图书馆借阅书籍,比如数据库设计的书籍,Java编程语言方面的书籍,软件工程方面的书籍等,还可以通过上网查看编程方面的博客,这些博客呈现的知识是各个软件开发者在工作生涯中总结的编程知识,都是编程知识中的精华,可以帮助学习开发的人员在编程中避免很多开发误区,还可以节省开发的时间。另外,也可以通过数字图书馆下载相似系统方面的参考文献进行程序开发类的知识学习。总而言之,当一个人完成基于微信小程序的疫苗预约系统的设计与开发后,不仅自身的专业知识水平得到了提升,还提高了自己将理论转为实际操作的能力,以及面对问题通过知识学习进而解决问题的能力。
基于微信小程序的疫苗预约系统的设计实现,让我有以下几点体会:
(1)在确定要研究的系统之后,对于系统的研究内容也就是系统的功能的分析与设计是比较重要的部分,这方面主要是站在使用者的角度进行考虑,可以参考相似系统的功能进行设计,也能通过对目标用户群进行问卷调查等方式进行功能需求的确定,只有确定了系统需要的功能之后,才可以开展系统的配套数据库的设计,系统的编码等后续工作。
(2)对于系统的代码编写是一项比较复杂的工作,这也是系统的后端部分,用户操作系统看到的只是代码运行之后呈现出来的操作界面前端部分,编写的代码与运行实现的界面是相对应的,所以编写代码时,需要一边编写,一边查看代码的运行效果,这里就需要编写代码的人员注意一些编写细节,比如规范命名程序变量,注释关键代码等,这些编码习惯会帮助开发者在该系统中进行功能拓展或功能维护中提高效率。
(3)系统的功能模块在编码实现之后,也需要单独进行测试,发现问题之后能够及时进行解决,当系统的所有的功能都实现之后,再次对该系统整体进行测试,方便开发者在检验系统功能的基础上,进行系统问题的修复与完善。
由于时间比较短暂,加上开发期间我都是一边学习理论,一边进行实操,对于开发的基于微信小程序的疫苗预约系统除了具备能够正常运行,能够提供信息管理功能,以及能够保证系统运行期间产生的数据的安全性等特点外,本系统也具备一些缺点,首先表现的就是当使用者使用系统时,在对数据进行查询或者更新时,系统响应时间比较长,增加了用户的等待时间,让用户的使用体验不够理想,其次,基于微信小程序的疫苗预约系统的功能操作的流程设计上也存在一些不合理之处,最后,基于微信小程序的疫苗预约系统对于权限划分,功能模块细分上也存在一些漏洞。
总的说来,在今后的时间里面,自己除了要加强理论知识的学习外,还要继续投入时间和精力去对基于微信小程序的疫苗预约系统进行修复,让本软件拥有更强的性能,比如安全性以及可靠性。
致 谢
自从来到了这个校园之后,我认识了很多同学,还有很多老师,也结交了很多朋友,这些人们为我的大学生活增添了许多色彩。虽然毕业已经进入倒计时,但是我们互相之间还是向往常一样相处,也许是大家都很珍惜这最后的时光吧。
在大学校园经过了几年的知识学习后,目前的我不仅具备一些专业理论知识,还拥有本专业方面的实操技能,这些成长都是学校老师带给我的,所以,毕业了,看到自己的知识变得丰富起来,自己的能力也得到了成长,我是非常感谢本专业的所有老师的。
指导老师是学院分配的老师,主要是帮助我们更好的完成选择的毕业课题,并在课题撰写期间提供给学生系统制作以及文档撰写方面的指导。因此,我在制作本系统时,我的导师提供的指导包括了功能的确定,系统结构的设计,系统功能的编码,以及测试系统等方面的指导,可以说从选题到本系统制作完成,导师在每个阶段性任务期间都进行了指导,主要是针对我遇到的主要困难,提供相应的解决方案,这样才让我能够如期完成本课题。所以,能够上交设计成果,我是非常感谢导师的。
感谢本院同学还有我身边的朋友,在校期间,我们总是时不时进行交流,包括平时作业以及本次的毕业课题方面的互相探讨,还有就是每当我陷入困境时,在你们的帮助下我总能很快走出困境。所以,这些年,你们的陪伴,让我很暖心!
离开校园之后,我们将不在这个场所进行学习与生活了,尽管很不舍,但还是祝愿我的校园前景广阔!
参考文献
[1]郑文明,彭梦晶,李浩.智能化分时段预约系统的设计与实现[J].中国卫生信息管理杂志,2022,19(01):95-99.
[2]华伟,杨菲,韩斌.多平台疫苗查询管理和疫苗知识推广系统的开发与应用[J].电子技术与软件工程,2018,(19):73-74.
[3]彭影.优化Java数据库访问效率的策略研究[J].计算机产品与流通,2020(02):21.
[4]尹维伟.探析计算机软件Java编程特点及技术[J].电脑编程技巧与维护,2020(03):38-39+52.
[5]张金波.Java编程中常见的异常及其解决方案[J].计算机产品与流通,2019(12):29.
[6]秦超,潘猛,张鹏.处理MySQL的典型问题[J].网络安全和信息化,2018(04):70-72.
[7]王晓燕.MySQL数据库中误操作删除数据的恢复问题[J].办公自动化,2018,23(11):45+61.
[8]李瑞祥,刘伟.MYSQL数据查询技巧[J].网络安全和信息化,2019(05):70-71.
[9]王宝莹.基于eclipse的毕业设计流程系统的设计与开发[J].智库时代,2020(13):261-262.
[10]李承涛,金亚玲.基于Eclipse软件的车载应用APP的设计[J].内蒙古科技与经济,2019(15):90+96.
[11]王崟.基于SSM框架的Java Web开发课程教学中的几点思考[J].电脑知识与技术,2018,14(27):140-141.
[12]唐权.SSM框架在JavaEE教学中的应用与实践[J].福建电脑,2017,33(12):93-94+61.
[13]袁堂青,亓婧.基于微信小程序的开发与研究[J].网络安全技术与应用,2020(04):66-67.
[14]邢榕珊,匡芳君.微信小程序设计[J].计算机时代,2018(08):9-12.
[15]谭少华. Java Web管理信息系统快速开发平台的设计与实现[D].电子科技大学,2018.
[16]孔璐.软件开发中数据库设计理论与实践分析[J].南方农机,2019,50(04):135.
[17]Konstantins Gusarovs. An Analysis on Java Programming Language Decompiler Capabilities[J]. Applied Computer Systems,2018,23(2).
[18]Tan Yiyu. A Hardware-oriented Object Model for Java in an Embedded Processor[J]. Microprocessors and Microsystems,2018.
核心代码
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("/yimiaoOrder")
public class YimiaoOrderController {
private static final Logger logger = LoggerFactory.getLogger(YimiaoOrderController.class);
@Autowired
private YimiaoOrderService yimiaoOrderService;
@Autowired
private TokenService tokenService;
@Autowired
private DictionaryService dictionaryService;
//级联表service
@Autowired
private YimiaoService yimiaoService;
@Autowired
private YonghuService yonghuService;
@Autowired
private YimiaoCommentbackService yimiaoCommentbackService;
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> 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"));
if (params.get("orderBy") == null || params.get("orderBy") == "") {
params.put("orderBy", "id");
}
PageUtils page = yimiaoOrderService.queryPage(params);
//字典表数据转换
List<YimiaoOrderView> list = (List<YimiaoOrderView>) page.getList();
for (YimiaoOrderView 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);
YimiaoOrderEntity yimiaoOrder = yimiaoOrderService.selectById(id);
if (yimiaoOrder != null) {
//entity转view
YimiaoOrderView view = new YimiaoOrderView();
BeanUtils.copyProperties(yimiaoOrder, view);//把实体数据重构到view中
//级联表
YimiaoEntity yimiao = yimiaoService.selectById(yimiaoOrder.getYimiaoId());
if (yimiao != null) {
BeanUtils.copyProperties(yimiao, view, new String[]{"id", "createTime", "insertTime", "updateTime"});//把级联的数据添加到view中,并排除id和创建时间字段
view.setYimiaoId(yimiao.getId());
}
//级联表
YonghuEntity yonghu = yonghuService.selectById(yimiaoOrder.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 YimiaoOrderEntity yimiaoOrder, HttpServletRequest request) {
logger.debug("save方法:,,Controller:{},,yimiaoOrder:{}", this.getClass().getName(), yimiaoOrder.toString());
String role = String.valueOf(request.getSession().getAttribute("role"));
if (false)
return R.error(511, "永远不会进入");
else if ("用户".equals(role))
yimiaoOrder.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
yimiaoOrder.setInsertTime(new Date());
yimiaoOrder.setCreateTime(new Date());
yimiaoOrderService.insert(yimiaoOrder);
return R.ok();
}
/**
* 后端修改
*/
@RequestMapping("/update")
public R update(@RequestBody YimiaoOrderEntity yimiaoOrder, HttpServletRequest request) {
logger.debug("update方法:,,Controller:{},,yimiaoOrder:{}", this.getClass().getName(), yimiaoOrder.toString());
String role = String.valueOf(request.getSession().getAttribute("role"));
// if(false)
// return R.error(511,"永远不会进入");
// else if("用户".equals(role))
// yimiaoOrder.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
//根据字段查询是否有相同数据
Wrapper<YimiaoOrderEntity> queryWrapper = new EntityWrapper<YimiaoOrderEntity>()
.eq("id", 0);
logger.info("sql语句:" + queryWrapper.getSqlSegment());
YimiaoOrderEntity yimiaoOrderEntity = yimiaoOrderService.selectOne(queryWrapper);
if (yimiaoOrderEntity == null) {
yimiaoOrderService.updateById(yimiaoOrder);//根据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());
yimiaoOrderService.deleteBatchIds(Arrays.asList(ids));
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<YimiaoOrderEntity> yimiaoOrderList = new ArrayList<>();//上传的东西
Map<String, List<String>> 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("../../upload/" + fileName);//获取文件路径
File file = new File(resource.getFile());
if (!file.exists()) {
return R.error(511, "找不到上传文件,请联系管理员");
} else {
List<List<String>> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件
dataList.remove(0);//删除第一行,因为第一行是提示
for (List<String> data : dataList) {
//循环
YimiaoOrderEntity yimiaoOrderEntity = new YimiaoOrderEntity();
// yimiaoOrderEntity.setYimiaoOrderUuidNumber(data.get(0)); //订单号 要改的
// yimiaoOrderEntity.setYimiaoId(Integer.valueOf(data.get(0))); //疫苗 要改的
// yimiaoOrderEntity.setYonghuId(Integer.valueOf(data.get(0))); //用户 要改的
// yimiaoOrderEntity.setBuyNumber(Integer.valueOf(data.get(0))); //预约数量 要改的
// yimiaoOrderEntity.setYimiaoOrderTruePrice(data.get(0)); //实付价格 要改的
// yimiaoOrderEntity.setYimiaoOrderTypes(Integer.valueOf(data.get(0))); //订单类型 要改的
// yimiaoOrderEntity.setInsertTime(date);//时间
// yimiaoOrderEntity.setCreateTime(date);//时间
yimiaoOrderList.add(yimiaoOrderEntity);
//把要查询是否重复的字段放入map中
//订单号
if (seachFields.containsKey("yimiaoOrderUuidNumber")) {
List<String> yimiaoOrderUuidNumber = seachFields.get("yimiaoOrderUuidNumber");
yimiaoOrderUuidNumber.add(data.get(0));//要改的
} else {
List<String> yimiaoOrderUuidNumber = new ArrayList<>();
yimiaoOrderUuidNumber.add(data.get(0));//要改的
seachFields.put("yimiaoOrderUuidNumber", yimiaoOrderUuidNumber);
}
}
//查询是否重复
//订单号
List<YimiaoOrderEntity> yimiaoOrderEntities_yimiaoOrderUuidNumber = yimiaoOrderService.selectList(new EntityWrapper<YimiaoOrderEntity>().in("yimiao_order_uuid_number", seachFields.get("yimiaoOrderUuidNumber")));
if (yimiaoOrderEntities_yimiaoOrderUuidNumber.size() > 0) {
ArrayList<String> repeatFields = new ArrayList<>();
for (YimiaoOrderEntity s : yimiaoOrderEntities_yimiaoOrderUuidNumber) {
repeatFields.add(s.getYimiaoOrderUuidNumber());
}
return R.error(511, "数据库的该表中的 [订单号] 字段已经存在 存在数据为:" + repeatFields.toString());
}
yimiaoOrderService.insertBatch(yimiaoOrderList);
return R.ok();
}
}
}
} catch (Exception e) {
e.printStackTrace();
return R.error(511, "批量插入数据异常,请联系管理员");
}
}
/**
* 前端列表
*/
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> 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 = yimiaoOrderService.queryPage(params);
//字典表数据转换
List<YimiaoOrderView> list = (List<YimiaoOrderView>) page.getList();
for (YimiaoOrderView 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);
YimiaoOrderEntity yimiaoOrder = yimiaoOrderService.selectById(id);
if (yimiaoOrder != null) {
//entity转view
YimiaoOrderView view = new YimiaoOrderView();
BeanUtils.copyProperties(yimiaoOrder, view);//把实体数据重构到view中
//级联表
YimiaoEntity yimiao = yimiaoService.selectById(yimiaoOrder.getYimiaoId());
if (yimiao != null) {
BeanUtils.copyProperties(yimiao, view, new String[]{"id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段
view.setYimiaoId(yimiao.getId());
}
//级联表
YonghuEntity yonghu = yonghuService.selectById(yimiaoOrder.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 YimiaoOrderEntity yimiaoOrder, HttpServletRequest request) {
logger.debug("add方法:,,Controller:{},,yimiaoOrder:{}", this.getClass().getName(), yimiaoOrder.toString());
YimiaoEntity yimiaoEntity = yimiaoService.selectById(yimiaoOrder.getYimiaoId());
if (yimiaoEntity == null) {
return R.error(511, "查不到该疫苗信息");
}
// Double yimiaoNewMoney = yimiaoEntity.getYimiaoNewMoney();
if (false) {
} else if ((yimiaoEntity.getYimiaoKucunNumber() - 1) < 0) {
return R.error(511, "购买数量不能大于库存数量");
} else if (yimiaoEntity.getYimiaoNewMoney() == null) {
return R.error(511, "疫苗信息价格不能为空");
}
//计算所获得积分
Double buyJifen = 0.0;
Integer userId = (Integer) request.getSession().getAttribute("userId");
YonghuEntity yonghuEntity = yonghuService.selectById(userId);
if (yonghuEntity == null)
return R.error(511, "用户不能为空");
if (yonghuEntity.getNewMoney() == null)
return R.error(511, "用户金额不能为空");
double balance = yonghuEntity.getNewMoney() - yimiaoEntity.getYimiaoNewMoney() * 1;//余额
if (balance < 0)
return R.error(511, "余额不够支付");
yimiaoOrder.setYimiaoOrderTypes(1); //设置订单状态为已支付
yimiaoOrder.setYimiaoOrderTruePrice(yimiaoEntity.getYimiaoNewMoney() * 1); //设置实付价格
yimiaoOrder.setYonghuId(userId); //设置订单支付人id
yimiaoOrder.setYimiaoOrderUuidNumber(String.valueOf(new Date().getTime()));
yimiaoOrder.setInsertTime(new Date());
yimiaoOrder.setBuyNumber(1);
yimiaoOrder.setCreateTime(new Date());
yimiaoEntity.setYimiaoKucunNumber(yimiaoEntity.getYimiaoKucunNumber() - 1);
yimiaoService.updateById(yimiaoEntity);
yimiaoOrderService.insert(yimiaoOrder);//新增订单
yonghuEntity.setNewMoney(balance);//设置金额
yonghuService.updateById(yonghuEntity);
return R.ok();
}
/**
* 退款
*/
@RequestMapping("/refund")
public R refund(Integer id, HttpServletRequest request) {
logger.debug("refund方法:,,Controller:{},,id:{}", this.getClass().getName(), id);
String role = String.valueOf(request.getSession().getAttribute("role"));
YimiaoOrderEntity yimiaoOrder = yimiaoOrderService.selectById(id);
Integer buyNumber = 1;
Integer yimiaoOrderPaymentTypes = 1;
Integer yimiaoId = yimiaoOrder.getYimiaoId();
if (yimiaoId == null)
return R.error(511, "查不到该疫苗信息");
YimiaoEntity yimiaoEntity = yimiaoService.selectById(yimiaoId);
if (yimiaoEntity == null)
return R.error(511, "查不到该疫苗信息");
Double yimiaoNewMoney = yimiaoEntity.getYimiaoNewMoney();
if (yimiaoNewMoney == null)
return R.error(511, "疫苗信息价格不能为空");
Integer userId = (Integer) request.getSession().getAttribute("userId");
YonghuEntity yonghuEntity = yonghuService.selectById(userId);
if (yonghuEntity == null)
return R.error(511, "用户不能为空");
if (yonghuEntity.getNewMoney() == null)
return R.error(511, "用户金额不能为空");
Double zhekou = 1.0;
//判断是什么支付方式 1代表余额 2代表积分
if (yimiaoOrderPaymentTypes == 1) {//余额支付
//计算金额
Double money = yimiaoEntity.getYimiaoNewMoney() * buyNumber * zhekou;
//计算所获得积分
Double buyJifen = 0.0;
yonghuEntity.setNewMoney(yonghuEntity.getNewMoney() + money); //设置金额
}
yimiaoEntity.setYimiaoKucunNumber(yimiaoEntity.getYimiaoKucunNumber() + buyNumber);
yimiaoOrder.setYimiaoOrderTypes(2);//设置订单状态为退款
yimiaoOrderService.updateById(yimiaoOrder);//根据id更新
yonghuService.updateById(yonghuEntity);//更新用户信息
yimiaoService.updateById(yimiaoEntity);//更新订单中疫苗信息的信息
return R.ok();
}
/**
* 发货
*/
@RequestMapping("/deliver")
public R deliver(Integer id) {
logger.debug("refund:,,Controller:{},,ids:{}", this.getClass().getName(), id.toString());
YimiaoOrderEntity yimiaoOrderEntity = new YimiaoOrderEntity();
;
yimiaoOrderEntity.setId(id);
yimiaoOrderEntity.setYimiaoOrderTypes(3);
boolean b = yimiaoOrderService.updateById(yimiaoOrderEntity);
if (!b) {
return R.error("操作出错");
}
return R.ok();
}
/**
* 评价
*/
@RequestMapping("/commentback")
public R commentback(Integer id, String commentbackText, Integer yimiaoCommentbackPingfenNumber, HttpServletRequest request) {
logger.debug("commentback方法:,,Controller:{},,id:{}", this.getClass().getName(), id);
YimiaoOrderEntity yimiaoOrder = yimiaoOrderService.selectById(id);
if (yimiaoOrder == null)
return R.error(511, "查不到该订单");
Integer yimiaoId = yimiaoOrder.getYimiaoId();
if (yimiaoId == null)
return R.error(511, "查不到该疫苗信息");
YimiaoCommentbackEntity yimiaoCommentbackEntity = new YimiaoCommentbackEntity();
yimiaoCommentbackEntity.setId(id);
yimiaoCommentbackEntity.setYimiaoId(yimiaoId);
yimiaoCommentbackEntity.setYonghuId((Integer) request.getSession().getAttribute("userId"));
yimiaoCommentbackEntity.setYimiaoCommentbackText(commentbackText);
yimiaoCommentbackEntity.setInsertTime(new Date());
yimiaoCommentbackEntity.setReplyText(null);
yimiaoCommentbackEntity.setUpdateTime(null);
yimiaoCommentbackEntity.setCreateTime(new Date());
yimiaoCommentbackService.insert(yimiaoCommentbackEntity);
yimiaoOrder.setYimiaoOrderTypes(4);//设置订单状态为已评价
yimiaoOrderService.updateById(yimiaoOrder);//根据id更新
return R.ok();
}
}