::^乔乔^::明镜台::原创空间::C#.NET2.0,C++技术BLOG
人最重要的是心境,一颗平静安稳的心才能更好的进步,保持自己的心态.成为梦想中的高手QQ群:8664695
posts - 17,comments - 32,trackbacks - 0

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认为falsenil为假,其他值为真。

        大学时候,老师跟我说,所有编程语言都是由三种结构组成,顺序结构,选择结构,循环结构.个人认为..这样设置的原因,和人的生活有很大关系,我们从生老病死,这个就是一个最简单的顺序结构.从生存到消失.人都需要的经历,但在生老病死的过程中我们又要面临选择..老爸老妈没得选择...你还没生,就是你还不存在,所以你没选择的权利,那么就是说选择是建立在已经存在的基础上的,所以编程就有了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 
while
3.for....在LUA里for是有两种情况,如果用C#来描述的话,LUA的for含盖了C#里的for和foreach两种,

      数值for

for var=exp1,exp2,exp3 do

    loop
-part

end
for将 从exp1(初始值)到exp2(终止值),exp3是一个变化跨度值, 执行loop
-part。其中exp3可以省略,默认跨度默认为1
和传统的for结构一样for(int i=0;i<10;i++),只是在LUA里简化了很多;
例子:
   for i=10,1,-2 do

       print(i)

   end

输出结果为;
10
8
6
4
2
有几点需要注意:
          1. 三个表达式只会被计算一次,并且是在循环开始前。
          2. 控制变量var是局部变量自动被声明,并且只在循环内有效.
          3. 循环过程中不要改变控制变量的值,那样做的结果是不可预知的。如果要退出循环,使用break语句


范型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 ^乔乔^ 阅读(8655) | 评论 (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码转义而已..
最令人犯晕的是下面..
= [==[
alo
123"]==]
这个想表达啥呢?其实这个作用和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 ^乔乔^ 阅读(4655) | 评论 (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 ^乔乔^ 阅读(4168) | 评论 (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 ^乔乔^ 阅读(1914) | 评论 (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 ^乔乔^ 阅读(2385) | 评论 (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 ^乔乔^ 阅读(1326) | 评论 (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 ^乔乔^ 阅读(3107) | 评论 (1)编辑 收藏
仅列出标题
共2页: 1 2