diff --git a/app/apis/controller/AdpController.php b/app/apis/controller/AdpController.php new file mode 100644 index 0000000..894ad05 --- /dev/null +++ b/app/apis/controller/AdpController.php @@ -0,0 +1,91 @@ +where(['adp_id' => $item['id'], 'status' => 1])->limit(8)->get(); + foreach ($ad as $k => $v) { + $v['alt'] = isset($v['translation']) ? $v['translation']['alt'] : ''; + $v['title'] = isset($v['translation']) ? $v['translation']['title'] : ''; + unset($v['translation']); + $item['ad'][$k] = $ad; + } + } + + return $item; + } + + /** + * 参数预处理 (根据场景处理) + * @param Request $request + * @param string $scene + * @return array + */ + protected function prepareParams(Request $request, string $scene): array + { + $params = parent::prepareParams($request, $scene); + + if ($scene === 'default') { + $params['filters'] = []; + + } + + return $params; + } + + /** + * 分页 + * + * @param Request $request 请求对象 + * @return Response 响应对象 + */ + public function index(Request $request, string $scene = 'default'): Response + { + try { + return parent::index($request, $scene); + } catch (\Throwable $th) { + return $this->errorResponse($th->getMessage()); + } + } +} \ No newline at end of file diff --git a/app/apis/controller/AdpTranslationController.php b/app/apis/controller/AdpTranslationController.php new file mode 100644 index 0000000..3e2bfab --- /dev/null +++ b/app/apis/controller/AdpTranslationController.php @@ -0,0 +1,81 @@ +errorResponse($th->getMessage()); + } + } +} \ No newline at end of file diff --git a/app/apis/model/AdpModel.php b/app/apis/model/AdpModel.php new file mode 100644 index 0000000..3be51bd --- /dev/null +++ b/app/apis/model/AdpModel.php @@ -0,0 +1,80 @@ +hasOne(AdpTranslationModel::class, 'adp_id')->where('locale', locale()); + } + + /** + * 多条翻译 + */ + public function translations() + { + return $this->hasMany(AdpTranslationModel::class, 'adp_id'); + } + + /** + * 广告 + */ + public function ad() + { + return $this->hasMany(AdModel::class, 'adp_id','id'); + } +} \ No newline at end of file diff --git a/app/apis/model/AdpTranslationModel.php b/app/apis/model/AdpTranslationModel.php new file mode 100644 index 0000000..d562bbb --- /dev/null +++ b/app/apis/model/AdpTranslationModel.php @@ -0,0 +1,56 @@ + function ($params) { + return [ + 'filters' => $params['filters'], + 'fields' => ['id', 'status', 'sort', 'creater', 'created_at', 'updated_at'], + 'relations' => [ + 'translation' => ['adp_id', 'title'], + 'ad' => ['id', 'image', 'status', 'sort', 'creater', 'created_at', 'updated_at'], + 'ad.translation' => ['ad_id', 'alt', 'title'], + ], + 'sorts' => [ + ['field' => 'sort', 'direction' => 'desc'], + ['field' => 'created_at', 'direction' => 'desc'], + ], + 'pagination' => [ + 'page' => $params['page'] ?? 1, + 'per_page' => $params['per_page'] ?? 10, + ] + ]; + }, + ]; + } +} \ No newline at end of file diff --git a/app/apis/service/AdpTranslationService.php b/app/apis/service/AdpTranslationService.php new file mode 100644 index 0000000..80ba3c2 --- /dev/null +++ b/app/apis/service/AdpTranslationService.php @@ -0,0 +1,59 @@ + function ($params) { + // $keyword = $params['keyword'] ?? ''; + // return [ + // 'filters' => [ + // ['field' => '***', 'operator' => '=', 'value' => '***'] + // ], + // 'fields' => ['id'], + // 'relations' => [], + // 'custom' => function(Builder $q) use ($keyword) { + // // 示例 + // if ($keyword) { + // $q->where(function($q2) use($keyword) { + // $q2->whereHas('***', function($q3) use($keyword) { + // $q3->where('***', 'like', "%{$keyword}%"); + // })->orWhereHas('***', function($q4) use($keyword) { + // $q4->where('***', 'like', "%{$keyword}%"); + // }); + // }); + // } + // }, + // 'sorts' => [ + // ['field' => 'created_at', 'direction' => 'desc'] + // ], + // 'pagination' => [ + // 'page' => $params['page'] ?? 1, + // 'per_page' => $params['per_page'] ?? 10, + // ] + // ]; + // } + ]; + } +} \ No newline at end of file diff --git a/app/apis/validate/AdpTranslationValidator.php b/app/apis/validate/AdpTranslationValidator.php new file mode 100644 index 0000000..ff59e05 --- /dev/null +++ b/app/apis/validate/AdpTranslationValidator.php @@ -0,0 +1,29 @@ + [ + + ], + + 'update' => [ + + ] + ]; +} \ No newline at end of file diff --git a/app/apis/validate/AdpValidator.php b/app/apis/validate/AdpValidator.php new file mode 100644 index 0000000..ac8cfde --- /dev/null +++ b/app/apis/validate/AdpValidator.php @@ -0,0 +1,29 @@ + [ + + ], + + 'update' => [ + + ] + ]; +} \ No newline at end of file diff --git a/app/console/controller/AdpController.php b/app/console/controller/AdpController.php new file mode 100644 index 0000000..68e5cd1 --- /dev/null +++ b/app/console/controller/AdpController.php @@ -0,0 +1,105 @@ +errorResponse($th->getMessage()); + } + } + + public function add(Request $request): Response + { + try { + $id = $this->getService()->add($request->all()); + return $id ? $this->successResponse(['id' => $id]) + : $this->errorResponse(); + } catch (\Throwable $th) { + return $this->errorResponse($th->getMessage()); + } + } + + public function edit(Request $request, int $id): Response + { + try { + $request->setPost('id',$id); + return $this->getService()->edit($request->all(), $id) + ? $this->successResponse() + : $this->errorResponse(); + } catch (\Throwable $th) { + return $this->errorResponse($th->getMessage().$th->getFile().$th->getLine()); + } + } +} \ No newline at end of file diff --git a/app/console/controller/AdpTranslationController.php b/app/console/controller/AdpTranslationController.php new file mode 100644 index 0000000..13a8eaf --- /dev/null +++ b/app/console/controller/AdpTranslationController.php @@ -0,0 +1,81 @@ +errorResponse($th->getMessage()); + } + } +} \ No newline at end of file diff --git a/app/console/model/AdModel.php b/app/console/model/AdModel.php index fb6c9c8..3b43f95 100644 --- a/app/console/model/AdModel.php +++ b/app/console/model/AdModel.php @@ -47,7 +47,7 @@ class AdModel extends Model /** * 允许自动填充模型字段 */ - protected $fillable = ['id', 'image', 'status', 'sort', 'creater', 'created_at', 'updated_at']; + protected $fillable = ['id', 'adp_id', 'image', 'href', 'status', 'sort', 'creater', 'created_at', 'updated_at']; /** * 不允许自动填充模型字段 diff --git a/app/console/model/AdpModel.php b/app/console/model/AdpModel.php new file mode 100644 index 0000000..13767c5 --- /dev/null +++ b/app/console/model/AdpModel.php @@ -0,0 +1,72 @@ +hasOne(AdpTranslationModel::class, 'adp_id')->where('locale', locale()); + } + + /** + * 多条翻译 + */ + public function translations() + { + return $this->hasMany(AdpTranslationModel::class, 'adp_id'); + } +} \ No newline at end of file diff --git a/app/console/model/AdpTranslationModel.php b/app/console/model/AdpTranslationModel.php new file mode 100644 index 0000000..f0c65c7 --- /dev/null +++ b/app/console/model/AdpTranslationModel.php @@ -0,0 +1,56 @@ + function ($params) { return [ 'filters' => $params['filters'], - 'fields' => ['id', 'image', 'status', 'sort', 'creater', 'created_at', 'updated_at'], + 'fields' => ['id', 'adp_id', 'image', 'status', 'sort', 'creater', 'created_at', 'updated_at'], 'relations' => [ 'translation' => ['ad_id', 'alt', 'title'], ], diff --git a/app/console/service/AdpService.php b/app/console/service/AdpService.php new file mode 100644 index 0000000..3cf885b --- /dev/null +++ b/app/console/service/AdpService.php @@ -0,0 +1,120 @@ + function ($params) { + return [ + 'filters' => $params['filters'], + 'fields' => ['id', 'status', 'sort', 'creater', 'created_at', 'updated_at'], + 'relations' => [ + 'translation' => ['adp_id', 'title'], + ], + 'sorts' => [ + ['field' => 'sort', 'direction' => 'desc'], + ['field' => 'created_at', 'direction' => 'desc'], + ], + 'pagination' => [ + 'page' => $params['page'] ?? 1, + 'per_page' => $params['per_page'] ?? 10, + ] + ]; + }, + ]; + } + + protected array $translatable = [ + 'title' + ]; + + public function add(array $params) + { + $sourceLocale = locale(); + $sourceFields = $this->extractSourceFields($params); + if (empty($sourceFields)) { + throw new \InvalidArgumentException("请传递至少一条 {$sourceLocale} 语言的翻译字段"); + }; + + Db::beginTransaction(); + try { + $info = $this->create($params); + if (!$info) { + throw new BusinessException('提交失败'); + } + + // 异步翻译并写入 hs_ad_translation 表 + (new TranslationService())->queueTranslations( + 'adp', + $info->id, + $sourceLocale, + $sourceFields + ); + + Db::commit(); + return $info->id; + } catch (\Throwable $th) { + Db::rollBack(); + throw $th; + } + } + + public function edit(array $params, int $id) + { + $sourceLocale = locale(); + $sourceFields = $this->extractSourceFields($params); + if (empty($sourceFields)) { + throw new \InvalidArgumentException("请传递至少一条 {$sourceLocale} 语言的翻译字段"); + }; + + Db::beginTransaction(); + try { + $info = $this->update($id, $params); + if (!$info) { + throw new BusinessException('提交失败'); + } + + // 异步翻译并写入 hs_ad_translation 表 + AdpTranslationModel::updateOrCreate( + [ + 'adp_id' => $id, + 'locale' => $sourceLocale, + ], + $sourceFields + ); + + Db::commit(); + return true; + } catch (\Throwable $th) { + Db::rollBack(); + throw $th; + } + } + +} \ No newline at end of file diff --git a/app/console/service/AdpTranslationService.php b/app/console/service/AdpTranslationService.php new file mode 100644 index 0000000..142da30 --- /dev/null +++ b/app/console/service/AdpTranslationService.php @@ -0,0 +1,59 @@ + function ($params) { + // $keyword = $params['keyword'] ?? ''; + // return [ + // 'filters' => [ + // ['field' => '***', 'operator' => '=', 'value' => '***'] + // ], + // 'fields' => ['id'], + // 'relations' => [], + // 'custom' => function(Builder $q) use ($keyword) { + // // 示例 + // if ($keyword) { + // $q->where(function($q2) use($keyword) { + // $q2->whereHas('***', function($q3) use($keyword) { + // $q3->where('***', 'like', "%{$keyword}%"); + // })->orWhereHas('***', function($q4) use($keyword) { + // $q4->where('***', 'like', "%{$keyword}%"); + // }); + // }); + // } + // }, + // 'sorts' => [ + // ['field' => 'created_at', 'direction' => 'desc'] + // ], + // 'pagination' => [ + // 'page' => $params['page'] ?? 1, + // 'per_page' => $params['per_page'] ?? 10, + // ] + // ]; + // } + ]; + } +} \ No newline at end of file diff --git a/app/console/validate/AdpTranslationValidator.php b/app/console/validate/AdpTranslationValidator.php new file mode 100644 index 0000000..136ff3d --- /dev/null +++ b/app/console/validate/AdpTranslationValidator.php @@ -0,0 +1,29 @@ + [ + + ], + + 'update' => [ + + ] + ]; +} \ No newline at end of file diff --git a/app/console/validate/AdpValidator.php b/app/console/validate/AdpValidator.php new file mode 100644 index 0000000..ff4d28a --- /dev/null +++ b/app/console/validate/AdpValidator.php @@ -0,0 +1,29 @@ + [ + + ], + + 'update' => [ + + ] + ]; +} \ No newline at end of file diff --git a/app/mzl/modules/translation/config/trans.php b/app/mzl/modules/translation/config/trans.php index 0129e98..fdde074 100644 --- a/app/mzl/modules/translation/config/trans.php +++ b/app/mzl/modules/translation/config/trans.php @@ -63,6 +63,10 @@ return [ 'translation_model' => \app\console\model\VehicleNewAlbumTranslationModel::class, 'foreign_key' => 'album_id', ], + 'adp' => [ + 'translation_model' => \app\console\model\AdpTranslationModel::class, + 'foreign_key' => 'adp_id', + ], 'ad' => [ 'translation_model' => \app\console\model\AdTranslationModel::class, 'foreign_key' => 'ad_id',