![1c967f1d6c2dee7d4ef043f4c7376ac4.png](https://i-blog.csdnimg.cn/blog_migrate/2d868f21a4e7365e261a21b499acfa3f.jpeg)
我一个人,静悄悄的独坐在桌前。 ——繁漪
虽然说这个项目对我一个菜鸡来说难度有些过大了…
但是毕竟还是有熟悉的直系新生在大一…所以也略微关心了一下这个作业吧…
啊…当然,我个菜鸡,而且时间还不多,就不用指望我能做出什么太好看的工作了…
顶多就是大概介绍一些可能需要用到的工具,并且给一个比较小的demo吧。而且还会磨叨一些没有用的东西(逃
对不起可能让各位看官失望了
所以大佬们就别来看我笑话了(捂脸)
首先让我们从服务端说起。
如果我没记错的话…在大作业要求里提到了数据库…
虽然说用文件做也无所谓,但是本着多介绍一点是一点的想法,我们先把sqlite3的用法简单介绍一下。如果希望直接用文件做的话…就跳过吧…
当然,也没必要部署成服务器了…把雨课堂服务器和数据库部署在同一台计算机上应该就可以了(毕竟只在建立连接的时候有差别)
从这个奇怪的网站下载sqlite3…的源码
SQLite Download Pagewww.sqlite.org然后解压后在本机编译sqlite3.c就可以了吧(
cl /c sqlite3.c /Fosqlite3.obj
lib sqlite3.obj /OUT:sqlite3.lib
之后把编译出来的lib加入到我们的工程中就可以了吧…
(这个文件我也会上传到自己的云盘…有需要的话可以从那里找…)
然后,我这里有这样的一个数据库
![d74d3678c322d35497a2dbc36b764345.png](https://i-blog.csdnimg.cn/blog_migrate/4c5cc33be9b159955753776a537d3f10.jpeg)
嗯…原则上来讲密码应该加hash的…但是……
一方面,我又不是正经做大作业的怎么可能做这些extra work……更何况hash模板网上有一大堆…随便拉一个套上就行了吧(反正我写大作业的时候就是直接拉了一个MD5模板再处理了一下加盐就用了)
另一方面,需求文档里好像都已经说了这是个管理员帮着改密码之后微信发给用户的憨憨系统了……还加什么hash哇!
然后…简单地测试一下(废话开始
#include <stdio.h>
#include <sqlite3.h>
int main()
{
sqlite3 *db=nullptr;
auto err=sqlite3_open("E:data.db",&db);
if(err){
fprintf(stderr, "Can't open database: %s ", sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
auto sql="select * from users where uname='Admin'";
sqlite3_stmt *stmt;
sqlite3_prepare_v2(db,sql,-1,&stmt,NULL);
sqlite3_next_stmt(db,stmt);
if(sqlite3_step(stmt) == SQLITE_ROW) {
const unsigned char *name = sqlite3_column_text(stmt, 0);
const unsigned char *pass = sqlite3_column_text(stmt, 1);
const unsigned char *courses = sqlite3_column_text(stmt, 2);
int role = sqlite3_column_int(stmt, 3);
if(role!=2){
printf("%s %s %s %dn",name,pass,courses,role);
}else{
long long student_id=sqlite3_column_int64(stmt, 4);
printf("%s %s %s %d %lldn",name,pass,courses,role,student_id);
}
}
sqlite3_finalize(stmt);
sqlite3_close_v2(db);
return 0;
}
程序(至少在我的电脑上)输出了正确的结果…
接下来,我们把上述程序做一个基本的封装,以供在其它地方使用。这段内容没什么太大的难度,而且还有较强的个人偏好在,我们略过不讲。
对于每次查询都需要创建一个sqlite3_stmt对象,并在查询后通过sqlite3_finalize释放它。
不过需要注意的是,在sqlite3_finalize之后,通过sqlite_column_text取到的字符指针会实现…如果不太在意性能的话可以把它复制出来,如果在意性能的话,就要在其它地方完成使用后,再调用sqlite3_finalize……
除了数据库,在服务端的另一个问题就是网络…
当然,如果想要像我们去年的计网大作业那样…用socket各种轮询…也不是不行…
没有要求的话尽可能用好用一些的轮子嘛。这里我们在服务端选用boost.asio做网络连接,而用户端反正也要做UI,就直接用Qt提供的连接了…(发出了懒癌发作的声音)
再之后就是需要道歉的事情了。原则上这