Explorar el Código

使用 laravel api 提交pr

visuddhinanda hace 3 años
padre
commit
9d89ec7c7f
Se han modificado 4 ficheros con 342 adiciones y 62 borrados
  1. 124 24
      app/Http/Controllers/SentPrController.php
  2. 1 0
      app/Models/Sentence.php
  3. 201 26
      public/app/term/note.js
  4. 16 12
      public/app/term/term.css

+ 124 - 24
app/Http/Controllers/SentPrController.php

@@ -3,6 +3,7 @@
 namespace App\Http\Controllers;
 
 use App\Models\SentPr;
+use App\Models\Channel;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Http;
 
@@ -29,32 +30,115 @@ class SentPrController extends Controller
         //
         if(!isset($_COOKIE['user_uid'])){
             return $this->error('not login');
-        }
-        
-        $data = $request->all();
-        if($data['channel'] == '7fea264d-7a26-40f8-bef7-bc95102760fb' && $data['book']==65 && $data['para']>2056 && $data['para']<2192){
-            $url = "https://oapi.dingtalk.com/robot/send?access_token=34143dbec80a8fc09c1cb5897a5639ee3a9a32ecfe31835ad29bf7013bdb9fdf";
-            $param = [
-            "actionCard"=> [
-                "title"=> "说慧地品", 
-                "text"=> " wikipali: 来自{$_COOKIE['user_uid']}的修改建议:{$data['text']}", 
-                "btnOrientation"=> "0", 
-                "singleTitle" => "详情",
-                "singleURL"=>"https://staging.wikipali.org/app/article/index.php?view=para&book={$data['book']}&par={$data['para']}&channal={$data['channel']}&display=sent&mode=edit"
-            ], 
-            "msgtype"=>"actionCard"
-            ];
-
-            $response = Http::post($url, $param);
-            if($response->successful()){
-                return $this->ok($response->body);
-            }else{
-                return $this->error($response->body);
-            }            
         }else{
-            return $this->ok();
-        }
+			$user_uid = $_COOKIE['user_uid'];
+		}
+
+        $data = $request->all();
+
+		
+		#新建
+		$exists = SentPr::where('book_id',$data['book'])
+						->where('paragraph',$data['para'])
+						->where('word_start',$data['begin'])
+						->where('word_end',$data['end'])
+						->where('content',$data['text'])
+						->where('channel_uid',$data['channel'])
+						->exists();
+		if(!$exists){
+			#不存在,新建
+			$new = new SentPr();
+			$new->id = app('snowflake')->id();
+			$new->book_id = $data['book'];
+			$new->paragraph = $data['para'];
+			$new->word_start = $data['begin'];
+			$new->word_end = $data['end'];
+			$new->channel_uid = $data['channel'];
+			$new->editor_uid = $user_uid;
+			$new->content = $data['text'];
+			$new->language = Channel::where('uid',$data['channel'])->value('lang');
+			$new->status = 1;//未处理状态
+			$new->strlen = mb_strlen($data['text'],"UTF-8");
+			$new->create_time = time()*1000;
+			$new->modify_time = time()*1000;
+			$new->save();			
+		}
+
+		
+		$webHookMessageOk=false;
+		$webHookMessage=false;
+		if(app()->isLocal()==false){
+			/*
+			初译:e5bc5c97-a6fb-4ccb-b7df-be6dcfee9c43
+			模版:#用户名 就“##该句子巴利前20字符##”提出了这样的修改建议:“##PR内容前20字##”,欢迎大家[点击链接](句子/段落链接)前往查看并讨论。
+
+			问题集:8622ad73-deef-4525-8e8e-ba3f1462724e
+			模版:#用户名 就 “##该句子巴利前20字符##”有这样的疑问:“##PR内容前20字##”,欢迎大家[点击链接](句子/段落链接)参与讨论。
+
+			初步答疑:5ab653d7-1ae3-40b0-ae07-c3d530a2a8f8
+			模版:#用户名 就“##该句子巴利前20字符##”中的问题做了这样的回复:“##PR内容前20字##”,欢迎大家[点击链接](句子/段落链接)前往查看并讨论。
 
+			机器人地址:https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=25dbd74f-c89c-40e5-8cbc-48b1ef7710b8
+
+			项目范围:
+			book65 par:829-1306
+			book67 par:759-1152
+			*/
+			$username = '';
+			$palitext = '';
+			$prtext = '';
+			$link = '';
+			if(($data['book']==65 && $data['para']>=829 && $data['para']<=1306) || ($data['book']== 67 && $data['para'] >= 759 && $data['para'] <= 1152)){
+				switch ($data['channel']) {
+					case 'e5bc5c97-a6fb-4ccb-b7df-be6dcfee9c43':
+						$strMessage = "wikipali: {$username} 就“{$palitext}”提出了这样的修改建议:“{$prtext}”,欢迎大家[点击链接]({$link})前往查看并讨论。";
+						break;
+					case '8622ad73-deef-4525-8e8e-ba3f1462724e':
+						$strMessage = "wikipali: {$username} 就“{$palitext}”有这样的疑问:“{$prtext}”,欢迎大家[点击链接]({$link})前往查看并讨论。";
+						break;
+					case 'e5bc5c97-a6fb-4ccb-b7df-be6dcfee9c43':
+						$strMessage = "wikipali: {$username} 就“{$palitext}”中的问题做了这样的回复:“{$prtext}”,欢迎大家[点击链接]({$link})前往查看并讨论。";
+						break;
+					default:
+						$strMessage = "";
+						break;
+				}		
+				$url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=25dbd74f-c89c-40e5-8cbc-48b1ef7710b8";
+				$param = [
+				"actionCard"=> [
+					"title"=> "修改建议", 
+					"text"=> " wikipali: 来自{$_COOKIE['user_uid']}的修改建议:{$data['text']}", 
+					"btnOrientation"=> "0", 
+					"singleTitle" => "详情",
+					"singleURL"=>"https://staging.wikipali.org/app/article/index.php?view=para&book={$data['book']}&par={$data['para']}&channal={$data['channel']}&display=sent&mode=edit"
+				], 
+				"msgtype"=>"actionCard"
+				];
+
+				$response = Http::post($url, $param);
+				$webHookMessage = $response->body;
+				if($response->successful()){
+					$robotMessageOk = true;
+				}else{
+					$robotMessageOk = false;
+				}            
+
+			}
+
+		}
+		#同时返回此句子pr数量
+		$info['book_id'] = $data['book'];
+		$info['paragraph'] = $data['para'];
+		$info['word_start'] = $data['begin'];
+		$info['word_end'] = $data['end'];
+		$info['channel_uid'] = $data['channel'];
+		$count = SentPr::where('book_id' , $data['book'])
+						->where('paragraph' , $data['para'])
+						->where('word_start' , $data['begin'])
+						->where('word_end' , $data['end'])
+						->where('channel_uid' , $data['channel'])
+						->count();
+		return $this->ok(["new"=>$info,"count"=>$count]);
         
     }
 
@@ -79,6 +163,22 @@ class SentPrController extends Controller
     public function update(Request $request, SentPr $sentPr)
     {
         //
+		if(!isset($_COOKIE['user_uid'])){
+            return $this->error('not login');
+        }else{
+			$user_uid = $_COOKIE['user_uid'];
+		}
+		
+		if($sentPr->editor_uid==$user_uid){
+			$sentPr->update([
+				"content"=>$request->get('text'),
+				"modify_time"=>time()*1000,
+			]);
+			return $this->ok($sentPr);
+		}else{
+			return $this->error('not power');
+		}
+
     }
 
     /**

+ 1 - 0
app/Models/Sentence.php

@@ -8,4 +8,5 @@ use Illuminate\Database\Eloquent\Model;
 class Sentence extends Model
 {
     use HasFactory;
+	protected $fillable = ['id','uid','book_id','paragraph','word_start','word_end','channel_uid','editor_uid','content','strlen','status','create_time','modify_time','language'];
 }

+ 201 - 26
public/app/term/note.js

@@ -14,6 +14,13 @@ var MAX_NOTE_NEST = 2;
 
 var gBuildinDictIsOpen = false;
 
+/*
+译文提交方式
+update 修改
+pr 修改建议
+*/
+var _edit_mode = "update"; 
+
 var note_renderer = new marked.Renderer();
 note_renderer.code = function(code, language) {
     if (language == "mermaid") return '<pre class="mermaid">' + code + "</pre>";
@@ -806,6 +813,23 @@ function note_json_html(in_json) {
 	output += "<span class='other_tran_num'></span>";
 	output += "</span>";
 
+    //分割线
+	output += "<span class='separate_line'></span>";
+
+	//巴利原文
+	output += "<span class='other_bar'  sent='"+sent_id+"' channel_type='original' >";
+	output +=
+		"<span class='other_tran_span original' title='原文" +
+		gLocal.gui.vannana +
+		"'>";
+	output += "<svg class='icon' style='fill: var(--box-bg-color1)'>";
+	output += "<use xlink:href='../../node_modules/bootstrap-icons/bootstrap-icons.svg#file-ppt'>";
+	output += "</svg>" ;
+	output += gLocal.gui.original_text +
+		"</span>";
+	output += "<span class='other_tran_num'></span>";
+	output += "</span>";
+
     //分割线
 	output += "<span class='separate_line'></span>";
 
@@ -873,7 +897,7 @@ function sent_tran_set_edit_mode(obj, isEditMode) {
 	}
 }
 
-function sent_tran_edit(obj) {
+function sent_tran_edit(obj,edit_mode) {
 	let jqObj = $(obj);
 	while (!jqObj.hasClass("sent_tran")) {
 		jqObj = jqObj.parent();
@@ -881,6 +905,7 @@ function sent_tran_edit(obj) {
 			return;
 		}
 	}
+	_edit_mode = edit_mode;
 	if (jqObj.hasClass("edit_mode")) {
 		jqObj.removeClass("edit_mode");
 	} else {
@@ -936,7 +961,7 @@ var term_filterd_data=[];
 var term_input_text ;
 var term_input="";
 
-function TermRenderSentTranTextarea(text,dbId,sentId,channelId,isPr){
+function TermRenderSentTranTextarea(text,dbId,sentId,channelId,isPr,channel_type){
 	let html="";
 	html += '<div class="text_input" >';
 	html += '<div class="menu"></div>';
@@ -946,6 +971,7 @@ function TermRenderSentTranTextarea(text,dbId,sentId,channelId,isPr){
 	html += " dbid='" + dbId + "' ";
 	html += "sid='" + sentId + "' ";
 	html += "channel='" + channelId + "' ";
+	html += "channel_type='" + channel_type + "' ";
 	if (typeof isPr != "undefined" && isPr == true) {
 		html += ' is_pr="true" "';
 	} else {
@@ -1009,6 +1035,18 @@ function render_one_sent_tran_a(iterator, diff = false) {
 			//note_init处理句子链接
             if(iterator.type=='nissaya' || iterator.channalinfo.type=='nissaya'){
                 tranText = renderNissayaPreview(iterator.text);
+			}else if(iterator.type=='original' || iterator.channalinfo.type=='original'){
+				//原文需要按照语言设定转码
+				tranText = iterator.text;
+				switch (getCookie('language')) {
+					case 'my':
+						//缅文
+						tranText = roman_to_my(iterator.text);
+						break;
+					default:
+						tranText = iterator.text;
+						break;
+				}
             }else{
                 tranText = iterator.text;
             }
@@ -1037,7 +1075,7 @@ function render_one_sent_tran_a(iterator, diff = false) {
 		if (typeof iterator.is_pr_editor != "undefined" && iterator.is_pr_editor == true) {
 			//提交人
 			//修改按钮
-			html += render_icon_button("ic_mode_edit", "sent_tran_edit(this)", gLocal.gui.modify);
+			html += render_icon_button("ic_mode_edit", "sent_tran_edit(this,'update')", gLocal.gui.modify);
 			//删除按钮
 			html += render_icon_button("ic_delete", "sent_pr_del(this)", gLocal.gui.delete);
 		} else {
@@ -1057,9 +1095,10 @@ function render_one_sent_tran_a(iterator, diff = false) {
 		//非pr列表里的句子
 		//编辑按钮
 		if (parseInt(iterator.mypower) < 20) {
-			html += render_icon_button("my_idea", "sent_tran_edit(this)", gLocal.gui.suggest);
+			html += render_icon_button("my_idea", "sent_tran_edit(this,'pr')", gLocal.gui.suggest);
 		} else {
-			html += render_icon_button("ic_mode_edit", "sent_tran_edit(this)", gLocal.gui.edit);
+			html += render_icon_button("ic_mode_edit", "sent_tran_edit(this,'update')", gLocal.gui.edit);
+			html += render_icon_button("my_idea", "sent_tran_edit(this,'pr')", gLocal.gui.suggest);
 		}
 
 		//推送按钮
@@ -1186,7 +1225,24 @@ function render_one_sent_tran_a(iterator, diff = false) {
 	html += '<div class="input">';
 
 	//输入框
-	html += TermRenderSentTranTextarea(iterator.text,iterator.id,sid,iterator.channal,iterator.is_pr);
+	let editText = iterator.text;
+	if(iterator.type=='original' || iterator.channalinfo.type=='original'){
+		//原文需要按照语言设定转码
+		editText = iterator.text;
+		switch (getCookie('language')) {
+			case 'my':
+				//缅文
+				editText = roman_to_my(iterator.text);
+				break;
+		}
+	}
+	let channel_type='';
+	if(iterator.type){
+		channel_type = iterator.type;
+	}else if(iterator.channalinfo.type){
+		channel_type = iterator.channalinfo.type;
+	}
+	html += TermRenderSentTranTextarea(editText,iterator.id,sid,iterator.channal,iterator.is_pr,channel_type);
 
 
 	html += "</div>";
@@ -1243,18 +1299,11 @@ function render_one_sent_tran_a(iterator, diff = false) {
 	}
 
 	html += '<ul class="tag_list">';
+	html += "<li class='pr' onclick=\"note_pr_show('" + iterator.channal + "','" + sid + "')\">";	
 	if (iterator.pr_all && parseInt(iterator.pr_all) > 0) {
-		html +=
-			"<li onclick=\"note_pr_show('" +
-			iterator.channal +
-			"','" +
-			sid +
-			"')\"><span class='icon'>✋</span><span class='num'>" +
-			iterator.pr_new +
-			"/" +
-			iterator.pr_all +
-			"</span></li>";
+		html += render_pr_number(iterator.pr_new,iterator.pr_all);
 	}
+	html += "</li>";
 	html += "</ul>";
 	html += "</div>"; //end of info
 
@@ -1452,6 +1501,11 @@ function myEndingTooltip(inStr){
     }
     return inStr;
 }
+//渲染pr按钮里面的数字
+function render_pr_number(pr_new,pr_all){
+ let html = "<span class='icon'>✋</span><span class='num'>" + pr_new + "/" + pr_all + "</span>";
+ return html;	
+}
 function tran_sent_textarea_event_init() {
 	let textarea = document.querySelectorAll(".tran_sent_textarea");
 	for (let iterator of textarea) {
@@ -1911,11 +1965,16 @@ function tran_sent_save(obj) {
 		let textarea = $(sentDiv).children('.sent_tran_inner').first().children('.body').first().children('.edit').find(".tran_sent_textarea").first();
 		//let textarea = $(sentDiv).children().find(".tran_sent_textarea").first();
 		let isPr = $(textarea).attr("is_pr");
-		if (isPr == "true") {
-			note_pr_save(textarea);
-		} else {
-			note_sent_save_a(textarea);
+		if(isPr=='true'){
+			note_pr_update(textarea);
+		}else{
+			if (_edit_mode == "pr" ) {
+				note_pr_create(textarea);
+			} else {
+				note_sent_save_a(textarea);
+			}
 		}
+
 		sent_tran_set_edit_mode(textarea, false);
 	} else {
 		console.error("sent div not found");
@@ -1923,8 +1982,11 @@ function tran_sent_save(obj) {
 }
 
 //保存pr句子 新
-function note_pr_save(obj) {
+function note_pr_create(obj) {
+	console.log("note_pr_create");
+
 	let id = $(obj).attr("dbid");
+	let channel_type = $(obj).attr("channel_type");
 	let sid = $(obj).attr("sid").split("-");
 	let book = sid[0];
 	let para = sid[1];
@@ -1933,8 +1995,19 @@ function note_pr_save(obj) {
 	let channel = $(obj).attr("channel");
 	let text = $(obj).val();
 	let sent_tran_div = find_sent_tran_div(obj);
+
+	if(channel_type=="original"){
+		//原文需要按照语言设定转码
+		switch (getCookie('language')) {
+			case 'my':
+				//缅文
+				text = my_to_roman(text);
+				break;
+		}
+	}
+
 	$.post(
-		"../usent/pr_post.php",
+		"/api/v2/sentpr",
 		{
 			id: id,
 			book: book,
@@ -1944,7 +2017,7 @@ function note_pr_save(obj) {
 			channel: channel,
 			text: text,
 		},
-		sent_save_callback
+		pr_create_callback
 	);
 
 
@@ -1953,9 +2026,55 @@ function note_pr_save(obj) {
 	}
 }
 
+//修改pr句子
+function note_pr_update(obj) {
+	console.log("note_pr_update ");
+
+	let id = $(obj).attr("dbid");
+	let channel_type = $(obj).attr("channel_type");
+	let sid = $(obj).attr("sid").split("-");
+	let book = sid[0];
+	let para = sid[1];
+	let begin = sid[2];
+	let end = sid[3];
+	let channel = $(obj).attr("channel");
+	let text = $(obj).val();
+	let sent_tran_div = find_sent_tran_div(obj);
+
+	if(channel_type=="original"){
+		//原文需要按照语言设定转码
+		switch (getCookie('language')) {
+			case 'my':
+				//缅文
+				text = my_to_roman(text);
+				break;
+		}
+	}
+    fetch('/api/v2/sentpr/'+id,{
+        method: 'PUT',
+        credentials: 'same-origin',
+        headers: {
+            'Content-Type': 'application/json'
+        },
+        body: JSON.stringify({
+			id: id,
+			text: text,
+		})
+    })
+  .then(response => response.json())
+  .then(data => console.log(data));
+
+	if (sent_tran_div) {
+		$(sent_tran_div).addClass("loading");
+	}
+}
+
 //保存译文句子 新
 function note_sent_save_a(obj) {
+	console.log("note_sent_save_a");
+
 	let id = $(obj).attr("dbid");
+	let channel_type = $(obj).attr("channel_type");
 	let sid = $(obj).attr("sid").split("-");
 	let book = sid[0];
 	let para = sid[1];
@@ -1965,6 +2084,16 @@ function note_sent_save_a(obj) {
 	let text = $(obj).val();
 	let sent_tran_div = find_sent_tran_div(obj);
 
+	if(channel_type=="original"){
+		//原文需要按照语言设定转码
+		switch (getCookie('language')) {
+			case 'my':
+				//缅文
+				text = my_to_roman(text);
+				break;
+		}
+	}
+
 	$.ajaxSetup({
 		timeout: 5000,
 	});
@@ -2078,9 +2207,11 @@ function sent_save_callback(data) {
 					}
                     switch (thisChannel.type) {
                         case 'nissaya':
-                            divPreview.html(
-                                "<div class='nissaya'>"+note_init(renderNissayaPreview(result.text), result.channal, result.editor, result.lang)+"</div>"
-                                );
+							let nissayaHtml = "";
+							nissayaHtml += "<div class='nissaya'>";
+							nissayaHtml += note_init(renderNissayaPreview(result.text), result.channal, result.editor, result.lang);
+							nissayaHtml += "</div>";
+                            divPreview.html(nissayaHtml);
                             break;
                         case 'commentary':
                             divPreview.html(
@@ -2088,6 +2219,13 @@ function sent_save_callback(data) {
                             );
                             note_refresh_new();
                         break;
+						case 'original':
+							switch (getCookie('language')) {
+								case 'my':
+									//缅文
+									result.text = roman_to_my(result.text);
+									break;
+							}
                         default:
                             divPreview.html(
                                 note_init(result.text, result.channal, result.editor, result.lang)
@@ -2108,6 +2246,43 @@ function sent_save_callback(data) {
 	}
 }
 
+function pr_create_callback(data) {
+	let response;
+	if(typeof data=="string"){
+		try {
+			response = JSON.parse(data);
+		} catch (e) {
+			alert(e.message);
+			console.error('pr_create_callback',data);
+			return;
+		}			
+		
+	}else{
+		response = data;
+	}
+
+	
+	if (!response.ok) {
+		ntf_show("修改建议提交失败");
+		console.log("pr_create_callback", response.message);
+		return;
+	}
+	let result = response.data.new;
+	{
+		let sid = result.book_id + "-" + result.paragraph + "-" + result.word_start + "-" + result.word_end;
+
+		let sent_tran_div = $(
+			".sent_tran[channel='" + result.channel_uid + "'][sid='" + sid + "']"
+		);
+		if (sent_tran_div) {
+			sent_tran_div.removeClass("loading");
+			sent_tran_div.find(".tag_list").first().children(".pr").first().html(render_pr_number(1,response.data.count));
+		}
+		
+		ntf_show("成功提交修改建议");
+	}
+}
+
 //保存译文句子
 function note_sent_save() {
 	let id = $("#edit_dialog_text").attr("sent_id");

+ 16 - 12
public/app/term/term.css

@@ -737,7 +737,7 @@ pw {
 }
 
 .sent_tran_inner:hover > .tool_bar > .right {
-	/*display: block;*/
+	display: block;
 }
 .list_with_head:hover > .tool_bar > .right {
 	display: block;
@@ -799,17 +799,7 @@ pw {
 .pop_menu {
 	display: flex;
 }
-.tag_list {
-	display: flex;
-	list-style-type: none;
-}
-.tag_list li {
-	border-radius: 6px;
-	margin-right: 5px;
-	background-color: var(--bookx);
-	padding: 2px 5px;
-	cursor: pointer;
-}
+
 li.active {
 	background-color: var(--booka);
 }
@@ -972,6 +962,20 @@ span.sent_tran {
 	list-style-type: unset;
 	margin-left: 1em;
 }
+
+.tag_list {
+	display: flex;
+	list-style-type: none;
+}
+.tag_list li {
+	border-radius: 6px;
+	margin-right: 5px;
+	background-color: var(--bookx);
+	padding: 2px 5px;
+	cursor: pointer;
+	list-style: none;
+}
+
 .icon_sent_status {
 	display: none;
 	width: 22px;