walotta的BookStore软件开发文档

  • 作者:walotta(韦中敬)
  • version:1.0

main.cpp

  • 执行初始化,调用init(),若为初次运行则生成必要文件,建立用户
  • 运行BookStore后台

BPlusTree

  • 由一个h组成

  • 设计为一个模版类,含有参数Size(块的大小限制),初始化的时候提供Name

  • 其功能为提供一个B+树类(BPlusTree),内部含有StoragePool类对象进行存储,实现keyid的映射

  • 该类的功能为对一个数据存储文件建立索引(即建立一棵B+树),并负责生成一个索引文件,进行储存

  • 该类内部只实现对于特定key(MyString)返回其在StoragePool中的id值

  • 含有一个头数据点,指明头数据在储存池中的id

  • 储存为块状储存,保证存储块大小固定,即提供一个数据类存储

  • 块的头部含有一个bool值储存是否为叶节点(IfLeaves)true为叶节点,叶节点维护双向链表结构

    接口 功能
    insert(key,id) 插入数据点,构建keyid的对应关系
    remove(key,id) 删除key对应的数据点(id决定)
    find(key) 查找key对应的数据,返回id,属性为vector

StoragePool

  • 为储存池类,进行底层对于书的信息存储文件的操作,实现O(1)的读取删除,并维护储存空间的回收

  • 提供一个额外的一个块的零碎文件存储

  • 设计为模版类,实例化时要求为其指明存储的文件名(FILENAME)与储存的块的类型(T)

  • 对外接口类似于虚拟内存,提供一个数字寻址的功能,对于给定的id值返回其对应的储存块

  • 内部有一个储存块指针,向文件中写入储存块,用id*size进行寻址

  • 在储存池头部有一个head数据点,用于储存下一个可用块的id,若为-1,说明应当在文件末写入

  • 删除块时,将被删除的块的id写入head数据点,在被删除块的位置写入原head

  • 写入块时,先查询head数据点,若为覆写,则将head的值修改

    接口 功能
    add(const T &) T对应的数据写入文件,并返回储存位置对应的id
    remove(id) 删除id对应的块
    update(id,T) 更新id对应块
    get(id) 返回id对应的块对象

| readExtraBlock() | 读入存储的额外块 | | writeExtraBlock(extraBlock) | 将额外块写入文件 |


FileStorage

  • 由一个h组成

  • 设计为模版类,功能为实现对文件的单或多索引储存,实例化时要求给出存储的类的类型(T)、并给出一个vector给出所有的key的名字,其中以第一个为主值、给出储存文件名

  • 要求存在一个key属性为储存值存在且唯一的KeyName,为MainKey

  • 内部包含多个BPlusTree类对象,一个StoragePool类的存储类型实例,实现将数据的存入、删除、查询、修改

    接口 功能
    Insert(T,MainKey) 插入一个数据,并维护主索引,并选中数据
    Delete(MainKey) 根据主值删除,仅维护主值的搜索树
    Find(KeyType,Key) 根据提供的Key寻找,返回一个对象的vector
    Give(MainKey) 根据主值返回对象
    Give() 返回当前选中的对象
    GiveMainKey() 返回当前对象的主值
    Select(MainKey) 选中主值对应的对象
    Update(T,MainKey) 更新选中块,同步维护主值索引
    Update(T) 更新选中块,保证主值不变
    Update(MainKey,T) 更新主值对于的块,保证不改变主值
    AddKey(keyType,key) 为当前选中的对象增加key属性,不能修改主值
    RemoveKey(keyType,key) 删除当前选中对象的key属性,不能删除主值
    HaveSelect() 返回当前是否有选中

BookManage

  • 含有FileStorage<BookBlock>对象

  • 含有一个BookBlock类,储存某一本书的相关信息,并operator <用于sort,依据为ISBN

  • PS:keyType总共有ISBN、name、author、keyword4种,其中ISBNMainKey

  • 添加图书相关接口

    接口 功能
    AddBook(number) 添加选中的书的指定数量
    DeleteBook(number) 删除选中的书的指定数目
    DeleteBook(ISBN,number) 删除ISBN指定的书的指定数量
    Select(ISBN) 选中书本,若无则创建
    UpdateBook(NewBookBlock) 删除选中的原书数据,换为新数据,同时更新索引
    GetBook() 返回选中的块对象
    show() 展示所有书,cout输出
    show(keyType,key) 根据key展示所有书,cout输出

UserManage

  • 含有FileStorage<UserBlock,id>对象,与一个UserLog对象用于读取、储存用户的日志

  • 增加用户管理相关接口

  • 实现栈管理的用户登录,储存选中的图书的存储空间的id

  • 初始化接受文件,若不存在则新建root用户

    接口 功能
    Login 登陆
    Logout 登出
    UserAdd 添加用户,检查权限
    DeleteUser 删除用户,检查权限
    ResetPasswd 重设密码,检查权限
    NowPrivilege 返回当前权限
    NowUserName 返回当前用户名
    ShowLog() 展示当前用户的日志到cout
    ShowLog(User) 展示特定用户的操作日志,检查权限
    AskPrivilege(pri) 返回bool显示指定权限当前是否具有,具有返回true

CMD

  • 提供一个类进行指令的读入与部分输出,负责用户交互,与其余各个底层类通讯

  • 进行log的管理,分别将数据储存到MainLog与用户的个人日志

  • 进行指令的分割与异常处理,报错信息为Invalid\n

    指令类型 功能
    su 登陆用户,高权限到低权限不需要密码
    logout 登出当前用户
    useradd 添加用户
    register 注册一个权限1用户
    delete 删除用户,检查是否有删除权限
    passwd 重设密码
    select 选中书
    modify 更新书的内容,权限管理
    import 进货书,权限管理
    show 查询书
    show finance 输出买入卖出记录,会含有次数参数,权限管理
    buy 购买书,输出购买花费
    report finance 生成财务报表,权限管理
    report employee 生成员工工作情况表,权限管理
    log 生成工作日志,权限管理
    report myself 返回员工的操作记录,权限管理
    quit 退出程序,读到EOF也执行此条指令
    exit quit

Log

  • 用于储存日志,并生成日志文件,使用ASCII文件储存,为模版类,要求给出储存信息的文件名

  • 初始化函数调用文件,若文件不存在则新建文件,若文件存在则将指针定位到末尾

  • 细节:对于用户登录顶格,其余做\t缩进

    接口 功能
    write(string) 将字符串指令写入文件
    read() 输出整个文件到cout

UserLog

  • 生成用户日志用于储存,使用BPlusTree

  • 储存一个块,含有用户名、用户行为

    接口 功能
    write(UserName,CMD) 将用户的行为写入文件
    print(UserName) 搜索并输出某个用户的所有行为

Finance

  • 用于储存财务表,维护每次交易后的前缀和

  • 内部实现一个储存类,可以用序号访问,返回当前存储到的最后位置

    接口 功能
    income(sum) 建立一个进账记录
    outcome(sum) 建立一个出账记录
    read() 输出全部的收支到cout

| read(time) | 追溯time次输出收支 |


WISH YOU CODING WITH HAPPINESS