【黑马程序员】C++项目之机房预约管理系统实战

文章目录

  • 需求
    • 系统简介
    • 身份介绍
    • 机房介绍
    • 申请简介
    • 系统具体需求
  • 实现
    • 菜单与退出功能
      • 实现
      • 功能测试
    • 创建身份类
      • 创建角色基类
      • 创建学生类
      • 创建教师类
      • 创建管理员类
    • 登录模块
      • 功能描述
      • 登录函数封装
      • 各个校色具体登录验证
      • 管理员操作界面调用流程
    • 管理员模块
      • 构造函数实现
      • 管理员子菜单显示
      • 添加账号功能实现
      • 初始化、加载文件、添加校验操作
      • 查看账号
      • 查看机房信息
        • 新建机房管理类
        • 添加加载机房信息功能
        • 添加展示机房信息功能
      • 清空预约记录
    • 预约模块
      • 构造函数
      • 更新预约记录功能
    • 学生模块
      • 构造函数
      • 学生菜单模块
      • 申请预约功能
      • 查看自身预约
      • 查看所有预约
      • 取消预约
    • 教师模块
      • 构造函数实现
      • 菜单功能实现
      • 查看所有预约
      • 审核预约

需求

系统简介

  • 解决多用户使用多机房需求

身份介绍

  • 学生代表:申请使用机房

  • 教师:审核学生的预约申请

  • 管理员:给学生、教师创建账号

机房介绍

  • 1号机房,最多容纳20人

  • 2号机房,最多容纳50人

  • 3号机房,最多容纳100人

申请简介

  • 申请的订单每周由管理员负责清空

  • 学生可以预约未来一周机房的使用,预约周期为周一至周五,预约时段为(上午、下午)

  • 教师来审批预约,依据实际情况来审批通过或者不通过

系统具体需求

在这里插入图片描述

实现

菜单与退出功能

  • 与用户交流界面

实现

  • 新建machineRoomManager.hpp,添加展示菜单和退出声明
#pragma once#include <iostream>using namespace std;class MachineRoomManager {
public:// 构造函数MachineRoomManager();// 菜单展示void showMenu();// 退出void logout();// 析构函数~MachineRoomManager();
};
  • 新建machineRoomManager.cpp,实现展示菜单功能
// 菜单展示
void MachineRoomManager::showMenu() {cout << "欢迎使用机房管理系统" << endl;cout << "请输入你的身份" << endl;cout << "1.学生代表" << endl;cout << "2.老师" << endl;cout << "3.管理员" << endl;cout << "4.退出" << endl;cout << "请输入你的选择:";
}
// 退出
void MachineRoomManager::logout() {cout << "即将退出系统..." << endl;exit(0);
}

功能测试

  • 新建main.cpp,提供主页面用户交互流程
#include "machineRoomManager.hpp"int main() {int choice;MachineRoomManager mrm;while (true) {mrm.showMenu();cin >> choice;switch (choice) {case 1:// 1.学生代表break;case 2:// 2.老师break;case 3:// 3.管理员break;case 4:// 4.退出mrm.logout();break;default:cout << "输入非法,请重新输入" << endl;break;}}
}
  • 结果展示

在这里插入图片描述

创建身份类

  • 系统总共有三种身份,有共性也有特性,因此抽象出一个角色基类

创建角色基类

  • 新建role.hpp,创建抽象类,可以用户名密码是公共属性
#pragma once#include <iostream>using namespace std;class Role {
public:// 操作界面virtual void operatorMenue()=0;// 姓名string name;// 密码string password;
};s

创建学生类

  • 新建student.hpp,继承自Role类,提供学生具有的成员函数和属性
#pragma once#include "role.hpp"class Student : public Role {
public:// 构造函数Student();Student(int id, string name, string password);// 操作界面void operatorMenue();// 申请预约void applyOrder();// 查看自身预约void showSelfOrder();// 查看所有的预约void showAllOrder();// 取消预约void cancelOrder();// 析构函数~Student();// 学号int studentId;
};
  • 新建student.cpp实现类,先给出各种功能的空实现
#include "student.hpp"// 构造函数
Student::Student() {}Student::Student(int id, string name, string password) {this->studentId = id;this->name = name;this->password = password;
}// 操作界面
void Student::operatorMenue() {}// 申请预约
void Student::applyOrder() {}// 查看自身预约
void Student::showSelfOrder() {}// 查看所有的预约
void Student::showAllOrder() {}// 取消预约
void Student::cancelOrder() {}Student::~Student() {}

创建教师类

  • 新建teacher.hpp,继承自Role类,提供老师具有的成员函数和属性
#pragma once#include "role.hpp"class Teacher : public Role {
public:// 操作界面void operatorMenue();Teacher();Teacher(int id, string name, string password);// 查看所有预约void showAllOreder();// 审核预约void checkOrder();// 退出登录void logout();// 职工号int teacheId;
};
  • 新建teacher.cpp实现类,先给出各种功能的空实现
#include "teacher.hpp"Teacher::Teacher() {}Teacher::Teacher(int id, string name, string password) {this->teacheId = id;this->name = name;this->password = password;
}// 操作界面
void Teacher::operatorMenue() {}// 查看所有预约
void Teacher::showAllOreder() {}// 审核预约
void Teacher::checkOrder() {}// 退出登录
void Teacher::logout() {}

创建管理员类

  • 新建manager.hpp,继承自Role类,提供管理员具有的成员函数和属性
#pragma once#include "role.hpp"class Manager : public Role {
public:Manager();Manager(string name, string password);// 操作界面void operatorMenue();// 添加账号void addAccount();// 查看账号void showAccount();// 查看所有机房信息void showComputer();// 清空预约记录void cleanFile();~Manager();
};
  • 新建manager.cpp实现类,先给出各种功能的空实现
#include "manager.hpp"Manager::Manager() {}Manager::Manager(string name, string password) {this->name = name;this->password = password;
}// 操作界面
void Manager::operatorMenue() {}// 添加账号
void Manager::addAccount() {}// 查看账号
void Manager::showAccount() {}// 查看所有机房信息
void Manager::showComputer() {}// 清空预约记录
void Manager::cleanFile() {}Manager::~Manager() {}

登录模块

功能描述

  • 不同的身份可能会用到不同的文件操作,我们将所有文件名定义到同一个全局文件中

  • 新建globalFile.hpp文件

#pragma once// 管理员文件
#define ADMIN_FILE "admin.txt"
// 教师文件
#define TEACHER_FILE "teacher.txt"
// 学生文件
#define STUDENT_FILE "student.txt"
// 机房信息文件
#define MACHINE_FILE "machine.txt"
// 订单文件
#define ORDER_FILE "order.txt"

登录函数封装

  • machineRoomManager.hpp,添加登录声明
    // 登录void login(string fileName, int type);
  • machineRoomManager.cpp,实现登录
// 登录
void MachineRoomManager::login(string fileName, int type) {// 父指针 用于指向子类的对象Role *r = NULL;// 读文件ifstream ifs;ifs.open(fileName, ios::in);if (!ifs.is_open()) {cout << "文件不存在" << endl;ifs.close();return;}char ch;ifs >> ch;if (ch == EOF) {cout << "文件为空" << endl;return;}ifs.putback(ch);// 准备接收输入int id = 0;string name;string pwd;// 身份判断if (type == 1) {cout << "请输入学号:" << endl;cin >> id;} else if (type == 2) {cout << "请输入职工编号:" << endl;cin >> id;}cout << "请输入姓名:" << endl;cin >> name;cout << "请输入密码:" << endl;cin >> pwd;switch (type) {case 1: // 学生身份验证break;case 2: // 老师身份验证break;case 3: // 管理员身份验证break;}cout << "登录验证失败" << endl;
}
  • 在用户交互入口添加登录调用
int main() {int choice;MachineRoomManager mrm;while (true) {mrm.showMenu();cin >> choice;switch (choice) {case 1:// 1.学生mrm.login(STUDENT_FILE, 1);break;case 2:// 2.老师mrm.login(TEACHER_FILE, 2);break;case 3:// 3.管理员mrm.login(ADMIN_FILE, 3);break;case 4:// 4.退出mrm.logout();break;default:cout << "输入非法,请重新输入" << endl;break;}}
}

各个校色具体登录验证

  • 读取文件中的数据和用户登录的信息进行比对校验,比对成功用户登录成功,否则登录失败
    int fId;string fName;string fPwd;switch (type) {case 1: // 学生身份验证while (ifs >> fId && ifs >> fName && ifs >> fPwd) {if (id == fId && fName == name && pwd == fPwd) {cout << "学生登录验证成功" << endl;role = new Student(id, name, pwd);return;}}break;case 2: // 老师身份验证while (ifs >> fId && ifs >> fName && ifs >> fPwd) {if (id == fId && fName == name && pwd == fPwd) {cout << "老师登录验证成功" << endl;role = new Teacher(id, name, pwd);return;}}break;case 3: // 管理员身份验证while (ifs >> fName && ifs >> fPwd) {if (fName == name && pwd == fPwd) {cout << "管理员登录验证成功" << endl;role = new Manager(name, pwd);return;}}break;}

管理员操作界面调用流程

  • role.hpp中添加纯虚函数操作子界面声明
virtual void operatorMenue() = 0;
  • manager.hpp中添加操作子界面声明
    // 操作界面void operatorMenue();
  • manager.cpp中实现操作子界面功能
// 操作界面
void Manager::operatorMenue() {int choice;while (true) {this->showMenu();cout << "请选择你要执行的操作" << endl;cin >> choice;switch (choice) {case 1: //1.添加账号this->addAccount();break;case 2: //2.查看账号this->showAccount();break;case 3: //3.查看所有机房信息this->showComputer();break;case 4: //4.清空预约记录this->cleanFile();break;case 5: //5.退出this->logout();return;default:cout << "请重新选择" << endl;break;}}
}
  • 当用户登录成功之后,在machineRoomManager.hpp 中添加调用不同角色声明,这里使用多态的方式用父类的对象去指向具体登录的子类函数
    // 子菜单展示void showRoleMenu(Role *role);
  • machineRoomManager.cpp 中实现调用不同角色
// 子菜单展示
void MachineRoomManager::showRoleMenu(Role *role) {role->operatorMenue();
}

管理员模块

构造函数实现

Manager::Manager(string name, string password) {this->name = name;this->password = password;
}

管理员子菜单显示

  • 功能描述:当用户选择为管理员登录成功后显示管理员可以操作的菜单

  • manager.hpp中添加查看管理员菜单声明

    // 查看角色菜单void showMenu();
  • manager.cpp中实现查看管理员菜单功能
// 查看角色菜单
void Manager::showMenu() {cout << "1.添加账号" << endl;cout << "2.查看账号" << endl;cout << "3.查看所有机房信息" << endl;cout << "4.清空预约记录" << endl;cout << "5.退出" << endl;
}

添加账号功能实现

  • 流程

    • 提示选择添加账号的类型

    • 根据不同的角色类型,让提示输入不同的添加值

    • 将添加角色,加入到不同的角色文件中


// 添加账号
void Manager::addAccount() {cout << "请选择你要添加的账号类型" << endl;cout << "1.学生" << endl;cout << "2.老师" << endl;int choice;string filename;string tip;ofstream ofs;if (choice == 1) {filename = STUDENT_FILE;tip = "请输入学号";} else if (choice == 2) {filename = TEACHER_FILE;tip = "请输入职工号";} else {cout << "输入有误" << endl;return;}ofs.open(filename, ios::out | ios::app);int id;string name;string pwd;cout << tip << endl;cin >> id;cout << "请输入姓名:" << endl;cin >> name;cout << "请输入密码:" << endl;cin >> pwd;ofs << id << " " << name << " " << pwd << " " << endl;cout << "添加角色成功" << endl;ofs.close();
}

初始化、加载文件、添加校验操作

  • 功能描述:

    • 添加时如果学号或者职工编号重复提示错误

    • 新加学生和教师容器用于存储当前已有账户

  • manager.hpp

    • 添加学生和教师容器:用于存放学生和教师账号

    • 初始化容器方法声明:在构造函数中调用

    • 加载文件内容方法声明:在初始化容器时调用

    • 去重方法声明:在添加账户时,当输入添加id后调用该方法进行校验

    // 初始化容器void initVector();// 加载文件内容void loadFile(string fileName, int type);// 去重检查bool checkAccount(int type, int id);// 学生容器vector <Student> vecStudent;// 教师容器vector <Teacher> vecTeacher;
  • manager.cpp中实现各种功能
// 初始化容器
void Manager::initVector() {// 初始化时确保两个容器都为空this->vecStudent.clear();this->vecTeacher.clear();// 加载文件内容this->loadFile(STUDENT_FILE, 1);this->loadFile(TEACHER_FILE, 2);
}// 加载文件内容
void Manager::loadFile(string fileName, int type) {ifstream ifs(fileName, ios::in);if (!ifs.is_open()) {cout << STUDENT_FILE << "不存在" << endl;ifs.close();return;}char ch;ifs >> ch;if (ch == EOF) {cout << STUDENT_FILE << "为空" << endl;ifs.close();return;}ifs.putback(ch);int id;string name;string pwd;while (ifs >> id && ifs >> name && ifs >> pwd) {if (type == 1) {this->vecStudent.push_back(Student(id, name, pwd));} else {this->vecTeacher.push_back(Teacher(id, name, pwd));}}ifs.close();
}// 去重检查
bool Manager::checkAccount(int type, int id) {if (type == 1) {for (vector<Student>::iterator it = this->vecStudent.begin();it != this->vecStudent.end(); it++) {if (id == it->studentId) {return false;}}return true;}for (vector<Teacher>::iterator it = this->vecTeacher.begin();it != this->vecTeacher.end(); it++) {if (id == it->teacheId) {return false;}}return true;
}// 在添加账号中添加账号写容器操作if (choice == 1) {this->vecStudent.push_back(Student(id, name, pwd));} else {this->vecTeacher.push_back(Teacher(id, name, pwd));}

查看账号

  • manager.cpp中完成查看账号实现,主要操作就是遍历学生和教师容器展示内容
// 查看账号
void Manager::showAccount() {cout << "student info: " << endl;for (vector<Student>::iterator it = this->vecStudent.begin();it != this->vecStudent.end(); it++) {cout << "id: " << it->studentId <<" name: " << it->name <<" pwd: " << it->password << endl;}cout << "teacher info: " << endl;for (vector<Teacher>::iterator it = this->vecTeacher.begin();it != this->vecTeacher.end(); it++) {cout << "id: " << it->teacheId <<" name: " << it->name <<" pwd: " << it->password << endl;}
}

查看机房信息

新建机房管理类
  • 新建computerRoom.hpp
#pragma once#include <iostream>using namespace std;class ComputerRoom {
public:// 构造函数ComputerRoom();ComputerRoom(int roomId, int maxNum);// 机房号int computerRoomId;// 机房最大容器int computerRoomMaxNum;
};
  • 新建computerRoom.cpp,实现对应的构造函数
#include "computerRoom.hpp"// 构造函数
ComputerRoom::ComputerRoom() {}ComputerRoom::ComputerRoom(int roomId, int maxNum) {this->computerRoomId = roomId;this->computerRoomMaxNum = maxNum;
}
添加加载机房信息功能
  • manager.hpp中,添加接口成员
    // 加载机房信息void loadComputerRoom();// 查看所有机房信息void showComputer();// 机房信息容器vector <ComputerRoom> vecComputerRoom;
  • manager.cpp中,实现加载机房信息功能
// 加载机房信息
void Manager::loadComputerRoom() {ifstream ifs;ifs.open(MACHINE_FILE, ios::in);if (!ifs.is_open()) {cout << MACHINE_FILE << "文件不存在" << endl;ifs.close();return;}char ch;ifs >> ch;if (ch == EOF) {cout << "文件为空" << endl;ifs.close();return;}ifs.putback(ch);ComputerRoom computerRoom;while (ifs >> computerRoom.computerRoomId && ifs >> computerRoom.computerRoomMaxNum) {this->vecComputerRoom.push_back(computerRoom);}ifs.close();
}
添加展示机房信息功能
  • manager.cpp中,实现展示机房信息功能
// 查看所有机房信息
void Manager::showComputer() {for (vector<ComputerRoom>::iterator it = this->vecComputerRoom.begin();it != this->vecComputerRoom.end(); it++) {cout << it->computerRoomId << "号机房,最大容量为" << it->computerRoomMaxNum << endl;}
}

清空预约记录

// 清空预约记录
void Manager::cleanFile() {ofstream ofs(ORDER_FILE, ios::out | ios::trunc);ofs.close();
}

预约模块

构造函数

  • 新建oreder.hpp
#pragma once#include <iostream>
#include <fstream>
#include <map>
#include "globalFile.hpp"using namespace std;class Order {
public:Order();// 更新预约状态void updateOrder();// 获取属性键值void getMap(map <string, string> &mTmp, string data);// 预约记录容器 key记录条数,val记录具体记录键值对信息map<int, map<string, string> > mapOrderData;// 预约条数int size;
};
  • 新建order.cpp 实现构造函数
#include "order.hpp"Order::Order() {ifstream ifs(ORDER_FILE, ios::in);if (!ifs.is_open()) {cout << "文件不存在" << endl;return;}string day;string interval;string stuId;string stuName;string roomId;string status;// 预约记录个数this->size = 0;while (ifs >> day &&ifs >> interval &&ifs >> stuId &&ifs >> stuName &&ifs >> roomId &&ifs >> status) {map <string, string> mTmp;this->getMap(mTmp, day);this->getMap(mTmp, interval);this->getMap(mTmp, stuId);this->getMap(mTmp, stuName);this->getMap(mTmp, roomId);this->getMap(mTmp, status);this->mapOrderData.insert(make_pair(this->size, mTmp));this->size++;}
}void Order::getMap(map <string, string> &mTmp, string data) {int pos = data.find(":");string key;string val;if (pos != -1) {key = data.substr(0, pos);val = data.substr(pos + 1, data.size() - pos);mTmp.insert(make_pair(key, val));}
}

更新预约记录功能

  • order.cpp中实现更新预约
void Order::updateOrder() {ofstream ofs(ORDER_FILE, ios::out | ios::trunc);for (int i = 0; i < this->size; i++) {ofs << "day:" << this->mapOrderData[i]["day"] << " ";ofs << "interval:" << this->mapOrderData[i]["interval"] << " ";ofs << "stuId:" << this->mapOrderData[i]["stuId"] << " ";ofs << "stuName:" << this->mapOrderData[i]["stuName"] << " ";ofs << "roomId:" << this->mapOrderData[i]["roomId"] << " ";ofs << "status:" << this->mapOrderData[i]["status"] << endl;}ofs.close();
}

学生模块

构造函数

  • student.cpp中实现构造函数
// 构造函数
Student::Student() {}Student::Student(int id, string name, string password) {this->studentId = id;this->name = name;this->password = password;
}

学生菜单模块

  • 菜单继承role类的纯虚函数,在student.hpp中声明查看菜单和操作界面
    // 操作界面void operatorMenue();// 查看角色菜单void showMenu();
  • student.cpp中实现相应功能
// 查看角色菜单
void Student::showMenu() {cout << "1.申请预约" << endl;cout << "2.查看自身预约" << endl;cout << "3.查看所有的预约" << endl;cout << "4.取消预约" << endl;cout << "5.登出" << endl;
}// 操作界面
void Student::operatorMenue() {int choice;while (true) {cout << "请选择你要执行的操作" << endl;this->showMenu();cin >> choice;switch (choice) {case 1: //1.申请预约this->applyOrder();break;case 2: //2.查看自身预约this->showSelfOrder();break;case 3: //3.查看所有的预约this->showAllOrder();break;case 4: //4.取消预约this->cancelOrder();break;case 5: //5.退出this->logout();return;default:cout << "请重新选择" << endl;break;}}
}

申请预约功能

  • 现在student.cpp中完成申请预约写预约文件操作
// 申请预约
void Student::applyOrder() {int choice;cout << "请选择你要预约的时间" << endl;cout << "1.周一" << endl;cout << "2.周二" << endl;cout << "3.周三" << endl;cout << "4.周四" << endl;cout << "5.周五" << endl;int day;int interval;int comNum;while (true) {cin >> day;if (day >= 1 || day <= 5) {break;}cout << "预约的时间输入错误,请重新输入" << endl;}cout << "请选择你要预约的时间段" << endl;cout << "1.上午" << endl;cout << "2.下午" << endl;while (true) {cin >> interval;if (interval == 1 || interval == 2) {break;}cout << "预约时间段错误,请重新输入" << endl;}cout << "请选择你要预约的机房" << endl;cout << "1机房容量:" << this->vecComputerRoom[0].computerRoomMaxNum << endl;cout << "2机房容量:" << this->vecComputerRoom[1].computerRoomMaxNum << endl;cout << "3机房容量:" << this->vecComputerRoom[2].computerRoomMaxNum << endl;while (true) {cin >> comNum;if (comNum >= 1 || comNum <= 3) {break;}cout << "预约的机房不存在,请重新输入" << endl;}cout << "预约成功,审核中..." << endl;// 将预约信息写入预约文件ofstream ofs(ORDER_FILE, ios::out | ios::app);ofs << "day:" << day << " ";ofs << "interval:" << interval << " ";ofs << "stuId:" << this->studentId << " ";ofs << "stuName:" << this->name << " ";ofs << "roomId:" << comNum << " ";ofs << "status:" << 1 << " ";ofs << endl;ofs.close();this->vecOrder.push_back(Order(day, interval, this->studentId, this->name, comNum, 1));
}

查看自身预约

  • 遍历order对象,找学号是自己的输出
// 查看自身预约
void Student::showSelfOrder() {Order order;for (int i = 0; i < order.size; i++) {if (order.mapOrderData[i]["stuId"] == to_string(this->studentId)) {cout << "day:" << order.mapOrderData[i]["day"] << " "<< "interval:" << order.mapOrderData[i]["interval"] << " "<< "stuId:" << order.mapOrderData[i]["stuId"] << " "<< "stuName:" << order.mapOrderData[i]["stuName"] << " "<< "roomId:" << order.mapOrderData[i]["roomId"] << " "<< "status:" << order.mapOrderData[i]["status"] << endl;}}
}

查看所有预约

  • 遍历order对象,直接打印
// 查看所有的预约
void Student::showAllOrder() {Order order;for (int i = 0; i < order.size; i++) {cout << "day:" << order.mapOrderData[i]["day"] << " "<< "interval:" << order.mapOrderData[i]["interval"] << " "<< "stuId:" << order.mapOrderData[i]["stuId"] << " "<< "stuName:" << order.mapOrderData[i]["stuName"] << " "<< "roomId:" << order.mapOrderData[i]["roomId"] << " "<< "status:" << order.mapOrderData[i]["status"] << endl;}
}

取消预约

  • 遍历order对象找学号是自己的,将状态是审核中和已预约的改为取消
// 取消预约
void Student::cancelOrder() {Order order;for (int i = 0; i < order.size; i++) {if (order.mapOrderData[i]["stuId"] == to_string(this->studentId)) {if (atoi(order.mapOrderData[i]["status"].c_str()) == 1 ||atoi(order.mapOrderData[i]["status"].c_str()) == 2) {order.mapOrderData[i]["status"] = "0";}}}order.updateOrder();
}

教师模块

构造函数实现

Teacher::Teacher(int id, string name, string password) {this->teacheId = id;this->name = name;this->password = password;
}

菜单功能实现

// 查看角色菜单
void Teacher::showMenu() {cout << "1.查看所有预约" << endl;cout << "2.审核预约" << endl;cout << "3.退出登录" << endl;
}// 操作界面
void Teacher::operatorMenue() {int choice;while (true) {this->showMenu();cout << "请选择你要执行的操作" << endl;cin >> choice;switch (choice) {case 1: //1.查看所有预约this->showAllOreder();break;case 2: //2.审核预约this->checkOrder();break;case 3: //3.退出登录this->logout();return;default:cout << "请重新选择" << endl;break;}}
}

查看所有预约

// 查看所有预约
void Teacher::showAllOreder() {Order order;for (int i = 0; i < order.size; i++) {// 老师这块只看到正在申请的预约        if (to_string(order.mapOrderData[i]["status"]) == "1") {cout << "day:" << order.mapOrderData[i]["day"] << " "<< "interval:" << order.mapOrderData[i]["interval"] << " "<< "stuId:" << order.mapOrderData[i]["stuId"] << " "<< "stuName:" << order.mapOrderData[i]["stuName"] << " "<< "roomId:" << order.mapOrderData[i]["roomId"] << " "<< "status:" << order.mapOrderData[i]["status"] << endl;}}
}

审核预约

// 审核预约
void Teacher::checkOrder() {Order order;for (int i = 0; i < order.size; i++) {if (atoi(order.mapOrderData[i]["status"]) == 1) {order.mapOrderData[i]["status"] = "2";}}order.updateOrder();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/271005.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据备份:守护你的数字资产,安全无忧!

一、数据备份&#xff1a;数字时代的“保险箱” 在数字化日益盛行的今天&#xff0c;我们的工作、学习和生活都离不开各种电子设备。无论是电脑中的文档、图片&#xff0c;还是手机里的联系人、短信&#xff0c;都承载着我们的重要信息和回忆。然而&#xff0c;电子设备并非永…

Spring源码:手写AOP

文章目录 一、概念1、AOP是什么&#xff1f;2、相关概念1&#xff09;目标对象Target2&#xff09;通知Advice3&#xff09;连接点Joinpoint4&#xff09;切点Pointcut5&#xff09;切面Aspect6&#xff09;织入Weaving 二、分析三、实现1、实现Advice1&#xff09;前置通知2&a…

【开源物联网平台】使用MQTT.fx模拟设备接入FastBee物联网平台

​&#x1f308; 个人主页&#xff1a;帐篷Li &#x1f525; 系列专栏&#xff1a;FastBee物联网开源项目 &#x1f4aa;&#x1f3fb; 专注于简单&#xff0c;易用&#xff0c;可拓展&#xff0c;低成本商业化的AIOT物联网解决方案 目录 一、接入步骤 1.1 创建产品&#xff…

springboot3.x集成SpringDoc Swagger3

近期将springboox2.x升级到了3.x&#xff0c;索性将swagger2也同步升级到swagger3&#xff0c;具体过程如下。 一、添加maven依赖 <dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>…

Mac版2024 CleanMyMac X 4.14.6 核心功能详解以及永久下载和激活入口

CleanMyMac 是 macOS 上久负盛名的系统清理工具&#xff0c;2018 年&#xff0c;里程碑式版本 CleanMyMac X 正式发布。不仅仅是命名上的变化&#xff0c;焕然一新的 UI、流畅的动画也让它显得更加精致。新增的系统优化、软件更新等功能&#xff0c;使得在日常使用 macOS 时有了…

正向代理和反向代理区别

正向代理和反向代理的区别&#xff1a; 特点正向代理反向代理位置位于客户端和目标服务器之间位于目标服务器和客户端之间代理对象代理服务器代表客户端发送请求到目标服务器代理服务器代表目标服务器接收客户端的请求配置客户端需要手动配置代理服务器客户端不需要知道代理服…

TCP收发——计算机网络——day02

今天主要讲了TCP的收发 TCP发端步骤 ①socket ②connect ③send ④closeTCP收端步骤 ①socket ②bind ③listen ④accept ⑤recv ⑥clise其函数主要有 connect int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);功能:发送链接请求参数:sockfd:套接…

【linuxC语言】系统调用IO文件操作

文章目录 前言一、文件描述符介绍二、系统调用IO API介绍2.1 open函数2.2 close函数2.3 read函数2.4 write函数2.5 lseek函数 三、示例代码总结 前言 在Linux系统中&#xff0c;C语言通过系统调用实现对文件的输入输出&#xff08;I/O&#xff09;操作。系统调用提供了访问操作…

一款Mac系统NTFS磁盘读写软件Tuxera NTFS 2023 for Mac

当您获得一台新 Mac 时&#xff0c;它只能读取 Windows NTFS 格式的 USB 驱动器。要将文件添加、保存或写入您的 Mac&#xff0c;您需要一个附加的 NTFS 驱动程序。Tuxera 的 Microsoft NTFS for Mac 2023是一款易于使用的软件&#xff0c;可以在 Mac 上打开、编辑、复制、移动…

sudo command not found

文章目录 一句话Intro其他操作 一句话 sudo 某命令 改成 sudo -i 某命令 试试。 -i 会把当前用户的环境变量带过去&#xff0c;这样在sudo的时候&#xff0c;有更高的权限&#xff0c;有本用户的环境变量(下的程序命令)。 -i, --login run login shell as the target user; a …

Javaweb之Web后端开发总结的详细解析

4. Web后端开发总结 到此基于SpringBoot进行web后端开发的相关知识我们已经学习完毕了。下面我们一起针对这段web课程做一个总结。 我们来回顾一下关于web后端开发&#xff0c;我们都学习了哪些内容&#xff0c;以及每一块知识&#xff0c;具体是属于哪个框架的。 web后端开…

MySQL 使用 pt-archiver 删除数据

文章目录 前言1. 环境准备1.1 模拟造数1.2 工具安装 2. 删除数据2.1 批次删除表2.2 原理解析2.3 批处理思路 后记 前言 在线核心业务都会有日志表&#xff0c;随着业务持续运行&#xff0c;日志表每天都在增大&#xff0c;最后超过阈值触发空间使用率告警。DBA 处理空间告警时…

调用Mybatis plus中的saveBatch方法报找不到表的问题

1.问题现象 在用Mybatis plus开发的项目中&#xff0c;用自带的API批量保存的方法saveBatch操作时&#xff0c;发现报没有找到表的错误。 错误日志截图如下&#xff1a; 表实际是存在的&#xff0c;且发现其他的方法都没有问题&#xff0c;包括save、update等单个的方法&…

第十五届蓝桥杯青少组STEMA测评SPIKE初级真题试卷 2024年1月

第十五届蓝桥杯青少组STEMA测评SPIKE初级真题试卷 2024年1月 ​​​​​​​ 来自&#xff1a;6547网 http://www.6547.cn/doc/vywur8eics

数智化转型的新篇章:企业如何在「数据飞轮」理念中寻求增长?_光点科技

在当今的数字化浪潮中&#xff0c;企业对数据的渴求与日俱增。数据不再仅是辅助决策的工具&#xff0c;而是成为推动业务增长的核心动力。自从「数据中台」概念降温后&#xff0c;企业纷纷探寻新的数智化路径。在这个过程中&#xff0c;「数据飞轮」作为一种新兴的理念&#xf…

鸿蒙NEXT实战开发:【截屏】

展示全屏截图和屏幕局部截图。通过[screenshot]模块实现屏幕截图 &#xff0c;通过[window]模块实现隐私窗口切换&#xff0c;通过[display]模块查询当前隐私窗口。 效果预览 全屏截图局部截图选择区域局部截图 使用说明&#xff1a; 点击右上角图标打开弹窗&#xff0c;选…

【笔记】Android 漫游定制SPN定制有关字段

一、SPN模块简介 【笔记】SPN和PLMN 运营商网络名称显示 Android U 配置 WiFiCalling 场景下PLMN/SPN 显示的代码逻辑介绍 【笔记】Android Telephony 漫游SPN显示定制&#xff08;Roaming Alpha Tag&#xff09; 二、相关配置字段 non_roaming_operator_string_array 是否…

Linux系统——Keepalive群集部署及认识

目录 一、Keepalive的认识 1.Keepalive基础——VRRP 2.Keepalived工具介绍 2.1Keepalived介绍 2.2Keepalived架构 2.2.1用户空间核心组件 2.2.2WatchDog&#xff1a;监控进程&#xff08;整个架构是否有问题&#xff09; 二、安装Keepalived及相关配置文件详解 1.安装…

下属OKR与上级OKR对齐时,有几种方法?

下属的OKR&#xff08;Objectives and Key Results&#xff0c;即目标与关键成果&#xff09;与上级的OKR对齐&#xff0c;是确保组织目标一致性和团队协同工作的关键步骤。以下是几种常用的对齐方法&#xff1a; 直接映射法&#xff1a;下属的OKR直接反映并支撑上级的OKR。例如…

【Linux篇】gdb的使用

&#x1f49b;不要有太大压力&#x1f9e1; &#x1f49b;生活不是选择而是热爱&#x1f9e1; &#x1f49a;文章目录&#x1f49a; 1. 背景知识2. 使用 1. 背景知识 1. 程序发布的方式有两种&#xff0c;debug模式和release模式 2. Linux下&#xff0c;gcc和g编译生成的可执行…