liziyu 发布的文章

1、起因如下图

QQ20220328-0.jpg

2、walk老大的贴码

<?php
require_once __DIR__ . '/vendor/autoload.php';

use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;

$worker = new Worker('tcp://0.0.0.0:80');
$worker->onConnect = function ($con) {
    $rcon = new AsyncTcpConnection('tcp://内网ip:80');
    $rcon->pipe($con);
    $con->pipe($rcon);
    $rcon->connect();
};

$worker = new Worker('tcp://0.0.0.0:443');
$worker->count = 8;
$worker->onConnect = function ($con) {
    $rcon = new AsyncTcpConnection('tcp://内网ip:443');
    $rcon->pipe($con);
    $con->pipe($rcon);
    $rcon->connect();
};

Worker::runAll();


一、要求

比方说一个试卷,总共 60 题,每道题都由难度、章节、类型 3 个属性
按照难度 简单 20 题 一般 30 题 困难 10 题
按照章节 章节一 10 题 章节二 15 题 章节 3 20 题,章节四 15 题
按照类型 文字题 20 题 图片题 20 题 视频题 20 题
每种维度题目数量是可以自行设置的,保证总题量等于 60 就行
不是每个最细分类(我这里称 sku 把)都有题目或者说有足量的题目,这种情况要考虑到
然后随机从数据库中取出这些题,有没有比较好的算法?

二、实现办法

1、方法一

    $tmp = [];
    for ($i=1;$i<=60;$i++){
        if($i <= 20) $item = ['简单'];
        if($i <= 50 && $i>20) $item = ['一般'];
        if($i <= 60 && $i>50) $item = ['困难'];
        $tmp[] = $item;
    }
    shuffle($tmp);
    foreach ($tmp as $key => &$value){
        if($key < 10) array_push($value,'章节一');
        if($key < 25 && $key>=10) array_push($value,'章节二');
        if($key < 45 && $key>=25) array_push($value,'章节三');
        if($key < 60 && $key>=45) array_push($value,'章节四');
    }
    shuffle($tmp);
    foreach ($tmp as $key => &$value){
        if($key < 20) array_push($value,'文字题');
        if($key < 40 && $key>=20) array_push($value,'图片题');
        if($key < 60 && $key>=40) array_push($value,'视频题');
    }
    $qa = [];
    foreach ($tmp as $v){
        $index = implode('-',$v);
        $qa[$index] = isset($qa[$index]) ? $qa[$index] + 1 : 1;
    }
    dd($qa);

效果
aaa.png

2、方式二


$origin = [
    'level' => [
        ['text' => '简单', 'total' => 20],
        ['text' => '一般', 'total' => 30],
        ['text' => '困难', 'total' => 10]
    ]
];
$data = [];
for ($index = 0; $index < 60; $index++) {
    $item = [];
    foreach ($origin as $type => $values) {
        $total = array_sum(array_column($values, 'total'));
        $random = rand(1, $total);
        foreach ($values as $key => $value) {
            if ($random <= $value['total']) {
                $item[$type] = $value['text'];
                $origin[$type][$key]['total']--;
                break;
            } else {
                $random -= $value['total'];
            }
        }
    }
    $data[] = $item;
}




1.composer安装阿里云OSS SDK

composer require aliyuncs/oss-sdk-php

2.控制器里面引用

use OSS\Core\OssException;

use OSS\OssClient;

use OSS\Core\OssUtil; 

2.上传代码逻辑

//        接收文件数据
    $file = request()->file('img');

// 取出文件名截取后缀

    $name = $file->getOriginalName();
    $suffix = strchr($name,'.');

// 阿里云配置

    $accessKeyId = "LTAI5t88SfZ5yhH4Sgu1u3gt";
    $accessKeySecret = "vbLBZWvzazGZvJpPap20ZyKDoBbdq2";
    // Endpoint以杭州为例,其它Region请按实际情况填写。
    $endpoint = "oss-cn-shanghai.aliyuncs.com";
    // 设置存储空间名称。
    $bucket= "*";
    // 设置文件名称。
    //这里是由sha1加密生成文件名 之后连接上文件后缀
    $object = sha1(date('YmdHis', time()) . uniqid()) . $suffix;
    $url = 'http://test.caotengfei.xyz/'.$object;
    // <yourLocalFile>由本地文件路径加文件名包括后缀组成,例如/users/local/myfile.txt。
    $filePath = $file->getPathname();
    $options = array(
        OssClient::OSS_CHECK_MD5 => true,
        OssClient::OSS_PART_SIZE => 1,
    );

    try{
        $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
        //返回uploadId。uploadId是分片上传事件的唯一标识,您可以根据uploadId发起相关的操作,如取消分片上传、查询分片上传等。
        $uploadId = $ossClient->initiateMultipartUpload($bucket, $object);
    } catch(OssException $e) {
        printf(__FUNCTION__ . ": initiateMultipartUpload FAILED\n");
        printf($e->getMessage() . "\n");
        return ;
    }
    print(__FUNCTION__ . ": initiateMultipartUpload OK" . "\n");

    $partSize = 10 * 1024 * 1024;
    $uploadFileSize = filesize($filePath);
    $pieces = $ossClient->generateMultiuploadParts($uploadFileSize, $partSize);
    $responseUploadPart = array();
    $uploadPosition = 0;
    $isCheckMd5 = true;
    foreach ($pieces as $i => $piece) {
        $fromPos = $uploadPosition + (integer)$piece[$ossClient::OSS_SEEK_TO];
        $toPos = (integer)$piece[$ossClient::OSS_LENGTH] + $fromPos - 1;
        $upOptions = array(
            // 上传文件。
            $ossClient::OSS_FILE_UPLOAD => $filePath,
            // 设置分片号。
            $ossClient::OSS_PART_NUM => ($i + 1),
            // 指定分片上传起始位置。
            $ossClient::OSS_SEEK_TO => $fromPos,
            // 指定文件长度。
            $ossClient::OSS_LENGTH => $toPos - $fromPos + 1,
            // 是否开启MD5校验,true为开启。
            $ossClient::OSS_CHECK_MD5 => $isCheckMd5,
        );
        // 开启MD5校验。
        if ($isCheckMd5) {
            $contentMd5 = OssUtil::getMd5SumForFile($filePath, $fromPos, $toPos);
            $upOptions[$ossClient::OSS_CONTENT_MD5] = $contentMd5;
        }
        try {
            // 上传分片。
            $responseUploadPart[] = $ossClient->uploadPart($bucket, $object, $uploadId, $upOptions);
        } catch(OssException $e) {
            printf(__FUNCTION__ . ": initiateMultipartUpload, uploadPart - part#{$i} FAILED\n");
            printf($e->getMessage() . "\n");
            return;
        }
        printf(__FUNCTION__ . ": initiateMultipartUpload, uploadPart - part#{$i} OK\n");
    }
// $uploadParts是由每个分片的ETag和分片号(PartNumber)组成的数组。
        $uploadParts = array();
        foreach ($responseUploadPart as $i => $eTag) {
            $uploadParts[] = array(
                'PartNumber' => ($i + 1),
                'ETag' => $eTag,
            );
        }
    try {
        // 执行completeMultipartUpload操作时,需要提供所有有效的$uploadParts。OSS收到提交的$uploadParts后,会逐一验证每个分片的有效性。当所有的数据分片验证通过后,OSS将把这些分片组合成一个完整的文件。
        $ossClient->completeMultipartUpload($bucket, $object, $uploadId, $uploadParts);
    }  catch(OssException $e) {
        printf(__FUNCTION__ . ": completeMultipartUpload FAILED\n");
        printf($e->getMessage() . "\n");
        return;
    }
        return json(['code'=>200,'msg'=>'成功','url'=>$url]);





真正的好朋友,互损不会翻脸,疏远不会猜疑,出钱不会计较,地位不分高低,成功无需巴结,失败不会离去。奋斗的时候搭把手,迷茫的时候拉一把,开心的时候干一杯,难过的时候抱一下。一起走吧,趁将来未来,趁热情未冷。——致我们真挚的友情

共同之处是:

1、都是遍历数据每个元素;
2、回调的参数都相同都支持元素主键
3、其中回调函数中的this指向的是window对象;

不同的地方是:

map()会分配内存生成并返回新数组。
forEach()可以更改原数组元素值。

使用场景:

froEach()而只是想用数据做一些事情时,并调用回显之用。
map()适用于生成并生成新数组,原数组不变,它的性能要比forEach()要高。

简单粗暴更直接:

   /**
     * 自定义token
     * @param null $userId
     * @param null $roles
     * @param int $timeout
     * @return string
     */
    protected function setToken($userId = null, $roles = null, $timeout = 0) :string
    {
        $year = 1984;
        $time = time();
        return $roles.'.'.md5($time).'.'.$year + $userId.'.'.$time.'.'. $timeout;
    }


通用

序号 名称 描述
1 chinese(simplified ...) 简体中文语言包
2 live server html 实时预览
3 prettier-code formatter 最流行的代码格式化插件
4 better comments 自定义注释颜色
5 path intellisense 路径自动感知填充
6 helium icon theme 一款我喜欢的文件图标主题
7 one dark pro 经典的主题,使用者众多,很耐看
8 material theme 经典"材料"主题
9 material theme icons 常与material theme配置的文件图标
10 shades of purple 赛博朋克风格的一款主题,很明亮风骚
11 dracula official 经典的吸血鬼主题
12 dracula at night 个人更喜欢这款小众的吸血鬼暗黑版(教学用它)
13 code runner 几乎可以快速运行常见的所有语言,如php,java,js...
14 codesnap 快速生成苹果电脑风格的代码片断截图,分享时使用

Markdown

序号 名称 描述
1 markdown preview... markdown 实时预览
2 markdownlint markdown 语法检查器

HTML

序号 名称 描述
1 auto close tag 标签自动关闭
2 auto rename tag 标签自动更名
3 indent-rainbow 以不同颜色显示代码缩进
4 css peek 查看并跳转到 css 定义位置
5 html css support css 自动智能补齐
6 intellsense for css ... html 中的 css 智能提示
7 easy less less 实时编译
8 px-to-viewport px 自动转 vw
9 svg preview svg 预览器
10 tailwind css ... 无需离开 html 就可快速构建出现代网页
11 tabout 按 tab 就可快速跳到下一下,或跳出/越过括号等

JS/VUE/ES6

序号 名称 描述
1 bracket pair ... 括号高亮配对提示
2 javascript(es6) code snippets 常用 js 代码片断
3 node-snippets 常用 node 代码片断
4 quokka.js js/es6 代码语法实时检查/执行器(续命法宝)
5 rest client 可不离开 vscode 环境进行 api 请求测试
6 eslint js 代码质量智能分析器
7 vetur vue 语法高亮,智能感知,emmet 等
8 vue3 snippets vue3 常用代码片断
9 vue-helper: vue-helper 在扩展中使用的 vue 提示,如 element ui

PHP常用

序号 名称 描述
1 php intelephense php 语法提示/自动补齐
2 php intellisense php 代码跟踪/重构/自动完成
3 php debug php 代码调试器
4 php docbloker php 生成块级注释
5 vscode-database vscode 数据库 SQL 支持插件

编程常用字体

字体名称 描述 支持连写
Fira Code 喜欢的真喜欢,讨厌的真讨厌 支持
JetBrains Mono JetBrains 出品,免费 支持

字体安装成功后,还需要在 vscode 中进行配置: settings.json

# 将Fira Code 字体放在第一个
"editor.fontFamily": "'Fira Code',Consoles, 'Courier New', monospace",

# 打开允许连写开关
"editor.fontLigatures": true,

本文来自:@PHP中文网公众号