当前位置:   article > 正文

C++——基础复习——会议室预约系统

C++——基础复习——会议室预约系统

一、简介

看了两个不同的C++培训课程,最后的实习程序都是这个项目。不看老师的讲解视频,自己试着写了一下,在写的过程中发现当项目需求不固定时,会越写越乱,总是想要添加更高的需求,导致写了删,删了写。还好没有放弃,全部拿下了。而且,获益良多。自我感觉这个系统功能还是很强大的,包括输入数据的正确性检查,输入过程中的返回等。

1、管理员和普通用户分别登陆

2、管理员可对普通用户、会议室、所有预约进行维护

3、普通用户只有删插增改自己的预约

4、使用文件储存数据

二、知识点

封装:封装的思想更加成熟,UI界面和数据完全隔离,只能通过管理员或者用户调用数据中心的方法实现访问;其次,UI界面之间的并列或者层级关系更清晰了,利用返回值控制返回界面。

继承:管理员类继承了用户类,基础功能在用户类中实现,管理员类直接调用。

多态:同一种功能函数,满足不同需求,利用虚函数实现了多态。

文件读写:文件读写时,基础数据类型可以直接读写;非基础数据类型需要自行实现读写方法;容器不能直接读写,需要逐一读写每个元素。

时间:time_t 和tm  两种时间格式的转换。

以及对组作为返回值的便利,容器的排序函数对象和查找函数对象需要一致等等。

三、上代码

代码比较多,还好主要注释都写了。欢迎大佬批评指正,欢迎同学交流学习。

OAUtils.h   提供了数字读取、字符串读取功能,提供文件读写字符串功能

  1. #pragma once
  2. #include<iostream>
  3. using namespace std;
  4. #include<string>
  5. #include<fstream>
  6. class OAUtils
  7. {
  8. public:
  9. static int getNum();
  10. static string getStr();
  11. static void save_str(ofstream& ofs,string& str);
  12. static void read_str(ifstream& ifs, string& str);
  13. };

OAUtils.cpp

  1. #include "OAUtils.h"
  2. int OAUtils::getNum()
  3. {
  4. int res = -1;
  5. cin >> res;
  6. while (cin.fail()) {
  7. cin.clear();
  8. cin.ignore(numeric_limits<streamsize>::max(), '\n');
  9. cin >> res;
  10. }
  11. return res;
  12. }
  13. string OAUtils::getStr()
  14. {
  15. string str;
  16. cin >> str;
  17. while (cin.fail() || str.size() > 16 || str.size() == 0) {
  18. cin.clear();
  19. cin.ignore(numeric_limits<streamsize>::max(), '\n');
  20. cout << "输入格式有误,请重新输入:";
  21. cin >> str;
  22. }
  23. return str;
  24. }
  25. void OAUtils::save_str(ofstream & ofs, string & str)
  26. {
  27. size_t size = str.size();
  28. ofs.write((char*) &(size), sizeof(size));
  29. for (auto it = str.begin(); it != str.end(); it++) {
  30. ofs.write((char*)&(*it), sizeof(*it));
  31. }
  32. }
  33. void OAUtils::read_str(ifstream & ifs, string & str)
  34. {
  35. size_t size = 0;
  36. ifs.read((char*)&size, sizeof(size));
  37. str.resize(size);
  38. for (auto it = str.begin(); it != str.end(); it++) {
  39. ifs.read((char*)&(*it), sizeof(*it));
  40. }
  41. }

 OAsystemUI.h   提供的所有界面函数,利用枚举标记返回界面

  1. #pragma once
  2. #include"OADataCenter.h"
  3. //UI界面flag
  4. enum Page {
  5. Exit, //退出
  6. MainPage, //主界面
  7. LoginPageAdmin, //管理员登录界面
  8. LoginPageUser, //用户登录界面
  9. AdminPage, //管理员界面
  10. UserPage, //用户界面
  11. AddUserPage, //添加用户界面——管理员
  12. DelUserPage, //删除用户界面——管理员
  13. AddRoomPage, //添加会议室界面——管理员
  14. DelRoomPage, //删除会议室界面——管理员
  15. AdminAddAppPage, //管理员添加预约
  16. UserAddAppPage, //用户添加预约
  17. AdminDelAppPage, //管理员删除预约
  18. UserDelAppPage, //用户删除预约
  19. CleAppPage, //清空所有预约——管理员
  20. };
  21. //UI系统
  22. class OAsystemUI {
  23. public:
  24. static int displayMainPage(); //主界面函数
  25. static int displayLoginPage(AdminData** ptr_admin); //管理员登录界面函数
  26. static int displayLoginPage(UserData** ptr_user); //用户登录界面函数
  27. static int LoginPage(string& name, string& password); //登陆界面函数,主要用于获取name,password
  28. static int displayAdminPage(AdminData* ptr_admin); //管理员界面函数
  29. static int displayUserPage(UserData* ptr_user); //用户界面函数
  30. static int displayAddUserPage(AdminData* ptr_admin); //添加用户界面函数——管理员
  31. static int displayDelUserPage(const AdminData* ptr_admin); //删除用户界面函数——管理员
  32. static int displayAddRoomPage(AdminData* ptr_admin); //添加会议室界面函数——管理员
  33. static int displayDelRoomPage(AdminData* ptr_admin); //删除会议室界面函数——管理员
  34. static int displayAddAppPage(AdminData* ptr_admin); //管理员添加预约
  35. static int displayAddAppPage(UserData* ptr_user); //用户添加预约
  36. static int AddAppPage(UserData* ptr_data); //预约界面
  37. static int displayDelAppPage(AdminData* ptr_admin); //管理员删除预约
  38. static int displayDelAppPage(UserData* ptr_user); //用户删除预约
  39. static void DelAppPage(UserData* pt_data); //删除预约
  40. static int displayCleAppPage(AdminData* ptr_admin); //清空所有预约界面函数——管理员
  41. };

OAsystemUI.cpp 所有界面函数的实现

  1. #include "OAsystemUI.h"
  2. #include<iostream>
  3. using namespace std;
  4. #include"OAUtils.h"
  5. #include<string>
  6. #include"OADataCenter.h"
  7. //主界面
  8. int OAsystemUI::displayMainPage()
  9. {
  10. int Pageflag = MainPage;
  11. int choice = -1;
  12. cout << "****欢迎使用会议室预约系统****" << endl;
  13. cout << "******************************" << endl;
  14. cout << " 1.管理员登录" << endl;
  15. cout << " 2.普通用户登录" << endl;
  16. cout << " 0.退出系统" << endl;
  17. cout << "******************************" << endl;
  18. cout << "请输入您的选择:";
  19. choice = OAUtils::getNum();
  20. enum MainChoice { exit = 0, adminlogin, userlogin };
  21. switch (choice) {
  22. case MainChoice::exit:
  23. cout << "欢迎下次使用" << endl;
  24. Pageflag = Exit;
  25. system("pause");
  26. break;
  27. case MainChoice::adminlogin:
  28. Pageflag = LoginPageAdmin;
  29. break;
  30. case MainChoice::userlogin:
  31. Pageflag = LoginPageUser;
  32. break;
  33. default:
  34. cout << "输入错误,请重新输入" << endl;
  35. system("pause");
  36. Pageflag = MainPage;
  37. break;
  38. }
  39. return Pageflag;
  40. }
  41. //管理员登录界面
  42. int OAsystemUI::displayLoginPage(AdminData** ptr_admin)
  43. {
  44. cout << "**********管理员登录**********" << endl;
  45. string name, password, depart;
  46. int pageflag = LoginPage(name, password);
  47. if (pageflag != Page::MainPage) {
  48. AdminData admin(name, password, "管理员");
  49. *ptr_admin = admin.Login();
  50. if (*ptr_admin) {
  51. pageflag = Page::AdminPage;
  52. }
  53. else {
  54. cout << "登陆失败,请重新登陆" << endl;
  55. system("pause");
  56. pageflag = Page::LoginPageAdmin;
  57. }
  58. }
  59. return pageflag;
  60. }
  61. //用户登录界面
  62. int OAsystemUI::displayLoginPage(UserData ** ptr_user)
  63. {
  64. cout << "***********用户登录***********" << endl;
  65. string name, password, depart;
  66. int pageflag = LoginPage(name, password);
  67. if (pageflag != Page::MainPage) {
  68. UserData user(name, password, depart);
  69. *ptr_user = user.Login();
  70. if (*ptr_user) {
  71. pageflag = Page::UserPage;
  72. }
  73. else {
  74. cout << "登陆失败,请重新登陆" << endl;
  75. system("pause");
  76. pageflag = Page::LoginPageUser;
  77. }
  78. }
  79. return pageflag;
  80. }
  81. //登陆界面,用于获取name和passwo,由管理员和用户登录界面调用
  82. int OAsystemUI::LoginPage(string& name, string& password)
  83. {
  84. int pageflag = Page::MainPage;
  85. cout << "******************************" << endl;
  86. cout << "请输入您的账号(输入0返回上级):";
  87. name = OAUtils::getStr();
  88. if (name != "0") {
  89. cout << "请输入您的密码(输入0返回上级):";
  90. password = OAUtils::getStr();
  91. if (password != "0") {
  92. pageflag = -1;
  93. }
  94. }
  95. return pageflag;
  96. }
  97. //管理员界面
  98. int OAsystemUI::displayAdminPage(AdminData* ptr_admin)
  99. {
  100. int choice = -1, pageflag = Page::AdminPage;
  101. cout << "************管理员************" << endl;
  102. cout << "******************************" << endl;
  103. cout << " 1.添加用户" << endl;
  104. cout << " 2.删除用户" << endl;
  105. cout << " 3.添加会议室" << endl;
  106. cout << " 4.删除会议室" << endl;
  107. cout << " 5.添加预约" << endl;
  108. cout << " 6.查看预约" << endl;
  109. cout << " 7.删除预约" << endl;
  110. cout << " 8.清空预约" << endl;
  111. cout << " 0.退出登录" << endl;
  112. cout << "******************************" << endl;
  113. cout << "请输入您的选择:";
  114. choice = OAUtils::getNum();
  115. enum AdminChoice { Exit, Adduser, Deluser, Addroom, Delroom, Addapp, Showapp, Delapp, Cleapp };
  116. switch (choice) {
  117. case Exit:
  118. pageflag = Page::MainPage;
  119. break;
  120. case Adduser:
  121. pageflag = Page::AddUserPage;
  122. break;
  123. case Deluser:
  124. pageflag = Page::DelUserPage;
  125. break;
  126. case Addroom:
  127. pageflag = Page::AddRoomPage;
  128. break;
  129. case Delroom:
  130. pageflag = Page::DelRoomPage;
  131. break;
  132. case Addapp:
  133. pageflag = Page::AdminAddAppPage;
  134. break;
  135. case Showapp:
  136. ptr_admin->showApp();
  137. system("pause");
  138. pageflag = Page::AdminPage;
  139. break;
  140. case Delapp:
  141. pageflag = Page::AdminDelAppPage;
  142. break;
  143. case Cleapp:
  144. pageflag = Page::CleAppPage;
  145. break;
  146. }
  147. return pageflag;
  148. }
  149. //用户界面
  150. int OAsystemUI::displayUserPage(UserData* ptr_user)
  151. {
  152. int choice = -1, pageflag = Page::UserPage;
  153. cout << "*************用户*************" << endl;
  154. cout << "******************************" << endl;
  155. cout << " 1.添加预约" << endl;
  156. cout << " 2.删除预约" << endl;
  157. cout << " 3.查看预约" << endl;
  158. cout << " 0.退出登录" << endl;
  159. cout << "******************************" << endl;
  160. cout << "请输入您的选择:";
  161. choice = OAUtils::getNum();
  162. enum { Exit, AddApp, DelApp, ShowApp };
  163. switch (choice) {
  164. case Exit:
  165. pageflag = Page::MainPage;
  166. break;
  167. case AddApp:
  168. pageflag = Page::UserAddAppPage;
  169. break;
  170. case DelApp:
  171. pageflag = Page::UserDelAppPage;
  172. break;
  173. case ShowApp:
  174. ptr_user->showApp();
  175. pageflag = Page::UserPage;
  176. break;
  177. }
  178. return pageflag;
  179. }
  180. //添加用户界面——管理员
  181. int OAsystemUI::displayAddUserPage(AdminData* ptr_admin)
  182. {
  183. cout << "******管理员——添加用户******" << endl;
  184. cout << "******************************" << endl;
  185. cout << "请输入要添加的用户名(输入0返回上级):";
  186. string name = OAUtils::getStr();
  187. while (name != "0"&&ptr_admin->checkName(name)) {
  188. cout << "该用户名已被占用,请重新输入:";
  189. name = OAUtils::getStr();
  190. }
  191. if (name != "0") {
  192. cout << "请输入密码(输入0返回上级):";
  193. string password = OAUtils::getStr();
  194. if (password != "0") {
  195. cout << "请输入部门(输入0返回上级):";
  196. string depart = OAUtils::getStr();
  197. if (depart != "0") {
  198. ptr_admin->AddUser(UserData(name, password, depart));
  199. cout << "添加用户成功" << endl;
  200. system("pause");
  201. }
  202. }
  203. }
  204. return Page::AdminPage;
  205. }
  206. //删除用户界面——管理员
  207. int OAsystemUI::displayDelUserPage(const AdminData * ptr_admin)
  208. {
  209. cout << "******管理员——删除用户******" << endl;
  210. cout << "******************************" << endl;
  211. if (ptr_admin->showUser()) {
  212. cout << "请输入要删除的用户名(输入0返回上级):";
  213. string name = OAUtils::getStr();
  214. while (name != "0"&&!ptr_admin->checkName(name)) {
  215. cout << "该用户不存在,请重新输入(输入0返回上级):";
  216. name = OAUtils::getStr();
  217. }
  218. if (name != "0") {
  219. cout << "请输入管理员密码确定删除(输入0取消):";
  220. string password = OAUtils::getStr();
  221. while (password != "0"&&password != ptr_admin->getPasw()) {
  222. cout << "管理员密码错误,请重新输入(输入0取消):";
  223. password = OAUtils::getStr();
  224. }
  225. if (password != "0") {
  226. ptr_admin->DelUser(name);
  227. cout << "删除用户成功" << endl;
  228. }
  229. }
  230. }
  231. system("pause");
  232. return Page::AdminPage;
  233. }
  234. //添加会议室界面——管理员
  235. int OAsystemUI::displayAddRoomPage(AdminData * ptr_admin)
  236. {
  237. cout << "*****管理员——添加会议室*****" << endl;
  238. cout << "******************************" << endl;
  239. cout << "请输入会议室门牌号:";
  240. int id = OAUtils::getNum();
  241. if (ptr_admin->AddMeetingRoom(id)) {
  242. cout << "会议室添加成功" << endl;
  243. }
  244. else {
  245. cout << "该会议室已存在" << endl;
  246. }
  247. system("pause");
  248. return Page::AdminPage;
  249. }
  250. //删除会议室界面——管理员
  251. int OAsystemUI::displayDelRoomPage(AdminData * ptr_admin)
  252. {
  253. cout << "*****管理员——删除会议室*****" << endl;
  254. cout << "******************************" << endl;
  255. if (ptr_admin->showRoom()) {
  256. cout << "请输入会议室门牌号:";
  257. int id = OAUtils::getNum();
  258. if (ptr_admin->DelMeetingRoom(id)) {
  259. cout << "会议室删除成功" << endl;
  260. }
  261. else {
  262. cout << "该会议室不存在" << endl;
  263. }
  264. }
  265. system("pause");
  266. return Page::AdminPage;
  267. }
  268. //管理员添加预约界面
  269. int OAsystemUI::displayAddAppPage(AdminData* ptr_admin)
  270. {
  271. int choice = -1, pageflag = Page::AdminPage;
  272. cout << "**********管理员预约**********" << endl;
  273. cout << "******************************" << endl;
  274. AddAppPage(ptr_admin);
  275. return pageflag;
  276. }
  277. //用户添加预约界面
  278. int OAsystemUI::displayAddAppPage(UserData * ptr_user)
  279. {
  280. int choice = -1, pageflag = Page::UserPage;
  281. cout << "***********用户预约***********" << endl;
  282. cout << "******************************" << endl;
  283. AddAppPage(ptr_user);
  284. return pageflag;
  285. }
  286. //预约界面
  287. int OAsystemUI::AddAppPage(UserData * ptr_data)
  288. {
  289. tm t;
  290. cout << "请输入您要预约的年份(输入-1返回上级):";
  291. t.tm_year = OAUtils::getNum();
  292. if (t.tm_year != -1) {
  293. t.tm_year -= 1900;
  294. cout << "请输入您要预约的月份(输入-1返回上级):";
  295. t.tm_mon = OAUtils::getNum();
  296. if (t.tm_mon != -1) {
  297. t.tm_mon -= 1;
  298. cout << "请输入您要预约哪天(输入-1返回上级):";
  299. t.tm_mday = OAUtils::getNum();
  300. if (t.tm_mday != -1) {
  301. cout << "请输入您要预约几时(输入-1返回上级):";
  302. t.tm_hour = OAUtils::getNum();
  303. while (t.tm_hour < -1 || t.tm_hour >= 24) {
  304. cout << "输入有误,请重新输入预约几时(输入-1返回上级):";
  305. t.tm_hour = OAUtils::getNum();
  306. }
  307. if (t.tm_hour != -1) {
  308. cout << "请输入您要预约多少分(输入-1返回上级):";
  309. t.tm_min = OAUtils::getNum();
  310. while (t.tm_min < -1 || t.tm_min >= 60) {
  311. cout << "输入有误,请重新输入预约几时(输入-1返回上级):";
  312. t.tm_min = OAUtils::getNum();
  313. }
  314. if (t.tm_min != -1) {
  315. cout << "请输入您预约的会议时长(单位:分钟):";
  316. time_t duration = OAUtils::getNum();
  317. cout << "请输入您要预约的会议室:";
  318. int roomid = OAUtils::getNum();
  319. t.tm_sec = 0;
  320. int Addres = ptr_data->addApp(t, duration, roomid);
  321. if (Addres == 1) {
  322. OADataCenter::save_OADataCenter();
  323. cout << "添加预约成功" << endl;
  324. }
  325. else if (Addres == -1) {
  326. cout << "没有此会议室" << endl;
  327. }
  328. else {
  329. cout << "该会议室预约时间冲突" << endl;
  330. }
  331. system("pause");
  332. }
  333. }
  334. }
  335. }
  336. }
  337. return Page::AdminPage;
  338. }
  339. //管理员删除预约界面
  340. int OAsystemUI::displayDelAppPage(AdminData * ptr_admin)
  341. {
  342. int pageflag = Page::AdminPage;
  343. cout << "********管理员删除预约********" << endl;
  344. cout << "******************************" << endl;
  345. if (ptr_admin->showApp()) {
  346. DelAppPage(ptr_admin);
  347. }
  348. return pageflag;
  349. }
  350. //用户删除预约界面
  351. int OAsystemUI::displayDelAppPage(UserData * ptr_user)
  352. {
  353. int pageflag = Page::UserPage;
  354. cout << "*********用户删除预约*********" << endl;
  355. cout << "******************************" << endl;
  356. if (ptr_user->showApp()) {
  357. DelAppPage(ptr_user);
  358. }
  359. return pageflag;
  360. }
  361. //删除预约界面
  362. void OAsystemUI::DelAppPage(UserData * pt_data)
  363. {
  364. bool res = true;
  365. cout << "请输入要删除预约的序号:";
  366. int id = OAUtils::getNum();
  367. id -= 1;
  368. if (!pt_data->delApp(id)) {
  369. cout << "删除失败" << endl;
  370. res = false;
  371. }
  372. else {
  373. cout << "删除成功" << endl;
  374. }
  375. system("pause");
  376. }
  377. //清空预约界面
  378. int OAsystemUI::displayCleAppPage(AdminData * ptr_admin)
  379. {
  380. cout << "********管理员清空预约********" << endl;
  381. cout << "******************************" << endl;
  382. cout << "是否确定清空所有预约?" << endl;
  383. cout << " 1.是\t2.否" << endl;
  384. int choice = OAUtils::getNum();
  385. if (choice == 1) {
  386. ptr_admin->CleAppPage();
  387. cout << "已清空" << endl;
  388. }
  389. system("pause");
  390. return Page::AdminPage;
  391. }

 OADataCenter.h   数据控制中心,包含用户类、管理员类、预约类、控制中心类的声明

  1. #pragma once
  2. #include<iostream>
  3. using namespace std;
  4. #include<vector>
  5. #include<ctime>
  6. #include"OAUtils.h"
  7. using MeetingRoom = int;
  8. using _It_room = vector<MeetingRoom>::iterator;
  9. //用户信息类
  10. class UserData {
  11. private:
  12. string _name;
  13. string _password;
  14. string _depart;
  15. public:
  16. UserData();
  17. UserData(string name, string password, string depart);
  18. string& getName();
  19. string& getPasw();
  20. string& getDepart();
  21. const string& getName()const;
  22. const string& getPasw()const;
  23. const string& getDepart()const;
  24. //用户登陆函数——通过多态实现管理员的不同登陆功能
  25. virtual UserData* Login();
  26. bool showApp();
  27. //添加预约——返回-1,会议室不存在,返回0时间冲突
  28. int addApp(tm& t, time_t duration, MeetingRoom roomid);
  29. bool delApp(int id);
  30. //写入或读取文件
  31. void save(ofstream& ofs);
  32. void read(ifstream& ifs);
  33. };
  34. class AdminData :public UserData {
  35. public:
  36. AdminData();
  37. AdminData(string name, string password, string depart);
  38. AdminData* Login()override;
  39. bool showUser()const;
  40. bool showRoom();
  41. void AddUser(const UserData& userdata);
  42. void DelUser(const string& name)const;
  43. bool AddMeetingRoom(int id);
  44. bool DelMeetingRoom(int roomid);
  45. bool checkName(const string& name)const;
  46. void CleAppPage();
  47. };
  48. //预约类
  49. class Appointment {
  50. private:
  51. tm _t;
  52. time_t _duration;
  53. int _roomnum;
  54. string _username;
  55. string _userdepart;
  56. public:
  57. Appointment();
  58. Appointment(const tm& t, time_t duration, int roomid, string name, string depart);
  59. const time_t getAppTime()const;
  60. const time_t getAppDuration()const;
  61. const int getRoomID()const;
  62. const string& getAppName()const;
  63. const string& getAppdepart()const;
  64. void save(ofstream& ofs);
  65. void read(ifstream& ifs);
  66. };
  67. using _It_user = vector<UserData>::iterator;
  68. using _It_app = vector<Appointment>::iterator;
  69. //数据中心类
  70. class OADataCenter {
  71. private:
  72. static AdminData admin;
  73. static vector<UserData> user;
  74. static vector<MeetingRoom> room;
  75. static vector<Appointment> App;
  76. public:
  77. //删插增改和登陆功能函数
  78. static UserData* Login(const UserData& userdata);
  79. static AdminData* Login(const AdminData& admindata);
  80. static void AddUser(const UserData& userdata);
  81. static void DelUser(const string& name);
  82. static bool AddMeetingRoom(int id);
  83. static bool DelMeetingRoom(MeetingRoom roomid);
  84. static void AddApp(const Appointment& app);
  85. static bool DelApp(const UserData& data, int id);
  86. static void CleApp();
  87. static bool showApp(const string& name);
  88. static bool showUser();
  89. static bool showRoom();
  90. //数据读取和写入
  91. static void init_OADataCenter();
  92. static void save_OADataCenter();
  93. //核对姓名、密码、时间,获取用户和预约的迭代器
  94. static bool checkTime(time_t time, time_t duration, MeetingRoom roomid);
  95. static _It_user get_It_User(const string& name);
  96. static _It_room get_It_Room(const MeetingRoom& id);
  97. static pair<_It_user, bool> checkName(const string& name);
  98. static bool checkPasw(const _It_user& it,const string& password);
  99. static pair<_It_room, bool> checkRoom(const MeetingRoom& id);
  100. };
  101. //排序谓词
  102. struct CompareName {
  103. bool operator()(const Appointment& a1, const Appointment& a2);
  104. };
  105. struct CompareRoomID {
  106. bool operator()(const Appointment& a1, const Appointment& a2);
  107. };
  108. struct PrintApp {
  109. void operator()(Appointment&a);
  110. };

OADataCenter.cpp 

  1. #include "OADataCenter.h"
  2. #include<algorithm>
  3. #include<iomanip>
  4. #include<sstream>
  5. #include<fstream>
  6. //用户信息类构造
  7. UserData::UserData() {}
  8. UserData::UserData(string name, string password, string depart)
  9. {
  10. _name = name;
  11. _password = password;
  12. _depart = depart;
  13. }
  14. //获取用户名、密码、部门
  15. string& UserData::getName()
  16. {
  17. return _name;
  18. }
  19. string& UserData::getPasw()
  20. {
  21. return _password;
  22. }
  23. string & UserData::getDepart()
  24. {
  25. return _depart;
  26. }
  27. const string& UserData::getName() const
  28. {
  29. return _name;
  30. }
  31. const string& UserData::getPasw() const
  32. {
  33. return _password;
  34. }
  35. const string & UserData::getDepart() const
  36. {
  37. return _depart;
  38. }
  39. //用户登录
  40. UserData * UserData::Login()
  41. {
  42. return OADataCenter::Login(*this);
  43. }
  44. //用户添加预约——判断会议室是否存在,判断时间是否冲突
  45. int UserData::addApp(tm& t, time_t duration, MeetingRoom roomid)
  46. {
  47. int res = 1;
  48. time_t t_time = mktime(&t);
  49. pair<_It_room, bool> respair = OADataCenter::checkRoom(roomid);
  50. if (!(respair.second)) {
  51. res = -1;
  52. }
  53. else if (!OADataCenter::checkTime(t_time, duration, roomid)) {
  54. res = 0;
  55. }
  56. else {
  57. Appointment app(t, duration, roomid, _name, _depart);
  58. OADataCenter::AddApp(app);
  59. }
  60. return res;
  61. }
  62. //删除预约
  63. bool UserData::delApp(int id)
  64. {
  65. return OADataCenter::DelApp(*this,id);
  66. }
  67. //查看预约——用户查看的是个人的预约,管理员查看的是所有预约
  68. bool UserData::showApp()
  69. {
  70. bool res = OADataCenter::showApp(_name);
  71. return res;
  72. }
  73. //保存用户信息到文件
  74. void UserData::save(ofstream & ofs)
  75. {
  76. OAUtils::save_str(ofs, _name);
  77. OAUtils::save_str(ofs, _password);
  78. OAUtils::save_str(ofs, _depart);
  79. }
  80. //从文件读取用户信息
  81. void UserData::read(ifstream & ifs)
  82. {
  83. OAUtils::read_str(ifs, _name);
  84. OAUtils::read_str(ifs, _password);
  85. OAUtils::read_str(ifs, _depart);
  86. }
  87. //管理员构造函数
  88. AdminData::AdminData() {}
  89. AdminData::AdminData(string name, string password, string depart) :UserData(name, password, depart) {}
  90. //管理员登录
  91. AdminData * AdminData::Login()
  92. {
  93. return OADataCenter::Login(*this);
  94. }
  95. //管理员查看所有用户
  96. bool AdminData::showUser()const
  97. {
  98. return OADataCenter::showUser();
  99. }
  100. //管理员查看所有会议室
  101. bool AdminData::showRoom()
  102. {
  103. return OADataCenter::showRoom();
  104. }
  105. //管理员添加用户——调用数据中心的添加用户函数
  106. void AdminData::AddUser(const UserData& userdata)
  107. {
  108. OADataCenter::AddUser(userdata);
  109. }
  110. //管理员删除用户——调用数据中心的删除用户函数
  111. void AdminData::DelUser(const string& name)const
  112. {
  113. OADataCenter::DelUser(name);
  114. }
  115. //管理员添加会议室——调用数据中心的添加会议室函数
  116. bool AdminData::AddMeetingRoom(int id)
  117. {
  118. return OADataCenter::AddMeetingRoom(id);
  119. }
  120. //管理员删除会议室——调用数据中心的删除会议室函数
  121. bool AdminData::DelMeetingRoom(int roomid)
  122. {
  123. return OADataCenter::DelMeetingRoom(roomid);
  124. }
  125. //管理员核对用户姓名是否存在
  126. bool AdminData::checkName(const string & name)const
  127. {
  128. return OADataCenter::checkName(name).second;
  129. }
  130. void AdminData::CleAppPage()
  131. {
  132. OADataCenter::CleApp();
  133. }
  134. //预约类构造函数
  135. Appointment::Appointment()
  136. {
  137. this->_t = { 0 };
  138. this->_roomnum = 0;
  139. this->_duration = 0;
  140. }
  141. Appointment::Appointment(const tm & t, time_t duration, int roomid, string name, string depart)
  142. {
  143. _t = t;
  144. _duration = duration;
  145. _roomnum = roomid;
  146. _username = name;
  147. _userdepart = depart;
  148. }
  149. //获取预约的time_t格式时间
  150. const time_t Appointment::getAppTime()const
  151. {
  152. return mktime(&tm(_t));
  153. }
  154. //获取预约的时长分钟
  155. const time_t Appointment::getAppDuration()const
  156. {
  157. return _duration;
  158. }
  159. //获取预约的会议室
  160. const int Appointment::getRoomID() const
  161. {
  162. return _roomnum;
  163. }
  164. //获取预约用户
  165. const string& Appointment::getAppName()const
  166. {
  167. return _username;
  168. }
  169. //获取预约部门
  170. const string& Appointment::getAppdepart()const
  171. {
  172. return _userdepart;
  173. }
  174. //保存约信息到文件
  175. void Appointment::save(ofstream& ofs)
  176. {
  177. ofs.write((char*)&_t, sizeof(_t));
  178. ofs.write((char*)&_duration, sizeof(_duration));
  179. ofs.write((char*)&_roomnum, sizeof(_roomnum));
  180. OAUtils::save_str(ofs, _username);
  181. OAUtils::save_str(ofs, _userdepart);
  182. }
  183. //从文件读取预约信息
  184. void Appointment::read(ifstream & ifs)
  185. {
  186. ifs.read((char*)&_t, sizeof(_t));
  187. ifs.read((char*)&_duration, sizeof(_duration));
  188. ifs.read((char*)&_roomnum, sizeof(_roomnum));
  189. OAUtils::read_str(ifs, _username);
  190. OAUtils::read_str(ifs, _userdepart);
  191. }
  192. //用户和管理员登录函数重载
  193. UserData * OADataCenter::Login(const UserData & userdata)
  194. {
  195. UserData* res = nullptr;
  196. pair<_It_user, bool> checkpair = checkName(userdata.getName());
  197. if (checkpair.second) {
  198. if (checkPasw(checkpair.first, userdata.getPasw())) {
  199. res = &(*checkpair.first);
  200. }
  201. }
  202. return res;
  203. }
  204. AdminData * OADataCenter::Login(const AdminData & admindata)
  205. {
  206. AdminData* admin_ptr = nullptr;
  207. if (admin.getName() == admindata.getName() && admin.getPasw() == admindata.getPasw()) {
  208. admin_ptr = &admin;
  209. }
  210. return admin_ptr;
  211. }
  212. void OADataCenter::AddUser(const UserData & userdata)
  213. {
  214. user.push_back(userdata);
  215. OADataCenter::save_OADataCenter();
  216. }
  217. //数据中心删除用户
  218. void OADataCenter::DelUser(const string & name)
  219. {
  220. user.erase(OADataCenter::get_It_User(name));
  221. save_OADataCenter();
  222. }
  223. //数据中心添加会议室——添加前判断会议室是否存在
  224. bool OADataCenter::AddMeetingRoom(int id)
  225. {
  226. bool res = false;
  227. if (!checkRoom(id).second) {
  228. room.push_back(id);
  229. res = true;
  230. OADataCenter::save_OADataCenter();
  231. }
  232. return res;
  233. }
  234. //数据中心删除会议室——删除前判断会议室是否存在
  235. bool OADataCenter::DelMeetingRoom(MeetingRoom roomid)
  236. {
  237. bool res = false;
  238. _It_room it = get_It_Room(roomid);
  239. if (it != room.end()) {
  240. room.erase(it);
  241. cout << room.size() << endl;
  242. res = true;
  243. OADataCenter::save_OADataCenter();
  244. }
  245. return res;
  246. }
  247. //数据中心添加预约
  248. void OADataCenter::AddApp(const Appointment & app)
  249. {
  250. App.push_back(app);
  251. save_OADataCenter();
  252. }
  253. //数据中心删除预约
  254. bool OADataCenter::DelApp(const UserData & data, int id)
  255. {
  256. bool res = false;
  257. sort(App.begin(),App.end(),CompareName());
  258. pair<_It_app, _It_app> respair;
  259. if (&data != &admin) {
  260. respair = equal_range(App.begin(), App.end(), Appointment(tm(), 0, 0, data.getName(), ""),CompareName());
  261. }
  262. else {
  263. respair.first = App.begin();
  264. respair.second = App.end();
  265. }
  266. if (id < respair.second - respair.first&&id >= 0) {
  267. App.erase(respair.first + id);
  268. res = true;
  269. save_OADataCenter();
  270. }
  271. return res;
  272. }
  273. //数据中心清空预约
  274. void OADataCenter::CleApp()
  275. {
  276. App.clear();
  277. vector<Appointment>().swap(App);
  278. }
  279. //保存所有数据到文件
  280. void OADataCenter::init_OADataCenter()
  281. {
  282. ifstream ifs;
  283. ifs.open("DataCenter.txt", ios::in | ios::binary);
  284. if (ifs.is_open()) {
  285. size_t usersize = 0;
  286. ifs.read((char*)&usersize, sizeof(usersize));
  287. user.resize(usersize);
  288. for (_It_user it = user.begin(); it != user.end(); it++) {
  289. it->read(ifs);
  290. }
  291. size_t roomsize = 0;
  292. ifs.read((char*)&roomsize, sizeof(roomsize));
  293. room.resize(roomsize);
  294. for (_It_room it = room.begin(); it != room.end(); it++) {
  295. ifs.read((char*)&(*it), sizeof(*it));
  296. }
  297. size_t appsize = 0;
  298. ifs.read((char*)&appsize, sizeof(appsize));
  299. App.resize(appsize);
  300. for (_It_app it = App.begin(); it != App.end(); it++) {
  301. it->read(ifs);
  302. }
  303. ifs.close();
  304. }
  305. }
  306. //从文件写入数据
  307. void OADataCenter::save_OADataCenter()
  308. {
  309. ofstream ofs;
  310. ofs.open("DataCenter.txt", ios::out | ios::binary);
  311. if (ofs.is_open()) {
  312. size_t size = user.size();
  313. ofs.write((char*)&size, sizeof(size));
  314. for (auto it = user.begin(); it != user.end(); it++) {
  315. it->save(ofs);
  316. }
  317. size = room.size();
  318. ofs.write((char*)&size, sizeof(size));
  319. for (_It_room it = room.begin(); it != room.end(); it++) {
  320. ofs.write((char*)&(*it), sizeof(*it));
  321. }
  322. size = App.size();
  323. ofs.write((char*)&size, sizeof(size));
  324. for (auto it = App.begin(); it != App.end(); it++) {
  325. it->save(ofs);
  326. }
  327. ofs.close();
  328. }
  329. }
  330. //数据中心核对时间是否冲突
  331. bool OADataCenter::checkTime(time_t t_time, time_t duration, MeetingRoom roomid)
  332. {
  333. bool res = true;
  334. duration *= 60;
  335. sort(App.begin(), App.end(), CompareRoomID());
  336. auto roomidAppit = equal_range(App.begin(), App.end(), Appointment(tm(), 0, roomid, "", ""), CompareRoomID());
  337. for (_It_app it = roomidAppit.first; roomidAppit.first != App.end() && it != roomidAppit.second; it++) {
  338. if (it->getAppTime() == t_time ||
  339. (it->getAppTime() < t_time&&it->getAppTime() + it->getAppDuration()*60 > t_time) ||
  340. (it->getAppTime() > t_time&&it->getAppTime() < t_time + duration)) {
  341. res = false;
  342. break;
  343. }
  344. }
  345. return res;
  346. }
  347. //通过姓名获取用户的迭代器,不存在则返回end()
  348. _It_user OADataCenter::get_It_User(const string & name)
  349. {
  350. for (_It_user it = user.begin(); it != user.end(); it++) {
  351. if (it->getName() == name) {
  352. return it;
  353. }
  354. }
  355. return user.end();
  356. }
  357. //通过房间号获取会议室迭代器,不存在返回end
  358. _It_room OADataCenter::get_It_Room(const MeetingRoom & id)
  359. {
  360. return find(room.begin(), room.end(), id);
  361. }
  362. //数据中心核实是否存在姓名为name的用户
  363. pair<_It_user, bool> OADataCenter::checkName(const string& name)
  364. {
  365. pair<_It_user, bool> res;
  366. res.first = get_It_User(name);
  367. res.second = res.first != user.end();
  368. return res;
  369. }
  370. //数据中心核对密码——登陆时调用
  371. bool OADataCenter::checkPasw(const _It_user& it, const string& password)
  372. {
  373. if (it != user.end()) {
  374. return it->getPasw() == password;
  375. }
  376. else {
  377. return false;
  378. }
  379. }
  380. //数据中心判断是否存在id会议室
  381. pair<_It_room, bool> OADataCenter::checkRoom(const MeetingRoom & id)
  382. {
  383. pair<_It_room, bool> res;
  384. res.first = get_It_Room(id);
  385. res.second = res.first != room.end();
  386. return res;
  387. }
  388. //数据中心查看预约——用户查看个人预约,管理员查看所有预约
  389. bool OADataCenter::showApp(const string & name)
  390. {
  391. bool res = false;
  392. pair<_It_app, _It_app> myApp;
  393. if (name != admin.getName()) {
  394. sort(App.begin(), App.end(), CompareName());
  395. myApp = equal_range(App.begin(), App.end(), Appointment(tm(), 0, 0, name, ""), CompareName());
  396. }
  397. else {
  398. myApp.first = App.begin();
  399. myApp.second = App.end();
  400. }
  401. if (myApp.first == App.end()) {
  402. cout << "您没有预约" << endl;
  403. }
  404. else {
  405. res = true;
  406. cout << setw(10) << setiosflags(ios::left) << "序号"
  407. << setw(10) << setiosflags(ios::left) << "房间"
  408. << setw(30) << setiosflags(ios::left) << "预约时间"
  409. << setw(10) << setiosflags(ios::left) << "预约时长"
  410. << setw(10) << setiosflags(ios::left) << "预约人"
  411. << setw(10) << setiosflags(ios::left) << "预约部门" << endl;
  412. int i = 1;
  413. for (_It_app it = myApp.first; it != myApp.second; it++, i++) {
  414. cout << setw(10) << setiosflags(ios::left) << i;
  415. PrintApp()(*it);
  416. }
  417. }
  418. return res;
  419. }
  420. //数据中心查看所有用户——由管理员删除用户时调用
  421. bool OADataCenter::showUser()
  422. {
  423. bool res = false;
  424. if (user.size() == 0) {
  425. cout << "当前没有用户" << endl;
  426. }
  427. else {
  428. res = true;
  429. cout << setw(10) << setiosflags(ios::left) << "序号"
  430. << setw(10) << setiosflags(ios::left) << "用户名"
  431. << setw(10) << setiosflags(ios::left) << "部门" << endl;
  432. int i = 1;
  433. for (_It_user it = OADataCenter::user.begin(); it != OADataCenter::user.end(); it++, i++) {
  434. cout << setw(10) << setiosflags(ios::left) << i
  435. << setw(10) << setiosflags(ios::left) << it->getName()
  436. << setw(10) << setiosflags(ios::left) << it->getDepart() << endl;
  437. }
  438. }
  439. return res;
  440. }
  441. //数据中心查看所有会议室——由管理员删除会议室时调用
  442. bool OADataCenter::showRoom()
  443. {
  444. bool res = false;
  445. if (OADataCenter::room.size() == 0) {
  446. cout << "当前没有会议室" << endl;
  447. }
  448. else {
  449. res = true;
  450. cout << setw(10) << setiosflags(ios::left) << "序号"
  451. << setw(10) << setiosflags(ios::left) << "门牌号" << endl;
  452. int i = 1;
  453. for (_It_room it = OADataCenter::room.begin(); it != OADataCenter::room.end(); it++, i++) {
  454. cout << setw(10) << setiosflags(ios::left) << i
  455. << setw(10) << setiosflags(ios::left) << *it << endl;
  456. }
  457. }
  458. return res;
  459. }
  460. using MeetingRoom = int;
  461. AdminData OADataCenter::admin("admin", "admin", "管理员");
  462. vector<UserData> OADataCenter::user;
  463. vector<MeetingRoom> OADataCenter::room;
  464. vector<Appointment> OADataCenter::App;
  465. //排序谓词
  466. bool CompareName::operator()(const Appointment& a1, const Appointment& a2)
  467. {
  468. return a1.getAppName() < a2.getAppName();
  469. }
  470. bool CompareRoomID::operator()(const Appointment & a1, const Appointment & a2)
  471. {
  472. return a1.getRoomID() < a2.getRoomID();
  473. }
  474. //输出预约仿函数
  475. void PrintApp::operator()(Appointment & a)
  476. {
  477. time_t t = a.getAppTime();
  478. tm tm_t;
  479. localtime_s(&tm_t, &t);
  480. ostringstream oss;
  481. oss << tm_t.tm_year + 1900 << "年" << tm_t.tm_mon + 1 << "月" << tm_t.tm_mday << "日" << tm_t.tm_hour << "时" << tm_t.tm_min << "分";
  482. cout << setw(10) << a.getRoomID() << setw(30) << oss.str() << setw(10) << a.getAppDuration() << setw(10)
  483. << a.getAppName() << setw(10) << a.getAppdepart() << endl;
  484. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/421797
推荐阅读
相关标签
  

闽ICP备14008679号