• 1.49 MB
  • 2022-04-22 13:33:25 发布

人事信息管理系统的分析与设计毕业论文.doc

  • 49页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'人事信息管理系统人事信息管理系统的分析与设计毕业论文目录前言11绪论11.1问题的提出11.2课题的背景及意义12系统需求分析22.1系统开发策略22.2系统功能需求分析23系统分析与设计33.1系统功能模块设计33.2数据库设计ER图43.3数据库物理结构表的描述44代码设计与实现54.1人事信息管理系统代码设计与实现54.2代码开发65软件测试365.1系统模块测试365.2研究成果366技术难点及解决376.1一般用户和管理员操作权限问题376.2设置对话框中Static控件字体的大小及颜色,代码如下:436.3设置ListControl控件的行高,及屏蔽空白行代码实现:436.4设置照片,代码如下:436.5工资的计算问题487总结及展望4848 人事信息管理系统致谢语48参考文献48绪论1.1问题的提出随着计算机和网络技术的广泛应用,人事档案管理系统成为现代企业管理中不可缺少的一部分。为适应现代企业制度要求,实现企业劳动人事档案管理的科学化和规范化,从而提出了企事业单位人事档案管理系统开发的课题。1.2课题的背景及意义企事业单位人事档案管理工作是一种繁琐的,务求准确讯速的信息检索工作。特别是对在岗人员、离退人员、工资发放、职称评定等信息的管理,具有典型的信息处理管理模式。本设计以人事档案管理为入口点,提出了基于面向对象的数据库应用系统开发技术——VisualC++6.0为设计工具,以软件工程设计规则为指导的人事档案管理系统。该课题基于VisualC++6.0数据库应用系统开发技术进行开发,达到了提高企事业单位人事档案管理信息处理效率的效果。2系统需求分析2.1系统开发策略本系统开发主要采用自顶向下的开发方式,自顶向下的方法模型如下图所示:图1.开发模型图48 人事信息管理系统1.1系统功能需求分析1.1.1人事档案管理系统的系统分析概述现在的世界是信息的世界,随着信息量越来越大以及计算机技术的发展,计算机已成为各企事业单位管理的重要工具。人事档案管理是对员工信息、部门信息、岗位信息、出勤信息、工资信息的管理和快速方便的查询。系统开发主要有以下六个模块组成:a)在人事管理模块中实现了,人员档案管理与人事管理等功能;b)在出勤管理模块中实现了,员工的考勤管理等功能;c)在工资管理模块中实现了,员工工资的管理等功能;d)在系统管理模块中实现了,有关基本表的更新以及数据的备份和恢复的管理功能e)在用户管理模块中实现了,有关系统用户管理及权限的分配管理;f)最后用帮助模块,让使用者了解本系统,并帮助使用者如何更好的使用本系统。1.1.2系统流程图本系统的系统流程图如下:48 人事信息管理系统图1.系统流程图1系统分析与设计1.1系统功能模块设计模块结构图48 人事信息管理系统图1.模块结构图1.1数据库设计ER图(详细信息见数据库设计概念模型)1.2数据库物理结构表的描述主要表格如下:(详细见数据库编码)员工:EM_Employee存放员工基本信息奖惩记录:EM_RewPun_Rec模块划分:EM_ModuleClass工资:EM_Salary模块划分的值对应表名称模块编号模块名称模块对应值功能描述编码MS_IDMSModuleNameMSValue 00001人事管理1控制"人事管理"下所有的模块00002出勤管理2控制"出勤管理"下所有的模块00003工资管理4控制"工资管理"下所有的模块00004系统管理8控制"系统管理"下:①基本信息,②部门管理48 人事信息管理系统00005用户管理16控制"用户管理"下:①系统操作员管理,②权限管理00006数据库管理32控制"系统管理"下:①数据恢复备份,②系统初始化1代码设计与实现1.1人事信息管理系统代码设计与实现1.1.1系统主界面图1.系统主界面图1.1.2数据库表关联定义详细信息见数据库物理模型1.1.3模块间的关系人事管理模块对员工的各种基本信息进行管理,考勤管理对员工的上下班情况及请假加班等情况进行管理,工资管理对员工的基本工资、工资构成、税率管理、补贴管理及员工的月度工资管理,月度工资通过考勤管理里的加班情况、出勤情况、请假情况、出差情况核算加班费、请假扣费、出差补贴等。系统管理主要管理单个的基本表项、部门管理、数据备份与恢复等。用户管理对系统的用户操作权限及密码修改管理。48 人事信息管理系统1.1代码开发1.1.1CDlgLogin窗口图1.登录界面图登录对话框通过读取数据库中用户名和密码对用户输入的用户名和密码进行校验,如果用户名或密码为空或错误当用户点击登录时弹出如下提示:图2.用户名输入提示图图3.密码输入提示图图4.密码错误提示图48 人事信息管理系统图1.用户名错误提示图如果非法输入次数超过6次,将弹出如下提示:图2.登录出错提示图系统将自动退出登录,用户输入的密码通过调用CCrypt加密类cy的生成密钥函数cy.Key_creator(sUserPassWord),调用加密函数对密码进行加密cy.Encrypt(sUserPassWord),将加密后的密码与数据库中保存的用户名对应密码进行比较,如果相等的话根据用户表中该用户的权限显示该用户能够管理的模块,其它模块设置为灰色不可点击。管理员用户可以操作系统的所有模块。1.1.1加密类函数的主要代码生成密钥函数:voidCCrypt::Key_creator(CStringS)//生成常量C1,C2以及加密解密Key{inti,j;unsignedshortk=0;C1=1;C2=1;for(i=0,j=S.GetLength()-1;(i!=j)&&(i!=j+1);i++,j--){C1=int(S[i])^(C1<<8);C2=int(S[j])^(C2<<8);}De_key=(C1*C2/S.GetLength())&(~k);En_Key=De_key;48 人事信息管理系统}加密函数:CStringCCrypt::Encrypt(CStringS)//加密函数{CStringResult,str,back;inti,j;//ch=S;Result=S;//初始化结果字符串for(i=0;i>8);//将密钥移位后与字符异或Result.SetAt(i,S.GetAt(i)^(En_Key>>8));if(i>8);//将密钥移位后与字符异或Result.SetAt(i,(BYTE)S.GetAt(i)^(De_key>>8));if(iadoEOF){vBefID=atoi((LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("EmpID"));m_pRecordset->MoveNext();if(m_pRecordset->adoEOF)break;vAftID=atoi((LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("EmpID"));if((vAftID-vBefID)>1){vID=vBefID;48 人事信息管理系统break;}}if(m_pRecordset->adoEOF)vID=vBefID;vID+=1;vEmpID.Format("%05d",vID);插入员工基本信息时,基本信息比如象民族、专业、籍贯等信息可以通过从下拉菜单中选择,而不用手工输入,信息中有关时间的信息可以通过点击下拉框选择时间来设置。当员工插入完成后点击保存退出。ConeEmpRec对话框中“上一个”按钮代码如下:strSql.Format("select*fromEM_Employee");m_pRecordset=ado.GetRecordSet(_bstr_t(strSql));while(!m_pRecordset->adoEOF){vEmpID=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("EmpID");if(vEmpID==m_EmpID)break;elsem_pRecordset->MoveNext();}m_pRecordset->MovePrevious();if(m_pRecordset->adoBOF)m_pRecordset->MoveLast();vEmpID=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("EmpID");当目前已经是最后一个员工时,自动显示第一个员工的相关信息。“下一个”同理自动显示最后一个员工信息。员工社会关系、员工辅助信息、员工个人经历的界面差不多类似,如下48 人事信息管理系统图1.员工社会关系、员工辅助信息、员工个人经历图获取选中行代码如下:pos=m_EmpInfo.GetFirstSelectedItemPosition();if(!pos)return;Index=m_EmpInfo.GetNextSelectedItem(pos);//得到项目索引dlg.EmpID=m_EmpInfo.GetItemText(Index,1);//获取员工编号人事管理模块中职称评定管理、奖惩管理、培训记录管理、人事变动管理、考评管理、福利品领取管理等界面类似,界面如下:48 人事信息管理系统图1.职称评定管理、奖惩管理、培训记录管理、人事变动管理、考评管理、福利品领取管理等界面图1.1.1出勤管理出勤管理主要包括考勤记录、请假记录、加班记录、出差记录、月度考勤记录五个部分。考勤记录是负责对员工的上下班时间进行记录,包括添加、删除、修改;计算工作时间假记录记录员工请假次数,在核算员工工资时将根据请假次数进行工资核算;加班记录记录员工加班的时间、日期及加班类型,核算工资时将根据加班类型及加班时间核算加班工资;出差记录记录员工的出差类型、出差地点、出差开始时间、出差结束时间、出差任务等,其中出差类型及时间将在工资核算时计算出差补贴;月度考勤记录记录了员工一个月中累积加班时间、累计请假时间、累计旷工次数、累计出差时间、迟到早退次数,其中累计矿工次数及累计迟到早退次数也将在工资核算中扣除相应金额。48 人事信息管理系统图1.员工出勤管理图1.1.1工资管理工资管理主要包括对工资等级、工资构成项目、税率管理、节日补贴、月度工资等管理。工资等级,对工资等级的添加、修改、删除,主要是方便用人事管理对员工工资的添加、修改,通过对工资等级的修改可以对员工同一等级进行批量修改。工资构成项目,是对于工资由哪些项目构成的管理及这些项目是税前还是税后及加、减等的管理。界面如下:图2.工资构成图税率管理,是对员工应纳税的税率及纳税金额的上下限、速算扣除数等的管理,方便月度工资中核算税后工资。48 人事信息管理系统节日补贴管理,是公司对于员工各种法定节日及员工生日发放给员工的补贴。月度工资管理,实现了对员工的月度工资的添加、修改、删除、查询、导出到Excel等的管理,基本工资是根据是人事管理哪里读取的,加班费通过加班类型及加班时间计算,出差补贴按照每种出差类型的补贴*次数的和,额外税前是通过工资管理员设置的,设置界面如下图1),应发工资计算公式:应发工资金额=基本工资+加班费+出差补助-请假扣款+额外税前项,额外税后、节日补贴是通过工资管理员设置的,设置界面如下图2),税后工资计算公式:税后工资=应发工资金额-纳税金额;税金额计算公式:纳税金额=应纳税金额*适合税率-速算扣除数而应纳税金额=应发工资金额-纳税基数(1000);实发工资=税后工资+税后应加项-税后应扣项+纳税基数。月度工资管理的主界面:图1.月度工资管理图48 人事信息管理系统图1.额外税前计算图图2.额外税后计算图月度工资表导出至Excel效果如下图:图3.工资表导出样式图查询时的通过选择下拉框中的员工姓名或月份查看工资信息,当选择变化时通过调用SelecteConditionSet()函数改变查询条件,然后调用Displaytxt()显示查询后的结果,SelecteConditionSet()主要代码:voidCSalary::SelecteConditionSet(){UpdateData(TRUE);condition_SQL="";m_Condition_month.GetWindowText(vCondition_month);m_Condition_name.GetWindowText(vCondition_name);48 人事信息管理系统if(vCondition_name!="所有"){vCondition_EmpID=ds.NameToID(vCondition_name);condition_SQL=condition_SQL+"andEM_Salary.EmpID=""+vCondition_EmpID+""";}//EM_Salary.EmpIDif(vCondition_month!="所有")condition_SQL=condition_SQL+"andSALMonth=""+vCondition_month+""";RefreshData();UpdateData(FALSE);}查询语句:vSQL="selectSALID,EM_Salary.EmpIDEmpID,EmpName,SALMonth,EM_Employee.SGSalaryGrade";vSQL=vSQL+"SGSalaryGrade,SGSalarySum,SALOvertimePay,SALGoOnErrandsSubsidy";vSQL=vSQL+",SALLeavePenalty,SALAtherBefTr,SALOughtSalary,SALAtherAftTr,SALFeastSubsidy";vSQL=vSQL+",SALTaxAfterSalary,SALFactSalary,TRTaxRate,SALTaxSum,SALDate,SALIdiograph,SALRemark";vSQL=vSQL+"fromEM_Employee,EM_Salary,EM_SalaryGradewhereEM_Employee.EmpID=EM_Salary.EmpID";vSQL=vSQL+"andEM_SalaryGrade.SGSalaryGrade=EM_Employee.SGSalaryGrade";vSQL=vSQL+(_bstr_t)condition_SQL;vSQL=vSQL+"orderbySALMonthasc";导出Excel主要代码如下:voidCSalary::OnSalaryOUT(){//TODO:Addyourcontrolnotificationhandlercodehere//连接数据库ADOConnado;ado.OnInitADOConn();//提取数据库中员工信息//定义操作Excel必要的对象48 人事信息管理系统COleVariantVOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);_ApplicationobjApp;WorkbooksobjBooks;_WorkbookobjBook;WorksheetsobjSheets;_WorksheetobjSheet;RangeobjRange;//创建Excel对象objApp.CreateDispatch("Excel.Application");objBooks=objApp.GetWorkbooks();//返回工作簿对象//打开指定Excel文件CStringpath;//获取当前应用程序的完整文件名,包含完整路径GetModuleFileName(NULL,path.GetBufferSetLength(MAX_PATH+1),MAX_PATH);//取得最后一个,去掉文件名,从而获取当前应用程序的工作路径intpos=path.ReverseFind("\");path=path.Left(pos+1);//在当前应用程序的工作路径下打开EmpInfo.xls文件objBook.AttachDispatch(objBooks.Add(_variant_t(path+"Salary.xls")));objSheets=objBook.GetSheets();//定义第一个Sheet为对象objSheet=objSheets.GetItem((_variant_t)short(1));objRange.AttachDispatch(objSheet.GetCells(),true);//读取临时表中的记录_RecordsetPtrm_rs;_bstr_tvSQL;vSQL="selectSALID,EM_Salary.EmpIDEmpID,EmpName,SALMonth,EM_Employee.SGSalaryGrade";vSQL=vSQL+"SGSalaryGrade,SGSalarySum,SALOvertimePay,SALGoOnErrandsSubsidy";vSQL=vSQL+",SALLeavePenalty,SALAtherBefTr,SALOughtSalary,SALAtherAftTr,SALFeastSubsidy";48 人事信息管理系统vSQL=vSQL+",SALTaxAfterSalary,SALFactSalary,TRTaxRate,SALTaxSum,SALDate,SALIdiograph,SALRemark";vSQL=vSQL+"fromEM_Employee,EM_Salary,EM_SalaryGradewhereEM_Employee.EmpID=EM_Salary.EmpID";vSQL=vSQL+"andEM_SalaryGrade.SGSalaryGrade=EM_Employee.SGSalaryGrade";vSQL=vSQL+(_bstr_t)condition_SQL;vSQL=vSQL+"orderbySALMonthasc";m_rs=ado.GetRecordSet(vSQL);//生成标题栏objRange.SetItem(_variant_t((long)(1)),_variant_t((long)(1)),_variant_t("序号"));objRange.SetItem(_variant_t((long)(1)),_variant_t((long)(2)),_variant_t("工资编号"));objRange.SetItem(_variant_t((long)(1)),_variant_t((long)(3)),_variant_t("员工编号"));objRange.SetItem(_variant_t((long)(1)),_variant_t((long)(4)),_variant_t("姓名"));objRange.SetItem(_variant_t((long)(1)),_variant_t((long)(5)),_variant_t("月份"));objRange.SetItem(_variant_t((long)(1)),_variant_t((long)(6)),_variant_t("基本工资等级"));objRange.SetItem(_variant_t((long)(1)),_variant_t((long)(7)),_variant_t("基本工资"));………………………………………………………………………………………..objRange.SetItem(_variant_t((long)(1)),_variant_t((long)(21)),_variant_t("备注"));//记录总数intiRowCount=0;while(!m_rs->adoEOF){//把列值放入Excel指定单元格CStringstr;str.Format("%03d",iRowCount+1);objRange.SetItem(_variant_t((long)(iRowCount+2)),_variant_t((long)(1)),_variant_t(str));str=(LPCTSTR)(_bstr_t)m_rs->GetCollect("SALID");//工资编号48 人事信息管理系统objRange.SetItem(_variant_t((long)(iRowCount+2)),_variant_t((long)(2)),_variant_t(str));str=(LPCTSTR)(_bstr_t)m_rs->GetCollect("EmpID");//员工编号objRange.SetItem(_variant_t((long)(iRowCount+2)),_variant_t((long)(3)),_variant_t(str));str=(LPCTSTR)(_bstr_t)m_rs->GetCollect("EmpName");//员工姓名objRange.SetItem(_variant_t((long)(iRowCount+2)),_variant_t((long)(4)),_variant_t(str));str=(LPCTSTR)(_bstr_t)m_rs->GetCollect("SALMonth");//月份objRange.SetItem(_variant_t((long)(iRowCount+2)),_variant_t((long)(5)),_variant_t(str));str=(LPCTSTR)(_bstr_t)m_rs->GetCollect("SGSalaryGrade");//基本工资等级objRange.SetItem(_variant_t((long)(iRowCount+2)),_variant_t((long)(6)),_variant_t(str));str=(LPCTSTR)(_bstr_t)m_rs->GetCollect("SGSalarySum");//基本工资str.Format("%0.2f¥",atof(str));……...……………………………………………………………………………….str=(LPCTSTR)(_bstr_t)m_rs->GetCollect("SALRemark");//备注objRange.SetItem(_variant_t((long)(iRowCount+2)),_variant_t((long)(21)),_variant_t(str));iRowCount++;m_rs->MoveNext();}//设置Excel为可见objApp.SetVisible(true);//释放句柄objRange.ReleaseDispatch();objSheet.ReleaseDispatch();objSheets.ReleaseDispatch();objBook.ReleaseDispatch();objBooks.ReleaseDispatch();objApp.ReleaseDispatch();ado.ExitConnect();48 人事信息管理系统}1.1.1系统管理系统管理主要包括对系统中的单项表格进行修改、添加,部门管理、数据备份恢复、数据压缩等管理。基本信息管理,对数据库中单项表格进行修改、添加,如对民族、专业、学历等的操作;部门管理,对部门信息进行添加、修改、删除,选中部门信息添加时,将弹出下图2),弹出的对话框中部门编号及上级部门编号都是从数据库中读取的,部门编号是读取系统中第一个未用的部门编号,界面如下:图1.部门管理图图2.部门信息修改图48 人事信息管理系统当用户选择部门点击删除时,如果该部门包含下级部门就会弹出“此部门包含下级部门,不能删除”的提示,如果该部门包含员工时就会弹出“此部门包含员工不能删除”的提示,提示如下图:图1.部门删除提示(包含有下级部门)图图2.部门删除提示(包含员工)图图3.部门删除提示图数据备份与恢复,对数据库信息进行维护,保证数据损坏时能够还原,数据备份时,将记录在数据库中备份表格EM_Backup表格中,该表格存储了数据库保存的备份iD,备份时间,及备份路径;备份对话框界面如下:48 人事信息管理系统图1.数据备份恢复图备份说明:为了防止数据冗余,每天备份的最大数量为99999,备份时将弹出文件保存对话框,文件名是自动根据备份日期及当天备份编号生成的,用户可以选择更改备份名称,备份名称如“备份数据BACKUP2008-04-15-19-55-00001”,备份成功后会提示备份成功。数据恢复时也将弹出似文件打开对话框,用户可以选择备份文件*.Bak文件,点击打开后开始恢复,数据库恢复需要几分钟时间。数据备份主要代码:生成数据备份ID函数CStringCBakeUpDlg::ProduceBackUpID(){//连接数据库ADOConnm_AdoConn;m_AdoConn.OnInitADOConn();//设置SELECT语句_bstr_tvSQL;CTimett=CTime::GetCurrentTime();CStringrq=tt.Format("%Y-%m-%d");CStringstr_tt=tt.Format("BACKUP%Y-%m-%d-%H-%M-");vSQL="selectBackUp_IDfromEM_BackUpwhereBackUp_Date=""+rq+""orderbyBackUp_ID";//执行SELETE语句_RecordsetPtrm_pRecordset;m_pRecordset=m_AdoConn.GetRecordSet(vSQL);48 人事信息管理系统//执行SELECT语句if(m_pRecordset->adoEOF){return(str_tt+"00001");}else{_variant_tvalue;CStringstr,sub;for(inti=1;i<99999;i++){value=m_pRecordset->GetCollect("BackUp_ID");str=(char*)(_bstr_t)value;sub=str.Mid(23);intnumber=atoi(sub);if(number!=i){break;}m_pRecordset->MoveNext();if(m_pRecordset->adoEOF){i++;break;}}if(i==99999){MessageBox("今日备份数量大于99999了","错误",MB_OKCANCEL|MB_ICONQUESTION|MB_SYSTEMMODAL);returnCString("");}str.Format("%05d",i);str_tt=str_tt+str;48 人事信息管理系统returnstr_tt;}m_AdoConn.ExitConnect();}数据备份函数voidCBakeUpDlg::OnBackUp(){//TODO:AddyourcontrolnotificationhandlercodehereCStringID=this->ProduceBackUpID();CStringbackname="备份数据"+ID;//连接数据库ADOConnm_AdoConn;m_AdoConn.OnInitADOConn();//设置SELECT语句_bstr_tvSQL;CFileDialogdlg(false,"bak",backname,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"(*.bak)");dlg.m_ofn.lpstrTitle="保存备份文件";if(dlg.DoModal()==IDOK){this->BeginWaitCursor();CStringname=dlg.GetFileName();CStringpath=dlg.GetPathName();vSQL="usemasterbackupdatabaseEMPManagetodisk=""+path+""";//执行SELETE语句_RecordsetPtrm_pRecordset;m_pRecordset=m_AdoConn.GetRecordSet(vSQL);_bstr_tsql;CStringDate=ID.Mid(6,10);sql="useEMPManageinsertEM_BackUp(BackUp_ID,BackUp_Date,BackUp_Path)";sql=sql+"values(""+ID+"",""+Date+"",""+path+"")";48 人事信息管理系统m_AdoConn.ExecuteSQL(sql);this->EndWaitCursor();MessageBox("备份成功","操作提示",MB_ICONASTERISK);}CDialog::OnCancel();}数据恢复代码voidCBakeUpDlg::OnResume(){//TODO:Addyourcontrolnotificationhandlercodehere//连接数据库ADOConnm_AdoConn;m_AdoConn.OnInitADOConn();//CStringname;//设置SELECT语句_bstr_tvSQL;CFileDialogdlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"BackFile(*.bak)|*.*",this);//CFileDialogdlg(true,"bak",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"(*.bak)");dlg.m_ofn.lpstrTitle="打开已备份的文件";if(dlg.DoModal()==IDOK){this->BeginWaitCursor();CStringname=dlg.GetFileName();CStringpath=dlg.GetPathName();vSQL="usemasterrestoredatabaseEMPManagefromdisk=""+path+""";//执行SELETE语句_RecordsetPtrm_pRecordset;m_pRecordset=m_AdoConn.GetRecordSet(vSQL);//m_AdoConn.ExecuteSQL(sql);this->EndWaitCursor();48 人事信息管理系统MessageBox("恢复成功","操作提示");}m_AdoConn.ExitConnect();CDialog::OnCancel();}系统初始化,将数据库中的已有数据清楚,保证数据的有效性。1.1.1用户管理用户管理模块主要功能对操作员的管理、权限的分配管理、及密码修改管理。操作员及权限管理,对操作员的增加、删除、修改及操作员的权限分配管理。添加用户时通过选择相应的权限,并刷新显示,如果用户拥有某个权限时显示“[权限名]”如【人事管理】,如果用户没有某个模块的权限就显示【…………】。只有当用户拥有所有权限(超级用户)时才可以拥有操作员及权限管理的权限,普通用户都有修改自己密码的权限。主界面如下:图1.用户管理图操作员及权限修改的管理代码:voidCUserManage::OnDblclkUserManage(NMHDR*pNMHDR,LRESULT*pResult){//TODO:Addyourcontrolnotificationhandlercodehere48 人事信息管理系统ADOConnado,vado;//vado用来更新单个的表项CStringstrSql,vstrSql;//vstrSql用来更新单个的表项_bstr_tSQL;_RecordsetPtrm_pRecordset,vm_pRecordset;//vm_pRecordset用来更新单个的表项POSITIONpos;intIndex;UpdateData(TRUE);pos=m_UserManage.GetFirstSelectedItemPosition();Index=m_UserManage.GetNextSelectedItem(pos);//得到项目索引m_UMUesrName=m_UserManage.GetItemText(Index,1);old_UMUesrName=m_UMUesrName;if(m_UMUesrName==""){m_UMPasswd1="";m_UMPasswd2="";m_EmpName.ResetContent();m_M00001.SetCheck(FALSE);……………………………….}else{ado.OnInitADOConn();strSql.Format("selectUMUesrName,EmpName,UMPasswd,UMDroitfromEM_Employee,EM_UserManagewhereEM_Employee.EmpID=EM_UserManage.EmpIDandUMUesrName="%s"",old_UMUesrName);m_pRecordset=ado.GetRecordSet(_bstr_t(strSql));if(!(m_pRecordset->adoEOF)){vEmpName=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("EmpName");48 人事信息管理系统m_UMPasswd1=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("UMPasswd");old_UMPasswd=m_UMPasswd1;m_UMPasswd2="";if(vpropert_global==63){GetDlgItem(IDC_UMPasswd1)->EnableWindow(TRUE);GetDlgItem(IDC_UMPasswd2)->EnableWindow(TRUE);}else{GetDlgItem(IDC_UMPasswd1)->EnableWindow(FALSE);GetDlgItem(IDC_UMPasswd2)->EnableWindow(FALSE);}vUMDroit=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("UMDroit");//姓名m_EmpName.ResetContent();vado.OnInitADOConn();vstrSql.Format("selectEmpID,EmpNamefromEM_Employee");vm_pRecordset=vado.GetRecordSet(_bstr_t(vstrSql));m_EmpName.InsertString(0,vEmpName);m_EmpName.SetCurSel(0);while((!vm_pRecordset->adoEOF)&&(!vm_pRecordset->adoBOF)){tmp=(LPCTSTR)(_bstr_t)vm_pRecordset->GetCollect("EmpName");vEmpID=(LPCTSTR)(_bstr_t)vm_pRecordset->GetCollect("EmpID");if(vEmpName!=tmp)m_EmpName.AddString(tmp);vm_pRecordset->MoveNext();48 人事信息管理系统}vado.ExitConnect();vado.OnInitADOConn();SQL="selectMS_ID,MSModuleName,MSValue";SQL=SQL+"fromEM_ModuleClassorderbyMS_ID";vm_pRecordset=vado.GetRecordSet(SQL);while(!vm_pRecordset->adoEOF){vMSValue=(LPCTSTR)(_bstr_t)vm_pRecordset->GetCollect("MSValue");vMS_ID=(LPCTSTR)(_bstr_t)vm_pRecordset->GetCollect("MS_ID");if((vMS_ID=="00001")&&((atoi(vMSValue))&(atoi(vUMDroit))))m_M00001.SetCheck(TRUE);if((vMS_ID=="00002")&&((atoi(vMSValue))&(atoi(vUMDroit))))m_M00002.SetCheck(TRUE);if((vMS_ID=="00003")&&((atoi(vMSValue))&(atoi(vUMDroit))))m_M00003.SetCheck(TRUE);if((vMS_ID=="00004")&&((atoi(vMSValue))&(atoi(vUMDroit))))m_M00004.SetCheck(TRUE);if((vMS_ID=="00005")&&((atoi(vMSValue))&(atoi(vUMDroit))))m_M00005.SetCheck(TRUE);if((vMS_ID=="00006")&&((atoi(vMSValue))&(atoi(vUMDroit))))m_M00006.SetCheck(TRUE);vm_pRecordset->MoveNext();}vado.ExitConnect();}ado.ExitConnect();}UpdateData(FALSE);*pResult=0;}48 人事信息管理系统密码管理,对于操作密码的修改。修改时要求用户输入旧密码、新密码及确认密码,先通过读取全局变量中当前用户的用户名,查询数据库中旧密码是否正确,错误是提示,如果正确的话就判断新密码与确认密码是否一致,不一致时提示密码不一致,一致时调用加密函数保存至数据库。1.1.1系统帮助系统帮助是方便用户的使用。2软件测试2.1系统模块测试系统登录管理模块的功能是对用户管理权限的管理,在此人事档案信息管理系统中用户有两种:管理人员和一般操作人员。只有管理人员才能对人事信息进行管理,一般工作人员只有对人事信息查询的权限。而管理人员在对人事信息进行相应维护时,必须输入账号和密码。2.2研究成果《人事信息管理系统》的主要研究成果是可以实现对人事档案信息的录入、更新、删除、查询、导出及考勤、工资、系统管理、用户管理等功能,从而提高了工作效率及正确性。3技术难点及解决3.1一般用户和管理员操作权限问题按照系统分成的五个模块,对每个模块用一个二进制数字表示,每个用户的权限是它拥有的各个模块的权限值得和,用户登录成功后通过将用户的权限依次与各个模块的权限值相与,如果相与的结果为真则显示该模块下的各个功能,如果没有的话只显示主标题。主要代码:BOOLCMainFrame::OnCreateClient(LPCREATESTRUCTlpcs,CCreateContext*pContext){///首先将窗口客户区分割为一行两列if(!wndSplitter.CreateStatic(this,1,2))returnfalse;if(!wndSplitter.CreateView(0,1,RUNTIME_CLASS(SysPage),CSize(0,0),pContext))returnfalse;BaseInfo=FALSE;SysMan=FALSE;48 人事信息管理系统//m_pMainWnd->ShowWindow(SW_SHOW);//m_pMainWnd->UpdateWindow();DWORDdwf=CGfxOutBarCtrl::fDragItems|CGfxOutBarCtrl::fEditGroups|CGfxOutBarCtrl::fEditItems|CGfxOutBarCtrl::fRemoveGroups|CGfxOutBarCtrl::fRemoveItems|CGfxOutBarCtrl::fAddGroups|CGfxOutBarCtrl::fAnimation;wndBar.Create(WS_CHILD|WS_VISIBLE,CRect(0,0,0,0),&wndSplitter,wndSplitter.IdFromRowCol(0,0),dwf);wndBar.SetOwner(this);imaLarge.Create(IDB_IMAGELIST,32,0,RGB(128,128,128));imaSmall.Create(IDB_SMALL_IMAGELIST,16,0,RGB(0,128,128));wndBar.SetImageList(&imaLarge,CGfxOutBarCtrl::fLargeIcon);wndBar.SetImageList(&imaSmall,CGfxOutBarCtrl::fSmallIcon);wndBar.SetAnimationTickCount(10);wndBar.SetAnimSelHighlight(200);//BlueSky加入的控制wndBar.SetIfQueryRemove(true);wndBar.AddFolder("系统主页",0);wndBar.AddFolder("人事管理",1);wndBar.AddFolder("出勤管理",2);wndBar.AddFolder("工资管理",3);wndBar.AddFolder("系统管理",4);wndBar.AddFolder("用户管理",5);wndBar.AddFolder("系统帮助",6);//forwndBar.AddFolder("系统主页",0);wndBar.InsertItem(0,0,"系统主页",7,0);ADOConnado,vado;//vado用来更新单个的表项CStringstrSql,vstrSql;//vstrSql用来更新单个的表项_RecordsetPtr48 人事信息管理系统m_pRecordset,vm_pRecordset;//vm_pRecordset用来更新单个的表项CStringvMSValue;//forwndBar.AddFolder("人事管理",1);ado.OnInitADOConn();strSql.Format("selectMSValuefromEM_ModuleClasswhereMSModuleName="%s"","人事管理");m_pRecordset=ado.GetRecordSet(_bstr_t(strSql));if(!(m_pRecordset->adoEOF))vMSValue=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("MSValue");elsevMSValue="0";ado.ExitConnect();if(vpropert_global&atoi(vMSValue)){wndBar.InsertItem(1,0,"人员档案管理",0,0);wndBar.InsertItem(1,1,"职称评定管理",1,0);wndBar.InsertItem(1,2,"奖惩管理",2,0);wndBar.InsertItem(1,3,"培训记录管理",3,0);wndBar.InsertItem(1,4,"培训项目管理",4,0);wndBar.InsertItem(1,5,"人事变动管理",0,0);wndBar.InsertItem(1,6,"考评管理",1,0);wndBar.InsertItem(1,7,"考评项目管理",3,0);wndBar.InsertItem(1,8,"福利品领取管理",4,0);wndBar.InsertItem(1,9,"福利品管理",0,0);wndBar.InsertItem(1,10,"信息统计管理",1,0);}//forwndBar.AddFolder("出勤管理",2);ado.OnInitADOConn();strSql.Format("selectMSValuefromEM_ModuleClasswhereMSModuleName="%s"","出勤管理");48 人事信息管理系统m_pRecordset=ado.GetRecordSet(_bstr_t(strSql));if(!(m_pRecordset->adoEOF))vMSValue=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("MSValue");elsevMSValue="0";ado.ExitConnect();if(vpropert_global&atoi(vMSValue)){wndBar.InsertItem(2,0,"考勤记录",0,0);wndBar.InsertItem(2,1,"请假记录",1,0);wndBar.InsertItem(2,2,"加班记录",2,0);wndBar.InsertItem(2,3,"出差记录",3,0);wndBar.InsertItem(2,4,"月度考勤记录",0,0);}//forwndBar.AddFolder("工资管理",3);ado.OnInitADOConn();strSql.Format("selectMSValuefromEM_ModuleClasswhereMSModuleName="%s"","工资管理");m_pRecordset=ado.GetRecordSet(_bstr_t(strSql));if(!(m_pRecordset->adoEOF))vMSValue=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("MSValue");elsevMSValue="0";ado.ExitConnect();if(vpropert_global&atoi(vMSValue)){wndBar.InsertItem(3,0,"基本工资管理",0,0);wndBar.InsertItem(3,1,"工资构成项目管理",1,0);wndBar.InsertItem(3,2,"税率管理",2,0);wndBar.InsertItem(3,3,"节日补贴管理",3,0);48 人事信息管理系统wndBar.InsertItem(3,4,"月度工资管理",4,0);}//wndBar.AddFolder("系统管理",4);ado.OnInitADOConn();strSql.Format("selectMSValuefromEM_ModuleClasswhereMSModuleName="%s"","系统管理");m_pRecordset=ado.GetRecordSet(_bstr_t(strSql));if(!(m_pRecordset->adoEOF))vMSValue=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("MSValue");elsevMSValue="0";ado.ExitConnect();if(vpropert_global&atoi(vMSValue)){BaseInfo=TRUE;wndBar.InsertItem(4,0,"基本信息管理",0,0);wndBar.InsertItem(4,1,"部门管理",1,0);}ado.OnInitADOConn();strSql.Format("selectMSValuefromEM_ModuleClasswhereMSModuleName="%s"","数据库备份回复、系统初始化");m_pRecordset=ado.GetRecordSet(_bstr_t(strSql));if(!(m_pRecordset->adoEOF))vMSValue=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("MSValue");elsevMSValue="0";ado.ExitConnect();if((vpropert_global&atoi(vMSValue))&&(BaseInfo==TRUE)){48 人事信息管理系统wndBar.InsertItem(4,2,"数据备份恢复",2,0);wndBar.InsertItem(4,3,"系统初始化",3,0);}if((vpropert_global&atoi(vMSValue))&&(BaseInfo==FALSE)){wndBar.InsertItem(4,0,"数据备份恢复",2,0);wndBar.InsertItem(4,1,"系统初始化",3,0);}//forwndBar.AddFolder("用户管理",5);ado.OnInitADOConn();strSql.Format("selectMSValuefromEM_ModuleClasswhereMSModuleName="%s"","用户管理");m_pRecordset=ado.GetRecordSet(_bstr_t(strSql));if(!(m_pRecordset->adoEOF))vMSValue=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("MSValue");elsevMSValue="0";ado.ExitConnect();if(vpropert_global&atoi(vMSValue)){SysMan=TRUE;wndBar.InsertItem(5,0,"操作员及权限管理",0,0);}if(SysMan==TRUE)wndBar.InsertItem(5,1,"密码管理",1,0);if(SysMan==FALSE)wndBar.InsertItem(5,0,"密码管理",1,0);//forwndBar.AddFolder("系统帮助",6);wndBar.InsertItem(6,0,"系统帮助",0,0);48 人事信息管理系统wndBar.SetSelFolder(0);CRectr;GetClientRect(&r);intw1=r.Width()/8;intw2=r.Width()/4;wndSplitter.SetColumnInfo(0,w1,0);wndSplitter.SetColumnInfo(1,w2,0);wndSplitter.RecalcLayout();returntrue;}1.1设置对话框中Static控件字体的大小及颜色,代码如下://字体CFontmyfont;myfont.CreatePointFont(20,"Arial");GetDlgItem(IDC_STATICttt)->SetFont(&myfont);//颜色if(pWnd->GetDlgCtrlID()==IDC_STATICddd){pDC->SetTextColor(RGB(255,0,0));}1.2设置ListControl控件的行高,及屏蔽空白行代码实现://行高CImageListImageList;ImageList.Create(1,18,ILC_COLOR16,0,0);//795m_CulProject.SetImageList(&ImageList,LVSIL_SMALL);//屏蔽空白行代码m_BaseInfoManage.ModifyStyle(0,LVS_REPORT|LVS_SHOWSELALWAYS|LVS_SINGLESEL);m_BaseInfoManage.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_HEADERDRAGDROP);COLORREFcolor=RGB(239,235,222);48 人事信息管理系统CListCtrl*pList=(CListCtrl*)GetDlgItem(IDC_BaseInfoManage);pList->SetBkColor(color);1.1设置照片,代码如下:voidCOneEmpRec::OnEmpPic(){//TODO:AddyourcontrolnotificationhandlercodehereSetPicYesNO=FALSE;//BMPFiles(*.bmp)|*.bmp|AllFiles(*.*)|*.*||staticcharBASED_CODEszFilter[]="BMPFiles(*.bmp)|*.bmp||";CFileDialogdlg(TRUE,"BMP",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter);if(dlg.DoModal()!=IDOK)return;CStringpathname=dlg.GetPathName();//读取BMP文件到m_pBufferCFilefile;//定义文件对象if(!file.Open(pathname,CFile::modeRead))//以只读方式打开文件{MessageBox("无法打开BMP文件","操作提示",MB_ICONEXCLAMATION|MB_OK);return;}m_filelen=file.GetLength();//读取文件长度m_pBuffer=newchar[m_filelen+1];//根据文件长度分配数组空间if(!m_pBuffer)//如果不空间不足则返回{MessageBox("无法分配足够的内存空间","操作提示",MB_ICONEXCLAMATION|MB_OK);return;}48 人事信息管理系统if(file.ReadHuge(m_pBuffer,m_filelen)!=m_filelen)//读取BMP文件到m_pBuffer中{MessageBox("读取BMP文件时出现错误","操作提示",MB_ICONEXCLAMATION|MB_OK);return;}//@@@@@@@@@@将BMP文件数据从m_pBuffer中转换到m_hBitMap位图句柄中LPSTRhDIB;LPVOIDlpDIBBits;BITMAPFILEHEADERbmfHeader;//用于保存BMP文件头信息,包括类型、大小、位移量等DWORDbmfHeaderLen;//保存文件头的长度bmfHeaderLen=sizeof(bmfHeader);//读取文件头的长度//将m_pBuffer中文件头复制到bmfHeader中strncpy((LPSTR)&bmfHeader,(LPSTR)m_pBuffer,bmfHeaderLen);if(bmfHeader.bfType!=(*(WORD*)"BM"))//如果文件类型不对,则返回{MessageBox("BMP文件格式不准确","操作提示",MB_ICONEXCLAMATION|MB_OK);return;}hDIB=m_pBuffer+bmfHeaderLen;//将指针移至文件头后面//读取BMP文件的图像数据,包括坐标及颜色格式等信息到BITMAPINFOHEADER对象BITMAPINFOHEADER&bmiHeader=*(LPBITMAPINFOHEADER)hDIB;//读取BMP文件的图像数据,包括坐标及颜色格式等信息到BITMAPINFO对象BITMAPINFO&bmInfo=*(LPBITMAPINFO)hDIB;//根据bfOffBits属性将指针移至文件头后lpDIBBits=(m_pBuffer)+((BITMAPFILEHEADER*)m_pBuffer)->bfOffBits;48 人事信息管理系统CClientDCdc(this);//生成一个与当前窗口相关的CClientDC,用于管理输出设置//生成DIBitmap数据m_hBitmap=CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);//激活OnPaint()函数,显示图像Invalidate(TRUE);SetPicYesNO=TRUE;}voidCOneEmpRec::OnPaint(){CPaintDCdc(this);//devicecontextforpaintingintx=568,y=8;intiWidth=100,iHeight=180;//TODO:Addyourmessagehandlercodehereif(!m_hBitmap)//如果内存中没有BMP数据,则返回return;HBITMAPtmpBitmap;//用于保存输出到屏幕的BMP数据CDCMemDC;//CDC对象,用于输出到屏幕MemDC.CreateCompatibleDC(&dc);tmpBitmap=(HBITMAP)MemDC.SelectObject(m_hBitmap);dc.BitBlt(x,y,iWidth,iHeight,&MemDC,0,0,SRCCOPY);MemDC.SelectObject(tmpBitmap);}显示照片时的代码://读取图像字段的实际大小longlDataSize=m_pRecordset->GetFields()->GetItem("EmpPic")->ActualSize;char*m_pBuffer;//定义缓冲变量if(lDataSize>0){//从图像字段中读取数据到varBLOB中48 人事信息管理系统_variant_tvarBLOB;varBLOB=m_pRecordset->GetFields()->GetItem("EmpPic")->GetChunk(lDataSize);if(varBLOB.vt==(VT_ARRAY|VT_UI1)){if(m_pBuffer=newchar[lDataSize+1])//分配必要的存储空间{char*pBuf=NULL;SafeArrayAccessData(varBLOB.parray,(void**)&pBuf);memcpy(m_pBuffer,pBuf,lDataSize);///复制数据到缓冲区m_pBufferSafeArrayUnaccessData(varBLOB.parray);//将数据转换为HBITMAP格式LPSTRhDIB;LPVOIDlpDIBBits;BITMAPFILEHEADERbmfHeader;//用于保存BMP文件头信息,包括类型、大小、位移量等DWORDbmfHeaderLen;//保存文件头的长度bmfHeaderLen=sizeof(bmfHeader);//读取文件头的长度//将m_pBuffer中文件头复制到bmfHeader中strncpy((LPSTR)&bmfHeader,(LPSTR)m_pBuffer,bmfHeaderLen);if(bmfHeader.bfType!=(*(WORD*)"BM"))//如果文件类型不对,则返回{MessageBox("BMP文件格式不准确");return;}hDIB=m_pBuffer+bmfHeaderLen;//将指针移至文件头后面//读取BMP文件的图像数据,包括坐标及颜色格式等信息到BITMAPINFOHEADER对象BITMAPINFOHEADER&bmiHeader=*(LPBITMAPINFOHEADER)hDIB;48 人事信息管理系统//读取BMP文件的图像数据,包括坐标及颜色格式等信息到BITMAPINFO对象BITMAPINFO&bmInfo=*(LPBITMAPINFO)hDIB;//根据bfOffBits属性将指针移至文件头后lpDIBBits=(m_pBuffer)+((BITMAPFILEHEADER*)m_pBuffer)->bfOffBits;CClientDCdc(this);//生成一个与当前窗口相关的CClientDC,用于管理输出设置//生成DIBitmap数据m_hBitmap=CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);}}1.1工资的计算问题基本工资是从人事管理模块读取的,加班费通过加班类型及加班时间计算,出差补贴按照每种出差类型的补贴*次数的和,额外税前是通过工资管理员设置的,应发工资计算公式:应发工资金额=基本工资+加班费+出差补助-请假扣款+额外税前项,额外税后、节日补贴是通过工资管理员设置的,税后工资计算公式:税后工资=应发工资金额-纳税金额;税金额计算公式:纳税金额=应纳税金额*适合税率-速算扣除数而应纳税金额=应发工资金额-纳税基数(1000);实发工资=税后工资+税后应加项-税后应扣项+纳税基数。2总结及展望通过近三个月的毕业设计,掌握了更多新的知识,动手能力得到了提高,理论知识用与实践的能力得了加强。该人事管理系统到目前为止,还有很多功能没有实现,例如对打印及统计信息的图表化还没有实现。在以后的时间里,我还将继续钻研专业知识,并希望自己不断努力,进一步完善该系统的其它功能,为系统高级服务与应用提供支持。通过这次毕业设计,我学会了很多东西。当一个设计课题摆在自己面前时,应该如何运用自己所掌握到的基本知识,并在过程中不断的去学习新的知识,以及对一个系统如何从整体出发到局部细节然后再回到整个系统中去。同时,也学会了在面对困难时,如何增强自己的信心,进而去分析问题解决问题并提高自己。致谢语 在毕业设计的完成过程中,非常感谢我的指导老师XXXX老师给我的帮助、支持、建议和鼓励,感谢给予我引导和帮助的同学。48 人事信息管理系统参考文献 1.《VisualC++6.0信息管理系统开发》人民邮电出版社20052.启明工作室:《Mis系统与开发》,人民邮电出版社,2005年3.《VisualC++管理信息系统完整项目实例剖析》4.《ViusualC++程序设计与实践》清华大学出版社200448'