基于MySQL的BBS设计(2) |
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 ); 查问版面上, 题目中包括指定内容的文章 。 } |