作者 李美松

Merge branch 'develop' into lms

# Conflicts:
#	composer.json
@@ -3,8 +3,12 @@ @@ -3,8 +3,12 @@
3 namespace App\Http\Controllers\Bside\Setting; 3 namespace App\Http\Controllers\Bside\Setting;
4 4
5 use App\Enums\Common\Code; 5 use App\Enums\Common\Code;
  6 +use App\Helper\Translate;
6 use App\Http\Controllers\Bside\BaseController; 7 use App\Http\Controllers\Bside\BaseController;
7 use App\Http\Logic\Bside\Setting\ProofreadingLogic; 8 use App\Http\Logic\Bside\Setting\ProofreadingLogic;
  9 +use App\Models\WebSetting\Proofreading;
  10 +use App\Models\WebSetting\WebSettingCountry;
  11 +use Illuminate\Support\Facades\DB;
8 12
9 class ProofreadingController extends BaseController 13 class ProofreadingController extends BaseController
10 { 14 {
@@ -16,18 +20,88 @@ class ProofreadingController extends BaseController @@ -16,18 +20,88 @@ class ProofreadingController extends BaseController
16 * @method :post 20 * @method :post
17 * @time :2023/6/12 10:52 21 * @time :2023/6/12 10:52
18 */ 22 */
19 - public function lists(ProofreadingLogic $proofreadingLogic){  
20 - //默认显示语言为英语  
21 - if(!isset($this->map['language_id']) || empty($this->map['language_id'])){  
22 - $this->map['language_id'] = $this::LANGUAGE_ID; 23 + public function lists(){
  24 + //获取语种信息
  25 + $webSettingCountryModel = new WebSettingCountry();
  26 + $countryInfo = $webSettingCountryModel->read(['id'=>$this->param['language_id']]);
  27 + //获取当前链接和语种的校队列表
  28 + $proofreadingModel = new Proofreading();
  29 + $list = $proofreadingModel->list(['url'=>$this->param['url'],'language_id'=>$this->param['language_id'],'type'=>1],'created_at',['text','translate']);
  30 + //获取当前URl的所有文本内容
  31 + $new_list = $this->getUrlRead($this->param['url']);
  32 + if(empty($list)){
  33 + $data = [];
  34 + $translate_list = Translate::tran($new_list, $countryInfo['alias']);
  35 + foreach ($new_list as $k=>$v){
  36 + $data[] = [
  37 + 'text'=>trim($v),
  38 + 'translate'=>$translate_list[$k],
  39 + ];
  40 + }
  41 + return $this->response('success',Code::SUCCESS,$data);
  42 + }
  43 + $data = [];//返回数据
  44 + $old_list = [];
  45 + foreach ($list as $v){
  46 + $old_list[] = $v['text'];
  47 + $data[] = [
  48 + 'text'=>$v['text'],
  49 + 'translate'=>$v['translate'],
  50 + ];
23 } 51 }
24 - $lists = $proofreadingLogic->proofreadingList($this->map,$this->page,$this->row);  
25 - if(!empty($lists['list']) && ($this->param['type'] == $this::TYPE_IMAGE)){  
26 - foreach ($lists['list'] as $k => $v){  
27 - $lists['list'][$k]['image_link'] = getImageUrl($v['translate']); 52 + $arr2 = array_values(array_diff($new_list, $old_list));
  53 + if(!empty($arr2)){
  54 + $translate_list = Translate::tran($arr2, $countryInfo['alias']);
  55 + foreach ($arr2 as $k1=>$v1){
  56 + $data[] = [
  57 + 'text'=>$v1,
  58 + 'translate'=>$translate_list[$k1]
  59 + ];
28 } 60 }
29 } 61 }
30 - $this->response('success',Code::SUCCESS,$lists); 62 + $this->response('success',Code::SUCCESS,$data);
  63 + }
  64 +
  65 + /**
  66 + * @remark :获取图片列表
  67 + * @name :imageList
  68 + * @author :lyh
  69 + * @method :post
  70 + * @time :2023/11/23 17:29
  71 + */
  72 + public function imageList(){
  73 + $proofreadingModel = new Proofreading();
  74 + $list = $proofreadingModel->list(['url'=>$this->param['url'],'language_id'=>$this->param['language_id'],'type'=>2],'created_at',['text','translate']);
  75 + if(empty($list)){
  76 + $new_list = $this->getUrlImageRead($this->param['url']);
  77 + foreach ($new_list as $k=>$v){
  78 + $data[] = [
  79 + 'text'=>$v,
  80 + 'translate'=>$v,
  81 + ];
  82 + }
  83 + return $this->response('success',Code::SUCCESS,$data);
  84 + }
  85 + $new_list = $this->getUrlImageRead($this->param['url']);
  86 + $data = [];//返回数据
  87 + $old_list = [];
  88 + foreach ($list as $v){
  89 + $old_list[] = $v['text'];
  90 + $data[] = [
  91 + 'text'=>$v['text'],
  92 + 'translate'=>$v['translate'],
  93 + ];
  94 + }
  95 + $arr2 = array_values(array_diff($new_list, $old_list));
  96 + if(!empty($arr2)){
  97 + foreach ($arr2 as $v1){
  98 + $data[] = [
  99 + 'text'=>$v1,
  100 + 'translate'=>$v1
  101 + ];
  102 + }
  103 + }
  104 + $this->response('success',Code::SUCCESS,$data);
31 } 105 }
32 106
33 /** 107 /**
@@ -36,8 +110,71 @@ class ProofreadingController extends BaseController @@ -36,8 +110,71 @@ class ProofreadingController extends BaseController
36 * @method :post 110 * @method :post
37 * @time :2023/6/12 10:52 111 * @time :2023/6/12 10:52
38 */ 112 */
39 - public function save(ProofreadingLogic $proofreadingLogic){  
40 - $proofreadingLogic->proofreadingSave(); 113 + public function save(){
  114 + //清除以前的翻译校队数据,重新添加
  115 + $param = [
  116 + 'type'=>1,
  117 + 'project_id'=>$this->user['project_id'],
  118 + 'url'=>$this->param['url'],
  119 + 'language_id'=>$this->param['language_id'],
  120 + 'alias'=>$this->param['alias'],
  121 + 'created_at'=>date('Y-m-d H:i:s'),
  122 + 'updated_at'=>date('Y-m-d H:i:s')
  123 + ];
  124 + $proofreadingModel = new Proofreading();
  125 + DB::beginTransaction();
  126 + try {
  127 + $proofreadingModel->del(['language_id'=>$this->param['language_id'],'url'=>$this->param['url'],'type'=>1]);
  128 + //删除成功后,重新添加
  129 + $save_data = [];
  130 + foreach ($this->param['data'] as $k => $v){
  131 + $param['text'] = $v['text'];
  132 + $param['translate'] = $v['translate'];
  133 + $save_data[] = $param;
  134 + }
  135 + $proofreadingModel->insert($save_data);
  136 + DB::commit();
  137 + }catch (\Exception $e){
  138 + DB::rollBack();
  139 + $this->fail('系统错误请联系管理员');
  140 + }
  141 + $this->response('success');
  142 + }
  143 +
  144 + /**
  145 + * @name :(新增/更新多语言)save
  146 + * @author :lyh
  147 + * @method :post
  148 + * @time :2023/6/12 10:52
  149 + */
  150 + public function saveImage(){
  151 + //清除以前的翻译校队数据,重新添加
  152 + $param = [
  153 + 'type'=>2,
  154 + 'project_id'=>$this->user['project_id'],
  155 + 'url'=>$this->param['url'],
  156 + 'language_id'=>$this->param['language_id'],
  157 + 'alias'=>$this->param['alias'],
  158 + 'created_at'=>date('Y-m-d H:i:s'),
  159 + 'updated_at'=>date('Y-m-d H:i:s')
  160 + ];
  161 + $proofreadingModel = new Proofreading();
  162 +// DB::beginTransaction();
  163 +// try {
  164 + $proofreadingModel->del(['language_id'=>$this->param['language_id'],'url'=>$this->param['url'],'type'=>2]);
  165 + //删除成功后,重新添加
  166 + $save_data = [];
  167 + foreach ($this->param['data'] as $k => $v){
  168 + $param['text'] = $v['text'];
  169 + $param['translate'] = $v['translate'];
  170 + $save_data[] = $param;
  171 + }
  172 + $proofreadingModel->insert($save_data);
  173 +// DB::commit();
  174 +// }catch (\Exception $e){
  175 +// DB::rollBack();
  176 +// $this->fail('系统错误请联系管理员');
  177 +// }
41 $this->response('success'); 178 $this->response('success');
42 } 179 }
43 180
@@ -60,8 +197,68 @@ class ProofreadingController extends BaseController @@ -60,8 +197,68 @@ class ProofreadingController extends BaseController
60 * @time :2023/11/22 10:02 197 * @time :2023/11/22 10:02
61 */ 198 */
62 public function getUrlRead($url){ 199 public function getUrlRead($url){
63 - $sourceCode = file_get_contents($url);  
64 - $strippedContent = strip_tags($sourceCode); // 删除所有HTML标签  
65 - var_dump($strippedContent); 200 + $contextOptions = [
  201 + 'ssl' => [
  202 + 'verify_peer' => false,
  203 + 'verify_peer_name' => false,
  204 + ],
  205 + ];
  206 + $context = stream_context_create($contextOptions);
  207 + $sourceCode = file_get_contents($url, false, $context);
  208 + $pattern = '/<style\b[^>]*>(.*?)<\/style>/s'; // 定义匹配`<style>`标签及其内容的正则表达式
  209 + $strippedContent = preg_replace($pattern, '', $sourceCode); // 删除`<style>`标签及其内容
  210 + $pattern = '/<script\b[^>]*>(.*?)<\/script>/s'; // 定义匹配`<script>`标签及其内容的正则表达式
  211 + $strippedContent = preg_replace($pattern, '', $strippedContent); // 删除`<script>`标签及其内容
  212 + $pattern = '/<link\b[^>]*>/'; // 定义匹配 `<link>` 标签的正则表达式
  213 + $strippedContent = preg_replace($pattern, '', $strippedContent); // 删除 `<link>` 标签
  214 + $pattern = '/<footer\b[^>]*>(.*?)<\/footer>/s'; // 定义匹配`<script>`标签及其内容的正则表达式
  215 + $strippedContent = preg_replace($pattern, '', $strippedContent); // 删除`<script>`标签及其内容
  216 + $pattern = '/>([^<]+)</'; // 定义匹配中间内容不是标签的正则表达式
  217 + $matches = array();
  218 + preg_match_all($pattern, $strippedContent, $matches);
  219 + $textContentArray = array_filter($matches[1], function($item) {
  220 + return !empty(trim($item));
  221 + });
  222 + $data = [];
  223 + foreach ($textContentArray as $v){
  224 + $content = trim($v);
  225 + $trimmedString = preg_replace('/\s+/', ' ', $content);
  226 + $data[] = $trimmedString;
  227 + }
  228 + $data = array_values($data);
  229 + $uniqueArray = array_unique($data);
  230 + $data = array_values($uniqueArray);
  231 + return $data;
  232 + }
  233 +
  234 + /**
  235 + * @remark :获取Url内容
  236 + * @name :getUrlRead
  237 + * @author :lyh
  238 + * @method :post
  239 + * @time :2023/11/22 10:02
  240 + */
  241 + public function getUrlImageRead($url){
  242 + $contextOptions = [
  243 + 'ssl' => [
  244 + 'verify_peer' => false,
  245 + 'verify_peer_name' => false,
  246 + ],
  247 + ];
  248 + $pattern = '/<img.*?src="(.*?)".*?>/i';
  249 + $matches = array();
  250 + $context = stream_context_create($contextOptions);
  251 + $sourceCode = file_get_contents($url, false, $context);
  252 + preg_match_all($pattern, $sourceCode, $matches);
  253 + $textContentArray = $matches[1];
  254 + $data = [];
  255 + foreach ($textContentArray as $v){
  256 + if(!empty($v)){
  257 + $data[] = $v;
  258 + }
  259 + }
  260 + $uniqueArray = array_unique($data);
  261 + $data = array_values($uniqueArray);
  262 + return $data;
66 } 263 }
67 } 264 }
@@ -132,7 +132,7 @@ class FileController @@ -132,7 +132,7 @@ class FileController
132 } 132 }
133 } 133 }
134 $this->saveMysql($fileModel,$files->getSize(),$files->getClientOriginalExtension(),$fileName,$hash,$this->upload_location,$files->getMimeType(),$name); 134 $this->saveMysql($fileModel,$files->getSize(),$files->getClientOriginalExtension(),$fileName,$hash,$this->upload_location,$files->getMimeType(),$name);
135 - return $this->response('资源',Code::SUCCESS,$this->responseData($this->path.'/'.$fileName, $name)); 135 + $this->response('资源',Code::SUCCESS,$this->responseData($this->path.'/'.$fileName, $name));
136 } 136 }
137 137
138 /** 138 /**
@@ -380,12 +380,12 @@ class ImageController extends Controller @@ -380,12 +380,12 @@ class ImageController extends Controller
380 if(is_array($files)){ 380 if(is_array($files)){
381 foreach ($files as $file){ 381 foreach ($files as $file){
382 if ($file->getSize() > $max) { 382 if ($file->getSize() > $max) {
383 - return $this->response('图片最大为500K',Code::SYSTEM_ERROR); 383 + $this->response('图片最大为500K',Code::SYSTEM_ERROR);
384 } 384 }
385 } 385 }
386 }else{ 386 }else{
387 if ($files->getSize() > $max) { 387 if ($files->getSize() > $max) {
388 - return $this->response('图片最大为500K',Code::SYSTEM_ERROR); 388 + $this->response('图片最大为500K',Code::SYSTEM_ERROR);
389 } 389 }
390 } 390 }
391 if(!isset($this->param['upload_method'])){ 391 if(!isset($this->param['upload_method'])){
@@ -90,7 +90,7 @@ class VisualizationLogic extends BaseLogic @@ -90,7 +90,7 @@ class VisualizationLogic extends BaseLogic
90 $typeArray = [1,3,5,7];//单页数据 90 $typeArray = [1,3,5,7];//单页数据
91 if(in_array($type,$typeArray)){ 91 if(in_array($type,$typeArray)){
92 $bTemplateModel = new BTemplate(); 92 $bTemplateModel = new BTemplate();
93 - $templateInfo = $bTemplateModel->read(['source'=>$source,'source'=>$source_id,'template_id'=>0]); 93 + $templateInfo = $bTemplateModel->read(['source'=>$source,'source_id'=>$source_id,'template_id'=>0]);
94 if($templateInfo === false){ 94 if($templateInfo === false){
95 $data = [ 95 $data = [
96 'html'=>$this->param['html'], 96 'html'=>$this->param['html'],
@@ -218,6 +218,8 @@ class ProductLogic extends BaseLogic @@ -218,6 +218,8 @@ class ProductLogic extends BaseLogic
218 $param['icon'][$k1] = str_replace_url($v1); 218 $param['icon'][$k1] = str_replace_url($v1);
219 } 219 }
220 $param['icon'] = Arr::a2s($param['icon'] ?? []); 220 $param['icon'] = Arr::a2s($param['icon'] ?? []);
  221 + }else{
  222 + $param['icon'] = Arr::a2s([]);
221 } 223 }
222 $param['created_uid'] = $this->user['id']; 224 $param['created_uid'] = $this->user['id'];
223 return $param; 225 return $param;
@@ -19,18 +19,6 @@ class ProofreadingLogic extends BaseLogic @@ -19,18 +19,6 @@ class ProofreadingLogic extends BaseLogic
19 } 19 }
20 20
21 /** 21 /**
22 - * @name :(校队列表)proofreadingList  
23 - * @author :lyh  
24 - * @method :post  
25 - * @time :2023/6/12 11:06  
26 - */  
27 - public function proofreadingList($map,$p,$row,$order = 'created_at',$filed = ['*']){  
28 - $map['project_id'] = $this->user['project_id'];  
29 - $list = $this->model->lists($map,$p,$row,$order,$filed);  
30 - return $this->success($list);  
31 - }  
32 -  
33 - /**  
34 * @name :(保存翻译校队)proofreadingSave 22 * @name :(保存翻译校队)proofreadingSave
35 * @author :lyh 23 * @author :lyh
36 * @method :post 24 * @method :post
@@ -200,6 +200,7 @@ class UserLoginLogic @@ -200,6 +200,7 @@ class UserLoginLogic
200 $info['is_upload_manage'] = $project['is_upload_manage']; 200 $info['is_upload_manage'] = $project['is_upload_manage'];
201 $info['upload_config'] = $project['upload_config']; 201 $info['upload_config'] = $project['upload_config'];
202 $info['image_max'] = $project['image_max']; 202 $info['image_max'] = $project['image_max'];
  203 + $info['is_update_language'] = $project['is_update_language'];
203 $info['configuration'] = $project['deploy_build']['configuration']; 204 $info['configuration'] = $project['deploy_build']['configuration'];
204 $info['type'] = $project['type']; 205 $info['type'] = $project['type'];
205 if($info['is_customized'] == 1){ 206 if($info['is_customized'] == 1){
@@ -19,14 +19,14 @@ class BTemplate extends Base @@ -19,14 +19,14 @@ class BTemplate extends Base
19 const SOURCE_KEYWORD = 5;//聚合页 19 const SOURCE_KEYWORD = 5;//聚合页
20 const STATUS = 0; 20 const STATUS = 0;
21 21
22 - const TYPE_ONE = 0;  
23 - const TYPE_TWO = 0;  
24 - const TYPE_THREE = 0;  
25 - const TYPE_FOUR = 0;  
26 - const TYPE_FIVE = 0;  
27 - const TYPE_SIX = 0;  
28 - const TYPE_SEVEN = 0;  
29 - const TYPE_ = 0; 22 + const TYPE_ONE = 1;
  23 + const TYPE_TWO = 2;
  24 + const TYPE_THREE = 3;
  25 + const TYPE_FOUR = 4;
  26 + const TYPE_FIVE = 5;
  27 + const TYPE_SIX = 6;
  28 + const TYPE_SEVEN = 7;
  29 + const TYPE_EIGHT = 8;
30 30
31 protected $table = 'gl_web_template'; 31 protected $table = 'gl_web_template';
32 //连接数据库 32 //连接数据库
@@ -19,7 +19,6 @@ @@ -19,7 +19,6 @@
19 "mongodb/mongodb": "^1.6", 19 "mongodb/mongodb": "^1.6",
20 "mrgoon/aliyun-sms": "^2.0", 20 "mrgoon/aliyun-sms": "^2.0",
21 "phpoffice/phpspreadsheet": "^1.28", 21 "phpoffice/phpspreadsheet": "^1.28",
22 - "qcloud/cos-sdk-v5": "^2.6",  
23 "swooletw/laravel-swoole": "^2.13" 22 "swooletw/laravel-swoole": "^2.13"
24 }, 23 },
25 "require-dev": { 24 "require-dev": {
@@ -167,7 +167,9 @@ Route::middleware(['bloginauth'])->group(function () { @@ -167,7 +167,9 @@ Route::middleware(['bloginauth'])->group(function () {
167 //翻译校队 167 //翻译校队
168 Route::prefix('proofreading')->group(function () {//languageList 168 Route::prefix('proofreading')->group(function () {//languageList
169 Route::any('/', [\App\Http\Controllers\Bside\Setting\ProofreadingController::class, 'lists'])->name('web_proofreading_lists'); 169 Route::any('/', [\App\Http\Controllers\Bside\Setting\ProofreadingController::class, 'lists'])->name('web_proofreading_lists');
  170 + Route::any('/imageList', [\App\Http\Controllers\Bside\Setting\ProofreadingController::class, 'imageList'])->name('web_proofreading_imageList');
170 Route::any('/save', [\App\Http\Controllers\Bside\Setting\ProofreadingController::class, 'save'])->name('web_proofreading_save'); 171 Route::any('/save', [\App\Http\Controllers\Bside\Setting\ProofreadingController::class, 'save'])->name('web_proofreading_save');
  172 + Route::any('/saveImage', [\App\Http\Controllers\Bside\Setting\ProofreadingController::class, 'saveImage'])->name('web_proofreading_saveImage');
171 Route::any('/languageList', [\App\Http\Controllers\Bside\Setting\ProofreadingController::class, 'languageList'])->name('web_proofreading_languageList'); 173 Route::any('/languageList', [\App\Http\Controllers\Bside\Setting\ProofreadingController::class, 'languageList'])->name('web_proofreading_languageList');
172 }); 174 });
173 175