JAVA毕业设计--网吧收费管理系统_第1页
JAVA毕业设计--网吧收费管理系统_第2页
JAVA毕业设计--网吧收费管理系统_第3页
JAVA毕业设计--网吧收费管理系统_第4页
JAVA毕业设计--网吧收费管理系统_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一章第一章 网吧计费管理系统网吧计费管理系统 学习目标:学习目标:能使用 Java 集成开发环境,运用 Swing 设计图形界面,运用 JDBC 访 问数据库, 掌握事件处理编程,了解简单两层 C/S 项目的开发及简单面向对象程 序的设计过程,发展基本的团队协作开发能力。 学习寄语学习寄语:虽然本项目并不是一个商业项目,其产品也不能用来赚钱,但从中你 可以学到实际开发中的许多经验和技巧,获得一种“学有所用” 、 “学有所得”的 成就感,同时赢得老师和同学(同事)对你的格外尊重。在此项目的学习中,你 不但是个学生,还是一个职业人,将与同事一起尽全力完成你所要做的工作,并 再次验证“天道酬勤”的真理。我们的信念是: “不抛弃,不放弃” 。你的改变和 收获是老师真诚的期待。 1.11.1 背景介绍背景介绍 .1 业务背景业务背景 “海之星”网吧,是一个小型网吧,以前是人工记帐,现需要开发一个简单的 网吧计费管理系统。原人工管理的主要过程如下:客户在门口服务台,出示上机 卡,若是新客户则先发新卡;管理员先查询是否有空机器,若有则根据上机卡号 查到该卡对应的记录(账簿) ,若有余额(5 元) ,则分配一个空闲的机器号给 客户, 客户根据机器号对号入座, 管理员记下客户卡号、 上机机器号、 上机时间。 客户下机要到门口的服务台,请求下机,管理员根据当前时间、上机时间及费率 计算出本次上机费用,并记录,同时将费用从卡余额中扣除,若费用不够则需充 值。 原手工系统主要有如下缺点: 1 手工记帐, 管理员工作量大, 且易出错; 2 超 时超费使用不能及时发现。因此需要开发一个简易计费管理软件,取代人工记帐 方式,由软件统一管理记录上下机、计费、上机卡、机器情况,提供简单统计功 能,超时超费提醒功能等。 .2 技术背景技术背景 本系统要求使用 java 技术开发,使用数据库(如ACCESS,SQLServer)保存 数据, 集成开发环境可使用支持可视化 GUI界面设计的主流工具(如 eclipseant beanjbuilder)。开发者应有 java 程序设计语言、SWING 基本 GUI 组件、文件 使用、JDBC 存取数据库、使用一种集成开发工具的基本知识和技能。系统采用 两层 C/S 体系结构,C 端负责通过 GUI 与管理员交互、处理业务逻辑及存取数据 库,S 端主要是数据库系统。系统分析设计主要采用面向对象的分析设计方法。 友情提示:友情提示:对项目有了一个最基本的认识后, 是不是立即准备大干一场?是否要 问一问值不值得干?能不能干?商业项目一般可以从经济性、技术性、法律社会 等方面进行可行性分析, 但本项目作为一个学习型项目显然无利可图、技术也欠 缺(事实上技术正是要学习的东西) 、好在项目是合法的。那是否继续?当然! 因为本项目的目标不是在合法的前提下获取最大利润,而是习得知识和技能,只 要你愿意,就可以继续进一步了解“网吧计费管理系统” ,Lets go! 1.21.2 需求分析需求分析 .1 功能需求分析功能需求分析 系统需求分析的主要任务是从用户角度考察系统应具有哪些功能及非功能 性需求, 对于网吧计费管理系统, 用户主要是指系统管理员, 系统的主要功能是: 登录、上机、下机、卡管理(发卡、删卡、充值、查询) 、机器管理(添加机器、 删除机器、查询状态、修改状态) ,统计功能(日、月费用统计) ,口令管理(添 加用户、删除用户、修改口令) ,参数设置(时段费率) ,使用帮助。主要使用流 程是: 管理员登录, 根据客户请求上机, 根据客户请求下机。 主要功能的用例 (use case)描述如下: 一 上机 1 管理员输入空闲机器号,上网人输入口令、卡号,请求上机。 2 系统验证卡号,检查卡中余额,卡状态 3 系统获取当前系统时间作为上机开始时间 4 系统修改该机器的使用标志为“在用” ,卡标志为“在用” 。 5 系统记录上机信息(卡号、机器号、上机时间) 6 系统提示上机成功 若 1 中无空闲机器又请求上机的,系统提示“没用空闲机器” , 2 中卡验证未通过,提示“无此卡号” ,余额不足,提示“余额不足” ,卡状 态为“在用” ,则提示“不能一卡多用” 。 二 下机 1 管理员选择被使用的机器号,请求下机 2 系统获取系统当前时间作为下机时间; 3 系统计算费用; 4 系统显示应缴费用 5 系统记录下机时间和此次费用; 6 系统从卡中扣费,修改卡状态为“空闲” ; 7 系统修改该机器的状态为“空闲” ; 8 系统显示本次上机记录信息,提示下机成功 三 登录 1 管理员输入用户名和密码,请求进入系统 2 系统验证用户名和密码 3 系统显示主界面 若一次验证不通过,则提示再输入一次,仍不通过则系统退出。 四 卡维护 卡有三种状态:停用、空闲、在用。 发新卡: 1 管理员输入卡号(保证卡号唯一) 2 管理员输入卡初始金额 3 上网人输入用户名、口令 4 管理员请求添加新卡 5 系统保存卡号、金额、用户名和密码,状态为“空闲” 6 系统提示添卡成功,显示卡号及金额,以便核对。 7 管理员将系统生成的有卡号、用户名的纸卡给上网人。 充值: 1 管理员输入卡号 2 系统显示该卡信息(卡号、用户名、余额、状态) 3 管理员核对后,输入充值金额 4 系统计算并保存该卡总金额 5 系统显示充值后的卡信息(卡号、用户名、余额、状态) 。 查询卡信息: 1 管理员输入卡号或请求察看所有卡信息 2 系统查询卡信息(卡号、用户名、余额)并显示 删除卡: 1 管理员输入卡号 2 系统查询卡余额及状态 3 若余额已结清且状态为“空闲” ,则将该卡信息删除 4 系统提示删除成功 若有余额或“在用”则不能删除 五 机器维护 机器有三种状态:停用、空闲、在用。 添加机器: 1 管理员输入机器号,请求添加 2 系统验证机器号是否重复 3 系统添加机器记录信息(机器号、状态为“空闲” ) 4 系统提示添加成功 删除机器: 1 管理员输入机器号,请求删除 2 系统删除相应机器信息 3 系统提示删除成功 查询机器状态: 1 管理员输入机器号或请求察看所有机器信息 2 系统查询并显示机器信息(机器号和状态)并显示 六 管理员口令管理 添加用户 1 管理员输入用户名、密码和确认密码,请求添加 2 系统验证用户是否是新用户,两次输入的密码是否相同 3 系统添加用户、密码信息 4 系统提示添加成功 删除用户 1 管理员输入用户名、密码 2 系统验证用户名、密码是否正确 3 系统删除用户名、密码记录 4 系统提示删除成功 修改密码 1 管理员输入用户名、密码,请求修改密码 2 系统验证用户名、密码是否正确 3 管理员输入新密码、及确认密码 4 系统保存新密码 5 系统提示修改成功 七统计管理 1管理员输入起始时间(年、月、日) ,结束时间,请求按日、月、年汇总 2系统查询上网记录,计算、统计出时间段的总费用、人次、总上机时间 等信息。 3系统显示上述信息 八 参数管理 时段费率设置: 0 系统显示当前设置 1 管理员设置时间段(时、分)及对应的费率,请求保存 2 系统保存设置 3 系统提示保存成功 超时报警定时器间隔设置 九 超时超费报警 1 设置定时器为周期触发方式,触发间隔由参数获得,默认为 30 分钟 2 定时器到时, 系统查询当前正在上机的记录, 计算其上机时间及费用, 计算其卡中余额是否低于最低费用。 3 系统提示已超费卡号、机器号,及超的费用 本系统除了功能性需求,还有易用性、可靠性、安全性等要求,可以在实现 上述功能性需求的基础上,进一步实现完善非功能性要求。 友情提示:友情提示:本文使用“用例”法分析功能性需求,属于面向对象分析( OOA)法, 其实质就是从用户角度,通过观察、与用户交谈等方式,记录下用户希望如何使 用系统,系统相应需要实现哪些功能。分析用户需求一般由系统分析人员完成, 其核心能力是熟练掌握业务领域的知识和沟通的技巧, 需求分析的最大难点在于 需求的可变性, 最令开发人员气馁的莫过于辛苦设计实现了一个功能,用户突然 说不需要这个功能了, 另一个常见的问题是隐蔽性的需求 (行业惯例、 日常规则) 常被用户和分析人员忽略。不同的需求对于客户而言重要性是不同的,一般需要 对需求划分优先级,优先级高的优先设计实现。 你能否从上述一到九大用例描述 中找出哪些用例是高优先级的? .2 业务对象分析业务对象分析 根据上面的主要用例描述, 可以分析出系统的主要业务对象, 它是设计阶段 核心类图的基础(不一定一一对应) ,这些对象必须实际存在,其行为和属性应 与问题领域相关: 1 上网卡: 主要维护上网卡的相关信息。卡号、密码、余额、卡用户名、卡 状态(在用、空闲、停用) 2 机器:主要维护上网吧计算机的相关信息。机器号、使用标志(在用、停用、 空闲) 、备注 3 费用记录:记录每次上机的信息。记录编号、卡号、机器号、开始上机时间, 下机时间、费用 4 费率记录:起始时间、终止时间,费率 5 管理员: 利用 14 完成各种业务操作。 .3 验收测试要求验收测试要求 用户要求开发产品,产品开发完成后,需要交付用户验收,验收要求常常 是合同中的重要组成部分,这是一个必经的环节,主要思路是按照用户使用的过 程测试系统, 越频繁使用的功能越要多测试。本系统功能性需求验收测试的基本 要求如下: 前置条件: 1 除口令表有初始用户名和密码外,各库表为空。 2 程序安装配置正确,能正常启动运行。 一 初始化数据 1 启动程序,进入“卡维护” ,选“发新卡” ,输入一条数据记录,退出,进入“信 息浏览” ,查看记录是否已被正确加入;退出“信息浏览” ,再进入“发新卡” , 连续发 3 张卡,其中有张卡余额为 0;再进入“信息浏览” ,查看记录是否已被 正确加入。 2 同理按 1 ,添加机器。 3 进入“费率维护” ,设置费率。 二 功能测试 1 上下机测试。进入“上机” ,观察上机界面,有无可用机器,按说明操作上机, 连续上机 3 次,第一次正确输入,第二次输入不存在的卡号,第三次输入错误口 令;进入“下机”界面,看有无正确的上机,连续下机两次。观察输出信息界面, 看内容是否正确(金额、卡号,时间,费用) 。已下机器是否已被同步从上机下 拉表中清除。再进入“上机” ,比对可选空闲机器是否正确,输入已上机用户的 卡号,观察结果;输入卡金额不足的卡号,观察结果;不输入任何值,直接按确 认的结果。 2 统计测试,进入“统计”功能,按日,月,年查询统计, 与库中实际数据比对, 不同日、月、年分别查 2 次 3 进入“卡维护” ,进入“卡充值“,输入余额不足卡号,给卡充值,进入“信 息浏览” ,查看卡充值是否正确,并以此卡号上机;再进入“卡维护”的“信息 浏览” ,查看记录;然后选“删除卡” ,连续删2 张卡,应不能删除在线卡,并能 标识出卡余额,以便清帐;进入“信息浏览” ,查看记录是否已被正确删除。正 在上机的不能被删除。选“修改密码” ,输入正确的用户名、口令,修改成新口 令;进入“信息浏览” ,查看口令是否已更改;进入“上机” ,以新口令上机。 4 同 3 测试“机器维护”中的删除机器功能,应不能删除在线机器 5 测试“费率维护” ,退出程序, 重启动,进入“费率维护” ,修改费率,上下机, 观察费用计算结果。 6 测试超时报警功能:发一张新卡,初始额刚达到最低标准,以此卡上机,为缩 短超时等待时间,可设置定时器间隔为 1 分钟,等待 2 分钟,看系统是否能正确 报警。 7 测试帮助功能。按照帮助说明使用系统,验证帮助说明的正确性。 友情提示:友情提示:测试是保证程序质量的基本手段,一般可分为单元测试、集成测试、 系统测试、验收测试,其中验收测试一般由用户在真实的运行环境下测试系统, 是用户确认系统符合要求的关键环节, 你开发的系统必须通过上述最基本的验收你开发的系统必须通过上述最基本的验收 测试。测试。并不是整个系统完成后才可以进行上述测试, 完成相应模块后就可以有针 对性地测试,验收测试的内容经过分解后是单元测试、集成测试、系统测试的基 本依据,测试工作并不是从编码时才开始的,在需求分析阶段就已展开(如根据 用例提出验收测试要求) 。有的 IT 公司内部的质量部门在产品正式交付用户前, 也会做类似的测试,以保证用户验收时一次通过。 1.31.3 系统设计系统设计 .1 总体设计总体设计 一一 系统体系结构 一般要确定系统的体系结构,主要模块,系统运行环境(如操作系统、数据 库) ,开发平台及语言。本系统主要运行在windows 系列平台上,数据库使用 ACCESS,使用 eclipse 开发系统。采用两层 C/S 体系结构。系统体系结构图如下 图所示: 图形界面 SWING 业务逻辑 数据访问(JDBC) 客户端 服务端 数据库 ACCESS SQL 图 1 系统体系结构 客户端分 3 层,图形界面层(采用 java 的 SWING 设计)负责与用户交互,业务 逻辑层则根据用户的请求执行各种功能(如上、下机等), 数据访问层主要根据业 务逻辑层的请求通过 JDBC/SQL 存取数据库。数据库使用ACCESS,可根据情况使 用其他数据库(如 SQL Server),客户端基本不做修改,仅有的少量修改也只在 数据访问层。 客户端与服务端在物理上可以运行在一台机器上,也可以分别运行 在不同机器上。 二 系统功能模块及主要类 系统的主要功能模块如图2所示: 主模块 登 录 上 机 下 机 帮 助 卡 维 护 统 计 机 器 维 护 参 数 维 护 口 令 维 护 发 卡 充 值 查 询 删 除 卡 添 加 机 器 删 除 机 器 查 询 添 加 用 户 更 改 口 令 删 除 用 户 图 2 系统模块图 可据此设计菜单,划分模块。 系统主要类图如下: 图 3 总类图的画法基本遵循视图层、 业务逻辑层、数据模型及数据库访问层的自 上而下的顺序, 其中视图层中的视图因为较多未画出,主要的业务逻辑控制类是 BusinessManager,用户的上下机请求,通过界面的事件机制,在事件处理程序 中会调用 BusinessManager 中的方法,然后再调用 xDAO 类方法, 在 xDAO 类中一 般 先 通 过 DBConnection 获 取 连 接 , 再 通 过 JDBC/SQL 访 问 数 据 库 。 CardComputerRecordManager 类是“值对象” ,主要是存放相应的属性,方法 也是 setXgetX 类方法, “值对象”常作为参数在各种方法中传递。 三 经验共享 1 客户端基本采用三层结构(视图 View、控制 Controller、模型 Mode) ,层与 层间耦合性较小,提高了整体的可扩展性、可重用及抗变动能力。缺点是要求预 先设计好, 对设计水平要求高, 不过一旦形成模式, 养成习惯, 能 “照葫芦画瓢” , 也是提高设计水平的捷径。 2 使用 xDAO 类将业务逻辑和数据库访问隔离,只要 xDAO 对上提供的接口不变, 以后数据库存取代码发生改变也不会影响上层代码(如业务逻辑层) 。接口中的 参数主要是 “值对象”,这样即使 CardComputerRecordManager 类中的属性发 生改变,由于“值对象”的封装,对接口的影响也不大,缺点是如果“值对象” 本身很大,而又只用到其中很少的属性,则对性能和内存浪费较大。与此对应, 比较一般的设计是在事件处理代码中就实现业务逻辑(如验证、计算、上下机) 、 获取数据库连接并通过 JDBC 访问数据库,这样做的好处是实现较容易、符合一 般过程性思维 (常用于初始的或原型系统的开发中) ,缺点是代码一旦需要修改, 则改动较多、且容易出错,代码重用性差。 3 使用 DBConnection 类统一完成连接的获取和释放,好处是连接部分代码可重 复使用,如果连接参数(如连到不同的数据库)改动,只需更改 DBConnection 类中的相关参数属性(当然更好的做法是将这些连接参数放在配置文件中,这样 可以只修改配置文件,无需修改程序) ,另外还可以为了提高性能扩展成“连接 池” ,同时对使用它的 xDAO 类没有影响。 友情提示:友情提示:如果你不能理解上述描述,也不必担心,按照你的直觉去开发系统, 如果你一帆风顺,那么你肯定是这方面的天才,如果遇到各种问题,上述的文字 可供参考,同学之间可以互相交流,老师也乐意为你效劳,勤思、善问、实干是 快速提高水平的不二法门。 .2 详细设计详细设计 详细设计主要是关注模块一级的设计,一般有界面,核心算法及处理流程, 数据库表(表、属性及表间关系)的设计。由于模块较多,下面选择几个典型模 块分析设计,其中“经验共享” ,揭示难点的同时,也介绍了相应的解决方法及 设计经验。 数据库设计数据库设计 数据库设计主要是根据分析和概要设计中发现的对象和类, 确定哪些对象需 要持久保存,然后将对象属性及对象间关系转化成关系表。经过分析Card、 Computer、Record、Manger 需要保存在数据库中,将 Config 参数配置信息保存 在文件中。其中 Card、Computer、Record 的关系如下图所示: 图持久对象属性及关系图 一条 Record 记录必有对应的一个 Card 及一台 Computer,对于未用机器及卡, 则没有对应的记录。将其转换为关系表时,关键是在 Record 中设置 CARDID,COMPUTERID 作为外键指向 Card 和 Computer。共设计出四张表: 1.CARD 表 名称编码数据类型 卡号 用户名 密码 ID(主键)VARCHAR(20) USERNAME (非空) VARCHAR(20) PASSWORD (非空) VARCHAR(15) 卡状态 余额 2.COMPUTER 表 名称 机器号 状态 备注 3.RECORD 表 名称 记录号 卡号 机器号 上机时间 下机时间 上机费用 4. Manager 表 名称 用户名 口令 STATUS (非空)INTEGER BALANCE (非空)DOUBLE 编码数据类型 ID(主键)VARCHAR (10) STATUS (非空)INTEGER NOTESVARCHAR (200 ) 编码 ID(主键) CARDID (非空) COMPUTERID (非空) BEGINTIME (非空) ENDTIME FEE 编码 数据类型 VARCHAR (20) VARCHAR (20) VARCHAR (10) DATE DATE DOUBLE 数据类型 USERNAME (非空)VARCHAR (20) PASSWORD (非空)VARCHAR (20) 经验共享:经验共享:数据库设计一般相对独立, 采用的主要方法是将对象模型转化为数据 库关系模型,也可以采用传统的设计出 E-R 图,再定关系表的方法。即使是简单 数据库的设计若从实用角度出发也需要考虑多方面的问题。 首先基本的是确定有 哪几张表, 表间关系, 然后是表中的字段, 比较麻烦的是确定字段的约束 (主键、 非空等) ,字段数据类型,范式的调整等,因为此时会考虑到存储空间、性能、 易编程、数据质量等方面的因素。 如定义“用户名”字段要有多大,就需要在存储空间节省和适应性间权衡, 定义的较小,遇到长名字的情况,程序不能适应;定义的过大,对于大多数情况 可能又会浪费存储空间,一般宁愿定义的大些,以空间换取适应性。 再比如确定哪些字段为“非空” ,从编程角度看必须保证“非空”字段有值, 这会增加验证“非空”字段程序的代码量,对用户的约束也加强,有些值要求用 户必须输入,如口令就不能为空。但若允许字段可以为“空” ,如机器状态字段, 则机器的当前状态就可能难以确定,影响数据质量。一个基本的方向是“约束” 多,则编程的代码量会变大,性能会下降,但数据的质量会得到提高。在 Record 表中“下机时间”和“上机费用”没有定义为“非空” ,是因为上机时这 两项不能确定,只能填写部分上机记录信息。 一般数据库表结构的变动对于程序的影响较大,在程序设计上可通过 xDAO 类尽量消减变动的影响,在实现阶段应避免对数据库结构大的改动。 上机模块设计上机模块设计 一 界面设计 界面设计主要是根据功能要求构建界面,界面中的每个元素均应有其作用, 以支持功能的实现,界面设计还要考虑到界面风格的一致、符合一般 window 应 用 GUI 的规范。设计应简洁实用,避免在细节上(如字体、颜色)耗费时间。上 机模块参考界面如图 4 所示: 图 4 参考界面 二 上机流程 1 初始化 (1) 显示界面 (2)获取空闲机器 (3) 将空闲机器号加入下拉列表 2 上机处理过程: (1)验证机器号、卡号、密码是否为空 (2)根据卡号、密码获取卡对象 (3) 若卡对象为空则说明卡号或密码错,给出提示“卡号或密码错” ,要 求重输 (4)判断卡状态,若卡正在使用则给出提示“不能一卡多用” (5)计算卡中余额,若低于设定值,则提示“余额不足” (6)修改卡状态为在用,修改机器状态为在用,获取上机时间,将上机时 间、机器号、卡号保存到记录对象,再通过 RecordDAO 在库中添加一 条新上网记录。 (7)提示上网成功 三 经验共享 1 上机处理中的第 6 步要在一个完整的“事务”中完成,对卡、记录、机器数据 的更改添加要保证要么全部更改成功,要么都不更改,以保证数据的一致性。 2 费用计算是按时段计算的, 需要考虑跨时段费用如何计算,另外为了降低复杂 性,可规定时段只能为三段,时间精确到分,费用精确到角。 3 记录 ID 如何保证唯一且自动增长。基本有两种:一是编程控制,插入新记录 前获取当前最大记录号,通过 select max(id) from record,加 1 后,将 ID 及 其它信息写入,若有多用户访问该表,则上述过程要放在一个“事务”中。二是 利用关系数据库提供的“自增字段”特性,将ID 设置成“自增字段” ,由数据库 负责每添加一条记录就将 ID 加 1。 下机模块设计下机模块设计 一 界面设计 下机模块主要根据用户请求 (报出卡号/机器号) , 管理员根据卡号/机器号执 行下机操作, 参考界面如图 5 所示, 大的文本空白文本框用于显示下机记录信息。 当然还有其它的设计方式,如显示当前上机的所有记录信息,选中其中一条执行 下机操作。 图 5 下机模块界面 二 下机流程 1 管理员输入机器号或卡号,请求下机 2 系统获取机器号,据机器号获取相应记录对象,要处理机器号错误的情况 3 系统根据记录对象获取该记录对应的卡对象 4 系统计算费用,并比较卡对象余额,若不够则提示“余额不足” ,并显示余 额 5 系统从卡中扣费, 修改卡状态为 “空闲” ;系统修改该机器的状态为 “空闲” ; 系统更新记录信息(下机时间、费用) 。 6 系统显示本次上网完整的记录(Record)信息及卡余额,并提示下机成功 注: 下机处理 4 中修改三表的操作应作为一个“事务”完成。 发新卡模块设计发新卡模块设计 一 界面设计 发卡需要输入卡号、用户名、密码、金额,参考界面如下图所示。界面设计 布局应简洁一致,从用户友好性出发,提供了输入提示,增加了“确认密码” , 以提醒用户记住密码,输入的密码用*号显示以提高安全性。虽然有了提示但在 代码中仍需对输入进行验证,如金额不能为负值,以避免误输及恶意输入。当然 从口令强度考虑,要求密码只输入数字和字母又是不妥的,相反可提示用户输入 特殊字符及输入的最小字符数。 所以此界面虽简单, 但已涉及到界面的视觉风格、 用户友好性、安全性考虑。 图发卡界面 二 发卡流程 1 系统从界面获取所有信息,依次判断是否为空 2 判断金额是否大于 0 3 判断密码和确认密码是否一致, 4 判断密码和用户名是否在最小及最大长度之间 5 判断卡号是否有效(唯一) 6 生成 Card 对象,请求 CardDao 向 Card 表中添加一条新记录。 7 提示卡添加成功,并显示卡号和金额 三 经验共享 1 输入数据的验证是难点,验证输入数据是保证程序可靠性的重要措施,例如: 若不限制用户或口令长度在相应数据库表字段设定的范围内, 一旦将超长的用户 名写入数据库则会产生数据被截断或数据库异常, 而这完全可以在用户输入时予 以控制。 验证输入数据的难点之一在于在验证的代码量和限制大多数常见错误间 取得平衡, 过多地验证代码无疑会增加编码量和难度,但没有验证或很少验证又 使程序可靠性太差而难以实用。但也有一些常规经验可循,如是否限定字符数据 的长度,验证是否为空、数字数据是否在范围内等,有些输入控件提供了限定输 入长度等功能,应该充分利用以减少编码量。 一般验证可遵循如下策略:输入前提示如何输入,输入后验证,验证不通过 则再提示(如通过对话框) 。输入验证的时机:可以在输入一项后立即验证该项 输入是否合法, 也可以全部输完后再逐项验证, 某项若验证不通过, 除给出提示, 从用户友好性角度,还可以将焦点定位到出错项(缺点是代码复杂性增加) 。验 证通过后的数据在程序内部传递时,一般无需重复验证。 2 卡号的获取。 最基本的方式由管理员手工编号并保证卡号的唯一性,但卡一旦 多了,这会成为管理员的负担,因此,可以由系统自动编号,如规定卡号从1 依次递增编号,这样卡号就无需输入。可在每次增加新卡时,从卡表中获取最大 ID,加 1 后作为新增卡的卡号。也可以获取当前时间转化成字符串作为 ID,一 般时间不会重复,可保证 ID 唯一,优点是生成 ID 无需访问数据库,还可以代表 发卡时间。 删除卡模块设计删除卡模块设计 一 界面设计 删除卡参考界面如下图所示: 图 删除卡界面 二 删除卡流程 1 管理员输入卡号 2 系统根据卡号,请求 CardDAO 查询有无该卡 3 若返回的卡对象存在,则执行下一步,否则提示“卡号错误”,要求重输。 4 系统从 Card 查询卡状态 5 若为“在用” ,则提示“不能删除在用卡” 6 查询余额,若有则对话框提示“请结清余额” 7 若余额已结清且状态为“空闲” ,则将该卡信息删除 8 系统提示删除成功 三 经验共享 1 如何删除卡:一种是真删,卡记录信息从数据库中永久删除,采用 delete from where 语句,此时还要注意,由于 Record 中有指向 Card 表的外键,删除 涉及到“级连删除”这一概念,即在 Record 中包含该卡号的记录是否要一起删 除。一般不允许“级连删除” ,因为Record 中记录是统计费用的基本依据,删除 后会使统计数据失真。还有一种是假删,即标注卡状态信息为“停用”,只需用 update 语句更改其状态即可,这样做好处是:一是可以完整保留已发卡信息, 二是易于重新恢复已删卡。坏处是:若有大量卡(数以十万计)长期不用,会占 用数据库空间,影响访问卡表的性能。 2 一般数据库中数据删除后难以恢复, 同时难以避免因为意外导致的数据损坏, 因此重要数据的保存备份必不可少,本系统没有要求做数据备份功能,因为数据 库管理工具一般会提供相应功能,只是要求用户会使用数据库管理工具,所以从 方便用户使用考虑, 程序本身提供备份 (手动或定期自动备份) 功能也是必要的。 1.41.4 系统实现系统实现 系统实现主要运用集成开发环境、 Java、 数据库工具根据设计制做出实际的 界面,编写代码,生成数据库表,进行测试,这也是初级程序员所要完成的主要 任务,在此列出部分典型代码,仅供参考。 .1 数据库访问数据库访问 对数据库的基本操作是:增、删、改、查,数据库连接的建立、关闭,其中 的难点是访问数据库的异常处理和参数化 SQL,现举例如下: 1 获取连接的代码: private static final String DRIVER_CLASS = sun.jdbc.odbc.JdbcOdbcDriver; /定义驱动类 privatestaticfinalStringDATASOURCE= jdbc:odbc:NetBarDataSource; /定义 ODBC 数据源 public static Connection getConnction() Connection dbConnection = null; try Class.forName(DRIVER_CLASS); dbConnection = DriverManager.getConnection(DATASOURCE); catch (Exception e) e.printStackTrace(); return dbConnection; 该代码针对 JdbcOdbcDriver 驱动,ODBC 源名为 NetBarDataSource,未支持 口令验证。 2查询代码: 下面是根据用户名和口令验证卡是否有效的代码, 需要注意的是查询参数值 需要加单引号 : /* * judge card is valid or not. * param card Card * return boolean */ public boolean isValid( Card card) boolean isValid = false; Connection dbConnection = null; PreparedStatement pStatement = null; ResultSet res = null; try dbConnection = ConnectionManager.getConnction(); / 构建查询 SQL 语句 String strSql = select * from card where id= + card.getId() + and password = + card.getPassword() + ; if (dbConnection != null) System.out.println(dbConnection != null); /查询操作 pStatement = dbConnection.prepareStatement(strSql); res = pStatement.executeQuery();/执行 SQL 语句,并返回结果 if (res.next() /若 res 有记录说明卡存在 isValid = true; catch (SQLException sqlE) sqlE.printStackTrace(); finally ConnectionManager.closeResultSet(res);/关闭结果集 ConnectionManager.closeStatement(pStatement); ConnectionManager.closeConnection(dbConnection); /关闭连接 return isValid; 3更新代码 下面是更新机器状态的代码,其中 SQL 语句中, “id =(?)”是动态参数,具体值 设置在 pStatement.setString(1, computer.getId() /* * record the computer have used. * param computer Computer */ public void updateOnUse( Computer computer) Connection dbConnection = null; PreparedStatement pStatement = null; try String strSql = update computer set Status =1 where id =(?) ; ; pStatement = dbConnection.prepareStatement(strSql); pStatement.setString(1, computer.getId(); /设置机器号 id 参数 pStatement.executeUpdate(); catch (SQLException sqlE) sqlE.printStackTrace(); finally ConnectionManager.closeStatement(pStatement); ConnectionManager.closeConnection(dbConnection); .2 下机模块下机模块 在 BusinessManager 类中有一 doCheckOut () 方法是实现下机过程的关键。 /* * do check out business. * param rec Record,已有机器号值 * return ComsumeDisplayInfo 含有上机记录、对应卡记录 */ public static ComsumeDisplayInfo doCheckOut( Record rec) RecordDAO dao = new RecordDAO(); /获取包含了下机记录及对应卡信息的 ComsumeDisplayInfo ComsumeDisplayInfo result = dao.getStopCompouterRelationInfo(rec); Record record = result.getRecord(); Card card = result.getCard(); /计算本次上机的费用 int fee = calFee(record.getBeginTime(), record.getEndTime(); record.setFee(fee); /计算余额 int balance = card.getBalance() - fee; card.setId(record.getCardId(); card.setBalance(balance); /将数据写入数据库 RecordDAO dao2 = new RecordDAO(); dao2.doCheckOutDB(record, card); /返回含有上机记录、CARD 记录的 ComsumeDisplayInfo,供界面显示下机结果 result.setRecord(record); result.setCard(card); return result; .3 上机模块上机模块 处理请求上机的部分代码如下,主要有界面数据(机器号、密码、卡用户号) 验证代码;卡有效性、余额可用性验证。 /* * deal business about click confirm button. * param e ActionEvent */ void confirmButton_actionPerformed(ActionEvent e) String cardId=; String passwordtemp = ; String computerId =; /获取机器号,并去掉空格 cardId = cardIdTextField.getText().trim(); /获取密码 for(int i=0;ipasswordFiled.getPassword().length;i+) passwordtemp += passwordFiled.getPassword()i; /获取机器号 computerId = computerIdCombox.getSelectedItem().toString(); /判断机器号是否为空,未填或只有空格 if(computerId=null | computerId.trim().length()=0) JOptionPane.showMessageDialog(this,请选择机器号!,警告, JOptionPane.WARNING_MESSAGE ,null ); return ; /判断卡号是否为空,未填或只有空格 if(cardId=null | cardId.length()=0) JOptionPane.showMessageDialog(this,请输入卡号!,警告, JOptionPane.WARNING_MESSAGE ,null ); return ; if(passwordtemp=null | passwordtemp.length()=0) JOptionPane.showMessageDialog(this,请输入密码!,警告, JOptionPane.WARNING_MESSAGE ,null ); return ; /生成卡对象,并设置卡用户名、口令、上机时间 Card card = new Car

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论