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

基於 MySQL 的 BBS 設計(四):版面管理模組 BoardComplete 類別完整接口規格

     編輯:PHP 綜合知識

設計定位

版面管理模組 BoardManage 封裝所有與「分類→版面→文章」三層結構相關的操作,供上層服務層(Telnet/CQ66/Web)呼叫。核心原則:上層負責權限、會話、協議;本層僅提供無狀態 CRUD 與業務邏輯。

介面分類總覽

類別方法用途
分類管理GetClassNameInfo(maxclass, classid[], classname[])取得所有分類中英文名稱
GetBoardName(maxboards, classid, boardname[])取得指定分類下版面列表(普通分類查 sboard 表,特殊分類查對應表)
NewClass(classname, type) / DeleteClass(classname)新增/刪除分類(不級聯刪除版面,由上層處理一致性)
版面分類關聯AddClassBoard(classname, boardname) / DeleteClassBoard(classname, boardname)特殊分類下加入/移除版面;普通分類等同修改版面屬性
版面基本資訊NewBoard(boardid, boardname)建立版面並自動建立對應文章表,其他參數取預設值
DeleteBoard(boardid)刪除版面及其文章表
GetBoardInfo(boardid, boardname, numposts, masters, class, level)取得版面元資料:文章數、版主列表、所屬分類、權限等級
ModifyBoardId(oldid, newid)修改版面英文 ID(同步重命名文章表)
ModifyBoardInfo(boardid, boardname, numposts, masters, class, level)修改版面資訊(需特權)
文章操作AddText(boardid, title, writer, text)發文:內部將長文切割為 2KB 區塊存儲
DeleteText(boardid, num)軟刪除:僅打標記,不立即刪除表記錄
FlushTable(boardid)物理清理:真正刪除被標記文章的記錄
MarkText(boardid, num, mark)設定文章標記(精華、鎖定等)
ModifyTitle(boardid, num, newtitle)修改標題
ModifyText(boardid, num, newtext)修改內容(非作者需特權)
GetTextInfo(boardid, num, title, writer, mark)取得文章標題資訊
GetText(boardid, num, block, text)分塊讀取文章內容(支援 CQ66 分段下載)
搜尋查詢QueryWriter(boardid, writer, result[])查詢指定作者文章
QueryTitle(boardid, title, result[])查詢標題包含關鍵字文章

關鍵設計決策說明

  1. 分塊存儲:AddText 將長文切 2KB 區塊,GetText 按 block 索引讀取,配合 CQ66 客戶端分段下載,減少單次傳輸量。
  2. 軟刪除 + 定期 Flush:DeleteText 僅更新標記欄位,FlushTable 批次物理刪除,平衡效能與空間回收。
  3. 權限下沉:本層所有方法假設上層已完成權限檢查,僅執行資料操作;ModifyText 等需特權操作由服務層攔截。
  4. 參數傳遞策略:C++ 介面採用「輸出參數為引用/指標」,呼叫端負責記憶體配置釋放,避免跨模組記憶體管理錯誤;若改用 C 語言則改為結構體指標或雙重指標。
  5. 索引獨立性:是否建立獨立索引表(如全文檢索)取決於底層資料庫能力(MySQL Fulltext / Sphinx),不影響本介面契約。

資料庫建議結構 (MySQL)

CREATE TABLE sclass (
  classid VARCHAR(20) PRIMARY KEY,
  classname_cn VARCHAR(40),
  classname_en VARCHAR(40),
  type TINYINT  -- 0=普通, 1=特殊
);

CREATE TABLE sboard (
  boardid VARCHAR(20) PRIMARY KEY,
  boardname VARCHAR(60),
  classid VARCHAR(20),
  masters TEXT,           -- 版主列表,逗號分隔
  level BIGINT,           -- 權限位元組
  numposts INT DEFAULT 0,
  FOREIGN KEY (classid) REFERENCES sclass(classid)
);

-- 每個版面一張文章表,命名規範: b_
CREATE TABLE b_example (
  num INT AUTO_INCREMENT PRIMARY KEY,
  title VARCHAR(200),
  writer VARCHAR(20),
  post_time DATETIME,
  mark CHAR(1) DEFAULT ' ',
  block_id INT,           -- 區塊序號
  content MEDIUMTEXT      -- 單塊 ≤ 2KB
);

後續擴展建議

  • 引入 BoardManage::SearchFulltext(boardid, keyword, result[]) 整合 Sphinx/Elasticsearch。
  • 增加 GetBoardStats(boardid, &total, &today, &user_count) 供首頁統計顯示。
  • 將介面定義為純虛基類,支援多種後端實作(MySQL、PostgreSQL、SQLite、Redis)熱插拔。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved