objRS.Open strSQL,objConn,1,3
If objRS.BOF Or objRS.EOF Then
ResultMsg("对不起,此用户不存在或已被删除!")
objRS.Close
CloseDatabase
Response.End
End If
UserName=objRS("UI_Name_S")
Email="<input type=text name=Email maxlength=50 size=30 value="&_
objRS("UI_Email_S")&">"
QQ="<input type=text name=QQ maxlength=20 size=30 value="&objRS("UI_QQ_S")&">"
IsProvider=objRS("UI_IsProvider_B")
ProviderID=objRS("UI_PI_ID_FN")
RentCount=objRS("UI_RentCount_N")
CerRank=objRS("UI_CerRank_N")
'如果用户是供应商,取得供应商信息
strSQL="SELECT * FROM [ProviderInfo]"
objRS.Open strsQL,objConn,1,3
Provider="<select name=Provider><option value=0>不是供应商</option>"
For i=1 To objRS.RecordCount
If objRS("PI_ID_N")=ProviderID Then
Provider=Provider&"<option value="&objRS("PI_ID_N")&" selected>"&_
objRS("PI_Name_S")&"</option>"
Else
Provider=Provider&"<option value="&objRS("PI_ID_N")&">"&_
objRS("PI_Name_S")&"</option>"
End If
objRS.MoveNext
Next
Provider=Provider&"</select>"
objRS.Close
5.2.6 查看用户租赁信息截面及代码
用户租赁信息界面
用户可以在这里进行对自己租赁信息的查看,实现此功能,其代码,大致如下:
‘判断用户状态是否失效,若失效则返回错误ID 7
If IsEmpty(Session("UserID"))=True Then
Response.Write GetErr(7)
Response.End
End If
‘判断数据的传输是否正确
If IsNumeric(Request("id"))=False Or Request("id")="" Then
Response.Write GetErr(1)
Response.End
Else
'判断并标注超期的影片
strSQL="SELECT * FROM [Tenancy] WHERE TAC_StartTime_D IS NOT NULL AND”&_
” TAC_EndTime_D IS NULL"
Set objRS=Server.CreateObject("ADODB.RecordSet")
objRS.Open strSQL,objConn,1,3
Dim MsgUser
‘检测是否有超期的影片
For i=1 To objRS.RecordCount
‘若有则标注TAC_TimeOut_B=True
If DateDiff("d",DateAdd("d",objRS("TAC_Lease_N"),objRS("TAC_StartTime_D"))&_
,Now())>objRS("TAC_Lease_N") Then
strSQL="UPDATE [Tenancy] SET TAC_TimeOut_B=True,TAC_MsgUser_B”&_
”=True WHERE TAC_ID_N="&objRS("TAC_ID_N")
objConn.Execute(strSQL)
End If
objRS.MoveNext
Next
objRS.Close
'用户是否是管理员
Dim IsAdmin
strSQL="SELECT UI_IsAdmin_B FROM [UserInfo] WHERE UI_ID_N="&_
Session("UserID")
objRS.Open strSQL,objConn,1,3
IsAdmin=objRS("UI_IsAdmin_B")
objRS.Close
'若用户不是管理员,则判断其所浏览的交易记录是否是自己的
If IsAdmin=False Then
strSQL="SELECT TAC_UI_ID_FN FROM [Tenancy] WHERE TAC_ID_N="&_
Request("id")
objRS.Open strSQL,objConn,1,3
‘若交易记录不存在则输出错误信息
If objRS.BOF Or objRS.EOF Then
Response.Write GetErr(12)
objRS.Close
Set objRS=Nothing
CloseDatabase
Response.End
End If
‘若用户更改的不是自己的交易记录,则输出错误信息
If objRS("TAC_UI_ID_FN")<>Session("UserID") Then
Response.Write GetErr(1)
objRS.Close
Set objRS=Nothing
CloseDatabase
Response.End
End If
objRS.Close
End If
‘读取交易记录的相关信息
strSQL="SELECT * FROM [Tenancy],[UserInfo],[VideoInfo],[Payment],[TypeInfo] “&_
”WHERE TAC_ID_N="&Request("id")&" AND TAC_VI_ID_FN=VI_ID_N”&_
” AND TAC_UI_ID_FN=UI_ID_N AND VI_TI_ID_FN=TI_ID_N AND”&_
” VI_PMT_ID_FN=PMT_ID_N"
objRS.Open strSQL,objConn,1,3
‘若没有找到交易记录则输出错误信息
If objRS.BOF Or objRS.EOF Then
Response.Write GetErr(12)
Response.End
objRS.Close
Set objRS=Nothing
CloseDatabase
End If
'超期天数
Dim tmpTimeout
If IsNull(objRS("TAC_StartTime_D"))=False Then
tmpTimeout=DateDiff("d",DateAdd("d",objRS("TAC_Lease_N")&_
,objRS("TAC_StartTime_D")),Now())
If tmpTimeout<=0 Then
tmpTimeout=0
End If
Else
tmpTimeout=0
End If
'刷新影片状态记录
If IsNull(objRS("TAC_StartTime_D"))<>True Then
If tmpTimeout>objRS("TAC_Lease_N") Then
'若影片超出租期未还,则设定影片状态为超期
strSQL="UPDATE [Tenancy] SET TAC_TimeOut_B=True WHERE “&_
”TAC_ID_N="&Request("id")
objConn.Execute(strSQL)
End If
End If
'获取并判断用户租金
Dim tmpUserPayment
If IsNull(objRS("TAC_StartTime_D"))<>True Then
If objRS("TAC_TimeOut_B")=True Then
tmpUserPayment=objRS("PMT_Price_N")*DateDiff("d",&_
objRS("TAC_StartTime_D"),Now())+objRS("PMT_LateFee_N")*tmpTimeout
Else
tmpUserPayment=objRS("PMT_Price_N")*objRS("TAC_Lease_N")
End If
Else
tmpUserPayment=0
End If
'管理选项
Dim tmpCtr
If IsNull(objRS("TAC_StartTime_D"))=True Then
tmpCtr="[<a href=modifyRent.asp?action=CancelBooked&id="&_
Request("id")&">取消预订</a>]"
End IF
If IsAdmin=True Then
tmpCtr=tmpCtr&" [<a href=modifyRent.asp?action=CtrRent&id="&_
Request("id")&">用户起租/结算</a>]"
End If
%>
5.2.7 用户预定影片界面及代码
用户预定影片界面
此模块主要是提醒预定的相关信息,其功能实现的代码大致如下:
:
If IsEmpty(Session("UserID"))=True Then
Response.Write GetErr(7)
Response.End
End If
If IsNumeric(Request("id"))=False Or Request("id")="" Or &_
IsNumeric(Request("DayToRent"))=False Or Request("DayToRent")="" Then
Response.Write GetErr(11)
Response.End
End If
'用户是否是管理员
Dim IsAdmin
strSQL="SELECT UI_IsAdmin_B FROM [UserInfo] WHERE UI_ID_N="&Session("UserID")
Set objRS=Server.CreateObject("ADODB.RecordSet")
objRS.Open strSQL,objConn,1,3
IsAdmin=objRS("UI_IsAdmin_B")
objRS.Close
'判断此影片是否已租出
strSQL="SELECT VI_Status_N FROM [VideoInfo] WHERE VI_ID_N="&_
Request("id")&" AND VI_Status_N=3"
objRS.Open strSQL,objConn,1,3
If Not objRS.BOF Or Not objRS.EOF Then
ResultMsg("对不起!此影片已被出租!")
Response.End
Set objRS=Nothing
CloseDatabase
End If
objRS.Close
'如果用户不是管理员则判断是否有超期未还的影片
If IsAdmin<>True Then
strSQL="SELECT TAC_ID_N FROM [Tenancy] WHERE TAC_UI_ID_FN="&_
Session("UserID")&" AND (TAC_TimeOut_B=True AND TAC_Return_B=False)"
objRS.Open strSQL,objConn,1,3
If Not objRS.BOF Or Not objRS.EOF Then
Call ResultMsg("您有超期未还的影片!请您归还影片后再做预订!")
Response.End
Set objRS=Nothing
CloseDatabase
End If
objRS.Close
End If
If Request("IsBook")<>"" Then
Dim tmpTime
tmpTime=Now()
'将用户的预订写入数据库
strSQL="INSERT INTO [Tenancy] (TAC_VI_ID_FN,TAC_UI_ID_FN,”&_
”TAC_ReserveTime_D,TAC_TimeOut_B,TAC_MsgUser_B,TAC_Return_B,”&_
”TAC_StartTime_D,TAC_Lease_N,TAC_EndTime_D,TAC_UserPayment_N,”&_
”TAC_Status_N) VALUES("&Request("id")&","&Session("UserID")&",'"&tmpTime&_
"',False,False,False,NULL,"&Request("DayToRent")&",NULL,0,4)"
objConn.Execute(strSQL)
'读取交易号号(TAC_ID_N)
strSQL="SELECT * FROM [Tenancy] WHERE TAC_UI_ID_FN="&Session("UserID")&_
" AND TAC_ReserveTime_D=#"&tmpTime&"#"
objRS.Open strSQL,objConn,1,3
'写入影片状态
strSQL="UPDATE [VideoInfo] SET VI_Status_N=4 WHERE VI_ID_N="&_
objRS("TAC_VI_ID_FN")
objConn.Execute(strSQL)
Response.Write "<link href=style.css rel=stylesheet type=text/css>"
Response.Write "<br>"
Response.Write "<p align=center><b>您的预订已成功!</b>您的预订ID为:”&_
”<b><font color=red>"&objRS("TAC_ID_N")&"</font></b><br>”&_
”请您带此ID前去店铺取影片![<a href=vbscript:window.close()>”&_
”关闭</a>]</p>"
objRS.Close
Set objRS=Nothing
CloseDatabase
Else
Dim MovieTitle
strSQL="SELECT * FROM [VideoInfo] WHERE VI_ID_N="&Request("id")
Set objRS=Server.CreateObject("ADODB.RecordSet")
objRS.Open strSQL,objConn,1,3
MovieTitle=objRS("VI_Title_S")
objRS.Close
Set objRS=Nothing
CloseDatabase
%>
5.2.8 用户注销的代码分析
此模块的作用是注销用户的登录。其原理是结束用户的私有变量Session(“UserID”)。
此模块的具体实现方法如下:
<%
‘结束用户私有变量
Session.Abandon
‘重定向网页
Response.Redirect "index.asp"
%>
第六章节调试
判断数据是否符合规范
数据是否符合规范,一般从数据的类型、数据的长度、数据是否为空、数据是否存在特殊字符来进行判断。
数值数据类型,可以使用IsNumeric()函数进行判断。如果传入的数据不是数值类型,则此函数返回值为False,反之则为True。
数据长度的判断,可以使用Len()函数进行判断。此函数的作用是获得传入数据的长度。比如要判断UserName这个变量内容的长度是否大于20个字符,则可以使用Len(UserName)>20来判断。也可以使用其来判断空值:Len(UserName)=0。
空值的判断,可以使用Len(),也可以直接使用Request(“UserName”)=””来判断。有的读者会问,为什么不是使用IsEmpty()来判断?这是因为,IsEmpty()判断的是是否存在这个数据,也就是说,假如Dim UserName ,但是没有给UserName赋值,IsEmpty()函数返回的也是False。这点需要格外注意
在此一般遇到的问题如下:
1.数据库中的空值是一个很抽象的概念,空值是为Null,它和没有值不同。打个比方,比如说有一个瓶子。瓶子里边除了空气其他什么都没有,这是没有值;另外一个瓶子,里边是真空的,这叫空值。反应到程序上,也就是UI_Name_S=”” 与 UI_Name_S IS NULL是不同的两回事。假如我们要找出数据库中所有没有QQ号的用户,例:
strSQL=”SELECT * FROM [UserInfo] WHERE UI_QQ_S IS NULL”
其否定是IS NOT NULL。
2.对查询的值使用ORDER BY字句进行排序时,所排序的列必须在查询当中列出。例:
strSQL=”SELECT VI_Title_S, VI_AddTime_D FORM [VideoInfo] ORDER BY VI_AddTime_D”
对数据库中多张关系表进行查询时,若有字段重名,则一定要指定具体的字段名成。假如数据库中有User及Admin两表,User为父表,Admin为子表,通过ID关系,都包含有一个名为Status的字段,现在要列出所有Admin的Name及Status,则:
strSQL=”SELECT Name,[Admin].Status FROM [User],[Admin] WHERE [User].ID=[Admin].ID”
3,在进行调试的时候,我遇到了一个页面打不开,说是缺少一个可更新的查询,后来经过老师的指导,得到了解决的方法:
主要是数据库没有使用正确的方法的打开,正确的方法如下:
SQL=”UPDATE Products set unitprice =2:”
Set conn=server.createobject (“adodb.connection”)
Conn.mode=3 ‘3=admodereadwrite
Conn.open”mydsn”
Conn.execute(sql)
Conn.close
结论
至此,影片租赁系统中的客户界面部分已经完成了,本部分采用了软件工程的设计思想,本系统无人拷贝.在开发影片租赁系统客户部分的时候,从中明白了一个完善的系统的,数据库设计和安全体制的重要性。通过这次开发,使我对ASP与数据库的开发有了新的认识与了解
影片租赁系统客户部分的编写是在赵老师的知道下完成,虽然过程中的是比较苦的,但是再完成后,又觉得吃苦是必要的
结束语
经过两个多月的设计和开发,影片租赁系统客户部分基本开发完毕。其功能基本符合 现实工作中的实际需求,能够完成影片的查找与租赁等功能,使影片出租者方便进行影片的出租管理,和影片的管理,实现了影片管理的半自动化
但是由于毕业设计时间较短,所以该系统还有许多不尽如人意的地方,比如用户界面不够美观,出错处理不够等多方面问题。这些都有待进一步改善。
在本次毕业设计中,我从指导老师邓老师身上学到了很多东西。老师认真负责的工作态度,严谨的治学精神和深厚的理论水平都使我收益匪浅。他们无论在理论上还是在实践中,都给与我很大的帮助,使我得到不少的提高这对于我以后的工作和学习都有一种巨大的帮助,感谢他们耐心的辅导。
致谢
在这次毕业设计过程中,我学到了很多的知识,也掌握了很多设计和操作技巧,尽管仍有很多不足,但我会不断改进,继续进步。在设计过程中,我得到了很多朋友的帮助和邓老师的指点,才得以顺利完成,他们给我提供了很多有关网页设计的书和材料,并抽出时间帮我修改与纠正,在此表示衷心的感谢!
参考文献
软件工程的开发
数据库开发实例精粹等书籍
网络设计程序ASP
网络数据库应用教程等书籍