1、从控件中取出用户输入的信息,如:用户名、密码、邮箱......;

2、数据校验,检查用户输入的内容是否符合一定的规则。例如检查邮箱输入格式是否正确、密码是否安全。

  QRegExp这个类可以很好帮助我们进行检验。

  

1 //用户名的正则表达式   "^[a-zA-Z0-9_@#-\*]\{3,16\}$"
2 //define  USER_REG        "^[a-zA-Z0-9_@#-\*]\{3,16\}$"
3 
4     QRegExp regexp(USER_REG);
5     if(!regexp.exactMatch(userName))   //开始匹配用户输入的用户名
6     {
7         QMessageBox::warning(this, "警告", "用户名格式不正确");
8         return; 
9     }    

 

注意,重新更换正则表达式时
1  regexp.setPattern(PHONE_REG);

3、将注册的信息转换成JSON格式字符数组;(具体操作,以往博客中有提到)

4、利用HTTP协议,把数据发送给服务器;

  主要用到三个类QNetworkAccessManager、QNetworkRequst、QNetworkReply

  QNetworkRequst负责设置URL、请求头信息。主要方法:setUrl() setHeader()

  QNetworkAccessManager负责向服务发送数据,主要方法:post()

  QNetworkReply负责接受服务器端发来的数据。

 

 1 //初始化QNetworkAccessManager类对象;
 2 QNetworkAccessManager *manager= new QNetworkAccessManager(this);
 3 QNetworkRequest res;
 4 //拼接URL,从控件中取出服务器端的IP和端口,后面“/reg”是指令,服务器拿到指令会找对应的fastcgi程序来解析
 5 QString url = QString("http://%1:%2/reg").arg(ui->address_server->text()).arg(ui->port_server->text());
 6 request.setUrl(QUrl(url));
 7 //设置请求头
 8  request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));//post方式提交的数据类型,这里是JOSN
 9  request.setHeader(QNetworkRequest::ContentLengthHeader, QVariant(data.size()));//要发送数据的长度
10 //向服务器发送数据,reply接受从服务器返回的数据
11  QNetworkReply  *reply= manager->post(res,data);

 

 

 

5、处理服务器的响应消息

  服务器发来的是json对象,需要对json对象处理,取出里面的Value,判断是注册成功还是失败。

  然后对用户做出提示。

  服务器端的发回的json数据格式:

 

1   成功:         {"code":"000"}
2   该用户已存在:  {"code":"001"}
3   失败:         {"code":"002"}

 

 

1 connect(reply, &QNetworkReply::readyRead, [=]()
2     {
3         // 读sever回写的数据
4         QByteArray jsonData = reply->readAll();
5         // 解析服务器发来的数据,判断状态码
6        //做出相应提示
7   }

 

 

知道了客户端的处理流程,那么服务端怎么处理?

  由于Nginx服务器只会处理静态请求,由客户端发来的注册请求,nginx服务器处理不了,它会把请求转发给fastcgi程序,fastcgi是运行在nginx服务上的一段程序。于是,我们可以通过修改nginx的配置文件,把客户端的请求发送给对应的程序处理。

1          location /reg{
2           #服务器的地址和fastcgi程序运行的端口    
3           fastcgi_pass 192.168.31.33:10001;  
4           include fastcgi.conf;
5          }

 

fastcgi程序处理注册请求的流程

  1、把客户端发送的数据包读到一个buf缓冲区中;

  2、解析json数据包,获取客户端发送的用户名、密码、邮箱等信息,这里用到了cJSON的开源库,通过cJSON的API可以轻松解析JSON包;同理,获取密码和邮箱等信息也用同样的方法。

1     //解析一个json字符串为cJSON对象
2     cJSON * root = cJSON_Parse(buf);
3     //返回指定字符串对应的json对象
4     //获取用户名
5     cJSON *child1 = cJSON_GetObjectItem(root, "userName");
6 strcpy(user, child1->valuestring); //拷贝内容 这里的user是传出参数,把取来的用户名放在user变量中

 

  3、读服务端的配置文件,获取数据库的用户名、密码、DB,然后通过API连接到数据库,查看该用户名是否存在,如果不存在,插入新的注册信息。

 1 MYSQL *conn = NULL; //MYSQL对象句柄         
 2 //用来分配或者初始化一个MYSQL对象,用于连接mysql服务端
 3 conn = mysql_init(NULL);
 4 //连接到数据库
 5 mysql_real_connect(conn, NULL, user_name, passwd, db_name, 0, NULL, 0);
 6 //组织sql语句
 7 sprintf(sql_cmd, "select * from user where name = '%s'", user);
 8 //查询
 9 mysql_query(conn, sql_cmd);
10 //生成结果集
11 MYSQL_RES *res_set=mysql_store_result(conn);
12  //mysql_num_rows接受由mysql_store_result返回的结果结构集,并返回结构集中的行数,如果line=0,说明没有记录,如果>0,表述有记录
13 line = mysql_num_rows(res_set);