🙊作者简介:多年编程开发经验,专注java技术领域和毕业设计项目实战,系统定制、远程部署调试、代码讲解、代码修改
🍅擅长语言:springboot、ssm、vue、html、jsp、php、python、爬虫、小程序、安卓app
⬇️源码获取:文末可以获取源码+数据库+文档
⚡感兴趣的可以先收藏+关注,后续会更新更多项目资料,所有项目均配有开发文档和安装配置教程
摘 要
互联网的战略实施后,很多行业的信息化水平都有了很大的提升。但是目前很多社区门诊日常工作仍是通过人工管理的方式进行,需要在各个岗位投入大量的人力进行很多重复性工作,这样就浪费了许多的人力物力,工作效率较低,同时为后续的工作带来了隐患。并且现有的微信小程序的社区门诊管理系统流程不完善导致小程序的使用率较低。社区门诊管理系统的部署与应用,将对日常的门诊信息、预约挂号、检查信息、检查报告、病例信息等功能进行管理,这可以简化工作程序、降低劳动成本、提高工作效率。为了有效推动医院的合理配置和使用,迫切需要研发一套更加全面的社区门诊管理系统。
本论文主要介绍基于Php语言设计并实现了微信小程序的社区门诊管理系统。该小程序基于B/S即所谓浏览器/服务器模式,选择MySQL作为后台数据库去开发并实现一个以微信小程序的社区门诊为核心的系统以及对系统的简易介绍。
关键词:社区门诊管理系统;Php语言;MySQL数据库;微信开发者
第1章 绪论
信息管理技术发展现状,近些年来,计算机操作技术不断发展, 现如今的信息管理技术早已淘汰掉了最初的人工模式,而转向了电子信息模式,计算机在信息管理方面的作用越来越大。通过使用计算机进行信息控制,不仅可以提高工作效率,同时也在很大程度上的提高了信息管理安全性。尤其是面对一些比较复杂的信息管理要求时,计算机能够充分发挥它的优越性。众所周知,使用计算机进行信息管理与信息管理系统的开发密切相关,所以小程序的开发也成了人们热衷的领域,是我们进行小程序管理的前提。为了解决目前存在的部分问题,特使用信息管理技术进行研讨,希望可以解决一些基本的现状问题。
随着信息化的发展,互联网小程序需要提供更多的服务,构造更完善的体系以满足越来越多的用户的精神与物质需求。伴随着Internet技术的日益成熟,一种建立在网络基础上的信息管理模式形成了,这便是今天为大家所熟悉的线上管理系统。本社区门诊管理系统的目的是建立一个高效的平台,采用简洁高效的Php语言与Mysql数据库等技术,设计和开发了本社区门诊管理系统。该小程序主要实现了用户通过系统注册用户,用户登录系统后能够编辑自己的个人信息、进行查看门诊信息等,以及管理员可以进行门诊信息、预约挂号、检查信息、检查报告等功能的管理。计算机技术在现代管理中的应用,使计算机成为用户应用现代技术的重要工具,能够有效的解决获取信息便捷化、全面化的问题,提高效率。
1.1 研究的主要内容
研究的基本内容:本设计主要是实现一个微信小程序的社区门诊管理系统,实现社区门诊管理系统的自动化、信息化、管理。小程序的主要的设计原则是:以实际应用为核心,重点突出“实用、易用、简洁、稳定”的优点。既能够注重到实效,满足现实用户的实际需要,也能够为系统以后的升级和扩展留有一定的余地。在技术设计的实现上,突出“实现合理、结构清晰、简单易懂”的特点。
本小程序的主要目的在于加速社区门诊管理系统的信息化进程,充分利用计算机技术和现代通讯的手段面向医院的服务。建立一个方便管理的社区门诊管理系统的平台,方便信息资源的共享,提高管理的效率,为管理员及用户、医生提供辅助的社区门诊管理系统服务。本小程序将最大程度地提高医院整体的工作效率和工作质量,降低管理和工作的成本,改善工作的环境和条件,提高医院的管理和决策的自动化和科学化水平。帮助医院节省费用,减少中间环节,优化业务流程,提高整体效率,促进管理的进步。
1.2 研究现状
在国外很多发达国家,软件产业早已得到全面普及,但我国经济已不断发展,不断引进国外信息化建设,使国内软件行业得以不断发展,在摸索中进步,最终也得到一些成果,我国的软件业迎来了高速的发展,使更多的软件系统得以开发出来,从此逐渐地改变人们的生活工作方式。但是,对于信息化的建设,与很多发达国家相比,由于信息化程度的落后以及经费的不足,我国的社区门诊管理系统开发方面还是相对落后的,因此,要不断的努力探索,争取开发出一个实用的信息化的社区门诊管理系统,来实现社区门诊管理系统的信息化。因此本课题以社区门诊管理系统为例,目的是开发一个实用的微信小程序的社区门诊管理系统。
社区门诊管理系统的开发运用Php语言,以及MYSQL等技术的支持下共同完成了该小程序的开发,实现了微信小程序的社区门诊管理系统的信息化,使用户体验到更优秀的社区门诊管理系统,管理员管理操作将更加方便,实现目标。
第2章 开发工具和技术
2.1微信开发者工具
微信开发者工具现在已经被小程序开发团队开发运行,目前微信开发者工具任然在不断的完善中,在开发小程序时经常要不断的更新。可以使用微信扫码登陆开发者工具,开发者工具将使用这个微信帐号的信息进行小程序的开发和调试。
机型选择:小程序以智能手机的屏幕尺寸为设计标准,进行切图。
预览界面:写好视图布局后点击编译,用来刷新视图界面。
控制台:方便调试打印输出信息。
上传代码:上传到腾讯服务器,提交审核必经步骤。上传代码时可以填写版本号和备注信息。
资源文件:一般可以在资源文件进行对应项目的文件目录的断点调试。
显示远程调试:手机端和PC端开发工具联调对用户而言是非常实用的。
本地数据存储:显示的是本地存储的数据。
视图调试:标组件以子父层级结构呈现,方便调试。
微信限制在2M 以内的代码体积;开发中一般不校验合法域名信息;小程序后台要做配置服务器域名。
以上就是在开发过程中微信开发者工具常用到的功能,微信开发者工具也在不断的完善。
2.2 MySQL 介绍
在软件项目,通过经营性数据的数据库,可以保证其安全,独立和数据一致,访问数据的系统来提供,所以有效减少时间程序员开发应用程序。
MySQL可以支持多线程,可以方便使用系统的资源,提高运行的速度。并提供odbc、jdbc和tcp/ ip,以各种形式连接到MySQL; 功能方面表现欠缺,规模小,但对于这个系统就足够了。
因为MySQL是源代码对外开放的,所以任何人都可以通过相应的方法下载,并根据个性化需求进行修改。 由于MySQL的速度,可靠性和适应性,MySQL受到重视。
MySQL虽然功能可能不是很强大,但由于其开源,广泛传播,导致很多人都意识到这个数据库。
2.3 MySQL环境配置
本系统的数据使用的是MySQL,所以要将MySQL安装到指定目录,如果下载的是非安装的MySQL压缩包,直接解压到指定目录就可以了。然后点击C:\Program Files\MySQL\bin\winMySQLadmin.exe这个文件其中C:\Program Files\MySQL是MySQL安装目录。输入winMySQLadmin的初始用户、密码(注:这不是MySQL里的用户、密码)随便填不必在意,确定之后右下角任务的启动栏会出现一个红绿灯的图标,红灯亮代表服务停止,绿灯亮代表服务正常,左击这个图标->winnt->install the service 安装此服务,再左击这个图标->winnt->start the service 启动MySQL服务。
修改MySQL数据库的root密码。用cmd进入命令行模式输入如下命令:
cd C:\Program Files\MySQL\bin
MySQLadmin -u root -p password 123
回车出现Enter password: ,这是要输入原密码. 刚安装时密码为空,所以直接回车,此时MySQL 中账号 root 的密码被改为 123 安装完毕。
2.4 PHP语言简介
PHP,原名Hypertext Preprocessor。它是属于内嵌式语言,在服务器上执行嵌入HTML的脚本语言,有点像C语言的风格,运用的比较广泛。Hypertext Preprocessor混合了 Perl 、C、PHP和自己创新的语法。综合成比前者执行动态网页更快。与其他的语言相比较,嵌入到HTML执行,效率要比完全生成HTML的CGI要高;PHP又能执行编译后代码,能做到加密、优化代码运行,让代码运行的速度更快。PHP的功能非常强大, CGI有的功能PHP都可以实现,几乎所有流行的数据库和操作系统它都可以支持。C、C++进行程序PHP也是可以用的扩展!
PHP包括:专业专注、源代码开放、免费使用、跨平台性强、快捷、面向对象、效率高、图像处理等特点;
2.5微信小程序框架
微信小程序的开发框架是微信所独有的一套框架,分为View视图层和App Service逻辑层两部分。框架提供了一种类似于Web中html语言的wxml语言,作为视图层的标签语言,用于构造页面的布局。另外提供了一种类似Web中css语言的WXSS语言,作为视图层的标签样式语言,用于表述页面的显示。而在逻辑层的框架,则同样使用了JS语言。微信小程序为了使开发者专注在代码的逻辑层面和数据处理上,还专门提供了两种解决方案,一种是事件,一种是数据的传输。这两种方案都位于小程序框架的视图层和逻辑层之间。用户在视图层进行交互之后,传递到逻辑层对数据进行处理,并返回数据到视图层向用户反馈。对于微信小程序视图层的开发设计,小程序官方提供了一系列的组件,这些基本组件可以极大的帮助开发者完成视图层的开发。同时,对于逻辑层的开发,小程序官方提供了一系列API来方便开发者请求一些额外功能。
第3章 系统分析
本系统采取了一系列的设计原则,主要目的是为了系统的功能设计,还有管理人员在后期对系统维护时的方便,以及使用户能够简易的操作。最重要的设计原则包括:简单性、针对性、实用性、一致性、先进性。
(1)简单性:在该系统中功能模块实现的同时,让用户操作起来简单明了,很快找到所需资源是最直接的目的。
(2)针对性:该系统是根据设计需求为导向来开发微信小程序的社区门诊管理系统的设计,所以针对性较强。
(3)实用性:该设计能够满足社区门诊管理系统的实际的功能需求,能够在实际中让用户真正使用到,具有实际的应用价值。
(4)一致性:网站整体的页面布局,在不同的界面之间,img里的图片的放置位置以及大小都应该有严格的一致性。变量命名规则应该具有统一性。
(5)先进性:本系统采用Php语言作为开发技术、 MySQL作为系统数据库,它们被软件设计者们广泛使用。
3.1 可行性分析
可行性分析是每开发一个项目必不可少的一部分,可行性分析可以直接影响一个系统的存活问题,针对开发意义进行分析,还有就是是否可以通过所开发的系统来弥补传统纸质手工统计模式的不足,是否能够更好的解决其中问题等,通过对该社区门诊管理系统的开发设计,不仅能够逐步减少工作人员的工作量,而且还可以进行高效工作和管理。所以该系统的开发实现了最大的意义和价值,在系统完成后,利益是否大过于成本,是否能够达到预期效果,这些方面都要进行可行性分析,再通过分析之后,就可以决定是否开发此系统。该社区门诊管理系统的开发设计中,以下几点进行了可行性分析:技术可行性:通过Php语言的采用,由于该技术不断成熟,所以使用该技术设计社区门诊管理系统是具有可行性的。经济可行性:在开发过程中,系统完成后的利益是否大过于开发成本。操作可行性:社区门诊管理系统的开发设计中,方便用户的可操作性和实用性。
3.1.1 经济可行性
由于本系统是作为毕业设计系统,且系统本身存在一些技术层面的缺陷,并不能直接用于商业用途,只想要通过该系统的开发提高自身学术水平,不需要特定服务器等额外花费。所有创造及工作过程仅需在个人电脑上就能实现,使用到的软件大多为开源软件,所以经济成本并不高,可以轻易实现。
3.1.2 技术可行性
本系统的开发使用Php作为系统开发的开发技术,开发环境选择Vscode,而B/S结构决定了本系统的兼容性和多用户可操作性,此外选择MySql作为数据库不仅提高了数据安全性更保障了数据的可操作性。
3.1.3 运行可行性
本系统作为以Php作为开发技术的系统,而且选用B/S结构则决定了要操作本系统仅需要占用很小的资源,并没有过多地硬件配置要求,目前市面上只要能正常运行浏览器的个人电脑都可以正常运行使用该系统。
综上所述,本系统的设计与开发在经济上、技术上、运行上的条件都是满足的,因此,系统开发具备可行性条件。
3.1.4 分析研究可行性
针对社区门诊管理系统的需求、设计、实现进行研究,本文首先将对社区门诊管理系统的需求进行调查研究,在对系统进行认真分析之后,得出开发整个系统的各项需求。在此基础上,本文将会进一步根据系统各个需求来完成相应模块的设计,力求详尽地对各项功能的设计理念进行一一说明,并通过建模语言,文字说明等手段详细地论述系统的功能模块设计和框架结构设计。在对模块的实现过程中,本文将对各项重要模块进行成果截图展示,进而对核心功能进行代码分析,在通过最后的科学合理的系统测试之后,完成整个系统的开发工作。具体包括以下内容:
- 调查分析本系统的背景,经过实际现场的考察,认清目前企业在这方面管理所采取的应对措施,针对社区门诊管理系统的详细流程中一些不合理现象,思考其中所暴露出的问题以及提出此项过错的具体原因。
- 对比于这些问题,思考需要将那些功能纳入整个系统规划中,并考虑如果如此设计将会引发可能的影响。尽量在需求设计时消除不良隐患,使系统能够在后续过程中良性循环,降低成本消耗。
- 在详细的功能各个方面处理时,应统筹整个项目的安排,让众多的模块间平滑顺利运行,减少相互之间的不必要耦合,实现精细设计。
- 进入测试时,按照先整体后细节原则,联系各个模块之间的功能,尽量合理科学,并通过换位思想,使系统更具使用性。
3.2 功能需求分析
系统功能需求分析是通过软件开发者在参与市场调研,讨论研究后得出的初步系统开发所需实现功能。这是开发的第一步,也是至关重要的一步,如果不在这个阶段制定系统所需模块,日后会带来不必要的麻烦。因此,必须严肃认真,全身心投入去做好这个步骤。
本系统采用自上往下的方法开发,基本定位如下功能:
本课题要求实现一套微信小程序的社区门诊管理系统,系统主要包括管理员模块和用户模块、医生模块功能模块。
(1)管理员用例图如下所示:
图3-1管理员用例图
(2)用户用例图如下所示:
图3-2用户用例图
(3)医生用例图如下所示:
图3-3医生用例图
第4章 系统设计
4.1系统结构设计
系统设计是把本系统的各项功能需求进行细化,而转换为软件系统表示的一个设计过程,在对目标系统的研究分析之后,做出整个系统平台的总体规划,进而对用例中各个对象进一步地合理精细设计。为降低整个系统的复杂度,而使其更加便于修改,提高代码的可读性,我们会将系统模块化,模块间保持相对独立,且每个模块只完成一个子功能,并且与其他模块通过简单的接口链接,即高内聚低耦合原则,而使整个系统能够拥有一个高性能的结构,这边是系统概要设计最重要的目的。在之前的需求分析的基础上,本社区门诊管理系统结构,如下图4-1所示。
图4-1 社区门诊管理系统结构功能图
4.2数据库设计
4.2.1实体ER图
在查询时,应保证所有满足条件的记录都能查到。数据库记录通常在几百条以上,如有遗漏将会对医院造成影响。一般操作的响应时间应该在1-2秒内。采用菜单界面,对用户比较友好,本文中将通过E-R图来设计并展示数据的概念模型,
用户信息实体属性图如图4-2所示。
图4-2用户信息实体E-R图
医生信息实体E-R图如图4-3所示。
图4-3医生信息实体E-R图
门诊信息实体E-R图如图4-4所示。
图4-4门诊信息实体E-R图
检查报告信息实体E-R图如图4-5所示。
图4-5检查报告信息实体E-R图
4.3.2 数据库表设计
本系统数据库由多张表构成。主要包含字段名称、类型、长度、字段说明、主键、默认值等。
表4-1 allusers表
列名 | 数据类型 | 长度 | 约束 |
id | int | 11 | NOT NULL |
username | varchar | 50 | default NULL |
pwd | varchar | 50 | default NULL |
cx | varchar | 50 | default NULL |
表4-2 binglixinxi表
列名 | 数据类型 | 长度 | 约束 |
id | int | 11 | NOT NULL |
addtime | varchar | 50 | default NULL |
zhanghao | varchar | 50 | default NULL |
xingming | varchar | 50 | default NULL |
zhusubingzheng | varchar | 50 | default NULL |
zhenduanjieguo | varchar | 50 | default NULL |
zhiliaofangan | varchar | 50 | default NULL |
yishengbianhao | varchar | 50 | default NULL |
yishengxingming | varchar | 50 | default NULL |
表4-3:chufangxinxi表
列名 | 数据类型 | 长度 | 约束 |
id | int | 11 | NOT NULL |
addtime | varchar | 50 | default NULL |
yaopinmingcheng | varchar | 50 | default NULL |
yaopinguige | varchar | 50 | default NULL |
fuyaocishu | varchar | 50 | default NULL |
fuyaojiliang | varchar | 50 | default NULL |
zhuyishixiang | varchar | 50 | default NULL |
yaopintupian | varchar | 50 | default NULL |
zhanghao | varchar | 50 | default NULL |
xingming | varchar | 50 | default NULL |
yishengbianhao | varchar | 50 | default NULL |
yishengxingming | varchar | 50 | default NULL |
表4-4:feiyongxinxi表
列名 | 数据类型 | 长度 | 约束 |
id | int | 11 | NOT NULL |
addtime | varchar | 50 | default NULL |
feiyongbianhao | varchar | 50 | default NULL |
feiyongleixing | varchar | 50 | default NULL |
feiyongjine | varchar | 50 | default NULL |
feiyongmiaoshu | varchar | 50 | default NULL |
feiyongtupian | varchar | 50 | default NULL |
zhanghao | varchar | 50 | default NULL |
xingming | varchar | 50 | default NULL |
sfsh | varchar | 50 | default NULL |
shhf | varchar | 50 | default NULL |
ispay | varchar | 50 | default NULL |
表4-5:jianchabaogao表
列名 | 数据类型 | 长度 | 约束 |
id | int | 11 | NOT NULL |
addtime | varchar | 50 | default NULL |
jianchaxiangmu | varchar | 50 | default NULL |
jianchadidian | varchar | 50 | default NULL |
jianchajieguo | varchar | 50 | default NULL |
jianchatupian | varchar | 50 | default NULL |
zhanghao | varchar | 50 | default NULL |
xingming | varchar | 50 | default NULL |
yishengbianhao | varchar | 50 | default NULL |
yishengxingming | varchar | 50 | default NULL |
表4-6:menzhenxinxi表
列名 | 数据类型 | 长度 | 约束 |
id | int | 11 | NOT NULL |
addtime | varchar | 50 | default NULL |
keshimingcheng | varchar | 50 | default NULL |
keshileixing | varchar | 50 | default NULL |
yishengbianhao | varchar | 50 | default NULL |
yishengxingming | varchar | 50 | default NULL |
zhicheng | varchar | 50 | default NULL |
zuozhenshijian | varchar | 50 | default NULL |
keshijieshao | varchar | 50 | default NULL |
keshitupian | varchar | 50 | default NULL |
第5章 系统详细设计
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-7所示。
图5-7用户信息界面图
5.2 管理员功能模块(服务端)
管理员登录,通过登录页面输入用户名、密码、选择角色等信息进行登录操作,如图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-17所示。
图5-17处方信息管理界面图
5.3 医生功能模块(服务端)
医生登录,通过登录页面输入账号、密码、选择角色等信息进行登录操作,如图5-18所示。
图5-18医生登录界面图
医生登录进入社区门诊管理系统可以查看首页、个人中心、预约挂号管理、检查信息管理、检查报告管理、病例信息管理、处方信息管理等信息进行相应操作,如图5-19所示。
图5-19医生功能界面图
预约挂号管理:在预约挂号管理页面中可以查看科室名称、科室类型、科室图片、医生编号、医生姓名、职称、预约时间、预约说明、账号、姓名、审核回复、审核状态等内容,并进详情、检查信息、删除等操作,如图5-20所示。
图5-20预约挂号管理界面图
检查信息管理;在检查信息管理面中可以查看检查项目、检查地点、检查时间、检查费用、账号、姓名、医生编号、医生姓名、是否支付、审核回复、审核状态等内容提交,还可以进行详情、检查报告、修改、删除等操作;如图5-21所示。
图5-21检查信息管理界面图
检查报告管理,在检查报告管理页面查看检查项目、检查地点、检查图片、账号、姓名、医生编号、医生姓名等信息,进行更详情、修改、删除等操作,如图5-22所示。
图5-22检查报告管理界面图
6系统测试
6.1 测试目的
小程序测试是软件开发过程中最后一步,但也是不可或缺的重要的一步,没有人可以保证一次性编写完成的系统不会出错,而小程序测试就是将自己开发的系统成为成品前的最后一步。在测试过程中需要进行严谨细致的测试,要尽可能全面地在不同情况下运行该系统,排除一切出现错误的可能。
系统测试不仅仅是发现系统潜在的BUG或错误,而更为重要的是为用户提供一个良好的体验和安全可使用的产品服务。而通过发现错误或潜在的问题,将有助于提升产品的竞争力,这也是软件测试的其中的重要目的之一。
软件测试的方法有好几种,但目前主要采用的是包括以功能为主要测试方向的黑盒测试以及以逻辑为主要测试方向的白盒测试,这是两种不同的测试方法,针对的测试侧重点不同,本课题根据实际需求情况,选择以功能为主要的黑盒测试方法,同时测试是要遵循一定的规则来执行的,一个测试要执行其执行的依据一般是由测试用例来规定的,而测试用例一般是依据需求或说明书来综合制定的,测试在硬件出厂前是十分重要的一个过程,本课题由于时间和精力的关系,选择以实现的功能作为测试要点来进行测试。具体测试过程如下:
测试用例1及测试过程:
登录:录入登录信息,账号,密码,权限,然后单击登录进行操作,会出现两种情况:一种情况是登录成功,进入用户相应的功能界面进行下一步操作;另一种情况是提示登录失败,系统会弹出一个对话框要求重新登录操作;
测试用例2及测试过程:
管理员登录:录入登录信息,管理员账号,密码,权限,然后单击登录进行操作,会出现两种情况:登录成功进入管理员具有权限的功能界面和提示登录失败。一种情况是登录成功,进入管理员界面进行下一步操作;另一种情况是提示登录失败,系统会弹出一个对话框要求重新登录操作;
6.2测试结论
在测试中,发现了小程序各种不足。可能是由于开发经验欠缺,在开发前期没有对系统完全理解,导致考虑不够周全。并且在写代码的时候考虑和之前研究时考虑有所不同,因而后期不断做重复性劳动直至系统完善。现在测试完成,全部的功能已经完成,没有出现所有功能都能得以实现,没有任何变形。所以,这次功能的测试取得圆满的成绩。
结 论
历经六个月左右的时间,本次的毕业设计已画上了句号。原本以为完成一个小程序会很顺利,因为在之前课上,也曾动手操作过相关的模块编写,但当真正接触到一个完整的小程序时,发现并没有想象地那么简单。首先,以前实践过的只是单独的模块,而这次,是一个庞大的系统,许多细节不容忽视,有时候稍不留意的一个小错误,会致使整个系统都运行不起来,而查找错误的过程又漫长且艰辛,这也正是经验不足所导致的。在整个小程序开发过程中,也查阅了很多书籍和相关资料,这让我不但巩固了原本的知识,同时还学习到了一些新的知识,这让我受益匪浅。
由于经验和能力不足,导致在开发、设计该小程序的时候,出现了比较多的问题,例如需要用到的技术不熟悉、程序报错等,后来我积极地向同学询问自己出现的问题同时也会找一些相关的书进行学习,慢慢的一点点将自己遇到的问题逐渐解决。所以不管以后在任何时候合作都会让自己事半功倍。通过本小程序的完整的开发,可以遇到自己平时写一些简单的网站遇不到的问题,不仅仅局限与技术与业务方面的,同时也使得自己更加深入的了解软件过程的开发设计思想,对于即将踏入社会工作而言,这些心得都十分重要。在以后的研究生学习生涯也必须加深这方面的理解,将最好的开发技术和最新的科学原理运用到自己以后的开发工作和学习研究中去。
此次小程序从整体看来,已基本达到预期的设计目的,能够实现基本的功能,但相较于市场的一些优秀网站而言,还是有许多不足的地方。遗憾的是,由于时间的有限,已经不允许再投入更多的时间和精力进行研究开发。相信在以后的工作中,我会接触到更多相关的知识,会更丰富自身的经验,我希望到时能够在此基础上完成一个丰富完整的学习网站,这将对我有很大的意义。
通过这次的毕业设计,我学到了很多,除了学识方面的知识,在态度上也有了很大的转变,细心和耐心是整个开发过程中最重要的两件事。我也在跟随着小程序的完善而成长,这次毕业设计考核地也不单单是所学的知识,也同样在衡量着面对困难时的态度。
致 谢
本此毕业设计是在指导老师xxx老师的指导和支持下完成的。x老师具有丰富的知识和敏锐的思维给了我深深的启发。在设计开始的时候,x老师为我搜集很多的设计相关资料,让我快速掌握了系统设计的基本步骤,使我的设计工作进展顺利,在此我向x老师表示真诚的谢意!
同时,我还要感谢我的老师和我的同学对我的关心和支持。另外,我还要感谢互联网的朋友,他们将自己的知识拿出来分享,让我可以实现功能模块的一部分,谢谢你们。
经过这次毕业设计,我体会不少,需要用到所学知识的时候就发现自己不知所措,其实自己与那些通过实际作业的人差距很大,但这次毕业设计为我日后指明了努力方向。
再一次,我向多方面支持和帮助过我的人表示由衷的感谢!
最后,感谢评审老师,谢谢你抽出时间来审查。
参 考 文 献
- 赵学良.thinkphp5核心编程(第二版)[M].北京:清华大学出版社,2014:23-114.
- 郭永俏,关治洪.基于thinkphp5技术的应用[J].情报杂志:2018:No.44:1-41.
- 刘中兵.PHP高手真经(应用框架卷):PHP Web核心框架[M].北京:电子工业出版社,2019:79-116.
- MENG Yong-dong,TIAN Bin,Research of Structuring VR Dynamic Scenes Based on PHP and MySQL[J] Acta Simulata Systematica Sinica.25 September 2015:124-458.
- 郑莉.PHP语言程序设计(第2版)[M].北京:清华大学出版社,2018.6.
- Joshua Bloch.Effective PHP: Programming Language Guide [M].Addison-Wesley Professional,05 June,2017.
- 袁涛、孔蕾蕾.统一建模语言UML(第二版)[M].北京:清华大学出版社,2014.
- 张海藩.软件工程导论(第5版)[M].北京:清华大学出版社,2018:277-278.
- 李海生,郭锐.软件测试技术案例教程[M].北京:清华大学出版社.2018。
核心代码
<?php
session_start();
class MenzhenxinxiController extends CommonController {
public function __construct()
{
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE");
header('Access-Control-Allow-Headers:Origin,Content-Type,Accept,token,X-Requested-With,device');
}
public $columData = [
'id','addtime'
,'keshimingcheng'
,'keshileixing'
,'yishengbianhao'
,'yishengxingming'
,'zhicheng'
,'zuozhenshijian'
,'keshijieshao'
,'keshitupian'
,'clicktime'
,'clicknum'
];
/**
* 分页,列表
* get
*/
public function page(){
$token = $this->token();
$tokens = json_decode(base64_decode($token),true);
if (!isset($tokens['id']) || empty($tokens['id'])) exit(json_encode(['code'=>403,'msg'=>"你还没有登录。"]));
$userid = $tokens['id'];
$where = " where 1 ";//查询条件
if($tokens['isAdmin'] != 1 && $tokens['tablename'] == 'yisheng') {
$where .= " and `yishengbianhao` = '".$tokens['username']."' ";
}
$page = isset($_REQUEST['page'])?$_REQUEST['page']:"1";
$limt = isset($_REQUEST['limit'])?$_REQUEST['limit']:"10";
$sort = isset($_REQUEST['sort'])?$_REQUEST['sort']:"id";
$order = isset($_REQUEST['order'])?$_REQUEST['order']:"asc";
foreach ($_REQUEST as $k => $val){
if(in_array($k, $this->columData)){
if ($val != ''){
$where.= " and ".$k." like '".$val."'";
}
}
}
$base = json_decode(base64_decode($token),true);
if ($base['isAdmin']!=1 || ($base['isAdmin']==1 && $base['tablename'] != "users")){
$md5 = md5($userid."+10086");
$colum = "yishengbianhao";
$columData = $base['columData'];
if (isset($_SESSION[$md5]) && in_array($colum, $columData)){
if($base['tablename'] == 'yisheng'){
$where .= " and `yishengbianhao` = '".$_SESSION[$md5]."'";
}
}
}
$sql = "select * from `menzhenxinxi` ".$where;
$count = table_sql($sql);
if ($count->num_rows < 1){
$numberCount = 0;
}else{
$numberCount = $count->num_rows;
}
$page_count = ceil($numberCount/$limt);//页数
$startCount = ($page-1)*$limt;
$lists = "select * from `menzhenxinxi` ".$where." order by ".$sort." ".$order." limit ".$startCount.",".$limt;
$result = table_sql($lists);
$arrayData = array();
if ($result->num_rows > 0) {
while ($datas = $result->fetch_assoc()){
array_push($arrayData,$datas);
}
}
exit(json_encode([
'code'=>0,
'data' => [
"total" => $numberCount,
"pageSize" => $limt,
"totalPage" => $page_count,
"currPage" => $page,
"list" => $arrayData
]
]));
}
/**
* 分页,列表list
* get
*/
public function lists(){
$page = isset($_REQUEST['page'])?$_REQUEST['page']:"1";
$limt = isset($_REQUEST['limit'])?$_REQUEST['limit']:"10";
$sort = isset($_REQUEST['sort'])?$_REQUEST['sort']:"id";
$order = isset($_REQUEST['order'])?$_REQUEST['order']:"asc";
$refid = isset($_REQUEST['refid']) ? $_REQUEST['refid'] : "0";
$where = " where 1 ";//查询条件
if($tokens['isAdmin'] != 1 && $tokens['tablename'] == 'yisheng') {
$where .= " and `yishengbianhao` = '".$tokens['username']."' ";
}
foreach ($_REQUEST as $k => $val){
if(in_array($k, $this->columData)){
$where.= " and ".$k." like '".$val."'";
}
}
$sql = "select * from `menzhenxinxi`".$where;
$count = table_sql($sql);
if ($count->num_rows < 1){
$numberCount = 0;
}else{
$numberCount = $count->num_rows;
}
$page_count = ceil($numberCount/$limt);//页数
$startCount = ($page-1)*$limt;
$lists = "select * from `menzhenxinxi` ".$where." order by ".$sort." ".$order." limit ".$startCount.",".$limt;
$result = table_sql($lists);
$arrayData = array();
if ($result->num_rows > 0) {
while ($datas = $result->fetch_assoc()){
array_push($arrayData,$datas);
}
}
exit(json_encode([
'code'=>0,
'data' => [
"total" => $numberCount,
"pageSize" => $limt,
"totalPage" => $page_count,
"currPage" => $page,
"list" => $arrayData
]
]));
}
/**
* 新增数据接口
* post
*/
public function save(){
$token = $this->token();
$tokens = json_decode(base64_decode($token),true);
if (!isset($tokens['id']) || empty($tokens['id'])) exit(json_encode(['code'=>403,'msg'=>"你还没有登录。"]));
$uid = $tokens['id'];
$keyArr = $valArr = array();
$tmpData = strval(file_get_contents("php://input"));//Content-Type: application/json 需要用到php://input 处理输入流
if (!empty($tmpData)&& isset($tmpData)){
$postData = json_decode($tmpData,true);
foreach ($postData as $key => $value){
if (in_array($key, $this->columData)){
if(!empty($value) || $value == 0) {
if ($key == 'id') {
continue;
}
array_push($keyArr,"`".$key."`");
if($key == 'clicktime') {
array_push($valArr,"'".date('Y-m-d h:i:s', time())."'");
} else {
array_push($valArr,"'".$value."'");
}
}
}
}
}
$k = implode(',',$keyArr);
$v = implode(',',$valArr);
$sql = "INSERT INTO `menzhenxinxi` (".$k.") VALUES (".$v.")";
$result = table_sql($sql);
exit(json_encode(['code'=>0]));
}
/**
* 新增数据接口 add
* post
*/
public function add(){
$keyArr = $valArr = array();
$tmpData = strval(file_get_contents("php://input"));
if (!empty($tmpData)&& isset($tmpData)){
$postData = json_decode($tmpData,true);
foreach ($postData as $key => $value){
if (in_array($key, $this->columData)){
if(!empty($value) || $value == 0) {
if ($key == 'id') {
continue;
}
array_push($keyArr,"`".$key."`");
if($key == 'clicktime') {
array_push($valArr,"'".date('Y-m-d h:i:s', time())."'");
} else {
array_push($valArr,"'".$value."'");
}
}
}
}
}
$k = implode(',',$keyArr);
$v = implode(',',$valArr);
$sql = "INSERT INTO `menzhenxinxi` (".$k.") VALUES (".$v.")";
$result = table_sql($sql);
exit(json_encode(['code'=>0]));
}
/**
* 更新接口
* post
*/
public function update(){
$tmpData = strval(file_get_contents("php://input"));
$postData = json_decode($tmpData,true);
$v = array();
foreach ($postData as $key => $value){
if (in_array($key, $this->columData)){
if ($key == "id"){
$id = $value;
}
if(!empty($value) || $value === 0) {
array_push($v,$key." = '".$value."'");
}
}
}
$value = implode(',',$v);
$sql = "UPDATE menzhenxinxi SET ".$value." where id = ".$id;
$result = table_sql($sql);
exit(json_encode(['code'=>0]));
}
/**
* 删除
* post
*/
public function delete(){
$ids = strval(file_get_contents("php://input"));//发现接收的是字符串
preg_match_all('/\d+/',$ids,$arr);
$str = implode(',',$arr[0]);//拼接字符,
$sql = "delete from menzhenxinxi WHERE id in({$str})";
$result = table_sql($sql);
exit(json_encode(['code'=>0]));
}
/**
* 查询一条数据
* get
*/
public function info($id=false){
$token = $this->token();
$tokens = json_decode(base64_decode($token),true);
if (!isset($tokens['id']) || empty($tokens['id'])) exit(json_encode(['code'=>403,'msg'=>"你还没有登录。"]));
$userid = $tokens['id'];
$name = isset($_REQUEST['name'])? $_REQUEST['name']:"";
if (!empty($id)){
$where = "`id` = ".$id;
}else{
$where = "`name` = ".$name;
}
$this->andone('menzhenxinxi',$id,$column='clicknum',$num=1);
$clicktime = "update menzhenxinxi set clicktime = ".date('Y-m-d H:i:s',time())." where ".$where;
table_sql($clicktime);
$sql = "select * from `menzhenxinxi` where ".$where;
$result = table_sql($sql);
if ($result->num_rows > 0) {
// 输出数据
while($row = $result->fetch_assoc()) {
$lists = $row;
}
}
exit(json_encode([
'code'=>0,
'data'=> $lists
]));
}
/**
* 查询一条数据
* get
*/
public function detail($id=false){
$name = isset($_REQUEST['name'])? $_REQUEST['name']:"";
if ($id){
$where = "`id` = ".$id;
}else{
$where = "`name` = ".$name;
}
$this->andone('menzhenxinxi',$id,$column='clicknum',$num=1);
$clicktime = "update menzhenxinxi set clicktime = '".date('Y-m-d H:i:s',time())."' where ".$where;
table_sql($clicktime);
$sql = "select * from `menzhenxinxi` where ".$where;
$result = table_sql($sql);
if (!$result) exit(json_encode(['code'=>500,'msg'=>"查询数据发生错误。"]));
if ($result->num_rows > 0) {
// 输出数据
while($row = $result->fetch_assoc()) {
$lists = $row;
}
}
exit(json_encode([
'code'=>0,
'data'=> $lists
]));
}
/**
* 按值统计接口
**/
public function value(){
$url = explode('?',$_SERVER['REQUEST_URI']);
$request = explode('/',$url[0]);
$xColumnName = $request[4];
$yColumnName = $request[5];
$sql = "SELECT ".$xColumnName.",sum(".$yColumnName.") total FROM menzhenxinxi group by ".$xColumnName;
if(urldecode($request[6]) == '日') {
$sql = "SELECT DATE_FORMAT(".$xColumnName.", '%Y-%m-%d') ".$xColumnName.", sum(".$yColumnName.") total FROM menzhenxinxi GROUP BY DATE_FORMAT(".$xColumnName.", '%Y-%m-%d')";
}
if(urldecode($request[6]) == '月') {
$sql = "SELECT DATE_FORMAT(".$xColumnName.", '%Y-%m') ".$xColumnName.", sum(".$yColumnName.") total FROM menzhenxinxi GROUP BY DATE_FORMAT(".$xColumnName.", '%Y-%m')";
}
if(urldecode($request[6]) == '年') {
$sql = "SELECT DATE_FORMAT(".$xColumnName.", '%Y') ".$xColumnName.", sum(".$yColumnName.") total FROM menzhenxinxi GROUP BY DATE_FORMAT(".$xColumnName.", '%Y')";
}
$result = table_sql($sql);
if ($result->num_rows > 0) {
// 输出数据
$total = array();
while($row = $result->fetch_assoc()) {
array_push($total,array('total' => intval($row['total']),$xColumnName => $row[$xColumnName]));
}
}
exit(json_encode(['code'=>0,'data'=>$total]));
}
public function autoSort(){
$limt = isset($_REQUEST['limit'])?$_REQUEST['limit']:"5";
$sort = 'clicknum';
$lists = "select * from `menzhenxinxi` order by ".$sort." desc limit 0,".$limt;
$result = table_sql($lists);
$arrayData = array();
if ($result->num_rows > 0) {
while ($datas = $result->fetch_assoc()){
array_push($arrayData,$datas);
}
}
exit(json_encode([
'code'=>0,
'data' => [
"total" => 0,
"pageSize" => $limt,
"totalPage" => 0,
"currPage" => 0,
"list" => $arrayData
]
]));
}
/**
* 获取需要提醒的记录数接口
* get
*/
public function remind($columnName,$type){
$remindStart = isset($_GET['remindstart'])?$_GET['remindstart']:"";
$remindEnd = isset($_GET['remindend'])?$_GET['remindend']:"";
$token = $this->token();
$tokens = json_decode(base64_decode($token),true);
$where = " where 1 ";//查询条件
if($tokens['isAdmin'] != 1 && $tokens['tablename'] == 'yisheng') {
$where .= " and `yishengbianhao` = '".$tokens['username']."' ";
}
if ($type == 1){//数字
if ($remindStart && $remindEnd){
$where .= " and ".$columnName."<='".$remindEnd."' and ".$columnName.">='".$remindStart."'";
}elseif($remindStart){
$where .= " and ".$columnName.">='".$remindStart."'";
}elseif($remindEnd){
$where .= " and ".$columnName."<='".$remindEnd."'";
}
}else{
if ($remindStart && $remindEnd){
$where .= " and ".$columnName."<='".date("Y-m-d",strtotime("+".$remindEnd." day"))."' and ".$columnName.">='".date("Y-m-d",strtotime("+".$remindStart." day"))."'";
}elseif($remindStart){
$where .= " and ".$columnName.">='".date("Y-m-d",strtotime("+".$remindStart." day"))."'";
}elseif($remindEnd){
$where .= " and ".$columnName."<='".date("Y-m-d",strtotime("+".$remindEnd." day"))."'";
}
}
$sql = "select * from `menzhenxinxi` ".$where;
$result = table_sql($sql);
exit(json_encode(['code'=> 0 ,'count' => $result->num_rows]));
}
}