mirror of
https://gitee.com/zongzhige/shopxo.git
synced 2026-06-06 03:56:57 +08:00
首页商品支持自定义配置
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@ -6,5 +6,6 @@
|
||||
.tea
|
||||
.idea
|
||||
.htaccess
|
||||
nginx.htaccess
|
||||
*payment_*_respond.php
|
||||
*payment_*_notify.php
|
||||
@ -12,6 +12,7 @@ namespace app\admin\controller;
|
||||
|
||||
use app\service\ConfigService;
|
||||
use app\service\GoodsService;
|
||||
use app\service\SiteService;
|
||||
|
||||
/**
|
||||
* 站点设置
|
||||
@ -22,6 +23,9 @@ use app\service\GoodsService;
|
||||
*/
|
||||
class Site extends Common
|
||||
{
|
||||
public $nav_type;
|
||||
public $view_type;
|
||||
|
||||
/**
|
||||
* 构造方法
|
||||
* @author Devil
|
||||
@ -39,20 +43,96 @@ class Site extends Common
|
||||
|
||||
// 权限校验
|
||||
$this->IsPower();
|
||||
|
||||
// 导航类型
|
||||
$this->nav_type = input('nav_type', 'base');
|
||||
$this->view_type = input('view_type', 'index');
|
||||
|
||||
// 仅网站设置页面存在多个子页面
|
||||
if($this->nav_type != 'siteset')
|
||||
{
|
||||
$this->view_type = 'index';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* [Index 配置列表]
|
||||
* @author Devil
|
||||
* @blog http://gong.gg/
|
||||
* @version 0.0.1
|
||||
* @datetime 2016-12-06T21:31:53+0800
|
||||
*/
|
||||
* 配置列表
|
||||
* @author Devil
|
||||
* @blog http://gong.gg/
|
||||
* @version 1.0.0
|
||||
* @date 2020-11-25
|
||||
* @desc description
|
||||
*/
|
||||
public function Index()
|
||||
{
|
||||
// 导航
|
||||
$nav_type = input('nav_type', 'base');
|
||||
$this->assign('nav_type', $nav_type);
|
||||
// 公共数据
|
||||
$this->CurrentViewInit();
|
||||
|
||||
// 配置信息
|
||||
$data = ConfigService::ConfigList();
|
||||
$this->assign('data', $data);
|
||||
|
||||
// 数据处理
|
||||
switch($this->nav_type)
|
||||
{
|
||||
// 自提点
|
||||
case 'sitetype' :
|
||||
// 地址处理
|
||||
if(!empty($data['common_self_extraction_address']) && !empty($data['common_self_extraction_address']['value']))
|
||||
{
|
||||
$address = ConfigService::SiteTypeExtractionAddressList($data['common_self_extraction_address']['value']);
|
||||
$this->assign('sitetype_address_list', $address['data']);
|
||||
}
|
||||
|
||||
// 加载百度地图api
|
||||
$this->assign('is_load_baidu_map_api', 1);
|
||||
break;
|
||||
|
||||
// 网站设置
|
||||
case 'siteset' :
|
||||
// 获取商品一级分类
|
||||
$where = ['pid'=>0, 'is_home_recommended'=>1, 'is_enable'=>1];
|
||||
$category = GoodsService::GoodsCategoryList(['where'=>$where]);
|
||||
if(!empty($category))
|
||||
{
|
||||
$floor_keywords = (empty($data['home_index_floor_top_right_keywords']) || empty($data['home_index_floor_top_right_keywords']['value'])) ? [] : json_decode($data['home_index_floor_top_right_keywords']['value'], true);
|
||||
foreach($category as &$c)
|
||||
{
|
||||
$c['config_keywords'] = isset($floor_keywords[$c['id']]) ? $floor_keywords[$c['id']] : '';
|
||||
}
|
||||
}
|
||||
$this->assign('goods_category_list', $category);
|
||||
|
||||
// 楼层自定义商品
|
||||
if(!empty($data['home_index_floor_manual_mode_goods']) && !empty($data['home_index_floor_manual_mode_goods']['value']))
|
||||
{
|
||||
$ret = SiteService::FloorManualModeGoodsViewHandle(json_decode($data['home_index_floor_manual_mode_goods']['value'], true));
|
||||
$this->assign('floor_manual_mode_goods_list', $ret['data']);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// 编辑器文件存放地址
|
||||
$this->assign('editor_path_type', 'common');
|
||||
|
||||
// 视图
|
||||
$view = 'site/'.$this->nav_type.'/'.$this->view_type;
|
||||
return $this->fetch($view);
|
||||
}
|
||||
|
||||
/**
|
||||
* 公共视图
|
||||
* @author Devil
|
||||
* @blog http://gong.gg/
|
||||
* @version 1.0.0
|
||||
* @date 2020-11-21
|
||||
* @desc description
|
||||
*/
|
||||
public function CurrentViewInit()
|
||||
{
|
||||
// 主/子导航
|
||||
$this->assign('nav_type', $this->nav_type);
|
||||
$this->assign('view_type', $this->view_type);
|
||||
|
||||
// 时区
|
||||
$this->assign('site_timezone_list', lang('site_timezone_list'));
|
||||
@ -88,56 +168,89 @@ class Site extends Common
|
||||
$this->assign('goods_order_by_type_list', lang('goods_order_by_type_list'));
|
||||
$this->assign('goods_order_by_rule_list', lang('goods_order_by_rule_list'));
|
||||
|
||||
// 配置信息
|
||||
$data = ConfigService::ConfigList();
|
||||
$this->assign('data', $data);
|
||||
// 首页楼层数据类型
|
||||
$this->assign('common_site_floor_data_type_list', lang('common_site_floor_data_type_list'));
|
||||
|
||||
// 数据处理
|
||||
switch($nav_type)
|
||||
{
|
||||
// 自提点
|
||||
case 'sitetype' :
|
||||
// 地址处理
|
||||
if(!empty($data['common_self_extraction_address']) && !empty($data['common_self_extraction_address']['value']))
|
||||
{
|
||||
$address = ConfigService::SiteTypeExtractionAddressList($data['common_self_extraction_address']['value']);
|
||||
$this->assign('sitetype_address_list', $address['data']);
|
||||
}
|
||||
// 主导航
|
||||
$this->assign('second_nav_list', [
|
||||
[
|
||||
'name' => '基础配置',
|
||||
'type' => 'base',
|
||||
],
|
||||
[
|
||||
'name' => '网站设置',
|
||||
'type' => 'siteset',
|
||||
],
|
||||
[
|
||||
'name' => '站点类型',
|
||||
'type' => 'sitetype',
|
||||
],
|
||||
[
|
||||
'name' => '用户注册',
|
||||
'type' => 'register',
|
||||
],
|
||||
[
|
||||
'name' => '用户登录',
|
||||
'type' => 'login',
|
||||
],
|
||||
[
|
||||
'name' => '密码找回',
|
||||
'type' => 'forgetpwd',
|
||||
],
|
||||
[
|
||||
'name' => '验证码',
|
||||
'type' => 'verify',
|
||||
],
|
||||
[
|
||||
'name' => '订单售后',
|
||||
'type' => 'orderaftersale',
|
||||
],
|
||||
[
|
||||
'name' => '附件',
|
||||
'type' => 'attachment',
|
||||
],
|
||||
[
|
||||
'name' => '缓存',
|
||||
'type' => 'cache',
|
||||
],
|
||||
[
|
||||
'name' => '扩展项',
|
||||
'type' => 'extends',
|
||||
],
|
||||
]);
|
||||
|
||||
// 加载百度地图api
|
||||
$this->assign('is_load_baidu_map_api', 1);
|
||||
break;
|
||||
|
||||
// 网站设置
|
||||
case 'siteset' :
|
||||
// 获取商品一级分类
|
||||
$where = ['pid'=>0, 'is_home_recommended'=>1, 'is_enable'=>1];
|
||||
$category = GoodsService::GoodsCategoryList(['where'=>$where]);
|
||||
if(!empty($category))
|
||||
{
|
||||
$floor_keywords = (empty($data['home_index_floor_top_right_keywords']) || empty($data['home_index_floor_top_right_keywords']['value'])) ? [] : json_decode($data['home_index_floor_top_right_keywords']['value'], true);
|
||||
foreach($category as &$c)
|
||||
{
|
||||
$c['config_keywords'] = isset($floor_keywords[$c['id']]) ? $floor_keywords[$c['id']] : '';
|
||||
}
|
||||
}
|
||||
$this->assign('goods_category_list', $category);
|
||||
break;
|
||||
}
|
||||
|
||||
// 编辑器文件存放地址
|
||||
$this->assign('editor_path_type', 'common');
|
||||
|
||||
// 视图
|
||||
return $this->fetch($nav_type);
|
||||
// 网站设置导航
|
||||
$this->assign('siteset_nav_list', [
|
||||
[
|
||||
'name' => '首页',
|
||||
'type' => 'index',
|
||||
],
|
||||
[
|
||||
'name' => '商品',
|
||||
'type' => 'goods',
|
||||
],
|
||||
[
|
||||
'name' => '搜索',
|
||||
'type' => 'search',
|
||||
],
|
||||
[
|
||||
'name' => '订单',
|
||||
'type' => 'order',
|
||||
],
|
||||
[
|
||||
'name' => '扩展',
|
||||
'type' => 'extends',
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* [Save 配置数据保存]
|
||||
* @author Devil
|
||||
* @blog http://gong.gg/
|
||||
* @version 0.0.1
|
||||
* @datetime 2017-01-02T23:08:19+0800
|
||||
* 配置数据保存
|
||||
* @author Devil
|
||||
* @blog http://gong.gg/
|
||||
* @version 1.0.0
|
||||
* @date 2020-11-25
|
||||
* @desc description
|
||||
*/
|
||||
public function Save()
|
||||
{
|
||||
@ -199,7 +312,10 @@ class Site extends Common
|
||||
|
||||
// 网站设置
|
||||
case 'siteset' :
|
||||
// 楼层关键字
|
||||
$params['home_index_floor_top_right_keywords'] = empty($params['home_index_floor_top_right_keywords']) ? '' : json_encode($params['home_index_floor_top_right_keywords'], JSON_UNESCAPED_UNICODE);
|
||||
// 楼层自定义商品
|
||||
$params['home_index_floor_manual_mode_goods'] = empty($params['home_index_floor_manual_mode_goods']) ? '' : json_encode($params['home_index_floor_manual_mode_goods'], JSON_UNESCAPED_UNICODE);
|
||||
break;
|
||||
|
||||
// 缓存
|
||||
@ -208,7 +324,7 @@ class Site extends Common
|
||||
if(isset($params['common_session_is_use_cache']) && $params['common_session_is_use_cache'] == 1)
|
||||
{
|
||||
// 连接测试
|
||||
$ret = $this->RedisCheckConnectPing($params['common_cache_session_redis_host'], $params['common_cache_session_redis_port'], $params['common_cache_session_redis_password']);
|
||||
$ret = SiteService::RedisCheckConnectPing($params['common_cache_session_redis_host'], $params['common_cache_session_redis_port'], $params['common_cache_session_redis_password']);
|
||||
if($ret['code'] != 0)
|
||||
{
|
||||
return $ret;
|
||||
@ -219,7 +335,7 @@ class Site extends Common
|
||||
if(isset($params['common_data_is_use_cache']) && $params['common_data_is_use_cache'] == 1)
|
||||
{
|
||||
// 连接测试
|
||||
$ret = $this->RedisCheckConnectPing($params['common_cache_data_redis_host'], $params['common_cache_data_redis_port'], $params['common_cache_data_redis_password']);
|
||||
$ret = SiteService::RedisCheckConnectPing($params['common_cache_data_redis_host'], $params['common_cache_data_redis_port'], $params['common_cache_data_redis_password']);
|
||||
if($ret['code'] != 0)
|
||||
{
|
||||
return $ret;
|
||||
@ -263,48 +379,29 @@ class Site extends Common
|
||||
}
|
||||
|
||||
/**
|
||||
* redis连接测试
|
||||
* 商品搜索
|
||||
* @author Devil
|
||||
* @blog http://gong.gg/
|
||||
* @version 1.0.0
|
||||
* @date 2020-09-26
|
||||
* @date 2020-11-25
|
||||
* @desc description
|
||||
* @param [string] $host [连接地址]
|
||||
* @param [int] $port [端口]
|
||||
* @param [string] $password [密码]
|
||||
*/
|
||||
private function RedisCheckConnectPing($host, $port, $password)
|
||||
{
|
||||
// 参数处理
|
||||
$host = empty($host) ? '127.0.0.1' : $host;
|
||||
$port = empty($port) ? 6379 : $port;
|
||||
$password = empty($password) ? '' : $password;
|
||||
public function GoodsSearch()
|
||||
{
|
||||
// 是否ajax请求
|
||||
if(!IS_AJAX)
|
||||
{
|
||||
return $this->error('非法访问');
|
||||
}
|
||||
|
||||
// 是否已安装redis扩展
|
||||
if(!extension_loaded('redis'))
|
||||
{
|
||||
return DataReturn('请先安装redis扩展', -1);
|
||||
}
|
||||
|
||||
// 捕获异常
|
||||
try {
|
||||
// 连接redis
|
||||
$redis = new \Redis();
|
||||
$redis->connect($host, $port);
|
||||
if($password != '')
|
||||
{
|
||||
$redis->auth($password);
|
||||
}
|
||||
} catch(\Exception $e) {
|
||||
return DataReturn('redis连接失败['.$e->getMessage().']', -1);
|
||||
}
|
||||
|
||||
// 检测是否连接成功
|
||||
if($redis->ping())
|
||||
{
|
||||
return DataReturn('redis连接成功', 0);
|
||||
}
|
||||
return DataReturn('redis连接失败', -1);
|
||||
}
|
||||
// 搜索数据
|
||||
$ret = SiteService::GoodsSearchList($this->data_post);
|
||||
if($ret['code'] == 0)
|
||||
{
|
||||
$this->assign('data', $ret['data']['data']);
|
||||
$ret['data']['data'] = $this->fetch('site/public/goods_search');
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
}
|
||||
?>
|
||||
@ -2,11 +2,11 @@
|
||||
|
||||
<!-- right content start -->
|
||||
<div class="content-right">
|
||||
<div class="content">
|
||||
<!-- table nav start -->
|
||||
{{include file="site/nav" /}}
|
||||
<!-- table nav end -->
|
||||
<!-- second nav start -->
|
||||
{{include file="site/public/nav" /}}
|
||||
<!-- second nav end -->
|
||||
|
||||
<div class="content">
|
||||
<!-- form start -->
|
||||
<form class="am-form form-validation view-save" action="{{:MyUrl('admin/site/save')}}" method="POST" request-type="ajax-url" request-value="{{:MyUrl('admin/site/index', ['nav_type'=>'attachment'])}}" enctype="multipart/form-data">
|
||||
<div class="am-form-group">
|
||||
@ -2,11 +2,11 @@
|
||||
|
||||
<!-- right content start -->
|
||||
<div class="content-right">
|
||||
<div class="content">
|
||||
<!-- table nav start -->
|
||||
{{include file="site/nav" /}}
|
||||
<!-- table nav end -->
|
||||
<!-- second nav start -->
|
||||
{{include file="site/public/nav" /}}
|
||||
<!-- second nav end -->
|
||||
|
||||
<div class="content">
|
||||
<!-- form start -->
|
||||
<form class="am-form form-validation view-save" action="{{:MyUrl('admin/site/save')}}" method="POST" request-type="ajax-url" request-value="{{:MyUrl('admin/site/index')}}" enctype="multipart/form-data">
|
||||
<!-- 基础配置 -->
|
||||
@ -2,11 +2,11 @@
|
||||
|
||||
<!-- right content start -->
|
||||
<div class="content-right">
|
||||
<!-- second nav start -->
|
||||
{{include file="site/public/nav" /}}
|
||||
<!-- second nav end -->
|
||||
|
||||
<div class="content">
|
||||
<!-- table nav start -->
|
||||
{{include file="site/nav" /}}
|
||||
<!-- table nav end -->
|
||||
|
||||
<!-- form start -->
|
||||
<form class="am-form form-validation view-save" action="{{:MyUrl('admin/site/save')}}" method="POST" request-type="ajax-url" request-value="{{:MyUrl('admin/site/index', ['nav_type'=>'cache'])}}" enctype="multipart/form-data">
|
||||
<div class="am-alert am-alert-warning" data-am-alert>
|
||||
@ -2,11 +2,11 @@
|
||||
|
||||
<!-- right content start -->
|
||||
<div class="content-right">
|
||||
<div class="content">
|
||||
<!-- table nav start -->
|
||||
{{include file="site/nav" /}}
|
||||
<!-- table nav end -->
|
||||
<!-- second nav start -->
|
||||
{{include file="site/public/nav" /}}
|
||||
<!-- second nav end -->
|
||||
|
||||
<div class="content">
|
||||
<!-- form start -->
|
||||
<form class="am-form form-validation view-save" action="{{:MyUrl('admin/site/save')}}" method="POST" request-type="ajax-url" request-value="{{:MyUrl('admin/site/index', ['nav_type'=>'extends'])}}" enctype="multipart/form-data">
|
||||
<!-- 基础配置 -->
|
||||
@ -2,11 +2,11 @@
|
||||
|
||||
<!-- right content start -->
|
||||
<div class="content-right">
|
||||
<div class="content">
|
||||
<!-- table nav start -->
|
||||
{{include file="site/nav" /}}
|
||||
<!-- table nav end -->
|
||||
<!-- second nav start -->
|
||||
{{include file="site/public/nav" /}}
|
||||
<!-- second nav end -->
|
||||
|
||||
<div class="content">
|
||||
<!-- form start -->
|
||||
<form class="am-form form-validation view-save" action="{{:MyUrl('admin/site/save')}}" method="POST" request-type="ajax-url" request-value="{{:MyUrl('admin/site/index', ['nav_type'=>'forgetpwd'])}}" enctype="multipart/form-data">
|
||||
<!-- 图片1 -->
|
||||
@ -2,11 +2,11 @@
|
||||
|
||||
<!-- right content start -->
|
||||
<div class="content-right">
|
||||
<div class="content">
|
||||
<!-- table nav start -->
|
||||
{{include file="site/nav" /}}
|
||||
<!-- table nav end -->
|
||||
<!-- second nav start -->
|
||||
{{include file="site/public/nav" /}}
|
||||
<!-- second nav end -->
|
||||
|
||||
<div class="content">
|
||||
<!-- form start -->
|
||||
<form class="am-form form-validation view-save" action="{{:MyUrl('admin/site/save')}}" method="POST" request-type="ajax-url" request-value="{{:MyUrl('admin/site/index', ['nav_type'=>'login'])}}" enctype="multipart/form-data">
|
||||
<!-- 图片1 -->
|
||||
@ -1,49 +0,0 @@
|
||||
<ul class="am-nav am-nav-pills table-nav am-margin-bottom-sm">
|
||||
<li {{if $nav_type eq 'base'}}class="am-active"{{/if}} data-type="base">
|
||||
<a href="{{:MyUrl('admin/site/index', ['nav_type'=>'base'])}}">基础配置</a>
|
||||
</li>
|
||||
<li {{if $nav_type eq 'siteset'}}class="am-active"{{/if}} data-type="siteset">
|
||||
<a href="{{:MyUrl('admin/site/index', ['nav_type'=>'siteset'])}}">网站设置</a>
|
||||
</li>
|
||||
<li {{if $nav_type eq 'sitetype'}}class="am-active"{{/if}} data-type="sitetype">
|
||||
<a href="{{:MyUrl('admin/site/index', ['nav_type'=>'sitetype'])}}">站点类型</a>
|
||||
</li>
|
||||
<li {{if $nav_type eq 'register'}}class="am-active"{{/if}} data-type="register">
|
||||
<a href="{{:MyUrl('admin/site/index', ['nav_type'=>'register'])}}">用户注册</a>
|
||||
</li>
|
||||
<li {{if $nav_type eq 'login'}}class="am-active"{{/if}} data-type="login">
|
||||
<a href="{{:MyUrl('admin/site/index', ['nav_type'=>'login'])}}">用户登录</a>
|
||||
</li>
|
||||
<li {{if $nav_type eq 'forgetpwd'}}class="am-active"{{/if}} data-type="forgetpwd">
|
||||
<a href="{{:MyUrl('admin/site/index', ['nav_type'=>'forgetpwd'])}}">密码找回</a>
|
||||
</li>
|
||||
<li {{if $nav_type eq 'verify'}}class="am-active"{{/if}} data-type="verify">
|
||||
<a href="{{:MyUrl('admin/site/index', ['nav_type'=>'verify'])}}">验证码</a>
|
||||
</li>
|
||||
<li {{if $nav_type eq 'orderaftersale'}}class="am-active"{{/if}} data-type="orderaftersale">
|
||||
<a href="{{:MyUrl('admin/site/index', ['nav_type'=>'orderaftersale'])}}">订单售后</a>
|
||||
</li>
|
||||
<li {{if $nav_type eq 'attachment'}}class="am-active"{{/if}} data-type="attachment">
|
||||
<a href="{{:MyUrl('admin/site/index', ['nav_type'=>'attachment'])}}">附件</a>
|
||||
</li>
|
||||
<li {{if $nav_type eq 'cache'}}class="am-active"{{/if}} data-type="cache">
|
||||
<a href="{{:MyUrl('admin/site/index', ['nav_type'=>'cache'])}}">缓存</a>
|
||||
</li>
|
||||
<li {{if $nav_type eq 'extends'}}class="am-active"{{/if}} data-type="extends">
|
||||
<a href="{{:MyUrl('admin/site/index', ['nav_type'=>'extends'])}}">扩展项</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
{{if in_array($nav_type, ['login', 'forgetpwd'])}}
|
||||
<!-- 登录/密码找回提示 -->
|
||||
<div class="am-alert am-alert-warning am-radius" data-am-alert>
|
||||
<button type="button" class="am-close">×</button>
|
||||
<p class="am-text-xs">左侧图片最多可上传3张图片、每次随机展示其中一张</p>
|
||||
</div>
|
||||
{{elseif in_array($nav_type, ['register']) /}}
|
||||
<!-- 注册提示 -->
|
||||
<div class="am-alert am-alert-warning am-radius" data-am-alert>
|
||||
<button type="button" class="am-close">×</button>
|
||||
<p class="am-text-xs">可自定义背景图片、默认底灰色</p>
|
||||
</div>
|
||||
{{/if}}
|
||||
@ -2,11 +2,11 @@
|
||||
|
||||
<!-- right content start -->
|
||||
<div class="content-right">
|
||||
<div class="content">
|
||||
<!-- table nav start -->
|
||||
{{include file="site/nav" /}}
|
||||
<!-- table nav end -->
|
||||
<!-- second nav start -->
|
||||
{{include file="site/public/nav" /}}
|
||||
<!-- second nav end -->
|
||||
|
||||
<div class="content">
|
||||
<!-- form start -->
|
||||
<form class="am-form form-validation view-save" action="{{:MyUrl('admin/site/save')}}" method="POST" request-type="ajax-url" request-value="{{:MyUrl('admin/site/index', ['nav_type'=>'orderaftersale'])}}" enctype="multipart/form-data">
|
||||
<div class="am-form-group">
|
||||
21
application/admin/view/default/site/public/goods_search.html
Normal file
21
application/admin/view/default/site/public/goods_search.html
Normal file
@ -0,0 +1,21 @@
|
||||
{{if !empty($data)}}
|
||||
{{foreach $data as $v}}
|
||||
<li data-gid="{{$v.id}}" data-url="{{$v.goods_url}}" data-title="{{$v.title}}" data-img="{{$v.images}}" data-add-html='<a href="javascript:;" class="am-icon-btn am-icon-plus am-success goods-add-submit" data-type="add"></a>' data-del-html='<a href="javascript:;" class="am-icon-btn am-icon-remove am-danger goods-del-submit" data-type="del"></a>'>
|
||||
<div class="am-gallery-item am-radius">
|
||||
<a href="{{$v.goods_url}}" target="_blank" title="{{$v.title}}">
|
||||
<img src="{{$v.images}}" alt="{{$v.title}}" />
|
||||
</a>
|
||||
<h3 class="am-gallery-title">{{$v.title}}</h3>
|
||||
<div class="icon-submit-container">
|
||||
{{if isset($v['is_exist']) and $v['is_exist'] eq 1}}
|
||||
<a href="javascript:;" class="am-icon-btn am-icon-remove am-danger goods-del-submit" data-type="del"></a>
|
||||
{{else /}}
|
||||
<a href="javascript:;" class="am-icon-btn am-icon-plus am-success goods-add-submit" data-type="add"></a>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
{{/foreach}}
|
||||
{{else /}}
|
||||
<div class="table-no"><i class="am-icon-warning"></i> 没有相关商品</div>
|
||||
{{/if}}
|
||||
30
application/admin/view/default/site/public/nav.html
Normal file
30
application/admin/view/default/site/public/nav.html
Normal file
@ -0,0 +1,30 @@
|
||||
{{if !empty($second_nav_list) and is_array($second_nav_list)}}
|
||||
<ul class="am-nav am-nav-pills table-nav second-nav">
|
||||
{{foreach $second_nav_list as $v}}
|
||||
<li {{if $nav_type eq $v['type']}}class="am-active"{{/if}} data-type="{{$v.type}}">
|
||||
<a href="{{:MyUrl('admin/site/index', ['nav_type'=>$v['type'], 'view_type'=>$view_type])}}">{{$v.name}}</a>
|
||||
</li>
|
||||
{{/foreach}}
|
||||
</ul>
|
||||
{{/if}}
|
||||
|
||||
{{switch $nav_type}}
|
||||
{{case login|forgetpwd}}
|
||||
<!-- 登录/密码找回提示 -->
|
||||
<div class="content">
|
||||
<div class="am-alert am-alert-warning am-radius am-margin-bottom-0" data-am-alert>
|
||||
<button type="button" class="am-close">×</button>
|
||||
<p class="am-text-xs">左侧图片最多可上传3张图片、每次随机展示其中一张</p>
|
||||
</div>
|
||||
</div>
|
||||
{{/case}}
|
||||
{{case register}}
|
||||
<!-- 注册提示 -->
|
||||
<div class="content">
|
||||
<div class="am-alert am-alert-warning am-radius am-margin-bottom-0" data-am-alert>
|
||||
<button type="button" class="am-close">×</button>
|
||||
<p class="am-text-xs">可自定义背景图片、默认底灰色</p>
|
||||
</div>
|
||||
</div>
|
||||
{{/case}}
|
||||
{{/switch}}
|
||||
@ -0,0 +1,9 @@
|
||||
{{if !empty($siteset_nav_list) and is_array($siteset_nav_list)}}
|
||||
<ul class="am-nav am-nav-pills table-nav">
|
||||
{{foreach $siteset_nav_list as $v}}
|
||||
<li {{if $view_type eq $v['type']}}class="am-active"{{/if}} data-type="{{$v.type}}">
|
||||
<a href="{{:MyUrl('admin/site/index', ['nav_type'=>$nav_type, 'view_type'=>$v['type']])}}">{{$v.name}}</a>
|
||||
</li>
|
||||
{{/foreach}}
|
||||
</ul>
|
||||
{{/if}}
|
||||
@ -2,11 +2,11 @@
|
||||
|
||||
<!-- right content start -->
|
||||
<div class="content-right">
|
||||
<div class="content">
|
||||
<!-- table nav start -->
|
||||
{{include file="site/nav" /}}
|
||||
<!-- table nav end -->
|
||||
<!-- second nav start -->
|
||||
{{include file="site/public/nav" /}}
|
||||
<!-- second nav end -->
|
||||
|
||||
<div class="content">
|
||||
<!-- form start -->
|
||||
<form class="am-form form-validation view-save" action="{{:MyUrl('admin/site/save')}}" method="POST" request-type="ajax-url" request-value="{{:MyUrl('admin/site/index', ['nav_type'=>'register'])}}" enctype="multipart/form-data">
|
||||
<div class="am-form-group">
|
||||
41
application/admin/view/default/site/siteset/extends.html
Normal file
41
application/admin/view/default/site/siteset/extends.html
Normal file
@ -0,0 +1,41 @@
|
||||
{{include file="public/header" /}}
|
||||
|
||||
<!-- right content start -->
|
||||
<div class="content-right">
|
||||
<!-- second nav start -->
|
||||
{{include file="site/public/nav" /}}
|
||||
<!-- second nav end -->
|
||||
|
||||
<div class="content">
|
||||
<!-- nav start -->
|
||||
{{include file="site/public/siteset_nav" /}}
|
||||
<!-- nav end -->
|
||||
|
||||
<!-- form start -->
|
||||
<form class="am-form form-validation view-save" action="{{:MyUrl('admin/site/save')}}" method="POST" request-type="ajax-url" request-value="{{:MyUrl('admin/site/index', ['nav_type'=>'siteset'])}}" enctype="multipart/form-data">
|
||||
<!-- 快捷导航 -->
|
||||
<div class="am-panel am-panel-default am-margin-top-sm">
|
||||
<div class="am-panel-hd">
|
||||
<h3 class="am-panel-title">快捷导航</h3>
|
||||
</div>
|
||||
<div class="am-panel-bd">
|
||||
<div class="am-form-group">
|
||||
<label>{{$data.home_navigation_main_quick_name.name}}<span class="am-form-group-label-tips">{{$data.home_navigation_main_quick_name.describe}}</span></label>
|
||||
<input type="text" maxlength="4" name="{{$data.home_navigation_main_quick_name.only_tag}}" placeholder="{{$data.home_navigation_main_quick_name.name}}" data-validation-message="{{$data.home_navigation_main_quick_name.error_tips}}" class="am-radius" {{if !empty($data)}}value="{{$data.home_navigation_main_quick_name.value}}"{{/if}} />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="am-form-group am-form-group-refreshing am-margin-top-lg am-padding-left-0">
|
||||
<input type="hidden" name="nav_type" value="{{$nav_type}}" />
|
||||
<button type="submit" class="am-btn am-btn-primary am-radius btn-loading-example am-btn-sm am-btn-block" data-am-loading="{loadingText:'处理中...'}">保存</button>
|
||||
</div>
|
||||
</form>
|
||||
<!-- form end -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- right content end -->
|
||||
|
||||
<!-- footer start -->
|
||||
{{include file="public/footer" /}}
|
||||
<!-- footer end -->
|
||||
52
application/admin/view/default/site/siteset/goods.html
Normal file
52
application/admin/view/default/site/siteset/goods.html
Normal file
@ -0,0 +1,52 @@
|
||||
{{include file="public/header" /}}
|
||||
|
||||
<!-- right content start -->
|
||||
<div class="content-right">
|
||||
<!-- second nav start -->
|
||||
{{include file="site/public/nav" /}}
|
||||
<!-- second nav end -->
|
||||
|
||||
<div class="content">
|
||||
<!-- nav start -->
|
||||
{{include file="site/public/siteset_nav" /}}
|
||||
<!-- nav end -->
|
||||
|
||||
<!-- form start -->
|
||||
<form class="am-form form-validation view-save" action="{{:MyUrl('admin/site/save')}}" method="POST" request-type="ajax-url" request-value="{{:MyUrl('admin/site/index', ['nav_type'=>'siteset'])}}" enctype="multipart/form-data">
|
||||
<div class="am-form-group">
|
||||
<label>{{$data.common_is_goods_detail_show_photo.name}}<span class="am-form-group-label-tips">{{$data.common_is_goods_detail_show_photo.describe}}</span></label>
|
||||
<select name="{{$data.common_is_goods_detail_show_photo.only_tag}}" class="am-radius chosen-select" data-validation-message="{{$data.common_is_goods_detail_show_photo.error_tips}}" required>
|
||||
{{foreach $common_is_text_list as $v}}
|
||||
<option value="{{$v.id}}" {{if isset($data['common_is_goods_detail_show_photo']['value']) and $data['common_is_goods_detail_show_photo']['value'] eq $v['id']}}selected{{/if}}>{{$v.name}}</option>
|
||||
{{/foreach}}
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="am-form-group">
|
||||
<label>{{$data.common_show_goods_category_level.name}}<span class="am-form-group-label-tips">{{$data.common_show_goods_category_level.describe}}</span></label>
|
||||
<div class="am-input-group am-input-group-sm">
|
||||
<input type="number" min="1" max="3" name="{{$data.common_show_goods_category_level.only_tag}}" placeholder="{{$data.common_show_goods_category_level.name}}" data-validation-message="{{$data.common_show_goods_category_level.error_tips}}" class="am-radius" {{if !empty($data)}}value="{{$data.common_show_goods_category_level.value}}"{{/if}} />
|
||||
<span class="am-input-group-btn">
|
||||
<button class="am-btn am-btn-default" type="button">级</button>
|
||||
</span>
|
||||
</div>
|
||||
<div class="am-alert am-alert-warning" data-am-alert>
|
||||
<button type="button" class="am-close">×</button>
|
||||
<p>1. 默认展示3级,最低1级、最高3级</p>
|
||||
<p>2. 层级不一样、前端分类页样式也会不一样</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="am-form-group am-form-group-refreshing am-margin-top-lg am-padding-left-0">
|
||||
<input type="hidden" name="nav_type" value="{{$nav_type}}" />
|
||||
<button type="submit" class="am-btn am-btn-primary am-radius btn-loading-example am-btn-sm am-btn-block" data-am-loading="{loadingText:'处理中...'}">保存</button>
|
||||
</div>
|
||||
</form>
|
||||
<!-- form end -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- right content end -->
|
||||
|
||||
<!-- footer start -->
|
||||
{{include file="public/footer" /}}
|
||||
<!-- footer end -->
|
||||
@ -2,45 +2,30 @@
|
||||
|
||||
<!-- right content start -->
|
||||
<div class="content-right">
|
||||
<!-- second nav start -->
|
||||
{{include file="site/public/nav" /}}
|
||||
<!-- second nav end -->
|
||||
|
||||
<div class="content">
|
||||
<!-- table nav start -->
|
||||
{{include file="site/nav" /}}
|
||||
<!-- table nav end -->
|
||||
<!-- nav start -->
|
||||
{{include file="site/public/siteset_nav" /}}
|
||||
<!-- nav end -->
|
||||
|
||||
<!-- form start -->
|
||||
<form class="am-form form-validation view-save" action="{{:MyUrl('admin/site/save')}}" method="POST" request-type="ajax-url" request-value="{{:MyUrl('admin/site/index', ['nav_type'=>'siteset'])}}" enctype="multipart/form-data">
|
||||
<!-- 全局 -->
|
||||
<div class="am-panel am-panel-default">
|
||||
<!-- 基础 -->
|
||||
<div class="am-panel am-panel-default am-margin-top-sm">
|
||||
<div class="am-panel-hd">
|
||||
<h3 class="am-panel-title">全局</h3>
|
||||
<h3 class="am-panel-title">基础</h3>
|
||||
</div>
|
||||
<div class="am-panel-bd">
|
||||
<div class="am-form-group">
|
||||
<label>{{$data.home_navigation_main_quick_name.name}}<span class="am-form-group-label-tips">{{$data.home_navigation_main_quick_name.describe}}</span></label>
|
||||
<input type="text" maxlength="4" name="{{$data.home_navigation_main_quick_name.only_tag}}" placeholder="{{$data.home_navigation_main_quick_name.name}}" data-validation-message="{{$data.home_navigation_main_quick_name.error_tips}}" class="am-radius" {{if !empty($data)}}value="{{$data.home_navigation_main_quick_name.value}}"{{/if}} />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 首页 -->
|
||||
<div class="am-panel am-panel-default">
|
||||
<div class="am-panel-hd">
|
||||
<h3 class="am-panel-title">首页</h3>
|
||||
</div>
|
||||
<div class="am-panel-bd">
|
||||
<div class="am-form-group">
|
||||
<label>{{$data.home_index_floor_goods_max_count.name}}<span class="am-form-group-label-tips">{{$data.home_index_floor_goods_max_count.describe}}</span></label>
|
||||
<div class="am-input-group am-input-group-sm">
|
||||
<input type="number" min="0" name="{{$data.home_index_floor_goods_max_count.only_tag}}" placeholder="{{$data.home_index_floor_goods_max_count.name}}" data-validation-message="{{$data.home_index_floor_goods_max_count.error_tips}}" class="am-radius" {{if !empty($data)}}value="{{$data.home_index_floor_goods_max_count.value}}"{{/if}} />
|
||||
<span class="am-input-group-btn">
|
||||
<button class="am-btn am-btn-default" type="button">个</button>
|
||||
</span>
|
||||
</div>
|
||||
<div class="am-alert am-alert-warning" data-am-alert>
|
||||
<button type="button" class="am-close">×</button>
|
||||
<p>1. 配置每个楼层最多展示多少个商品</p>
|
||||
<p>2. 不建议将数量修改的太大、会导致PC端左侧空白区域太大</p>
|
||||
</div>
|
||||
<label>{{$data.home_index_floor_data_type.name}}<span class="am-form-group-label-tips">{{$data.home_index_floor_data_type.describe}}</span></label>
|
||||
<select name="{{$data.home_index_floor_data_type.only_tag}}" class="am-radius chosen-select" data-validation-message="{{$data.home_index_floor_data_type.error_tips}}">
|
||||
{{foreach $common_site_floor_data_type_list as $k=>$v}}
|
||||
<option value="{{$k}}" {{if isset($data['home_index_floor_data_type']['value']) and $data['home_index_floor_data_type']['value'] eq $k}}selected{{/if}}>{{$v.name}}</option>
|
||||
{{/foreach}}
|
||||
</select>
|
||||
</div>
|
||||
<div class="am-form-group">
|
||||
<label>{{$data.home_index_floor_left_goods_category_max_count.name}}<span class="am-form-group-label-tips">{{$data.home_index_floor_left_goods_category_max_count.describe}}</span></label>
|
||||
@ -54,12 +39,13 @@
|
||||
<button type="button" class="am-close">×</button>
|
||||
<p>1. 配置每个楼层左侧最多展示多少个二级商品分类</p>
|
||||
<p>2. 不建议将数量修改的太大、如高度超出楼层容器会比较拥挤</p>
|
||||
<p>3. 商品分类显示层级配置不能小于2、否则二级分类不展示</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="am-form-group">
|
||||
<label>{{$data.home_index_floor_top_right_keywords.name}}<span class="am-form-group-label-tips">{{$data.home_index_floor_top_right_keywords.describe}}</span></label>
|
||||
{{if !empty($goods_category_list)}}
|
||||
<ul class="am-list am-list-static am-list-border">
|
||||
<ul class="am-list am-list-static am-list-border am-margin-bottom-0">
|
||||
{{foreach $goods_category_list as $category}}
|
||||
<li>
|
||||
<p class="am-text-truncate am-margin-bottom-xs">
|
||||
@ -77,6 +63,30 @@
|
||||
</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 自动模式 -->
|
||||
<div class="am-panel am-panel-default">
|
||||
<div class="am-panel-hd">
|
||||
<h3 class="am-panel-title">自动模式</h3>
|
||||
</div>
|
||||
<div class="am-panel-bd">
|
||||
<div class="am-form-group">
|
||||
<label>{{$data.home_index_floor_goods_max_count.name}}<span class="am-form-group-label-tips">{{$data.home_index_floor_goods_max_count.describe}}</span></label>
|
||||
<div class="am-input-group am-input-group-sm">
|
||||
<input type="number" min="0" name="{{$data.home_index_floor_goods_max_count.only_tag}}" placeholder="{{$data.home_index_floor_goods_max_count.name}}" data-validation-message="{{$data.home_index_floor_goods_max_count.error_tips}}" class="am-radius" {{if !empty($data)}}value="{{$data.home_index_floor_goods_max_count.value}}"{{/if}} />
|
||||
<span class="am-input-group-btn">
|
||||
<button class="am-btn am-btn-default" type="button">个</button>
|
||||
</span>
|
||||
</div>
|
||||
<div class="am-alert am-alert-warning" data-am-alert>
|
||||
<button type="button" class="am-close">×</button>
|
||||
<p>1. 配置每个楼层最多展示多少个商品</p>
|
||||
<p>2. 不建议将数量修改的太大、会导致PC端左侧空白区域太大</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="am-form-group">
|
||||
<label>{{$data.home_index_floor_goods_order_by_type.name}}<span class="am-form-group-label-tips">{{$data.home_index_floor_goods_order_by_type.describe}}</span></label>
|
||||
<select name="{{$data.home_index_floor_goods_order_by_type.only_tag}}" class="am-radius chosen-select" data-validation-message="{{$data.home_index_floor_goods_order_by_type.error_tips}}">
|
||||
@ -100,72 +110,51 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 商品 -->
|
||||
<!-- 手动模式 -->
|
||||
<div class="am-panel am-panel-default">
|
||||
<div class="am-panel-hd">
|
||||
<h3 class="am-panel-title">商品</h3>
|
||||
<h3 class="am-panel-title">手动模式</h3>
|
||||
</div>
|
||||
<div class="am-panel-bd">
|
||||
<div class="am-form-group">
|
||||
<label>{{$data.common_is_goods_detail_show_photo.name}}<span class="am-form-group-label-tips">{{$data.common_is_goods_detail_show_photo.describe}}</span></label>
|
||||
<select name="{{$data.common_is_goods_detail_show_photo.only_tag}}" class="am-radius chosen-select" data-validation-message="{{$data.common_is_goods_detail_show_photo.error_tips}}" required>
|
||||
{{foreach $common_is_text_list as $v}}
|
||||
<option value="{{$v.id}}" {{if isset($data['common_is_goods_detail_show_photo']['value']) and $data['common_is_goods_detail_show_photo']['value'] eq $v['id']}}selected{{/if}}>{{$v.name}}</option>
|
||||
{{/foreach}}
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="am-form-group">
|
||||
<label>{{$data.common_show_goods_category_level.name}}<span class="am-form-group-label-tips">{{$data.common_show_goods_category_level.describe}}</span></label>
|
||||
<div class="am-input-group am-input-group-sm">
|
||||
<input type="number" min="1" max="3" name="{{$data.common_show_goods_category_level.only_tag}}" placeholder="{{$data.common_show_goods_category_level.name}}" data-validation-message="{{$data.common_show_goods_category_level.error_tips}}" class="am-radius" {{if !empty($data)}}value="{{$data.common_show_goods_category_level.value}}"{{/if}} />
|
||||
<span class="am-input-group-btn">
|
||||
<button class="am-btn am-btn-default" type="button">级</button>
|
||||
</span>
|
||||
</div>
|
||||
<label>{{$data.home_index_floor_manual_mode_goods.name}}<span class="am-form-group-label-tips">{{$data.home_index_floor_manual_mode_goods.describe}}</span></label>
|
||||
<div class="am-alert am-alert-warning" data-am-alert>
|
||||
<button type="button" class="am-close">×</button>
|
||||
<p>1. 默认展示3级,最低1级、最高3级</p>
|
||||
<p>2. 层级不一样、前端分类页样式也会不一样</p>
|
||||
<p>1. 可点击商品标题拖拽排序、按照顺序展示</p>
|
||||
<p>2. 不建议添加很多商品、会导致PC端左侧空白区域太大</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 搜索 -->
|
||||
<div class="am-panel am-panel-default">
|
||||
<div class="am-panel-hd">
|
||||
<h3 class="am-panel-title">搜索</h3>
|
||||
</div>
|
||||
<div class="am-panel-bd">
|
||||
<div class="am-form-group">
|
||||
<label>{{$data.home_search_keywords_type.name}}</label>
|
||||
<select name="{{$data.home_search_keywords_type.only_tag}}" class="am-radius chosen-select" data-validation-message="{{$data.home_search_keywords_type.error_tips}}">
|
||||
{{foreach $common_search_keywords_type_list as $v}}
|
||||
<option value="{{$v.value}}" {{if isset($data['home_search_keywords_type']['value']) and $data['home_search_keywords_type']['value'] eq $v['value']}}selected{{/if}}>{{$v.name}}</option>
|
||||
{{/foreach}}
|
||||
</select>
|
||||
</div>
|
||||
<div class="am-form-group">
|
||||
<label>{{$data.home_search_keywords.name}}<span class="am-form-group-label-tips">{{$data.home_search_keywords.describe}}</span></label>
|
||||
<input type="text" name="{{$data.home_search_keywords.only_tag}}" placeholder="{{$data.home_search_keywords.describe}}" data-validation-message="{{$data.home_search_keywords.error_tips}}" class="am-radius" data-am-tagsinput {{if !empty($data)}}value="{{$data.home_search_keywords.value}}"{{/if}} />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 订单 -->
|
||||
<div class="am-panel am-panel-default">
|
||||
<div class="am-panel-hd">
|
||||
<h3 class="am-panel-title">订单</h3>
|
||||
</div>
|
||||
<div class="am-panel-bd">
|
||||
<div class="am-form-group">
|
||||
<label>{{$data.home_is_enable_order_bulk_pay.name}}<span class="am-form-group-label-tips">{{$data.home_is_enable_order_bulk_pay.describe}}</span></label>
|
||||
<select name="{{$data.home_is_enable_order_bulk_pay.only_tag}}" class="am-radius chosen-select" data-validation-message="{{$data.home_is_enable_order_bulk_pay.error_tips}}" required>
|
||||
{{foreach $common_is_text_list as $v}}
|
||||
<option value="{{$v.id}}" {{if isset($data['home_is_enable_order_bulk_pay']['value']) and $data['home_is_enable_order_bulk_pay']['value'] eq $v['id']}}selected{{/if}}>{{$v.name}}</option>
|
||||
{{/foreach}}
|
||||
</select>
|
||||
{{if !empty($goods_category_list)}}
|
||||
<ul class="am-list am-list-static am-list-border am-margin-bottom-0 am-margin-top-sm">
|
||||
{{foreach $goods_category_list as $category}}
|
||||
<li>
|
||||
<p class="am-text-truncate am-margin-bottom-xs">
|
||||
<span>{{$category.name}}</span>
|
||||
<span class="am-margin-left-sm form.am-form am-form-group-label-tips">{{$category.vice_name}}</span>
|
||||
</p>
|
||||
<ul class="am-list am-list-border am-margin-top-sm manual-mode-goods-container manual-mode-goods-container-{{$category.id}}">
|
||||
{{if !empty($floor_manual_mode_goods_list) && !empty($floor_manual_mode_goods_list[$category['id']])}}
|
||||
{{foreach $floor_manual_mode_goods_list[$category['id']] as $g}}
|
||||
<li class="manual-mode-goods-item-{{$g.id}}">
|
||||
<input type="hidden" name="home_index_floor_manual_mode_goods[{{$category.id}}][]" value="{{$g.id}}" />
|
||||
<a href="{{$g.goods_url}}" target="_blank" class="am-text-truncate">
|
||||
<img src="{{$g.images}}" alt="{{$g.title}}" class="am-fl am-margin-right-xs" width="20" height="20" />
|
||||
<span>{{$g.title}}</span>
|
||||
</a>
|
||||
<button type="button" class="am-close am-fr">×</button>
|
||||
</li>
|
||||
{{/foreach}}
|
||||
{{/if}}
|
||||
</ul>
|
||||
<span class="business-operations-submit goods-popup-add" data-tag=".manual-mode-goods-container-{{$category.id}}" data-form-name="home_index_floor_manual_mode_goods[{{$category.id}}][]">+添加商品</span>
|
||||
</li>
|
||||
{{/foreach}}
|
||||
</ul>
|
||||
{{else /}}
|
||||
<div class="am-text-center am-margin-top-lg">
|
||||
<i class="am-icon-warning"></i>
|
||||
<span>暂无数据,请先到 / 商品管理->商品分类、一级分类设置首页推荐</span>
|
||||
</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -179,6 +168,54 @@
|
||||
</div>
|
||||
</div>
|
||||
<!-- right content end -->
|
||||
|
||||
<!-- 商品添加弹窗 -->
|
||||
<div class="am-popup" id="siteset-goods-popup">
|
||||
<div class="am-popup-inner">
|
||||
<div class="am-popup-hd">
|
||||
<h4 class="am-popup-title">商品添加</h4>
|
||||
<span class="am-icon-arrows-alt am-full"></span>
|
||||
<span data-am-modal-close class="am-close">×</span>
|
||||
</div>
|
||||
<div class="am-popup-bd am-padding-0">
|
||||
<form class="am-form am-padding-sm goods-add-container">
|
||||
<!-- 搜索 -->
|
||||
<div class="forth-selection-container" data-search-url="{{:MyUrl('admin/site/goodssearch')}}">
|
||||
<select class="am-radius chosen-select forth-selection-form-category" data-placeholder="商品分类..." data-validation-message="请选择商品分类">
|
||||
<option value="">商品分类...</option>
|
||||
{{if !empty($goods_category_list)}}
|
||||
{{foreach $goods_category_list as $v}}
|
||||
<option value="{{$v.id}}">一级 - {{$v.name}}</option>
|
||||
{{if !empty($v['items'])}}
|
||||
{{foreach $v.items as $vs}}
|
||||
<option style="padding-left: 15px;" value="{{$vs.id}}">二级 - {{$vs.name}}</option>
|
||||
{{if !empty($vs['items'])}}
|
||||
{{foreach $vs.items as $vss}}
|
||||
<option style="padding-left: 30px;" value="{{$vss.id}}">三级 - {{$vss.name}}</option>
|
||||
{{/foreach}}
|
||||
{{/if}}
|
||||
{{/foreach}}
|
||||
{{/if}}
|
||||
{{/foreach}}
|
||||
{{/if}}
|
||||
</select>
|
||||
<input type="text" placeholder="商品名称" class="am-radius forth-selection-form-keywords" />
|
||||
<button type="button" class="am-btn am-btn-secondary am-radius am-btn-sm am-icon-search search-submit" data-am-loading="{loadingText: ' 搜索中...'}"> 搜索</button>
|
||||
</div>
|
||||
|
||||
<!-- 商品列表 -->
|
||||
<div class="am-scrollable-vertical am-margin-top-sm am-padding-bottom-xs goods-list-container" data-loading-msg="搜索中...">
|
||||
<ul class="am-gallery am-avg-sm-3 am-avg-md-4 am-avg-lg-5 am-gallery-bordered">
|
||||
<div class="table-no"><i class="am-icon-warning"></i> 请搜索商品</div>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<!-- 分页 -->
|
||||
<div class="am-margin-top-sm am-text-center goods-page-container"></div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- footer start -->
|
||||
{{include file="public/footer" /}}
|
||||
37
application/admin/view/default/site/siteset/order.html
Normal file
37
application/admin/view/default/site/siteset/order.html
Normal file
@ -0,0 +1,37 @@
|
||||
{{include file="public/header" /}}
|
||||
|
||||
<!-- right content start -->
|
||||
<div class="content-right">
|
||||
<!-- second nav start -->
|
||||
{{include file="site/public/nav" /}}
|
||||
<!-- second nav end -->
|
||||
|
||||
<div class="content">
|
||||
<!-- nav start -->
|
||||
{{include file="site/public/siteset_nav" /}}
|
||||
<!-- nav end -->
|
||||
|
||||
<!-- form start -->
|
||||
<form class="am-form form-validation view-save" action="{{:MyUrl('admin/site/save')}}" method="POST" request-type="ajax-url" request-value="{{:MyUrl('admin/site/index', ['nav_type'=>'siteset'])}}" enctype="multipart/form-data">
|
||||
<div class="am-form-group">
|
||||
<label>{{$data.home_is_enable_order_bulk_pay.name}}<span class="am-form-group-label-tips">{{$data.home_is_enable_order_bulk_pay.describe}}</span></label>
|
||||
<select name="{{$data.home_is_enable_order_bulk_pay.only_tag}}" class="am-radius chosen-select" data-validation-message="{{$data.home_is_enable_order_bulk_pay.error_tips}}" required>
|
||||
{{foreach $common_is_text_list as $v}}
|
||||
<option value="{{$v.id}}" {{if isset($data['home_is_enable_order_bulk_pay']['value']) and $data['home_is_enable_order_bulk_pay']['value'] eq $v['id']}}selected{{/if}}>{{$v.name}}</option>
|
||||
{{/foreach}}
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="am-form-group am-form-group-refreshing am-margin-top-lg am-padding-left-0">
|
||||
<input type="hidden" name="nav_type" value="{{$nav_type}}" />
|
||||
<button type="submit" class="am-btn am-btn-primary am-radius btn-loading-example am-btn-sm am-btn-block" data-am-loading="{loadingText:'处理中...'}">保存</button>
|
||||
</div>
|
||||
</form>
|
||||
<!-- form end -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- right content end -->
|
||||
|
||||
<!-- footer start -->
|
||||
{{include file="public/footer" /}}
|
||||
<!-- footer end -->
|
||||
41
application/admin/view/default/site/siteset/search.html
Normal file
41
application/admin/view/default/site/siteset/search.html
Normal file
@ -0,0 +1,41 @@
|
||||
{{include file="public/header" /}}
|
||||
|
||||
<!-- right content start -->
|
||||
<div class="content-right">
|
||||
<!-- second nav start -->
|
||||
{{include file="site/public/nav" /}}
|
||||
<!-- second nav end -->
|
||||
|
||||
<div class="content">
|
||||
<!-- nav start -->
|
||||
{{include file="site/public/siteset_nav" /}}
|
||||
<!-- nav end -->
|
||||
|
||||
<!-- form start -->
|
||||
<form class="am-form form-validation view-save" action="{{:MyUrl('admin/site/save')}}" method="POST" request-type="ajax-url" request-value="{{:MyUrl('admin/site/index', ['nav_type'=>'siteset'])}}" enctype="multipart/form-data">
|
||||
<div class="am-form-group">
|
||||
<label>{{$data.home_search_keywords_type.name}}</label>
|
||||
<select name="{{$data.home_search_keywords_type.only_tag}}" class="am-radius chosen-select" data-validation-message="{{$data.home_search_keywords_type.error_tips}}">
|
||||
{{foreach $common_search_keywords_type_list as $v}}
|
||||
<option value="{{$v.value}}" {{if isset($data['home_search_keywords_type']['value']) and $data['home_search_keywords_type']['value'] eq $v['value']}}selected{{/if}}>{{$v.name}}</option>
|
||||
{{/foreach}}
|
||||
</select>
|
||||
</div>
|
||||
<div class="am-form-group">
|
||||
<label>{{$data.home_search_keywords.name}}<span class="am-form-group-label-tips">{{$data.home_search_keywords.describe}}</span></label>
|
||||
<input type="text" name="{{$data.home_search_keywords.only_tag}}" placeholder="{{$data.home_search_keywords.describe}}" data-validation-message="{{$data.home_search_keywords.error_tips}}" class="am-radius" data-am-tagsinput {{if !empty($data)}}value="{{$data.home_search_keywords.value}}"{{/if}} />
|
||||
</div>
|
||||
|
||||
<div class="am-form-group am-form-group-refreshing am-margin-top-lg am-padding-left-0">
|
||||
<input type="hidden" name="nav_type" value="{{$nav_type}}" />
|
||||
<button type="submit" class="am-btn am-btn-primary am-radius btn-loading-example am-btn-sm am-btn-block" data-am-loading="{loadingText:'处理中...'}">保存</button>
|
||||
</div>
|
||||
</form>
|
||||
<!-- form end -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- right content end -->
|
||||
|
||||
<!-- footer start -->
|
||||
{{include file="public/footer" /}}
|
||||
<!-- footer end -->
|
||||
@ -2,11 +2,11 @@
|
||||
|
||||
<!-- right content start -->
|
||||
<div class="content-right">
|
||||
<div class="content">
|
||||
<!-- table nav start -->
|
||||
{{include file="site/nav" /}}
|
||||
<!-- table nav end -->
|
||||
<!-- second nav start -->
|
||||
{{include file="site/public/nav" /}}
|
||||
<!-- second nav end -->
|
||||
|
||||
<div class="content">
|
||||
<!-- form start -->
|
||||
<form class="am-form form-validation view-save" action="{{:MyUrl('admin/site/save')}}" method="POST" request-type="ajax-url" request-value="{{:MyUrl('admin/site/index', ['nav_type'=>'sitetype'])}}" enctype="multipart/form-data">
|
||||
<!-- 基础配置 -->
|
||||
@ -2,11 +2,11 @@
|
||||
|
||||
<!-- right content start -->
|
||||
<div class="content-right">
|
||||
<div class="content">
|
||||
<!-- table nav start -->
|
||||
{{include file="site/nav" /}}
|
||||
<!-- table nav end -->
|
||||
<!-- second nav start -->
|
||||
{{include file="site/public/nav" /}}
|
||||
<!-- second nav end -->
|
||||
|
||||
<div class="content">
|
||||
<!-- form start -->
|
||||
<form class="am-form form-validation view-save" action="{{:MyUrl('admin/site/save')}}" method="POST" request-type="ajax-url" request-value="{{:MyUrl('admin/site/index', ['nav_type'=>'verify'])}}" enctype="multipart/form-data">
|
||||
<div class="am-form-group">
|
||||
@ -333,6 +333,11 @@ return array(
|
||||
1 => array('value' => 'asc', 'name' => '升序(asc)'),
|
||||
),
|
||||
|
||||
// 首页数据类型
|
||||
'common_site_floor_data_type_list' => array(
|
||||
0 => array('value' => 0, 'name' => '自动模式', 'checked' => true),
|
||||
1 => array('value' => 1, 'name' => '手动模式'),
|
||||
),
|
||||
|
||||
|
||||
// 色彩值
|
||||
|
||||
@ -34,6 +34,7 @@ class ConfigService
|
||||
'common_agreement_userregister',
|
||||
'common_self_extraction_address',
|
||||
'home_index_floor_top_right_keywords',
|
||||
'home_index_floor_manual_mode_goods',
|
||||
];
|
||||
|
||||
// 附件字段列表
|
||||
|
||||
@ -186,22 +186,6 @@ class GoodsService
|
||||
*/
|
||||
public static function HomeFloorList($params = [])
|
||||
{
|
||||
// 商品数量
|
||||
$goods_count = MyC('home_index_floor_goods_max_count', 8, true);
|
||||
$goods_category_count = MyC('home_index_floor_left_goods_category_max_count', 6, true);
|
||||
|
||||
// 排序配置
|
||||
$floor_order_by_type_list = lang('goods_order_by_type_list');
|
||||
$floor_order_by_rule_list = lang('goods_order_by_rule_list');
|
||||
$floor_order_by_type = MyC('home_index_floor_goods_order_by_type', 0, true);
|
||||
$floor_order_by_rule = MyC('home_index_floor_goods_order_by_rule', 0, true);
|
||||
// 排序字段名称
|
||||
$order_by_field = array_key_exists($floor_order_by_type, $floor_order_by_type_list) ? $floor_order_by_type_list[$floor_order_by_type]['value'] : $floor_order_by_type_list[0]['value'];
|
||||
// 排序规则
|
||||
$order_by_rule = array_key_exists($floor_order_by_rule, $floor_order_by_rule_list) ? $floor_order_by_rule_list[$floor_order_by_rule]['value'] : $floor_order_by_rule_list[0]['value'];
|
||||
// 排序
|
||||
$order_by = implode(' '.$order_by_rule.', ', explode(',', $order_by_field)).' '.$order_by_rule;
|
||||
|
||||
// 缓存
|
||||
$key = config('shopxo.cache_goods_floor_list_key');
|
||||
$data = cache($key);
|
||||
@ -212,9 +196,12 @@ class GoodsService
|
||||
$data = self::GoodsCategoryList(['where'=>$where]);
|
||||
if(!empty($data))
|
||||
{
|
||||
// 分类层级
|
||||
$level = MyC('common_show_goods_category_level', 3, true);
|
||||
if($level > 1)
|
||||
{
|
||||
// 二级分类数量
|
||||
$goods_category_count = MyC('home_index_floor_left_goods_category_max_count', 6, true);
|
||||
foreach($data as &$c)
|
||||
{
|
||||
// 获取二级分类
|
||||
@ -230,19 +217,74 @@ class GoodsService
|
||||
$floor_keywords = json_decode($floor_keywords, true);
|
||||
}
|
||||
|
||||
// 数据模式
|
||||
// 0 自动模式
|
||||
// 1 手动模式
|
||||
$floor_data_type = MyC('home_index_floor_data_type', 0, true);
|
||||
|
||||
// 数据处理
|
||||
switch($floor_data_type)
|
||||
{
|
||||
// 自动模式
|
||||
case 0 :
|
||||
// 商品数量
|
||||
$goods_count = MyC('home_index_floor_goods_max_count', 8, true);
|
||||
// 排序配置
|
||||
$floor_order_by_type_list = lang('goods_order_by_type_list');
|
||||
$floor_order_by_rule_list = lang('goods_order_by_rule_list');
|
||||
$floor_order_by_type = MyC('home_index_floor_goods_order_by_type', 0, true);
|
||||
$floor_order_by_rule = MyC('home_index_floor_goods_order_by_rule', 0, true);
|
||||
// 排序字段名称
|
||||
$order_by_field = array_key_exists($floor_order_by_type, $floor_order_by_type_list) ? $floor_order_by_type_list[$floor_order_by_type]['value'] : $floor_order_by_type_list[0]['value'];
|
||||
// 排序规则
|
||||
$order_by_rule = array_key_exists($floor_order_by_rule, $floor_order_by_rule_list) ? $floor_order_by_rule_list[$floor_order_by_rule]['value'] : $floor_order_by_rule_list[0]['value'];
|
||||
// 排序
|
||||
$order_by = implode(' '.$order_by_rule.', ', explode(',', $order_by_field)).' '.$order_by_rule;
|
||||
break;
|
||||
|
||||
// 手动模式
|
||||
case 1 :
|
||||
$manual_mode = MyC('home_index_floor_manual_mode_goods');
|
||||
if(!empty($manual_mode))
|
||||
{
|
||||
$floor_manual_mode_goods = json_decode($manual_mode, true);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// 根据分类获取楼层商品
|
||||
foreach($data as &$v)
|
||||
{
|
||||
// 获取分类ids
|
||||
$category_ids = self::GoodsCategoryItemsIds([$v['id']], 1);
|
||||
// 数据模式
|
||||
switch($floor_data_type)
|
||||
{
|
||||
// 自动模式
|
||||
case 0 :
|
||||
if(isset($goods_count) && isset($order_by))
|
||||
{
|
||||
// 获取分类ids
|
||||
$category_ids = self::GoodsCategoryItemsIds([$v['id']], 1);
|
||||
|
||||
// 获取商品ids
|
||||
$where = [
|
||||
'gci.category_id' => $category_ids,
|
||||
'g.is_home_recommended' => 1,
|
||||
'g.is_shelves' => 1,
|
||||
];
|
||||
$v['goods_ids'] = Db::name('Goods')->alias('g')->join(['__GOODS_CATEGORY_JOIN__'=>'gci'], 'g.id=gci.goods_id')->where($where)->group('g.id')->order($order_by)->limit($goods_count)->column('g.id');
|
||||
// 获取商品ids
|
||||
$where = [
|
||||
'gci.category_id' => $category_ids,
|
||||
'g.is_home_recommended' => 1,
|
||||
'g.is_shelves' => 1,
|
||||
];
|
||||
$v['goods_ids'] = Db::name('Goods')->alias('g')->join(['__GOODS_CATEGORY_JOIN__'=>'gci'], 'g.id=gci.goods_id')->where($where)->group('g.id')->order($order_by)->limit($goods_count)->column('g.id');
|
||||
}
|
||||
break;
|
||||
|
||||
// 手动模式
|
||||
case 1 :
|
||||
if(!empty($floor_manual_mode_goods) && is_array($floor_manual_mode_goods) && array_key_exists($v['id'], $floor_manual_mode_goods))
|
||||
{
|
||||
$v['goods_ids'] = $floor_manual_mode_goods[$v['id']];
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// 商品数据、后面实时读取这里赋空值
|
||||
$v['goods'] = [];
|
||||
|
||||
// 楼层关键字
|
||||
@ -257,16 +299,44 @@ class GoodsService
|
||||
// 商品读取、商品信息需要实时读取
|
||||
if(!empty($data) && is_array($data))
|
||||
{
|
||||
// 去除分类关键字前缀
|
||||
$order_by = str_replace('g.', '', $order_by);
|
||||
// 商品id一次性读取商品
|
||||
$goods_ids = [];
|
||||
foreach($data as $cg)
|
||||
{
|
||||
if(!empty($cg['goods_ids']) & is_array($cg['goods_ids']))
|
||||
{
|
||||
$goods_ids = array_merge($goods_ids, $cg['goods_ids']);
|
||||
}
|
||||
}
|
||||
// 读取商品
|
||||
$goods_list = [];
|
||||
if(!empty($goods_ids))
|
||||
{
|
||||
$where = [
|
||||
['id', 'in', array_unique($goods_ids)],
|
||||
['is_shelves', '=', 1],
|
||||
];
|
||||
$res = self::GoodsList(['where'=>$where, 'm'=>0, 'n'=>0, 'field'=>'*']);
|
||||
$goods_list = empty($res['data']) ? [] : array_column($res['data'], null, 'id');
|
||||
}
|
||||
|
||||
// 根据分类获取楼层商品
|
||||
foreach($data as &$v)
|
||||
if(!empty($goods_list))
|
||||
{
|
||||
if(!empty($v['goods_ids']) && is_array($v['goods_ids']))
|
||||
foreach($data as &$cv)
|
||||
{
|
||||
$res = self::GoodsList(['where'=>['id'=>$v['goods_ids'], 'is_home_recommended'=>1, 'is_shelves'=>1], 'm'=>0, 'n'=>$goods_count, 'field'=>'*', 'order_by'=>$order_by]);
|
||||
$v['goods'] = $res['data'];
|
||||
if(!empty($cv['goods_ids']) && is_array($cv['goods_ids']))
|
||||
{
|
||||
$temp = [];
|
||||
foreach($cv['goods_ids'] as $gid)
|
||||
{
|
||||
if(array_key_exists($gid, $goods_list))
|
||||
{
|
||||
$temp[] = $goods_list[$gid];
|
||||
}
|
||||
}
|
||||
$cv['goods'] = $temp;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1021,48 +1091,45 @@ class GoodsService
|
||||
// 启动事务
|
||||
Db::startTrans();
|
||||
|
||||
// 添加/编辑
|
||||
if(empty($params['id']))
|
||||
{
|
||||
$data['add_time'] = time();
|
||||
$goods_id = Db::name('Goods')->insertGetId($data);
|
||||
} else {
|
||||
$goods = Db::name('Goods')->find($params['id']);
|
||||
$data['upd_time'] = time();
|
||||
if(Db::name('Goods')->where(['id'=>intval($params['id'])])->update($data))
|
||||
// 捕获异常
|
||||
try {
|
||||
// 添加/编辑
|
||||
if(empty($params['id']))
|
||||
{
|
||||
$goods_id = $params['id'];
|
||||
$data['add_time'] = time();
|
||||
$goods_id = Db::name('Goods')->insertGetId($data);
|
||||
if($goods_id <= 0)
|
||||
{
|
||||
throw new \Exception('添加失败');
|
||||
}
|
||||
} else {
|
||||
$data['upd_time'] = time();
|
||||
if(Db::name('Goods')->where(['id'=>intval($params['id'])])->update($data))
|
||||
{
|
||||
$goods_id = $params['id'];
|
||||
} else {
|
||||
throw new \Exception('更新失败');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 是否成功
|
||||
$status = false;
|
||||
if(isset($goods_id) && $goods_id > 0)
|
||||
{
|
||||
// 分类
|
||||
$ret = self::GoodsCategoryInsert(explode(',', $params['category_id']), $goods_id);
|
||||
if($ret['code'] != 0)
|
||||
{
|
||||
// 回滚事务
|
||||
Db::rollback();
|
||||
return $ret;
|
||||
throw new \Exception($ret['msg']);
|
||||
}
|
||||
|
||||
// 规格
|
||||
$ret = self::GoodsSpecificationsInsert($specifications['data'], $goods_id);
|
||||
if($ret['code'] != 0)
|
||||
{
|
||||
// 回滚事务
|
||||
Db::rollback();
|
||||
return $ret;
|
||||
throw new \Exception($ret['msg']);
|
||||
} else {
|
||||
// 更新商品基础信息
|
||||
$ret = self::GoodsSaveBaseUpdate($params, $goods_id);
|
||||
$ret = self::GoodsSaveBaseUpdate($goods_id);
|
||||
if($ret['code'] != 0)
|
||||
{
|
||||
// 回滚事务
|
||||
Db::rollback();
|
||||
return $ret;
|
||||
throw new \Exception($ret['msg']);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1070,48 +1137,35 @@ class GoodsService
|
||||
$ret = self::GoodsPhotoInsert($photo['data'], $goods_id);
|
||||
if($ret['code'] != 0)
|
||||
{
|
||||
// 回滚事务
|
||||
Db::rollback();
|
||||
return $ret;
|
||||
throw new \Exception($ret['msg']);
|
||||
}
|
||||
|
||||
// 手机详情
|
||||
$ret = self::GoodsContentAppInsert($content_app['data'], $goods_id);
|
||||
if($ret['code'] != 0)
|
||||
{
|
||||
// 回滚事务
|
||||
Db::rollback();
|
||||
return $ret;
|
||||
throw new \Exception($ret['msg']);
|
||||
}
|
||||
|
||||
// 商品参数
|
||||
$ret = self::GoodsParametersInsert($params, $goods_id);
|
||||
if($ret['code'] != 0)
|
||||
{
|
||||
// 回滚事务
|
||||
Db::rollback();
|
||||
return $ret;
|
||||
throw new \Exception($ret['msg']);
|
||||
}
|
||||
|
||||
// 仓库规格库存同步
|
||||
$ret = WarehouseGoodsService::GoodsSpecChangeInventorySync($goods_id);
|
||||
if($ret['code'] != 0)
|
||||
{
|
||||
// 回滚事务
|
||||
Db::rollback();
|
||||
return $ret;
|
||||
throw new \Exception($ret['msg']);
|
||||
}
|
||||
|
||||
// 操作成功
|
||||
$status = true;
|
||||
}
|
||||
|
||||
// 事务处理
|
||||
if($status)
|
||||
{
|
||||
// 完成
|
||||
Db::commit();
|
||||
} else {
|
||||
} catch(\Exception $e) {
|
||||
Db::rollback();
|
||||
return DataReturn($e->getMessage(), -1);
|
||||
}
|
||||
|
||||
// 商品保存后钩子
|
||||
@ -1125,11 +1179,7 @@ class GoodsService
|
||||
]);
|
||||
|
||||
// 返回信息
|
||||
if($status)
|
||||
{
|
||||
return DataReturn('操作成功', 0);
|
||||
}
|
||||
return DataReturn('操作失败', -100);
|
||||
return DataReturn('操作成功', 0);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1182,10 +1232,9 @@ class GoodsService
|
||||
* @blog http://gong.gg/
|
||||
* @version 1.0.0
|
||||
* @datetime 2018-12-16T01:56:42+0800
|
||||
* @param [array] $params [输入参数]
|
||||
* @param [int] $goods_id [商品id]
|
||||
*/
|
||||
public static function GoodsSaveBaseUpdate($params, $goods_id)
|
||||
public static function GoodsSaveBaseUpdate($goods_id)
|
||||
{
|
||||
$data = Db::name('GoodsSpecBase')->field('min(price) AS min_price, max(price) AS max_price, sum(inventory) AS inventory, min(original_price) AS min_original_price, max(original_price) AS max_original_price')->where(['goods_id'=>$goods_id])->find();
|
||||
if(empty($data))
|
||||
|
||||
186
application/service/SiteService.php
Normal file
186
application/service/SiteService.php
Normal file
@ -0,0 +1,186 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | ShopXO 国内领先企业级B2C免费开源电商系统
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2011~2019 http://shopxo.net All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: Devil
|
||||
// +----------------------------------------------------------------------
|
||||
namespace app\service;
|
||||
|
||||
use think\Db;
|
||||
use app\service\GoodsService;
|
||||
|
||||
/**
|
||||
* 站点设置服务层
|
||||
* @author Devil
|
||||
* @blog http://gong.gg/
|
||||
* @version 0.0.1
|
||||
* @datetime 2016-12-01T21:51:08+0800
|
||||
*/
|
||||
class SiteService
|
||||
{
|
||||
/**
|
||||
* redis连接测试
|
||||
* @author Devil
|
||||
* @blog http://gong.gg/
|
||||
* @version 1.0.0
|
||||
* @date 2020-09-26
|
||||
* @desc description
|
||||
* @param [string] $host [连接地址]
|
||||
* @param [int] $port [端口]
|
||||
* @param [string] $password [密码]
|
||||
*/
|
||||
public static function RedisCheckConnectPing($host, $port, $password)
|
||||
{
|
||||
// 参数处理
|
||||
$host = empty($host) ? '127.0.0.1' : $host;
|
||||
$port = empty($port) ? 6379 : $port;
|
||||
$password = empty($password) ? '' : $password;
|
||||
|
||||
// 是否已安装redis扩展
|
||||
if(!extension_loaded('redis'))
|
||||
{
|
||||
return DataReturn('请先安装redis扩展', -1);
|
||||
}
|
||||
|
||||
// 捕获异常
|
||||
try {
|
||||
// 连接redis
|
||||
$redis = new \Redis();
|
||||
$redis->connect($host, $port);
|
||||
if($password != '')
|
||||
{
|
||||
$redis->auth($password);
|
||||
}
|
||||
} catch(\Exception $e) {
|
||||
return DataReturn('redis连接失败['.$e->getMessage().']', -1);
|
||||
}
|
||||
|
||||
// 检测是否连接成功
|
||||
if($redis->ping())
|
||||
{
|
||||
return DataReturn('redis连接成功', 0);
|
||||
}
|
||||
return DataReturn('redis连接失败', -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* 商品搜索
|
||||
* @author Devil
|
||||
* @blog http://gong.gg/
|
||||
* @version 1.0.0
|
||||
* @date 2020-07-13
|
||||
* @desc description
|
||||
* @param [array] $params [输入参数]
|
||||
*/
|
||||
public static function GoodsSearchList($params = [])
|
||||
{
|
||||
// 返回数据
|
||||
$result = [
|
||||
'page_total' => 0,
|
||||
'page_size' => 20,
|
||||
'page' => max(1, isset($params['page']) ? intval($params['page']) : 1),
|
||||
'total' => 0,
|
||||
'data' => [],
|
||||
];
|
||||
|
||||
// 条件
|
||||
$where = [
|
||||
['g.is_delete_time', '=', 0],
|
||||
['g.is_shelves', '=', 1]
|
||||
];
|
||||
|
||||
// 关键字
|
||||
if(!empty($params['keywords']))
|
||||
{
|
||||
$where[] = ['g.title', 'like', '%'.$params['keywords'].'%'];
|
||||
}
|
||||
|
||||
// 分类id
|
||||
if(!empty($params['category_id']))
|
||||
{
|
||||
$category_ids = GoodsService::GoodsCategoryItemsIds([$params['category_id']], 1);
|
||||
$category_ids[] = $params['category_id'];
|
||||
$where[] = ['gci.category_id', 'in', $category_ids];
|
||||
}
|
||||
|
||||
// 获取商品总数
|
||||
$result['total'] = GoodsService::CategoryGoodsTotal($where);
|
||||
|
||||
// 获取商品列表
|
||||
if($result['total'] > 0)
|
||||
{
|
||||
// 基础参数
|
||||
$field = 'g.id,g.title,g.images';
|
||||
$order_by = 'g.id desc';
|
||||
|
||||
// 分页计算
|
||||
$m = intval(($result['page']-1)*$result['page_size']);
|
||||
$goods = GoodsService::CategoryGoodsList(['where'=>$where, 'm'=>$m, 'n'=>$result['page_size'], 'field'=>$field, 'order_by'=>$order_by]);
|
||||
$result['data'] = $goods['data'];
|
||||
$result['page_total'] = ceil($result['total']/$result['page_size']);
|
||||
// 数据处理
|
||||
if(!empty($result['data']) && is_array($result['data']) && !empty($params['goods_ids']) && is_array($params['goods_ids']))
|
||||
{
|
||||
foreach($result['data'] as &$v)
|
||||
{
|
||||
// 是否已添加
|
||||
$v['is_exist'] = in_array($v['id'], $params['goods_ids']) ? 1 : 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
return DataReturn('处理成功', 0, $result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 楼层自定义商品展示数据处理
|
||||
* @author Devil
|
||||
* @blog http://gong.gg/
|
||||
* @version 1.0.0
|
||||
* @date 2020-11-25
|
||||
* @desc description
|
||||
* @param [array] $data [配置数据]
|
||||
*/
|
||||
public static function FloorManualModeGoodsViewHandle($data)
|
||||
{
|
||||
$result = [];
|
||||
if(!empty($data) && is_array($data))
|
||||
{
|
||||
// 商品id集合
|
||||
$goods_ids = [];
|
||||
foreach($data as $gid)
|
||||
{
|
||||
$goods_ids = array_merge($goods_ids, $gid);
|
||||
}
|
||||
// 获取商品数据
|
||||
$ret = GoodsService::GoodsList([
|
||||
'where' => [
|
||||
['id', 'in', array_unique($goods_ids)],
|
||||
['is_shelves', '=', 1],
|
||||
],
|
||||
'field' => 'id,title,images',
|
||||
]);
|
||||
// 使用商品id作为key返回
|
||||
$goods = empty($ret['data']) ? [] : array_column($ret['data'], null, 'id');
|
||||
|
||||
// 数据组合
|
||||
foreach($data as $k=>$v)
|
||||
{
|
||||
$temp = [];
|
||||
foreach($v as $vs)
|
||||
{
|
||||
if(array_key_exists($vs, $goods))
|
||||
{
|
||||
$temp[] = $goods[$vs];
|
||||
}
|
||||
}
|
||||
$result[$k] = $temp;
|
||||
}
|
||||
}
|
||||
return DataReturn('处理成功', 0, $result);
|
||||
}
|
||||
}
|
||||
?>
|
||||
@ -56,6 +56,7 @@ return array (
|
||||
'plugins_service_buy_order_insert_end' =>
|
||||
array (
|
||||
0 => 'app\\plugins\\ordergoodsform\\Hook',
|
||||
1 => 'app\\plugins\\distribution\\Hook',
|
||||
),
|
||||
'plugins_view_index_order_list_operate' =>
|
||||
array (
|
||||
@ -74,10 +75,12 @@ return array (
|
||||
'plugins_service_goods_handle_end' =>
|
||||
array (
|
||||
0 => 'app\\plugins\\membershiplevelvip\\Hook',
|
||||
1 => 'app\\plugins\\distribution\\Hook',
|
||||
),
|
||||
'plugins_service_goods_spec_base' =>
|
||||
array (
|
||||
0 => 'app\\plugins\\membershiplevelvip\\Hook',
|
||||
1 => 'app\\plugins\\distribution\\Hook',
|
||||
),
|
||||
'plugins_service_buy_group_goods_handle' =>
|
||||
array (
|
||||
@ -91,14 +94,17 @@ return array (
|
||||
'plugins_service_goods_spec_extends_handle' =>
|
||||
array (
|
||||
0 => 'app\\plugins\\membershiplevelvip\\Hook',
|
||||
1 => 'app\\plugins\\distribution\\Hook',
|
||||
),
|
||||
'plugins_view_admin_user_save' =>
|
||||
array (
|
||||
0 => 'app\\plugins\\membershiplevelvip\\Hook',
|
||||
1 => 'app\\plugins\\distribution\\Hook',
|
||||
),
|
||||
'plugins_service_user_save_handle' =>
|
||||
array (
|
||||
0 => 'app\\plugins\\membershiplevelvip\\Hook',
|
||||
1 => 'app\\plugins\\distribution\\Hook',
|
||||
),
|
||||
'plugins_service_goods_save_handle' =>
|
||||
array (
|
||||
@ -107,6 +113,7 @@ return array (
|
||||
'plugins_view_goods_detail_panel_price_top' =>
|
||||
array (
|
||||
0 => 'app\\plugins\\membershiplevelvip\\Hook',
|
||||
1 => 'app\\plugins\\distribution\\Hook',
|
||||
),
|
||||
'plugins_view_home_goods_inside_bottom' =>
|
||||
array (
|
||||
@ -124,12 +131,14 @@ return array (
|
||||
array (
|
||||
0 => 'app\\plugins\\membershiplevelvip\\Hook',
|
||||
1 => 'app\\plugins\\coupon\\Hook',
|
||||
2 => 'app\\plugins\\distribution\\Hook',
|
||||
),
|
||||
'plugins_service_header_navigation_top_right_handle' =>
|
||||
array (
|
||||
0 => 'app\\plugins\\membershiplevelvip\\Hook',
|
||||
1 => 'app\\plugins\\multilingual\\Hook',
|
||||
2 => 'app\\plugins\\coupon\\Hook',
|
||||
3 => 'app\\plugins\\distribution\\Hook',
|
||||
),
|
||||
'plugins_common_page_bottom' =>
|
||||
array (
|
||||
@ -170,10 +179,19 @@ return array (
|
||||
'plugins_service_order_status_change_history_success_handle' =>
|
||||
array (
|
||||
0 => 'app\\plugins\\coupon\\Hook',
|
||||
1 => 'app\\plugins\\distribution\\Hook',
|
||||
),
|
||||
'plugins_service_user_register_end' =>
|
||||
array (
|
||||
0 => 'app\\plugins\\coupon\\Hook',
|
||||
),
|
||||
'plugins_service_order_aftersale_audit_handle_end' =>
|
||||
array (
|
||||
0 => 'app\\plugins\\distribution\\Hook',
|
||||
),
|
||||
'plugins_service_site_extraction_address_list' =>
|
||||
array (
|
||||
0 => 'app\\plugins\\distribution\\Hook',
|
||||
),
|
||||
);
|
||||
?>
|
||||
@ -2,10 +2,11 @@
|
||||
ShopXO 1.9.2 Release --- http://shopxo.net
|
||||
+=========================================================+
|
||||
全局
|
||||
1.
|
||||
1. 首页商品支持自定义配置
|
||||
|
||||
web端
|
||||
1. 后台管理小程序列表新增主题管理
|
||||
2. 分类管理组件优化、支持异步无刷新操作
|
||||
|
||||
小程序
|
||||
1. 支付订单0金额错误修复
|
||||
|
||||
File diff suppressed because one or more lines are too long
@ -1,5 +1,5 @@
|
||||
/**
|
||||
* logo
|
||||
* 登录
|
||||
*/
|
||||
ul.home_site_logo-images-view li,
|
||||
ul.home_site_logo_wap-images-view li {
|
||||
@ -46,4 +46,76 @@ ul.home_site_user_register_bg_images-images-view li {
|
||||
.address-list .delete-submit {
|
||||
right: 70px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 收到模式下商品列表容器
|
||||
*/
|
||||
.manual-mode-goods-container li {
|
||||
position: relative;
|
||||
}
|
||||
.manual-mode-goods-container li button.am-close {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
padding: 8px 25px 8px 15px;
|
||||
}
|
||||
|
||||
/**
|
||||
* 商品添加-搜索列表
|
||||
*/
|
||||
.goods-add-container {
|
||||
height: 100%;
|
||||
}
|
||||
.forth-selection-container select.forth-selection-form-category {
|
||||
display: -webkit-inline-box;
|
||||
}
|
||||
.forth-selection-container .forth-selection-form-category, .forth-selection-container .chosen-container, .forth-selection-container .forth-selection-form-keywords {
|
||||
width: calc(50% - 48px) !important;
|
||||
}
|
||||
.forth-selection-container .chosen-container, .forth-selection-container .forth-selection-form-keywords {
|
||||
display: -webkit-inline-box !important;
|
||||
}
|
||||
.forth-selection-container .chosen-single {
|
||||
width: 100%;
|
||||
}
|
||||
.forth-selection-container .search-submit {
|
||||
width: 87px;
|
||||
}
|
||||
.goods-list-container {
|
||||
height: calc(100% - 92px);
|
||||
border: 1px solid #eee;
|
||||
}
|
||||
.goods-list-container .am-gallery-bordered .am-gallery-title {
|
||||
margin-top: 5px;
|
||||
}
|
||||
.goods-list-container ul li {
|
||||
position: relative;
|
||||
cursor: pointer;
|
||||
}
|
||||
.goods-list-container ul li:hover .am-gallery-item {
|
||||
-webkit-box-shadow: 0 0 6px #3cb4f1;
|
||||
box-shadow: 0 0 6px #3cb4f1;
|
||||
}
|
||||
.goods-list-container .icon-submit-container {
|
||||
position: absolute;
|
||||
right: 15px;
|
||||
bottom: 47px;
|
||||
}
|
||||
.goods-list-container .icon-submit-container .am-icon-btn {
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
line-height: 36px;
|
||||
font-size: 20px;
|
||||
-webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.5);
|
||||
box-shadow: 0 0 3px rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
.goods-list-container .am-icon-btn.am-success:hover {
|
||||
background: #4CAF50;
|
||||
}
|
||||
.goods-list-container .am-icon-btn.am-danger:hover {
|
||||
background: #F44336;
|
||||
}
|
||||
.goods-page-container {
|
||||
height: 40px;
|
||||
}
|
||||
|
||||
@ -51,22 +51,22 @@ function AddressModalHandle(data)
|
||||
var value = SelfExtractionAddressValue();
|
||||
|
||||
// 弹层
|
||||
var $popup = $('#popup-address-win');
|
||||
var $popup_address = $('#popup-address-win');
|
||||
|
||||
// 操作类型(add, edit)
|
||||
var form_type = $popup.attr('data-type') || 'add';
|
||||
var form_type = $popup_address.attr('data-type') || 'add';
|
||||
if(form_type == 'add')
|
||||
{
|
||||
$('ul.address-list').append(html);
|
||||
data['id'] = value.length;
|
||||
value.push(data);
|
||||
} else {
|
||||
var form_index = $popup.attr('data-index') || 0;
|
||||
var form_index = $popup_address.attr('data-index') || 0;
|
||||
data['id'] = form_index;
|
||||
value.splice(form_index, 1, data);
|
||||
$('ul.address-list').find('li').eq(form_index).replaceWith(html);
|
||||
}
|
||||
$popup.modal('close');
|
||||
$popup_address.modal('close');
|
||||
$('.self-extraction-address-value').val(JSON.stringify(value));
|
||||
});
|
||||
}
|
||||
@ -88,13 +88,13 @@ function SelfExtractionAddressValue()
|
||||
$(function()
|
||||
{
|
||||
// 弹层
|
||||
var $popup = $('#popup-address-win');
|
||||
var $popup_address = $('#popup-address-win');
|
||||
|
||||
// 地址添加开启
|
||||
$('.address-submit-add').on('click', function()
|
||||
{
|
||||
$popup.modal();
|
||||
$popup.attr('data-type', 'add');
|
||||
$popup_address.modal();
|
||||
$popup_address.attr('data-type', 'add');
|
||||
|
||||
// 清空数据
|
||||
FormDataFill({"alias":"", "name":"", "tel":"", "address":"", "province":0, "city":0, "county":0, "lng":"", "lat":""}, 'form.form-validation-address');
|
||||
@ -152,11 +152,132 @@ $(function()
|
||||
RegionNodeData(item['city'], 'county', 'county', item['county']);
|
||||
|
||||
// 基础数据
|
||||
$popup.modal();
|
||||
$popup.attr('data-type', 'edit');
|
||||
$popup.attr('data-index', index);
|
||||
$popup_address.modal();
|
||||
$popup_address.attr('data-type', 'edit');
|
||||
$popup_address.attr('data-index', index);
|
||||
|
||||
// 地图初始化
|
||||
MapInit(item.lng, item.lat);
|
||||
});
|
||||
|
||||
|
||||
// 商品列表拖拽
|
||||
$('ul.manual-mode-goods-container').dragsort({ dragSelector: 'li', placeHolderTemplate: '<li class="drag-sort-dotted"></li>'});
|
||||
|
||||
// 商品搜索popup容器
|
||||
var $popup_siteset_goods = $('#siteset-goods-popup');
|
||||
|
||||
// 分页
|
||||
$('.goods-page-container').html(PageLibrary());
|
||||
|
||||
// 开启商品弹窗
|
||||
$('.goods-popup-add').on('click', function()
|
||||
{
|
||||
// 操作标记
|
||||
$popup_siteset_goods.attr('data-tag', $(this).data('tag') || '');
|
||||
$popup_siteset_goods.attr('data-form-name', $(this).data('form-name') || '');
|
||||
|
||||
// 初始化搜索数据
|
||||
$('.goods-list-container ul.am-gallery').html('<div class="table-no"><i class="am-icon-warning"></i> 请搜索商品</div>');
|
||||
$('.goods-page-container').html(PageLibrary());
|
||||
$popup_siteset_goods.modal();
|
||||
});
|
||||
|
||||
// 搜索商品
|
||||
$(document).on('click', '.forth-selection-container .search-submit, .pagelibrary li a', function()
|
||||
{
|
||||
// 分页处理
|
||||
var is_active = $(this).data('is-active') || 0;
|
||||
if(is_active == 1)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
var page = $(this).data('page') || 1;
|
||||
|
||||
// 请求参数
|
||||
var url = $('.forth-selection-container').data('search-url');
|
||||
var category_id = $('.forth-selection-form-category').val();
|
||||
var keywords = $('.forth-selection-form-keywords').val();
|
||||
var goods_ids = [];
|
||||
$($popup_siteset_goods.attr('data-tag')).find('input[type="hidden"]').each(function(k, v)
|
||||
{
|
||||
goods_ids.push($(this).val());
|
||||
});
|
||||
|
||||
var $this = $(this);
|
||||
$this.button('loading');
|
||||
$('.goods-list-container ul.am-gallery').html('<div class="table-no"><i class="am-icon-spinner am-icon-pulse"></i> '+($('.goods-list-container').data('loading-msg'))+'</div>');
|
||||
$.ajax({
|
||||
url: url,
|
||||
type: 'post',
|
||||
data: {"page":page, "category_id":category_id, "keywords":keywords, "goods_ids":goods_ids},
|
||||
dataType: 'json',
|
||||
success:function(res)
|
||||
{
|
||||
$this.button('reset');
|
||||
if(res.code == 0)
|
||||
{
|
||||
$('.goods-list-container').attr('data-is-init', 0);
|
||||
$('.goods-list-container ul.am-gallery').html(res.data.data);
|
||||
$('.goods-page-container').html(PageLibrary(res.data.total, res.data.page_size, res.data.page, 4));
|
||||
} else {
|
||||
Prompt(res.msg);
|
||||
$('.goods-list-container ul.am-gallery').html('<div class="table-no"><i class="am-icon-warning"></i> '+res.msg+'</div>');
|
||||
}
|
||||
},
|
||||
error:function(res)
|
||||
{
|
||||
$this.button('reset');
|
||||
Prompt('请求失败');
|
||||
$('.goods-list-container ul.am-gallery').html('<div class="table-no"><i class="am-icon-warning"></i> 请求失败</div>');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 删除列表
|
||||
$(document).on('click', '.manual-mode-goods-container li button.am-close', function()
|
||||
{
|
||||
$(this).parent('li').remove();
|
||||
});
|
||||
|
||||
// 商品添加/删除
|
||||
$(document).on('click', '.goods-list-container .goods-add-submit, .goods-list-container .goods-del-submit', function()
|
||||
{
|
||||
// 基础参数
|
||||
var $this = $(this);
|
||||
var type = $this.data('type');
|
||||
var icon_html = $this.parents('li').data((type == 'add' ? 'del' : 'add')+'-html');
|
||||
var goods_id = $this.parents('li').data('gid');
|
||||
var goods_title = $this.parents('li').data('title');
|
||||
var goods_url = $this.parents('li').data('url');
|
||||
var goods_img = $this.parents('li').data('img');
|
||||
var tag = $popup_siteset_goods.attr('data-tag') || '';
|
||||
var form_name = $popup_siteset_goods.attr('data-form-name') || '';
|
||||
|
||||
// 商品是否已经添加
|
||||
if($(tag).find('.manual-mode-goods-item-'+goods_id).length > 0)
|
||||
{
|
||||
$(tag).find('.manual-mode-goods-item-'+goods_id).remove();
|
||||
} else {
|
||||
$(tag).append('<li class="manual-mode-goods-item-'+goods_id+'"><input type="hidden" name="'+form_name+'" value="'+goods_id+'" /><a href="'+goods_url+'" target="_blank" class="am-text-truncate"><img src="'+goods_img+'" alt="'+goods_title+'" class="am-fl am-margin-right-xs" width="20" height="20" /><span>'+goods_title+'</span></a><button type="button" class="am-close am-fr">×</button></li>');
|
||||
}
|
||||
$this.parent().html(icon_html);
|
||||
});
|
||||
|
||||
// 弹窗全屏
|
||||
$('#siteset-goods-popup').on('click', '.am-popup-hd .am-full', function()
|
||||
{
|
||||
var width = $(window).width();
|
||||
var height = $(window).height();
|
||||
if(width >= 630 && height >= 630)
|
||||
{
|
||||
var $parent = $(this).parents('.am-popup');
|
||||
if($parent.hasClass('popup-full'))
|
||||
{
|
||||
$parent.find('.am-gallery').addClass('am-avg-lg-5').removeClass('am-avg-lg-8');
|
||||
} else {
|
||||
$parent.find('.am-gallery').addClass('am-avg-lg-8').removeClass('am-avg-lg-5');
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
@ -122,7 +122,7 @@ form.am-form .am-form-group-refreshing, .plug-file-upload-view { border-bottom:
|
||||
.am-popup-hd .am-full {
|
||||
position: absolute;
|
||||
right: 40px;
|
||||
top: 11px;
|
||||
top: 9px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.am-popup-hd .am-full:hover {
|
||||
|
||||
Reference in New Issue
Block a user