Prechádzať zdrojové kódy

Merge pull request #706 from visuddhinanda/master

✨ api性能分析图形化
visuddhinanda 4 rokov pred
rodič
commit
1a54d60802

+ 1 - 0
app/.gitignore

@@ -2,4 +2,5 @@
 /phpinfo.php
 /path.php
 /config.php
+/config.migrate.php
 /config.js

+ 6 - 11
app/admin/word_index_weight_refresh.php

@@ -40,10 +40,10 @@ $dh_word->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 $dh_pali = new PDO( __DB_PALI_INDEX__, _DB_USERNAME_, _DB_PASSWORD_);
 $dh_pali->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 
-echo "from=$from to = $to \n";
+fwrite(STDOUT, "from=$from to = $to \n");
 for ($i = $from; $i <= $to; $i++) {
     $time_start = microtime(true);
-    echo "正在处理 book= $i ";
+    fwrite(STDOUT, "正在处理 book= $i ");
     $query = "SELECT max(paragraph) from ".__TABLE_WORD__." where book=?";
 	try {
 		//code...
@@ -57,7 +57,7 @@ for ($i = $from; $i <= $to; $i++) {
 
     if ($row) {
         $max_para = $row[0];
-        echo "段落数量:$max_para ";
+        fwrite(STDOUT, " paragraph :$max_para ");
         for ($j = 0; $j <= $max_para; $j++) {
             # code...
             $query = "SELECT id,book,wordindex,bold from ".__TABLE_WORD__." where book={$i} and paragraph={$j} order by id ASC";
@@ -113,10 +113,8 @@ for ($i = $from; $i <= $to; $i++) {
                         } else {
                             $weight = 100 + $book_weight[$bookId];
                         }
-                        //echo "单独黑体 $weight \n";
                     } else {
                         #连续黑体字
-                        //echo "连续黑体字";
                         $len_sum = 0;
                         $len_curr = 0;
                         for ($iBold = $begin; $iBold <= $end; $iBold++) {
@@ -133,7 +131,6 @@ for ($i = $from; $i <= $to; $i++) {
                         $weight = 10 + $len_curr / $len_sum;
                     }
                 }
-                //echo $weight."\n";
                 $fetch[$iWord]["weight"] = (int) ($weight * 100);
             }
             # 将整段权重写入据库
@@ -146,13 +143,11 @@ for ($i = $from; $i <= $to; $i++) {
             $dh_pali->commit();
             if (!$stmt_weight || ($stmt_weight && $stmt_weight->errorCode() != 0)) {
                 $error = $dh_pali->errorInfo();
-                echo "error - $error[2]";
-            } else {
-                //echo "修改数据库成功 book={$i} paragraph={$j} \n";
+                fwrite(STDERR, "error - $error[2]".PHP_EOL);
             }
         }
     } else {
-        echo "无法获取段落最大值";
+        fwrite(STDERR, "无法获取段落最大值".PHP_EOL);
     }
-    echo "处理时间 :" . (microtime(true) - $time_start). "\n";
+    fwrite(STDOUT, "处理时间 :" . (microtime(true) - $time_start). "\n");
 }

+ 1 - 1
app/article/article.js

@@ -46,7 +46,7 @@ function articel_load(id, collection_id) {
 						$("#article_author").html( article_author );
 
 						//将绝对链接转换为 用户连接的主机链接
-						result.content = result.content.replace(/[A-z]*.wikipali.org/g,WWW_DOMAIN_NAME);
+						result.content = result.content.replace(/[A-z]*.wikipali.org/g,location.host);
 
 						$("#contents").html(note_init(result.content,"",result.owner,result.lang));
 						//处理<code>标签作为气泡注释

+ 2 - 1
app/article/my_article.js

@@ -51,8 +51,9 @@ function my_article_list() {
 						html += "</button>";
 						html += "</a></div>";
 						html += "<div style='flex:1;'>";
+						let host = location.protocol + '//' + location.host;
 						html +=
-							"<button class='icon_btn' onclick=\"copy_to_clipboard('"+WWW_DOMAIN_NAME+"/app/article/?id=" +
+							"<button class='icon_btn' onclick=\"copy_to_clipboard('"+host+"/app/article/?id=" +
 							iterator.id +
 							"')\" title='" +
 							gLocal.gui.copy_link +

+ 59 - 0
app/config.dir.php

@@ -0,0 +1,59 @@
+<?php
+
+# 目录
+define("_DIR_APPDATA_", __DIR__ . "/../tmp/appdata");
+
+define("_DIR_PALICANON_", __DIR__ . "/../tmp/appdata/palicanon");
+define("_DIR_PALICANON_TEMPLET_", __DIR__ . "/../tmp/appdata/palicanon/templet");
+define("_DIR_PALICANON_PALITEXT_", __DIR__ . "/../tmp/appdata/palicanon/pali_text");
+define("_DIR_PALICANON_WBW_", __DIR__ . "/../tmp/appdata/palicanon/wbw");
+define("_DIR_PALICANON_TRAN_", __DIR__ . "/../tmp/appdata/palicanon/translate");
+
+define("_DIR_IMAGES_", __DIR__ . "/../tmp/images");
+define("_DIR_IMAGES_ARTICLE_", __DIR__ . "/../tmp/images/article");
+define("_DIR_IMAGES_COLLECTION_", __DIR__ . "/../tmp/images/collection");
+define("_DIR_IMAGES_COURSE_", __DIR__ . "/../tmp/images/course");
+define("_DIR_IMAGES_COURSE_A_", "../../tmp/images/course");
+define("_DIR_IMAGES_LESSON_", __DIR__ . "/../tmp/images/lesson");
+
+//语料库
+
+define("_DIR_CSV_PALI_CANON_WORD_", __DIR__ . "/../paliword/book");
+define("_DIR_CSV_PALI_CANON_WORD_INDEX_", __DIR__ . "/../paliword/index");
+
+define("_DIR_PALI_CSV_", __DIR__ . "/../tmp/palicsv");
+define("_DIR_LOG_", __DIR__ . "/../tmp/log");
+define("_DIR_LOG_APP_", __DIR__ . "/../tmp/log/app.log");
+define("_DIR_TEMP_", __DIR__ . "/../tmp/temp");
+define("_DIR_TEMP_DICT_TEXT_", __DIR__ . "/../tmp/dict_text");
+define("_DIR_TMP_", __DIR__ . "/../tmp");
+define("_DIR_TMP_EXPORT", __DIR__ . "/../tmp/export");
+
+//dictionary
+define("_DIR_DICT_", __DIR__ . "/../tmp/appdata/dict");
+define("_DIR_DICT_SYSTEM_", __DIR__ . "/../tmp/appdata/dict/system");
+define("_DIR_DICT_3RD_", __DIR__ . "/../tmp/appdata/dict/3rd");
+define("_DIR_DICT_REF_", __DIR__ . "/../tmp/appdata/dict/ref");
+
+//界面上的用户指南气泡里面的数据
+define("_DIR_USERS_GUIDE_", __DIR__ . "/../app/users_guide");
+
+
+define("_DIR_FONT_", __DIR__ . "/../font");
+define("_DIR_PALI_HTML_", __DIR__ . "/../palihtml");
+define("_DIR_DICT_TEXT_", __DIR__ . "/../dicttext");
+
+define("_DIR_PALI_TITLE_", __DIR__ . "/../pali_title");
+define("_DIR_APP_", __DIR__ . "/../app");
+define("_DIR_LANGUAGE_", __DIR__ . "/../app/public/lang");
+define("_DIR_BOOK_INDEX_", __DIR__ . "/../app/public/book_index");
+
+/*user data*/
+define("_DIR_USER_BASE_", __DIR__ . "/../tmp/user");
+define("_DIR_USER_DOC_", __DIR__ . "/../tmp/user_doc");
+define("_DIR_USER_IMG_", __DIR__ . "/../tmp/user/media/3");
+define("_DIR_USER_IMG_LINK_", "../../tmp/user/media/3");
+define("_DIR_MYDOCUMENT_", "/my_document");
+
+# 逐词解析字典文件
+define("_FILE_DB_WBW1_",  __DIR__ . "/../tmp/user/wbw.db3");

+ 16 - 2
app/config.sample.js

@@ -1,2 +1,16 @@
-var WWW_DOMAIN_NAME="sg.wikipali.org";
-var RPC_DOMAIN_NAME="rpc.wikipali.org";
+var RPC_SERVER = "https://rpc.wikipali.org";
+
+/*
+  |---------------
+  |网站资源文件,非用户的图片,音频,视频
+  |---------------
+  |对应/public/tmp/ 目录 开发线可以设置为 http://127.0.0.1:8000/tmp
+  |所有文件存储在 https://drive.google.com/drive/folders/1-4dn4juD-0-lsKndDui2W9nT9wcS_Y33?usp=sharing
+  |开发线可自行下载放到/public/tmp/
+  |或直接引用离您最近的assets server
+  |------------------------
+*/
+
+var ASSETS_SERVER = "https://assets-hk.wikipali.org"
+var HELP_SERVER = "https://help-hk.wikipali.org"
+var GRAMMAR_SERVER = "https://grammar-hk.wikipali.org"

+ 14 - 257
app/config.sample.php

@@ -1,11 +1,13 @@
 <?php 
-#目录设置,不能更改
-require_once __DIR__."/dir.php";
+
 
 #域名设置
-define("WWW_DOMAIN_PROTOCOL","https");
-define("WWW_DOMAIN_NAME","www.wikipali.org");
-define("RPC_DOMAIN_NAME","rpc.wikipali.org");
+
+define("RPC_SERVER","https://rpc.wikipali.org");
+define("ASSETS_SERVER","https://assets-hk.wikipali.org");
+define("HELP_SERVER","https://help-hk.wikipali.org");
+define("GRAMMAR_SERVER","https://grammar-hk.wikipali.org");
+
 /*
 电子邮件设置
 PHPMailer
@@ -33,22 +35,14 @@ define("Database",[
 	"password" => "123456"
 ]);
 
-define("_DB_ENGIN_", Database["type"]);
-define("_DB_HOST_", Database["server"]);
-define("_DB_PORT_", Database["port"]);
-define("_DB_NAME_", Database["name"]);
-define("_DB_USERNAME_", Database["user"]);
-define("_DB_PASSWORD_", Database["password"]);
-
 
 /*
 Redis 设置,
-使用集群
 */
 define("Redis",[
-	"hosts" => ["127.0.0.1:6376", "127.0.0.1:6377", "127.0.0.1:6378"],
+	"host" => "127.0.0.1",
+	"port" => 6379,
 	"password" => "",
-	"db" => 0,
 	"prefix"=>"aaa://"
 ]);
 				
@@ -57,252 +51,15 @@ define("SnowFlake",[
 	"DatacenterId"=>1,
 	"WorkerId"=>1
 ]);
-/*
-数据表
-*/
-#表设置,此行不能更改
-require_once __DIR__."/table.php";
-
-/*
-前缀:
-Sqlite:  _SQLITE_
-PostgreSql:  _PG_
-*/
-//语料库数据表 pali canon db file 
-/*
-巴利语料模版表
-运行app/install/db_insert_templet.php 刷库
-*/
-
-define("_FILE_DB_PALICANON_TEMPLET_", _PG_DB_PALICANON_TEMPLET_);
-define("_TABLE_PALICANON_TEMPLET_",_PG_TABLE_PALICANON_TEMPLET_);
-
-/*
-标题资源表
-app/install/db_update_toc.php 刷库
-*/
-
-define("_FILE_DB_RESRES_INDEX_", _PG_DB_RESRES_INDEX_);
-define("_TABLE_RES_INDEX_",_PG_TABLE_RES_INDEX_);
-
-/*
-巴利语料段落表
-刷库 app/install/db_insert_palitext.php
-更新 app/install/db_update_palitext.php
-*/
-
-define("_FILE_DB_PALITEXT_", _PG_DB_PALITEXT_);
-define("_TABLE_PALI_TEXT_",_PG_TABLE_PALI_TEXT_);
-define("_TABLE_PALI_BOOK_NAME_",_PG_TABLE_PALI_BOOK_NAME_);
-
-#单词表部分
-/*
-以书为单位的单词汇总表
-填充 /app/install/db_insert_bookword_from_csv.php
-*/
-
-define("_FILE_DB_BOOK_WORD_", _PG_DB_BOOK_WORD_);
-define("_TABLE_BOOK_WORD_", _PG_TABLE_BOOK_WORD_);
-
-/*
-单词索引
-/app/install/db_insert_word_from_csv.php
-/app/admin/word_index_weight_refresh.php
-*/
-
-define("_FILE_DB_PALI_INDEX_", _PG_DB_PALI_INDEX_);
-define("_TABLE_WORD_", _PG_TABLE_WORD_);
-
-/*
-92万词
-/app/install/db_insert_wordindex_from_csv.php
-*/
-
-define("_FILE_DB_WORD_INDEX_", _PG_DB_WORD_INDEX_);
-define("_TABLE_WORD_INDEX_", _PG_TABLE_WORD_INDEX_);
-
-//单词索引=92万词+单词索引
-
-//PostgreSQL
-define("_FILE_DB_INDEX_", _PG_DB_INDEX_);
-
-//黑体字数据表
-//sqlite
-define("_FILE_DB_BOLD_", "sqlite:" . _SQLITE_DB_BOLD_);
-define("_TABLE_WORD_BOLD_", _SQLITE_TABLE_WORD_BOLD_);
-
-/*
-单词分析表
-数据迁移: php /deploy/migaration/word_statistics.php
-*/
-
-define("_FILE_DB_STATISTICS_", _PG_DB_STATISTICS_);
-define("_TABLE_WORD_STATISTICS_", _PG_TABLE_WORD_STATISTICS_);
-
-
-/*
-巴利句子表
-数据迁移: php ./deploy/migaration/20211125155700_pali_sent_org.php
-数据迁移: php ./deploy/migaration/20211125165700-pali_sent-upgrade.php
-数据迁移: php ./deploy/migaration/20211126220400-pali_sent_index-upgrade.php
-
-*/
 
-define("_FILE_DB_PALI_SENTENCE_", _PG_DB_PALI_SENTENCE_);
-define("_TABLE_PALI_SENT_", _PG_TABLE_PALI_SENT_);
-define("_TABLE_PALI_SENT_ORG_", _PG_TABLE_PALI_SENT_);
-define("_TABLE_PALI_SENT_INDEX_", _PG_TABLE_PALI_SENT_);
-
-/*
-相似句
-数据迁移 
-php ./deploy/migaration/20211127214800_sent_sim.php
-php ./deploy/migaration/20211127214900-sent_sim_index.php
-redis: 
-php ./app/pali_sent/redis_upgrade_pali_sent.php
-*/
-
-define("_FILE_DB_PALI_SENTENCE_SIM_", _PG_DB_PALI_SENTENCE_SIM_);
-define("_TABLE_SENT_SIM_", _PG_TABLE_SENT_SIM_);
-define("_TABLE_SENT_SIM_INDEX_", _PG_TABLE_SENT_SIM_INDEX_);
+#目录设置,不能更改
+require_once __DIR__."/config.dir.php";
 
 /*
-完成度
-数据迁移
-php ./app/upgrade/upgrade_pali_toc.php
+数据表
 */
+#表设置,此行不能更改
+require_once __DIR__."/config.table.php";
 
-define("_FILE_DB_PALI_TOC_", _PG_DB_PALI_TOC_);
-define("_TABLE_PROGRESS_", _PG_TABLE_PROGRESS_);
-define("_TABLE_PROGRESS_CHAPTER_", _PG_TABLE_PROGRESS_CHAPTER_);
-
-
-//页码对应
-//sqlite
-define("_FILE_DB_PAGE_INDEX_", _SQLITE_DB_PAGE_INDEX_);
-define("_TABLE_PAGE_MATCH_", _SQLITE_TABLE_PAGE_MATCH_);
-define("_TABLE_BOOK_MATCH_", _SQLITE_TABLE_BOOK_MATCH_);
-define("_TABLE_CS6_PARA_", _SQLITE_TABLE_CS6_PARA_);
-define("_TABLE_MY_PAGE_", _SQLITE_TABLE_MY_PAGE_);
-define("_TABLE_PAGE_NUMBER_", _SQLITE_TABLE_PAGE_NUMBER_);
-
-
-# 字典数据表 全部存入redis
-
-
-#参考字典
-define("_FILE_DB_REF_", _SQLITE_DB_REF_);
-define("_TABLE_DICT_REF_", _SQLITE_TABLE_DICT_REF_);
-define("_TABLE_DICT_REF_NAME_", _SQLITE_TABLE_DICT_REF_NAME_);
-
-#参考字典索引
-define("_FILE_DB_REF_INDEX_", _SQLITE_DB_REF_INDEX_);
-define("_TABLE_REF_INDEX_", _SQLITE_TABLE_REF_INDEX_);
-
-
-# 用户数据表
-
-#sqlite
-define("_FILE_DB_USER_WBW_", _SQLITE_DB_USER_WBW_);
-define("_TABLE_USER_WBW_", _SQLITE_TABLE_USER_WBW_);
-define("_TABLE_USER_WBW_BLOCK_", _SQLITE_TABLE_USER_WBW_BLOCK_);
-
-
-# 译文
-#sqlite
-define("_FILE_DB_SENTENCE_", _SQLITE_DB_SENTENCE_);
-define("_TABLE_SENTENCE_", _SQLITE_TABLE_SENTENCE_);
-define("_TABLE_SENTENCE_BLOCK_", _SQLITE_TABLE_SENTENCE_BLOCK_);
-define("_TABLE_SENTENCE_PR_", _SQLITE_TABLE_SENTENCE_PR_);
-
-
-# 译文编辑历史
-#sqlite
-define("_FILE_DB_USER_SENTENCE_HISTORAY_", _SQLITE_DB_USER_SENTENCE_HISTORAY_);
-define("_TABLE_SENTENCE_HISTORAY_", _SQLITE_TABLE_SENTENCE_HISTORAY_);
-
-
-# 逐词解析字典
-# sqlite
-define("_FILE_DB_WBW_", _SQLITE_DB_WBW_);
-define("_TABLE_DICT_WBW_", _SQLITE_TABLE_DICT_WBW_);
-define("_TABLE_DICT_WBW_INDEX_", _SQLITE_TABLE_DICT_WBW_INDEX_);
-
-
-//写入频繁 读取不频繁
-# 用户行为记录
-#sqlite
-define("_FILE_DB_USER_ACTIVE_", _SQLITE_DB_USER_ACTIVE_);
-define("_TABLE_USER_OPERATION_DAILY_", _SQLITE_TABLE_USER_OPERATION_DAILY_);
-define("_TABLE_USER_OPERATION_FRAME_", _SQLITE_TABLE_USER_OPERATION_FRAME_);
-
-
-#sqlite
-define("_FILE_DB_USER_ACTIVE_LOG_", _SQLITE_DB_USER_ACTIVE_LOG_);
-define("_TABLE_USER_OPERATION_LOG_", _SQLITE_TABLE_USER_OPERATION_LOG_);
-
-
-//读取频繁 写入不频繁 
-# 用户账号
-#sqlite
-define("_FILE_DB_USERINFO_", _SQLITE_DB_USERINFO_);
-define("_TABLE_USER_INFO_", _SQLITE_TABLE_USER_INFO_);
-
-
-# 版本风格 
-#sqlite
-define("_FILE_DB_CHANNAL_", _SQLITE_DB_CHANNAL_);
-define("_TABLE_CHANNEL_", _SQLITE_TABLE_CHANNEL_);
-
-
-# 文章 文集
-
-define("_FILE_DB_USER_ARTICLE_", _SQLITE_DB_USER_ARTICLE_);
-define("_TABLE_ARTICLE_", _SQLITE_TABLE_ARTICLE_);
-define("_TABLE_COLLECTION_", _SQLITE_TABLE_COLLECTION_);
-define("_TABLE_ARTICLE_COLLECTION_", _SQLITE_TABLE_ARTICLE_COLLECTION_);
-
-
-
-# 术语
-define("_FILE_DB_TERM_", _SQLITE_DB_TERM_);
-define("_TABLE_TERM_", _SQLITE_TABLE_TERM_);
-
-# 协作
-define("_FILE_DB_USER_SHARE_", _SQLITE_DB_USER_SHARE_);
-define("_TABLE_USER_SHARE_", _SQLITE_TABLE_USER_SHARE_);
-
-# 工作组
-define("_FILE_DB_GROUP_", _SQLITE_DB_GROUP_);
-define("_TABLE_GROUP_INFO_", _SQLITE_TABLE_GROUP_INFO_);
-define("_TABLE_GROUP_MEMBER_", _SQLITE_TABLE_GROUP_MEMBER_);
-
-# 逐词解析文件索引
-define("_FILE_DB_FILEINDEX_", _SQLITE_DB_FILEINDEX_);
-define("_TABLE_FILEINDEX_", _SQLITE_TABLE_FILEINDEX_);
-define("_TABLE_FILEINDEX_POWER_", _SQLITE_TABLE_FILEINDEX_POWER_);
-
-# 课程
-define("_FILE_DB_COURSE_", _SQLITE_DB_COURSE_);
-define("_TABLE_COURSE_",_SQLITE_TABLE_COURSE_);
-define("_TABLE_LESSON_",_SQLITE_TABLE_LESSON_);
-
-# 用户自定义书
-define("_FILE_DB_USER_CUSTOM_BOOK_", _SQLITE_DB_USER_CUSTOM_BOOK_);
-define("_TABLE_CUSTOM_BOOK_", _SQLITE_TABLE_CUSTOM_BOOK_);
-define("_TABLE_CUSTOM_BOOK_SENT_", _SQLITE_TABLE_CUSTOM_BOOK_SENT_);
-
-# 逐词译和译文编辑消息 无需迁移数据
-define("_FILE_DB_MESSAGE_", _SQLITE_DB_MESSAGE_);
-define("_TABLE_MESSAGE_", _SQLITE_TABLE_MESSAGE_);
-
-#点赞
-define("_FILE_DB_LIKE_", _SQLITE_DB_LIKE_);
-define("_TABLE_LIKE_", _SQLITE_TABLE_LIKE_);
-
-
-# 用户字典统计数据 刷库 - 无需迁移数据
-define("_FILE_DB_USER_DICT_", _SQLITE_DB_USER_DICT_);
-define("_TABLE_USER_DICT_", _SQLITE_TABLE_USER_DICT_);
 
 ?>

+ 687 - 0
app/config.table.php

@@ -0,0 +1,687 @@
+<?php 
+#表名设置,不能更改
+define("_DB_ENGIN_", Database["type"]);
+define("_DB_HOST_", Database["server"]);
+define("_DB_PORT_", Database["port"]);
+define("_DB_NAME_", Database["name"]);
+define("_DB_USERNAME_", Database["user"]);
+define("_DB_PASSWORD_", Database["password"]);
+
+//PostgreSQL
+define("_PDO_DB_DSN_", Database["type"].":host=".Database["server"].";port=".Database["port"].";dbname=".Database["name"].";user=".Database["user"].";password=".Database["password"].";");
+
+//语料库数据表 pali canon db file 
+
+/*
+巴利语料模版表
+运行app/install/db_insert_templet.php 刷库
+*/
+#sqlite
+define("_SQLITE_DB_PALICANON_TEMPLET_","sqlite:" . __DIR__ . "/../tmp/appdata/palicanon/templet.db3");
+define("_SQLITE_TABLE_PALICANON_TEMPLET_","wbw_templates");
+
+#pg
+define("_PG_DB_PALICANON_TEMPLET_", _DB_ENGIN_.":host="._DB_HOST_.";port="._DB_PORT_.";dbname="._DB_NAME_.";user="._DB_USERNAME_.";password="._DB_PASSWORD_.";");
+define("_PG_TABLE_PALICANON_TEMPLET_","wbw_templates");
+
+/*
+标题资源表
+app/install/db_update_toc.php 刷库
+*/
+#sqlite
+define("_SQLITE_DB_RESRES_INDEX_", "sqlite:" . __DIR__ . "/../tmp/appdata/palicanon/res.db3");
+define("_SQLITE_TABLE_RES_INDEX_","res_index");
+
+#pg
+define("_PG_DB_RESRES_INDEX_", _DB_ENGIN_.":host="._DB_HOST_.";port="._DB_PORT_.";dbname="._DB_NAME_.";user="._DB_USERNAME_.";password="._DB_PASSWORD_.";");
+define("_PG_TABLE_RES_INDEX_","res_indices");
+
+/*
+巴利语料段落表
+刷库 app/install/db_insert_palitext.php
+更新 app/install/db_update_palitext.php
+*/
+#sqlite
+define("_SQLITE_DB_PALITEXT_", "sqlite:" . __DIR__ . "/../tmp/appdata/palicanon/pali_text.db3");
+define("_SQLITE_TABLE_PALI_TEXT_","pali_text");
+define("_SQLITE_TABLE_PALI_BOOK_NAME_","books");
+
+#pg
+define("_PG_DB_PALITEXT_", _DB_ENGIN_.":host="._DB_HOST_.";port="._DB_PORT_.";dbname="._DB_NAME_.";user="._DB_USERNAME_.";password="._DB_PASSWORD_.";");
+define("_PG_TABLE_PALI_TEXT_","pali_texts");
+define("_PG_TABLE_PALI_BOOK_NAME_","book_titles");
+
+#单词表部分
+/*
+以书为单位的单词汇总表
+填充 /app/install/db_insert_bookword_from_csv.php
+*/
+//sqlite
+define("_SQLITE_DB_BOOK_WORD_", "sqlite:" . __DIR__ . "/../tmp/appdata/palicanon/bookword.db3");
+define("_SQLITE_TABLE_BOOK_WORD_", "bookword");
+
+//PostgreSQL
+define("_PG_DB_BOOK_WORD_", _DB_ENGIN_.":host="._DB_HOST_.";port="._DB_PORT_.";dbname="._DB_NAME_.";user="._DB_USERNAME_.";password="._DB_PASSWORD_.";");
+define("_PG_TABLE_BOOK_WORD_", "book_words");
+
+/*
+单词索引
+/app/install/db_insert_word_from_csv.php
+/app/admin/word_index_weight_refresh.php
+*/
+//sqlite
+define("_SQLITE_DB_PALI_INDEX_", "sqlite:" . __DIR__ . "/../tmp/appdata/palicanon/paliindex.db3");
+define("_SQLITE_TABLE_WORD_", "word");
+
+define("_PG_DB_PALI_INDEX_", _DB_ENGIN_.":host="._DB_HOST_.";port="._DB_PORT_.";dbname="._DB_NAME_.";user="._DB_USERNAME_.";password="._DB_PASSWORD_.";");
+define("_PG_TABLE_WORD_", "word_lists");
+
+/*
+92万词
+/app/install/db_insert_wordindex_from_csv.php
+*/
+//sqlite
+define("_SQLITE_DB_WORD_INDEX_", "sqlite:" . __DIR__ . "/../tmp/appdata/palicanon/wordindex.db3");
+define("_SQLITE_TABLE_WORD_INDEX_", "wordindex");
+
+//PostgreSQL
+define("_PG_DB_WORD_INDEX_", _DB_ENGIN_.":host="._DB_HOST_.";port="._DB_PORT_.";dbname="._DB_NAME_.";user="._DB_USERNAME_.";password="._DB_PASSWORD_.";");
+define("_PG_TABLE_WORD_INDEX_", "word_indices");
+
+//单词索引=92万词+单词索引
+//sqlite
+define("_SQLITE_DB_INDEX_", "sqlite:" . __DIR__ . "/../tmp/appdata/palicanon/index.db3");
+
+//PostgreSQL
+define("_PG_DB_INDEX_", _DB_ENGIN_.":host="._DB_HOST_.";port="._DB_PORT_.";dbname="._DB_NAME_.";user="._DB_USERNAME_.";password="._DB_PASSWORD_.";");
+
+//黑体字数据表
+//sqlite
+define("_SQLITE_DB_BOLD_", "sqlite:" . __DIR__ . "/../tmp/appdata/palicanon/bold.db3");
+define("_SQLITE_TABLE_WORD_BOLD_", "bold");
+
+//PostgreSQL
+define("_PG_DB_BOLD_", _DB_ENGIN_.":host="._DB_HOST_.";port="._DB_PORT_.";dbname="._DB_NAME_.";user="._DB_USERNAME_.";password="._DB_PASSWORD_.";");
+define("_PG_TABLE_WORD_BOLD_", "bolds");
+
+/*
+单词分析表
+数据迁移: php /deploy/migaration/word_statistics.php
+*/
+//sqlite
+define("_SQLITE_DB_STATISTICS_", "sqlite:" . __DIR__ . "/../tmp/appdata/palicanon/word_statistics.db3");
+define("_SQLITE_TABLE_WORD_STATISTICS_", "word");
+
+//PostgreSQL
+define("_PG_DB_STATISTICS_", _DB_ENGIN_.":host="._DB_HOST_.";port="._DB_PORT_.";dbname="._DB_NAME_.";user="._DB_USERNAME_.";password="._DB_PASSWORD_.";");
+define("_PG_TABLE_WORD_STATISTICS_", "word_statistics");
+
+
+
+/*
+巴利句子表
+数据迁移: php ./deploy/migaration/20211125155700_pali_sent_org.php
+数据迁移: php ./deploy/migaration/20211125165700-pali_sent-upgrade.php
+数据迁移: php ./deploy/migaration/20211126220400-pali_sent_index-upgrade.php
+
+*/
+//sqlite
+define("_SQLITE_DB_PALI_SENTENCE_", "sqlite:" . __DIR__ . "/../tmp/appdata/palicanon/pali_sent2.db3");
+define("_SQLITE_TABLE_PALI_SENT_", "pali_sent");
+define("_SQLITE_TABLE_PALI_SENT_ORG_", "pali_sent_org");
+define("_SQLITE_TABLE_PALI_SENT_INDEX_", "pali_sent_index");
+
+//PostgreSQL
+define("_PG_DB_PALI_SENTENCE_", _DB_ENGIN_.":host="._DB_HOST_.";port="._DB_PORT_.";dbname="._DB_NAME_.";user="._DB_USERNAME_.";password="._DB_PASSWORD_.";");
+define("_PG_TABLE_PALI_SENT_", "pali_sentences");
+define("_PG_TABLE_PALI_SENT_ORG_", "pali_sent_orgs");
+define("_PG_TABLE_PALI_SENT_INDEX_", "pali_sent_indices");
+
+
+/*
+相似句
+数据迁移 
+php ./deploy/migaration/20211127214800_sent_sim.php
+php ./deploy/migaration/20211127214900-sent_sim_index.php
+redis: 
+php ./app/pali_sent/redis_upgrade_pali_sent.php
+*/
+//sqlite
+define("_SQLITE_DB_PALI_SENTENCE_SIM_", "sqlite:" . __DIR__ . "/../tmp/appdata/palicanon/pali_sim.db3");
+define("_SQLITE_TABLE_SENT_SIM_", "sent_sim");
+define("_SQLITE_TABLE_SENT_SIM_INDEX_", "sent_sim_index");
+
+//PostgreSQL
+define("_PG_DB_PALI_SENTENCE_SIM_", _DB_ENGIN_.":host="._DB_HOST_.";port="._DB_PORT_.";dbname="._DB_NAME_.";user="._DB_USERNAME_.";password="._DB_PASSWORD_.";");
+define("_PG_TABLE_SENT_SIM_", "sent_sims");
+define("_PG_TABLE_SENT_SIM_INDEX_", "sent_sim_indices");
+
+
+/*
+完成度
+数据迁移
+php ./app/upgrade/upgrade_pali_toc.php
+*/
+//sqlite
+define("_SQLITE_DB_PALI_TOC_", "sqlite:" . __DIR__ . "/../tmp/appdata/palicanon/pali_toc.db3");
+define("_SQLITE_TABLE_PROGRESS_", "progress");
+define("_SQLITE_TABLE_PROGRESS_CHAPTER_", "progress_chapter");
+
+//PostgreSQL
+define("_PG_DB_PALI_TOC_", _DB_ENGIN_.":host="._DB_HOST_.";port="._DB_PORT_.";dbname="._DB_NAME_.";user="._DB_USERNAME_.";password="._DB_PASSWORD_.";");
+define("_PG_TABLE_PROGRESS_", "progress");
+define("_PG_TABLE_PROGRESS_CHAPTER_", "progress_chapters");
+
+
+# 用户数据表
+
+//读写频繁
+# 逐词解析表
+#sqlite
+define("_SQLITE_DB_USER_WBW_", "sqlite:" . __DIR__ . "/../tmp/user/user_wbw.db3");
+define("_SQLITE_TABLE_USER_WBW_", "wbw");
+define("_SQLITE_TABLE_USER_WBW_BLOCK_", "wbw_block");
+
+//PostgreSQL
+define("_PG_DB_USER_WBW_", _PDO_DB_DSN_);
+define("_PG_TABLE_USER_WBW_", "wbws");
+define("_PG_TABLE_USER_WBW_BLOCK_", "wbw_blocks");
+
+
+# 译文
+#sqlite
+define("_SQLITE_DB_SENTENCE_", "sqlite:" . __DIR__ . "/../tmp/user/sentence.db3");
+define("_SQLITE_TABLE_SENTENCE_", "sentence");
+define("_SQLITE_TABLE_SENTENCE_BLOCK_", "sent_block");
+define("_SQLITE_TABLE_SENTENCE_PR_", "sent_pr");
+
+//PostgreSQL
+define("_PG_DB_SENTENCE_", _PDO_DB_DSN_);
+define("_PG_TABLE_SENTENCE_", "sentences");
+define("_PG_TABLE_SENTENCE_BLOCK_", "sent_blocks");
+define("_PG_TABLE_SENTENCE_PR_", "sent_prs");
+
+
+
+# 译文编辑历史
+#sqlite
+define("_SQLITE_DB_USER_SENTENCE_HISTORAY_", "sqlite:" . __DIR__ . "/../tmp/user/usent_historay.db3");
+define("_SQLITE_TABLE_SENTENCE_HISTORAY_", "sent_historay");
+
+//PostgreSQL
+define("_PG_DB_USER_SENTENCE_HISTORAY_", _PDO_DB_DSN_);
+define("_PG_TABLE_SENTENCE_HISTORAY_", "sent_historaies");
+
+
+
+# 逐词解析字典
+# sqlite
+define("_SQLITE_DB_WBW_", "sqlite:" . __DIR__ . "/../tmp/user/wbw.db3");
+define("_SQLITE_TABLE_DICT_WBW_", "wbw");
+define("_SQLITE_TABLE_DICT_WBW_INDEX_", "wbw_index");
+
+//PostgreSQL
+define("_PG_DB_WBW_", _PDO_DB_DSN_);
+define("_PG_TABLE_DICT_WBW_", "user_dicts");
+
+
+//写入频繁 读取不频繁
+# 用户行为记录
+#sqlite
+define("_SQLITE_DB_USER_ACTIVE_", "sqlite:" . __DIR__ . "/../tmp/user/user_active.db3");
+define("_SQLITE_TABLE_USER_OPERATION_DAILY_", "active_index");
+define("_SQLITE_TABLE_USER_OPERATION_FRAME_", "edit");
+
+//PostgreSQL
+define("_PG_DB_USER_ACTIVE_", _PDO_DB_DSN_);
+define("_PG_TABLE_USER_OPERATION_DAILY_", "user_operation_dailys");
+define("_PG_TABLE_USER_OPERATION_FRAME_", "user_operation_frames");
+
+#sqlite
+define("_SQLITE_DB_USER_ACTIVE_LOG_", "sqlite:" . __DIR__ . "/../tmp/user/user_active_log.db3");
+define("_SQLITE_TABLE_USER_OPERATION_LOG_", "log");
+
+#PostgreSQL
+define("_PG_DB_USER_ACTIVE_LOG_", _PDO_DB_DSN_);
+define("_PG_TABLE_USER_OPERATION_LOG_", "user_operation_logs");
+
+
+
+//读取频繁 写入不频繁 
+# 用户账号
+#sqlite
+define("_SQLITE_DB_USERINFO_", "sqlite:" . __DIR__ . "/../tmp/user/userinfo.db3");
+define("_SQLITE_TABLE_USER_INFO_", "user");
+
+#pg
+define("_PG_DB_USERINFO_", _PDO_DB_DSN_);
+define("_PG_TABLE_USER_INFO_", "user_infos");
+
+
+# 版本风格 
+#sqlite
+define("_SQLITE_DB_CHANNAL_", "sqlite:" . __DIR__ . "/../tmp/user/channal.db3");
+define("_SQLITE_TABLE_CHANNEL_", "channal");
+
+#pg
+define("_PG_DB_CHANNAL_", _PDO_DB_DSN_);
+define("_PG_TABLE_CHANNEL_", "channels");
+
+
+# 文章 文集
+# sqlite
+define("_SQLITE_DB_USER_ARTICLE_", "sqlite:" . __DIR__ . "/../tmp/user/article.db3");
+define("_SQLITE_TABLE_ARTICLE_", "article");
+define("_SQLITE_TABLE_COLLECTION_", "collect");
+define("_SQLITE_TABLE_ARTICLE_COLLECTION_", "article_list");
+
+
+# pg
+define("_PG_DB_USER_ARTICLE_", _PDO_DB_DSN_);
+define("_PG_TABLE_ARTICLE_", "articles");
+define("_PG_TABLE_COLLECTION_", "collections");
+define("_PG_TABLE_ARTICLE_COLLECTION_", "article_collection");
+
+# 术语
+define("_SQLITE_DB_TERM_", "sqlite:" . __DIR__ . "/../tmp/user/dhammaterm.db");
+define("_SQLITE_TABLE_TERM_", "term");
+
+define("_PG_DB_TERM_", _PDO_DB_DSN_);
+define("_PG_TABLE_TERM_", "term");
+
+# 协作
+define("_SQLITE_DB_USER_SHARE_", "sqlite:" . __DIR__ . "/../tmp/user/share.db3");
+define("_SQLITE_TABLE_USER_SHARE_", "share_cooperator");
+
+define("_PG_DB_USER_SHARE_", _PDO_DB_DSN_);
+define("_PG_TABLE_USER_SHARE_", "share_cooperator");
+
+# 工作组
+define("_SQLITE_DB_GROUP_", "sqlite:" . __DIR__ . "/../tmp/user/group.db3");
+define("_SQLITE_TABLE_GROUP_INFO_", "group_info");
+define("_SQLITE_TABLE_GROUP_MEMBER_", "group_member");
+
+define("_PG_DB_GROUP_", _PDO_DB_DSN_);
+define("_PG_TABLE_GROUP_INFO_", "group_info");
+define("_PG_TABLE_GROUP_MEMBER_", "group_member");
+
+# 逐词解析文件索引
+define("_SQLITE_DB_FILEINDEX_", "sqlite:" . __DIR__ . "/../tmp/user/fileindex.db");
+define("_SQLITE_TABLE_FILEINDEX_", "fileindex");
+define("_SQLITE_TABLE_FILEINDEX_POWER_", "power");
+
+define("_PG_DB_FILEINDEX_", _PDO_DB_DSN_);
+define("_PG_TABLE_FILEINDEX_", "fileindex");
+define("_PG_TABLE_FILEINDEX_POWER_", "power");
+
+# 课程
+define("_SQLITE_DB_COURSE_", "sqlite:" . __DIR__ . "/../tmp/user/course.db3");
+define("_SQLITE_TABLE_COURSE_","course");
+define("_SQLITE_TABLE_LESSON_","lesson");
+
+define("_PG_DB_COURSE_", _PDO_DB_DSN_);
+define("_PG_TABLE_COURSE_","course");
+define("_PG_TABLE_LESSON_","lesson");
+
+# 用户自定义书
+define("_SQLITE_DB_USER_CUSTOM_BOOK_", "sqlite:" . __DIR__ . "/../tmp/user/custom_book.db3");
+define("_SQLITE_TABLE_CUSTOM_BOOK_", "custom_book");
+define("_SQLITE_TABLE_CUSTOM_BOOK_SENT_", "custom_book_sentence");
+
+define("_PG_DB_USER_CUSTOM_BOOK_", _PDO_DB_DSN_);
+define("_PG_TABLE_CUSTOM_BOOK_", "custom_book");
+define("_PG_TABLE_CUSTOM_BOOK_SENT_", "custom_book_sentence");
+
+# 逐词译和译文编辑消息 无需迁移数据
+define("_SQLITE_DB_MESSAGE_", "sqlite:" . __DIR__ . "/../tmp/user/message.db");
+define("_SQLITE_TABLE_MESSAGE_", "message");
+
+define("_PG_DB_MESSAGE_", _PDO_DB_DSN_);
+define("_PG_TABLE_MESSAGE_", "message");
+
+#点赞
+define("_SQLITE_DB_LIKE_", "sqlite:" . __DIR__ . "/../tmp/user/like.db3");
+define("_SQLITE_TABLE_LIKE_", "likes");
+
+define("_PG_DB_LIKE_", _PDO_DB_DSN_);
+define("_PG_TABLE_LIKE_", "likes");
+
+# 用户字典统计数据 刷库 - 无需迁移数据
+define("_SQLITE_DB_USER_DICT_", "sqlite:" . __DIR__ . "/../tmp/user/udict.db3");
+define("_SQLITE_TABLE_USER_DICT_", "udict");
+
+define("_PG_DB_USER_DICT_", _PDO_DB_DSN_);
+define("_PG_TABLE_USER_DICT_", "udict");
+
+# 页码对应
+define("_SQLITE_DB_PAGE_INDEX_", "sqlite:" . __DIR__ . "/../tmp/appdata/palicanon/pagemap.db3");
+define("_SQLITE_TABLE_PAGE_MATCH_", 'pagematch');
+define("_SQLITE_TABLE_BOOK_MATCH_", 'book_match');
+define("_SQLITE_TABLE_CS6_PARA_", 'cs6_para');
+define("_SQLITE_TABLE_MY_PAGE_", 'm');
+define("_SQLITE_TABLE_PAGE_NUMBER_", 'multi_edition_page_number');
+
+define("_PG_DB_PAGE_INDEX_", _PDO_DB_DSN_);
+define("_PG_TABLE_PAGE_MATCH_", 'pagematch');
+define("_PG_TABLE_BOOK_MATCH_", 'book_match');
+define("_PG_TABLE_CS6_PARA_", 'cs6_para');
+define("_PG_TABLE_MY_PAGE_", 'm');
+define("_PG_TABLE_PAGE_NUMBER_", 'multi_edition_page_number');
+
+
+#参考字典
+define("_SQLITE_DB_REF_", "sqlite:" . __DIR__ . "/../tmp/appdata/dict/system/ref.db");
+define("_SQLITE_TABLE_DICT_REF_", "dict");
+define("_SQLITE_TABLE_DICT_REF_NAME_", "info");
+
+define("_PG_DB_REF_", _PDO_DB_DSN_);
+define("_PG_TABLE_DICT_REF_", "dict");
+define("_PG_TABLE_DICT_REF_NAME_", "info");
+
+#参考字典索引
+define("_SQLITE_DB_REF_INDEX_", "sqlite:" . __DIR__ . "/../tmp/appdata/dict/system/ref1.db");
+define("_SQLITE_TABLE_REF_INDEX_", "dict");
+
+define("_PG_DB_REF_INDEX_", _PDO_DB_DSN_);
+define("_PG_TABLE_REF_INDEX_", "dict");
+
+#无需迁移
+
+# 用户图片数据 尚未启用
+define("_FILE_DB_MEDIA_", "sqlite:" . __DIR__ . "/../tmp/user/media.db3");
+
+
+#权限管理 casbin使用
+define("_FILE_DB_USER_RBAC_",  __DIR__ . "/../tmp/user/rbac.db3");
+
+
+# 全文搜索
+define("_TABLE_FTS_", "fts_texts");
+
+//很少使用
+# 网站设置
+define("_FILE_DB_HOSTSETTING_", "sqlite:" . __DIR__ . "/../tmp/user/hostsetting.db3");
+
+#巴缅字典
+//define("_DICT_DB_PM_", _DB_ENGIN_.":host="._DB_HOST_.";port="._DB_PORT_.";dbname="._DB_NAME_.";user="._DB_USERNAME_.";password="._DB_PASSWORD_.";");
+define("_DICT_DB_PM_", "sqlite:" . __DIR__ . "/../tmp/appdata/dict/3rd/pm.db");
+define("_TABLE_DICT_PM_", "dict");
+
+#系统规则
+//define("_DICT_DB_REGULAR_", _DB_ENGIN_.":host="._DB_HOST_.";port="._DB_PORT_.";dbname="._DB_NAME_.";user="._DB_USERNAME_.";password="._DB_PASSWORD_.";");
+define("_DICT_DB_REGULAR_", "sqlite:" . __DIR__ . "/../tmp/appdata/dict/system/sys_regular.db");
+define("_TABLE_DICT_REGULAR_", "dict");
+
+#系统不规则
+//define("_DICT_DB_IRREGULAR_", _DB_ENGIN_.":host="._DB_HOST_.";port="._DB_PORT_.";dbname="._DB_NAME_.";user="._DB_USERNAME_.";password="._DB_PASSWORD_.";");
+define("_DICT_DB_IRREGULAR_", "sqlite:" . __DIR__ . "/../tmp/appdata/dict/system/sys_irregular.db");
+define("_TABLE_DICT_IRREGULAR_", "dict");
+
+#自动compone
+//define("_DICT_DB_COMP_", _DB_ENGIN_.":host="._DB_HOST_.";port="._DB_PORT_.";dbname="._DB_NAME_.";user="._DB_USERNAME_.";password="._DB_PASSWORD_.";");
+define("_DICT_DB_COMP_", "sqlite:" . __DIR__ . "/../tmp/appdata/dict/system/comp.db");
+define("_TABLE_DICT_COMP_", "dict");
+
+
+
+#为了切分复合词 使用的词头表
+//define("_FILE_DB_PART_", _DB_ENGIN_.":host="._DB_HOST_.";port="._DB_PORT_.";dbname="._DB_NAME_.";user="._DB_USERNAME_.";password="._DB_PASSWORD_.";");
+define("_FILE_DB_PART_", "sqlite:" . __DIR__ . "/../tmp/appdata/dict/system/part.db3");
+define("_TABLE_PART_", "part");
+
+# 评论 已经废弃
+//define("_FILE_DB_COMMENTS_", _DB_ENGIN_.":host="._DB_HOST_.";port="._DB_PORT_.";dbname="._DB_NAME_.";user="._DB_USERNAME_.";password="._DB_PASSWORD_.";");
+define("_FILE_DB_COMMENTS_", "sqlite:" . __DIR__ . "/../tmp/user/comments.db3");
+
+
+
+/*
+  |--------------------
+  |实际使用的表名
+  |---------------------
+*/
+
+
+/*
+前缀:
+Sqlite:  _SQLITE_
+PostgreSql:  _PG_
+*/
+//语料库数据表 pali canon db file 
+/*
+巴利语料模版表
+运行app/install/db_insert_templet.php 刷库
+*/
+
+define("_FILE_DB_PALICANON_TEMPLET_", _PG_DB_PALICANON_TEMPLET_);
+define("_TABLE_PALICANON_TEMPLET_",_PG_TABLE_PALICANON_TEMPLET_);
+
+/*
+标题资源表
+app/install/db_update_toc.php 刷库
+*/
+
+define("_FILE_DB_RESRES_INDEX_", _PG_DB_RESRES_INDEX_);
+define("_TABLE_RES_INDEX_",_PG_TABLE_RES_INDEX_);
+
+/*
+巴利语料段落表
+刷库 app/install/db_insert_palitext.php
+更新 app/install/db_update_palitext.php
+*/
+
+define("_FILE_DB_PALITEXT_", _PG_DB_PALITEXT_);
+define("_TABLE_PALI_TEXT_",_PG_TABLE_PALI_TEXT_);
+define("_TABLE_PALI_BOOK_NAME_",_PG_TABLE_PALI_BOOK_NAME_);
+
+#单词表部分
+/*
+以书为单位的单词汇总表
+填充 /app/install/db_insert_bookword_from_csv.php
+*/
+
+define("_FILE_DB_BOOK_WORD_", _PG_DB_BOOK_WORD_);
+define("_TABLE_BOOK_WORD_", _PG_TABLE_BOOK_WORD_);
+
+/*
+单词索引
+/app/install/db_insert_word_from_csv.php
+/app/admin/word_index_weight_refresh.php
+*/
+
+define("_FILE_DB_PALI_INDEX_", _PG_DB_PALI_INDEX_);
+define("_TABLE_WORD_", _PG_TABLE_WORD_);
+
+/*
+92万词
+/app/install/db_insert_wordindex_from_csv.php
+*/
+
+define("_FILE_DB_WORD_INDEX_", _PG_DB_WORD_INDEX_);
+define("_TABLE_WORD_INDEX_", _PG_TABLE_WORD_INDEX_);
+
+//单词索引=92万词+单词索引
+
+//PostgreSQL
+define("_FILE_DB_INDEX_", _PG_DB_INDEX_);
+
+//黑体字数据表
+//sqlite
+define("_FILE_DB_BOLD_", "sqlite:" . _SQLITE_DB_BOLD_);
+define("_TABLE_WORD_BOLD_", _SQLITE_TABLE_WORD_BOLD_);
+
+/*
+单词分析表
+数据迁移: php /deploy/migaration/word_statistics.php
+*/
+
+define("_FILE_DB_STATISTICS_", _PG_DB_STATISTICS_);
+define("_TABLE_WORD_STATISTICS_", _PG_TABLE_WORD_STATISTICS_);
+
+
+/*
+巴利句子表
+数据迁移: php ./deploy/migaration/20211125155700_pali_sent_org.php
+数据迁移: php ./deploy/migaration/20211125165700-pali_sent-upgrade.php
+数据迁移: php ./deploy/migaration/20211126220400-pali_sent_index-upgrade.php
+
+*/
+
+define("_FILE_DB_PALI_SENTENCE_", _SQLITE_DB_PALI_SENTENCE_);
+define("_TABLE_PALI_SENT_", _SQLITE_TABLE_PALI_SENT_);
+define("_TABLE_PALI_SENT_ORG_", _SQLITE_TABLE_PALI_SENT_ORG_);
+define("_TABLE_PALI_SENT_INDEX_", _SQLITE_TABLE_PALI_SENT_INDEX_);
+
+/*
+相似句
+数据迁移 
+php ./deploy/migaration/20211127214800_sent_sim.php
+php ./deploy/migaration/20211127214900-sent_sim_index.php
+redis: 
+php ./app/pali_sent/redis_upgrade_pali_sent.php
+*/
+
+define("_FILE_DB_PALI_SENTENCE_SIM_", _PG_DB_PALI_SENTENCE_SIM_);
+define("_TABLE_SENT_SIM_", _PG_TABLE_SENT_SIM_);
+define("_TABLE_SENT_SIM_INDEX_", _PG_TABLE_SENT_SIM_INDEX_);
+
+/*
+完成度
+数据迁移
+php ./app/upgrade/upgrade_pali_toc.php
+*/
+
+define("_FILE_DB_PALI_TOC_", _PG_DB_PALI_TOC_);
+define("_TABLE_PROGRESS_", _PG_TABLE_PROGRESS_);
+define("_TABLE_PROGRESS_CHAPTER_", _PG_TABLE_PROGRESS_CHAPTER_);
+
+
+//页码对应
+//sqlite
+define("_FILE_DB_PAGE_INDEX_", _SQLITE_DB_PAGE_INDEX_);
+define("_TABLE_PAGE_MATCH_", _SQLITE_TABLE_PAGE_MATCH_);
+define("_TABLE_BOOK_MATCH_", _SQLITE_TABLE_BOOK_MATCH_);
+define("_TABLE_CS6_PARA_", _SQLITE_TABLE_CS6_PARA_);
+define("_TABLE_MY_PAGE_", _SQLITE_TABLE_MY_PAGE_);
+define("_TABLE_PAGE_NUMBER_", _SQLITE_TABLE_PAGE_NUMBER_);
+
+
+# 字典数据表 全部存入redis
+
+
+#参考字典
+define("_FILE_DB_REF_", _SQLITE_DB_REF_);
+define("_TABLE_DICT_REF_", _SQLITE_TABLE_DICT_REF_);
+define("_TABLE_DICT_REF_NAME_", _SQLITE_TABLE_DICT_REF_NAME_);
+
+#参考字典索引
+define("_FILE_DB_REF_INDEX_", _SQLITE_DB_REF_INDEX_);
+define("_TABLE_REF_INDEX_", _SQLITE_TABLE_REF_INDEX_);
+
+
+# 用户数据表
+
+#sqlite
+define("_FILE_DB_USER_WBW_", _SQLITE_DB_USER_WBW_);
+define("_TABLE_USER_WBW_", _SQLITE_TABLE_USER_WBW_);
+define("_TABLE_USER_WBW_BLOCK_", _SQLITE_TABLE_USER_WBW_BLOCK_);
+
+
+# 译文
+#sqlite
+define("_FILE_DB_SENTENCE_", _SQLITE_DB_SENTENCE_);
+define("_TABLE_SENTENCE_", _SQLITE_TABLE_SENTENCE_);
+define("_TABLE_SENTENCE_BLOCK_", _SQLITE_TABLE_SENTENCE_BLOCK_);
+define("_TABLE_SENTENCE_PR_", _SQLITE_TABLE_SENTENCE_PR_);
+
+
+# 译文编辑历史
+#sqlite
+define("_FILE_DB_USER_SENTENCE_HISTORAY_", _SQLITE_DB_USER_SENTENCE_HISTORAY_);
+define("_TABLE_SENTENCE_HISTORAY_", _SQLITE_TABLE_SENTENCE_HISTORAY_);
+
+
+# 逐词解析字典
+# sqlite
+define("_FILE_DB_WBW_", _SQLITE_DB_WBW_);
+define("_TABLE_DICT_WBW_", _SQLITE_TABLE_DICT_WBW_);
+define("_TABLE_DICT_WBW_INDEX_", _SQLITE_TABLE_DICT_WBW_INDEX_);
+
+
+//写入频繁 读取不频繁
+# 用户行为记录
+#sqlite
+define("_FILE_DB_USER_ACTIVE_", _SQLITE_DB_USER_ACTIVE_);
+define("_TABLE_USER_OPERATION_DAILY_", _SQLITE_TABLE_USER_OPERATION_DAILY_);
+define("_TABLE_USER_OPERATION_FRAME_", _SQLITE_TABLE_USER_OPERATION_FRAME_);
+
+
+#sqlite
+define("_FILE_DB_USER_ACTIVE_LOG_", _SQLITE_DB_USER_ACTIVE_LOG_);
+define("_TABLE_USER_OPERATION_LOG_", _SQLITE_TABLE_USER_OPERATION_LOG_);
+
+
+//读取频繁 写入不频繁 
+# 用户账号
+#sqlite
+define("_FILE_DB_USERINFO_", _SQLITE_DB_USERINFO_);
+define("_TABLE_USER_INFO_", _SQLITE_TABLE_USER_INFO_);
+
+
+# 版本风格 
+#sqlite
+define("_FILE_DB_CHANNAL_", _SQLITE_DB_CHANNAL_);
+define("_TABLE_CHANNEL_", _SQLITE_TABLE_CHANNEL_);
+
+
+# 文章 文集
+
+define("_FILE_DB_USER_ARTICLE_", _SQLITE_DB_USER_ARTICLE_);
+define("_TABLE_ARTICLE_", _SQLITE_TABLE_ARTICLE_);
+define("_TABLE_COLLECTION_", _SQLITE_TABLE_COLLECTION_);
+define("_TABLE_ARTICLE_COLLECTION_", _SQLITE_TABLE_ARTICLE_COLLECTION_);
+
+
+
+# 术语
+define("_FILE_DB_TERM_", _SQLITE_DB_TERM_);
+define("_TABLE_TERM_", _SQLITE_TABLE_TERM_);
+
+# 协作
+define("_FILE_DB_USER_SHARE_", _SQLITE_DB_USER_SHARE_);
+define("_TABLE_USER_SHARE_", _SQLITE_TABLE_USER_SHARE_);
+
+# 工作组
+define("_FILE_DB_GROUP_", _SQLITE_DB_GROUP_);
+define("_TABLE_GROUP_INFO_", _SQLITE_TABLE_GROUP_INFO_);
+define("_TABLE_GROUP_MEMBER_", _SQLITE_TABLE_GROUP_MEMBER_);
+
+# 逐词解析文件索引
+define("_FILE_DB_FILEINDEX_", _SQLITE_DB_FILEINDEX_);
+define("_TABLE_FILEINDEX_", _SQLITE_TABLE_FILEINDEX_);
+define("_TABLE_FILEINDEX_POWER_", _SQLITE_TABLE_FILEINDEX_POWER_);
+
+# 课程
+define("_FILE_DB_COURSE_", _SQLITE_DB_COURSE_);
+define("_TABLE_COURSE_",_SQLITE_TABLE_COURSE_);
+define("_TABLE_LESSON_",_SQLITE_TABLE_LESSON_);
+
+# 用户自定义书
+define("_FILE_DB_USER_CUSTOM_BOOK_", _SQLITE_DB_USER_CUSTOM_BOOK_);
+define("_TABLE_CUSTOM_BOOK_", _SQLITE_TABLE_CUSTOM_BOOK_);
+define("_TABLE_CUSTOM_BOOK_SENT_", _SQLITE_TABLE_CUSTOM_BOOK_SENT_);
+
+# 逐词译和译文编辑消息 无需迁移数据
+define("_FILE_DB_MESSAGE_", _SQLITE_DB_MESSAGE_);
+define("_TABLE_MESSAGE_", _SQLITE_TABLE_MESSAGE_);
+
+#点赞
+define("_FILE_DB_LIKE_", _SQLITE_DB_LIKE_);
+define("_TABLE_LIKE_", _SQLITE_TABLE_LIKE_);
+
+
+# 用户字典统计数据 刷库 - 无需迁移数据
+define("_FILE_DB_USER_DICT_", _SQLITE_DB_USER_DICT_);
+define("_TABLE_USER_DICT_", _SQLITE_TABLE_USER_DICT_);
+
+?>

+ 2 - 2
app/db/user.php

@@ -175,8 +175,8 @@ class User extends Table
 			$ok = $this->_update(["reset_password_token"=>$resetToken],["reset_password_token"],["email"=>$email]);
 			if($ok){
 				#send email
-				$resetLink='https://'.WWW_DOMAIN_NAME."/app/ucenter/reset.php?token=".$resetToken;
-				$resetString=WWW_DOMAIN_NAME."/app/ucenter/reset.php";
+				$resetLink=WWW_SERVER."/app/ucenter/reset.php?token=".$resetToken;
+				$resetString=WWW_SERVER."/app/ucenter/reset.php";
 		
 				// 打开文件并读取数据
 				$irow=0;

+ 7 - 7
app/dict/redis_import_dict.php

@@ -19,7 +19,7 @@ if (PHP_SAPI == "cli") {
 		}
         $redis = redis_connect();
         if ($redis == false) {
-            echo "no redis connect\n";
+            fwrite(STDERR,"no redis connect\n") ;
             exit;
 		}
 		
@@ -36,7 +36,7 @@ if (PHP_SAPI == "cli") {
 				runTask($redis,$taskList[$tableNum],$dir);
 			}
 			else{
-				echo "wrong task number task length is ".count($taskList);
+				fwrite(STDERR, "wrong task number task length is ".count($taskList));
 			}
 		}
     }
@@ -48,7 +48,7 @@ function runTask($redis,$task,$dir){
 	foreach ($task->csv as $csv) {
 		$csvfile = $dir."/".$csv;
 		if (($fp = fopen($csvfile, "r")) !== false) {
-			echo "单词表load {$csvfile}\n";
+			fwrite(STDOUT, "单词表load {$csvfile}\n");
 			$row=0;
 			while (($data = fgetcsv($fp)) !== false) {
 				$row++;
@@ -69,20 +69,20 @@ function runTask($redis,$task,$dir){
 					$redis->hSet($task->rediskey,$data1[$task->keycol],json_encode($new, JSON_UNESCAPED_UNICODE));							
 				}
 				else{
-					echo "列不足够:行:{$row} 列:".count($data1)." 数据:{$data} \n";
+					//echo "列不足够:行:{$row} 列:".count($data1)." 数据:{$data} \n";
 				}
 				$count++;
 				if($count%50000==0){
 					sleep(1);
-					echo $count."\n";
+					fwrite(STDOUT, $count."\n");
 				}
 			}
 			fclose($fp);
 			sleep(1);
-			echo "task : {$task->rediskey}:".$redis->hLen($task->rediskey)."\n";
+			fwrite(STDOUT,  "task : {$task->rediskey}:".$redis->hLen($task->rediskey)."\n");
 			
 		} else {
-			echo "can not open csv file. ";
+			fwrite(STDERR,  "can not open csv file. ".PHP_EOL);
 		}	
 	}
 }

+ 4 - 1
app/dict/redis_import_term.php

@@ -39,8 +39,11 @@ if (PHP_SAPI == "cli") {
 				$redis->hSet($rediskey,$word["word"],json_encode($redisWord,JSON_UNESCAPED_UNICODE));
 			}
 		}
+		fwrite(STDOUT,  "all done ".$redis->hLen($rediskey).PHP_EOL);
+	}else{
+		fwrite(STDERR,"redis connect is fail".PHP_EOL);
 	}
-	echo "all done ".$redis->hLen($rediskey);
+	
 }
 
 ?>

+ 1 - 1
app/dict/redis_import_user.php

@@ -40,7 +40,7 @@ if (PHP_SAPI == "cli") {
 			}
 		}
 	}
-	echo "all done ".$redis->hLen($rediskey);
+	fwrite(STDOUT,  "all done ".$redis->hLen($rediskey).PHP_EOL);
 }
 
 ?>

+ 5 - 2
app/dict/redis_pm_part.php

@@ -5,7 +5,7 @@ require_once __DIR__."/../redis/function.php";
 if (PHP_SAPI == "cli") {
 	$redis = redis_connect();
 	if ($redis != false) {
-		$dbh = new PDO(_DICT_DB_PM_, "", "", array(PDO::ATTR_PERSISTENT => true));
+		$dbh = new PDO(_DICT_DB_PM_, Database["user"], Database["password"], array(PDO::ATTR_PERSISTENT => true));
 		$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
 		$query = "SELECT pali,parts from "._TABLE_DICT_PM_." where 1 group by pali";
 		$stmt = $dbh->query($query);
@@ -15,8 +15,11 @@ if (PHP_SAPI == "cli") {
 				$redis->hSet("dict://pm/part",$row["pali"],$row["parts"]);
 			}
 		}
+		fwrite(STDOUT, "all done ".$redis->hLen("dict://pm/part").PHP_EOL);
+	}else{
+		fwrite(STDERR,"redis connect is fail".PHP_EOL);
 	}
-	echo "all done ".$redis->hLen("dict://pm/part");
+	
 }
 
 ?>

+ 1 - 1
app/dict/redis_ref_with_mean.php

@@ -16,7 +16,7 @@ if (PHP_SAPI == "cli") {
 			$redis->hSet("dict://ref/has_mean",$row["word"],"1");
 		}
 	}
-	echo "all done ".$redis->hLen("dict://ref/has_mean");
+	fwrite(STDOUT,  "all done ".$redis->hLen("dict://ref/has_mean").PHP_EOL);
 }
 
 ?>

+ 4 - 4
app/dict/redis_refresh_first_mean.php

@@ -20,14 +20,14 @@ if (PHP_SAPI == "cli") {
 			print_r($languages);
 			foreach ($languages as $thisLang) {
 				# code...
-				echo "runing $thisLang \n";
+				fwrite(STDOUT,  "runing $thisLang \n");
 				$query = "SELECT word,mean from " . _TABLE_DICT_REF_ . " where language = ? group by word";
 				$stmt = $PDO->prepare($query);
         		$stmt->execute(array($thisLang));
 				while($meaning=$stmt->fetch(PDO::FETCH_ASSOC)){
 					$redis->hSet("ref_first_mean://".$thisLang,$meaning["word"],$meaning["mean"]);
 				}
-				echo $thisLang.":".$redis->hLen("ref_first_mean://".$thisLang)."\n";
+				fwrite(STDOUT,  $thisLang.":".$redis->hLen("ref_first_mean://".$thisLang)."\n");
 			}
 
 			$query = "SELECT word,mean from " . _TABLE_DICT_REF_ . " where 1 group by word";
@@ -36,11 +36,11 @@ if (PHP_SAPI == "cli") {
 			while($meaning=$stmt->fetch(PDO::FETCH_ASSOC)){
 				$redis->hSet("ref_first_mean://com",$meaning["word"],$meaning["mean"]);
 			}
-			echo "com:".$redis->hLen("ref_first_mean://com")."\n";
+			fwrite(STDOUT,  "com:".$redis->hLen("ref_first_mean://com")."\n");
 		}
 	}
 	else{
-		echo "no redis server";
+		fwrite(STDERR,  "no redis server");
 	}
 
 }

+ 4 - 2
app/dict/redis_sys_rgl_part.php

@@ -6,7 +6,7 @@ if (PHP_SAPI == "cli" || isset($_COOKIE["userid"]))
 {
 	$redis = redis_connect();
 	if ($redis != false) {
-		$dbh = new PDO(_DICT_DB_REGULAR_, "", "", array(PDO::ATTR_PERSISTENT => true));
+		$dbh = new PDO(_DICT_DB_REGULAR_, Database["user"], Database["password"], array(PDO::ATTR_PERSISTENT => true));
 		$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
 		
 		$query = "select * from (SELECT pali,parts from "._TABLE_DICT_REGULAR_." where 1  order by confidence DESC ) where 1 group by pali";
@@ -15,8 +15,10 @@ if (PHP_SAPI == "cli" || isset($_COOKIE["userid"]))
 			# code...
 			$redis->hSet("dict://regular/part",$row["pali"],$row["parts"]);
 		}
+		fwrite(STDOUT,  "all done ".$redis->hLen("dict://regular/part").PHP_EOL);
+	}else{
+		fwrite(STDERR,"redis connect is fail".PHP_EOL);
 	}
-	echo "all done ".$redis->hLen("dict://regular/part");
 }
 
 ?>

+ 4 - 4
app/fts/sql.php

@@ -98,7 +98,7 @@ foreach($scan as $foldername) {
 
     if (is_file($csv_file)) {
       $fileCounter++;      
-      echo "runing : $fileCounter" . PHP_EOL . $csv_file . PHP_EOL;
+      fwrite(STDOUT,"runing : $fileCounter" . PHP_EOL . $csv_file . PHP_EOL);
       // 初始化段落为 0 (没有这种段落)
       $paragraph = 0;
       // 初始化当前段落的黑体字数组
@@ -189,9 +189,9 @@ foreach($scan as $foldername) {
         $dbh_fts->commit();
         if (!$stmt || ($stmt && $stmt->errorCode() != 0)) {
             $error = $dbh_fts->errorInfo();
-            echo "error - $error[2]".PHP_EOL;
+            fwrite(STDERR, "error - $error[2]".PHP_EOL);
         } else {
-            echo "updata $row recorders.".PHP_EOL;
+            fwrite(STDOUT, "updata $row recorders.".PHP_EOL);
         }	
       }
 
@@ -202,5 +202,5 @@ foreach($scan as $foldername) {
   }
 }
 
-echo "Done. Amitābha \n";
+fwrite(STDOUT, "Done. Amitābha".PHP_EOL);
 ?>

+ 6 - 6
app/install/db_insert_bookword_from_csv_cli.php

@@ -11,7 +11,7 @@ set_exception_handler(function($e){
 	exit;
 });
 
-echo "Insert Pali Text To DB".PHP_EOL;
+fwrite(STDOUT, "Insert Pali Text To DB".PHP_EOL);
 
 if ($argc != 3) {
 	echo "help".PHP_EOL;
@@ -53,7 +53,7 @@ if ($_to == 0 || $_to >= $fileNums) {
 }
 
 for ($from=$_from-1; $from < $_to; $from++) { 
-    echo "doing ".($from+1).PHP_EOL;
+    fwrite(STDOUT, "doing ".($from+1).PHP_EOL);
 
     $bookword = array();
 
@@ -82,7 +82,7 @@ for ($from=$_from-1; $from < $_to; $from++) {
     
     if (!$stmt || ($stmt && $stmt->errorCode() != 0)) {
         $error = $dbh_word_index->errorInfo();
-        echo "error - $error[2]".PHP_EOL;
+        fwrite(STDERR, "error - $error[2]".PHP_EOL);
         $log .= "$from, $FileName, error, $error[2] \r\n";
     }else{
         // 开始一个事务,关闭自动提交
@@ -102,10 +102,10 @@ for ($from=$_from-1; $from < $_to; $from++) {
         $dbh_word_index->commit();
         if (!$stmt || ($stmt && $stmt->errorCode() != 0)) {
             $error = $dbh_word_index->errorInfo();
-            echo "error - $error[2]".PHP_EOL;
+            fwrite(STDERR, "error - $error[2]".PHP_EOL);
             $log .= "$from, $FileName, error, $error[2] \r\n";
         } else {
-            echo "updata $count recorders.".PHP_EOL;
+            fwrite(STDOUT, "updata $count recorders.".PHP_EOL);
             $log .= "updata $count recorders.\r\n";
         }	
     }
@@ -116,6 +116,6 @@ for ($from=$_from-1; $from < $_to; $from++) {
     fclose($myLogFile);
     */
 }
-echo "齐活!功德无量!all done!".PHP_EOL;
+fwrite(STDOUT, "齐活!功德无量!all done!".PHP_EOL);
 
 ?>

+ 14 - 12
app/install/db_insert_palitext_cli.php

@@ -13,7 +13,7 @@ set_exception_handler(function($e){
 define("_DB_", _PG_DB_PALITEXT_);
 define("_TABLE_",_PG_TABLE_PALI_TEXT_);
 
-echo "Insert Pali Text To DB".PHP_EOL;
+fwrite(STDOUT, "Insert Pali Text To DB".PHP_EOL);
 
 if ($argc != 3) {
 	echo "help".PHP_EOL;
@@ -34,7 +34,7 @@ $to = $_to;
 $filelist = array();
 $fileNums = 0;
 $log = "";
-echo "doing $_from";
+fwrite(STDOUT, "doing $_from".PHP_EOL);
 
 if (($handle = fopen(__DIR__."/filelist.csv", 'r')) !== false) {
     while (($filelist[$fileNums] = fgetcsv($handle, 0, ',')) !== false) {
@@ -69,7 +69,7 @@ for ($from=$_from-1; $from < $to; $from++) {
     $dirXml = $outputFileNameHead . "/";
     
     $xmlfile = $inputFileName;
-    echo "doing:" . $xmlfile . PHP_EOL;
+    fwrite(STDOUT, "doing:" . $xmlfile . PHP_EOL);
     $log = $log . "$from,$FileName,open\r\n";
     
     $arrInserString = array();
@@ -85,9 +85,10 @@ for ($from=$_from-1; $from < $to; $from++) {
     
         }
         fclose($fpPaliText);
-        echo "pali text load:" . $dirPaliTextBase . $xmlfile . PHP_EOL;
+        fwrite(STDOUT, "pali text load:" . $dirPaliTextBase . $xmlfile . PHP_EOL);
     } else {
-        echo "can not pali text file. filename=" . $dirPaliTextBase . $xmlfile;
+        fwrite(STDERR, "can not pali text file. filename=" . $dirPaliTextBase . $xmlfile.PHP_EOL);
+		continue;
     }
     
     $inputRow = 0;
@@ -102,15 +103,16 @@ for ($from=$_from-1; $from < $to; $from++) {
             $inputRow++;
         }
         fclose($fp);
-        echo "单词表load:" . $dirXmlBase . $dirXml . $outputFileNameHead . ".csv".PHP_EOL;
+        fwrite(STDOUT, "单词表load:" . $dirXmlBase . $dirXml . $outputFileNameHead . ".csv".PHP_EOL);
     } else {
-        echo "can not open csv file. filename=" . $dirXmlBase . $dirXml . $outputFileNameHead . ".csv";
+        fwrite(STDERR, "can not open csv file. filename=" . $dirXmlBase . $dirXml . $outputFileNameHead . ".csv".PHP_EOL);
         continue;
     }
     
     if (($inputRow - 1) != count($pali_text_array)) {
-        $log = $log . "$from, $FileName,error,文件行数不匹配 inputRow=$inputRow pali_text_array=" . count($pali_text_array) . " \r\n";
-        echo "line count error".PHP_EOL;
+        $log = "$from, $FileName,error,文件行数不匹配 inputRow=$inputRow pali_text_array=" . count($pali_text_array) . PHP_EOL;
+        fwrite(STDERR, $log);
+		continue;
     }
     
     #删除 旧数据
@@ -149,12 +151,12 @@ for ($from=$_from-1; $from < $to; $from++) {
     $dbh->commit();
     if (!$stmt || ($stmt && $stmt->errorCode() != 0)) {
         $error = $dbh->errorInfo();
-        echo "error - $error[2]".PHP_EOL;
+        fwrite(STDERR, "error - $error[2]".PHP_EOL);
     
         $log = $log . "$from, $FileName, error, $error[2] \r\n";
     } else {
         $count = count($arrInserString);
-        echo "updata $count recorders.".PHP_EOL;
+        fwrite(STDOUT, "updata $count recorders.".PHP_EOL);
     }
     /*
     $myLogFile = fopen($dirLog . "db_insert_palitext.log", "a");
@@ -162,7 +164,7 @@ for ($from=$_from-1; $from < $to; $from++) {
     fclose($myLogFile);
     */
 }
-echo "all done!".PHP_EOL;
+fwrite(STDOUT, "all done!".PHP_EOL);
 
 
 

+ 11 - 16
app/install/db_insert_templet_cli.php

@@ -11,7 +11,7 @@ set_exception_handler(function($e){
 	exit;
 });
 
-echo "Insert templet to DB".PHP_EOL;
+fwrite(STDOUT, "Insert templet to DB".PHP_EOL);
 
 if ($argc != 3) {
 	echo "help".PHP_EOL;
@@ -38,21 +38,21 @@ if (($handle = fopen(__DIR__."/filelist.csv", 'r')) !== false) {
     while (($filelist[] = fgetcsv($handle, 0, ',')) !== false) {
     }
 }
-echo "read file list".PHP_EOL;
+fwrite(STDOUT, "read file list".PHP_EOL);
 
 
 
 $dns = _DB_;
 $dbh = new PDO($dns, _DB_USERNAME_, _DB_PASSWORD_, array(PDO::ATTR_PERSISTENT => true));
 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
-echo "db Connectd".PHP_EOL;
+fwrite(STDOUT, "db Connectd".PHP_EOL);
 
 
 for ($from=$_from; $from <=$_to ; $from++) { 
 	# code...
 	
 	$fileSn = $from-1;
-	echo "doing:".$from.PHP_EOL;
+	fwrite(STDOUT, "doing:".$from.PHP_EOL);
 	$FileName = $filelist[$fileSn][1] . ".htm";
 	$fileId = $filelist[$fileSn][0];
 
@@ -84,7 +84,7 @@ for ($from=$_from; $from <=$_to ; $from++) {
 	$g_paliWordCountCounter = 0;
 
 	$xmlfile = $inputFileName;
-	echo "doing:" . $xmlfile . PHP_EOL;
+	fwrite(STDOUT, "doing:" . $xmlfile . PHP_EOL);
 	$log =  "$from,$FileName,open\r\n";
 	//fwrite($myLogFile, $log);
 
@@ -94,7 +94,7 @@ for ($from=$_from; $from <=$_to ; $from++) {
 	$stmt->execute(array($from));
 
 
-	echo "delete ".PHP_EOL;
+	fwrite(STDOUT, "delete ".PHP_EOL);
 
 	$row=0;
 	// 开始一个事务,关闭自动提交
@@ -103,10 +103,8 @@ for ($from=$_from; $from <=$_to ; $from++) {
 	$stmt = $dbh->prepare($query);
 	if (!$stmt || ($stmt && $stmt->errorCode() != 0)) {
 		$error = $dbh->errorInfo();
-		echo "error - $error[2]".PHP_EOL;
-
+		fwrite(STDERR, "error - $error[2]".PHP_EOL);
 		$log = "$from, $FileName, error, $error[2] \r\n";
-		//fwrite($myLogFile, $log);
 		exit;
 	} else {
 		// 打开文件并读取数据
@@ -137,9 +135,9 @@ for ($from=$_from; $from <=$_to ; $from++) {
 				$row++;
 			}
 			fclose($fp);
-			echo "word loaded:" . $dirXmlBase . $dirXml . $outputFileNameHead . ".csv".PHP_EOL;
+			fwrite(STDOUT, "word loaded:" . $dirXmlBase . $dirXml . $outputFileNameHead . ".csv".PHP_EOL);
 		} else {
-			echo "can not open csv file. filename=" . $dirXmlBase . $dirXml . $outputFileNameHead . ".csv".PHP_EOL;
+			fwrite(STDERR, "can not open csv file. filename=" . $dirXmlBase . $dirXml . $outputFileNameHead . ".csv".PHP_EOL);
 		}
 	}
 
@@ -147,14 +145,11 @@ for ($from=$_from; $from <=$_to ; $from++) {
 	$dbh->commit();
 	if (!$stmt || ($stmt && $stmt->errorCode() != 0)) {
 		$error = $dbh->errorInfo();
-		echo "error - $error[2]".PHP_EOL;
-
+		fwrite(STDERR, "error - $error[2]".PHP_EOL);
 		$log = "$from, $FileName, error, $error[2] \r\n";
-		//fwrite($myLogFile, $log);
 		exit(1);
 	} else {
-		
-		echo "updata $row recorders.".PHP_EOL;
+		fwrite(STDOUT, "updata $row recorders.".PHP_EOL);
 
 	}
 }

+ 5 - 10
app/install/db_insert_word_from_csv_cli.php

@@ -14,7 +14,7 @@ set_exception_handler(function($e){
 define("_DB_", _PG_DB_PALI_INDEX_);
 define("_TABLE_", _PG_TABLE_WORD_);
 
-echo "Insert Word To DB".PHP_EOL;
+fwrite(STDOUT, "Insert Word To DB".PHP_EOL);
 
 if ($argc != 3) {
 	echo "help".PHP_EOL;
@@ -53,7 +53,7 @@ if ($_to == 0 || $_to >= $fileNums) {
 }
 
 for ($from=$_from-1; $from < $_to; $from++) { 
-    echo "doing ".($from+1).PHP_EOL;
+    fwrite(STDOUT, "doing ".($from+1).PHP_EOL);
     #删除
     $query = "DELETE FROM "._TABLE_." WHERE book = ?";
     $stmt = $dbh_word_index->prepare($query);
@@ -88,19 +88,14 @@ for ($from=$_from-1; $from < $_to; $from++) {
         $dbh_word_index->commit();
         if (!$stmt || ($stmt && $stmt->errorCode() != 0)) {
             $error = $dbh_word_index->errorInfo();
-            echo "error - $error[2] ".PHP_EOL;
+            fwrite(STDERR, "error - $error[2] ".PHP_EOL);
             $log .= "$from, $FileName, error, $error[2] \r\n";
         } else {
-            echo "updata $count recorders.".PHP_EOL;
+            fwrite(STDOUT, "updata $count recorders.".PHP_EOL);
             $log .= "updata $count recorders.\r\n";
         }
     }
-/*
-    $myLogFile = fopen($dirLog . "insert_index.log", "a");
-    fwrite($myLogFile, $log);
-    fclose($myLogFile);
-    */
 }
-    echo "齐活!功德无量!all done!".PHP_EOL;
+fwrite(STDOUT, "齐活!功德无量!all done!".PHP_EOL);
 
 ?>

+ 6 - 6
app/install/db_insert_wordindex_from_csv_cli.php

@@ -15,7 +15,7 @@ set_exception_handler(function($e){
 define("_DB_", _PG_DB_WORD_INDEX_);
 define("_TABLE_", _PG_TABLE_WORD_INDEX_);
 
-echo "Insert Word Index To DB".PHP_EOL;
+fwrite(STDOUT, "Insert Word Index To DB".PHP_EOL);
 
 
 $dirLog = _DIR_LOG_ . "/";
@@ -42,7 +42,7 @@ try{
     foreach($scan as $filename) {
         $filename = _DIR_CSV_PALI_CANON_WORD_INDEX_."/".$filename;
         if (is_file($filename)) {
-            echo "doing ".$filename.PHP_EOL;
+            fwrite(STDOUT, "doing ".$filename.PHP_EOL);
             if (($fpoutput = fopen($filename, "r")) !== false) {
 
                 // 开始一个事务,关闭自动提交
@@ -74,20 +74,20 @@ try{
                 $dbh_word_index->commit();
                 if (!$stmt || ($stmt && $stmt->errorCode() != 0)) {
                     $error = $dbh_word_index->errorInfo();
-                    echo "error - $error[2]".PHP_EOL;
+                    fwrite(STDERR, "error - $error[2]".PHP_EOL);
                     $log .= "$filename, error, $error[2] \r\n";
                 } else {
-                    echo "updata $count recorders.".PHP_EOL;
+                    fwrite(STDOUT, "updata $count recorders.".PHP_EOL);
                     $log .= "updata $count recorders.\r\n";
                 }
             }else{
-                echo "open file error".PHP_EOL;
+                fwrite(STDERR, "open file error".PHP_EOL);
             }
         
         }
     }
 
-echo "齐活!功德无量!all done!".PHP_EOL;
+	fwrite(STDOUT, "齐活!功德无量!all done!".PHP_EOL);
 
 
 

+ 13 - 17
app/install/db_update_palitext_cli.php

@@ -15,7 +15,7 @@ set_exception_handler(function($e){
 define("_DB_PALITEXT_", _PG_DB_PALITEXT_);
 define("_TABLE_",_PG_TABLE_PALI_TEXT_);
 
-echo "Update Pali Text ".PHP_EOL;
+fwrite(STDOUT, "Update Pali Text ".PHP_EOL);
 
 if ($argc != 3) {
 	echo "help".PHP_EOL;
@@ -52,7 +52,7 @@ PDO_Connect(_DB_PALITEXT_,_DB_USERNAME_,_DB_PASSWORD_);
 
 
 for ($from=$_from-1; $from < $to; $from++) { 
-    echo "doing $from".PHP_EOL;
+    fwrite(STDOUT, "doing $from".PHP_EOL);
 
 $FileName = $filelist[$from][1] . ".htm";
 $fileId = $filelist[$from][0];
@@ -72,7 +72,7 @@ $dirPaliTextBase = _DIR_PALI_HTML_ . "/";
 $dirXml = $outputFileNameHead . "/";
 
 $xmlfile = $inputFileName;
-echo "doing:" . $xmlfile . PHP_EOL;
+fwrite(STDOUT, "doing:" . $xmlfile . PHP_EOL);
 
 $log = $log . date("Y-m-d h:i:sa") . ",$from,$FileName,open\r\n";
 
@@ -85,9 +85,9 @@ if (($fpPaliText = fopen($dirPaliTextBase . $xmlfile, "r")) !== false) {
         array_push($pali_text_array, $data);
     }
     fclose($fpPaliText);
-    echo "pali text load:" . $dirPaliTextBase . $xmlfile . PHP_EOL;
+    fwrite(STDOUT, "pali text load:" . $dirPaliTextBase . $xmlfile . PHP_EOL);
 } else {
-    echo "can not pali text file. filename=" . $dirPaliTextBase . $xmlfile;
+    fwrite(STDERR, "can not pali text file. filename=" . $dirPaliTextBase . $xmlfile.PHP_EOL);
 }
 
 // 打开csv文件并读取数据
@@ -101,9 +101,9 @@ if (($fp = fopen(_DIR_PALI_TITLE_ . "/" . ($from + 1) . "_pali.csv", "r")) !== f
         $inputRow++;
     }
     fclose($fp);
-    echo "单词表load:" . $dirXmlBase . $dirXml . $outputFileNameHead . ".csv". PHP_EOL;
+    fwrite(STDOUT, "单词表load:" . $dirXmlBase . $dirXml . $outputFileNameHead . ".csv". PHP_EOL);
 } else {
-    echo "can not open csv file. filename=" . $dirXmlBase . $dirXml . $outputFileNameHead . ".csv";
+    fwrite(STDERR, "can not open csv file. filename=" . $dirXmlBase . $dirXml . $outputFileNameHead . ".csv" . PHP_EOL);
 }
 
 if ((count($arrInserString)) != count($pali_text_array) - 2) {
@@ -116,7 +116,7 @@ $book = $from + 1;
 
 $query = "SELECT * from "._TABLE_." where book = '$book'  order by paragraph asc";
 $title_data = PDO_FetchAll($query);
-echo "Paragraph Count:" . count($title_data) . " arrInserString:".count($arrInserString). PHP_EOL;
+fwrite(STDOUT, "Paragraph Count:" . count($title_data) . " arrInserString:".count($arrInserString). PHP_EOL);
 
 $paragraph_count = count($title_data);
 
@@ -218,21 +218,17 @@ for ($iPar = 0; $iPar < count($title_data); $iPar++) {
 $PDO->commit();
 if (!$stmt || ($stmt && $stmt->errorCode() != 0)) {
     $error = PDO_ErrorInfo();
-    echo "error - $error[2]". PHP_EOL;
+    fwrite(STDERR, "error - $error[2]". PHP_EOL);
 
     $log = $log . "$from, $FileName, error, $error[2] \r\n";
 } else {
     $count = count($title_data);
-    echo "updata $count paragraph info recorders.". PHP_EOL;
-    echo count($paragraph_info) . " Heading". PHP_EOL;
+    fwrite(STDOUT, "updata $count paragraph info recorders.". PHP_EOL);
+    fwrite(STDOUT, count($paragraph_info) . " Heading". PHP_EOL);
 }
 //段落信息结束
-/*
-$myLogFile = fopen(_DIR_LOG_ . "/db_update_palitext.log", "a");
-fwrite($myLogFile, $log);
-fclose($myLogFile);
-*/
+
 }
-echo "all done!".PHP_EOL;
+fwrite(STDOUT, "all done!".PHP_EOL);
 ?>
 

+ 7 - 7
app/install/db_update_toc_cli.php

@@ -12,7 +12,7 @@ set_exception_handler(function($e){
 define("_DB_RES_INDEX_", _PG_DB_RESRES_INDEX_);
 define("_TABLE_",_PG_TABLE_RES_INDEX_);
 
-echo "Update toc to res_index".PHP_EOL;
+fwrite(STDOUT, "Update toc to res_index".PHP_EOL);
 
 if ($argc != 4) {
 	echo $argv[0]." help".PHP_EOL;
@@ -34,7 +34,7 @@ $_lang = $argv[3];
 $filelist = array();
 $fileNums = 0;
 $log = "";
-echo "doing $_from".PHP_EOL;
+fwrite(STDOUT, "doing $_from".PHP_EOL);
 
 if (($handle = fopen(__DIR__."/filelist.csv", 'r')) !== false) {
     while (($filelist[$fileNums] = fgetcsv($handle, 0, ',')) !== false) {
@@ -90,9 +90,9 @@ for ($from=$_from-1; $from < $_to; $from++) {
             $inputRow++;
         }
         fclose($fp);
-        echo "res load:" . _DIR_PALI_TITLE_ . "/" . ($from + 1) . "_title.csv".PHP_EOL;
+        fwrite(STDOUT, "res load:" . _DIR_PALI_TITLE_ . "/" . ($from + 1) . "_title.csv".PHP_EOL);
     } else {
-        echo "can not open csv ";
+        fwrite(STDOUT, "can not open csv ".PHP_EOL);
         continue;
     }
     
@@ -155,11 +155,11 @@ for ($from=$_from-1; $from < $_to; $from++) {
     $dbh->commit();
     if (!$stmt || ($stmt && $stmt->errorCode() != 0)) {
         $error = $dbh->errorInfo();
-        echo "error - $error[2] ".PHP_EOL;
+        fwrite(STDERR, "error - $error[2] ".PHP_EOL);
         $log = $log . "$from, error, $error[2] \r\n";
     } else {
         $count = count($arrInserString);
-        echo "updata $count title recorders.".PHP_EOL;
+        fwrite(STDOUT, "updata $count title recorders.".PHP_EOL);
     }
     //段落信息结束
     /*
@@ -168,7 +168,7 @@ for ($from=$_from-1; $from < $_to; $from++) {
     fclose($myLogFile);
     */
 }
- echo "<h2>齐活!功德无量!all done!</h2>";
+fwrite(STDOUT, "齐活!功德无量!all done!".PHP_EOL);
 
 
 

+ 23 - 0
app/log/loglist.php

@@ -0,0 +1,23 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+</head>
+<body>
+<ol>
+<?php
+require_once("../config.php");
+$scan = scandir(_DIR_LOG_);
+$fileCounter = 0;
+
+foreach($scan as $filename) {
+	if (is_file(_DIR_LOG_."/".$filename)){
+		if(substr($filename,0,5)=='pref_'){
+			$date = substr($filename,5,-4);
+			echo "<li><a href='showlog.php?file={$filename}' target='log'>".$date.'</a></li>';
+		}
+	}
+}
+?>
+</ol>
+</body>
+</html>

+ 10 - 0
app/log/performance.html

@@ -0,0 +1,10 @@
+<html>
+
+<frameset cols="15%,85%">
+
+<frame src="./loglist.php">
+<frame src="" name="log">
+
+</frameset>
+
+</html>

+ 345 - 0
app/log/showlog.js

@@ -0,0 +1,345 @@
+
+function getData(filename){
+	$.get("../../tmp/log/"+filename,
+	function(data,status){
+	  
+	//生成数据数组
+	  let rowData= data.split('\n');
+	  let arrData = new Array();
+	  for (const iterator of rowData) {
+		arrData.push(iterator.split(","));
+	  }
+	  console.log(arrData);
+	  let api = new Object;
+	  let delayInMinute
+	  
+	  //遍历所有数据
+	  for (const iterator of arrData) {
+		if (api.hasOwnProperty.call(api, iterator[0])) {
+			let element = api[iterator[0]];
+			element.times++;
+			element.delay += parseInt(iterator[2]);
+			try{
+				let hour = parseInt(iterator[1].split(':')[0]);
+				element.delayHour[hour] += parseInt(iterator[2]);
+				element.timesHour[hour] ++;
+				
+			}catch(e){
+
+			}
+
+		}else{
+			api[iterator[0]] = {
+				times:1,
+				timesHour:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
+				delay:parseInt(iterator[2]),
+				delayHour:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
+			};
+			try{
+				let hour = parseInt(iterator[1].split(':')[0]);
+				api[iterator[0]].delayHour[hour] = parseInt(iterator[2]);
+				api[iterator[0]].timesHour[hour] = 1;
+			}catch(e){
+
+			}
+
+		}
+	  }
+	  let api_timms = new Array();
+	  let api_delay = new Array();
+	  let ApiDelayInHour = new Array();
+	  let ApiTimesInHour = new Array();
+	  for (const key in api) {
+		  if (Object.hasOwnProperty.call(api, key)) {
+			  const element = api[key];
+			  api_timms.push({
+				  name:key,
+				  y:element.times
+			  });
+			  api_delay.push({
+				name:key,
+				y:element.delay
+			  });
+			  ApiDelayInHour.push({
+				name:key,
+				data:element.delayHour
+			  });
+			  ApiTimesInHour.push({
+				name:key,
+				data:element.timesHour
+			  })
+		  }
+	  }
+
+	  chart_1(api_timms);
+	  chart_2(api_delay);
+	  chart_3(ApiDelayInHour);
+	  chart_4(ApiTimesInHour);
+	});
+  
+}
+
+function chart_1(data){
+	// Make monochrome colors
+var pieColors = (function () {
+    var colors = [],
+        base = Highcharts.getOptions().colors[0],
+        i;
+
+    for (i = 0; i < 10; i += 1) {
+        // Start out with a darkened base color (negative brighten), and end
+        // up with a much brighter color
+        colors.push(Highcharts.color(base).brighten((i - 3) / 7).get());
+    }
+    return colors;
+}());
+
+// Build the chart
+Highcharts.chart('chart-1', {
+    chart: {
+        plotBackgroundColor: null,
+        plotBorderWidth: null,
+        plotShadow: false,
+        type: 'pie'
+    },
+    title: {
+        text: 'API 执行次数'
+    },
+    tooltip: {
+        pointFormat: '{series.name}: <b>{point.percentage:.1f}%</b>'
+    },
+    accessibility: {
+        point: {
+            valueSuffix: '%'
+        }
+    },
+    plotOptions: {
+        pie: {
+            allowPointSelect: true,
+            cursor: 'pointer',
+            colors: pieColors,
+            dataLabels: {
+                enabled: true,
+                format: '<b>{point.name}</b><br>{point.percentage:.1f} %',
+                distance: -50,
+                filter: {
+                    property: 'percentage',
+                    operator: '>',
+                    value: 4
+                }
+            }
+        }
+    },
+    series: [{
+        name: 'Share',
+        data: data
+    }]
+});
+}
+
+function chart_2(data){
+	// Make monochrome colors
+var pieColors = (function () {
+    var colors = [],
+        base = Highcharts.getOptions().colors[0],
+        i;
+
+    for (i = 0; i < 10; i += 1) {
+        // Start out with a darkened base color (negative brighten), and end
+        // up with a much brighter color
+        colors.push(Highcharts.color(base).brighten((i - 3) / 7).get());
+    }
+    return colors;
+}());
+
+// Build the chart
+Highcharts.chart('chart-2', {
+    chart: {
+        plotBackgroundColor: null,
+        plotBorderWidth: null,
+        plotShadow: false,
+        type: 'pie'
+    },
+    title: {
+        text: 'API 累积执行时间'
+    },
+    tooltip: {
+        pointFormat: '{series.name}: <b>{point.percentage:.1f}%</b>'
+    },
+    accessibility: {
+        point: {
+            valueSuffix: '%'
+        }
+    },
+    plotOptions: {
+        pie: {
+            allowPointSelect: true,
+            cursor: 'pointer',
+            colors: pieColors,
+            dataLabels: {
+                enabled: true,
+                format: '<b>{point.name}</b><br>{point.percentage:.1f} %',
+                distance: -50,
+                filter: {
+                    property: 'percentage',
+                    operator: '>',
+                    value: 4
+                }
+            }
+        }
+    },
+    series: [{
+        name: 'Share',
+        data: data
+    }]
+});
+}
+
+//按照小时计算的api 执行时间
+function chart_3(data){
+	Highcharts.chart('chart-3', {
+
+		title: {
+			text: '按照小时计算的 API 执行时间'
+		},
+	
+		subtitle: {
+			text: 'Source: thesolarfoundation.com'
+		},
+	
+		yAxis: {
+			title: {
+				text: '执行时间'
+			}
+		},
+	
+		xAxis: {
+			categories: [
+				'8',
+				'9',
+				'10',
+				'11',
+				'12',
+				'13',
+				'14',
+				'15',
+				'16',
+				'17',
+				'18',
+				'19',
+				'20',
+				'21',
+				'22',
+				'23',
+				'0',
+				'1',
+				'2',
+				'3',
+				'4',
+				'5',
+				'6',
+				'7'
+			],
+			accessibility: {
+				rangeDescription: 'Range: 0 to 23'
+			}
+		},
+	
+		legend: {
+			layout: 'vertical',
+			align: 'right',
+			verticalAlign: 'middle'
+		},
+	
+		plotOptions: {
+			series: {
+				label: {
+					connectorAllowed: false
+				},
+				pointStart: 0
+			}
+		},
+	
+		series: data,
+	
+		responsive: {
+			rules: [{
+				condition: {
+					maxWidth: 500
+				},
+				chartOptions: {
+					legend: {
+						layout: 'horizontal',
+						align: 'center',
+						verticalAlign: 'bottom'
+					}
+				}
+			}]
+		}
+	
+	});
+}
+
+function chart_4(data){
+	Highcharts.chart('chart-4', {
+		chart: {
+			type: 'column'
+		},
+		title: {
+			text: 'API 执行次数'
+		},
+		subtitle: {
+			text: 'Source: WorldClimate.com'
+		},
+		xAxis: {
+			categories: [
+				'8',
+				'9',
+				'10',
+				'11',
+				'12',
+				'13',
+				'14',
+				'15',
+				'16',
+				'17',
+				'18',
+				'19',
+				'20',
+				'21',
+				'22',
+				'23',
+				'0',
+				'1',
+				'2',
+				'3',
+				'4',
+				'5',
+				'6',
+				'7'
+			],
+			crosshair: true
+		},
+		yAxis: {
+			min: 0,
+			title: {
+				text: '执行次数'
+			}
+		},
+		tooltip: {
+			headerFormat: '<span style="font-size:10px">{point.key}</span><table>',
+			pointFormat: '<tr><td style="color:{series.color};padding:0">{series.name}: </td>' +
+				'<td style="padding:0"><b>{point.y:.1f} mm</b></td></tr>',
+			footerFormat: '</table>',
+			shared: true,
+			useHTML: true
+		},
+		plotOptions: {
+			column: {
+				pointPadding: 0.2,
+				borderWidth: 0
+			}
+		},
+		series: data
+	});
+}

+ 77 - 0
app/log/showlog.php

@@ -0,0 +1,77 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+	<meta name="viewport" content="width=device-width, initial-scale=1">
+	<script src="../../node_modules/jquery/dist/jquery.js"></script>
+
+	<style type="text/css">
+
+	.highcharts-figure, .highcharts-data-table table {
+		flex:1;
+		min-width: 220px; 
+		max-width: 100%;
+		margin: 1em auto;
+	}
+
+	.highcharts-data-table table {
+		font-family: Verdana, sans-serif;
+		border-collapse: collapse;
+		border: 1px solid #EBEBEB;
+		margin: 10px auto;
+		text-align: center;
+		width: 100%;
+		max-width: 500px;
+	}
+	.highcharts-data-table caption {
+		padding: 1em 0;
+		font-size: 1.2em;
+		color: #555;
+	}
+	.highcharts-data-table th {
+		font-weight: 600;
+		padding: 0.5em;
+	}
+	.highcharts-data-table td, .highcharts-data-table th, .highcharts-data-table caption {
+		padding: 0.5em;
+	}
+	.highcharts-data-table thead tr, .highcharts-data-table tr:nth-child(even) {
+		background: #f8f8f8;
+	}
+	.highcharts-data-table tr:hover {
+		background: #f1f7ff;
+	}
+	.chart_head_1 {
+		text-align: center;
+		font-size: x-large;
+		margin-bottom: 0;
+		font-weight: bold;
+	}
+	.highcharts-data-label {
+		font-size: small;
+	}
+	</style>
+	<script src="../../node_modules/highcharts/highcharts.js"></script>
+	<script src="../../node_modules/highcharts/modules/sunburst.js"></script>
+	<script src="../../node_modules/highcharts/modules/exporting.js"></script>
+	<script src="../../node_modules/highcharts/modules/export-data.js"></script>
+	<script src="../../node_modules/highcharts/modules/accessibility.js"></script>
+
+	<script src="./showlog.js"></script>
+
+</head>
+<body>
+<h2><?php echo $_GET['file'];?></h2>
+<div style="display:flex;">
+<div id='chart-1'></div>
+<div id='chart-2'></div>
+</div>
+<div id='chart-3'></div>
+<div id='chart-4'></div>
+<div id='chart-5'></div>
+
+<script type="text/javascript">
+getData('<?php echo $_GET['file'];?>');
+</script>
+</body>
+</html>

+ 3 - 2
app/nissaya/nissaya.js

@@ -34,10 +34,11 @@ function render_on_page(params) {
 
 	html += "<div class='img_box' dir='" + params.dir + "' book='" + params.book + "' page='" + params.page + "'>";
 	html += "<div>" + filename + "</div>";
+	let filePath = ASSETS_SERVER + "/nissaya/";
 	if (params.show) {
-		html += "<img class='book_page' src='../../tmp/nissaya/" + filename + "' />";
+		html += "<img class='book_page' src='" + filePath + filename + "' />";
 	} else {
-		html += "<img class='book_page' data-src='../../tmp/nissaya/" + filename + "' />";
+		html += "<img class='book_page' data-src='" + filePath + filename + "' />";
 	}
 	html += "</div>";
 	return html;

+ 6 - 6
app/pali_sent/redis_upgrade_pali_sent.php

@@ -21,9 +21,9 @@ if (isset($argv[1])) {
 				$count += $deleted;
 			}
 			
-			echo "delete ok ".$count;			
+			fwrite(STDOUT,"delete ok ".$count.PHP_EOL) ;			
 		}else{
-			echo "redis connect error ".PHP_EOL;			
+			fwrite(STDERR, "redis connect error ".PHP_EOL);			
 
 		}
     }
@@ -50,11 +50,11 @@ if (isset($argv[1])) {
                 $stringSize = 0;  
 			}
 			if($count%10000==0){
-				echo $count . "-".$sent["book"] . "_" . $sent["paragraph"] . "\n";
+				fwrite(STDOUT, $count . "-".$sent["book"] . "_" . $sent["paragraph"] . "\n");
 			}
 			$result = $redis->hSet('pali://sent/' . $sent["book"] . "_" . $sent["paragraph"] . "_" . $sent["begin"] . "_" . $sent["end"], "pali", $sent["html"]);
 			if($result===FALSE){
-				echo "hSet error \n";
+				fwrite(STDERR, "hSet error \n");
 			}
 			$result = $redis->hSet('pali://sent/' . $sent["book"] . "_" . $sent["paragraph"] . "_" . $sent["begin"] . "_" . $sent["end"], "id", $sent["id"]);	
 
@@ -69,8 +69,8 @@ if (isset($argv[1])) {
 			}
 			$result = $redis->hSet('pali://sent/' . $sent["book"] . "_" . $sent["paragraph"] . "_" . $sent["begin"] . "_" . $sent["end"], "sim_count", $pali_sim);			
         }
-        echo "完成 ". count($redis->keys("pali://sent/*"));
+        fwrite(STDOUT, "完成 ". count($redis->keys("pali://sent/*")).PHP_EOL);
     } else {
-        echo "连接redis失败";
+        fwrite(STDERR, "连接redis失败".PHP_EOL);
     }
 }

+ 2 - 1
app/redis/function.php

@@ -5,7 +5,8 @@ function redis_connect()
 	try {
 		//code...
 		$redis = new redis();
-		$r_conn = $redis->connect('127.0.0.1', 6379);
+		$r_conn = $redis->connect(Redis["host"], Redis["port"]);
+		$redis->auth(Redis["password"]);
 		if ($r_conn) {
 			return $redis;
 		} else {

+ 3 - 1
app/studio/js/index_mydoc.js

@@ -225,7 +225,9 @@ function title_change(id, title) {
 	}
 }
 function share_link_copy_to_clipboard(id) {
-	copy_to_clipboard(WWW_DOMAIN_NAME+"/app/studio/project.php?op=open&doc_id=" + id);
+	let host = location.protocol + '//' + location.host;
+
+	copy_to_clipboard(host+"/app/studio/project.php?op=open&doc_id=" + id);
 }
 function mydoc_file_select(doSelect) {
 	if (doSelect) {

+ 1 - 1
app/studio/project.php

@@ -185,7 +185,7 @@ switch ($op) {
                                         $strXml .= "<style>{$result["style"]}</style>";
                                         $strXml .= "<status>0</status>";
                                         $strXml .= "</word>";
-                                        $wbw_data[] = array(UUID::v4(), $block_id, $book, $iPar, $result["wid"], $result["real"], $strXml, mTime(), mTime(), 1, $USER_NAME);
+                                        $wbw_data[] = array(UUID::v4(), $block_id, $book, $iPar, $result["wid"], $result["real"], $strXml, mTime(), mTime(), 1, $_COOKIE['userid']);
                                     }
                                 }
                             }

+ 4 - 4
app/term/note.js

@@ -288,7 +288,7 @@ function render_read_mode_sent(iterator) {
 		let html = "<span class='tran_sent' lang='" + oneTran.lang + "' channal='" + oneTran.channal + "'>";
 
 		//将绝对链接转换为 用户连接的主机链接
-		oneTran.text = oneTran.text.replace(/[A-z]*.wikipali.org/g,WWW_DOMAIN_NAME);
+		oneTran.text = oneTran.text.replace(/[A-z]*.wikipali.org/g,location.host);
 
 		html += marked(term_std_str_to_tran(oneTran.text, oneTran.channal, oneTran.editor, oneTran.lang));
 		html += "</span>";
@@ -600,13 +600,13 @@ function note_ref_init() {
 	$("chapter").click(function () {
 		let bookid = $(this).attr("book");
 		let para = $(this).attr("para");
-		window.open("../reader/?view=chapter&book=" + bookid + "&par=" + para, "_blank");
+		window.open("../article/?view=chapter&book=" + bookid + "&par=" + para, "_blank");
 	});
 
 	$("para").click(function () {
 		let bookid = $(this).attr("book");
 		let para = $(this).attr("para");
-		window.open("../reader/?view=para&book=" + bookid + "&par=" + para, "_blank");
+		window.open("../article/?view=para&book=" + bookid + "&par=" + para, "_blank");
 	});
 }
 /*
@@ -897,7 +897,7 @@ function render_one_sent_tran_a(iterator, diff = false) {
 	let sid = iterator.book + "-" + iterator.para + "-" + iterator.begin + "-" + iterator.end;
 
 	//将绝对链接转换为 用户连接的主机链接
-	let showText = iterator.text.replace(/[A-z]*.wikipali.org/g,WWW_DOMAIN_NAME);
+	let showText = iterator.text.replace(/[A-z]*.wikipali.org/g,location.host);
 
 	if (iterator.text == "") {
 		if (typeof iterator.channalinfo == "undefined") {

+ 4 - 0
app/ucenter/active_analysis.php

@@ -4,6 +4,10 @@
 
 <html>
 <body>
+<script src="../../node_modules/highcharts/highstock.js"></script>
+<script src="../../node_modules/highcharts/modules/data.js"></script>
+<script src="../../node_modules/highcharts/modules/exporting.js"></script>
+
 <script src="https://code.highcharts.com/stock/highstock.js"></script>
 <script src="https://code.highcharts.com/stock/modules/data.js"></script>
 <script src="https://code.highcharts.com/stock/modules/exporting.js"></script>

+ 2 - 2
app/ucenter/invite.php

@@ -23,8 +23,8 @@ if (PHP_SAPI == "cli") {
 		$invitecode = "invitecode://".$uuid;
 		$redis->set($invitecode,$email);
 		$redis->expire($invitecode,7*20*3600);
-		$SignUpLink=WWW_DOMAIN_PROTOCOL."://".WWW_DOMAIN_NAME . "/app/ucenter/sign_up.php?invite=".$uuid;
-		$SignUpString=WWW_DOMAIN_NAME . "/app/ucenter/sign_up.php";
+		$SignUpLink=WWW_SERVER . "/app/ucenter/sign_up.php?invite=".$uuid;
+		$SignUpString=WWW_SERVER . "/app/ucenter/sign_up.php";
 
 			// 打开文件并读取数据
 		$irow=0;