1、数据库课程设计报告学 院: 信息科学与工程学院 专业班级: 物联网工程 1201 班 指导老师: 盛津芳 学 号: 0909120122 姓 名: 李 浩 日 期: 2015 年 1 月 10 日 目 录课程设计要求 3概要设计:(数据库) 5概要设计:(程序) 7详细设计(数据库) 8详细设计(程序) 11系统展示 12安全性控制 19关键技术 20心得体会 20数据库课程设计任务书1 任务概述某医院拟开发一个挂号系统,以方便患者就医,提高医疗服务水平。患者在医院就诊前需要提供姓名、身份证号码、联系电话等个人信息并办理一张诊疗卡,该诊疗卡在每次挂号时需要出示给挂号的工作人员。患者在挂号时,需
2、说明科室名称以及医生的职称。挂号以半个工作日为一个班次,系统中保存各科室门诊医生的排班表,每位医生每个班次能够接诊的病人人数可设置一个上限。本次课程设计要求设计并实现一个虚拟的医院挂号系统。系统中包含两个子系统,即由医院内部工作人员使用的挂号系统,以及患者使用的网上预约挂号系统。其中网上预约挂号系统的前端要求是浏览器,即采用 B/S 模式开发。医院工作人员使用的挂号系统采用C/S 模式开发,前端开发工具不限,可采用 PowerBuilder, Delphi, VB,VC,Java 等。后台数据库要求采用 SQL SERVER2005 或 Oracle 11g 及以上版本。2 功能描述2.1 医
3、院工作人员使用的挂号系统该系统仅供医院内部工作人员使用,主要分为挂号人员和系统管理人员两类角色,需提供以下功能:1) 办理诊疗卡。患者提供姓名、身份证号码、联系电话等个人信息,挂号人员为其办理一张长期有效的诊疗卡。2) 挂号。挂号人员根据患者要求的科室、医生职称分配一个候诊号,并收取相应的诊疗费用,诊疗费用根据医生的职称分为不同的档次。医生当班次接诊患者人数不能超过预先设定的上限。3) 修改挂号。患者可更改就诊的科室,挂号人员根据更改后的科室和医生职称,重新计算诊疗费用的差值,多退少补。4) 查询挂号情况。挂号人员可查询某位医生目前的挂号情况。5) 挂号费当班结转。系统对每个班次收取的挂号费生
4、成相应的统计表,并提供查询功能,包括该班次总的挂号费用、各个挂号人员该班次总的挂号费用、各位医生该班次总的挂号费用。6) 参数维护。系统管理人员负责维护各种参数,包括科室、医生、医生排班表、号类字典。医生的基本信息、排班表、诊疗费标准、各班次医生接诊人数上限都是可以修改的,尽量提高系统的灵活性和可扩展性。7) 系统维护。系统管理人员负责管理用户、分配权限、管理密码。2.2 网上预约挂号系统该系统供患者使用,需提供以下功能:1) 用户注册。提供注册所需基本信息,必须实名注册。2) 用户可修改注册信息。3) 用户可查询指定时间的某科室的医生排班表。4) 用户可以在网上预约挂号。系统不提供当日预约服
5、务,用户可预约部分科室次日至一个月内的就诊号源。同一患者实名(有效证件号)在同一就诊日、同一科室只能预约一次;在同一就诊日的预约总量不可超过两次;在一个月内的预约总量不可超过三次。2.3 安全性控制要求1) 所有用户密码在数据库中都要求加密存储。2) 网上预约挂号系统要进行输入验证,防止 SQL 注入。3) 系统管理员只能进行系统维护和参数维护,不能进行挂号操作。实验环境:电脑:联想 G460操作系统:Windows8.1 64 位语言:Java 、JavaScript 、JSP、HTML、SQL编程工具:Eclipse IDE for Java EE Developers(Kepler 版)
6、数据库:MySQL 5.6.21数据库工具:MySQLWorkbench 6.2 CE 、navicat其他工具:Sublime Text 2概要设计:(数据库)E-R 图1n1 n 1 nmn医生级别安排科室病人挂号日期班次ID 名字 密码 性别 年龄 电话怒 病情电话ID 名字 性别属于属于属于ID名称电话ID(自增)ID 名称 挂号费ID(自增)日期班次除了上面的 E-R 图,数据库中还有另外三张表,分别是管理员表(Administrator) 、员工表(Worker) 、结算表( Calculate)物理模型用 MySQLWorkbench 所建管理员表、员工表、结算表备注:由于数据库
7、模型是在课设最初建立的,后期根据编程的需求对表结构有了不少修改,虽然后来根据对表的修改已经对 Model 进行了更新,但可能仍有略微不同概要设计:(程序)系统主要功能管理员更改科室更改职称排班表管理用户管理密码详细设计(数据库)表结构Doctor 表(医生表)Patient 表(诊疗卡表)Arrangement 表(排班表)Orderregist 表(挂号表)Calculate 表(结算表)员工办理诊疗卡挂号修改挂号挂号结算DoctorLevel 表(级别表)备注:其他几张表结构太简单,就不一一列举了。视图该系统中暂时只用到了一个视图,用于将 Doctor 表、Arrangement 表、Do
8、ctorlevel 表、Department 表 Join 起来,方便查询。存储过程一共用到了 4 个存储过程分别是procedure_calculate:用来结算procedure_find_registinfo:用来找到挂号信息procedure_regist:用来挂号procedure_update_regist:用于修改挂号下面是 procedure_regist 的部分代码:if regcount 0THENinsert into orderregist VALUES(null,patId,doId,deId,regDate,regTime,cost,worId,isCalculat
9、e);update arrangement set ArrangeAccptCount = ArrangeAccptCount - 1;END IF;这里用来判断剩余的接诊人数是否大于零,如果大于零则能挂号,否则不能。详细设计(程序)如上图所示,整个系统写了很多个类,很多个 jsp 页面,以下介绍一下各个包的功能,然后就几个重要的类简单介绍一下。Action 包:主要是对用户和管理员的 Action 事件进行处理。App 包:许多个 Thread 类,用于务器与客户端进行通讯。Bean 包:许多 bean 类,也是为 JavaBean 技术服务的重要一部分。Commom 包:许多公共类,包括:
10、Conf 类:通讯协议。Constants 类: SQL 语句集合。Dbcp 类:获取数据库连接对象。Log 类:为了调试所用(跟系统功能关系不大)PageBean 类:分页类Dao 包:许多对数据库的操作。ViewAdmin 包:管理员界面包。ViewWorker 包:工作人员界面包。WebContent 中 Main 包,主要是包含很多 JSP 页面。系统展示C/S 端以员工身份登录后,可以看到如下图所示。系统中有诊疗卡的操作、预约挂号、挂号信息的查看与修改、排班表、挂号费结算。添加诊疗卡的信息双击表格后,弹出对信息修改界面预约挂号界面,可以选择挂号的日期已经班次。然后系统会根据时间和班次
11、、科室、级别筛选出医生。这里可以查到挂号的信息。排班信息挂号费的结算(前两条信息是我手动添加的)以管理员身份登陆后,可以看到如下图所示。系统中有科室的操作、医生、排班表、工作人员、诊疗费标准。可以对诊疗费用进行修改其他功能大同小异,就不一一列举了。B/S 端B/S 端登录界面B/S 端主界面B/S 端注册界面信息查看和修改查看医生排版表预约挂号界面安全性控制MD5 加密MD5 的全称是 Message-Digest Algorithm 5(信息 -摘要算法) ,在 90 年代初由 MIT Laboratory for Computer Science 和 RSA Data Security I
12、nc 的 Ronald L. Rivest 开发出来,经MD2、 MD3 和 MD4 发展而来。-摘自百度百科关键代码如下:private static String encodeByMD5(String originString) if (originString != null) try MessageDigest md = MessageDigest.getInstance(“MD5“); /使用指定的字节数组对摘要进行最后更新,然后完成摘要计算 byte results = md.digest(originString.getBytes(); /将得到的字节数组变成字符串返回 Stri
13、ng resultString = byteArrayToHexString(results); String pass = resultString.toUpperCase(); return pass; catch(Exception ex) ex.printStackTrace(); return null; 防 SQL 注入SQL 注入攻击指的是通过构建特殊的输入作为参数传入 Web 应用程序,而这些输入大都是 SQL 语法里的一些组合,通过执行 SQL 语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。根据相关技术原理, SQL 注入可
14、以分为平台层注入和代码层注入。前者由不安全的数据库配置或数据库平台的漏洞所致;后者主要是由于程序员对输入未进行细致地过滤,从而执行了非法的数据查询。基于此, SQL 注入的产生原因通常表现在以下几方面: 不当的类型处理; 不安全的 数据 库配置; 不合理的查询集处理; 不当的错误处理; 转义字符处理不合适; 多个提交处理不当。-摘自百度百科在 JSP 中,我都是采用的 setParameter 的方法来传递参数,也就是采用 post 方式来传参,因此大大降低了 SQL 注入的风险此外,在登录等含有输入框的地方,我也都验证了输入的合法性,过滤了所有的可疑字符。关键技术1、 在 C/S 端,主要用
15、到了信息的加密技术,防注入技术,其他的更多的是对 Java 编码能力的考量。2、 在 B/S 端,用到了 JavaBean、JSP、EL、JavaWeb 对数据库的操作以及加密技术,防注入等等技术心得体会经过近一个月紧张的数据库课程设计,加之中间还夹杂着两个考试,自己已经累得不成样子了。不过,虽然很累,但是自己还是学到了不少的东西。以下分几个方面谈谈自己的心得。1、 对 Java 编程能力的提高。编完这个系统,我用 Eclipse 计算了一下,光 Java 代码就有5800 多行,中间也用到了继承、接口等高级一点的编程方法,近 7000 行代码对于大三的学生来说,不多不少吧。以前也编过几个工程
16、量大致相当的 project,从 project 中锻炼自己的能力,这一点对自己帮助还是挺大的。毕竟嘴上说谁都会,但是动起手来就会遇到形形色色各种问题。所以说,这次的课设对自己的逻辑锻炼还是蛮大的,对Java 的理解也加深了一点。也学会了很多新的 API,诸如JTable、JInternalFrame、JComboBox 等等。2、 JavaWeb 入门。以前虽然一直都想学习 JavaWeb 方面的知识,也一直有在看 Web 方面的书籍,但是毕竟没有动力、导致学习效率低下。这次接触了到数据库的课程设计,在 Deadline 的强大压力之下,逼着自己去快速的学习 JavaWeb 知识。回想起当初
17、,结合自己此前 JavaSE、Android 、HTML 、XML 的基础,其实 JavaWeb 入门很容易,不到一天就能编出像样的东西了。后来由于时间有限,我 B/S 端做的并不是很好,寒假里再去深入去学习吧。3、 数据库知识加强。虽然以前上过数据库的课程,也做了数据库的实验。可是那个东西毕竟太抽象,知识仅仅停留在纸面上。此前做的几个 project 也经常用到数据库,但是也仅仅是几个简单的 Select 就能搞定的难度,像这样的完整做一个管理系统,此前还未曾尝试过。所以这次无论是从 SQL 语法而言、还是对数据库知识的复习,自己的数据库知识的都有很大的提升。系统中也用到了视图、存储过程等等
18、,这些东西此前都没有真正实战过,所以这次还是有蛮大的收货,至少以后再次遇到就不会那么陌生了。4、 其他方面。经过这次数据库的课设,自己也懂得了不少的道理。没有压力就没有动力,没有动力就会导致效率低下。就拿 JavaWeb 而言,此前就很想学习了,可是一直就拖着,今天看一点明天看一点,导致在数据库课设之前,自己的 JavaWeb 基础几乎为零。但是有了数据库课设的这个动力,也就几天时间就从 Web 零基础入门了,能写简单的几个页面了,也能实现几个简单的操作。所以说,凡事不要总是拖着去做,有时间就赶紧学了,不要等到需要用的时候再去学习,到时候就来不及了。书到用时方恨少。5、 关于数据库课设的一点建
19、议。这里仅仅是自己的一点看法,也许不一定对。关于这个课设,如果仅仅是只做一端(C/S、B/S 仅做一方面,但是功能必须全)的话,如果把时间放久一点,就难度和工程量而言基本上是合理的。但是如果是做两端的话,个人认为,这仅仅是数据库的课设,应该把重心放在数据库上面,而不是重点考察编程能力,对编程能力的考量以后还有 Java 课设等等。所以这也是我为什么认为只需要做一端的主要原因。因为做一端的话,数据库的知识基本上都考察到位了,也降低了不少的编程量。就我个人而言,在整个工程上面,花在数据库部分的时间为 10%-15%左右,其余时间基本上都在花在编程上面的。这也是我认为不合理的地方,所以我认为应该对数据库的知识重点考量,相对的,编程量应该可以减少。不过这也仅仅是一方面吧,难度大了,所以自己提高也就多了,这也是好处。6、 这次的课设做的还并不很完善,以后有机会再去完善一下。