首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

基於 MySQL 的 BBS 系統設計(三):用戶與版面模塊 C++ 接口定義

     編輯:MySQL 綜合教學

BBS 核心模塊 C++ 接口規範:UserManage 與 BoardManage 類設計

本文定義用戶管理與版面管理兩大核心模塊的 C++ 類接口,採用 MySQL C API 底層實現,向上提供清晰業務接口,涵蓋用戶全生命周期、版面分類體系、文章分塊存儲、權限檢查分層策略。

UserManage 類接口

class UserManage {
private:
    char myuserid[20];      // 當前登入用戶 ID
    time_t logintime;       // 登入時間
    char loginhost[20];     // 登入來源

public:
    // 普通用戶接口
    int NewUser(const char* userid, const char* passwd);
    int UserLogin(const char* userid, const char* passwd);
    int ChangePasswd(const char* oldpasswd, const char* newpasswd);
    int ChangePriData(const char* newname, const char* newemail, const char* newaddr);
    int UserLogout();  // 更新 lastlogin、staytime、loginhost

    // 信息查詢
    int QueryCommonData(const char* userid, int& loginnum,
                        char* username, int& postnum,
                        time_t& lastlogin, char* lasthost);
    int QueryPriData(const char* userid, char* email, char* addr);  // 權限控制

    // 管理員特權接口
    int ModifyUserLevel(bool isAdd, unsigned long level);
    int ModifyUserId(const char* oldid, const char* newid);
    int ModifyUserData(const char* userid, const char* newname,
                       const char* newemail, const char* newaddr);
    int ModifyUserNumdata(const char* userid, int addlogin, int addpost);
    int ModifyUserPasswd(const char* userid, const char* newpasswd);
};

關鍵設計決策

  • 權限檢查下沉:特權接口內部先驗證調用者權限,普通接口無需權檢
  • 狀態封裝:登入用戶 ID/時間/來源作為私有成員,避免上層重複傳遞
  • 參數傳遞:輸出參數用引用,字串用固定緩衝區,調用方負責記憶體

BoardManage 類接口

class BoardManage {
public:
    // 分類操作
    int GetClassNameInfo(int maxclass, char** classid, char** classname);
    int GetBoardName(int maxboards, const char* classid, char** boardname);
    int NewClass(const char* newclassname, int type);        // 普通/特殊分類
    int DeleteClass(const char* classname);                  // 不級聯,上層處理關聯
    int AddClassBoard(const char* classname, const char* boardname);
    int DeleteClassBoard(const char* classname, const char* boardname);

    // 版面信息
    int NewBoard(const char* boardid, const char* boardname);  // 建表
    int DeleteBoard(const char* boardid);                      // 刪表
    int GetBoardInfo(const char* boardid, char* boardname,
                     int& numposts, char* masters, char* class, long& level);
    int ModifyBoardId(const char* oldid, const char* newid);   // 改表名
    int ModifyBoardInfo(const char* boardid, const char* boardname,
                        int numposts, char* masters, char* class, long level);

    // 文章操作(內部自動分塊 2KB)
    int AddText(const char* boardid, const char* title,
                const char* writer, const char* text);
    int DeleteText(const char* boardid, int num);              // 標記刪除
    int FlushTable(const char* boardid);                       // 物理清理已刪文章
    int MarkText(const char* boardid, int num, char mark);     // 精華/鎖定等標記
    int ModifyTitle(const char* boardid, int num, const char* newtitle);
    int ModifyText(const char* boardid, int num, const char* newtext);  // 權檢
    int GetTextInfo(const char* boardid, int num,
                    char* title, char* writer, char& mark);
    int GetText(const char* boardid, int num, int block, char* text);   // 分塊讀取

    // 搜索
    int QueryWriter(const char* boardid, const char* writer, char** result);
    int QueryTitle(const char* boardid, const char* title, char** result);
};

文章分塊存儲策略

  • 寫入時:功能層將長文本按 2KB 分塊,調用 AddText
  • 讀取時:telnet 服務層按需請求特定塊,避免全文傳輸
  • 優勢:彌補 MySQL 字段無法隨機讀取部分內容的缺陷
  • 代價:分塊邏輯增加複雜度,需維護塊序號、總塊數

權限檢查分層策略

層級檢查內容說明
服務層菜單顯示控制、指令分發攔截cq66/telnet 客戶端不發送無權限指令菜單
功能層特權接口內部二次驗證ModifyUserLevel 等管理員接口強制校驗
存儲層無業務權限感知純 SQL 執行,依賴上層保證

參數傳遞與記憶體管理難點

  • 抽象層要求返回數據與底層無關 → 需數據拷貝
  • 性能要求避免多次拷貝 → 零拷貝衝突
  • 記憶體申請/釋放責任歸屬不明 → 易發生洩漏/重複釋放
  • 建議:上層分配緩衝區傳入,功能層填充;或採用引用計數智能指針
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved