Sfoglia il codice sorgente

Merge pull request #874 from visuddhinanda/chanpter_progress

后台任务成功后,给钉钉发送消息
visuddhinanda 3 anni fa
parent
commit
ef0fd3f781

+ 5 - 5
app/Console/Commands/UpgradeChapterDynamic.php

@@ -16,7 +16,7 @@ class UpgradeChapterDynamic extends Command
      *
      * @var string
      */
-    protected $signature = 'upgrade:chapterdynamic {--one}';
+    protected $signature = 'upgrade:chapterdynamic {--test}';
 
     /**
      * The console command description.
@@ -84,7 +84,7 @@ class UpgradeChapterDynamic extends Command
             Storage::disk('local')->put("public/images/chapter_dynamic/{$filename}", $svg);
             $bar->advance();
 
-            if($this->option('one')){
+            if($this->option('test')){
                 break; //调试代码
             }
 
@@ -93,7 +93,7 @@ class UpgradeChapterDynamic extends Command
 
         $this->info('用时'.(time()-$start));
         $start = time();
-        
+
         $this->info('更新缺的章节空白图');
         // 更新缺的章节空白图
         $chapters = PaliText::select('book','paragraph')
@@ -108,7 +108,7 @@ class UpgradeChapterDynamic extends Command
             }
             $bar->advance();
 
-            if($this->option('one')){
+            if($this->option('test')){
                 break; //调试代码
             }
         }
@@ -148,7 +148,7 @@ class UpgradeChapterDynamic extends Command
             Storage::disk('local')->put("public/images/chapter_dynamic/{$filename}", $svg);
             $bar->advance();
 
-            if($this->option('one')){
+            if($this->option('test')){
                 break; //调试代码
             }
         }

+ 25 - 2
app/Console/Commands/UpgradeDaily.php

@@ -3,6 +3,8 @@
 namespace App\Console\Commands;
 
 use Illuminate\Console\Command;
+use Illuminate\Support\Carbon;
+use Illuminate\Support\Facades\Http;
 
 class UpgradeDaily extends Command
 {
@@ -37,12 +39,33 @@ class UpgradeDaily extends Command
      */
     public function handle()
     {
-        $this->call('upgrade:palitext');
-        $this->call('upgrade:palitextid');
+        $start = time();
+        # 刷巴利语句子uuid 仅调用一次
+        //$this->call('upgrade:palitextid');
+        //巴利原文段落库目录结构改变时运行
+        $this->call('upgrade:palitext'); 
+        #巴利段落标签
         $this->call('upgrade:palitexttag');
+        #译文进度
         $this->call('upgrade:progress');
         $this->call('upgrade:progresschapter');
+        # 段落更新图
+        $this->call('upgrade:chapterdynamic');
+        # 逐词译数据库分析
         $this->call('upgrade:wbwanalyses');
+
+        $time = time()-$start;
+        $url = "https://oapi.dingtalk.com/robot/send?access_token=34143dbec80a8fc09c1cb5897a5639ee3a9a32ecfe31835ad29bf7013bdb9fdf";
+        $param = [
+        "markdown"=> [
+            "title"=> "后台任务", 
+            "text"=> " wikipali: 后台任务成功执行。用时{$time}", 
+        ], 
+        "msgtype"=>"markdown"
+        ];
+
+        $response = Http::post($url, $param);
+
         return 0;
     }
 }

+ 0 - 9
app/Console/Commands/UpgradeProgressChapter.php

@@ -117,15 +117,6 @@ class UpgradeProgressChapter extends Command
                             'book'=>$book->book_id,
                             'para'=>$chapter->paragraph,
                             'channel_id'=>$final->channel_id];
-                    $value = [
-                            'lang'=>$lang,
-                            'all_trans'=>$final->cp_len/$chapter_strlen,
-                            'public'=>$final->cp_len/$chapter_strlen,
-                            'progress'=>$final->cp_len/$chapter_strlen,
-                            'title'=>mb_substr($title,0,255,"UTF-8"),
-                            'created_at'=>$finalAt,
-                            'updated_at'=>$updateAt
-                        ];
                     
                     $rules = array(
                         'book' => 'integer',

+ 10 - 0
app/Console/Kernel.php

@@ -16,6 +16,16 @@ class Kernel extends ConsoleKernel
     protected function schedule(Schedule $schedule)
     {
         // $schedule->command('inspire')->hourly();
+        $schedule->timezone('Asia/Shanghai')
+                 ->command('upgrade:daily')
+                 ->dailyAt('00:00')
+                 ->onSuccess(function () {
+                    // The task succeeded...
+                    
+                  })
+                 ->onFailure(function () {
+                    // The task failed...
+                 });
     }
 
     /**

+ 25 - 6
app/Http/Controllers/ProgressChapterController.php

@@ -149,6 +149,7 @@ class ProgressChapterController extends Controller
                     $all_count = count($chapters);
                 break;
             case 'lang':
+                
                 $chapters = ProgressChapter::select('lang')
                                             ->selectRaw('count(*) as count')
                                             ->where("progress",">",$minProgress)
@@ -163,12 +164,19 @@ class ProgressChapterController extends Controller
             总共有多少channel
             */
                 $chapters = ProgressChapter::select('channel_id')
-                                            ->selectRaw('count(*) as count')
-                                            ->with(['channel' => function($query) {  //city对应上面province模型中定义的city方法名  闭包内是子查询
+                                           ->selectRaw('count(*) as count')
+                                           ->with(['channel' => function($query) {  //city对应上面province模型中定义的city方法名  闭包内是子查询
                                                 return $query->select('*');
                                             }])
-                                            ->where("progress",">",$minProgress)
-                                            ->groupBy('channel_id')
+                                           ->leftJoin('channels','progress_chapters.channel_id', '=', 'channels.uid')
+                                           ->where("progress",">",$minProgress);
+                if(!empty($request->get('channel_type'))){
+                    $chapters =  $chapters->where('channels.type',$request->get('channel_type'));
+                }
+                if(!empty($request->get('lang'))){
+                    $chapters =  $chapters->where('progress_chapters.lang',$request->get('lang'));
+                }
+                $chapters =  $chapters->groupBy('channel_id')
                                             ->orderBy('count','desc')
                                             ->get();
                 $all_count = count($chapters);
@@ -242,9 +250,20 @@ class ProgressChapterController extends Controller
                     $channel = "";
                 }
 
+
+
                 $param[] = $minProgress;
+
+                if(!empty($request->get('lang'))){
+                    $whereLang = " and pc.lang = ? ";
+                    $param[] = $request->get('lang');
+                }else{
+                    $whereLang = "   ";
+                }                
                 $param_count = $param;
                 $param[] = $offset;
+
+
                 $query = "
                 select tpc.uid, tpc.book ,tpc.para,tpc.channel_id,tpc.title,pt.toc,pt.path,tpc.progress,tpc.summary,tpc.created_at,tpc.updated_at 
                     from (
@@ -261,7 +280,7 @@ class ProgressChapterController extends Controller
                         ) CID 
                         left join $pc as pc on CID.cid = pc.uid 
                         where pc.progress > ? 
-                        $channel
+                        $channel  $whereLang
                         order by created_at desc
                         limit 20 offset ?
                     ) tpc 
@@ -293,7 +312,7 @@ class ProgressChapterController extends Controller
                         ) CID 
                         left join $pc as pc on CID.cid = pc.uid 
                         where pc.progress > ? 
-                        $channel
+                        $channel   $whereLang
                 ";
                 $count = DB::select($query,$param_count);
                 $all_count = $count[0]->count;

+ 18 - 24
public/app/palicanon/index1.php

@@ -229,38 +229,40 @@ span.channel {
             <div class="filter submenu">
                 <div class="title submenu_title">设定</div>
                 <div class='inner' id='filter-setting' >
+                    <div class='settting-item'>
+                        <span>语言</span>
+                        <span>
+                            <select id='setting_lang'>
+                                <option value='auto'>自动</option>
+                                <option value=''>全部</option>
+                                <option value='zh'>中文</option>
+                                <option value='en'>英文</option>
+                            </select>
+                        </span>
+                    </div>
                     <div class='settting-item'>
                         <span>内容类型</span>
                         <span>
-                            <select>
+                            <select id='setting_channel_type'>
                                 <option value=''>全部</option>
-                                <option value='translation'>译文</option>
+                                <option value='translation' selected >译文</option>
                                 <option value='nissaya'>Nissaya</option>
                                 <option value='commentray'>注疏</option>
                             </select>
                         </span>
                     </div>
                     <div class='settting-item'>
-                        <span>完成度阈值</span>
+                        <span>完成度</span>
                         <span>
-                            <select>
+                            <select id='setting_progress'>
                                 <option value='0.9'>90</option>
                                 <option value='0.8'>80</option>
                                 <option value='0.7'>70</option>
                             </select>
                         </span>
                     </div>
-                    <div class='settting-item'>
-                        <span>语言</span>
-                        <span>
-                            <select>
-                                <option value=''>全部</option>
-                                <option value='zh'>中文</option>
-                                <option value='en'>英文</option>
-                            </select>
-                        </span>
-                    </div>
-                    <div><button>还原默认</button><button>应用</button></div>
+
+                    <div><button>还原默认</button><button onclick="updateSetting()">应用</button></div>
                 </div>
             </div>
             <div class="filter submenu">
@@ -275,17 +277,9 @@ span.channel {
                 </div>
             </div>
             <div class="filter submenu">
-                <div class="title submenu_title">作者</div>
+                <div class="title submenu_title"><span>作者</span><span><input type="input" placeholder="🔍" /></span></div>
                 <div class='inner' id='filter-author' ></div>
             </div>
-            <div class="filter submenu">
-                <div class="title submenu_title">语言</div>
-                <div class='inner' id='filter-lang' ></div>
-            </div>
-            <div class="filter submenu">
-                <div class="title submenu_title">类型</div>
-                <div class='inner' id='filter-type' ></div>
-            </div>
         </div>
     </div>
     <div id='course_head_bar' style='flex:6;padding:0 10px 10px 10px;'>

+ 64 - 27
public/app/palicanon/palicanon.js

@@ -1,3 +1,7 @@
+var _lang = "";
+var _langsetting = "";
+var _channelType = 'translation'
+var  _progress = 0.9;
 var _view = "community";
 var main_tag = "";
 var list_tag = new Array();
@@ -9,12 +13,58 @@ var gBreadCrumbs=['','','','','','','','',''];
 var _nextPageStart = 0;
 var _pageSize = 20;
 var _channel = "";
-var _lang = "";
+
 var _tags = "";
 var _channelList;
 
 palicanon_load_term();
 
+function updateSetting(){
+    _langsetting = $("#setting_lang").val();
+    switch ($("#setting_lang").val()) {
+        case 'auto':
+            switch (getCookie("language")) {
+                case 'zh-cn':
+                    _lang = 'zh';
+                    break;
+                case 'zh-tw':
+                    _lang = 'zh';
+                    break;    
+                case '':
+                    lang = '';
+                    break;
+            }
+            break;
+        default:
+            _lang = $("#setting_lang").val();
+            break;
+    }
+    _channelType = $("#setting_channel_type").val();
+    _progress = $("#setting_progress").val();
+
+    localStorage.setItem("pc_filter_setting",{
+        lang : $("#setting_lang").val(),
+        channel_type : _channelType,
+        progress:_progress,
+    })
+
+    LoadAllChannel();
+}
+
+/*
+载入过滤器设置
+*/
+function loadFilterSetting(){
+    if (localStorage.getItem ("pc_filter_setting") !== null) {
+        let setting = localStorage.getItem("pc_filter_setting");
+        _lang = setting.lang;
+        _channel_type = setting.channel_type;
+        _progress = setting.progress;
+    }
+    _nextPageStart = 0;
+    communityGetChapter();
+    LoadAllChannel();
+}
 function community_onload() {
 	$("span[tag]").click(function () {
 		$(this).siblings().removeClass("select");
@@ -139,25 +189,6 @@ function updataHistory(){
 }
 
 function communityGetChapter(offset=0){
-    let strTags = "";
-	if (list_tag.length > 0) {
-		strTags = main_tag + "," + list_tag.join();
-	} else {
-		strTags = main_tag;
-	}
-	console.log(strTags);
-	let lang = getCookie("language");
-    switch (lang) {
-        case 'zh-cn':
-            lang = 'zh-hans';
-            break;
-        case 'zh-tw':
-            lang = 'zh-hant';
-            break;    
-        case '':
-            lang = 'en';
-            break;
-    }
     next_page_loader_show();
     $.getJSON(
 		"/api/v2/progress?view=chapter",
@@ -165,6 +196,7 @@ function communityGetChapter(offset=0){
 			tags: _tags,
 			lang: _lang,
             channel: _channel,
+            channel_type: _channelType,
             offset: offset
 		}
 	)
@@ -1090,7 +1122,11 @@ function select_channel(id,obj=null){
 function LoadAllChannel(){
     $.getJSON(
 		"/api/v2/progress?view=channel",
-		{},
+		{
+            lang:_lang,
+            channel_type: _channelType,
+            progress:_progress,
+        },
 		function (data, status) {
             let html = "";
             html += "<ul>"
@@ -1116,14 +1152,15 @@ function LoadAllLanguage(){
 		{},
 		function (data, status) {
             let html = "";
-            html += "<ul>"
+            html += "<option value=''>全部</option>";
             for (const iterator of data.data.rows) {
-                html += "<li>"
-                html += iterator.lang+"("+iterator.count+")";
-                html += "</li>"                    
+                if(iterator.lang!=''){
+                    html += "<option value='"+iterator.lang+"'>";
+                    html += iterator.lang+"("+iterator.count+")";
+                    html += "</option>"                          
+                }
             }
-            html += "</ul>";
-            $("#filter-lang").html(html);
+            $("#setting_lang").html(html);
         }
     );
 }

+ 1 - 1
public/app/palicanon/router.js

@@ -19,7 +19,7 @@ Router.prototype.refresh = function() {
 };
 Router.prototype.init = function() {
     window.addEventListener('load', this.refresh.bind(this), false);
-    window.addEventListener('hashchange', this.refresh.bind(this), false);
+    //window.addEventListener('hashchange', this.refresh.bind(this), false);
     window.onpopstate = function(event) {
         console.log("location: " + document.location + ", state: " + JSON.stringify(event.state));
         _view = event.state.view;

+ 85 - 12
public/documents/模版设计.md

@@ -1,15 +1,88 @@
-{{sent|10|2|56|89}}
+# 文章内模版设计方案
 
-function:sent
-param:book=1,para=2,start=3,end=4
-{
-    <note book="{{book}}" para='{{meaning}}' start='{{meaning2}}' end='{{end}}'></note>
-}
+## 需求
 
-{{term|dhamma}}
+在用户编辑的markdown文档内嵌入自定义模版。支持术语显示,注释,文章引用,声明等可重用内容。
 
-function:term
-param:word
-{
-    <term word="{{word}}" ></term>
-}
+markdown 文档内容:
+```
+# 标题
+
+{{term|citta}}
+{{term|word=citta}}
+
+```
+
+## 解决方案
+
+使用 https://mustache.github.io/ 。由于mustache不支持自定义函数。所以绕道,用mustache 的 helper 拿到用户输入的参数后再次用mustache进行渲染。
+
+https://github.com/bobthecow/mustache.php/wiki#helpers
+
+# 第一步
+
+用户输入的markdown 文本。
+用正则替换
+```
+搜索
+\{\{(.+?)\}\}
+替换为
+\n{{#function}}\n$1\n{{/function}}\n
+```
+```
+{{term|citta}}
+就变成
+{{#function}}
+term|citta
+{{/function}}
+```
+
+# 第二步 准备模版文件
+这个其实是放数据库里的
+
+term.tpl
+```
+<term word='{{word}}'>
+<span class='word'>{{word}}</span>
+(<span class='meaning'>{{meaning}}</span>)
+</term>
+```
+
+# 第三步 解析{{#function}} 
+
+用helper 解析{{#function}} 里面的内容。拿到模版名称和参数。并再次用Mustache 和对应的**模版文件**以及**参数**渲染html字符串
+需要预处理,得到这个文章里面用的模版名称(函数名)列表。
+
+```
+$tpl-list=["term"=>"term.tpl的内容"];
+$m = new Mustache_Engine(array('entity_flags' => ENT_QUOTES));
+$m->render($tpl, array(
+  'function' => function($text) use($m,$tpl-list) {
+    1: 使用url函数解析path
+    $param = explode("|",$text);
+    3: 处理业务逻辑
+    switch([param[0]){
+        case 'term':
+            //获取实际的参数
+            $tplParam = Term::where("word",param[1])->first();
+        case 'article':
+            $tplParam = Article::where("uid",param[1])->first();
+        default:
+            $tplParam['p1'] = param[1];
+        break;
+    }
+    4: 返回拼好的字符串
+    $html = $m->render($tpl-list[param[0]], $tplParam)
+    return $html;
+  }
+)); 
+```
+
+## 模版
+
+{{inlinenote|note content}}
+
+{{q|sn.a. 2|3|2}}
+{{q|137|45}}
+
+{{article|122342234324}}