Files
BH-Bookstore-2023/docs/develop/开发文档.md

7.7 KiB
Raw Blame History

未完待续,别扣我分 尚未定稿的内容见《总体设计文档》 项目名称BookStore

作者Zhuang Yumin

程序功能概述

此项目分为前端和后端。后端即本次大作业的主体部分接受文本格式的命令并以文本格式返回响应前端则以WebUI的形式向用户提供操作界面。

主体逻辑说明

业务流程图:业务流程图加载中……

数据流图:数据流图加载中……

系统结构图:系统结构图加载中……

详见需求分析文档总体设计文档

代码文件结构

  • backend/include:后端头文件
  • backend/src:后端实现文件
  • frontend/WebWebUI相关
  • frontend/client:客户端
  • external/clipp:第三方库,解析命令行参数
  • external/json第三方库为调试器提供json支持虽然基本没啥用

各个类的接口及成员说明

DriveArray

提供文件存储支持有缓存等元数据在兼容MemoryRiver的基础上提供下列接口

  • bool IsOpen()
  • void OpenFile(const std::string &__file_name)
  • void CloseFile()
  • void LoadInfoTo(int *dest)批量读取info
  • void WriteInfoFrom(int *src)批量写入info
  • void FetchAll(std::vector<T> &vec):遍历并获取所有元素

key2index

提供从字符串映射到一个值的支持有内存中的散列表等内部数据相当于multimap有如下接口

  • void OpenFile(const std::string __file_name)
  • void Insert(const std::string &str, int val)
  • void Delete(const std::string &str, int val)
  • std::vector<int> Find(const std::string &str)

数据库

三个数据库的声明如下,相关信息见注释:

class UserDataBase {
  DriveArray<UserItemClass> full_user_data;
  String2Index user_name2index;

 public:
  UserDataBase() = default;
  void Open(std::string file_name);
  bool PAM(const std::string &user_id, const std::string &password); // 登陆验证
  int GetPrevilege(const std::string &user_id); // 获取用户权限,用户不存在时返回-1
  void AddUser(const std::string &user_id, const std::string &password,
               const std::string &user_name, int privilege); // 新增用户
  void DeleteUser(const std::string &user_id); // 删除用户
  void ChangePassword(const std::string &user_id, const std::string &password); // 修改密码
};
class BookDataBase {
  DriveArray<BookItemClass> full_book_data;
  String2Index ISBN2index, name2index, author2index, keyword2index;

 public:
  void Open(std::string file_name);
  bool HaveISBN(const std::string &ISBN); // 判断是否有
  bool HaveISBN(const std::string &ISBN, BookItemClass &ret); // 判断是否有并且获取内容
  void CreateEmptyBook(const std::string &ISBN); // 新建一个书
  void QueryBook(const std::string &ISBN, const std::string &name,
                 const std::string &author, const std::string &keyword,
                 std::vector<BookItemClass> &ret);
  // 查询书籍,没有的关键词直接置为空
  void ModifyInfo(const std::string &ISBN, const std::string &new_ISBN,
                  const std::string &name, const std::string &author,
                  const std::string &keyword, double price,
                  int quantity_remain);
  // 修改信息,当一个字段无需修改时,字符串设为空,数值设为-1
  std::string GetISBN(int bid);
  // 获取某个bid当ISBN变化后唯一确定一本书的方式对应的图书的ISBN号
};
class LogDataBase {
  DriveArray<FinanceItemClass> finance_data;
  DriveArray<OperationLogItemClass> operation_log_data;
  int finance_operation_count;

 public:
  ~LogDataBase() { finance_data.write_info(finance_operation_count, 1); }
  void Open(std::string file_name);
  void AddSell(int book_id, int quantity, double total_price); // 添加一笔销售记录
  void AddImport(int book_id, int quantity, double total_price); // 添加一笔进货记录
  std::pair<double, double> QueryFinance(int count = -1); // 查询最近count次交易的资金流动概要
  void QueryFinance(int count, std::vector<FinanceItemClass> &ret);
  int TotalFinanceOperationCount() noexcept { return finance_operation_count; } // 查询总交易笔数
};

引擎

下辖三个数据库实例,和一个登录计数器,并存储是否为服务器模式以及数据文件存放位置。
对外提供解析并执行命令的接口,返回值是一个std::vector<std::string>,每一个std::string对应输出中的一行

class BookStoreEngineClass {
  std::string config_dir;
  UserDataBase user_data_base;
  BookDataBase book_data_base;
  LogDataBase log_data_base;
  std::unordered_map<std::string, int> login_count;
  bool is_server;

 public:
  BookStoreEngineClass() = delete;
  BookStoreEngineClass(std::string __config_dir, bool __is_server);
  std::vector<std::string> Execute(
      const std::string &cmd,
      std::stack<std::pair<std::string, int>> &login_stack);
  std::vector<std::string> ExecuteSu(
      const std::string &cmd,
      std::stack<std::pair<std::string, int>> &login_stack);
  std::vector<std::string> ExecuteLogout(
      const std::string &cmd,
      std::stack<std::pair<std::string, int>> &login_stack);
  std::vector<std::string> ExecuteRegister(
      const std::string &cmd,
      std::stack<std::pair<std::string, int>> &login_stack);
  std::vector<std::string> ExecutePasswd(
      const std::string &cmd,
      std::stack<std::pair<std::string, int>> &login_stack);
  std::vector<std::string> ExecuteUserAdd(
      const std::string &cmd,
      std::stack<std::pair<std::string, int>> &login_stack);
  std::vector<std::string> ExecuteDelete(
      const std::string &cmd,
      std::stack<std::pair<std::string, int>> &login_stack);
  std::vector<std::string> ExecuteShow(
      const std::string &cmd,
      std::stack<std::pair<std::string, int>> &login_stack);
  std::vector<std::string> ExecuteBuy(
      const std::string &cmd,
      std::stack<std::pair<std::string, int>> &login_stack);
  std::vector<std::string> ExecuteSelect(
      const std::string &cmd,
      std::stack<std::pair<std::string, int>> &login_stack);
  std::vector<std::string> ExecuteMOdify(
      const std::string &cmd,
      std::stack<std::pair<std::string, int>> &login_stack);
  std::vector<std::string> ExecuteImport(
      const std::string &cmd,
      std::stack<std::pair<std::string, int>> &login_stack);
  std::vector<std::string> ExecuteShowFinance(
      const std::string &cmd,
      std::stack<std::pair<std::string, int>> &login_stack);
  std::vector<std::string> ExecuteLog(
      const std::string &cmd,
      std::stack<std::pair<std::string, int>> &login_stack);
  std::vector<std::string> ExecuteReport(
      const std::string &cmd,
      std::stack<std::pair<std::string, int>> &login_stack);
};

文件存储说明

默认往当前目录下存放文件,但也可以指定。

  • book.author:书籍数据库的作者名索引
  • book.isbn书籍数据库的ISBN索引
  • book.keyword:书籍数据库的关键词索引
  • book.name:书籍数据库的书名索引
  • book.full:书籍数据库的完整信息
  • user.n2i:用户数据库的索引
  • user.full:用户数据库的完整信息
  • log.finance:交易日志
  • log.log:完整操作日志

其他补充说明

主程序命令行交互方式:

SYNOPSIS
        ./code [-s] [-c <config directory>]

OPTIONS
        -s, --server
                    run as server

        -c, --config
                    use config directory