Diy.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace app\shop\controller;
  11. use addon\weapp\model\Config as WeappConfig;
  12. use addon\aliapp\model\Config as AliappConfig;
  13. use app\model\diy\Template;
  14. use app\model\diy\Theme;
  15. use app\model\goods\GoodsCategory;
  16. use app\model\shop\Shop as ShopModel;
  17. use app\model\web\DiyView as DiyViewModel;
  18. use addon\wechat\model\Config as WechatConfig;
  19. use app\model\web\DiyViewLink;
  20. /**
  21. * 网站装修控制器
  22. */
  23. class Diy extends BaseShop
  24. {
  25. public function __construct()
  26. {
  27. $this->app_module = input('app_module', SHOP_MODULE);
  28. if ($this->app_module == 'store') {
  29. $this->initConstructInfo(); // 加载构造函数重要信息
  30. } else {
  31. parent::__construct();
  32. }
  33. }
  34. /**
  35. * 管理预览
  36. * @return mixed
  37. */
  38. public function management()
  39. {
  40. $shop_model = new ShopModel();
  41. $qrcode_info = $shop_model->qrcode($this->site_id)[ 'data' ];
  42. $this->assign('qrcode_info', $qrcode_info[ 'path' ][ 'h5' ] ?? '');
  43. $wechat_config_model = new WechatConfig();
  44. $wechat_config_result = $wechat_config_model->getWechatConfig($this->site_id)[ "data" ][ 'value' ];
  45. $this->assign('wechat_config', $wechat_config_result);
  46. $weapp_config_model = new WeappConfig();
  47. $weapp_config_result = $weapp_config_model->getWeappConfig($this->site_id)[ 'data' ][ 'value' ];
  48. $this->assign('weapp_config', $weapp_config_result);
  49. if (addon_is_exit('aliapp', $this->site_id)) {
  50. $aliapp_config_model = new AliappConfig();
  51. $aliapp_config_result = $aliapp_config_model->getAliappConfig($this->site_id)[ 'data' ][ 'value' ];
  52. $this->assign('aliapp_config', $aliapp_config_result);
  53. }
  54. $store_business = 'shop'; // 店铺运营模式
  55. // 检测店铺运营模式
  56. if (addon_is_exit('store')) {
  57. $config_model = new \addon\store\model\Config();
  58. $business_config = $config_model->getStoreBusinessConfig($this->site_id)[ 'data' ][ 'value' ];
  59. $store_business = $business_config[ 'store_business' ];
  60. }
  61. $this->assign('store_is_exit', addon_is_exit('store'));
  62. $this->assign('store_business', $store_business);
  63. return $this->fetch('diy/management');
  64. }
  65. /**
  66. * 网站主页
  67. */
  68. public function index()
  69. {
  70. $data = [
  71. 'site_id' => $this->site_id,
  72. 'name' => 'DIY_VIEW_INDEX'
  73. ];
  74. $edit_view = event('DiyViewEdit', $data, true);
  75. return $edit_view;
  76. }
  77. /**
  78. * 商品分类页面
  79. */
  80. public function goodsCategory()
  81. {
  82. $data = [
  83. 'site_id' => $this->site_id,
  84. 'name' => 'DIY_VIEW_GOODS_CATEGORY'
  85. ];
  86. $edit_view = event('DiyViewEdit', $data, true);
  87. return $edit_view;
  88. }
  89. /**
  90. * 会员中心
  91. */
  92. public function memberIndex()
  93. {
  94. $data = [
  95. 'site_id' => $this->site_id,
  96. 'name' => 'DIY_VIEW_MEMBER_INDEX'
  97. ];
  98. $edit_view = event('DiyViewEdit', $data, true);
  99. return $edit_view;
  100. }
  101. /**
  102. * 编辑
  103. */
  104. public function edit()
  105. {
  106. if (request()->isAjax()) {
  107. $res = 0;
  108. $id = input('id', 0);
  109. $name = input('name', '');
  110. $title = input('title', '');
  111. $value = input('value', '');
  112. $template_id = input('template_id', 0); // 所属模板id
  113. $page_type = input('page_type', ''); // 页面类型
  114. if (!empty($name) && !empty($title) && !empty($value)) {
  115. $diy_view = new DiyViewModel();
  116. $data = [
  117. 'site_id' => $this->site_id,
  118. 'name' => $name,
  119. 'title' => $title,
  120. 'value' => $value,
  121. 'template_id' => $template_id
  122. ];
  123. if (!empty($page_type)) {
  124. $diy_template_model = new Template();
  125. $template_info = $diy_template_model->getTemplateInfo([ [ 'name', '=', $page_type ] ], 'title,name')[ 'data' ];
  126. $data[ 'type' ] = $template_info[ 'name' ];
  127. $data[ 'type_name' ] = $template_info[ 'title' ];
  128. } else {
  129. $data[ 'is_default' ] = 1; // 自定义页面,默认为1
  130. }
  131. if ($id == 0) {
  132. $res = $diy_view->addSiteDiyView($data);
  133. } else {
  134. $res = $diy_view->editSiteDiyView($data, [ [ 'id', '=', $id ] ]);
  135. }
  136. }
  137. return $res;
  138. } else {
  139. $id = input('id', 0);
  140. $template_id = input('template_id', 0);
  141. $title = input('title', '');
  142. $page_type = input('page_type', ''); // 页面类型
  143. $data = [
  144. 'site_id' => $this->site_id,
  145. 'id' => $id,
  146. 'template_id' => $template_id,
  147. 'title' => $title,
  148. 'page_type' => $page_type
  149. ];
  150. $edit_view = event('DiyViewEdit', $data, true);
  151. return $edit_view;
  152. }
  153. }
  154. /**
  155. * 微页面
  156. */
  157. public function lists()
  158. {
  159. $type = input('type', ''); // 页面类型
  160. $diy_template_goods_model = new Template();
  161. // 页面类型
  162. $template_list = $diy_template_goods_model->getTemplateList([], 'id,title,name')[ 'data' ];
  163. $template_list_arr = array_column($template_list, 'name');
  164. if (request()->isAjax()) {
  165. $page_index = input('page', 1);
  166. $page_size = input('page_size', PAGE_LIST_ROWS);
  167. $search_text = input('search_text', ''); // 页面名称
  168. $template_id = input('template_id', 0); // 所属模板id
  169. $condition = [
  170. [ 'site_id', '=', $this->site_id ],
  171. // [ 'name', 'like', [ '%DIY_VIEW_RANDOM_%', 'DIY_VIEW_INDEX' ], 'or' ]
  172. ];
  173. if (!empty($search_text)) {
  174. $condition[] = [ 'title', 'like', '%' . $search_text . '%' ];
  175. }
  176. if (!empty($type) && $type != 'ALL') {
  177. $condition[] = [ 'type', '=', $type ];
  178. }
  179. if (!empty($template_id)) {
  180. $condition[] = [ 'template_id', '=', $template_id ];
  181. }
  182. $field = 'id, name, title, template_id, template_item_id, type, type_name, click_num, is_default, sort, create_time';
  183. $order_by = "is_default desc,INSTR('" . implode(',', $template_list_arr) . "', name) desc, create_time desc";
  184. $diy_view = new DiyViewModel();
  185. $list = $diy_view->getSiteDiyViewPageList($condition, $page_index, $page_size, $order_by, $field);
  186. return $list;
  187. } else {
  188. if (empty($type)) {
  189. $type = 'ALL';
  190. }
  191. $this->assign('type', $type);
  192. // 店铺模板
  193. $template_goods_list = $diy_template_goods_model->getTemplateGoodsList([], 'goods_id, title, name')[ 'data' ];
  194. $this->assign('template_goods_list', $template_goods_list);
  195. // 选择页面类型
  196. $page_type_list = [];
  197. foreach ($template_list as $k => $v) {
  198. $icon = '';
  199. if ($v[ 'name' ] == 'DIY_VIEW_INDEX') {
  200. $icon = 'iconfont icondianpushouye';
  201. } elseif ($v[ 'name' ] == 'DIY_VIEW_GOODS_CATEGORY') {
  202. $icon = 'iconfont iconshangpinfenlei2';
  203. } elseif ($v[ 'name' ] == 'DIY_VIEW_MEMBER_INDEX') {
  204. $icon = 'iconfont iconhuiyuanzhongxin';
  205. } elseif ($v[ 'name' ] == 'DIY_STORE') {
  206. $icon = 'iconfont iconmendianzhuye';
  207. }
  208. $page_type_list[] = [
  209. 'title' => $v[ 'title' ],
  210. 'name' => $v[ 'name' ],
  211. 'preview' => 'public/static/ext/diyview/img/preview/' . strtolower($v[ 'name' ]) . '.jpg',
  212. 'icon' => $icon
  213. ];
  214. }
  215. $page_type_list[] = [
  216. 'title' => '自定义页面',
  217. 'name' => 'DIY_PAGE',
  218. 'preview' => 'public/static/ext/diyview/img/preview/diy_page.jpg',
  219. 'icon' => 'iconfont iconzidingyiyemian'
  220. ];
  221. $this->assign('page_type_list', $page_type_list);
  222. $this->getPageCount();
  223. return $this->fetch('diy/lists');
  224. }
  225. }
  226. /**
  227. * 获取页面数量
  228. * @return array
  229. */
  230. public function getPageCount()
  231. {
  232. $diy_view = new DiyViewModel();
  233. $diy_template_goods_model = new Template();
  234. $template_list = $diy_template_goods_model->getTemplateList([], 'id,title,name')[ 'data' ];
  235. array_unshift($template_list, [
  236. 'id' => 0,
  237. 'title' => '全部页面',
  238. 'name' => 'ALL'
  239. ]);
  240. $template_list[] = [
  241. 'id' => 0,
  242. 'title' => '自定义页面',
  243. 'name' => 'DIY_PAGE'
  244. ];
  245. foreach ($template_list as $k => $v) {
  246. $condition = [
  247. [ 'site_id', '=', $this->site_id ]
  248. ];
  249. if ($v[ 'name' ] != 'ALL') {
  250. $condition[] = [ 'type', '=', $v[ 'name' ] ];
  251. }
  252. $template_list[ $k ][ 'count' ] = $diy_view->getSiteViewCount($condition)[ 'data' ];
  253. }
  254. if (request()->isAjax()) {
  255. return success(0, '', $template_list);
  256. } else {
  257. $this->assign('template_list', $template_list);
  258. }
  259. }
  260. /**
  261. * 页面路径
  262. * @return mixed
  263. */
  264. public function route()
  265. {
  266. if (request()->isAjax()) {
  267. $page_index = input('page', 1);
  268. $page_size = input('page_size', PAGE_LIST_ROWS);
  269. $search_text = input('search_text', '');
  270. $condition = [
  271. [ 'wap_url', '<>', '' ]
  272. ];
  273. if (!empty($search_text)) {
  274. $condition[] = [ 'title', 'like', '%' . $search_text . '%' ];
  275. }
  276. $order_by = 'id asc';
  277. $field = 'id, name, title, wap_url';
  278. $link_model = new DiyViewLink();
  279. $list = $link_model->getLinkPageList($condition, $page_index, $page_size, $order_by, $field);
  280. return $list;
  281. } else {
  282. $h5_domain = getH5Domain();
  283. $this->assign('h5_domain', $h5_domain);
  284. return $this->fetch('diy/route');
  285. }
  286. }
  287. /**
  288. * 根据页面路径生成推广链接
  289. * @return array
  290. */
  291. public function promoteRoute()
  292. {
  293. if (request()->isAjax()) {
  294. $name = input('name', ''); // 链接标识
  295. $path = input('path', ''); // 链接地址
  296. $app_type = input('app_type', 'all'); // 端口类型
  297. $diy_view = new DiyViewModel();
  298. $res = $diy_view->qrcodeRoute([
  299. 'site_id' => $this->site_id,
  300. 'name' => $name,
  301. 'path' => $path,
  302. 'app_type' => $app_type
  303. ]);
  304. return $res;
  305. }
  306. }
  307. /**
  308. * 链接选择
  309. */
  310. public function link()
  311. {
  312. if (request()->isAjax()) {
  313. $link = input('link', '');
  314. $link_model = new DiyViewLink();
  315. $tree_params = [
  316. 'site_id' => $this->site_id,
  317. ];
  318. $list = $link_model->getLinkTree($tree_params)[ 'data' ];
  319. $this->assign('list', $list);
  320. $select_link = json_decode($link, true);
  321. $this->assign('select_link', $select_link);
  322. // 商品分类
  323. $goods_category_model = new GoodsCategory();
  324. $goods_category_field = 'category_id,category_name,short_name,pid,level,image';
  325. $category_list = $goods_category_model->getCategoryTree([
  326. [ 'site_id', '=', $this->site_id ]
  327. ], $goods_category_field)[ 'data' ];
  328. $this->assign('category_list', $category_list);
  329. return $this->fetch('diy/link');
  330. }
  331. }
  332. /**
  333. * 删除自定义模板页面
  334. */
  335. public function deleteSiteDiyView()
  336. {
  337. if (request()->isAjax()) {
  338. $diy_view = new DiyViewModel();
  339. $id_array = input('id', 0);
  340. $condition = [
  341. [ 'id', 'in', $id_array ]
  342. ];
  343. $res = $diy_view->deleteSiteDiyView($condition);
  344. return $res;
  345. }
  346. }
  347. /**
  348. * 复制自定义模板页面
  349. */
  350. public function copySiteDiyView()
  351. {
  352. if (request()->isAjax()) {
  353. $diy_view = new DiyViewModel();
  354. $id_array = input('id', 0);
  355. $condition = [
  356. [ 'id', '=', $id_array ]
  357. ];
  358. // 获取被复制数据
  359. $data = $diy_view->getSiteDiyViewInfo($condition, '*');
  360. $data = $data[ 'data' ];
  361. unset($data[ 'id' ]);
  362. // 对数据进行处理
  363. $value = json_decode($data[ 'value' ], true);
  364. $data[ 'title' ] .= '_副本';
  365. $value[ 'global' ][ 'title' ] = $data[ 'title' ];
  366. $data[ 'value' ] = json_encode($value, JSON_UNESCAPED_UNICODE);
  367. $data[ 'create_time' ] = time();
  368. $data[ 'click_num' ] = 0;
  369. if ($data[ 'type' ] == 'DIY_PAGE') {
  370. $data[ 'is_default' ] = 1;
  371. $data[ 'name' ] = 'DIY_VIEW_RANDOM_' . time();
  372. } else {
  373. $data[ 'is_default' ] = 0; // 特定页面设为0
  374. }
  375. // 新增新数据
  376. $res = $diy_view->addSiteDiyView($data);
  377. return $res;
  378. }
  379. }
  380. /**
  381. * 底部导航
  382. */
  383. public function bottomNavDesign()
  384. {
  385. $diy_view = new DiyViewModel();
  386. if (request()->isAjax()) {
  387. $value = json_decode(input("value", ""), true);
  388. $res = $diy_view->setBottomNavConfig($value, $this->site_id);
  389. return $res;
  390. } else {
  391. $bottom_nav_info = $diy_view->getBottomNavConfig($this->site_id);
  392. $this->assign('bottom_nav_info', $bottom_nav_info[ 'data' ][ 'value' ]);
  393. return $this->fetch('diy/bottom_nav_design');
  394. }
  395. }
  396. /**
  397. * 店铺风格
  398. */
  399. public function style()
  400. {
  401. $diy_view = new DiyViewModel();
  402. $diy_theme_model = new Theme();
  403. if (request()->isAjax()) {
  404. $data = [
  405. 'id' => input('id', 0),
  406. 'title' => input('title', ''),
  407. 'name' => input('name', ''),
  408. 'main_color' => input('main_color', ''),
  409. 'aux_color' => input('aux_color', '')
  410. ];
  411. $res = $diy_view->setStyleConfig($data, $this->site_id);
  412. $bottom_nav = $diy_view->getBottomNavConfig($this->site_id)[ 'data' ][ 'value' ];
  413. // 修改底部导航配色
  414. if ($bottom_nav[ 'type' ] == 1 || $bottom_nav[ 'type' ] == 2) {
  415. $bottom_nav[ 'textHoverColor' ] = $data[ 'main_color' ];
  416. }
  417. foreach ($bottom_nav[ 'list' ] as $k => $v) {
  418. if ($v[ 'selected_icon_type' ] == 'icon') {
  419. $bottom_nav[ 'list' ][ $k ][ 'selected_style' ][ 'iconColor' ] = [ $data[ 'main_color' ] ];
  420. }
  421. }
  422. $diy_view->setBottomNavConfig($bottom_nav, $this->site_id);
  423. return $res;
  424. } else {
  425. // 主题风格
  426. $theme_list = $diy_theme_model->getThemeList([], 'id,title,name,main_color,aux_color,preview,color_img')[ 'data' ];
  427. if (!empty($theme_list)) {
  428. foreach ($theme_list as $k => $v) {
  429. if (!empty($v[ 'preview' ])) {
  430. $theme_list[ $k ][ 'preview' ] = explode(',', $v[ 'preview' ]);
  431. }
  432. }
  433. }
  434. $this->assign('theme_list', $theme_list);
  435. $style = $diy_view->getStyleConfig($this->site_id)[ 'data' ][ 'value' ];
  436. $this->assign('style', $style);
  437. return $this->fetch('diy/style');
  438. }
  439. }
  440. /**
  441. * 自定义模板选择
  442. * @return array|mixed
  443. */
  444. public function template()
  445. {
  446. $diy_view = new DiyViewModel();
  447. $diy_theme_model = new Theme();
  448. // 主题风格
  449. $theme_list = $diy_theme_model->getThemeList([], 'id,title,name,main_color,aux_color,preview,color_img')[ 'data' ];
  450. if (!empty($theme_list)) {
  451. foreach ($theme_list as $k => $v) {
  452. if (!empty($v[ 'preview' ])) {
  453. $theme_list[ $k ][ 'preview' ] = explode(',', $v[ 'preview' ]);
  454. }
  455. }
  456. }
  457. $this->assign('theme_list', $theme_list);
  458. $style = $diy_view->getStyleConfig($this->site_id)[ 'data' ][ 'value' ];
  459. $this->assign('style', $style);
  460. $diy_template = new Template();
  461. // 查询店铺正在使用的模板
  462. $site_diy_template_info = $diy_template->getSiteDiyTemplateInfo([
  463. [ 'is_default', '=', 1 ],
  464. [ 'site_id', '=', $this->site_id ]
  465. ], 'id,name,template_goods_id')[ 'data' ];
  466. $template_goods_list = $diy_template->getTemplateGoodsList([], 'goods_id,title,name,cover,preview,desc,goods_item_id')[ 'data' ];
  467. if (!empty($site_diy_template_info)) {
  468. foreach ($template_goods_list as $k => $v) {
  469. $template_goods_list[ $k ][ 'is_default' ] = 0;
  470. if ($v[ 'goods_id' ] == $site_diy_template_info[ 'template_goods_id' ]) {
  471. $template_goods_list[ $k ][ 'is_default' ] = 1;
  472. }
  473. }
  474. }
  475. $this->assign('template', $template_goods_list);
  476. return $this->fetch('diy/template');
  477. }
  478. /**
  479. * 创建
  480. */
  481. public function create()
  482. {
  483. if (request()->isAjax()) {
  484. $goods_id = input('goods_id', 0);
  485. $diy_template = new Template();
  486. $res = $diy_template->useTemplate([
  487. 'site_id' => $this->site_id,
  488. 'goods_id' => $goods_id,
  489. ]);
  490. return $res;
  491. }
  492. }
  493. /**
  494. * 设为使用
  495. */
  496. public function setUse()
  497. {
  498. if (request()->isAjax()) {
  499. $diy_view = new DiyViewModel();
  500. $id = input('id', 0);
  501. $res = $diy_view->setUse($id, $this->site_id);
  502. return $res;
  503. }
  504. }
  505. /**
  506. * 修改排序
  507. */
  508. public function modifySort()
  509. {
  510. if (request()->isAjax()) {
  511. $sort = input('sort', 0);
  512. $id = input('id', 0);
  513. $diy_view = new DiyViewModel();
  514. return $diy_view->modifyDiyViewSort($sort, $id);
  515. }
  516. }
  517. /**
  518. * 热区设置
  519. */
  520. public function heatMap()
  521. {
  522. return $this->fetch('diy/heat_map');
  523. }
  524. /**
  525. * 矢量图库
  526. * @return array|mixed
  527. */
  528. public function iconfont()
  529. {
  530. $diy_view = new DiyViewModel();
  531. $icon = input('icon', '');
  532. if (request()->isAjax()) {
  533. $type = input('type', 'icon'); // 图标类型
  534. $icon_list = $diy_view->getIconList($type);
  535. return $icon_list;
  536. } else {
  537. $icon_type = $diy_view->getIconType();
  538. $this->assign('icon_type', $icon_type);
  539. $this->assign('icon', $icon);
  540. return $this->fetch('diy/iconfont');
  541. }
  542. }
  543. /**
  544. * icon风格设置
  545. * @return mixed
  546. */
  547. public function iconStyleSet()
  548. {
  549. $icon = input('icon', '');
  550. $this->assign('icon', $icon);
  551. $this->assign('icon_style', ( new DiyViewModel() )->iconStyle());
  552. return $this->fetch('diy/icon_style');
  553. }
  554. public function selectIconStyle()
  555. {
  556. $icon = input('icon', '');
  557. $this->assign('icon', $icon);
  558. $this->assign('icon_style', ( new DiyViewModel() )->iconStyle());
  559. return $this->fetch('diy/select_icon_style');
  560. }
  561. public function selectLabel()
  562. {
  563. $this->assign('data', input());
  564. return $this->fetch('diy/select_label');
  565. }
  566. public function getImgIcon()
  567. {
  568. $data = input('data', '');
  569. $this->assign('data', urldecode($data));
  570. $this->assign('id', 'id_' . time() . mt_rand(0000, 9999));
  571. return $this->fetch('diy/icon_img_view');
  572. }
  573. }