机房收费系统之上下机
来源:互联网 发布:淘宝店铺密码忘了 编辑:程序博客网 时间:2024/05/21 10:42
【前言】上下机部分涉及到的表较多,逻辑性也比较强,如果不先理清逻辑关系就上手写代码肯定会出现好多问题。我的上下机从开始的一头雾水到后来的逐渐清晰到现在的soeasy,经历了一个不断学习和摸索的过程。其实所有的学习都会经历这个过程,如果我们没有之前的探索就不会有后来的熟练掌握。
一、上机逻辑
我们在动手之前一定要有一个清晰地逻辑,画出流程图认真思考还有没有落下的地方,再补充流程图,按着步骤写代码,上下机就变得很简单了。
上机其实没有什么难得就是把所有的要验证的条件想全面了就好了,什么情况下允许上机,什么情况下需要用户做出修改才能上机,这些都是要提前考虑清楚的,然后就是在Online和Line表里添加上机信息数据,再显示在桌面就行啦!
下面是我画的上机流程图:
我的代码展示:
'判断卡号是否为空 If Not Testtxt(txtCardNo.Text) Then MsgBox "请输入卡号!", vbOKOnly + vbExclamation, "提示" txtCardNo.SetFocus Exit Sub End If '判断是否为数字 If Not IsNumeric(txtCardNo.Text) Then MsgBox "卡号为数字,请输入数字!", vbOKOnly + vbExclamation, "提示" txtCardNo.Text = "" txtCardNo.SetFocus Exit Sub End If '判断是否注册 txtSQLStu = "select * from student_Info where cardno='" & Trim(txtCardNo.Text) & "'" & "and status='使用" & "'" Set mrcStu = ExecuteSQL(txtSQLStu, MsgText) If mrcStu.EOF = True Then MsgBox "该卡未注册或已经退卡,请输入有效卡号!", vbOKOnly + vbExclamation, "提示" txtCardNo.Text = "" txtCardNo.SetFocus Exit Sub Else txtSQLon = "select * from Online_Info where cardno='" & Trim(txtCardNo.Text) & "'" Set mrcon = ExecuteSQL(txtSQLon, MsgText) '判断是否在上机 If mrcon.EOF = False Then MsgBox "该卡正在上机,请选择其他卡号上机!", vbOKOnly + vbExclamation, "提示" txtCardNo.Text = "" txtCardNo.SetFocus Exit Sub Else txtSQLBas = "select * from BasicData_Info" Set mrcBas = ExecuteSQL(txtSQLBas, MsgText) If mrcStu.Fields(7) < mrcBas.Fields(0) Then MsgBox "卡内余额不足,请充值后再上机!", vbOKOnly + vbExclamation, "提示" txtCardNo.Text = "" frmOpeRecharge.Show Exit Sub Else '更新桌面显示的内容 txtSID.Text = Trim(mrcStu.Fields(1)) txtDepart.Text = Trim(mrcStu.Fields(4)) txtType.Text = Trim(mrcStu.Fields(14)) txtName.Text = Trim(mrcStu.Fields(2)) txtSex.Text = Trim(mrcStu.Fields(3)) txtOnlineDate.Text = Trim(Date) txtOnlineTime.Text = Trim(Time) txtDownLineDate.Text = "" txtDownLineTime.Text = "" txtBalance.Text = Trim(mrcStu.Fields(7)) txtConsumeTime.Text = "" txtConsumeMoney.Text = "" '将内容添加到online表 mrcon.AddNew mrcon.Fields(0) = Trim(txtCardNo.Text) mrcon.Fields(1) = Trim(txtType.Text) mrcon.Fields(2) = Trim(txtSID.Text) mrcon.Fields(3) = Trim(txtName.Text) mrcon.Fields(4) = Trim(txtDepart.Text) mrcon.Fields(5) = Trim(txtSex.Text) mrcon.Fields(6) = Trim(Date) mrcon.Fields(7) = Trim(Time) mrcon.Fields(8) = VBA.Environ("computername") mrcon.Fields(9) = Trim(Now) mrcon.Fields(10) = Trim(Val(0)) mrcon.Update '将信息更新到Line表 txtSQLline = "select * from Line_Info where cardno='" & txtCardNo.Text & "'" Set mrcline = ExecuteSQL(txtSQLline, MsgText) mrcline.AddNew mrcline.Fields(1) = Trim(txtCardNo.Text) mrcline.Fields(2) = Trim(txtSID.Text) mrcline.Fields(3) = Trim(txtName.Text) mrcline.Fields(4) = Trim(txtDepart.Text) mrcline.Fields(5) = Trim(txtSex.Text) mrcline.Fields(6) = Trim(Date) mrcline.Fields(7) = Trim(Time) mrcline.Fields(13) = Trim("正常上机") mrcline.Fields(14) = Trim(VBA.Environ("computername")) mrcline.Update mrcStu.Close mrcon.Close mrcline.Close End If End If End If
二、下机逻辑
下机的主要逻辑其实和上机的逻辑大同小异,比较复杂的就是计算消费金额。这里有一个问题就是如果上机用户改变系统时间我们算的钱不会出错,所以要么我们读取的不能是系统时间,要么我们就不能使用上机时间减去下机时间的方法来计算消费时间。
我采用的方法是加了一个timer控件,每分钟执行一次,数据库中的消费时间就会+1,这样就算用户改了系统时间也不会影响他的消费时间。
之前我把扣费也加到这个timer事件里了,每隔一个单位递增时间就会扣一次钱,但是第一个人上机时正常扣费的,第二个人上机就会有一段时间不收钱,直到第一个用户下一次收费,第二个用户才能进行第一次扣费,这就导致之后上机的用户都会有一段时间是不收钱的,这样赔本的买卖,客户怎么会接受这样的系统呢。如果我们想要实现这个功能,就需要在数据库里做下修改,加一个i,让每一个用户上线i都是为1的,这样就不会出现上述的问题。这样在用户余额不足的时候就会让他强制下机的。
下机流程图:
之前的收费代码(有漏洞):
Private Sub Timer2_Timer() Dim unitTime As String Dim leastTime As String txtSQLBas = "select * from BasicData_Info" Set mrcBas = ExecuteSQL(txtSQLBas, MsgText) unitTime = mrcBas.Fields(2) leastTime = mrcBas.Fields(3) txtSQLon = "select * from Online_Info" Set mrcon = ExecuteSQL(txtSQLon, MsgText) '当online表没有数据时直接跳出此过程 If mrcon.EOF = True Then Exit Sub End If '到单位递增时间扣一次钱,在准备时间不扣钱 Do While (mrcon.EOF = False) mrcon.Fields(10) = Val(mrcon.Fields(10)) + 1 mrcon.Update If i = Val(leastTime) + 1 Then If Val(Trim(mrcon.Fields(11))) < Val(Trim(mrcBas.Fields(1))) Then MsgBox "余额不足,即将强制下机!", vbOKOnly + vbExclamation, "警告" txtCardNo.Text = mrcon.Fields(0) Call CmdDownLine_Click Exit Sub End If Else If Trim(mrcon.Fields(1)) = Trim("固定用户") Then mrcon.Fields(11) = Val(Trim(mrcon.Fields(11))) - Val(Trim(mrcBas.Fields(0))) mrcon.Update End If If Trim(mrcon.Fields(1)) = Trim("临时用户") Then mrcon.Fields(11) = Val(Trim(mrcon.Fields(11))) - Val(Trim(mrcBas.Fields(1))) mrcon.Update End If i = i + 1 End If Else If i >= (Val(unitTime)) Then i = 1 Else i = i + 1 End If End If mrcon.MoveNext Loop End Sub
计算消费时间代码:
Private Sub Timer2_Timer() txtSQLon = "select * from Online_Info" Set mrcon = ExecuteSQL(txtSQLon, MsgText) '当online表没有数据时直接跳出此过程 If mrcon.EOF = True Then Exit Sub End If '执行一次,消费时间+1 Do While (mrcon.EOF = False) mrcon.Fields(10) = Val(mrcon.Fields(10)) + 1 mrcon.Update mrcon.MoveNext LoopEnd Sub
下机代码:
'判断卡号是否为空 If Not Testtxt(txtCardNo.Text) Then MsgBox "请输入要下机的卡号!", vbOKOnly + vbInformation, "提示" txtCardNo.SetFocus Exit Sub End If '判断输入的是否为数字 If Not IsNumeric(txtCardNo.Text) Then MsgBox "卡号请输入数字!", vbOKOnly + vbExclamation, "警告" txtCardNo.Text = "" txtCardNo.SetFocus Exit Sub End If '判断是否注册或使用 txtSQLStu = "select * from student_Info where cardno='" & Trim(txtCardNo.Text) & "'" & "and status='使用" & "'" Set mrcStu = ExecuteSQL(txtSQLStu, MsgText) If mrcStu.EOF = True Then MsgBox "该卡未注册或已经退卡,请输入有效卡号!", vbOKOnly + vbExclamation, "提示" txtCardNo.Text = "" txtCardNo.SetFocus Exit Sub Else txtSQLon = "select * from Online_Info where cardno='" & Trim(txtCardNo.Text) & "'" Set mrcon = ExecuteSQL(txtSQLon, MsgText) '判断是否在上机 If mrcon.EOF = True Then MsgBox "该卡没有上机,请输入正确的卡号!", vbOKOnly + vbExclamation, "提示" txtCardNo.Text = "" txtCardNo.SetFocus Exit Sub Else txtSQLline = "select * from Line_Info where cardno='" & Trim(txtCardNo.Text) & "'and status='正常上机'" Set mrcline = ExecuteSQL(txtSQLline, MsgText) '计算消费金额 comsumeTime = mrcon.Fields(10) '如果消费时间小于准备时间则不收钱,如果大于准备时间小于最短上机时间则半价,如果大于最短上机时间则正常收费 If Val(comsumeTime) <= Val(prepareTime) Then mrcline.Fields(11) = "0" Else If Val(comsumeTime) < Val(leastTime) Then If Trim(mrcon.Fields(1)) = Trim("固定用户") Then mrcline.Fields(11) = 0.5 * mrcBas.Fields(0) Else mrcline.Fields(11) = 0.5 * mrcBas.Fields(1) End If Else If Val(comsumeTime) Mod Val(unitTime) = 0 Then t = Int(comsumeTime / unitTime) Else t = Int(comsumeTime / unitTime) + 1 End If If Trim(mrcon.Fields(1)) = Trim("固定用户") Then mrcline.Fields(11) = t * mrcBas.Fields(0) Else mrcline.Fields(11) = t * mrcBas.Fields(1) End If End If End If '将所有数据更新到line表里 mrcline.Fields(8) = Trim(Date) mrcline.Fields(9) = Trim(Time) mrcline.Fields(10) = Trim(mrcon.Fields(10)) mrcline.Fields(12) = Trim(mrcStu.Fields(7) - mrcline.Fields(11)) mrcline.Fields(13) = "正常下机" mrcline.Fields(14) = Trim(VBA.Environ("computername")) mrcline.Update mrcStu.Fields(7) = Trim(mrcline.Fields(11)) mrcStu.Update '更新桌面的内容 txtType.Text = Trim(mrcon.Fields(1)) txtSID.Text = Trim(mrcon.Fields(2)) txtName.Text = Trim(mrcon.Fields(3)) txtDepart.Text = Trim(mrcon.Fields(4)) txtSex.Text = Trim(mrcon.Fields(5)) txtOnlineDate.Text = Trim(mrcon.Fields(6)) txtOnlineTime.Text = Trim(mrcon.Fields(7)) txtDownLineDate.Text = Trim(Date) txtDownLineTime.Text = Trim(Time) txtConsumeTime.Text = Trim(mrcline.Fields(10)) txtConsumeMoney.Text = Trim(mrcline.Fields(11)) txtBalance.Text = Trim(mrcline.Fields(12)) mrcon.Delete mrcon.Close mrcStu.Close mrcline.Close MsgBox "下机成功!", vbOKOnly, "恭喜" txtCardNo.Text = "" txtSID.Text = "" txtDepart.Text = "" txtType.Text = "" txtName.Text = "" txtSex.Text = "" txtOnlineDate.Text = "" txtOnlineTime.Text = "" txtDownLineDate.Text = "" txtDownLineTime.Text = "" txtBalance.Text = "" txtConsumeTime.Text = "" txtConsumeMoney.Text = "" End If End If
【总结】接触一个新事物的时候首先要做的就是打败自己的畏难心理,静下心来慢慢分析不可急躁,否则一开始心烦就无法冷静思考了。其实只要认真分析没有什么难的,要把自己的想法尽可能实现出来,如果觉得不合理就可以改正它,相信随着我们的不断成长我们做出的系统肯定会越来越完善的。
- 机房收费系统之上下机
- 机房收费系统之上下机
- 机房收费系统之上下机
- 机房收费系统之上下机
- 机房收费系统之上下机
- 机房收费系统之上下机
- 机房收费系统之上下机
- 机房收费系统之上下机
- 机房收费系统之上下机
- 【机房收费系统】之上下机
- 机房收费系统之上下机
- 机房收费系统之上下机
- 机房收费系统之上下机
- 机房收费系统之上下机
- 机房收费系统之上下机
- 机房收费系统之上下机
- 机房收费系统之上下机
- 机房收费系统之上下机
- 微服务架构 (八): 业务驱动与团队协作微服务粒度设计: 微服务内部的世界
- 自定义View
- mysql 数据库字符集定义
- Java类加载器(一)——类加载器层次与模型
- Python学习笔记(2)-whil,for,for...in,循环嵌套
- 机房收费系统之上下机
- codeforces 374C Inna and Dima (dfs+记忆化)
- window环境下使用ndk编译出android studio/Eclipse能使用的ffmpeg动态库
- Java类加载器(二)——自定义类加载器
- 关于C语言字符串Dddi DdD的一些问题处理
- 解析C语言结构体对齐(内存对齐问题)
- Referer伪造,防盗链与反盗链相关
- Java NIO——6 基于非阻塞编程UDP NIO的例子
- 处理从数据库中返回的json格式日期