您好,欢迎访问一九零五行业门户网

基于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的内容。
其它类似信息

推荐信息