/* * @Author: Student author@example.com * @Date: 2025-01-01 14:58:43 * @LastEditors: Student author@example.com * @LastEditTime: 2025-01-03 10:52:29 * @FilePath: \LibraryManageSystem\include\Member.h * @Description: Coding with UTF-8 * * Copyright (c) 2025 by Student, All Rights Reserved. */ #ifndef MEMBER_H #define MEMBER_H #include "STL/LinkList.h" #include "Constants.h" #include #include "Book.h" #include #include #include enum class MemberType { ADMIN, // 管理员 NORMAL // 普通用户 }; enum class MemberLevel { LEVEL_1 = 1, // 可借3本,借期15天 LEVEL_2 = 2, // 可借5本,借期30天 LEVEL_3 = 3 // 可借8本,借期45天 }; struct BorrowRecord { std::string bookId; time_t borrowDate; time_t dueDate; time_t returnDate{0}; // 初始化为0表示未归还 }; class Member { private: friend class MemberManager; std::string id; // 用户ID std::string name; // 用户名 std::string phone; // 手机号 std::string password; // 密码 MemberType type; // 用户类型 MemberLevel level; // 会员等级 int creditScore; // 信用分数 // 借阅相关 LinkList borrowedBooks; // 当前借阅的书籍ID列表 LinkList borrowDates; // 对应的借阅日期 LinkList borrowHistory; // 历史借阅记录 LinkList bookRatings; // 用户对书籍的评分记录 // 用户偏好 LinkList preferredCategories; // 偏好的图书类别 double categoryWeights[8]; // 各类别的权重(对应BookCategory枚举) // 预约相关 LinkList reservedBooks; // 预约图书列表 std::vector borrowRecords; // 当前借阅记录 // 获取借阅记录文件路径 std::string getBorrowRecordsPath() const { return std::string(USER_DATA_DIR) + id + ".csv"; } // 返回用户借阅记录文件的路径 public: Member(const std::string &id, const std::string &name, const std::string &phone, const std::string &password, MemberType type = MemberType::NORMAL); // 创建新会员对象 // Getter方法 std::string getId() const { return id; } // 获取用户ID std::string getName() const { return name; } // 获取用户名 std::string getPhone() const { return phone; } // 获取手机号 MemberType getType() const { return type; } // 获取用户类型 MemberLevel getLevel() const { return level; } // 获取会员等级 int getCreditScore() const { return creditScore; } // 获取信用分数 std::string getPassword() const { return password; } // 获取密码 // 借阅相关方法 bool borrowBook(const std::string &bookId); // 借阅图书 bool returnBook(const std::string &bookId); // 归还图书 bool hasBorrowed(const std::string &bookId) const; // 检查是否已借阅某本图书 const LinkList &getBorrowHistory() const { return borrowHistory; } // 获取借阅历史 // 评分相关 void rateBook(const std::string &bookId, int rating); // 为图书评分 int getBookRating(const std::string &bookId) const; // 获取对某本图书的评分 // 用户偏好相关 void updatePreferredCategories(); // 根据借阅历史更新偏好 void addPreferredCategory(BookCategory category); // 添加偏好类别 bool isPreferredCategory(BookCategory category) const; // 检查是否为偏好类别 double getCategoryWeight(BookCategory category) const; // 获取类别权重 // 用户信息管理 bool verifyPassword(const std::string &inputPassword) const; // 验证密码 void updatePassword(const std::string &newPassword); // 更新密码 void updatePersonalInfo(const std::string &newName, const std::string &newPhone); // 更新个人信息 // 等级和信用管理 void updateCreditScore(int change); // 更新信用分数 void recalculateLevel(); // 重新计算会员等级 int getMaxBorrowDays() const; // 获取最大借阅天数 int getMaxBorrowBooks() const; // 获取最大可借数量 bool canBorrowMore() const; // 检查是否还能借更多书 // 预约相关方法 bool reserveBook(const std::string &bookId); // 预约图书 // 添加新的方法 const std::vector &getBorrowRecords() const { return borrowRecords; } // 获取借阅记录 void addBorrowRecord(const std::string &bookId); // 添加借阅记录 void removeBorrowRecord(const std::string &bookId); // 移除借阅记录 time_t getDueDate(const std::string &bookId) const; // 获取到期日期 // 添加文件操作相关方法 bool saveBorrowRecords() const; // 保存借阅记录到文件 bool loadBorrowRecords(); // 从文件加载借阅记录 void updateBorrowRecords(); // 更新未归还图书的剩余时间 const LinkList &getBorrowedBooks() const { return borrowedBooks; } // 获取当前借阅的图书列表 std::vector getUnreturnedRecords() const { std::vector unreturnedRecords; for (const auto &record : borrowRecords) { if (record.returnDate == 0) { unreturnedRecords.push_back(record); } } return unreturnedRecords; } // 获取未归还的借阅记录 }; class MemberManager { private: LinkList members; std::string dataFile; unsigned int BKDRHash(const std::string &str) const; // 计算字符串的哈希值 public: MemberManager(const std::string &filename); // 构造函数 ~MemberManager(); // 析构函数 bool addMember(Member *member); // 添加新会员 Member *authenticate(const std::string &id, const std::string &password); // 验证会员身份 void displayAllMembers() const; // 显示所有会员 bool saveToFile() const; // 保存数据到文件 bool loadFromFile(); // 从文件加载数据 LinkList getOverdueMembers() const; // 获取所有超期会员 Member *findMember(const std::string &memberId) const; // 查找会员 Member *findMemberByPhone(const std::string &phone) const; // 通过手机号查找会员 const LinkList &getMembers() const { return members; } // 获取所有会员列表 Member *findMemberBinary(const std::string &id) const; // 二分查找会员 Member *findMemberByPhoneBinary(const std::string &phone) const; // 二分查找会员(按手机号) Member *findMemberByNameHash(const std::string &name) const; // 哈希查找会员(按姓名) }; #endif // MEMBER_H