中山大学2020年软件工程初级实训成果

历经两个周末,终于把这个Agenda-2020系统搞出来了,发篇博文庆祝一下~~

先展示一下成果吧~
学了一学期的C++到底能做什么呢?快来看看这个Agenda-2020系统吧~

如果你看完视频意犹未竟,那就来看看这系统是怎么实现的吧~

UI类(关于用户交互的类)

AgendaUI.hpp

#pragma once
#ifndef AGENDAUI_H
#define AGENDAUI_H

#include "AgendaService.h"
#include <iostream>
#include <string>

class AgendaUI {
    
    
public:
    AgendaUI();
    void OperationLoop(void);

private:
/**
* constructor
*/
void startAgenda(void);

   /**
    * catch user's operation
    * @return the operation
    */
   std::string getOperation();

   /**
    * execute the operation
    * @return if the operationloop continue
    */
   bool executeOperation(std::string t_operation);

   /**
    * user Login
    */
   void userLogIn(void);

   /**
    * user regist
    */
   void userRegister(void);

   /**
    * user logout
    */
   void userLogOut(void);

   /**
    * quit the Agenda
    */
   void quitAgenda(void);

   /**
    * delete a user from storage
    */
   void deleteUser(void);

   /**
    * list all users from storage
    */
   void listAllUsers(void);

   /**
    * user create a meeting with someone else
    */
   void createMeeting(void);

   /**
    * list all meetings from storage
    */
   void listAllMeetings(void);

   /**
    * list all meetings that this user sponsored
    */
   void listAllSponsorMeetings(void);

   /**
    * list all meetings that this user take part in
    */
   void listAllParticipateMeetings(void);

   /**
    * search meetings by title from storage
    */
   void queryMeetingByTitle(void);

   /**
    * search meetings by timeinterval from storage
    */
   void queryMeetingByTimeInterval(void);

   /**
    * delete meetings by title from storage
    */
   void deleteMeetingByTitle(void);

   /**
    * delete all meetings that this user sponsored
    */
   void deleteAllMeetings(void);

   /**
    * show the meetings in the screen
    */
   void printMeetings(std::list<Meeting> t_meetings);
   // dates
   std::string m_userName;
   std::string m_userPassword;
   AgendaService m_agendaService;
};

#endif

AgendaUI.cpp

#include "AgendaUI.h"
#include "User.h"
#include "Meeting.h"
#include <iostream>
#include <iomanip>
using namespace std;
AgendaUI::AgendaUI()
{
    
    
    m_userName = "UNDEFINED";
    startAgenda();
}
void operateMessage(void)
{
    
    
    cout << "\n---------------------------------------------------Agenda----------------------------------------------------" << endl;
    cout << "Action :\n"
        "o    - log out Agenda\n"
        "dc   - delete Agenda account\n"
        "lu   - list all Agenda user\n"
        "cm   - create a meeting\n"
        "amp  - add meeting participator\n"
        "rmp  - remove meeting participator\n"
        "rqm  - request to quit meeting\n"
        "la   - list all meeting\n"
        "las  - list all sponsor meetings\n"
        "lap  - list all sponsor meetings\n"
        "qm   - query meeting by title\n"
        "qt   - query meeting by time interval\n"
        "dm   - delete meeting by title\n"
        "da   - delete all meetings"
        << endl;
    cout << "----------------------------------------------------------------------------------------------------------------\n"
        << endl;
}
void operateMessage2(void)
{
    
    
    cout << "---------------------------------------------------Agenda-------------------------------------------------------" << endl;
    cout << "Action :\n"
        "l    - log in Agenda by user name and password\n"
        "r    - register an Agenda account\n"
        "q    - quit Agenda"
        << endl;
    cout << "----------------------------------------------------------------------------------------------------------------" << endl;
    cout << "Agenda :~$ ";
}
void AgendaUI::OperationLoop(void)
{
    
    
    string opera ;
    while ((opera = getOperation()) != "q")
    {
    
    
        executeOperation(opera);
        operateMessage2();
    }
    quitAgenda();
    cout << "Quited successfully!" << endl;
}

/*private*/

void AgendaUI::startAgenda(void)
{
    
    
    m_agendaService.startAgenda();
    operateMessage2();
    OperationLoop();
}


std::string AgendaUI::getOperation()
{
    
    
    string opera;
    cin >> opera;
    return opera;
}


bool AgendaUI::executeOperation(std::string t_operation)
{
    
    
    if (t_operation == "l")
    {
    
    
        userLogIn();
        if (m_userName != "UNDEFINED")
        {
    
    
            operateMessage(); //TODO: 待完善
            cout << "Agenda@" << m_userName << " ~# ";
            string input = getOperation();
            while (input != "o")
            {
    
    
                if (input == "lu")
                {
    
    
                    listAllUsers();
                }
                else if (input == "cm")
                {
    
    
                    createMeeting();
                }
                else if (input == "amp")
                {
    
    
                    cout << "[add participator] [meeting title] [participator username]" << endl;
                    string title, name;
                    cout << "[add participator] ";
                    cin >> title >> name;
                    if (m_agendaService.addMeetingParticipator(m_userName, title, name))
                    {
    
    
                        cout << "[add participator] succeed!" << endl;
                    }
                    else
                    {
    
    
                        cout << "[add participator] error!" << endl;
                    }
                }
                else if (input == "rmp")
                {
    
    
                    cout << " [remove participator] [meeting title] [participator username]" << endl;
                    cout << "[remove participator] ";
                    string title, name;
                    cin >> title >> name;
                    if (m_agendaService.removeMeetingParticipator(m_userName, title, name))
                    {
    
    
                        cout << "[remove participator] succeed!" << endl;
                    }
                    else
                    {
    
    
                        cout << "[remove participator] error!" << endl;
                    }
                }
                else if (input == "rqm")
                {
    
    
                    cout << " [quit meeting] [meeting title]" << endl;
                    cout << "[quit meeting] ";
                    string title;
                    cin >> title;
                    if (m_agendaService.quitMeeting(m_userName, title))
                    {
    
    
                        cout << "[quit meeting] succeed!" << endl;
                    }
                    else
                    {
    
    
                        cout << "[quit meeting] error!" << endl;
                    }
                }
                else if (input == "la")
                {
    
    
                    listAllMeetings();
                }
                else if (input == "las")
                {
    
    
                    listAllSponsorMeetings();
                }
                else if (input == "lap")
                {
    
    
                    listAllParticipateMeetings();
                }
                else if (input == "qm")
                {
    
    
                    queryMeetingByTitle();
                }
                else if (input == "qt")
                {
    
    
                    queryMeetingByTimeInterval();
                }
                else if (input == "dm")
                {
    
    
                    deleteMeetingByTitle();
                }
                else if (input == "da")
                {
    
    
                    deleteAllMeetings();
                }
                else if (input == "dc")
                {
    
    
                    deleteUser();
                    m_userName = "UNDEFINED";
                    break;
                }
                else
                {
    
    
                    cout << "Illegal action!" << endl;
                }
                operateMessage();
                cout << "Agenda";
                if (m_userName != "UNDEFINED")cout << "@" << m_userName;
                cout<< " ~# ";
                input = getOperation();
            }
            userLogOut();
            cout << "logout successfully!" << endl;
        }
    }
    else if (t_operation == "r")
    {
    
    
        userRegister();
    }
    else
    {
    
    
    cout << "Illegal action!" << endl;
        return false;
    }
    return true;
}

void AgendaUI::userLogIn(void)
{
    
    
    cout << "[log in] [user name] [password]" << endl;
    cout << "[log in] ";
    string name, password;
    cin >> name >> password;
    if (m_agendaService.userLogIn(name, password))
    {
    
    
        m_userName = name;
        m_userPassword = password;
        cout << "[log in] succeed!" << endl;
    }
    else
    {
    
    
        cout << "[log in] Password error or user doesn't exist" << endl;
    }
}

void AgendaUI::userRegister(void)
{
    
    
    cout << "[register] [username] [password] [email] [phone]" << endl;
    cout << "[register] ";
    string name, password, email, phone;
    cin >> name >> password >> email >> phone;
    if (m_agendaService.userRegister(name, password, email, phone))
    {
    
    
        cout << "[register] succeed!" << endl;
    }
    else
        cout << "[register] This username has been registered!" << endl;
}

void AgendaUI::userLogOut(void)
{
    
    
    m_agendaService.quitAgenda();
}

void AgendaUI::quitAgenda(void)
{
    
    
    m_agendaService.quitAgenda();
}

void AgendaUI::deleteUser(void)
{
    
    
    if (m_agendaService.deleteUser(m_userName, m_userPassword))
    {
    
    
        cout << "[delete agenda account] succeed!" << endl;
    }
    else
        cout << "[delete agenda account] delete fail!" << endl;
}

void AgendaUI::listAllUsers(void)
{
    
    
    std::list<User> users = m_agendaService.listAllUsers();
    int n = users.size();
    if (n == 0)
    {
    
    
        std::cout << "[list all users] There is no user!" << std::endl;
    }
    else
    {
    
    
        std::cout << "\n[list all users]\n"
            << std::endl;
        std::cout << std::left << setw(20) << "name" << std::left << setw(20) << "email" << left << setw(20) << "phone" << endl;
        auto iter = users.begin();
        for (; iter != users.end(); iter++)
        {
    
    
            cout << left << setw(20) << iter->getName() << left << setw(20) << iter->getEmail() << left << setw(20) << iter->getPhone() << endl;
        }
    }
}

void AgendaUI::createMeeting(void)
{
    
    
    int num;
    cout << "[create meeting] [the number of participators]" << endl;
    cout << "[create meeting] ";
    cin >> num;
    vector<string> pars;
    string tem;
    for (int i = 0; i < num; i++)
    {
    
    
        cout << "[create meeting] [please enter the participator " << i + 1 << " ]" << endl;
        cout << "[create meeting] ";
        cin >> tem;
        pars.push_back(tem);
    }
    cout << "[create meeting] [title] [start time(yyyy-mm-dd/hh:mm)] [end time(yyyy-mm-dd/hh:mm)]" << endl;
    cout << "[create meeting] ";
    string title, starttime, endtime;
    cin >> title >> starttime >> endtime;
    if (m_agendaService.createMeeting(m_userName, title, starttime, endtime, pars)) {
    
    
        cout << "[create meeting] succeed!" << endl;
    }
    else cout << "[create meeting] fail!" << endl;
}

void AgendaUI::listAllMeetings(void)
{
    
    
    cout << "[list all meetings]\n"
        << endl;
    list<Meeting> meetings = m_agendaService.listAllMeetings(m_userName);
    if (meetings.size()) {
    
    
        printMeetings(meetings);
    }
    else {
    
    
        cout << "There is no meeting existied!" << endl;
    }
}

void AgendaUI::listAllSponsorMeetings(void)
{
    
    
    cout << "[list all sponsor meetings]\n"
        << endl;
    list<Meeting> meetings = m_agendaService.listAllSponsorMeetings(m_userName);
    if (meetings.size()) {
    
    
        printMeetings(meetings);
    }
    else {
    
    
        cout << "You haven't sponsor any meeting!" << endl;
    }
}

void AgendaUI::listAllParticipateMeetings(void)
{
    
    
    cout << "[list all participator meetings]\n" << endl;
    list<Meeting> meetings = m_agendaService.listAllParticipateMeetings(m_userName);
    if (meetings.size()) {
    
    
        printMeetings(meetings);
    }
    else {
    
    
        cout << "You haven't participate any meeting!" << endl;
    }
}

void AgendaUI::queryMeetingByTitle(void)
{
    
    
    cout << "[query meeting] [title]:" << endl;
    cout << "[query meeting] ";
    string title;
    cin >> title;
    list<Meeting> meetings = m_agendaService.meetingQuery(m_userName, title);
    if (meetings.size()) {
    
    
        printMeetings(meetings);
    }
    else {
    
    
        cout << "There is no meeting with the title entered!" << endl;
    }
}

void AgendaUI::queryMeetingByTimeInterval(void)
{
    
    
    cout << "[query meeting] [start time(yyyy-mm-dd/hh:mm)] [end time(yyyy-mm-dd/hh:mm)]" << endl;
    cout << "[query meeting] ";
    string startTime, endTime;
    cin >> startTime>> endTime;
    cout << "[query meeting]\n"
        << endl;
    list<Meeting> meetings = m_agendaService.meetingQuery(m_userName, startTime, endTime);
    if (meetings.size()) {
    
    
        printMeetings(meetings);
    }
    else {
    
    
        cout << "There is no meeting in the time interval!" << endl;
    }
}

void AgendaUI::deleteMeetingByTitle(void)
{
    
    
    cout << "[delete meeting] [title]" << endl;
    cout << "[delete meeting] ";
    string title;
    cin >> title;
    if (m_agendaService.deleteMeeting(m_userName, title))
    {
    
    
        cout << "[delete meeting] succeed!" << endl;
    }
    else
        cout << "[error] delete meeting fail!" << endl;
}

void AgendaUI::deleteAllMeetings(void)
{
    
    
    if (m_agendaService.deleteAllMeetings(m_userName))
        cout << "[delete all meeting] succeed!" << endl;
    else
        cout << "[error] delete meeting fail!" << endl;
}

void AgendaUI::printMeetings(std::list<Meeting> t_meetings)
{
    
    
    cout << std::left << setw(20) << "title" << std::left << setw(20) << "sponsor" << std::left << setw(20) << "start time" << std::left << setw(20) << "end time" << std::left << setw(20) << "participators" << endl;

    auto iter = t_meetings.begin();
    for (; iter != t_meetings.end(); iter++)
    {
    
    
        cout << std::left << setw(20) << iter->getTitle() << std::left << setw(20) << iter->getSponsor() << std::left << setw(20) << Date::dateToString(iter->getStartDate()) << std::left << setw(20) << Date::dateToString(iter->getEndDate());
        vector<string> par = iter->getParticipator();
        for (auto iter2 = par.begin(); iter2 != par.end(); iter2++)
        {
    
    
            if (iter2 != par.begin())
                cout << ",";
            	cout << *iter2;
        }
        cout << endl;
    }
}

代码有点长,毕竟跟用户交互嘛~

这里是小编对这个类的理解和实现,相信你可以比小编做的更好~

具体数据层次的实现,网上已经有完整的代码,这里小编就不献丑了~

猜你喜欢

转载自blog.csdn.net/qq_45975757/article/details/109167847
今日推荐