目次
効果展示
五:外来受診予約管理システム【ユーザー画面と機能実現】
22.CLoginWin.h .cpp【役割別のログイン画面】
23.CRegisterWin.h .cpp【登録画面】
24.CUsermainWin.h .cpp【ユーザーメイン画面】
25.CUserpersonalWin.h .cpp【ユーザー個人情報画面】
26.CUserinformationWin.h .cpp【ユーザー情報入力画面】
27.CUserpwdWin.h .cpp【ユーザーパスワード変更画面】
28.CUserbookmainWin.h .cpp【ユーザー予約メイン画面】
29.CUserbookpatientWin.h .cpp【ユーザー外来受診予約画面】
30.CUserbookvaccineWin.h .cpp【ユーザーワクチン予約画面】
31.CUservaccinationWin.h .cpp【ユーザーワクチン接種画面】
32.CUsertakenumWin.h .cpp【ユーザー番号取得画面】
33.CUsercancelWin.h .cpp【ユーザー予約取消画面】
34.CUserorderWin.h .cpp【ユーザー番号確認画面】
35.CUsermedicalinfoWin.h .cpp【ユーザー受診情報閲覧画面】
効果展示
ユーザー役割別の操作例
ユーザーがログインに成功すると、受診情報画面に移動して検索が可能です
以下のように日付範囲を入力すると、検索データが表示されます
本画面では、全ての受診記録を閲覧し、左右キーでページングが可能です
ユーザーが番号取得画面に移動して番号を取得できます
まず、予約記録を確認します
確認が完了したら番号を取得します
番号取得に成功すると、プロジェクトディレクトリのファイル内に、ユーザーが受診待機状態であることが確認できます
本プロジェクトの規模が大きい為、ソースコードを四つの記事に分けています
C++プロジェクト-外来受診予約システム1
C++プロジェクト-外来受診予約システム2
C++プロジェクト-外来受診予約システム4
五:外来受診予約管理システム【ユーザー画面と機能実現】
ユーザー画面の描画、機能選択、画面遷移
ユーザー登録機能(一般ユーザーのみ登録可)
ログイン機能(成功後は役割に応じた画面へ移動) 退出
ユーザー個人情報画面【情報入力機能】
ユーザー個人情報画面【パスワード変更機能】
ユーザー予約メイン画面の描画、機能選択、画面遷移
外来受診予約機能
番号取得画面の描画+機能実現 予約取消
受診情報検索
22.CLoginWin.h .cpp【役割別のログイン画面】
#ifndef CLOGINWIN_H
#define CLOGINWIN_H
#include "CWinBase.h"//ウィンドウ基底クラスを継承
#include "CButton.h"//ボタンクラス
#include "CLabel.h"//ラベルクラス
#include "CEdit.h"//編集クラス
//ログイン画面 ウィンドウ基底クラスを継承
class CLoginWin : public CWinBase
{
public:
CLoginWin(); //デフォルトコンストラクタ
~CLoginWin(); //デストラクタ
CLoginWin(int x, int y, int w, int h); //引数付きコンストラクタ
int doAction(); //キー応答実行関数[純粋仮想関数]
int Jude(); //ログイン検証
protected:
private:
CLabel *titleLogin, *titleAcc, *titlePass, *titleRole, *titleDesc; //ラベル
CButton *btnLogin, *btnBack; //ボタン
CEdit *editAcc, *editPass, *editRole; //編集
};
#endif
#include "CLoginWin.h" //ログイン画面
#include "CTools.h" //ツールクラス
#include <iostream>
using namespace std;
#include "CData.h" //共通データクラス
#include <cstring>
#include <windows.h> //任意キーで продол
#include <map>
#include <string>
//ログイン画面 ウィンドウ基底クラスを継承[デフォルトコンストラクタ]
CLoginWin::CLoginWin() : CWinBase()
{
}
//デストラクタ
CLoginWin::~CLoginWin()
{
}
//ログイン画面 ウィンドウ基底クラスを継承[引数付きコンストラクタ]
CLoginWin::CLoginWin(int x, int y, int w, int h)
: CWinBase(x, y, w, h)
{
//コントロールを作成
//ラベル
this->titleLogin = new CLabel(21, 7, 10, 2, "ログイン画面", LABEL); //0
this->titleAcc = new CLabel(8, 13, 10, 2, "ユーザー名", LABEL); //1
this->titlePass = new CLabel(8, 16, 10, 2, "パスワード", LABEL); //2
this->titleRole = new CLabel(8, 19, 10, 2, "役割", LABEL); //3
//編集
this->editAcc = new CEdit(17, 12, 10, 3, "", 11, 2, 1, EDIT); //4
this->editPass = new CEdit(17, 15, 10, 3, "", 6, 2, 0, EDIT); //5
this->editRole = new CEdit(17, 18, 10, 3, "", 1, 2, 1, EDIT); //6
//ボタン
this->btnLogin = new CButton(8, 23, 8, 3, "ログイン", BUTTON); //7
this->btnBack = new CButton(25, 23, 8, 3, "戻る", BUTTON); //8
//ラベル
this->titleDesc = new CLabel(8, 21, 30, 2, "1:管理者;2:医師;3:ユーザー", LABEL); //9
//コントロールをウィンドウに追加
this->addControl(this->titleLogin);
this->addControl(this->titleAcc);
this->addControl(this->titlePass);
this->addControl(this->titleRole);
this->addControl(this->editAcc);
this->addControl(this->editPass);
this->addControl(this->editRole);
this->addControl(this->btnLogin);
this->addControl(this->btnBack);
this->addControl(this->titleDesc);
}
//派生クラスの純粋仮想関数を実装
int CLoginWin::doAction()
{
map<string, User>::iterator it;
int role = -1;
switch (this->focusIndex)
{
case 7:
role = this->Jude();
switch (role)
{
case ADMIN: //1
CTools::gotoxy(33, 21);
cout << "ようこそ " << this->editAcc->getContent() << "管理者" << endl;
//編集内容をクリア
this->editAcc->clear();
this->editPass->clear();
this->editRole->clear();
system("pause");
return 3;
case DOCTOR: //2
CTools::gotoxy(33, 21);
cout << "ようこそ " << this->editAcc->getContent() << "医師" << endl;
//編集内容をクリア
this->editAcc->clear();
this->editPass->clear();
this->editRole->clear();
system("pause");
return 4;
case USER: //3
CTools::gotoxy(33, 21);
cout << "ようこそ " << CData::Nowuser.c_str() << "ユーザー" << endl;
//編集内容をクリア
this->editAcc->clear();
this->editPass->clear();
this->editRole->clear();
system("pause");
return 5;
default:
//編集内容をクリア
this->editAcc->clear();
this->editPass->clear();
this->editRole->clear();
system("pause");
return 2;
}
case 8:
return 0;
}
return 0;
}
//ログイン画面検証関数
int CLoginWin::Jude()
{
//ユーザー名、パスワード、役割の入力が必須
if (strlen(this->editAcc->getContent()) == 0 ||
strlen(this->editPass->getContent()) == 0 ||
strlen(this->editRole->getContent()) == 0)
{
CTools::gotoxy(33, 21);
cout << "ユーザー名、パスワード、役割の内容不能为空です。入力してください。" << endl;
system("pause");
this->editAcc->clear();
this->editPass->clear();
this->editRole->clear();
return 0;
}
//役割入力形式検証
if (atoi(this->editRole->getContent()) != 1 && atoi(this->editRole->getContent()) != 2 &&
atoi(this->editRole->getContent()) != 3)
{
CTools::gotoxy(33, 21);
cout << "役割を選択する際は、正しい形式で入力してください。" << endl;
system("pause");
this->editAcc->clear();
this->editPass->clear();
this->editRole->clear();
return 0;
}
//ユーザーログイン(役割3)
if (atoi(this->editRole->getContent()) == 3)
{
map<string, User>::iterator it;
for (it = CData::userMap.begin(); it != CData::userMap.end(); it++)
{
if (strcmp(this->editAcc->getContent(), it->second.getPhoneNum().c_str()) == 0)
{
if (strcmp(this->editPass->getContent(), it->second.getPwd().c_str()) == 0)
{
string a = this->editAcc->getContent();
CData::Nowuser = a;
return it->second.getRole();
}
else
{
CTools::gotoxy(33, 21);
cout << "パスワードが正しくありません。再入力してください。" << endl;
return 0;
}
}
}
CTools::gotoxy(33, 21);
cout << "ユーザーが存在しません。" << endl;
return 0;
}
//管理者ログイン(役割1)
else if (atoi(this->editRole->getContent()) == 1)
{
//管理者ユーザー名1000、パスワード123456
if (strcmp(this->editAcc->getContent(), "1000") == 0)
{
if (strcmp(this->editPass->getContent(), "123456") == 0)
{
string a = this->editAcc->getContent();
CData::Nowuser = a;
return 1;
}
}
}
else //医師ログイン(役割2)
{
map<int, Doctor>::iterator it;
for (it = CData::doctorMap.begin(); it != CData::doctorMap.end(); it++)
{
if (atoi(this->editAcc->getContent()) == it->second.getID())
{
if (strcmp(this->editPass->getContent(), it->second.getPwd().c_str()) == 0)
{
string a = this->editAcc->getContent();
CData::Nowuser = a;
return it->second.getRole();
}
else
{
CTools::gotoxy(33, 21);
cout << "パスワードが正しくありません。再入力してください。" << endl;
return 0;
}
}
}
CTools::gotoxy(33, 21);
cout << "ユーザーが存在しません。" << endl;
return 0;
}
return 0;
}
23.CRegisterWin.h .cpp【登録画面】
#ifndef CREGISTERWIN_H
#define CREGISTERWIN_H
#include "CWinBase.h"//ウィンドウ基底クラスを継承
#include "CButton.h"//ボタン
#include "CLabel.h"//ラベル
#include "CEdit.h"//編集
//登録画面 ウィンドウ基底クラスを継承
class CRegisterWin : public CWinBase
{
public:
CRegisterWin(); //デフォルトコンストラクタ
~CRegisterWin(); //デストラクタ
CRegisterWin(int x, int y, int w, int h); //引数付きコンストラクタ
int doAction(); //キー応答実行関数[純粋仮想関数]
protected:
private:
int number; //驗證碼
CLabel *titleRegister, *titlePhone, *titleVerify, *titleDesc; //ラベル
CButton *btnGetCode, *btnConfirm, *btnBack; //ボタン
CEdit *editPhone, *editVerify; //編集
};
#endif
#pragma warning(disable :4786)
#include "CRegisterWin.h" //登録画面
#include "CTools.h" //ツールクラス
#include "CData.h" //共通データクラス
#include "CUser.h" //ユーザークラス
#include <iostream>
using namespace std;
#include <map>
#include <time.h>
#include <windows.h>
#include <string>
//登録画面 ウィンドウ基底クラスを継承[デフォルトコンストラクタ]
CRegisterWin::CRegisterWin() : CWinBase()
{
}
//デストラクタ
CRegisterWin::~CRegisterWin()
{
}
//登録画面 ウィンドウ基底クラスを継承[引数付きコンストラクタ]
CRegisterWin::CRegisterWin(int x, int y, int w, int h)
: CWinBase(x, y, w, h)
{
//驗證碼ランダム
this->number = 0;
srand(time(NULL));
//コントロールを作成
//ラベル
this->titleRegister = new CLabel(21, 7, 10, 2, "登録画面", LABEL); //0
this->titlePhone = new CLabel(8, 13, 10, 2, "電話番号", LABEL); //1
this->titleVerify = new CLabel(8, 16, 10, 2, "驗證碼", LABEL); //2
this->titleDesc = new CLabel(8, 19, 10, 2, "注意:先取得驗證碼再入力電話番号", LABEL); //3
//編集
this->editPhone = new CEdit(17, 12, 10, 3, "", 11, 2, 1, EDIT); //4
this->editVerify = new CEdit(17, 15, 10, 3, "", 6, 2, 1, EDIT); //5
//ボタン
this->btnGetCode = new CButton(35, 15, 8, 3, "取得驗證碼", BUTTON); //6
this->btnConfirm = new CButton(8, 23, 8, 3, "確認", BUTTON); //7
this->btnBack = new CButton(24, 23, 8, 3, "戻る", BUTTON); //8
//コントロールをウィンドウに追加
this->addControl(this->titleRegister);
this->addControl(this->titlePhone);
this->addControl(this->titleVerify);
this->addControl(this->titleDesc);
this->addControl(this->editPhone);
this->addControl(this->editVerify);
this->addControl(this->btnGetCode);
this->addControl(this->btnConfirm);
this->addControl(this->btnBack);
}
//キー応答実行関数[純粋仮想関数]
int CRegisterWin::doAction()
{
map<string, User>::iterator it;
string s;
switch (this->focusIndex)
{
case 8: //戻る
this->editPhone->clear();
this->editVerify->clear();
system("pause");
return 0;
case 6: //取得驗證碼
this->number = rand() % 1000000 + 100000; //ランダム6桁
CTools::gotoxy(15, 20);
cout << "驗證碼は:" << this->number;
this->showWindow();
this->WinRun();
return this->doAction();
case 7: //確認
//電話番号と驗證碼の入力が必須
if (strlen(this->editPhone->getContent()) == 0 || strlen(this->editVerify->getContent()) == 0)
{
CTools::gotoxy(15, 22);
cout << "電話番号或驗證碼不能为空です。入力してください。" << endl;
this->editPhone->clear();
this->editVerify->clear();
system("pause");
return 1;
}
//電話番号形式検証(11桁)
if (strlen(this->editPhone->getContent()) != 11)
{
CTools::gotoxy(15, 22);
cout << "電話番号の形式が正しくありません。入力してください。" << endl;
this->editPhone->clear();
this->editVerify->clear();
system("pause");
return 1;
}
//驗證碼形式検証(6桁)
if (strlen(this->editVerify->getContent()) != 6)
{
CTools::gotoxy(15, 22);
cout << "驗證碼の形式が正しくありません。入力してください。" << endl;
this->editPhone->clear();
this->editVerify->clear();
system("pause");
return 1;
}
//驗證碼一致検証
if (atoi(this->editVerify->getContent()) != this->number)
{
CTools::gotoxy(15, 22);
cout << "驗證碼が正しくありません。再入力してください。" << endl;
this->editPhone->clear();
this->editVerify->clear();
system("pause");
return 1;
}
//電話番号重複検証
s = this->editPhone->getContent();
it = CData::userMap.find(s);
if (it != CData::userMap.end()) //重複あり
{
cout << "ユーザーが存在します。登録できません。" << endl;
this->editPhone->clear();
this->editVerify->clear();
system("pause");
return 1;
}
else //重複なし
{
CData::userMap.insert(make_pair<string, User>(this->editPhone->getContent(),
User(this->editPhone->getContent(), "123456", USER, "111", "xxx")));
CData::addUser(User(this->editPhone->getContent(), "123456", USER, "111", "xxx"));
CTools::gotoxy(15, 22);
cout << "登録成功しました。しばらくお待ちください。" << endl;
this->editPhone->clear();
this->editVerify->clear();
system("pause");
return 0;
}
default:
break;
}
return 2;
}