在大型的社區系統中,有很多的用戶高級功能需要實現.例如查詢用戶所在的版面,給特定的用戶發送短消息, 查詢用戶的信息,用戶等級管理等等.這些高級功能的實現有很多的方法,比如 1,用數據庫實現.這也是最簡單且最常用的方案.它的實現原理如下: 將用戶的信息存如規劃好的數據庫中,若用戶的狀態改變則修改數據庫.若有對該用戶的查詢請求則申請對數 據庫的調用.看下面的一個表的示例 CREATE TEBLE user_info (user_id mediumInt not null , user_id Char not null , nick_name Chaer not null , user_sex char not null , user_level smallInt not null default 3, login_time Time default time(), logout_time Time default time(), user_position Char default "大廳", ....... ....... ) 好了,上面的這個表格只是一個簡單的例子,它用來保存用戶信息的方方面面.在一個用戶登陸(login)的同時 對該表某些表項做一些初始化,當用戶狀態改變時對該表的相應表項做必要的修改,然后在應用中調用該表的相 關的表項.例如查看用戶的位置select use_position from user_info where user_name="user_name".這種方案 的最大的缺點在于系統的開銷.想象一下當大量的用戶在查詢時要打開多少個數據庫的連接進程.而且每一次的用 戶狀態改變,比如從一個版面到另一個版面的時候都需要對數據庫進行修改.這對于大型的系統是不實用的. 2,將一個功能模塊封裝,調入內存.這是最佳的解決方案,比如用isAPI來實現,或者用Java來實現.它的速度非常 的快,且只需要在系統的初始化時對它進行初始化,當用戶登陸(login)和改變狀態時調用相關的方法(method)來 修改表項就行了.我將在本文的實現篇中給出相關的介紹.但這種方案在實現的時候相對較難 3,就是本文提到的用二維數組來實現了.它的第一維用來定義用戶的信息,然后將所有的用戶組合為一個二維的 數組.再將該數組保存到一個application的二維數組中,由于application變量的特性.它將常駐于服務器端內存中 當需要改變或者是調用時將該數組本地化后,做相應的改變再回存到application數組變量中.它的結構如下 1│姓名│呢稱│級別│方位│登陸時間│預留位│預留位│ 2│姓名│呢稱│級別│方位│登陸時間│預留位│預留位│ 3│姓名│呢稱│級別│方位│登陸時間│預留位│預留位│ 4│姓名│呢稱│級別│方位│登陸時間│預留位│預留位│ 5│姓名│呢稱│級別│方位│登陸時間│預留位│預留位│ ...... ...... 當用戶登陸時我們用我們自定義的一個init()函數來在第二維加入一個數組元素,等用戶離開時在用一個update() 函數將相應的用戶項回存如數據庫中或者是文本文件中.其實更好的方案并非用二維數組,而是用一個結構數組, 就是創建一個用戶結構再將其組合為一個數組,例如(為了方便采用的描述語言) object use_info { int user_id; char user_name=""; char user_nickname=""; int user_leverl=3; char user_postion=""; ...... ...... send_message(); ...... } end object; 每當一個用戶登陸時將它對象化, var user=new user_info; user.user_id=1; user.user_name="姓名"; user.usr_nickname="呢稱"; user.user_position=""; ...... ...... var application("user_counter"); application("user_info")(application("user_counter"))=user; application("user_counter")++; ...... ...... 現在如果你要查詢一個名字為張三的用戶的位子, for (i=0;i<application("user_counter");i++) { var user=new user_info; user=application("user_info")(i); if user.user_name=="張三" print user.user_position; } 但是如我們所知,vbscript并沒有創建對象的功能,用jscript可以定義對象,但沒有辦法將它保存到 application數組中,應為它認為application變量是一個特殊的變量.你不能將數組對象賦值給它,那樣 就會導致類型出錯.所以我們只好用vbscript的二維數組來實現了.其實思路是相同的.(下面是標準的vbscript 語句) sub system_init() dim user_info(100) dim application("user_counter") application("user_info")=user_info application("user_counter")=0 end sub sub user_init() set rs =server.createobject("RecordSet") strpath="user_info.mdb" rs.open user_info,strpath,,,cmdTable '打開數據庫進行初始化 dim user(10) user(0)=application("user_counter") user(1)=rs("user_name") user(2)=rs("user_nickname") user(3)=rs("user_level") user(4)=time()'登陸的時間 ...... ...... dim user_info(100) user_info=application("user_info")'將application數組本地化 user_counter=application("user_counter") user_info(user_counter)=user user_counter=user_counter+1 application.locak application("user_info")=user_info application("user_counter")=user_counter application.unlock end sub 現在要查詢用戶張三的登陸時間 for i=0 to application("user_counter")-1 if application("user_info")(i)(1)="張三" then response.write application("user_info")(i)(4) end if end for 下面我們再來看其它的高級功能的實現 1,呼叫特定的用戶 待續
|