基于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 );

查问版面上, 题目中包括指定内容的文章 。

}