版面管理模組 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[]) | 查詢標題包含關鍵字文章 |
AddText 將長文切 2KB 區塊,GetText 按 block 索引讀取,配合 CQ66 客戶端分段下載,減少單次傳輸量。DeleteText 僅更新標記欄位,FlushTable 批次物理刪除,平衡效能與空間回收。ModifyText 等需特權操作由服務層攔截。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) 供首頁統計顯示。