comments 文本 No No 1-7为职类型设置表 字段名称 类型 ID 自动编号 workstatus 文本
图1-9为基本档案信息表 字段名称 类型 ID 自动编号 code 文本 sort 文本 date1 文本 Company 文本 Dept 文本 Duty 文本 level 文本
主键 Yes No 非空 Yes Yes 主键 yes No No No No No No No 非空 Yes Yes No No No No No No
三、总体设计
对第三章需求分析所得出的系统流程图,具体功能说明进行归类总结,并依据模块的特征以及独立性原则对系统进行分析后,不难得出系统的模块结构组成,以及各个模块之间的关系。
模块的设计
用模块化原理进行软件设计时;为了得到一组最好的模块集合,应该根据信息隐蔽原理对软件进行分解。也就是应该这样来设计和确定模块,使得一个模块内包含的信息(数
据和过程)对手不需要这些信息的模块是不能访问的。
模块独立的概念,是模块化、抽象和信息隐蔽的直接结果。模块独立是指该模块能完成一个相对独立的特定子功能,并且与其他模块之间的接口很简单。模块独立有两个优势:一是具有独立模块的软件比较容易开发出来,这是因为能够分割功能,接口可以简化,并且有利于团队合作;二是独立的模块比较容易测试和维护,这是因为错误传播范围小。所以,提高模块独立性是设计模块的根本目标。
本系统为数据库应用程序,主要是对数据库中记录的增加、修改、删除等操作,模块内部的各个组成部分的处理动作全都为数据库的操作功能存在。因此,系统中模块的聚合种类应为功能聚合。功能聚合模块具有定义很清楚的界面,它可以单独地被理解,进一步设计,然后再同其他模块连接起来。
从模块特征以及模块独立性角度出发,得出以下结论:系统中模块的独立性要高,即耦合程度要低;模块的聚合程度要高,即尽量采用功能聚合。
运行Visual C++后,选择文件 “新建工程”菜单。然后从工程模块中选择“标准EXE”项。单击确定按钮。Visual C++就会自动生成一个窗体,这个窗体的属性采用的都是默认的设置。在这个实例中,先册初这个窗体,然后选择“文件”在选“保存工程”菜单。在出现的“文件另存为”对话框中输入这个工程项目的名称为Manager并且选择这个工程的目录,单击“保存”按钮,保存工程。。在这个系统中,每个功能模块都要使用数据库,因此可以使用一个公用的数据库操作函数,来执行一系列的SQL语句。
四、详细设计
详细设计的意义
软件详细设计是指对软件模块的过程设计。其主要任务是对总体设计所产生的功能模块进行过程描述,开发一个可以直接转换成程序语言代码的软件表示。这种表示应当是无歧义性并且是高度结构化的。详细设计阶段不是具体地编写程序,而是设计出程序的“蓝图”,程序员再根据这些蓝图进行编码。因此,详细设计的结果基本上决定了最终的程序代码的质量。衡量程序的质量不仅要看它在逻辑上是否正确地描述每个模块的功能,更重要地是要看它是否容易阅读、测试和维护。因此,要求详细设计表示的软件过程应具有高度的结构化构造。所以结构化程序设计是完成上述任务的关键技术。
各模块及界面详细设计
权限验证模块的界面设计
该模块通过登录对话框为用户提供操作界面,界面的设计效果如下图:
通过定CloginDlg 类来实现权限验证模块的功能,其登录对话框的初始化代码如下:BOOL CLoginDlg::OnInitDialog() {
CDialog::OnInitDialog();
CPassWord recordset ; CString strSQL; UpdateData(TRUE);
//strSQL.Format(\passwd='%s'\ strSQL=\
if(!recordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL)) { MessageBox(\打开数据库失败!\数据库错误\ return FALSE; }
while(!recordset.IsEOF()) { m_ctrUser.AddString(recordset.m_user); recordset.MoveNext(); }
recordset.Close(); return TRUE;
用户的权限验证的处理是从数据库中查找是否有与用户输入的用户名和密码完全一样的记录,如果有根据数据库中的记录为该用户分配权限,如果不存在则提示登录不错误的信息。
其代码如下:
void CLoginDlg::OnOK() {
CPassWord recordset; CString strSQL;
CManagerApp* ptheApp = (CManagerApp *) AfxGetApp();
UpdateData(TRUE); //检查用户名是否输入 if(m_strUser.IsEmpty()) { AfxMessageBox(\请输入用户名!\ m_ctrUser.SetFocus(); return; }
if(m_strPass.IsEmpty()) { AfxMessageBox(\请输入密码!\ m_ctrPass.SetFocus(); return; }
//从用户表中检查用户名密码是否正确
strSQL.Format(\passwd='%s'\
if(!recordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL)) { MessageBox(\打开数据库失败!\数据库错误\ return ; }
if(recordset.GetRecordCount()==0) { //密码错误处理 recordset.Close(); MessageBox(\密码错误,请重新输入!\ m_strPass=\ m_ctrPass.SetFocus(); UpdateData(FALSE); } else { //分配用户权限 ptheApp->m_bIsAdmin = recordset.m_isadmin; recordset.Close(); CDialog::OnOK(); }
用户控制模块及界面详细设计
该模块通过用户设置对话框为用户提供操作界面,界面的设计效果如下图:
其实行代码如下:
BOOL CUserDlg::OnInitDialog() { CDialog::OnInitDialog(); //创建用户列表 m_ctrList.InsertColumn(0,\用户名\ m_ctrList.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); m_ctrList.SetColumnWidth(0,120); //在添加用户列表中添加用户名 RefreshData(); return TRUE; }
void CUserDlg::RefreshData() { m_ctrList.SetFocus(); //清空用户列表 m_ctrList.DeleteAllItems(); m_ctrList.SetRedraw(FALSE); CString strSQL; UpdateData(TRUE); //打开记录集 strSQL=\ if(!m_recordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL)) { MessageBox(\打开数据库失败!\数据库错误\ return ; } //添加用户名到用户列表中 int i=0; while(!m_recordset.IsEOF()) { m_ctrList.InsertItem(i++,m_recordset.m_user); m_recordset.MoveNext(); } m_recordset.Close(); m_ctrList.SetRedraw(TRUE);