多用户博客系统
需求:
- 支持多用户(1号用户为管理员身份,其他用户为普通用户)
- 实现所有用户对自己所些的文章的增删改,以及对所有文章的查阅功能
- 实现管理员的对标签页的增删改查功能
- 实现一个用户登陆页面,根据用户的等级生成权限不同的页面
模块划分:
- 客户端:网页的形式
- 服务器端:HTTP协议
- 客户端:实现对数据的增删查改(数据库:Mysql)
从数据库开始
1.创建一个数据库(blog_system)
1.1创建一个博客表(blog_table)
表中存储数据及数据类型:
博客id blog_id (int not null primary key auto_increment)
博客标题 title(varchar(50))
博客正文 content(text)
作者id author_id(int)
标签id tag_id(int)
创建时间 create_time(varchar(50))
1.2标签表(tag_table)
标签id tag_id(int not null primary key auto_increment)
标签名 tag_name(varchar)
1.2用户表(作者表、author_table)
用户id author_id(int not null primary key auto_increment)
用户名 user_name(varchar)
用户密码 passwords(varchar)
1.3 将建标的mysql全写在一个sql文件中,方便日后修改,查看,并使用”<”重定向的命令创建数据库。
2.使用mysql API创建一些类来封装数据路操作
2.1 注备工作:
- 和数据库建立连接,初始化句柄
1 | MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long clientflag) |
- 如果连接失败打印错误
1 | const char *mysql_error(MYSQL *mysql) |
- 设置字符编码 为utf8(正文会出现中文,mysql默认utf8编码)
1 | int mysql_set_character_set(MYSQL *mysql, const char *csname) |
- 创建一个和数据库断开连接的接口
1 | static void MySQLRelease(MYSQL* connect_fd){ |
创建一个操作博客表的类(BlogTable)
相关参数同一使用json格式,方便扩展
对数据库操作大致总结为以下几点:
- 创建sql语句
- 分析参数中的数据,拼接sql语句
- 执行mysql语句
- 判断执行结果,打印错误,返回false
- 如果要从数据库获取数据,还要有以下几步
- 获取执行结果,获取的执行结果为MYSQL_RES* 类型,通过mysql_num_rows获取结果中有几条数据,对获取结果进行校验
- 通过mysql_fetch_row 循环获取每一条执行结果,每条数据写入一个Json对象中,并把json对象,添加到输出的json对象级中(Jsons->append(Json))
- 返回true,操作完成
实现功能:
- 增(Insert)
- 在添加一片博客的时候,正文内容可能非常大,正文内容就不能存放在栈上,必须在堆上为其开辟一段空间。
- 拼接的sql语句因为正文的缘故,也不能在栈上存放,必须在堆上开辟空间
- 在堆上开辟空间就存在在不使用这段空间时,就要对着段空间进行释放,但是如果在之后使用者段空间的时候因为各种原因会导致,内存内释放,造成内存泄流,所以,将上面提到的量段空间交给智能指针管理(unique_ptr)
- 博客正文中可能会出现一些特殊符号(\n, ‘’, “” 等),会导致拼接的sql语句存在问题,这里就需要对正文内容进行转义,使用函数unsigned long STDCALL mysql_real_escape_string(MYSQL * mysql, char * to, const char * from, unsigned long length),进行转义,但是用来存储转义之后的内容的to指针所指向的大小,在文档中规定是转义前存放空间的2倍加1字节的空间
- 删(Delete)
- 改(Update)
- 查(Select)
- 根据tag_id查
- 根据author_id查
- 所有博客
所有用户可以对博客表进行操作,但是智能对自己发表的博客进行删和改操作
2.标签表(TagTable)
只有管理员才能进行标签页的增,查
- 增(Insert)
- 删(Delete)
- 查(Select)
3.作者表(AuthorTable)
- 增(Insert)
- 改(Update)
新用户注册作者表增
用户改登陆密码,进行改操作
查操作之后管理员身份可以使用