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

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

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

chunk?可以被保存在一個文件中,也可以保存在宿主程序的一個字符串中。當一個?chunk?被執行,首先它會被預編譯成虛擬機中的指令序列,然后被虛擬機解釋運行這些指令。?

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

????block?::=?chunk

一個語句塊可以被顯式的寫成一個單獨的語句段:?

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

顯式的語句塊對于控制變量的作用范圍很有用。有時候,顯式的語句塊被用來在另一個語句塊中插入?return?或是?break?

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

簡單的一句,就表明了,if-else支持嵌套elseif? 寫法有點像VB....
if?a>10?then??print("超過10歲")?
else?print("小于10歲")?
?? end這個就是一個簡單的選擇結構...有編程基礎的一看就懂了.
LUA的循環結構,有三種,分別是
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;
有點類似do?while3.for....在LUA里for是有兩種情況,如果用C#來描述的話,LUA的for含蓋了C#里的for和foreach兩種,
????? 數值for
范型
for循環:
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?

只要自己測試一下就知道結果了.
反正就是一個傳統循環,一個迭代循環還需要補充一個語句就是break,和return
break語句用來退出當前循環(for、repeat、while)。在循環外部不可以使用。

return用來從函數返回結果,當一個函數自然結束時,結尾會有一個默認的return。(這種函數類似pascal的過程(procedure))

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

local?i?=?1

while?a[i]?do

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

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

end

有時候為了調試或者其他目的需要在block的中間使用return或者break,可以顯式的使用do..end來實現:

function?foo?()

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

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

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

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

end

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

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

很別扭啊手冊里的介紹是這個a所代表的字符串顯示都是一樣的...感覺犯暈啊...
手冊例子想表達的意思我解析一下,
a = 'alo\n123"'? 這個字符串是用單引號括起來的,123后面跟了個".....想表達的意思就是說,如果用單引號作為字符串的引用的話,內部的雙引號做雙引號處理,
a = "alo\n123\"" 這個字符串則是用雙引號括起來的,為了解決沖突,就要使用轉義字符\"去代表"
a = '\97lo\10\04923"'? 這個其實就是ASCII碼轉義而已..
最令人犯暈的是下面..
這個想表達啥呢?其實這個作用和C#里的@""有點類似..有點像格式輸出吧,,
里面的思想有個靈活的配對,"[["? 在手冊里有個名字,叫長括號,而在"[==["中間的等號個數代表多少級的長括號,沒有等號為0級,1個等號為1級,類推下去.
開始在代碼里,我以為這里"級"的意義在于這個字符串占多少行的意思,但是經過我代碼的測試原來沒任何關系..
依照我這個初學者的猜測...設置這些的意義,目的就是一個避免字符串內過多的使用轉義字符吧,LUA的目標是要做嵌入腳本語言,
例如有個游戲的對白,
小孩說:"很牛啊"
牛說:"不牛"
牛說:"]]"
小孩說:"]=]"將以上字符
a=[==[
小孩說:"很牛啊"
牛說:"不牛"
牛說:"]]"
小孩說:"]=]"]==]
這樣在[==[里就可以使用任何的字符串表達符,提供了更大的靈活性.
后來我咨詢了下LUA高手他給我的答復如下
這個是5.1版本新加的功能,我想主要的作用是屏蔽轉義字符的作用的,在5.0的時候,我們寫lua都需要自己可意去回避一些轉義字符..這個只是我個人想法,你可以問問其他人,目前我實際應用的開發都是5.0居多,這個是5.1新加的,我也不是很確定,但照字面意思..就算不全對,也差不多了看來我的猜想是正確的.
變量
LUA稱為腳本語言,那么就注定了他的變量是弱類型的,就是說變量沒有類型,至少我認識的腳本語言JAVASCRIPT就是沒類型的.所以姑且把腳本語言定義為變量沒有類型的語言就是腳本語言...(某XX教授:你丫的亂下定義誤人子弟!..純粹是幫助記憶...別教真...別教真).
?????????????????????????????????????
變量沒有類型,有類型的只是值 (腳本語言的特點)?????????
Lua?中有八種基本類型:?nil,?boolean,?number,?string,?function,?userdata,?thread,?and?table.?Nil?類型只有一種值?nil?,它的主要用途用于標表識和別的任何值的差異;通常,當需要描述一個無意義的值時會用到它。?Boolean?類型只有兩種值:false?和?true。?nil?和?false?都能導致條件為假;而另外所有的值都被當作真。?Number?表示實數(雙精度浮點數)。(編譯一個其它內部數字類型的?Lua?解釋器是件很容易的事;比如把內部數字類型改作單精度浮點數或長整型。參見文件?luaconf.h?。)?String?表示一串字符的數組。?Lua?是?8-bit?clean?的:字符串可以包含任何?8?位字符,包括零結束符?('\0')? userdata 類型用來將任意 C 數據保存在 Lua 變量中。這個類型相當于一塊原生的內存,除了賦值和相同性判斷,Lua 沒有為之預定義任何操作。然而,通過使用
metatable (元表) ,程序員可以為 userdata 自定義一組操作. userdata 不能在 Lua 中創建出來,也不能在 Lua 中修改。這樣的操作只能通過 C API。這一點保證了宿主程序完全掌管其中的數據。
大家都知道,C語言里有幾個特別的數據構造,例如,結構體,共用體等,這個
userdata 類型其實就滿足結構體傳值的功能的數據類型,至少我現在是這樣理解的..至于元表我還沒有接觸,暫時將
userdata 類型等同于一個只讀類型.
Lua 中有三類變量:全局變量,局部變量,還有 table 的域。 其實今天大多的時候都花費在字符串里,但是一種語言來說,字符也是一個很重要的重點,例如C#基本提供了每個類都是 ToString()方法,C語言,單獨用一章介紹字符串,數據結構里也獨立一個章專門說字符串,所以這個字符串是在我們日常開發中經常用到的,對它理解得深其實是有好處的...今天就到這里
明鏡臺
posted @
2009-05-12 00:20 ^喬喬^ 閱讀(4697) |
評論 (3) |
編輯 收藏
絕對原創
1、lua學習之入門(一)----環境搭建
2、lua學習之入門(二)----基礎語法1
3、lua學習之入門(二)----基礎語法2
4、lua學習之入門(三)----函數
要學習編程,必須的一肯定是編譯工具,和一些調試工具,我使用的Lua-5.1.4下載地址:http://www.lua.org/ftp/lua-5.1.4.tar.gz,
接觸未知道的東西應該怎么做,肯定是找GOOGLE咯,一搜索....網上教我是這樣做的的:
(來自http://bbs.luaer.cn/read-Lua-tid-105.html)
(1) 下載Lua壓縮包,下載頁面是http://www.lua.org/download.html 最新版本是lua-5.1.2
也可以點擊這里直接下載:http://www.lua.org/ftp/lua-5.1.2.tar.gz? 它的體積很小,只有210K
(2)解壓文件,比如解壓到 D:/lua-5.1.2 文件夾內(以下均以此路徑為例)。
(3)在 D:/lua-5.1.2內,存在名為 /etc的子目錄。在此目錄下找到 luavs.bat 文件,并將它復制到 D:/lua-5.1.2 中。
(4)雙擊執行 luavs.bat 批處理文件,如果執行成功,在 D:/lua-5.1.2/src 文件夾中會存在 luac.exe 和 lua.exe兩個文件。
(5)將 D:/lua-5.1.2/src 加入到系統路徑中。
(6)檢測Lua是否安裝成功:
在"開始"--"運行"處輸入 lua 然后回車,若出現cmd控制臺界面且含有"[backcolor=rgb(255,]Lua 5.1.2"之類的文字,則說明Lua已經成功安裝。如果提示沒有找到該命令,請檢查D:/lua-5.1.2/src 文件夾中是否存在 luac.exe 和 lua.exe 兩個文件,并確保已將 D:/lua-5.1.2/src 加入到系統路徑中。
教的是5.1.2,我用的是5.1.4....相對我這種初學者來說,沒多大分別..
所以我照著做了....
運行luavs.bat
一閃,完全不知道什么事情,打開E:\lua-5.1.4\src(我放在E盤).什么都沒發生.好你有種你閃,我就不讓你閃,我->開始->運行 CMD ->E: -> CD E:\lua-5.1.4->luavs.bat/得到的結果....LINK失敗等一大堆信息.....突然腦袋一片空白...咋辦...再試..認真看了出錯信息..原來...這個BAT是一個起編譯的作用的...我用我裝的VS2008編譯你試試吧!!死馬當活馬醫,開始->程序->Microsoft Visual Studio 2008->Visual Studio Tools->Visual Studio 2008 命令提示 輸入CD E:\lua-5.1.4->E:->luavs.bat
??? OK....成功生成luac.exe,lua.exe....進行下一步打開環境變量->系統變量->Path加上E:\lua-5.1.4\SRC再去 CMD里,輸入LUA.....得到以下結果是LUA的版權信息...很好證明環境已經成功搭建....我們可以開始下一步工作...
然后我們在記事本下編寫一個
print("-----------------------------");
print("測試LUA~~~梁喬峰2009");
print("-----------------------------");
并保存為test.lua
然后在CMD下運行 lua h:\test.lua
----------------------------------------
測試LUA~~~梁喬峰2009
----------------------------------------
GOOD JOB.......我們終于成功地跑起第一個LUA了,激動吧!!
明鏡臺
posted @
2009-05-11 16:30 ^喬喬^ 閱讀(4198) |
評論 (5) |
編輯 收藏
摘要: Boost 類庫是個開源的類庫,傳說中的準標準庫這下將會是我閱讀Boost 多線程源代碼的心得.費話少說,在使用BOOST的多線程我們都會引入boost/thread.hpp這一個文件好我們先找到這個文件將它打開?1//?Copyright?(C)?2001-2003?2//?William?E.?Kempf?3//?(C)?Copyright?2008?Anthony?Williams?4//?...
閱讀全文
posted @
2009-05-09 20:43 ^喬喬^ 閱讀(1961) |
評論 (1) |
編輯 收藏
執行審核上則是每處理一個環節,就插入一個環節的信息.
我個人認為實現審核的代碼使用存儲過程去實現要比用C#代碼去實現要好,至于用事務處理感覺還是差點,因為如果一個系統的事務處理過多,會造成處理緩慢,而用C#代碼去實現,則需要進行多次的查詢數據庫,操作過程也比較復雜..所以我覺得還是用存儲過程去實現是最理想的.
?1
Create
??
procedure
?ExecFlowAuditPass
?2
(
?3
@AuditMainID
?
int
,
?4
@UserID
?
varchar
(
100
),
?5
@AuditOpinion
?
ntext
,
?6
@Auditstatus
?
int
?7
)
?8
As
?9
--
獲取最后審核的節點
10
declare
?
@posid
?
int
11
select
?
@posid
?
=
?
max
(Sequence)?
from
?審核子表?
where
?MainID
=
?
@AuditMainID
12
--
獲取最大審核的節點
13
declare
?
@maxposid
?
int
14
select
?
@maxposid
=
max
(Sequence)?
from
?流程子表?
where
?MainID
=
?
@AuditMainID
15
--
獲取將審核節點角色資料
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
?角色ID?
=
?
@UserGroupID
)
=
0
20
begin
21
??
select
?
*
?
from
?審核子表?
where
??MainID
=
?
@AuditMainID
22
??
print
?
-
1
;
23
??
return
?
-
1
;
24
end
25
--
角色符合執行
26
if
?
@Auditstatus
?
=
1
27
begin
28
insert?
into
?流程子表(MainID,AuditOpinion,Auditstatus,Sequence,AuditID,CreateDate,角色ID)?
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,角色ID)?
values
(
@AuditMainID
,
@AuditOpinion
,
0
,
@posid
+
1
,
@UserID
,
getdate
(),
@UserGroupID
)
37
????????????????
update
?審核主表?
set
?Auditstatus?
=
?
2
?
where
?
[
ID
]
=
@AuditMainID
?
38
end
這個就是執行審核的存儲過程,
現在主任C1打開審核系統,根據需要,他只能看到它能看的審核.
?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
?角色ID?
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
?角色ID?
from
?員工表
48
???????
where
?員工ID
=
@userid
49
??????)
50
??)
51
end
上面的存儲過程還可以增加未提交的列表
只需要一個存儲過程就實現了,未提交,已經審核,未審核,和歷史審核記錄,
并將這些不同的狀態定義為一個枚舉類型.
我們實現了,審核操作,和查看審核信息,還缺少什么呢?還缺少一個文件跟蹤功能,就是審核流程走到哪個角色的功能
?1
Create
?
procedure
?GetListAuditTrail
?2
(
?3
??
@AuditMainID
?
int
?
--
審核單號
?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
?)
從安全性來說,我覺得應該進行下用戶權限檢驗的.
其實我個人寫存儲過程有個習慣的,如果這個存儲過程是返回一個列表的,我喜歡用GetList為開頭,如果執行性存儲過程則喜歡Exec,如果只是返回一個值的用則是GetOnly開頭,
明鏡臺
posted @
2009-05-09 15:37 ^喬喬^ 閱讀(2441) |
評論 (2) |
編輯 收藏
最近在Q群里,有幾個人問到的文件上傳,大多數是問,如何判斷,如何獲取文件大小之類的,本文首先對FileUpload控件作出解析,
一般文件上傳頁面都會作為一個獨立的頁面處理,因為需要修改from標記的傳輸方式,尤其是使用FileUpload里的PostedFile屬性的時候,必須要加上enctype="multipart/form-data".否則不能正確的獲取到PostedFile屬性,
而PostedFile屬性里,封裝了幾個很有用的屬性,分別是:ContentType、ContentLength、FileName、InputStream.
ContentType 主要獲取文件的類型,而不是文件的后聚名,在一定程度上,可以起來類型判定的作用,
ContentLength 獲取文件大小。
FileName 文件名字。
InputStream 以流方式輸入。
這個InputStream其實是個很有用的東西,很多人想問,如果我要在上傳的時候修改圖片大小,幫圖片加水印,這些加工工序,InputStream可以幫到你在上傳文件的同時,作出上操作
下面是我一個例子的代碼貼,主要作用是上傳圖片
ASPX頁面
?
<
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
>
本系統只支持200K以內的圖片
</
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
posted @
2009-05-09 11:29 ^喬喬^ 閱讀(1349) |
評論 (2) |
編輯 收藏
在應用OA中,審核流程是必不可少的部分,如何設計能令審核流程更動態,更靈活.以下是我個人的實現思想.有不同意的歡迎指出..
??????? 在審核流程部分,應該需要三張數據表,流程主表,流程子表,角色表(職位等級表).
?????????流程主表:需要用以下字段
??????????????????自動添加的主鍵ID int.
?????????????????? 流程名稱,title nvarchar(100),
???????????????????流程備注,Remove nvarchar(500),
?????????????????? 建立日期CreateDate?? DateTime,
????????? 流程子表:
?????????????????? 自動添加的主鍵ID int.
????????????????????流程主表MainID int,
??????????????????? 流程序列Sequence int ,
????????????????????步驟名稱StepsName nvarchar(100),
????????????????????步驟備注,Remove nvarchar(500),
????????????????????角色名稱 UserName? nvarchar(100),
??????????????????? 流程角色(以職位區分) UserGroupID? int,
????????? 角色表:
?????????????????? 角色ID?? int,
???????????????????角色名稱, name varchar(100),
?????????????????? 建立日期CreateDate?? DateTime,
????????? 員工表:
?????????????????? 員工ID varchar(100)
???????????????????角色ID?int ,
做到這里,我們基本實現了自定義流程的初始化信息數據表實現了,需要實現審核流程,必不可少的部分是審核功能表,
??????????? 審核主表,審核子表
??????????? 審核主表:
??????????????????? 審核文件單號:ID? int
??????????????????? 審核文件日期: AuditDate? DateTime
????????????????????審核文件標題:AuditTitle??nvarchar(500)
????????????????????審核文件內容:AuditBody?ntext,
??????????????????? 審核狀態:Auditstatus?int,??????? --0未提交,1未審核,2未通過,3已通過,
??????????????????? 審批手續ProcessID? int
??????????? 審核子表:
??????????????????? 審核子表ID? int?
??????????????????? 審核主表MainID int,
????????????????????審核意見AuditOpinion??ntext
????????????????????審核狀態Auditstatus bit?? ---0駁回,1是通過,
??????????????????? 審核角色ID? int ,
????????????????????審核流程序列?Sequence int,
??????????????????? 審核/提交人AuditID varchar(100) --(員工ID)
????????????????????審核日期CreateDate?? DateTime,
整個審核流程所用的的數據表我們已經全部建好了,現在我們模擬一下.
????????????????????
某省某市的房產局,有三種房產審批流程.
?????????1\為房地產代辦,:???????????????ID為1
???????? 2\為二手房轉手???????????????? ID為2
???????? 3\為自建房?????????????????????????ID為3.
ID為1,由房地產商統一辦理,走特殊通道,直接提交到XX部部長審批-->局長審批
ID為2,有房產局員工提出,提交到主任審批-->SS部部長審批-->局長審批
ID為3,由報建局-->房產局員工-->主任審批-->SS部部長審批-->局長審批
基本的信息我們也已經模擬好了,現在A1來到房產局,申請2類房產證審批流程,
由房產局員工B1審查所有資料是否齊全,B1提交審查資料,我們得到一個ID為1的審核文件單號,主任C1只能看到又B1提交的審查資料,SS部長只能查看主任級提交的審查資料,局長審查部長級的資料.
具體的實現代碼明天再寫
明鏡臺
posted @
2009-05-09 00:39 ^喬喬^ 閱讀(3158) |
評論 (1) |
編輯 收藏