www.pudn.com > PBMS.rar > PBMSDoc.cpp
//==================================================================//
// 此项目飞狼工作室制作
//项 目 名: PBMS
//项目描述: 这是为了方便图书管理的软件。 功能特点:多用户、信息保密、还书提醒、资料保存。
//作 者: 龚勋
//日 期: 2003-11-14
//-=================================================================//
// PBMSDoc.cpp : implementation of the CPBMSDoc class
//
#include "stdafx.h"
#include "PBMS.h"
#include "PBMSDoc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPBMSDoc
//*==============静态数据初始化=====================*//
int CPBMSDoc::BookID = 0;
int CPBMSDoc::UserID = 0;
int CPBMSDoc::LibID = 0;
CString CPBMSDoc::AlertSoundPath = _T("");
//*=================================================*//
IMPLEMENT_DYNCREATE(CPBMSDoc, CDocument)
BEGIN_MESSAGE_MAP(CPBMSDoc, CDocument)
//{{AFX_MSG_MAP(CPBMSDoc)
ON_COMMAND(ID_USER_ADD, OnUserAdd)
ON_COMMAND(ID_USER_DEL, OnUserDel)
ON_COMMAND(ID_LIB_ADD, OnLibAdd)
ON_COMMAND(ID_LIB_DEL, OnLibDel)
ON_COMMAND(ID_SYS_CHANGEADMIN, OnSysChangeadmin)
ON_COMMAND(ID_SYS_LOGONOUT, OnSysLogonout)
ON_COMMAND(ID_SCANBOOKS, OnScanbooks)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPBMSDoc construction/destruction
/*=========================构造函数==================================================
在这里实现数据库的连接过程
====================================================================================*/
CPBMSDoc::CPBMSDoc()
{
//*===============首先指定数据库存放路径============*//
char dbpath[128]; //数据库Path
::GetModuleFileName(NULL,dbpath,128); //获取路径
int index,i=0;
while(dbpath[i] != '\0')
{
if( dbpath[i] == '\\' )
{
index = i;
}
i ++ ;
}
char *filename = "PBMS_DB.mdb";
while ( *filename != '\0')
{
dbpath[++index] = *filename;
filename ++;
}
dbpath[++index] = '\0'; //添加字符串结束符
//*=================================================*//
//*=====================连接数据库==================*//
if (!m_adoConnection.ConnectAccess(dbpath,"aa"))// aa是密码
{
AfxMessageBox("1-数据库连接失败!");
return;
}
//*=================================================*//
//*打开users及lib表并把数据读入,便于界面初始化工作 *//
m_adoRecordSet.SetAdoConnection(&m_adoConnection);
if (!m_adoRecordSet.SetCursorLocation())
{
AfxMessageBox("2-SetCursorLocation失败!");
return;
}
//从users表中读数据,结果存放在m_saUsersName和m_saUsersID对象中,
//注:不需显示地打开与关闭表,一切都封装在函数内部
m_adoRecordSet.Get_ID_Info_Array("users",m_saUsersName,2,m_uaUsersID);
//根据用户数量设置已登录用户ID数组的最大值
m_LogonUserID.SetSize(m_uaUsersID.GetSize());
//从lib表中读数据,结果存放在m_saLibsName和m_saLibsID对象中,
m_adoRecordSet.Get_ID_Info_Array("lib",m_saLibsName,2,m_uaLibsID);
//*=================================================*//
//*==============获取各种表的ID号===================*//
//用户当前最大ID
if (m_uaUsersID.GetSize() == 0)
{
UserID = 0;
}
else
{
UserID = m_uaUsersID.GetAt(m_uaUsersID.GetSize() - 1);
}
//图书馆当前最大ID
if (m_uaLibsID.GetSize() == 0)
{
LibID = 0;
}
else
{
LibID = m_uaLibsID.GetAt(m_uaLibsID.GetSize() - 1);
}
//书籍当前最大ID
if (!m_adoRecordSet.Open("select * from books order by ID"))
{
AfxMessageBox("22-Open数据集失败!");
}
if (m_adoRecordSet.IsEOF())
{
BookID = 0; //书籍数据库为空则设定ID为0
}
else
{
if (!m_adoRecordSet.MoveLast())
{
AfxMessageBox("23-数据集MoveLast失败!");
}
if (!m_adoRecordSet.GetCollect("ID",BookID))
{
AfxMessageBox("24-数据集GetCollect失败!");
}
}
m_adoRecordSet.Close();
//*=================================================*//
m_curDataType = 0; //数据集数据类型
//*==============获取管理员ID及密码=================*//
m_adoRecordSet.Open("select * from users \
where 是否管理员 = true");
if (m_adoRecordSet.IsEOF())
{
m_managerID = 0;
}
else
{
m_adoRecordSet.GetCollect("ID",m_managerID);
m_adoRecordSet.GetCollect("密码",m_managerPass);
}
//*=================================================*//
//获取声音路径
GetSoundPath();
//扫描超期图书
ScanBooks(false); //没有超期图书则不警告
}
/*=========================析构函数==================================================
释放数据库连接资源
====================================================================================*/
CPBMSDoc::~CPBMSDoc()
{
m_adoRecordSet.Close();
m_adoConnection.Close();
}
BOOL CPBMSDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CPBMSDoc serialization
void CPBMSDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
}
/////////////////////////////////////////////////////////////////////////////
// CPBMSDoc diagnostics
#ifdef _DEBUG
void CPBMSDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CPBMSDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CPBMSDoc commands
/*=========================SaveName===================================================
说明:
当前用户在左边树型控件中修改名字后,调用此函数
在数据库中进行保存。
参数:
szTableName : 表名,因该函数既可以修改"users"表,也可以修改"lib"表
szID : 要修改列的关键字
szName : 要修改的值
====================================================================================*/
BOOL CPBMSDoc::SaveName(LPCTSTR szTableName, DWORD ID, LPCTSTR szName)
{
CString szNewName = szName;
CString Table = szTableName;
int id = (int)ID;
//*==============构造查询语句=======================*//
CString szQuery;
szQuery.Format("select * from %s where ID = %d",Table.GetBuffer(0),id);
Table.ReleaseBuffer();
//*=================================================*//
//*==============修改数据库中的数据=================*//
//打开数据集
if (!m_adoRecordSet.Open(szQuery))
{
AfxMessageBox("4-打开表出错!");
return FALSE;
}
//PutCollect()之后一定要调用Update()方法,参数1就是指
//第2列,因数据表从0列开始
if (!m_adoRecordSet.PutCollect(1,szNewName))
{
AfxMessageBox("5-修改表数据出错!");
return FALSE;
}
if (!m_adoRecordSet.Update())
{
AfxMessageBox("6-更新表数据出错!");
return FALSE;
}
//关闭数据集
m_adoRecordSet.Close();
//*=================================================*//
return TRUE;
}
/*=========================GetDataAndShow=============================================
说明:
本函数用来从数据库读取数据,并根据参数wParam的值显示相应的
面板,后者功能的实现通过向右边的View发送消息WM_SHOWRIGHTBAR
参数:
wParam = 1:显示用户信息面板
wParam = 2:显示所借书籍面板
wParam = 3:显示已还书籍面板
wParam = 4:显示图书馆信息面板
wParam = 5:显示系统信息及设置面板
IsGetFromDB:true :从数据库读取数据
IsGetFromDB:false:不从数据库读取数据
====================================================================================*/
BOOL CPBMSDoc::GetDataAndShow(int wParam,bool IsGetFromDB)
{
CString szSQL;
int index = wParam;
switch(index)
{
case 1: //显示用户信息面板
{
if (IsGetFromDB)
{
//***======首先读取用户信息========***//
//构造查询语句
szSQL.Format("select * from users \
where ID = %d",
m_curUserInfo.Id);
MyUpdateData(szSQL,1,false);
//***==============================***//
m_IsNewUser = false;
}
//*==============安全代码============================*//
for (int i = 0; i < m_LogonUserID.GetSize(); i ++)
{
//如果用户已经登录或是管理员已经登录
if (m_curUserInfo.Id == m_LogonUserID.GetAt(i) || m_LogonUserID.GetAt(i) == m_managerID)
{
//如果已经登录则让其正常显示
AfxGetMainWnd()->SendMessageToDescendants(WM_SHOWRIGHTBAR,(WPARAM)1,0);//最后一个参数表明显示模式,0-正常 1-不可写
m_curDataType = 1;
return TRUE;
}
}//end-for
//如果用户尚未登录且管理员未登录
if (m_curUserInfo.safelevel == 0 || m_IsNewUser )
{
m_LogonUserID.Add(m_curUserInfo.Id);
AfxGetMainWnd()->SendMessageToDescendants(WM_SHOWRIGHTBAR,(WPARAM)1,0);//最后一个参数表明显示模式,0-正常 1-不可写
}
else if (m_curUserInfo.safelevel == 1)
{
AfxGetMainWnd()->SendMessageToDescendants(WM_SHOWRIGHTBAR,(WPARAM)1,1);//最后一个参数表明显示模式,0-正常 1-不可写
}
else if (m_curUserInfo.safelevel == 2)
{
if (SafeGate())
{
AfxGetMainWnd()->SendMessageToDescendants(WM_SHOWRIGHTBAR,(WPARAM)1,0);//最后一个参数表明显示模式,0-正常 1-不可写
}
else
{
return FALSE;//登录不成功
}
}
//*=================================================*//
//设置数据类型
m_curDataType = 1;
break;
}
case 2: //显示所借书籍面板
{
//***======首先读取已借书籍信息====***//
//构造查询语句
szSQL.Format("select * from BookView \
where UserID = %d \
and 已还 = false \
order by ID",
m_curUserInfo.Id);
MyUpdateData(szSQL,2,false);
//***==============================***//
//***======然后读取用户信息========***//
//构造查询语句
szSQL.Format("select * from users \
where ID = %d",
m_curUserInfo.Id);
MyUpdateData(szSQL,1,false);
//***==============================***//
//*==============安全代码============================*//
for (int i = 0; i < m_LogonUserID.GetSize(); i ++)
{
//如果用户已经登录或是管理员已经登录
if (m_curUserInfo.Id == m_LogonUserID.GetAt(i) || m_LogonUserID.GetAt(i) == m_managerID)
{
//如果已经登录则让其正常显示
AfxGetMainWnd()->SendMessageToDescendants(WM_SHOWRIGHTBAR,(WPARAM)2,0);//最后一个参数表明显示模式,0-正常 1-不可写
m_curDataType = 2;
return TRUE;
}
}//end-for
//如果用户尚未登录且管理员未登录
if (m_curUserInfo.safelevel == 0)
{
m_LogonUserID.Add(m_curUserInfo.Id);
AfxGetMainWnd()->SendMessageToDescendants(WM_SHOWRIGHTBAR,(WPARAM)2,0);//最后一个参数表明显示模式,0-正常 1-不可写
}
else if (m_curUserInfo.safelevel == 1)
{
AfxGetMainWnd()->SendMessageToDescendants(WM_SHOWRIGHTBAR,(WPARAM)2,1);//最后一个参数表明显示模式,0-正常 1-不可写
}
else if (m_curUserInfo.safelevel == 2)
{
if (SafeGate())
{
AfxGetMainWnd()->SendMessageToDescendants(WM_SHOWRIGHTBAR,(WPARAM)2,0);//最后一个参数表明显示模式,0-正常 1-不可写
}
else
{
return FALSE;//登录不成功
}
}
//*=================================================*//
//设置数据集类型
m_curDataType = 2;
break;
}
case 3: //显示已还书籍面板
{
//***======首先读取已还书籍信息====***//
szSQL.Format("select * from BookView \
where UserID = %d \
and 已还 = true \
order by ID",
m_curUserInfo.Id);
MyUpdateData(szSQL,2,false);
//***==============================***//
//***======然后读取用户信息========***//
//构造查询语句
szSQL.Format("select * from users \
where ID = %d",
m_curUserInfo.Id);
MyUpdateData(szSQL,1,false);
//***==============================***//
//*==============安全代码============================*//
for (int i = 0; i < m_LogonUserID.GetSize(); i ++)
{
//如果用户已经登录或是管理员已经登录
if (m_curUserInfo.Id == m_LogonUserID.GetAt(i) || m_LogonUserID.GetAt(i) == m_managerID)
{
//如果已经登录则让其正常显示
AfxGetMainWnd()->SendMessageToDescendants(WM_SHOWRIGHTBAR,(WPARAM)3,0);//最后一个参数表明显示模式,0-正常 1-不可写
m_curDataType = 3;
return TRUE;
}
}//end-for
//如果用户尚未登录且管理员未登录
if (m_curUserInfo.safelevel == 0)
{
m_LogonUserID.Add(m_curUserInfo.Id);
AfxGetMainWnd()->SendMessageToDescendants(WM_SHOWRIGHTBAR,(WPARAM)3,0);//最后一个参数表明显示模式,0-正常 1-不可写
}
else if (m_curUserInfo.safelevel == 1)
{
AfxGetMainWnd()->SendMessageToDescendants(WM_SHOWRIGHTBAR,(WPARAM)3,1);//最后一个参数表明显示模式,0-正常 1-不可写
}
else if (m_curUserInfo.safelevel == 2)
{
if (SafeGate())
{
AfxGetMainWnd()->SendMessageToDescendants(WM_SHOWRIGHTBAR,(WPARAM)3,0);//最后一个参数表明显示模式,0-正常 1-不可写
}
else
{
return FALSE;//登录不成功
}
}
//*=================================================*//
//设置数据类型
m_curDataType = 3;
break;
}
case 4: //显示图书馆信息面板
{
if (IsGetFromDB)
{
//***======首先读取图书馆信息======***//
szSQL.Format("select * from Lib \
where ID = %d \
order by ID",
m_curLibInfo.id);
MyUpdateData(szSQL,3,false);
//***==============================***//
}
//设置数据类型
m_curDataType = 4;
AfxGetMainWnd()->SendMessageToDescendants(WM_SHOWRIGHTBAR,(WPARAM)4,0);
break;
}
case 5: //显示系统信息及设置面板
{
//设置数据类型
m_curDataType = 0;
AfxGetMainWnd()->SendMessageToDescendants(WM_SHOWRIGHTBAR,(WPARAM)5,0);
break;
}
default:
{
AfxMessageBox("8-WM_SHOWRIGHTBAR消息参数出错!");
break;
}
}//end-switch
return TRUE;
}
/*=========================MyUpdateData===============================================
说明:
此函数实现从数据库中读取数据或保存数据的功能。
参数:
strSQL : 查询语句
whichTable: 1 读取或保存用户信息
2 读取或保存书籍信息
3 读取或保存图书馆信息
save : true 保存数据
false 读取数据
====================================================================================*/
BOOL CPBMSDoc::MyUpdateData(LPCTSTR strSQL,int whichTable, bool save)
{
//测试数据
CString s;
//数据
CString photoField; //相片域名
long picLength = 0; //相片数据长度
BOOKINFO bookinfo; //书籍信息
int bookcount = 0; //书籍数目
//有效性检查
if (whichTable < 1 || whichTable > 3)
{
AfxMessageBox("10-数据表序号不对!");
return FALSE;
}
//*==============获取左视图对象指针=================*//
POSITION pos = GetFirstViewPosition();
CView* pView;
while (pos)
{
pView = GetNextView(pos);
if (pView->IsKindOf(RUNTIME_CLASS(CLeftView)))
{
break;
}
}
CLeftView *pLeftView = (CLeftView *)pView;
//*=================================================*//
//*==============访问数据库=========================*//
//首先关闭数据表
m_adoRecordSet.Close();
//打开数据表
if (!m_adoRecordSet.Open(strSQL))
{
AfxMessageBox("11-数据集Open失败!");
return FALSE;
}
switch(whichTable)
{
case 1: //用户信息
{
if(save) //保存
{
if (!m_adoRecordSet.PutCollect("ID",m_curUserInfo.Id )
||!m_adoRecordSet.PutCollect(1,m_curUserInfo.name )
||!m_adoRecordSet.PutCollect(2,m_curUserInfo.sex )
||!m_adoRecordSet.PutCollect(3,m_curUserInfo.age )
||!m_adoRecordSet.PutCollect(4,m_curUserInfo.knowID )
||!m_adoRecordSet.PutCollect(5,m_curUserInfo.identID )
||!m_adoRecordSet.PutCollect(6,m_curUserInfo.CardNumber )
||!m_adoRecordSet.PutCollect(7,m_curUserInfo.address )
||!m_adoRecordSet.PutCollect(8,m_curUserInfo.pass )
||!m_adoRecordSet.PutCollect(10,m_curUserInfo.safelevel )
||!m_adoRecordSet.PutCollect(11,m_curUserInfo.IsAlert )
||!m_adoRecordSet.PutCollect(12,m_curUserInfo.days )
||!m_adoRecordSet.PutCollect(13,m_curUserInfo.IsAdmin )
||!m_adoRecordSet.PutCollect(14,m_curUserInfo.photo.Width )
||!m_adoRecordSet.PutCollect(15,m_curUserInfo.photo.Height ))
{
AfxMessageBox("16-保存用户数据失败!");
m_adoRecordSet.Close();//关闭数据集users
return FALSE;
}
//***======保存相片数据============***//
if (m_curUserInfo.photo.Path.GetLength() != 0)
{
photoField = _T("相片");
if (!m_adoRecordSet.AppendChunk(photoField,m_curUserInfo.photo.Path))
{
AfxMessageBox("17-保存用户相片失败!");
m_adoRecordSet.Close();//关闭数据集users
return FALSE;
}
}
//***==============================***//
//***======删除相片数据============***//
if (m_curUserInfo.photo.Width == 0 && m_curUserInfo.photo.hasPhoto == true)
{
photoField = _T("相片");
if (!m_adoRecordSet.DeletePicture(photoField))
{
AfxMessageBox("18-删除用户相片失败!");
m_adoRecordSet.Close();//关闭数据集users
return FALSE;
}
}
//***==============================***//
if (!m_adoRecordSet.Update())
{
AfxMessageBox("6-更新表数据出错!");
m_adoRecordSet.Close();//关闭数据集users
return FALSE;
}
m_adoRecordSet.Close();//关闭数据集users
//修改用户名显示
pLeftView->ModifyName();
}//end-if (save)
else //读取
{
if (!m_adoRecordSet.GetCollect("ID",m_curUserInfo.Id)
||!m_adoRecordSet.GetCollect(1,m_curUserInfo.name )
||!m_adoRecordSet.GetCollect(2,m_curUserInfo.sex )
||!m_adoRecordSet.GetCollect(3,m_curUserInfo.age )
||!m_adoRecordSet.GetCollect(4,m_curUserInfo.knowID )
||!m_adoRecordSet.GetCollect(5,m_curUserInfo.identID )
||!m_adoRecordSet.GetCollect(6,m_curUserInfo.CardNumber )
||!m_adoRecordSet.GetCollect(7,m_curUserInfo.address )
||!m_adoRecordSet.GetCollect(8,m_curUserInfo.pass )
||!m_adoRecordSet.GetCollect(10,m_curUserInfo.safelevel )
||!m_adoRecordSet.GetCollect(11,m_curUserInfo.IsAlert )
||!m_adoRecordSet.GetCollect(12,m_curUserInfo.days )
||!m_adoRecordSet.GetCollect(13,m_curUserInfo.IsAdmin )
||!m_adoRecordSet.GetCollect(14,m_curUserInfo.photo.Width )
||!m_adoRecordSet.GetCollect(15,m_curUserInfo.photo.Height ))
{
AfxMessageBox("12-读取用户数据失败!");
m_adoRecordSet.Close();//关闭数据集users
return FALSE;
}
//***======读取相片数据============***//
//文件长度
picLength = m_adoRecordSet.GetFieldActualSize(9);
m_curUserInfo.photo.pdata = NULL;
m_curUserInfo.photo.len = 0;
m_curUserInfo.photo.hasPhoto = false;
if (picLength != -1 && picLength != 0)
{
m_curUserInfo.photo.pdata = new BYTE[picLength];
m_curUserInfo.photo.len = picLength;
m_curUserInfo.photo.hasPhoto = true; //原来有相片
if (!m_adoRecordSet.GetChunk(9,m_curUserInfo.photo.pdata))
{
AfxMessageBox("13-读取用户相片失败!");
m_adoRecordSet.Close();//关闭数据集users
return FALSE;
}
}
//***==============================***//
m_adoRecordSet.Close();//关闭数据集users
//从knowledge表中读数据,结果存放在m_uaKnowLevID和m_saKnowLevel对象中,
m_saKnowLevel.RemoveAll();
m_uaKnowLevID.RemoveAll();
m_adoRecordSet.Get_ID_Info_Array("knowledge",m_saKnowLevel,2,m_uaKnowLevID);
//从identities表中读数据,结果存放在m_uaIdentyID和m_saIdentity对象中,
m_saIdentity.RemoveAll();
m_uaIdentyID.RemoveAll();
m_adoRecordSet.Get_ID_Info_Array("identities",m_saIdentity,2,m_uaIdentyID);
}//end-else //读取
break;
}//end-case1
case 2: //书籍信息
{
if(save) //保存
{
//***==先将数据集清空,然后将数据写入===***//
//清空数据
while(!m_adoRecordSet.IsEOF())
{
m_adoRecordSet.Delete();
m_adoRecordSet.MoveNext();
}
//写新数据
for(bookcount = 0; bookcount < m_userBooks.GetSize(); bookcount ++)
{
m_adoRecordSet.AddNew();
bookinfo = m_userBooks.GetAt(bookcount);
if (!m_adoRecordSet.PutCollect("ID",bookinfo.Id )
||!m_adoRecordSet.PutCollect(1,bookinfo.name )
||!m_adoRecordSet.PutCollect(2,bookinfo.bookNumber )
||!m_adoRecordSet.PutCollect(3,bookinfo.IsLiterature )
||!m_adoRecordSet.PutCollect(4,bookinfo.LibID )
||!m_adoRecordSet.PutCollect(7,bookinfo.UserID )
||!m_adoRecordSet.PutCollect(8,bookinfo.IsReturn )
||!m_adoRecordSet.PutCollect(9,bookinfo.reborrowCount ))
{
AfxMessageBox("21-保存书籍信息失败!");
m_adoRecordSet.Close();//关闭数据集
return FALSE;
}//end-if
//***======对时间保存专门处理======***//
//时间未设置,则不保存,否则系统会自动保存1899-12-30这样的日期
if (bookinfo.borrowTime.m_status != 2)
{
m_adoRecordSet.PutCollect(5,bookinfo.borrowTime);
}
if (bookinfo.reborrowTime.m_status != 2)
{
m_adoRecordSet.PutCollect(6,bookinfo.reborrowTime);
}
if (bookinfo.returnTime.m_status != 2)
{
m_adoRecordSet.PutCollect(10,bookinfo.returnTime);
}
//***==============================***//
}//end-for
m_adoRecordSet.Update(); //更新数据库
m_adoRecordSet.Close(); //关闭数据集books
//***===================================***//
}//end-if //保存
else //读取
{
m_userBooks.RemoveAll(); //首先清空数组
bookcount = (int)m_adoRecordSet.GetRecordCount();
if (bookcount != 0)
{
m_userBooks.SetSize(bookcount); //设置数组长度
bookcount = 0; //将其置0,以便做队列序号之用
}
while(!m_adoRecordSet.IsEOF())
{
if (!m_adoRecordSet.GetCollect("ID",bookinfo.Id )
||!m_adoRecordSet.GetCollect(1,bookinfo.name )
||!m_adoRecordSet.GetCollect(2,bookinfo.bookNumber )
||!m_adoRecordSet.GetCollect(3,bookinfo.IsLiterature )
||!m_adoRecordSet.GetCollect(4,bookinfo.borrowTime )
||!m_adoRecordSet.GetCollect(5,bookinfo.reborrowTime )
||!m_adoRecordSet.GetCollect(6,bookinfo.reborrowCount )
||!m_adoRecordSet.GetCollect(7,bookinfo.UserID )
||!m_adoRecordSet.GetCollect(8,bookinfo.IsReturn )
||!m_adoRecordSet.GetCollect(9,bookinfo.returnTime )
||!m_adoRecordSet.GetCollect(10,bookinfo.LibID )
||!m_adoRecordSet.GetCollect(11,bookinfo.LibName )
||!m_adoRecordSet.GetCollect(12,bookinfo.canborrowTime )
||!m_adoRecordSet.GetCollect(13,bookinfo.canreborrowTime )
||!m_adoRecordSet.GetCollect(14,bookinfo.HasHoliday )
||!m_adoRecordSet.GetCollect(15,bookinfo.holiday_begin )
||!m_adoRecordSet.GetCollect(16,bookinfo.holiday_end ))
{
AfxMessageBox("19-读取书籍信息失败!");
m_adoRecordSet.Close();//关闭数据集
return FALSE;
}//end-if
//如果没有还书,则调用函数计算应还书时间
if (!bookinfo.IsReturn)
{
GetReturnTime(&bookinfo);
}
//将数据保存到队列中
m_userBooks.SetAt(bookcount++,bookinfo);
if (!m_adoRecordSet.MoveNext())
{
AfxMessageBox("20-数据集指针后移失败!");
m_adoRecordSet.Close();//关闭数据集
return FALSE;
}//
}//end-while
m_adoRecordSet.Close();//关闭数据集BookView
//*==============将所有图书馆信息读取===============*//
LIBINFO libinfo;
BOOL b = m_adoRecordSet.Open("select * from lib order by ID");
int libcount = (int)m_adoRecordSet.GetRecordCount();
if (libcount != 0)
{
m_libsInfo.SetSize(libcount); //设置数组长度
libcount = 0; //将其置0,以便做队列序号之用
}
while(!m_adoRecordSet.IsEOF())
{
if (!m_adoRecordSet.GetCollect("ID",libinfo.id )
||!m_adoRecordSet.GetCollect(1,libinfo.name )
||!m_adoRecordSet.GetCollect(2,libinfo.canborrowTime )
||!m_adoRecordSet.GetCollect(3,libinfo.canreborrowTime )
||!m_adoRecordSet.GetCollect(6,libinfo.HasHoliday )
||!m_adoRecordSet.GetCollect(7,libinfo.holiday_begin )
||!m_adoRecordSet.GetCollect(8,libinfo.holiday_end ))
{
AfxMessageBox("25-读取图书馆信息失败!");
}//end-if
//将数据保存到队列中
m_libsInfo.SetAt(libcount ++,libinfo);
if (!m_adoRecordSet.MoveNext())
{
AfxMessageBox("26-数据集指针后移失败!");
}//
}//end-while
//*=================================================*//
}//end-else //读取
break;
}//end-case2
case 3: //图书馆信息
{
if(save)
{
if (!m_adoRecordSet.PutCollect("ID",m_curLibInfo.id )
||!m_adoRecordSet.PutCollect(1,m_curLibInfo.name )
||!m_adoRecordSet.PutCollect(2,m_curLibInfo.canborrowTime )
||!m_adoRecordSet.PutCollect(3,m_curLibInfo.canreborrowTime )
||!m_adoRecordSet.PutCollect(4,m_curLibInfo.canreborrowCount )
||!m_adoRecordSet.PutCollect(5,m_curLibInfo.maxbookCount )
||!m_adoRecordSet.PutCollect(6,m_curLibInfo.HasHoliday ))
{
AfxMessageBox("28-保存图书馆信息失败!");
m_adoRecordSet.Close();//关闭数据集
return FALSE;
}//end-if
//***======对假期时间单独保存======***//
if (m_curLibInfo.holiday_begin.m_status != 2)
{
m_adoRecordSet.PutCollect(7,m_curLibInfo.holiday_begin);
}
if (m_curLibInfo.holiday_end.m_status != 2)
{
m_adoRecordSet.PutCollect(8,m_curLibInfo.holiday_end);
}
//***==============================***//
m_adoRecordSet.Update(); //更新数据库
m_adoRecordSet.Close(); //关闭数据集
//修改馆名显示
pLeftView->ModifyName(false);
}//end-if(save)
else
{
if (!m_adoRecordSet.GetCollect("ID",m_curLibInfo.id )
||!m_adoRecordSet.GetCollect(1,m_curLibInfo.name )
||!m_adoRecordSet.GetCollect(2,m_curLibInfo.canborrowTime )
||!m_adoRecordSet.GetCollect(3,m_curLibInfo.canreborrowTime )
||!m_adoRecordSet.GetCollect(4,m_curLibInfo.canreborrowCount )
||!m_adoRecordSet.GetCollect(5,m_curLibInfo.maxbookCount )
||!m_adoRecordSet.GetCollect(6,m_curLibInfo.HasHoliday )
||!m_adoRecordSet.GetCollect(7,m_curLibInfo.holiday_begin )
||!m_adoRecordSet.GetCollect(8,m_curLibInfo.holiday_end ))
{
AfxMessageBox("27-读取图书馆信息失败!");
m_adoRecordSet.Close();//关闭数据集
return FALSE;
}//end-if
m_adoRecordSet.Close();//关闭数据集
}//end-else //读取
break;
}//end-case3
default :
AfxMessageBox("9-不明访问数据库失败!");
m_adoRecordSet.Close();//关闭数据集
return FALSE;
}//end-switch
//*=================================================*//
return TRUE;
}
/*=========================GetReturnTime==============================================
说明:
获取还书时间,日后图书馆制度变更后,程序修改只需在此模块进行
参数:
pBI:书籍的所有信息,返回值也在其中的shouldReTime字段中
====================================================================================*/
void CPBMSDoc::GetReturnTime(PBOOKINFO pBI)
{
//中间变量
CTime t_borrow,t_reborrow;
t_borrow = CTime(pBI->borrowTime.GetYear(),pBI->borrowTime.GetMonth(),pBI->borrowTime.GetDay(),0,0,0);
//
if (pBI->reborrowCount == 0)//没有续借过
{
//如果没有时间则无法计算还书时间
if (pBI->borrowTime.m_status == 2)
{
pBI->shouldReTime = CTime(1970,12,30,0,0,0);
return;
}
// CTimeSpan t_span = CTimeSpan(30 * pBI->canborrowTime,0,0,0);
CTimeSpan t_span;
if (pBI->IsLiterature) {
t_span = CTimeSpan(30, 0, 0, 0); // 文学书只借30天
}else{
t_span = CTimeSpan(30 * pBI->canborrowTime,0,0,0);
}
pBI->shouldReTime = t_borrow + t_span;
}
else //续借过
{
t_reborrow = CTime(pBI->reborrowTime.GetYear(),pBI->reborrowTime.GetMonth(),pBI->reborrowTime.GetDay(),0,0,0);
//如果没有时间则无法计算还书时间
if (pBI->reborrowTime.m_status == 2)
{
pBI->shouldReTime = CTime(1970,12,30,0,0,0);
return;
}
//CTimeSpan t_span = CTimeSpan(30 * pBI->canreborrowTime,0,0,0);
//2005-9-25
CTimeSpan t_span;
if (pBI->IsLiterature) {
t_span = CTimeSpan(30, 0, 0, 0); // 文学书只借30天
}else{
t_span = CTimeSpan(30 * pBI->canreborrowTime,0,0,0);
}
pBI->shouldReTime = t_reborrow + t_span;
}
//*==============还书时间在假期中的处理=============*//
if (pBI->HasHoliday)//图书馆有假期
{
CTime h_begin,h_end;
h_begin = CTime(pBI->holiday_begin.GetYear(),pBI->holiday_begin.GetMonth(),pBI->holiday_begin.GetDay(),0,0,0);
h_end = CTime(pBI->holiday_end.GetYear(),pBI->holiday_end.GetMonth(),pBI->holiday_end.GetDay(),0,0,0);
//如果还书时间在假期中
if (pBI->shouldReTime > h_begin && pBI->shouldReTime < h_end )
{
CTimeSpan t_span;
t_span = pBI->shouldReTime - h_begin;
pBI->shouldReTime = h_end + t_span;
}//end-if(在假期)
}//end-if(图书馆有假期)
//*=================================================*//
}
/*===============================OnUserAdd============================================
说明:
添加新用户处理函数。只要一添加,就会在user表中添加相应数据,不
管是否保存了数据
====================================================================================*/
void CPBMSDoc::OnUserAdd()
{
//*=============确保只有管理员才能进行本操作========*//
bool bManagerLogon = false;
for (int i = 0 ;i < m_LogonUserID.GetSize(); i ++)
{
if (m_managerID == m_LogonUserID.GetAt(i))
{
bManagerLogon = true;
break;
}
else if (m_managerID == 0)
{
bManagerLogon = true;
break;
}
}
if (!bManagerLogon)
{
AfxMessageBox("只有管理员才能进行此操作,\n请确保管理员已经登录,\n详情请参考帮助文件!");
return;
}
//*=================================================*//
//获取用户信息中的两个List数据
if (m_saKnowLevel.GetSize() == 0)
{
//从knowledge表中读数据,结果存放在m_uaKnowLevID和m_saKnowLevel对象中,
m_adoRecordSet.Get_ID_Info_Array("knowledge",m_saKnowLevel,2,m_uaKnowLevID);
//从identities表中读数据,结果存放在m_uaIdentyID和m_saIdentity对象中,
m_adoRecordSet.Get_ID_Info_Array("identities",m_saIdentity,2,m_uaIdentyID);
}
//*==============设置新添用户数据默认值=============*//
//ID
m_curUserInfo.Id = ++ UserID;
//姓名
m_curUserInfo.name.Format("用户%d",m_curUserInfo.Id);
//性别
m_curUserInfo.sex = true;
//年龄
m_curUserInfo.age = 20;
//文化ID
m_curUserInfo.knowID = 4; //本科
//证件ID
m_curUserInfo.identID = 4; //借书证
//证件号
m_curUserInfo.CardNumber = _T("");
//住址
m_curUserInfo.address = _T("");
//密码
m_curUserInfo.pass = _T("");
//相片数据
m_curUserInfo.photo.hasPhoto = false;
m_curUserInfo.photo.Height = 0;
m_curUserInfo.photo.len = 0;
m_curUserInfo.photo.pdata = NULL;
m_curUserInfo.photo.Path = _T("");
m_curUserInfo.photo.Width = 0;
//安全级别
m_curUserInfo.safelevel = 0;
//还书提醒
m_curUserInfo.IsAlert = true;
//提醒时间
m_curUserInfo.days = 3;
//管理员
m_curUserInfo.IsAdmin = false;
//
m_IsNewUser = true;
//*=================================================*//
//*==============在users表中添加数据================*//
//构造查询语句
CString szSQL;
szSQL.Format("select * from users");
//在数据集中添加一项
BOOL b = m_adoRecordSet.Open(szSQL);
b = m_adoRecordSet.AddNew();
//将除相片以外的基本信息保存数据库
if (!m_adoRecordSet.PutCollect("ID",m_curUserInfo.Id )
||!m_adoRecordSet.PutCollect(1,m_curUserInfo.name )
||!m_adoRecordSet.PutCollect(2,m_curUserInfo.sex )
||!m_adoRecordSet.PutCollect(3,m_curUserInfo.age )
||!m_adoRecordSet.PutCollect(4,m_curUserInfo.knowID )
||!m_adoRecordSet.PutCollect(5,m_curUserInfo.identID )
||!m_adoRecordSet.PutCollect(6,m_curUserInfo.CardNumber )
||!m_adoRecordSet.PutCollect(7,m_curUserInfo.address )
||!m_adoRecordSet.PutCollect(8,m_curUserInfo.pass )
||!m_adoRecordSet.PutCollect(10,m_curUserInfo.safelevel )
||!m_adoRecordSet.PutCollect(11,m_curUserInfo.IsAlert )
||!m_adoRecordSet.PutCollect(12,m_curUserInfo.days )
||!m_adoRecordSet.PutCollect(13,m_curUserInfo.IsAdmin )
||!m_adoRecordSet.PutCollect(14,m_curUserInfo.photo.Width )
||!m_adoRecordSet.PutCollect(15,m_curUserInfo.photo.Height ))
{
AfxMessageBox("29-保存新用户数据失败!");
m_adoRecordSet.Close();//关闭数据集users
return;
}
m_adoRecordSet.Update();
m_adoRecordSet.Close();//关闭数据集users
//*=================================================*//
//*==============在左视图中修改树控件数据项=========*//
//首先获取左视图指针
POSITION pos = GetFirstViewPosition();
CView* pView;
while (pos)
{
pView = GetNextView(pos);
if (pView->IsKindOf(RUNTIME_CLASS(CLeftView)))
{
break;
}
}
CLeftView *pLeftView = (CLeftView *)pView;
//调用左视图对象函数修改树控件
pLeftView->ModifyTree();
//*=================================================*//
//显示新用户面板
GetDataAndShow(1,false);
}
/*=========================ModifyName=================================================
说明:
当在左面板修改名称后,将修改右面板相应编辑框数据
参数:
IsUser = true : 修改用户名
= false: 修改图书馆名
====================================================================================*/
void CPBMSDoc::ModifyName(bool IsUser)
{
if (IsUser)
{
GetDataAndShow(1,false);
}
else
{
GetDataAndShow(4,false);
}
}
/*=========================OnUserDel==================================================
说明:
删除用户
====================================================================================*/
void CPBMSDoc::OnUserDel()
{
//*=============确保只有管理员才能进行本操作========*//
bool bManagerLogon = false;
for (int i = 0 ;i < m_LogonUserID.GetSize(); i ++)
{
if (m_managerID == m_LogonUserID.GetAt(i))
{
bManagerLogon = true;
break;
}
else if (m_managerID == 0)
{
bManagerLogon = true;
break;
}
}
if (!bManagerLogon)
{
AfxMessageBox("只有管理员才能进行此操作,\n请确保管理员已经登录,\n详情请参考帮助文件!");
return;
}
//*=================================================*//
//从users表中读数据,结果存放在m_saUsersName和m_saUsersID对象中,
m_saUsersName.RemoveAll();
m_uaUsersID.RemoveAll();
m_adoRecordSet.Get_ID_Info_Array("users",m_saUsersName,2,m_uaUsersID);
CUserDelDlg dlg;
//将用户名及ID传入对话框对象
dlg.m_saUsersName.Copy(m_saUsersName);
dlg.m_uaUsersID.Copy(m_uaUsersID);
CString szSQL;
if (dlg.DoModal() == IDOK)
{
m_DeleteUserID = dlg.m_userID;
//构造SQL语句
szSQL.Format("select * from users \
where ID = %d",
m_DeleteUserID);
bool IsAdmin = false;
m_adoRecordSet.Open(szSQL); //打开数据集
//检查是否是管理员
m_adoRecordSet.GetCollect(13,IsAdmin);
if (IsAdmin)
{
AfxMessageBox("不能删除管理员,请在设定新的管理员\n后再删除该用户!");
return;
}
m_adoRecordSet.Delete(); //删除数据
m_adoRecordSet.Update(); //更新数据集
m_adoRecordSet.Close(); //关闭数据集
//删除该用户书籍
if (dlg.m_delbooks)
{
szSQL.Format("select * from books \
where UserID = %d",
dlg.m_userID);
m_adoRecordSet.Open(szSQL); //打开数据集
while (!m_adoRecordSet.IsEOF())
{
m_adoRecordSet.Delete(); //删除数据
m_adoRecordSet.MoveNext(); //后移
}//end-while
m_adoRecordSet.Update(); //更新数据集
m_adoRecordSet.Close(); //关闭数据集
}//end-if(删除书籍)
//*==============在左视图中修改树控件数据项=========*//
//首先获取左视图指针
POSITION pos = GetFirstViewPosition();
CView* pView;
while (pos)
{
pView = GetNextView(pos);
if (pView->IsKindOf(RUNTIME_CLASS(CLeftView)))
{
break;
}
}
CLeftView *pLeftView = (CLeftView *)pView;
//调用左视图对象函数修改树控件
pLeftView->ModifyTree(false);//删除
//*=================================================*//
}//end-if
}
/*=========================OnLibAdd===================================================
说明:
添加图书馆
====================================================================================*/
void CPBMSDoc::OnLibAdd()
{
//*=============确保只有管理员才能进行本操作========*//
bool bManagerLogon = false;
for (int i = 0 ;i < m_LogonUserID.GetSize(); i ++)
{
if (m_managerID == m_LogonUserID.GetAt(i))
{
bManagerLogon = true;
break;
}
else if (m_managerID == 0)
{
bManagerLogon = true;
break;
}
}
if (!bManagerLogon)
{
AfxMessageBox("只有管理员才能进行此操作,\n请确保管理员已经登录,\n详情请参考帮助文件!");
return;
}
//*=================================================*//
//*==============设置新添图书馆数据默认值===========*//
//ID
m_curLibInfo.id = ++ LibID;
//馆名
m_curLibInfo.name.Format("图书馆%d",m_curLibInfo.id );
//允许借书时间
m_curLibInfo.canborrowTime = 1;
//允许续借时间
m_curLibInfo.canreborrowTime = 2;
//续借次数
m_curLibInfo.canreborrowCount = 2;
//最大借书数目
m_curLibInfo.maxbookCount = 15;
//有假期否
m_curLibInfo.HasHoliday = false;
m_curLibInfo.holiday_begin.SetStatus(COleDateTime::null);
m_curLibInfo.holiday_end.SetStatus(COleDateTime::null);
//*=================================================*//
//*==============在users表中添加数据================*//
//构造查询语句
CString szSQL;
szSQL.Format("select * from lib");
//在数据集中添加一项
BOOL b = m_adoRecordSet.Open(szSQL);
b = m_adoRecordSet.AddNew();
if (!m_adoRecordSet.PutCollect("ID",m_curLibInfo.id )
||!m_adoRecordSet.PutCollect(1,m_curLibInfo.name )
||!m_adoRecordSet.PutCollect(2,m_curLibInfo.canborrowTime )
||!m_adoRecordSet.PutCollect(3,m_curLibInfo.canreborrowTime )
||!m_adoRecordSet.PutCollect(4,m_curLibInfo.canreborrowCount )
||!m_adoRecordSet.PutCollect(5,m_curLibInfo.maxbookCount )
||!m_adoRecordSet.PutCollect(6,m_curLibInfo.HasHoliday ))
{
AfxMessageBox("30-保存图书馆信息失败!");
m_adoRecordSet.Close();//关闭数据集
return;
}//end-if
//***======对假期时间单独保存======***//
if (m_curLibInfo.holiday_begin.m_status != 2)
{
m_adoRecordSet.PutCollect(7,m_curLibInfo.holiday_begin);
}
if (m_curLibInfo.holiday_end.m_status != 2)
{
m_adoRecordSet.PutCollect(8,m_curLibInfo.holiday_end);
}
//***==============================***//
m_adoRecordSet.Update();
m_adoRecordSet.Close();//关闭数据集users
//*=================================================*//
//*==============在左视图中修改树控件数据项=========*//
//首先获取左视图指针
POSITION pos = GetFirstViewPosition();
CView* pView;
while (pos)
{
pView = GetNextView(pos);
if (pView->IsKindOf(RUNTIME_CLASS(CLeftView)))
{
break;
}
}
CLeftView *pLeftView = (CLeftView *)pView;
//调用左视图对象函数修改树控件
pLeftView->ModifyTree(true,false);
//*=================================================*//
//显示新用户面板
GetDataAndShow(4,false);
}
/*=========================OnLibDel===================================================
说明:
删除图书馆
====================================================================================*/
void CPBMSDoc::OnLibDel()
{
//*=============确保只有管理员才能进行本操作========*//
bool bManagerLogon = false;
for (int i = 0 ;i < m_LogonUserID.GetSize(); i ++)
{
if (m_managerID == m_LogonUserID.GetAt(i))
{
bManagerLogon = true;
break;
}
else if (m_managerID == 0)
{
bManagerLogon = true;
break;
}
}
if (!bManagerLogon)
{
AfxMessageBox("只有管理员才能进行此操作,\n请确保管理员已经登录,\n详情请参考帮助文件!");
return;
}
//*=================================================*//
//从lib表中读数据,结果存放在m_saLibsName和m_saLibsID对象中,
m_saLibsName.RemoveAll();
m_uaLibsID.RemoveAll();
m_adoRecordSet.Get_ID_Info_Array("lib",m_saLibsName,2,m_uaLibsID);
CLibDelDlg dlg;
//将用户名及ID传入对话框对象
dlg.m_saLibsName.Copy(m_saLibsName);
dlg.m_uaLibsID.Copy(m_uaLibsID);
CString szSQL;
if (dlg.DoModal() == IDOK)
{
m_DeleteLibID = dlg.m_libID;
//构造SQL语句
szSQL.Format("select * from lib \
where ID = %d",
m_DeleteLibID);
m_adoRecordSet.Open(szSQL); //打开数据集
m_adoRecordSet.Delete(); //删除数据
m_adoRecordSet.Update(); //更新数据集
m_adoRecordSet.Close(); //关闭数据集
//删除该图书馆书籍
if (dlg.m_delbooks)
{
szSQL.Format("select * from books \
where LibID = %d",
dlg.m_libID);
m_adoRecordSet.Open(szSQL); //打开数据集
while (!m_adoRecordSet.IsEOF())
{
m_adoRecordSet.Delete(); //删除数据
m_adoRecordSet.MoveNext(); //后移
}//end-while
m_adoRecordSet.Update(); //更新数据集
m_adoRecordSet.Close(); //关闭数据集
}//end-if(删除书籍)
//*==============在左视图中修改树控件数据项=========*//
//首先获取左视图指针
POSITION pos = GetFirstViewPosition();
CView* pView;
while (pos)
{
pView = GetNextView(pos);
if (pView->IsKindOf(RUNTIME_CLASS(CLeftView)))
{
break;
}
}
CLeftView *pLeftView = (CLeftView *)pView;
//调用左视图对象函数修改树控件
pLeftView->ModifyTree(false,false);//删除图书馆
//*=================================================*//
}//end-if
}
/*=========================SafeGate===================================================
说明:
安全关口。用户登录
====================================================================================*/
BOOL CPBMSDoc::SafeGate()
{
int m_LogonCount = 0; //当前用户尝试登录次数,不能超过3次
CLogonDlg dlg;
while(m_LogonCount != 3) //3次输入密码机会
{
if (dlg.DoModal() == IDOK)
{
if (dlg.m_szPass == m_curUserInfo.pass)//密码相符
{
m_LogonUserID.Add(m_curUserInfo.Id);//将该用户ID记录下来
return TRUE;
}
else
{
AfxMessageBox("您输入的密码不对");
m_LogonCount ++;
}//end-else
}//end-if(DoModal)
else
{
break;
}
}//end-while
return FALSE;
}
/*=========================OnSysChangeadmin===========================================
说明:
修改系统管理员处理函数
====================================================================================*/
void CPBMSDoc::OnSysChangeadmin()
{
CAdminLogonDlg dlg;
CSelectAdminDlg dlg2;
int logonCount = 0;
CString szSQL;
//*==============初始化修改管理员对话框=============*//
//从users表中读数据,结果存放在m_saUsersName和m_saUsersID对象中,
m_saUsersName.RemoveAll();
m_uaUsersID.RemoveAll();
m_adoRecordSet.Get_ID_Info_Array("users",m_saUsersName,2,m_uaUsersID);
//*=================================================*//
//当前没有管理员
if (m_managerID == 0)
{
dlg2.m_saUsersName.Copy(m_saUsersName);
dlg2.m_uaUsersID.Copy(m_uaUsersID);
if (dlg2.DoModal() == IDOK)
{
//如果设置为没有管理员,则退出(因为当前本来就没有管理员)
if (dlg2.m_noadmin)
{
return;
}
//将新管理员的IsAdmin位在数据库中设置
szSQL.Format("select * from users \
where ID = %d",
dlg2.m_userID);
m_adoRecordSet.Open(szSQL);
m_adoRecordSet.PutCollect("是否管理员",true);
//将全局管理员变量值重新设置
m_managerID = dlg2.m_userID;
m_adoRecordSet.GetCollect("密码",m_managerPass);
//更新数据库
m_adoRecordSet.Update();
m_adoRecordSet.Close();
}//end-if(dlg2.DoModal())
else
{
return;
}//end-else
}//end-if
else//有管理员
{
while (logonCount != 3)
{
if (dlg.DoModal() == IDOK)
{
if (dlg.m_pass == m_managerPass)
{
//显示选择管理员对话框
//将用户名及ID传入对话框对象
dlg2.m_saUsersName.Copy(m_saUsersName);
dlg2.m_uaUsersID.Copy(m_uaUsersID);
if (dlg2.DoModal() == IDOK)
{
//首先将原来管理员的IsAdmin位在数据库中清除
szSQL.Format("select * from users \
where ID = %d",
m_managerID);
BOOL b = m_adoRecordSet.Open(szSQL);
b = m_adoRecordSet.PutCollect("是否管理员",false);
b = m_adoRecordSet.Update();
m_adoRecordSet.Close();
//将新管理员的IsAdmin位在数据库中设置
if (!dlg2.m_noadmin)
{
szSQL.Format("select * from users \
where ID = %d",
dlg2.m_userID);
m_adoRecordSet.Open(szSQL);
m_adoRecordSet.PutCollect("是否管理员",true);
//将全局管理员变量值重新设置
m_managerID = dlg2.m_userID;
m_adoRecordSet.GetCollect("密码",m_managerPass);
//更新数据库
m_adoRecordSet.Update();
m_adoRecordSet.Close();
}
break;
}//end-if
else
{
break;
}//end-else
}//end-if(dlg.m_pass == m_managerPass)
else
{
AfxMessageBox("您输入的密码不对,\n请找管理员联系!");
logonCount ++;
}//end-if
}//end-if(dlg.DoModal() == IDOK)
else
{
break;
}
}//end-while
}//end-else
}
/*=========================OnSysLogonout==============================================
说明:
用户注销函数
====================================================================================*/
void CPBMSDoc::OnSysLogonout()
{
CLogonOutDlg dlg;
//将用户名、ID及登录用户ID传入对话框对象
dlg.m_saUsersName.Copy(m_saUsersName);
dlg.m_uaUsersID.Copy(m_uaUsersID);
dlg.m_LogonUserID.Copy(m_LogonUserID);
//显示对话框
if (dlg.DoModal() == IDOK)
{
//将用户从已经登录用户列表中删除
for(int i = 0; i < m_LogonUserID.GetSize(); i ++)
{
if (m_LogonUserID.GetAt(i) == dlg.m_userID)
{
m_LogonUserID.RemoveAt(i);
//*==============显示主面板=========================*//
//***======获取左面板对象==========***//
POSITION pos = GetFirstViewPosition();
CView* pView;
while (pos)
{
pView = GetNextView(pos);
if (pView->IsKindOf(RUNTIME_CLASS(CLeftView)))
{
break;
}
}
CLeftView *pLeftView = (CLeftView *)pView;
//***==============================***//
//调用左面板对象函数显示主板
pLeftView->SelectRoot();
//*=================================================*//
break;
}//end-if
}//end-for
}//end-if(DoModal)
}
/*=============================ScanBooks==============================================
说明:
用来扫描快到期书籍。
参数:
noAlert = true : 如果没有图书超期,也要报告
= false : 如果没有图书超期,不报告
====================================================================================*/
void CPBMSDoc::ScanBooks(bool noAlert)
{
//*==============从数据库中读取数据=================*//
CString szSQL;
szSQL.Format("select * from ShouldReturnBooks \
order by users.ID");//按用户ID排序
BOOL b = m_adoRecordSet.Open(szSQL);
//*=================================================*//
CArray m_ShouldReturnBooks; //所有需报警之图书
BOOKINFOEX bookinfo;
while (!m_adoRecordSet.IsEOF())
{
if (!m_adoRecordSet.GetCollect("users.ID",bookinfo.userID )
||!m_adoRecordSet.GetCollect(1,bookinfo.userName )
||!m_adoRecordSet.GetCollect(2,bookinfo.bookID )
||!m_adoRecordSet.GetCollect(3,bookinfo.borrowTime )
||!m_adoRecordSet.GetCollect(4,bookinfo.reborrowTime )
||!m_adoRecordSet.GetCollect(5,bookinfo.canborrowTime )
||!m_adoRecordSet.GetCollect(6,bookinfo.canreborrowTime )
||!m_adoRecordSet.GetCollect(7,bookinfo.HasHoliday )
||!m_adoRecordSet.GetCollect(8,bookinfo.holiday_begin )
||!m_adoRecordSet.GetCollect(9,bookinfo.holiday_end )
||!m_adoRecordSet.GetCollect(10,bookinfo.alertTime )
||!m_adoRecordSet.GetCollect(11,bookinfo.reborrowCount )
||!m_adoRecordSet.GetCollect(12,bookinfo.IsLiterature ))
{
AfxMessageBox("!-读取书籍信息失败!");
m_adoRecordSet.Close(); //关闭数据集
return;
}//end-if
//获取还书时间
GetReturnTime(&bookinfo);
//计算离到期时间
CTime today = CTime::GetCurrentTime();
CTimeSpan t_span = bookinfo.shouldReTime - today;
//与用户设置的报警时间进行比较
if (t_span.GetDays() <= bookinfo.alertTime)
{
m_ShouldReturnBooks.Add(bookinfo);
}
m_adoRecordSet.MoveNext(); //后移
}//end-while
m_adoRecordSet.Close(); //关闭数据集
//*==============报警===============================*//
//将到期图书按用户分类
CStringArray m_saUserName; //有到期图书用户名
CUIntArray m_uaBookCount; //相应的到期图书数目
//中间变量
int index = -1;
int count = 0;
for(int i = 0; i < m_ShouldReturnBooks.GetSize(); i ++)
{
if (index == -1) //用户名数组为空
{
m_saUserName.Add(m_ShouldReturnBooks.GetAt(i).userName);
count ++;
index ++;
}//end-if(index)
else //用户名数组不为空
{
if (m_ShouldReturnBooks.GetAt(i).userName == m_saUserName.GetAt(index))
{
count ++;
}//end-if
else //另一用户
{
m_uaBookCount.Add(count);
m_saUserName.Add(m_ShouldReturnBooks.GetAt(i).userName);
index ++;
count = 1;
}//end-else
}//end-else
}//end-for
//将最后一个用户的书本数目添加到数组中
if (count != 0)
{
m_uaBookCount.Add(count);
}
//弹出警告框
CAlertDlg dlg;
//没有超人期图书
if (m_saUserName.GetSize() == 0)
{
if (noAlert == false)
{
return;
}
dlg.m_saAlert = "没有超期图书";
dlg.DoModal();
return;
}
else
{
//有超期图书
dlg.m_saAlert = "";
CString s;
for (i = 0; i < m_saUserName.GetSize(); i ++)
{
//信息
s.Format("\t%d 本书快到期\n\n",m_uaBookCount.GetAt(i));
dlg.m_saAlert += "用户:";
dlg.m_saAlert += m_saUserName.GetAt(i);
dlg.m_saAlert += s;
}
//发出报警声
::sndPlaySound(CPBMSDoc::AlertSoundPath,SND_ASYNC);
//显示警告框
dlg.DoModal();
}
//*=================================================*//
}
/*=========================GetReturnTime==============================================
说明:
获取还书时间,日后图书馆制度变更后,程序修改只需在此模块进行
参数:
pBI:书籍的所有信息,返回值也在其中的shouldReTime字段中
====================================================================================*/
void CPBMSDoc::GetReturnTime(PBOOKINFOEX pBI)
{
//中间变量
CTime t_borrow,t_reborrow;
t_borrow = CTime(pBI->borrowTime.GetYear(),pBI->borrowTime.GetMonth(),pBI->borrowTime.GetDay(),0,0,0);
//
if (pBI->reborrowCount == 0)//没有续借过
{
//如果没有时间则无法计算还书时间
if (pBI->borrowTime.m_status == 2)
{
pBI->shouldReTime = CTime(1970,12,30,0,0,0);
return;
}
// CTimeSpan t_span = CTimeSpan(30 * pBI->canborrowTime,0,0,0);
CTimeSpan t_span;
if (pBI->IsLiterature) {
t_span = CTimeSpan(30, 0, 0, 0); // 文学书只借30天
}else{
t_span = CTimeSpan(30 * pBI->canborrowTime,0,0,0);
}
pBI->shouldReTime = t_borrow + t_span;
}
else //续借过
{
t_reborrow = CTime(pBI->reborrowTime.GetYear(),pBI->reborrowTime.GetMonth(),pBI->reborrowTime.GetDay(),0,0,0);
//如果没有时间则无法计算还书时间
if (pBI->reborrowTime.m_status == 2)
{
pBI->shouldReTime = CTime(1970,12,30,0,0,0);
return;
}
//CTimeSpan t_span = CTimeSpan(30 * pBI->canreborrowTime,0,0,0);
//2005-9-25
CTimeSpan t_span;
if (pBI->IsLiterature) {
t_span = CTimeSpan(30, 0, 0, 0); // 文学书只借30天
}else{
t_span = CTimeSpan(30 * pBI->canreborrowTime,0,0,0);
}
pBI->shouldReTime = t_reborrow + t_span;
}
//*==============还书时间在假期中的处理=============*//
if (pBI->HasHoliday)//图书馆有假期
{
CTime h_begin,h_end;
h_begin = CTime(pBI->holiday_begin.GetYear(),pBI->holiday_begin.GetMonth(),pBI->holiday_begin.GetDay(),0,0,0);
h_end = CTime(pBI->holiday_end.GetYear(),pBI->holiday_end.GetMonth(),pBI->holiday_end.GetDay(),0,0,0);
//如果还书时间在假期中
if (pBI->shouldReTime > h_begin && pBI->shouldReTime < h_end )
{
CTimeSpan t_span;
t_span = pBI->shouldReTime - h_begin;
pBI->shouldReTime = h_end + t_span;
}//end-if(在假期)
}//end-if(图书馆有假期)
//*=================================================*//
}
/*=========================OnScanbooks================================================
说明:
用户在程序运行期间,进行到期图书检查操作处理函数
====================================================================================*/
void CPBMSDoc::OnScanbooks()
{
ScanBooks();
}
/*=========================GetSoundPath===============================================
说明:
之所以要在Doc中的初始化函数处调用此函数是因为本来在SysDlg对象中
实现的功能在初始化时还未实现,故不能获得声音路径,导致初始化
时不能发出声音
====================================================================================*/
void CPBMSDoc::GetSoundPath()
{
char filepath[128];
//获取路径
::GetCurrentDirectory(sizeof(filepath),filepath);
int i=0;
while(filepath[i] != '\0')
{
i ++ ;
}
filepath[i] = '\\';
char *filename = "Config.inf";
while ( *filename != '\0')
{
filepath[++i] = *filename;
filename ++;
}
filepath[++i] = '\0'; //添加字符串结束符
//---============---//
//打开文件,读取数据
CStdioFile file;
if (!file.Open(filepath,CFile::modeRead | CFile::typeText ))
{
CPBMSDoc::AlertSoundPath = "sound\\msg.wav";
}
else
{
try
{
file.ReadString(CPBMSDoc::AlertSoundPath);
file.Close();
}//end-try
catch(CFileException * e)
{
file.Close();
//如果打开配置文件失败,则自行设置参数,保证程序的正常运行
CPBMSDoc::AlertSoundPath = "sound\\msg.wav";
}
}//end-else;
}