Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

34 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

物品"复活"软件设计文档

1. 系统概述

1.1 项目背景

针对大学生群体开发的闲置物品交易平台,解决学生宿舍空间有限、物品处置困难的问题。

1.2 设计目标

  • 提供简单易用的物品信息管理功能
  • 支持用户权限管理系统(管理员和普通用户)
  • 支持动态物品类型管理(管理员可自定义物品类型和属性)
  • 支持物品分类管理(食品、书籍、工具等)
  • 不同类别物品支持特定属性
  • 保证基础数据安全性
  • 支持命令行交互操作
  • 具备良好的可扩展性

1.3 设计原则

  • 功能优先:开发初期以实现核心功能为主
  • 适度封装:在保证功能完整性的前提下进行基础封装
  • 用户体验:提供清晰的交互指引和错误处理
  • 安全平衡:在安全性和开发效率间取得平衡
  • 面向对象:使用继承和多态实现物品分类系统

2. 用户系统

2.1 用户类型

系统支持两种类型的用户:

  1. 管理员(Admin)

    • 可以设置新的物品类型(定义物品类型的名称和各个属性)
    • 可以修改物品类型
    • 可以审批普通用户的注册申请
    • 拥有普通用户的所有功能
  2. 普通用户(Normal User)

    • 需要注册(填入基本信息,包括住址、联系方式等)
    • 需要管理员批准后才能成为正式用户
    • 可以添加物品(先选择物品类型,再填入物品信息)
    • 可以搜索物品(先选择类型,再输入关键字进行搜索)
    • 可以删除物品
    • 可以查看所有物品

2.2 User类(用户类)

职责:管理用户信息和权限

属性封装:

  • 用户名(私有字符串)
  • 密码(私有字符串)
  • 用户类型(私有UserType枚举:ADMIN或NORMAL)
  • 用户状态(私有UserStatus枚举:PENDING待审批或APPROVED已批准)
  • 住址(私有字符串)
  • 电话(私有字符串)
  • 邮箱(私有字符串)

方法设计:

  • 构造方法:初始化用户信息
  • 信息获取方法:提供安全的属性访问
  • 状态管理方法:批准/拒绝用户
  • 权限检查方法:判断是否为管理员、是否已批准

2.3 UserManager类(用户管理类)

职责:管理用户注册、登录和审批

方法设计:

  • 用户注册:registerUser() - 普通用户注册,初始状态为待审批
  • 用户登录:login() - 验证用户名和密码,只有已批准用户才能登录
  • 查找用户:findUser() - 根据用户名查找用户
  • 获取待审批用户:getPendingUsers() - 返回所有待审批的用户列表
  • 批准用户:approveUser() - 管理员批准用户注册

2.4 默认管理员账户

系统初始化时自动创建一个默认管理员账户:

  • 用户名:admin
  • 密码:admin123
  • 状态:已批准

3. 物品类型系统

3.1 物品类型管理

系统支持管理员动态定义物品类型及其属性。每个物品类型可以包含多个属性,每个属性可以是以下类型之一:

  • 字符串(STRING)
  • 整数(INTEGER)
  • 浮点数(FLOAT)

3.2 ItemType类(物品类型类)

职责:定义物品类型的结构

属性封装:

  • 类型名称(私有字符串)
  • 属性列表(私有vector)

方法设计:

  • 添加属性:addAttribute() - 为物品类型添加属性
  • 修改属性:modifyAttribute() - 修改指定索引的属性
  • 删除属性:removeAttribute() - 删除指定索引的属性
  • 显示信息:printType() - 打印物品类型及其属性信息

3.3 ItemTypeManager类(物品类型管理类)

职责:管理所有物品类型

方法设计:

  • 添加物品类型:addItemType() - 创建新的物品类型
  • 查找物品类型:findItemType() - 根据名称查找物品类型
  • 为类型添加属性:addAttributeToType() - 为指定类型添加属性
  • 修改类型属性:modifyAttributeInType() - 修改指定类型的属性
  • 选择类型:selectType() - 在界面中选择物品类型

3.4 默认物品类型

系统初始化时自动创建以下默认物品类型:

  1. 食品

    • 保质期(字符串)
    • 数量(整数)
  2. 书籍

    • 作者(字符串)
    • 出版社(字符串)
  3. 工具

    • 工具状态(字符串)
  4. 其他

    • 无特定属性

4. 类设计规范

4.1 Contacts类(联系人信息)

职责:管理用户联系信息

属性封装:

  • 姓名(私有字符串)
  • 电话(私有字符串)
  • 邮箱(私有字符串)

方法设计:

  • 构造方法:初始化所有联系信息(姓名、电话、邮箱)
  • 信息获取方法:提供安全的属性访问(getName, getNum, getEmail)
  • 显示方法:格式化输出联系人信息
  • 信息修改方法:支持更新联系信息

4.2 Item类(物品基类)

职责:管理物品公共信息

属性封装:

  • 物品名称(保护字符串)
  • 物品说明(保护字符串)
  • 物品所在地址(保护字符串)
  • 联系人信息(保护Contacts对象)
  • 物品类别(保护ItemCategory枚举,用于向后兼容)
  • 物品类型名称(保护字符串,动态类型)

方法设计:

  • 构造方法:初始化物品完整信息
  • 信息获取方法:提供安全的属性访问
  • 显示方法:虚函数,支持多态显示
  • 信息修改方法:支持更新物品信息
  • 类型名称方法:获取和设置物品类型名称

4.3 物品派生类

为了向后兼容,系统保留了原有的物品派生类(FoodItem、BookItem、ToolItem、OtherItem)。新系统使用Item类的typeName字段来标识物品类型,同时保留了原有的category枚举字段。

4.4 Inventory类(物品列表)

职责:核心业务逻辑处理

属性封装:

  • 物品列表(私有vector<Item*>,使用指针支持多态)

方法设计:

  • 添加物品:验证后加入列表(支持多态)
  • 删除物品:基于名称的安全删除,自动释放内存
  • 查询物品:支持名称搜索
  • 列表显示:遍历显示所有物品信息
  • 按类型和关键字搜索:searchByTypeAndKeyword() - 先按类型筛选,再按关键字在物品名称、说明和联系人名称中匹配
  • 析构函数:自动释放所有动态分配的内存

4.5 Interface类(命令行接口)

职责:用户交互处理

属性封装:

  • 物品管理器实例(私有Inventory对象)
  • 联系人列表(私有vector)
  • 用户管理器实例(私有UserManager对象)
  • 物品类型管理器实例(私有ItemTypeManager对象)
  • 当前登录用户(公共User*指针)

方法设计:

  • 用户登录:login() - 验证用户凭据并登录
  • 用户注册:registerUser() - 处理新用户注册
  • 菜单显示:showMainMenu(), showAdminMenu(), showNormalUserMenu() - 根据不同用户类型显示不同菜单
  • 管理员功能:
    • adminManageItemTypes() - 管理物品类型
    • adminAddItemType() - 添加新物品类型
    • adminModifyItemType() - 修改物品类型
    • adminApproveUsers() - 审批用户
  • 普通用户功能:
    • normalUserAddItem() - 添加物品(先选择类型)
    • normalUserSearchItem() - 搜索物品(先选择类型,再输入关键字)
  • 通用功能:entrySelect() - 处理用户选择的操作

5. 物品信息结构

5.1 公共信息

所有物品都包含以下公共信息:

  • 物品名称
  • 物品说明
  • 物品所在地址
  • 物品类型名称(动态类型)
  • 联系人姓名(来自用户注册信息)
  • 联系人手机(来自用户注册信息)
  • 联系人邮箱(来自用户注册信息)

5.2 类型特定属性

物品的特定属性由管理员在定义物品类型时指定。默认类型包括:

食品类

  • 保质期(字符串)
  • 数量(整数)

书籍类

  • 作者(字符串)
  • 出版社(字符串)

工具类

  • 工具状态(字符串,如:全新、良好、需维修等)

其他类别

  • 仅包含公共信息

管理员可以根据需要创建新的物品类型,并为每个类型定义不同的属性。

6. 安全设计

6.1 封装策略

  • 所有类属性设为私有或保护
  • 通过公共方法提供受控访问
  • 使用智能指针或手动内存管理确保资源安全

6.2 数据验证

  • 输入参数基础验证
  • 集合操作边界检查
  • 空值处理机制
  • 类别选择验证
  • 用户登录验证
  • 权限检查

6.3 异常处理

  • 用户输入错误友好提示
  • 系统异常基础捕获
  • 操作失败明确反馈
  • 内存管理安全(析构函数自动释放)

6.4 多态设计

  • 使用虚函数实现多态
  • 基类指针存储派生类对象
  • 正确调用派生类的重写方法

6.5 用户权限控制

  • 普通用户需要管理员批准后才能使用系统
  • 只有管理员可以管理物品类型和审批用户
  • 所有用户操作都需要先登录

7. 使用方法

7.1 编译环境

Windows端

配置好cmake后,在文件根目录运行:

make run
mingw32-make run    // 如果直接执行make报错

Mac端

配置cmake:

brew install cmake make

运行:

make run

7.2 使用说明

7.2.1 首次使用

  1. 启动程序后,会显示登录/注册菜单
  2. 默认管理员账户
    • 用户名:admin
    • 密码:admin123

7.2.2 用户注册(普通用户)

  1. 选择菜单项 2(注册)
  2. 依次输入:
    • 用户名
    • 密码
    • 住址
    • 联系电话
    • 邮箱
  3. 注册成功后,需要等待管理员审批

7.2.3 用户登录

  1. 选择菜单项 1(登录)
  2. 输入用户名和密码
  3. 只有已批准的用户才能成功登录

7.2.4 管理员功能

管理员登录后可以:

  1. 添加物品:选择菜单项1,先选择物品类型,然后输入物品信息
  2. 删除物品:选择菜单项2,输入要删除的物品名称
  3. 查看所有物品:选择菜单项3,显示所有物品的详细信息
  4. 搜索物品:选择菜单项4,先选择物品类型,再输入关键字
  5. 管理物品类型(菜单项5):
    • 查看所有物品类型
    • 添加新物品类型(可以定义属性)
    • 修改物品类型(添加或修改属性)
  6. 审批用户(菜单项6):
    • 查看待审批用户列表
    • 批准用户注册申请
  7. 退出登录:输入 e 退出登录

7.2.5 普通用户功能

普通用户登录后可以:

  1. 添加物品(菜单项1):

    • 先选择物品类型(从系统定义的类型中选择)
    • 输入物品名称
    • 输入物品说明
    • 输入物品所在地址
    • 系统自动使用用户注册时的联系信息
  2. 删除物品(菜单项2):

    • 输入要删除的物品名称
  3. 查看所有物品(菜单项3):

    • 显示所有物品的详细信息
  4. 搜索物品(菜单项4):

    • 先选择物品类型
    • 输入搜索关键字(会在物品名称、说明和联系人名称中进行匹配)
  5. 退出登录:输入 e 退出登录

7.2.6 物品类型管理(管理员)

  1. 选择菜单项 5(管理物品类型)
  2. 可以选择:
    • 查看所有物品类型
    • 添加新物品类型:
      • 输入类型名称
      • 为类型添加属性(属性名称和类型:字符串/整数/浮点数)
    • 修改物品类型:
      • 选择要修改的类型
      • 添加新属性或修改现有属性

7.2.7 用户审批(管理员)

  1. 选择菜单项 6(审批用户)
  2. 查看待审批用户列表
  3. 输入要批准的用户名
  4. 用户被批准后即可登录使用系统

7.3 注意事项

  • 所有输入字段不能为空
  • 物品名称用于唯一标识物品
  • 普通用户必须等待管理员批准后才能登录
  • 搜索功能支持不区分大小写的关键字匹配
  • 程序退出时会自动释放所有内存
  • 管理员默认账户请及时修改密码

7.4 搜索功能说明

普通用户搜索物品时:

  1. 需要先选择物品类型(从系统中定义的物品类型中选择)
  2. 然后输入搜索关键字
  3. 系统会在以下字段中匹配关键字:
    • 物品名称
    • 物品说明
    • 联系人名称(物品发布者的用户名)
  4. 匹配是不区分大小写的

8 UML图

所有图源在/doc/out目录下

8.1 用例图

alt text

8.2 顺序图

alt text alt text alt text alt text

8.3 类图

alt text

About

sjtu cs3331 lab

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages