123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556 |
- <?php
- // +----------------------------------------------------------------------
- // | Niucloud-admin 企业快速开发的saas管理平台
- // +----------------------------------------------------------------------
- // | 官方网址:https://www.niucloud.com
- // +----------------------------------------------------------------------
- // | niucloud团队 版权所有 开源版本可自由商用
- // +----------------------------------------------------------------------
- // | Author: Niucloud Team
- // +----------------------------------------------------------------------
- namespace app\service\admin\diy;
- use app\dict\diy\ComponentDict;
- use app\dict\diy\LinkDict;
- use app\dict\diy\PagesDict;
- use app\dict\diy\TemplateDict;
- use app\model\diy\Diy;
- use app\service\admin\sys\SystemService;
- use core\base\BaseAdminService;
- use core\exception\AdminException;
- use Exception;
- use think\db\exception\DataNotFoundException;
- use think\db\exception\DbException;
- use think\db\exception\ModelNotFoundException;
- use think\facade\Db;
- /**
- * 自定义页面服务层
- * Class DiyService
- * @package app\service\admin\diy
- */
- class DiyService extends BaseAdminService
- {
- public function __construct()
- {
- parent::__construct();
- $this->model = new Diy();
- }
- /**
- * 获取自定义页面分页列表
- * @param array $where
- * @return array
- */
- public function getPage(array $where = [])
- {
- $where[] = [ 'site_id', '=', $this->site_id ];
- $field = 'id,site_id,title,page_title,name,template,type,mode,is_default,share,visit_count,create_time,update_time,value';
- $order = "update_time desc";
- $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' ]);
- return $this->pageQuery($search_model);
- }
- /**
- * 获取自定义页面分页列表,轮播搜索组件用
- * 查询微页面,数据排除存在轮播搜索组件的
- * @param array $where
- * @return array
- */
- public function getPageByCarouselSearch(array $where = [])
- {
- $where[] = [ 'site_id', '=', $this->site_id ];
- $field = 'id,site_id,title,page_title,name,template,type,mode,is_default,share,visit_count,create_time,update_time,value';
- $order = "update_time desc";
- $search_model = $this->model->whereOr([
- [
- [ 'type', '=', 'DIY_PAGE' ],
- [ 'site_id', '=', $this->site_id ],
- [ 'value', 'not in', [ 'top_fixed', 'right_fixed', 'bottom_fixed', 'left_fixed', 'fixed' ] ]
- ],
- [
- [ 'type', '<>', 'DIY_PAGE' ],
- [ 'site_id', '=', $this->site_id ],
- [ 'is_default', '=', 0 ],
- [ 'value', 'not in', [ 'top_fixed', 'right_fixed', 'bottom_fixed', 'left_fixed', 'fixed' ] ]
- ]
- ])->field($field)->order($order)->append([ 'type_name', 'type_page', 'addon_name' ]);
- return $this->pageQuery($search_model);
- }
- /**
- * 获取自定义页面列表
- * @param array $where
- * @param string $field
- * @return array
- * @throws DataNotFoundException
- * @throws DbException
- * @throws ModelNotFoundException
- */
- public function getList(array $where = [], $field = 'id,title,page_title,name,template,type,mode,is_default,share,visit_count,create_time,update_time')
- {
- $order = "update_time desc";
- return $this->model->where([ [ 'site_id', '=', $this->site_id ] ])->withSearch([ "title", "type", 'mode' ], $where)->field($field)->order($order)->select()->toArray();
- }
- /**
- * 获取自定义页面信息
- * @param int $id
- * @return array
- */
- public function getInfo(int $id)
- {
- $field = 'id,site_id,title,page_title,name,template,type,mode,value,is_default,is_change,share,visit_count';
- return $this->model->field($field)->where([ [ 'id', '=', $id ], [ 'site_id', '=', $this->site_id ] ])->findOrEmpty()->toArray();
- }
- public function getInfoByName(string $name)
- {
- $field = 'id,site_id,title,page_title,name,template,type,mode,value,is_default,is_change,share,visit_count';
- return $this->model->field($field)->where([ [ 'name', '=', $name ], [ 'site_id', '=', $this->site_id ], [ 'is_default', '=', 1 ] ])->findOrEmpty()->toArray();
- }
- /**
- * 查询数量
- * @param array $where
- * @return int
- * @throws DbException
- */
- public function getCount(array $where = [])
- {
- return $this->model->where([ [ 'site_id', '=', $this->site_id ] ])->withSearch([ 'type' ], $where)->count();
- }
- /**
- * 添加自定义页面
- * @param array $data
- * @return mixed
- */
- public function add(array $data)
- {
- $data[ 'site_id' ] = $this->site_id;
- $data[ 'create_time' ] = time();
- $data[ 'update_time' ] = time();
- // 添加新页面,默认为1
- if (!empty($data[ 'type' ]) && $data[ 'type' ] == 'DIY_PAGE') {
- $data[ 'is_default' ] = 1;
- }
- // 将同类型页面的默认值改为0,默认页面只有一个
- if (!empty($data[ 'is_default' ])) {
- $this->model->where([ [ 'name', '=', $data[ 'name' ] ], [ 'site_id', '=', $data[ 'site_id' ] ] ])->update([ 'is_default' => 0 ]);
- }
- $res = $this->model->create($data);
- return $res->id;
- }
- /**
- * 编辑自定义页面
- * @param int $id
- * @param array $data
- * @return bool
- */
- public function edit(int $id, array $data)
- {
- $data[ 'update_time' ] = time();
- $this->model->where([ [ 'id', '=', $id ], [ 'site_id', '=', $this->site_id ] ])->update($data);
- return true;
- }
- /**
- * 删除自定义页面
- * @param int $id
- * @return bool
- */
- public function del(int $id)
- {
- return $this->model->where([ [ 'id', '=', $id ], [ 'site_id', '=', $this->site_id ] ])->delete();
- }
- /**
- * 设为使用
- * @param int $id
- * @return bool
- * @throws Exception
- */
- public function setUse(int $id)
- {
- try {
- $info = $this->getInfo($id);
- if (empty($info)) {
- return false;
- }
- Db::startTrans();
- $this->model->where([ [ 'name', '=', $info[ 'name' ] ], [ 'site_id', '=', $this->site_id ] ])->update([ 'is_default' => 0 ]);
- $this->model->where([ [ 'id', '=', $id ], [ 'site_id', '=', $this->site_id ] ])->update([ 'is_default' => 1, 'update_time' => time() ]);
- Db::commit();
- return true;
- } catch (Exception $e) {
- Db::rollback();
- throw new AdminException($e->getMessage());
- }
- }
- /**
- * 页面加载初始化
- * @param array $params
- * @return array
- * @throws DbException
- */
- public function getInit(array $params = [])
- {
- $template = $this->getTemplate();
- $time = time();
- $data = [];
- if (!empty($params[ 'id' ])) {
- $data = $this->getInfo($params[ 'id' ]);
- } elseif (!empty($params[ 'name' ])) {
- $data = $this->getInfoByName($params[ 'name' ]);
- }
- if (!empty($params[ 'name' ])) {
- // 查询启动页配置
- $diy_config_service = new DiyConfigService();
- $start_up_page = $diy_config_service->getStartUpPageConfig($params[ 'name' ]);
- if (!empty($start_up_page)) {
- if (!empty($start_up_page[ 'parent' ]) && $start_up_page[ 'parent' ] == 'DIY_PAGE') {
- $id = str_replace('/app/pages/index/diy?id=', '', $start_up_page[ 'page' ]);
- $data = $this->getInfo($id);
- if (!empty($data)) {
- $params[ 'name' ] = $data[ 'name' ];
- $params[ 'type' ] = $data[ 'type' ];
- }
- }
- }
- }
- if (!empty($data)) {
- // 编辑赋值
- if (isset($template[ $data[ 'type' ] ])) {
- $page = $template[ $data[ 'type' ] ];
- $data[ 'type_name' ] = $page[ 'title' ];
- $data[ 'page' ] = $page[ 'page' ];
- }
- } else {
- // 新页面赋值
- $page_title = $params[ 'title' ] ? : '页面' . $time; // 页面标题(用于前台展示)
- $type = $params[ 'type' ] ? : 'DIY_PAGE';
- $name = $type == 'DIY_PAGE' ? 'DIY_PAGE_RANDOM_' . $time : $type;
- $title = $page_title;
- $type_name = '';
- $template_name = ''; // 页面模板名称
- $page_route = ''; // 页面路径
- $mode = 'diy'; // 页面模式,diy:自定义,fixed:固定
- $value = '';
- $is_default = 0;
- // 查询默认第一个页面模板数据
- if (isset($template[ $params[ 'name' ] ])) {
- $page = $template[ $params[ 'name' ] ];
- $name = $params[ 'name' ];
- $type = $params[ 'name' ];
- $page_title = $page[ 'title' ];
- $type_name = $page[ 'title' ];
- $page_route = $page[ 'page' ];
- $page_data = $this->getFirstPageData($type);
- if (!empty($page_data)) {
- $value = json_encode($page_data[ 'data' ], JSON_UNESCAPED_UNICODE);
- $is_default = 1;
- $template_name = $page_data[ 'template' ];
- $mode = $page_data[ 'mode' ];
- }
- } else if (isset($template[ $type ])) {
- // 查询指定页面数据
- $page = $template[ $type ];
- $type_name = $page[ 'title' ];
- $page_route = $page[ 'page' ];
- // 如果页面类型一条数据也没有,那么要默认 使用中
- $count = $this->getCount([ 'type' => $type ]);
- if ($count == 0) {
- $is_default = 1;
- }
- }
- // 页面标题(用于前台展示)
- if ($type != 'DIY_PAGE') {
- $title = $type_name;
- }
- $data = [
- 'name' => $name,
- 'page_title' => $page_title, // 页面名称(用于后台展示)
- 'title' => $title, // 页面标题(用于前台展示)
- 'type' => $type,
- 'type_name' => $type_name,
- 'template' => $template_name,
- 'page' => $page_route,
- 'mode' => $mode,
- 'value' => $value,
- 'is_default' => $is_default
- ];
- }
- $data[ 'component' ] = $this->getComponentList($data[ 'type' ]);
- $data[ 'domain_url' ] = ( new SystemService() )->getUrl();
- return $data;
- }
- /**
- * 获取组件列表
- * @param string $name 支持页面标识
- * @return array
- */
- public function getComponentList(string $name = '')
- {
- $data = ComponentDict::getComponent();
- foreach ($data as $k => $v) {
- // 查询组件支持的页面
- $sort_arr = [];
- foreach ($v[ 'list' ] as $ck => $cv) {
- $support_page = $cv[ 'support_page' ];
- if (!( count($support_page) == 0 || in_array($name, $support_page) )) {
- unset($data[ $k ][ 'list' ][ $ck ]);
- continue;
- }
- $sort_arr [] = $cv[ 'sort' ];
- unset($data[ $k ][ 'list' ][ $ck ][ 'sort' ], $data[ $k ][ 'list' ][ $ck ][ 'support_page' ]);
- }
- array_multisort($sort_arr, SORT_ASC, $data[ $k ][ 'list' ]); //排序,根据 sort 排序
- }
- return $data;
- }
- /**
- * 获取自定义链接
- * @return array
- * @throws DataNotFoundException
- * @throws DbException
- * @throws ModelNotFoundException
- */
- public function getLink()
- {
- $link = LinkDict::getLink();
- foreach ($link as $k => $v) {
- $link[ $k ][ 'name' ] = $k;
- if (!empty($v[ 'child_list' ])) {
- foreach ($v[ 'child_list' ] as $ck => $cv) {
- $link[ $k ][ 'child_list' ][ $ck ][ 'parent' ] = $k;
- }
- }
- // 查询自定义页面
- if ($k == 'DIY_PAGE') {
- $order = "update_time desc";
- $field = 'id,title,page_title,name,template,type,mode,is_default,share,visit_count,create_time,update_time';
- $list = $this->model
- ->whereOr([
- [
- [ 'type', '=', 'DIY_PAGE' ],
- [ 'site_id', '=', $this->site_id ],
- ],
- [
- [ 'type', '<>', 'DIY_PAGE' ],
- [ 'site_id', '=', $this->site_id ],
- [ 'is_default', '=', 0 ]
- ]
- ])->field($field)->order($order)->select()->toArray();
- foreach ($list as $ck => $cv) {
- $link[ $k ][ 'child_list' ][] = [
- 'name' => $cv[ 'name' ],
- 'title' => $cv[ 'page_title' ],
- 'url' => '/app/pages/index/diy?id=' . $cv[ 'id' ]
- ];
- }
- }
- if ($k == 'DIY_LINK') {
- $link[ $k ][ 'parent' ] = 'DIY_LINK';
- }
- }
- return $link;
- }
- /**
- * 修改分享内容
- * @param int $id
- * @param $data
- * @return bool
- */
- public function modifyShare(int $id, $data)
- {
- $this->model->where([ [ 'id', '=', $id ], [ 'site_id', '=', $this->site_id ] ])->update([ 'share' => $data[ 'share' ] ]);
- return true;
- }
- /**
- * 获取页面模板
- * @param array $params
- * @return array
- */
- public function getTemplate($params = [])
- {
- $page_template = TemplateDict::getTemplate($params);
- foreach ($page_template as $k => $v) {
- // 查询页面数据
- $page_params = [
- 'type' => $k, // 页面类型
- 'mode' => $params[ 'mode' ] ?? '' // 页面模式:diy:自定义,fixed:固定
- ];
- $page_template[ $k ][ 'template' ] = PagesDict::getPages($page_params);
- }
- return $page_template;
- }
- /**
- * 获取页面数据
- * @param $type
- * @param $name
- * @return array
- */
- public function getPageData($type, $name)
- {
- $pages = PagesDict::getPages([ 'type' => $type ]);
- return $pages[ $name ] ?? [];
- }
- /**
- * 获取默认页面数据
- * @param $type
- * @param string $addon
- * @return array|mixed
- */
- public function getFirstPageData($type, $addon = '')
- {
- $pages = PagesDict::getPages([ 'type' => $type, 'addon' => $addon ]);
- if (!empty($pages)) {
- $template = array_key_first($pages);
- $page = array_pop($pages);
- $page[ 'template' ] = $template;
- $page[ 'type' ] = $type;
- return $page;
- }
- return [];
- }
- /**
- * 获取页面装修列表
- * @param $params
- * @return array
- * @throws DataNotFoundException
- * @throws DbException
- * @throws ModelNotFoundException
- */
- public function getDecoratePage($params)
- {
- // 查询当前装修的页面信息
- $template = $this->getTemplate([ 'action' => 'decorate', 'key' => [ $params[ 'type' ] ] ])[ $params[ 'type' ] ];
- $template[ 'domain_url' ] = ( new SystemService() )->getUrl();
- // 查询默认页面数据
- $default_page_data = $this->getFirstPageData($params[ 'type' ]);
- $use_template = [
- 'type' => $params[ 'type' ], // 页面类型标识
- 'name' => '', // 链接标识
- 'parent' => '', // 链接标识
- 'title' => $default_page_data[ 'title' ] ?? '', // 模板名称
- 'cover' => $default_page_data[ 'cover' ] ?? '', // 封面图
- 'url' => '', // 自定义页面链接,实时预览效果
- 'page' => $template[ 'page' ], // 页面地址
- 'action' => $template[ 'action' ] // 是否存在操作,decorate 表示支持装修
- ];
- // 查询页面数据
- $info = $this->getInfoByName($params[ 'type' ]);
- if (!empty($info)) {
- $use_template[ 'id' ] = $info[ 'id' ];
- $use_template[ 'title' ] = $info[ 'title' ];
- // 查询模板页面数据
- $page_data = $this->getPageData($params[ 'type' ], $info[ 'template' ]);
- if (!empty($page_data)) {
- $use_template[ 'url' ] = $template[ 'page' ] . '?id=' . $info[ 'id' ];
- // $use_template[ 'cover' ] = $page_data[ 'cover' ]; // 默认图
- } else {
- // 自定义页面,实时预览效果
- $use_template[ 'url' ] = '/app/pages/index/diy?id=' . $info[ 'id' ];
- // 清空模板信息
- $use_template[ 'cover' ] = ''; // 默认图
- }
- }
- // 查询链接的名称标识,保证数据准确性
- $other_page = ( new DiyRouteService() )->getList([ 'url' => $use_template[ 'page' ] ]);
- if (!empty($other_page)) {
- $use_template[ 'title' ] = $other_page[ 0 ][ 'title' ] ?? '';
- $use_template[ 'name' ] = $other_page[ 0 ][ 'name' ];
- $use_template[ 'parent' ] = $other_page[ 0 ][ 'parent' ];
- $use_template[ 'action' ] = $other_page[ 0 ][ 'action' ];
- }
- // 如果没有预览图,并且没有地址,则赋值默认页面地址
- if (empty($use_template[ 'cover' ]) && empty($use_template[ 'url' ])) {
- $use_template[ 'url' ] = $template[ 'page' ];
- } elseif (empty($use_template[ 'url' ])) {
- $use_template[ 'url' ] = $template[ 'page' ];
- }
- $template[ 'use_template' ] = $use_template;
- return $template;
- }
- /**
- * 设置启动页
- * @param array $params
- * @return \app\model\sys\SysConfig|bool|\think\Model
- */
- public function changeTemplate(array $params = [])
- {
- $start_up_page_data = [
- 'type' => $params[ 'type' ], // 页面类型
- 'name' => $params[ 'name' ], // 链接名称标识
- 'parent' => $params[ 'parent' ], // 链接父级名称标识
- 'page' => $params[ 'page' ], // 链接路由
- 'title' => $params[ 'title' ], // 链接标题
- 'action' => $params[ 'action' ] // 是否存在操作,decorate 表示支持装修
- ];
- $diy_config_service = new DiyConfigService();
- $res = $diy_config_service->setStartUpPageConfig($start_up_page_data);
- return $res;
- }
- /**
- * 获取模板页面(存在的应用插件列表)
- * @return array
- */
- public function getApps()
- {
- $page_template = TemplateDict::getTemplate([
- 'query' => 'addon'
- ]);
- return $page_template;
- }
- }
|