概要
项目是关于展会、活动报名数据提交,并同步到多端。
本文主要是后端实现,没有前端。
整体业务流程
技术细节
用到的技术或框架:
- 项目环境:php、redis、mysql
- 接收参数的框架:fastadmin
- 报名页面的框架:wxycms
报名数据入库 :
报名数据的逻辑:
查重、生成二维码、生成链接、插入 redis、插入 mysql、推送远端
/*
* 普通预登记----接收用户(中文)基本信息表单数据
*/
public function formdata_basic(){
header("Access-Control-Allow-Origin:*");
$db = D('mjjz52_basic');
if(isset($_POST)){
$data = $_POST;
// 避免重复提交
$data = $this->redis()->get($data['phone']);
if($data) return_json(array('status' => 2,'error' => '已成功提交数据,请勿重复操作','qrcode'=>$data));
$data['inputtime'] = SYS_TIME;
$data['qrcode'] = repeatGetQrcode(); //获取二维码
$data['mysrc'] = 'https://mjjz.gde3f.com/html/M52/dist/#/completeregister?code='.$data['qrcode'];
// 插入 redis 数据库
$s = $this->redis()->set($data['phone'],json_encode($data));
if($s){
// 插入 mysql 数据库
$user_id = $db->insert($data);
if($user_id){
// 登记成功后,推送总库
// $res = $zhanchuang->pushuser($user_id);
$this->push2origin($data);
return_json(array('status' => 1,'userid' => $user_id,'qrcode'=>$_POST['qrcode']));
}
}else{
return_json(array('status' => 2,'error' => '提交失败'));
}
}
}
推送远端的方法
// 推送报名数据到总库
public function push2origin($send_data){
$url = "https://3f.gde.cc/api/dengji/receive52";
$res = curlPost($url,json_encode($send_data));
// print_r($res);exit;
return $res;
}
redis 与 mysql 读一条数据的接口压测对比
对比方法:
// 通过 redis 查找手机号码
public function ceshi1(){
$data = $this->redis()->get($_GET['phone']);
print_r($data);
}
// 通过 mysql 查找手机号码
public function ceshi2(){
$data = D('mjjz52_basic')->where(array('phone' => $_GET['phone']))->find();
print_r($data);
}
这还是读取一次数据库的性能差别,你想想多次读写,那区别就大了。
总库接收数据的方法:
/**
* 接 52 届中文登记数据
*
*/
public function receive52()
{
$val = $this->request->post();
// print_r($val);exit;
if(!$val) $this->error('参数呢老铁');
$table = 'fa_miniform_mingjiaju52jieguanzhongdengji';
// todo数据处理
$insert = [
'name' => $val['uname'],
'qrcode' => $val['qrcode'],
'lang' => $val['lang'],
'position' => $val['position'],
'company' => $val['company'],
'mobile' => $val['phone'],
'idcard' => $val['idcards'],
'fork' => 'aliyun',
'createtime' => time(),
// 'origin_uid' => $val['id'],
'original_data' => json_encode($val,JSON_UNESCAPED_UNICODE),
];
// 保存到本地库
$save = Db::table($table)->insert($insert);
if($save){
$this->success('get✓');
}else{
$this->error('发生了不可描述的错误');
}
}
小结
到此就完成了报名数据 API 的开发、数据的同步,通过 redis 的引用,并满足了一定量的并发需求。