DiyService.php 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | Niucloud-admin 企业快速开发的saas管理平台
  4. // +----------------------------------------------------------------------
  5. // | 官方网址:https://www.niucloud.com
  6. // +----------------------------------------------------------------------
  7. // | niucloud团队 版权所有 开源版本可自由商用
  8. // +----------------------------------------------------------------------
  9. // | Author: Niucloud Team
  10. // +----------------------------------------------------------------------
  11. namespace app\service\admin\diy;
  12. use app\dict\diy\ComponentDict;
  13. use app\dict\diy\LinkDict;
  14. use app\dict\diy\PagesDict;
  15. use app\dict\diy\TemplateDict;
  16. use app\model\addon\Addon;
  17. use app\model\diy\Diy;
  18. use app\model\diy\DiyTheme;
  19. use app\service\admin\sys\SystemService;
  20. use app\service\core\site\CoreSiteService;
  21. use core\base\BaseAdminService;
  22. use core\exception\AdminException;
  23. use Exception;
  24. use think\db\exception\DataNotFoundException;
  25. use think\db\exception\DbException;
  26. use think\db\exception\ModelNotFoundException;
  27. use think\facade\Db;
  28. /**
  29. * 自定义页面服务层
  30. * Class DiyService
  31. * @package app\service\admin\diy
  32. */
  33. class DiyService extends BaseAdminService
  34. {
  35. public function __construct()
  36. {
  37. parent::__construct();
  38. $this->model = new Diy();
  39. }
  40. /**
  41. * 获取自定义页面分页列表
  42. * @param array $where
  43. * @return array
  44. */
  45. public function getPage(array $where = [])
  46. {
  47. $where[] = [ 'site_id', '=', $this->site_id ];
  48. $field = 'id,site_id,title,page_title,name,template,type,mode,is_default,share,visit_count,create_time,update_time,value';
  49. $order = "update_time desc";
  50. $search_model = $this->model->where([ [ 'site_id', '=', $this->site_id ] ])->withSearch([ "title", "type", 'mode', 'addon_name' ], $where)->field($field)->order($order)->append([ 'type_name', 'type_page', 'addon_name' ]);
  51. return $this->pageQuery($search_model);
  52. }
  53. /**
  54. * 获取自定义页面分页列表,轮播搜索组件用
  55. * 查询微页面,数据排除存在轮播搜索组件的
  56. * @param array $where
  57. * @return array
  58. */
  59. public function getPageByCarouselSearch(array $where = [])
  60. {
  61. $where[] = [ 'site_id', '=', $this->site_id ];
  62. $field = 'id,site_id,title,page_title,name,template,type,mode,is_default,share,visit_count,create_time,update_time,value';
  63. $order = "update_time desc";
  64. $search_model = $this->model->whereOr([
  65. [
  66. [ 'type', '=', 'DIY_PAGE' ],
  67. [ 'site_id', '=', $this->site_id ],
  68. [ 'value', 'not in', [ 'top_fixed', 'right_fixed', 'bottom_fixed', 'left_fixed', 'fixed' ] ]
  69. ],
  70. [
  71. [ 'type', '<>', 'DIY_PAGE' ],
  72. [ 'site_id', '=', $this->site_id ],
  73. [ 'is_default', '=', 0 ],
  74. [ 'value', 'not in', [ 'top_fixed', 'right_fixed', 'bottom_fixed', 'left_fixed', 'fixed' ] ]
  75. ]
  76. ])->field($field)->order($order)->append([ 'type_name', 'type_page', 'addon_name' ]);
  77. return $this->pageQuery($search_model);
  78. }
  79. /**
  80. * 获取自定义页面列表
  81. * @param array $where
  82. * @param string $field
  83. * @return array
  84. * @throws DataNotFoundException
  85. * @throws DbException
  86. * @throws ModelNotFoundException
  87. */
  88. public function getList(array $where = [], $field = 'id,title,page_title,name,template,type,mode,is_default,share,visit_count,create_time,update_time')
  89. {
  90. $order = "update_time desc";
  91. return $this->model->where([ [ 'site_id', '=', $this->site_id ] ])->withSearch([ "title", "type", 'mode' ], $where)->field($field)->order($order)->select()->toArray();
  92. }
  93. /**
  94. * 获取自定义页面信息
  95. * @param int $id
  96. * @return array
  97. */
  98. public function getInfo(int $id)
  99. {
  100. $field = 'id,site_id,title,page_title,name,template,type,mode,value,is_default,is_change,share,visit_count';
  101. return $this->model->field($field)->where([ [ 'id', '=', $id ], [ 'site_id', '=', $this->site_id ] ])->findOrEmpty()->toArray();
  102. }
  103. public function getInfoByName(string $name)
  104. {
  105. $field = 'id,site_id,title,page_title,name,template,type,mode,value,is_default,is_change,share,visit_count';
  106. return $this->model->field($field)->where([ [ 'name', '=', $name ], [ 'site_id', '=', $this->site_id ], [ 'is_default', '=', 1 ] ])->findOrEmpty()->toArray();
  107. }
  108. /**
  109. * 查询数量
  110. * @param array $where
  111. * @return int
  112. * @throws DbException
  113. */
  114. public function getCount(array $where = [])
  115. {
  116. return $this->model->where([ [ 'site_id', '=', $this->site_id ] ])->withSearch([ 'type' ], $where)->count();
  117. }
  118. /**
  119. * 添加自定义页面
  120. * @param array $data
  121. * @return mixed
  122. */
  123. public function add(array $data)
  124. {
  125. $data[ 'site_id' ] = $data['site_id'] ?? $this->site_id;
  126. $data[ 'create_time' ] = time();
  127. $data[ 'update_time' ] = time();
  128. // 添加新页面,默认为1
  129. if (!empty($data[ 'type' ]) && $data[ 'type' ] == 'DIY_PAGE') {
  130. $data[ 'is_default' ] = 1;
  131. }
  132. // 将同类型页面的默认值改为0,默认页面只有一个
  133. if (!empty($data[ 'is_default' ])) {
  134. $this->model->where([ [ 'name', '=', $data[ 'name' ] ], [ 'site_id', '=', $data[ 'site_id' ] ] ])->update([ 'is_default' => 0 ]);
  135. }
  136. $res = $this->model->create($data);
  137. return $res->id;
  138. }
  139. /**
  140. * 编辑自定义页面
  141. * @param int $id
  142. * @param array $data
  143. * @return bool
  144. */
  145. public function edit(int $id, array $data)
  146. {
  147. $data[ 'update_time' ] = time();
  148. $this->model->where([ [ 'id', '=', $id ], [ 'site_id', '=', $this->site_id ] ])->update($data);
  149. return true;
  150. }
  151. /**
  152. * 删除自定义页面
  153. * @param int $id
  154. * @return bool
  155. */
  156. public function del(int $id)
  157. {
  158. return $this->model->where([ [ 'id', '=', $id ], [ 'site_id', '=', $this->site_id ] ])->delete();
  159. }
  160. /**
  161. * 设为使用
  162. * @param int $id
  163. * @return bool
  164. * @throws Exception
  165. */
  166. public function setUse(int $id)
  167. {
  168. try {
  169. $info = $this->getInfo($id);
  170. if (empty($info)) {
  171. return false;
  172. }
  173. Db::startTrans();
  174. $this->model->where([ [ 'name', '=', $info[ 'name' ] ], [ 'site_id', '=', $this->site_id ] ])->update([ 'is_default' => 0 ]);
  175. $this->model->where([ [ 'id', '=', $id ], [ 'site_id', '=', $this->site_id ] ])->update([ 'is_default' => 1, 'update_time' => time() ]);
  176. Db::commit();
  177. return true;
  178. } catch (Exception $e) {
  179. Db::rollback();
  180. throw new AdminException($e->getMessage());
  181. }
  182. }
  183. /**
  184. * 页面加载初始化
  185. * @param array $params
  186. * @return array
  187. * @throws DbException
  188. */
  189. public function getInit(array $params = [])
  190. {
  191. $template = $this->getTemplate();
  192. $time = time();
  193. $data = [];
  194. if (!empty($params[ 'id' ])) {
  195. $data = $this->getInfo($params[ 'id' ]);
  196. } elseif (!empty($params[ 'name' ])) {
  197. $data = $this->getInfoByName($params[ 'name' ]);
  198. }
  199. if (!empty($params[ 'name' ])) {
  200. // 查询启动页配置
  201. $diy_config_service = new DiyConfigService();
  202. $start_up_page = $diy_config_service->getStartUpPageConfig($params[ 'name' ]);
  203. if (!empty($start_up_page)) {
  204. if (!empty($start_up_page[ 'parent' ]) && $start_up_page[ 'parent' ] == 'DIY_PAGE') {
  205. $id = str_replace('/app/pages/index/diy?id=', '', $start_up_page[ 'page' ]);
  206. $data = $this->getInfo($id);
  207. if (!empty($data)) {
  208. $params[ 'name' ] = $data[ 'name' ];
  209. $params[ 'type' ] = $data[ 'type' ];
  210. }
  211. }
  212. }
  213. }
  214. if (!empty($data)) {
  215. // 编辑赋值
  216. if (isset($template[ $data[ 'type' ] ])) {
  217. $page = $template[ $data[ 'type' ] ];
  218. $data[ 'type_name' ] = $page[ 'title' ];
  219. $data[ 'page' ] = $page[ 'page' ];
  220. }
  221. } else {
  222. // 新页面赋值
  223. $page_title = $params[ 'title' ] ? : '页面' . $time; // 页面标题(用于前台展示)
  224. $type = $params[ 'type' ] ? : 'DIY_PAGE';
  225. $name = $type == 'DIY_PAGE' ? 'DIY_PAGE_RANDOM_' . $time : $type;
  226. $title = $page_title;
  227. $type_name = '';
  228. $template_name = ''; // 页面模板名称
  229. $page_route = ''; // 页面路径
  230. $mode = 'diy'; // 页面模式,diy:自定义,fixed:固定
  231. $value = '';
  232. $is_default = 0;
  233. // 查询默认第一个页面模板数据
  234. if (isset($template[ $params[ 'name' ] ])) {
  235. $page = $template[ $params[ 'name' ] ];
  236. $name = $params[ 'name' ];
  237. $type = $params[ 'name' ];
  238. $page_title = $page[ 'title' ];
  239. $type_name = $page[ 'title' ];
  240. $page_route = $page[ 'page' ];
  241. $page_data = $this->getFirstPageData($type);
  242. if (!empty($page_data)) {
  243. $value = json_encode($page_data[ 'data' ], JSON_UNESCAPED_UNICODE);
  244. $is_default = 1;
  245. $template_name = $page_data[ 'template' ];
  246. $mode = $page_data[ 'mode' ];
  247. }
  248. } else if (isset($template[ $type ])) {
  249. // 查询指定页面数据
  250. $page = $template[ $type ];
  251. $type_name = $page[ 'title' ];
  252. $page_route = $page[ 'page' ];
  253. // 如果页面类型一条数据也没有,那么要默认 使用中
  254. $count = $this->getCount([ 'type' => $type ]);
  255. if ($count == 0) {
  256. $is_default = 1;
  257. }
  258. }
  259. // 页面标题(用于前台展示)
  260. if ($type != 'DIY_PAGE') {
  261. $title = $type_name;
  262. }
  263. $data = [
  264. 'name' => $name,
  265. 'page_title' => $page_title, // 页面名称(用于后台展示)
  266. 'title' => $title, // 页面标题(用于前台展示)
  267. 'type' => $type,
  268. 'type_name' => $type_name,
  269. 'template' => $template_name,
  270. 'page' => $page_route,
  271. 'mode' => $mode,
  272. 'value' => $value,
  273. 'is_default' => $is_default
  274. ];
  275. }
  276. $data[ 'component' ] = $this->getComponentList($data[ 'type' ]);
  277. $data[ 'domain_url' ] = ( new SystemService() )->getUrl();
  278. return $data;
  279. }
  280. /**
  281. * 获取组件列表
  282. * @param string $name 支持页面标识
  283. * @return array
  284. */
  285. public function getComponentList(string $name = '')
  286. {
  287. $data = ComponentDict::getComponent();
  288. foreach ($data as $k => $v) {
  289. // 查询组件支持的页面
  290. $sort_arr = [];
  291. foreach ($v[ 'list' ] as $ck => $cv) {
  292. $support_page = $cv[ 'support_page' ];
  293. if (!( count($support_page) == 0 || in_array($name, $support_page) )) {
  294. unset($data[ $k ][ 'list' ][ $ck ]);
  295. continue;
  296. }
  297. //店铺端不需要展示排行榜、甄选好店组件,排除掉
  298. if ($this->site_id > 0) {
  299. if (in_array($ck, ['MallGoodsRanking', 'MallShopList'])) {
  300. unset($data[ $k ][ 'list' ][ $ck ]);
  301. continue;
  302. }
  303. }
  304. $sort_arr [] = $cv[ 'sort' ];
  305. unset($data[ $k ][ 'list' ][ $ck ][ 'sort' ], $data[ $k ][ 'list' ][ $ck ][ 'support_page' ]);
  306. }
  307. array_multisort($sort_arr, SORT_ASC, $data[ $k ][ 'list' ]); //排序,根据 sort 排序
  308. }
  309. return $data;
  310. }
  311. /**
  312. * 获取自定义链接
  313. * @return array
  314. * @throws DataNotFoundException
  315. * @throws DbException
  316. * @throws ModelNotFoundException
  317. */
  318. public function getLink()
  319. {
  320. $link = LinkDict::getLink();
  321. foreach ($link as $k => $v) {
  322. $link[ $k ][ 'name' ] = $k;
  323. if (!empty($v[ 'child_list' ])) {
  324. foreach ($v[ 'child_list' ] as $ck => $cv) {
  325. $link[ $k ][ 'child_list' ][ $ck ][ 'parent' ] = $k;
  326. }
  327. }
  328. // 查询自定义页面
  329. if ($k == 'DIY_PAGE') {
  330. $order = "update_time desc";
  331. $field = 'id,title,page_title,name,template,type,mode,is_default,share,visit_count,create_time,update_time';
  332. $list = $this->model
  333. ->whereOr([
  334. [
  335. [ 'type', '=', 'DIY_PAGE' ],
  336. [ 'site_id', '=', $this->site_id ],
  337. ],
  338. [
  339. [ 'type', '<>', 'DIY_PAGE' ],
  340. [ 'site_id', '=', $this->site_id ],
  341. [ 'is_default', '=', 0 ]
  342. ]
  343. ])->field($field)->order($order)->select()->toArray();
  344. foreach ($list as $ck => $cv) {
  345. $link[ $k ][ 'child_list' ][] = [
  346. 'name' => $cv[ 'name' ],
  347. 'title' => $cv[ 'page_title' ],
  348. 'url' => '/app/pages/index/diy?id=' . $cv[ 'id' ]
  349. ];
  350. }
  351. }
  352. if ($k == 'DIY_LINK') {
  353. $link[ $k ][ 'parent' ] = 'DIY_LINK';
  354. }
  355. }
  356. return $link;
  357. }
  358. /**
  359. * 修改分享内容
  360. * @param int $id
  361. * @param $data
  362. * @return bool
  363. */
  364. public function modifyShare(int $id, $data)
  365. {
  366. $this->model->where([ [ 'id', '=', $id ], [ 'site_id', '=', $this->site_id ] ])->update([ 'share' => $data[ 'share' ] ]);
  367. return true;
  368. }
  369. /**
  370. * 获取页面模板
  371. * @param array $params
  372. * @return array
  373. */
  374. public function getTemplate($params = [])
  375. {
  376. $page_template = TemplateDict::getTemplate($params);
  377. foreach ($page_template as $k => $v) {
  378. // 查询页面数据
  379. $page_params = [
  380. 'type' => $k, // 页面类型
  381. 'mode' => $params[ 'mode' ] ?? '' // 页面模式:diy:自定义,fixed:固定
  382. ];
  383. $page_template[ $k ][ 'template' ] = PagesDict::getPages($page_params);
  384. }
  385. return $page_template;
  386. }
  387. /**
  388. * 获取页面数据
  389. * @param $type
  390. * @param $name
  391. * @return array
  392. */
  393. public function getPageData($type, $name)
  394. {
  395. $pages = PagesDict::getPages([ 'type' => $type ]);
  396. return $pages[ $name ] ?? [];
  397. }
  398. /**
  399. * 获取默认页面数据
  400. * @param $type
  401. * @param string $addon
  402. * @return array|mixed
  403. */
  404. public function getFirstPageData($type, $addon = '')
  405. {
  406. $pages = PagesDict::getPages([ 'type' => $type, 'addon' => $addon ]);
  407. if (!empty($pages)) {
  408. $template = array_key_first($pages);
  409. $page = array_shift($pages);
  410. $page[ 'template' ] = $template;
  411. $page[ 'type' ] = $type;
  412. return $page;
  413. }
  414. return [];
  415. }
  416. /**
  417. * 获取页面装修列表
  418. * @param $params
  419. * @return array
  420. * @throws DataNotFoundException
  421. * @throws DbException
  422. * @throws ModelNotFoundException
  423. */
  424. public function getDecoratePage($params)
  425. {
  426. // 查询当前装修的页面信息
  427. $template = $this->getTemplate([ 'action' => 'decorate', 'key' => [ $params[ 'type' ] ] ])[ $params[ 'type' ] ];
  428. $template[ 'domain_url' ] = ( new SystemService() )->getUrl();
  429. // 查询默认页面数据
  430. $default_page_data = $this->getFirstPageData($params[ 'type' ]);
  431. $use_template = [
  432. 'type' => $params[ 'type' ], // 页面类型标识
  433. 'name' => '', // 链接标识
  434. 'parent' => '', // 链接标识
  435. 'title' => $default_page_data[ 'title' ] ?? '', // 模板名称
  436. 'cover' => $default_page_data[ 'cover' ] ?? '', // 封面图
  437. 'url' => '', // 自定义页面链接,实时预览效果
  438. 'page' => $template[ 'page' ], // 页面地址
  439. 'action' => $template[ 'action' ] // 是否存在操作,decorate 表示支持装修
  440. ];
  441. // 查询启动页配置
  442. $diy_config_service = new DiyConfigService();
  443. $start_up_page = $diy_config_service->getStartUpPageConfig($params[ 'type' ]);
  444. // 查询页面数据
  445. $info = $this->getInfoByName($params[ 'type' ]);
  446. if (!empty($start_up_page)) {
  447. $use_template[ 'title' ] = $start_up_page[ 'title' ] ?? '';
  448. $use_template[ 'name' ] = $start_up_page[ 'name' ] ?? '';
  449. $use_template[ 'page' ] = $start_up_page[ 'page' ] ?? '';
  450. $use_template[ 'action' ] = $start_up_page[ 'action' ] ?? '';
  451. $use_template[ 'url' ] = $use_template[ 'page' ];
  452. $use_template[ 'parent' ] = $start_up_page[ 'parent' ] ?? '';
  453. } elseif (!empty($info)) {
  454. $use_template[ 'id' ] = $info[ 'id' ];
  455. $use_template[ 'title' ] = $info[ 'title' ];
  456. // 查询模板页面数据
  457. $page_data = $this->getPageData($params[ 'type' ], $info[ 'template' ]);
  458. if (!empty($page_data)) {
  459. $use_template[ 'url' ] = $template[ 'page' ] . '?id=' . $info[ 'id' ];
  460. // $use_template[ 'cover' ] = $page_data[ 'cover' ]; // 默认图
  461. } else {
  462. // 自定义页面,实时预览效果
  463. $use_template[ 'url' ] = '/app/pages/index/diy?id=' . $info[ 'id' ];
  464. // 清空模板信息
  465. $use_template[ 'cover' ] = ''; // 默认图
  466. }
  467. }
  468. // 查询链接的名称标识,保证数据准确性
  469. $other_page = ( new DiyRouteService() )->getList([ 'url' => $use_template[ 'page' ] ]);
  470. if (!empty($other_page)) {
  471. $use_template[ 'title' ] = $other_page[ 0 ][ 'title' ] ?? '';
  472. $use_template[ 'name' ] = $other_page[ 0 ][ 'name' ];
  473. $use_template[ 'parent' ] = $other_page[ 0 ][ 'parent' ];
  474. $use_template[ 'action' ] = $other_page[ 0 ][ 'action' ];
  475. }
  476. // 如果没有预览图,并且没有地址,则赋值默认页面地址
  477. if (empty($use_template[ 'cover' ]) && empty($use_template[ 'url' ])) {
  478. $use_template[ 'url' ] = $template[ 'page' ];
  479. } elseif (empty($use_template[ 'url' ])) {
  480. $use_template[ 'url' ] = $template[ 'page' ];
  481. }
  482. $template[ 'use_template' ] = $use_template;
  483. return $template;
  484. }
  485. /**
  486. * 设置启动页
  487. * @param array $params
  488. * @return \app\model\sys\SysConfig|bool|\think\Model
  489. */
  490. public function changeTemplate(array $params = [])
  491. {
  492. $start_up_page_data = [
  493. 'type' => $params[ 'type' ], // 页面类型
  494. 'name' => $params[ 'name' ], // 链接名称标识
  495. 'parent' => $params[ 'parent' ], // 链接父级名称标识
  496. 'page' => $params[ 'page' ], // 链接路由
  497. 'title' => $params[ 'title' ], // 链接标题
  498. 'action' => $params[ 'action' ] // 是否存在操作,decorate 表示支持装修
  499. ];
  500. $diy_config_service = new DiyConfigService();
  501. $res = $diy_config_service->setStartUpPageConfig($start_up_page_data);
  502. return $res;
  503. }
  504. /**
  505. * 获取模板页面(存在的应用插件列表)
  506. * @return array
  507. */
  508. public function getApps()
  509. {
  510. $page_template = TemplateDict::getTemplate([
  511. 'query' => 'addon'
  512. ]);
  513. return $page_template;
  514. }
  515. /**
  516. * 获取自定义主题配色
  517. * @return array
  518. */
  519. public function getDiyTheme()
  520. {
  521. $site_addon = ( new CoreSiteService() )->getSiteCache($this->site_id);
  522. $theme_data = ( new DiyTheme() )->where([['site_id', '=', $this->site_id], ['type', '=', 'app'], ['is_selected', '=', 1]])->column('id,title,theme','addon');
  523. $system_theme = array_values(array_filter(event('ThemeColor', [ 'key' => 'app'])))[0] ?? [];
  524. $app_theme['app'] = [
  525. 'id' => $theme_data['app']['id'] ?? '',
  526. 'icon' => '',
  527. 'addon_title' => '系统',
  528. 'title' => $theme_data['app']['title'] ?? (!empty($system_theme) ? $system_theme['theme_color'][0]['title'] : ''),
  529. 'theme' => $theme_data['app']['theme'] ?? (!empty($system_theme) ? $system_theme['theme_color'][0]['theme'] : '')
  530. ];
  531. $data = [];
  532. foreach ($site_addon[ 'apps' ] as $value){
  533. $addon_theme = array_values(array_filter(event('ThemeColor', [ 'key' => $value['key']])))[0] ?? [];
  534. if (!empty($addon_theme) && !empty($addon_theme['theme_color'])) {
  535. $data[$value['key']]['id'] = $theme_data[$value['key']]['id'] ?? '';
  536. $data[$value['key']]['icon'] = $value['icon'] ?? '';
  537. $data[$value['key']]['addon_title'] = $value['title'] ?? '';
  538. $data[$value['key']]['title'] = $theme_data[$value['key']]['title'] ?? $addon_theme['theme_color'][0][ 'title' ];
  539. $data[$value['key']]['theme'] = $theme_data[$value['key']]['theme'] ?? $addon_theme['theme_color'][0][ 'theme' ];
  540. }
  541. }
  542. if (empty($data) || count($site_addon[ 'apps' ]) > 1) {// 应用数量大于1时,展示系统主题色设置,只有一个应用时,不展示系统主题色设置
  543. $data = array_merge($app_theme,$data);
  544. }
  545. return $data;
  546. }
  547. /**
  548. * 设置主题配色
  549. * @param array $data
  550. * @return bool
  551. */
  552. public function setDiyTheme($data)
  553. {
  554. $diy_theme_model = new DiyTheme();
  555. $diy_theme_count = $diy_theme_model->where([['id', '=', $data['id']], ['site_id', '=', $this->site_id]])->count();
  556. if ($diy_theme_count == 0) throw new AdminException("DIY_THEME_COLOR_NOT_EXIST");
  557. // 应用选择主题色(is_selected)发生变更时,主应用下的插件也同步发生变更
  558. $addon_data = (new addon())->field('key')->where([['support_app', '=', $data['addon']]])->select()->toArray();
  559. $addon_save_data = [];
  560. if (!empty($addon_data)){
  561. foreach ($addon_data as $value){
  562. $addon_save_data[] = [
  563. 'site_id' => $this->site_id,
  564. 'type' => 'addon',
  565. 'addon' => $value['key'],
  566. 'title' => $data['title'],
  567. 'theme' => $data['theme'],
  568. 'new_theme' => $data['new_theme'],
  569. 'is_selected' => 1,
  570. 'update_time' => time(),
  571. ];
  572. }
  573. }
  574. try {
  575. Db::startTrans();
  576. if(!empty($data['id'])){
  577. $diy_theme_model->where([['addon', '=', $data['addon']], ['is_selected', '=', 1], ['site_id', '=', $this->site_id]])->update(['is_selected' => 0]);
  578. $data['is_selected'] = 1;
  579. $data['update_time'] = time();
  580. $diy_theme_model->where([['id', '=', $data['id']], ['site_id', '=', $this->site_id]])->update($data);
  581. if (!empty($addon_save_data)){
  582. foreach ($addon_save_data as $value){
  583. $diy_theme_model->where([['addon', '=', $value['addon']], ['is_selected', '=', 1], ['site_id', '=', $this->site_id]])->update(['is_selected' => 0]);
  584. $diy_theme_model->where([['addon', '=', $value['addon']], ['title', '=', $data['title']], ['site_id', '=', $this->site_id]])->update($value);
  585. }
  586. }
  587. }
  588. Db::commit();
  589. return true;
  590. } catch (Exception $e) {
  591. Db::rollback();
  592. throw new AdminException($e->getMessage());
  593. }
  594. }
  595. /**
  596. * 获取默认主题配色
  597. * @return array
  598. */
  599. public function getDefaultThemeColor($data)
  600. {
  601. $theme_list = ( new DiyTheme() )->field('id,title,addon,default_theme,theme,new_theme,theme_type')->where([['site_id', '=', $this->site_id], ['addon', '=', $data['addon']]])->select()->toArray();
  602. foreach ($theme_list as &$value) {
  603. $addon_theme = array_values(array_filter(event('ThemeColor', [ 'key' => $value['addon'] ])))[0] ?? [];
  604. if (!empty($addon_theme) && !empty($addon_theme['theme_field'])) {
  605. $value['theme_field'] = $addon_theme['theme_field'];//返回各个应用的主题颜色字段
  606. }
  607. }
  608. return $theme_list;
  609. }
  610. /**
  611. * 添加自定义主题配色
  612. * @param array $data
  613. * @return bool
  614. */
  615. public function addDiyTheme($data)
  616. {
  617. // 主应用添加自定义主题色时,主应用下的插件也同步添加自定义主题色
  618. $addon_data = (new addon())->field('key')->where([['support_app', '=', $data['addon']]])->select()->toArray();
  619. $addon_save_data = [];
  620. if (!empty($addon_data)){
  621. foreach ($addon_data as $value){
  622. $addon_save_data[] = [
  623. 'site_id' => $this->site_id,
  624. 'type' => 'addon',
  625. 'addon' => $value['key'],
  626. 'title' => $data['title'],
  627. 'default_theme' => $data['default_theme'],
  628. 'theme' => $data['theme'],
  629. 'new_theme' => $data['new_theme'],
  630. 'theme_type' => 'diy',
  631. 'create_time' => time(),
  632. ];
  633. }
  634. }
  635. Db::startTrans();
  636. try {
  637. $data[ 'site_id' ] = $this->site_id;
  638. $data[ 'type' ] = 'app';
  639. $data[ 'theme_type' ] = 'diy';
  640. $data[ 'create_time' ] = time();
  641. $diy_theme_model = new DiyTheme();
  642. $diy_theme_model->create($data);
  643. if (!empty($addon_save_data)){
  644. $diy_theme_model->insertAll($addon_save_data);
  645. }
  646. Db::commit();
  647. return true;
  648. } catch (Exception $e) {
  649. Db::rollback();
  650. throw new AdminException($e->getMessage());
  651. }
  652. }
  653. /**
  654. * 编辑自定义主题配色
  655. * @param int $id
  656. * @param array $data
  657. * @return bool
  658. */
  659. public function editDiyTheme(int $id, array $data)
  660. {
  661. $diy_theme_model = new DiyTheme();
  662. $diy_theme_info = $diy_theme_model->field('title')->where([ [ 'id', '=', $id ], [ 'site_id', '=', $this->site_id ] ])->findOrEmpty()->toArray();
  663. if (empty($diy_theme_info)) throw new AdminException("DIY_THEME_COLOR_NOT_EXIST");
  664. // 主应用主题颜色发生改变时,主应用下的插件也同步更新主题颜色
  665. $addon_data = $diy_theme_model->field('id')->where([ [ 'title', '=', $diy_theme_info['title'] ], [ 'type', '=', 'addon' ], [ 'site_id', '=', $this->site_id ] ])->select()->toArray();
  666. $addon_save_data = [];
  667. if (!empty($addon_data)){
  668. foreach ($addon_data as $value){
  669. $addon_save_data[] = [
  670. 'id' => $value['id'],
  671. 'title' => $data['title'],
  672. 'theme' => $data['theme'],
  673. 'new_theme' => $data['new_theme'],
  674. 'update_time' => time(),
  675. ];
  676. }
  677. }
  678. Db::startTrans();
  679. try {
  680. $data[ 'update_time' ] = time();
  681. $diy_theme_model->where([ [ 'id', '=', $id ], [ 'site_id', '=', $this->site_id ] ])->update($data);
  682. if (!empty($addon_save_data)){
  683. $diy_theme_model->saveAll($addon_save_data);
  684. }
  685. Db::commit();
  686. return true;
  687. } catch (Exception $e) {
  688. Db::rollback();
  689. throw new AdminException($e->getMessage());
  690. }
  691. }
  692. /**
  693. * 删除自定义主题配色
  694. * @param int $id
  695. * @return bool
  696. */
  697. public function delDiyTheme(int $id)
  698. {
  699. $diy_theme_model = new DiyTheme();
  700. $diy_theme_info = $diy_theme_model->field('title,theme_type,is_selected')->where([ [ 'id', '=', $id ], [ 'site_id', '=', $this->site_id ] ])->findOrEmpty()->toArray();
  701. if (empty($diy_theme_info)) throw new AdminException("DIY_THEME_COLOR_NOT_EXIST");
  702. if ($diy_theme_info['theme_type'] == 'default') throw new AdminException("DIY_THEME_DEFAULT_COLOR_CAN_NOT_DELETE");
  703. if ($diy_theme_info['is_selected'] == 1) throw new AdminException("DIY_THEME_SELECTED_CAN_NOT_DELETE");
  704. $res = $diy_theme_model->where([ [ 'title', '=', $diy_theme_info['title'] ], [ 'site_id', '=', $this->site_id ] ])->delete();
  705. return $res;
  706. }
  707. /**
  708. * 检测自定义主题配色名称唯一性
  709. * @param array $data
  710. * @return bool
  711. */
  712. public function checkDiyThemeTitleUnique($data)
  713. {
  714. $where = [
  715. [ 'title', "=", $data[ 'title' ] ],
  716. [ 'addon', "=", $data['addon'] ],
  717. [ 'site_id', "=", $this->site_id ]
  718. ];
  719. if (!empty($data[ 'id' ])) {
  720. $where[] = [ 'id', "<>", $data[ 'id' ] ];
  721. }
  722. $diy_theme_model = new DiyTheme();
  723. return $diy_theme_model->where($where)->count() > 0;
  724. }
  725. }