信息产业培训网

关于文档管理软件的解决方案

http://www.miiceic.org.cn   2007-7-16 9:57:35   中程在线   浏览数:
关键字:文档
随着电脑应用的增多,电脑中的文件数量在不断堆积。文档的管理是一个迫切有待解决的问题,近年来有些软件从业人员已经考虑到这方面的问题,针对这一问题想入手开发出关于文档管理的软件。那么这样的软件应该怎样开发,要解决哪些问题呢?现把其大致的基本功能要求描述如下:
  • 浏览功能:通常文档是被摆放在用户的每个目录下面,浏览功能可查看到目录与文档,当需要浏览文档内容时,则进入目录后点击文档阅读。
  • 文档上载:本功能是可以将文档上传到自己的目录里。文档上载时,需要输入有关的关键字及文档的描述一同上传到系统,填写的内容以便查找文件时提供方便。
  • 增加目录:可以在文档管理的系统目录树中,选择自己摆放的位置,创建新的目录。
  • 移动文档:该功能是可以选择文档,移动到不同的目录下面。如果选择的目录无任何文档,是不能作移动操作的,并出现有关的说明。
  • 文档共享(分受限共享、完全共享,受限共享,则只有被选择的用户才能查看,完全共享则所有用户都能看到):该功能是将自己个人目录下的文档共享给其他人。输入对方的电子邮件地址后,对方就会收到有关该文件共享的信息,对方只要登录到自己所属的共享文件夹中,点击共享文件夹即可阅读或下载文件。
  • 目录共享(分受限共享、完全共享,受限共享,则只有被选择的用户才能查看,完全共享则所有用户都能看到):该功能是将自己的某个目录共享给其他人,目录共享后该目录下面的所有文件都将共享,用户输入对方的电子邮件地址后,对方就会收到有关该目录共享的信息,对方只要登录到自己所属的共享文件夹中,点击共享文件夹即可阅读或下载共享目录下的文件。
  • 共享说明:共享并不是直接为共享用户创建文件或目录,而是在文件或目录记录上增加共享用户的用户名即可。
  • 查找文档:文档的查找是有多种组合,如透过文档内容(文档名、关健字、描述、作者)、文件的大小、创建的日期的组合方式查找。它们之间是“或“的关系。
  • 修改文档名:该功能目前主要进行文档名字的修改。首先选择要修改的文档,输入新的名字后确认即可。
  • 删除功能:该功能是进行文档与目录的删除,如果要删除文档,则进入目录后,选择要删除的文档直接进行删除。如果要删除目录的话,则其目录下面的文档会被全部删除。

其数据流程图如下:

主要界面

 

1、登录界面

2、浏览文档管理界面

点击放大

数据库设计

员工表(yg_tab)

字段英文名

字段中文名

类型

长度

备注

Id

自动编号

int

4

主键唯一

Username

姓名

varchar

50

 

Userid

员工编号

varchar

20

 

Passwd

密码

varchar

10

 

目录管理doc_path(该表可描述多级子目录,采用递归算法)

字段名

字段说明

长度

备注

Id

自动编号

Int

4

主键,唯一KEY

Path_name

目录名称

varchar

50

记录当前目录名,用于显示

Path_tyep

目录类型

char

1

0-私有,1-完全共享,2-受限共享

Content

共享说明

varchar

50

 

Gxdate

共享日期

datetime

8

 

See_id

共享查看人员

varchar

200

可多个,用“,”分开,关联员工表中的userid

Path_des

目录描述

varchar

200

 

Path_dir

目录完整路径

varchar

200

 

Create_userid

目录创建者编号

varchar

50

关联员工表中的员工编号userid

Dir_date

目录创建时间

datetime

8

 

sub_id

父目录编号

int

4

当该目录没有父目录则为空,有则等于上面的ID

Backup

备注

varchar

200

 

文件管理:doc_file

字段名

字段说明

类型

长度

备注

Path_Id

目录编号

Int

4

关联doc_path中的ID

File_id

文件编号

int

4

主键,唯一KEY

File_name

文件名

varchar

50

 

File_des

文件描述

varchar

100

 

Keyword

关键字

varchar

50

 

File_use

文件拥有者

varchar

50

关联员工表中的员工编号userid

Create_date

文件创建日期

datetime

8

 

File_tyep

文件类型

char

1

0-私有,1-完全共享,2-受限共享

Content

共享说明

varchar

50

 

Gxdate

共享日期

datetime

8

 

See_id

共享查看人员

varchar

200

可多个,用“,”分开,关联员工表中的userid

实现方法:

1.   先建立好上面的数据库,这里略。启动Visual Basic 6.0。在新建项目中选择标准EXE确定,则进入开发环境中,把工程名换名为FileManage。增加一个模块并命名为ModPublic,在模块中定义一些全局变量。代码如下:

Public objDB As _
  New ADOAccess

Public CurrNode As _
  MSComctlLib.Node   '树结点

Public nodX As Object          '在拖动的项

Public gUserName As String     '用户名

Public gUserId As String       '用户号

Public gShareType As Integer   '共享类型

Public Type people           '自定义
  userId As String
  userName As String
End Type

Public yg() As people

说明:上面的ADOAccess是本人编写的一个组件,在计算机世界网的应用与方案栏中的《Visual Basic.NET中访问数据的方法 》一文可找到。是一个功能强大的数据访问组件,有关数据操作都封装在里面,仅需直接调用就可。 

2.   增加一个登录表单,命名为frmLogin,在上面放入控件二个标签,二个文本控件并命名为txtUser、txtID,一个按钮控件并命名为cmdLogin。如下图:

在其代码窗口中编号代码如下:

Private Sub Form_Load()
   objDB.ConnAccess (App.Path + "\test.mdb")
End Sub

Private Sub cmdLogin_Click()

  Dim strWhere As String

  Dim recTemp As ADODB.Recordset

  gUserName = txtUser.Text

  gUserId = txtID.Text

 'strWhere = "UserName='" & txtUser.Text & "' and userid='" & txtID.Text & "'"

  If gUserName = "" Then
     MsgBox "请输入用户!", vbExclamation + vbOKOnly, "错误"
     Exit Sub
  End If

  If gUserId = "" Then
     MsgBox "请输入用户密码!", vbExclamation + vbOKOnly, "错误"
Exit Sub 
  End If

 strWhere = "UserName='" & gUserName & "' and passwd='" & gUserId & "'"

 Set recTemp = objDB.OpenTable("yg_tab", strWhere)

   If Not recTemp.EOF Then
      gUserId = recTemp!userId
      frmBrowse.Show
   Else
      MsgBox "非法的用户,请重新登录!", vbExclamation + vbOKOnly, "错误"
      txtUser.Text = ""
      txtID.Text = ""
      Exit Sub
   End If
End Sub

说明:上面的代码在表单的Load事件中连接数据库test.mdb,在登录按钮的单击事件中先取得用户名和密码,然后进行验证,确定后则进入下一表单,否则提示出错信息。3.   增加一个浏览表单,命名为frmBrowse,在上面放入二个选择控件其标题分别为浏览、查询文件,一个树控件、一个列表控件,一个公共对话盒控件,一个文本控件并命名为txtPath, 一个图片控件并命名为TreeImageList。7个按钮控件并分别命名为cmdDelFile、cmdDelDir、cmdShareFile、cmdShareDir、cmdCreateFile、cmdCreateDir、cmdSave,标题分别为删除文件、删除目录、共享文件、共享目录、创建文件、创建目录、文件上载。布置如下图:

定义二个局部变量

Dim indrag As Boolean 
Dim tNode As Node

单击表单,在表单的Load事件中编写图片控件的图片资源,并把列表控件设置为报表类型。代码如下:

Private Sub Form_Load()

With Me.TreeImageList.ListImages 
        .Clear
        .Add , "Drive", LoadResPicture("Drive", vbResBitmap)
        .Add 2, "Close", LoadResPicture("CLSDFOLD", vbResBitmap)
        .Add , "Open", LoadResPicture("OPENFOLD", vbResBitmap)
        .Add , "Doc", LoadResPicture("WINDOC", vbResBitmap)
        .Add , "Bmp", LoadResPicture("BMP", vbResBitmap)
End With 
ListView1.View = lvwReport

  End Sub

编写一个建立树结点的过程,这里怎样建立树结点不再着作介绍,请参考其它资料。代码如下:

Public Sub CreateTree(ByVal strType As String)

    Dim recTemp As New ADODB.Recordset

Dim strWhere As String 
Dim parFlag  As String    '父结点的标记。

    Dim sonFlag As String     '子结点的标记。

    Const TOPIMAGE = 1, FIRSTIMAGE = 1, TWOIMAGE = 1, _
  THREEIMAGE = 1, FOURIMAGE = 1

    TreeView1.Visible = True

    Dim strNodeText As String           '树结点的名字。

    Dim flatNodeNum As Integer           '当前层树结点数。

Dim i As Integer, j As Integer, k As Integer 
    TreeView1.Nodes.Clear

    parFlag = "K00"

    strNodeText = "文件目录列表" + strType

    Set tNode = TreeView1.Nodes.Add(, tvwChild, parFlag, _
 strNodeText, "Drive") '生成顶结点

    tNode.Expanded = True

     ''''''''生成第一层结点

   strWhere = "sub_id=0 order by id"

   Set recTemp = objDB.OpenTable("doc_path", strWhere)

   With recTemp

        For i = 0 To .RecordCount - 1

           strNodeText = Trim(recTemp(1))

           sonFlag = "K" + CStr(recTemp!Id)

          ' sonFlag = CStr(recTemp!Id)

           Set tNode = TreeView1.Nodes.Add(parFlag, tvwChild, _
         sonFlag, strNodeText, "Close") '生成第一层结点

           tNode.Tag = "node"

           .MoveNext

         Next 
    End With

     ''''''''生成第2层结点

   strWhere = "sub_id<>0 order by id"

   Set recTemp = objDB.OpenTable("doc_path", strWhere)

   With recTemp

        For i = 0 To .RecordCount - 1

           strNodeText = Trim(recTemp(1))

           parFlag = "K" + CStr(recTemp!sub_id)

           sonFlag = "K" + CStr(recTemp!Id)

          ' sonFlag = CStr(recTemp!Id)

          Set tNode = TreeView1.Nodes.Add(parFlag, _
tvwChild, sonFlag, strNodeText, "Close")
         tNode.Tag = "node"

           .MoveNext

         Next

   End With

 End Sub

编写浏览单选事件,单击浏览控件,在其单击事件中编写调用建立树的语句。代码如下:

Private Sub Option1_Click()
   Call CreateTree("")
End Sub
查找文档功能的实现

编写文件单选事件,单击文件查找控件,在其单击事件中编写文件查找的语句,实现方法是提供给用户一个输入查找文件的输入框,

根据输入的内容打开表进行查找,表中没有所找的文件则退出,否则把找到的文件显示在列表框中,由于列表框设置为报表类型,

所以向列表框中增加项时,记录的第一个字段是主项,其它是子项,增加项时应该判断其是否为空值,且用标记设置所增加的是文件。

由于全部用中文显示且数据来源于不同的表中,故必须用复合查询语句实现。代码如下:

Private Sub Option2_Click()
Dim FindKey As String
Dim strWhere As String Dim strSql As String
Dim recTemp As New ADODB.Recordset

FindKey = InputBox("请输入查询文件的关键字", "查询")

strSql = "SELECT DISTINCT A.File_name,A.File_des,_
  B.UserName,A.Create_date,A.file_id FROM doc_file A,_
  yg_tab B,doc_path C Where A.File_use = B.Userid and_
  a.keyword='" & FindKey & "'"
Set recTemp = objDB.ExecuteSQL(strSql)

If recTemp.EOF And Node.Children = 0 Then
  ListView1.ListItems.Clear
Else
   With recTemp
     If .EOF Then Exit Sub
     .MoveFirst

     Do While Not .EOF
     Set lItem = ListView1.ListItems.Add(, "K" + _
         CStr(recTemp("file_id")), recTemp(0), , "Doc")
    lItem.ListSubItems.Add , , IIf(IsNull(recTemp(1)), "", recTemp(1))
    lItem.ListSubItems.Add , , IIf(IsNull(recTemp(2)), "", recTemp(2))
    lItem.ListSubItems.Add , , IIf(IsNull(recTemp(3)), "", recTemp(3))
    lItem.Tag = "file"
   .MoveNext
   Loop
  End With

TreeView1.Visible = False

End Sub
浏览功能的实现

当用户在浏览文档时是由树结点所选择,所以我们应该编写树结点的单击事件的代码。

当用户单击树结点时我们应该根据他所单击的结点确定该结点的路径并显示之,该结点下的目录和文件应该全部显示在列表框中。

目录与文件用不同的图标标识。列表框的内容更新时注意先清除各项。代码如下:

Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
Dim strWhere As String
Dim strSql As String
Dim recTemp As New ADODB.Recordset
Dim intParID
Dim lItem As ListItem
Set CurrNode = Node

If Len(Node.FullPath) > 7 Then
  txtPath.Text = "当前浏览目录:" + Right(Node.FullPath, _
    Len(Node.FullPath) - 7)
Else
  txtPath.Text = "当前浏览目录:" + Node.FullPath
Exit Sub
End If

intParID = CInt(Mid(Node.Key, 2, Len(Node.Key)))
strWhere = "Path_Id=" & intParID & " order by id"

strSql = "SELECT DISTINCT A.Path_name, A.Path_des,B.UserName,_
   A.Dir_date FROM doc_path A ,yg_tab B _
  where A.Create_userid = B.userid and A.sub_id=" & intParID

Set recTemp = objDB.ExecuteSQL(strSql) 

If Not recTemp.EOF Then
  With recTemp
  ListView1.ListItems.Clear
  .MoveFirst
Do While Not .EOF
  Set lItem = ListView1.ListItems.Add(, , recTemp(0), , "Close")
  lItem.ListSubItems.Add , , IIf(IsNull(recTemp(1)), "", recTemp(1))
  lItem.ListSubItems.Add , , IIf(IsNull(recTemp(2)), "", recTemp(2))
  lItem.ListSubItems.Add , , IIf(IsNull(recTemp(3)), "", recTemp(3))
  lItem.Tag = "node"
  .MoveNext
Loop
End With
End If
strSql = "SELECT DISTINCT A.File_name,A.File_des,B.UserName,_
   A.Create_date,A.file_id FROM doc_file A,yg_tab B,_
   doc_path C Where A.File_use = B.Userid and a.path_id=" & intParID

Set recTemp = objDB.ExecuteSQL(strSql)

If recTemp.EOF And Node.Children = 0 Then
ListView1.ListItems.Clear
Else
With recTemp
If .EOF Then Exit Sub
.MoveFirst
Do While Not .EOF
Set lItem = ListView1.ListItems.Add(, "K" +_
    CStr(recTemp("file_id")), recTemp(0), , "Doc")
lItem.ListSubItems.Add , , IIf(IsNull(recTemp(1)), "", recTemp(1))
lItem.ListSubItems.Add , , IIf(IsNull(recTemp(2)), "", recTemp(2))
lItem.ListSubItems.Add , , IIf(IsNull(recTemp(3)), "", recTemp(3))
lItem.Tag = "file"
.MoveNext
Loop
End With
End If
End Sub
文档上载功能的实现

文档上载主要是把用户的文件保存在用户所指定的目录中,我们可以借助公共对话控件为用户提供上载界面。

把公共对话控件设置为保存就可。文档上载时该先判断用户所选择的是文件,否则不能上载,且上载时应该考虑文件是否已存在。

文件上载可通过建立文件系统对象Scripting.FileSystemObject,利用FileSystemObject的CopyFile方法实现。代码如下:

Private Sub cmdSave_Click()

   Dim DecFileName As String

   Dim fs

   Dim strFileName As String

   If ListView1.SelectedItem.Tag <> "file" Then

      Exit Sub

   End If 

   strFileName = App.Path + "\temp"

   dlgFileSave.ShowSave

   DecFileName = dlgFileSave.FileName

   Set fs = CreateObject("Scripting.FileSystemObject")

   If fs.FileExists(DecFileName) Then

   If MsgBox("文件已存在,是否覆盖?", vbQuestion + vbYesNo, "提示") = vbNo Then

          Exit Sub

    End If

    End If

  dlgFileSave.Flags = cdlOFNOverwritePromptfile2

  If DecFileName <> "" Then

     fs.CopyFile strFileName, DecFileName

  End If

  cmdSave.Enabled = False

End Sub
增加目录功能的实现

增加目录是根据用户的需要,由用户创建,其内容由用户录入。我们提供一个录入界面,把输入的信息保存在目录表中。

实现方法是增加一个表单,命名为frmCreateDir。在上面放入四个标签控件,三个文本控件并命名为txtDirName、txtPath、txtDes,

一个下拉列表控件并命名为cboType。二个按钮并命名为cmdYes、cmdCance

单击确定按钮,在其单击事件中编写代码。先判断输入是否有效,数据有效r后打开表,把数据插入表中。同时注意要更新树视图

Private Sub cmdYes_Click()

  Dim recTemp As New ADODB.Recordset

   If txtDirName = "" Then

      MsgBox "请输入目录名称!", vbExclamation + vbOKOnly, "错误"

      Exit Sub

   End If    

    'strSql = "inster into  DISTINCT A.Path_name, A.Path_des,_
        B.UserName, A.Dir_date FROM doc_path A ,yg_tab B where _
        A.Create_userid = B.userid and A.sub_id=" & intParID

    Set recTemp = objDB. ExecuteSQL ("doc_path")

    With recTemp

         .AddNew

         !path_name = txtDirName.Text

         !Path_tyep = Left(cboType.Text, 1)

         !path_dir = txtPath.Text

         !path_des = txtDes.Text

         !Create_userid = gUserId

         !Dir_date = Now

         !sub_id = CInt(Right(CurrNode.Key, 1))

         .Update

     End With

     frmBrowse.CreateTree ("")

     Unload Me

End Sub

Private Sub cmdCance_Click()

  Unload Me

End Sub
来源:UML软件工程组织
相关连接
最新评论
*以下网友发言不代表中程在线网站的观点和看法
    我要评论

    请您注意
    1、遵守中华人民共和国的各项有关法律规定
    2、承担一切因您的行为而导致的法律责任
    3、本网留言管理人员有权删除其管辖留言内容
    4、您在本网的留言本网有权在网站内转载和引用
    5、参与本留言即表明您已经阅读并接受上述条款
    我爱研发网中电华信阿里西西JAVA爱好者北京英才网全球大学查询网
    中国人的网站导航中国电脑论坛信息产业部新浪科技搜狐IT信息产业部电子教育与考试中心
    IT世界网软件项目交易网中国软件交易网国信培训网亚远景科技....[更多]
    关于我们 | 网站地图 | 周边住宿 | 行车路线 | 联系我们 | 网站律师 | 意见反馈 | 虚位以待 | 友情链接
    中程在线(北京)科技有限公司 版权所有
    总 部:北京市海淀区青东商务楼A座西四层
    企业培训部:010-52636110 52636106 就业培训部:010-68716925 68716926
    邮 件:training@miiceic.org.cn
    京ICP备06053134号
    Copyright © 2005-2008 Miiceic.org.cn All Rights Reserved