<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
>
<channel>
<title><![CDATA[晕有空]]></title> 
<atom:link href="http://yunyk.vip/rss.php" rel="self" type="application/rss+xml" />
<description><![CDATA[使用emlog搭建的站点]]></description>
<link>http://yunyk.vip/</link>
<language>zh-cn</language>
<generator>www.emlog.net</generator>
<item>
    <title>关于青少年沉迷网络的控网方案的研究-以抖音短视频的报道为例</title>
    <link>http://yunyk.vip/post-16.html</link>
    <description><![CDATA[<h2>关于青少年沉迷网络的控网方案的研究<br>——以抖音短视频的报道为例</h2>
<video controls preload="auto" width="100%" poster="" data-setup='{"aspectRatio":"16:9"}'><source src="https://video5.pddpic.com/i1/2025-08-17/490b7aaa82ffae55c985ecb6a30e4191.mp4.f30.mp4" type="video/mp4"><object data="https://video5.pddpic.com/i1/2025-08-17/490b7aaa82ffae55c985ecb6a30e4191.mp4.f30.mp4" width="100%"><embed src="https://video5.pddpic.com/i1/2025-08-17/490b7aaa82ffae55c985ecb6a30e4191.mp4.f30.mp4" width="100%"><p class="vjs-no-js">如果你无法看到该视频,那么可能你的电脑不支持该文件格式。</p></object></video>
<h3>主流控网方式</h3>
<p>常见上网控制有域名控制、IP/Mac控制、时间段控制、物理控制(没收设备)。<br />
从今往后，可以增加一种控制方式：任务化控制。</p>
<h3>控网痛点</h3>
<p>网络加持的手机、电脑，使得被监护人痴迷于视频、游戏，<br />
如果把控不到位，会对身体、心理、学业造成不利的影响。<br />
如果生硬地管控手机、电脑及其网络的使用，大概率会遭到排斥，产生亲子矛盾。</p>
<blockquote>
<p>案例1：某妈妈没收孩子手机后，孩子对其拳脚相加。</p>
<p>案例2：某爸爸因孩子玩着手机什么也不管，<br />
遂夺取孩子的手机扔下楼去，孩子也跟着跳下去了。</p>
<p>案例3：某老师没收学生手机，学生趁其不备抹了老师脖子。</p>
</blockquote>
<p>造成以上悲剧，游戏成瘾性可能是主要因素，硬控却是关键的导火索，<br />
如果不硬控，最多只是耽误被监护人成才，并不影响他成为遵纪守法的公民。</p>
<h3>思考：新的控网手段</h3>
<p>有没有别的控网手段，让控网行为不会激化矛盾？<br />
譬如完成一定的任务来兑换上网时长，<br />
会不会成为一个有效的控网手段？</p>
<ol>
<li>完成家务兑换上网时长。</li>
<li>以优良成绩完成家庭作业兑换上网时长。</li>
<li>完成一定量的体育运动兑换上网时长。</li>
</ol>
<h3>可行性分析</h3>
<ul>
<li>家务、作业、体育运动等确实有很多监护人在实施</li>
<li>但是不一定能长久持续，</li>
<li>一是被监护人不一定长期配合，</li>
<li>二是监护人不一定长期精力充沛地跟踪实施。</li>
</ul>
<blockquote>
<p>忧虑：被监护人在唯利是图的环境中成长。</p>
<p>案例：某青年在家庭任务模式下长大，父母病了，<br />
要他帮忙陪护做点家务，他竟然伸向父母索要服务费。</p>
</blockquote>
<h3>研究启发</h3>
<ul>
<li>我平时偶尔会连接一些开放式网络，这些网络连接以后，<br />
会跳出一个网页让我填手机获取验证码，填入验证码以后即可上网。</li>
<li>有的商家把这种认证网页做成广告、问卷调查的任务，<br />
即点击广告或者完成问卷调查可获得wifi上网许可。</li>
<li>设计一款上网认证路由服务系统，完成作业任务<br />
可兑换一定的上网时长，不限次数。</li>
</ul>
<h3>推测可能涉到的硬件和软件</h3>
<p>性能较好的计算机用于开发<br />
可支持网络劫持的路由器<br />
认证服务，含服务器、域名、Web、数据库。</p>
<h3>技术选型</h3>
<p>通过上网查阅大量资料，最终明确敲定了研究方向，<br />
基于以下硬件与开源软件可快速精准地实现需求。</p>
<ol>
<li>i7-8代计算机主机+Ubuntu系统</li>
<li>Openwrt 可兼容大量路由器硬件的开源系统。</li>
<li>Wifidog 劫持并跳转网络链接的开源应用。</li>
<li>认证服务 对接Wifidog的认证接口服务，主要的实验工作。</li>
<li>路由器设备，以MT7620架构为实验对象。</li>
</ol>
<h3>实验过程</h3>
<ul>
<li>根据Wifidog的文档说明，开发服务端的接口。</li>
<li>安装Ubuntu系统到计算机主机，过程略过。</li>
<li>登录Ubuntu系统，从Github中拉取Openwrt、Wifidog源码。</li>
<li>修改Openwrt源码，按自动的需求修改相关配置。</li>
<li>修改Wifidog源码，配置好认证服务的地址、端口。</li>
<li>进入Openwrt项目目录，指定好硬件架构(MT7620)<br />
执行编译命令，等待编译30至120分钟左右。</li>
<li>编译成功后，找到对应的固件(.bin)文件，<br />
把固件刷入路由器，刷机步骤略过。</li>
<li>刷机成功后重启路由器，等待开放式WIFI的出现。</li>
<li>连接此开放式网络，观察它是否能弹出认证网页，<br />
未弹出则要回到前面步骤解决问题。</li>
<li>如果弹出成功，完成并提交作业，答对60%以上可获得上网时长。</li>
<li>此实验的第一阶段宣告成功。</li>
</ul>
<h3>辅助工具</h3>
<ul>
<li>Deepseek，用于生成题库数据。</li>
<li>Redis，用于访问限流、设备限流。</li>
<li>自建扫码APP，用于一键把路由器设备加入白名单。</li>
<li>USB网卡多件，路由器刷机过程网关会变多次，<br />
每张网卡设置一个静态网关</li>
</ul>
<h3>风险与挑战</h3>
<ol>
<li>联网积极性-个人可能不太愿意为联网做任务,<br />
因为当前国内网络流量资源丰富，每个家庭、每个店铺、<br />
每台手机都能高速上网。</li>
<li>安全因素-存在伪基站、伪热点钓取个人信息。</li>
<li>设备提醒-有的设备如苹果手机会提示“开放式网络存在安全风险”。</li>
</ol>]]></description>
    <pubDate>Mon, 11 Aug 2025 12:00:02 +0800</pubDate>
    <dc:creator>神话君</dc:creator>
    <guid>http://yunyk.vip/post-16.html</guid>
</item>
<item>
    <title>Openwrt智能路由刷机细节</title>
    <link>http://yunyk.vip/post-14.html</link>
    <description><![CDATA[<h2>Openwrt刷机/恢复步骤</h2>
<ol>
<li>电脑网上设置固定ip: 192.168.1.188</li>
<li>用网线连接路由器</li>
<li>路由器断电，长按重置键，通电，5秒后松开重置键。</li>
<li>电脑浏览器输入192.168.1.1</li>
<li>进入固件界面</li>
<li>上传固件文件，提交并执行</li>
</ol>
<h2>验证刷机成功与否</h2>
<ul>
<li>刷机完成后打开192.168.66.1</li>
<li>登录ssh，输入uci show wireless</li>
</ul>
<h3>注意：mac地址要与设备外壳的条码一致</h3>
<blockquote>
<p>利用breed刷机时可以改mac地址<br />
登录路由吕也可以改mac地址</p>
</blockquote>]]></description>
    <pubDate>Sat, 09 Aug 2025 07:26:30 +0800</pubDate>
    <dc:creator>神话君</dc:creator>
    <guid>http://yunyk.vip/post-14.html</guid>
</item>
<item>
    <title>万物皆可环境变量化(env)</title>
    <link>http://yunyk.vip/post-13.html</link>
    <description><![CDATA[<h2>背景</h2>
<p>主流的开发框架都支持env模式，无论是java、node、vue还是php，php比较有代表性的框架有laravel、TP6，它们都支持读env配置，小编眼界有限，不知道还有没有其他框架支持。<br />
就当其他框架都不支持吧，接下来用我提供的方法轻微改造一下即可。</p>
<h2>使用环境变量的优势</h2>
<ol>
<li>资源配置不需要写在代码里，利于项目维护和拓展。</li>
<li>开发环境、测试环境、灰度环境、生产环境等配置内容各有不同，使用环境变量可支持同一份代码，在多环境中运行互不干扰。</li>
<li>多客户项目部署</li>
</ol>
<h2>使用前提</h2>
<p>linux系统，php启用putenv函数</p>
<h3>假设.env文件有以下内容</h3>
<pre><code class="language-shell">[db]
master.host=127.0.0.1
master.database=mydb
master.password=mydbxxx
master.port=3306

[redis]
host=127.0.0.1
port=6379
select=0</code></pre>
<h3>在公共文件中加入以下代码</h3>
<pre><code class="language-php">define('__ROOT__','根目录');
define('ENV_PRE','PHP_');
if (is_file( __ROOT__. '/.env')) {
    $env = parse_ini_file(__ROOT__ . '/.env', true);
    foreach ($env as $key =&gt; $val) {
        $name = ENV_PRE . strtoupper($key);

        if (is_array($val)) {
            foreach ($val as $k =&gt; $v) {
                $item = $name . '_' . strtoupper(str_replace('.','_',$k));
                putenv("$item=$v");
            }
        } else {
            putenv("$name=$val");
        }
    }
}
if (!function_exists('env')) {
    function env($name,$default=null)
    {
        $result = getenv(ENV_PRE . strtoupper(str_replace('.', '_', $name)));
        if (false !== $result) {
            if ('false' === $result) {
                $result = false;
            } elseif ('true' === $result) {
                $result = true;
            }
        }else{
            $result = $default;
        }
        if(is_string($result) &amp;&amp; strpos($result,',')){
            $result = explode(',',$result);
            //array_pop($result);
        }
        return $result;
    }
}</code></pre>
<h3>假如项目的配置文件是config.php</h3>
<pre><code class="language-php">//从.env文件中读取数据库配置和redis配置
return [
    'db'=&gt;[
        'host'=&gt;env('db.master.host'),
        'database'=&gt;env('db.master.database'),
        'password'=&gt;env('db.master.password'),
        'port'=&gt;env('db.master.port'),
    ],
    redis=&gt;[
        'host'=&gt;env('redis.host','127.0.0.1'),
        'port'=&gt;env('redis.port',6379)
    ]
];</code></pre>
<h2>至止，我们再也不会受项目配置的冲突所困扰了</h2>]]></description>
    <pubDate>Tue, 09 Jul 2024 10:43:54 +0800</pubDate>
    <dc:creator>神话君</dc:creator>
    <guid>http://yunyk.vip/post-13.html</guid>
</item>
<item>
    <title>隐私号码加密解密，解决用户信息泄漏问题</title>
    <link>http://yunyk.vip/post-12.html</link>
    <description><![CDATA[<h3>背景</h3>
<p>最近有不少优质客户反馈被大量电话骚扰，第一天下单，第二天就被营销电话轮番轰炸。<br />
其实一个月前就出现了少量客户被骚扰的事件，我为了钓出内鬼，增加了数据导出监控日志，但是我们的优质客户被卖了，明显不是批量出卖的，而是内鬼经过逐个分析用户质量后精准窃取来出卖的。<br />
目前来看情况比较严峻，时不待我，钓鱼的意义不大了。</p>
<h3>安全隐患</h3>
<p>经分析，我们的系统存在<strong>4</strong>个安全空白区：</p>
<ol>
<li>管理后台有个主账号有多人共用</li>
<li>离职人员的账号未及时清理</li>
<li>客户的个人信息和收货信息对任何员工都是可见的，这可能是最致命的</li>
<li>数据库用户的电话号码是明文存储的，技术人员全都可以查看，虽然相信技术人员的人品，但应有的防护还是得有</li>
</ol>
<h3>方案</h3>
<ol>
<li>管理后台落实一人一账号</li>
<li>清理离职人员的账号</li>
<li>用户的号码不明文展示，点击时再实时请求解密，并且请求解密作为一个权限行为来管理，再加入请求日志</li>
<li>数据库所有的电话号码全都进行加密保存，杜绝一切明文的电话号码</li>
</ol>
<h3>方案最优补充：隐私拨号</h3>
<p>以上方案能很大限度地避免用户隐私泄漏，但也是百密一疏，因为有权限的员工依然<strong>有机会查看用户号码</strong>，机灵的员工会手工记录每个优质的用户资料整理成册，等哪天提桶跑路时把名册甩手一卖，公司很有可能遭到大量投诉。<br />
对此，<strong>隐私拨号</strong>可以完美地杜绝电话泄漏的隐患。员工点击获取号码时，会为员工号码与客户号码绑定生成一个<strong>隐私号码</strong>展示给员工，员工拨打隐私号码时<strong>呼叫转移</strong>到客户号码，客户回电隐私号码也会呼叫转移到员工号码，在完成客户服务以后，隐私号码会解绑员工与客户的关系，互不打扰。如果员工需要再次联系客户可再次绑定隐私号码。  </p>
<p>【隐私拨号】功能需要第三方服务商支持，如：<br />
<a href="https://cloud.tencent.com/act/cps/redirect?redirect=2446&amp;cps_key=893daefad1d7a14784b26a8c395d87d5&amp;from=console" title="1">腾讯云</a><br />
<a href="https://www.huaweicloud.com/product/privatenumber.html">阿里云</a></p>
<h1>技术要点必备</h1>
<pre><code>    //以下是PHP写的加密解密方法
    /**
    * 加密数据
    * @param $str 需要保护的号码
    * @param $key 密钥，加密和解密操作的密钥必须一致
    * @param $start 开始加密的位置
    * @param $end 截止加密的位置
    */
    function data_enc($str,$key='love me',$start=3,$end=-3){
        $arr = str_split($str);
        $tail = count($arr);
        if($end&gt;0){
            $tail = max($end, $start);
        }else{
            $tail = $tail+$end;
        }
        foreach ($arr as $idx=&gt;&amp;$a){
            if($idx&gt;=$start &amp;&amp; $idx&lt;$tail){
                $a = chr(65+(ord(sha1($key))+$idx-$start)%17+$a);
            }
        }
        return implode('',$arr);
    }
    /**
    * 解密数据
    * @param $str 需要保护的号码
    * @param $key 密钥，加密和解密操作的密钥必须一致
    * @param $start 开始加密的位置
    * @param $end 截止加密的位置
    */
    function data_dec($str,$key='love me',$start=3,$end=-3){
        $arr = str_split($str);
        $tail = count($arr);
        if($end&gt;0){
            $tail = max($end, $start);
        }else{
            $tail = $tail+$end;
        }
        foreach ($arr as $idx=&gt;&amp;$a){
            if($idx&gt;=$start &amp;&amp; $idx&lt;$tail){
                $a = ord($a)-65-(ord(sha1($key))+$idx-$start)%17;
            }
        }
        return implode('',$arr);
    }
    //调用示例
    $mobile = '13588888888';
    $enc = data_enc($mobile);
    $dec = data_dec($enc);
    var_dump([$mobile,$enc,$dec]);//输出如： 13588888888,135LMNO8888,13588888888</code></pre>
<h3>如上示例，只要解密结果与原数据一致就表示加密成功，可以放心地应用了。</h3>]]></description>
    <pubDate>Sat, 06 Jul 2024 15:10:53 +0800</pubDate>
    <dc:creator>神话君</dc:creator>
    <guid>http://yunyk.vip/post-12.html</guid>
</item>
<item>
    <title>Fastadmin插件之[重要日志通知-logtoim]的配置</title>
    <link>http://yunyk.vip/post-10.html</link>
    <description><![CDATA[<h3>Fastadmin插件之[重要日志通知-logtoim]的配置</h3>
<h4>1.创建一个或多个群聊机器人</h4>
<blockquote>
<p>钉钉：<a href="https://open.dingtalk.com/document/orgapp/custom-robot-access" target="_blank">点击查看文档</a><br />
飞书：<a href="https://open.feishu.cn/document/ukTMukTMukTM/ucTM5YjL3ETO24yNxkjN" target="_blank">点击查看文档</a><br />
企业微信：<a href="https://developers.weixin.qq.com/community/develop/article/doc/0000ac5e2d0948bbf02edf93553413" target="_blank">点击查看文档</a><br />
初始的配置是钉钉的群聊机器人，可加入该群预先体验</p>
<img width = '200' height ='250' src ="http://yunyk.vip/content/uploadfile/202305/3b191683729635.jpg" alt="钉钉测试群"/>
</blockquote>
<h4>2.配置插件并保存</h4>
<p>在插件的配置界面里设置webhook、关键词、秘钥，保存</p>
<h4>3.测试插件</h4>
<p>点击【测试日志通知】按钮，然后在群聊中查收通知</p>]]></description>
    <pubDate>Wed, 10 May 2023 10:50:04 +0800</pubDate>
    <dc:creator>神话君</dc:creator>
    <guid>http://yunyk.vip/post-10.html</guid>
</item>
<item>
    <title>VirtualBox内Linux出现创建软链接失败问题解决</title>
    <link>http://yunyk.vip/post-9.html</link>
    <description><![CDATA[<ol>
<li>ln: 无法创建符号链接&quot; … &quot;: 不支持的操作</li>
<li>ln: 无法创建符号链接&quot; … &quot;: 协议错误</li>
</ol>
<p>可能发生在:</p>
<blockquote>
<ol>
<li>ln 创建链接时;</li>
<li>解压缩文件过程中;</li>
</ol>
</blockquote>
<p>原因:</p>
<blockquote>
<p>留意跨文件系统的ln操作</p>
</blockquote>
<p>已知实测:</p>
<blockquote>
<p>虚拟机共享windows文件夹,在共享的文件夹内,不可以创建到linux本地目录的链接.<br />
但可以在linux本地目录 创建到 共享目录的符号链接.</p>
</blockquote>
<p>————————————————<br />
转自<a href="https://blog.csdn.net/guozhongwei1/article/details/82834848">ln: 无法创建符号链接“ ...... “: 不支持的操作</a></p>]]></description>
    <pubDate>Thu, 02 Dec 2021 17:45:36 +0800</pubDate>
    <dc:creator>神话君</dc:creator>
    <guid>http://yunyk.vip/post-9.html</guid>
</item>
<item>
    <title>替代navicat数据库工具</title>
    <link>http://yunyk.vip/post-8.html</link>
    <description><![CDATA[<p>navicat工具很好用，但要收费，想要免费就得找注册机，太麻烦了，这里推荐一款免费神器，不仅可以navicat媲美，还能连clickhouse列式数据库<br />
这么牛，它就是 <a href="https://dbeaver.io/" title="DBeaver">DBeaver</a></p>]]></description>
    <pubDate>Sat, 20 Nov 2021 16:56:31 +0800</pubDate>
    <dc:creator>神话君</dc:creator>
    <guid>http://yunyk.vip/post-8.html</guid>
</item>
<item>
    <title>Ubuntu安装桌面环境</title>
    <link>http://yunyk.vip/post-7.html</link>
    <description><![CDATA[<p>在命令环境下运行如下命令:</p>
<pre><code> apt-get update   //更新软件库
 apt-get upgrade   //升级软件
 apt-get install ubuntu-desktop    //安装Ubuntu桌面系</code></pre>
<p>安装时间有点长，需要耐心等待。</p>
<p>reboot重启后发现桌面环境不能使用root账户登录.<br />
重启然后使用Ctrl + Alt + F1 进入命令行使用root登陆 </p>
<p>运行命令</p>
<pre><code>sudo vi /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf     //打开50-ubuntu.conf</code></pre>
<p>在末尾添加</p>
<pre><code>greeter-show-manual-login=true      //允许切换用户登陆
allow-guest=false    //禁用Guest  </code></pre>
<p>完整代码</p>
<pre><code> [Seat:*]
 user-session=ubuntu
 greeter-show-manual-login=true
 allow-guest=false</code></pre>
<p>保存重启(在VI模式下编辑完成后使用Esc键切换到末行模式,然后输入:wq退出编辑)发现root用户登陆后还是有警告<br />
修改/root/.profile文件 (图形界面下修改请勾选显示隐藏文件)<br />
将mesg n 替换为 tty -s &amp;&amp; mesg n<br />
完整代码</p>
<pre><code># ~/.profile: executed by Bourne-compatible login shells.
if [ "$BASH" ]; then
if [ -f ~/.bashrc ]; then  
 . ~/.bashrc
fi
fi
tty -s &amp;&amp; mesg n || true</code></pre>
<p>保存后重启即可完美在桌面环境登陆root</p>
<p>转自<a href="https://www.cnblogs.com/ytyzhn/p/12658813.html" title="Ubuntu安装桌面环境">Ubuntu安装桌面环境</a></p>]]></description>
    <pubDate>Sat, 20 Nov 2021 16:49:45 +0800</pubDate>
    <dc:creator>神话君</dc:creator>
    <guid>http://yunyk.vip/post-7.html</guid>
</item>
<item>
    <title>Excel导出工具</title>
    <link>http://yunyk.vip/post-6.html</link>
    <description><![CDATA[<h3>该工具集成了PHPExcel的功能，可自动冻结首行、自动处理超长数字、导出到下载、导出到文件目录</h3>
<h3>话不多说直接上代码</h3>
<pre><code>&lt;?php

namespace func;
require_once('PHPExcel.php');
use PHPExcel;
use PHPExcel_Cell;
use PHPExcel_Style_Alignment;

/**
 * Excel表格导出工具
 * Class ExcelExporter
 * @package func
 */
class ExcelExporter
{
     const UPLOAD_SITE_URL = $_SERVER['HTTP_HOST'];
    /**
     * 导出到http下载
     * @param $name
     * @param $data
     * @param $header
     * @throws \PHPExcel_Writer_Exception
     */
    public static function exportHttp($name,$data,$header){
        header("Content-Type: application/force-download");
        header("Content-Type: application/octet-stream");
        header("Content-Type: application/download");
        header('Content-Disposition:inline;filename='.$name.'.xlsx');
        $objWriter = self::createDataWriter($data,$header);
        //下载文件在浏览器窗口
        $objWriter-&gt;save('php://output');
    }

    /**
     * 导出到文件目录
     * @param $name
     * @param $data
     * @param $header
     * @param string $path
     * @return string
     * @throws \PHPExcel_Writer_Exception
     */
    public static function exportFile($name,$data,$header,$path = ''){
        $relativePath = '/'.($path?:'daily').'/';
        $fileDir = BASE_UPLOAD_PATH.$relativePath;
        if(!file_exists($fileDir)){
            mkdir($fileDir,0755,true);
        }
        $fileName = $name.date('-YmdHis').'.xlsx';
        $objWriter = self::createDataWriter($data,$header);
        $objWriter-&gt;save($fileDir.$fileName);
        return UPLOAD_SITE_URL.$relativePath.$fileName;
    }
    private static function createDataWriter($data,$header){
        //set_time_limit(0);
        ini_set('memory_limit','1024M');
        $objPHPExcel = new PHPExcel();
        //单元格居中和设置字体和字体大小
        $objPHPExcel-&gt;getDefaultStyle()-&gt;getAlignment()-&gt;setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_JUSTIFY);//居中
        $objPHPExcel-&gt;getDefaultStyle()-&gt;getAlignment()-&gt;setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);//居中
        $objPHPExcel-&gt;getDefaultStyle()-&gt;getAlignment()-&gt;setShrinkToFit(true);
        $objPHPExcel-&gt;getDefaultStyle()-&gt;getAlignment()-&gt;setWrapText(false);
        $objPHPExcel-&gt;getDefaultStyle()-&gt;getFont()-&gt;setName('Microsoft YaHei Light')-&gt;setSize(11);//设置字体
        $objPHPExcel-&gt;setActiveSheetIndex(0);
        $sheet = $objPHPExcel-&gt;getActiveSheet();
        $sheet-&gt;getRowDimension(1)-&gt;setRowHeight(30);//设置行高
        $sheet-&gt;getDefaultColumnDimension()-&gt;setAutoSize(true);//设置宽度
        $i=0;
        foreach ($header as $key=&gt;$val) {
            $t_key = PHPExcel_Cell::stringFromColumnIndex($i);

            $sheet-&gt;getStyle($t_key.'1')-&gt;getFont()-&gt;setBold(true);//设置加粗
            $sheet-&gt;getColumnDimension($t_key)-&gt;setAutoSize(true);//设置宽度
            $sheet-&gt;setCellValue($t_key.'1',$val);
            $i++;
        }

        $a = 2; //合并起始行
        //设置导出内容
        foreach ($data as $key=&gt; $item){
            if($key%1000 == 0){
                ob_flush();
                flush();
            }
            if($item['sub_rows']&gt;1){
                $sheet-&gt;getRowDimension($a)-&gt;setRowHeight(20*$item['sub_rows']);
            }
            $i=0;
            foreach ($header as $head_key=&gt;$val){
                $t_key = PHPExcel_Cell::stringFromColumnIndex($i);
                //字符化显示0开头的数字、长数字
                if(preg_match("/^0\\d+$/",$item[$head_key]) || (is_numeric($item[$head_key]) &amp;&amp; strlen($item[$head_key])&gt;10)){
                    $sheet-&gt;setCellValueExplicit($t_key.$a,$item[$head_key]??'');
                }else{
                    $sheet-&gt;setCellValue($t_key.$a,$item[$head_key]??'');
                }

                $i++;
            }
            $a++;
        }
        $sheet-&gt;freezePane('A2');
        //生成excel文件
        return \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
    }
}</code></pre>]]></description>
    <pubDate>Thu, 14 Oct 2021 16:31:32 +0800</pubDate>
    <dc:creator>神话君</dc:creator>
    <guid>http://yunyk.vip/post-6.html</guid>
</item>
<item>
    <title>宝塔启动异常-ModuleNotFoundError: No module named 'geventwebsocket'</title>
    <link>http://yunyk.vip/post-5.html</link>
    <description><![CDATA[<h3>系统：centos7.3</h3>
<p>前段时间一时起兴安装了python3后，认为python2就没必存在了，盲目删除了，结果一大堆异常。<br />
首先是python无法使用，然后又是yum不可使用。试图下载安装yum提示需要python支持，安装python又提示yum不可用，折腾了好久才得以解决，暂不说这一波经历了，先说宝塔问题。<br />
自从删除python2以后，宝塔缺少各种依赖库，我都逐一补上，唯独这个geventwebsocket缺失，网上找了很多方案照做都未解决。后来我突发其想，是不是pip运行的python版本不对，查看一下pip版本</p>
<pre><code># pip -V
pip 21.2.4 from /usr/local/python3/lib/python3.7/site-packages/pip (python 3.7)</code></pre>
<p>再看看pip路径</p>
<pre><code># which pip
/usr/local/bin/pip</code></pre>
<p>继续看pip文件头</p>
<pre><code># cat /usr/local/bin/pip
#!/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from pip._internal.cli.main import main
if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(main())</code></pre>
<p>果然是pip用的版本问题，先把它干掉</p>
<p><code># mv /usr/local/bin/pip /usr/local/bin/pip3.7</code></p>
<p>更新yum</p>
<p><code># yum update</code></p>
<p>yum更新完成后执行</p>
<p><code># wget https://bootstrap.pypa.io/pip/2.7/get-pip.py</code></p>
<p><code># python ./get-pip.py</code></p>
<p>我们再查看pip</p>
<pre><code># which pip
/bin/pip</code></pre>
<p>执行pip安装gevent-websocket试试</p>
<pre><code># pip install gevent-websocket
-bash: /usr/local/bin/pip: 没有那个文件或目录</code></pre>
<p>环境变量问题，这个好办,只需要</p>
<p><code># ln -s /bin/pip /usr/local/bin/pip</code></p>
<p>再试试安装</p>
<pre><code># pip install gevent-websocket
DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. pip 21.0 will drop support for Python 2.7 in January 2021. More details about Python 2 support in pip can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support pip 21.0 will remove support for this functionality.
Processing /root/.cache/pip/wheels/c7/57/49/3dfd73ead67942123da1f45fb2b5db9da7704fed05b150deb2/gevent_websocket-0.10.1-cp27-none-any.whl
Requirement already satisfied: gevent in /usr/lib64/python2.7/site-packages (from gevent-websocket) (1.0)
Installing collected packages: gevent-websocket
Successfully installed gevent-websocket-0.10.1</code></pre>
<p>看样子安装成功了，是否彻底成功，还得让宝塔说了算</p>
<pre><code># bt restart
Stopping Bt-Tasks...    done
Stopping Bt-Panel...    done
Starting Bt-Panel....   done
Starting Bt-Tasks...    done</code></pre>
<p>令人愉快的结果！</p>]]></description>
    <pubDate>Thu, 16 Sep 2021 16:08:55 +0800</pubDate>
    <dc:creator>神话君</dc:creator>
    <guid>http://yunyk.vip/post-5.html</guid>
</item></channel>
</rss>