拖拽可视化新增图文模块、新增base64k库

feat/task1-c-wallet
gongfuxiang 2022-11-24 21:03:39 +08:00
parent 17a2681977
commit 96c3039e48
41 changed files with 1050 additions and 154 deletions

View File

@ -97,6 +97,7 @@ class Design extends Base
'border_style_type_list' => BaseLayout::$border_style_type_list,
'goods_view_list_show_style' => BaseLayout::$goods_view_list_show_style,
'many_images_view_list_show_style' => BaseLayout::$many_images_view_list_show_style,
'images_text_view_list_show_style' => BaseLayout::$images_text_view_list_show_style,
// 首页商品排序规则
'goods_order_by_type_list' => MyConst('goods_order_by_type_list'),

View File

@ -5,10 +5,10 @@
<legend class="am-padding-horizontal-xs am-padding-bottom-xs">
<img src="{{if empty($data['logo'])}}{{$attachment_host}}/static/common/images/default-images-mini.png{{else /}}{{$data.logo}}{{/if}}" class="am-img-thumbnail am-radius page-top-nav-logo" />
<span class="page-top-nav-title">
<span>{{$data.name}}</span>
<a href="javascript:;" class="am-icon-eyedropper am-margin-left-xs" data-am-modal="{target: '#popup-saveinfo'}"></a>
<span class="am-text-xs">{{$data.name}}</span>
<a href="javascript:;" class="am-icon-eyedropper am-text-xs am-margin-left-xs" data-am-modal="{target: '#popup-saveinfo'}"></a>
</span>
<a href="{{:MyUrl('index/design/index', ['id'=>$data['id']])}}" target="_blank" class="am-fr">查看 >></a>
<a href="{{:MyUrl('index/design/index', ['id'=>$data['id']])}}" target="_blank" class="am-fr am-text-xs am-margin-top-sm">查看 >></a>
</legend>
<div class="am-padding-bottom-sm">
<div class="layout-operate-container am-fr" data-save-url="{{:MyUrl('admin/design/save')}}" data-json="{{:urlencode(json_encode($data))}}">

View File

@ -108,6 +108,9 @@
<!-- 复制插件 -->
<script type='text/javascript' src="{{$public_host}}static/common/lib/clipboard/clipboard.min.js?v={{:MyC('home_static_cache_version')}}"></script>
<!-- base64 -->
<script type='text/javascript' src="{{$public_host}}static/common/lib/base64/base64csvtojson.js?v={{:MyC('home_static_cache_version')}}"></script>
<!-- ckplayer播放器 -->
{{if isset($is_load_ckplayer) and $is_load_ckplayer eq 1}}
<script type='text/javascript' src="{{$public_host}}static/common/lib/ckplayer/js/ckplayer.min.js?v={{:MyC('home_static_cache_version')}}"></script>

View File

@ -110,6 +110,7 @@ class Index extends Common
$assign['border_style_type_list'] = BaseLayout::$border_style_type_list;
$assign['goods_view_list_show_style'] = BaseLayout::$goods_view_list_show_style;
$assign['many_images_view_list_show_style'] = BaseLayout::$many_images_view_list_show_style;
$assign['images_text_view_list_show_style'] = BaseLayout::$images_text_view_list_show_style;
// 首页商品排序规则
$assign['goods_order_by_type_list'] = MyConst('goods_order_by_type_list');

View File

@ -72,6 +72,9 @@
<!-- 复制插件 -->
<script type='text/javascript' src="{{$public_host}}static/common/lib/clipboard/clipboard.min.js?v={{:MyC('home_static_cache_version')}}"></script>
<!-- base64 -->
<script type='text/javascript' src="{{$public_host}}static/common/lib/base64/base64csvtojson.js?v={{:MyC('home_static_cache_version')}}"></script>
<!-- 元素拖拽排序插件 -->
<script type='text/javascript' src="{{$public_host}}static/common/lib/dragsort/jquery.dragsort-0.5.2.min.js?v={{:MyC('home_static_cache_version')}}"></script>

View File

@ -45,6 +45,13 @@ class BaseLayout
'list' => '列表模式',
];
// 图文样式类型
public static $images_text_view_list_show_style = [
'updown' => '上图下文',
'leftright' => '左图右文',
'rolling' => '滚动模式',
];
/**
* 配置处理-保存
* @author Devil
@ -103,6 +110,27 @@ class BaseLayout
}
}
break;
// 图文 images-text
case 'images-text' :
foreach($vss['config']['data_list'] as &$itl)
{
$itl['images'] = ResourcesService::AttachmentPathHandle($itl['images']);
}
$key = 'content_images_';
foreach($vss['config'] as $mik=>$miv)
{
if(substr($mik, 0, strlen($key)) == $key)
{
$vss['config'][$mik] = ResourcesService::AttachmentPathHandle($miv);
}
}
break;
// 自定义html custom
case 'custom' :
$vss['config']['custom'] = empty($vss['config']['custom']) ? '' : base64_decode($vss['config']['custom']);
break;
}
}
}
@ -203,6 +231,22 @@ class BaseLayout
}
break;
// 图文 images-text
case 'images-text' :
foreach($vss['config']['data_list'] as &$itl)
{
$itl['images'] = ResourcesService::AttachmentPathViewHandle($itl['images']);
}
$key = 'content_images_';
foreach($vss['config'] as $mik=>$miv)
{
if(substr($mik, 0, strlen($key)) == $key)
{
$vss['config'][$mik] = ResourcesService::AttachmentPathViewHandle($miv);
}
}
break;
// 商品
case 'goods' :
$p = [
@ -228,6 +272,11 @@ class BaseLayout
$vss['config']['data_list'] = $res['data'];
break;
// 自定义html
case 'custom' :
$vss['config']['custom'] = empty($vss['config']['custom']) ? '' : base64_encode(htmlspecialchars_decode($vss['config']['custom']));
break;
}
}
}
@ -326,6 +375,15 @@ class BaseLayout
}
break;
// 图文 images-text
case 'images-text' :
foreach($vss['config']['data_list'] as &$itl)
{
$itl['images'] = ResourcesService::AttachmentPathViewHandle($itl['images']);
$itl['url'] = self::LayoutUrlValueHandle($itl['type'], $itl['value']);
}
break;
// 商品
case 'goods' :
$p = [
@ -384,6 +442,11 @@ class BaseLayout
'keywords_list' => $keywords_list,
];
break;
// 自定义html
case 'custom' :
$vss['config']['custom'] = empty($vss['config']['custom']) ? '' : htmlspecialchars_decode($vss['config']['custom']);
break;
}
}
}
@ -673,10 +736,10 @@ class BaseLayout
{
foreach($v as &$vs)
{
$vs = empty($vs) ? '' : urldecode($vs);
$vs = is_array($vs) ? $vs : (empty($vs) ? '' : urldecode($vs));
}
} else {
$v = empty($v) ? '' : urldecode($v);
$v = is_array($v) ? $v : (empty($v) ? '' : urldecode($v));
}
}
}

View File

@ -35,9 +35,11 @@
<div class="renovation-drag scrollspy-nav" data-am-tabs="{noSwipe: 1}" data-am-sticky>
<button type="button" draggable="true" class="am-btn am-btn-default am-radius am-btn-xs am-margin-xs" data-value="images">单图</button>
<button type="button" draggable="true" class="am-btn am-btn-default am-radius am-btn-xs am-margin-xs" data-value="many-images">多图</button>
<button type="button" draggable="true" class="am-btn am-btn-default am-radius am-btn-xs am-margin-xs" data-value="images-text">图文</button>
<button type="button" draggable="true" class="am-btn am-btn-default am-radius am-btn-xs am-margin-xs" data-value="video">视频</button>
<button type="button" draggable="true" class="am-btn am-btn-default am-radius am-btn-xs am-margin-xs" data-value="goods">商品</button>
<button type="button" draggable="true" class="am-btn am-btn-default am-radius am-btn-xs am-margin-xs" data-value="title">标题</button>
<button type="button" draggable="true" class="am-btn am-btn-default am-radius am-btn-xs am-margin-xs" data-value="custom">自定义html</button>
<button type="button" draggable="true" class="am-btn am-btn-default am-radius am-btn-xs am-margin-xs" data-value="border">辅助线</button>
<button type="button" draggable="true" class="am-btn am-btn-default am-radius am-btn-xs am-margin-xs" data-value="height">辅助空白</button>
</div>
@ -68,6 +70,8 @@
data-goods-category-name="商品分类"
data-brand-name="品牌"
data-keywords-name="关键字"
data-config-images-text-tips="请先添加图文并配置"
data-upload-images-or-title-tips="图片和标题必填一项"
data-upload-images-name="上传图片"
data-upload-images-tips="请上传图片"
data-config-images-tips="请先添加图片并配置"
@ -95,6 +99,7 @@
data-search-goods-tips="请搜索商品"
data-custom-url-name="自定义链接"
data-custom-url-tips="请至少填写一个地址"
data-data-show-modal-tips="请选择数据展示模式"
>
{{if !empty($layout_data) and is_array($layout_data)}}
{{foreach $layout_data as $k=>$v}}
@ -133,6 +138,9 @@
<!-- 侧边栏 - 模块配置 - 多图 -->
{{include file="../../../layout/view/public/offcanvas/offcanvas_module_config_many_images" /}}
<!-- 侧边栏 - 模块配置 - 图文 -->
{{include file="../../../layout/view/public/offcanvas/offcanvas_module_config_images_text" /}}
<!-- 侧边栏 - 模块配置 - 视频 -->
{{include file="../../../layout/view/public/offcanvas/offcanvas_module_config_video" /}}
@ -142,6 +150,9 @@
<!-- 侧边栏 - 模块配置 - 标题 -->
{{include file="../../../layout/view/public/offcanvas/offcanvas_module_config_title" /}}
<!-- 侧边栏 - 模块配置 - 自定义html -->
{{include file="../../../layout/view/public/offcanvas/offcanvas_module_config_custom" /}}
<!-- 侧边栏 - 模块配置 - 辅助线 -->
{{include file="../../../layout/view/public/offcanvas/offcanvas_module_config_border" /}}

View File

@ -17,6 +17,12 @@ function FormBackModuleConfigManyImages(e)
FormBackModuleConfigManyImagesHandle(e);
}
// 图文选择回调处理
function FormBackModuleConfigImagesText(e)
{
FormBackModuleConfigImagesTextHandle(e);
}
// 视频选择回调处理
function FormBackModuleConfigVideo(e)
{
@ -35,6 +41,12 @@ function FormBackModuleConfigTitle(e)
FormBackModuleConfigTitleHandle(e);
}
// 自定义html选择回调处理
function FormBackModuleConfigCustom(e)
{
FormBackModuleConfigCustomHandle(e);
}
// 辅助线选择回调处理
function FormBackModuleConfigBorder(e)
{

View File

@ -17,7 +17,7 @@
{{switch vss.value}}
{{case images}}
<a href="javascript:ModuleToPrompt('{{$vss.config.content_to_name}}');" class="module-images-content {{$vss.config.frontend_config.media_fixed.media_container_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}">
<img src="{{$vss.config.content_images}}" class="{{$vss.config.frontend_config.media_fixed.media_ent}}" />
<img src="{{$vss.config.content_images}}" class="{{$vss.config.frontend_config.media_fixed.media_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}" />
</a>
{{/case}}
{{case many-images}}
@ -28,7 +28,7 @@
{{foreach $vss.config.data_list as $i}}
<li>
<a href="javascript:ModuleToPrompt('{{$i.name}}');" class="{{$vss.config.frontend_config.media_fixed.media_container_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}">
<img src="{{$i.images}}" class="{{$vss.config.frontend_config.media_fixed.media_ent}}" />
<img src="{{$i.images}}" class="{{$vss.config.frontend_config.media_fixed.media_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}" />
</a>
</li>
{{/foreach}}
@ -41,7 +41,7 @@
<li>
<div class="module-item" style="{{$vss.config.frontend_config.item_style}}">
<a href="javascript:ModuleToPrompt('{{$i.name}}');" class="{{$vss.config.frontend_config.media_fixed.media_container_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}">
<img src="{{$i.images}}" class="{{$vss.config.frontend_config.media_fixed.media_ent}}" />
<img src="{{$i.images}}" class="{{$vss.config.frontend_config.media_fixed.media_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}" />
</a>
</div>
</li>
@ -54,7 +54,7 @@
{{foreach $vss.config.data_list as $i}}
<li>
<a href="javascript:ModuleToPrompt('{{$i.name}}');" class="{{$vss.config.frontend_config.media_fixed.media_container_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}">
<img src="{{$i.images}}" class="{{$vss.config.frontend_config.media_fixed.media_ent}}" />
<img src="{{$i.images}}" class="{{$vss.config.frontend_config.media_fixed.media_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}" />
</a>
</li>
{{/foreach}}
@ -62,9 +62,73 @@
</div>
{{/switch}}
{{/case}}
{{case images-text}}
{{switch vss.config.view_list_show_style}}
{{case rolling}}
<div class="am-slider am-slider-default am-slider-carousel {{$vss.config.frontend_config.nav_dot_ent}}" data-am-flexslider="{itemWidth: {{if empty($vss['config']['view_list_show_style_value_arr']) or empty($vss['config']['view_list_show_style_value_arr']['item_width'])}}200{{else /}}{{$vss.config.view_list_show_style_value_arr.item_width}}{{/if}}, itemMargin: {{if empty($vss['config']['view_list_show_style_value_arr']) or empty($vss['config']['view_list_show_style_value_arr']['item_margin'])}}0{{else /}}{{$vss.config.view_list_show_style_value_arr.item_margin}}{{/if}}, slideshow: {{if empty($vss['config']['view_list_show_style_value_arr']) or !isset($vss['config']['view_list_show_style_value_arr']['is_auto_play']) or $vss['config']['view_list_show_style_value_arr']['is_auto_play'] eq 0}}false{{else /}}true{{/if}}, controlNav: {{if empty($vss['config']['view_list_show_style_value_arr']) or !isset($vss['config']['view_list_show_style_value_arr']['is_nav_dot']) or $vss['config']['view_list_show_style_value_arr']['is_nav_dot'] eq 0}}false{{else /}}true{{/if}}}">
<ul class="am-slides">
{{foreach $vss.config.data_list as $ik=>$i}}
<li>
<div class="module-item" style="{{$vss.config.frontend_config.item_style}}">
<a href="javascript:ModuleToPrompt('{{$i.name}}');" class="{{$vss.config.frontend_config.media_fixed.media_container_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}">
<img src="{{$i.images}}" class="{{$vss.config.frontend_config.media_fixed.media_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}" />
</a>
{{if !empty($i['title'])}}
<p style="{{if !empty($vss['config']['frontend_config']['item_field_style']) and !empty($vss['config']['frontend_config']['item_field_style'][$ik]) and !empty($vss['config']['frontend_config']['item_field_style'][$ik]['title'])}} {{$vss.config.frontend_config.item_field_style[$ik]['title']}}{{/if}}">{{$i.title}}</p>
{{/if}}
{{if !empty($i['desc'])}}
<p style="{{if !empty($vss['config']['frontend_config']['item_field_style']) and !empty($vss['config']['frontend_config']['item_field_style'][$ik]) and !empty($vss['config']['frontend_config']['item_field_style'][$ik]['desc'])}} {{$vss.config.frontend_config.item_field_style[$ik]['desc']}}{{/if}}">{{$i.desc}}</p>
{{/if}}
</div>
</li>
{{/foreach}}
</ul>
</div>
{{/case}}
{{case leftright}}
<ul class="module-list-content {{$vss.config.frontend_config.list_ent}}">
{{foreach $vss.config.data_list as $ik=>$i}}
<li>
<div class="module-item" style="{{$vss.config.frontend_config.item_style}}">
<a href="javascript:ModuleToPrompt('{{$i.name}}');" class="am-fl {{$vss.config.frontend_config.media_fixed.media_container_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}">
<img src="{{$i.images}}" class="{{$vss.config.frontend_config.media_fixed.media_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}" />
</a>
<div class="am-fl" style="{{$vss.config.frontend_config.item_right_style}}">
{{if !empty($i['title'])}}
<p style="{{if !empty($vss['config']['frontend_config']['item_field_style']) and !empty($vss['config']['frontend_config']['item_field_style'][$ik]) and !empty($vss['config']['frontend_config']['item_field_style'][$ik]['title'])}} {{$vss.config.frontend_config.item_field_style[$ik]['title']}}{{/if}}">{{$i.title}}</p>
{{/if}}
{{if !empty($i['desc'])}}
<p style="{{if !empty($vss['config']['frontend_config']['item_field_style']) and !empty($vss['config']['frontend_config']['item_field_style'][$ik]) and !empty($vss['config']['frontend_config']['item_field_style'][$ik]['desc'])}} {{$vss.config.frontend_config.item_field_style[$ik]['desc']}}{{/if}}">{{$i.desc}}</p>
{{/if}}
</div>
</div>
</li>
{{/foreach}}
</ul>
{{/case}}
{{default /}}
<ul class="module-list-content {{$vss.config.frontend_config.list_ent}}">
{{foreach $vss.config.data_list as $ik=>$i}}
<li>
<div class="module-item" style="{{$vss.config.frontend_config.item_style}}">
<a href="javascript:ModuleToPrompt('{{$i.name}}');" class="{{$vss.config.frontend_config.media_fixed.media_container_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}">
<img src="{{$i.images}}" class="{{$vss.config.frontend_config.media_fixed.media_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}" />
</a>
{{if !empty($i['title'])}}
<p style="{{if !empty($vss['config']['frontend_config']['item_field_style']) and !empty($vss['config']['frontend_config']['item_field_style'][$ik]) and !empty($vss['config']['frontend_config']['item_field_style'][$ik]['title'])}} {{$vss.config.frontend_config.item_field_style[$ik]['title']}}{{/if}}">{{$i.title}}</p>
{{/if}}
{{if !empty($i['desc'])}}
<p style="{{if !empty($vss['config']['frontend_config']['item_field_style']) and !empty($vss['config']['frontend_config']['item_field_style'][$ik]) and !empty($vss['config']['frontend_config']['item_field_style'][$ik]['desc'])}} {{$vss.config.frontend_config.item_field_style[$ik]['desc']}}{{/if}}">{{$i.desc}}</p>
{{/if}}
</div>
</li>
{{/foreach}}
</ul>
{{/switch}}
{{/case}}
{{case video}}
<div class="module-video-content {{$vss.config.frontend_config.media_fixed.media_container_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}">
<video src="{{$vss.config.content_video}}" poster="{{if !empty($vss['config']['content_images'])}}{{$vss.config.content_images}}{{/if}}" controls class="{{$vss.config.frontend_config.media_fixed.media_ent}}">your browser does not support the video tag</video>
<video src="{{$vss.config.content_video}}" poster="{{if !empty($vss['config']['content_images'])}}{{$vss.config.content_images}}{{/if}}" controls class="{{$vss.config.frontend_config.media_fixed.media_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}">your browser does not support the video tag</video>
</div>
{{/case}}
{{case goods}}
@ -78,7 +142,7 @@
<li>
<div class="module-item" style="{{$vss.config.frontend_config.item_style}}">
<a href="{{$g.goods_url}}" target="_blank" class="{{$vss.config.frontend_config.media_fixed.media_container_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}">
<img src="{{$g.images}}" alt="{{$g.title}}" class="{{$vss.config.frontend_config.media_fixed.media_ent}}" />
<img src="{{$g.images}}" alt="{{$g.title}}" class="{{$vss.config.frontend_config.media_fixed.media_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}" />
</a>
<div class="item-bottom">
<div class="module-title">
@ -98,7 +162,7 @@
<li>
<div class="module-item" style="{{$vss.config.frontend_config.item_style}}">
<a href="{{$g.goods_url}}" target="_blank" class="{{$vss.config.frontend_config.media_fixed.media_container_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}">
<img src="{{$g.images}}" alt="{{$g.title}}" class="{{$vss.config.frontend_config.media_fixed.media_ent}}" />
<img src="{{$g.images}}" alt="{{$g.title}}" class="{{$vss.config.frontend_config.media_fixed.media_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}" />
</a>
<div class="item-bottom">
<div class="module-title">
@ -135,6 +199,11 @@
{{/if}}
</div>
{{/case}}
{{case custom}}
{{if !empty($vss['config']['custom'])}}
{{:base64_decode($vss.config.custom)}}
{{/if}}
{{/case}}
{{/switch}}
</div>
{{else /}}

View File

@ -9,7 +9,7 @@
{{switch vss.value}}
{{case images}}
<a {{if empty($vss['config']['url'])}}href="javascript:;"{{else /}}href="{{$vss.config.url}}" target="_blank"{{/if}} class="module-images-content {{$vss.config.frontend_config.media_fixed.media_container_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}">
<img src="{{$vss.config.images}}" class="{{$vss.config.frontend_config.media_fixed.media_ent}}" />
<img src="{{$vss.config.images}}" class="{{$vss.config.frontend_config.media_fixed.media_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}" />
</a>
{{/case}}
{{case many-images}}
@ -20,7 +20,7 @@
{{foreach $vss.config.data_list as $i}}
<li>
<a {{if empty($i['url'])}}href="javascript:;"{{else /}}href="{{$i.url}}" target="_blank"{{/if}} class="{{$vss.config.frontend_config.media_fixed.media_container_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}">
<img src="{{$i.images}}" class="{{$vss.config.frontend_config.media_fixed.media_ent}}" />
<img src="{{$i.images}}" class="{{$vss.config.frontend_config.media_fixed.media_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}" />
</a>
</li>
{{/foreach}}
@ -33,7 +33,7 @@
<li>
<div class="module-item" style="{{$vss.config.frontend_config.item_style}}">
<a {{if empty($i['url'])}}href="javascript:;"{{else /}}href="{{$i.url}}" target="_blank"{{/if}} class="{{$vss.config.frontend_config.media_fixed.media_container_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}">
<img src="{{$i.images}}" class="{{$vss.config.frontend_config.media_fixed.media_ent}}" />
<img src="{{$i.images}}" class="{{$vss.config.frontend_config.media_fixed.media_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}" />
</a>
</div>
</li>
@ -46,7 +46,7 @@
{{foreach $vss.config.data_list as $i}}
<li>
<a {{if empty($i['url'])}}href="javascript:;"{{else /}}href="{{$i.url}}" target="_blank"{{/if}} class="{{$vss.config.frontend_config.media_fixed.media_container_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}">
<img src="{{$i.images}}" class="{{$vss.config.frontend_config.media_fixed.media_ent}}" />
<img src="{{$i.images}}" class="{{$vss.config.frontend_config.media_fixed.media_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}" />
</a>
</li>
{{/foreach}}
@ -54,9 +54,73 @@
</div>
{{/switch}}
{{/case}}
{{case images-text}}
{{switch vss.config.view_list_show_style}}
{{case rolling}}
<div class="am-slider am-slider-default am-slider-carousel {{$vss.config.frontend_config.nav_dot_ent}}" data-am-flexslider="{itemWidth: {{if empty($vss['config']['view_list_show_style_value_arr']) or empty($vss['config']['view_list_show_style_value_arr']['item_width'])}}200{{else /}}{{$vss.config.view_list_show_style_value_arr.item_width}}{{/if}}, itemMargin: {{if empty($vss['config']['view_list_show_style_value_arr']) or empty($vss['config']['view_list_show_style_value_arr']['item_margin'])}}0{{else /}}{{$vss.config.view_list_show_style_value_arr.item_margin}}{{/if}}, slideshow: {{if empty($vss['config']['view_list_show_style_value_arr']) or !isset($vss['config']['view_list_show_style_value_arr']['is_auto_play']) or $vss['config']['view_list_show_style_value_arr']['is_auto_play'] eq 0}}false{{else /}}true{{/if}}, controlNav: {{if empty($vss['config']['view_list_show_style_value_arr']) or !isset($vss['config']['view_list_show_style_value_arr']['is_nav_dot']) or $vss['config']['view_list_show_style_value_arr']['is_nav_dot'] eq 0}}false{{else /}}true{{/if}}}">
<ul class="am-slides">
{{foreach $vss.config.data_list as $ik=>$i}}
<li>
<div class="module-item" style="{{$vss.config.frontend_config.item_style}}">
<a {{if empty($i['url'])}}href="javascript:;"{{else /}}href="{{$i.url}}" target="_blank"{{/if}} class="{{$vss.config.frontend_config.media_fixed.media_container_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}">
<img src="{{$i.images}}" class="{{$vss.config.frontend_config.media_fixed.media_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}" />
</a>
{{if !empty($i['title'])}}
<p style="{{if !empty($vss['config']['frontend_config']['item_field_style']) and !empty($vss['config']['frontend_config']['item_field_style'][$ik]) and !empty($vss['config']['frontend_config']['item_field_style'][$ik]['title'])}} {{$vss.config.frontend_config.item_field_style[$ik]['title']}}{{/if}}"><a {{if empty($i['url'])}}href="javascript:;"{{else /}}href="{{$i.url}}" target="_blank"{{/if}}><a {{if empty($i['url'])}}href="javascript:;"{{else /}}href="{{$i.url}}" target="_blank"{{/if}}>{{$i.title}}</a></a></p>
{{/if}}
{{if !empty($i['desc'])}}
<p style="{{if !empty($vss['config']['frontend_config']['item_field_style']) and !empty($vss['config']['frontend_config']['item_field_style'][$ik]) and !empty($vss['config']['frontend_config']['item_field_style'][$ik]['desc'])}} {{$vss.config.frontend_config.item_field_style[$ik]['desc']}}{{/if}}">{{$i.desc}}</p>
{{/if}}
</div>
</li>
{{/foreach}}
</ul>
</div>
{{/case}}
{{case leftright}}
<ul class="module-list-content {{$vss.config.frontend_config.list_ent}}">
{{foreach $vss.config.data_list as $ik=>$i}}
<li>
<div class="module-item" style="{{$vss.config.frontend_config.item_style}}">
<a {{if empty($i['url'])}}href="javascript:;"{{else /}}href="{{$i.url}}" target="_blank"{{/if}} class="am-fl {{$vss.config.frontend_config.media_fixed.media_container_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}">
<img src="{{$i.images}}" class="{{$vss.config.frontend_config.media_fixed.media_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}" />
</a>
<div class="am-fl" style="{{$vss.config.frontend_config.item_right_style}}">
{{if !empty($i['title'])}}
<p style="{{if !empty($vss['config']['frontend_config']['item_field_style']) and !empty($vss['config']['frontend_config']['item_field_style'][$ik]) and !empty($vss['config']['frontend_config']['item_field_style'][$ik]['title'])}} {{$vss.config.frontend_config.item_field_style[$ik]['title']}}{{/if}}"><a {{if empty($i['url'])}}href="javascript:;"{{else /}}href="{{$i.url}}" target="_blank"{{/if}}>{{$i.title}}</a></p>
{{/if}}
{{if !empty($i['desc'])}}
<p style="{{if !empty($vss['config']['frontend_config']['item_field_style']) and !empty($vss['config']['frontend_config']['item_field_style'][$ik]) and !empty($vss['config']['frontend_config']['item_field_style'][$ik]['desc'])}} {{$vss.config.frontend_config.item_field_style[$ik]['desc']}}{{/if}}">{{$i.desc}}</p>
{{/if}}
</div>
</div>
</li>
{{/foreach}}
</ul>
{{/case}}
{{default /}}
<ul class="module-list-content {{$vss.config.frontend_config.list_ent}}">
{{foreach $vss.config.data_list as $ik=>$i}}
<li>
<div class="module-item" style="{{$vss.config.frontend_config.item_style}}">
<a {{if empty($i['url'])}}href="javascript:;"{{else /}}href="{{$i.url}}" target="_blank"{{/if}} class="{{$vss.config.frontend_config.media_fixed.media_container_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}">
<img src="{{$i.images}}" class="{{$vss.config.frontend_config.media_fixed.media_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}" />
</a>
{{if !empty($i['title'])}}
<p style="{{if !empty($vss['config']['frontend_config']['item_field_style']) and !empty($vss['config']['frontend_config']['item_field_style'][$ik]) and !empty($vss['config']['frontend_config']['item_field_style'][$ik]['title'])}} {{$vss.config.frontend_config.item_field_style[$ik]['title']}}{{/if}}"><a {{if empty($i['url'])}}href="javascript:;"{{else /}}href="{{$i.url}}" target="_blank"{{/if}}>{{$i.title}}</a></p>
{{/if}}
{{if !empty($i['desc'])}}
<p style="{{if !empty($vss['config']['frontend_config']['item_field_style']) and !empty($vss['config']['frontend_config']['item_field_style'][$ik]) and !empty($vss['config']['frontend_config']['item_field_style'][$ik]['desc'])}} {{$vss.config.frontend_config.item_field_style[$ik]['desc']}}{{/if}}">{{$i.desc}}</p>
{{/if}}
</div>
</li>
{{/foreach}}
</ul>
{{/switch}}
{{/case}}
{{case video}}
<div class="module-video-content {{$vss.config.frontend_config.media_fixed.media_container_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}">
<video src="{{$vss.config.video}}" poster="{{if !empty($vss['config']['content_images'])}}{{$vss.config.content_images}}{{/if}}" controls class="{{$vss.config.frontend_config.media_fixed.media_ent}}">your browser does not support the video tag</video>
<video src="{{$vss.config.video}}" poster="{{if !empty($vss['config']['content_images'])}}{{$vss.config.content_images}}{{/if}}" controls class="{{$vss.config.frontend_config.media_fixed.media_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}">your browser does not support the video tag</video>
</div>
{{/case}}
{{case goods}}
@ -70,7 +134,7 @@
<li>
<div class="module-item" style="{{$vss.config.frontend_config.item_style}}">
<a href="{{$g.goods_url}}" target="_blank" class="{{$vss.config.frontend_config.media_fixed.media_container_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}">
<img src="{{$g.images}}" alt="{{$g.title}}" class="{{$vss.config.frontend_config.media_fixed.media_ent}}" />
<img src="{{$g.images}}" alt="{{$g.title}}" class="{{$vss.config.frontend_config.media_fixed.media_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}" />
</a>
<div class="item-bottom">
<div class="module-title">
@ -90,7 +154,7 @@
<li>
<div class="module-item" style="{{$vss.config.frontend_config.item_style}}">
<a href="{{$g.goods_url}}" target="_blank" class="{{$vss.config.frontend_config.media_fixed.media_container_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}">
<img src="{{$g.images}}" alt="{{$g.title}}" class="{{$vss.config.frontend_config.media_fixed.media_ent}}" />
<img src="{{$g.images}}" alt="{{$g.title}}" class="{{$vss.config.frontend_config.media_fixed.media_ent}}" style="{{$vss.config.frontend_config.media_fixed.media_container_style}}" />
</a>
<div class="item-bottom">
<div class="module-title">
@ -127,6 +191,11 @@
{{/if}}
</div>
{{/case}}
{{case custom}}
{{if !empty($vss['config']['custom'])}}
{{$vss.config.custom|raw}}
{{/if}}
{{/case}}
{{/switch}}
</div>
{{/if}}

View File

@ -2,7 +2,7 @@
<label>展示模式</label>
<div class="config-view-show-style">
{{foreach $goods_view_list_show_style as $k=>$v}}
<label class="am-radio-inline">
<label class="am-checkbox-inline">
<input type="radio" name="view_list_show_style" value="{{$k}}" data-am-ucheck {{if $k eq 'routine'}}checked{{/if}} /> {{$v}}
</label>
{{/foreach}}

View File

@ -0,0 +1,11 @@
<div class="am-form-group am-form-group-refreshing">
<label>展示模式</label>
<div class="config-view-show-style">
{{foreach $images_text_view_list_show_style as $k=>$v}}
<label class="am-checkbox-inline">
<input type="radio" name="view_list_show_style" value="{{$k}}" data-am-ucheck {{if $k eq 'updown'}}checked{{/if}} /> {{$v}}
</label>
{{/foreach}}
<input type="hidden" name="view_list_show_style_value" value="" />
</div>
</div>

View File

@ -2,8 +2,8 @@
<label>展示模式</label>
<div class="config-view-show-style">
{{foreach $many_images_view_list_show_style as $k=>$v}}
<label class="am-radio-inline">
<input type="radio" name="view_list_show_style" value="{{$k}}" data-am-ucheck {{if $k eq 'routine'}}checked{{/if}} /> {{$v}}
<label class="am-checkbox-inline">
<input type="radio" name="view_list_show_style" value="{{$k}}" data-am-ucheck {{if $k eq 'routine'}}checked{{/if}} /> {{$v}}
</label>
{{/foreach}}
<input type="hidden" name="view_list_show_style_value" value="" />

View File

@ -1,5 +1,11 @@
<!-- 宽度 -->
{{include file="../../../layout/view/public/style/width" key="[key]" required="[required]" width="1200" name="图片容器宽度" /}}
<!-- 高度 -->
{{include file="../../../layout/view/public/style/height" key="[key]" required="[required]" height="800" name="[name]" /}}
{{include file="../../../layout/view/public/style/height" key="[key]" required="[required]" height="800" name="图片容器高度" /}}
<!-- 圆角 -->
{{include file="../../../layout/view/public/style/border_radius" max="1000" key="[key]" required="" /}}
<!-- 是否高度100% -->
<div class="am-form-group am-form-group-refreshing">

View File

@ -1,9 +1,9 @@
<div class="am-form-group am-form-group-refreshing">
<label>行展示数量</label>
<div class="am-input-group am-input-group-sm group-list-number-width">
<input type="number" placeholder="小屏" name="view_list_number_sm" min="0" max="12" data-validation-message="小屏最大12" value="2" class="am-form-field" />
<input type="number" placeholder="中屏" name="view_list_number_md" min="0" max="12" data-validation-message="中屏最大12" value="5" class="am-form-field" />
<input type="number" placeholder="大屏" name="view_list_number_lg" min="0" max="12" data-validation-message="大屏最大12" value="5" class="am-form-field" />
<input type="number" data-is-clearout="0" placeholder="小屏" name="view_list_number_sm" min="0" max="12" data-validation-message="小屏最大12" value="2" class="am-form-field" />
<input type="number" data-is-clearout="0" placeholder="中屏" name="view_list_number_md" min="0" max="12" data-validation-message="中屏最大12" value="5" class="am-form-field" />
<input type="number" data-is-clearout="0" placeholder="大屏" name="view_list_number_lg" min="0" max="12" data-validation-message="大屏最大12" value="5" class="am-form-field" />
<span class="am-input-group-label"></span>
</div>
</div>

View File

@ -74,8 +74,10 @@
</div>
<div class="pages-custom-url-container am-padding-sm">
{{foreach :MyConst('common_platform_type') as $v}}
<div class="am-input-group am-input-group-sm am-radius">
<span class="am-input-group-label">{{$v.name}}</span>
<div class="am-input-group am-input-group-sm">
<span class="am-input-group-btn">
<button type="button" class="am-btn am-btn-default am-radius">{{$v.name}}</button>
</span>
<input type="text" name="pages_custom_url_{{$v.value}}" placeholder="{{$v.name}}" class="am-form-field am-radius" value="" />
</div>
{{/foreach}}

View File

@ -6,14 +6,14 @@
<div class="am-form-group am-form-group-refreshing">
<label>数据项宽度<span class="am-form-group-label-tips">默认200</span></label>
<div class="am-input-group am-input-group-sm">
<input type="number" placeholder="数据项宽度" name="item_width" min="0" max="600" data-validation-message="数据项宽度最大600" value="200" class="am-form-field" />
<input type="number" data-is-clearout="0" placeholder="数据项宽度" name="item_width" min="0" max="600" data-validation-message="数据项宽度最大600" value="200" class="am-form-field" />
<span class="am-input-group-label">px</span>
</div>
</div>
<div class="am-form-group am-form-group-refreshing">
<label>数据项间距</label>
<div class="am-input-group am-input-group-sm">
<input type="number" placeholder="数据项间距" name="item_margin" min="0" max="100" data-validation-message="数据项间距最大100" value="" class="am-form-field" />
<input type="number" data-is-clearout="0" placeholder="数据项间距" name="item_margin" min="0" max="100" data-validation-message="数据项间距最大100" value="" class="am-form-field" />
<span class="am-input-group-label">px</span>
</div>
</div>

View File

@ -20,7 +20,7 @@
<div class="am-panel-hd">中屏样式</div>
<div class="am-panel-bd">
<!-- 圆角 -->
{{include file="../../../layout/view/public/style/border_radius" key="_md" required="" /}}
{{include file="../../../layout/view/public/style/border_radius" max="30" key="_md" required="" /}}
<!-- 边线类型 -->
{{include file="../../../layout/view/public/style/border_style_4" key="_md" /}}
@ -41,7 +41,7 @@
<div class="am-panel-hd">小屏样式</div>
<div class="am-panel-bd">
<!-- 圆角 -->
{{include file="../../../layout/view/public/style/border_radius" key="_sm" required="" /}}
{{include file="../../../layout/view/public/style/border_radius" max="30" key="_sm" required="" /}}
<!-- 边线类型 -->
{{include file="../../../layout/view/public/style/border_style_4" key="_sm" /}}
@ -62,7 +62,7 @@
<div class="am-panel-hd">大屏样式</div>
<div class="am-panel-bd">
<!-- 圆角 -->
{{include file="../../../layout/view/public/style/border_radius" key="_lg" required="" /}}
{{include file="../../../layout/view/public/style/border_radius" max="30" key="_lg" required="" /}}
<!-- 边线类型 -->
{{include file="../../../layout/view/public/style/border_style_4" key="_lg" /}}

View File

@ -0,0 +1,18 @@
<!-- 侧边栏 - 模块配置 - 自定义代码 -->
<div id="offcanvas-module-config-custom" class="am-offcanvas module-offcanvas-container">
<div class="am-offcanvas-bar">
<div class="am-offcanvas-content am-padding-0">
<form class="am-form form-validation-module-offcanvas-custom" request-type="sync" request-value="FormBackModuleConfigCustom">
<div class="am-panel am-panel-default">
<div class="am-panel-hd">内容设置</div>
<div class="am-panel-bd">
<textarea name="custom" rows="35" placeholder="自定义html代码"></textarea>
</div>
</div>
<div class="form-submit-container">
<button type="submit" class="am-btn am-btn-primary am-radius am-btn-xs am-btn-block" data-am-loading="{loadingText: '处理中...'}">确认</button>
</div>
</form>
</div>
</div>
</div>

View File

@ -53,7 +53,7 @@
</div>
<div class="am-form-group am-form-group-refreshing">
<label>数量</label>
<input type="number" placeholder="数量" name="goods_order_limit_number" min="0" max="50" data-validation-message="数量最大50" value="10" class="am-radius am-form-field" />
<input type="number" data-is-clearout="0" placeholder="数量" name="goods_order_limit_number" min="0" max="50" data-validation-message="数量最大50" value="10" class="am-radius am-form-field" />
</div>
</div>
</div>
@ -70,7 +70,7 @@
{{include file="../../../layout/view/public/style/background_color" key="_module" required="" /}}
<!-- 圆角 -->
{{include file="../../../layout/view/public/style/border_radius" key="_module" required="" /}}
{{include file="../../../layout/view/public/style/border_radius" max="1000" key="_module" required="" /}}
<!-- 边线类型 -->
{{include file="../../../layout/view/public/style/border_style_4" key="_module" /}}
@ -94,7 +94,7 @@
<div class="am-panel-hd">商品样式</div>
<div class="am-panel-bd">
<!-- 圆角 -->
{{include file="../../../layout/view/public/style/border_radius" key="" required="" /}}
{{include file="../../../layout/view/public/style/border_radius" max="1000" key="" required="" /}}
<!-- 边线类型 -->
{{include file="../../../layout/view/public/style/border_style" key="" required="" /}}
@ -114,7 +114,7 @@
<div class="am-panel am-panel-default">
<div class="am-panel-hd">图片固定</div>
<div class="am-panel-bd">
{{include file="../../../layout/view/public/content/media_fixed" key="_media_fixed" required="" name="图片容器高度" /}}
{{include file="../../../layout/view/public/content/media_fixed" key="_media_fixed" required="" /}}
</div>
</div>

View File

@ -34,8 +34,11 @@
<div class="am-panel am-panel-default">
<div class="am-panel-hd">样式设置</div>
<div class="am-panel-bd">
<!-- 背景色 -->
{{include file="../../../layout/view/public/style/background_color" key="" required="" /}}
<!-- 圆角 -->
{{include file="../../../layout/view/public/style/border_radius" key="" required="" /}}
{{include file="../../../layout/view/public/style/border_radius" max="1000" key="" required="" /}}
<!-- 边线类型 -->
{{include file="../../../layout/view/public/style/border_style_4" key="" /}}
@ -55,7 +58,7 @@
<div class="am-panel am-panel-default">
<div class="am-panel-hd">图片固定</div>
<div class="am-panel-bd">
{{include file="../../../layout/view/public/content/media_fixed" key="_media_fixed" required="" name="图片容器高度" /}}
{{include file="../../../layout/view/public/content/media_fixed" key="_media_fixed" required="" /}}
</div>
</div>

View File

@ -0,0 +1,61 @@
<!-- 侧边栏 - 模块配置 - 图文 -->
<div id="offcanvas-module-config-images-text" class="am-offcanvas module-offcanvas-container" data-default-images="{{$attachment_host}}/static/common/images/default-images-mini.png">
<div class="am-offcanvas-bar">
<div class="am-offcanvas-content am-padding-0">
<form class="am-form form-validation-module-offcanvas-images-text" request-type="sync" request-value="FormBackModuleConfigImagesText">
<div class="am-panel am-panel-default">
<div class="am-panel-hd">内容设置<span class="am-form-group-label-tips-must">图片和标题必填一项</span></div>
<div class="am-panel-bd">
<div class="config-images-text-container"></div>
<div class="business-operations-submit am-text-center am-block config-images-text-item-add">+添加图文</div>
</div>
</div>
<!-- 内容样式 -->
<div class="am-panel am-panel-default">
<div class="am-panel-hd">内容样式</div>
<div class="am-panel-bd">
<!-- 展示模式 -->
{{include file="../../../layout/view/public/content/images_text_show_style" /}}
</div>
</div>
<!-- 样式设置 -->
<div class="am-panel am-panel-default">
<div class="am-panel-hd">样式设置</div>
<div class="am-panel-bd">
<!-- 背景色 -->
{{include file="../../../layout/view/public/style/background_color" key="" required="" /}}
<!-- 圆角 -->
{{include file="../../../layout/view/public/style/border_radius" max="1000" key="" required="" /}}
<!-- 边线类型 -->
{{include file="../../../layout/view/public/style/border_style_4" key="" /}}
<!-- 边线大小 -->
{{include file="../../../layout/view/public/style/border_width_color_4" key="" /}}
<!-- 外边距 -->
{{include file="../../../layout/view/public/style/margin_4" key="" /}}
<!-- 内边距 -->
{{include file="../../../layout/view/public/style/padding_4" key="" /}}
</div>
</div>
<!-- 图片固定 -->
<div class="am-panel am-panel-default">
<div class="am-panel-hd">图片固定</div>
<div class="am-panel-bd">
{{include file="../../../layout/view/public/content/media_fixed" key="_media_fixed" required="" /}}
</div>
</div>
<div class="form-submit-container">
<button type="submit" class="am-btn am-btn-primary am-radius am-btn-xs am-btn-block" data-am-loading="{loadingText: '处理中...'}">确认</button>
</div>
</form>
</div>
</div>
</div>

View File

@ -24,8 +24,11 @@
<div class="am-panel am-panel-default">
<div class="am-panel-hd">样式设置</div>
<div class="am-panel-bd">
<!-- 背景色 -->
{{include file="../../../layout/view/public/style/background_color" key="" required="" /}}
<!-- 圆角 -->
{{include file="../../../layout/view/public/style/border_radius" key="" required="" /}}
{{include file="../../../layout/view/public/style/border_radius" max="1000" key="" required="" /}}
<!-- 边线类型 -->
{{include file="../../../layout/view/public/style/border_style_4" key="" /}}
@ -45,7 +48,7 @@
<div class="am-panel am-panel-default">
<div class="am-panel-hd">图片固定</div>
<div class="am-panel-bd">
{{include file="../../../layout/view/public/content/media_fixed" key="_media_fixed" required="" name="图片容器高度" /}}
{{include file="../../../layout/view/public/content/media_fixed" key="_media_fixed" required="" /}}
</div>
</div>

View File

@ -54,7 +54,7 @@
{{include file="../../../layout/view/public/style/background_color" key="" required="" /}}
<!-- 圆角 -->
{{include file="../../../layout/view/public/style/border_radius" key="" required="" /}}
{{include file="../../../layout/view/public/style/border_radius" max="1000" key="" required="" /}}
<!-- 边线类型 -->
{{include file="../../../layout/view/public/style/border_style_4" key="" /}}

View File

@ -30,7 +30,7 @@
<div class="am-panel-hd">样式设置</div>
<div class="am-panel-bd">
<!-- 圆角 -->
{{include file="../../../layout/view/public/style/border_radius" key="" required="" /}}
{{include file="../../../layout/view/public/style/border_radius" max="1000" key="" required="" /}}
<!-- 边线类型 -->
{{include file="../../../layout/view/public/style/border_style_4" key="" /}}

View File

@ -1,7 +1,7 @@
<div class="am-form-group am-form-group-refreshing">
<label>圆角</label>
<div class="am-input-group am-input-group-sm">
<input type="number" placeholder="圆角" name="style[key]_border_radius" min="0" max="30" data-validation-message="请输入圆角、最大30的数字" value="" class="am-form-field" [required] />
<input type="number" data-is-clearout="0" placeholder="圆角" name="style[key]_border_radius" min="0" max="[max]" data-validation-message="请输入圆角、最大[max]的数字" value="" class="am-form-field" [required] />
<span class="am-input-group-label">px</span>
</div>
</div>

View File

@ -1,10 +1,10 @@
<div class="am-form-group am-form-group-refreshing">
<label>边线大小<span class="am-form-group-label-tips">上 -> 右 -> 下 -> 左</span></label>
<div class="am-input-group am-input-group-sm group-border-width group-border-radius-color">
<input type="number" placeholder="上" name="style[key]_border_width_top" min="0" max="10" data-validation-message="边线上最大10" value="" class="am-form-field" />
<input type="number" placeholder="右" name="style[key]_border_width_right" min="0" max="10" data-validation-message="边线右最大10" value="" class="am-form-field" />
<input type="number" placeholder="下" name="style[key]_border_width_bottom" min="0" max="10" data-validation-message="边线下最大10" value="" class="am-form-field" />
<input type="number" placeholder="左" name="style[key]_border_width_left" min="0" max="10" data-validation-message="边线左最大10" value="" class="am-form-field" />
<input type="number" data-is-clearout="0" placeholder="上" name="style[key]_border_width_top" min="0" max="10" data-validation-message="边线上最大10" value="" class="am-form-field" />
<input type="number" data-is-clearout="0" placeholder="右" name="style[key]_border_width_right" min="0" max="10" data-validation-message="边线右最大10" value="" class="am-form-field" />
<input type="number" data-is-clearout="0" placeholder="下" name="style[key]_border_width_bottom" min="0" max="10" data-validation-message="边线下最大10" value="" class="am-form-field" />
<input type="number" data-is-clearout="0" placeholder="左" name="style[key]_border_width_left" min="0" max="10" data-validation-message="边线左最大10" value="" class="am-form-field" />
<span class="am-input-group-label">px</span>
</div>
</div>

View File

@ -1,7 +1,7 @@
<div class="am-form-group am-form-group-refreshing">
<label>边线/颜色</label>
<div class="am-input-group am-input-group-sm group-border-radius-color">
<input type="number" placeholder="边线" name="style[key]_border_width" min="0" max="10" data-validation-message="请输入边线、最大10的数字" value="" class="am-form-field" [required] />
<input type="number" data-is-clearout="0" placeholder="边线" name="style[key]_border_width" min="0" max="10" data-validation-message="请输入边线、最大10的数字" value="" class="am-form-field" [required] />
<span class="am-input-group-label">px</span>
<input type="hidden" name="style[key]_border_color" value="" />
<a href="javascript:;" class="am-input-group-label colorpicker-submit module-style-border-color[key]" data-position="fixed" data-input-tag=".module-offcanvas-container .module-style-border-color[key]" data-color-tag=".module-offcanvas-container input[name='style[key]_border_color']" data-color-style="background-color|border-color">

View File

@ -1,10 +1,10 @@
<div class="am-form-group am-form-group-refreshing">
<label>边线大小<span class="am-form-group-label-tips">上 -> 右 -> 下 -> 左 -> 颜色</span></label>
<div class="am-input-group am-input-group-sm group-border-width group-border-radius-color">
<input type="number" placeholder="上" name="style[key]_border_width_top" min="0" max="10" data-validation-message="边线上最大10" value="" class="am-form-field" />
<input type="number" placeholder="右" name="style[key]_border_width_right" min="0" max="10" data-validation-message="边线右最大10" value="" class="am-form-field" />
<input type="number" placeholder="下" name="style[key]_border_width_bottom" min="0" max="10" data-validation-message="边线下最大10" value="" class="am-form-field" />
<input type="number" placeholder="左" name="style[key]_border_width_left" min="0" max="10" data-validation-message="边线左最大10" value="" class="am-form-field" />
<input type="number" data-is-clearout="0" placeholder="上" name="style[key]_border_width_top" min="0" max="10" data-validation-message="边线上最大10" value="" class="am-form-field" />
<input type="number" data-is-clearout="0" placeholder="右" name="style[key]_border_width_right" min="0" max="10" data-validation-message="边线右最大10" value="" class="am-form-field" />
<input type="number" data-is-clearout="0" placeholder="下" name="style[key]_border_width_bottom" min="0" max="10" data-validation-message="边线下最大10" value="" class="am-form-field" />
<input type="number" data-is-clearout="0" placeholder="左" name="style[key]_border_width_left" min="0" max="10" data-validation-message="边线左最大10" value="" class="am-form-field" />
<span class="am-input-group-label">px</span>
<input type="hidden" name="style[key]_border_color" value="" />
<a href="javascript:;" class="am-input-group-label colorpicker-submit module-style-border-color[key]" data-position="fixed" data-input-tag=".module-offcanvas-container .module-style-border-color[key]" data-color-tag=".module-offcanvas-container input[name='style[key]_border_color']" data-color-style="background-color|border-color">

View File

@ -1,7 +1,7 @@
<div class="am-form-group am-form-group-refreshing">
<label>[name]</label>
<div class="am-input-group am-input-group-sm">
<input type="number" placeholder="[name]" name="style[key]_height" min="0" max="[height]" data-validation-message="请输入[name]、最大[height]的数字" value="" class="am-form-field" [required] />
<input type="number" data-is-clearout="0" placeholder="[name]" name="style[key]_height" min="0" max="[height]" data-validation-message="请输入[name]、最大[height]的数字" value="" class="am-form-field" [required] />
<span class="am-input-group-label">px</span>
</div>
</div>

View File

@ -1,7 +1,7 @@
<div class="am-form-group am-form-group-refreshing">
<label>外边距</label>
<div class="am-input-group am-input-group-sm">
<input type="number" placeholder="外边距" name="style[key]_margin" min="0" max="30" data-validation-message="请输入外边距、最大30的数字" value="" class="am-form-field" [required] />
<input type="number" data-is-clearout="0" placeholder="外边距" name="style[key]_margin" min="0" max="30" data-validation-message="请输入外边距、最大30的数字" value="" class="am-form-field" [required] />
<span class="am-input-group-label">px</span>
</div>
</div>

View File

@ -1,10 +1,10 @@
<div class="am-form-group am-form-group-refreshing">
<label>外边距<span class="am-form-group-label-tips">上 -> 右 -> 下 -> 左</span></label>
<div class="am-input-group am-input-group-sm group-border-width">
<input type="number" placeholder="上" name="style[key]_margin_top" min="0" max="60" data-validation-message="外边距上最大60" value="" class="am-form-field" />
<input type="number" placeholder="右" name="style[key]_margin_right" min="0" max="60" data-validation-message="外边距右最大60" value="" class="am-form-field" />
<input type="number" placeholder="下" name="style[key]_margin_bottom" min="0" max="60" data-validation-message="外边距下最大60" value="" class="am-form-field" />
<input type="number" placeholder="左" name="style[key]_margin_left" min="0" max="60" data-validation-message="外边距左最大60" value="" class="am-form-field" />
<input type="number" data-is-clearout="0" placeholder="上" name="style[key]_margin_top" min="0" max="60" data-validation-message="外边距上最大60" value="" class="am-form-field" />
<input type="number" data-is-clearout="0" placeholder="右" name="style[key]_margin_right" min="0" max="60" data-validation-message="外边距右最大60" value="" class="am-form-field" />
<input type="number" data-is-clearout="0" placeholder="下" name="style[key]_margin_bottom" min="0" max="60" data-validation-message="外边距下最大60" value="" class="am-form-field" />
<input type="number" data-is-clearout="0" placeholder="左" name="style[key]_margin_left" min="0" max="60" data-validation-message="外边距左最大60" value="" class="am-form-field" />
<span class="am-input-group-label">px</span>
</div>
</div>

View File

@ -1,7 +1,7 @@
<div class="am-form-group am-form-group-refreshing">
<label>内边距</label>
<div class="am-input-group am-input-group-sm">
<input type="number" placeholder="内边距" name="style[key]_padding" min="0" max="30" data-validation-message="请输入内边距、最大30的数字" value="" class="am-form-field" [required] />
<input type="number" data-is-clearout="0" placeholder="内边距" name="style[key]_padding" min="0" max="30" data-validation-message="请输入内边距、最大30的数字" value="" class="am-form-field" [required] />
<span class="am-input-group-label">px</span>
</div>
</div>

View File

@ -1,10 +1,10 @@
<div class="am-form-group am-form-group-refreshing">
<label>内边距<span class="am-form-group-label-tips">上 -> 右 -> 下 -> 左</span></label>
<div class="am-input-group am-input-group-sm group-border-width">
<input type="number" placeholder="上" name="style[key]_padding_top" min="0" max="60" data-validation-message="内边距上最大60" value="" class="am-form-field" />
<input type="number" placeholder="右" name="style[key]_padding_right" min="0" max="60" data-validation-message="内边距右最大60" value="" class="am-form-field" />
<input type="number" placeholder="下" name="style[key]_padding_bottom" min="0" max="60" data-validation-message="内边距下最大60" value="" class="am-form-field" />
<input type="number" placeholder="左" name="style[key]_padding_left" min="0" max="60" data-validation-message="内边距左最大60" value="" class="am-form-field" />
<input type="number" data-is-clearout="0" placeholder="上" name="style[key]_padding_top" min="0" max="60" data-validation-message="内边距上最大60" value="" class="am-form-field" />
<input type="number" data-is-clearout="0" placeholder="右" name="style[key]_padding_right" min="0" max="60" data-validation-message="内边距右最大60" value="" class="am-form-field" />
<input type="number" data-is-clearout="0" placeholder="下" name="style[key]_padding_bottom" min="0" max="60" data-validation-message="内边距下最大60" value="" class="am-form-field" />
<input type="number" data-is-clearout="0" placeholder="左" name="style[key]_padding_left" min="0" max="60" data-validation-message="内边距左最大60" value="" class="am-form-field" />
<span class="am-input-group-label">px</span>
</div>
</div>

View File

@ -1,7 +1,7 @@
<div class="am-form-group am-form-group-refreshing">
<label>[name]</label>
<div class="am-input-group am-input-group-sm">
<input type="number" placeholder="[name]" name="style[key]_width" min="0" max="[width]" data-validation-message="请输入[name]、最大[width]的数字" value="" class="am-form-field" [required] />
<input type="number" data-is-clearout="0" placeholder="[name]" name="style[key]_width" min="0" max="[width]" data-validation-message="请输入[name]、最大[width]的数字" value="" class="am-form-field" [required] />
<span class="am-input-group-label">px</span>
</div>
</div>

View File

@ -12,6 +12,7 @@ namespace app\service;
use think\facade\Db;
use app\service\ResourcesService;
use app\layout\service\BaseLayout;
/**
* 页面设计服务层
@ -97,7 +98,7 @@ class DesignService
$attachment = ResourcesService::AttachmentParams($params, $data_fields);
// 配置信息
$config = empty($params['config']) ? '' : (is_array($params['config']) ? json_encode($params['config'], JSON_UNESCAPED_UNICODE) : htmlspecialchars_decode($params['config'])) ;
$config = empty($params['config']) ? '' : BaseLayout::ConfigSaveHandle($params['config']);
// 数据
$data = [

View File

@ -212,6 +212,11 @@
.colorpicker-submit {
background-color: #fff;
}
.colorpicker-submit img {
width: 14px;
height: 14px;
float: right;
}
/**
*
@ -276,13 +281,8 @@
.module-offcanvas-container .am-panel .am-panel-bd .am-form-group:last-child {
padding-bottom: 5px !important;
}
@media only screen and (max-width: 640px) {
.module-offcanvas-container .am-offcanvas-bar {
width: 280px;
}
.module-offcanvas-container .form-submit-container {
width: 279px;
}
.module-offcanvas-container .am-input-group-label {
border-color: #ddd;
}
/**
@ -310,17 +310,17 @@
.group-border-radius-color .am-input-group-label {
border-left: 0;
}
.group-border-radius-color .colorpicker-submit img {
width: 14px;
height: 14px;
}
.group-border-style .chosen-container {
width: 72px !important;
display: block;
float: left;
}
.group-border-style .chosen-container:not(:last-child) {
margin-right: 5px;
margin-right: 4px;
}
.group-text-align-style {
border: 1px solid #ddd;
padding: 5px 8px;
}
@media only screen and (max-width: 640px) {
.group-border-style .chosen-container {
@ -374,7 +374,8 @@
height: 33px;
}
#offcanvas-module-config-goods .config-goods-list li .am-close,
#offcanvas-module-config-many-images .config-many-images-container .am-panel .am-close {
#offcanvas-module-config-many-images .config-many-images-container .am-panel .am-close,
#offcanvas-module-config-images-text .config-images-text-container .am-panel .am-close {
position: absolute;
top: -8px;
right: -8px;
@ -394,14 +395,19 @@
}
/**
* -
* -
*/
#offcanvas-module-config-many-images .config-many-images-container .am-panel {
#offcanvas-module-config-many-images .config-many-images-container .am-panel,
#offcanvas-module-config-images-text .config-images-text-container .am-panel {
position: relative;
}
#offcanvas-module-config-many-images .config-many-images-container .am-panel .am-form-group:last-child {
#offcanvas-module-config-many-images .config-many-images-container .am-panel .am-form-group:last-child,
#offcanvas-module-config-images-text .config-images-text-container .am-panel .am-form-group:last-child {
padding-bottom: 5px !important;
}
#offcanvas-module-config-images-text .config-images-text-container .am-panel .group-input-font-size {
width: 110px;
}
/**
* -

View File

@ -2,6 +2,7 @@
*
*/
.layout-container [class*="am-u-"] {padding-left:0;padding-right:0;}
.layout-container a {text-decoration: none;}
/**
*

View File

@ -2723,6 +2723,59 @@ function InputClearOutHandle(e)
}
}
/**
* 颜色选择器初始化
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2022-11-23
* @desc description
*/
function ColorPickerInit()
{
// 颜色选择器
if($('.colorpicker-submit').length > 0)
{
$('.colorpicker-submit').each(function(k, v)
{
if(parseInt($(this).attr('data-is-init') || 0) == 0)
{
$(this).colorpicker(
{
target: $(this),
fillcolor: true,
success: function(o, color)
{
var style_arr = (o.context.dataset.colorStyle || 'color').split('|');
var style_value = {};
for(var i in style_arr)
{
style_value[style_arr[i]] = color;
}
$(o.context.dataset.inputTag).css(style_value);
$(o.context.dataset.colorTag).val(color);
$(o.context.dataset.colorTag).trigger('change');
},
reset: function(o)
{
var color = '';
var style_arr = (o.context.dataset.colorStyle || 'color').split('|');
var style_value = {};
for(var i in style_arr)
{
style_value[style_arr[i]] = color;
}
$(o.context.dataset.inputTag).css(style_value);
$(o.context.dataset.colorTag).val(color);
$(o.context.dataset.colorTag).trigger('change');
}
});
$(this).attr('data-is-init', 1);
}
});
}
}
// 公共数据操作
$(function()
@ -2730,6 +2783,9 @@ $(function()
// 表格初始化
FormTableContainerInit();
// 颜色选择器初始化
ColorPickerInit();
// 表格字段数据排序
$('.form-sort-container .sort-icon').on('click', function()
{
@ -3519,46 +3575,6 @@ $(function()
VideoFileUploadShow('.video-file-event');
}
// 颜色选择器
if($('.colorpicker-submit').length > 0)
{
$('.colorpicker-submit').each(function(k, v)
{
$(this).colorpicker(
{
target: $(this),
fillcolor: true,
success: function(o, color)
{
var style_arr = (o.context.dataset.colorStyle || 'color').split('|');
var style_value = {};
for(var i in style_arr)
{
style_value[style_arr[i]] = color;
}
$(o.context.dataset.inputTag).css(style_value);
$(o.context.dataset.colorTag).val(color);
$(o.context.dataset.colorTag).trigger('change');
},
reset: function(o)
{
var color = '';
var style_arr = (o.context.dataset.colorStyle || 'color').split('|');
var style_value = {};
for(var i in style_arr)
{
style_value[style_arr[i]] = color;
}
$(o.context.dataset.inputTag).css(style_value);
$(o.context.dataset.colorTag).val(color);
$(o.context.dataset.colorTag).trigger('change');
}
});
});
}
// 监听多图上传和上传附件组件的插入动作
if(typeof(upload_editor) == 'object')
{

View File

@ -2,9 +2,11 @@
FromInit('form.form-validation-layout-config');
FromInit('form.form-validation-module-offcanvas-images');
FromInit('form.form-validation-module-offcanvas-many-images');
FromInit('form.form-validation-module-offcanvas-images-text');
FromInit('form.form-validation-module-offcanvas-video');
FromInit('form.form-validation-module-offcanvas-goods');
FromInit('form.form-validation-module-offcanvas-title');
FromInit('form.form-validation-module-offcanvas-custom');
FromInit('form.form-validation-module-offcanvas-border');
FromInit('form.form-validation-module-offcanvas-height');
@ -23,9 +25,11 @@ var $layout = $('.layout-container');
var $offcanvas_layout_config = $('#offcanvas-layout-config');
var $offcanvas_config_images = $('#offcanvas-module-config-images');
var $offcanvas_config_many_images = $('#offcanvas-module-config-many-images');
var $offcanvas_config_images_text = $('#offcanvas-module-config-images-text');
var $offcanvas_config_video = $('#offcanvas-module-config-video');
var $offcanvas_config_goods = $('#offcanvas-module-config-goods');
var $offcanvas_config_title = $('#offcanvas-module-config-title');
var $offcanvas_config_custom = $('#offcanvas-module-config-custom');
var $offcanvas_config_border = $('#offcanvas-module-config-border');
var $offcanvas_config_height = $('#offcanvas-module-config-height');
@ -195,8 +199,9 @@ function ModuleToPrompt(to_name)
* @param {[object]} data [数据]
* @param {[string]} key [key]
* @param {[array]} replace_rules [替换规则]
* @param {[array]} exclude [排除样式]
*/
function StyleBaseHandle(data, key, replace_rules)
function StyleBaseHandle(data, key, replace_rules, exclude)
{
// 样式容器
var style = '';
@ -240,7 +245,10 @@ function StyleBaseHandle(data, key, replace_rules)
var l = data[key+type+'_left'] || value;
if((t != 0 || r != 0 || b != 0 || l != 0) || (t != '' || r != '' || b != '' || l != ''))
{
style += arr[i]['css']+':'+ t+unit+' '+r+unit+' '+b+unit+' '+l+unit+';';
if((exclude || null) == null || exclude.indexOf(arr[i]['css']) == -1)
{
style += arr[i]['css']+':'+ t+unit+' '+r+unit+' '+b+unit+' '+l+unit+';';
}
}
}
@ -276,6 +284,16 @@ function StyleBaseHandle(data, key, replace_rules)
"css": "color",
"unit": ""
},
{
"type": "align",
"css": "text-align",
"unit": ""
},
{
"type": "font_size",
"css": "font-size",
"unit": "px"
},
{
"type": "margin",
"css": "margin",
@ -301,19 +319,21 @@ function StyleBaseHandle(data, key, replace_rules)
{
if((data[key+arr2[i]['type']] || null) != null)
{
// 样式值
var v = data[key+arr2[i]['type']]+arr2[i]['unit'];
// 替换规则
// rules {"field":{"value":"hello","var":"var"}}
if((replace_rules || null) != null && (replace_rules[arr2[i]['type']] || null) != null)
if((exclude || null) == null || exclude.indexOf(arr2[i]['css']) == -1)
{
var rules = replace_rules[arr2[i]['type']];
var reg = new RegExp(rules['var'], 'g');
v = rules['value'].replace(reg, data[key+arr2[i]['type']]);
}
// 样式值
var v = data[key+arr2[i]['type']]+arr2[i]['unit'];
style += arr2[i]['css']+':'+v+';';
// 替换规则
// rules {"field":{"value":"hello","var":"var"}}
if((replace_rules || null) != null && (replace_rules[arr2[i]['type']] || null) != null)
{
var rules = replace_rules[arr2[i]['type']];
var reg = new RegExp(rules['var'], 'g');
v = rules['value'].replace(reg, data[key+arr2[i]['type']]);
}
style += arr2[i]['css']+':'+v+';';
}
}
}
@ -487,7 +507,7 @@ function FormBackModuleConfigImagesHandle(data)
// html拼接
var html = '<div class="module-images-container" style="'+style+'">';
html += '<a href="javascript:ModuleToPrompt(\''+(data.content_to_name || '')+'\');" class="'+media_fixed.media_container_ent+'" style="'+media_fixed.media_container_style+'">';
html += '<img src="'+data['content_images']+'" class="'+media_fixed.media_ent+'" />';
html += '<img src="'+data['content_images']+'" class="'+media_fixed.media_ent+'" style="'+media_fixed.media_container_style+'" />';
html += '</a>';
html += '</div>';
var $doc = $(doc);
@ -521,7 +541,7 @@ function FormBackModuleConfigManyImagesHandle(data)
return false;
}
// 多图图片
// 数据字段
var fields = {
"content_images_": "images",
"content_to_name_": "name",
@ -532,18 +552,20 @@ function FormBackModuleConfigManyImagesHandle(data)
var data_list = [];
for(var i in data)
{
for(var f in fields)
var loc = i.lastIndexOf('_');
if(loc != -1)
{
if(i.substr(0, f.length) == f)
var key = i.substr(0, loc+1);
var last = i.substr(loc+1);
for(var f in fields)
{
var key = i.replace(f, '') || null;
if(key != null)
if(key == f)
{
// 临时索引记录
var index = key_temp.indexOf(key);
var index = key_temp.indexOf(last);
if(index == -1)
{
key_temp.push(key);
key_temp.push(last);
index = key_temp.length-1;
}
@ -553,8 +575,8 @@ function FormBackModuleConfigManyImagesHandle(data)
data_list[index] = {};
}
data_list[index][fields[f]] = (fields[f] != 'value' || (data[i] || null) == null) ? data[i] : (JSON.parse(decodeURIComponent(data[i])) || '');
delete data[i];
}
delete data[i];
}
}
}
@ -589,7 +611,7 @@ function FormBackModuleConfigManyImagesHandle(data)
{
item_html += '<li>';
item_html += '<a href="javascript:ModuleToPrompt(\''+(data_list[i]['name'] || '')+'\');" class="'+media_fixed.media_container_ent+'" style="'+media_fixed.media_container_style+'">'
item_html += '<img src="'+data_list[i]['images']+'" class="'+media_fixed.media_ent+'" />';
item_html += '<img src="'+data_list[i]['images']+'" class="'+media_fixed.media_ent+'" style="'+media_fixed.media_container_style+'" />';
item_html += '</a>';
item_html += '</li>';
}
@ -641,13 +663,13 @@ function FormBackModuleConfigManyImagesHandle(data)
var lg = show_style_value.view_list_number_lg || 5;
// 外边距
var margin = show_style_value.style_margin || 0;
var item_margin = parseInt(show_style_value.style_margin || 0);
// 数据项样式处理
var item_style = (margin > 0) ? 'margin:'+margin+'px 0 0 '+margin+'px;' : '';
var item_style = (item_margin > 0) ? 'margin:'+item_margin+'px 0 0 '+item_margin+'px;' : '';
// 设置了外边距,则计算平均移动值
var avg = (margin > 0) ? 'module-list-content-avg-'+margin : '';
var avg = (item_margin > 0) ? 'module-list-content-avg-'+item_margin : '';
// 列表class
list_ent = avg+' module-list-sm-'+sm+' module-list-md-'+md+' module-list-lg-'+md+' ';
@ -658,7 +680,7 @@ function FormBackModuleConfigManyImagesHandle(data)
html += '<li>';
html += '<div class="module-item" style="'+item_style+'">';
html += '<a href="javascript:ModuleToPrompt(\''+(data_list[i]['name'] || '')+'\');" class="'+media_fixed.media_container_ent+'" style="'+media_fixed.media_container_style+'">'
html += '<img src="'+data_list[i]['images']+'" class="'+media_fixed.media_ent+'" />';
html += '<img src="'+data_list[i]['images']+'" class="'+media_fixed.media_ent+'" style="'+media_fixed.media_container_style+'" />';
html += '</a>';
html += '</div>';
html += '</li>';
@ -701,6 +723,245 @@ function FormBackModuleConfigManyImagesHandle(data)
$offcanvas_config_many_images.offCanvas('close');
}
/**
* 模块-图文处理
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-05-18
* @desc description
* @param {[object]} data [表单数据]
*/
function FormBackModuleConfigImagesTextHandle(data)
{
// 基础信息
var doc = $offcanvas_config_images_text.attr('data-doc') || null;
if(doc == null)
{
Prompt($layout.data('module-tab-tips') || '模块标记有误');
return false;
}
// 数据字段
var fields = {
"content_images_": "images",
"content_title_": "title",
"content_title_style_color_": "title_style_color",
"content_title_style_font_size_": "title_style_font_size",
"content_title_style_align_": "title_style_align",
"content_title_style_margin_top_": "title_style_margin_top",
"content_title_style_margin_right_": "title_style_margin_right",
"content_title_style_margin_bottom_": "title_style_margin_bottom",
"content_title_style_margin_left": "title_style_margin_left",
"content_desc_": "desc",
"content_desc_style_color_": "desc_style_color",
"content_desc_style_font_size_": "desc_style_font_size",
"content_desc_style_align_": "desc_style_align",
"content_desc_style_margin_top_": "desc_style_margin_top",
"content_desc_style_margin_right_": "desc_style_margin_right",
"content_desc_style_margin_bottom_": "desc_style_margin_bottom",
"content_desc_style_margin_left": "desc_style_margin_left",
"content_to_name_": "name",
"content_to_type_": "type",
"content_to_value_": "value"
};
var key_temp = [];
var data_list = [];
for(var i in data)
{
var loc = i.lastIndexOf('_');
if(loc != -1)
{
var key = i.substr(0, loc+1);
var last = i.substr(loc+1);
for(var f in fields)
{
if(key == f)
{
// 临时索引记录
var index = key_temp.indexOf(last);
if(index == -1)
{
key_temp.push(last);
index = key_temp.length-1;
}
// 数据组合
if(data_list[index] == undefined)
{
data_list[index] = {};
}
data_list[index][fields[f]] = (fields[f] != 'value' || (data[i] || null) == null) ? data[i] : (JSON.parse(decodeURIComponent(data[i])) || '');
delete data[i];
}
}
}
}
if(data_list.length <= 0)
{
Prompt($layout.data('config-images-text-tips') || '请先添加图文并配置');
return false;
}
for(var i in data_list)
{
if((data_list[i]['images'] || null) == null && (data_list[i]['title'] || null) == null)
{
Prompt($layout.data('upload-images-or-title-tips') || '图片和标题必填一项');
return false;
}
}
// 展示模式
var show_style = data.view_list_show_style || null;
if(show_style == null)
{
Prompt($layout.data('data-show-modal-tips') || '请选择数据展示模式');
return false;
}
// 样式处理
var style = StyleBaseHandle(data, 'style_');
// 图片固定
var media_fixed = MediaFixedHandle(data);
// html拼接
var html = '<div class="module-slider-container" style="'+style+'">';
// 初始化参数
var option = {};
// 参数处理
var show_style_value = ViewListShowStyleValueHandle(data.view_list_show_style_value);
// 外边距
var item_margin = parseInt(show_style_value.style_margin || 0);
// 数据项样式处理
var item_style = (item_margin > 0 && show_style != 'rolling') ? 'margin:'+item_margin+'px 0 0 '+item_margin+'px;' : '';
// 内容处理
var item_html = '';
var item_right_style = '';
var item_field_style = [];
for(var i in data_list)
{
// 字段样式
if(item_field_style[i] == undefined)
{
item_field_style[i] = {};
}
item_field_style[i]['title'] = StyleBaseHandle(data_list[i], 'title_style_');
item_field_style[i]['desc'] = StyleBaseHandle(data_list[i], 'desc_style_');
// 拼接html
item_html += '<li>';
item_html += '<div class="module-item" style="'+item_style+'">';
switch(show_style)
{
// 左右
case 'leftright' :
var style_media_fixed_width = parseInt(data.style_media_fixed_width || 0);
item_right_style = 'margin-left:10px;'+((style_media_fixed_width > 0) ? 'width: calc(100% - '+(style_media_fixed_width+10)+'px);' : '');
item_html += '<a href="javascript:ModuleToPrompt(\''+(data_list[i]['name'] || '')+'\');" class="am-fl '+media_fixed.media_container_ent+'" style="'+media_fixed.media_container_style+'">'
item_html += '<img src="'+data_list[i]['images']+'" class="'+media_fixed.media_ent+'" style="'+media_fixed.media_container_style+'" />';
item_html += '</a>';
item_html += '<div class="am-fl" style="'+item_right_style+'">';
if((data_list[i]['title'] || null) != null)
{
item_html += '<p style="'+item_field_style[i]['title']+'">'+data_list[i]['title']+'</p>';
}
if((data_list[i]['desc'] || null) != null)
{
item_html += '<p style="'+item_field_style[i]['desc']+'">'+data_list[i]['desc']+'</p>';
}
item_html += '</div>';
break;
// 默认 上下、滚动
case 'updown' :
default :
item_html += '<a href="javascript:ModuleToPrompt(\''+(data_list[i]['name'] || '')+'\');" class="'+media_fixed.media_container_ent+'" style="'+media_fixed.media_container_style+'">'
item_html += '<img src="'+data_list[i]['images']+'" class="'+media_fixed.media_ent+'" style="'+media_fixed.media_container_style+'" />';
item_html += '</a>';
if((data_list[i]['title'] || null) != null)
{
item_html += '<p style="'+item_field_style[i]['title']+'">'+data_list[i]['title']+'</p>';
}
if((data_list[i]['desc'] || null) != null)
{
item_html += '<p style="'+item_field_style[i]['desc']+'">'+data_list[i]['desc']+'</p>';
}
break;
}
item_html += '</div>';
item_html += '</li>';
}
// 滚动
var nav_dot_ent = '';
var list_ent = '';
if(show_style == 'rolling')
{
// 参数处理
var show_style_value = ViewRollingShowStyleValueHandle(data.view_list_show_style_value);
// 是否展示导航点
nav_dot_ent = show_style_value.is_nav_dot ? '' : 'slides-rolling-not-dot';
// html拼接
html += '<div class="am-slider am-slider-default am-slider-carousel '+nav_dot_ent+'">';
html += '<ul class="am-slides">';
html += item_html;
html += '</ul>';
html += '</div>';
// 组件参数
option = {
itemWidth: show_style_value.item_width,
itemMargin: show_style_value.item_margin,
slideshow: show_style_value.is_auto_play,
controlNav: show_style_value.is_nav_dot
};
} else {
// 列表展示数量
var sm = show_style_value.view_list_number_sm || 2;
var md = show_style_value.view_list_number_md || 5;
var lg = show_style_value.view_list_number_lg || 5;
// 设置了外边距,则计算平均移动值
var avg = (item_margin > 0) ? 'module-list-content-avg-'+item_margin : '';
// 列表class
list_ent = avg+' module-list-sm-'+sm+' module-list-md-'+md+' module-list-lg-'+md+' ';
html += '<ul class="module-list-content '+list_ent+'">';
html += item_html;
html += '</ul>';
}
html += '</div>';
// 模块容器设置
var $doc = $(doc);
$doc.html(html);
// 数据加入配置
data['frontend_config'] = {
"style": style,
"item_style": item_style,
"item_right_style": item_right_style,
"item_field_style": item_field_style,
"nav_dot_ent": nav_dot_ent,
"list_ent": list_ent,
"media_fixed": media_fixed
}
data['data_list'] = data_list;
$doc.attr('data-json', encodeURIComponent(JSON.stringify(data)));
// 滚动初始化
if(show_style == 'rolling')
{
$doc.find('.am-slider').flexslider(option);
}
$offcanvas_config_images_text.offCanvas('close');
}
/**
* 模块-视频处理
* @author Devil
@ -736,7 +997,7 @@ function FormBackModuleConfigVideoHandle(data)
// html拼接
var html = '<div class="module-video-container" style="'+style+'">';
html += '<div class="module-video-content '+media_fixed.media_container_ent+'" style="'+media_fixed.media_container_style+'">';
html += '<video src="'+data.content_video+'" poster="'+(data.content_images || '')+'" controls class="'+media_fixed.media_ent+'">your browser does not support the video tag</video>';
html += '<video src="'+data.content_video+'" poster="'+(data.content_images || '')+'" controls class="'+media_fixed.media_ent+'" style="'+media_fixed.media_container_style+'">your browser does not support the video tag</video>';
html += '</div>';
html += '</div>';
var $doc = $(doc);
@ -860,7 +1121,7 @@ function FormBackModuleConfigGoodsHandle(data)
item_html += '<li>';
item_html += '<div class="module-item" style="'+item_style+'">';
item_html += '<a href="'+list[i]['goods_url']+'" target="_blank" class="'+media_fixed.media_container_ent+'" style="'+media_fixed.media_container_style+'">';
item_html += '<img src="'+list[i]['images']+'" alt="'+list[i]['title']+'" class="'+media_fixed.media_ent+'" />';
item_html += '<img src="'+list[i]['images']+'" alt="'+list[i]['title']+'" class="'+media_fixed.media_ent+'" style="'+media_fixed.media_container_style+'" />';
item_html += '</a>';
item_html += '<div class="item-bottom">';
item_html += '<div class="module-title">';
@ -1069,6 +1330,40 @@ function FormBackModuleConfigTitleHandle(data)
$offcanvas_config_title.offCanvas('close');
}
/**
* 模块-自定义html处理
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-06-04
* @desc description
* @param {[object]} data [表单数据]
*/
function FormBackModuleConfigCustomHandle(data)
{
// 基础信息
var doc = $offcanvas_config_custom.attr('data-doc') || null;
if(doc == null)
{
Prompt($layout.data('module-tab-tips') || '模块标记有误');
return false;
}
// 模块容器设置
var $doc = $(doc);
$doc.html(data.custom || '');
// 自定义html、转为base64
if((data['custom'] || null) != null)
{
data['custom'] = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(data.custom));
}
// 数据加入配置
$doc.attr('data-json', encodeURIComponent(JSON.stringify(data)));
$offcanvas_config_custom.offCanvas('close');
}
/**
* 模块-辅助线处理
* @author Devil
@ -1423,6 +1718,116 @@ function ModuleConfigManyImagesItemContentHtml(images, type, name, value)
return html;
}
/**
* 模块-图文信息生成
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-05-18
* @desc description
* @param {[object]} data [配置数据]
*/
function ModuleConfigImagesTextItemContentHtml(data)
{
if((data || null) == null)
{
data = {};
}
if((data.title_style_align || null) == null)
{
data.title_style_align = 'left';
}
if((data.desc_style_align || null) == null)
{
data.desc_style_align = 'left';
}
var index = parseInt(Math.random()*1000001);
var html = `<div class="am-panel am-panel-default am-padding-sm">
<a href="javascript:;" class="am-close am-close-alt am-icon-times"></a>
<div class="am-form-group am-form-file am-form-group-refreshing">
<ul class="plug-file-upload-view module-slider-type-images-view module-slider-type-images-view-`+index+`" data-form-name="content_images_`+index+`" data-max-number="1" data-delete="0" data-dialog-type="images">
<li>
<input type="text" name="content_images_`+index+`" value="`+(data.images || '')+`" />
<img src="`+(data.images || $offcanvas_config_many_images.data('default-images'))+`" />
</li>
</ul>
<div class="plug-file-upload-submit" data-view-tag="ul.module-slider-type-images-view-`+index+`">+`+($layout.data('upload-images-name') || '上传图片')+`</div>
</div>
<div class="am-form-group am-form-group-refreshing">
<div class="form-view-choice-container am-margin-top-xs" data-key="`+index+`">
<input type="hidden" name="content_to_type_`+index+`" value="`+(data.type || '')+`" />
<input type="hidden" name="content_to_name_`+index+`" value="`+(data.name || '')+`" />
<input type="hidden" name="content_to_value_`+index+`" value="`+((data.value || null) == null ? '' : encodeURIComponent(JSON.stringify(data.value)))+`" />
<div class="form-view-choice-container-content">
`+ModuleConfigImagesToContentHtml(name)+`
</div>
</div>
</div>`;
// 标题
var title_style_color = (data.title_style_color || null) == null ? '' : 'background-color:'+data.title_style_color+';border-color:'+data.title_style_color+';';
html += `<div class="am-form-group am-form-group-refreshing">
<label>标题</label>
<div class="am-input-group am-input-group-sm">
<input type="text" placeholder="标题" name="content_title_`+index+`" value="`+(data.title || '')+`" class="am-form-field" />
<input type="hidden" name="content_title_style_color_`+index+`" value="`+(data.title_style_color || '')+`" />
<a href="javascript:;" class="am-input-group-label colorpicker-submit module-style-color-images-text-content-title-style-color-`+index+`" data-position="fixed" data-input-tag=".module-style-color-images-text-content-title-style-color-`+index+`" data-color-tag="input[name='content_title_style_color_`+index+`']" data-color-style="background-color|border-color" style="`+title_style_color+`">
<img src="`+__attachment_host__+`/static/common/images/colorpicker.png" />
</a>
</div>`;
// 外边距
html += `<div class="am-input-group am-input-group-sm group-border-width am-margin-top-xs">
<input type="number" data-is-clearout="0" placeholder="外上" name="content_title_style_margin_top_`+index+`" min="0" max="60" data-validation-message="标题外边距上最大60" value="`+(data.title_style_margin_top || '')+`" class="am-form-field" />
<input type="number" data-is-clearout="0" placeholder="外右" name="content_title_style_margin_right_`+index+`" min="0" max="60" data-validation-message="标题外边距右最大60" value="`+(data.title_style_margin_right || '')+`" class="am-form-field" />
<input type="number" data-is-clearout="0" placeholder="外下" name="content_title_style_margin_bottom_`+index+`" min="0" max="60" data-validation-message="标题外边距下最大60" value="`+(data.title_style_margin_bottom || '')+`" class="am-form-field" />
<input type="number" data-is-clearout="0" placeholder="外左" name="content_title_style_margin_left_`+index+`" min="0" max="60" data-validation-message="标题外边距左最大60" value="`+(data.title_style_margin_left || '')+`" class="am-form-field" />
<span class="am-input-group-label">px</span>
</div>`;
// 字体大小和左右居中
html += `<div class="am-margin-top-xs am-nbfc">
<div class="am-input-group am-input-group-sm am-fl group-input-font-size">
<input type="number" data-is-clearout="0" placeholder="大小" name="content_title_style_font_size_`+index+`" min="0" max="50" value="`+(data.title_style_font_size || '')+`" class="am-form-field" />
<span class="am-input-group-label">px</span>
</div>
<div class="am-fr group-text-align-style"><label class="am-checkbox-inline"><input type="radio" name="content_title_style_align_`+index+`" value="left" data-am-ucheck `+(data.title_style_align == 'left' ? 'checked' : '')+` /> 居左</label><label class="am-checkbox-inline"><input type="radio" name="content_title_style_align_`+index+`" value="center" data-am-ucheck `+(data.title_style_align == 'center' ? 'checked' : '')+` /> 居中</label><label class="am-checkbox-inline"><input type="radio" name="content_title_style_align_`+index+`" value="right" data-am-ucheck `+(data.title_style_align == 'right' ? 'checked' : '')+` /> 居右</label></div>
</div>`;
html += `</div>`;
// 描述
var desc_style_color = (data.desc_style_color || null) == null ? '' : 'background-color:'+data.desc_style_color+';border-color:'+data.desc_style_color+';';
html += `<div class="am-form-group am-form-group-refreshing">
<label>描述</label>
<div class="am-input-group am-input-group-sm">
<input type="text" placeholder="描述" name="content_desc_`+index+`" value="`+(data.desc || '')+`" class="am-form-field" />
<input type="hidden" name="content_desc_style_color_`+index+`" value="`+(data.desc_style_color || '')+`" />
<a href="javascript:;" class="am-input-group-label colorpicker-submit module-style-color-images-text-content-desc-style-color-`+index+`" data-position="fixed" data-input-tag=".module-style-color-images-text-content-desc-style-color-`+index+`" data-color-tag="input[name='content_desc_style_color_`+index+`']" data-color-style="background-color|border-color" style="`+desc_style_color+`">
<img src="`+__attachment_host__+`/static/common/images/colorpicker.png" />
</a>
</div>`;
// 外边距
html += `<div class="am-input-group am-input-group-sm group-border-width am-margin-top-xs">
<input type="number" data-is-clearout="0" placeholder="外上" name="content_desc_style_margin_top_`+index+`" min="0" max="60" data-validation-message="描述外边距上最大60" value="`+(data.desc_style_margin_top || '')+`" class="am-form-field" />
<input type="number" data-is-clearout="0" placeholder="外右" name="content_desc_style_margin_right_`+index+`" min="0" max="60" data-validation-message="描述外边距右最大60" value="`+(data.desc_style_margin_right || '')+`" class="am-form-field" />
<input type="number" data-is-clearout="0" placeholder="外下" name="content_desc_style_margin_bottom_`+index+`" min="0" max="60" data-validation-message="描述外边距下最大60" value="`+(data.desc_style_margin_bottom || '')+`" class="am-form-field" />
<input type="number" data-is-clearout="0" placeholder="外左" name="content_desc_style_margin_left_`+index+`" min="0" max="60" data-validation-message="描述外边距左最大60" value="`+(data.desc_style_margin_left || '')+`" class="am-form-field" />
<span class="am-input-group-label">px</span>
</div>`;
// 字体大小和左右居中
html += `<div class="am-margin-top-xs am-nbfc">
<div class="am-input-group am-input-group-sm am-fl group-input-font-size">
<input type="number" data-is-clearout="0" placeholder="大小" name="content_desc_style_font_size_`+index+`" min="0" max="50" value="`+(data.desc_style_font_size || '')+`" class="am-form-field" />
<span class="am-input-group-label">px</span>
</div>
<div class="am-fr group-text-align-style"><label class="am-checkbox-inline"><input type="radio" name="content_desc_style_align_`+index+`" value="left" data-am-ucheck `+(data.desc_style_align == 'left' ? 'checked' : '')+` /> 居左</label><label class="am-checkbox-inline"><input type="radio" name="content_desc_style_align_`+index+`" value="center" data-am-ucheck `+(data.desc_style_align == 'center' ? 'checked' : '')+` /> 居中</label><label class="am-checkbox-inline"><input type="radio" name="content_desc_style_align_`+index+`" value="right" data-am-ucheck `+(data.desc_style_align == 'right' ? 'checked' : '')+` /> 居右</label></div>
</div>
</div>`;
html += `</div>`;
return html;
}
/**
* 模块-标题关键字
* @author Devil
@ -2185,6 +2590,26 @@ $(function()
$config.find('.config-many-images-container').html(html);
break;
// 图文
case 'images-text' :
// 多图图片
var html = '';
if((json.data_list || null) != null && json.data_list.length > 0)
{
for(var i in json.data_list)
{
html += ModuleConfigImagesTextItemContentHtml(json.data_list[i]);
}
}
$config.find('.config-images-text-container').html(html);
// 展示模式默认空,必须要选择
var images_text_show_style_arr = ['updown', 'leftright', 'rolling'];
if(images_text_show_style_arr.indexOf(json.view_list_show_style) == -1)
{
json['view_list_show_style'] = '';
}
break;
// 视频
case 'video' :
// 视频地址
@ -2264,14 +2689,31 @@ $(function()
// 链接地址处理
$config.find('.form-view-choice-container-content').html(ModuleConfigImagesToContentHtml(json.content_to_name || ''));
break;
// 自定义html
case 'custom' :
json['custom'] = ((json['custom'] || null) == null) ? '' : CryptoJS.enc.Base64.parse(json.custom).toString(CryptoJS.enc.Utf8);
break;
default :
if($config.length == 0)
{
Prompt('模块未配置('+value+')');
return false;
}
}
// 表单数据赋值
FormDataFill(json, config_doc);
// 背景色组件处理
ModuleColorpickerHandle($config);
// 单选框初始化
$config.find('input[type="checkbox"], input[type="radio"]').uCheck();
// 颜色选择器初始化
ColorPickerInit();
// 更新选择组件
$config.find('.chosen-select').trigger('chosen:updated');
@ -2918,8 +3360,8 @@ $(function()
$(this).parent().remove();
});
// 展示模式切换
$(document).on('click', 'input[name="view_list_show_style"]', function()
// 配置多图 - 展示模式切换
$(document).on('click', '#offcanvas-module-config-many-images input[name="view_list_show_style"]', function()
{
$base_show_style_value_obj = $(this).parents('.config-view-show-style').find('input[name="view_list_show_style_value"]');
switch($(this).val())
@ -2969,6 +3411,83 @@ $(function()
}
});
// 左侧配置 - 图文- 图文添加
$offcanvas_config_images_text.on('click', '.config-images-text-item-add', function()
{
$offcanvas_config_images_text.find('.config-images-text-container').append(ModuleConfigImagesTextItemContentHtml());
// 单选框初始化
$offcanvas_config_images_text.find('input[type="checkbox"], input[type="radio"]').uCheck();
// 颜色选择器初始化
ColorPickerInit();
});
// 配置图文 - 选择页面事件
$offcanvas_config_images_text.on('click', '.form-view-choice-container-submit', function(e)
{
OffcanvasConfigPagesChoice($(this), e);
});
// 左侧配置 - 配置图文 - 链接地址 - 移除
$offcanvas_config_images_text.on('click', '.form-view-choice-container-active i.am-icon-close', function(e)
{
OffcanvasConfigPagesRemove($(this), e);
});
// 左侧配置 - 配置图文 - 移除
$(document).on('click', '#offcanvas-module-config-images-text .config-images-text-container .am-panel a.am-close', function()
{
$(this).parent().remove();
});
// 配置图文 - 展示模式切换
$(document).on('click', '#offcanvas-module-config-images-text input[name="view_list_show_style"]', function()
{
$base_show_style_value_obj = $(this).parents('.config-view-show-style').find('input[name="view_list_show_style_value"]');
switch($(this).val())
{
// 滚动
case 'rolling' :
// 数据填充
var json = ViewRollingShowStyleValueHandle($base_show_style_value_obj.val());
if(json['item_margin'] <= 0)
{
json['item_margin'] = '';
}
FormDataFill(json, '#modal-module-rolling-config');
// 开关状态
$modal_rolling_config.find('input[name="is_auto_play"]').bootstrapSwitch('state', json.is_auto_play);
$modal_rolling_config.find('input[name="is_nav_dot"]').bootstrapSwitch('state', json.is_nav_dot);
// 开启弹窗
$modal_rolling_config.modal({
width: 260,
height: 370,
closeViaDimmer: false
});
break;
// 默认
default :
// 数据填充
var json = ViewListShowStyleValueHandle($base_show_style_value_obj.val());
if(json['style_margin'] <= 0)
{
json['style_margin'] = '';
}
FormDataFill(json, '#modal-module-list-config');
// 开启弹窗
$modal_list_config.modal({
width: 260,
height: 225,
closeViaDimmer: false
});
}
});
// 左侧配置 - 标题 - 右侧按钮 - 选择页面事件
$offcanvas_config_title.on('click', '.form-view-choice-container-submit', function(e)
{

View File

@ -0,0 +1,17 @@
// 使用示例
// // 加密 base64_encode
// var str = CryptoJS.enc.Utf8.parse(value_str);
// var base64 = CryptoJS.enc.Base64.stringify(str);
// // 解密 base64_decode
// var words = CryptoJS.enc.Base64.parse(value_str);
// var val = words.toString(CryptoJS.enc.Utf8);
// 处理方法
var CryptoJS=CryptoJS||function(h,o){var f={},j=f.lib={},k=j.Base=function(){function a(){}return{extend:function(b){a.prototype=this;var c=new a;b&&c.mixIn(b);c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.$super.extend(this)}}}(),i=j.WordArray=k.extend({init:function(a,b){a=
this.words=a||[];this.sigBytes=b!=o?b:4*a.length},toString:function(a){return(a||p).stringify(this)},concat:function(a){var b=this.words,c=a.words,d=this.sigBytes,a=a.sigBytes;this.clamp();if(d%4)for(var e=0;e<a;e++)b[d+e>>>2]|=(c[e>>>2]>>>24-8*(e%4)&255)<<24-8*((d+e)%4);else if(65535<c.length)for(e=0;e<a;e+=4)b[d+e>>>2]=c[e>>>2];else b.push.apply(b,c);this.sigBytes+=a;return this},clamp:function(){var a=this.words,b=this.sigBytes;a[b>>>2]&=4294967295<<32-8*(b%4);a.length=h.ceil(b/4)},clone:function(){var a=
k.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var b=[],c=0;c<a;c+=4)b.push(4294967296*h.random()|0);return i.create(b,a)}}),l=f.enc={},p=l.Hex={stringify:function(a){for(var b=a.words,a=a.sigBytes,c=[],d=0;d<a;d++){var e=b[d>>>2]>>>24-8*(d%4)&255;c.push((e>>>4).toString(16));c.push((e&15).toString(16))}return c.join("")},parse:function(a){for(var b=a.length,c=[],d=0;d<b;d+=2)c[d>>>3]|=parseInt(a.substr(d,2),16)<<24-4*(d%8);return i.create(c,b/2)}},n=l.Latin1={stringify:function(a){for(var b=
a.words,a=a.sigBytes,c=[],d=0;d<a;d++)c.push(String.fromCharCode(b[d>>>2]>>>24-8*(d%4)&255));return c.join("")},parse:function(a){for(var b=a.length,c=[],d=0;d<b;d++)c[d>>>2]|=(a.charCodeAt(d)&255)<<24-8*(d%4);return i.create(c,b)}},q=l.Utf8={stringify:function(a){try{return decodeURIComponent(escape(n.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return n.parse(unescape(encodeURIComponent(a)))}},m=j.BufferedBlockAlgorithm=k.extend({reset:function(){this._data=i.create();
this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=q.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var b=this._data,c=b.words,d=b.sigBytes,e=this.blockSize,f=d/(4*e),f=a?h.ceil(f):h.max((f|0)-this._minBufferSize,0),a=f*e,d=h.min(4*a,d);if(a){for(var g=0;g<a;g+=e)this._doProcessBlock(c,g);g=c.splice(0,a);b.sigBytes-=d}return i.create(g,d)},clone:function(){var a=k.clone.call(this);a._data=this._data.clone();return a},_minBufferSize:0});j.Hasher=m.extend({init:function(){this.reset()},
reset:function(){m.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);this._doFinalize();return this._hash},clone:function(){var a=m.clone.call(this);a._hash=this._hash.clone();return a},blockSize:16,_createHelper:function(a){return function(b,c){return a.create(c).finalize(b)}},_createHmacHelper:function(a){return function(b,c){return r.HMAC.create(a,c).finalize(b)}}});var r=f.algo={};return f}(Math);
(function(){var h=CryptoJS,i=h.lib.WordArray;h.enc.Base64={stringify:function(b){var e=b.words,f=b.sigBytes,c=this._map;b.clamp();for(var b=[],a=0;a<f;a+=3)for(var d=(e[a>>>2]>>>24-8*(a%4)&255)<<16|(e[a+1>>>2]>>>24-8*((a+1)%4)&255)<<8|e[a+2>>>2]>>>24-8*((a+2)%4)&255,g=0;4>g&&a+0.75*g<f;g++)b.push(c.charAt(d>>>6*(3-g)&63));if(e=c.charAt(64))for(;b.length%4;)b.push(e);return b.join("")},parse:function(b){var b=b.replace(/\s/g,""),e=b.length,f=this._map,c=f.charAt(64);c&&(c=b.indexOf(c),-1!=c&&(e=c));
for(var c=[],a=0,d=0;d<e;d++)if(d%4){var g=f.indexOf(b.charAt(d-1))<<2*(d%4),h=f.indexOf(b.charAt(d))>>>6-2*(d%4);c[a>>>2]|=(g|h)<<24-8*(a%4);a++}return i.create(c,a)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();