在大型的社區(qū)系統(tǒng)中,有很多的用戶高級功能需要實現(xiàn).例如查詢用戶所在的版面,給特定的用戶發(fā)送短消息, 查詢用戶的信息,用戶等級管理等等.這些高級功能的實現(xiàn)有很多的方法,比如 1,用數(shù)據(jù)庫實現(xiàn).這也是最簡單且最常用的方案.它的實現(xiàn)原理如下: 將用戶的信息存如規(guī)劃好的數(shù)據(jù)庫中,若用戶的狀態(tài)改變則修改數(shù)據(jù)庫.若有對該用戶的查詢請求則申請對數(shù) 據(jù)庫的調(diào)用.看下面的一個表的示例 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)的同時 對該表某些表項做一些初始化,當(dāng)用戶狀態(tài)改變時對該表的相應(yīng)表項做必要的修改,然后在應(yīng)用中調(diào)用該表的相 關(guān)的表項.例如查看用戶的位置select use_position from user_info where user_name="user_name".這種方案 的最大的缺點在于系統(tǒng)的開銷.想象一下當(dāng)大量的用戶在查詢時要打開多少個數(shù)據(jù)庫的連接進(jìn)程.而且每一次的用 戶狀態(tài)改變,比如從一個版面到另一個版面的時候都需要對數(shù)據(jù)庫進(jìn)行修改.這對于大型的系統(tǒng)是不實用的. 2,將一個功能模塊封裝,調(diào)入內(nèi)存.這是最佳的解決方案,比如用isAPI來實現(xiàn),或者用Java來實現(xiàn).它的速度非常 的快,且只需要在系統(tǒng)的初始化時對它進(jìn)行初始化,當(dāng)用戶登陸(login)和改變狀態(tài)時調(diào)用相關(guān)的方法(method)來 修改表項就行了.我將在本文的實現(xiàn)篇中給出相關(guān)的介紹.但這種方案在實現(xiàn)的時候相對較難 3,就是本文提到的用二維數(shù)組來實現(xiàn)了.它的第一維用來定義用戶的信息,然后將所有的用戶組合為一個二維的 數(shù)組.再將該數(shù)組保存到一個application的二維數(shù)組中,由于application變量的特性.它將常駐于服務(wù)器端內(nèi)存中 當(dāng)需要改變或者是調(diào)用時將該數(shù)組本地化后,做相應(yīng)的改變再回存到application數(shù)組變量中.它的結(jié)構(gòu)如下 1│姓名│呢稱│級別│方位│登陸時間│預(yù)留位│預(yù)留位│ 2│姓名│呢稱│級別│方位│登陸時間│預(yù)留位│預(yù)留位│ 3│姓名│呢稱│級別│方位│登陸時間│預(yù)留位│預(yù)留位│ 4│姓名│呢稱│級別│方位│登陸時間│預(yù)留位│預(yù)留位│ 5│姓名│呢稱│級別│方位│登陸時間│預(yù)留位│預(yù)留位│ ...... ...... 當(dāng)用戶登陸時我們用我們自定義的一個init()函數(shù)來在第二維加入一個數(shù)組元素,等用戶離開時在用一個update() 函數(shù)將相應(yīng)的用戶項回存如數(shù)據(jù)庫中或者是文本文件中.其實更好的方案并非用二維數(shù)組,而是用一個結(jié)構(gòu)數(shù)組, 就是創(chuàng)建一個用戶結(jié)構(gòu)再將其組合為一個數(shù)組,例如(為了方便采用的描述語言) object use_info { int user_id; char user_name=""; char user_nickname=""; int user_leverl=3; char user_postion=""; ...... ...... send_message(); ...... } end object; 每當(dāng)一個用戶登陸時將它對象化, 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")++; ...... ...... 現(xiàn)在如果你要查詢一個名字為張三的用戶的位子, 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并沒有創(chuàng)建對象的功能,用jscript可以定義對象,但沒有辦法將它保存到 application數(shù)組中,應(yīng)為它認(rèn)為application變量是一個特殊的變量.你不能將數(shù)組對象賦值給它,那樣 就會導(dǎo)致類型出錯.所以我們只好用vbscript的二維數(shù)組來實現(xiàn)了.其實思路是相同的.(下面是標(biāo)準(zhǔn)的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 '打開數(shù)據(jù)庫進(jìn)行初始化 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數(shù)組本地化 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 現(xiàn)在要查詢用戶張三的登陸時間 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 下面我們再來看其它的高級功能的實現(xiàn) 1,呼叫特定的用戶 待續(xù)
|