基于MySQL的BBS设计(2)_MySQL
基于MySQL的BBS设计(2)_MySQL
4。用户模块设计
对于底层数据库,调用mysql的C API函数来进行数据库的修改,内部保存一定的状态变量(例如用户名,还是留给上一层完成?),对上一层,则提供用户管理的接口。
Class UserManage { private: char myuserid[20]; // 用户的id,未登陆前为空 time logintime; // 用户登陆时间,并用于计算停留时间 char loginhost[20]; //上站地点。 public: int NewUser( char *userid, char *passwd ); 新建一个用户,判断是否已经有,其他资料暂时为空, firstlogintime,权限等设缺省值。 int UserLogin( char *userid, char *passwd ); 用户登陆,验证密码, int ChangePasswd( char *oldpasswd, char *newpasswd ); 修改密码,要求原密码一致。 int ChangePriData( char *newname, char *newemail, char *newaddr ); 改变基本数据,泥称,email,住址。。。。 int ModifyNumData( int addlogin, int addpost ); 修改文章数,上站次数,等数据。。。。注意调用对象。 int UserLogout(); 用户退出,修改lastlogin,staytime,loginhost等 // 普通查询命令 int QueryCommonData( const char * userid, int& loginnum, char * username, int& postnum, time& lastlogin, char *lasthost ); 查询网友基本信息。 // 特权指令,函数在完成功能前,先判断权限。 int QueryPriData( const char * userid, char *email, char *addr ); 查询基本信息,普通人只能查自己,有特权才能查其他人。 int ModifyUserLevel( BOOL isAdd, unsigned long level ); 修改用户的权限, int ModifyUserId( char *oldid, char *newid ); char *newemail, char *newaddr ); 修改用户的基本数据。 int ModifyUserNumdata( char *userid, int addlogin, int addpost ); 修改用户的文章数等数据。 int ModifyUserPasswd( char *userid, char *newpasswd ); 修改用户的密码。 }
以上各个函数难度不大,都是执行相应的sql语句,访问mysql数据库,是否将一般指令归到特权指令中去呢?权限的检查,是放在这一层还是上一层?
这更多的是看考虑的着重点,是看程序的清晰性还是代码的简练,可能还是看代码吧,毕竟要考虑访问量,另外,上层服务层是否也应该考虑权限检查问题呢?
5。版面模块设计
所谓分类,更多的是为telnet服务端考虑的,在cq66模式下,用户可以按照自己的意愿进行分类,反正最后都是直接以版为基本单位访问的。
对于版面文章的访问,存放的时候以整篇文章为参数,文章的分块由本层完成,如果上层以块为单位传送,则在上层全部传完,组合后,再传参到本层分解;在读取 的时候,本层则以块为单位访问,如果上层要以全文为单位访问,则在上层做合并 工作,本层不管。
至于要不要独立出索引,不影响上层的操作,主要和下层的数据库构造有关,主要考虑可行性,效率需求等。
权限的检查放在哪里进行呢?还是放在上层吧,其实就telnet服务器端,和cq66 的客户端,根本不会给一般用户显示特殊指令的菜单,当然,用户可以直接发送cq66 的指令,服务器方还是要检查的。但应该不用在它下面的功能模块层再检查一次吧 。
Class BoardManage { private: public: // 有关分类的操作 int GetClassNameInfo( int maxclass, char **classid, char ** classname ); 返回分类的信息,中英文名。 int GetBoardName( int maxboards, char *classid, char **boardname ); 返回某分类中的版面信息,一般分类,直接select .. from sboard where boardclass == .... 特殊分类则查相应的表。。。。 // 修改需要版面管理员以上的特权 int NewClass( char * newclassname, int type ); 新建分类,普通分类还是特殊分类, int DeleteClass( char *newclassname ); 删除分类,但不cascade,即本层不负责一致性,由上层负责将 相应的版面的分类信息改为别的。分类改名也是先删再建, int AddClassBoard( const char *classname, char *newboardname ); 将已建好的版加入某分类中,专门针对特殊分类,对一般分类,其 效果和modifyboardinfo一样, int DeleteClassBoard( const char *classname, char *boardname ); 从分类中删除某个版,也是针对特殊分类,对一般分类,效果也 是和modifyboardinfo一样,一个版的分类属性可以为空,即不属 于任何分类。 // 有关版的信息的操作。 int NewBoard( const char *boardid,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, char *newid ); 改变版的英文id,对应table的名称也要改变, int ModifyBoardInfo( const char *boardid, char *boardname, int numposts, char *masters, char *class, long level ); 修改版面信息,需要特权。 // 有关版面文章的操作。 int AddText( char *boardid, char *title, char *writer, char *text ); 往版面中增加文章,内部将长文章分割成2k的块。 int DeleteText( char *boardid, int num ); 删除文章,只是做一个标记,并不立刻修改对应的table。 int FlushTable( char *boardid ); 刷新版面,删除被删文章的对应的记录。 int MarkText( char *boardid, int num, char mark ); 给文章做标记。 int ModifyTitle( char *boardid, int num, char *newtitle ); 修改文章的标题。 int ModifyText( char *boardid, int num, 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, char *writer, char **result ); 查询版面上,某作者的文章。 int QueryTitle( const char *boardid, char *title, char **result ); 查询版面上,标题中包含指定内容的文章。 }bitsCN.com
以上就是基于MySQL的BBS设计(2)_MySQL的内容,更多相关内容请关注PHP中文网(www.php.cn)!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

蘋果公司最新發布的iOS18、iPadOS18以及macOSSequoia系統為Photos應用程式增添了一項重要功能,旨在幫助用戶輕鬆恢復因各種原因遺失或損壞的照片和影片。這項新功能在Photos應用的"工具"部分引入了一個名為"已恢復"的相冊,當用戶設備中存在未納入其照片庫的圖片或影片時,該相冊將自動顯示。 "已恢復"相簿的出現為因資料庫損壞、相機應用未正確保存至照片庫或第三方應用管理照片庫時照片和視頻丟失提供了解決方案。使用者只需簡單幾步

PHP處理資料庫連線報錯,可以使用下列步驟:使用mysqli_connect_errno()取得錯誤代碼。使用mysqli_connect_error()取得錯誤訊息。透過擷取並記錄這些錯誤訊息,可以輕鬆識別並解決資料庫連接問題,確保應用程式的順暢運作。

如何在PHP中使用MySQLi建立資料庫連線:包含MySQLi擴充(require_once)建立連線函數(functionconnect_to_db)呼叫連線函數($conn=connect_to_db())執行查詢($result=$conn->query())關閉連線( $conn->close())

介面和抽象類別在設計模式中用於解耦和可擴展性。介面定義方法簽名,抽象類別提供部分實現,子類別必須實作未實現的方法。在策略模式中,介面用於定義演算法,抽象類別或具體類別提供實現,允許動態切換演算法。在觀察者模式中,介面用於定義觀察者行為,抽象類別或具體類別用於訂閱和發布通知。在適配器模式中,介面用於適應現有類,抽象類或具體類可實現相容接口,允許與原有程式碼互動。

介面和抽象類別用於建立可擴展的PHP程式碼,它們之間存在以下關鍵差異:介面透過實作強制執行,而抽象類別透過繼承強制執行。介面不能包含具體方法,而抽象類別可以。一個類別可以實作多個接口,但只能從一個抽象類別繼承。介面不能實例化,而抽象類別可以。

在Golang中使用資料庫回呼函數可以實現:在指定資料庫操作完成後執行自訂程式碼。透過單獨的函數新增自訂行為,無需編寫額外程式碼。回調函數可用於插入、更新、刪除和查詢操作。必須使用sql.Exec、sql.QueryRow或sql.Query函數才能使用回呼函數。

可以透過使用gjson函式庫或json.Unmarshal函數將JSON資料儲存到MySQL資料庫中。 gjson函式庫提供了方便的方法來解析JSON字段,而json.Unmarshal函數需要一個目標類型指標來解組JSON資料。這兩種方法都需要準備SQL語句和執行插入操作來將資料持久化到資料庫中。

透過Go標準庫database/sql包,可以連接到MySQL、PostgreSQL或SQLite等遠端資料庫:建立包含資料庫連接資訊的連接字串。使用sql.Open()函數開啟資料庫連線。執行SQL查詢和插入操作等資料庫操作。使用defer關閉資料庫連線以釋放資源。
