小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系。

登录流程时序
api-login.2fcc9f35.jpg

说明:
调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。
调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 、 用户在微信开放平台帐号下的唯一标识UnionID(若当前小程序已绑定到微信开放平台帐号) 和 会话密钥 session_key。
之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。

注意:

会话密钥 session_key 是对用户数据进行 加密签名 的密钥。为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥。
临时登录凭证 code 只能使用一次

1.安装

composer require qiniu/php-sdk

2.tp5图片上传类 Upload.php 配置文件 qiniu.php

<?php
return [
    'ak' => '',
    'sk' => '',
    'bucket' => '',
    'image_url' => '',
];

<?php
namespace app\common\lib;
//引入鉴权类
use Qiniu\Auth;
//引入上传类
use Qiniu\Storage\UploadManager;
/**

     * 七牛图片基础类库
     * Class Upload
     * @package app\common\lib
     */
    class Upload {
    /**
     * 图片上传
 */
public static function image() {
    if(empty($_FILES['file']['tmp_name'])) {
        exception('您提交的图片数据不合法', 404);
    }
    /// 要上传的文件的
    $file = $_FILES['file']['tmp_name'];

    /*$ext = explode('.', $_FILES['file']['name']);
    $ext = $ext[1];*/
    $pathinfo = pathinfo($_FILES['file']['name']);
    //halt($pathinfo);
    $ext = $pathinfo['extension'];

    $config = config('qiniu');
    // 构建一个鉴权对象
    $auth  = new Auth($config['ak'], $config['sk']);
    //生成上传的token
    $token = $auth->uploadToken($config['bucket']);
    // 上传到七牛后保存的文件名
    $key  = date('Y')."/".date('m')."/".substr(md5($file), 0, 5).date('YmdHis').rand(0, 9999).'.'.$ext;

        //初始UploadManager类
        $uploadMgr = new UploadManager();
        list($ret, $err) = $uploadMgr->putFile($token, $key, $file);

        if($err !== null) {
            return null;
        } else {
            return $key;
        }
    }
}




一:这种情况下使用redis比较有优势:

  1. redis基于内存而mysql基于硬盘,速度快。
  2. 用的数据库本就是mysql,这时再用mysql进行队列缓存更造成了mysql的负担
  3. redis比memcahe的优势在于 redis定时的将数据持久化到硬盘

二:

Redis list
LPUSH/LPUSHX  :将值插入到(/存在的)列表头部
RPUSH/RPUSHX  :将值插入到(/存在的)列表尾部
LPOP :移出并获取列表的第一个元素
RPOP :移出并获取列表的最后一个元素
LTRIM :保留指定区间内的元素
LLEN :获取列表长度
LSET :通过索引设置列表元素的值
LINDEX :通过索引获取列表中的元素
LRANGE :获取列表中指定范围内的元素

三:架构设计
秒杀.png
四:代码级设计

  1. 秒杀程序把请求写入Redis.(Uid, time_stamp)
  2. 检查Redis已存放数据的长度,超出上限直接丢弃
  3. 死循环处理存入Redis的数据并入库

五: redis_queue数据库表的SQL语句:

   CREATE TABLE `redis_queue` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `uid` int(11) NOT NULL DEFAULT '0',
  `time_stamp` varchar(24) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=71 DEFAULT CHARSET=utf8;

User.php

<?php
$redis = new Redis();
$redis->connect('127.0.0.1',6379);
$redis_name = "miaosha";
for($i=1;$i<100;$i++){
    $uid = rand(100000,999999);
//接受用户的id
//$uid = $_GET['uid'];
//获取redis里面已有的数量
$num = 10;
//如果当天人数少于10时,则加入这个队列
if($redis->lLen($redis_name)<10)  {
    $redis->rPush($redis_name,$uid.'%'.microtime());
    echo $uid."秒杀成功";
}else{
    //反之,则返回秒杀已完成
    echo "秒杀已结束";
}
$redis->close();
}

savetodb.php

<?php
include '../include/db.php';
$redis = new Redis();
$redis->connect('127.0.0.1',6379);
$redis_name = "miaosha";
$db = DB::getIntance();
//死循环
while (1) {
//从队列最左侧取出一个值来,
$user = $redis->lPop($redis_name);
//然后判断这个值是否存在,
if(!$user || $user=='nil') {
    sleep(2);
    continue;
}
//切割出时间,uid
$user_arr = explode('%',$user);
$insert_data = array(
    'uid' =>$user_arr[0],
    'time_stamp'=>$user_arr[1]
);
//保存导数据库中
 $res = $db->insert('redis_queue',$insert_data);
//数据插入失败的时候的回滚机制
    if(!$res) {
        $redis->rPush($redis_name,$user);
    }
    sleep(2);
}
//释放一下redis
$redis->close();

1、查询构造器简
查询构造器提供方便,流畅的接口,简历及执行数据库查找语法
PDO参数绑定,保护程序面SQL注入,传入参数不需要转义字符
在所有支持的数据库系统上都可以执行
新增

   public function query1()
    {
//        $bool = Db::table('student')->insert([
//            'name'=>'ylxc','age'=>18
//        ]);
//        var_dump($bool);
//        $id = Db::table('student')->insertGetId([
//            'name'=>'ylxc','age'=>18
//        ]);
//        var_dump($id);
       $bool = Db::table('student')->insert([
           ['name'=>'ylxc','age'=>18],
           ['name'=>'ylxc1','age'=>18]
        ]);
        var_dump($bool);
    }

路由

Route::any('query1',['uses'=>'StudentController@query1']);

2更新,自增,自减

 public function query2()
    {
        //$num  = Db::table('student')->where('id',1001)->update(['name'=>20]);
        //var_dump($num);
        //$num = Db::table('student')->increment('age');
        //$num = Db::table('student')->where('id', 1001)->decrement('age');
        $num = Db::table('student')->where('id', 1001)->decrement('age',1,['name'=>'ylxinchen']);
        var_dump($num);
    }

路由

 Route::any('query2',['uses'=>'StudentController@query2']);

3.删除

public function query3()
    {
        $num = DB::table('student')->where('id','>=',1010)->delete();
        var_dump($num);
        //$num = DB::table('student')->truncate();
    }

路由

 Route::any('query3',['uses'=>'StudentController@query3']);

4.查询
get() --> 获取所有符合条件的数据(对象数组)
lists() --> 指定一个查询的列,可为查询出来的数组指定键(单投影)
first() --> 获取所有符合条件的数据中的排在第一条的数据(对象)
select() --> 可指定一个或多个要查询的列(多投影)
where() --> 添加查询条件
chunk() --> 每次查询的条数(可添加闭包函数,在函数中对数据进行处理或终止查询)
pluck() --> 指定一个查询的列(单投影)

  public function query4()
        {
        //$bool = Db::table('student')->insert([
        //           ['name'=>'ceshi','age'=>18],
        //           ['name'=>'ceshi1','age'=>18],
        //           ['name'=>'ceshi2','age'=>18],
        //           ['name'=>'ceshi','age'=>18],
        //           ['name'=>'ceshi','age'=>18]
        //       ]);
        //       var_dump($bool);
            //$student = Db::table('student')->get();
            //$student = Db::table('student')->orderBy('id','desc')->first();
            //$student = Db::table('student')->where('id','>=',10)->get();
            //$student = Db::table('student')->whereRaw('id>=? and age>?',[10,18])->get();
            //$student = Db::table('student')->whereRaw('id>=? and age>?',[10,18])->pluck('name');
            //$student = Db::table('student')->lists('name','id');
            //$student = Db::table('student')->select('name','id')->get();
            echo '<per>';
            $student = Db::table('student')->chunk(2,function ($student){
                dump($student);
                return false;
            });
            dd($student);
        }

路由

Route::any('query4',['uses'=>'StudentController@query4']);

5.聚合函数

 public function query5()
        {
            $num = Db::table('student')->count();
            //var_dump($num);die;
            $max = Db::table('student')->max('age');
            $min = Db::table('student')->min('age');
            $avg = Db::table('student')->avg('age');
            $sum = Db::table('student')->sum('age');
            var_dump($sum);die;
        }

路由

 Route::any('query5',['uses'=>'StudentController@query5']);

1.新建本地数据库laravel,新建数据表

CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL DEFAULT '' COMMENT '姓名',
  `age` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '年龄',
  `sex` tinyint(3) unsigned NOT NULL DEFAULT '10' COMMENT '性別',
  `created_at` int(11) NOT NULL DEFAULT '0' COMMENT '新增时间',
  `updated_at` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1001 DEFAULT CHARSET=utf8 COMMENT='学生表';

2.找到数据库的配置 config/database.php

'default' => env('DB_CONNECTION', 'mysql'), //查看默认数据库是否正确
    //看mysql的具体配置是否正确
        'mysql' => [
            'driver'    => 'mysql',
            'host'      => env('DB_HOST', 'localhost'),
            'database'  => env('DB_DATABASE', 'forge'),
            'username'  => env('DB_USERNAME', 'forge'),
            'password'  => env('DB_PASSWORD', ''),
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'strict'    => false,
            'engine'    => null,
        ],

3.找env文件
Laravel .env 文件
修改配置

DB_HOST=localhost
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=root

4.新建appHttpControllersStudentController.php

<?php

namespace App\Http\Controllers;
use Illuminate\Support\Facades\Db;

class StudentController extends Controller
{
    public function test1()
    {

        //$bool = DB::insert('insert into student(name,age) values(?,?)',['ylxinchen',18]);
        //var_dump($bool);die;
        //更新
        //$num = DB::update('update student set age = ? where name = ?',['20','ylxinchen']);
        //var_dump($num);die;
        //查询
        //$result = DB::select('select * from student');
        //dd($result);
        //删除
        //$num  = DB::delete('delete from student where id > ?',[1001]);
        //var_dump($num);die;
    }
}

5.设置路由appHttproutes.php

Route::any('test1',['uses'=>'StudentController@test1']);