HomePageConfigController.php 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. <?php
  2. namespace hd\controllers;
  3. use bizHd\homePageConfig\classes\HomePageConfigClass;
  4. use bizHd\homePageConfig\classes\HomePageDisplayClass;
  5. use bizHd\homePageConfig\classes\HomePageModuleClass;
  6. use common\components\business;
  7. use common\components\dirUtil;
  8. use common\components\oss;
  9. use common\components\stringUtil;
  10. use common\components\util;
  11. use Yii;
  12. /**
  13. * 门店首页配置接口
  14. * 供 hdApp 管理端配置商城首页模块顺序、开关、顶部导航及轮播图详情。
  15. */
  16. class HomePageConfigController extends BaseController
  17. {
  18. /**
  19. * 门店首页预览:与 app-mall 顾客端首页共用同一套组装/格式化逻辑(HomePageDisplayClass),
  20. * 保证商家在后台点"预览"看到的效果与顾客真实首页完全一致
  21. */
  22. public function actionGetHome()
  23. {
  24. util::success(HomePageDisplayClass::buildHome($this->mainId));
  25. }
  26. /**
  27. * 获取首页模块顺序与开关
  28. */
  29. public function actionGetModules()
  30. {
  31. $list = HomePageConfigClass::getModules($this->mainId);
  32. util::success(['list' => $list]);
  33. }
  34. /**
  35. * 保存首页模块顺序与开关(合并写入 Redis)
  36. */
  37. public function actionSaveModules()
  38. {
  39. $items = Yii::$app->request->post('items', []);
  40. HomePageConfigClass::saveModules($this->mainId, $items);
  41. util::complete('保存成功');
  42. }
  43. /**
  44. * 获取顶部导航与搜索配置;门店名称实时取 xhShop.merchantName
  45. */
  46. public function actionGetTopNav()
  47. {
  48. $data = HomePageConfigClass::getTopNav($this->mainId);
  49. $data['merchantName'] = $this->shop->merchantName ?? '';
  50. util::success($data);
  51. }
  52. /**
  53. * 保存顶部导航与搜索配置(不含门店名称)
  54. */
  55. public function actionSaveTopNav()
  56. {
  57. $post = Yii::$app->request->post();
  58. HomePageConfigClass::saveTopNav($this->mainId, $post);
  59. util::complete('保存成功');
  60. }
  61. /**
  62. * 获取首页轮播图配置(管理端)
  63. */
  64. public function actionGetBanner()
  65. {
  66. $data = HomePageConfigClass::getBanner($this->mainId);
  67. util::success($data);
  68. }
  69. /**
  70. * 保存首页轮播图配置;同步模块开关,并清理被移除的 OSS 图片
  71. */
  72. public function actionSaveBanner()
  73. {
  74. $post = Yii::$app->request->post();
  75. HomePageConfigClass::saveBanner($this->mainId, $post);
  76. util::complete('保存成功');
  77. }
  78. /**
  79. * 上传轮播图到独立 OSS 目录 uploads_home_banner/{mainId}/{shopId}/日期路径
  80. * 文件名按日期时间生成,便于按日识别
  81. */
  82. public function actionUploadBanner()
  83. {
  84. $file = isset($_FILES['file']) ? $_FILES['file'] : null;
  85. if (empty($file) || empty($file['tmp_name']) || !is_uploaded_file($file['tmp_name'])) {
  86. util::fail('请上传图片');
  87. }
  88. $mainId = intval($this->mainId);
  89. $shopId = intval($this->shopId);
  90. if ($mainId <= 0 || $shopId <= 0) {
  91. util::fail('无效门店');
  92. }
  93. $root = HomePageConfigClass::BANNER_OSS_ROOT;
  94. $month = date('Ym');
  95. $day = date('d');
  96. // 本地临时目录与 OSS 对象路径保持一致
  97. $relativeDir = "{$root}/{$mainId}/{$shopId}/{$month}/{$day}/";
  98. $localDir = rtrim(dirUtil::getImgUploadDir(), '/') . '/' . $relativeDir;
  99. if (!is_dir($localDir) && !@mkdir($localDir, 0700, true) && !is_dir($localDir)) {
  100. util::fail('创建上传目录失败');
  101. }
  102. // 文件名:日期时间 + 短唯一串,满足「按日期创建」并避免冲突
  103. $fileName = date('YmdHis') . '_' . substr(stringUtil::uniqueFileName(), 0, 8) . '.jpg';
  104. $localFile = $localDir . $fileName;
  105. if (!move_uploaded_file($file['tmp_name'], $localFile)) {
  106. util::fail('上传失败');
  107. }
  108. $ossPath = $relativeDir . $fileName;
  109. oss::uploadImage($ossPath, $localFile);
  110. @unlink($localFile);
  111. $data = business::formatUploadImg($ossPath);
  112. $data['shortUrl'] = $ossPath;
  113. $data['smallShortUrl'] = $ossPath . '?x-oss-process=image/resize,l_200';
  114. util::success($data, 'ok');
  115. }
  116. /**
  117. * 删除单张轮播图 OSS(前端移除图片时即时调用)
  118. */
  119. public function actionDeleteBannerImg()
  120. {
  121. $filePath = Yii::$app->request->post('filePath', '');
  122. $filePath = ltrim(strval($filePath), '/');
  123. if ($filePath === '') {
  124. util::fail('参数错误');
  125. }
  126. $prefix = HomePageConfigClass::BANNER_OSS_ROOT . '/' . intval($this->mainId) . '/' . intval($this->shopId) . '/';
  127. if (strpos($filePath, $prefix) !== 0) {
  128. util::fail('无权删除该图片');
  129. }
  130. HomePageConfigClass::deleteBannerOssImages([$filePath]);
  131. util::complete('删除成功');
  132. }
  133. /** 金刚区导航 */
  134. public function actionGetNavGrid()
  135. {
  136. util::success(HomePageModuleClass::getNavGrid($this->mainId));
  137. }
  138. public function actionSaveNavGrid()
  139. {
  140. HomePageModuleClass::saveNavGrid($this->mainId, Yii::$app->request->post());
  141. util::complete('保存成功');
  142. }
  143. /**
  144. * 上传金刚区图标到 uploads_home_nav/{mainId}/{shopId}/日期
  145. */
  146. public function actionUploadNavIcon()
  147. {
  148. $this->uploadHomeImage(HomePageModuleClass::NAV_OSS_ROOT);
  149. }
  150. /** 秒杀专区 */
  151. public function actionGetSeckill()
  152. {
  153. util::success(HomePageModuleClass::getSeckill($this->mainId, true));
  154. }
  155. public function actionSaveSeckill()
  156. {
  157. HomePageModuleClass::saveSeckill($this->mainId, Yii::$app->request->post());
  158. util::complete('保存成功');
  159. }
  160. /** 团购专区 */
  161. public function actionGetGroupBuy()
  162. {
  163. util::success(HomePageModuleClass::getGroupBuy($this->mainId, true));
  164. }
  165. public function actionSaveGroupBuy()
  166. {
  167. HomePageModuleClass::saveGroupBuy($this->mainId, Yii::$app->request->post());
  168. util::complete('保存成功');
  169. }
  170. /** 热门推荐 */
  171. public function actionGetHot()
  172. {
  173. util::success(HomePageModuleClass::getGoodsSection($this->mainId, 'hot'));
  174. }
  175. public function actionSaveHot()
  176. {
  177. HomePageModuleClass::saveGoodsSection($this->mainId, 'hot', Yii::$app->request->post());
  178. util::complete('保存成功');
  179. }
  180. /** 今日上新 */
  181. public function actionGetNew()
  182. {
  183. util::success(HomePageModuleClass::getGoodsSection($this->mainId, 'new'));
  184. }
  185. public function actionSaveNew()
  186. {
  187. HomePageModuleClass::saveGoodsSection($this->mainId, 'new', Yii::$app->request->post());
  188. util::complete('保存成功');
  189. }
  190. /** 下拉商品 */
  191. public function actionGetPullGoods()
  192. {
  193. util::success(HomePageModuleClass::getGoodsSection($this->mainId, 'pullGoods'));
  194. }
  195. public function actionSavePullGoods()
  196. {
  197. HomePageModuleClass::saveGoodsSection($this->mainId, 'pullGoods', Yii::$app->request->post());
  198. util::complete('保存成功');
  199. }
  200. /**
  201. * 通用首页配置图片上传:按项目(mainId)+shopId+日期落 OSS
  202. */
  203. private function uploadHomeImage($root)
  204. {
  205. $file = isset($_FILES['file']) ? $_FILES['file'] : null;
  206. if (empty($file) || empty($file['tmp_name']) || !is_uploaded_file($file['tmp_name'])) {
  207. util::fail('请上传图片');
  208. }
  209. $mainId = intval($this->mainId);
  210. $shopId = intval($this->shopId);
  211. if ($mainId <= 0 || $shopId <= 0) {
  212. util::fail('无效门店');
  213. }
  214. $month = date('Ym');
  215. $day = date('d');
  216. $relativeDir = "{$root}/{$mainId}/{$shopId}/{$month}/{$day}/";
  217. $localDir = rtrim(dirUtil::getImgUploadDir(), '/') . '/' . $relativeDir;
  218. if (!is_dir($localDir) && !@mkdir($localDir, 0700, true) && !is_dir($localDir)) {
  219. util::fail('创建上传目录失败');
  220. }
  221. $fileName = date('YmdHis') . '_' . substr(stringUtil::uniqueFileName(), 0, 8) . '.jpg';
  222. $localFile = $localDir . $fileName;
  223. if (!move_uploaded_file($file['tmp_name'], $localFile)) {
  224. util::fail('上传失败');
  225. }
  226. $ossPath = $relativeDir . $fileName;
  227. oss::uploadImage($ossPath, $localFile);
  228. @unlink($localFile);
  229. $data = business::formatUploadImg($ossPath);
  230. $data['shortUrl'] = $ossPath;
  231. $data['smallShortUrl'] = $ossPath . '?x-oss-process=image/resize,l_200';
  232. util::success($data, 'ok');
  233. }
  234. }