C++外来受診予約管理システム(異なるUI画面の機能実現)

目次

効果展示

五:外来受診予約管理システム【ユーザー画面と機能実現】

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;
}

タグ: C++ 外来受診予約管理システム ユーザーインターフェース ログイン画面 登録画面

7月2日 19:08 投稿