提交 c5763a61 编写于 作者: ModStart's avatar ModStart

develop

上级 74c8bd58
......@@ -49,8 +49,5 @@ return [
'SiteCounter' => [
'enable' => true,
],
// 'CmsThemeCorp' => [
// 'enable' => true,
// ],
],
];
{
"name": "AdminManager",
"types": [
"Admin"
],
"require": [
"Vendor"
],
......
{
"name": "Article",
"types": [
"PC",
"Mobile"
],
"require": [
"Vendor"
],
......
......@@ -5,11 +5,6 @@ namespace Module\Banner\Core;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\ServiceProvider;
use ModStart\Admin\Config\AdminMenu;
use ModStart\Module\ModuleClassLoader;
use ModStart\Module\ModuleManager;
use Module\Banner\Provider\BannerPositionProvider;
use Module\SmsAliyun\Driver\SmsAliyunSender;
use Module\SmsTecmz\Driver\SmsTecmzSender;
class ModuleServiceProvider extends ServiceProvider
{
......@@ -20,6 +15,8 @@ class ModuleServiceProvider extends ServiceProvider
*/
public function boot(Dispatcher $events)
{
include __DIR__ . '/../Helpers/MBanner.php';
AdminMenu::register([
[
'title' => '物料管理',
......
<?php
use Module\Banner\Util\BannerUtil;
/**
* Class MBanner
*
* @Util 通用轮播
*/
class MBanner
{
/**
* @param string $position
* @return mixed
*
* @Util 根据位置获取轮播数据
*/
public static function all($position = 'home')
{
return BannerUtil::listByPositionWithCache($position);
}
}
\ No newline at end of file
{
"name": "Banner",
"types": [
"PC",
"Mobile"
],
"require": [
"Vendor:>=1.4.0"
],
......
......@@ -10,7 +10,9 @@ use ModStart\Admin\Layout\AdminCRUDBuilder;
use ModStart\Form\Form;
use ModStart\Grid\GridFilter;
use ModStart\Support\Concern\HasFields;
use Module\Cms\Type\CmsMode;
use Module\Cms\Util\CmsCatUtil;
use Module\Cms\Util\CmsModelUtil;
use Module\Cms\Util\CmsTemplateUtil;
class CatController extends Controller
......@@ -28,16 +30,25 @@ class CatController extends Controller
$builder->text('url', 'URL')->required()
->help('字母数字下划线,如,demo 可以通过URL访问 /demo 访问')
->ruleUnique('cms_cat')->ruleRegex('/^[a-zA-Z0-9_]+$/');
$builder->select('modelId', '模型')->optionModel('cms_model', 'id', 'title')->required();
$modelField = $builder->select('modelId', '模型')->optionModel('cms_model', 'id', 'title')->required();
$modelModeMap = CmsModelUtil::listModeMap();
$modelField->when('in', $modelModeMap[CmsMode::LIST_DETAIL], function ($builder) {
$builder->select('listTemplate', '列表模板')->options(CmsTemplateUtil::allListTemplateMap())->required()->listable(false);
$builder->select('detailTemplate', '详情模板')->options(CmsTemplateUtil::allDetailTemplateMap())->required()->listable(false);
});
$modelField->when('in', $modelModeMap[CmsMode::PAGE], function ($builder) {
$builder->select('pageTemplate', '单页模板')->options(CmsTemplateUtil::allPageTemplateMap())->required()->listable(false);
});
$modelField->when('in', $modelModeMap[CmsMode::FORM], function ($builder) {
$builder->select('formTemplate', '表单模板')->options(CmsTemplateUtil::allFormTemplateMap())->required()->listable(false);
});
$builder->text('subTitle', '子标题')->required()->listable(false);
$builder->image('bannerBg', 'Banner背景')->listable(false);
$builder->select('listTemplate', '列表模板')->options(CmsTemplateUtil::allListTemplateMap())->required()->listable(false);
$builder->select('detailTemplate', '详情模板')->options(CmsTemplateUtil::allDetailTemplateMap())->required()->listable(false);
$builder->image('icon', '图标')->listable(false);
$builder->image('cover', '封面')->listable(false);
$builder->text('seoTitle', 'SEO标题')->listable(false);
$builder->text('seoDescription', 'SEO描述')->listable(false);
$builder->text('seoKeywords', 'SEO关键词')->listable(false);
$builder->textarea('seoKeywords', 'SEO关键词')->listable(false);
// $builder->switch('visitMemberGroupEnable', '启用用户分组访问')->listable(false)
// ->when('=', true, function ($builder) {
// /** @var HasFields $builder */
......
......@@ -11,21 +11,16 @@ class ConfigController extends Controller
{
public function basic(AdminConfigBuilder $builder)
{
$builder->pageTitle('CMS基础信息');
$builder->pageTitle('基础信息');
$builder->text('Cms_CompanyName', '公司名称');
$builder->text('Cms_ContactEmail', '公司邮箱');
$builder->text('Cms_ContactPhone', '公司电话');
$builder->text('Cms_ContactAddress', '公司地址');
$builder->text('Cms_CompanyName', '企业名称');
$builder->text('Cms_ContactEmail', '企业邮箱');
$builder->text('Cms_ContactPhone', '企业电话');
$builder->text('Cms_ContactAddress', '企业地址');
$builder->text('Cms_HomeInfoTitle', '首页介绍标题');
$builder->image('Cms_HomeInfoImage', '首页介绍图片');
$builder->richHtml('Cms_HomeInfoContent', '首页介绍说明');
$builder->text('Cms_HomeInfoLinkText', '首页介绍链接文字');
$builder->text('Cms_HomeInfoLink', '首页介绍链接');
$builder->text('Cms_FooterNavTitle', '底部导航标题')->help('默认为 关于');
$builder->text('Cms_FooterNavSecondaryTitle', '底部次导航标题')->help('默认为 导航');
$builder->text('Cms_HomeInfoTitle', '企业介绍标题');
$builder->image('Cms_HomeInfoImage', '企业介绍图片');
$builder->richHtml('Cms_HomeInfoContent', '企业介绍说明');
$builder->formClass('wide');
return $builder->perform();
......
......@@ -9,7 +9,6 @@ use Illuminate\Routing\Controller;
use ModStart\Admin\Auth\AdminPermission;
use ModStart\Admin\Layout\AdminDialogPage;
use ModStart\Admin\Layout\AdminPage;
use ModStart\Admin\Widget\DashboardItemA;
use ModStart\Core\Dao\ModelUtil;
use ModStart\Core\Exception\BizException;
use ModStart\Core\Input\Request;
......@@ -17,14 +16,17 @@ use ModStart\Core\Input\Response;
use ModStart\Core\Util\ArrayUtil;
use ModStart\Core\Util\CRUDUtil;
use ModStart\Core\Util\TreeUtil;
use ModStart\Field\AbstractField;
use ModStart\Field\AutoRenderedFieldValue;
use ModStart\Field\Tags;
use ModStart\Form\Form;
use ModStart\Grid\Grid;
use ModStart\Grid\GridFilter;
use ModStart\Layout\Row;
use ModStart\Repository\Filter\RepositoryFilter;
use Module\Cms\Type\CmsMode;
use Module\Cms\Type\CmsModelContentStatus;
use Module\Cms\Type\CmsModelFieldType;
use Module\Cms\Util\CmsContentUtil;
use Module\Cms\Util\CmsModelUtil;
class ContentController extends Controller
......@@ -53,11 +55,23 @@ class ContentController extends Controller
$grid = Grid::make($this->modelTable);
$grid->id('id', 'ID');
$grid->select('catId', '栏目')->optionModelTree('cms_cat', 'id', 'title');
$grid->text('title', '标题');
$grid->type('status', '状态')->type(CmsModelContentStatus::class, [
CmsModelContentStatus::SHOW => 'success',
CmsModelContentStatus::HIDE => 'muted',
]);
if (in_array($this->model['mode'], [CmsMode::LIST_DETAIL, CmsMode::PAGE])) {
$grid->text('title', '标题');
$grid->type('status', '状态')->type(CmsModelContentStatus::class, [
CmsModelContentStatus::SHOW => 'success',
CmsModelContentStatus::HIDE => 'muted',
]);
} else {
$customFields = isset($this->model['_customFields']) ? $this->model['_customFields'] : [];
$grid->display('_content', '内容')->hookRendering(function (AbstractField $field, $item, $index) use ($customFields) {
$data = CmsContentUtil::getModelData($this->model, $item->id);
return AutoRenderedFieldValue::makeView('module::Cms.View.admin.content.field.formData', [
'item' => $item,
'customFields' => $customFields,
'data' => $data,
]);
})->width(500);
}
$grid->repositoryFilter(function (RepositoryFilter $filter) {
$filter->where(['modelId' => $this->modelId]);
});
......@@ -66,7 +80,11 @@ class ContentController extends Controller
$filter->like('title', '标题');
$filter->eq('status', '状态')->select(CmsModelContentStatus::class);
});
$grid->canAdd(true)->urlAdd(action('\\' . __CLASS__ . '@edit', ['modelId' => $this->modelId]));
if (in_array($this->model['mode'], [CmsMode::LIST_DETAIL, CmsMode::PAGE])) {
$grid->canAdd(true)->urlAdd(action('\\' . __CLASS__ . '@edit', ['modelId' => $this->modelId]));
} else {
$grid->canAdd(false);
}
$grid->canEdit(true)->urlEdit(action('\\' . __CLASS__ . '@edit', ['modelId' => $this->modelId]));
$grid->canDelete(true)->urlDelete(action('\\' . __CLASS__ . '@delete', ['modelId' => $this->modelId]));
if (Request::isPost()) {
......@@ -112,7 +130,9 @@ class ContentController extends Controller
return [$v['id'], str_repeat('|--', $v['level']) . $v['title']];
});
$form->select('catId', '栏目')->options($options);
$form->text('title', '标题')->required();
if (in_array($this->model['mode'], [CmsMode::LIST_DETAIL, CmsMode::PAGE])) {
$form->text('title', '标题')->required();
}
if (!empty($this->model['_customFields'])) {
$fields = $this->model['_customFields'];
foreach ($fields as $field) {
......@@ -163,23 +183,27 @@ class ContentController extends Controller
}
}
}
$form->text('alias', '别名')
->ruleUnique($this->modelTable)
->ruleRegex('/^[a-z0-9_]*[a-z][a-z0-9_]*$/')
->help('数字字母下划线组成,不能是纯数字,可以通过 <code>a/别名</code> 别名访问内容');
if (in_array($this->model['mode'], [CmsMode::LIST_DETAIL, CmsMode::PAGE])) {
$form->text('alias', '别名')
->ruleUnique($this->modelTable)
->ruleRegex('/^[a-z0-9_]*[a-z][a-z0-9_]*$/')
->help('数字字母下划线组成,不能是纯数字,可以通过 <code>a/别名</code> 别名访问内容');
}
$form->richHtml('content', '内容');
$form->textarea('summary', '摘要');
$form->image('cover', '封面');
$form->datetime('postTime', '发布时间')->required()->help('可以是未来时间,在未来发布')->defaultValue(Carbon::now());
$form->radio('status', '状态')->optionType(CmsModelContentStatus::class)->required()->defaultValue(CmsModelContentStatus::SHOW);
$form->switch('isRecommend', '推荐');
$form->switch('isTop', '置顶');
$form->tags('tags', '标签')->serializeType(Tags::SERIALIZE_TYPE_COLON_SEPARATED);
$form->text('author', '作者');
$form->text('source', '来源');
$form->text('seoTitle', 'SEO标题');
$form->text('seoDescription', 'SEO描述');
$form->text('seoKeywords', 'SEO关键词');
if (in_array($this->model['mode'], [CmsMode::LIST_DETAIL, CmsMode::PAGE])) {
$form->textarea('summary', '摘要');
$form->image('cover', '封面');
$form->datetime('postTime', '发布时间')->required()->help('可以是未来时间,在未来发布')->defaultValue(Carbon::now());
$form->radio('status', '状态')->optionType(CmsModelContentStatus::class)->required()->defaultValue(CmsModelContentStatus::SHOW);
$form->switch('isRecommend', '推荐');
$form->switch('isTop', '置顶');
$form->tags('tags', '标签')->serializeType(Tags::SERIALIZE_TYPE_COLON_SEPARATED);
$form->text('author', '作者');
$form->text('source', '来源');
$form->text('seoTitle', 'SEO标题');
$form->text('seoDescription', 'SEO描述');
$form->textarea('seoKeywords', 'SEO关键词');
}
$form->item($record)->fillFields();
$form->showReset(false)->showSubmit(false);
if (Request::isPost()) {
......
......@@ -15,12 +15,15 @@ use ModStart\Core\Input\Request;
use ModStart\Core\Input\Response;
use ModStart\Core\Util\ArrayUtil;
use ModStart\Core\Util\CRUDUtil;
use ModStart\Field\AbstractField;
use ModStart\Field\AutoRenderedFieldValue;
use ModStart\Form\Form;
use ModStart\Grid\Displayer\ItemOperate;
use ModStart\Grid\Grid;
use ModStart\ModStart;
use ModStart\Repository\Filter\RepositoryFilter;
use ModStart\Widget\TextDialogRequest;
use Module\Cms\Type\CmsMode;
use Module\Cms\Type\CmsModelFieldType;
use Module\Cms\Util\CmsModelUtil;
use Module\Cms\Util\CmsTemplateUtil;
......@@ -158,8 +161,12 @@ class ModelController extends Controller
$grid = Grid::make('cms_model');
$grid->text('title', '名称');
$grid->text('name', '标识');
$grid->select('listTemplate', '默认列表模板')->options(CmsTemplateUtil::allListTemplateMap());
$grid->select('detailTemplate', '默认详情模板')->options(CmsTemplateUtil::allDetailTemplateMap());
$grid->type('mode', '类型')->type(CmsMode::class);
$grid->display('_mode', '模式')->hookRendering(function (AbstractField $field, $item, $index) {
return AutoRenderedFieldValue::makeView('module::Cms.View.admin.model.field.mode', [
'item' => $item,
]);
});
$grid->title('模型')->dialogSizeSmall();
$grid->canAdd(true)->urlAdd(action('\\' . __CLASS__ . '@edit'));
$grid->canEdit(true)->urlEdit(action('\\' . __CLASS__ . '@edit'));
......@@ -177,7 +184,7 @@ class ModelController extends Controller
if (Request::isPost()) {
return $grid->request();
}
return $page->pageTitle('模型管理')->body($grid);
return $page->pageTitle('内容模型')->body($grid);
}
public function edit(AdminDialogPage $page)
......@@ -197,8 +204,18 @@ class ModelController extends Controller
if ($record) {
$nameField->readonly(true);
}
$form->select('listTemplate', '默认列表模板')->options(CmsTemplateUtil::allListTemplateMap());
$form->select('detailTemplate', '默认详情模板')->options(CmsTemplateUtil::allDetailTemplateMap());
$form->radio('mode', '显示模式')->optionType(CmsMode::class)
->when('=', CmsMode::LIST_DETAIL, function (Form $form) {
$form->select('listTemplate', '默认列表模板')->options(CmsTemplateUtil::allListTemplateMap());
$form->select('detailTemplate', '默认详情模板')->options(CmsTemplateUtil::allDetailTemplateMap());
})
->when('=', CmsMode::PAGE, function (Form $form) {
$form->select('pageTemplate', '默认单页模板')->options(CmsTemplateUtil::allPageTemplateMap());
})
->when('=', CmsMode::FORM, function (Form $form) {
$form->select('formTemplate', '默认表单模板')->options(CmsTemplateUtil::allFormTemplateMap());
})
->defaultValue(CmsMode::LIST_DETAIL)->required();
$form->showSubmit(false)->showReset(false)->formClass('wide');
$form->item($record)->fillFields();
if (Request::isPost()) {
......@@ -208,7 +225,7 @@ class ModelController extends Controller
ModelUtil::transactionBegin();
if ($record) {
ModelUtil::update('cms_model', $record['id'], ArrayUtil::keepKeys($data, [
'title', 'listTemplate', 'detailTemplate',
'title', 'form', 'listTemplate', 'detailTemplate', 'pageTemplate',
]));
} else {
$data = ModelUtil::insert('cms_model', $data);
......@@ -219,7 +236,7 @@ class ModelController extends Controller
return Response::redirect(CRUDUtil::jsDialogCloseAndParentGridRefresh());
});
}
return $page->pageTitle('模型管理')->body($form);
return $page->pageTitle('内容模型')->body($form);
}
public function delete()
......
......@@ -26,7 +26,7 @@ class ModuleServiceProvider extends ServiceProvider
*/
public function boot(Dispatcher $events)
{
require_once __DIR__ . '/../Helpers/CMS.php';
require_once __DIR__ . '/../Helpers/MCms.php';
AdminWidgetLink::register(function () {
$menu = [];
......@@ -61,31 +61,38 @@ class ModuleServiceProvider extends ServiceProvider
'sort' => 150,
'children' => [
[
'title' => 'CMS内容',
'title' => '栏目管理',
'url' => '\Module\Cms\Admin\Controller\CatController@index',
],
[
'title' => '基础信息',
'url' => '\Module\Cms\Admin\Controller\ConfigController@basic',
],
[
'title' => '内容管理',
'children' => $contentMenus
],
// [
// 'title' => '表单管理',
// 'children' => $contentMenus
// ],
[
'title' => 'CMS置',
'title' => 'CMS置',
'children' => [
[
'title' => '模型管理',
'title' => '内容模型',
'url' => '\Module\Cms\Admin\Controller\ModelController@index',
],
// [
// 'title' => '表单模型',
// 'url' => '\Module\Cms\Admin\Controller\ModelController@index',
// ],
[
'title' => '模板管理',
'url' => '\Module\Cms\Admin\Controller\TemplateController@index',
],
[
'title' => '栏目管理',
'url' => '\Module\Cms\Admin\Controller\CatController@index',
],
]
],
[
'title' => 'CMS基础信息',
'url' => '\Module\Cms\Admin\Controller\ConfigController@basic',
],
]
],
];
......
- 新增:数据模型类型,适配单页、表单、列表+详情
- 优化:默认列表和详情页面标题手机端显示
\ No newline at end of file
<?php
/**
* Class Cms
*
* @Util CMS操作
*/
class Cms
{
/**
* @param $catUrl string 栏目URL
* @param $page int 页码
* @param $pageSize int 分页大小
* @param $option array 其他选项
* @return mixed
*
* @Util 根据栏目URL获取列表
*/
public static function paginateCatByUrl($catUrl, $page, $pageSize, $option = [])
{
$cat = \Module\Cms\Util\CmsCatUtil::getByUrl($catUrl);
$paginateData = \Module\Cms\Util\CmsContentUtil::paginateCat($cat['id'], $page, $pageSize, $option);
return $paginateData['records'];
}
/**
* @param $catId
* @param $page
* @param $pageSize
* @param $option array
* @return mixed
*
* @Util 根据栏目ID获取列表
*/
public static function paginateCat($catId, $page, $pageSize, $option = [])
{
$paginateData = \Module\Cms\Util\CmsContentUtil::paginateCat($catId, $page, $pageSize, $option);
return $paginateData['records'];
}
/**
* @param $position
* @return array|mixed
*
* @Util 根据位置获取轮播
*/
public static function banners($position)
{
if (!\ModStart\Module\ModuleManager::isModuleEnabled('Banner')) {
return [];
}
return \Module\Banner\Util\BannerUtil::listByPositionWithCache($position);
}
/**
* @param $position
* @return array|mixed
*
* @Util 根据位置获取合作伙伴
*/
public static function partners($position)
{
if (!\ModStart\Module\ModuleManager::isModuleEnabled('Partner')) {
return [];
}
return \Module\Partner\Util\PartnerUtil::listByPositionWithCache($position);
}
}
<?php
use Module\Cms\Util\CmsCatUtil;
use Module\Cms\Util\CmsContentUtil;
/**
* Class MCms
*
* @Util CMS操作
*/
class MCms
{
/**
* @param $catUrl string 栏目URL
* @param $page int 页码
* @param $pageSize int 分页大小
* @param $option array 其他选项
* @return array
*
* @Util 根据栏目URL获取列表
*/
public static function paginateCatByUrl($catUrl, $page = 1, $pageSize = 10, $option = [])
{
$cat = CmsCatUtil::getByUrl($catUrl);
$paginateData = CmsContentUtil::paginateCat($cat['id'], $page, $pageSize, $option);
return $paginateData['records'];
}
/**
* @param $catId int 栏目ID
* @param $page int 页码
* @param $pageSize int 分页大小
* @param $option array 其他选项
* @return array
*
* @Util 根据栏目ID获取列表
*/
public static function paginateCat($catId, $page = 1, $pageSize = 10, $option = [])
{
$paginateData = CmsContentUtil::paginateCat($catId, $page, $pageSize, $option);
return $paginateData['records'];
}
/**
* @param $catId int 栏目ID
* @param $limit int 页码
* @return array
*
* @Util 根据栏目ID获取最近记录
*/
public static function latestCat($catId, $limit = 10)
{
$paginateData = CmsContentUtil::paginateCat($catId, 1, $limit);
$latestRecords = $paginateData['records'];
return $latestRecords;
}
/**
* @param $catId int 栏目ID
* @param $recordId int 记录ID
* @return array|null
*
* @Util 获取下一条记录
*/
public static function nextOne($catId, $recordId)
{
return CmsContentUtil::nextOne($catId, $recordId);
}
/**
* @param $catId int 栏目ID
* @param $recordId int 记录ID
* @return array|null
*
* @Util 获取上一条记录
*/
public static function prevOne($catId, $recordId)
{
return CmsContentUtil::prevOne($catId, $recordId);
}
}
\ No newline at end of file
......@@ -31,6 +31,7 @@ class InitCmsData extends Migration
'name' => 'price',
'title' => '价格',
'fieldType' => CmsModelFieldType::TEXT,
'isRequired' => false,
],
]);
CmsModelUtil::build([
......
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use ModStart\Core\Dao\ModelUtil;
use Module\Cms\Type\CmsMode;
class ModifyCmsCatAddPageMode extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('cms_model', function (Blueprint $table) {
/** @see CmsMode */
$table->tinyInteger('mode')->nullable()->comment('');
$table->string('pageTemplate', 100)->nullable()->comment('');
$table->string('formTemplate', 100)->nullable()->comment('');
});
Schema::table('cms_cat', function (Blueprint $table) {
$table->string('pageTemplate', 100)->nullable()->comment('');
$table->string('formTemplate', 100)->nullable()->comment('');
});
ModelUtil::updateAll('cms_model', [
'mode' => CmsMode::LIST_DETAIL,
]);
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
}
}
<?php
use Illuminate\Database\Migrations\Migration;
use Module\Cms\Type\CmsMode;
use Module\Cms\Util\CmsCatUtil;
use Module\Cms\Util\CmsModelUtil;
class InitCmsDataPage extends Migration
{
public function up()
{
CmsModelUtil::build([
'name' => 'page',
'title' => '单页内容',
'mode' => CmsMode::PAGE,
'pageTemplate' => 'default.blade.php',
]);
CmsCatUtil::build('page', [
'url' => 'about',
'title' => '关于我们',
]);
CmsCatUtil::build('page', [
'url' => 'contact',
'title' => '联系我们',
]);
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
}
}
<?php
use Illuminate\Database\Migrations\Migration;
use Module\Cms\Type\CmsMode;
use Module\Cms\Type\CmsModelFieldType;
use Module\Cms\Util\CmsCatUtil;
use Module\Cms\Util\CmsModelUtil;
class InitCmsDataForm extends Migration
{
public function up()
{
CmsModelUtil::build([
'name' => 'message',
'title' => '留言本',
'mode' => CmsMode::FORM,
'formTemplate' => 'default.blade.php',
], [
[
'name' => 'phone',
'title' => '手机',
'fieldType' => CmsModelFieldType::TEXT,
'isRequired' => false,
],
[
'name' => 'name',
'title' => '姓名',
'fieldType' => CmsModelFieldType::TEXT,
'isRequired' => false,
],
]);
CmsCatUtil::build('message', [
'url' => 'message',
'title' => '留言本',
]);
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
}
}
<?php
namespace Module\Cms\Type;
use ModStart\Core\Type\BaseType;
class CmsMode implements BaseType
{
const LIST_DETAIL = 1;
const PAGE = 2;
const FORM = 3;
public static function getList()
{
return [
self::LIST_DETAIL => '列表+详情',
self::PAGE => '单页',
self::FORM => '表单',
];
}
}
\ No newline at end of file
......@@ -34,6 +34,9 @@ class CmsCatUtil
return Cache::rememberForever('CmsCatAll', function () {
$records = ModelUtil::all('cms_cat');
ModelUtil::decodeRecordsJson($records, ['visitMemberGroups', 'visitMemberVips']);
foreach ($records as $k => $v) {
$records[$k]['_model'] = CmsModelUtil::get($v['modelId']);
}
return $records;
});
}
......
......@@ -7,11 +7,28 @@ namespace Module\Cms\Util;
use Carbon\Carbon;
use ModStart\Core\Dao\ModelUtil;
use ModStart\Core\Exception\BizException;
use ModStart\Core\Util\ArrayUtil;
use ModStart\Core\Util\TagUtil;
use Module\Cms\Type\CmsModelContentStatus;
class CmsContentUtil
{
public static function insert($model, $data, $dataData)
{
$data = ArrayUtil::keepKeys($data, [
'catId', 'title', 'alias', 'title', 'summary', 'cover', 'postTime',
'status', 'isRecommend', 'isTop', 'tags', 'author', 'source',
]);
$data['modelId'] = $model['id'];
$table = "cms_m_" . $model['name'];
ModelUtil::transactionBegin();;
$data = ModelUtil::insert('cms_content', $data);
$dataData['id'] = $data['id'];
ModelUtil::insert($table, $dataData);
ModelUtil::transactionCommit();
return $data['id'];
}
public static function paginate($page, $pageSize, $option = [])
{
$option['where']['status'] = CmsModelContentStatus::SHOW;
......@@ -19,10 +36,12 @@ class CmsContentUtil
$option['whereOperate'] = [];
}
$option['whereOperate'][] = ['postTime', '<', date('Y-m-d H:i:s')];
$option['whereOrder'] = [
['isTop', 'desc'],
['postTime', 'desc']
];
if (empty($option['order'])) {
$option['order'] = [
['isTop', 'desc'],
['postTime', 'desc'],
];
}
$paginateData = ModelUtil::paginate('cms_content', $page, $pageSize, $option);
foreach ($paginateData['records'] as $k => $record) {
if ($record['alias']) {
......@@ -36,6 +55,35 @@ class CmsContentUtil
return $paginateData;
}
public static function allCat($catId)
{
$catIds = CmsCatUtil::childrenIds($catId);
if (empty($catIds)) {
return [];
}
$records = ModelUtil::model('cms_content')
->whereIn('catId', $catIds)
->where([
'status' => CmsModelContentStatus::SHOW,
])
->where('postTime', '<', date('Y-m-d H:i:s'))
->orderBy('isTop', 'desc')
->orderBy('postTime', 'desc')
->get()->toArray();
foreach ($records as $k => $record) {
if ($record['alias']) {
$records[$k]['_url'] = modstart_web_url('a/' . $record['alias']);
} else {
$records[$k]['_url'] = modstart_web_url('a/' . $record['id']);
}
$records[$k]['_day'] = Carbon::parse($record['postTime'])->toDateString();
$records[$k]['tags'] = TagUtil::string2Array($record['tags']);
$model = CmsModelUtil::get($record['modelId']);
$records[$k]['_data'] = CmsContentUtil::getModelData($model, $record['id']);
}
return $records;
}
public static function paginateCat($catId, $page, $pageSize, $option = [])
{
$catIds = CmsCatUtil::childrenIds($catId);
......@@ -62,6 +110,13 @@ class CmsContentUtil
];
}
public static function getModelData($model, $id)
{
$table = "cms_m_$model[name]";
$recordData = ModelUtil::get($table, $id);
return $recordData;
}
public static function getByAlias($alias)
{
$record = ModelUtil::get('cms_content', ['alias' => $alias]);
......@@ -76,4 +131,28 @@ class CmsContentUtil
'model' => $model,
];
}
public static function nextOne($catId, $dataId)
{
$option = [
'order' => ['id', 'asc'],
'whereOperate' => [
['id', '>', $dataId],
]
];
$paginateData = CmsContentUtil::paginateCat($catId, 1, 1, $option);
return isset($paginateData['records'][0]) ? $paginateData['records'][0] : null;
}
public static function prevOne($catId, $dataId)
{
$option = [
'order' => ['id', 'desc'],
'whereOperate' => [
['id', '<', $dataId],
]
];
$paginateData = CmsContentUtil::paginateCat($catId, 1, 1, $option);
return isset($paginateData['records'][0]) ? $paginateData['records'][0] : null;
}
}
......@@ -9,6 +9,7 @@ use Illuminate\Support\Facades\Cache;
use ModStart\Core\Dao\ModelManageUtil;
use ModStart\Core\Dao\ModelUtil;
use ModStart\Core\Exception\BizException;
use Module\Cms\Type\CmsMode;
use Module\Cms\Type\CmsModelContentStatus;
use Module\Cms\Type\CmsModelFieldType;
......@@ -19,6 +20,18 @@ class CmsModelUtil
Cache::forget('CmsModelAll');
}
public static function listModeMap()
{
$map = [];
foreach (CmsMode::getList() as $k => $v) {
$map[$k] = [];
}
foreach (CmsModelUtil::all() as $item) {
$map[$item['mode']][] = $item['id'];
}
return $map;
}
public static function getByName($name)
{
foreach (self::all() as $model) {
......
......@@ -93,6 +93,16 @@ class CmsTemplateUtil
return self::listFiles('detail');
}
public static function allPageTemplates()
{
return self::listFiles('page');
}
public static function allFormTemplates()
{
return self::listFiles('form');
}
public static function allListTemplateMap()
{
return array_build(self::allListTemplates(), function ($k, $v) {
......@@ -107,6 +117,20 @@ class CmsTemplateUtil
});
}
public static function allPageTemplateMap()
{
return array_build(self::allPageTemplates(), function ($k, $v) {
return [$k, $k];
});
}
public static function allFormTemplateMap()
{
return array_build(self::allFormTemplates(), function ($k, $v) {
return [$k, $k];
});
}
public static function toBladeView($view)
{
if (empty($view)) {
......
<table class="ub-lister-table mini">
<tbody>
@foreach($customFields as $customField)
<tr>
<td width="100">{{$customField['title']}}:</td>
<td>
@if(in_array($customField['fieldType'],[
\Module\Cms\Type\CmsModelFieldType::TEXT,
\Module\Cms\Type\CmsModelFieldType::TEXTAREA,
]))
{{$data[$customField['name']] or '-'}}
@else
{{$data[$customField['name']] or '-'}}
@endif
</td>
</tr>
@endforeach
</tbody>
</table>
\ No newline at end of file
<div>
@if($item->mode==\Module\Cms\Type\CmsMode::LIST_DETAIL)
<div>
默认列表模板:{{$item->listTemplate}}
</div>
<div>
默认详情模板:{{$item->detailTemplate}}
</div>
@elseif($item->mode==\Module\Cms\Type\CmsMode::PAGE)
<div>
默认单页模板:{{$item->pageTemplate}}
</div>
@elseif($item->mode==\Module\Cms\Type\CmsMode::FORM)
<div>
默认表单模板:{{$item->formTemplate}}
</div>
@endif
</div>
\ No newline at end of file
@extends('modstart::admin.frame')
@section('pageTitle')模板管理@endsection
@section('pageTitle')内容模板@endsection
@section('bodyContent')
<div class="ub-alert">
......
......@@ -7,7 +7,7 @@
{!! \ModStart\ModStart::js('asset/common/lazyLoad.js') !!}
@section('bodyContent')
<div class="tw-text-white tw-text-lg tw-py-20 tw-bg-gray-500 ub-cover"
<div class="lg:tw-text-left tw-text-center tw-text-white tw-text-lg tw-py-20 tw-bg-gray-500 ub-cover"
@if($cat['bannerBg']) style="background-image:url({{\ModStart\Core\Assets\AssetsUtil::fix($cat['bannerBg'])}});" @endif
>
<div class="ub-container">
......
......@@ -7,7 +7,7 @@
{!! \ModStart\ModStart::js('asset/common/lazyLoad.js') !!}
@section('bodyContent')
<div class="tw-text-white tw-text-lg tw-py-20 tw-bg-gray-500 ub-cover"
<div class="lg:tw-text-left tw-text-center tw-text-white tw-text-lg tw-py-20 tw-bg-gray-500 ub-cover"
@if($cat['bannerBg']) style="background-image:url({{\ModStart\Core\Assets\AssetsUtil::fix($cat['bannerBg'])}});" @endif
>
<div class="ub-container">
......@@ -56,7 +56,7 @@
</div>
</div>
<div class="body ub-list-items">
@foreach($latestRecords as $a)
@foreach(MCms:: as $a)
<a class="item-c" href="{{$a['_url']}}">{{$a['title']}}</a>
@endforeach
</div>
......
......@@ -7,7 +7,7 @@
{!! \ModStart\ModStart::js('asset/common/lazyLoad.js') !!}
@section('bodyContent')
<div class="tw-text-white tw-text-lg tw-py-20 tw-bg-gray-500 ub-cover"
<div class="lg:tw-text-left tw-text-center tw-text-white tw-text-lg tw-py-20 tw-bg-gray-500 ub-cover"
@if($cat['bannerBg']) style="background-image:url({{\ModStart\Core\Assets\AssetsUtil::fix($cat['bannerBg'])}});" @endif
>
<div class="ub-container">
......@@ -70,7 +70,7 @@
</div>
</div>
<div class="body ub-list-items">
@foreach($latestRecords as $a)
@foreach(\MCms::latestCat($cat['id']) as $a)
<a class="item-c" href="{{$a['_url']}}">{{$a['title']}}</a>
@endforeach
</div>
......
......@@ -7,7 +7,7 @@
{!! \ModStart\ModStart::js('asset/common/lazyLoad.js') !!}
@section('bodyContent')
<div class="tw-text-white tw-text-lg tw-py-20 tw-bg-gray-500 ub-cover"
<div class="lg:tw-text-left tw-text-center tw-text-white tw-text-lg tw-py-20 tw-bg-gray-500 ub-cover"
@if($cat['bannerBg']) style="background-image:url({{\ModStart\Core\Assets\AssetsUtil::fix($cat['bannerBg'])}});" @endif
>
<div class="ub-container">
......@@ -56,7 +56,7 @@
</div>
</div>
<div class="body ub-list-items">
@foreach($latestRecords as $a)
@foreach(\MCms::latestCat($cat['id']) as $a)
<a class="item-c" href="{{$a['_url']}}">{{$a['title']}}</a>
@endforeach
</div>
......
......@@ -7,7 +7,7 @@
{!! \ModStart\ModStart::js('asset/common/lazyLoad.js') !!}
@section('bodyContent')
<div class="tw-text-white tw-text-lg tw-py-20 tw-bg-gray-500 ub-cover"
<div class="lg:tw-text-left tw-text-center tw-text-white tw-text-lg tw-py-20 tw-bg-gray-500 ub-cover"
@if($cat['bannerBg']) style="background-image:url({{\ModStart\Core\Assets\AssetsUtil::fix($cat['bannerBg'])}});" @endif
>
<div class="ub-container">
......
@extends($_viewFrame)
@section('pageTitleMain'){{$cat['seoTitle']?$cat['seoTitle']:$cat['title']}}@endsection
@section('pageKeywords'){{$cat['seoKeywords']?$cat['seoKeywords']:$cat['title']}}@endsection
@section('pageDescription'){{$cat['seoDescription']?$cat['seoDescription']:$cat['title']}}@endsection
@section('bodyContent')
<div class="lg:tw-text-left tw-text-center tw-text-white tw-text-lg tw-py-20 tw-bg-gray-500 ub-cover"
@if($cat['bannerBg']) style="background-image:url({{\ModStart\Core\Assets\AssetsUtil::fix($cat['bannerBg'])}});" @endif
>
<div class="ub-container">
<h1 class="tw-text-4xl animated fadeInUp">{{$cat['title']}}</h1>
<div class="tw-mt-4 animated fadeInUp">
{{$cat['subTitle']}}
</div>
</div>
</div>
<div class="ub-container" style="max-width:800px;">
<div class="ub-breadcrumb">
<a href="{{modstart_web_url('')}}">首页</a>
@foreach($catChain as $i=>$c)
<a href="{{modstart_web_url($c['url'])}}">{{$c['title']}}</a>
@endforeach
</div>
</div>
<div class="ub-container" style="max-width:800px;">
<div class="ub-panel" style="padding:2rem 1rem;">
<form action="?" method="post" data-ajax-form>
<div class="ub-form">
@if(!empty($cat['_model']['_customFields']))
@foreach($cat['_model']['_customFields'] as $customField)
<div class="line">
<div class="label">
@if($customField['isRequired'])
<span>*</span>
@endif
{{$customField['title']}}
</div>
<div class="field">
@if($customField['fieldType']==\Module\Cms\Type\CmsModelFieldType::TEXT)
<input class="form" type="text" name="{{$customField['name']}}" />
@endif
@if($customField['fieldType']==\Module\Cms\Type\CmsModelFieldType::TEXTAREA)
<textarea class="form" style="height:3rem;" name="{{$customField['name']}}"></textarea>
@endif
</div>
</div>
@endforeach
@endif
<div class="line">
<div class="label">
<span>*</span>
内容:
</div>
<div class="field">
<textarea class="form" style="height:3rem;" name="content"></textarea>
</div>
</div>
<div class="line">
<div class="label">&nbsp;</div>
<div class="field">
<button type="submit" class="btn btn-primary">提交</button>
</div>
</div>
</div>
</form>
</div>
</div>
@endsection
......@@ -16,7 +16,6 @@
<div class="ub-container">
<div class="tw-bg-white tw-p-4 lg:tw-p-8 tw-rounded margin-top">
<div class="row">
<div class="col-md-3">
......
......@@ -6,7 +6,7 @@
@section('bodyContent')
<div class="tw-text-white tw-text-lg tw-py-20 tw-bg-gray-500 ub-cover"
<div class="lg:tw-text-left tw-text-center tw-text-white tw-text-lg tw-py-20 tw-bg-gray-500 ub-cover"
@if($cat['bannerBg'])
style="background-image:url({{\ModStart\Core\Assets\AssetsUtil::fix($cat['bannerBg'])}});"
@endif
......
......@@ -6,7 +6,7 @@
@section('bodyContent')
<div class="tw-text-white tw-text-lg tw-py-20 tw-bg-gray-500 ub-cover"
<div class="lg:tw-text-left tw-text-center tw-text-white tw-text-lg tw-py-20 tw-bg-gray-500 ub-cover"
@if($cat['bannerBg'])
style="background-image:url({{\ModStart\Core\Assets\AssetsUtil::fix($cat['bannerBg'])}});"
@endif
......
......@@ -6,7 +6,7 @@
@section('bodyContent')
<div class="tw-text-white tw-text-lg tw-py-20 tw-bg-gray-500 ub-cover"
<div class="lg:tw-text-left tw-text-center tw-text-white tw-text-lg tw-py-20 tw-bg-gray-500 ub-cover"
@if($cat['bannerBg'])
style="background-image:url({{\ModStart\Core\Assets\AssetsUtil::fix($cat['bannerBg'])}});"
@endif
......
......@@ -6,7 +6,7 @@
@section('bodyContent')
<div class="tw-text-white tw-text-lg tw-py-20 tw-bg-gray-500 ub-cover"
<div class="lg:tw-text-left tw-text-center tw-text-white tw-text-lg tw-py-20 tw-bg-gray-500 ub-cover"
@if($cat['bannerBg'])
style="background-image:url({{\ModStart\Core\Assets\AssetsUtil::fix($cat['bannerBg'])}});"
@endif
......@@ -42,7 +42,6 @@
href="{{modstart_web_url($c['url'])}}">{{$c['title']}}</a>
@endforeach
</div>
</div>
<div class="col-md-9">
<div class="ub-panel">
......
......@@ -6,7 +6,7 @@
@section('bodyContent')
<div class="tw-text-white tw-text-lg tw-py-20 tw-bg-gray-500 ub-cover"
<div class="lg:tw-text-left tw-text-center tw-text-white tw-text-lg tw-py-20 tw-bg-gray-500 ub-cover"
@if($cat['bannerBg'])
style="background-image:url({{\ModStart\Core\Assets\AssetsUtil::fix($cat['bannerBg'])}});"
@endif
......
@extends($_viewFrame)
@section('pageTitleMain'){{$cat['seoTitle']?$cat['seoTitle']:$cat['title']}}@endsection
@section('pageKeywords'){{$cat['seoKeywords']?$cat['seoKeywords']:$cat['title']}}@endsection
@section('pageDescription'){{$cat['seoDescription']?$cat['seoDescription']:$cat['title']}}@endsection
{!! \ModStart\ModStart::js('asset/common/lazyLoad.js') !!}
@section('bodyContent')
<div class="lg:tw-text-left tw-text-center tw-text-white tw-text-lg tw-py-20 tw-bg-gray-500 ub-cover"
@if($cat['bannerBg']) style="background-image:url({{\ModStart\Core\Assets\AssetsUtil::fix($cat['bannerBg'])}});" @endif
>
<div class="ub-container">
<h1 class="tw-text-4xl animated fadeInUp">{{$cat['title']}}</h1>
<div class="tw-mt-4 animated fadeInUp">
{{$cat['subTitle']}}
</div>
</div>
</div>
<div class="ub-container">
<div class="ub-breadcrumb">
<a href="{{modstart_web_url('')}}">首页</a>
@foreach($catChain as $i=>$c)
<a href="{{modstart_web_url($c['url'])}}">{{$c['title']}}</a>
@endforeach
</div>
</div>
<div class="ub-container">
<div class="row">
<div class="col-md-12">
<div class="ub-panel" style="padding:1rem;">
<div class="ub-article">
<h1 class="ub-text-center">{{$record['title']}}</h1>
<div class="attr ub-text-center">
<i class="iconfont icon-time"></i>
{{($record['postTime'])}}
</div>
<div class="content ub-html" style="font-size:0.8rem;">
{!! \ModStart\Core\Util\HtmlUtil::replaceImageSrcToLazyLoad($record['_data']['content'],'data-src',true) !!}
</div>
</div>
</div>
</div>
</div>
</div>
@endsection
<?php
namespace Module\Cms\Web\Controller;
use ModStart\Core\Exception\BizException;
use ModStart\Core\Input\InputPackage;
use ModStart\Core\Input\Request;
use ModStart\Module\ModuleBaseController;
use Module\Cms\Util\CmsCatUtil;
use Module\Cms\Util\CmsModelUtil;
class BaseCatController extends ModuleBaseController
{
protected function setup($id = 0)
{
$input = InputPackage::buildFromInput();
if (empty($id)) {
$cat = CmsCatUtil::getByUrl(Request::path());
} else {
$cat = CmsCatUtil::get($id);
}
BizException::throwsIfEmpty('分类不存在', $cat);
$catRoot = CmsCatUtil::root($cat['id']);
$catChildren = CmsCatUtil::children($cat['id']);
$catRootChildren = CmsCatUtil::children($catRoot['id']);
$catChain = CmsCatUtil::chain($cat['id']);
$model = CmsModelUtil::get($cat['modelId']);
BizException::throwsIfEmpty('模型不存在', $model);
return [
'cat' => $cat,
'catRoot' => $catRoot,
'catChildren' => $catChildren,
'catRootChildren' => $catRootChildren,
'catChain' => $catChain,
];
}
protected function getView($data, $key)
{
$cat = $data['cat'];
$model = $cat['_model'];
$view = $cat[$key];
if (empty($view)) {
$view = $model[$key];
}
BizException::throwsIfEmpty('模板未找到', $view);
return $view;
}
}
\ No newline at end of file
......@@ -14,7 +14,6 @@ class DetailController extends ModuleBaseController
{
public function index($id = 0)
{
$data = null;
if (is_numeric($id)) {
$data = CmsContentUtil::get($id);
} else {
......@@ -24,8 +23,6 @@ class DetailController extends ModuleBaseController
$catChain = CmsCatUtil::chain($cat['id']);
$catRoot = CmsCatUtil::root($cat['id']);
$catRootChildren = CmsCatUtil::children($catRoot['id']);
$paginateData = CmsContentUtil::paginateCat($catRoot['id'], 1, 10);
$latestRecords = $paginateData['records'];
$view = $cat['detailTemplate'];
if (empty($view)) {
$view = $data['model']['detailTemplate'];
......@@ -38,8 +35,6 @@ class DetailController extends ModuleBaseController
$viewData['catChain'] = $catChain;
$viewData['catRootChildren'] = $catRootChildren;
$viewData['model'] = $data['model'];
$viewData['latestRecords'] = $latestRecords;
// return $viewData;
return $this->view('cms.detail.' . CmsTemplateUtil::toBladeView($view), $viewData);
}
}
<?php
namespace Module\Cms\Web\Controller;
use Carbon\Carbon;
use ModStart\Core\Input\InputPackage;
use ModStart\Core\Input\Request;
use ModStart\Core\Input\Response;
use Module\Cms\Type\CmsModelFieldType;
use Module\Cms\Util\CmsContentUtil;
use Module\Cms\Util\CmsTemplateUtil;
class FormController extends BaseCatController
{
public function index($id = 0)
{
$data = parent::setup($id);
$view = $this->getView($data, 'formTemplate');
$viewData = $data;
return $this->view('cms.form.' . CmsTemplateUtil::toBladeView($view), $viewData);
}
public function submit($id = 0)
{
$data = parent::setup($id);
$input = InputPackage::buildFromInput();
$submitData = [];
$submitData['content'] = $input->getRichContent('content');
$customFields = isset($data['cat']['_model']['_customFields']) ? $data['cat']['_model']['_customFields'] : [];
if (!empty($customFields)) {
foreach ($customFields as $customField) {
switch ($customField['fieldType']) {
case CmsModelFieldType::TEXT:
case CmsModelFieldType::TEXTAREA:
case CmsModelFieldType::RADIO:
case CmsModelFieldType::SELECT:
case CmsModelFieldType::RICH_TEXT:
$submitData[$customField['name']] = $input->getTrimString($customField['name']);
break;
case CmsModelFieldType::CHECKBOX:
$submitData[$customField['name']] = $input->getArray($customField['name']);
break;
case CmsModelFieldType::IMAGE:
$submitData[$customField['name']] = $input->getImagePath($customField['name']);
break;
case CmsModelFieldType::FILE:
$submitData[$customField['name']] = $input->getFilePath($customField['name']);
break;
case CmsModelFieldType::DATE:
$submitData[$customField['name']] = $input->getDate($customField['name']);
break;
case CmsModelFieldType::DATETIME:
$submitData[$customField['name']] = $input->getDatetime($customField['name']);
break;
default:
return Response::generateError('错误的字段类型');
}
if (!empty($customField['isRequired'])) {
if (empty($submitData[$customField['name']])) {
return Response::generateError($customField['title'] . '不能为空');
}
}
switch ($customField['fieldType']) {
case CmsModelFieldType::CHECKBOX:
$submitData[$customField['name']] = json_encode($submitData[$customField['name']], JSON_UNESCAPED_UNICODE);
break;
}
}
}
if (empty($submitData['content'])) {
if (Request::isAjax()) {
return Response::generateError('内容为空');
}
return Response::send(-1, '内容为空', null, Request::headerReferer());
}
$submitDataPrimary = [];
$submitDataPrimary['catId'] = $data['cat']['id'];
$submitDataPrimary['postTime'] = Carbon::now();
CmsContentUtil::insert($data['cat']['_model'], $submitDataPrimary, $submitData);
if (Request::isAjax()) {
return Response::generate(0, '提交成功', null, '[reload]');
}
return Response::send(0, '提交成功', null, Request::headerReferer());
}
}
\ No newline at end of file
......@@ -4,51 +4,25 @@
namespace Module\Cms\Web\Controller;
use ModStart\Core\Exception\BizException;
use ModStart\Core\Input\InputPackage;
use ModStart\Core\Input\Request;
use ModStart\Core\Util\PageHtmlUtil;
use ModStart\Module\ModuleBaseController;
use Module\Cms\Util\CmsCatUtil;
use Module\Cms\Util\CmsContentUtil;
use Module\Cms\Util\CmsModelUtil;
use Module\Cms\Util\CmsTemplateUtil;
class ListController extends ModuleBaseController
class ListController extends BaseCatController
{
public function index($id = 0)
{
$data = parent::setup($id);
$view = $this->getView($data, 'listTemplate');
$cat = $data['cat'];
$input = InputPackage::buildFromInput();
$cat = null;
if (empty($id)) {
$cat = CmsCatUtil::getByUrl(Request::path());
} else {
$cat = CmsCatUtil::get($id);
}
BizException::throwsIfEmpty('分类不存在', $cat);
$catRoot = CmsCatUtil::root($cat['id']);
$catChildren = CmsCatUtil::children($cat['id']);
$catRootChildren = CmsCatUtil::children($catRoot['id']);
$catChain = CmsCatUtil::chain($cat['id']);
$page = $input->getPage();
$pageSize = $input->getPageSize('pageSize');
if ($pageSize == 10) {
$pageSize = 12;
}
$paginateData = CmsContentUtil::paginateCat($cat['id'], $page, $pageSize);
$view = $cat['listTemplate'];
if (empty($view)) {
$model = CmsModelUtil::get($cat['modelId']);
BizException::throwsIfEmpty('模型不存在', $model);
$view = $model['listTemplate'];
}
BizException::throwsIfEmpty('模板未找到', $view);
$viewData = [];
$viewData['cat'] = $cat;
$viewData['catChildren'] = $catChildren;
$viewData['catRoot'] = $catRoot;
$viewData['catRootChildren'] = $catRootChildren;
$viewData['catChain'] = $catChain;
$viewData = $data;
$viewData['records'] = $paginateData['records'];
$viewData['pageHtml'] = PageHtmlUtil::render($paginateData['total'], $pageSize, $page, '?page={page}');
return $this->view('cms.list.' . CmsTemplateUtil::toBladeView($view), $viewData);
......
<?php
namespace Module\Cms\Web\Controller;
use Module\Cms\Util\CmsContentUtil;
use Module\Cms\Util\CmsTemplateUtil;
class PageController extends BaseCatController
{
public function index($id = 0)
{
$data = parent::setup($id);
$view = $this->getView($data, 'pageTemplate');
$cat = $data['cat'];
$viewData = $data;
$records = CmsContentUtil::allCat($cat['id']);
$viewData['record'] = isset($records[0]) ? $records[0] : null;
$viewData['records'] = $records;
return $this->view('cms.page.' . CmsTemplateUtil::toBladeView($view), $viewData);
}
}
\ No newline at end of file
<?php
/* @var \Illuminate\Routing\Router $router */
use Module\Cms\Type\CmsMode;
use Module\Cms\Util\CmsCatUtil;
$router->group([
'middleware' => [
\Module\Member\Middleware\WebAuthMiddleware::class,
......@@ -10,9 +14,21 @@ $router->group([
$router->match(['get', 'post'], 'a/{alias_url}', 'DetailController@index');
$router->match(['get', 'post'], 'c/{id}', 'ListController@index');
foreach (\Module\Cms\Util\CmsCatUtil::allSafely() as $item) {
if (!empty($item['url'])) {
$router->match(['get', 'post'], $item['url'], 'ListController@index');
foreach (CmsCatUtil::allSafely() as $item) {
if (empty($item['url'])) {
continue;
}
switch ($item['_model']['mode']) {
case CmsMode::LIST_DETAIL:
$router->match(['get'], $item['url'], 'ListController@index');
break;
case CmsMode::FORM:
$router->match(['get'], $item['url'], 'FormController@index');
$router->match(['post'], $item['url'], 'FormController@submit');
break;
case CmsMode::PAGE:
$router->match(['get'], $item['url'], 'PageController@index');
break;
}
}
......
{
"name": "Member",
"title": "通用用户系统",
"types": [
"PC",
"Mobile"
],
"require": [
"Vendor:>=1.9.0"
],
......
- 优化:调整模块操作权限
\ No newline at end of file
- 新增:模块市场增加「已禁用」列表功能
- 新增:启用模块类型筛选
- 新增:启用是否推荐筛选
- 优化:调整模块操作权限
- 优化:模块市场列表缓存本地60分钟
\ No newline at end of file
......@@ -5,6 +5,7 @@ namespace Module\ModuleStore\Util;
use Chumper\Zipper\Zipper;
use Illuminate\Support\Facades\Cache;
use ModStart\Core\Exception\BizException;
use ModStart\Core\Input\Response;
use ModStart\Core\Util\CurlUtil;
......@@ -19,7 +20,9 @@ class ModuleStoreUtil
public static function remoteModuleData()
{
return CurlUtil::getJSONData(self::REMOTE_BASE . '/api/store/module');
return Cache::remember('ModuleStore_Modules', 60, function () {
return CurlUtil::getJSONData(self::REMOTE_BASE . '/api/store/module');
});
}
public static function all()
......@@ -27,14 +30,18 @@ class ModuleStoreUtil
$storeConfig = [
'disable' => config('env.MS_MODULE_STORE_DISABLE', false),
];
$remoteModuleResult = self::remoteModuleData();
$result = self::remoteModuleData();
$categories = [];
if (!empty($remoteModuleResult['data']['categories'])) {
$categories = $remoteModuleResult['data']['categories'];
if (!empty($result['data']['categories'])) {
$categories = $result['data']['categories'];
}
$types = [];
if (!empty($result['data']['types'])) {
$types = $result['data']['types'];
}
$modules = [];
if (!empty($remoteModuleResult['data']['modules'])) {
foreach ($remoteModuleResult['data']['modules'] as $remote) {
if (!empty($result['data']['modules'])) {
foreach ($result['data']['modules'] as $remote) {
$remote['_isLocal'] = false;
$remote['_isInstalled'] = false;
$remote['_isEnabled'] = false;
......@@ -80,6 +87,7 @@ class ModuleStoreUtil
return [
'storeConfig' => $storeConfig,
'categories' => $categories,
'types' => $types,
'modules' => array_values($modules),
];
}
......
{
"name": "ModuleStore",
"title": "模块市场",
"types": [
"Admin"
],
"require": [
"Vendor:>=1.4.0"
],
......
......@@ -5,9 +5,6 @@ namespace Module\Nav\Core;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\ServiceProvider;
use ModStart\Admin\Config\AdminMenu;
use ModStart\Module\ModuleClassLoader;
use Module\SmsAliyun\Driver\SmsAliyunSender;
use Module\SmsTecmz\Driver\SmsTecmzSender;
class ModuleServiceProvider extends ServiceProvider
{
......@@ -18,6 +15,8 @@ class ModuleServiceProvider extends ServiceProvider
*/
public function boot(Dispatcher $events)
{
include __DIR__ . '/../Helpers/MNav.php';
AdminMenu::register([
[
'title' => '物料管理',
......
<?php
class MNav
{
public static function all($position = 'head')
{
$records = \Module\Nav\Util\NavUtil::listByPositionWithCache($position);
foreach ($records as $i => $v) {
$records[$i]['_attr'] = \Module\Nav\Type\NavOpenType::getBlankAttributeFromValue($v);
}
return $records;
}
}
\ No newline at end of file
{
"name": "Nav",
"types": [
"PC",
"Mobile"
],
"require": [
"Vendor"
],
......
......@@ -5,9 +5,6 @@ namespace Module\Partner\Core;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\ServiceProvider;
use ModStart\Admin\Config\AdminMenu;
use ModStart\Module\ModuleClassLoader;
use Module\SmsAliyun\Driver\SmsAliyunSender;
use Module\SmsTecmz\Driver\SmsTecmzSender;
class ModuleServiceProvider extends ServiceProvider
{
......@@ -18,6 +15,8 @@ class ModuleServiceProvider extends ServiceProvider
*/
public function boot(Dispatcher $events)
{
include __DIR__ . '/../Helpers/MPartner.php';
AdminMenu::register([
[
'title' => '物料管理',
......
<?php
/**
* Class MPartner
*
* @Util 友情链接
*/
class MPartner
{
/**
* @param string $position
* @return mixed
*
* @Util 根据位置获取友情链接数据
*/
public static function all($position = 'home')
{
return \Module\Partner\Util\PartnerUtil::listByPositionWithCache($position);
}
}
\ No newline at end of file
{
"name": "Partner",
"title": "友情链接管理",
"title": "友情链接",
"types": [
"PC",
"Mobile"
],
"require": [
"Vendor:>=1.4.0"
],
......
{
"name": "Site",
"title": "网站基础配置",
"types": [
"Admin"
],
"require": [
"Vendor:>=1.5.0"
],
......
......@@ -7,16 +7,16 @@
@section('headAppend')
@parent
<link rel="stylesheet" href="{{\ModStart\Core\Assets\AssetsUtil::fix('theme/'.modstart_config('siteTemplate','default').'/css/style.css')}}"/>
<style type="text/css">
@if(modstart_config('sitePrimaryColor',null))
<link rel="stylesheet" href="{{\ModStart\Core\Assets\AssetsUtil::fix('theme/'.\Illuminate\Support\Facades\Session::get('msSiteTemplateUsing','default').'/css/style.css')}}"/>
@if(modstart_config('sitePrimaryColor',null))
<style type="text/css">
:root{
--theme-color-primary: {{modstart_config('sitePrimaryColor')}};
--theme-color-primary-light: {{modstart_config('sitePrimaryColor')}};
--theme-color-primary-dark: {{modstart_config('sitePrimaryColor')}};
}
@endif
</style>
</style>
@endif
{!! \ModStart\Core\Hook\ModStartHook::fireInView('PageHeadAppend',$this); !!}
@endsection
......
......@@ -6,7 +6,7 @@
<div class="col-6">
<div class="link">
<div class="title">
{{modstart_config('Cms_FooterNavTitle','关于')}}
关于
</div>
<div class="list">
@foreach(\Module\Nav\Util\NavUtil::listByPositionWithCache('foot') as $nav)
......@@ -18,7 +18,7 @@
<div class="col-6">
<div class="link">
<div class="title">
{{modstart_config('Cms_FooterNavSecondaryTitle','导航')}}
导航
</div>
<div class="list">
@foreach(\Module\Nav\Util\NavUtil::listByPositionWithCache('footSecondary') as $nav)
......
......@@ -2,10 +2,6 @@
<div class="ub-container">
<div class="menu">
@if(\Module\Member\Auth\MemberUser::id())
{{-- <a class="ub-color-vip" href="/member_vip">--}}
{{-- <i class="iconfont icon-vip"></i>--}}
{{-- {{\Module\Member\Auth\MemberVip::get('title')}}--}}
{{-- </a>--}}
<a href="{{modstart_web_url('member_message')}}">
<i class="iconfont icon-bell"></i>
<?php $count = \Module\Member\Util\MemberMessageUtil::getUnreadMessageCount(\Module\Member\Auth\MemberUser::id()); ?>
......
......@@ -162,7 +162,7 @@
@media (max-width: 38.35rem) {
.ub-form {
.line {
&.wide .line, &.wide-lg .line, .line {
padding-left: 0.5rem;
padding-right: 0.5rem;
margin: 0;
......
......@@ -173,6 +173,11 @@ class Request
return \Illuminate\Support\Facades\Request::isMethod('post');
}
public static function isAjax()
{
return \Illuminate\Support\Facades\Request::ajax();
}
/**
* @return \Illuminate\Http\Request
*/
......
......@@ -6,6 +6,21 @@ namespace ModStart\Core\Util;
class CodeUtil
{
public static function cssRemoveComments($code)
{
$code = str_replace("/*", "__COMSTART", $code);
$code = str_replace("*/", "COMEND__", $code);
$code = preg_replace("/__COMSTART[\s\S]*?COMEND__/s", "", $code);
return $code;
}
public static function jsRemoveComments($code)
{
$pattern = '/(?:(?:\/\*(?:[^*]|(?:\*+[^*\/]))*\*+\/)|(?:(?<!\:|\\\|\'|\")\/\/.*))/';
$code = preg_replace($pattern, '', $code);
return $code;
}
public static function phpRemoveComments($code)
{
$commentTokens = array(T_COMMENT);
......
......@@ -42,4 +42,17 @@ class ReUtil
// echo "isWildMatch ==> $regex <-> $text\n";
return preg_match($regex, $text);
}
public static function replace($content, $regex, $callback)
{
preg_match_all($regex, $content, $mat);
foreach ($mat[0] as $i => $v) {
$row = array_map(function ($o) use ($i, $mat) {
return $o[$i];
}, $mat);
$replace = call_user_func_array($callback, [$row]);
$content = str_replace($v, $replace, $content);
}
return $content;
}
}
......@@ -35,6 +35,12 @@ class TagUtil
*/
public static function string2Array($tags, $format = 'auto')
{
if (is_array($tags)) {
$tags = join('::', $tags);
if (!empty($tags)) {
$tags = ":$tags:";
}
}
$tags = trim($tags, ':');
$tags = explode('::', $tags);
$filterTags = [];
......
......@@ -3,6 +3,8 @@
namespace ModStart\Core\View;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\View;
use ModStart\Core\Util\AgentUtil;
use Module\Vendor\Provider\SiteTemplate\SiteTemplateProvider;
......@@ -32,15 +34,34 @@ trait ResponsiveViewTrait
static $module = null;
static $templateRoot = null;
if (null === $template) {
$template = modstart_config()->getWithEnv('siteTemplate', 'default');
$msSiteTemplate = Input::get('msSiteTemplate', null);
if (!empty($msSiteTemplate)) {
$provider = SiteTemplateProvider::get($msSiteTemplate);
if (!empty($provider)) {
Session::set('msSiteTemplate', $msSiteTemplate);
}
}
if (empty($provider)) {
$msSiteTemplate = Session::get('msSiteTemplate', null);
if (!empty($msSiteTemplate)) {
$provider = SiteTemplateProvider::get($msSiteTemplate);
if (empty($provider)) {
Session::forget('msSiteTemplate');
}
}
}
$module = $this->getModule();
$provider = SiteTemplateProvider::get($template);
if (empty($provider)) {
$template = modstart_config()->getWithEnv('siteTemplate', 'default');
$provider = SiteTemplateProvider::get($template);
}
if ($provider && $provider->root()) {
$templateRoot = $provider->root();
$template = $provider->name();
} else {
$templateRoot = "theme.$template";
}
Session::put('msSiteTemplateUsing', $template);
}
/**
......
......@@ -9,7 +9,7 @@ class CascadeGroup extends AbstractField
public static function getAssets()
{
return [
'style' => '.ub-field-cascade-group{} .ub-field-cascade-group.cascade-group-hide{visibility:hidden;height:0;width:0;}',
'style' => '.ub-field-cascade-group{} .ub-field-cascade-group.cascade-group-hide{visibility:hidden;height:0;width:0;overflow:hidden;}',
];
}
......
......@@ -6,15 +6,26 @@ namespace ModStart\Field;
use ModStart\Core\Dao\ModelUtil;
use ModStart\Core\Util\ConvertUtil;
use ModStart\Core\Util\TagUtil;
class Checkbox extends AbstractField
{
/**
* 使用JSON
*/
const SERIALIZE_TYPE_DEFAULT = null;
/**
* 使用冒号分割
*/
const SERIALIZE_TYPE_COLON_SEPARATED = 1;
protected $value = [];
protected function setup()
{
$this->addVariables([
'options' => [],
'serializeType' => null,
]);
}
......@@ -24,6 +35,12 @@ class Checkbox extends AbstractField
return $this;
}
public function serializeType($value)
{
$this->addVariables(['serializeType' => $value]);
return $this;
}
public function optionModel($table, $keyName = 'id', $labelName = 'name')
{
return $this->options(ModelUtil::valueMap($table, $keyName, $labelName));
......@@ -36,17 +53,32 @@ class Checkbox extends AbstractField
public function unserializeValue($value, AbstractField $field)
{
return ConvertUtil::toArray($value);
switch ($this->getVariable('serializeType')) {
case self::SERIALIZE_TYPE_COLON_SEPARATED:
return TagUtil::string2Array($value);
default:
return ConvertUtil::toArray($value);
}
}
public function serializeValue($value, $model)
{
return json_encode($value);
switch ($this->getVariable('serializeType')) {
case self::SERIALIZE_TYPE_COLON_SEPARATED:
return TagUtil::array2String($value);
default:
return json_encode($value);
}
}
public function prepareInput($value, $model)
{
return ConvertUtil::toArray($value);
switch ($this->getVariable('serializeType')) {
case self::SERIALIZE_TYPE_COLON_SEPARATED:
return TagUtil::string2Array($value);
default:
return ConvertUtil::toArray($value);
}
}
}
......@@ -62,7 +62,7 @@ trait CanCascadeFields
protected function formatValues($operator, &$value)
{
if (in_array($operator, ['in', 'notIn'])) {
$value = Arr::wrap($value);
$value = json_encode($value);
}
if (is_array($value)) {
$value = array_map('strval', $value);
......@@ -108,6 +108,13 @@ trait CanCascadeFields
$script = <<<JS
(function () {
var operatorTable = {
'in': function(a, b) {
b = JSON.parse(b); a = String(a);
for(var i=0;i<b.length;i++){
b[i] = String(b[i]);
}
return b.indexOf(a)>=0;
},
'=': function(a, b) {
if ($.isArray(a) && $.isArray(b)) {
return $(a).not(b).length === 0 && $(b).not(a).length === 0;
......
......@@ -38,6 +38,7 @@ class ModuleManager
'name' => 'None',
'title' => 'None',
'version' => '1.0.0',
'types' => [],
'require' => [
// 'Xxx:*'
// 'Xxx:>=*'
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册