diff --git a/application/module/FormHandleModule.php b/application/module/FormHandleModule.php
index 7bc2e1eab..86796bbde 100644
--- a/application/module/FormHandleModule.php
+++ b/application/module/FormHandleModule.php
@@ -12,6 +12,7 @@ namespace app\module;
use think\Controller;
use think\facade\Hook;
+use app\service\FormTableService;
/**
* 动态表格处理
@@ -31,8 +32,12 @@ class FormHandleModule
public $out_params;
// 条件参数
public $where_params;
+ // md5key
+ public $md5_key;
// 搜索条件
public $where;
+ // 用户选择字段字段
+ public $user_fields;
/**
* 运行入口
@@ -101,6 +106,9 @@ class FormHandleModule
]);
}
+ // md5key
+ $this->FromMd5Key($module, $action);
+
// 基础条件
$this->BaseWhereHandle();
@@ -110,15 +118,99 @@ class FormHandleModule
// 基础数据结尾处理
$this->FormBaseLastHandle();
+ // 用户字段选择处理
+ $this->FormFieldsUserSelect();
+
// 数据返回
$data = [
- 'table' => $this->form_data,
- 'where' => $this->where,
- 'params' => $this->where_params,
+ 'table' => $this->form_data,
+ 'where' => $this->where,
+ 'params' => $this->where_params,
+ 'md5_key' => $this->md5_key,
+ 'user_fields' => $this->user_fields,
];
return DataReturn('success', 0, $data);
}
+ /**
+ * 字段用户选择处理
+ * @author Devil
+ * @blog http://gong.gg/
+ * @version 1.0.0
+ * @date 2020-10-09
+ * @desc description
+ */
+ public function FormFieldsUserSelect()
+ {
+ // 当前用户选择的字段
+ $ret = FormTableService::FieldsSelectData(['md5_key'=>$this->md5_key]);
+ if(empty($ret['data']))
+ {
+ // 未设置则读取所有带label的字段、默认显示
+ $this->user_fields = array_filter(array_map(function($value)
+ {
+ if(!empty($value['label']) && $value['view_type'] != 'operate')
+ {
+ return ['label'=>$value['label'], 'checked'=>1];
+ }
+ }, $this->form_data['form']));
+ } else {
+ $this->user_fields = $ret['data'];
+ }
+
+ // 如用户已选择字段则排除数据
+ if(!empty($this->user_fields))
+ {
+ $data = [];
+ // 无标题元素放在前面
+ foreach($this->form_data['form'] as $v)
+ {
+ if(empty($v['label']))
+ {
+ $data[] = $v;
+ }
+ }
+
+ // 根据用户选择顺序追加数据
+ $temp_form = array_column($this->form_data['form'], null, 'label');
+ foreach($this->user_fields as $v)
+ {
+ if(array_key_exists($v['label'], $temp_form))
+ {
+ $temp = $temp_form[$v['label']];
+ $temp['is_list'] = $v['checked'];
+ $data[] = $temp;
+ }
+ }
+
+ // 操作元素放在最后面
+ foreach($this->form_data['form'] as $v)
+ {
+ if(isset($v['view_type']) && $v['view_type'] == 'operate')
+ {
+ $data[] = $v;
+ }
+ }
+
+ $this->form_data['form'] = $data;
+ }
+ }
+
+ /**
+ * 表单md5key值
+ * @author Devil
+ * @blog http://gong.gg/
+ * @version 1.0.0
+ * @date 2020-10-08
+ * @desc description
+ * @param [string] $module [模块位置]
+ * @param [string] $action [模块方法(默认 Run 方法,可自动匹配控制器方法名)]
+ */
+ public function FromMd5Key($module, $action)
+ {
+ $this->md5_key = md5($module.'\\'.$action);
+ }
+
/**
* 表格数据处理
* @author Devil
diff --git a/application/service/BrandService.php b/application/service/BrandService.php
index bd793ec92..ba06f26c2 100755
--- a/application/service/BrandService.php
+++ b/application/service/BrandService.php
@@ -41,7 +41,7 @@ class BrandService
$m = isset($params['m']) ? intval($params['m']) : 0;
$n = isset($params['n']) ? intval($params['n']) : 10;
- // 获取品牌列表
+ // 获取列表
$data = Db::name('Brand')->where($where)->order($order_by)->limit($m, $n)->select();
if(!empty($data))
{
diff --git a/application/service/FormTableService.php b/application/service/FormTableService.php
new file mode 100644
index 000000000..facb3217c
--- /dev/null
+++ b/application/service/FormTableService.php
@@ -0,0 +1,177 @@
+ 'empty',
+ 'key_name' => 'user_id',
+ 'error_msg' => '用户id有误',
+ ],
+ [
+ 'checked_type' => 'in',
+ 'key_name' => 'user_type',
+ 'checked_data' => [0,1],
+ 'error_msg' => '用户类型有误',
+ ],
+ [
+ 'checked_type' => 'empty',
+ 'key_name' => 'md5_key',
+ 'error_msg' => '数据key有误',
+ ],
+ [
+ 'checked_type' => 'empty',
+ 'key_name' => 'fields',
+ 'error_msg' => '请选择字段',
+ ],
+ ];
+ $ret = ParamsChecked($params, $p);
+ if($ret !== true)
+ {
+ return DataReturn($ret, -1);
+ }
+
+ // 数据
+ $data = [
+ 'user_id' => intval($params['user_id']),
+ 'user_type' => intval($params['user_type']),
+ 'md5_key' => $params['md5_key'],
+ 'fields' => empty($params['fields']) ? '' : (is_array($params['fields']) ? json_encode($params['fields'], JSON_UNESCAPED_UNICODE) : $params['fields']),
+ 'add_time' => time(),
+ 'upd_time' => time(),
+ ];
+ if(Db::name('FormTableUserFields')->insertGetId($data) <= 0)
+ {
+ return DataReturn('操作失败', -100);
+ }
+ return DataReturn('操作成功', 0);
+ }
+
+ /**
+ * 用户字段选择重置
+ * @author Devil
+ * @blog http://gong.gg/
+ * @version 1.0.0
+ * @date 2020-10-08
+ * @desc description
+ * @param [array] $params [输入参数]
+ */
+ public static function FieldsSelectReset($params = [])
+ {
+ // 参数校验
+ $p = [
+ [
+ 'checked_type' => 'empty',
+ 'key_name' => 'user_id',
+ 'error_msg' => '用户id有误',
+ ],
+ [
+ 'checked_type' => 'in',
+ 'key_name' => 'user_type',
+ 'checked_data' => [0,1],
+ 'error_msg' => '用户类型有误',
+ ],
+ [
+ 'checked_type' => 'empty',
+ 'key_name' => 'md5_key',
+ 'error_msg' => '数据key有误',
+ ],
+ ];
+ $ret = ParamsChecked($params, $p);
+ if($ret !== true)
+ {
+ return DataReturn($ret, -1);
+ }
+
+ // 数据删除
+ $where = [
+ 'user_id' => intval($params['user_id']),
+ 'user_type' => intval($params['user_type']),
+ 'md5_key' => $params['md5_key'],
+ ];
+ if(Db::name('FormTableUserFields')->where($where)->delete() === false)
+ {
+ return DataReturn('操作失败', -100);
+ }
+ return DataReturn('操作成功', 0);
+ }
+
+ /**
+ * 获取用户选择的字段数据
+ * @author Devil
+ * @blog http://gong.gg/
+ * @version 1.0.0
+ * @date 2020-10-08
+ * @desc description
+ * @param [array] $params [输入参数]
+ */
+ public static function FieldsSelectData($params = [])
+ {
+ // 模块
+ $module_name = strtolower(request()->module());
+
+ // 当前用户
+ if($module_name == 'admin')
+ {
+ $admin = session('admin');
+ $user_id = empty($admin['id']) ? 0 : $admin['id'];
+ $user_type = 0;
+ } else {
+ $user = UserService::LoginUserInfo();
+ $user_id = empty($user['id']) ? 0 : $user['id'];
+ $user_type = 1;
+ }
+ if(empty($user_id))
+ {
+ return DataReturn('用户信息有误', -1);
+ }
+ if(empty($params['md5_key']))
+ {
+ return DataReturn('数据key有误', -1);
+ }
+
+ // 获取数据
+ $where = [
+ 'user_id' => $user_id,
+ 'user_type' => $user_type,
+ 'md5_key' => $params['md5_key'],
+ ];
+ // 获取数据
+ $data = Db::name('FormTableUserFields')->where($where)->order('id desc')->find();
+ $data = empty($data['fields']) ? [] : json_decode($data['fields'], true);
+ return DataReturn('处理成功', 0, $data);
+ }
+}
+?>
\ No newline at end of file
diff --git a/application/tags.php b/application/tags.php
index d78d67d2d..741848d4b 100755
--- a/application/tags.php
+++ b/application/tags.php
@@ -151,6 +151,7 @@ return array (
array (
0 => 'app\\plugins\\answers\\Hook',
1 => 'app\\plugins\\blog\\Hook',
+ 2 => 'app\\plugins\\speedplaceorder\\Hook',
),
);
?>
\ No newline at end of file
diff --git a/changelog.txt b/changelog.txt
index e65649681..04c54be48 100755
--- a/changelog.txt
+++ b/changelog.txt
@@ -8,11 +8,13 @@
4. 新增附件、css/js静态可配置CDN域名
5. 网站首页可后台控制配置
6. 新增SESSION和数据缓存配置Redis(独立配置)
+ 7. 新增支付接口异步推送日志记录
web端
1. 后台菜单支持自定义url地址、并支持钩子自动添加
2. 后台区块数据统计新增当月、上月维度
3. 新增插件路由短地址规则
+ 4. 动态表格列表支持自定义显示字段和拖拽排序
小程序
1. QQ小程序支持微信支付
@@ -22,6 +24,7 @@ web端
插件
1. 汇率插件支持货币自由切换
2. 新增IEPay新西兰货币支付(支付宝+微信)
+ 3. 新增博客插件、写文章增加商城的搜索引擎收录、关联推荐商品
+=========================================================+
diff --git a/config/shopxo.sql b/config/shopxo.sql
index 62e59c60a..ccebe11ff 100644
--- a/config/shopxo.sql
+++ b/config/shopxo.sql
@@ -11,7 +11,7 @@
Target Server Version : 50729
File Encoding : utf-8
- Date: 10/06/2020 22:23:57 PM
+ Date: 10/09/2020 17:07:14 PM
*/
SET NAMES utf8mb4;
@@ -343,7 +343,7 @@ CREATE TABLE `s_config` (
-- Records of `s_config`
-- ----------------------------
BEGIN;
-INSERT INTO `s_config` VALUES ('15', '15', '分页数量', '分页显示数量', '分页不能超过3位数', 'admin', 'common_page_size', '1598699950'), ('59', '1', '扣减库存规则', '需扣减库存开启方可有效,默认订单支付成功', '', 'common', 'common_deduction_inventory_rules', '1599205984'), ('60', '1', '是否扣减库存', '建议不要随意修改,以免造成库存数据错乱,关闭不影响库存回滚', '', 'common', 'common_is_deduction_inventory', '1599205984'), ('11', '0', 'Excel编码', 'excel模块编码选择', '请选择编码', 'admin', 'admin_excel_charset', '1598699950'), ('16', 'ShopXO企业级B2C电商系统提供商 - 演示站点', '站点标题', '浏览器标题,一般不超过80个字符', '站点标题不能为空', 'home', 'home_seo_site_title', '1601289833'), ('17', '商城系统,开源电商系统,免费电商系统,PHP电商系统,商城系统,B2C电商系统,B2B2C电商系统', '站点关键字', '一般不超过100个字符,多个关键字以半圆角逗号 [ , ] 隔开', '站点关键字不能为空', 'home', 'home_seo_site_keywords', '1601289833'), ('18', 'ShopXO是国内领先的商城系统提供商,为企业提供php商城系统、微信商城、小程序。', '站点描述', '站点描述,一般不超过200个字符', '站点描述不能为空', 'home', 'home_seo_site_description', '1601289833'), ('19', '沪ICP备20014383号', 'ICP证书号', 'ICP域名备案号', '', 'home', 'home_site_icp', '1599920895'), ('20', '', '底部统计代码', '支持html,可用于添加流量统计代码', '', 'home', 'home_statistics_code', '0'), ('21', '1', '站点状态', '可暂时将站点关闭,其他人无法访问,但不影响管理员访问后台', '请选择站点状态', 'home', 'home_site_state', '1600008688'), ('22', '升级中...', '关闭原因', '支持html,当网站处于关闭状态时,关闭原因将显示在前台', '', 'home', 'home_site_close_reason', '1600008688'), ('23', 'Australia/Eucla', '默认时区', '默认 亚洲/上海 [标准时+8]', '请选择默认时区', 'common', 'common_timezone', '1600008688'), ('24', '', '底部代码', '支持html,可用于添加流量统计代码', '', 'home', 'home_footer_info', '1600008688'), ('28', 'ShopXO', '站点名称', '', '站点名称不能为空', 'home', 'home_site_name', '1600008688'), ('29', '2', '链接模式', '详情ThinkPHP官网5.1版本文档 [http://www.thinkphp.cn/]', '请选择url模式', 'home', 'home_seo_url_model', '1601289833'), ('25', '2048000', '图片最大限制', '单位B [上传图片还受到服务器空间PHP配置最大上传 20M 限制]', '请填写图片上传最大限制', 'home', 'home_max_limit_image', '1595992413'), ('26', '51200000', '文件最大限制', '单位B [上传文件还受到服务器空间PHP配置最大上传 20M 限制]', '请填写文件上传最大限制', 'home', 'home_max_limit_file', '1595992413'), ('27', '102400000', '视频最大限制', '单位B [上传视频还受到服务器空间PHP配置最大上传 20M 限制]', '请填写视频上传最大限制', 'home', 'home_max_limit_video', '1595992413'), ('30', 'html', '伪静态后缀', '链接后面的后缀别名,默认 [ html ]', '小写字母,不能超过8个字符', 'home', 'home_seo_url_html_suffix', '1601289833'), ('31', '0', '用户注册开启审核', '开启后用户注册需要审核通过方可登录', '请选择用户注册开启审核', 'common', 'common_register_is_enable_audit', '1566227415'), ('32', '/static/upload/images/common/2019/01/14/1547448748316693.png', '手机端logo', '支持 [jpg, png, gif]', '请上传手机端网站logo', 'home', 'home_site_logo_wap', '1600008688'), ('33', '/static/upload/images/common/2019/01/14/1547448705165706.png', '电脑端logo', '支持 [jpg, png, gif]', '请上传电脑端网站logo', 'home', 'home_site_logo', '1600008688'), ('34', '1200', '页面最大宽度', '页面最大宽度,单位px,0则100%', '请上传桌面图标', 'home', 'home_content_max_width', '1600008688'), ('35', '/static/upload/images/common/2019/01/14/1547448728921121.jpg', '桌面图标', '建议使用png格式', '图片比例值格式有误 0~100 之间,小数点后面最大两位', 'common', 'home_site_desktop_icon', '1600008688'), ('36', 'sms,email,username', '是否开启注册', '关闭注册后,前端站点将无法注册,可选择 [ 短信, 邮箱, 用户名 ]', '请选择是否开启注册状态', 'home', 'home_user_reg_state', '1566227415'), ('37', '1', '是否开启登录', '关闭后,前端站点将无法登录', '请选择是否开启登录状态', 'home', 'home_user_login_state', '1558084931'), ('38', '1', '获取验证码-开启图片验证码', '防止短信轰炸', '请选择是否开启强制图片验证码', 'home', 'home_img_verify_state', '1558085166'), ('39', '60', '获取验证码时间间隔', '防止频繁获取验证码,一般在 30~120 秒之间,单位 [秒]', '请填写获取验证码时间间隔', 'home', 'common_verify_interval_time', '1558085166'), ('40', '', '用户注册-短信模板ID', '验证码code', '请填写用户注册短信模板内容', 'home', 'home_sms_user_reg', '1587366205'), ('41', '', '短信签名', '发送短信包含的签名', '短信签名 3~8 个的中英文字符', 'common', 'common_sms_sign', '1587366196'), ('42', '', '短信KeyID', 'Access Key ID', '请填写Access Key ID', 'common', 'common_sms_apikey', '1587366196'), ('43', '', '密码找回-短信模板ID', '验证码code', '请填写密码找回短信模板内容', 'home', 'home_sms_user_forget_pwd', '1587366205'), ('44', '600', '验证码有效时间', '验证码过期时间,一般10分钟左右,单位 [秒]', '请填写验证码有效时间', 'home', 'common_verify_expire_time', '1558085166'), ('45', '', 'SMTP服务器', '设置SMTP服务器的地址,如 smtp.163.com', '请填写SMTP服务器', 'common', 'common_email_smtp_host', '1597483532'), ('46', '', 'SMTP端口', '设置SMTP服务器的端口,默认为 25', '请填写SMTP端口号', 'common', 'common_email_smtp_port', '1597483532'), ('47', '', '发信人邮件地址', '发信人邮件地址,使用SMTP协议发送的邮件地址,如 shopxo@163.com', '请填写发信人邮件地址', 'common', 'common_email_smtp_account', '1597483532'), ('48', '', 'SMTP身份验证用户名', '如 shopxo@163.com', '请填写SMTP身份验证用户名', 'common', 'common_email_smtp_name', '1597483532'), ('49', '', 'SMTP身份验证密码', 'shopxo@163.com邮件的密码或授权码', '请填写SMTP身份验证密码', 'common', 'common_email_smtp_pwd', '1597483532'), ('50', '', '发件人显示名称', '如 ShopXO', '', 'common', 'common_email_smtp_send_name', '1597483532'), ('51', '', '通用-短信模板ID', '验证码code', '请填写通用短信模板内容', 'common', 'common_sms_currency_template', '1587366205'), ('58', '', '短信KeySecret', 'Access Key Secret', '请填写Access Key Secret', 'common', 'common_sms_apisecret', '1587366196'), ('53', '021-88888888', '商店电话', '空则不显示', '', 'common', 'common_customer_store_tel', '1587138005'), ('56', '通用模板,你的验证码是 #code#
', '通用-邮件模板', '验证码变量标识符 [ #code# ]', '', 'common', 'common_email_currency_template', '1557728601'), ('57', 'default', '默认模板', '前台默认模板', '请填写默认模板', 'common', 'common_default_theme', '1597421091'), ('62', 'XSdiGjfg3wOHiKjpYEMG6CYA', '百度地图api密钥', '百度地图2.0起必须配置AK密钥', '请填写百度地图api密钥', 'common', 'common_baidu_map_ak', '1598699950'), ('63', '用户注册,你的验证码是 #code#
', '用户注册-邮件模板', '验证码变量标识符 [ #code# ]', '', 'home', 'home_email_user_reg', '1557728601'), ('64', '密码找回,你的验证码是 #code#
', '密码找回-邮件模板', '验证码变量标识符 [ #code# ]', '', 'home', 'home_email_user_forget_pwd', '1557728601'), ('65', '邮箱绑定,你的验证码是 #code#
', '邮箱绑定-邮件模板', '验证码变量标识符 [ #code# ]', '', 'home', 'home_email_user_email_binding', '1557728601'), ('66', '20200202', 'css/js版本标记', '用于css/js浏览器缓存版本识别', '', 'home', 'home_static_cache_version', '1600008688'), ('67', '', '手机号码绑定-短信模板ID', '验证码code', '请填写手机号码绑定短信模板内容', 'home', 'home_sms_user_mobile_binding', '1587366205'), ('68', '连衣裙,帐篷,iphone,包包', '搜索关键字', '搜索框下热门关键字(输入回车)', '请填写关键字', 'home', 'home_search_keywords', '1600767589'), ('69', '2', '搜索关键字类型', '自定义需要配置以下关键字', '请选择关键字类型', 'home', 'home_search_keywords_type', '1600767589'), ('70', '0', '订单预约模式', '开启后用户提交订单需要管理员确认', '请选择是否开启预约模式', 'common', 'common_order_is_booking', '1599205984'), ('71', 'ShopXO', '名称', '', '请填写名称', 'common', 'common_app_mini_alipay_title', '1597483646'), ('72', '国内领先企业级B2C开源电商系统!', '描述', '', '请填写描述', 'common', 'common_app_mini_alipay_describe', '1597483646'), ('73', '021-88888888', '客服电话', '空则不显示', '请填写客服电话', 'common', 'common_app_customer_service_tel', '1597483581'), ('74', '', 'AppID', '小程序ID', '请填写AppID', 'common', 'common_app_mini_alipay_appid', '1597483646'), ('75', '', '应用公钥', '', '请填写应用公钥', 'common', 'common_app_mini_alipay_rsa_public', '1597483646'), ('180', '', '密码', '默认无密码', '请填写密码', 'common', 'common_cache_session_redis_password', '1601115834'), ('181', '', '有效时间', '默认3600秒', '请填写有效时间', 'common', 'common_cache_session_redis_expire', '1601115834'), ('182', '', '前缀', '默认 shopxo', '请填写前缀', 'common', 'common_cache_session_redis_prefix', '1601115834'), ('76', '', '应用私钥', '', '请填写应用私钥', 'common', 'common_app_mini_alipay_rsa_private', '1597483646'), ('171', '0', '首页楼层商品排序类型', '默认综合', '请选择首页楼层商品排序类型', 'home', 'home_index_floor_goods_order_by_type', '1600767589'), ('173', '百宝箱', '快捷导航名称', '默认 百宝箱', '请填写快捷导航名称', 'home', 'home_navigation_main_quick_name', '1600767589'), ('172', '0', '首页楼层商品排序规则', '默认降序(desc)', '请选择首页楼层商品排序规则', 'home', 'home_index_floor_goods_order_by_rule', '1600767589'), ('174', '1', '获取账户手机一键登录', '默认否', '请选择获取账户手机一键登录', 'common', 'common_user_is_onekey_bind_mobile', '1600610405'), ('175', '1', '启用订单批量支付', '默认否', '请选择获启用订单批量支付', 'home', 'home_is_enable_order_bulk_pay', '1600767589'), ('176', '0', 'Session使用缓存', '默认否', '请选择Session使用缓存', 'common', 'common_session_is_use_cache', '1601115834'), ('177', '0', '数据使用缓存', '默认否', '请选择数据使用缓存', 'common', 'common_data_is_use_cache', '1601115834'), ('178', '', '连接地址', '默认 127.0.0.1', '请填写连接地址', 'common', 'common_cache_session_redis_host', '1601115834'), ('179', '', '端口号', '默认 6379', '请填写端口号', 'common', 'common_cache_session_redis_port', '1601115834'), ('78', '1', '是否启用搜索', '默认否', '', 'common', 'common_app_is_enable_search', '1600610405'), ('77', '', '支付宝公钥', '', '请填写支付宝公钥', 'common', 'common_app_mini_alipay_out_rsa_public', '1597483646'), ('167', '', 'css/js静态文件cdn域名', 'css/js静态文件', '请填写css/js静态文件cdn域名', 'common', 'common_cdn_public_host', '1599988905'), ('168', '8', '首页楼层商品数量', '默认8个', '请填写首页楼层商品数量', 'home', 'home_index_floor_goods_max_count', '1600767589'), ('170', '{\"1\":\"手机,小米,华为,iphone,vivo\",\"2\":\"女装,连衣裙,包包,睡衣,斜挎 短袖\"}', '首页楼层顶部右侧关键字', '楼层下关键字(输入回车)', '请填写首页楼层顶部右侧关键字', 'home', 'home_index_floor_top_right_keywords', '1600767589'), ('79', '1', '是否启用留言', '默认否', '', 'common', 'common_app_is_enable_answer', '1600610405'), ('80', '3', '商品可添加规格最大数量', '建议不超过3个规格', '请填写谷歌最大数', 'common', 'common_spec_add_max_number', '1598699950'), ('81', '-', '路由分隔符', '建议填写 [ - ] 默认 [ - ] ,仅PATHINFO模式+短地址模式下有效', '请填写路由分隔符', 'common', 'common_route_separator', '1601289833'), ('82', 'wxda7779770f53e901', 'AppID', '小程序ID', '请填写appid', 'common', 'common_app_mini_weixin_appid', '1599460181'), ('83', '4bb30af2e71e84f2f5107c0572f66641', 'AppSecret ', '小程序密钥', '请填写appsecret', 'common', 'common_app_mini_weixin_appsecret', '1599460181'), ('84', 'ShopXO', '名称', '', '请填写名称', 'common', 'common_app_mini_weixin_title', '1599460181'), ('85', '国内领先企业级B2C开源电商系统!', '描述', '', '请填写描述', 'common', 'common_app_mini_weixin_describe', '1599460181'), ('61', '用户中心公告文字,后台配置修改。', '用户中心公告', '空则不显示公告', '', 'common', 'common_user_center_notice', '1597483581'), ('8', '公告内容', '商城公告', '空则不显示公告', '', 'common', 'common_shop_notice', '1597483581'), ('86', 'test@qq.com', '商店邮箱', '空则不显示', '客服邮箱格式有误', 'common', 'common_customer_store_email', '1587138005'), ('87', '', '商店二维码', '空则不展示', '', 'common', 'common_customer_store_qrcode', '1598699950'), ('152', '[{\"alias\":\"总部\",\"name\":\"devil\",\"tel\":\"13222333333\",\"lng\":\"121.594278\",\"lat\":\"31.207917\",\"address\":\"张江高科\",\"province\":\"9\",\"city\":\"155\",\"county\":\"1937\",\"province_name\":\"上海市\",\"city_name\":\"浦东新区\",\"county_name\":\"张江镇\",\"id\":0}]', '自提点地址', '', '请填写自提点地址', 'common', 'common_self_extraction_address', '1599205984'), ('88', '上海市 浦东新区', '商店地址', '空则不展示', '', 'common', 'common_customer_store_address', '1587138005'), ('89', '用户注册协议
', '用户注册协议', '最多 105000 个字符', '用户注册协议最多 105000 个字符', 'common', 'common_agreement_userregister', '1600052861'), ('90', '/static/upload/images/common/2019/05/17/1558025141249118.png', '用户注册背景图片', '', '请上传用户注册背景图片', 'home', 'home_site_user_register_bg_images', '1566227415'), ('91', '/static/upload/images/common/2019/05/17/1558062481107570.jpg', '图片', '图片1 [ 建议使用 450X350 像数 ]', '', 'home', 'home_site_user_login_ad1_images', '1558084931'), ('92', '/static/upload/images/common/2019/05/17/1558072588843696.jpg', '图片', '图片2 [ 建议使用 450X350 像数 ]', '', 'home', 'home_site_user_login_ad2_images', '1558084931'), ('93', '/static/upload/images/common/2019/05/17/1558073623385520.jpg', '图片', '图片2 [ 建议使用 450X350 像数 ]', '', 'home', 'home_site_user_login_ad3_images', '1558084931'), ('94', 'https://shopxo.net/', 'url地址', '地址1 [ 带http://或https:// ]', '', 'home', 'home_site_user_login_ad1_url', '1558084931'), ('95', 'https://ask.shopxo.net/', 'url地址', '地址2 [ 带http://或https:// ]', '', 'home', 'home_site_user_login_ad2_url', '1558084931'), ('96', 'https://shopxo.net/vip.html', 'url地址', '地址3 [ 带http://或https:// ]', '', 'home', 'home_site_user_login_ad3_url', '1558084931'), ('97', '', '背景色', '背景色1', '', 'home', 'home_site_user_login_ad1_bg_color', '1558084931'), ('98', '#FAFAFA', '背景色', '背景色2', '', 'home', 'home_site_user_login_ad2_bg_color', '1558084931'), ('99', '#FAFAFA', '背景色', '背景色3', '', 'home', 'home_site_user_login_ad3_bg_color', '1558084931'), ('100', '1', '登录图片验证码', '可以防止非法登录', '请选择是否开启登录图片验证码', 'home', 'home_user_login_img_verify_state', '1558084931'), ('101', '/static/upload/images/common/2019/05/17/1558072588843696.jpg', '图片', '图片1 [ 建议使用 450X350 像数 ]', '', 'home', 'home_site_user_forgetpwd_ad1_images', '1558084915'), ('102', '/static/upload/images/common/2019/05/17/1558073623641199.jpg', '图片', '图片2 [ 建议使用 450X350 像数 ]', '', 'home', 'home_site_user_forgetpwd_ad2_images', '1558084915'), ('103', '', '图片', '图片2 [ 建议使用 450X350 像数 ]', '', 'home', 'home_site_user_forgetpwd_ad3_images', '1558084915'), ('104', 'https://shopxo.net/', 'url地址', '地址1 [ 带http://或https:// ]', '', 'home', 'home_site_user_forgetpwd_ad1_url', '1558084915'), ('105', '', 'url地址', '地址2 [ 带http://或https:// ]', '', 'home', 'home_site_user_forgetpwd_ad2_url', '1558084915'), ('106', '', 'url地址', '地址3 [ 带http://或https:// ]', '', 'home', 'home_site_user_forgetpwd_ad3_url', '1558084915'), ('107', '#FAFAFA', '背景色', '背景色1', '', 'home', 'home_site_user_forgetpwd_ad1_bg_color', '1558084915'), ('108', '#FAFAFA', '背景色', '背景色2', '', 'home', 'home_site_user_forgetpwd_ad2_bg_color', '1558084915'), ('109', '', '背景色', '背景色3', '', 'home', 'home_site_user_forgetpwd_ad3_bg_color', '1558084915'), ('110', '1', '用户注册图片验证码', '可以防止非法注册', '请选择是否开启用户注册图片验证码', 'home', 'home_user_register_img_verify_state', '1566227415'), ('111', '', '图片验证码规则', '默认白底黑字,可根据需求i加大验证码识别难度', '', 'common', 'common_images_verify_rules', '1558085166'), ('112', '0', 'SSL方式加密', '', '请选择是否使用SSL方式加密', 'common', 'common_email_is_use_ssl', '1597483532'), ('113', '活动/优惠未生效\n空包裹\n包裹丢失\n配送超时\n未按约定时间发货\n未送货上门\n物流显示签收但实际未收到货\n不喜欢/不想要', '仅退款原因', '可换行,一行一个', '请填写仅退款原因', 'home', 'home_order_aftersale_return_only_money_reason', '1570193301'), ('114', '7天无理由退换货\n配送超时\n未按约定时间发货\n未送货上门\n卖家发错货\n少件/漏发\n包装/商品破损/污渍\n商品信息描述不符\n使用后过敏\n已过/临近保质期\n无法溶解/结块/有异物', '退货退款原因', '可换行,一行一个', '请填写退货退款原因', 'home', 'home_order_aftersale_return_money_goods_reason', '1570193301'), ('115', '1', '用户注册协议', '', '请选择是否启用用户注册协议', 'home', 'home_is_enable_userregister_agreement', '1566227415'), ('116', '上海市 浦东新区', '退货地址', '用户退货货物收货地址', '请填写退货地址', 'home', 'home_order_aftersale_return_goods_address', '1570193301'), ('117', '0', '使用独立手机详情', '默认使用web详情', '请选择使用独立手机详情', 'common', 'common_app_is_use_mobile_detail', '1600610405'), ('118', '1', '强制绑定手机', '默认否', '请选择是否强制绑定手机', 'common', 'common_user_is_mandatory_bind_mobile', '1600610405'), ('121', '1', '固定顶部导航', '默认否', '请选择是否固定顶部导航', 'common', 'common_app_is_header_nav_fixed', '1600610405'), ('122', '1', '开启在线客服', '默认否', '请选择是否开启在线客服', 'common', 'common_app_is_online_service', '1600610405'), ('169', '10', '首页楼层左侧二级商品分类数量', '默认6个', '请填写首页楼层左侧二级商品分类数量', 'home', 'home_index_floor_left_goods_category_max_count', '1600767589'), ('163', '30', '订单完成可发起售后时限', '单位 天,默认30天', '请填写订单完成可发起售后时限', 'common', 'home_order_aftersale_return_launch_day', '1572350417'), ('124', '0', '启用好物推荐', '默认否,需重新生成小程序包(启用则需到微信小程序后台申请权限)', '请选择是否启用好物推荐', 'common', 'common_app_is_good_thing', '1599460181'), ('125', '20215038', 'AppID', '智能小程序ID', '请填写AppID', 'common', 'common_app_mini_baidu_appid', '1600589715'), ('126', 'SNM5PYwfnZcIzTFxbmTeyasTnOiOg7o0', 'AppKey', '智能小程序KEY', '请填写AppKey', 'common', 'common_app_mini_baidu_appkey', '1600589715'), ('127', 'LZ9Fa2qDEmcoB2uuGiHNON7GEaGzvg5H', 'AppSecret', '智能小程序密匙', '请填写AppSecret', 'common', 'common_app_mini_baidu_appsecret', '1600589715'), ('128', 'ShopXO', '名称', '', '请填写名称', 'common', 'common_app_mini_baidu_title', '1600589715'), ('129', '国内领先企业级B2C开源电商系统!', '描述', '', '请填写描述', 'common', 'common_app_mini_baidu_describe', '1600589715'), ('130', '0', '留言需要登录', '默认否', '请选择是否留言需要登录', 'common', 'common_is_login_answer', '1599988905'), ('131', '0', '启用海报分享', '默认否\n', '请选择是否启用海报分享\n', 'common', 'common_app_is_poster_share', '1599460181'), ('132', '30', '订单关闭脚本时长', '单位 分钟,默认30分钟', '请填写订单关闭脚本时长', 'common', 'common_order_close_limit_time', '1599988905'), ('133', '21600', '订单自动收货脚本时长', '单位 分钟,默认21600分钟/15天', '请填写订单自动收货脚本时长', 'common', 'common_order_success_limit_time', '1599988905'), ('134', '', 'AppID', '小程序ID', '请填写AppID', 'common', 'common_app_mini_toutiao_appid', '1580644065'), ('135', '', 'AppSecret', '小程序Secret', '请填写AppSecret', 'common', 'common_app_mini_toutiao_appsecret', '1580644065'), ('136', '', 'PayMerchantID', '支付商户号', '请填写支付商户号', 'common', 'common_app_mini_toutiao_pay_merchant_id', '1580644065'), ('137', '', 'PayAppID', '支付AppID', '请填写AppID', 'common', 'common_app_mini_toutiao_pay_appid', '1580644065'), ('138', '', 'PaySecret', '支付Secret', '请填写支付Secret', 'common', 'common_app_mini_toutiao_pay_secret', '1580644065'), ('139', 'ShopXO', '名称', '', '请填写名称', 'common', 'common_app_mini_toutiao_title', '1580644065'), ('140', '国内领先企业级B2C开源电商系统!', '描述', '', '请填写描述', 'common', 'common_app_mini_toutiao_describe', '1580644065'), ('141', '', '公安备案号', '如:京公网安备xxx号', '请填写公安备案号', 'home', 'home_site_security_record_name', '1599920895'), ('142', '', '公安备案地址', '备案展示页面的url地址', '请填写公安备案地址', 'home', 'home_site_security_record_url', '1599920895'), ('143', '1110736292', 'AppID', '小程序ID', '请填写AppID', 'common', 'common_app_mini_qq_appid', '1600519265'), ('144', 'FaR92OFdaa0zpwXk', 'AppSecret', '小程序Secret', '请填写AppSecret', 'common', 'common_app_mini_qq_appsecret', '1600519265'), ('145', '0d212f19cbf9e8045d7530528586b099', 'AppToken', '小程序Token', '请填写AppToken', 'common', 'common_app_mini_qq_apptoken', '1600519265'), ('146', 'ShopXO', '名称', '', '请填写名称', 'common', 'common_app_mini_qq_title', '1600519265'), ('147', '国内领先企业级B2C开源电商系统!', '描述', '', '请填写描述', 'common', 'common_app_mini_qq_describe', '1600519265'), ('148', '1', '是否启用用户中心头部小导航', '默认否', '请选择是否启用用户中心头部小导航', 'common', 'common_app_is_head_vice_nav', '1600610405'), ('151', '4', '站点类型', '默认销售型', '请选择站点类型', 'common', 'common_site_type', '1599205984'), ('150', '', '展示型操作名称', '默认 立即咨询', '请填写展示型操作名称', 'common', 'common_is_exhibition_mode_btn_text', '1599205984'), ('153', '', '虚拟信息标题', '默认密钥信息', '请填写虚拟信息标题', 'common', 'common_site_fictitious_return_title', '1599205984'), ('154', '', '提示信息', '', '请填写提示信息', 'common', 'common_site_fictitious_return_tips', '1599205984'), ('155', '', '在线客服-企业编码', '空则不显示在线客服', '请填写在线客服-企业编码', 'common', 'common_app_mini_alipay_tnt_inst_id', '1597483646'), ('156', '', '在线客服-聊天窗编码', '空则不显示在线客服', '请填写在线客服-聊天窗编码', 'common', 'common_app_mini_alipay_scene', '1597483646'), ('157', '0', '商品详情页展示相册', '默认否', '请选择是否商品详情页展示相册', 'common', 'common_is_goods_detail_show_photo', '1600767589'), ('158', '0', '手机简洁模式', '默认否', '请选择是否手机简洁模式', 'common', 'common_is_mobile_concise_model', '1597483581'), ('159', '0', '启用直播', '默认否,需重新生成小程序包(启用则需到微信小程序后台申请权限)', '请选择是否启用直播', 'common', 'common_app_weixin_liveplayer', '1599460181'), ('160', '4.0.1', '好物推荐组件版本号', '', '请填写好物推荐组件版本号', 'common', 'common_app_is_good_thing_ver', '1599460181'), ('161', '1.1.4', '直播组件版本号', '', '请填写直播组件版本号', 'common', 'common_app_weixin_liveplayer_ver', '1599460181'), ('162', '1', '后台登录页随机背景图', '默认启用', '请选择后台登录页随机背景图', 'common', 'admin_login_info_bg_images_rand', '1598699950'), ('164', '30', '支付日志订单关闭脚本时长', '单位 分钟,默认30分钟', '请填写支付日志订单关闭脚本时长', 'common', 'common_pay_log_order_close_limit_time', '1599988905'), ('165', '3', '分类展示层级', '默认3级', '请填写分类展示层级', 'common', 'common_show_goods_category_level', '1600767589'), ('166', '', '附件cdn域名', '图片/视频/文件', '请填写附件cdn域名', 'common', 'common_cdn_attachment_host', '1599988905'), ('183', '', '连接地址', '默认 127.0.0.1', '请填写连接地址', 'common', 'common_cache_data_redis_host', '1601115834'), ('184', '', '端口号', '默认 6379', '请填写端口号', 'common', 'common_cache_data_redis_port', '1601115834'), ('185', '', '密码', '默认无密码', '请填写密码', 'common', 'common_cache_data_redis_password', '1601115834'), ('186', '', '有效时间', '默认0表示永久', '请填写有效时间', 'common', 'common_cache_data_redis_expire', '1601115834'), ('187', '', '前缀', '默认 shopxo', '请填写前缀', 'common', 'common_cache_data_redis_prefix', '1601115834');
+INSERT INTO `s_config` VALUES ('15', '15', '分页数量', '分页显示数量', '分页不能超过3位数', 'admin', 'common_page_size', '1598699950'), ('59', '1', '扣减库存规则', '需扣减库存开启方可有效,默认订单支付成功', '', 'common', 'common_deduction_inventory_rules', '1599205984'), ('60', '1', '是否扣减库存', '建议不要随意修改,以免造成库存数据错乱,关闭不影响库存回滚', '', 'common', 'common_is_deduction_inventory', '1599205984'), ('11', '0', 'Excel编码', 'excel模块编码选择', '请选择编码', 'admin', 'admin_excel_charset', '1598699950'), ('16', 'ShopXO企业级B2C电商系统提供商 - 演示站点', '站点标题', '浏览器标题,一般不超过80个字符', '站点标题不能为空', 'home', 'home_seo_site_title', '1602074750'), ('17', '商城系统,开源电商系统,免费电商系统,PHP电商系统,商城系统,B2C电商系统,B2B2C电商系统', '站点关键字', '一般不超过100个字符,多个关键字以半圆角逗号 [ , ] 隔开', '站点关键字不能为空', 'home', 'home_seo_site_keywords', '1602074750'), ('18', 'ShopXO是国内领先的商城系统提供商,为企业提供php商城系统、微信商城、小程序。', '站点描述', '站点描述,一般不超过200个字符', '站点描述不能为空', 'home', 'home_seo_site_description', '1602074750'), ('19', '沪ICP备20014383号', 'ICP证书号', 'ICP域名备案号', '', 'home', 'home_site_icp', '1599920895'), ('20', '', '底部统计代码', '支持html,可用于添加流量统计代码', '', 'home', 'home_statistics_code', '0'), ('21', '1', '站点状态', '可暂时将站点关闭,其他人无法访问,但不影响管理员访问后台', '请选择站点状态', 'home', 'home_site_state', '1600008688'), ('22', '升级中...', '关闭原因', '支持html,当网站处于关闭状态时,关闭原因将显示在前台', '', 'home', 'home_site_close_reason', '1600008688'), ('23', 'Australia/Eucla', '默认时区', '默认 亚洲/上海 [标准时+8]', '请选择默认时区', 'common', 'common_timezone', '1600008688'), ('24', '', '底部代码', '支持html,可用于添加流量统计代码', '', 'home', 'home_footer_info', '1600008688'), ('28', 'ShopXO', '站点名称', '', '站点名称不能为空', 'home', 'home_site_name', '1600008688'), ('29', '2', '链接模式', '详情ThinkPHP官网5.1版本文档 [http://www.thinkphp.cn/]', '请选择url模式', 'home', 'home_seo_url_model', '1602074750'), ('25', '2048000', '图片最大限制', '单位B [上传图片还受到服务器空间PHP配置最大上传 20M 限制]', '请填写图片上传最大限制', 'home', 'home_max_limit_image', '1595992413'), ('26', '51200000', '文件最大限制', '单位B [上传文件还受到服务器空间PHP配置最大上传 20M 限制]', '请填写文件上传最大限制', 'home', 'home_max_limit_file', '1595992413'), ('27', '102400000', '视频最大限制', '单位B [上传视频还受到服务器空间PHP配置最大上传 20M 限制]', '请填写视频上传最大限制', 'home', 'home_max_limit_video', '1595992413'), ('30', 'html', '伪静态后缀', '链接后面的后缀别名,默认 [ html ]', '小写字母,不能超过8个字符', 'home', 'home_seo_url_html_suffix', '1602074750'), ('31', '0', '用户注册开启审核', '开启后用户注册需要审核通过方可登录', '请选择用户注册开启审核', 'common', 'common_register_is_enable_audit', '1566227415'), ('32', '/static/upload/images/common/2019/01/14/1547448748316693.png', '手机端logo', '支持 [jpg, png, gif]', '请上传手机端网站logo', 'home', 'home_site_logo_wap', '1600008688'), ('33', '/static/upload/images/common/2019/01/14/1547448705165706.png', '电脑端logo', '支持 [jpg, png, gif]', '请上传电脑端网站logo', 'home', 'home_site_logo', '1600008688'), ('34', '1200', '页面最大宽度', '页面最大宽度,单位px,0则100%', '请上传桌面图标', 'home', 'home_content_max_width', '1600008688'), ('35', '/static/upload/images/common/2019/01/14/1547448728921121.jpg', '桌面图标', '建议使用png格式', '图片比例值格式有误 0~100 之间,小数点后面最大两位', 'common', 'home_site_desktop_icon', '1600008688'), ('36', 'sms,email,username', '是否开启注册', '关闭注册后,前端站点将无法注册,可选择 [ 短信, 邮箱, 用户名 ]', '请选择是否开启注册状态', 'home', 'home_user_reg_state', '1566227415'), ('37', '1', '是否开启登录', '关闭后,前端站点将无法登录', '请选择是否开启登录状态', 'home', 'home_user_login_state', '1558084931'), ('38', '1', '获取验证码-开启图片验证码', '防止短信轰炸', '请选择是否开启强制图片验证码', 'home', 'home_img_verify_state', '1558085166'), ('39', '60', '获取验证码时间间隔', '防止频繁获取验证码,一般在 30~120 秒之间,单位 [秒]', '请填写获取验证码时间间隔', 'home', 'common_verify_interval_time', '1558085166'), ('40', '', '用户注册-短信模板ID', '验证码code', '请填写用户注册短信模板内容', 'home', 'home_sms_user_reg', '1587366205'), ('41', '', '短信签名', '发送短信包含的签名', '短信签名 3~8 个的中英文字符', 'common', 'common_sms_sign', '1587366196'), ('42', '', '短信KeyID', 'Access Key ID', '请填写Access Key ID', 'common', 'common_sms_apikey', '1587366196'), ('43', '', '密码找回-短信模板ID', '验证码code', '请填写密码找回短信模板内容', 'home', 'home_sms_user_forget_pwd', '1587366205'), ('44', '600', '验证码有效时间', '验证码过期时间,一般10分钟左右,单位 [秒]', '请填写验证码有效时间', 'home', 'common_verify_expire_time', '1558085166'), ('45', '', 'SMTP服务器', '设置SMTP服务器的地址,如 smtp.163.com', '请填写SMTP服务器', 'common', 'common_email_smtp_host', '1597483532'), ('46', '', 'SMTP端口', '设置SMTP服务器的端口,默认为 25', '请填写SMTP端口号', 'common', 'common_email_smtp_port', '1597483532'), ('47', '', '发信人邮件地址', '发信人邮件地址,使用SMTP协议发送的邮件地址,如 shopxo@163.com', '请填写发信人邮件地址', 'common', 'common_email_smtp_account', '1597483532'), ('48', '', 'SMTP身份验证用户名', '如 shopxo@163.com', '请填写SMTP身份验证用户名', 'common', 'common_email_smtp_name', '1597483532'), ('49', '', 'SMTP身份验证密码', 'shopxo@163.com邮件的密码或授权码', '请填写SMTP身份验证密码', 'common', 'common_email_smtp_pwd', '1597483532'), ('50', '', '发件人显示名称', '如 ShopXO', '', 'common', 'common_email_smtp_send_name', '1597483532'), ('51', '', '通用-短信模板ID', '验证码code', '请填写通用短信模板内容', 'common', 'common_sms_currency_template', '1587366205'), ('58', '', '短信KeySecret', 'Access Key Secret', '请填写Access Key Secret', 'common', 'common_sms_apisecret', '1587366196'), ('53', '021-88888888', '商店电话', '空则不显示', '', 'common', 'common_customer_store_tel', '1587138005'), ('56', '通用模板,你的验证码是 #code#
', '通用-邮件模板', '验证码变量标识符 [ #code# ]', '', 'common', 'common_email_currency_template', '1557728601'), ('57', 'default', '默认模板', '前台默认模板', '请填写默认模板', 'common', 'common_default_theme', '1597421091'), ('62', 'XSdiGjfg3wOHiKjpYEMG6CYA', '百度地图api密钥', '百度地图2.0起必须配置AK密钥', '请填写百度地图api密钥', 'common', 'common_baidu_map_ak', '1598699950'), ('63', '用户注册,你的验证码是 #code#
', '用户注册-邮件模板', '验证码变量标识符 [ #code# ]', '', 'home', 'home_email_user_reg', '1557728601'), ('64', '密码找回,你的验证码是 #code#
', '密码找回-邮件模板', '验证码变量标识符 [ #code# ]', '', 'home', 'home_email_user_forget_pwd', '1557728601'), ('65', '邮箱绑定,你的验证码是 #code#
', '邮箱绑定-邮件模板', '验证码变量标识符 [ #code# ]', '', 'home', 'home_email_user_email_binding', '1557728601'), ('66', '20200202', 'css/js版本标记', '用于css/js浏览器缓存版本识别', '', 'home', 'home_static_cache_version', '1600008688'), ('67', '', '手机号码绑定-短信模板ID', '验证码code', '请填写手机号码绑定短信模板内容', 'home', 'home_sms_user_mobile_binding', '1587366205'), ('68', '连衣裙,帐篷,iphone,包包', '搜索关键字', '搜索框下热门关键字(输入回车)', '请填写关键字', 'home', 'home_search_keywords', '1600767589'), ('69', '2', '搜索关键字类型', '自定义需要配置以下关键字', '请选择关键字类型', 'home', 'home_search_keywords_type', '1600767589'), ('70', '0', '订单预约模式', '开启后用户提交订单需要管理员确认', '请选择是否开启预约模式', 'common', 'common_order_is_booking', '1599205984'), ('71', 'ShopXO', '名称', '', '请填写名称', 'common', 'common_app_mini_alipay_title', '1597483646'), ('72', '国内领先企业级B2C开源电商系统!', '描述', '', '请填写描述', 'common', 'common_app_mini_alipay_describe', '1597483646'), ('73', '021-88888888', '客服电话', '空则不显示', '请填写客服电话', 'common', 'common_app_customer_service_tel', '1597483581'), ('74', '', 'AppID', '小程序ID', '请填写AppID', 'common', 'common_app_mini_alipay_appid', '1597483646'), ('75', '', '应用公钥', '', '请填写应用公钥', 'common', 'common_app_mini_alipay_rsa_public', '1597483646'), ('180', '', '密码', '默认无密码', '请填写密码', 'common', 'common_cache_session_redis_password', '1601115834'), ('181', '', '有效时间', '默认3600秒', '请填写有效时间', 'common', 'common_cache_session_redis_expire', '1601115834'), ('182', '', '前缀', '默认 shopxo', '请填写前缀', 'common', 'common_cache_session_redis_prefix', '1601115834'), ('76', '', '应用私钥', '', '请填写应用私钥', 'common', 'common_app_mini_alipay_rsa_private', '1597483646'), ('171', '0', '首页楼层商品排序类型', '默认综合', '请选择首页楼层商品排序类型', 'home', 'home_index_floor_goods_order_by_type', '1600767589'), ('173', '百宝箱', '快捷导航名称', '默认 百宝箱', '请填写快捷导航名称', 'home', 'home_navigation_main_quick_name', '1600767589'), ('172', '0', '首页楼层商品排序规则', '默认降序(desc)', '请选择首页楼层商品排序规则', 'home', 'home_index_floor_goods_order_by_rule', '1600767589'), ('174', '1', '获取账户手机一键登录', '默认否', '请选择获取账户手机一键登录', 'common', 'common_user_is_onekey_bind_mobile', '1600610405'), ('175', '1', '启用订单批量支付', '默认否', '请选择获启用订单批量支付', 'home', 'home_is_enable_order_bulk_pay', '1600767589'), ('176', '0', 'Session使用缓存', '默认否', '请选择Session使用缓存', 'common', 'common_session_is_use_cache', '1601115834'), ('177', '0', '数据使用缓存', '默认否', '请选择数据使用缓存', 'common', 'common_data_is_use_cache', '1601115834'), ('178', '', '连接地址', '默认 127.0.0.1', '请填写连接地址', 'common', 'common_cache_session_redis_host', '1601115834'), ('179', '', '端口号', '默认 6379', '请填写端口号', 'common', 'common_cache_session_redis_port', '1601115834'), ('78', '1', '是否启用搜索', '默认否', '', 'common', 'common_app_is_enable_search', '1600610405'), ('77', '', '支付宝公钥', '', '请填写支付宝公钥', 'common', 'common_app_mini_alipay_out_rsa_public', '1597483646'), ('167', '', 'css/js静态文件cdn域名', 'css/js静态文件', '请填写css/js静态文件cdn域名', 'common', 'common_cdn_public_host', '1599988905'), ('168', '8', '首页楼层商品数量', '默认8个', '请填写首页楼层商品数量', 'home', 'home_index_floor_goods_max_count', '1600767589'), ('170', '{\"1\":\"手机,小米,华为,iphone,vivo\",\"2\":\"女装,连衣裙,包包,睡衣,斜挎 短袖\"}', '首页楼层顶部右侧关键字', '楼层下关键字(输入回车)', '请填写首页楼层顶部右侧关键字', 'home', 'home_index_floor_top_right_keywords', '1600767589'), ('79', '1', '是否启用留言', '默认否', '', 'common', 'common_app_is_enable_answer', '1600610405'), ('80', '3', '商品可添加规格最大数量', '建议不超过3个规格', '请填写谷歌最大数', 'common', 'common_spec_add_max_number', '1598699950'), ('81', '-', '路由分隔符', '建议填写 [ - ] 默认 [ - ] ,仅PATHINFO模式+短地址模式下有效', '请填写路由分隔符', 'common', 'common_route_separator', '1602074750'), ('82', 'wxda7779770f53e901', 'AppID', '小程序ID', '请填写appid', 'common', 'common_app_mini_weixin_appid', '1599460181'), ('83', '4bb30af2e71e84f2f5107c0572f66641', 'AppSecret ', '小程序密钥', '请填写appsecret', 'common', 'common_app_mini_weixin_appsecret', '1599460181'), ('84', 'ShopXO', '名称', '', '请填写名称', 'common', 'common_app_mini_weixin_title', '1599460181'), ('85', '国内领先企业级B2C开源电商系统!', '描述', '', '请填写描述', 'common', 'common_app_mini_weixin_describe', '1599460181'), ('61', '用户中心公告文字,后台配置修改。', '用户中心公告', '空则不显示公告', '', 'common', 'common_user_center_notice', '1597483581'), ('8', '公告内容', '商城公告', '空则不显示公告', '', 'common', 'common_shop_notice', '1597483581'), ('86', 'test@qq.com', '商店邮箱', '空则不显示', '客服邮箱格式有误', 'common', 'common_customer_store_email', '1587138005'), ('87', '', '商店二维码', '空则不展示', '', 'common', 'common_customer_store_qrcode', '1598699950'), ('152', '[{\"alias\":\"总部\",\"name\":\"devil\",\"tel\":\"13222333333\",\"lng\":\"121.594278\",\"lat\":\"31.207917\",\"address\":\"张江高科\",\"province\":\"9\",\"city\":\"155\",\"county\":\"1937\",\"province_name\":\"上海市\",\"city_name\":\"浦东新区\",\"county_name\":\"张江镇\",\"id\":0}]', '自提点地址', '', '请填写自提点地址', 'common', 'common_self_extraction_address', '1599205984'), ('88', '上海市 浦东新区', '商店地址', '空则不展示', '', 'common', 'common_customer_store_address', '1587138005'), ('89', '用户注册协议
', '用户注册协议', '最多 105000 个字符', '用户注册协议最多 105000 个字符', 'common', 'common_agreement_userregister', '1600052861'), ('90', '/static/upload/images/common/2019/05/17/1558025141249118.png', '用户注册背景图片', '', '请上传用户注册背景图片', 'home', 'home_site_user_register_bg_images', '1566227415'), ('91', '/static/upload/images/common/2019/05/17/1558062481107570.jpg', '图片', '图片1 [ 建议使用 450X350 像数 ]', '', 'home', 'home_site_user_login_ad1_images', '1558084931'), ('92', '/static/upload/images/common/2019/05/17/1558072588843696.jpg', '图片', '图片2 [ 建议使用 450X350 像数 ]', '', 'home', 'home_site_user_login_ad2_images', '1558084931'), ('93', '/static/upload/images/common/2019/05/17/1558073623385520.jpg', '图片', '图片2 [ 建议使用 450X350 像数 ]', '', 'home', 'home_site_user_login_ad3_images', '1558084931'), ('94', 'https://shopxo.net/', 'url地址', '地址1 [ 带http://或https:// ]', '', 'home', 'home_site_user_login_ad1_url', '1558084931'), ('95', 'https://ask.shopxo.net/', 'url地址', '地址2 [ 带http://或https:// ]', '', 'home', 'home_site_user_login_ad2_url', '1558084931'), ('96', 'https://shopxo.net/vip.html', 'url地址', '地址3 [ 带http://或https:// ]', '', 'home', 'home_site_user_login_ad3_url', '1558084931'), ('97', '', '背景色', '背景色1', '', 'home', 'home_site_user_login_ad1_bg_color', '1558084931'), ('98', '#FAFAFA', '背景色', '背景色2', '', 'home', 'home_site_user_login_ad2_bg_color', '1558084931'), ('99', '#FAFAFA', '背景色', '背景色3', '', 'home', 'home_site_user_login_ad3_bg_color', '1558084931'), ('100', '1', '登录图片验证码', '可以防止非法登录', '请选择是否开启登录图片验证码', 'home', 'home_user_login_img_verify_state', '1558084931'), ('101', '/static/upload/images/common/2019/05/17/1558072588843696.jpg', '图片', '图片1 [ 建议使用 450X350 像数 ]', '', 'home', 'home_site_user_forgetpwd_ad1_images', '1558084915'), ('102', '/static/upload/images/common/2019/05/17/1558073623641199.jpg', '图片', '图片2 [ 建议使用 450X350 像数 ]', '', 'home', 'home_site_user_forgetpwd_ad2_images', '1558084915'), ('103', '', '图片', '图片2 [ 建议使用 450X350 像数 ]', '', 'home', 'home_site_user_forgetpwd_ad3_images', '1558084915'), ('104', 'https://shopxo.net/', 'url地址', '地址1 [ 带http://或https:// ]', '', 'home', 'home_site_user_forgetpwd_ad1_url', '1558084915'), ('105', '', 'url地址', '地址2 [ 带http://或https:// ]', '', 'home', 'home_site_user_forgetpwd_ad2_url', '1558084915'), ('106', '', 'url地址', '地址3 [ 带http://或https:// ]', '', 'home', 'home_site_user_forgetpwd_ad3_url', '1558084915'), ('107', '#FAFAFA', '背景色', '背景色1', '', 'home', 'home_site_user_forgetpwd_ad1_bg_color', '1558084915'), ('108', '#FAFAFA', '背景色', '背景色2', '', 'home', 'home_site_user_forgetpwd_ad2_bg_color', '1558084915'), ('109', '', '背景色', '背景色3', '', 'home', 'home_site_user_forgetpwd_ad3_bg_color', '1558084915'), ('110', '1', '用户注册图片验证码', '可以防止非法注册', '请选择是否开启用户注册图片验证码', 'home', 'home_user_register_img_verify_state', '1566227415'), ('111', '', '图片验证码规则', '默认白底黑字,可根据需求i加大验证码识别难度', '', 'common', 'common_images_verify_rules', '1558085166'), ('112', '0', 'SSL方式加密', '', '请选择是否使用SSL方式加密', 'common', 'common_email_is_use_ssl', '1597483532'), ('113', '活动/优惠未生效\n空包裹\n包裹丢失\n配送超时\n未按约定时间发货\n未送货上门\n物流显示签收但实际未收到货\n不喜欢/不想要', '仅退款原因', '可换行,一行一个', '请填写仅退款原因', 'home', 'home_order_aftersale_return_only_money_reason', '1570193301'), ('114', '7天无理由退换货\n配送超时\n未按约定时间发货\n未送货上门\n卖家发错货\n少件/漏发\n包装/商品破损/污渍\n商品信息描述不符\n使用后过敏\n已过/临近保质期\n无法溶解/结块/有异物', '退货退款原因', '可换行,一行一个', '请填写退货退款原因', 'home', 'home_order_aftersale_return_money_goods_reason', '1570193301'), ('115', '1', '用户注册协议', '', '请选择是否启用用户注册协议', 'home', 'home_is_enable_userregister_agreement', '1566227415'), ('116', '上海市 浦东新区', '退货地址', '用户退货货物收货地址', '请填写退货地址', 'home', 'home_order_aftersale_return_goods_address', '1570193301'), ('117', '0', '使用独立手机详情', '默认使用web详情', '请选择使用独立手机详情', 'common', 'common_app_is_use_mobile_detail', '1600610405'), ('118', '1', '强制绑定手机', '默认否', '请选择是否强制绑定手机', 'common', 'common_user_is_mandatory_bind_mobile', '1600610405'), ('121', '1', '固定顶部导航', '默认否', '请选择是否固定顶部导航', 'common', 'common_app_is_header_nav_fixed', '1600610405'), ('122', '1', '开启在线客服', '默认否', '请选择是否开启在线客服', 'common', 'common_app_is_online_service', '1600610405'), ('169', '10', '首页楼层左侧二级商品分类数量', '默认6个', '请填写首页楼层左侧二级商品分类数量', 'home', 'home_index_floor_left_goods_category_max_count', '1600767589'), ('163', '30', '订单完成可发起售后时限', '单位 天,默认30天', '请填写订单完成可发起售后时限', 'common', 'home_order_aftersale_return_launch_day', '1572350417'), ('124', '0', '启用好物推荐', '默认否,需重新生成小程序包(启用则需到微信小程序后台申请权限)', '请选择是否启用好物推荐', 'common', 'common_app_is_good_thing', '1599460181'), ('125', '20215038', 'AppID', '智能小程序ID', '请填写AppID', 'common', 'common_app_mini_baidu_appid', '1600589715'), ('126', 'SNM5PYwfnZcIzTFxbmTeyasTnOiOg7o0', 'AppKey', '智能小程序KEY', '请填写AppKey', 'common', 'common_app_mini_baidu_appkey', '1600589715'), ('127', 'LZ9Fa2qDEmcoB2uuGiHNON7GEaGzvg5H', 'AppSecret', '智能小程序密匙', '请填写AppSecret', 'common', 'common_app_mini_baidu_appsecret', '1600589715'), ('128', 'ShopXO', '名称', '', '请填写名称', 'common', 'common_app_mini_baidu_title', '1600589715'), ('129', '国内领先企业级B2C开源电商系统!', '描述', '', '请填写描述', 'common', 'common_app_mini_baidu_describe', '1600589715'), ('130', '0', '留言需要登录', '默认否', '请选择是否留言需要登录', 'common', 'common_is_login_answer', '1599988905'), ('131', '0', '启用海报分享', '默认否\n', '请选择是否启用海报分享\n', 'common', 'common_app_is_poster_share', '1599460181'), ('132', '30', '订单关闭脚本时长', '单位 分钟,默认30分钟', '请填写订单关闭脚本时长', 'common', 'common_order_close_limit_time', '1599988905'), ('133', '21600', '订单自动收货脚本时长', '单位 分钟,默认21600分钟/15天', '请填写订单自动收货脚本时长', 'common', 'common_order_success_limit_time', '1599988905'), ('134', '', 'AppID', '小程序ID', '请填写AppID', 'common', 'common_app_mini_toutiao_appid', '1580644065'), ('135', '', 'AppSecret', '小程序Secret', '请填写AppSecret', 'common', 'common_app_mini_toutiao_appsecret', '1580644065'), ('136', '', 'PayMerchantID', '支付商户号', '请填写支付商户号', 'common', 'common_app_mini_toutiao_pay_merchant_id', '1580644065'), ('137', '', 'PayAppID', '支付AppID', '请填写AppID', 'common', 'common_app_mini_toutiao_pay_appid', '1580644065'), ('138', '', 'PaySecret', '支付Secret', '请填写支付Secret', 'common', 'common_app_mini_toutiao_pay_secret', '1580644065'), ('139', 'ShopXO', '名称', '', '请填写名称', 'common', 'common_app_mini_toutiao_title', '1580644065'), ('140', '国内领先企业级B2C开源电商系统!', '描述', '', '请填写描述', 'common', 'common_app_mini_toutiao_describe', '1580644065'), ('141', '', '公安备案号', '如:京公网安备xxx号', '请填写公安备案号', 'home', 'home_site_security_record_name', '1599920895'), ('142', '', '公安备案地址', '备案展示页面的url地址', '请填写公安备案地址', 'home', 'home_site_security_record_url', '1599920895'), ('143', '1110736292', 'AppID', '小程序ID', '请填写AppID', 'common', 'common_app_mini_qq_appid', '1600519265'), ('144', 'FaR92OFdaa0zpwXk', 'AppSecret', '小程序Secret', '请填写AppSecret', 'common', 'common_app_mini_qq_appsecret', '1600519265'), ('145', '0d212f19cbf9e8045d7530528586b099', 'AppToken', '小程序Token', '请填写AppToken', 'common', 'common_app_mini_qq_apptoken', '1600519265'), ('146', 'ShopXO', '名称', '', '请填写名称', 'common', 'common_app_mini_qq_title', '1600519265'), ('147', '国内领先企业级B2C开源电商系统!', '描述', '', '请填写描述', 'common', 'common_app_mini_qq_describe', '1600519265'), ('148', '1', '是否启用用户中心头部小导航', '默认否', '请选择是否启用用户中心头部小导航', 'common', 'common_app_is_head_vice_nav', '1600610405'), ('151', '4', '站点类型', '默认销售型', '请选择站点类型', 'common', 'common_site_type', '1599205984'), ('150', '', '展示型操作名称', '默认 立即咨询', '请填写展示型操作名称', 'common', 'common_is_exhibition_mode_btn_text', '1599205984'), ('153', '', '虚拟信息标题', '默认密钥信息', '请填写虚拟信息标题', 'common', 'common_site_fictitious_return_title', '1599205984'), ('154', '', '提示信息', '', '请填写提示信息', 'common', 'common_site_fictitious_return_tips', '1599205984'), ('155', '', '在线客服-企业编码', '空则不显示在线客服', '请填写在线客服-企业编码', 'common', 'common_app_mini_alipay_tnt_inst_id', '1597483646'), ('156', '', '在线客服-聊天窗编码', '空则不显示在线客服', '请填写在线客服-聊天窗编码', 'common', 'common_app_mini_alipay_scene', '1597483646'), ('157', '0', '商品详情页展示相册', '默认否', '请选择是否商品详情页展示相册', 'common', 'common_is_goods_detail_show_photo', '1600767589'), ('158', '0', '手机简洁模式', '默认否', '请选择是否手机简洁模式', 'common', 'common_is_mobile_concise_model', '1597483581'), ('159', '0', '启用直播', '默认否,需重新生成小程序包(启用则需到微信小程序后台申请权限)', '请选择是否启用直播', 'common', 'common_app_weixin_liveplayer', '1599460181'), ('160', '4.0.1', '好物推荐组件版本号', '', '请填写好物推荐组件版本号', 'common', 'common_app_is_good_thing_ver', '1599460181'), ('161', '1.1.4', '直播组件版本号', '', '请填写直播组件版本号', 'common', 'common_app_weixin_liveplayer_ver', '1599460181'), ('162', '1', '后台登录页随机背景图', '默认启用', '请选择后台登录页随机背景图', 'common', 'admin_login_info_bg_images_rand', '1598699950'), ('164', '30', '支付日志订单关闭脚本时长', '单位 分钟,默认30分钟', '请填写支付日志订单关闭脚本时长', 'common', 'common_pay_log_order_close_limit_time', '1599988905'), ('165', '3', '分类展示层级', '默认3级', '请填写分类展示层级', 'common', 'common_show_goods_category_level', '1600767589'), ('166', '', '附件cdn域名', '图片/视频/文件', '请填写附件cdn域名', 'common', 'common_cdn_attachment_host', '1599988905'), ('183', '', '连接地址', '默认 127.0.0.1', '请填写连接地址', 'common', 'common_cache_data_redis_host', '1601115834'), ('184', '', '端口号', '默认 6379', '请填写端口号', 'common', 'common_cache_data_redis_port', '1601115834'), ('185', '', '密码', '默认无密码', '请填写密码', 'common', 'common_cache_data_redis_password', '1601115834'), ('186', '', '有效时间', '默认0表示永久', '请填写有效时间', 'common', 'common_cache_data_redis_expire', '1601115834'), ('187', '', '前缀', '默认 shopxo', '请填写前缀', 'common', 'common_cache_data_redis_prefix', '1601115834');
COMMIT;
-- ----------------------------
@@ -401,6 +401,31 @@ BEGIN;
INSERT INTO `s_express` VALUES ('1', '0', '/static/upload/images/express/images/20180917104528_logo.png', '顺丰快递', '1', '0', '1526350443', '1545589789'), ('2', '0', '/static/upload/images/express/images/20180917104538_logo.png', '圆通快递', '1', '0', '1526350453', '1537152338'), ('3', '0', '/static/upload/images/express/images/20180917104550_logo.png', '申通快递', '1', '0', '1526350461', '1583070213'), ('4', '0', '/static/upload/images/express/images/20180917104559_logo.png', '中通快递', '1', '0', '1526350469', '1537152359'), ('5', '0', '/static/upload/images/express/images/20180917104839_logo.png', 'EMS速递', '1', '0', '1530429633', '1537152519'), ('6', '0', '/static/upload/images/express/images/20180917104631_logo.png', '韵达快递', '1', '0', '1530429687', '1537152391'), ('7', '0', '/static/upload/images/express/images/20180917104848_logo.png', '邮政包裹', '1', '0', '1530429743', '1537152528'), ('8', '0', '/static/upload/images/express/images/20180917104816_logo.png', '百世汇通', '1', '0', '1530429765', '1537152496'), ('9', '0', '/static/upload/images/express/images/20180917104616_logo.png', '国通快递', '1', '0', '1530429794', '1537152376'), ('10', '0', '/static/upload/images/express/images/20180917104650_logo.png', '天天快递', '1', '0', '1530429830', '1537152410'), ('11', '0', '/static/upload/images/express/images/20180917104707_logo.png', '优速快递', '1', '0', '1530429855', '1537152427'), ('12', '0', '/static/upload/images/express/images/20180917104722_logo.png', '全峰快递', '1', '0', '1530429873', '1537152442'), ('13', '0', '/static/upload/images/express/images/20180917104750_logo.png', '宅急送', '1', '0', '1530429907', '1537152470'), ('14', '0', '/static/upload/images/express/images/20180917104757_logo.png', '京东快递', '1', '0', '1530429926', '1537152477');
COMMIT;
+-- ----------------------------
+-- Table structure for `s_form_table_user_fields`
+-- ----------------------------
+DROP TABLE IF EXISTS `s_form_table_user_fields`;
+CREATE TABLE `s_form_table_user_fields` (
+ `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id',
+ `user_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '管理员id或用户id',
+ `user_type` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '用户类型(0后台管理员, 1用户端)',
+ `md5_key` char(32) NOT NULL DEFAULT '' COMMENT 'form表格数据唯一key',
+ `fields` text COMMENT '字段数据(json格式存储)',
+ `add_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '添加时间',
+ `upd_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',
+ PRIMARY KEY (`id`),
+ KEY `user_id` (`user_id`),
+ KEY `user_type` (`user_type`),
+ KEY `md5_key` (`md5_key`)
+) ENGINE=InnoDB AUTO_INCREMENT=39 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='动态表格用户自定义字段';
+
+-- ----------------------------
+-- Records of `s_form_table_user_fields`
+-- ----------------------------
+BEGIN;
+INSERT INTO `s_form_table_user_fields` VALUES ('26', '1', '0', '59ae3e3391a2909036e0dbbda121c44e', '[{\"label\":\"商品ID\",\"checked\":\"0\"},{\"label\":\"商品信息\",\"checked\":\"0\"},{\"label\":\"商品分类\",\"checked\":\"0\"},{\"label\":\"品牌\",\"checked\":\"0\"},{\"label\":\"销售价格(元)\",\"checked\":\"0\"},{\"label\":\"原价(元)\",\"checked\":\"0\"},{\"label\":\"库存总量\",\"checked\":\"0\"},{\"label\":\"商品类型\",\"checked\":\"1\"},{\"label\":\"上下架\",\"checked\":\"1\"},{\"label\":\"首页推荐\",\"checked\":\"0\"},{\"label\":\"扣减库存\",\"checked\":\"0\"},{\"label\":\"商品型号\",\"checked\":\"0\"},{\"label\":\"生产地\",\"checked\":\"0\"},{\"label\":\"购买赠送积分比例\",\"checked\":\"0\"},{\"label\":\"单次最低起购数量\",\"checked\":\"0\"},{\"label\":\"单次最大购买数量\",\"checked\":\"0\"},{\"label\":\"访问次数\",\"checked\":\"0\"},{\"label\":\"创建时间\",\"checked\":\"0\"},{\"label\":\"更新时间\",\"checked\":\"0\"}]', '1602232921', '1602232921'), ('27', '1', '0', '59ae3e3391a2909036e0dbbda121c44e', '[{\"label\":\"商品ID\",\"checked\":\"0\"},{\"label\":\"商品信息\",\"checked\":\"1\"},{\"label\":\"品牌\",\"checked\":\"1\"},{\"label\":\"销售价格(元)\",\"checked\":\"1\"},{\"label\":\"库存总量\",\"checked\":\"1\"},{\"label\":\"上下架\",\"checked\":\"1\"},{\"label\":\"商品分类\",\"checked\":\"0\"},{\"label\":\"原价(元)\",\"checked\":\"0\"},{\"label\":\"商品类型\",\"checked\":\"0\"},{\"label\":\"首页推荐\",\"checked\":\"1\"},{\"label\":\"扣减库存\",\"checked\":\"0\"},{\"label\":\"商品型号\",\"checked\":\"0\"},{\"label\":\"生产地\",\"checked\":\"0\"},{\"label\":\"购买赠送积分比例\",\"checked\":\"0\"},{\"label\":\"单次最低起购数量\",\"checked\":\"0\"},{\"label\":\"单次最大购买数量\",\"checked\":\"0\"},{\"label\":\"访问次数\",\"checked\":\"1\"},{\"label\":\"创建时间\",\"checked\":\"0\"},{\"label\":\"更新时间\",\"checked\":\"0\"}]', '1602232953', '1602232953'), ('28', '1', '0', '59ae3e3391a2909036e0dbbda121c44e', '[{\"label\":\"商品信息\",\"checked\":\"1\"},{\"label\":\"品牌\",\"checked\":\"1\"},{\"label\":\"销售价格(元)\",\"checked\":\"1\"},{\"label\":\"库存总量\",\"checked\":\"1\"},{\"label\":\"上下架\",\"checked\":\"1\"},{\"label\":\"首页推荐\",\"checked\":\"1\"},{\"label\":\"访问次数\",\"checked\":\"1\"},{\"label\":\"商品ID\",\"checked\":\"0\"},{\"label\":\"商品分类\",\"checked\":\"0\"},{\"label\":\"原价(元)\",\"checked\":\"0\"},{\"label\":\"商品类型\",\"checked\":\"0\"},{\"label\":\"扣减库存\",\"checked\":\"0\"},{\"label\":\"商品型号\",\"checked\":\"0\"},{\"label\":\"生产地\",\"checked\":\"0\"},{\"label\":\"购买赠送积分比例\",\"checked\":\"0\"},{\"label\":\"单次最低起购数量\",\"checked\":\"0\"},{\"label\":\"单次最大购买数量\",\"checked\":\"0\"},{\"label\":\"创建时间\",\"checked\":\"0\"},{\"label\":\"更新时间\",\"checked\":\"0\"}]', '1602232978', '1602232978');
+COMMIT;
+
-- ----------------------------
-- Table structure for `s_goods`
-- ----------------------------
@@ -767,7 +792,7 @@ CREATE TABLE `s_message` (
-- Records of `s_message`
-- ----------------------------
BEGIN;
-INSERT INTO `s_message` VALUES ('1', '1', '订单支付', '订单支付成功,金额168元', '1', '订单', '0', '1', '0', '0', '1597930753'), ('2', '1', '订单发货', '订单已发货', '1', '订单', '0', '1', '0', '0', '1597930770'), ('3', '1', '积分变动', '订单商品完成赠送积分增加18', '1', '积分', '0', '1', '0', '0', '1597930778'), ('4', '1', '订单收货', '订单收货成功', '1', '订单', '0', '1', '0', '0', '1597930778'), ('5', '1', '分销收益新增', 'qqqqqq用户下单6170元, 预计收益6元', '1', '分销', '0', '1', '0', '0', '1598699958'), ('6', '1', '分销收益新增', 'qqqqqq用户下单6170元, 预计收益308.5元', '2', '分销', '0', '1', '0', '0', '1598703883'), ('7', '1', '订单支付', '订单支付成功,金额0元', '19', '订单', '0', '1', '0', '0', '1598978982'), ('8', '1', '订单支付', '订单支付成功,金额0元', '19', '订单', '0', '1', '0', '0', '1598979081'), ('9', '1', '订单支付', '订单支付成功,金额0元', '19', '订单', '0', '1', '0', '0', '1598979386'), ('10', '1', '订单支付', '订单支付成功,金额0元', '20', '订单', '0', '1', '0', '0', '1598979550'), ('11', '1', '订单支付', '订单支付成功,金额0元', '21', '订单', '0', '1', '0', '0', '1598980068'), ('12', '1', '订单支付', '订单支付成功,金额0元', '22', '订单', '0', '1', '0', '0', '1598980092'), ('13', '1', '订单支付', '订单支付成功,金额0元', '23', '订单', '0', '1', '0', '0', '1598980441'), ('14', '1', '订单支付', '订单支付成功,金额0元', '24', '订单', '0', '1', '0', '0', '1598980544'), ('15', '1', '订单支付', '订单支付成功,金额0.01元', '25', '订单', '0', '1', '0', '0', '1598980674'), ('16', '1', '订单取消', '订单取消成功', '26', '订单', '0', '1', '0', '0', '1599205964'), ('17', '1', '分销收益新增', 'qqqqqq用户下单1663.2元, 预计收益0元', '3', '分销', '0', '1', '0', '0', '1599731848'), ('18', '1', '订单关闭', '订单超时关闭', '2', '订单', '0', '1', '0', '0', '1599972493'), ('19', '1', '订单关闭', '订单超时关闭', '27', '订单', '0', '1', '0', '0', '1599972493'), ('22', '1', '分销收益新增', 'qqqqqq用户下单201.6元, 预计收益0元', '6', '分销', '0', '1', '0', '0', '1600332596'), ('23', '1', '分销收益新增', 'qqqqqq用户下单235.2元, 预计收益0元', '7', '分销', '0', '1', '0', '0', '1600339207'), ('24', '1', '分销收益新增', 'qqqqqq用户下单2100元, 预计收益0元', '8', '分销', '0', '1', '0', '0', '1600339297'), ('25', '1', '订单支付', '订单支付成功,金额235.2元', '31', '订单', '0', '1', '0', '0', '1600340659'), ('26', '2', '分销收益新增', '雨声用户下单2940元, 预计收益0元', '9', '分销', '0', '0', '0', '0', '1600350404'), ('27', '2', '订单支付', '订单支付成功,金额2940元', '33', '订单', '0', '0', '0', '0', '1600350928'), ('28', '3', '分销收益新增', 'ShopXO@纵之格用户下单168元, 预计收益0元', '10', '分销', '0', '0', '0', '0', '1600519298'), ('29', '1', '分销收益新增', 'qqqqqq用户下单0.01元, 预计收益0元', '11', '分销', '0', '1', '0', '0', '1600749147'), ('30', '1', '分销收益新增', 'qqqqqq用户下单10.23元, 预计收益0元', '12', '分销', '0', '1', '0', '0', '1600749274'), ('31', '2', '分销收益新增', '雨声用户下单168元, 预计收益0元', '13', '分销', '0', '0', '0', '0', '1600767049'), ('32', '1', '分销收益新增', 'qqqqqq用户下单1624.6元, 预计收益0元', '14', '分销', '0', '1', '0', '0', '1600771205'), ('33', '1', '分销收益新增', 'qqqqqq用户下单356元, 预计收益0元', '15', '分销', '0', '1', '0', '0', '1600771235'), ('34', '1', '分销收益新增', 'qqqqqq用户下单356元, 预计收益0元', '16', '分销', '0', '1', '0', '0', '1600773115'), ('35', '1', '分销收益新增', 'qqqqqq用户下单1624.6元, 预计收益0元', '17', '分销', '0', '1', '0', '0', '1600773129'), ('36', '1', '分销收益新增', 'qqqqqq用户下单1624.6元, 预计收益0元', '18', '分销', '0', '1', '0', '0', '1601005219'), ('37', '1', '分销收益新增', 'qqqqqq用户下单1624.6元, 预计收益0元', '19', '分销', '0', '1', '0', '0', '1601005335'), ('38', '1', '分销收益新增', 'qqqqqq用户下单356元, 预计收益0元', '20', '分销', '0', '1', '0', '0', '1601005425'), ('39', '1', '分销收益新增', 'qqqqqq用户下单1624.6元, 预计收益0元', '21', '分销', '0', '1', '0', '0', '1601005453'), ('40', '1', '分销收益新增', 'qqqqqq用户下单168元, 预计收益0元', '22', '分销', '0', '1', '0', '0', '1601005474'), ('41', '1', '分销收益新增', 'qqqqqq用户下单100元, 预计收益5元', '23', '分销', '0', '1', '0', '0', '1601216050'), ('42', '1', '订单支付', '订单支付成功,金额100元', '47', '订单', '0', '1', '0', '0', '1601216097'), ('43', '1', '账户余额变动', '20200927225910722100订单退款50.00元', '47', '订单售后', '0', '1', '0', '0', '1601216132'), ('44', '1', '订单退款', '订单退款成功,金额50元', '47', '订单售后', '0', '1', '0', '0', '1601216132'), ('45', '1', '分销收益变更', '用户订单发生变更, 订单金额100.00元, 增加金额0.00元, 优惠金额0.00元, 退款金额50.00元, 原收益5.00元 / 变更后收益2.5元', '23', '分销', '0', '1', '0', '0', '1601216132'), ('46', '4', '分销收益新增', 'vvvvvv用户下单200元, 预计收益10元', '24', '分销', '0', '0', '0', '0', '1601216862'), ('47', '1', '分销收益新增', 'vvvvvv用户下单200元, 预计收益6元', '25', '分销', '0', '1', '0', '0', '1601216862'), ('48', '4', '订单支付', '订单支付成功,金额200元', '48', '订单', '0', '0', '0', '0', '1601216888'), ('49', '4', '账户余额变动', '20200927231242917809订单退款100.00元', '48', '订单售后', '0', '0', '0', '0', '1601216916'), ('50', '4', '订单退款', '订单退款成功,金额100元', '48', '订单售后', '0', '0', '0', '0', '1601216916'), ('51', '4', '分销收益变更', '用户订单发生变更, 订单金额200.00元, 增加金额0.00元, 优惠金额0.00元, 退款金额100.00元, 原收益10.00元 / 变更后收益5元', '24', '分销', '0', '0', '0', '0', '1601216916'), ('52', '1', '分销收益变更', '用户订单发生变更, 订单金额200.00元, 增加金额0.00元, 优惠金额0.00元, 退款金额100.00元, 原收益6.00元 / 变更后收益3元', '25', '分销', '0', '1', '0', '0', '1601216916'), ('53', '4', '订单发货', '订单已发货', '48', '订单', '0', '0', '0', '0', '1601216963'), ('54', '4', '积分变动', '订单商品完成赠送积分增加100', '2', '积分', '0', '0', '0', '0', '1601216976'), ('55', '4', '订单收货', '订单收货成功', '48', '订单', '0', '0', '0', '0', '1601216976'), ('56', '4', '分销收益新增', 'vvvvvv用户订单佣金结算200.00元, 收益5.00元, 已发放至钱包', '24', '分销', '0', '0', '0', '0', '1601217077'), ('57', '4', '钱包变更', '分销收益新增 [ 有效金额增加5.00元 ]', '4', '钱包', '0', '0', '0', '0', '1601217078'), ('58', '1', '分销收益新增', 'vvvvvv用户订单佣金结算200.00元, 收益3.00元, 已发放至钱包', '25', '分销', '0', '0', '0', '0', '1601217078'), ('59', '1', '钱包变更', '分销收益新增 [ 有效金额增加3.00元 ]', '2', '钱包', '0', '0', '0', '0', '1601217078'), ('60', '4', '分销收益新增', 'vvvvvv用户下单100元, 预计收益10元', '26', '分销', '0', '0', '0', '0', '1601217154'), ('61', '1', '分销收益新增', 'vvvvvv用户下单100元, 预计收益10元', '27', '分销', '0', '0', '0', '0', '1601217154'), ('62', '4', '订单支付', '订单支付成功,金额100元', '49', '订单', '0', '0', '0', '0', '1601217195'), ('63', '4', '账户余额变动', '20200927231734449592订单退款50.00元', '49', '订单售后', '0', '0', '0', '0', '1601217218'), ('64', '4', '订单退款', '订单退款成功,金额50元', '49', '订单售后', '0', '0', '0', '0', '1601217218'), ('65', '4', '分销收益变更', '用户订单发生变更, 订单金额100.00元, 增加金额0.00元, 优惠金额0.00元, 退款金额50.00元, 原收益10.00元 / 变更后收益5元', '26', '分销', '0', '0', '0', '0', '1601217218'), ('66', '1', '分销收益变更', '用户订单发生变更, 订单金额100.00元, 增加金额0.00元, 优惠金额0.00元, 退款金额50.00元, 原收益10.00元 / 变更后收益5元', '27', '分销', '0', '0', '0', '0', '1601217218'), ('67', '4', '订单发货', '订单已发货', '49', '订单', '0', '0', '0', '0', '1601217279'), ('68', '4', '积分变动', '订单商品完成赠送积分增加50', '3', '积分', '0', '0', '0', '0', '1601217289'), ('69', '4', '订单收货', '订单收货成功', '49', '订单', '0', '0', '0', '0', '1601217289'), ('70', '4', '分销收益新增', 'vvvvvv用户订单佣金结算100.00元, 收益5.00元, 已发放至钱包', '26', '分销', '0', '0', '0', '0', '1601217366'), ('71', '4', '钱包变更', '分销收益新增 [ 有效金额增加5.00元 ]', '4', '钱包', '0', '0', '0', '0', '1601217366'), ('72', '1', '分销收益新增', 'vvvvvv用户订单佣金结算100.00元, 收益5.00元, 已发放至钱包', '27', '分销', '0', '0', '0', '0', '1601217366'), ('73', '1', '钱包变更', '分销收益新增 [ 有效金额增加5.00元 ]', '2', '钱包', '0', '0', '0', '0', '1601217366'), ('74', '4', '分销收益新增', 'vvvvvv用户下单100元, 预计收益10元', '28', '分销', '0', '0', '0', '0', '1601217411'), ('75', '1', '分销收益新增', 'vvvvvv用户下单100元, 预计收益10元', '29', '分销', '0', '0', '0', '0', '1601217411'), ('76', '4', '订单支付', '订单支付成功,金额100元', '50', '订单', '0', '0', '0', '0', '1601217456'), ('77', '4', '订单发货', '订单已发货', '50', '订单', '0', '0', '0', '0', '1601217472'), ('78', '4', '积分变动', '订单商品完成赠送积分增加50', '4', '积分', '0', '0', '0', '0', '1601217488'), ('79', '4', '订单收货', '订单收货成功', '50', '订单', '0', '0', '0', '0', '1601217488'), ('80', '4', '分销收益新增', 'vvvvvv用户订单佣金结算100.00元, 收益10.00元, 已发放至钱包', '28', '分销', '0', '0', '0', '0', '1601217552'), ('81', '4', '钱包变更', '分销收益新增 [ 有效金额增加10.00元 ]', '4', '钱包', '0', '0', '0', '0', '1601217552'), ('82', '1', '分销收益新增', 'vvvvvv用户订单佣金结算100.00元, 收益10.00元, 已发放至钱包', '29', '分销', '0', '0', '0', '0', '1601217552'), ('83', '1', '钱包变更', '分销收益新增 [ 有效金额增加10.00元 ]', '2', '钱包', '0', '0', '0', '0', '1601217552');
+INSERT INTO `s_message` VALUES ('1', '1', '订单支付', '订单支付成功,金额168元', '1', '订单', '0', '1', '0', '0', '1597930753'), ('2', '1', '订单发货', '订单已发货', '1', '订单', '0', '1', '0', '0', '1597930770'), ('3', '1', '积分变动', '订单商品完成赠送积分增加18', '1', '积分', '0', '1', '0', '0', '1597930778'), ('4', '1', '订单收货', '订单收货成功', '1', '订单', '0', '1', '0', '0', '1597930778'), ('5', '1', '分销收益新增', 'qqqqqq用户下单6170元, 预计收益6元', '1', '分销', '0', '1', '0', '0', '1598699958'), ('6', '1', '分销收益新增', 'qqqqqq用户下单6170元, 预计收益308.5元', '2', '分销', '0', '1', '0', '0', '1598703883'), ('7', '1', '订单支付', '订单支付成功,金额0元', '19', '订单', '0', '1', '0', '0', '1598978982'), ('8', '1', '订单支付', '订单支付成功,金额0元', '19', '订单', '0', '1', '0', '0', '1598979081'), ('9', '1', '订单支付', '订单支付成功,金额0元', '19', '订单', '0', '1', '0', '0', '1598979386'), ('10', '1', '订单支付', '订单支付成功,金额0元', '20', '订单', '0', '1', '0', '0', '1598979550'), ('11', '1', '订单支付', '订单支付成功,金额0元', '21', '订单', '0', '1', '0', '0', '1598980068'), ('12', '1', '订单支付', '订单支付成功,金额0元', '22', '订单', '0', '1', '0', '0', '1598980092'), ('13', '1', '订单支付', '订单支付成功,金额0元', '23', '订单', '0', '1', '0', '0', '1598980441'), ('14', '1', '订单支付', '订单支付成功,金额0元', '24', '订单', '0', '1', '0', '0', '1598980544'), ('15', '1', '订单支付', '订单支付成功,金额0.01元', '25', '订单', '0', '1', '0', '0', '1598980674'), ('16', '1', '订单取消', '订单取消成功', '26', '订单', '0', '1', '0', '0', '1599205964'), ('17', '1', '分销收益新增', 'qqqqqq用户下单1663.2元, 预计收益0元', '3', '分销', '0', '1', '0', '0', '1599731848'), ('18', '1', '订单关闭', '订单超时关闭', '2', '订单', '0', '1', '0', '0', '1599972493'), ('19', '1', '订单关闭', '订单超时关闭', '27', '订单', '0', '1', '0', '0', '1599972493'), ('22', '1', '分销收益新增', 'qqqqqq用户下单201.6元, 预计收益0元', '6', '分销', '0', '1', '0', '0', '1600332596'), ('23', '1', '分销收益新增', 'qqqqqq用户下单235.2元, 预计收益0元', '7', '分销', '0', '1', '0', '0', '1600339207'), ('24', '1', '分销收益新增', 'qqqqqq用户下单2100元, 预计收益0元', '8', '分销', '0', '1', '0', '0', '1600339297'), ('25', '1', '订单支付', '订单支付成功,金额235.2元', '31', '订单', '0', '1', '0', '0', '1600340659'), ('26', '2', '分销收益新增', '雨声用户下单2940元, 预计收益0元', '9', '分销', '0', '0', '0', '0', '1600350404'), ('27', '2', '订单支付', '订单支付成功,金额2940元', '33', '订单', '0', '0', '0', '0', '1600350928'), ('28', '3', '分销收益新增', 'ShopXO@纵之格用户下单168元, 预计收益0元', '10', '分销', '0', '0', '0', '0', '1600519298'), ('29', '1', '分销收益新增', 'qqqqqq用户下单0.01元, 预计收益0元', '11', '分销', '0', '1', '0', '0', '1600749147'), ('30', '1', '分销收益新增', 'qqqqqq用户下单10.23元, 预计收益0元', '12', '分销', '0', '1', '0', '0', '1600749274'), ('31', '2', '分销收益新增', '雨声用户下单168元, 预计收益0元', '13', '分销', '0', '0', '0', '0', '1600767049'), ('32', '1', '分销收益新增', 'qqqqqq用户下单1624.6元, 预计收益0元', '14', '分销', '0', '1', '0', '0', '1600771205'), ('33', '1', '分销收益新增', 'qqqqqq用户下单356元, 预计收益0元', '15', '分销', '0', '1', '0', '0', '1600771235'), ('34', '1', '分销收益新增', 'qqqqqq用户下单356元, 预计收益0元', '16', '分销', '0', '1', '0', '0', '1600773115'), ('35', '1', '分销收益新增', 'qqqqqq用户下单1624.6元, 预计收益0元', '17', '分销', '0', '1', '0', '0', '1600773129'), ('36', '1', '分销收益新增', 'qqqqqq用户下单1624.6元, 预计收益0元', '18', '分销', '0', '1', '0', '0', '1601005219'), ('37', '1', '分销收益新增', 'qqqqqq用户下单1624.6元, 预计收益0元', '19', '分销', '0', '1', '0', '0', '1601005335'), ('38', '1', '分销收益新增', 'qqqqqq用户下单356元, 预计收益0元', '20', '分销', '0', '1', '0', '0', '1601005425'), ('39', '1', '分销收益新增', 'qqqqqq用户下单1624.6元, 预计收益0元', '21', '分销', '0', '1', '0', '0', '1601005453'), ('40', '1', '分销收益新增', 'qqqqqq用户下单168元, 预计收益0元', '22', '分销', '0', '1', '0', '0', '1601005474'), ('41', '1', '分销收益新增', 'qqqqqq用户下单100元, 预计收益5元', '23', '分销', '0', '1', '0', '0', '1601216050'), ('42', '1', '订单支付', '订单支付成功,金额100元', '47', '订单', '0', '1', '0', '0', '1601216097'), ('43', '1', '账户余额变动', '20200927225910722100订单退款50.00元', '47', '订单售后', '0', '1', '0', '0', '1601216132'), ('44', '1', '订单退款', '订单退款成功,金额50元', '47', '订单售后', '0', '1', '0', '0', '1601216132'), ('45', '1', '分销收益变更', '用户订单发生变更, 订单金额100.00元, 增加金额0.00元, 优惠金额0.00元, 退款金额50.00元, 原收益5.00元 / 变更后收益2.5元', '23', '分销', '0', '1', '0', '0', '1601216132'), ('46', '4', '分销收益新增', 'vvvvvv用户下单200元, 预计收益10元', '24', '分销', '0', '0', '0', '0', '1601216862'), ('47', '1', '分销收益新增', 'vvvvvv用户下单200元, 预计收益6元', '25', '分销', '0', '1', '0', '0', '1601216862'), ('48', '4', '订单支付', '订单支付成功,金额200元', '48', '订单', '0', '0', '0', '0', '1601216888'), ('49', '4', '账户余额变动', '20200927231242917809订单退款100.00元', '48', '订单售后', '0', '0', '0', '0', '1601216916'), ('50', '4', '订单退款', '订单退款成功,金额100元', '48', '订单售后', '0', '0', '0', '0', '1601216916'), ('51', '4', '分销收益变更', '用户订单发生变更, 订单金额200.00元, 增加金额0.00元, 优惠金额0.00元, 退款金额100.00元, 原收益10.00元 / 变更后收益5元', '24', '分销', '0', '0', '0', '0', '1601216916'), ('52', '1', '分销收益变更', '用户订单发生变更, 订单金额200.00元, 增加金额0.00元, 优惠金额0.00元, 退款金额100.00元, 原收益6.00元 / 变更后收益3元', '25', '分销', '0', '1', '0', '0', '1601216916'), ('53', '4', '订单发货', '订单已发货', '48', '订单', '0', '0', '0', '0', '1601216963'), ('54', '4', '积分变动', '订单商品完成赠送积分增加100', '2', '积分', '0', '0', '0', '0', '1601216976'), ('55', '4', '订单收货', '订单收货成功', '48', '订单', '0', '0', '0', '0', '1601216976'), ('56', '4', '分销收益新增', 'vvvvvv用户订单佣金结算200.00元, 收益5.00元, 已发放至钱包', '24', '分销', '0', '0', '0', '0', '1601217077'), ('57', '4', '钱包变更', '分销收益新增 [ 有效金额增加5.00元 ]', '4', '钱包', '0', '0', '0', '0', '1601217078'), ('58', '1', '分销收益新增', 'vvvvvv用户订单佣金结算200.00元, 收益3.00元, 已发放至钱包', '25', '分销', '0', '1', '0', '0', '1601217078'), ('59', '1', '钱包变更', '分销收益新增 [ 有效金额增加3.00元 ]', '2', '钱包', '0', '1', '0', '0', '1601217078'), ('60', '4', '分销收益新增', 'vvvvvv用户下单100元, 预计收益10元', '26', '分销', '0', '0', '0', '0', '1601217154'), ('61', '1', '分销收益新增', 'vvvvvv用户下单100元, 预计收益10元', '27', '分销', '0', '1', '0', '0', '1601217154'), ('62', '4', '订单支付', '订单支付成功,金额100元', '49', '订单', '0', '0', '0', '0', '1601217195'), ('63', '4', '账户余额变动', '20200927231734449592订单退款50.00元', '49', '订单售后', '0', '0', '0', '0', '1601217218'), ('64', '4', '订单退款', '订单退款成功,金额50元', '49', '订单售后', '0', '0', '0', '0', '1601217218'), ('65', '4', '分销收益变更', '用户订单发生变更, 订单金额100.00元, 增加金额0.00元, 优惠金额0.00元, 退款金额50.00元, 原收益10.00元 / 变更后收益5元', '26', '分销', '0', '0', '0', '0', '1601217218'), ('66', '1', '分销收益变更', '用户订单发生变更, 订单金额100.00元, 增加金额0.00元, 优惠金额0.00元, 退款金额50.00元, 原收益10.00元 / 变更后收益5元', '27', '分销', '0', '1', '0', '0', '1601217218'), ('67', '4', '订单发货', '订单已发货', '49', '订单', '0', '0', '0', '0', '1601217279'), ('68', '4', '积分变动', '订单商品完成赠送积分增加50', '3', '积分', '0', '0', '0', '0', '1601217289'), ('69', '4', '订单收货', '订单收货成功', '49', '订单', '0', '0', '0', '0', '1601217289'), ('70', '4', '分销收益新增', 'vvvvvv用户订单佣金结算100.00元, 收益5.00元, 已发放至钱包', '26', '分销', '0', '0', '0', '0', '1601217366'), ('71', '4', '钱包变更', '分销收益新增 [ 有效金额增加5.00元 ]', '4', '钱包', '0', '0', '0', '0', '1601217366'), ('72', '1', '分销收益新增', 'vvvvvv用户订单佣金结算100.00元, 收益5.00元, 已发放至钱包', '27', '分销', '0', '1', '0', '0', '1601217366'), ('73', '1', '钱包变更', '分销收益新增 [ 有效金额增加5.00元 ]', '2', '钱包', '0', '1', '0', '0', '1601217366'), ('74', '4', '分销收益新增', 'vvvvvv用户下单100元, 预计收益10元', '28', '分销', '0', '0', '0', '0', '1601217411'), ('75', '1', '分销收益新增', 'vvvvvv用户下单100元, 预计收益10元', '29', '分销', '0', '1', '0', '0', '1601217411'), ('76', '4', '订单支付', '订单支付成功,金额100元', '50', '订单', '0', '0', '0', '0', '1601217456'), ('77', '4', '订单发货', '订单已发货', '50', '订单', '0', '0', '0', '0', '1601217472'), ('78', '4', '积分变动', '订单商品完成赠送积分增加50', '4', '积分', '0', '0', '0', '0', '1601217488'), ('79', '4', '订单收货', '订单收货成功', '50', '订单', '0', '0', '0', '0', '1601217488'), ('80', '4', '分销收益新增', 'vvvvvv用户订单佣金结算100.00元, 收益10.00元, 已发放至钱包', '28', '分销', '0', '0', '0', '0', '1601217552'), ('81', '4', '钱包变更', '分销收益新增 [ 有效金额增加10.00元 ]', '4', '钱包', '0', '0', '0', '0', '1601217552'), ('82', '1', '分销收益新增', 'vvvvvv用户订单佣金结算100.00元, 收益10.00元, 已发放至钱包', '29', '分销', '0', '1', '0', '0', '1601217552'), ('83', '1', '钱包变更', '分销收益新增 [ 有效金额增加10.00元 ]', '2', '钱包', '0', '1', '0', '0', '1601217552');
COMMIT;
-- ----------------------------
@@ -1239,13 +1264,13 @@ CREATE TABLE `s_plugins` (
PRIMARY KEY (`id`),
UNIQUE KEY `plugins` (`plugins`),
KEY `is_enable` (`is_enable`)
-) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='应用';
+) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='应用';
-- ----------------------------
-- Records of `s_plugins`
-- ----------------------------
BEGIN;
-INSERT INTO `s_plugins` VALUES ('1', 'commonrightnavigation', null, '0', '1597850579', '1597851510'), ('2', 'share', '{\"title\":\"\",\"url\":\"\",\"desc\":\"\",\"weixin_appid\":\"wx9a1bbb9ae33aa87b\",\"weixin_secret\":\"b5070921755f048724d60cc50f9ab0e4\",\"is_goods_photo_bottom\":\"1\",\"is_goods_photo_top_right\":\"1\",\"pic\":\"\"}', '1', '1598362039', '1598764131'), ('3', 'distribution', '{\"user_poster_top_desc\":\"\",\"user_poster_share_title\":\"\",\"user_poster_share_desc\":\"\",\"is_upper_return\":\"1\",\"level\":\"2\",\"self_buy\":\"1\",\"is_down_return\":\"0\",\"down_return_number\":\"\",\"is_upper_return_integral\":\"0\",\"upper_return_integral\":\"\",\"is_down_return_integral\":\"0\",\"down_return_integral\":\"\",\"down_return_integral_people\":\"\",\"is_show_introduce\":\"1\",\"user_center_level_desc\":\"\",\"is_enable_self_extraction\":\"1\",\"is_buy_default_extraction_address\":\"1\",\"is_force_current_user\":\"0\",\"extraction_profit_level\":\"0\",\"self_extraction_apply_desc\":\"\",\"self_extraction_common_notice\":\"\",\"profit_type\":\"0\",\"profit_settlement_limit_time\":\"1\",\"non_conformity_desc\":\"\",\"user_center_notice\":\"\",\"poster_data\":[],\"default_level_images\":\"\",\"default_qrcode_logo\":\"\"}', '1', '1598698135', '1601217364'), ('4', 'goodsalledit', null, '1', '1599228464', '1599228467'), ('5', 'wallet', '{\"is_enable_recharge\":\"1\",\"recharge_give_type\":\"0\",\"recharge_give_value\":\"\",\"is_enable_cash\":\"1\",\"is_cash_retain_give\":\"1\",\"cash_time_limit\":\"30\",\"user_center_notice\":\"\"}', '1', '1599460260', '1599460286'), ('6', 'exchangerate', '{\"is_user_quick_select\":\"1\",\"is_user_header_top_right_select\":\"1\",\"is_goods_to_rate\":\"1\",\"is_use_default_currency_buy\":\"1\"}', '1', '1599657354', '1601005462'), ('7', 'quotation', null, '1', '1599663230', '1601736190'), ('8', 'freightfee', null, '1', '1599803337', '1599803576'), ('9', 'usernotloginhidegoodsprice', '{\"original_price_placeholder\":\"333\",\"price_placeholder\":\"\"}', '0', '1600307623', '1600332468'), ('10', 'answers', '{\"application_name\":\"\\u95ee\\u7b54test\",\"url\":\"\",\"is_new_window_open\":\"0\",\"url_bottom\":\"\",\"is_new_window_open_bottom\":\"0\",\"right_top_rec_name\":\"\",\"middle_new_name\":\"\",\"right_top_goods_name\":\"\",\"middle_new_page_number\":\"15\",\"search_page_number\":\"28\",\"home_new_goods_number\":\"\",\"category_ids\":\"1\",\"images\":\"\",\"images_bottom\":\"\"}', '1', '1601271584', '1601450313'), ('11', 'blog', '{\"application_name\":\"\\u535a\\u5ba2\",\"home_page_size\":\"\",\"home_multigraph_number\":\"\",\"home_bottom_goods_page_size\":\"\",\"search_page_size\":\"\",\"search_right_goods_number\":\"\",\"right_recommended_number\":\"\",\"seo_title\":\"\",\"seo_keywords\":\"\",\"seo_desc\":\"\",\"home_bottom_goods_order_by_type\":\"0\",\"home_bottom_goods_order_by_rule\":\"0\"}', '1', '1601304757', '1601993960');
+INSERT INTO `s_plugins` VALUES ('1', 'commonrightnavigation', null, '0', '1597850579', '1597851510'), ('2', 'share', '{\"title\":\"\",\"url\":\"\",\"desc\":\"\",\"weixin_appid\":\"wx9a1bbb9ae33aa87b\",\"weixin_secret\":\"b5070921755f048724d60cc50f9ab0e4\",\"is_goods_photo_bottom\":\"1\",\"is_goods_photo_top_right\":\"1\",\"pic\":\"\"}', '1', '1598362039', '1598764131'), ('3', 'distribution', '{\"user_poster_top_desc\":\"\",\"user_poster_share_title\":\"\",\"user_poster_share_desc\":\"\",\"is_upper_return\":\"1\",\"level\":\"2\",\"self_buy\":\"1\",\"is_down_return\":\"0\",\"down_return_number\":\"\",\"is_upper_return_integral\":\"0\",\"upper_return_integral\":\"\",\"is_down_return_integral\":\"0\",\"down_return_integral\":\"\",\"down_return_integral_people\":\"\",\"is_show_introduce\":\"1\",\"user_center_level_desc\":\"\",\"is_enable_self_extraction\":\"1\",\"is_buy_default_extraction_address\":\"1\",\"is_force_current_user\":\"0\",\"extraction_profit_level\":\"0\",\"self_extraction_apply_desc\":\"\",\"self_extraction_common_notice\":\"\",\"profit_type\":\"0\",\"profit_settlement_limit_time\":\"1\",\"non_conformity_desc\":\"\",\"user_center_notice\":\"\",\"poster_data\":[],\"default_level_images\":\"\",\"default_qrcode_logo\":\"\"}', '1', '1598698135', '1601217364'), ('4', 'goodsalledit', null, '1', '1599228464', '1599228467'), ('5', 'wallet', '{\"is_enable_recharge\":\"1\",\"recharge_give_type\":\"0\",\"recharge_give_value\":\"\",\"is_enable_cash\":\"1\",\"is_cash_retain_give\":\"1\",\"cash_time_limit\":\"30\",\"user_center_notice\":\"\"}', '1', '1599460260', '1599460286'), ('6', 'exchangerate', '{\"is_user_quick_select\":\"1\",\"is_user_header_top_right_select\":\"1\",\"is_goods_to_rate\":\"1\",\"is_use_default_currency_buy\":\"1\"}', '1', '1599657354', '1601005462'), ('7', 'quotation', null, '1', '1599663230', '1601736190'), ('8', 'freightfee', null, '1', '1599803337', '1599803576'), ('9', 'usernotloginhidegoodsprice', '{\"original_price_placeholder\":\"333\",\"price_placeholder\":\"\"}', '0', '1600307623', '1600332468'), ('10', 'answers', '{\"application_name\":\"\\u95ee\\u7b54test\",\"url\":\"\",\"is_new_window_open\":\"0\",\"url_bottom\":\"\",\"is_new_window_open_bottom\":\"0\",\"right_top_rec_name\":\"\",\"middle_new_name\":\"\",\"right_top_goods_name\":\"\",\"middle_new_page_number\":\"15\",\"search_page_number\":\"28\",\"home_new_goods_number\":\"\",\"category_ids\":\"1\",\"images\":\"\",\"images_bottom\":\"\"}', '1', '1601271584', '1601450313'), ('11', 'blog', '{\"application_name\":\"\\u535a\\u5ba2\",\"home_data_list_number\":\"\",\"home_multigraph_number\":\"\",\"home_bottom_goods_page_size\":\"\",\"category_page_size\":\"2\",\"search_page_size\":\"\",\"search_right_goods_number\":\"\",\"right_recommended_number\":\"\",\"seo_title\":\"\",\"seo_keywords\":\"\",\"seo_desc\":\"\",\"home_bottom_goods_order_by_type\":\"0\",\"home_bottom_goods_order_by_rule\":\"0\"}', '1', '1601304757', '1602041061'), ('12', 'speedplaceorder', null, '1', '1602233908', '1602233911');
COMMIT;
-- ----------------------------
@@ -1329,7 +1354,7 @@ CREATE TABLE `s_plugins_blog` (
-- ----------------------------
BEGIN;
INSERT INTO `s_plugins_blog` VALUES ('1', '使用小皮面板(phpStudy)一键部署ShopXO教程', '1', '', '', '1', '已安装小皮面板用户跳过 1,2 步骤 1. 进入小皮面板安装页面 https://www.xp.cn/linux.html 2. 获取安装脚本 滚动鼠标到底部或者点击立即安装,根据自身服务器系统选择不同脚本,执行脚本即可', '已安装小皮面板用户跳过 1,2 步骤
1. 进入小皮面板官网安装页面
https://www.xp.cn/linux.html
2. 获取安装脚本
滚动鼠标到底部或者点击立即安装,根据自身服务器系统选择不同脚本,执行脚本即可搭建好环境(部分服务器运营商已提供小皮面板预装服务)


2.1. 环境软件安装
进入面板后台,左侧软件管理->系统环境下面选择相应的服务安装
各项安装任意一个版本都可以
web服务安装:nginx / apache
php安装: 5.6 / 7.0 / 7.1 / 7.2 / 7.3 / 7.4
mysql安装:5.6 / 5.7
3. 开始部署ShopXO,左侧菜单
软件管理 -> 网站程序 找到 shopxo 或者右侧搜索 一键部署

4. 弹窗部署窗口
窗口里面第一个 输入已经解析绑定到服务器的域名,比如我们这里测试域名 xo.com ,数据库名称和密码都可以修改或者使用系统随机生成的。php版本支持5.6+
安装完成后,点击安装信息查看站点信息,系统的账号密码,默认管理员:admin,默认管理员密码:shopxo



5. 已部署完成
到这里证明小皮(phpStudy)部署shopxo已完成
自行安装教程 https://ask.shopxo.net/article/5
', '/static/upload/images/plugins_blog/2020/09/30/1601454062139210.jpg', '12', '', '0', '0', '0', '', '', '', '1601389165', '1601730901'), ('2', 'WordPress开启颜色评论但不造成XSS漏洞的小方法', '1', '', '', '1', '前段时间分享过一些XSS漏洞的修复技巧,而且也说到了WordPress开启颜色评论需要在functions.php中插入如下代码,也就是禁用WordPress自动过滤HTML标签机制:但是,禁止过滤html标签之', '前段时间分享过一些XSS漏洞的修复技巧,而且也说到了WordPress开启颜色评论需要在functions.php中插入如下代码,也就是禁用WordPress自动过滤HTML标签机制:
remove_action('init', 'kses_init');remove_action('set_current_user', 'kses_init');但是,禁止过滤html标签之后,就会造成XSS漏洞。比如,若有人在评论中插入恶意的js跳转代码,那么加载这个页面将会导致页面跳转到评论者指定的网站了!
那么,我们如何做到两者兼顾,既要用到带颜色的评论,又要避免XSS漏洞呢?
本来在上次在XSS漏洞修复思路(二)一文中分享过代码转义的解决方法,但是因为无法写全所有XSS特征清单,所以这个办法并不严谨,也不推荐。
下面分享两全兼顾的方法:
先分析下:字体的颜色是用font标签来实现的,比如<font color="red">红色</font>,WordPress默认情况下,当用户提交带html标签的评论,会经过一次html过滤,再存入到数据库,所以加载出来的评论是没有颜色的。
既然不能禁止html过滤,那么我们可以从提交和加载入手,在提交的时候不用<font>标签,然后在加载评论的时候转换成<font>标签即可。
实现就很简单了:
①、提交前的处理
评论中使用短代码来提交带颜色评论,比如:[font color=red]红色评论[/font];
既然都研究到颜色评论这个问题了,想必你也应该在评论框中集成了快捷颜色功能了吧?
类似于这种:

本来,点击颜色会自动插入<font color="red">这种标签,那么我们先需要修改js代码,找到插入这个标签的地方,然后把所有尖括号改成中括号,并把双引号去掉,也就是改成[font color=颜色][/color],如下所示:

保存后,我们就已经完成提交前的处理了,下面说加载时的替换处理。
②、加载时的替换
A. 编辑主题目录下的functions.php,在最后一个?>之前新增如下函数:
/*** WordPress 评论颜色短代码替换函数* 修改自WordPresscomment_text函数 By 张戈博客* 文章地址: https://zhang.ge/5007.html **/function comment_text_diy( $comment_ID = 0, $args = array() ) { $comment = get_comment( $comment_ID ); $comment_text = get_comment_text( $comment_ID , $args ); echo preg_replace('/\\[color=(.*?)\\](.*?)\\[\\/color\\]/i','<font color="$1">$2</font>',apply_filters( 'comment_text', $comment_text, $comment, $args ));}B. 编辑主题目录下commens.php文件,搜索wp_list_comments,获得主题评论回调函数的名称,比如:
<?php wp_list_comments('type=comment&callback=mytheme_comment&end-callback=mytheme_end_comment'); ?>以上代码所示的回调函数则为mytheme_comment,即callback的值。
然后,编辑主题目录下的functions.php文件,搜索mytheme_comment,找到该函数,并将函数中的<?php comment_text() ?> 替换成<?php comment_text_diy() ?>即可。也就是调用咱们自定义的评论输出函数,目的就是为了加载评论时将评论中的颜色短代码替换为对应颜色的html代码,从而实现带颜色的评论。
③、善后工作
不同主题可能需要做的善后工作也不同,以我现在用的知更鸟为例,首页的侧边栏可能会放置一个最近留言的模块,如果应用了本文的颜色短代码,那么最近留言模块中,之前有颜色的评论将会带出[font color=red]这类短代码,不是很没美观,所以我们有必要对这个数据进行过滤。
编辑目标文件(主题目录下的includes/widget/r_comments.php),找到:
convert_smilies(strip_tags($comment->com_excerpt))
修改为:
convert_smilies(preg_replace('/(\\[color=(.*?)\\]|\\[\\/color\\])/i','',strip_tags($comment->com_excerpt)))保存即可,即在输出评论的时候过滤这个短代码。
这只是一个案例,如果有其他需要过滤的,原理是一样的,加上正则置空机制即可,自己去折腾吧!
', '/static/upload/images/plugins_blog/2020/09/30/1601454373163030.jpg', '3', '', '0', '0', '1', '', '', '', '1601454409', '1601721630'), ('3', 'Docker Remote API简介及实战分享:Haproxy远程管理', '1', '', '', '1', '熟悉Docker的朋友都知道,Docker是可以开启远程控制API的,默认监听TCP 2375端口,它有非常丰富的接口方法,可以用来远程控制Docker Daemon来做很多操作。Docker版本迭代很快,因此不同的版本官方也提供了不同版本的API文档,本文主要基于当前最新的v1.40简单介绍下一些常用操作及最佳实践。一、安装DockerCentos 系统可以直接使用yum命令在线安装,具体可以参考官方文档,下面提供一个Linux系统通用的在线安装方法:1', '熟悉Docker的朋友都知道,Docker是可以开启远程控制API的,默认监听TCP 2375端口,它有非常丰富的接口方法,可以用来远程控制Docker Daemon来做很多操作。Docker版本迭代很快,因此不同的版本官方也提供了不同版本的API文档,本文主要基于当前最新的v1.40简单介绍下一些常用操作及最佳实践。
一、安装Docker
Centos 系统可以直接使用yum命令在线安装,具体可以参考官方文档,下面提供一个Linux系统通用的在线安装方法:
1、国外的主机:
curl -sSL https://get.docker.com | sh
2、国内的主机:
curl -sSL https://get.daocloud.io/docker | sh
更多系统的安装方法可参考前人整理的文档,成功安装后,可执行 docker info、docker version、docker ps 等命令测试是否正常,具体过程不再赘述。
3、镜像加速
如果是国内的主机,为了让后面的实践操作更加顺畅,这里可以配置一下DaoCloud提供的的Docker镜像加速,执行如下2条命令即可:
# 配置加速curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io# 重启Dockersystemctl restart docker
二、启用API
为了保证安全,Docker安装后默认不会启用远程API服务,因为这个服务默认不做权限认证。本文主要是做实践分享,且用于内网生产环境,安全上会有保证,如果是外网生产环境建议做好iptables安全加固或用完即焚或使用TLS安全认证,此处不表。
开启方法比较简单,此处只分享CentOS 7系统的启用步骤:
1、修改配置:
vi /lib/systemd/system/docker.service
找到ExecStart配置项,默认如下:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
在其中插入监听选项:-H tcp://0.0.0.0:2375(如果是内网生产环境,请将0.0.0.0改为内网IP),最后为:
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 --containerd=/run/containerd/containerd.sock
2、重启Docker:
systemctl daemon-reloadsystemctl restart docker
3、查看结果,如下即为成功:
[root@centos ~]# netstat -nutlp | grep 2375tcp6 0 0 :::2375 :::* LISTEN 3586/dockerd
4、查看API版本:
[root@centos ~]# docker versionClient: Docker Engine - CommunityVersion: 19.03.2API version: 1.40 # 本机Docker作为客户端的版本Go version: go1.12.8Git commit: 6a30dfcBuilt: Thu Aug 29 05:28:55 2019OS/Arch: linux/amd64Experimental: falseServer: Docker Engine - CommunityEngine:Version: 19.03.2API version: 1.40 (minimum version 1.12) # 本机Docker作为服务端的版本Go version: go1.12.8Git commit: 6a30dfcBuilt: Thu Aug 29 05:27:34 2019OS/Arch: linux/amd64Experimental: falsecontainerd:Version: 1.2.6GitCommit: 894b81a4b802e4eb2a91d1ce216b8817763c29fbrunc:Version: 1.0.0-rc8GitCommit: 425e105d5a03fabd737a126ad93d62a9eeede87fdocker-init:Version: 0.18.0GitCommit: fec3683
三、Docker API初探
完成上述步骤后,Docker就已经支持远程控制了,我们先参考官方文档试试拉起一个镜像(下文的操作均在本地完成,因此IP均为127.0.0.1):
1、调用API拉取centos最新镜像:
curl -XPOST "http://127.0.0.1:2375/v1.40/images/create?fromImage=centos&tag=latest"
2、调用API创建一个容器,指定一个前台阻塞命令 tail -f /dev/null:
curl -H "Content-Type: application/json" http://127.0.0.1:2375/containers/create?name=demo1 -d '{"Image": "centos:latest","HostConfig": {"NetworkMode": "host","Binds": ["/tmp:/tmp"]},"Cmd": ["tail","-f","/dev/null"]}'成功返回如下:
{"Id":"b88c7c986ecd5fdf174f79b00e024087b47241cd40653bcb05df70fba5cc398f","Warnings":[]}3、调用API启动刚刚创建的容器:
# 可以使用上一步返回的id来启动:curl -XPOST http://127.0.0.1:2375/containers/b88c7c986ecd5fdf174f79b00e024087b47241cd40653bcb05df70fba5cc398f/start# 也可以使用上一步定义的容器名称demo1来启动:curl -XPOST http://127.0.0.1:2375/demo1/start
4、查看启动中的容器:
[root@centos ~]# docker ps | grep demo1ed9f2150f8d5 centos:latest "tail -f /dev/null" About a minute ago Up About a minute demo1
5、调用容器执行命令:
调用API,对已存在的容器demo1创建命令实例:
curl -H "Content-Type: application/json" http://127.0.0.1:2375/containers/demo1/exec -d '{ "AttachStdin": false,"AttachStdout": true,"AttachStderr": true,"DetachKeys": "ctrl-p,ctrl-q","Tty": false,"Cmd": ["sh","-c","date | tee /tmp/test_exec.log"],"Env": ["FOO=bar","BAZ=quux"]}'返回结果为命令实例Id:
{"Id":"08552937782f6c5b696454d5524b140337fb0652d5f39142ac57ceaf46732bb4"}继续调用API启动这个命令实例:
curl -XPOST -H "Content-Type: application/json" http://127.0.0.1:2375/exec/08552937782f6c5b696454d5524b140337fb0652d5f39142ac57ceaf46732bb4/start -d '{ "Detach": false,"Tty": false}'Fri Oct 4 03:21:36 UTC 2019如上返回了一个date命令的回显,并且会在挂载的/tmp目录生成test_exec.log文本,内容和上一步回显一致:
[root@centos ~]# cat /tmp/test_exec.log Fri Oct 4 03:21:36 UTC 2019
说明命令被成功执行!
上述步骤,简单的展示了Docker API的常见场景,可以说Docker API极大的简化了运维工作,比如我们常说的CI/CD就可以不再依赖ssh通道或自建agent了,一个接口就可以搞定应用的全生命周期,简直是运维大救星!
Ps:更多Docker API的用法可以参考官方文档。
四、Python-SDK初探
Docker是如此的流行,肯定少不了各语言配套的SDK,运维最常用的高级语言是Python,因此这里简单的介绍下Docker的Python SDK,并使用Python的SDK来实现上文API的繁琐操作:
1、安装SDK:
# 如果没有pip,先安装pip:yum install python-pippip install --upgrade pip# 安装SDKpip install docker
2、寥寥数行代码就可以实现第三步的繁琐过程:
# -- coding: utf8 --import docker# 初始化,这里可以根据目标docker版本执行API版本,如果后面报错则需要调整此处为目标的同版本或更低版本client = docker.DockerClient(version='1.40', base_url='tcp://127.0.0.1:2375')# 拉取镜像client.images.pull('centos:latest')# 拉起容器client.containers.run(image='centos:latest', name='demo1', command='tail -f /dev/null',volumes={'/data': {'bind': '/tmp', 'mode': 'rw'}}, detach=True)# 先通过容器名获取对象container = client.containers.get('demo1')# 通过对象执行命令result = container.exec_run(cmd='sh -c "date | tee /tmp/test_sdk.log"', detach=False, tty=True, stdin=True, stdout=True)# 输出执行命令的返回码和返回结果print(result.exit_code)print(result.output.decode())上述代码保存为 test_sdk.py,执行 python test_sdk.py 后查看结果:
[root@centos ~]# python test_sdk.py 0Sun Oct 6 01:48:58 UTC 2019[root@centos ~]# cat /data/test_sdk.log Fri Oct 4 03:35:14 UTC 2019
通过SDK的操作演示,可以很明显的看到操作步骤极大的简化了,整体过程变得更加流畅!
Ps:更多的玩法可以参考官方文档。
五、实战Haproxy远程管理
上文的实践证明,有了Docker Remote API这个运维利器(通道),很多传统运维手段都可以被革新,下面简单介绍一下,我们如何利用Docker Remote API来实现Haoproxy的远程管理(所有代码和镜像均已上传到GitHub和DockerHub)。
1、原理介绍
首先,我们构建一个Haporxy配置集中管理服务,用于界面化管理Haproxy配置,并提供可拉取到指定配置内容的接口,比如:
curl -s --max-time 120 --retry 3 -w %{http_code} -o 192.168.1.100.cfg http://192.168.1.1/haproxy/192.168.1.100然后,在Haproxy镜像里面集成一个shell脚本,用于拉取、比对、更新Haproxy的配置文件。
最后,远程调用Docker Remote API 执行Haproxy容器里面的shell脚本更新Haproxy配置,如果更新成功则继续调用Docker API 重载Haproxy配置,即可完成Haproxy配置的平滑更新。
2、快速构建中心配置管理服务
为了快速演示效果,这里直接使用Nginx部署一个Haproxy配置的下载服务,实际使用肯定要构建一个更完善的管理平台。
# 安装Nginxyum install -y nginx# 启动Nginx/sbin/nginx# 创建一个极简haproxy配置文件cat > /usr/share/nginx/html/127.0.0.1 <<EOFglobalnbproc 1pidfile /usr/local/haproxy/logs/127.0.0.1.piddefaultstimeout connect 300stimeout client 300stimeout server 300slisten admin_statbind 0.0.0.0:8080mode httpstats refresh 60sstats uri /haproxystats auth admin:123456stats admin if TRUE################################################## status end ###############################################EOF# 请求测试,有上述内容即为成功curl http://127.0.0.1/127.0.0.1
3、制作Haproxy镜像:
这里直接基于官方的镜像,额外集成用于更新Haproxy配置的脚本以及一些常用命令(curl、vim、ps):
Dockerfile内容如下:
FROM haproxy:latestRUN apt-get update \\&& apt-get install -y curl vim procps \\&& apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=falseCOPY update_cfg.sh /opt/COPY docker-entrypoint.sh /CMD ["haproxy","-f","/etc/haproxy.cfg"]
update_cfg.sh 用于下载、比对、更新Haproxy配置,语法、逻辑都比较简单,感兴趣的可以看看:
#!/bin/bashsource /etc/profileif [ -z $VIP ];thenecho 'ENV ${VIP} is not SET, Plz check!'exit 1fi# Define and create storage directoryetc_dir=${STORAGE_DIR:-/usr/local/haproxy/etc}temp_dir=${etc_dir}/tempback_dir=${etc_dir}/backupmkdir -p ${back_dir} ${temp_dir}# Define the configration filecurrent_cfg=${etc_dir}/${VIP}.cfgbackup_cfg=${back_dir}/${VIP}_$(date +%F-%H%M%S).cfgtemp_cfg=${temp_dir}/${VIP}.cfg# Define file download configrationcurl_bin=$(which curl)cfg_manage_api=${CFG_GET_URL:-http://your_haporxy_download_svr/haproxy/}${VIP} # 这里需要根据配置管理服务的实际情况修改地址# console logreport_log(){echo "[$(date '+%F %H:%M:%S')] $*"}# backup current configration filebackup_cfg(){if [ -f ${current_cfg} ];thencp -a ${current_cfg} ${backup_cfg} && \\report_log "Backup ${current_cfg} to ${backup_cfg} success." || \\report_log "Backup ${current_cfg} to ${backup_cfg} failed."elsereport_log "${current_cfg} is not exist, maybe the first release, skiped."fi}# update current configration filecover_cfg(){ if [ -f ${temp_cfg} ];thencp -a ${temp_cfg} ${current_cfg} && \\report_log "Cover ${temp_cfg} to ${current_cfg} success." || (report_log "Cover ${temp_cfg} to ${current_cfg} failed."exit 1)elsereport_log "${temp_cfg} is not exist, Unknow Error, exited."exit 1fi}# download latest configration file from download svrdownload_cfg(){report_log "Starting Download configration file to ${temp_cfg} ..."ret_code=$(${curl_bin} -s --max-time 120 --retry 3 -w %{http_code} -o ${temp_cfg} ${cfg_manage_api})if [ $ret_code -eq 200 ] && [ $? -eq 0 ];thenreport_log "Download configration file ${temp_cfg} success."elsereport_log "Download configration file ${temp_cfg} failed."exit 1fi}# check the latest configration check_cfg(){old_md5=$(test -f ${current_cfg} && md5sum ${current_cfg} | awk '{print $1}' 2>/dev/null )new_md5=$(md5sum ${temp_cfg}|awk '{print $1}')if [ "$old_md5" = "$new_md5" ];thenreport_log "The configuration file ${VIP}.cfg is the same, no need update."return 2fiif haproxy -c -W -f ${temp_cfg} >/dev/null ;thenreport_log "Configuration file ${temp_cfg} is valid."return 0elsereport_log "Configuration file ${temp_cfg} is invalid."return 1fi}download_cfgif check_cfg;thenbackup_cfgcover_cfg && \\report_log "${current_cfg} is updated success!"elseexit $?fidocker-entrypoint.sh 改自Haproxy官方镜像,在默认逻辑块加入了对VIP环境变量的判断、配置文件的更新下载、配置文件软链接建立、配置语法校验等逻辑:
#!/bin/sh# first arg is `-f` or `--some-option`if [ "${1#-}" != "$1" ]; thenset -- haproxy "$@"fiif [ "$1" = 'haproxy' ]; thenif [ -z $VIP ];thenecho echo "[$(date '+%F %H:%M:%S')] ENV \\${VIP} is not SET, Plz check!"exit 1fibash /opt/update_cfg.shln -sf /usr/local/haproxy/etc/${VIP}.cfg /etc/haproxy.cfghaproxy -W -c -f /etc/haproxy.cfg || (echo "[$(date '+%F %H:%M:%S')] Haproxy Configuration file check failed, Plz check!"exit 1)shift # "haproxy"# if the user wants "haproxy", let's add a couple useful flags# -W -- "master-worker mode" (similar to the old "haproxy-systemd-wrapper"; allows for reload via "SIGUSR2")# -db -- disables background modeset -- haproxy -W -db "$@"fiexec "$@"准备好上述文件后,在文件同级目录执行如下命令构建Haproxy镜像(实际这一步也可以通过API来操作,这里不再赘述,详见官方文档):
# 脚本给执行权限:chmod +x *.sh# 如果有私有仓库的可以撸到私有仓库,本文主要是分享,这里直接本地构建:docker build -t "haproxy-plus:latest" ./
4、拉起Haproxy容器
为了贴合文章主题,所以这里继续用Docker API远程方式拉起容器:
# -- coding: utf8 --import dockerclient = docker.DockerClient(version='1.40', base_url='tcp://127.0.0.1:2375')#client.images.pull('haproxy-plus:latest') # 本地测试,所以这里不需要拉取镜像client.containers.run(image='haproxy-plus:latest', name='demo2', volumes={'/data/images/haproxy/etc': {'bind': '/usr/local/haproxy/etc', 'mode': 'rw'}}, network_mode='host', environment=["VIP=127.0.0.1", "CFG_GET_URL=http://127.0.0.1/"], detach=True)几个关键的设置说明:
挂载本地目录 /data/images/haproxy/etc 到容器 /usr/local/haproxy/etc 目录,用于持久化配置;
环境变量 VIP,用于指定haproxy的配置名称(在我们这边其实就是VIP地址),也是为了通过接口拉取到指定配置;
环境变量 CFG_GET_URL,拉取Haproxy配置的地址,组合VIP后就是 http://127.0.0.1/127.0.01,即上文的临时搭建的下载地址
上述Python代码保存为start.py,执行结果如下:
[root@centos haproxy]# python start.py [root@centos haproxy]# docker logs -f demo2 # 查看执行日志[2019-10-04 04:32:10] Starting Download configration file to /usr/local/haproxy/etc/temp/127.0.0.1.cfg ...[2019-10-04 04:32:10] Download configration file /usr/local/haproxy/etc/temp/127.0.0.1.cfg success.[2019-10-04 04:32:10] Configuration file /usr/local/haproxy/etc/temp/127.0.0.1.cfg is valid.[2019-10-04 04:32:10] /usr/local/haproxy/etc/127.0.0.1.cfg is not exist, maybe the first release, skiped.[2019-10-04 04:32:10] Cover /usr/local/haproxy/etc/temp/127.0.0.1.cfg to /usr/local/haproxy/etc/127.0.0.1.cfg success.[2019-10-04 04:32:10] /usr/local/haproxy/etc/127.0.0.1.cfg is updated success!Configuration file is valid[NOTICE] 276/043210 (1) : New worker #1 (27) forked
通过Docker的日志,启动过程解析如下:
通过接口下载Haproxy配置,保存为 /usr/local/haporxy/etc/temp/127.0.0.1.cfg;
执行Haproxy配置语法校验:haproxy -c -W /usr/local/haproxy/etc/temp/127.0.0.1.cfg;
语法校验成功后,通过MD5值来比对配置是否有更新,发现找不到原来的配置,说明是首次启动;
拷贝临时配置文件到正式配置文件:/usr/local/haproxy/etc/127.0.0.1.cfg
启动Haproxy成功:New worker #1 (27) forked
此时,访问配置haproxy状态页面 http://<IP>:8080/haproxy,输入账号密码:admin/123456 看看效果:
Haproxy 状态页
结果符合预期,下面我们来尝试更新配置,更新脚本编写如下,对Docker API的SDK稍微做了下封装:
# -- coding: utf8 --import dockerclass dockerApi():def __init__(self,ip,port=2375):self.base_url = 'tcp://%s:%s' % (ip,port)self.client = docker.DockerClient(version='1.40', base_url=self.base_url)def exec_cmd(self,container_name, cmd='echo ok',decode=True):container = self.client.containers.get(container_name)result = container.exec_run(cmd=cmd, detach=False, tty=True, stdin=True, stdout=True)ret_code = result.exit_codeif decode:ret_info = result.output.decode()else:ret_info = result.outputreturn ret_code, ret_infodef send_kill(self, container_name):container = self.client.containers.get(container_name)container.kill('SIGUSR2')# 定义haproxy宿主机IP,可以是多个ld_list = ['127.0.0.1']# 定义更新配置的命令cmd = 'bash /opt/update_cfg.sh'# 定义容器名称container_name = 'demo2' # 开始更新for i in ld_list:obj = dockerApi(i)ret_code,ret_info = obj.exec_cmd(container_name, cmd)print '%s exec %s ret_code is: %s, exec ret_info:' % (i, cmd, ret_code)print ret_infoif int(ret_code) == 0:obj.send_kill(container_name)保存为 update.py,执行结果如下:
[root@centos haproxy]# python update.py 127.0.0.1 exec bash /opt/update_cfg.sh ret_code is: 2, exec ret_info:[2019-10-04 04:55:41] Starting Download configration file to /usr/local/haproxy/etc/temp/127.0.0.1.cfg ...[2019-10-04 04:55:41] Download configration file /usr/local/haproxy/etc/temp/127.0.0.1.cfg success.[2019-10-04 04:55:41] The configuration file 127.0.0.1.cfg is the same, no need update.
日志提示为,配置没有变化,所以不需要升级,符合预期。下面,我们修改中心配置,将监听的端口从8080改为8181:
cat > /usr/share/nginx/html/127.0.0.1 <<EOFglobalnbproc 1pidfile /usr/local/haproxy/logs/127.0.0.1.piddefaultstimeout connect 300stimeout client 300stimeout server 300slisten admin_stat_8181bind 0.0.0.0:8181mode httpstats refresh 60sstats uri /haproxystats auth admin:123456stats admin if TRUE################################################## status end ###############################################EOF# 请求测试,有上述内容即为成功curl http://127.0.0.1/127.0.0.1
再次执行结果如下:
[root@centos haproxy]# python update.py 127.0.0.1 exec bash /opt/update_cfg.sh ret_code is: 0, exec ret_info:[2019-10-04 05:03:43] Starting Download configration file to /usr/local/haproxy/etc/temp/127.0.0.1.cfg ...[2019-10-04 05:03:43] Download configration file /usr/local/haproxy/etc/temp/127.0.0.1.cfg success.[2019-10-04 05:03:43] Configuration file /usr/local/haproxy/etc/temp/127.0.0.1.cfg is valid.[2019-10-04 05:03:43] Backup /usr/local/haproxy/etc/127.0.0.1.cfg to /usr/local/haproxy/etc/backup/127.0.0.1_2019-10-04-050343.cfg success.[2019-10-04 05:03:43] Cover /usr/local/haproxy/etc/temp/127.0.0.1.cfg to /usr/local/haproxy/etc/127.0.0.1.cfg success.[2019-10-04 05:03:43] /usr/local/haproxy/etc/127.0.0.1.cfg is updated success!
相比首次启动的日志,更新配置的过程如下:
通过接口下载Haproxy配置,保存为 /usr/local/haporxy/etc/temp/127.0.0.1.cfg;
执行Haproxy配置语法校验:haproxy -c -W /usr/local/haproxy/etc/temp/127.0.0.1.cfg;
语法校验成功后,通过MD5值来比对配置是否有更新,如果有更新,先备份原配置文件到 /usr/local/haproxy/etc/backup/127.0.0.1_2019-10-04-050343.cfg;
拷贝临时配置文件到正式配置文件:/usr/local/haproxy/etc/127.0.0.1.cfg
由于容器里面的update_cfg.sh脚本仅更新配置文件,因此Python脚本最后一步还会校验脚本返回码,如果是符合预期的将会发送一个kill指令,平滑重载Haproxy,这里主要是用到的Haproxy的-W参数,官方解释如下:
If you used a bind mount for the config and have edited your haproxy.cfg file, you can use HAProxy's graceful reload feature by sending a SIGHUP to the container:
$ docker kill -s HUP my-running-haproxy
The entrypoint script in the image checks for running the command haproxy and replaces it with haproxy-systemd-wrapper from HAProxy upstream which takes care of signal handling to do the graceful reload. Under the hood this uses the -sf option of haproxy so "there are two small windows of a few milliseconds each where it is possible that a few connection failures will be noticed during high loads" (see Stopping and restarting HAProxy). Image Variants
继续查看容器的日志,可以看到有2段日志,第一段是首次启动,第二段则是更新配置后,发送kill指令,Haproxy重载的日志:
[root@centos haproxy]# docker logs -f demo2[2019-10-04 05:03:19] Starting Download configration file to /usr/local/haproxy/etc/temp/127.0.0.1.cfg ...[2019-10-04 05:03:20] Download configration file /usr/local/haproxy/etc/temp/127.0.0.1.cfg success.[2019-10-04 05:03:20] Configuration file /usr/local/haproxy/etc/temp/127.0.0.1.cfg is valid.[2019-10-04 05:03:20] /usr/local/haproxy/etc/127.0.0.1.cfg is not exist, maybe the first release, skiped.[2019-10-04 05:03:20] Cover /usr/local/haproxy/etc/temp/127.0.0.1.cfg to /usr/local/haproxy/etc/127.0.0.1.cfg success.[2019-10-04 05:03:20] /usr/local/haproxy/etc/127.0.0.1.cfg is updated success!Configuration file is valid[NOTICE] 276/050320 (1) : New worker #1 (27) forked[WARNING] 276/050343 (1) : Reexecuting Master process[NOTICE] 276/050343 (1) : New worker #1 (53) forked[WARNING] 276/050343 (27) : Stopping proxy admin_stat in 0 ms.[WARNING] 276/050343 (27) : Stopping frontend GLOBAL in 0 ms.[WARNING] 276/050343 (27) : Proxy admin_stat stopped (FE: 0 conns, BE: 0 conns).[WARNING] 276/050343 (27) : Proxy GLOBAL stopped (FE: 0 conns, BE: 0 conns).[WARNING] 276/050343 (1) : Former worker #1 (27) exited with code 0 (Exit)
最后,再次访问Haporxy的状态页面 http://<IP>:8181/haproxy 验证效果,端口已成功更新为8181,符合预期:
Haproxy状态页
上述更新配置、重载的过程经过我实测,确认是平滑无损的。在生产环境,我们只需要在运维平台集中管理Haproxy的配置,就可以通过Docker的API来控制Haproxy进行秒级配置更新了!是不是相当给力?
Haproxy运维管理
这里顺便分享一个好消息:Haproxy最新的2.0已经支持Dataplaneapi来远程管理配置了,感兴趣的可以看下官方文档。
但是由于历史包袱,我们这边如果要切到Dataplaneapi的管理模式需要投入较多的开发资源,因此放弃,暂时继续上述分享的管理方案,后续人力充足再考虑切到Dataplaneapi的更细致的管理模式。
六、小结
本文从Docker安装、Docker Remote API以及Python SDK的使用,较为详细的展示了Docker Remote API的常用场景,最后基于Docker Remote API分享了一个可快速落地的Haproxy远程管理最佳实践,希望对有需要的朋友有所帮助。
', '/static/upload/images/plugins_blog/2020/09/30/1601454508651605.jpg', '5', '', '0', '0', '1', '', '', '', '1601454522', '1601721629');
-INSERT INTO `s_plugins_blog` VALUES ('4', '闲来无事,分析下百度是如何实现取消referer关键词显示的', '2', '', '', '1', '还是在今年6月底,百度就放出全面取消referer关键词显示的通知,听说目的是为了保护用户隐私和站点流量关键词数据。具体公告如下:各位亲爱的网站管理员:百度已实现全站https化,在BAT中率先完成全站加密,以推动网络环境安全。为了进一步保护用户隐私,防止第三方窃听和篡改,百度已于6月25日正式取消referer中关于关键词的显示,更好的保护站点流量关键词数据信息,令站点数据更加私密化。站长需要获得网站流量关键词时,仍然可以使用百度站长平台提供的流量与关键', '还是在今年6月底,百度就放出全面取消referer关键词显示的通知,听说目的是为了保护用户隐私和站点流量关键词数据。
具体公告如下:
各位亲爱的网站管理员:
百度已实现全站https化,在BAT中率先完成全站加密,以推动网络环境安全。为了进一步保护用户隐私,防止第三方窃听和篡改,百度已于6月25日正式取消referer中关于关键词的显示,更好的保护站点流量关键词数据信息,令站点数据更加私密化。站长需要获得网站流量关键词时,仍然可以使用百度站长平台提供的流量与关键词工具或者百度统计相关功能进行查询。
然而并没有什么L用,本来就不知道谁在百度搜索了什么见不得人的事情,隐藏关键词那不是脱了裤子放屁么?
另外,保护站点流量关键词数据,这一点我倒是觉得很有用,省的某些人总是去瞄瞄谁谁谁的站点的哪篇文章有个很牛逼的关键词,然后吧唧就复制粘贴了。不过,这个做法还是无法完全杜绝,为啥?因为你百度还有一个百度指数的功能!别人拿到高指数的词一搜就知道那个谁谁谁的文章排第一了?不过只是增加了麻烦的程度而已!
说个不好意思的事情,这公告刚出来的时候,我其实是没看懂是什么意思的。。。去认为从一个页面的链接点击后跳到另一个页面难道不会产生referer?这不科学啊!然后我就没在意了。。。
直到前不久,偶然发现张戈博客原创作品【搜索来路欢迎框】不提示关键词了:

本以为是我代码BUG了,于是亲自输出了一下referer看了下,发现我写的代码还是可以拿到referer,可惜referer里面的关键词wd的值是空的,比如:
https://www.baidu.com/link?url=dEvj7DE-rHNYgoNrzCSrgBLAVrWns06Ub1h8DjGa5mv-gSonnZp9VCYaDBKRmvDV&wd=&eqid=c1a3fa880009ab000000000555fce97f
这时候又勾起了我的兴趣,了解 referer 的朋友都知道,当我们点击A页面中的链接跳转到B页面时,B页面里面 referer 值就是A页面地址。
也就是说,我在百度搜索张戈博客,那么页面地址应该是:
https://www.baidu.com/s?wd=张戈博客
即A页面地址,如果我们从这个搜索结果中点开第一个链接来到张戈博客,那么产生的 referer 应该就是上面这个搜索地址才对!百度是如何做到隐藏这个关键词的呢??
前几天,在写一个爬虫脚本的时候,破天荒的试了下百度搜索结果中的链接,终于搞懂了这其中的奥妙之处,感觉挺有意思,所以就把其他原创干货继续压在草稿箱等发霉,先把这个发现分享下。
就以张戈博客这个关键词搜索出来的地址为例吧!百度搜索张戈博客后的结果如下图所示:

接着,我试着在Linux下使用curl请求,发现如下图所示:

把结果格式化了下:
| <meta content="always" name="referrer"> |
| <script>try { |
| if (window.opener && window.opener.bds && window.opener.bds.pdc && window.opener.bds.pdc.sendLinkLog) { |
| window.opener.bds.pdc.sendLinkLog(); |
| } |
| } catch(e) {}; |
| var timeout = 0; |
| if (/bdlksmp/.test(window.location.href)) { |
| var reg = /bdlksmp=([^=&]+)/, |
| matches = window.location.href.match(reg); |
| timeout = matches[1] ? matches[1] : 0 |
| }; |
| setTimeout(function() { |
| window.location.replace("https://zhang.ge/") |
| }, |
| timeout);</script> |
| <noscript><META http-equiv="refresh" content="0;URL='https://zhang.ge/'"></noscript> |
然后我就明白了百度是如何做到隐藏关键词的了。
比较简单,但很巧妙的做法:百度现在的搜索结果链接不再直接跳转到目标页面,而是通过了一个隐藏的中转页面。以上代码的大概功能就是,如果浏览器支持Javascript,那么将通过其中的js函数跳转到目标页面,如果浏览器不支持Javascript,那么也能通过最后的META标签让浏览器实现跳转。
由于有了这个中间页面,那么关键词也就断章了,因为真正有关键词的 referer 只能在中间页面这取得,目标页面取得的 referer 则是中间页面的地址,是没有关键词的!
百度还真是用心良苦啊!...
还好我写的【搜索来路欢迎框】是兼容空关键词的,否则显示的就是 null 了。
既然知道有这么个巧妙的做法,那我们在某些场景是否可以借鉴一下呢?我想肯定是用得到的,只是你没遇到而已。。。比如,你的某页面偷偷链接了某站的地址,又不想让站长知道?不过这也是够无聊的了,哈哈哈!
', '/static/upload/images/plugins_blog/2020/09/30/1601454592334389.jpg', '5', '', '0', '0', '1', '', '', '', '1601454634', '1601721629'), ('5', '惊现Haproxy重复添加X-Forwarded-For问题(附官方解决办法)', '2', '', '', '1', '最近在配置Haproxy代理的时候发现一个很有意思的事情:Haproxy在代理http请求会无脑加一个X-Forwarded-For(后文简称XFF),而不是将自身的IP地址加到已存在的XFF列表之后,WTF!还有这种神操作?确认无误之后,我到Haproxy的github开了一个issue反馈了这个BUG(issue地址),最终了解到了Haproxy就是这样设计的,并得到了解决方案,而且这个issue的回复很有意思,特来博客分享下。刚开始,我的issue提', '最近在配置Haproxy代理的时候发现一个很有意思的事情:Haproxy在代理http请求会无脑加一个X-Forwarded-For(后文简称XFF),而不是将自身的IP地址加到已存在的XFF列表之后,WTF!还有这种神操作?
确认无误之后,我到Haproxy的github开了一个issue反馈了这个BUG(issue地址),最终了解到了Haproxy就是这样设计的,并得到了解决方案,而且这个issue的回复很有意思,特来博客分享下。
刚开始,我的issue提到Haproxy没有将自身IP地址append到已有的XFF列表之后,而是无脑又加了一个,这应该是个BUG:
官方开发GG回复让我升级到最新稳定版,我说升级了也是一样的,结果人家又回复我说Haproxy本来就是这样设计的:
我接着回复说Haproxy这样设计会导致很多开源程序获取真实IP异常,比如Twisted和packetbeat,但是官方说Haproxy 的设计100%符合HTTP协议标准balabala....既然都这样说了,我能说啥呢?只好用官方给的建议选项if none来拒绝Haproxy添加XFF,先解决我程序获取源IP错误的问题。
本以为这样就结束了,结果高潮来了!
一位很酷的法国大胡子发起了热心支援:
他的大概意思是说,既然Haproxy 100% 符合HTTP标准,那为啥没有遵循 XFF 的标准约定,将自身的IP地址添加到已存在的XFF列表末尾??也提到了多个XFF会导致很多程序无法读取,比如tomcat-8.5。为啥不加一个选项来选择使用多个XFF还是使用一个XFF等等balabala一顿说...
接着官方在HTTP标准上发起反驳解释(一大堆内容,此处不表),并在最后说明这样做是为了提高Haproxy性能,如果先判断是否存在XFF在高并发情况下性能大概下降2-3倍(非特指Haproxy)。
当然,官方最终还是给了一个解决办法,能够让Haproxy也像Nginx那样将自己的IP地址加到已有XFF之后,只需在Haproxy新增如下配置即可:
http-request replace-value x-forwarded-for ^ "%[hdr(x-forwarded-for)], %[sr]"
虽然官方给的答复可以解决问题,不过法国大胡子最后回复的一段话我觉得说得非常好:
大致意思是,我已经知道如何通过配置来解决,但是为啥 option forwardfor 这个选项没有和大部分人预期那样来设计与开发,而且搞得巨复杂?
然后直接给出他认为更好的开发设计,比如用 option forwardfor force 替代:
http-request del-header x-forwarded-foroption forwardfor
实现强制覆盖XFF,又比如用 option forwardfor append 来替代:
http-request replace-value x-forwarded-for ^ "%[hdr(x-forwarded-for)], %[src]"
实现将自身IP地址加到已有的XFF之后。很明显,这样的设计才更有可读性,更好理解!他在最后还提到了,Apache/Nginx/Tomcat/Jetty/F5等等都是将自身IP地址添加到XFF之后,难道你Haproxy认为这些软件的使用率还不够高??喷得大快人心,再次赞一下法国大胡子!
总之,真的是很有意思的一个issue,同时也解决了问题,发现同样问题的朋友可以参考解决!
', '/static/upload/images/plugins_blog/2020/09/30/1601454812814385.png', '0', '', '0', '0', '1', '', '', '', '1601454820', '1601721628'), ('6', '修改Apache的超时设置,解决长连接请求超时问题', '1', '', '', '1', '某日,组内后台开发找到我,问我们的WEB服务器超时设置是多少。他反馈的问题是,有一个VLAN切换任务cgi接口经常返回504网关超时错误,要我分析解决下。我问了一下,得知这个请求遇到网络设备对象较多的时候,需要小半个小时才能完成,也就是要用到长连接才行。老规矩,从开发那拿到接口地址,得到接入层服务器IP,是一台Haproxy代理,看了一下Haproxy的超时设置:# 设置成功连接到一台服务器的最长等待时间,默认单位是毫秒,新版本的haproxy使', '某日,组内后台开发找到我,问我们的WEB服务器超时设置是多少。他反馈的问题是,有一个VLAN切换任务cgi接口经常返回504网关超时错误,要我分析解决下。
我问了一下,得知这个请求遇到网络设备对象较多的时候,需要小半个小时才能完成,也就是要用到长连接才行。
老规矩,从开发那拿到接口地址,得到接入层服务器IP,是一台Haproxy代理,看了一下Haproxy的超时设置:
# 设置成功连接到一台服务器的最长等待时间,默认单位是毫秒,新版本的haproxy使用timeout connect替代,该参数向后兼容contimeout 3600# 设置连接客户端发送数据时的成功连接最长等待时间,默认单位是毫秒,新版本haproxy使用timeout client替代。该参数向后兼容clitimeout 3600# 设置服务器端回应客户度数据发送的最长等待时间,默认单位是毫秒,新版本haproxy使用timeout server替代。该参数向后兼容srvtimeout 3600
各种1小时超时,所以排除Haproxy的影响,继续往下看。
Haproxy 代理的是2台Apache,也就是部署了cgi接口的服务器。第一时间查看了 httpd.conf 和 httpd-vhost.conf 中的配置,居然没找到超时设置。
于是,搜索了下相关教程,发现原来藏在了 httpd-default.conf 当中:
## This configuration file reflects default settings for Apache HTTP Server.## You may change these, but chances are that you may not need to.### Timeout: The number of seconds before receives and sends time out.#Timeout 300## KeepAlive: Whether or not to allow persistent connections (more than# one request per connection). Set to "Off" to deactivate.#KeepAlive On## MaxKeepAliveRequests: The maximum number of requests to allow# during a persistent connection. Set to 0 to allow an unlimited amount.# We recommend you leave this number high, for maximum performance.#MaxKeepAliveRequests 100## KeepAliveTimeout: Number of seconds to wait for the next request from the# same client on the same connection.#KeepAliveTimeout 5## UseCanonicalName: Determines how Apache constructs self-referencing # URLs and the SERVER_NAME and SERVER_PORT variables.# When set "Off", Apache will use the Hostname and Port supplied# by the client. When set "On", Apache will use the value of the# ServerName directive.#UseCanonicalName Off## AccessFileName: The name of the file to look for in each directory# for additional configuration directives. See also the AllowOverride # directive.#AccessFileName .htaccess## ServerTokens# This directive configures what you return as the Server HTTP response# Header. The default is 'Full' which sends information about the OS-Type# and compiled in modules.# Set to one of: Full | OS | Minor | Minimal | Major | Prod# where Full conveys the most information, and Prod the least.#ServerTokens Full## Optionally add a line containing the server version and virtual host# name to server-generated pages (internal error documents, FTP directory # listings, mod_status and mod_info output etc., but not CGI generated # documents or custom error documents).# Set to "EMail" to also include a mailto: link to the ServerAdmin.# Set to one of: On | Off | EMail#ServerSignature On## HostnameLookups: Log the names of clients or just their IP addresses# e.g., www.apache.org (on) or 204.62.129.132 (off).# The default is off because it'd be overall better for the net if people# had to knowingly turn this feature on, since enabling it means that# each client request will result in AT LEAST one lookup request to the# nameserver.#HostnameLookups Off
看了下,这些是Apache的默认配置,Apache也没有include到httpd.conf当中。因此,编辑 httpd.conf,找到如下参数:
#Include conf/extra/httpd-default.conf
去掉注释,保存文件。然后再编辑 /usr/local/apache2/conf/extra/httpd-default.conf 文件,将Timeout的值修改为符合生产环境要求的1800秒,最后执行Apache平滑重启命令即可:
/usr/local/apache2/bin/apachectl -k graceful或者/usr/local/apache2/bin/httpd -k graceful
Ps:我之前一直以为只有Nginx有一个平滑reload命令,后面才知道Apache、Haproxy都支持平滑重启名称,这个非常棒!
重载之后,就不会出现504网关超时设置了。
', '/static/upload/images/plugins_blog/2020/09/30/1601454884322997.png', '0', '', '0', '0', '1', '', '', '', '1601454908', '1601721462');
+INSERT INTO `s_plugins_blog` VALUES ('4', '闲来无事,分析下百度是如何实现取消referer关键词显示的', '2', '', '', '1', '还是在今年6月底,百度就放出全面取消referer关键词显示的通知,听说目的是为了保护用户隐私和站点流量关键词数据。具体公告如下:各位亲爱的网站管理员:百度已实现全站https化,在BAT中率先完成全站加密,以推动网络环境安全。为了进一步保护用户隐私,防止第三方窃听和篡改,百度已于6月25日正式取消referer中关于关键词的显示,更好的保护站点流量关键词数据信息,令站点数据更加私密化。站长需要获得网站流量关键词时,仍然可以使用百度站长平台提供的流量与关键', '还是在今年6月底,百度就放出全面取消referer关键词显示的通知,听说目的是为了保护用户隐私和站点流量关键词数据。
具体公告如下:
各位亲爱的网站管理员:
百度已实现全站https化,在BAT中率先完成全站加密,以推动网络环境安全。为了进一步保护用户隐私,防止第三方窃听和篡改,百度已于6月25日正式取消referer中关于关键词的显示,更好的保护站点流量关键词数据信息,令站点数据更加私密化。站长需要获得网站流量关键词时,仍然可以使用百度站长平台提供的流量与关键词工具或者百度统计相关功能进行查询。
然而并没有什么L用,本来就不知道谁在百度搜索了什么见不得人的事情,隐藏关键词那不是脱了裤子放屁么?
另外,保护站点流量关键词数据,这一点我倒是觉得很有用,省的某些人总是去瞄瞄谁谁谁的站点的哪篇文章有个很牛逼的关键词,然后吧唧就复制粘贴了。不过,这个做法还是无法完全杜绝,为啥?因为你百度还有一个百度指数的功能!别人拿到高指数的词一搜就知道那个谁谁谁的文章排第一了?不过只是增加了麻烦的程度而已!
说个不好意思的事情,这公告刚出来的时候,我其实是没看懂是什么意思的。。。去认为从一个页面的链接点击后跳到另一个页面难道不会产生referer?这不科学啊!然后我就没在意了。。。
直到前不久,偶然发现张戈博客原创作品【搜索来路欢迎框】不提示关键词了:

本以为是我代码BUG了,于是亲自输出了一下referer看了下,发现我写的代码还是可以拿到referer,可惜referer里面的关键词wd的值是空的,比如:
https://www.baidu.com/link?url=dEvj7DE-rHNYgoNrzCSrgBLAVrWns06Ub1h8DjGa5mv-gSonnZp9VCYaDBKRmvDV&wd=&eqid=c1a3fa880009ab000000000555fce97f
这时候又勾起了我的兴趣,了解 referer 的朋友都知道,当我们点击A页面中的链接跳转到B页面时,B页面里面 referer 值就是A页面地址。
也就是说,我在百度搜索张戈博客,那么页面地址应该是:
https://www.baidu.com/s?wd=张戈博客
即A页面地址,如果我们从这个搜索结果中点开第一个链接来到张戈博客,那么产生的 referer 应该就是上面这个搜索地址才对!百度是如何做到隐藏这个关键词的呢??
前几天,在写一个爬虫脚本的时候,破天荒的试了下百度搜索结果中的链接,终于搞懂了这其中的奥妙之处,感觉挺有意思,所以就把其他原创干货继续压在草稿箱等发霉,先把这个发现分享下。
就以张戈博客这个关键词搜索出来的地址为例吧!百度搜索张戈博客后的结果如下图所示:

接着,我试着在Linux下使用curl请求,发现如下图所示:

把结果格式化了下:
| <meta content="always" name="referrer"> |
| <script>try { |
| if (window.opener && window.opener.bds && window.opener.bds.pdc && window.opener.bds.pdc.sendLinkLog) { |
| window.opener.bds.pdc.sendLinkLog(); |
| } |
| } catch(e) {}; |
| var timeout = 0; |
| if (/bdlksmp/.test(window.location.href)) { |
| var reg = /bdlksmp=([^=&]+)/, |
| matches = window.location.href.match(reg); |
| timeout = matches[1] ? matches[1] : 0 |
| }; |
| setTimeout(function() { |
| window.location.replace("https://zhang.ge/") |
| }, |
| timeout);</script> |
| <noscript><META http-equiv="refresh" content="0;URL='https://zhang.ge/'"></noscript> |
然后我就明白了百度是如何做到隐藏关键词的了。
比较简单,但很巧妙的做法:百度现在的搜索结果链接不再直接跳转到目标页面,而是通过了一个隐藏的中转页面。以上代码的大概功能就是,如果浏览器支持Javascript,那么将通过其中的js函数跳转到目标页面,如果浏览器不支持Javascript,那么也能通过最后的META标签让浏览器实现跳转。
由于有了这个中间页面,那么关键词也就断章了,因为真正有关键词的 referer 只能在中间页面这取得,目标页面取得的 referer 则是中间页面的地址,是没有关键词的!
百度还真是用心良苦啊!...
还好我写的【搜索来路欢迎框】是兼容空关键词的,否则显示的就是 null 了。
既然知道有这么个巧妙的做法,那我们在某些场景是否可以借鉴一下呢?我想肯定是用得到的,只是你没遇到而已。。。比如,你的某页面偷偷链接了某站的地址,又不想让站长知道?不过这也是够无聊的了,哈哈哈!
', '/static/upload/images/plugins_blog/2020/09/30/1601454592334389.jpg', '5', '', '0', '0', '1', '', '', '', '1601454634', '1601721629'), ('5', '惊现Haproxy重复添加X-Forwarded-For问题(附官方解决办法)', '2', '', '', '1', '最近在配置Haproxy代理的时候发现一个很有意思的事情:Haproxy在代理http请求会无脑加一个X-Forwarded-For(后文简称XFF),而不是将自身的IP地址加到已存在的XFF列表之后,WTF!还有这种神操作?确认无误之后,我到Haproxy的github开了一个issue反馈了这个BUG(issue地址),最终了解到了Haproxy就是这样设计的,并得到了解决方案,而且这个issue的回复很有意思,特来博客分享下。刚开始,我的issue提', '最近在配置Haproxy代理的时候发现一个很有意思的事情:Haproxy在代理http请求会无脑加一个X-Forwarded-For(后文简称XFF),而不是将自身的IP地址加到已存在的XFF列表之后,WTF!还有这种神操作?
确认无误之后,我到Haproxy的github开了一个issue反馈了这个BUG(issue地址),最终了解到了Haproxy就是这样设计的,并得到了解决方案,而且这个issue的回复很有意思,特来博客分享下。
刚开始,我的issue提到Haproxy没有将自身IP地址append到已有的XFF列表之后,而是无脑又加了一个,这应该是个BUG:
官方开发GG回复让我升级到最新稳定版,我说升级了也是一样的,结果人家又回复我说Haproxy本来就是这样设计的:
我接着回复说Haproxy这样设计会导致很多开源程序获取真实IP异常,比如Twisted和packetbeat,但是官方说Haproxy 的设计100%符合HTTP协议标准balabala....既然都这样说了,我能说啥呢?只好用官方给的建议选项if none来拒绝Haproxy添加XFF,先解决我程序获取源IP错误的问题。
本以为这样就结束了,结果高潮来了!
一位很酷的法国大胡子发起了热心支援:
他的大概意思是说,既然Haproxy 100% 符合HTTP标准,那为啥没有遵循 XFF 的标准约定,将自身的IP地址添加到已存在的XFF列表末尾??也提到了多个XFF会导致很多程序无法读取,比如tomcat-8.5。为啥不加一个选项来选择使用多个XFF还是使用一个XFF等等balabala一顿说...
接着官方在HTTP标准上发起反驳解释(一大堆内容,此处不表),并在最后说明这样做是为了提高Haproxy性能,如果先判断是否存在XFF在高并发情况下性能大概下降2-3倍(非特指Haproxy)。
当然,官方最终还是给了一个解决办法,能够让Haproxy也像Nginx那样将自己的IP地址加到已有XFF之后,只需在Haproxy新增如下配置即可:
http-request replace-value x-forwarded-for ^ "%[hdr(x-forwarded-for)], %[sr]"
虽然官方给的答复可以解决问题,不过法国大胡子最后回复的一段话我觉得说得非常好:
大致意思是,我已经知道如何通过配置来解决,但是为啥 option forwardfor 这个选项没有和大部分人预期那样来设计与开发,而且搞得巨复杂?
然后直接给出他认为更好的开发设计,比如用 option forwardfor force 替代:
http-request del-header x-forwarded-foroption forwardfor
实现强制覆盖XFF,又比如用 option forwardfor append 来替代:
http-request replace-value x-forwarded-for ^ "%[hdr(x-forwarded-for)], %[src]"
实现将自身IP地址加到已有的XFF之后。很明显,这样的设计才更有可读性,更好理解!他在最后还提到了,Apache/Nginx/Tomcat/Jetty/F5等等都是将自身IP地址添加到XFF之后,难道你Haproxy认为这些软件的使用率还不够高??喷得大快人心,再次赞一下法国大胡子!
总之,真的是很有意思的一个issue,同时也解决了问题,发现同样问题的朋友可以参考解决!
', '/static/upload/images/plugins_blog/2020/09/30/1601454812814385.png', '0', '', '0', '4', '1', '', '', '', '1601454820', '1601721628'), ('6', '修改Apache的超时设置,解决长连接请求超时问题', '1', '', '', '1', '某日,组内后台开发找到我,问我们的WEB服务器超时设置是多少。他反馈的问题是,有一个VLAN切换任务cgi接口经常返回504网关超时错误,要我分析解决下。我问了一下,得知这个请求遇到网络设备对象较多的时候,需要小半个小时才能完成,也就是要用到长连接才行。老规矩,从开发那拿到接口地址,得到接入层服务器IP,是一台Haproxy代理,看了一下Haproxy的超时设置:# 设置成功连接到一台服务器的最长等待时间,默认单位是毫秒,新版本的haproxy使', '某日,组内后台开发找到我,问我们的WEB服务器超时设置是多少。他反馈的问题是,有一个VLAN切换任务cgi接口经常返回504网关超时错误,要我分析解决下。
我问了一下,得知这个请求遇到网络设备对象较多的时候,需要小半个小时才能完成,也就是要用到长连接才行。
老规矩,从开发那拿到接口地址,得到接入层服务器IP,是一台Haproxy代理,看了一下Haproxy的超时设置:
# 设置成功连接到一台服务器的最长等待时间,默认单位是毫秒,新版本的haproxy使用timeout connect替代,该参数向后兼容contimeout 3600# 设置连接客户端发送数据时的成功连接最长等待时间,默认单位是毫秒,新版本haproxy使用timeout client替代。该参数向后兼容clitimeout 3600# 设置服务器端回应客户度数据发送的最长等待时间,默认单位是毫秒,新版本haproxy使用timeout server替代。该参数向后兼容srvtimeout 3600
各种1小时超时,所以排除Haproxy的影响,继续往下看。
Haproxy 代理的是2台Apache,也就是部署了cgi接口的服务器。第一时间查看了 httpd.conf 和 httpd-vhost.conf 中的配置,居然没找到超时设置。
于是,搜索了下相关教程,发现原来藏在了 httpd-default.conf 当中:
## This configuration file reflects default settings for Apache HTTP Server.## You may change these, but chances are that you may not need to.### Timeout: The number of seconds before receives and sends time out.#Timeout 300## KeepAlive: Whether or not to allow persistent connections (more than# one request per connection). Set to "Off" to deactivate.#KeepAlive On## MaxKeepAliveRequests: The maximum number of requests to allow# during a persistent connection. Set to 0 to allow an unlimited amount.# We recommend you leave this number high, for maximum performance.#MaxKeepAliveRequests 100## KeepAliveTimeout: Number of seconds to wait for the next request from the# same client on the same connection.#KeepAliveTimeout 5## UseCanonicalName: Determines how Apache constructs self-referencing # URLs and the SERVER_NAME and SERVER_PORT variables.# When set "Off", Apache will use the Hostname and Port supplied# by the client. When set "On", Apache will use the value of the# ServerName directive.#UseCanonicalName Off## AccessFileName: The name of the file to look for in each directory# for additional configuration directives. See also the AllowOverride # directive.#AccessFileName .htaccess## ServerTokens# This directive configures what you return as the Server HTTP response# Header. The default is 'Full' which sends information about the OS-Type# and compiled in modules.# Set to one of: Full | OS | Minor | Minimal | Major | Prod# where Full conveys the most information, and Prod the least.#ServerTokens Full## Optionally add a line containing the server version and virtual host# name to server-generated pages (internal error documents, FTP directory # listings, mod_status and mod_info output etc., but not CGI generated # documents or custom error documents).# Set to "EMail" to also include a mailto: link to the ServerAdmin.# Set to one of: On | Off | EMail#ServerSignature On## HostnameLookups: Log the names of clients or just their IP addresses# e.g., www.apache.org (on) or 204.62.129.132 (off).# The default is off because it'd be overall better for the net if people# had to knowingly turn this feature on, since enabling it means that# each client request will result in AT LEAST one lookup request to the# nameserver.#HostnameLookups Off
看了下,这些是Apache的默认配置,Apache也没有include到httpd.conf当中。因此,编辑 httpd.conf,找到如下参数:
#Include conf/extra/httpd-default.conf
去掉注释,保存文件。然后再编辑 /usr/local/apache2/conf/extra/httpd-default.conf 文件,将Timeout的值修改为符合生产环境要求的1800秒,最后执行Apache平滑重启命令即可:
/usr/local/apache2/bin/apachectl -k graceful或者/usr/local/apache2/bin/httpd -k graceful
Ps:我之前一直以为只有Nginx有一个平滑reload命令,后面才知道Apache、Haproxy都支持平滑重启名称,这个非常棒!
重载之后,就不会出现504网关超时设置了。
', '/static/upload/images/plugins_blog/2020/09/30/1601454884322997.png', '0', '', '0', '12', '1', '', '', '', '1601454908', '1601721462');
COMMIT;
-- ----------------------------
@@ -1613,6 +1638,36 @@ BEGIN;
INSERT INTO `s_plugins_freightfee_template` VALUES ('1', '2', '运费', '1-CashPayment-现金支付', '', '1', '0', '0', '[{\"region\":\"default\",\"region_show\":\"\",\"first\":\"1\",\"first_price\":\"10\",\"continue\":\"1\",\"continue_price\":\"5\",\"free_shipping_price\":\"\"}]', '1', '1599803407', '1599803564');
COMMIT;
+-- ----------------------------
+-- Table structure for `s_plugins_speedplaceorder_cart`
+-- ----------------------------
+DROP TABLE IF EXISTS `s_plugins_speedplaceorder_cart`;
+CREATE TABLE `s_plugins_speedplaceorder_cart` (
+ `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id',
+ `user_id` int(11) unsigned DEFAULT '0' COMMENT '用户id',
+ `goods_id` int(11) unsigned DEFAULT '0' COMMENT '商品id',
+ `title` char(60) NOT NULL DEFAULT '' COMMENT '标题',
+ `images` char(255) NOT NULL DEFAULT '' COMMENT '封面图片',
+ `original_price` decimal(10,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '原价',
+ `price` decimal(10,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '销售价格',
+ `stock` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '购买数量',
+ `spec` text COMMENT '规格',
+ `add_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '添加时间',
+ `upd_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',
+ PRIMARY KEY (`id`),
+ KEY `user_id` (`user_id`),
+ KEY `goods_id` (`goods_id`),
+ KEY `title` (`title`),
+ KEY `stock` (`stock`)
+) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='快速下单购物车 - 应用';
+
+-- ----------------------------
+-- Records of `s_plugins_speedplaceorder_cart`
+-- ----------------------------
+BEGIN;
+INSERT INTO `s_plugins_speedplaceorder_cart` VALUES ('1', '1', '10', '夏装女装古力娜扎明星同款一字领露肩蓝色蕾丝修身显瘦连衣裙礼服', '/static/upload/images/goods/2019/01/14/1547455222990904.jpg', '568.00', '228.00', '1', '', '1602234046', '0'), ('2', '1', '12', 'ZK星星绣花雪纺连衣裙中长款sukol裙少女心温柔超仙女chic裙子夏', '/static/upload/images/goods/2019/01/14/1547455907486857.jpg', '188.00', '100.00', '1', '[{\"type\":\"\\u989c\\u8272\",\"value\":\"\\u767d\\u8272\"},{\"type\":\"\\u5c3a\\u7801\",\"value\":\"M+M\"}]', '1602234053', '0');
+COMMIT;
+
-- ----------------------------
-- Table structure for `s_plugins_wallet`
-- ----------------------------
@@ -1955,13 +2010,13 @@ CREATE TABLE `s_search_history` (
`ymd` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '日期 ymd',
`add_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '添加时间',
PRIMARY KEY (`id`)
-) ENGINE=InnoDB AUTO_INCREMENT=227 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='搜索日志';
+) ENGINE=InnoDB AUTO_INCREMENT=229 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='搜索日志';
-- ----------------------------
-- Records of `s_search_history`
-- ----------------------------
BEGIN;
-INSERT INTO `s_search_history` VALUES ('1', '1', '0', '0', '', '0-0', 'default', 'asc', '20200819', '1597847691'), ('2', '1', '0', '0', '', '0-0', 'default', 'asc', '20200819', '1597847693'), ('3', '1', '0', '0', '', '0-0', 'default', 'asc', '20200819', '1597847903'), ('4', '1', '0', '0', '', '0-0', 'default', 'asc', '20200819', '1597847903'), ('5', '1', '0', '0', '', '0-0', 'default', 'asc', '20200819', '1597847904'), ('6', '1', '0', '0', '', '0-0', 'default', 'asc', '20200819', '1597847904'), ('7', '1', '0', '1', '', '0-0', 'default', 'asc', '20200820', '1597937502'), ('8', '1', '0', '577', '', '0-0', 'default', 'asc', '20200821', '1597976008'), ('9', '1', '0', '72', '', '0-0', 'default', 'asc', '20200821', '1597976013'), ('10', '1', '0', '72', '', '0-0', 'default', 'asc', '20200821', '1597976023'), ('11', '1', '0', '0', '', '0-0', 'default', 'asc', '20200823', '1598194642'), ('12', '1', '0', '0', '', '0-0', 'default', 'asc', '20200823', '1598194644'), ('13', '1', '0', '0', '', '0-0', 'default', 'asc', '20200823', '1598194645'), ('14', '1', '0', '0', '', '0-0', 'default', 'asc', '20200826', '1598417320'), ('15', '1', '0', '0', 'erer', '0-0', 'default', 'asc', '20200826', '1598417323'), ('16', '1', '0', '0', 'erer', '0-0', 'default', 'asc', '20200826', '1598417324'), ('17', '1', '0', '0', 'erer', '0-0', 'default', 'asc', '20200826', '1598417325'), ('18', '1', '0', '0', 'erer', '0-0', 'default', 'asc', '20200826', '1598417325'), ('19', '1', '0', '0', 'erer', '0-0', 'default', 'asc', '20200826', '1598417326'), ('20', '1', '0', '0', '', '0-0', 'default', 'asc', '20200826', '1598417400'), ('21', '1', '0', '0', '', '0-0', 'id', 'desc', '20200826', '1598417403'), ('22', '1', '0', '0', '', '0-0', 'min_price', 'desc', '20200826', '1598417403'), ('23', '1', '0', '0', '', '0-0', 'id', 'desc', '20200826', '1598417404'), ('24', '1', '0', '0', 'erer', '0-0', 'default', 'asc', '20200826', '1598419569'), ('25', '1', '0', '0', 'erer', '0-0', 'default', 'asc', '20200826', '1598419572'), ('26', '1', '0', '0', 'erer', '0-0', 'default', 'asc', '20200826', '1598419586'), ('27', '1', '0', '0', 'erer', '0-0', 'default', 'asc', '20200826', '1598419588'), ('28', '1', '0', '0', '', '0-0', 'default', 'asc', '20200826', '1598420439'), ('29', '1', '0', '0', '', '0-0', 'default', 'asc', '20200826', '1598420488'), ('30', '1', '0', '0', '', '0-0', 'default', 'asc', '20200827', '1598516412'), ('31', '1', '0', '0', '连衣裙', '0-0', 'default', 'asc', '20200827', '1598516468'), ('32', '1', '0', '0', '连衣裙', '0-0', 'default', 'asc', '20200827', '1598516474'), ('33', '0', '0', '0', '连衣裙', '0-0', 'default', 'asc', '20200827', '1598536054'), ('34', '0', '0', '0', '帐篷', '0-0', 'default', 'asc', '20200827', '1598536059'), ('35', '0', '0', '0', '', '0-0', 'default', 'asc', '20200827', '1598538669'), ('36', '0', '0', '0', '连衣裙', '0-0', 'default', 'asc', '20200827', '1598538692'), ('37', '0', '0', '0', '', '0-0', 'default', 'asc', '20200827', '1598538869'), ('38', '1', '0', '0', '', '0-0', 'default', 'asc', '20200830', '1598764172'), ('39', '1', '0', '0', '', '0-0', 'default', 'asc', '20200902', '1599037073'), ('40', '1', '0', '0', '', '0-0', 'default', 'asc', '20200902', '1599037078'), ('41', '1', '0', '0', '', '0-0', 'default', 'asc', '20200903', '1599130030'), ('42', '1', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599718816'), ('43', '1', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599718818'), ('44', '0', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599727567'), ('45', '1', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599728784'), ('46', '0', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599728969'), ('47', '1', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599729479'), ('48', '1', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599729487'), ('49', '1', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599729492'), ('50', '1', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599729500'), ('51', '0', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599729512'), ('52', '0', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599729513'), ('53', '0', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599729515'), ('54', '0', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599729517'), ('55', '1', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599731530'), ('56', '1', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599731652'), ('57', '1', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599731671'), ('58', '1', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599731689'), ('59', '1', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599731840'), ('60', '1', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599732202'), ('61', '0', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599735445'), ('62', '0', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599746834'), ('63', '0', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599746834'), ('64', '0', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599746856'), ('65', '0', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599746856'), ('66', '0', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599746859'), ('67', '0', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599746859'), ('68', '0', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599746945'), ('69', '0', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599746946'), ('70', '0', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599746960'), ('71', '1', '0', '1', '', '0-0', 'default', 'asc', '20200911', '1599786921'), ('72', '1', '0', '0', '', '0-0', 'default', 'asc', '20200911', '1599798480'), ('73', '0', '0', '0', '', '0-0', 'default', 'asc', '20200911', '1599807829'), ('74', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896302'), ('75', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896303'), ('76', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896304'), ('77', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896394'), ('78', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896400'), ('79', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896401'), ('80', '1', '0', '0', 'w', '0-0', 'default', 'asc', '20200912', '1599896403'), ('81', '1', '0', '0', 'w', '0-0', 'default', 'asc', '20200912', '1599896403'), ('82', '1', '0', '0', '连衣裙', '0-0', 'default', 'asc', '20200912', '1599896406'), ('83', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896470'), ('84', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896471'), ('85', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896472'), ('86', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896496'), ('87', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896497'), ('88', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896502'), ('89', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896503'), ('90', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896504'), ('91', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896506'), ('92', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896507'), ('93', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896535'), ('94', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599897057'), ('95', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599897060'), ('96', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599897066'), ('97', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599897079'), ('98', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599897079'), ('99', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599897105'), ('100', '1', '0', '0', 'erwrreaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaewrer dff', '0-0', 'default', 'asc', '20200912', '1599897120'), ('101', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599897124'), ('102', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599897267'), ('103', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898363'), ('104', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898365'), ('105', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898368'), ('106', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898368'), ('107', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898370'), ('108', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898377'), ('109', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898378'), ('110', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898379'), ('111', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898389'), ('112', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898420'), ('113', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898508'), ('114', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898518'), ('115', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898569'), ('116', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898570'), ('117', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898571'), ('118', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898572'), ('119', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898573'), ('120', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898574'), ('121', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898575'), ('122', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898577'), ('123', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898578'), ('124', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898580'), ('125', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599899490'), ('126', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599899493'), ('127', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599899507'), ('128', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599899532'), ('129', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599899538'), ('130', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599899562'), ('131', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599899575'), ('132', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599899575'), ('133', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599899576'), ('134', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599899576'), ('135', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599899577'), ('136', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599899607'), ('137', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599899934'), ('138', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599901150'), ('139', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599902890'), ('140', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599902892'), ('141', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599902893'), ('142', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599902894'), ('143', '1', '0', '0', '帐篷', '0-0', 'default', 'asc', '20200912', '1599902895'), ('144', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599903086'), ('145', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599903109'), ('146', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599903210'), ('147', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599914151'), ('148', '1', '0', '0', '', '0-0', 'default', 'asc', '20200914', '1600047467'), ('149', '0', '0', '0', '夏装女装古力娜扎明星同款一字领露肩蓝色蕾丝修身显瘦连衣裙礼服', '0-0', '', '', '20200914', '1600066075'), ('150', '2', '0', '0', '', '0-0', '', '', '20200914', '1600066728'), ('151', '0', '0', '1', '', '0-0', 'default', 'asc', '20200915', '1600151389'), ('152', '0', '0', '2', '', '0-0', 'default', 'asc', '20200915', '1600151395'), ('153', '0', '0', '2', '', '0-0', 'default', 'asc', '20200915', '1600151455'), ('154', '0', '0', '1', '', '0-0', 'default', 'asc', '20200915', '1600153457'), ('155', '0', '0', '2', '', '0-0', 'default', 'asc', '20200915', '1600153465'), ('156', '0', '0', '2', '', '0-0', 'default', 'asc', '20200915', '1600153469'), ('157', '0', '0', '0', '连衣裙', '0-0', 'default', 'asc', '20200915', '1600160415'), ('158', '0', '0', '0', '帐篷', '0-0', 'default', 'asc', '20200915', '1600160418'), ('159', '0', '0', '0', 'iphone', '0-0', 'default', 'asc', '20200915', '1600160423'), ('160', '0', '0', '0', '包包', '0-0', 'default', 'asc', '20200915', '1600160425'), ('161', '0', '0', '0', '相机', '0-0', 'default', 'asc', '20200915', '1600160461'), ('162', '0', '0', '0', 'iphone', '0-0', 'default', 'asc', '20200915', '1600160463'), ('163', '0', '0', '0', '小米', '0-0', 'default', 'asc', '20200915', '1600160465'), ('164', '0', '0', '0', '手机', '0-0', 'default', 'asc', '20200915', '1600160467'), ('165', '0', '0', '0', '相机', '0-0', 'default', 'asc', '20200915', '1600160469'), ('166', '0', '0', '0', '手机', '0-0', 'default', 'asc', '20200915', '1600160471'), ('167', '0', '0', '0', '手机', '0-0', 'default', 'asc', '20200915', '1600160486'), ('168', '0', '0', '0', 'vivo', '0-0', 'default', 'asc', '20200915', '1600160490'), ('169', '0', '0', '0', 'iphone', '0-0', 'default', 'asc', '20200915', '1600160492'), ('170', '0', '0', '0', '华为', '0-0', 'default', 'asc', '20200915', '1600160493'), ('171', '0', '0', '0', '小米', '0-0', 'default', 'asc', '20200915', '1600160495'), ('172', '0', '0', '0', '手机', '0-0', 'default', 'asc', '20200915', '1600160496'), ('173', '0', '0', '1', '', '0-0', 'default', 'asc', '20200915', '1600160499'), ('174', '0', '0', '0', 'vivo', '0-0', 'default', 'asc', '20200915', '1600160501'), ('175', '0', '0', '0', 'iphone', '0-0', 'default', 'asc', '20200915', '1600160502'), ('176', '0', '0', '0', 'ds的第三方,地方', '0-0', 'default', 'asc', '20200915', '1600160509'), ('177', '0', '0', '0', '包包', '0-0', 'default', 'asc', '20200915', '1600160538'), ('178', '0', '0', '0', '斜挎 短袖', '0-0', 'default', 'asc', '20200915', '1600160593'), ('179', '0', '0', '0', '手机', '0-0', 'default', 'asc', '20200915', '1600160651'), ('180', '0', '0', '0', '小米', '0-0', 'default', 'asc', '20200915', '1600160652'), ('181', '0', '0', '0', '华为', '0-0', 'default', 'asc', '20200915', '1600160653'), ('182', '0', '0', '0', 'iphone', '0-0', 'default', 'asc', '20200915', '1600160655'), ('183', '0', '0', '0', 'vivo', '0-0', 'default', 'asc', '20200915', '1600160656'), ('184', '0', '0', '1', '', '0-0', 'default', 'asc', '20200915', '1600160657'), ('185', '0', '0', '0', '女装', '0-0', 'default', 'asc', '20200915', '1600161015'), ('186', '0', '0', '0', '', '0-0', 'default', 'asc', '20200915', '1600161246'), ('187', '0', '0', '0', '', '0-0', 'default', 'asc', '20200915', '1600161454'), ('188', '1', '0', '0', '', '0-0', 'default', 'asc', '20200916', '1600244355'), ('189', '0', '0', '0', '1', '0-0', '', '', '20200918', '1600416216'), ('190', '1', '0', '0', '', '0-0', 'default', 'asc', '20200923', '1600836120'), ('191', '1', '0', '0', '', '0-0', 'default', 'asc', '20200923', '1600836122'), ('192', '1', '0', '0', '', '0-0', 'default', 'asc', '20200924', '1600955827'), ('193', '1', '0', '0', '', '0-0', 'default', 'asc', '20200925', '1601005179'), ('194', '0', '0', '0', '', '0-0', 'default', 'asc', '20200925', '1601026070'), ('195', '0', '0', '0', '', '0-0', 'default', 'asc', '20200925', '1601026072'), ('196', '0', '0', '0', '', '0-0', 'default', 'asc', '20200926', '1601132528'), ('197', '0', '0', '0', '', '0-0', 'default', 'asc', '20200926', '1601132545'), ('198', '0', '0', '0', '', '0-0', 'default', 'asc', '20200926', '1601132549'), ('199', '0', '0', '0', '', '0-0', 'default', 'asc', '20200926', '1601132581'), ('200', '0', '0', '0', '', '0-0', 'default', 'asc', '20200927', '1601171720'), ('201', '0', '0', '0', '', '0-0', 'default', 'asc', '20200927', '1601171733'), ('202', '0', '0', '0', '', '0-0', 'default', 'asc', '20200927', '1601171736'), ('203', '1', '0', '0', '', '0-0', 'default', 'asc', '20200927', '1601215996'), ('204', '4', '0', '0', '', '0-0', 'default', 'asc', '20200927', '1601216275'), ('205', '1', '0', '0', '', '0-0', 'default', 'asc', '20200928', '1601273526'), ('206', '1', '0', '0', '', '0-0', 'default', 'asc', '20200928', '1601273531'), ('207', '1', '0', '0', '', '0-0', 'default', 'asc', '20200928', '1601288562'), ('208', '1', '0', '1', '', '0-0', 'default', 'asc', '20200928', '1601288569'), ('209', '1', '0', '0', '连衣裙', '0-0', 'default', 'asc', '20200928', '1601288571'), ('210', '1', '0', '0', '连衣裙', '0-0', 'default', 'asc', '20200928', '1601288573'), ('211', '1', '0', '1', '', '0-0', 'default', 'asc', '20200928', '1601288763'), ('212', '1', '0', '1', '', '0-0', 'default', 'asc', '20200928', '1601288763'), ('213', '1', '0', '1', '', '0-0', 'default', 'asc', '20200928', '1601288764'), ('214', '1', '0', '1', '', '0-0', 'default', 'asc', '20200928', '1601290127'), ('215', '1', '2', '1', '', '0-0', 'default', 'asc', '20200928', '1601290129'), ('216', '1', '0', '3', '', '0-0', 'default', 'asc', '20200928', '1601290131'), ('217', '1', '0', '0', '连衣裙', '0-0', 'default', 'asc', '20200928', '1601290132'), ('218', '1', '0', '0', '帐篷', '0-0', 'default', 'asc', '20200928', '1601290135'), ('219', '1', '0', '1', '', '0-0', 'default', 'asc', '20200928', '1601290139'), ('220', '1', '0', '2', '', '0-0', 'default', 'asc', '20200928', '1601303979'), ('221', '1', '0', '0', '连衣裙', '0-0', 'default', 'asc', '20200930', '1601449164'), ('222', '1', '0', '0', '', '0-0', 'default', 'asc', '20201003', '1601702434'), ('223', '1', '0', '0', '', '0-0', 'default', 'asc', '20201003', '1601731805'), ('224', '1', '0', '0', '', '0-0', 'default', 'asc', '20201003', '1601736239'), ('225', '1', '0', '2', '', '0-0', 'default', 'asc', '20201003', '1601737133'), ('226', '1', '0', '0', '', '0-0', 'default', 'asc', '20201003', '1601737220');
+INSERT INTO `s_search_history` VALUES ('1', '1', '0', '0', '', '0-0', 'default', 'asc', '20200819', '1597847691'), ('2', '1', '0', '0', '', '0-0', 'default', 'asc', '20200819', '1597847693'), ('3', '1', '0', '0', '', '0-0', 'default', 'asc', '20200819', '1597847903'), ('4', '1', '0', '0', '', '0-0', 'default', 'asc', '20200819', '1597847903'), ('5', '1', '0', '0', '', '0-0', 'default', 'asc', '20200819', '1597847904'), ('6', '1', '0', '0', '', '0-0', 'default', 'asc', '20200819', '1597847904'), ('7', '1', '0', '1', '', '0-0', 'default', 'asc', '20200820', '1597937502'), ('8', '1', '0', '577', '', '0-0', 'default', 'asc', '20200821', '1597976008'), ('9', '1', '0', '72', '', '0-0', 'default', 'asc', '20200821', '1597976013'), ('10', '1', '0', '72', '', '0-0', 'default', 'asc', '20200821', '1597976023'), ('11', '1', '0', '0', '', '0-0', 'default', 'asc', '20200823', '1598194642'), ('12', '1', '0', '0', '', '0-0', 'default', 'asc', '20200823', '1598194644'), ('13', '1', '0', '0', '', '0-0', 'default', 'asc', '20200823', '1598194645'), ('14', '1', '0', '0', '', '0-0', 'default', 'asc', '20200826', '1598417320'), ('15', '1', '0', '0', 'erer', '0-0', 'default', 'asc', '20200826', '1598417323'), ('16', '1', '0', '0', 'erer', '0-0', 'default', 'asc', '20200826', '1598417324'), ('17', '1', '0', '0', 'erer', '0-0', 'default', 'asc', '20200826', '1598417325'), ('18', '1', '0', '0', 'erer', '0-0', 'default', 'asc', '20200826', '1598417325'), ('19', '1', '0', '0', 'erer', '0-0', 'default', 'asc', '20200826', '1598417326'), ('20', '1', '0', '0', '', '0-0', 'default', 'asc', '20200826', '1598417400'), ('21', '1', '0', '0', '', '0-0', 'id', 'desc', '20200826', '1598417403'), ('22', '1', '0', '0', '', '0-0', 'min_price', 'desc', '20200826', '1598417403'), ('23', '1', '0', '0', '', '0-0', 'id', 'desc', '20200826', '1598417404'), ('24', '1', '0', '0', 'erer', '0-0', 'default', 'asc', '20200826', '1598419569'), ('25', '1', '0', '0', 'erer', '0-0', 'default', 'asc', '20200826', '1598419572'), ('26', '1', '0', '0', 'erer', '0-0', 'default', 'asc', '20200826', '1598419586'), ('27', '1', '0', '0', 'erer', '0-0', 'default', 'asc', '20200826', '1598419588'), ('28', '1', '0', '0', '', '0-0', 'default', 'asc', '20200826', '1598420439'), ('29', '1', '0', '0', '', '0-0', 'default', 'asc', '20200826', '1598420488'), ('30', '1', '0', '0', '', '0-0', 'default', 'asc', '20200827', '1598516412'), ('31', '1', '0', '0', '连衣裙', '0-0', 'default', 'asc', '20200827', '1598516468'), ('32', '1', '0', '0', '连衣裙', '0-0', 'default', 'asc', '20200827', '1598516474'), ('33', '0', '0', '0', '连衣裙', '0-0', 'default', 'asc', '20200827', '1598536054'), ('34', '0', '0', '0', '帐篷', '0-0', 'default', 'asc', '20200827', '1598536059'), ('35', '0', '0', '0', '', '0-0', 'default', 'asc', '20200827', '1598538669'), ('36', '0', '0', '0', '连衣裙', '0-0', 'default', 'asc', '20200827', '1598538692'), ('37', '0', '0', '0', '', '0-0', 'default', 'asc', '20200827', '1598538869'), ('38', '1', '0', '0', '', '0-0', 'default', 'asc', '20200830', '1598764172'), ('39', '1', '0', '0', '', '0-0', 'default', 'asc', '20200902', '1599037073'), ('40', '1', '0', '0', '', '0-0', 'default', 'asc', '20200902', '1599037078'), ('41', '1', '0', '0', '', '0-0', 'default', 'asc', '20200903', '1599130030'), ('42', '1', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599718816'), ('43', '1', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599718818'), ('44', '0', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599727567'), ('45', '1', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599728784'), ('46', '0', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599728969'), ('47', '1', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599729479'), ('48', '1', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599729487'), ('49', '1', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599729492'), ('50', '1', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599729500'), ('51', '0', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599729512'), ('52', '0', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599729513'), ('53', '0', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599729515'), ('54', '0', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599729517'), ('55', '1', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599731530'), ('56', '1', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599731652'), ('57', '1', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599731671'), ('58', '1', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599731689'), ('59', '1', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599731840'), ('60', '1', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599732202'), ('61', '0', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599735445'), ('62', '0', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599746834'), ('63', '0', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599746834'), ('64', '0', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599746856'), ('65', '0', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599746856'), ('66', '0', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599746859'), ('67', '0', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599746859'), ('68', '0', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599746945'), ('69', '0', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599746946'), ('70', '0', '0', '0', '', '0-0', 'default', 'asc', '20200910', '1599746960'), ('71', '1', '0', '1', '', '0-0', 'default', 'asc', '20200911', '1599786921'), ('72', '1', '0', '0', '', '0-0', 'default', 'asc', '20200911', '1599798480'), ('73', '0', '0', '0', '', '0-0', 'default', 'asc', '20200911', '1599807829'), ('74', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896302'), ('75', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896303'), ('76', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896304'), ('77', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896394'), ('78', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896400'), ('79', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896401'), ('80', '1', '0', '0', 'w', '0-0', 'default', 'asc', '20200912', '1599896403'), ('81', '1', '0', '0', 'w', '0-0', 'default', 'asc', '20200912', '1599896403'), ('82', '1', '0', '0', '连衣裙', '0-0', 'default', 'asc', '20200912', '1599896406'), ('83', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896470'), ('84', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896471'), ('85', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896472'), ('86', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896496'), ('87', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896497'), ('88', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896502'), ('89', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896503'), ('90', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896504'), ('91', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896506'), ('92', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896507'), ('93', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599896535'), ('94', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599897057'), ('95', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599897060'), ('96', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599897066'), ('97', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599897079'), ('98', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599897079'), ('99', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599897105'), ('100', '1', '0', '0', 'erwrreaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaewrer dff', '0-0', 'default', 'asc', '20200912', '1599897120'), ('101', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599897124'), ('102', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599897267'), ('103', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898363'), ('104', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898365'), ('105', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898368'), ('106', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898368'), ('107', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898370'), ('108', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898377'), ('109', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898378'), ('110', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898379'), ('111', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898389'), ('112', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898420'), ('113', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898508'), ('114', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898518'), ('115', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898569'), ('116', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898570'), ('117', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898571'), ('118', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898572'), ('119', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898573'), ('120', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898574'), ('121', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898575'), ('122', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898577'), ('123', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898578'), ('124', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599898580'), ('125', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599899490'), ('126', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599899493'), ('127', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599899507'), ('128', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599899532'), ('129', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599899538'), ('130', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599899562'), ('131', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599899575'), ('132', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599899575'), ('133', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599899576'), ('134', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599899576'), ('135', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599899577'), ('136', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599899607'), ('137', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599899934'), ('138', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599901150'), ('139', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599902890'), ('140', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599902892'), ('141', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599902893'), ('142', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599902894'), ('143', '1', '0', '0', '帐篷', '0-0', 'default', 'asc', '20200912', '1599902895'), ('144', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599903086'), ('145', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599903109'), ('146', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599903210'), ('147', '1', '0', '0', '', '0-0', 'default', 'asc', '20200912', '1599914151'), ('148', '1', '0', '0', '', '0-0', 'default', 'asc', '20200914', '1600047467'), ('149', '0', '0', '0', '夏装女装古力娜扎明星同款一字领露肩蓝色蕾丝修身显瘦连衣裙礼服', '0-0', '', '', '20200914', '1600066075'), ('150', '2', '0', '0', '', '0-0', '', '', '20200914', '1600066728'), ('151', '0', '0', '1', '', '0-0', 'default', 'asc', '20200915', '1600151389'), ('152', '0', '0', '2', '', '0-0', 'default', 'asc', '20200915', '1600151395'), ('153', '0', '0', '2', '', '0-0', 'default', 'asc', '20200915', '1600151455'), ('154', '0', '0', '1', '', '0-0', 'default', 'asc', '20200915', '1600153457'), ('155', '0', '0', '2', '', '0-0', 'default', 'asc', '20200915', '1600153465'), ('156', '0', '0', '2', '', '0-0', 'default', 'asc', '20200915', '1600153469'), ('157', '0', '0', '0', '连衣裙', '0-0', 'default', 'asc', '20200915', '1600160415'), ('158', '0', '0', '0', '帐篷', '0-0', 'default', 'asc', '20200915', '1600160418'), ('159', '0', '0', '0', 'iphone', '0-0', 'default', 'asc', '20200915', '1600160423'), ('160', '0', '0', '0', '包包', '0-0', 'default', 'asc', '20200915', '1600160425'), ('161', '0', '0', '0', '相机', '0-0', 'default', 'asc', '20200915', '1600160461'), ('162', '0', '0', '0', 'iphone', '0-0', 'default', 'asc', '20200915', '1600160463'), ('163', '0', '0', '0', '小米', '0-0', 'default', 'asc', '20200915', '1600160465'), ('164', '0', '0', '0', '手机', '0-0', 'default', 'asc', '20200915', '1600160467'), ('165', '0', '0', '0', '相机', '0-0', 'default', 'asc', '20200915', '1600160469'), ('166', '0', '0', '0', '手机', '0-0', 'default', 'asc', '20200915', '1600160471'), ('167', '0', '0', '0', '手机', '0-0', 'default', 'asc', '20200915', '1600160486'), ('168', '0', '0', '0', 'vivo', '0-0', 'default', 'asc', '20200915', '1600160490'), ('169', '0', '0', '0', 'iphone', '0-0', 'default', 'asc', '20200915', '1600160492'), ('170', '0', '0', '0', '华为', '0-0', 'default', 'asc', '20200915', '1600160493'), ('171', '0', '0', '0', '小米', '0-0', 'default', 'asc', '20200915', '1600160495'), ('172', '0', '0', '0', '手机', '0-0', 'default', 'asc', '20200915', '1600160496'), ('173', '0', '0', '1', '', '0-0', 'default', 'asc', '20200915', '1600160499'), ('174', '0', '0', '0', 'vivo', '0-0', 'default', 'asc', '20200915', '1600160501'), ('175', '0', '0', '0', 'iphone', '0-0', 'default', 'asc', '20200915', '1600160502'), ('176', '0', '0', '0', 'ds的第三方,地方', '0-0', 'default', 'asc', '20200915', '1600160509'), ('177', '0', '0', '0', '包包', '0-0', 'default', 'asc', '20200915', '1600160538'), ('178', '0', '0', '0', '斜挎 短袖', '0-0', 'default', 'asc', '20200915', '1600160593'), ('179', '0', '0', '0', '手机', '0-0', 'default', 'asc', '20200915', '1600160651'), ('180', '0', '0', '0', '小米', '0-0', 'default', 'asc', '20200915', '1600160652'), ('181', '0', '0', '0', '华为', '0-0', 'default', 'asc', '20200915', '1600160653'), ('182', '0', '0', '0', 'iphone', '0-0', 'default', 'asc', '20200915', '1600160655'), ('183', '0', '0', '0', 'vivo', '0-0', 'default', 'asc', '20200915', '1600160656'), ('184', '0', '0', '1', '', '0-0', 'default', 'asc', '20200915', '1600160657'), ('185', '0', '0', '0', '女装', '0-0', 'default', 'asc', '20200915', '1600161015'), ('186', '0', '0', '0', '', '0-0', 'default', 'asc', '20200915', '1600161246'), ('187', '0', '0', '0', '', '0-0', 'default', 'asc', '20200915', '1600161454'), ('188', '1', '0', '0', '', '0-0', 'default', 'asc', '20200916', '1600244355'), ('189', '0', '0', '0', '1', '0-0', '', '', '20200918', '1600416216'), ('190', '1', '0', '0', '', '0-0', 'default', 'asc', '20200923', '1600836120'), ('191', '1', '0', '0', '', '0-0', 'default', 'asc', '20200923', '1600836122'), ('192', '1', '0', '0', '', '0-0', 'default', 'asc', '20200924', '1600955827'), ('193', '1', '0', '0', '', '0-0', 'default', 'asc', '20200925', '1601005179'), ('194', '0', '0', '0', '', '0-0', 'default', 'asc', '20200925', '1601026070'), ('195', '0', '0', '0', '', '0-0', 'default', 'asc', '20200925', '1601026072'), ('196', '0', '0', '0', '', '0-0', 'default', 'asc', '20200926', '1601132528'), ('197', '0', '0', '0', '', '0-0', 'default', 'asc', '20200926', '1601132545'), ('198', '0', '0', '0', '', '0-0', 'default', 'asc', '20200926', '1601132549'), ('199', '0', '0', '0', '', '0-0', 'default', 'asc', '20200926', '1601132581'), ('200', '0', '0', '0', '', '0-0', 'default', 'asc', '20200927', '1601171720'), ('201', '0', '0', '0', '', '0-0', 'default', 'asc', '20200927', '1601171733'), ('202', '0', '0', '0', '', '0-0', 'default', 'asc', '20200927', '1601171736'), ('203', '1', '0', '0', '', '0-0', 'default', 'asc', '20200927', '1601215996'), ('204', '4', '0', '0', '', '0-0', 'default', 'asc', '20200927', '1601216275'), ('205', '1', '0', '0', '', '0-0', 'default', 'asc', '20200928', '1601273526'), ('206', '1', '0', '0', '', '0-0', 'default', 'asc', '20200928', '1601273531'), ('207', '1', '0', '0', '', '0-0', 'default', 'asc', '20200928', '1601288562'), ('208', '1', '0', '1', '', '0-0', 'default', 'asc', '20200928', '1601288569'), ('209', '1', '0', '0', '连衣裙', '0-0', 'default', 'asc', '20200928', '1601288571'), ('210', '1', '0', '0', '连衣裙', '0-0', 'default', 'asc', '20200928', '1601288573'), ('211', '1', '0', '1', '', '0-0', 'default', 'asc', '20200928', '1601288763'), ('212', '1', '0', '1', '', '0-0', 'default', 'asc', '20200928', '1601288763'), ('213', '1', '0', '1', '', '0-0', 'default', 'asc', '20200928', '1601288764'), ('214', '1', '0', '1', '', '0-0', 'default', 'asc', '20200928', '1601290127'), ('215', '1', '2', '1', '', '0-0', 'default', 'asc', '20200928', '1601290129'), ('216', '1', '0', '3', '', '0-0', 'default', 'asc', '20200928', '1601290131'), ('217', '1', '0', '0', '连衣裙', '0-0', 'default', 'asc', '20200928', '1601290132'), ('218', '1', '0', '0', '帐篷', '0-0', 'default', 'asc', '20200928', '1601290135'), ('219', '1', '0', '1', '', '0-0', 'default', 'asc', '20200928', '1601290139'), ('220', '1', '0', '2', '', '0-0', 'default', 'asc', '20200928', '1601303979'), ('221', '1', '0', '0', '连衣裙', '0-0', 'default', 'asc', '20200930', '1601449164'), ('222', '1', '0', '0', '', '0-0', 'default', 'asc', '20201003', '1601702434'), ('223', '1', '0', '0', '', '0-0', 'default', 'asc', '20201003', '1601731805'), ('224', '1', '0', '0', '', '0-0', 'default', 'asc', '20201003', '1601736239'), ('225', '1', '0', '2', '', '0-0', 'default', 'asc', '20201003', '1601737133'), ('226', '1', '0', '0', '', '0-0', 'default', 'asc', '20201003', '1601737220'), ('227', '1', '0', '0', '', '0-0', 'default', 'asc', '20201007', '1602060382'), ('228', '1', '0', '0', '', '0-0', 'default', 'asc', '20201009', '1602234230');
COMMIT;
-- ----------------------------
@@ -2041,7 +2096,7 @@ CREATE TABLE `s_user` (
-- Records of `s_user`
-- ----------------------------
BEGIN;
-INSERT INTO `s_user` VALUES ('1', '', '', '', '', '', '', '', '', '0', '320878', '8e1b7b8d181d3817263af7a24caa22fc', '', 'qqqqqq', '', '', '', '0', '', '', '', '0', '', '18', '0', '0', '0', '0', '1597930579', '1601215938'), ('2', '', 'oB6US5SNOngn196qzb3lagEBTh6w', '', '', 'Y0c5fqLqrvtNsovp0GsHezPUHf', '', '', '', '0', '', '', '90c9c43f6d2f02298fd7cc34fe14300a', '', '雨声', '17602128368', '', '2', 'https://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTLyAtj7FMjZYFhr3FADapWV8TibSNWVRVYFmAEJGg4bYgw0WMx4cibF7Rfz2yl1Blta8K7r3qFF1nDw/132', 'Shanghai', '', '0', '', '0', '0', '0', '0', '0', '1599460239', '1600957618'), ('3', '', '', '', '', '', '', '27EEB7CAB1B5EF312BD73DAF41A7AA8D', '', '0', '', '', '520d2c479661a3ebc78da3a739370669', '', 'ShopXO@纵之格', '', '', '2', 'https://thirdqq.qlogo.cn/qqapp/1110736292/27EEB7CAB1B5EF312BD73DAF41A7AA8D/100', '上海', '', '0', '', '0', '0', '0', '0', '0', '1600519271', '1600524852'), ('4', '', '', '', '', '', '', '', '', '0', '927076', 'd4668670105d080758b5424d382e6a30', '', 'vvvvvv', '', '', '', '0', '', '', '', '0', '', '200', '0', '1', '0', '0', '1601216217', '1601216217');
+INSERT INTO `s_user` VALUES ('1', '', '', '', '', '', '', '', '', '0', '325386', '8acce9679d84e637b279f8df49aea14f', '', 'qqqqqq', '', '', '', '0', '', '', '', '0', '', '18', '0', '0', '0', '0', '1597930579', '1602074770'), ('2', '', 'oB6US5SNOngn196qzb3lagEBTh6w', '', '', 'Y0c5fqLqrvtNsovp0GsHezPUHf', '', '', '', '0', '', '', '90c9c43f6d2f02298fd7cc34fe14300a', '', '雨声', '17602128368', '', '2', 'https://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTLyAtj7FMjZYFhr3FADapWV8TibSNWVRVYFmAEJGg4bYgw0WMx4cibF7Rfz2yl1Blta8K7r3qFF1nDw/132', 'Shanghai', '', '0', '', '0', '0', '0', '0', '0', '1599460239', '1600957618'), ('3', '', '', '', '', '', '', '27EEB7CAB1B5EF312BD73DAF41A7AA8D', '', '0', '', '', '520d2c479661a3ebc78da3a739370669', '', 'ShopXO@纵之格', '', '', '2', 'https://thirdqq.qlogo.cn/qqapp/1110736292/27EEB7CAB1B5EF312BD73DAF41A7AA8D/100', '上海', '', '0', '', '0', '0', '0', '0', '0', '1600519271', '1600524852'), ('4', '', '', '', '', '', '', '', '', '0', '927076', 'd4668670105d080758b5424d382e6a30', '', 'vvvvvv', '', '', '', '0', '', '', '', '0', '', '200', '0', '1', '0', '0', '1601216217', '1601216217');
COMMIT;
-- ----------------------------
diff --git a/extend/base/Behavior.php b/extend/base/Behavior.php
index 2c42cdfae..788301762 100755
--- a/extend/base/Behavior.php
+++ b/extend/base/Behavior.php
@@ -286,7 +286,10 @@ class Behavior
*/
public function GetUserCookie()
{
- if(!empty($_COOKIE['behavior_user_cookie'])) return $_COOKIE['behavior_user_cookie'];
+ if(!empty($_COOKIE['behavior_user_cookie']))
+ {
+ return $_COOKIE['behavior_user_cookie'];
+ }
$user_cookie = $this->GetUserNumberRand();
setcookie('behavior_user_cookie', $user_cookie);
diff --git a/extend/payment/Weixin.php b/extend/payment/Weixin.php
index f41cb3b5b..7cb324cd4 100755
--- a/extend/payment/Weixin.php
+++ b/extend/payment/Weixin.php
@@ -165,7 +165,7 @@ class Weixin
$client_type = ApplicationClientType();
// 微信中打开
- if($client_type == 'h5' && IsWeixinEnv())
+ if($client_type == 'h5' && IsWeixinEnv() && (empty($params['user']) || empty($params['user']['weixin_web_openid'])))
{
exit(header('location:'.PluginsHomeUrl('weixinwebauthorization', 'pay', 'index', input())));
}
@@ -436,7 +436,7 @@ class Weixin
// 微信中打开
if($client_type == 'h5' && IsWeixinEnv())
{
- $type_all['pc'] = $type_all['weixin'];
+ $type_all['h5'] = $type_all['weixin'];
}
return isset($type_all[$client_type]) ? $type_all[$client_type] : '';
diff --git a/public/static/common/css/common.css b/public/static/common/css/common.css
index 212742708..39f3dd143 100755
--- a/public/static/common/css/common.css
+++ b/public/static/common/css/common.css
@@ -637,6 +637,31 @@ button.colorpicker-submit img {
margin-top: 0;
}
+/**
+ * 表格-字段选择
+ */
+.form-table-fields-select-container {
+ height: 100%;
+}
+.form-table-fields-list-container {
+ height: calc(100% - 50px);
+}
+.form-table-fields-content-container li {
+ height: 40px;
+ line-height: 40px;
+ padding: 0 10px;
+}
+.form-table-fields-content-container li:first-child {
+ border-top: 0;
+}
+.form-table-fields-button-container {
+ border-top: 1px solid #dedede;
+ height: 50px;
+}
+.form-table-fields-button-container .form-table-field-confirm-submit {
+ width: calc(100% - 130px);
+}
+
/**
* 公共联动地区组件样式
*/
diff --git a/public/static/common/js/common.js b/public/static/common/js/common.js
index b36f8cd9b..0f3eb44b3 100755
--- a/public/static/common/js/common.js
+++ b/public/static/common/js/common.js
@@ -1638,13 +1638,14 @@ function FormTableContainerInit()
* @version 1.0.0
* @date 2020-07-26
* @desc description
- * @param {[string]} form [表单名称]
+ * @param {[string]} form [表单名称]
+ * @param {[string]} tag [表单父级标签class或id]
*/
-function FromTableCheckedValues(form)
+function FromTableCheckedValues(form, tag)
{
// 获取复选框选中的值
var values = [];
- $('.am-table-scrollable-horizontal').find('input[name="'+form+'"]').each(function(key, tmp)
+ $(tag).find('input[name="'+form+'"]').each(function(key, tmp)
{
if($(this).is(':checked'))
{
@@ -1655,7 +1656,7 @@ function FromTableCheckedValues(form)
// 获取单选选中的值
if(values.length <= 0)
{
- var val = $('.am-table-scrollable-horizontal input[name="'+form+'"]:checked').val();
+ var val = $(tag).find('input[name="'+form+'"]:checked').val();
if(val != undefined)
{
values.push(val);
@@ -1686,6 +1687,83 @@ $(function()
// 表格初始化
FormTableContainerInit();
+ // 表格字段拖拽排序
+ if($('ul.form-table-fields-content-container').length > 0)
+ {
+ $('ul.form-table-fields-content-container').dragsort({ dragSelector: 'li', placeHolderTemplate: ''});
+ }
+
+ // 表格字段选择确认
+ $('.form-table-field-confirm-submit').on('click', function()
+ {
+ // 获取复选框选中的值
+ var fields = [];
+ $('.form-table-fields-list-container').find('input[name="form_field_checkbox_value"]').each(function(key, tmp)
+ {
+ fields.push({
+ "label": tmp.value,
+ "checked": $(this).is(':checked') ? 1 : 0
+ });
+ });
+
+ // 是否有选择的数据
+ if(fields.length <= 0)
+ {
+ Prompt('请先选择数据');
+ return false;
+ }
+
+ // 表单唯一md5key
+ var md5_key = $('.am-table-scrollable-horizontal').data('md5-key') || '';
+
+ // ajax请求操作
+ var $button = $(this);
+ $button.button('loading');
+ $.ajax({
+ url: $button.data('url'),
+ type: 'POST',
+ dataType: "json",
+ data: {"fields": fields, "md5_key": md5_key},
+ success: function(result)
+ {
+ if(result.code == 0)
+ {
+ Prompt(result.msg, 'success');
+ setTimeout(function()
+ {
+ window.location.reload();
+ }, 1500);
+
+ } else {
+ $button.button('reset');
+ Prompt(result.msg);
+ }
+ },
+ error: function(xhr, type)
+ {
+ $button.button('reset');
+ Prompt('网络异常出错');
+ }
+ });
+ });
+
+ // 表格字段复选框操作 全选/反选
+ $('.form-table-field-checkbox-submit').on('click', function()
+ {
+ var value = parseInt($(this).attr('data-value')) || 0;
+ if(value == 1)
+ {
+ var not_checked_text = $(this).data('not-checked-text') || '全选';
+ $(this).text(not_checked_text);
+ $('.form-table-fields-list-container ul li').find('input[type="checkbox"]').uCheck('uncheck');
+ } else {
+ var checked_text = $(this).data('checked-text') || '反选';
+ $(this).text(checked_text);
+ $('.form-table-fields-list-container ul li').find('input[type="checkbox"]').uCheck('check');
+ }
+ $(this).attr('data-value', value == 1 ? 0 : 1);
+ });
+
// 表格复选框操作 全选/反选
$('.form-table-operate-checkbox-submit').on('click', function()
{
@@ -1723,7 +1801,7 @@ $(function()
}
// 是否有选择的数据
- var values = FromTableCheckedValues(form);
+ var values = FromTableCheckedValues(form, '.am-table-scrollable-horizontal');
if(values.length <= 0)
{
Prompt('请先选中数据');
diff --git a/public/static/index/default/js/order.js b/public/static/index/default/js/order.js
index 89c889210..aae883f17 100755
--- a/public/static/index/default/js/order.js
+++ b/public/static/index/default/js/order.js
@@ -95,7 +95,7 @@ $(function()
$('.batch-pay-submit').on('click', function()
{
// 是否有选择的数据
- var values = FromTableCheckedValues('order_form_checkbox_value');
+ var values = FromTableCheckedValues('order_form_checkbox_value', '.am-table-scrollable-horizontal');
if(values.length <= 0)
{
Prompt('请先选中数据');