基于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建立数据库连接:包含MySQLi扩展(require_once)创建连接函数(functionconnect_to_db)调用连接函数($conn=connect_to_db())执行查询($result=$conn->query())关闭连接($conn->close())

PHP中处理数据库连接报错,可以使用以下步骤:使用mysqli_connect_errno()获取错误代码。使用mysqli_connect_error()获取错误消息。通过捕获并记录这些错误信息,可以轻松识别并解决数据库连接问题,确保应用程序的顺畅运行。

接口和抽象类在设计模式中用于解耦和可扩展性。接口定义方法签名,抽象类提供部分实现,子类必须实现未实现的方法。在策略模式中,接口用于定义算法,抽象类或具体类提供实现,允许动态切换算法。在观察者模式中,接口用于定义观察者行为,抽象类或具体类用于订阅和发布通知。在适配器模式中,接口用于适配现有类,抽象类或具体类可实现兼容接口,允许与原有代码交互。

通过Go标准库database/sql包,可以连接到MySQL、PostgreSQL或SQLite等远程数据库:创建包含数据库连接信息的连接字符串。使用sql.Open()函数打开数据库连接。执行SQL查询和插入操作等数据库操作。使用defer关闭数据库连接以释放资源。

在Golang中使用数据库回调函数可以实现:在指定数据库操作完成后执行自定义代码。通过单独的函数添加自定义行为,无需编写额外代码。回调函数可用于插入、更新、删除和查询操作。必须使用sql.Exec、sql.QueryRow或sql.Query函数才能使用回调函数。

Java允许在接口和抽象类中定义内部类,为代码重用和模块化提供灵活性。接口中的内部类可实现特定功能,而抽象类中的内部类可定义通用功能,子类提供具体实现。

在C++中使用DataAccessObjects(DAO)库连接和操作数据库,包括建立数据库连接、执行SQL查询、插入新记录和更新现有记录。具体步骤为:1.包含必要的库语句;2.打开数据库文件;3.创建Recordset对象执行SQL查询或操作数据;4.遍历结果或按照具体需求更新记录。
