From 77b6c53a42cad6ea6be45ab2e37a710d3b7d136a Mon Sep 17 00:00:00 2001 From: kuaifan Date: Fri, 4 Mar 2022 15:41:28 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Api/ProjectController.php | 5 +- app/Models/ProjectTask.php | 15 +++--- app/Models/ProjectTaskContent.php | 52 +++++++++++++++++++ ...0_project_task_contents_update_content.php | 40 ++++++++++++++ .../ProjectTaskContentsTableSeeder.php | 15 +++++- 5 files changed, 119 insertions(+), 8 deletions(-) create mode 100644 database/migrations/2022_03_04_154630_project_task_contents_update_content.php diff --git a/app/Http/Controllers/Api/ProjectController.php b/app/Http/Controllers/Api/ProjectController.php index 9e4091492..d33b11c75 100755 --- a/app/Http/Controllers/Api/ProjectController.php +++ b/app/Http/Controllers/Api/ProjectController.php @@ -1183,7 +1183,10 @@ class ProjectController extends AbstractController // $task = ProjectTask::userTask($task_id, null); // - return Base::retSuccess('success', $task->content ?: json_decode('{}')); + if (empty($task->content)) { + return Base::retSuccess('success', json_decode('{}')); + } + return Base::retSuccess('success', $task->content->getContentInfo()); } /** diff --git a/app/Models/ProjectTask.php b/app/Models/ProjectTask.php index dc201d7ad..c1d2a5348 100644 --- a/app/Models/ProjectTask.php +++ b/app/Models/ProjectTask.php @@ -235,7 +235,7 @@ class ProjectTask extends AbstractModel */ public function content(): \Illuminate\Database\Eloquent\Relations\HasOne { - return $this->hasOne(ProjectTaskContent::class, 'task_id', 'id'); + return $this->hasOne(ProjectTaskContent::class, 'task_id', 'id')->orderByDesc('id'); } /** @@ -467,7 +467,9 @@ class ProjectTask extends AbstractModel ProjectTaskContent::createInstance([ 'project_id' => $task->project_id, 'task_id' => $task->id, - 'content' => $content, + 'content' => [ + 'url' => ProjectTaskContent::saveContent($task->id, $content) + ], ])->save(); } if ($task->parent_id == 0 && $subtasks && is_array($subtasks)) { @@ -797,12 +799,13 @@ class ProjectTask extends AbstractModel } // 内容 if (Arr::exists($data, 'content')) { - ProjectTaskContent::updateInsert([ + ProjectTaskContent::createInstance([ 'project_id' => $this->project_id, 'task_id' => $this->id, - ], [ - 'content' => $data['content'], - ]); + 'content' => [ + 'url' => ProjectTaskContent::saveContent($this->id, $data['content']) + ], + ])->save(); $this->desc = Base::getHtml($data['content'], 100); $this->addLog("修改{任务}详细描述"); $updateMarking['is_update_content'] = true; diff --git a/app/Models/ProjectTaskContent.php b/app/Models/ProjectTaskContent.php index 3b6bdb1c3..97ab0a176 100644 --- a/app/Models/ProjectTaskContent.php +++ b/app/Models/ProjectTaskContent.php @@ -2,6 +2,8 @@ namespace App\Models; +use App\Module\Base; + /** * App\Models\ProjectTaskContent * @@ -28,4 +30,54 @@ class ProjectTaskContent extends AbstractModel 'created_at', 'updated_at', ]; + + /** + * 获取内容详情 + * @return array + */ + public function getContentInfo() + { + $content = Base::json2array($this->content); + if (isset($content['url'])) { + $filePath = public_path($content['url']); + $array = $this->toArray(); + $array['content'] = file_get_contents($filePath) ?: ''; + if ($array['content']) { + $replace = Base::fillUrl('uploads/task'); + $array['content'] = str_replace('{{RemoteURL}}uploads/task', $replace, $array['content']); + } + return $array; + } + return $this->toArray(); + } + + /** + * 保存任务详情至文件并返回文件路径 + * @param $task_id + * @param $content + * @return string + */ + public static function saveContent($task_id, $content) + { + $path = 'uploads/task/content/' . date("Ym") . '/' . $task_id . '/'; + // + preg_match_all("/ $text) { + $tmpPath = $path . 'attached/'; + Base::makeDir(public_path($tmpPath)); + $tmpPath .= md5($text) . "." . $matchs[1][$key]; + if (file_put_contents(public_path($tmpPath), base64_decode($text))) { + $content = str_replace($matchs[0][$key], 'chunk(100, function($items) { + /** @var ProjectTaskContent $item */ + foreach ($items as $item) { + $content = Base::json2array($item->content); + if (!isset($content['url'])) { + $item->content = Base::array2json([ + 'url' => ProjectTaskContent::saveContent($item->task_id, $item->content) + ]); + $item->save(); + } + } + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // ... 退回去意义不大,文件内容不做回滚操作 + } +} diff --git a/database/seeders/ProjectTaskContentsTableSeeder.php b/database/seeders/ProjectTaskContentsTableSeeder.php index 4b222d865..bea223275 100644 --- a/database/seeders/ProjectTaskContentsTableSeeder.php +++ b/database/seeders/ProjectTaskContentsTableSeeder.php @@ -2,6 +2,8 @@ namespace Database\Seeders; +use App\Models\ProjectTaskContent; +use App\Module\Base; use Illuminate\Database\Seeder; class ProjectTaskContentsTableSeeder extends Seeder @@ -302,6 +304,17 @@ class ProjectTaskContentsTableSeeder extends Seeder ), )); - + ProjectTaskContent::orderBy('id')->chunk(100, function($items) { + /** @var ProjectTaskContent $item */ + foreach ($items as $item) { + $content = Base::json2array($item->content); + if (!isset($content['url'])) { + $item->content = Base::array2json([ + 'url' => ProjectTaskContent::saveContent($item->task_id, $item->content) + ]); + $item->save(); + } + } + }); } }