浅谈文档管理系统的设计与实现Word文档格式.docx
《浅谈文档管理系统的设计与实现Word文档格式.docx》由会员分享,可在线阅读,更多相关《浅谈文档管理系统的设计与实现Word文档格式.docx(47页珍藏版)》请在冰豆网上搜索。
3.通过系统可以完成对文档一系列日常操作。
4.保证系统的安全性、可靠性。
2总体设计
2.1项目规划
文档管理系统由基本信息、文档管理、系统设置等几个功能模块组成,规划系统功能模块如下:
基本信息:
基本信息包括单位档案、文档类别2部分。
文档管理:
文档管理包括添加文档、修改文档、删除文档、文档浏览4部分。
系统设置:
系统设置包括用户管理、口令修改、日志管理、退出系统4部分。
2.2系统功能结构
文档系统的功能结构如图1所示。
图1文档管理功能图
2.3设计目标
本系统是根据中小企业的实际需求而开发的,完全能够实现企业对制度文档的自动化管理,通过本系统可以达到以下目标:
系统运行稳定,安全可靠。
界面设计美观,人机交互界面友好。
信息查询灵活、方便、快捷、准确,数据存储安全可靠。
操作员可以随时修改自己的口令。
对用户输入的数据,系统进行严格的数据检验,尽可能排除人为的错误。
数据保密性强,为每个用户设置相应的权限级别。
3系统设计
3.1开发及运行环境
系统开发平台:
VisualC++6.0
数据库管理系统软件:
SQLServer2000
运行平台:
Windowsxp/Windows2000
3.2数据库设计
1.数据库概要说明
数据库WenDGL中包括单位表、类别表、文档表、日志表、用户表5个数据表。
图2所示的即为本系统中数据库中的数据表结构图,该数据表结构图包含系统所有数据表。
可以清晰地反应数据库信息。
图2数据库概要说明
2.主要数据表的结构
数据库中的数据表请参见附录B。
4主要功能模块设计
4.1建立工程框架
在VisualC++中建立文档管理系统的基本框架,步骤如下:
(1)单击菜单“File-->
New”命令,打开“New”对话框,单击“Projects”选项卡,选择“MFCAppWizard(exe)”,输入工程名,并设置路径,如图3。
图3“New”对话框
(2)单击“OK”按钮,弹出“MFCAppWizard-Step1”对话框,如图4。
图4“MFCAppWizard-Step1”对话框
(3)选择“Dialogbase”选项,单击“Next”按钮,在弹出的“MFCAppWizard-Step2of4”对话框中,输入对话框标题,如图5所示。
图5“MFCAppWizard-Step2of4”对话框
(4)单击“Next”按钮,在接下来弹出的对话框中默认原有的选择项,最后设置好的对话框的属性如图6所示,单击“OK”按钮,新建工程成功。
图6工程属性
4.2封装数据库
1.添加ADO连接类
本实例采用ADO来连接SQLServer数据库,在使用ADO技术时,需要导入一个ADO动态链接库msado15.dll,该动态库位于系统盘下的“ProgramFiles\CommonFiles\System\ado\”目录下。
例如,如果您的系统盘为C盘,则该文件位于“C:
\ProgramFiles\CommonFiles\System\ado\”目录。
在VisualC++中,需要使用预处理命令#import,将动态库导入到系统中,代码如下。
#import
"
E:
\Program
Files\Common
Files\System\ado\msado15.dll"
no_namespacerename("
EOF"
"
adoEOF"
)rename("
BOF"
adoBOF"
)
添加一个用来连接的ADO的类。
在系统菜单中选择“Insert-->
NewClass”选项,打开“NewClass”窗口,选择“GenericClass”,然后输入类名,即完成了类的添加。
代码如下。
创建ADO连接类。
classADOConn
{
public:
//添加一个指向Connection对象的指针
_ConnectionPtrm_pConnection;
//添加一个指向Recordset对象的指针
_RecordsetPtrm_pRecordset;
ADOConn();
virtual~ADOConn();
//初始化--连接数据库
voidOnInitADOConn();
//执行查询
_RecordsetPtr&
GetRecordSet(_bstr_tbstrSQL);
//执行SQL语句
BOOLExecuteSQL(_bstr_tbstrSQL);
//断开数据库连接
voidExitConnect();
};
实现ADO连接类函数和程序代码如下。
voidADOConn:
:
OnInitADOConn()
//初始化OLE/COM库环境
:
CoInitialize(NULL);
try
{
//创建connection对象
m_pConnection.CreateInstance("
ADODB.Connection"
);
//设置连接字符串
_bstr_tstrConnect="
Provider=SQLOLEDB.1;
IntegratedSecurity=SSPI;
PersistSecurityInfo=False;
InitialCatalog=WenDGL;
DataSource=MRLZJ"
;
//SERVER和UID,PWD的设置根据实际情况来设置
m_pConnection->
Open(strConnect,"
adModeUnknown);
}
//捕捉异常
catch(_com_errore)
//显示错误信息
AfxMessageBox(e.Description());
}
_RecordsetPtr&
ADOConn:
GetRecordSet(_bstr_tbstrSQL)
//连接数据库,如果connection对象为空,则重新连接数据库
if(m_pConnection==NULL)
OnInitADOConn();
//创建记录集对象
m_pRecordset.CreateInstance(__uuidof(Recordset));
//取得表中的记录
m_pRecordset->
Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
e.Description();
//返回记录集
returnm_pRecordset;
BOOLADOConn:
ExecuteSQL(_bstr_tbstrSQL)
_variant_tRecordsAffected;
//是否已连接数据库
if(m_pConnection==NULL)
OnInitADOConn();
//connection对象的Execute方法(_bstr_tCommandText,
//VARIANT*RecordsAffected,longOptions)
//其中CommandText是命令字符串,通常是SQL命令
//参数RecordsAffected是操作完成后所影响的行数
//参数Options表示CommandText的类型,adCmdText-文本命令,adCmdTable-表名
//adCmdProc-存储过程,adCmdUnknown-未知
m_pConnection->
Execute(bstrSQL,NULL,adCmdText);
returntrue;
returnfalse;
ExitConnect()
//关闭记录集和连接
if(m_pRecordset!
=NULL)
m_pRecordset->
Close();
//释放环境
CoUninitialize();
4.3主窗口设计
1.菜单资源设计
主窗口菜单设置的主要步骤如下:
(1)单击“ResourceView”选项卡,右键单击“WordGLXTResources”选项,在快捷菜单中选择“Insert”菜单项,弹出“InsertResource”窗口,如图7所示。
图7“InsertResource”窗口
(2)选择“Menu”文件夹,单击“New”按钮,在WordGLXTResources目录下新增一个Menu目录项,菜单ID为IDR_MENU1。
然后,双击此菜单,对此菜单项的属性进行设计,如图8所示。
图8“InsertResource”窗口
2.客户区设计
(1)打开对话框IDD_WORDGLXT_DIALOG属性窗口,在对话框中添加1个TreeControl和1个RichEdit控件,右键单击TreeControl控件,将Hasbuttons/Haslines/Clientedge/Linesatroot选中,属性设置如表1所示。
表1属性表
ID
MemberVariables
Type
Member
IDC_TREE1
CtrrCtrl
m_tree
ID_RICHEDITI
CRichEditCtrl
m_tichedit
(2)预先在下边留出状态栏,声明Ctime、CstatusBarCtrl类对象实体,程序代码如下。
CTimet;
CStatusBarCtrlm_StatusBar;
在程序中,引用外部变量。
externCWordGLXTApptheApp;
在头文件中定义程序变量,代码如下。
CStringstr;
CStringstrWord;
CStringstrText;
voidAddtoTree(HTREEITEMm_node);
HTREEITEMarrays[10],brrays[20],hitem[100];
HTREEITEMm_root,temp;
CDwxxbdwb;
CZdmlbmlb;
CZdxxbxxb;
CRizhibzhi;
CImageListm_treeImageList;
(3)在OnInitDialog成员函数中,添加状态栏以及给Tree控件定义图标,添加数据,代码如下所示。
//TODO:
Addextrainitializationhere
dwb.Load_dep();
mlb.Load_dep();
xxb.Load_dep();
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_treeImageList,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);
intwidth[]={200,400};
m_StatusBar.SetParts(4,&
width[0]);
m_StatusBar.SetText("
长春市明日科技有限公司"
CStringStatusText;
StatusText.Format("
当前用户:
%s"
user.GetUsername());
m_StatusBar.SetText(StatusText,0,1);
t=CTime:
GetCurrentTime();
CStringstrdate;
strdate.Format("
当前日期:
t.Format("
%y-%m-%d"
));
m_StatusBar.SetText(strdate,0,2);
returnTRUE;
//returnTRUEunlessyousetthefocustoacontrol
(4)定义AddtoTree函数,将各表中数据按层次结构添加到Tree控件中,代码如下。
voidCWordGLXTDlg:
AddtoTree(HTREEITEMm_node)
inti,j;
for(i=0;
i<
dwb.a_DWbh.GetSize();
i++)
arrays[i]=m_tree.InsertItem(dwb.a_DWmc.GetAt(i),1,1,m_node);
for(j=0;
j<
mlb.a_DWbh.GetSize();
j++)
{
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]);
}
}
xxb.a_WDbh.GetSize();
if(atoi(xxb.a_DWbh.GetAt(i))==atoi(mlb.a_DWbh.GetAt(j))&
&
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双击事件,程序代码如下。
OnDblclkTree1(NMHDR*pNMHDR,LRESULT*pResult)
Addyourcontrolnotificationhandlercodehere
CStringstrWjian="
//读取当前节点
temp=m_tree.GetSelectedItem();
//将当前节点子节点付给temp
temp=m_tree.GetChildItem(temp);
if(temp!
=NULL)
while(temp!
//取出temp中的文本
strText=m_tree.GetItemText(temp);
strWjian+=strText+"
\n"
//RichEdit控件显示数据
m_richedit.SetWindowText(strWjian);
//将temp的兄弟节点付给temp
temp=m_tree.GetNextItem(temp,TVGN_NEXT);
else
temp=m_tree.GetSelectedItem();
for(inti=0;
if(temp==hitem[i])
//取出temp对应的文档路径
strWord=xxb.a_WJlj.GetAt(i);
//word应用程序
_Applicationapp;
//初始化连接
app.CreateDispatch("
word.Application"
Documentsdoc;
CComVarianta(_T(strWord)),b(false),c(0),d(true),aa(0),bb
(1);
_Documentdoc1;
doc.AttachDispatch(app.GetDocuments());
doc1.AttachDispatch(doc.Add(&
a,&
b,&
c,&
d));
Rangerange;
//求出文档的所选区域
range=doc1.GetContent();
//取出文件内容
str=range.GetText();
m_richedit.SetWindowText(str);
//关闭
app.Quit(&
c);
//释放环境
app.ReleaseDispatch();
*pResult=0;
(6)在Menu组合框中选择IDR_MENU1。
单击工具栏中的“运行”按钮,看到系统的主界面如图9所示。
图9系统运行界面
(7)打开ClassWizard窗口,为菜单项ID_MENULIULWD添加代码,实现文档浏览功能。
OnMenuliulwd()
Addyourcommandhandlercodehere
CStringstrd,strs;
for(inti=0;
strd=xxb.a_WDmc.GetAt(i);
strs+=strd+"
m_richedit.SetWindowText(strs);
(8)为菜单项ID_MENURZGL添加代码,实现日志管理功能。
OnMenurzgl()
ADOConnm_AdoConn;
m_AdoConn.OnInitADOConn();
CStringsql,sqlzd="
用户名\t登录时间\t动作\n"
sql.Format("
select*fromRizhib"
m_AdoConn.GetRecordSet((_bstr_t)sql);
while(m_AdoConn.m_pRecordset->
adoEOF==0)
sqlzd+=(char*)(_bstr_t)m_AdoConn.m_pRecordset->
GetCollect("
name"
sqlzd+="
\t"
DLsj"
\t"
dz"
m_AdoConn.m_pRecordset->
MoveNext(