project
做了一个可以手机号登录、挂号、查看挂号信息、实时显示时间、查看排队情况,还可以与服务端信息交互的一个挂号终端
系统界面的交互用的是简单的图片刷新和切换,点击某个按钮则切换下一张图片实现界面的切换
手机号登录:用字库显示输入的手机号码,字符串记录存储到的手机号码,退格删除的话则将字符串最后一位置为\0
MFont* f1 = MFont::instance();
f1->show(buf,45,403,56,0xffffffff,306,60,20,13);
if(x>315 && x<411 && y>160 && y<208)
{
cout<<"key:1"<<endl;
strcat(buf,"1");
f1->show(buf,45,403,56,0xffffffff,306,60,20,13);
}
else if(x>453 && x<550 && y>160 && y<208)
{
cout<<"key:2"<<endl;
strcat(buf,"2");
f1->show(buf,45,403,56,0xffffffff,306,60,20,13);
}
else if(x>593 && x<690 && y>160 && y<208)
{
cout<<"key:3"<<endl;
strcat(buf,"3");
f1->show(buf,45,403,56,0xffffffff,306,60,20,13);
}
else if(x>315 && x<411 && y>241 && y<290)
{
cout<<"key:4"<<endl;
strcat(buf,"4");
f1->show(buf,45,403,56,0xffffffff,306,60,20,13);
}
else if(x>453 && x<550 && y>241 && y<290)
{
cout<<"key:5"<<endl;
strcat(buf,"5");
f1->show(buf,45,403,56,0xffffffff,306,60,20,13);
}
else if(x>593 && x<690 && y>241 && y<290)
{
cout<<"key:6"<<endl;
strcat(buf,"6");
f1->show(buf,45,403,56,0xffffffff,306,60,20,13);
}
else if(x>315 && x<411 && y>326 && y<374)
{
cout<<"key:7"<<endl;
strcat(buf,"7");
f1->show(buf,45,403,56,0xffffffff,306,60,20,13);
}
else if(x>453 && x<550 && y>326 && y<374)
{
cout<<"key:8"<<endl;
strcat(buf,"8");
f1->show(buf,45,403,56,0xffffffff,306,60,20,13);
}
else if(x>593 && x<690 && y>326 && y<374)
{
cout<<"key:9"<<endl;
strcat(buf,"9");
f1->show(buf,45,403,56,0xffffffff,306,60,20,13);
}
else if(x>315 && x<411 && y>404 && y<452)
{
cout<<"return"<<endl;
MainWidget w1;
w1.exec();
}
else if(x>691 && x<763 && y>152 && y<283)
{
cout<<"key:0"<<endl;
strcat(buf,"0");
f1->show(buf,45,403,56,0xffffffff,306,60,20,13);
}
else if(x>691 && x<763 && y>318 && y<443)
{
cout<<"delete"<<endl;
len = strlen(buf);
if(len > 0)
{
buf[len - 1] = '\0';
}
f1->show(buf,45,403,56,0xffffffff,306,60,20,13);
}
else if(x>593 && x<690 && y>404 && y<452)
{
cout<<"determine"<<endl;
if(strlen(buf)==11)
{
patient.set_phone(buf);
flag = true;
PhotoWidget p; // 实例化一个图片界面类的对象
p.exec();
break;
}
}
挂号:通过点击选择科室、医生和时间,然后存储到病人类里,方便之后读取和发送给服务器
if(!flag)
{
cout<<"已进入"<<endl;
Bmp b1("./appointment.bmp");
b1.show();
sleep(3);
std::string buf;
buf += patient.get_name() + "|";
buf += patient.get_office() + "|";
buf += patient.get_doctor() + "|";
buf += patient.get_time() + "|";
cout<<buf<<endl;
tcp.sendMsg(buf);
MainWidget w1;
w1.exec();
break;
}
实时显示时间:开启一条线程无限循环显示时间
void ConstantlyWidget::run()
{// 获取当前系统时间
std::time_t currentTime = std::time(nullptr);
char timeString[100];
while(1)
{
// 将时间转换为本地时间
std::tm* localTime = std::localtime(¤tTime);
// 使用格式化字符串构建输出
std::strftime(timeString, sizeof(timeString), "%Y-%m-%d %H:%M:%S", localTime);
//输出时间
MFont* f1 = MFont::instance();
f1->show(timeString,24,250,30,0xDAE3F5,550,3,10,5);
currentTime += 1;
// 暂停一秒钟
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
查看排队情况:服务器判断是否有客户端连接,有的话计数+1,当客户端有查看排队情况请求时则发送计数,客户端接收后即可知道现在的排队情况
void* send_task(void* arg)
{
cout<<"send "<<count<<endl;
std::string strNum = std::to_string(count);
TcpSocket* client = reinterpret_cast<TcpSocket*>(arg);
client->sendMsg(strNum);
}
void* task(void*arg)
{
TcpSocket*client = reinterpret_cast<TcpSocket*>(arg);
char buf[1024] = {0};
char *token;
string name,office,doctor,time;
while (1) {
client->recvMsg(buf,sizeof(buf));
std::cout<<"客户端 IP:"<<client->ip()<<" PORT:"<<client->port()<<" "<<buf<<endl;
token = strtok(buf,"|");
if(token != NULL)
{
cout<<"name:"<<token<<endl;
name = token;
token = strtok(NULL, "|");
if(token != NULL)
{
cout<<"office:"<<token<<endl;
office = token;
token = strtok(NULL, "|");
if(token != NULL)
{
cout<<"doctor:"<<token<<endl;
doctor = token;
token = strtok(NULL, "|");
if(token != NULL)
{
cout<<"time:"<<token<<endl;
time = token;
token = strtok(NULL, "|");
}
}
}
}
count++;
pthread_t th1;
pthread_create(&th1,NULL,send_task,client);
挂号情况:将保存下来的数据发送给服务端,服务端再转换成json数据保存到本地
StringBuffer s; // 创建缓冲区对象
Writer<StringBuffer> writer(s); // 创建Writer对象,将数据写入缓冲区
writer.StartObject(); // 开始写入一个JSON对象
writer.Key("name");
writer.String(name.c_str());
writer.Key("office");
writer.String(office.c_str());
writer.Key("doctor");l999999999999
writer.String(doctor.c_str());
writer.Key("time");
writer.String(time.c_str());
writer.EndObject();
string outFileName = "outfile.json";
ofstream outfile(outFileName,ios::app);
if(outfile.is_open())
{
outfile<<s.GetString();
outfile.close();
}
演示视频如下
之后再传,审核中