🙊作者简介:多年编程开发经验,专注java技术领域和毕业设计项目实战,系统定制、远程部署调试、代码讲解、代码修改
🍅擅长语言:springboot、ssm、vue、html、jsp、php、python、爬虫、小程序、安卓app
⬇️源码获取:文末可以获取源码+数据库+文档
⚡感兴趣的可以先收藏+关注,后续会更新更多项目资料,所有项目均配有开发文档和安装配置教程
摘 要
计算机网络发展到现在已经好几十年了,在理论上面已经有了很丰富的基础,并且在现实生活中也到处都在使用,可以说,经过几十年的发展,互联网技术已经把地域信息的隔阂给消除了,让整个世界都可以即时通话和联系,极大的方便了人们的生活。所以说,基于微信平台的报刊订阅小程序用计算机技术来进行设计,不仅在管理方面更加的系统化,操作性强,最重要的是关于数据的保存和使用都能节约大量的时间,该系统非常的好用。
基于微信平台的报刊订阅小程序管理数据的工具是MySQL,编码的语言是Java,运用的框架是SSM框架。该系统可以实现对报刊信息,报刊订阅,订阅发送,报刊论坛,报刊类型等信息的管理。
基于微信平台的报刊订阅小程序不仅能让操作人员使用更加地方便,并且设计的也很合理,能有效的避免误操作,让数据在录入的环节就符合设计需要,极大的规避了源头性的输入误差,顺利的让数据变得更加可控并且可靠,让出错的几率降到最低。
关键词:基于微信平台的报刊订阅小程序;报刊信息;报刊订阅
1 绪论
1.1 选题背景
当人们发现随着生产规模的不断扩大,人为计算方面才是一个巨大的短板,所以发明了各种计算设备,从结绳记事,到算筹,以及算盘,到如今的计算机,都是在无法满足生产的前提下出现的。随着计算机的发展,又出现了互联网技术。到现在为止,互联网已经发展了几十年了,在几十年的时间里就已经风靡世界。各行各业都发现了计算机的好处,计算机刚开始是军用的,后来在民用行业开始使用,到互联网时代,各种行业信息如井喷一般充斥着互联网,信息产生和传播的速度不断的提高。针对互联网的优点,结合互联网,对传统行业信息处理技术进行升级是非常有必要的。本课题对于报刊订阅信息的管理方面,开发一个基于微信平台的报刊订阅小程序,在信息管理方面不至于混乱,也能降低数据的出错率,数据安全方面也有了保证,该系统还有其他的优点,比如优化信息处理流程,降低信息泄露风险,减少资金投入,产出更高,让管理人员的工作更有效率等。所以说,基于微信平台的报刊订阅小程序是目前不可缺的,对使用者相当的重要。
1.2 选题意义
如今的年代,已经是步入信息社会了,不仅信息更新速度频繁,信息量也大,在信息时代必须有相应的处理信息的方法,如果还采用以前的结绳记事或者笔写纸记,不仅是信息录入效率上赶不上节奏,在信息检索的速度上更是让人无法承受。幸而当今社会上计算机技术发展的相当不错,可以通过计算机在信息处理上面实现自动化或者半自动化的作业,采用计算机技术,能有效的提高信息录入以及信息检索的效率,社会上相同行业之间本身就是效率高的淘汰效率低的,既然采用计算机来替代手工记录,必然是效率更高,稳定性更强,成本更低等诸多优点。针对于报刊订阅信息管理,开发一个基于微信平台的报刊订阅小程序不仅可以实现现代化的信息管理,也更符合现代化信息管理规范。
在实际的使用效果中,基于微信平台的报刊订阅小程序的意义如下:
第一点:基于微信平台的报刊订阅小程序的出现,就是为了提高工作人员的效率,能够在规定时间完成工作任务。
第二点:操作页面符合人体工程美学,符合日常人为操作习惯,使用友好。
第三点:区别于传统用纸张记录,提高了信息化水平。
第四点:在信息处理方面,极大的降低了人工处理成本。
1.3 研究内容
本文对系统的描述过程将按照绪论,系统开发技术,分析,设计,实现,测试等环节进行展开介绍。
绪论:本节内容主要展示研究该系统的背景和意义。
系统开发技术:本节内容主要展示该系统开发中需要使用的技术和搭建的开发环境。
系统分析:本节内容主要就是分析系统,包括性能,功能上的数据分析,也包括可行性分析等内容。
系统设计:本节内容主要就是根据系统分析的结果进行设计,主要包括功能和数据库的设计。
系统实现:本节内容主要就是通过程序编码对系统的功能进行实现,同时也对需要介绍的功能进行界面运行效果的展示。
系统测试:本节内容主要就是对系统的功能实现部分进行检测,发现系统的错误并及时纠正,让系统能够保证运行无误。
2 系统开发技术
对系统的开发需要做好准备工作,其中安装开发的工具以及学习开发中需要运用的技术都是需要提前进行的,本节内容就对开发中运用的工具还有技术进行阐述。
2.1 MySQL数据库
本设计用到的数据库就是MySQL数据库,之所以用到这个数据库的原因很多。首先,从满足功能需求上面来讲,MySQL是符合的;其次,从学习程度来讲,MySQL相比其他数据库不管是从安装还是使用上面来讲,都比较简单,最重要的是学习起来相当便捷,比较容易入手;再次,MySQL数据库对电脑要求不高,不管是什么样的电脑都可以安装MySQL数据库,并且并不会对电脑性能造成过多的影响。所以,就平常普普通通的电脑就可以作为开发用的电脑,不需要进行额外的电脑升级。虽然自从MySQL数据库被Oracle数据库收购后,有了一些闭源的风险,但是使用者还是很多,MySQL数据库目前的开发人员已经超过五百人了,对数据库开发者来讲已经是一个很大的开发团队了。MySQL在使用上面来讲,普通的增删改查操作已经可以满足大部分业务需求,像一些数据导出导入,以及一些函数,都可以满足一些不同的需求,最重要的是MySQL数据库可以创建索引,可以大大的提高数据的查询效率,当然,物极必反,如果因为索引好用而滥用,索引弄得比数据库表还要多,这样会造成MySQL数据库更新表数据时候的运行效率。总而言之,MySQL数据库在本次设计的使用上,是完全符合使用要求的。
2.2 IDEA简介
IDEA的诞生在Java集成开发工具行业正所谓平地起雷,瞬间震动了整个Java开发行业。真的是每个人用过的都说好。IDEA之所以相比于其他比如MyEclipse或者Eclipse之类的Java开发工具来讲比较好,原因首先在于设计方面。IDEA采用了所谓的人体工程学设计原理,让使用IDEA的人员用了就忘记不了。软件打开首先要设置主题,可以选择常规的白色或者暗色系列,长时间的白色或者长时间的暗色会让开发人员的眼睛疲劳加重,首先从这个细节就让程序开发人员备受青睐,让程序员看着舒服;然后再对一些常用性插件进行归类,让程序的开发注重于提升生产效率,而不是一味的让开发者找各种插件,有时候插件之间的版本还会存在不兼容,IDEA就把兼容的插件双手呈现,如此贴心的IDEA怎么能让人不喜爱。所以选择IDEA用来开发本项目就理所当然的了。
2.3 SSM框架
最近几年流行的SSM框架是之前的SSH框架的一种替代品,取代了原有的SSH框架的那种臃肿的配置,以及各种Bug,并且在开发模式以及运行效率上面来讲,都是有了很大的提高。Spring是控制层,Spring MVC是视图层,MyBatis是持久层。
在原理上面,SSM框架继承了SSH框架的那种框架以及代码分层设计,首先理解起来比较符合人类的正常理解,视图是负责视图的控制和显示,控制层可以接收和传递视图提交过来的信息,也可以接收和传递持久层的数据信息,而持久层只需要对数据对象进行自动化的转换,给控制层的数据是Java对象,到数据库则转换为相应的数据类型。
使用框架可以有效的解决各种代码写作过程中数据类型的转换问题,把数据类型转换让框架自己转换,写作很方便。
2.4 Vue框架
Vue框架的开发者是一个中国人,区别于其他框架的最核心的概念就是渐进式框架,Vue的出现,让网页前端的开发变成了一种纯前端职业,不需要在考虑后台数据类型以及业务逻辑,只需要进行数据绑定即可,大大的减少了前端开发工程师的学习难度。Vue是当前世界上最火的一种前段框架,学习成本比较低,只需要熟悉最基本的网页知识就可以理解相关知识,并且有很好的免费教程进行学习,有各个国家语言的教程,尤其是因为是中国人开发的框架,让中国的高级程序开发人员做了汉语教程。Vue框架发展之初就是高于IE8版本的,所以说只要是当前的主流浏览器都支持Vue框架,如果是很旧的那种电脑是不支持的,必须安装支持HTML5的浏览器才可以访问用Vue发布的站点。
3 系统分析
对于基于微信平台的报刊订阅小程序开发设计到的流程有,分析系统的功能,设计系统的结构,设计数据库,编码以及测试,其中,在系统分析中,所做的工作包括功能的确定,性能的分析等。
3.1 可行性研究
基于微信平台的报刊订阅小程序开发实现分析需要从不同的角度来进行分析可行性,比如从时间角度,经济角度,甚至操作角度。从不同的角度分析可行性会让基于微信平台的报刊订阅小程序开发具体化,进而达到辩证开发的正确性。
3.1.1 经济可行性
从经济方面分析是第一要素,没有经济的支持,任何项目都如水中捞月,无法实现。实现基于微信平台的报刊订阅小程序,开发过程不需要额外的经济条件,用本人现有的计算机就可以实现,这方面不需要额外的支出。
3.1.2 时间可行性
基于微信平台的报刊订阅小程序设计主要作为毕业设计,在题目确定之后,答辩之前使用的项目,对不同的开发进度上面都有时间的要求,总不至于答辩完成后才能实现功能,这个肯定不行,所以从时间上来分析项目的工作量,发现是可行的,符合正常开发时间。
3.1.3 操作可行性
操作必须符合正常人的思维模式,市面上有很多符合要求的程序正在使用中,可以借鉴其他程序的操作流程,变成符合本设计的操作流程,在操作上面进行无缝衔接,让使用者操作过程中不会感到迷茫。
从上面的角度来分析,后续工作可以继续进展。
3.2 系统性能分析
性能分析是软件开发过程中必不可少的一个环节,主要是为了降低软件在使用的过程中的容错率。通常来讲,分析软件系统的性能一般从以下几个方面进行分析。
3.2.1 系统的安全性
系统开发出来就是让正常使用的,那么在如今的互联网时代,首先考虑的就是安全性的问题。如果系统的安全性不够,那么使用价值就会降低。如果出现使用过程中丢失数据,那么用户就不再信赖,所以系统的安全性是第一要位,只有安全性存在了,才能考虑使用的问题,总不至于今天用户注册,明天用户账号泄露,这些都是不友好的。所以账号一般在数据库里存储会通过MD5进行加密,这样关键数据加密可以保证系统的安全性。
3.2.2 系统的易用性
安全性分析处理完毕,才考虑易用性。一个软件设计得符合操作规范,符合正常人类的理解逻辑,那么在使用上面就会很舒服,如果违背了这条原则,安全性再高的软件也是设计失败的,毕竟软件开发出来就是让人使用的,这一点尤为重要。
3.2.3 系统的健壮性
系统设计易用不代表没有规则,那么系统设计使用方面必须健壮,必须符合软件处理逻辑。比如设计一个价格类的输入框,用户需要输入价格,那么可以设定输入框最多两位小数的纯数字输入,如果用户不小心输入了其他字符,那么就会友好的提示让用户修改正确,只有输入符合规范的数据,才能进行提交,并且存储到数据库里。系统的健壮性就是这样,越是规范,越是健壮,有助于用户理解,还有助于程序使用。
3.3 系统流程分析
系统设计不是胡乱的设计,必须符合软件设计思想,具体的流程参考下图。系统设计的前期就是做各种分析,功能的设计,数据库的设计等,等一切都设计好了,逻辑上没有问题,符合设计流程和设计规范,才可以继续编码环节,编码只是实现设计的一个环节而已。
图3.1系统开发流程图
用户是一切应用的基础,只要牵扯到用户,那么肯定需要用户进行注册,只有这样才能让注册的用户进行使用。如果用户没有注册,只能算是游客,那么只能访问一些大众用户可以浏览的信息,如果需要用户操作的部分是不允许访问的,这样能极大的保证用户的权利。用户注册流程用下面的图来表示,主要是先判断用户名,只有用户名能用了才可以进行后面的信息注册。
图3.2 注册流程图
当需要用户登录的时候,肯定是要验证的,只有验证通过的用户才可以进行下一步操作,用户登录成功代表着用户模块的功能对登录用户进行了开放。流程就是如下面的图所示。
图3.3 登录流程图
3.4 系统功能分析
在对设计的总体要求理解了之后,就要把要求给具体化,也就是功能化,要尽量的把每个功能模块和模块之前的关系理清楚,必须符合正常人的行为逻辑才可以,并且尽量研究同类型的项目,这样能避免走弯路,最终才能得到设计的具体功能。
基于微信平台的报刊订阅小程序把操作该系统的用户群分为两类,即管理员,用户。
管理员对于基于微信平台的报刊订阅小程序操作的功能包括对报刊信息,报刊订阅信息,订阅发送信息,报刊论坛等进行管理。其用例图如图3.4所示:
图3.4 管理员用例图
用户对于基于微信平台的报刊订阅小程序操作的功能包括订阅报刊,查看订阅报刊的内容,发布关于报刊的帖子,在报刊论坛评论帖子,查看帖子等。其用例图如图3.5所示:
图3.5 用户用例图
4 系统设计
系统在设计的过程中,必然要遵循一定的原则才可以,胡乱设计是不可取的。首先用户在使用过程中,能够直观感受到功能操作的便利性,符合正常思维逻辑的操作,这才是系统好用的一个开端,给使用者第一印象就是这个系统设计的相当不错。
4.1 系统设计原则
系统遵循设计原则进行开发,会有很多可以预料到的好处,只要遵循了设计原则,那么开发出来的系统必然是有质量保证的。
首先第一条原则就是安全性原则:程序必须设定角色管理,不同的角色有不同的功能模块,不同的角色登录都需要输入相对应的账号和密码,否则不允许进行操作相对应的权限。每个用户登录只能修改自己的密码,不需要对别的账号进行密码或者其他资料的修改,否则就违背了安全性原则的设定。
其次第二条原则就是易用性原则:符合安全性只是功能的符合,不代表操作就符合,所以要设定易用性原则。易用性原则就是规定程序符合操作流程,正常人的思维定向为基础,在不违背程序运行逻辑定义的情况下,必须使用简单,操作规范,让每个用户使用起来都能看到页面,就能感知功能模块的作用,短时间的就能使用程序,达到易用效果。
再次第三条原则就是实用性原则:实用性代表着花里胡哨的功能必须抛弃,尽量符合数据处理的简洁性,不仅需要这样进行设定,还需要有预知性,系统后期可能会出现的功能模块尽量要解耦,与程序设定要模块化体现,这样才能达到扩展性。
第四条原则就是准确性原则:准确性原则的唯一定义就是准确,包含数据输入格式的准确,数据处理的准确,以及数据存储的准确。程序里面关于数据准确才有存在的意义,如果一堆不相干的数据存在是没有任何用处的,甚至会产生各种问题,所以必须要保证数据的准确性。
第五条原则是易维护原则:易维护代表着程序运行必须是可控的状态,如果不可控出现各种问题,那么所有的工作都是空谈。程序开发中对于各种程序判定异常,必须有统一的处理模式,异常是程序开发中不可避免的,但是可以对出现的异常进行抛出,有助于程序异常处理的复盘,只要每个异常都能定位准确,那么代表程序设计是趋于完美的,维护起来会更加的方便,只要有助于程序维护的都必须给予支持。
4.2 功能模块设计
对管理员具体功能的设计结果将以图4.1所示的管理员功能结构图来进行体现。管理员对于基于微信平台的报刊订阅小程序操作的功能包括对报刊信息,报刊订阅信息,订阅发送信息,报刊论坛等进行管理。
图4.1 管理员功能结构图
对用户具体功能的设计结果将以图4.2所示的用户功能结构图来进行体现。用户对于基于微信平台的报刊订阅小程序操作的功能包括订阅报刊,查看订阅报刊的内容,发布关于报刊的帖子,在报刊论坛评论帖子,查看帖子等。
图4.2 用户功能结构图
4.3 数据库设计
用户通过系统的功能操作来进行数据交互,包括数据的添加,数据的更新,数据的删除,数据的查询等基本功能操作,表面上虽然是操作系统界面提供的功能,但是实际上系统的这些数据是在数据库当中进行访问与操作的。目前市场上可供选择的存储数据的数据库有很多,除了简单版的Access之外,还有SQL Server,DB2,Informix,MySQL等关系型数据库可供选择,由于关系型数据库具有固定的表结构,以及对数据一致性要求比较强,所以相比没有固定表结构以及具有灵活的数据格式的非关系型数据库而言,在程序配套数据库的选择中,关系型数据库的使用率更高。本系统选择MySQL来存放数据,其相关理论以及技术在经过了很长时间的发展之后,变得非常成熟,各大网络平台都公开分享其开发源码,而且其对计算机的配置要求很低,不需要过多内存进行安装,很符合本系统对于数据库的选择要求。
4.3.1 数据库E-R图
本节需要对系统中存放在数据库中的数据进行充分分析,对数据的实体,实体特征,联系等进行确定,然后通过概念模型的表示方法即E-R图进行表达,在E-R图绘制工具中,选择椭圆,菱形框,矩形等形状表达实体属性,实体间联系,实体这些信息,使用实线段将这些形状进行连接即可。初步完成E-R图之后,需要进行检查,及时进行有误数据的更改,删除实体间存在的冗余联系,删除E-R图中冗余的数据,最终要展示一个内容准确的E-R图。
(1)报刊订阅包括的属性有订阅编号,订阅价格,报刊类型等。其属性图如下。
图4.4 报刊订阅实体属性图
(2)管理员包括的属性有密码,角色,用户名等。其属性图如下。
图4.5 管理员实体属性图
(3)报刊包括的属性有报刊名称,报刊封面,报刊类型等。其属性图如下。
图4.6 报刊实体属性图
(4)用户包括的属性有用户姓名,头像,手机号码等。其属性图如下。
图4.7 用户实体属性图
(5)设计的各实体间关系E-R图如下。
图4.8 实体间关系E-R图
4.3.2 数据库表结构
在指定的数据库里面对数据表进行创建命名,然后设计各个数据表的存储结构,需要对该数据库的操作非常熟悉,并且还需要学习并掌握一定的数据表设计方面的知识,比如数据命名,作为系统的开发人员,为了避免程序运行产生乱码现象以及为了确保系统的正常运行,在对数据表进行命名时,一般都是采用英文名称,同时在对数据表的字段进行编辑时,也是采用英文的方式进行,为了方便今后对数据表的设计内容进行更改或查看,对一些比较重要的字段都会进行中文备注,或者是使用中文进行字段描述。设计期间,也需要对各个字段选择合适的数据类型以及设置匹配的取值范围,当一张数据表设计完成之后,还要对该表的主键进行标注,就是为了确保该数据表的唯一性与独立性。
表4.1 用户表
字段 | 注释 | 类型 | 空 |
id (主键) | 主键 | bigint(20) | 否 |
addtime | 创建时间 | timestamp | 否 |
yonghuzhanghao | 用户账号 | varchar(200) | 否 |
mima | 密码 | varchar(200) | 否 |
yonghuxingming | 用户姓名 | varchar(200) | 是 |
touxiang | 头像 | varchar(200) | 是 |
xingbie | 性别 | varchar(200) | 是 |
shoujihaoma | 手机号码 | varchar(200) | 是 |
表4.2 报刊类型表
字段 | 注释 | 类型 | 空 |
id (主键) | 主键 | bigint(20) | 否 |
addtime | 创建时间 | timestamp | 否 |
baokanleixing | 报刊类型 | varchar(200) | 是 |
表4.3 报刊信息表
字段 | 注释 | 类型 | 空 |
id (主键) | 主键 | bigint(20) | 否 |
addtime | 创建时间 | timestamp | 否 |
baokanmingcheng | 报刊名称 | varchar(200) | 是 |
fengmian | 封面 | varchar(200) | 是 |
baokanleixing | 报刊类型 | varchar(200) | 是 |
dingyuejiage | 订阅价格 | float | 是 |
baokanxiangqing | 报刊详情 | longtext | 是 |
clicktime | 最近点击时间 | datetime | 是 |
clicknum | 点击次数 | int(11) | 是 |
表4.4 订阅发送表
字段 | 注释 | 类型 | 空 |
id (主键) | 主键 | bigint(20) | 否 |
addtime | 创建时间 | timestamp | 否 |
dingyuebianhao | 订阅编号 | varchar(200) | 是 |
baokanmingcheng | 报刊名称 | varchar(200) | 是 |
fengmian | 封面 | varchar(200) | 是 |
baokanleixing | 报刊类型 | varchar(200) | 是 |
baokanneirong | 报刊内容 | longtext | 是 |
baokanriqi | 报刊日期 | date | 是 |
yonghuzhanghao | 用户账号 | varchar(200) | 是 |
yonghuxingming | 用户姓名 | varchar(200) | 是 |
userid | 用户id | bigint(20) | 是 |
表4.5 报刊信息评论表
字段 | 注释 | 类型 | 空 |
id (主键) | 主键 | bigint(20) | 否 |
addtime | 创建时间 | timestamp | 否 |
refid | 关联表id | bigint(20) | 否 |
userid | 用户id | bigint(20) | 否 |
nickname | 用户名 | varchar(200) | 是 |
content | 评论内容 | longtext | 否 |
reply | 回复内容 | longtext | 是 |
表4.6 报刊论坛表
字段 | 注释 | 类型 | 空 |
id (主键) | 主键 | bigint(20) | 否 |
addtime | 创建时间 | timestamp | 否 |
title | 帖子标题 | varchar(200) | 是 |
content | 帖子内容 | longtext | 否 |
parentid | 父节点id | bigint(20) | 是 |
userid | 用户id | bigint(20) | 否 |
username | 用户名 | varchar(200) | 是 |
isdone | 状态 | varchar(200) | 是 |
表4.7 订阅公告表
字段 | 注释 | 类型 | 空 |
id (主键) | 主键 | bigint(20) | 否 |
addtime | 创建时间 | timestamp | 否 |
title | 标题 | varchar(200) | 否 |
introduction | 简介 | longtext | 是 |
picture | 图片 | varchar(200) | 否 |
content | 内容 | longtext | 否 |
表4.8 收藏表
字段 | 注释 | 类型 | 空 |
id (主键) | 主键 | bigint(20) | 否 |
addtime | 创建时间 | timestamp | 否 |
userid | 用户id | bigint(20) | 否 |
refid | 收藏id | bigint(20) | 是 |
tablename | 表名 | varchar(200) | 是 |
name | 收藏名称 | varchar(200) | 否 |
picture | 收藏图片 | varchar(200) | 否 |
type | 类型(1:收藏,21:赞,22:踩) | varchar(200) | 是 |
inteltype | 推荐类型 | varchar(200) | 是 |
表4.9 管理员表
字段 | 注释 | 类型 | 空 |
id (主键) | 主键 | bigint(20) | 否 |
username | 用户名 | varchar(100) | 否 |
password | 密码 | varchar(100) | 否 |
role | 角色 | varchar(100) | 是 |
addtime | 新增时间 | timestamp | 否 |
表4.10 报刊订阅表
字段 | 注释 | 类型 | 空 |
id (主键) | 主键 | bigint(20) | 否 |
addtime | 创建时间 | timestamp | 否 |
dingyuebianhao | 订阅编号 | varchar(200) | 是 |
baokanmingcheng | 报刊名称 | varchar(200) | 是 |
fengmian | 封面 | varchar(200) | 是 |
baokanleixing | 报刊类型 | varchar(200) | 是 |
dingyuejiage | 订阅价格 | float | 是 |
dingyueshijian | 订阅时间 | datetime | 是 |
yonghuzhanghao | 用户账号 | varchar(200) | 是 |
yonghuxingming | 用户姓名 | varchar(200) | 是 |
shoujihaoma | 手机号码 | varchar(200) | 是 |
crossuserid | 跨表用户id | bigint(20) | 是 |
crossrefid | 跨表主键id | bigint(20) | 是 |
ispay | 是否支付 | varchar(200) | 是 |
userid | 用户id | bigint(20) | 是 |
5 系统实现
下面主要是通过功能实现界面截图的形式,并且运用文字来描述功能实现界面的内容。
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.1.5 报刊论坛
该功能主要用于实现对报刊论坛基本信息的管理,报刊论坛界面的运行效果见图5.5。在此界面,管理员查看用户关于报刊方面的交流信息,删除一些不合规的关于报刊的交流信息。
图5.5 报刊论坛界面
5.2 用户功能实现
5.2.1 报刊信息
报刊信息界面的运行效果见图5.6。在此界面,用户收藏喜欢的报刊,订阅需要的报刊,查看报刊的订阅价格,评论报刊等。
图5.6 报刊信息界面
5.2.2 报刊订阅
报刊订阅界面的运行效果见图5.7。在此界面,用户查看已经提交的报刊订阅信息,并支付订阅报刊的价格。
图5.7 报刊订阅界面
5.2.3 订阅发送
订阅发送界面的运行效果见图5.8。在此界面,每当管理员发送用户订阅的报刊内容之后,用户可以及时查看报刊内容。
图5.8 订阅发送界面
5.2.4 我的发帖
我的发帖界面的运行效果见图5.9。在此界面,用户新增报刊方面的帖子,管理自己发布的帖子,比如修改帖子,删除需要删除的自己发布的帖子,查看该帖子的用户评论。
图5.9 我的发帖界面
5.2.5 报刊论坛
报刊论坛界面的运行效果见图5.10。在此界面,用户查询报刊论坛的帖子,每条帖子都能够让用户查看,并且允许用户查看之后,评论帖子。
图5.10 报刊论坛界面
6 系统测试
下面主要描述系统测试。系统测试属于软件开发中后期的环节,是在软件编码完成过程中或者开发完毕后才可以进行的环节。系统测试主要是用大量数据进行检验程序开发是否正确,还能检验整个程序对于数据的承载能力,也可以检验整个程序与在数据的测试下,是否能准确的进行存储和查询,是否符合程序设计的预期。
6.1 功能测试
基于微信平台的报刊订阅小程序必须经过各种测试环节才可以得出测试结论,下面对系统功能的适用性、可操作性、安全性等进行检测。
表6.1 功能测试数据表
测试内容 | 最终结果 |
对系统功能的适用性进行测试 | 测试合格 |
对系统功能的准确性进行测试 | 测试合格 |
对系统功能的依从性进行测试 | 测试合格 |
对系统功能的可操作性进行测试 | 测试合格 |
对系统功能的安全性进行测试 | 测试合格 |
6.2 可用性测试
一般来说,对设计的要求要符合正常的逻辑功能,逻辑的合理是首要的,如果功能与逻辑之间发生冲突,那很有必要对功能进行梳理,最终呈现应用的可用性,可用性要对设计进行全方位的测试。
表6.2 可用性测试数据表
测试内容 | 最终结果 |
对系统的操作逻辑进行测试 | 测试合格 |
对系统的反馈提示是否出现错别字进行测试 | 测试合格 |
对系统显示的各个数据项是否存在错误进行测试 | 测试合格 |
对系统的功能布局进行测试 | 测试合格 |
对系统是否提供帮助信息进行测试 | 测试合格 |
对系统操作界面是否关闭正常进行测试 | 测试合格 |
对系统是否支持键盘和鼠标进行测试 | 测试合格 |
对系统是否具备功能友好性进行测试 | 测试合格 |
6.3 测试结果分析
基于微信平台的报刊订阅小程序经过了单元测试,以及整体测试,并且也修复了测试过程中产生的问题,并且也进行了回归测试,保障了系统功能的正常,实现了系统设计的所需功能,并且在试运行过程中,也解决了一些故障问题,保证了系统的稳定性,本系统可以进行交付使用。
结 论
本课题主要是研究与实现基于微信平台的报刊订阅小程序,在经历了资料查找,技术选择,功能分析,模块设计,数据库设计,界面设计,功能编码,功能测试等阶段性工作之后,本人已如期完成了一个可供目标用户群使用的基于微信平台的报刊订阅小程序。
基于微信平台的报刊订阅小程序选用Java语言,搭配MySQL数据库进行设计与开发,相比于大部分相似系统而言,其具备的特点如下:
(1)基于微信平台的报刊订阅小程序的功能完全根据目标人群的使用需求进行分析设计与编码,也经过了开发流程中的最后测试环节,最终确定其功能基本得到实现,可以在生活中发挥其用于信息管理的作用。
(2)基于微信平台的报刊订阅小程序的界面设计很简单,具备简洁直观的特点,因为每个功能模块都有单独的界面展示,使用者点击不同的功能就会出现与之相应的界面,每个界面的颜色搭配比较统一,界面的布局也合理,界面上使用的各种图片都经过了Photoshop这样的图片处理工具进行了美化,所以使用者在浏览本系统的各个界面的时候,对本系统显示的各种信息能够一目了然。
(3)基于微信平台的报刊订阅小程序的使用与操作非常便利,因为本系统能够规避大部分用户的误操作现象,所以使用人群在使用期间能够在短时间内找到需要的功能并操作,这样可以节省操作时间,并且本系统在操作的流程上也进行了优化,去掉了一些比较繁琐的操作步骤,同时本系统在各个界面上也把一些常用的功能放在了比较显眼的区域,也大大方便了使用者对于基于微信平台的报刊订阅小程序功能的操作。
由于本人在系统开发经验上的不足,基于微信平台的报刊订阅小程序也存在一些缺陷,具体如下:
(1)对于数据的存储上面,设计的数据表存在不合理之处,对于同一数据在多张表中都有记录,造成了存储空间的浪费以及系统响应时间的延迟。
(2)对于系统编码上面,有很多代码并没有进行注释,这个对于开发人员来讲,在进行系统的后续升级与维护上会消耗很多时间,提升了对系统升级与维护的难度,还有就是,很多代码使用的函数都是相同的函数,这个函数在各个代码文件中都重新进行了编写,没有单独独立出来进行调用,让该系统变得臃肿,同时也消耗了很多存储空间。
所以在今后,也需要本人花费很多时间来对基于微信平台的报刊订阅小程序进行完善,对于上面提到的数据库中的数据冗余问题,打算学习数据库连接池方面的技术来改善数据冗余的现象,对于编码文件占用存储空间过多的问题,打算使用函数的调用功能,把相同函数写在一个编码文件上让其他需要使用该函数的编码文件进行函数调用,以此节省存储空间,让系统变得更加轻盈。
参考文献
[1]张凯.报刊分发管理系统设计[J].有线电视技术,2019,(07):99-100.
[2]陈崇辉.基于微信订阅号的期刊阅览统计系统设计[J].现代电子技术,2017,40(02):125-128+132.
[3]刘建臣.处理MySQL访问异常故障[J].网络安全和信息化,2019(12):160-161.
[4]杨雨成,任利峰.MySQL数据库性能优化技术研究[J].科技经济导刊,2020,28(03):32.
[5]段震.浅谈MySQL数据库有关数据备份的几种方法[J].山西电子技术,2020(02):17-18.
[6]秦川.MySQL数据库的数据隐私及安全机制研究[J].电子测试,2020(10):86-87.
[7]官亚芬.计算机软件开发中JAVA编程语言及其实际应用[J].中国新通信,2020,22(04):98-99.
[8]刘翠霞.Java数据库连接池的原理与应用[J].无线互联科技,2020,17(04):167-168.
[9]王洋.JAVA编程技术在计算机软件开发中的优势与应用[J].信息记录材料,2020,21(03):106.
[10]唐权.SSM框架在JavaEE教学中的应用与实践[J].福建电脑,2017,33(12):93-94+61.
[11]王崟.基于SSM框架的Java Web开发课程教学中的几点思考[J].电脑知识与技术,2018,14(27):140-141.
[12]蔡泽铭,王文华.基于Vue.js的信息管理系统前端架构[J].电子技术与软件工程,2020(18):142-144.
[13]仲崇文.关于计算机软件开发中常见问题的研究[J].通讯世界,2020,27(07):89-90.
[14]卫红春.信息系统分析与设计[M].北京:清华大学出版社,2015.
[15]Oscar Rodriguez-Prieto,Francisco Ortin,Donna O’Shea.Efficient runtime aspect weaving for Java applications[J].Information and Software Technology,2018,100.
[16]Raffi Khatchadourian.Automated refactoring of legacy Java software to enumerated types[J].Automated Software Engineering,2017,24(4).
致 谢
大学期间所学到的知识,在最后的项目制作时刻都得到了充分运用,也许,这就是学院检验各个学生对于所学知识的掌握情况的一种方式吧,当然,对于本次毕业项目的制作,除了运用书本上的理论知识外,还需要进行额外扩充,这就要求各个学生养成自学的习惯,另外,项目制作期间难免会遇到困难,这也是一个学习的机会,通过对困难的分析,然后向身边的同学,老师,导师等寻求帮助,或者通过上网查找解决办法来解决遇到的困难,这样也能提高学生对于问题分析与解决的能力,所以说设计制作毕业项目,一定要认真对待,这也是提升自己综合实力的一种方式。
对于本人设计的系统能够顺利提交,不仅仅是自己的努力,也是源于导师的耐心指导。所以,对于我的项目指导老师,我是十分感谢他的,在我因为功能需求而苦恼时,是导师给予我安慰,并鼓励我不要灰心,才让我平复心情,继续进行项目制作的工作。在我因为编码实现系统功能期间遇到的技术问题而不知所措时,也是导师为我能够解决编码的技术问题指明了方向。所以,我的指导老师对我如期完成的本项目付出了很多心血,我非常感激他。
还有一些人也值得我去感谢,其中就包括教授过我知识的所有老师,也许就是他们教授我们专业知识,让我们对本专业的知识进行一点点积累,才能在今天的毕设项目中进行运用,所以他们也是功不可没。
另外,我还需要感谢舍友,以及班上的同学,还有我的亲人,感谢舍友一路以来从选题,功能设计,功能实现等阶段性任务中提供的各种帮助,感谢班上的同学的一路陪伴,感谢亲人的理解与支持!
最后,我要感谢母校提供的各种学习场所,让我这四年能够安心学习知识,在这里,希望母校越来越好!
核心代码
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 java.io.IOException;
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.BaokandingyueEntity;
import com.entity.view.BaokandingyueView;
import com.service.BaokandingyueService;
import com.service.TokenService;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.MD5Util;
import com.utils.MPUtil;
import com.utils.CommonUtil;
/**
* 报刊订阅
* 后端接口
* @author
* @email
* @date
*/
@RestController
@RequestMapping("/baokandingyue")
public class BaokandingyueController {
@Autowired
private BaokandingyueService baokandingyueService;
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params,BaokandingyueEntity baokandingyue,
HttpServletRequest request){
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("yonghu")) {
baokandingyue.setYonghuzhanghao((String)request.getSession().getAttribute("username"));
}
EntityWrapper<BaokandingyueEntity> ew = new EntityWrapper<BaokandingyueEntity>();
PageUtils page = baokandingyueService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, baokandingyue), params), params));
return R.ok().put("data", page);
}
/**
* 前端列表
*/
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params,BaokandingyueEntity baokandingyue,
HttpServletRequest request){
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("yonghu")) {
baokandingyue.setYonghuzhanghao((String)request.getSession().getAttribute("username"));
}
EntityWrapper<BaokandingyueEntity> ew = new EntityWrapper<BaokandingyueEntity>();
PageUtils page = baokandingyueService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, baokandingyue), params), params));
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/lists")
public R list( BaokandingyueEntity baokandingyue){
EntityWrapper<BaokandingyueEntity> ew = new EntityWrapper<BaokandingyueEntity>();
ew.allEq(MPUtil.allEQMapPre( baokandingyue, "baokandingyue"));
return R.ok().put("data", baokandingyueService.selectListView(ew));
}
/**
* 查询
*/
@RequestMapping("/query")
public R query(BaokandingyueEntity baokandingyue){
EntityWrapper< BaokandingyueEntity> ew = new EntityWrapper< BaokandingyueEntity>();
ew.allEq(MPUtil.allEQMapPre( baokandingyue, "baokandingyue"));
BaokandingyueView baokandingyueView = baokandingyueService.selectView(ew);
return R.ok("查询报刊订阅成功").put("data", baokandingyueView);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
BaokandingyueEntity baokandingyue = baokandingyueService.selectById(id);
return R.ok().put("data", baokandingyue);
}
/**
* 前端详情
*/
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id){
BaokandingyueEntity baokandingyue = baokandingyueService.selectById(id);
return R.ok().put("data", baokandingyue);
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody BaokandingyueEntity baokandingyue, HttpServletRequest request){
baokandingyue.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(baokandingyue);
baokandingyueService.insert(baokandingyue);
return R.ok();
}
/**
* 前端保存
*/
@RequestMapping("/add")
public R add(@RequestBody BaokandingyueEntity baokandingyue, HttpServletRequest request){
baokandingyue.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(baokandingyue);
baokandingyue.setUserid((Long)request.getSession().getAttribute("userId"));
baokandingyueService.insert(baokandingyue);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
@Transactional
public R update(@RequestBody BaokandingyueEntity baokandingyue, HttpServletRequest request){
//ValidatorUtils.validateEntity(baokandingyue);
baokandingyueService.updateById(baokandingyue);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
baokandingyueService.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<BaokandingyueEntity> wrapper = new EntityWrapper<BaokandingyueEntity>();
if(map.get("remindstart")!=null) {
wrapper.ge(columnName, map.get("remindstart"));
}
if(map.get("remindend")!=null) {
wrapper.le(columnName, map.get("remindend"));
}
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("yonghu")) {
wrapper.eq("yonghuzhanghao", (String)request.getSession().getAttribute("username"));
}
int count = baokandingyueService.selectCount(wrapper);
return R.ok().put("count", count);
}
}