作者 赵彬吉
@@ -66,11 +66,41 @@ class Demo extends Command @@ -66,11 +66,41 @@ class Demo extends Command
66 protected $description = 'demo'; 66 protected $description = 'demo';
67 67
68 public function handle(){ 68 public function handle(){
69 - echo date('Y-m-d H:i:s') . 'project_id:' . PHP_EOL;  
70 - ProjectServer::useProject(3092);  
71 - $this->delProduct();  
72 - DB::disconnect('custom_mysql'); 69 +// echo date('Y-m-d H:i:s') . 'project_id:' . PHP_EOL;
  70 +// ProjectServer::useProject(3092);
  71 +// $this->delProduct();
  72 +// DB::disconnect('custom_mysql');
  73 +// echo date('Y-m-d H:i:s') . 'end' . PHP_EOL;
  74 + return $this->projectList();
  75 + }
  76 +
  77 + public function projectList(){
  78 + $data = '深圳澄通睿视科技有限公司, 日照源洋包装材料有限公司, 河北途铂机电设备有限责任公司, 宁波市海曙玖鼎纸制品有限公司, 青岛众瑞智能仪器有限公司, 河北新秋国际贸易有限公司, 江西乔森电气有限公司, 沧州艾斯克粉业制造有限公司, 上海希然化工科技有限公司, 石家庄中创进出口有限公司, 东光县恒创利纸箱机械有限公司2021, 天津正能管业有限公司, 河北帷幄纺织有限公司, 广东顺德宝绅源环保科技有限公司, 石家庄艾文尔生物科技有限公司, 浙江福俄电气有限公司, 深圳市嘉盛数据科技有限公司, 江西米德实业有限公司, 苏州稼瑞机械有限公司, 青岛卓亚塑料机械有限公司, 宁波中力螺栓制造有限公司, 中山市万格电器有限公司, 廊坊禹神节水灌溉技术有限公司, 山东索玛特制帽有限公司, 蓝启生物技术(深圳)有限公司, 南宁奥展五金紧固件有限公司, 河北茉悠科技有限公司, 莱科阀门(天津)有限公司, 四川零点自动化系统有限公司, 厦门市戴尔乐新能源汽车有限公司, 宁波爱克利浦电器有限公司, 扬州天定成玩具礼品有限公司, 宁波市金典照明电器有限公司, 杭州法埃姆斯钢构有限公司, 北京迪文科技有限公司, 无锡动为储能科技有限公司, 河北唐蕴生物科技有限公司, 绍兴苏尔黛纺织品有限公司, 河北祈强金属制品有限公司, 上池诊断科技(深圳)有限公司, 泉州市三颖超硬工具有限公司, 宁波杰广电子有限公司, 石家庄德烨管业有限公司, 山东凯特钻具有限公司, 北京思普瑞特科技发展有限公司, 广州市印科标识科技有限公司, 优之科技(深圳)有限公司, 南通赫美特国际贸易有限公司, 天津誉瑞特品科技有限公司, 河北坤焰建材科技有限公司, 绍兴睿博机械有限公司, 西安法斯拓进出口有限公司, 深圳市德诺威电子有限公司, 百润(中国)有限公司, 达时科科技有限责任公司, 陈海英, 四川蓉腾自动化设备有限公司, 石家庄晋吉建材科技有限公司, 石家庄安瑞科气体机械有限公司, 深圳市扬帆纸制品有限公司, 舟山威尔曼机械科技有限公司, 佰纳通科技(北京)有限公司, 宁波嘉佑行科技有限公司, 东莞市凯信脚轮有限公司, 宝鸡轩泰颜料科技有限公司, 东莞市华腾五金制品有限公司, 深圳市思锐宇光电有限公司, 东莞市奥彩数码科技有限公司, 上海垂普国际贸易有限公司, 扬州爱拓户外用品有限公司, 余姚市立鑫电子有限公司, 晋州市金昌盛化工有限公司, 广东阿酷达箱包科技有限公司, 泉州市杰斯特仪器设备有限公司, 三和长兴科技有限公司, 佛山市精一家具有限公司谷腾分公司, 天津市洁雅妇女卫生保健制品有限公司, 江西海瑞天然植物有限公司, 九江贝海玻纤有限公司(客户做新站), 瑞安市齐笙科技有限公司, 石家庄华圣方洲国际贸易有限公司, 深圳市方成教学设备有限公司, 连云港索娜斯贸易有限公司, 睿華電子有限公司, 扬州市极盛照明有限公司, 天津市实丰国际贸易有限责任公司, 厦门亚迅工贸有限公司, 威海旺展旅游用品有限公司, 宁波首安纸业有限公司, 浙江乐马电气有限公司, 广东金莱特智能科技有限公司, 河北科星药业有限公司, 宁波迈可森汽配有限公司, 邯郸市常岚紧固件制造有限公司, 宁波市晶艳贸易有限公司, 苏州荃华生物材料有限公司, 青岛洛城通信息科技有限公司, 合肥领派克机械设备有限公司, 广西绿城工贸有限公司, 一元电气科技有限公司【主站】, 立圣丰(厦门)纺织科技有限公司, 深圳市汉瑞通科技有限公司, 扬州市润芳塑胶包装材料有限公司, 扬州浩邦新能源科技有限公司项目2, 深圳市锦昊安科技有限公司, 四川途乐乐科技有限公司, 天津广大纸业股份有限公司, 西安禾为生物科技有限公司, 西安奥谷生物科技有限公司, 佛山市三水歌谷电器有限公司, 西安麦克斯农用化学有限公司, 瑞安市富锐思进出口有限公司(黑格客户), 北京新科以仁科技发展有限公司, 镇江市惠灵顿膜业有限公司';
  79 + $arr = explode(',',$data);
  80 + $projectModel = new Project();
  81 + $opModel = new DeployOptimize();
  82 + foreach ($arr as $k => $v){
  83 + $v = trim($v);
  84 + $info = $projectModel->read(['title'=>['like','%'.$v.'%']],['id']);
  85 + if($info === false){
  86 + echo date('Y-m-d H:i:s') . '未查询到的项目--'.$v . PHP_EOL;
  87 + }else{
  88 + $opInfo = $opModel->read(['project_id'=>$info['id']]);
  89 + if (strpos($opInfo['special'], '15') !== false) {
  90 + echo date('Y-m-d H:i:s') . '已包含' . PHP_EOL;
  91 + } else {
  92 + if(!empty($opInfo['special'])){
  93 + $special = ','.trim($opInfo['special'],',').',15,';
  94 + }else{
  95 + $special = ',15,';
  96 + }
  97 + $opModel->edit(['special'=>$special],['id'=>$opInfo['id']]);
  98 + echo date('Y-m-d H:i:s') . '未包含AI案例的project_id:'.$opInfo['project_id'] . PHP_EOL;
  99 + }
  100 + }
  101 + }
73 echo date('Y-m-d H:i:s') . 'end' . PHP_EOL; 102 echo date('Y-m-d H:i:s') . 'end' . PHP_EOL;
  103 + return true;
74 } 104 }
75 105
76 /** 106 /**
@@ -295,18 +295,18 @@ class UpdateRoute extends Command @@ -295,18 +295,18 @@ class UpdateRoute extends Command
295 if(!empty($lists)){ 295 if(!empty($lists)){
296 foreach ($lists as $v){ 296 foreach ($lists as $v){
297 if(!empty($v['route'])){ 297 if(!empty($v['route'])){
298 -// $tag = "-product";  
299 -// if (!(substr($v['route'], -strlen($tag)) === $tag)) {  
300 -// echo date('Y-m-d H:i:s') . '拼接'.$tag . PHP_EOL;  
301 -// $route = $v['route'].$tag;  
302 -// // 如果不是以 '-product' 结尾,则拼接上 '-product'  
303 -// $route = RouteMap::setRoute($route, RouteMap::SOURCE_PRODUCT, $v['id'], $v['project_id']);  
304 -// $productModel->edit(['route'=>$route],['id'=>$v['id']]); 298 + $tag = "-product";
  299 + if (!(substr($v['route'], -strlen($tag)) === $tag)) {
  300 + echo date('Y-m-d H:i:s') . '拼接'.$tag . PHP_EOL;
  301 + $route = $v['route'].$tag;
  302 + // 如果不是以 '-product' 结尾,则拼接上 '-product'
  303 + $route = RouteMap::setRoute($route, RouteMap::SOURCE_PRODUCT, $v['id'], $v['project_id']);
  304 + $productModel->edit(['route'=>$route],['id'=>$v['id']]);
305 // }else{ 305 // }else{
306 // echo date('Y-m-d H:i:s') . 'id :'.$v['id'] . PHP_EOL; 306 // echo date('Y-m-d H:i:s') . 'id :'.$v['id'] . PHP_EOL;
307 // $route = RouteMap::setRoute($v['title'], RouteMap::SOURCE_PRODUCT, $v['id'], $v['project_id']); 307 // $route = RouteMap::setRoute($v['title'], RouteMap::SOURCE_PRODUCT, $v['id'], $v['project_id']);
308 // $productModel->edit(['route'=>$route],['id'=>$v['id']]); 308 // $productModel->edit(['route'=>$route],['id'=>$v['id']]);
309 -// } 309 + }
310 // $route = RouteMap::setRoute($v['route'], RouteMap::SOURCE_PRODUCT, $v['id'], $v['project_id']); 310 // $route = RouteMap::setRoute($v['route'], RouteMap::SOURCE_PRODUCT, $v['id'], $v['project_id']);
311 // $productModel->edit(['route'=>$route],['id'=>$v['id']]); 311 // $productModel->edit(['route'=>$route],['id'=>$v['id']]);
312 // continue; 312 // continue;
@@ -66,60 +66,83 @@ class FileManageController extends BaseController @@ -66,60 +66,83 @@ class FileManageController extends BaseController
66 { 66 {
67 // 检查参数 67 // 检查参数
68 if (!isset($this->param['path']) || empty($this->param['path'])) { 68 if (!isset($this->param['path']) || empty($this->param['path'])) {
69 - $this->response('参数错误', Code::SYSTEM_ERROR); 69 + $this->response('参数错误:path 参数缺失或为空', Code::SYSTEM_ERROR);
70 } 70 }
71 - // 获取文件名 71 + // 获取文件名和完整 URL
72 $username = basename($this->param['path']); 72 $username = basename($this->param['path']);
73 $parsed_url = parse_url($this->param['path']); 73 $parsed_url = parse_url($this->param['path']);
74 - // 构造文件 URL  
75 $fileUrl = isset($parsed_url['scheme']) 74 $fileUrl = isset($parsed_url['scheme'])
76 ? $this->param['path'] 75 ? $this->param['path']
77 : 'https://file.globalso.com' . $this->param['path']; 76 : 'https://file.globalso.com' . $this->param['path'];
78 - // 初始化 cURL 77 + // 使用 cURL 获取文件头信息
79 $ch = curl_init(); 78 $ch = curl_init();
80 curl_setopt($ch, CURLOPT_URL, $fileUrl); 79 curl_setopt($ch, CURLOPT_URL, $fileUrl);
81 - curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);  
82 - curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);  
83 - curl_setopt($ch, CURLOPT_HEADER, false);  
84 - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 80 + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 不直接输出,而是返回结果
  81 + curl_setopt($ch, CURLOPT_HEADER, true); // 获取响应头
  82 + curl_setopt($ch, CURLOPT_NOBODY, true); // 只请求头部,不下载实际文件
  83 + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 跟随重定向
  84 + curl_setopt($ch, CURLOPT_TIMEOUT, 30); // 设置超时时间
  85 + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 禁用 SSL 验证
85 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 86 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
86 - curl_setopt($ch, CURLOPT_BUFFERSIZE, 8192); // 设置缓冲区大小  
87 - curl_setopt($ch, CURLOPT_TIMEOUT, 60); // 设置超时时间  
88 - curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); // 连接超时时间 87 + $response = curl_exec($ch);
  88 + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  89 + $fileSize = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
  90 + curl_close($ch);
  91 + // 检查文件大小和状态码
  92 + if ($httpCode != 200 || $fileSize <= 0) {
  93 + $this->response('无法获取文件信息或文件不存在', Code::SYSTEM_ERROR);
  94 + }
89 95
90 - // 设置为分块输出  
91 - curl_setopt($ch, CURLOPT_WRITEFUNCTION, function ($ch, $data) {  
92 - echo $data;  
93 - flush(); // 强制刷新缓冲区  
94 - return strlen($data);  
95 - });  
96 - // 检查文件头信息  
97 - $headers = get_headers($fileUrl, 1);  
98 - if ($headers === false || !isset($headers['Content-Length'])) {  
99 - $this->response('无法获取文件信息', Code::SYSTEM_ERROR); 96 + // 获取文件类型
  97 + $contentType = 'application/octet-stream'; // 默认类型为二进制流
  98 + if (preg_match('/Content-Type: (.+)/i', $response, $matches)) {
  99 + $contentType = $matches[1];
100 } 100 }
101 // 设置响应头 101 // 设置响应头
102 header('Content-Description: File Transfer'); 102 header('Content-Description: File Transfer');
103 - header('Content-Type: ' . ($headers['Content-Type'] ?? 'application/octet-stream')); 103 + header('Content-Type: ' . $contentType);
104 header('Content-Disposition: attachment; filename="' . $username . '"'); 104 header('Content-Disposition: attachment; filename="' . $username . '"');
105 - header('Content-Length: ' . $headers['Content-Length']); 105 + header('Content-Length: ' . $fileSize);
106 header('Cache-Control: must-revalidate'); 106 header('Cache-Control: must-revalidate');
107 header('Pragma: public'); 107 header('Pragma: public');
  108 + header('Expires: 0');
  109 + // 清空输出缓冲区
  110 + while (ob_get_level() > 0) {
  111 + ob_end_clean();
  112 + }
  113 + // 初始化 cURL 下载文件
  114 + $ch = curl_init();
  115 + curl_setopt($ch, CURLOPT_URL, $fileUrl);
  116 + curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); // 直接输出内容
  117 + curl_setopt($ch, CURLOPT_HEADER, false);
  118 + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 跟随重定向
  119 + curl_setopt($ch, CURLOPT_BUFFERSIZE, 8192); // 设置缓冲区大小
  120 + curl_setopt($ch, CURLOPT_TIMEOUT, 300); // 设置超时时间
  121 + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); // 连接超时时间
  122 + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 禁用 SSL 验证
  123 + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  124 + // 分块输出文件内容
  125 + curl_setopt($ch, CURLOPT_WRITEFUNCTION, function ($ch, $data) {
  126 + echo $data;
  127 + flush(); // 强制输出缓冲
  128 + return strlen($data);
  129 + });
108 // 执行 cURL 130 // 执行 cURL
109 - ob_end_clean(); // 清空之前的输出缓冲区  
110 curl_exec($ch); 131 curl_exec($ch);
111 -  
112 - // 检查 cURL 错误  
113 - if (curl_errno($ch)) { 132 + // 检查 cURL 错误或 HTTP 状态码
  133 + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  134 + if (curl_errno($ch) || $httpCode != 200) {
  135 + $errorMsg = curl_errno($ch)
  136 + ? 'cURL 错误: ' . curl_error($ch)
  137 + : 'HTTP 错误: ' . $httpCode;
114 curl_close($ch); 138 curl_close($ch);
115 - $this->response('文件下载失败: ' . curl_error($ch), Code::SYSTEM_ERROR); 139 + $this->response('文件下载失败: ' . $errorMsg, Code::SYSTEM_ERROR);
116 } 140 }
  141 + // 关闭 cURL
117 curl_close($ch); 142 curl_close($ch);
118 exit; 143 exit;
119 } 144 }
120 145
121 -  
122 -  
123 public function upload(Request $request, FileManage $fileManage){ 146 public function upload(Request $request, FileManage $fileManage){
124 $request->validate([ 147 $request->validate([
125 'file'=>['required'], 148 'file'=>['required'],
@@ -77,6 +77,7 @@ class TranslateLogic extends BaseLogic @@ -77,6 +77,7 @@ class TranslateLogic extends BaseLogic
77 if($val == ' ' || $val == ''){ 77 if($val == ' ' || $val == ''){
78 continue; 78 continue;
79 } 79 }
  80 + $val = str_replace(' ','',urldecode($val));//处理特殊字符
80 $val = trim(str_replace(' ','',$val)); 81 $val = trim(str_replace(' ','',$val));
81 if (FALSE == in_array($val, $old_key)){ 82 if (FALSE == in_array($val, $old_key)){
82 $arr2[] = $val; 83 $arr2[] = $val;
@@ -36,7 +36,7 @@ class NavRequest extends FormRequest @@ -36,7 +36,7 @@ class NavRequest extends FormRequest
36 'pid' => ['required','integer'], 36 'pid' => ['required','integer'],
37 'name' => ['required','max:100'], 37 'name' => ['required','max:100'],
38 'url' => ['required'], 38 'url' => ['required'],
39 - 'remark'=> ['max:500'] 39 + 'remark'=> ['max:1500']
40 ]; 40 ];
41 return $rule; 41 return $rule;
42 } 42 }
@@ -52,7 +52,7 @@ class NavRequest extends FormRequest @@ -52,7 +52,7 @@ class NavRequest extends FormRequest
52 'name.required' => '名称必须', 52 'name.required' => '名称必须',
53 'name.max' => '名称不能超过100个字符', 53 'name.max' => '名称不能超过100个字符',
54 'url.required' => '链接不能为空', 54 'url.required' => '链接不能为空',
55 - 'remark.max' => '描述超过最长500字符', 55 + 'remark.max' => '描述超过最长1500字符',
56 ]; 56 ];
57 } 57 }
58 } 58 }
@@ -25,7 +25,7 @@ class NewsRequest extends FormRequest @@ -25,7 +25,7 @@ class NewsRequest extends FormRequest
25 { 25 {
26 return [ 26 return [
27 'name'=>'required|max:200', 27 'name'=>'required|max:200',
28 - 'remark'=>'max:1000', 28 + 'remark'=>'max:2000',
29 'url'=>'required', 29 'url'=>'required',
30 ]; 30 ];
31 } 31 }
@@ -36,7 +36,7 @@ class NewsRequest extends FormRequest @@ -36,7 +36,7 @@ class NewsRequest extends FormRequest
36 'name.required'=>'请填写名称', 36 'name.required'=>'请填写名称',
37 'name.max'=>'名称超过最长长度200', 37 'name.max'=>'名称超过最长长度200',
38 'url.required'=>'链接不能为空', 38 'url.required'=>'链接不能为空',
39 - 'remark.max'=>'描述超过最长长度1000' 39 + 'remark.max'=>'描述超过最长长度2000'
40 ]; 40 ];
41 } 41 }
42 } 42 }