作者 刘锟

Merge remote-tracking branch 'origin/master' into akun

... ... @@ -11,6 +11,7 @@ use App\Models\Inquiry\InquiryFormData;
use App\Models\Nav\BNav;
use App\Models\Nav\BNavGroup;
use App\Models\Project\Project;
use App\Models\WebSetting\Translate as TranslateModel;
use App\Services\ProjectServer;
use Illuminate\Console\Command;
use Illuminate\Database\Eloquent\Model;
... ... @@ -54,6 +55,24 @@ class Test extends Command
*/
public function handle()
{
ProjectServer::useProject(3);
$data = [
'c' => 'c',
'b' => 'a',
'a' => 'b',
'e' => 'e',
];
$param = [
'type'=>1,
'project_id'=>3,
'url'=>'/',
'language_id'=>2,
'alias'=>'zh',
];
$param['data'] = json_encode($data,true);
TranslateModel::insert($param);
dd('end');
$this->model->add($param);
ProjectServer::useProject(1);
$group =BNavGroup::where(['id' => 1])->first();
$sort_list = json_decode($group->sort_list, true);
... ...
<?php
/**
* @remark :
* @name :TranslateRead.php
* @author :lyh
* @method :post
* @time :2024/1/17 16:47
*/
namespace App\Console\Commands;
use App\Models\Project\Project;
use App\Services\ProjectServer;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
class TranslateRead extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'translate_read';
/**
* The console command description.
*
* @var string
*/
protected $description = '生成视频模块';
/**
* @remark :统一更新路由
* @name :handle
* @author :lyh
* @method :post
* @time :2023/11/20 15:13
*/
public function handle(){
$projectModel = new Project();
$list = $projectModel->list(['type'=>['!=',0]]);
foreach ($list as $v){
echo date('Y-m-d H:i:s') . 'project_id:'.$v['id'] . PHP_EOL;
ProjectServer::useProject($v['id']);
DB::disconnect('custom_mysql');
}
echo date('Y-m-d H:i:s') . 'end' . PHP_EOL;
}
public function read(){
}
}
... ...
... ... @@ -12,8 +12,14 @@ namespace App\Http\Controllers\Bside\Setting;
use App\Enums\Common\Code;
use App\Http\Controllers\Bside\BaseController;
use App\Http\Logic\Bside\Setting\TranslateLogic;
use App\Models\Blog\Blog;
use App\Models\CustomModule\CustomModuleCategory;
use App\Models\CustomModule\CustomModuleContent;
use App\Models\News\News;
use App\Models\Product\Product;
use App\Models\Project\Project;
use App\Models\RouteMap\RouteMap;
use App\Models\WebSetting\SettingNum;
use App\Models\WebSetting\WebLanguage;
class TranslateController extends BaseController
... ... @@ -91,55 +97,210 @@ class TranslateController extends BaseController
* @time :2024/1/12 14:34
*/
public function getUrl(){
//查看项目是5.0还是6.0
if($this->user['is_upgrade'] == Project::IS_UPGRADE_TRUE){//升级项目
$data = $this->getFiveUrl($this->map);
}else {
$data = $this->getSixUrl($this->map);
}
$this->response('success',Code::SUCCESS,$data);
}
/**
* @remark :5.0路由
* @name :getFiveUrl
* @author :lyh
* @method :post
* @time :2024/1/17 16:27
*/
public function getFiveUrl($map){
$data = [];
$routeMapModel = new RouteMap();
$list = $routeMapModel->list();
$list = $routeMapModel->list($map);
foreach ($list as $k => $v){
//查看项目是5.0还是6.0
if($this->user['is_upgrade'] == Project::IS_UPGRADE_TRUE){//升级项目
if(!empty($v['path'])){
if($v['path'] == 'blog'){
$v['path'] = $v['path'].'s';
}
$route = $v['path'].'/'.$v['route'];
}else{
switch ($v['source']){
case RouteMap::SOURCE_PAGE:
if($v['route'] == 'index'){
$v['route'] = '';
$data[] = '/';
}else{
$data[] = $v['route'];
}
$route = $v['route'];
}
}else{
if(!empty($v['path'])){
if($v['path'] == 'blog'){
$v['path'] = $v['path'].'s';
}elseif ($v['path'] == RouteMap::PATH_NEWS_CATE){
$routeMapModel->edit(['path'=>''],['id'=>$v['id']]);
$v['path'] = '';
}elseif ($v['path'] == RouteMap::PATH_NEWS_CATE){
$routeMapModel->edit(['path'=>''],['id'=>$v['id']]);
$v['path'] = '';
break;
case RouteMap::SOURCE_PRODUCT_CATE:
//获取当前产品分类关联多少产品
$productModel = new Product();
$count = $productModel->formatQuery(['category_id'=>['like','%,'.$v['source_id'].',%']])->count();
$this->pageList($data,$count,$v,1,15);
break;
case RouteMap::SOURCE_BLOG:
$data[] = 'blogs/'.$v['route'];
break;
case RouteMap::SOURCE_NEWS:
$data[] = 'news/'.$v['route'];
break;
case RouteMap::SOURCE_BLOG_CATE:
$blogModel = new Blog();
$count = $blogModel->formatQuery(['category_id'=>['like','%,'.$v['source_id'].',%']])->count();
$this->pageList($data,$count,$v,2,10);
break;
case RouteMap::SOURCE_NEWS_CATE:
$newsModel = new News();
$count = $newsModel->formatQuery(['category_id'=>['like','%,'.$v['source_id'].',%']])->count();
$this->pageList($data,$count,$v,3,10);
break;
case RouteMap::SOURCE_MODULE:
$customModel = new CustomModuleContent();
$contentInfo = $customModel->read(['id'=>$v['source_id']]);
if(!empty($contentInfo) && !empty($contentInfo['category_id'])){
$categoryIdArr = $contentInfo['category_id'];
$cate_id = (int)array_shift($categoryIdArr);
$routeInfo = $routeMapModel->read(['source'=>RouteMap::SOURCE_MODULE_CATE,'source_id'=>$cate_id]);
$v['path'] = ($routeInfo['route'] ?? '');
if(!empty($v['path'])){
$v['path'] = $v['path'].'/';
}
}
$route = $v['path'].'/'.$v['route'];
}else{
$data[] = $v['path'].$v['route'];
break;
case RouteMap::SOURCE_MODULE_CATE:
$customModel = new CustomModuleContent();
$count = $customModel->formatQuery(['category_id'=>['like','%,'.$v['source_id'].',%']])->count();
$this->pageSixList($data,$count,$v,3,10);
break;
default:
$data[] = $v['route'];
break;
}
}
return $this->success($data);
}
/**
* @remark :获取6.0的url
* @name :getSixUrl
* @author :lyh
* @method :post
* @time :2024/1/17 15:04
*/
public function getSixUrl($map){
$data = [];
$routeMapModel = new RouteMap();
$list = $routeMapModel->list($map);
foreach ($list as $k => $v){
switch ($v['source']){
case RouteMap::SOURCE_PAGE:
if($v['route'] == 'index'){
$v['route'] = '';
$data[] = '/';//首页
}else{
$data[] = $v['route'];
}
break;
case RouteMap::SOURCE_PRODUCT_CATE:
//获取当前产品分类关联多少产品
$productModel = new Product();
$count = $productModel->formatQuery(['category_id'=>['like','%,'.$v['source_id'].',%']])->count();
$this->pageSixList($data,$count,$v,1,15);
break;
case RouteMap::SOURCE_BLOG:
$data[] = 'blogs/'.$v['route'];
break;
case RouteMap::SOURCE_NEWS:
$data[] = 'news/'.$v['route'];
break;
case RouteMap::SOURCE_BLOG_CATE:
$blogModel = new Blog();
$count = $blogModel->formatQuery(['category_id'=>['like','%,'.$v['source_id'].',%']])->count();
$this->pageSixList($data,$count,$v,2,10);
break;
case RouteMap::SOURCE_NEWS_CATE:
$newsModel = new News();
$count = $newsModel->formatQuery(['category_id'=>['like','%,'.$v['source_id'].',%']])->count();
$this->pageSixList($data,$count,$v,3,10);
break;
case RouteMap::SOURCE_MODULE:
$customModel = new CustomModuleContent();
$contentInfo = $customModel->read(['id'=>$v['source_id']]);
if(!empty($contentInfo) && !empty($contentInfo['category_id'])){
$categoryIdArr = $contentInfo['category_id'];
$cate_id = (int)array_shift($categoryIdArr);
$routeInfo = $routeMapModel->read(['source'=>RouteMap::SOURCE_MODULE_CATE,'source_id'=>$cate_id]);
$v['path'] = ($routeInfo['route'] ?? '');
if(!empty($v['path'])){
$v['path'] = $v['path'].'/';
}
}
$route = $v['route'];
}
$data[] = $v['path'].$v['route'];
break;
case RouteMap::SOURCE_MODULE_CATE:
$customModel = new CustomModuleContent();
$count = $customModel->formatQuery(['category_id'=>['like','%,'.$v['source_id'].',%']])->count();
$this->pageSixList($data,$count,$v,3,10);
break;
default:
$data[] = $v['route'];
break;
}
}
$data[] = $this->user['domain'].$route;
$this->response('success',Code::SUCCESS,$data);
return $this->success($data);
}
/**
* @remark :获取路由表中没有的路由
* @name :getFiveUrl
* @remark :
* @name :pageList
* @author :lyh
* @method :post
* @time :2024/1/17 9:32
* @time :2024/1/17 14:15
*/
public function getFiveUrl($v){
public function pageList(&$data,$count,$v,$type = 1,$pageNum = 15){
$page = 1;
if($count != 0){
//获取默认条数
$settingNumModel = new SettingNum();
$numInfo = $settingNumModel->read(['type'=>$type],['num']);
if(!empty($numInfo)){
$pageNum = $numInfo['num'];
}else{
$pageNum = $pageNum;
}
$page = ceil($count / $pageNum);//向上取整
}
for ($i = 1;$i <= $page;$i++){
if($i == 1){
$data[] = $v['route'];
}else{
$data[] = $v['route'].'/page/'.$i;
}
}
return true;
}
/**
* @remark :
* @name :pageList
* @author :lyh
* @method :post
* @time :2024/1/17 14:15
*/
public function pageSixList(&$data,$count,$v,$type = 1,$pageNum = 15){
$page = 1;
if($count != 0){
//获取默认条数
$settingNumModel = new SettingNum();
$numInfo = $settingNumModel->read(['type'=>$type],['num']);
if(!empty($numInfo)){
$pageNum = $numInfo['num'];
}else{
$pageNum = $pageNum;
}
$page = ceil($count / $pageNum);//向上取整
}
for ($i = 1;$i <= $page;$i++){
if($i == 1){
$data[] = $v['route'];
}else{
$data[] = $v['route'].'/'.$i;
}
}
return true;
}
}
... ...
... ... @@ -116,7 +116,7 @@ class CustomModuleLogic extends BaseLogic
public function checkIsName($name,$id = 0){
$param['name'] = $name;
if(!empty($id)){
$param['id'] = ['id'=>['!=',$id]];
$param['id'] = ['!=',$id];
}
$info = (new CustomModule())->read($param);
if($info !== false){
... ...
... ... @@ -9,13 +9,10 @@
namespace App\Http\Logic\Bside\Setting;
use App\Enums\Common\Code;
use App\Http\Logic\Bside\BaseLogic;
use App\Models\WebSetting\Proofreading;
use App\Models\WebSetting\Translate as TranslateModel;
use App\Models\WebSetting\WebLanguage;
use App\Helper\Translate;
use Illuminate\Support\Facades\DB;
class TranslateLogic extends BaseLogic
{
... ... @@ -34,12 +31,23 @@ class TranslateLogic extends BaseLogic
* @time :2024/1/12 9:43
*/
public function getTranslateList(){
$data = [];
if($this->param['url'] == 'All'){
$info = $this->model->read(['url'=>$this->param['url'],'language_id'=>$this->param['language_id'],'type'=>$this->param['type']]);
if(!empty($info) && !empty($info['data'])){
$translateInfo = json_decode($info['data'],JSON_UNESCAPED_UNICODE);
foreach ($translateInfo as $k => $v){
$data[] = [$k=>$v];
}
}
return $this->success($data);
}
$url = $this->user['domain'].(($this->param['url'] != '/') ? $this->param['url'] : '');
$languageInfo = $this->getLanguage($this->param['language_id']);
$info = $this->model->read(['url'=>str_replace_url($this->param['url']),'language_id'=>$this->param['language_id'],'type'=>$this->param['type']]);
$info = $this->model->read(['url'=>$this->param['url'],'language_id'=>$this->param['language_id'],'type'=>$this->param['type']]);
//获取当前URl的所有文本内容
$new_key = $this->getUrlRead($this->param['url']);
$new_key = $this->getUrlRead($url);
if($info === false){
$data = [];
$translate_list = Translate::tran($new_key, $languageInfo['short']);
foreach ($new_key as $k=>$v){
$data[] = [
... ... @@ -49,20 +57,27 @@ class TranslateLogic extends BaseLogic
return $this->success($data);
}
$old_key = [];//key值组成数据
$data = json_decode($info['data'],true);
foreach ($data as $k => $v){
$data_read = json_decode($info['data'],JSON_UNESCAPED_UNICODE);
foreach ($data_read as $k => $v){
$old_key[] = $k;
$data[] = [$k => $v];
}
$arr2 = array_values(array_diff($new_key, $old_key));
if(!empty($arr2)){
$translate_list = Translate::tran($arr2, $languageInfo['short']);
foreach ($arr2 as $k1=>$v1){
if(count($arr2) == 1){
$data[] = [
trim($v1)=>$translate_list[$k1]
$arr2[0]=>$translate_list
];
}else{
foreach ($arr2 as $k => $v){
$data[] = [
trim($v)=>$translate_list[$k]
];
}
}
}
$this->success($data);
return $this->success($data);
}
/**
... ... @@ -73,10 +88,22 @@ class TranslateLogic extends BaseLogic
* @time :2023/11/23 17:29
*/
public function getTranslateImageList(){
if($this->param['url'] == 'All'){
$info = $this->model->read(['url'=>$this->param['url'],'language_id'=>$this->param['language_id'],'type'=>$this->param['type']]);
$data = [];
if(!empty($info) && !empty($info['data'])){
$translateInfo = json_decode($info['data'],JSON_UNESCAPED_UNICODE);
foreach ($translateInfo as $k => $v){
$data[] = [$k=>$v];
}
}
return $this->success($data);
}
$url = $this->user['domain'].(($this->param['url'] != '/') ? $this->param['url'] : '');
$info = $this->model->read(['url'=>str_replace_url($this->param['url']),'language_id'=>$this->param['language_id'],'type'=>$this->param['type']]);
$data = [];
if($info === false){
$new_list = $this->getUrlImageRead($this->param['url']);
$new_list = $this->getUrlImageRead($url);
foreach ($new_list as $v){
$data[] = [
$v=>$v,
... ... @@ -84,11 +111,11 @@ class TranslateLogic extends BaseLogic
}
return $this->success($data);
}
$new_list = $this->getUrlImageRead($this->param['url']);
$new_list = $this->getUrlImageRead($url);
$old_list = [];
$data = json_decode($info['data'],true);
foreach ($data as $k=>$v){
$old_list[] = $v;
$data_read = json_decode($info['data'],JSON_UNESCAPED_UNICODE);
foreach ($data_read as $k=>$v){
$old_list[] = $k;
$data[] = [
$k=>$v,
];
... ... @@ -136,6 +163,9 @@ class TranslateLogic extends BaseLogic
];
$context = stream_context_create($contextOptions);
$sourceCode = file_get_contents($url, false, $context);
if(!$sourceCode){
$this->fail('当前url不存在');
}
// 过滤掉具有 "change-language-cont" 类的元素
$pattern = '/<div\b[^>]*\sclass=[\'"]([^\'"]*change-language-cont[^\'"]*)[\'"][^>]*>(.*?)<\/div>/is';
$sourceCode = preg_replace($pattern, '', $sourceCode);
... ... @@ -151,19 +181,25 @@ class TranslateLogic extends BaseLogic
$textContentArray = array_filter($matches[1], function($item) {
return !empty(trim($item));
});
// 过滤掉包含逗号加换行的内容
$textContentArray = array_filter($textContentArray, function($item) {
return strpos($item, ',') === false && strpos($item, PHP_EOL) === false;
});
$contentData = [];
foreach ($textContentArray as $v){
$content = trim($v);
$trimmedString = preg_replace('/\s+/', ' ', $content);
$contentData[] = $trimmedString;
}
$contentData = array_values($contentData);
$pattern = '/<meta\s+[^>]*name=[\'"](keywords|description)[\'"][^>]*content=[\'"]([^\'"]+)[\'"]/i'; // 匹配 name 为 "keywords" 或 "description" 的 meta 标签的正则表达式
$contentData = array_values($textContentArray);
$pattern = '/<meta\s+[^>]*name=[\'"](keywords|description)[\'"][^>]*content=[\'"]([^\'"]+)[\'"]>/i'; // 匹配 name 为 "keywords" 或 "description" 的 meta 标签的正则表达式
$matches = array();
preg_match_all($pattern, $strippedContent, $matches);
$metaData = array();
foreach ($matches[2] as $index => $content) {
$metaData[] = $content;
if(!empty(trim($content))){
$metaData[] = $content;
}
}
$data = array_merge($metaData, $contentData);
return $data;
... ... @@ -212,16 +248,16 @@ class TranslateLogic extends BaseLogic
$info = $this->model->read(['language_id'=>$this->param['language_id'],'url'=>$this->param['url'],'type'=>$this->param['type']]);
if($info === false){
$param = [
'type'=>1,
'type'=>$this->param['type'],
'project_id'=>$this->user['project_id'],
'url'=>str_replace_url($this->param['url']),
'language_id'=>$this->param['language_id'],
'alias'=>$this->param['alias'],
];
$param['data'] = json_encode($this->param['data'],true);
$param['data'] = json_encode($this->param['data'],JSON_UNESCAPED_UNICODE);
$this->model->add($param);
}else{
$data = json_encode($this->param['data'],true);
$data = json_encode($this->param['data'],JSON_UNESCAPED_UNICODE);
$this->model->edit(['data'=>$data],['language_id'=>$this->param['language_id'],'url'=>$this->param['url'],'type'=>$this->param['type']]);
}
// }catch (\Exception $e){
... ...