1、lua學(xué)習(xí)之入門(一)----環(huán)境搭建
2、lua學(xué)習(xí)之入門(二)----基礎(chǔ)語(yǔ)法1
3、lua學(xué)習(xí)之入門(二)----基礎(chǔ)語(yǔ)法2
4、lua學(xué)習(xí)之入門(三)----函數(shù)
????? 編程語(yǔ)言之所以叫做語(yǔ)言,因?yàn)樗哂姓Z(yǔ)言的特性,我們回憶一下學(xué)英語(yǔ)的過程,首先是學(xué)ABC字母,然后是單詞,然后是句子,最后到文章..其實(shí)編程語(yǔ)言也具有這樣的特性,標(biāo)識(shí)符等于"字母",值和變量還有API等于"單詞",語(yǔ)句塊或函數(shù),甚至是類等于"句子",一個(gè)程序就是一篇"文章"..今天我學(xué)習(xí)的是"句子",也就是語(yǔ)句塊.
????????在LUA里語(yǔ)句塊是由以下幾個(gè)構(gòu)成的
第一:?? 語(yǔ)句組Chunks??
chunk?::
=
?{stat?[`;′]}

這兒不允許有空的語(yǔ)句段,所以?
'
;;
'
?是非法的。?

lua?把一個(gè)?chunk?當(dāng)作一個(gè)擁有不定參數(shù)的匿名函數(shù)(參見?§
2.5
.
9
)處理。正是這樣,chunk?內(nèi)可以定義局部變量,接收參數(shù),并且返回值。?

chunk?可以被保存在一個(gè)文件中,也可以保存在宿主程序的一個(gè)字符串中。當(dāng)一個(gè)?chunk?被執(zhí)行,首先它會(huì)被預(yù)編譯成虛擬機(jī)中的指令序列,然后被虛擬機(jī)解釋運(yùn)行這些指令。?

chunk?也可以被預(yù)編譯成二進(jìn)制形式;細(xì)節(jié)參考程序?luac。用源碼形式提供的程序和被編譯過的二進(jìn)制形式的程序是可以相互替換的;?Lua?會(huì)自動(dòng)識(shí)別文件類型并做正確的處理。?
在手冊(cè)里,只有這簡(jiǎn)短的解析,對(duì)于一個(gè)初學(xué)者,其實(shí)真是很抽象(某XX教授:手冊(cè)有名字給你叫手冊(cè),用來查不是用來學(xué)的..我曰:沒有其他學(xué)習(xí)資料只有手冊(cè)的時(shí)候,它就是最好的學(xué)習(xí)資料.你是教授,級(jí)別高,可以單看代碼研究,偶水平差只能折騰手冊(cè)!)
Chunks其實(shí)是一個(gè)代名,
Chunk可以是簡(jiǎn)單的一句print("haha");也可以是一個(gè)函數(shù)外加一個(gè)輸出,輸入語(yǔ)句,甚至可以是一個(gè)文件,例如我們第一篇測(cè)試時(shí)候的test.lua....你可以簡(jiǎn)單的理解為
Chunk是統(tǒng)稱..代表著一個(gè)由語(yǔ)句組成的集合..
第二:語(yǔ)句塊blocks
語(yǔ)句塊是一列語(yǔ)句段;從語(yǔ)法上來說,一個(gè)語(yǔ)句塊跟一個(gè)?chunk?相同:?

????block?::=?chunk

一個(gè)語(yǔ)句塊可以被顯式的寫成一個(gè)單獨(dú)的語(yǔ)句段:?

????stat?::=?do?block?end

顯式的語(yǔ)句塊對(duì)于控制變量的作用范圍很有用。有時(shí)候,顯式的語(yǔ)句塊被用來在另一個(gè)語(yǔ)句塊中插入?return?或是?break?

代碼塊(語(yǔ)句塊):指一個(gè)控制結(jié)構(gòu)內(nèi),一個(gè)函數(shù)體,或者一個(gè)
chunk(變量被聲明的那個(gè)文件或者文本串)。
第三:控制結(jié)構(gòu)
??? 注意:??? 控制結(jié)構(gòu)的條件表達(dá)式結(jié)果可以是任何值,Lua認(rèn)為false和nil為假,其他值為真。
??????? 大學(xué)時(shí)候,老師跟我說,所有編程語(yǔ)言都是由三種結(jié)構(gòu)組成,順序結(jié)構(gòu),選擇結(jié)構(gòu),循環(huán)結(jié)構(gòu).個(gè)人認(rèn)為..這樣設(shè)置的原因,和人的生活有很大關(guān)系,我們從生老病死,這個(gè)就是一個(gè)最簡(jiǎn)單的順序結(jié)構(gòu).從生存到消失.人都需要的經(jīng)歷,但在生老病死的過程中我們又要面臨選擇..老爸老媽沒得選擇...你還沒生,就是你還不存在,所以你沒選擇的權(quán)利,那么就是說選擇是建立在已經(jīng)存在的基礎(chǔ)上的,所以編程就有了if(某某XX某某某)某某勝利..所以這個(gè)選擇必須要是有選擇前提的,如果這個(gè)選擇是永遠(yuǎn)都沒機(jī)會(huì)選擇..(例如選擇老母- -!沒得選的)這個(gè)選擇就沒有了選擇的意義了,還有循環(huán),就是重復(fù)實(shí)現(xiàn)某事情,例如讀書,7點(diǎn)起床然后上課,然后下課,然后沖涼,然后睡覺,然后又重復(fù)到7點(diǎn)起床然后上課,然后下課,然后沖涼,然后睡覺,然后又重復(fù)到7點(diǎn)起床..............,這就是一個(gè)循環(huán).你必須重復(fù)地做某些事情的時(shí)候,就可以用循環(huán)這個(gè)結(jié)構(gòu)是實(shí)現(xiàn)重復(fù)做某事.
???????? 既然人的一生都是用這三中結(jié)構(gòu)描述的,程序的出現(xiàn),目的就是幫助人,減輕人的工作量,做這些結(jié)構(gòu)也就是編程語(yǔ)言中的原住民了.
LUA的選擇結(jié)構(gòu),貌似只有一種就是if
stat?::=?if?exp?then?block?{elseif?exp?then?block}?[else?block]?end

簡(jiǎn)單的一句,就表明了,if-else支持嵌套elseif? 寫法有點(diǎn)像VB....
if?a>10?then??print("超過10歲")?
else?print("小于10歲")?
?? end這個(gè)就是一個(gè)簡(jiǎn)單的選擇結(jié)構(gòu)...有編程基礎(chǔ)的一看就懂了.
LUA的循環(huán)結(jié)構(gòu),有三種,分別是
while exp
do block
end ,
repeat block
until exp ,
for Name `
=′ exp `
,′ exp [`
,′ exp]
do block
end
1.
while exp
do block
end
while?condition?do

????statements;

end;

2.
repeat block
until exp
repeat

????statements;

until?conditions;
有點(diǎn)類似do?while3.for....在LUA里for是有兩種情況,如果用C#來描述的話,LUA的for含蓋了C#里的for和foreach兩種,
????? 數(shù)值for
范型
for循環(huán):
for?namelist?in?explist1?do?block?end

這里和C#的foreach基本一樣
c#:
foreach(DataRow?ss?in?dataTbale.Rows)
{
??//輸出ss[1]
}

LUA里
days?=?{"Sunday",?"Monday",?"Tuesday",?"Wednesday",

??????????????"Thursday",?"Friday",?"Saturday"}

for?v?in?ipairs(days)?do

????print(days[v]);

end?

只要自己測(cè)試一下就知道結(jié)果了.
反正就是一個(gè)傳統(tǒng)循環(huán),一個(gè)迭代循環(huán)還需要補(bǔ)充一個(gè)語(yǔ)句就是break,和return
break語(yǔ)句用來退出當(dāng)前循環(huán)(for、repeat、while)。在循環(huán)外部不可以使用。

return用來從函數(shù)返回結(jié)果,當(dāng)一個(gè)函數(shù)自然結(jié)束時(shí),結(jié)尾會(huì)有一個(gè)默認(rèn)的return。(這種函數(shù)類似pascal的過程(procedure))

Lua語(yǔ)法要求break和return只能出現(xiàn)在block的結(jié)尾一句(也就是說:作為chunk的最后一句,或者在end之前,或者else前,或者until前),例如:

local?i?=?1

while?a[i]?do

????if?a[i]?==?v?then?break?end

????i?=?i?+?1

end

有時(shí)候?yàn)榱苏{(diào)試或者其他目的需要在block的中間使用return或者break,可以顯式的使用do..end來實(shí)現(xiàn):

function?foo?()

????return????????????--<<?SYNTAX?ERROR

????--?'return'?is?the?last?statement?in?the?next?block

????do?return?end????????--?OK

????
???????????????--?statements?not?reached

end

基本的結(jié)構(gòu)我們都學(xué)習(xí)完了,學(xué)到這里我們基本的LUA都能看懂了,也不能算懂,起碼知道LUA的大概意思了,基礎(chǔ)語(yǔ)法(完)
明鏡臺(tái)
1、lua學(xué)習(xí)之入門(一)----環(huán)境搭建
2、lua學(xué)習(xí)之入門(二)----基礎(chǔ)語(yǔ)法1
3、lua學(xué)習(xí)之入門(二)----基礎(chǔ)語(yǔ)法2
4、lua學(xué)習(xí)之入門(三)----函數(shù)
???? 學(xué)習(xí)LUA第6個(gè)小時(shí)了,這是第2篇文章,也是我今天學(xué)習(xí)的最后總結(jié)了,LUA我也是個(gè)初學(xué)者,我目標(biāo)只是想盡可能的把自己學(xué)習(xí)的一些想法表現(xiàn)出來.可能寫的沒有那些大蝦們好,大蝦們的生動(dòng).但至少是我個(gè)人的寫作,本人很不喜歡轉(zhuǎn)載的,轉(zhuǎn)載不如直接去別人BLOG看..再一次聲明..我是LUA初學(xué)者,一個(gè)初學(xué)者寫給初學(xué)者的....廢話不說..入正題.
?????
??????? 任何語(yǔ)言,首先要明白的是 標(biāo)識(shí)符 的命名規(guī)則,LUA的規(guī)則和C語(yǔ)言的沒太大分別都是由:字母,數(shù)字,下劃線組成,而且不能以數(shù)字開頭..貌似我會(huì)的編程語(yǔ)言都是這樣的規(guī)定..?? 這個(gè)沒啥技術(shù)難度....靠死記的..
??????? LUA的字符串表示是可以用單引號(hào)或者雙引號(hào)的...這點(diǎn)跟JAVASCRIPT是一樣的,
??????? 在LUA手冊(cè)里有一段這樣的東西
?????a?
=
?
'
alo\n123"
'
?????a?
=
?
"
alo\n123\
""
?????a?
=
?
'
\97lo\10\04923"
'
?????a?
=
?[[alo
?????
123
"
]]
?????a?
=
?[
==
[
?????alo
?????
123
"
]==]
手冊(cè)里的解釋是這樣的
字符串還可以用一種長(zhǎng)括號(hào)括起來的方式定義。我們把兩個(gè)正的方括號(hào)間插入?n?個(gè)等號(hào)定義為第?n?級(jí)正長(zhǎng)括號(hào)。就是說,0?級(jí)正的長(zhǎng)括號(hào)寫作?[[?,一級(jí)正的長(zhǎng)括號(hào)寫作?[=[?,如此等等。反的長(zhǎng)擴(kuò)展也作類似定義;舉個(gè)例子,4?級(jí)反的長(zhǎng)括號(hào)寫作?]====]?。一個(gè)長(zhǎng)字符串可以由任何一級(jí)的正的長(zhǎng)括號(hào)開始,而由第一個(gè)碰到的同級(jí)反的長(zhǎng)括號(hào)結(jié)束。整個(gè)詞法分析過程將不受分行限制,不處理任何轉(zhuǎn)意符,并且忽略掉任何不同級(jí)別的長(zhǎng)括號(hào)。這種方式描述的字符串可以包含任何東西,當(dāng)然特定級(jí)別的反長(zhǎng)括號(hào)除外。?

另一個(gè)約定是,當(dāng)正的長(zhǎng)括號(hào)后面立即跟了一個(gè)換行符,這個(gè)換行符就不包含在這個(gè)字符串內(nèi)。舉個(gè)例子,假設(shè)一個(gè)系統(tǒng)使用?ASCII?碼(這時(shí),'a'?編碼為?97?,換行符編碼為?10?,'1'?編碼為?49?),下面五種方式描述了完全相同的字符串:?

很別扭啊手冊(cè)里的介紹是這個(gè)a所代表的字符串顯示都是一樣的...感覺犯暈啊...
手冊(cè)例子想表達(dá)的意思我解析一下,
a = 'alo\n123"'? 這個(gè)字符串是用單引號(hào)括起來的,123后面跟了個(gè)".....想表達(dá)的意思就是說,如果用單引號(hào)作為字符串的引用的話,內(nèi)部的雙引號(hào)做雙引號(hào)處理,
a = "alo\n123\"" 這個(gè)字符串則是用雙引號(hào)括起來的,為了解決沖突,就要使用轉(zhuǎn)義字符\"去代表"
a = '\97lo\10\04923"'? 這個(gè)其實(shí)就是ASCII碼轉(zhuǎn)義而已..
最令人犯暈的是下面..
這個(gè)想表達(dá)啥呢?其實(shí)這個(gè)作用和C#里的@""有點(diǎn)類似..有點(diǎn)像格式輸出吧,,
里面的思想有個(gè)靈活的配對(duì),"[["? 在手冊(cè)里有個(gè)名字,叫長(zhǎng)括號(hào),而在"[==["中間的等號(hào)個(gè)數(shù)代表多少級(jí)的長(zhǎng)括號(hào),沒有等號(hào)為0級(jí),1個(gè)等號(hào)為1級(jí),類推下去.
開始在代碼里,我以為這里"級(jí)"的意義在于這個(gè)字符串占多少行的意思,但是經(jīng)過我代碼的測(cè)試原來沒任何關(guān)系..
依照我這個(gè)初學(xué)者的猜測(cè)...設(shè)置這些的意義,目的就是一個(gè)避免字符串內(nèi)過多的使用轉(zhuǎn)義字符吧,LUA的目標(biāo)是要做嵌入腳本語(yǔ)言,
例如有個(gè)游戲的對(duì)白,
小孩說:"很牛啊"
牛說:"不牛"
牛說:"]]"
小孩說:"]=]"將以上字符
a=[==[
小孩說:"很牛啊"
牛說:"不牛"
牛說:"]]"
小孩說:"]=]"]==]
這樣在[==[里就可以使用任何的字符串表達(dá)符,提供了更大的靈活性.
后來我咨詢了下LUA高手他給我的答復(fù)如下
這個(gè)是5.1版本新加的功能,我想主要的作用是屏蔽轉(zhuǎn)義字符的作用的,在5.0的時(shí)候,我們寫lua都需要自己可意去回避一些轉(zhuǎn)義字符..這個(gè)只是我個(gè)人想法,你可以問問其他人,目前我實(shí)際應(yīng)用的開發(fā)都是5.0居多,這個(gè)是5.1新加的,我也不是很確定,但照字面意思..就算不全對(duì),也差不多了看來我的猜想是正確的.
變量
LUA稱為腳本語(yǔ)言,那么就注定了他的變量是弱類型的,就是說變量沒有類型,至少我認(rèn)識(shí)的腳本語(yǔ)言JAVASCRIPT就是沒類型的.所以姑且把腳本語(yǔ)言定義為變量沒有類型的語(yǔ)言就是腳本語(yǔ)言...(某XX教授:你丫的亂下定義誤人子弟!..純粹是幫助記憶...別教真...別教真).
?????????????????????????????????????
變量沒有類型,有類型的只是值 (腳本語(yǔ)言的特點(diǎn))?????????
Lua?中有八種基本類型:?nil,?boolean,?number,?string,?function,?userdata,?thread,?and?table.?Nil?類型只有一種值?nil?,它的主要用途用于標(biāo)表識(shí)和別的任何值的差異;通常,當(dāng)需要描述一個(gè)無意義的值時(shí)會(huì)用到它。?Boolean?類型只有兩種值:false?和?true。?nil?和?false?都能導(dǎo)致條件為假;而另外所有的值都被當(dāng)作真。?Number?表示實(shí)數(shù)(雙精度浮點(diǎn)數(shù))。(編譯一個(gè)其它內(nèi)部數(shù)字類型的?Lua?解釋器是件很容易的事;比如把內(nèi)部數(shù)字類型改作單精度浮點(diǎn)數(shù)或長(zhǎng)整型。參見文件?luaconf.h?。)?String?表示一串字符的數(shù)組。?Lua?是?8-bit?clean?的:字符串可以包含任何?8?位字符,包括零結(jié)束符?('\0')? userdata 類型用來將任意 C 數(shù)據(jù)保存在 Lua 變量中。這個(gè)類型相當(dāng)于一塊原生的內(nèi)存,除了賦值和相同性判斷,Lua 沒有為之預(yù)定義任何操作。然而,通過使用
metatable (元表) ,程序員可以為 userdata 自定義一組操作. userdata 不能在 Lua 中創(chuàng)建出來,也不能在 Lua 中修改。這樣的操作只能通過 C API。這一點(diǎn)保證了宿主程序完全掌管其中的數(shù)據(jù)。
大家都知道,C語(yǔ)言里有幾個(gè)特別的數(shù)據(jù)構(gòu)造,例如,結(jié)構(gòu)體,共用體等,這個(gè)
userdata 類型其實(shí)就滿足結(jié)構(gòu)體傳值的功能的數(shù)據(jù)類型,至少我現(xiàn)在是這樣理解的..至于元表我還沒有接觸,暫時(shí)將
userdata 類型等同于一個(gè)只讀類型.
Lua 中有三類變量:全局變量,局部變量,還有 table 的域。 其實(shí)今天大多的時(shí)候都花費(fèi)在字符串里,但是一種語(yǔ)言來說,字符也是一個(gè)很重要的重點(diǎn),例如C#基本提供了每個(gè)類都是 ToString()方法,C語(yǔ)言,單獨(dú)用一章介紹字符串,數(shù)據(jù)結(jié)構(gòu)里也獨(dú)立一個(gè)章專門說字符串,所以這個(gè)字符串是在我們?nèi)粘i_發(fā)中經(jīng)常用到的,對(duì)它理解得深其實(shí)是有好處的...今天就到這里
明鏡臺(tái)
絕對(duì)原創(chuàng)
1、lua學(xué)習(xí)之入門(一)----環(huán)境搭建
2、lua學(xué)習(xí)之入門(二)----基礎(chǔ)語(yǔ)法1
3、lua學(xué)習(xí)之入門(二)----基礎(chǔ)語(yǔ)法2
4、lua學(xué)習(xí)之入門(三)----函數(shù)
要學(xué)習(xí)編程,必須的一肯定是編譯工具,和一些調(diào)試工具,我使用的Lua-5.1.4下載地址:http://www.lua.org/ftp/lua-5.1.4.tar.gz,
接觸未知道的東西應(yīng)該怎么做,肯定是找GOOGLE咯,一搜索....網(wǎng)上教我是這樣做的的:
(來自http://bbs.luaer.cn/read-Lua-tid-105.html)
(1) 下載Lua壓縮包,下載頁(yè)面是http://www.lua.org/download.html 最新版本是lua-5.1.2
也可以點(diǎn)擊這里直接下載:http://www.lua.org/ftp/lua-5.1.2.tar.gz? 它的體積很小,只有210K
(2)解壓文件,比如解壓到 D:/lua-5.1.2 文件夾內(nèi)(以下均以此路徑為例)。
(3)在 D:/lua-5.1.2內(nèi),存在名為 /etc的子目錄。在此目錄下找到 luavs.bat 文件,并將它復(fù)制到 D:/lua-5.1.2 中。
(4)雙擊執(zhí)行 luavs.bat 批處理文件,如果執(zhí)行成功,在 D:/lua-5.1.2/src 文件夾中會(huì)存在 luac.exe 和 lua.exe兩個(gè)文件。
(5)將 D:/lua-5.1.2/src 加入到系統(tǒng)路徑中。
(6)檢測(cè)Lua是否安裝成功:
在"開始"--"運(yùn)行"處輸入 lua 然后回車,若出現(xiàn)cmd控制臺(tái)界面且含有"[backcolor=rgb(255,]Lua 5.1.2"之類的文字,則說明Lua已經(jīng)成功安裝。如果提示沒有找到該命令,請(qǐng)檢查D:/lua-5.1.2/src 文件夾中是否存在 luac.exe 和 lua.exe 兩個(gè)文件,并確保已將 D:/lua-5.1.2/src 加入到系統(tǒng)路徑中。
教的是5.1.2,我用的是5.1.4....相對(duì)我這種初學(xué)者來說,沒多大分別..
所以我照著做了....
運(yùn)行luavs.bat
一閃,完全不知道什么事情,打開E:\lua-5.1.4\src(我放在E盤).什么都沒發(fā)生.好你有種你閃,我就不讓你閃,我->開始->運(yùn)行 CMD ->E: -> CD E:\lua-5.1.4->luavs.bat/得到的結(jié)果....LINK失敗等一大堆信息.....突然腦袋一片空白...咋辦...再試..認(rèn)真看了出錯(cuò)信息..原來...這個(gè)BAT是一個(gè)起編譯的作用的...我用我裝的VS2008編譯你試試吧!!死馬當(dāng)活馬醫(yī),開始->程序->Microsoft Visual Studio 2008->Visual Studio Tools->Visual Studio 2008 命令提示 輸入CD E:\lua-5.1.4->E:->luavs.bat
??? OK....成功生成luac.exe,lua.exe....進(jìn)行下一步打開環(huán)境變量->系統(tǒng)變量->Path加上E:\lua-5.1.4\SRC再去 CMD里,輸入LUA.....得到以下結(jié)果是LUA的版權(quán)信息...很好證明環(huán)境已經(jīng)成功搭建....我們可以開始下一步工作...
然后我們?cè)谟浭卤鞠戮帉懸粋€(gè)
print("-----------------------------");
print("測(cè)試LUA~~~梁?jiǎn)谭?009");
print("-----------------------------");
并保存為test.lua
然后在CMD下運(yùn)行 lua h:\test.lua
----------------------------------------
測(cè)試LUA~~~梁?jiǎn)谭?009
----------------------------------------
GOOD JOB.......我們終于成功地跑起第一個(gè)LUA了,激動(dòng)吧!!
明鏡臺(tái)
摘要: Boost 類庫(kù)是個(gè)開源的類庫(kù),傳說中的準(zhǔn)標(biāo)準(zhǔn)庫(kù)這下將會(huì)是我閱讀Boost 多線程源代碼的心得.費(fèi)話少說,在使用BOOST的多線程我們都會(huì)引入boost/thread.hpp這一個(gè)文件好我們先找到這個(gè)文件將它打開?1//?Copyright?(C)?2001-2003?2//?William?E.?Kempf?3//?(C)?Copyright?2008?Anthony?Williams?4//?...
閱讀全文
執(zhí)行審核上則是每處理一個(gè)環(huán)節(jié),就插入一個(gè)環(huán)節(jié)的信息.
我個(gè)人認(rèn)為實(shí)現(xiàn)審核的代碼使用存儲(chǔ)過程去實(shí)現(xiàn)要比用C#代碼去實(shí)現(xiàn)要好,至于用事務(wù)處理感覺還是差點(diǎn),因?yàn)槿绻粋€(gè)系統(tǒng)的事務(wù)處理過多,會(huì)造成處理緩慢,而用C#代碼去實(shí)現(xiàn),則需要進(jìn)行多次的查詢數(shù)據(jù)庫(kù),操作過程也比較復(fù)雜..所以我覺得還是用存儲(chǔ)過程去實(shí)現(xiàn)是最理想的.
?1
Create
??
procedure
?ExecFlowAuditPass
?2
(
?3
@AuditMainID
?
int
,
?4
@UserID
?
varchar
(
100
),
?5
@AuditOpinion
?
ntext
,
?6
@Auditstatus
?
int
?7
)
?8
As
?9
--
獲取最后審核的節(jié)點(diǎn)
10
declare
?
@posid
?
int
11
select
?
@posid
?
=
?
max
(Sequence)?
from
?審核子表?
where
?MainID
=
?
@AuditMainID
12
--
獲取最大審核的節(jié)點(diǎn)
13
declare
?
@maxposid
?
int
14
select
?
@maxposid
=
max
(Sequence)?
from
?流程子表?
where
?MainID
=
?
@AuditMainID
15
--
獲取將審核節(jié)點(diǎn)角色資料
16
declare
?
@UserGroupID
?
int
17
select
?
@UserGroupID
?
=
?UserGroupID?
from
?審核子表?
where
?MainID
=
?
@AuditMainID
?
and
?Sequence
=
@posid
+
1
18
--
角色不符
19
if
?(
select
?
count
(
*
)?
from
?員工表?
where
?員工ID
=
@UserID
?
and
?角色I(xiàn)D?
=
?
@UserGroupID
)
=
0
20
begin
21
??
select
?
*
?
from
?審核子表?
where
??MainID
=
?
@AuditMainID
22
??
print
?
-
1
;
23
??
return
?
-
1
;
24
end
25
--
角色符合執(zhí)行
26
if
?
@Auditstatus
?
=
1
27
begin
28
insert?
into
?流程子表(MainID,AuditOpinion,Auditstatus,Sequence,AuditID,CreateDate,角色I(xiàn)D)?
values
(
@AuditMainID
,
@AuditOpinion
,
1
,
@posid
+
1
,
@UserID
,
getdate
(),
@UserGroupID
)
29
???????????
if
?
@posid
?
+
1
?
=
?
@maxposid
30
????????????
begin
31
?????????????????
update
?審核主表?
set
?Auditstatus?
=
?
3
?
where
?
[
ID
]
=
@AuditMainID
?
32
?????????????
end
33
end
34
else
35
begin
36
?????????????????? insert?
into
?流程子表(MainID,AuditOpinion,Auditstatus,Sequence,AuditID,CreateDate,角色I(xiàn)D)?
values
(
@AuditMainID
,
@AuditOpinion
,
0
,
@posid
+
1
,
@UserID
,
getdate
(),
@UserGroupID
)
37
????????????????
update
?審核主表?
set
?Auditstatus?
=
?
2
?
where
?
[
ID
]
=
@AuditMainID
?
38
end
這個(gè)就是執(zhí)行審核的存儲(chǔ)過程,
現(xiàn)在主任C1打開審核系統(tǒng),根據(jù)需要,他只能看到它能看的審核.
?1
Create
?
procedure
?GetListAudit
?2
(
?3
?
@userid
?
varchar
(
100
),
?4
?
@statusid
?
int
?
--
0待審核,1已審核,2歷史記錄
?5
)
?6
?7
AS
?8
if
?
@statusid
?
=
1
?9
begin
?
10
??
select
?
*
?
11
??
from
?審核主表?
12
??
where
?
[
ID
]
?
in
?
13
??(
14
????
Select
?MainID?
from
?審核子表?
15
????
where
?AuditID?
=
?
@userid
16
???)
17
end
18
if
?
@statusid
?
=
0
19
begin
20
??
select
?
*
21
??
from
?審核主表?
22
??
where
?
[
ID
]
?
not
?
in
23
??(
24
?????
select
?MainID?
from
?審核子表?
25
??????
where
?AuditID?
=
?
@userid
26
??)
27
??
and
?ProcessID?
in
?
28
??(
29
????
Select
?MainID?
from
?流程子表
30
?????
where
?UserGroupID?
in
?
31
?????(
32
??????
select
?角色I(xiàn)D?
from
?員工表
33
???????
where
?員工ID
=
@userid
34
??????)
35
??)
36
end
37
if
?
@statusid
?
=
2
38
begin
?
39
??
select
?
*
40
??
from
?審核主表?
41
??
where
?Auditstatus?
in
(
2
,
3
)
42
??
and
?ProcessID?
in
43
??(
44
????
Select
?MainID?
from
?流程子表
45
?????
where
?UserGroupID?
in
?
46
?????(
47
??????
select
?角色I(xiàn)D?
from
?員工表
48
???????
where
?員工ID
=
@userid
49
??????)
50
??)
51
end
上面的存儲(chǔ)過程還可以增加未提交的列表
只需要一個(gè)存儲(chǔ)過程就實(shí)現(xiàn)了,未提交,已經(jīng)審核,未審核,和歷史審核記錄,
并將這些不同的狀態(tài)定義為一個(gè)枚舉類型.
我們實(shí)現(xiàn)了,審核操作,和查看審核信息,還缺少什么呢?還缺少一個(gè)文件跟蹤功能,就是審核流程走到哪個(gè)角色的功能
?1
Create
?
procedure
?GetListAuditTrail
?2
(
?3
??
@AuditMainID
?
int
?
--
審核單號(hào)
?4
)
?5
AS
?6
?7
Select
?a.
*
?b.AuditID,b.CreateDate?Dates
?8
from
?流程子表?a?
left
?
join
?審核子表?b
?9
on
?a.Sequence?
=
?b.Sequence
10
where
?b.MainID
=
@AuditMainID
?
and
?
11
???a.MainID?
in
?(
select
?ProcessID?
from
?審核主表?
where
?
[
ID
]
=
@AuditMainID
?)
從安全性來說,我覺得應(yīng)該進(jìn)行下用戶權(quán)限檢驗(yàn)的.
其實(shí)我個(gè)人寫存儲(chǔ)過程有個(gè)習(xí)慣的,如果這個(gè)存儲(chǔ)過程是返回一個(gè)列表的,我喜歡用GetList為開頭,如果執(zhí)行性存儲(chǔ)過程則喜歡Exec,如果只是返回一個(gè)值的用則是GetOnly開頭,
明鏡臺(tái)
最近在Q群里,有幾個(gè)人問到的文件上傳,大多數(shù)是問,如何判斷,如何獲取文件大小之類的,本文首先對(duì)FileUpload控件作出解析,
一般文件上傳頁(yè)面都會(huì)作為一個(gè)獨(dú)立的頁(yè)面處理,因?yàn)樾枰薷膄rom標(biāo)記的傳輸方式,尤其是使用FileUpload里的PostedFile屬性的時(shí)候,必須要加上enctype="multipart/form-data".否則不能正確的獲取到PostedFile屬性,
而PostedFile屬性里,封裝了幾個(gè)很有用的屬性,分別是:ContentType、ContentLength、FileName、InputStream.
ContentType 主要獲取文件的類型,而不是文件的后聚名,在一定程度上,可以起來類型判定的作用,
ContentLength 獲取文件大小。
FileName 文件名字。
InputStream 以流方式輸入。
這個(gè)InputStream其實(shí)是個(gè)很有用的東西,很多人想問,如果我要在上傳的時(shí)候修改圖片大小,幫圖片加水印,這些加工工序,InputStream可以幫到你在上傳文件的同時(shí),作出上操作
下面是我一個(gè)例子的代碼貼,主要作用是上傳圖片
ASPX頁(yè)面
?
<
table?
width
="340px"
?height
="180px"
?style
="margin:?0px;?padding:?0px"
>
????????????
<
tr
>
????????????????
<
td?
class
="td3"
?width
="20px"
>
????????????????????
<
asp:FileUpload?
ID
="PhotoFileUpload"
?runat
="server"
?
/>
????????????????????
<
asp:Button?
ID
="UpImageBtn"
?runat
="server"
?Text
="上傳圖片"
?OnClick
="UpImageBtn_Click"
?
/>
????????????????
</
td
>
????????????
</
tr
>
????????????
<
tr
>
????????????????
<
td?
class
="td4"
?height
="140px"
?valign
="top"
>
????????????????????
<
ul?
style
="color:?mediumslateblue;?text-align:?left"
>
????????????????????????????
<
li
>
本系統(tǒng)只支持200K以內(nèi)的圖片
</
li
>
????????????????????????????
<
li
>
只支持JPG、GIF、PNG格式
</
li
>
????????????????????????
</
ul
>
????????????????????
<
asp:Panel?
ID
="UpLoadedPanel"
?runat
="server"
?Visible
="false"
>
????????????????????????
<
ul?
style
="color:?Red;?text-align:?left"
>
????????????????????????????
<
li
>
文件位置:
<
asp:Literal?
ID
="FilePlaceLi"
?runat
="server"
></
asp:Literal
></
li
>
????????????????????????????
<
li
>
文件類型:
<
asp:Literal?
ID
="FileTypeLi"
?runat
="server"
></
asp:Literal
></
li
>
????????????????????????????
<
li
>
文件大小:
<
asp:Literal?
ID
="FileLenghtLi"
?runat
="server"
></
asp:Literal
>
KB
</
li
>
????????????????????????
</
ul
>
????????????????????
</
asp:Panel
>
????????????????
</
td
>
????????????
</
tr
>
????????????
<
tr
>
????????????????
<
td?
class
="td3"
>
????????????????????
<
asp:Label?
ID
="MessageBoxLab"
?runat
="server"
></
asp:Label
>
????????????????????
<
input?
type
="button"
?id
="ClossWindows"
?value
="完成"
?onclick
="ThisOk()"
?
/>
????????????????
</
td
>
????????????
</
tr
>
????????
</
table
>
?
CS代碼:
?1
protected
?
void
?UpImageBtn_Click(
object
?sender,?EventArgs?e)
?2
????
{
?3
????????
if
?(Page.IsValid)
?4
????????
{
?5
????????????
if
?(PhotoFileUpload.HasFile)
?6
????????????
{
?7
????????????????UpLoadedPanel.Visible?
=
?
true
;
?8
????????????????FilePlaceLi.Text?
=
?PhotoFileUpload.PostedFile.FileName;
?9
????????????????FileLenghtLi.Text?
=
?(PhotoFileUpload.PostedFile.ContentLength?
/
?
1024
).ToString();
10
????????????????FileTypeLi.Text?
=
?PhotoFileUpload.PostedFile.ContentType;
11
????????????????
string
?fileName?
=
?PhotoFileUpload.FileName;
12
????????????????
string
?strExPrentFile?
=
?fileName.Substring(fileName.LastIndexOf(
"
.
"
)?
+
?
1
);
13
????????????????
string
?strFileType?
=
?PhotoFileUpload.PostedFile.ContentType;
14
????????????????
string
[]?upExPrentFile?
=
?
new
?
string
[]?
{?
"
image/pjpeg
"
,?
"
image/gif
"
,?
"
image/x-png
"
}
;
15
????????????????
bool
?IsUp?
=
?
false
;
16
????????????????
for
?(
int
?i?
=
?
0
;?i?
<
?upExPrentFile.Length;?i
++
)
17
????????????????
{
18
????????????????????
if
?(strFileType.Trim().ToLower().Equals(upExPrentFile[i].ToLower()))
19
????????????????????
{
20
????????????????????????IsUp?
=
?
true
;
21
????????????????????}
22
????????????????}
23
????????????????
if
?(IsUp)
24
????????????????
{
25
????????????????????
string
?SavePath?
=
?
string
.Format(
"
../Photo/{0}.{1}
"
,?DateTime.Now.ToString(
"
mmhhddss
"
),?strExPrentFile);
26
27
28
????????????????????
if
?((PhotoFileUpload.PostedFile.ContentLength?
/
?
1024
)?
<
?
200
)
29
????????????????????
{
30
????????????????????????
object
?imag?
=
?PhotoFileUpload.PostedFile.InputStream;
31
????????????????????????ImageSize?mm?
=
?
new
?ImageSize();
//
32
????????????????????????
string
?oo?
=
?
""
;
33
????????????????????????mm.SaveThreePicture(imag,?Server.MapPath(SavePath),?
out
?oo);
34
35
????????????????????????MessageBoxLab.Text?
=
?
"
上傳成功
"
;
36
????????????????????????HiddenText.Value?
=
?oo;
37
????????????????????}
38
????????????????????
else
39
????????????????????
{
40
????????????????????????MessageBoxLab.Text?
=
?
"
文件大小不允許超過200K
"
;
41
????????????????????}
42
????????????????}
43
????????????????
else
44
????????????????
{
45
????????????????????MessageBoxLab.Text?
=
?
"
文件類型不正確
"
;
46
????????????????}
47
????????????}
48
????????}
49
????}
50
在應(yīng)用OA中,審核流程是必不可少的部分,如何設(shè)計(jì)能令審核流程更動(dòng)態(tài),更靈活.以下是我個(gè)人的實(shí)現(xiàn)思想.有不同意的歡迎指出..
??????? 在審核流程部分,應(yīng)該需要三張數(shù)據(jù)表,流程主表,流程子表,角色表(職位等級(jí)表).
?????????流程主表:需要用以下字段
??????????????????自動(dòng)添加的主鍵ID int.
?????????????????? 流程名稱,title nvarchar(100),
???????????????????流程備注,Remove nvarchar(500),
?????????????????? 建立日期CreateDate?? DateTime,
????????? 流程子表:
?????????????????? 自動(dòng)添加的主鍵ID int.
????????????????????流程主表MainID int,
??????????????????? 流程序列Sequence int ,
????????????????????步驟名稱StepsName nvarchar(100),
????????????????????步驟備注,Remove nvarchar(500),
????????????????????角色名稱 UserName? nvarchar(100),
??????????????????? 流程角色(以職位區(qū)分) UserGroupID? int,
????????? 角色表:
?????????????????? 角色I(xiàn)D?? int,
???????????????????角色名稱, name varchar(100),
?????????????????? 建立日期CreateDate?? DateTime,
????????? 員工表:
?????????????????? 員工ID varchar(100)
???????????????????角色I(xiàn)D?int ,
做到這里,我們基本實(shí)現(xiàn)了自定義流程的初始化信息數(shù)據(jù)表實(shí)現(xiàn)了,需要實(shí)現(xiàn)審核流程,必不可少的部分是審核功能表,
??????????? 審核主表,審核子表
??????????? 審核主表:
??????????????????? 審核文件單號(hào):ID? int
??????????????????? 審核文件日期: AuditDate? DateTime
????????????????????審核文件標(biāo)題:AuditTitle??nvarchar(500)
????????????????????審核文件內(nèi)容:AuditBody?ntext,
??????????????????? 審核狀態(tài):Auditstatus?int,??????? --0未提交,1未審核,2未通過,3已通過,
??????????????????? 審批手續(xù)ProcessID? int
??????????? 審核子表:
??????????????????? 審核子表ID? int?
??????????????????? 審核主表MainID int,
????????????????????審核意見AuditOpinion??ntext
????????????????????審核狀態(tài)Auditstatus bit?? ---0駁回,1是通過,
??????????????????? 審核角色I(xiàn)D? int ,
????????????????????審核流程序列?Sequence int,
??????????????????? 審核/提交人AuditID varchar(100) --(員工ID)
????????????????????審核日期CreateDate?? DateTime,
整個(gè)審核流程所用的的數(shù)據(jù)表我們已經(jīng)全部建好了,現(xiàn)在我們模擬一下.
????????????????????
某省某市的房產(chǎn)局,有三種房產(chǎn)審批流程.
?????????1\為房地產(chǎn)代辦,:???????????????ID為1
???????? 2\為二手房轉(zhuǎn)手???????????????? ID為2
???????? 3\為自建房?????????????????????????ID為3.
ID為1,由房地產(chǎn)商統(tǒng)一辦理,走特殊通道,直接提交到XX部部長(zhǎng)審批-->局長(zhǎng)審批
ID為2,有房產(chǎn)局員工提出,提交到主任審批-->SS部部長(zhǎng)審批-->局長(zhǎng)審批
ID為3,由報(bào)建局-->房產(chǎn)局員工-->主任審批-->SS部部長(zhǎng)審批-->局長(zhǎng)審批
基本的信息我們也已經(jīng)模擬好了,現(xiàn)在A1來到房產(chǎn)局,申請(qǐng)2類房產(chǎn)證審批流程,
由房產(chǎn)局員工B1審查所有資料是否齊全,B1提交審查資料,我們得到一個(gè)ID為1的審核文件單號(hào),主任C1只能看到又B1提交的審查資料,SS部長(zhǎng)只能查看主任級(jí)提交的審查資料,局長(zhǎng)審查部長(zhǎng)級(jí)的資料.
具體的實(shí)現(xiàn)代碼明天再寫
明鏡臺(tái)