From dcb5cd69de48e5477aa90ee7601ebe2b771e4a86 Mon Sep 17 00:00:00 2001
From: Anyon <zoujingli@qq.com>
Date: Thu, 9 Jan 2020 10:25:35 +0800
Subject: [PATCH] =?UTF-8?q?ComposerUpdate=20=E4=BF=AE=E6=94=B9=E7=B3=BB?=
 =?UTF-8?q?=E7=BB=9F=E6=A8=A1=E5=9D=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 application/admin/controller/Queue.php        | 44 +++++++++--
 application/admin/view/config/info.html       | 11 +--
 application/admin/view/queue/index.html       | 75 +++++++++++--------
 .../admin/view/queue/index_search.html        | 17 +++--
 vendor/composer/installed.json                |  8 +-
 .../think-library/src/command/Sync.php        |  2 +-
 .../src/helper/ValidateHelper.php             | 20 +++--
 7 files changed, 116 insertions(+), 61 deletions(-)

diff --git a/application/admin/controller/Queue.php b/application/admin/controller/Queue.php
index cb5662d73..a6d811362 100644
--- a/application/admin/controller/Queue.php
+++ b/application/admin/controller/Queue.php
@@ -16,7 +16,9 @@
 namespace app\admin\controller;
 
 use library\Controller;
+use library\service\ProcessService;
 use think\Console;
+use think\Db;
 use think\exception\HttpResponseException;
 
 /**
@@ -45,13 +47,14 @@ class Queue extends Controller
     public function index()
     {
         if (session('user.username') === 'admin') try {
-            $this->cmd = 'php ' . env('root_path') . 'think xtask:start';
             $this->message = Console::call('xtask:state')->fetch();
+            $this->command = ProcessService::instance()->think('xtask:start');
+            $this->listen = preg_match('/process.*?\d+.*?running/', $this->message, $attr);
         } catch (\Exception $exception) {
             $this->message = $exception->getMessage();
         }
         $this->title = '系统任务管理';
-        $this->iswin = PATH_SEPARATOR === ';';
+        $this->iswin = ProcessService::instance()->iswin();
         $query = $this->_query($this->table)->dateBetween('create_at,start_at,end_at');
         $query->like('title,preload')->equal('status')->order('id desc')->page();
     }
@@ -71,10 +74,15 @@ class Queue extends Controller
      * WIN开始监听任务
      * @auth true
      */
-    public function processStart()
+    public function start()
     {
         try {
-            $this->success(nl2br(Console::call('xtask:start')->fetch()));
+            $message = nl2br(Console::call('xtask:start')->fetch());
+            if (preg_match('/process.*?\d+/', $message, $attr)) {
+                $this->success('任务监听主进程启动成功!');
+            } else {
+                $this->error($message);
+            }
         } catch (HttpResponseException $exception) {
             throw $exception;
         } catch (\Exception $e) {
@@ -86,10 +94,17 @@ class Queue extends Controller
      * WIN停止监听任务
      * @auth true
      */
-    public function processStop()
+    public function stop()
     {
         try {
-            $this->success(nl2br(Console::call('xtask:stop')->fetch()));
+            $message = nl2br(Console::call('xtask:stop')->fetch());
+            if (stripos($message, 'succeeded')) {
+                $this->success('停止任务监听主进程成功!');
+            } elseif (stripos($message, 'finish')) {
+                $this->success('没有找到需要停止的进程!');
+            } else {
+                $this->error($message);
+            }
         } catch (HttpResponseException $exception) {
             throw $exception;
         } catch (\Exception $e) {
@@ -97,6 +112,23 @@ class Queue extends Controller
         }
     }
 
+    /**
+     * 清理3天前的记录
+     * @auth true
+     * @throws \think\Exception
+     * @throws \think\exception\PDOException
+     */
+    public function clear()
+    {
+        $map = [['time', '<', strtotime('-3days')]];
+        $result = Db::name($this->table)->where($map)->delete();
+        if ($result !== false) {
+            $this->success('成功清理3天前的任务记录!');
+        } else {
+            $this->error('清理3天前的任务记录失败!');
+        }
+    }
+
     /**
      * 删除系统任务
      * @auth true
diff --git a/application/admin/view/config/info.html b/application/admin/view/config/info.html
index 16abc472b..4807d8766 100644
--- a/application/admin/view/config/info.html
+++ b/application/admin/view/config/info.html
@@ -1,14 +1,15 @@
 {extend name="main"}
 
-{block name="content"}
+{block name="button"}
 
 {if auth('config')}
-<div class="think-box-shadow margin-bottom-15">
-    <span class="color-green font-w7 text-middle">系统参数配置:</span>
-    <a class="layui-btn layui-btn-sm" data-modal="{:url('config')}">修改系统配置</a>
-</div>
+<a class="layui-btn layui-btn-sm layui-btn-primary" data-modal="{:url('config')}">修改系统配置</a>
 {/if}
 
+{/block}
+
+{block name="content"}
+
 <div class="think-box-shadow margin-bottom-15">
     <span class="color-green font-w7 text-middle">文件存储引擎:</span>
     {foreach ['local'=>'本地服务器存储','qiniu'=>'七牛云对象存储','oss'=>'阿里云OSS存储'] as $k=>$v}
diff --git a/application/admin/view/queue/index.html b/application/admin/view/queue/index.html
index abd828b21..1b543e805 100644
--- a/application/admin/view/queue/index.html
+++ b/application/admin/view/queue/index.html
@@ -2,16 +2,20 @@
 
 {block name="button"}
 
+{if auth("start") && $iswin}
+<button data-load='{:url("start")}' class='layui-btn layui-btn-sm layui-btn-primary'>开始监听</button>
+{/if}
+
+{if auth("stop") && $iswin}
+<button data-load='{:url("stop")}' data-confirm="确定要停止主进程监听吗?" class='layui-btn layui-btn-sm layui-btn-primary'>停止监听</button>
+{/if}
+
 {if auth("remove")}
-<button data-action='{:url("remove")}' data-confirm="确定要批量删除任务吗?" data-rule="id#{key}" class='layui-btn layui-btn-sm layui-btn-primary'>批量删除</button>
+<button data-action='{:url("remove")}' data-rule="id#{key}" data-confirm="确定批量删除任务吗?" class='layui-btn layui-btn-sm layui-btn-primary'>批量删除</button>
 {/if}
 
-{if auth("processstart") && $iswin}
-<button data-load='{:url("processstart")}' class='layui-btn layui-btn-sm layui-btn-primary'>开始监听</button>
-{/if}
-
-{if auth("processstop") && $iswin}
-<button data-load='{:url("processstop")}' class='layui-btn layui-btn-sm layui-btn-primary'>停止监听</button>
+{if auth("clear")}
+<button data-load='{:url("clear")}' data-confirm="确定要清理3天前的任务记录吗?" class='layui-btn layui-btn-sm layui-btn-primary'>清理记录</button>
 {/if}
 
 {/block}
@@ -44,35 +48,40 @@
                 <span class="color-desc">任务指令:{$vo.preload}</span>
             </td>
             <td class='text-left nowrap'>
-                创建时间:{$vo.create_at|format_datetime} / {$vo.time|format_datetime}<br>
-                执行时间:{$vo.start_at|format_datetime} / {$vo.end_at|format_datetime}
+                计划时间:{$vo.time|format_datetime} {if isset($vo.exec_pid) and $vo.exec_pid>0}( 进程 <b class="color-blue">{$vo.exec_pid|default='-'}</b> ){/if}<br>
+                {if $vo.status eq 3 or $vo.status eq 4}
+                执行时间:{$vo.start_at|format_datetime}( 耗时 <b class="color-blue">{:sprintf("%.4f",strtotime($vo.end_at)-strtotime($vo.start_at))}</b> 秒 )
+                {elseif $vo.status eq 2} 开始时间:{$vo.start_at|format_datetime}
+                {else} 创建时间:{$vo.create_at|format_datetime} {/if}
             </td>
             <td class='text-left nowrap'>
-                任务状态:{eq name='vo.double' value='1'}
-                <span class="layui-badge layui-bg-green margin-right-5">复</span>
-                {else}
-                <span class="layui-badge layui-bg-blue margin-right-5">单</span>
-                {/eq}
+                <div>
+                    {eq name='vo.double' value='1'}
+                    <span class="layui-badge layui-bg-green margin-right-5">复</span>
+                    {else}
+                    <span class="layui-badge layui-bg-blue margin-right-5">单</span>
+                    {/eq}
 
-                {eq name='vo.status' value='1'}
-                <span class="layui-badge layui-bg-black">待处理</span>
-                {elseif $vo.status eq 2}
-                <span class="layui-badge layui-bg-green">处理中</span>
-                {elseif $vo.status eq 3}
-                <span class="layui-badge layui-bg-blue">处理完成</span>
-                {elseif $vo.status eq 4}
-                <span class="layui-badge layui-bg-red margin-right-5">处理失败</span>
-                <a class="layui-badge layui-bg-green" data-tips-text="重置该任务" data-action="{:url('redo')}" data-value="id#{$vo.id}">
-                    <i class="layui-icon font-s12">&#xe669;</i>
-                </a>
-                {/eq}
-                {if auth("admin/queue/remove") and in_array($vo.status,[1,3,4])}
-                <a data-action='{:url("remove")}' data-confirm="确定要删除该任务吗?" data-value="id#{$vo.id}" data-tips-text="删除该任务" class='layui-badge layui-bg-red margin-left-5'>
-                    <i class="layui-icon">&#xe640;</i>
-                </a>
-                {/if}
-                <br>
-                状态描述:<span class="color-desc">{$vo.desc|raw|default="没有获取到状态描述"}</span>
+                    {eq name='vo.status' value='1'}
+                    <span class="layui-badge layui-bg-black">待处理</span>
+                    {elseif $vo.status eq 2}
+                    <span class="layui-badge layui-bg-green">处理中</span>
+                    {elseif $vo.status eq 3}
+                    <span class="layui-badge layui-bg-blue">处理完成</span>
+                    {elseif $vo.status eq 4}
+                    <span class="layui-badge layui-bg-red margin-right-5">处理失败</span>
+                    <a class="layui-badge layui-bg-green" data-tips-text="重置该任务" data-action="{:url('redo')}" data-value="id#{$vo.id}">
+                        <i class="layui-icon font-s12">&#xe669;</i>
+                    </a>
+                    {/eq}
+
+                    {if auth("admin/queue/remove") and in_array($vo.status,[1,3,4])}
+                    <a data-action='{:url("remove")}' data-confirm="确定要删除该任务吗?" data-value="id#{$vo.id}" data-tips-text="删除该任务" class='layui-badge layui-bg-red margin-left-5'>
+                        <i class="layui-icon">&#xe640;</i>
+                    </a>
+                    {/if}
+                </div>
+                <div class="color-desc">{$vo.desc|raw|default="没有获取到状态描述"}</div>
             </td>
         </tr>
         {/foreach}
diff --git a/application/admin/view/queue/index_search.html b/application/admin/view/queue/index_search.html
index 182e1ff2a..114cca657 100644
--- a/application/admin/view/queue/index_search.html
+++ b/application/admin/view/queue/index_search.html
@@ -1,14 +1,19 @@
 {if session('user.username') eq 'admin'}
-<fieldset class="margin-bottom-10">
-    <legend>进程守护</legend>
+<fieldset class="margin-bottom-15">
+    <legend class="notselect">守护状态</legend>
     <div class="layui-code border-0 margin-top-0">
-        <p class="color-desc margin-top-10">当前消息队列守护进程运行状态</p>
-        {$message|raw|default='--'}
-        <p class="color-desc margin-top-10">配置定时任务来检查并启动进程(建议每分钟执行)</p>
-        {$cmd|default='--'}
+        <h4 class="color-desc margin-top-10 notselect">守护进程运行状态</h4>
+        {if $listen}
+        <span class="color-green">{$message|raw|default='--'}</span>
+        {else}
+        <span class="color-red">{$message|raw|default='--'}</span>
+        {/if}
+        <h4 class="color-desc margin-top-10 notselect">配置定时任务来检查并启动进程(建议每分钟执行)</h4>
+        <p>{$command|default='--'}</p>
     </div>
 </fieldset>
 {/if}
+
 <fieldset>
     <legend>条件搜索</legend>
     <form class="layui-form layui-form-pane form-search" action="{:request()->url()}" onsubmit="return false" method="get" autocomplete="off">
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index 6642b70e1..ff8fc6b58 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -401,12 +401,12 @@
         "source": {
             "type": "git",
             "url": "https://github.com/zoujingli/ThinkLibrary.git",
-            "reference": "bc77d2ff2e4ff7fb18a3a5bb6436633fe3f6b4ad"
+            "reference": "25ebb45be8d3c08c8abecd4620dbd857bdaf6f05"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/zoujingli/ThinkLibrary/zipball/bc77d2ff2e4ff7fb18a3a5bb6436633fe3f6b4ad",
-            "reference": "bc77d2ff2e4ff7fb18a3a5bb6436633fe3f6b4ad",
+            "url": "https://api.github.com/repos/zoujingli/ThinkLibrary/zipball/25ebb45be8d3c08c8abecd4620dbd857bdaf6f05",
+            "reference": "25ebb45be8d3c08c8abecd4620dbd857bdaf6f05",
             "shasum": "",
             "mirrors": [
                 {
@@ -426,7 +426,7 @@
             "qiniu/php-sdk": "^7.2",
             "topthink/framework": "5.1.*"
         },
-        "time": "2020-01-07T02:14:58+00:00",
+        "time": "2020-01-08T02:36:12+00:00",
         "type": "library",
         "installation-source": "dist",
         "autoload": {
diff --git a/vendor/zoujingli/think-library/src/command/Sync.php b/vendor/zoujingli/think-library/src/command/Sync.php
index 74995692c..a6d11e926 100644
--- a/vendor/zoujingli/think-library/src/command/Sync.php
+++ b/vendor/zoujingli/think-library/src/command/Sync.php
@@ -82,7 +82,7 @@ class Sync extends Command
         return $this->tree([
             'think', 'config/log.php', 'config/cookie.php', 'config/template.php',
             'application/admin', 'application/wechat', 'application/service',
-            'public/static/plugs', 'public/static/theme', 'public/static/admin.js',
+            'public/static/plugs', 'public/static/theme', 'public/static/admin.js', 'public/static/login.js',
         ]);
     }
 
diff --git a/vendor/zoujingli/think-library/src/helper/ValidateHelper.php b/vendor/zoujingli/think-library/src/helper/ValidateHelper.php
index 8dc759ee4..43fc54ed7 100644
--- a/vendor/zoujingli/think-library/src/helper/ValidateHelper.php
+++ b/vendor/zoujingli/think-library/src/helper/ValidateHelper.php
@@ -39,22 +39,30 @@ class ValidateHelper extends Helper
                 list($name, $alias) = explode('#', $name);
             }
             if (stripos($name, '.') === false) {
-                $data[$name] = empty($alias) ? $name : $alias;
+                if (is_numeric($name)) {
+                    $keys = $message;
+                    if (is_string($message) && stripos($message, '#') !== false) {
+                        list($name, $alias) = explode('#', $message);
+                        $keys = empty($alias) ? $name : $alias;
+                    }
+                    $data[$name] = input("{$type}{$keys}");
+                } else {
+                    $data[$name] = $message;
+                }
             } else {
                 list($_rgx) = explode(':', $name);
                 list($_key, $_rule) = explode('.', $name);
+                $keys = empty($alias) ? $_key : $alias;
                 $info[$_rgx] = $message;
-                $data[$_key] = empty($alias) ? $_key : $alias;
+                $data[$_key] = input("{$type}{$keys}");
                 $rule[$_key] = empty($rule[$_key]) ? $_rule : "{$rule[$_key]}|{$_rule}";
             }
         }
-        foreach ($data as $key => $name) $data[$key] = input("{$type}{$name}");
-        $validate = Validate::make($rule, $info);
-        if ($validate->check($data)) {
+        $validate = new Validate();
+        if ($validate->rule($rule)->message($info)->check($data)) {
             return $data;
         } else {
             $this->controller->error($validate->getError());
         }
     }
-
 }
\ No newline at end of file