图书管理系统链接:C++实现TCP协议下的CS架构的图书馆书籍管理系统(数据库mysql)
【DOS界面下的小优化】
1.客户端在连接不上服务器是不进入主界面,而是提示连接错误并退出程序,优化用户体验;
程序实现,在TCP协议connectToServer函数中加入一个全局变量goon,用来控制主函数是否进入主选择界面;
void MySocket::connectToServer()
{
//连接服务器
retVal = connect(sHost, (LPSOCKADDR)&servAddr, sizeof(servAddr));
if (SOCKET_ERROR == retVal)
{
cout << "connect failed!" << endl;
closesocket(sHost); //关闭套接字
WSACleanup(); //释放套接字资源
goon = 1;//终止后面的进入窗口
}
else
{
cout << "*********服务器连接成功**********" << endl;
}
}
int main()
{
cout <<" ||~●~●~●<Client>●~●~●~||"<< endl;
cout << "************正在连接服务器***********" << endl;
mgc send_data; //数据发送包
mgc recv_data; //数据接受包
MySocket MySocket(2333, "127.0.0.1");
MySocket.connectToServer();
if (goon == 0)
{
cout << "正在进入图书馆服务窗口......" << endl;
while (1)
{
MySocket.Choose(&send_data);
MySocket.sendData(&send_data);//需要返回值
19 ZeroMemory(&send_data, sizeof(&send_data));
MySocket.reveiveData(&recv_data);//接受反馈指令
ZeroMemory(&recv_data, sizeof(&recv_data));
if (shutdownf == 1)
{
MySocket.~MySocket();
//break;
}
}
}
else
{
cout << " o(╥﹏╥)o 糟糕,服务器连接失败了." << endl;
system("pause");
}
}
2.还书时判断是否逾期;
return时通过数据库函数,在update时,调用ReTime=TO_DAYS(redate),BackTime=TO_DAYS(curdate())分别获取预设定的日期的days表示,即从1970.1.1到该日期的天数然后对两个日期进行大小比较的到是否逾期的信号;
void mysqldata::Whetherovertime(int book_id)
{
if (borrow)
{
if (strcmp(Agetretime, Agetbacktime) >= 0)
{
cout << "该同学已按期完成还书。" << endl;
strcpy_s(Sgetbookinf, "您已按期完成还书,谢谢。\n");
cout << endl;
}
else
{
int min, money;
min = atoi(Agetbacktime) - atoi(Agetretime);
money = min*0.5;
cout << endl;
cout << "o(╥﹏╥)o "<<endl<<"小伙子,你逾期【" << min << "】天了,请交【" << money << "元】逾期费用到管理员处!" << endl;
char cmin[64], cmoney[64];
itoa(min, cmin, 10);
itoa(money, cmoney, 10);
strcpy_s(Sgetbookinf, "o(╥﹏╥)o \n小伙子,你逾期【");
strcat_s(Sgetbookinf, cmin);
strcat_s(Sgetbookinf, "】天了,请交【");
strcat_s(Sgetbookinf, cmoney);
strcat_s(Sgetbookinf, "元】逾期费用到管理员处!\n");
}
}
}
3.DOS界面客户端接收到程序后,跳转回主界面太快,用户读取信息体验不好,优化体验,在打印cout完rece_data的信息后,加上延时函数sleep,一段时间后再自动返回主界面。头文件调用:#include<Windows.h>
void MySocket::reveiveData(mgc *rec_data)
{
ZeroMemory(buf, BUF_SIZE);
memset(rec_data, 0, sizeof(*rec_data));
retVal = recv(sHost, buf, sizeof(*rec_data), 0); // 接收服务器端的数据
memcpy(rec_data, buf, sizeof(buf));
cout << endl<<"从服务器接收到数据:\n" << endl;
cout << "-----------------------------------------------------------" << endl;
cout<<endl<< rec_data->send1 << endl;
cout <<"-----------------------------------------------------------" << endl;
Sleep(3*1000);
cout << "正在返回图书馆服务窗口......" << endl;
}