3.1
Contributor | BackEnd | FrontEnd |
---|---|---|
WYH | 逻辑 | 前后端交互 |
JL | B+ 树 | 前端设计 |
缓存,空间回收,命令行交互,前端
utils.hpp
实现一些工具函数hash.hpp
实现 hash 函数linked_hashmap.hpp
实现 hashmapvector.hpp
实现 vectorstorage.hpp
实现文件读写类BPlustree.hpp
实现 B+ 树user.hpp
包含与 user 有关的类train.hpp
包含与 train 有关的类order.hpp
包含与 order 有关的类rollback.hpp
包含 rollback 相关的类
manager.hpp
负责命令的执行main.cpp
火车票系统的调用
设以下代码 class 中的函数均为 public 类型
- 提供了一个模版类file class进行文件读写。
- 顺序存储数据并返回地址。
- 支持对特定地址的内容进行文件读写
class Storage {
Storage(std::string filename); // 存储文件名
void read(T &, int); // 实现从文件 index 位置读入 value
void write(T &, int); // 实现将 value 写入 index 位置
void update(T &, int); // 更新
void ReadInfo(int &, int); // 读入文件头信息
void WriteInfo(int , int); // 写入文件头信息
};
class FileStack {
FileStack(std::string filename); // 存储文件名
void push(const T &);
void gettop(T &); // 取堆顶元素
void pop();
bool empty();
int size();
};
- 实现模版类的 key -> value 的映射,支持关键字查询,删除,修改
- 带有 Cache
class map {
map(const std::string &); // 用文件名 初始化
void Getone(const T &key, S &var); // 查询 key 对应的值,存储在 var 中
void Get(const T &l, const T &r, vector<S> &var); // 查询 l 到 r 之间的所有值,存储在 var 中。
void Insert(const T &, const S &);
void Remove(const T &); // 删除 key 值
void Modify(const T &); // 修改 key 值
bool count(const T &); // 查询 key 值是否存在
};
实现类似于 std::vector 的数据结构
实现类似于 std::unordered_map 的数据结构
class Parse {
void read(char c_); // 读入字符串,以 c_ 为分隔符
void set(char c_, const std::string &str_); // 设置字符串 str_,以 c_ 为分隔符
std::string nextToken(); // 获取下一个信息串
};
class Cmd {
std::string get(char ch) const; // 返回 -ch 的值
void set(char ch, const std::string &str); // 将 -ch 的值设为 str
bool have(char ch) const; // 判断 -ch 是否有值
void reset(); // 将所有值清零
};
struct Varchar {
size_t var; // 储存字符串的 hash 值
Varchar(const std::string &str);
};
class Date {
int now; // 01-01 00:00 至 now 时刻所经过的分钟数
Date(int now_);// 用 now 构造类
Date(int mm, int dd, int hr = 0, int mi = 0); // 用 mm-dd hr:mi 构造类
void set_mmdd(const std::string &str); // 用 mm-dd 字符串构造 整数天的类
void addDay(int x = 1); // 自增 x 天
std::string get_mmdd() const; // 返回 mm-dd 形式的字符串
std::string get_hrmi() const; // 返回 hr:mi 形式的字符串
std::string get_mmddhrmi() const; // 返回 mm-dd hr:mi 形式的字符串
};
class Manager {
std::string add_user(Cmd);
std::string query_profile(const Cmd &);
std::string modify_profile(const Cmd &);
std::string add_train(const Cmd &);
std::string release_train(const Cmd &);
std::string query_train(const Cmd &);
std::string query_ticket(const Cmd &);
std::string query_transfer(const Cmd &);
std::string buy_ticket(const Cmd &);
std::string refund_ticket(const Cmd &);
std::string query_order(const Cmd &);
std::string login(const Cmd &);
std::string logout(const Cmd &);
std::string clean();
std::string rollback();
};
class User {
char username[USERNAME_LEN];
char name[NAME_LEN]; //储存中文姓名,假设每个汉字占 3 字节
char mailAddr[PASSWORD_LEN];
int privilege;
size_t usernameHash, passwordHash; //存储密码的 hash 值
};
class Train {
char trainID[TRAINID_LEN];
size_t trainIDhash;
int stationNum;
int seatNum;
char stationID[STATION_NUM][STATIONID_LEN]; // 储存每个站的中文名,假设每个汉字占 3 字节
int prices[STATION_NUM]; // 储存站 i 到站 i+1 的票价
int startTime; // 始发站发车的时间离当天 0 点经过的分钟数
int arriveTime[STATION_NUM], leaveTime[STATION_NUM]; // 第 i 站的到达和发车时间
Date startDate, endDate;
char type;
bool released;
};
class Order {
char trainID[TRAINID_LEN];
char startStation[STATIONID_LEN];
char endStation[STATIONID_LEN];
Date day; // 出发日期
Date leavingTime; // 开车时间
Date arrivingTime; // 到达时间
int ids; // 始发站编号
int idt; // 终到站编号
int prices, num;
int status; // 订单状态
};
rollback 的实现依托 BPTree,需要将对 BPTree 的每个命令(插入、删除、修改)记录在文件读写栈中,需要回溯时依次读取并反向操作。
Version 1.0
- Search -> Search Page
- Login -> Sign in/up Page
- search tickets
- search trains
- input username & password -> Index Page
- Query trains
- Query trains(transfer)
- Buy tickets
- Add trains
- Find users
- Add users
- Change information
返回新界面: Python + flask (异步:AJAX)
客户端与服务器命令传输: socket(GET/POST)
服务器:网络服务器与数据服务器合并
服务器内处理:通过 Socket 实现 c++ 与 python 进程之间的通信
命令转义: Python 处理接收到的网页命令并转化为 c++ 程序认可的字符串命令