1、吉林省明日科技有限公司监制 文档管理系统 学 院 专 业 班 级 学 号 姓 名 指导教师 教师职称 年 月 日 目录 文档管理系统 目录 摘要 0 引言 1 系统需求分析 2 总体设计 1 项目规划 2 系统功能结构 3 设计目标 3 系统设计 1 开发及运行环境 2 数据库设计 4 主要功能模块设计 6.4.1 建立工程框架 6.4.2 封装
2、数据库 6.4.3 主窗口设计 6.4.4 登录模块设计 6.4.5 单位档案模块设计 6.4.6 文档类别模块设计 6.4.7 文档管理模块设计 6.4.8 用户管理模块设计 6.4.9 口令修改模块设计 附录A 参考文献 附录B 数据表 – 3 – 吉林省明日科技有限公司监制 摘要 【摘要】 文档管理实际就是文件的制作、修改、传递、签定、保存、销毁、存档等一系统操作。文档管理是企业经营管理中不可缺少的组成部分。通过文档信息管理系统的使用,实现文档管理自动化管理的目标,为企业提供了安全、可靠、开放、高效的文档管理功能,不仅方便了文档管
3、理的日常操作,而且必免了手工管理中的一系列错误的发生,提高了企业的办公效率和企业文件管理的综合水平。 目前,大多数文档管理系统在实现了企业各部门日常文件管理的基本功能之外,还增设了很多的新功能用以满足文档管理电子化、标准化的新要求;功能强大的档案查询模块,大大方便了管理者日常文档的查找工作,解决传统管理中的查找困难、查找耗时等问题。使用现代化的文档管理系统满足了企业“无纸化”办公的求要,实现通过计算机对文档管理全程跟踪的目标。 【关键词】文档管理系统 – 39 –
4、 吉林省明日科技有限公司监制 0 引言 文档管理系统的全面应用,克服了企业传统文档管理方法的缺点,提高管理部门的日常办公效率,增强了企业内部协同合作的能力;文档管理系统的应用,方便管理者有效管理文档的同时,大大提高了文档查找效率,进而提高了企业的综合效率。 1 系统需求分析 根据市场的需求,要求系统具有以下功能: q 处理大量的复合文档型的数据信息。 q 通过系统查看文档内容。 q 通过系统可以完成对文档一系列日常操作。 q 保证系统的安全性、可靠性。 2 总体设计 2.1 项目规划 文档管理系统由基本信息、文档管理、系统设置等几个功能模块组成,规划系统
5、功能模块如下 q 基本信息 基本信息包括单位档案、文档类别2部分。 q 文档管理 文档管理包括添加文档、修改文档、删除文档、文档浏览4部分。 q 系统设置 系统设置包括用户管理、口令修改、日志管理、退出系统4部分。 2.2 系统功能结构 文档系统的功能结构如图1所示。 图1 文档管理功能图 2.3 设计目标 本系统是根据中小企业的实际需求而开发的,完全能够实现企业对制度文档的自动化管理,通过本系统可以达到以下目标: q 系统运行稳定,安全可靠。 q 界面设计美观,人机交互界面友好。 q 信息查询灵活、方便、快捷、准确,数据存储安全可靠。 q 操作员可以随
6、时修改自己的口令。 q 对用户输入的数据,系统进行严格的数据检验,尽可能排除人为的错误。 q 数据保密性强,为每个用户设置相应的权限级别。 3 系统设计 3.1 开发及运行环境 1.硬件要求 系统开发平台:Visual C++ 6.0 数据库管理系统软件:SQL Server 2000 运行平台:Windows xp/Windows 2000 3.2 数据库设计 1.数据库概要说明 数据库WenDGL中包括单位表、类别表、文档表、日志表、用户表5个数据表。 图2所示的即为本系统中数据库中的数据表结构图,该数据表结构图包含系统所有数据表。可以清晰地反应数据库信息。
7、 图2 数据库概要说明 2.主要数据表的结构 数据库中的数据表请参见附录B。 4 主要功能模块设计 4.1 建立工程框架 在Visual C++中建立文档管理系统的基本框架,步骤如下: (1)单击菜单“File-->New”命令,打开“New”对话框,单击“Projects”选项卡,选择“MFC AppWizard(exe)”,输入工程名,并设置路径,如图3所示。 图3 “New”对话框 (2),、单击“OK”按钮,弹出“MFC AppWizard-Step 1”对话框,如图4所示。 图4 “MFC AppWizard-Step 1”对话框 (3)选择
8、Dialog base”选项,单击“Next”按钮,在弹出的“MFC AppWizard-Step 2 of 4”对话框中,输入对话框标题,如图5所示。 图5 “MFC AppWizard-Step 2 of 4”对话框 (4)单击“Next”按钮,在接下来弹出的对话框中默认原有的选择项,最后设置好的对话框的属性如图6所示,单击“OK”按钮,新建工程成功。 图6 工程属性 4.2 封装数据库 1.添加ADO连接类 本实例采用ADO来连接SQL Server数据库,在使用ADO技术时,需要导入一个ADO动态链接库msado15.dll,该动态库位于系统盘下的“Prog
9、ram Files\Common Files\System\ado\”目录下。例如,如果您的系统盘为C盘,则该文件位于“C:\ Program Files\Common Files\System\ado\”目录。在Visual C++中,需要使用预处理命令#import,将动态库导入到系统中,代码如下。 #import "E:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")rename("BOF","adoBOF") 添加一个用来连接的ADO的类。在系统菜单中选择“
10、Insert-->New Class”选项,打开“New Class”窗口,选择“Generic Class”,然后输入类名,即完成了类的添加。代码如下。 创建ADO连接类。 class ADOConn { public: //添加一个指向Connection对象的指针 _ConnectionPtr m_pConnection; //添加一个指向Recordset对象的指针 _RecordsetPtr m_pRecordset; public: ADOConn(); virtual ~ADOConn(); //初始化--连接数据库 void
11、 OnInitADOConn(); //执行查询 _RecordsetPtr& GetRecordSet(_bstr_t bstrSQL); //执行SQL语句 BOOL ExecuteSQL(_bstr_t bstrSQL); //断开数据库连接 void ExitConnect(); }; 实现ADO连接类函数和程序代码如下。 void ADOConn::OnInitADOConn() { //初始化OLE/COM库环境 ::CoInitialize(NULL); try { //创建connection对象 m_pConnect
12、ion.CreateInstance("ADODB.Connection"); //设置连接字符串 _bstr_t strConnect="Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=WenDGL;Data Source=MRLZJ"; //SERVER和UID,PWD的设置根据实际情况来设置 m_pConnection->Open(strConnect,"","",adModeUnknown); } //捕捉异常
13、catch(_com_error e) { //显示错误信息 AfxMessageBox(e.Description()); } } _RecordsetPtr& ADOConn::GetRecordSet(_bstr_t bstrSQL) { try { //连接数据库,如果connection对象为空,则重新连接数据库 if(m_pConnection==NULL) OnInitADOConn(); //创建记录集对象 m_pRecordset.CreateInstance(__uuidof(Recordset));
14、 //取得表中的记录 m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText); } catch(_com_error e) { e.Description(); } //返回记录集 return m_pRecordset; } BOOL ADOConn::ExecuteSQL(_bstr_t bstrSQL) { _variant_t RecordsAffected; try
15、 { //是否已连接数据库 if(m_pConnection==NULL) OnInitADOConn(); //connection对象的Execute方法(_bstr_t CommandText, //VARIANT * RecordsAffected,long Options) //其中CommandText是命令字符串,通常是SQL命令 //参数RecordsAffected是操作完成后所影响的行数 //参数Options表示CommandText的类型,adCmdText-文本命令,adCmdTabl
16、e-表名 //adCmdProc-存储过程,adCmdUnknown-未知 m_pConnection->Execute(bstrSQL,NULL,adCmdText); return true; } catch(_com_error e) { e.Description(); return false; } } void ADOConn::ExitConnect() { //关闭记录集和连接 if(m_pRecordset!=NULL) m_pRecordset->Close(); m_pConnec
17、tion->Close(); //释放环境 ::CoUninitialize(); } 4.3 主窗口设计 1.菜单资源设计 主窗口菜单设置的主要步骤如下: (1)单击“ResourceView”选项卡,右键单击“WordGLXT Resources”选项,在快捷菜单中选择“Insert”菜单项,弹出“Insert Resource”窗口,如图7所示。 图7 “Insert Resource”窗口 (2)选择“Menu”文件夹,单击“New”按钮,在WordGLXT Resources目录下新增一个Menu目录项,菜单ID为IDR_MENU1。然后,双击此菜单,对
18、此菜单项的属性进行设计,如图8所示。 图8 “Insert Resource”窗口 2.客户区设计 (1)打开对话框IDD_WORDGLXT_DIALOG属性窗口,在对话框中添加1个Tree Control和1个RichEdit控件,右键单击Tree Control控件,将Has buttons/Has lines/Client edge/Lines at root选中,属性设置如表1所示。 表1 属性表 ID MemberVariables Type Member IDC_TREE1 CtrrCtrl
19、 m_tree ID_RICHEDITI CRichEditCtrl m_tichedit (2)预先在下边留出状态栏,声明Ctime、CstatusBarCtrl类对象实体,程序代码如下。 CTime t; CStatusBarCtrl m_StatusBar; 在程序中,引用外部变量。 extern CWordGLXTApp theApp; 在头文件中定义程序变量,代码如下。 CString str; CString strWord; CString strText; void AddtoTree(HTREEITEM m_node); HTREE
20、ITEM arrays[10],brrays[20],hitem[100]; HTREEITEM m_root,temp; CDwxxb dwb; CZdmlb mlb; CZdxxb xxb; CRizhib zhi; CImageList m_treeImageList; (3)在OnInitDialog成员函数中,添加状态栏以及给Tree控件定义图标,添加数据,代码如下所示。 // TODO: Add extra initialization here dwb.Load_dep(); mlb.Load_dep(); xxb.Load_dep(
21、); m_treeImageList.Create(16,16,ILC_MASK,4,1); m_treeImageList.Add(theApp.LoadIcon(IDI_ROOTICON)); m_treeImageList.Add(theApp.LoadIcon(IDI_CHILDICON1)); m_treeImageList.Add(theApp.LoadIcon(IDI_CHILDICON2)); m_treeImageList.Add(theApp.LoadIcon(IDI_CHILDICON4)); m_tree.SetImageList(&m_tree
22、ImageList,LVSIL_NORMAL); m_root=m_tree.InsertItem("基本信息管理",0,0); AddtoTree(m_root); m_tree.Expand(m_root,TVE_EXPAND); m_StatusBar.EnableAutomation(); m_StatusBar.Create(WS_CHILD|WS_VISIBLE,CRect(0,0,0,0),this,0); int width[]={200,400}; m_StatusBar.SetParts(4, &width[0]); m_StatusBar.
23、SetText("长春市明日科技有限公司",0,0); CString StatusText; StatusText.Format("当前用户:%s",user.GetUsername()); m_StatusBar.SetText(StatusText,0,1); t=CTime::GetCurrentTime(); CString strdate; strdate.Format("当前日期:%s",t.Format("%y-%m-%d")); m_StatusBar.SetText(strdate,0,2); return TRUE; // return
24、TRUE unless you set the focus to a control
(4)定义AddtoTree函数,将各表中数据按层次结构添加到Tree控件中,代码如下。
void CWordGLXTDlg::AddtoTree(HTREEITEM m_node)
{
int i,j;
for(i=0;i 25、
{
if(atoi(dwb.a_DWbh.GetAt(i))==atoi(mlb.a_DWbh.GetAt(j)))
{
brrays[j]=m_tree.InsertItem(mlb.a_LBmc.GetAt(j),2,2,arrays[i]);
}
}
}
for(i=0;i 26、))&&atoi(xxb.a_LBbh.GetAt(i))==atoi(mlb. a_LBbh.GetAt(j)))
{
hitem[i]=m_tree.InsertItem(xxb.a_WDmc.GetAt(i),3,3,brrays[j]);
}
}
}
m_tree.SetRedraw();
}
(5)为Tree控件添加OnDblclkTree1双击事件,程序代码如下。
void CWordGLXTDlg::OnDblclkTree1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add yo 27、ur control notification handler code here
CString strWjian="";
//读取当前节点
temp = m_tree.GetSelectedItem();
//将当前节点子节点付给temp
temp = m_tree.GetChildItem(temp);
if (temp != NULL)
{
while (temp!= NULL)
{
//取出temp中的文本
strText = m_tree.GetItemText(temp);
strWjian+=strText+"\n 28、";
//RichEdit控件显示数据
m_richedit.SetWindowText(strWjian);
//将temp的兄弟节点付给temp
temp = m_tree.GetNextItem(temp,TVGN_NEXT);
}
}
else
{
temp = m_tree.GetSelectedItem();
for(int i=0;i 29、xxb.a_WJlj.GetAt(i);
}
}
//word应用程序
_Application app;
//初始化连接
app.CreateDispatch("word.Application");
Documents doc;
CComVariant a (_T(strWord)),b(false),c(0),d(true),aa(0),bb(1);
_Document doc1;
doc.AttachDispatch( app.GetDocuments());
doc1.AttachDispatch(doc.Add 30、a,&b,&c,&d));
Range range;
//求出文档的所选区域
range = doc1.GetContent();//取出文件内容
str = range.GetText();
m_richedit.SetWindowText(str);
//关闭
app.Quit(&b,&c,&c);
//释放环境
app.ReleaseDispatch();
}
*pResult = 0;
}
(6)在Menu组合框中选择IDR_MENU1。单击工具栏中的“运行”按钮,看到系统的主界面如图9所示。
图9 系统运 31、行界面
(7)打开ClassWizard窗口,为菜单项ID_MENULIULWD添加代码,实现文档浏览功能。
void CWordGLXTDlg::OnMenuliulwd()
{
// TODO: Add your command handler code here
CString strd,strs;
for(int i=0;i 32、8)为菜单项ID_MENURZGL添加代码,实现日志管理功能。
void CWordGLXTDlg::OnMenurzgl()
{
// TODO: Add your command handler code here
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
CString sql,sqlzd="用户名 \t登录时间\t动作\n";
sql.Format("select* from Rizhib");
m_AdoConn.GetRecordSet((_bstr_t)sql);
while(m_Ado 33、Conn.m_pRecordset->adoEOF==0)
{
sqlzd+=(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("name");
sqlzd+=" \t";
sqlzd+=(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("DLsj");
sqlzd+="\t";
sqlzd+=(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("dz");
sqlzd+="\n";
m_Ado 34、Conn.m_pRecordset->MoveNext();
m_richedit.SetWindowText(sqlzd);
}
m_AdoConn.ExitConnect();
}
(9)为菜单项ID_EXIT添加代码,程序调用OnOK()函数关闭对话框,退出系统。
void CWordGLXTDlg::OnExit()
{
// TODO: Add your command handler code here
OnOK();
}
4.4 登录模块设计
1.实现目标
登录模块功能是完成用户登录本系统的操作,用户登录对话框的设计如图10所示。
35、图10 用户登录对话框
2.设计步骤
(1)向项目中添加一个新Dialog资源,资源ID为IDD_DIALOGIN。在IDD_DLALOGIN对话框资源中单击鼠标右键,执行弹出快捷菜单的“Properties”菜单命令,打开“Dialog Properties”对话框。在“Dialog Properties”对话框中选择General选项卡,更改其“Caption”文本框内容为“用户登录”。
(2)从Controls面板上向Dialog资源中添加2个Static、2个Edit,更改资源的属性,并为资源设置相对应的变量,如表2所示。
表2 36、 资源设置
ID
Properties
Member Variables
Type
Member
IDC_EDIT1
默认
CString
m_name
IDC_ EDIT2
PassWord TRUE
CString
m_pwd
IDOK
Caption 登录
IDCANCEL
Caption 退出
3.代码分析
(1)引用函数外部的变量。
extern CUsers user;
(2)在头文件定义程序变量。
CString jb;
CRizhib zhi;
CTime t;
(3)响应“登录”按钮的程序代码 37、如下。
void CDialogin::OnOK()
{
// TODO: Add extra validation here
//将对话框中编辑框的数据读取到成员变量中
UpdateData(true);
//检查数据有效性
if(m_name=="")
{
MessageBox("请输入用户名");
return;
}
//如果读取数据和用户输入不同,则返回
if(user.HaveCzy(m_name,m_pwd)!=1)
{
MessageBox("用户名或密码错误!");
return;
}
user.Se 38、tUsername(m_name);
//判断用户级别
jb="1";
if(user.HaveCzyjb(m_name,m_pwd,jb)==1)
{
user.SetJB(jb);
}
else
{
user.SetJB("0");
}
//读取当前系统时间
t=CTime::GetCurrentTime();
//将登录动作记录到日志表
zhi.SetDLsj(t.Format("%y-%m-%d"));
zhi.SetName(user.GetUsername());
zhi.SetDZ("登录");
zhi.sq 39、l_insert();
CDialog::OnOK();
}
下面在主对话框中添加代码,使对话框在启动时首先打开登录对话框。在主窗口选择OnInitDialog函数,该函数将打开登录对话框,如果用户不是通过单击“登录”按钮关闭对话框,则调用OnOK函数关闭主对话框,具体代码如下。
BOOL CWordGLXTDlg::OnInitDialog()
{
CDialog::OnInitDialog();
...
// TODO: Add extra initialization here
CDialogin gin;
if(gin.DoModal()!=IDOK)
40、 OnOK();
......
return TRUE; // return TRUE unless you set the focus to a control
}
4.7 文档管理模块设计
1.实现目标
用于查看、添加、修改、删除文档信息,文档管理对话框的设计如图11所示。
图11 文档管理对话框
2.设计步骤
(1)向项目中添加一个新Dialog资源,资源IDD_WDgldlg。在IDD_WDgldlg对话框资源中单击鼠标右键,执行弹出快捷菜单的“Properties”菜单命令,打开“Dialog Properties”对话框。在“Dialog Prope 41、rties”对话框中选择General选项卡,更改其“Caption”文本框内容为“文档管理”。
(2)从Controls面板上向Dialog资源中添加7个Static、7个Edit、2个Button、2个Radio、1个Tab、1个ListControl、1个Combo、1个Group控件,更改资源的属性,并为资源设置相对应的变量,如表3所示。
表3 资源设置
ID
Properties
Member Variables
Type
Member
IDC_EDIT1
默认
CString
m_dwmc
IDC 42、EDIT2
默认
CString
m_wdlb
IDC_EDIT3
默认
int
m_wdbh
IDC_EDIT4
默认
CString
m_wdmc
IDC_EDIT5
默认
CString
m_gjz
IDC_EDIT6
默认
CEdit
m_wjlj
IDC_EDIT7
默认
CString
m_memo
IDC_TAB1
默认
CTabCtrl
m_tab
IDC_LIST1
View: Report; Align: left
CListCtrl
m_list
IDC_RADIO1
Caption 添加
43、
IDC_RADIO2
Caption 修改
IDC_STATIC8
Caption 选择
IDC_COMBO1
默认
CComboBox
m_combo
IDC_WJLJXZ
Caption ......
IDOK
Caption 保存
IDCANCEL
Caption 退出
IDC_BUTTONDEL
Caption 删除
3.代码分析
(1)使用函数外部的变量。
extern CUsers user;
(2)在头文件定义的变量。
int wdbh;
int lbbh;
int 44、dwbh;
int str;//单选按钮
CString strText;
CDwxxb dwb;
CZdmlb mlb;
CZdxxb xxb;
CRizhib zhi;
CTime t;
UINT tabindex;
(3)添加OnInitDialog函数,此函数用于初始化Tab控件、为ListControl控件赋值,其代码如下:
BOOL CWDgldlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_hIcon = AfxGetApp()->LoadIcon(IDI_CHILDICON4);
45、 // TODO: Add extra initialization here
SetIcon(m_hIcon, TRUE);
TC_ITEM tci;
tci.mask=TCIF_TEXT;
tci.pszText="基本信息";
m_tab.InsertItem(0,&tci);
tci.pszText="信息删除";
m_tab.InsertItem(1,&tci);
dwb.Load_dep();
mlb.Load_dep();
xxb.Load_dep();
t=CTime::GetCurrentTime();
UpdateData( 46、true);
for(int i=0;i 47、umn(2,"文档编号",LVCFMT_LEFT,100,2);
m_list.InsertColumn(3,"文档名称",LVCFMT_LEFT,100,3);
m_list.InsertColumn(4,"关键字",LVCFMT_LEFT,100,4);
m_list.InsertColumn(5,"文档路径",LVCFMT_LEFT,100,5);
m_list.InsertColumn(6,"备注",LVCFMT_LEFT,100,6);
CString dwmc[100],wdlb[100],pp;
//根据单位编号返回单位名称
for(i=0;i 48、a_WDmc.GetSize();i++)
{
for(int j=0;j 49、GetAt(j)) && atoi(xxb.a_LBbh.GetAt(i))==atoi(mlb.a_LBbh.GetAt(j)))
{
wdlb[i]= mlb.a_LBmc.GetAt(j)
}
}
}
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
CString sql;
sql.Format("select* from Zdxxb order by wdbh desc");
m_AdoConn.GetRecordSet((_bstr_t)sql);
while(m_Ad 50、oConn.m_pRecordset->adoEOF==0)
{
m_list.InsertItem(0,"");
m_list.SetItemText(0,0,dwmc[i-1]);
m_list.SetItemText(0,1,wdlb[i-1]);
m_list.SetItemText(0,2,(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("wdbh"));
m_list.SetItemText(0,3,(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetColle






