<script>
    import base64 from './common/js/lib/base64.js';
    // 多语言引入并初始化
    import i18n from './locale/index';
    export default {
        globalData: {
            data: {
                // 基础配置
                // 数据接口请求地址
                request_url:'https://d1.shopxo.vip/',

                // 静态资源地址（如系统根目录不在public目录下面请在静态地址后面加public目录、如：https://d1.shopxo.vip/public/）
                static_url:'https://d1.shopxo.vip/',

                // 系统类型（默认default、如额外独立小程序、可与程序分身插件实现不同主体小程序及支付独立）
                system_type: 'default',

                // 基础信息
                application_title: 'ShopXO',
                application_describe: 'ShopXO Desc',

                // 默认logo、如 /static/images/common/logo.png
                application_logo: '',

                // 版本号、如: v1.0.0
                version: 'v6.7',

                // app版本信息、如: v1.0.0 20180118
                app_version_info: 'v6.7 20250926',

                // 货币价格符号
                currency_symbol: '￥',

                // 默认主题        主题颜色
                // 红色 red       #ff0036
                // 黄色 yellow    #f6c133
                // 黑色 black     #333333
                // 绿色 green     #20a53a
                // 橙色 orange    #fe6f04
                // 蓝色 blue      #1677ff
                // 棕色 brown     #8B4513
                // 紫色 purple    #623cec
                default_theme: 'red',

                // 多语言列表
                // 增加或者减少语言时
                // 1.新增一个对象，按照当前格式新增
                // 2.去lang里面各个文件去新增语言翻译
                default_language: 'zh',

                // 系统tabbar
                system_tabbar: [
                    '/pages/index/index',
                    '/pages/goods-category/goods-category',
                    '/pages/cart/cart',
                    '/pages/user/user'
                ],

                // 公共配置
                // 是否多商户店铺id
                plugins_shop_id: null,

                // 是否多门店门店id
                plugins_realstore_id: null,

                // 是否使用原生菜单（0否, 1是）
                is_use_native_tabbar: 0,

                // 购物车页面顶部导航强制关闭门店（0否, 1是）
                is_cart_header_close_realstore: 0,

                // 商品详情页底部导航是否开启购物车功能（0否, 1是）
                is_goods_bottom_opt_cart: 1,

                // 商品详情页底部导航存在指定返回参数[is_opt_back=1]展示返回按钮（0否, 1是）
                is_goods_bottom_opt_back: 1,

                // 全站阻止打开商品详情页面（0否, 1是）
                is_forbid_to_goods_detail: 0,

                // 分享及转发使用页面设置的默认图片及系统默认图片（0否, 1是）
                is_share_use_image: 1,

                // 开启浮动客服、前提是后台需要开启客服功能（0否, 1是）
                is_online_service_fixed: 1,

                // 分类页面商品列表模式一级分类使用图标类型（0 实景图, 1 icon图标, 2 大图片）
                category_goods_model_icon_type: 0,

                // 商品分类页面搜索进入独立搜索页面（0否, 1是）
                category_goods_is_search_alone: 0,

                // 商品分类页面开启购物车导航（0否, 1是）
                category_goods_is_show_cart_nav: 1,

                // 用户中心菜单默认展示模式（0 九宫格, 1 列表）
                user_center_nav_show_model_type: 0,

                // 商品列表是否展示购物车（0否, 1是）
                is_goods_list_show_cart_opt: 1,

                // 分销页面地图分布是否强制获取当前位置（0否, 1是）
                is_distribution_map_force_location: 0,

                // 是否开启微信隐私弹窗授权提示、仅微信小程序有效（0否, 1是）
                is_weixin_privacy_setting: 1,
                
                // 弹出获取用户当前位置（0否, 1是）
                get_user_location_status: 0,
                get_user_location_timer: null,

                // 微信小程序打开地图使用（0否, 1是）【腾讯位置服务路线规划】插件、（需要到小程序后台设置->第三方设置->插件管理里面添加【腾讯位置服务路线规划】插件，教程 https://mp.weixin.qq.com/wxopen/plugindevdoc?appid=wx50b5593e81dd937a）
                is_weixin_open_location_use_plugins: 0,

                // 首页搜索框开启扫一扫自动（0否, 1是）仅【小程序、APP】支持
                is_home_search_scan: 1,

                // 强制使用文字作为logo（默认当前指定logo->后台站点设置手机端图片logo->后台手机管理小程序配置名称->站点设置中的站点名称）
                is_home_logo_use_text: 0,

                // 首页开启地理位置选择（0否, 1是）优先级高于logo展示
                is_home_location_choice: 0,

                // 多商户 - 店铺详情顶部导航返回按钮（0否, 1是）
                is_shop_top_nav_back: 1,

                // 多门店 - 门店详情顶部导航返回按钮（0否, 1是）
                is_realstore_top_nav_back: 1,

                // 多门店 - 门店详情搜索框内扫码加购（0否, 1是）
                is_realstore_top_search_scan: 1,

                // 多门店 - 门店详情阻止跳转到商品详情页面去（0否, 1是）
                is_realstore_forbid_to_goods_detail: 0,

                // 钱包插件货币符号使用当前 currency_symbol 数据的固定值（0否, 1是）
                is_wallet_use_fixed_currency_symbol: 0,

                // 加载是否使用骨架屏（0否, 1是）
                is_loading_use_skeleton: 0,

                // 加载动画类型（0logo, 1名称）
                loading_content_type: 0,


                // 数据缓存key
                // 场景值
                cache_scene_key: 'cache_scene_key',

                // uuid缓存key
                cache_user_uuid_key: 'cache_user_uuid_key',

                // 配置信息缓存key
                cache_config_info_key: 'cache_config_info_key',

                // 用户登录缓存key
                cache_user_login_key: 'cache_user_login_key',

                // 用户信息缓存key
                cache_user_info_key: 'cache_shop_user_info_key',

                // 设备信息缓存key
                cache_system_info_key: 'cache_shop_system_info_key',

                // 用户地址选择缓存key
                cache_buy_user_address_select_key: 'cache_buy_user_address_select_key',

                // 启动参数缓存key
                cache_launch_info_key: 'cache_shop_launch_info_key',

                // 获取位置选择缓存key
                cache_userlocation_key: 'cache_userlocation_key',

                // 地区组件选择缓存key
                cache_region_picker_choice_key: 'cache_region_picker_choice_key',

                // 时间组件选择缓存key
                cache_time_select_choice_key: 'cache_time_select_choice_key',

                // 页面支付临时缓存key
                cache_page_pay_key: 'cache_page_pay_key',

                // 上一页地址缓存key
                cache_prev_page_key: 'cache_prev_page_key',

                // tab页面切换参数
                cache_page_tabbar_switch_params: 'cache_page_tabbar_switch_params_key',

                // 用户基础资料提示间隔key
                cache_user_base_personal_interval_time_key: 'cache_user_base_personal_interval_time_key',

                // 用户购物车选择记录key
                cache_user_cart_not_use_data_key: 'cache_user_cart_not_use_data_key',

                // 未登录页面缓存记录key
                cache_user_no_login_page_status_data_key: 'cache_user_no_login_page_status_data_key',

                // app更新提示缓存记录key
                cache_app_update_tips_interval_time_key: 'cache_app_update_tips_interval_time_key',

                // app评分提示缓存记录key
                cache_app_star_tips_interval_time_key: 'cache_app_star_tips_interval_time_key',

                // 首页数据缓存key
                cache_index_data_key: 'cache_index_data_key',

                // 商品数据缓存key
                cache_goods_data_key: 'cache_goods_data_key',

                // 页面设计页面数据缓存key
                cache_design_page_data_key: 'cache_design_page_data_key',

                // 底部菜单选中索引缓存key
                cache_footer_active_key: 'cache_footer_active_key',

                // diy模块数据缓存key
                cache_diy_data_key: 'cache_diy_data_key',
                // diy页面数据缓存key
                cache_diy_page_data_key: 'cache_diy_page_data_key',

                // apptabbar底部菜单高度
                cache_app_system_tabbar_height_key: 'cache_app_system_tabbar_height_key',

                // diy底部菜单高度
                cache_app_diy_tabbar_height_key: 'cache_app_diy_tabbar_height_key',

                // apptabbar底部菜单角标数据
                cache_tabbar_badge_key: 'cache_tabbar_badge_key',

                // 搜索历史记录
                cache_search_history_key: 'cache_search_history_key',

                // 门店选择详情缓存
                cache_realstore_detail_choice_key: 'cache_realstore_detail_choice_key',

                // 互联网医院就诊人选择数据
                cache_hospital_patient_choice_value_key: 'cache_hospital_patient_choice_value_key',

                // 默认用户头像
                default_user_head_src: '/static/images/common/user.png',

                // 成功圆形提示图片
                default_round_success_icon: '/static/images/common/round-success-icon.png',

                // 错误圆形提示图片
                default_round_error_icon: '/static/images/common/round-error-icon.png',

                // 其他数据
                // 公共数是否已初始化成功
                common_data_loading_status: 0,
                common_data_init_config_back_list: [],
                common_data_init_status: 0,
                common_data_init_back_timer: null,
                // 网络状态检查
                network_type_page_record_timer: null,
                // 位置监听更新页面临时记录数据
                location_update_page_temp_record_data: [],
            },

            /**
             * 启动参数处理
             */
            launch_params_handle(params) {
                // 原有缓存
                var cache_params = this.get_launch_cache_info();
                // 当前参数、从query读取覆盖
                if ((params.query || null) != null) {
                    params = params.query;
                }
                // query下scene参数解析处理
                if ((params.scene || null) != null) {
                    params = this.url_params_to_json(decodeURIComponent(params.scene));
                }
                // 如果当前没有邀请id、但是原始缓存有邀请id、则使用缓存邀请id
                if ((params['referrer'] || null) == null && cache_params != null && (cache_params.referrer || null) != null) {
                    params['referrer'] = cache_params.referrer;
                }
                return params;
            },

            /**
             * 当前是否单页模式
             */
            is_current_single_page() {
                var scene = this.get_scene_data();
                // #ifdef MP-WEIXIN
                return scene == 1154 ? 1 : 0;
                // #endif
                return 0;
            },

            /**
             * 场景值获取
             */
            get_scene_data() {
                return uni.getStorageSync(this.data.cache_scene_key) || 0;
            },

            /**
             * 场景值设置
             */
            set_scene_data(params) {
                var scene = (params.scene || null) == null ? 0 : parseInt(params.scene);
                uni.setStorageSync(this.data.cache_scene_key, scene);
                return scene;
            },

            /**
             * 获取设备信息
             * key      指定key
             * dv       默认数据（不存在则读取、默认null）
             * is_real  是否实时读取
             */
            get_system_info(key, dv, is_real) {
                var info = null;
                if ((is_real || false) == true) {
                    info = this.set_system_info() || null;
                } else {
                    info = uni.getStorageSync(this.data.cache_system_info_key) || null;
                }
                if (info == null || (key || null) == null) {
                    return info;
                }
                return info[key] == undefined ? (dv == undefined ? null : dv) : info[key];
            },

            /**
             * 设置设备信息
             */
            set_system_info() {
                var system_info = uni.getSystemInfoSync();
                uni.setStorageSync(this.data.cache_system_info_key, system_info);
                return system_info;
            },

            /**
             * 请求地址生成
             * a              方法
             * c              控制器
             * plugins        插件标记（传参则表示为插件请求）
             * params         url请求参数
             * group          组名称（默认 api）
             */
            get_request_url(a, c, plugins, params, group) {
                a = a || 'index';
                c = c || 'index';
                // 是否插件请求、走api统一插件调用控制器
                var plugins_params = '';
                if ((plugins || null) != null) {
                    plugins_params = '&pluginsname=' + plugins + '&pluginscontrol=' + c + '&pluginsaction=' + a;
                    c = 'plugins';
                    a = 'index';
                }
                // 参数处理
                params = params || '';
                if (params != '' && params.substr(0, 1) != '&') {
                    params = '&' + params;
                }
                var url = this.data.request_url + (group || 'api') + '.php?s=' + c + '/' + a + plugins_params;
                return this.request_params_handle(url) + '&ajax=ajax' + params;
            },

            /**
             * 请求参数处理
             * url     url地址
             */
            request_params_handle(url) {
                // 拼接字符
                let query_str = '';
                // 用户信息
                let user = this.get_user_cache_info();
                let token = user == null ? '' : user.token || '';
                let uuid = this.request_uuid();
                let client_value = this.application_client_type();
                let client_brand = this.application_client_brand();
                    query_str += '&application_client_type=' + client_value + '&application_client_brand=' + client_brand+'&token=' + token+'&uuid=' + uuid;

                // 启动参数
                let params = this.get_launch_cache_info() || null;
                // 邀请信息
                if(params != null && ( params.referrer || null) != null) {
                    query_str += '&referrer=' +  params.referrer;
                }

                // 用户位置
                let user_location = this.choice_user_location_init() || null;
                if(user_location != null && (user_location.status || 0) == 1) {
                    query_str += '&user_lng=' + (user_location.lng || '') + '&user_lat=' + (user_location.lat || '');
                }

                // 当前语言
                let lang = this.get_language_value();
                    query_str += '&lang=' + lang;
                // 当前主题
                let theme = this.get_theme_value();
                    query_str += '&theme='+theme;

                // 第三方登录插件 3dsky平台跳转过来 登录token
                if(params != null && (params['mztToken'] || null) != null) {
                    query_str += '&mzt_token='+params['mztToken'];
                }

                // 拼接标识
                var join = url.indexOf('?') == -1 ? '?' : '&';
                return url + join + 'system_type=' + this.data.system_type + '&application=app'+ query_str;
            },

            /**
             * 获取tab页面切换参数
             */
            get_page_tabbar_switch_params() {
                return uni.getStorageSync(this.data.cache_page_tabbar_switch_params) || null;
            },

            /**
             * 删除tab页面切换参数
             */
            remove_page_tabbar_switch_params() {
                uni.removeStorageSync(this.data.cache_page_tabbar_switch_params);
            },

            /**
             * 是否需要登录
             * 是否需要绑定手机号码
             */
            user_is_bind_mobile(user, object, method, params, is_to_login = false) {
                if ((user || null) != null && (user.mobile || null) == null && parseInt(user.is_mandatory_bind_mobile || 0) == 1) {
                    if(is_to_login) {
                        this.login_confirm_tips_modal(this, object, method, params);
                    }
                    return true;
                }
                return false;
            },

            /**
             * 获取用户信息,信息不存在则唤醒授权
             * object     回调操作对象
             * method     回调操作对象的函数
             * params     回调操请求参数
             * return     有用户数据直接返回, 则回调调用者
             */
            get_user_info(object, method, params) {
                var user = this.get_user_cache_info();
                if (user == null) {
                    var self = this;
                    uni.getNetworkType({
                        success: function (res) {
                            if (res.networkType != 'none') {
                                // #ifdef MP
                                // 小程序唤醒用户授权
                                self.user_login(object, method, params);
                                // #endif

                                // #ifdef APP
                                // app登录注册
                                self.app_login_handle(self, object, method, params);
                                // #endif

                                // #ifdef H5
                                // h5登录注册
                                self.login_confirm_tips_modal(self, object, method, params);
                                // #endif
                            }
                        },
                    });
                    return false;
                } else {
                    // 是否需要绑定手机
                    if(this.user_is_bind_mobile(user, object, method, params, true)) {
                        return false;
                    }
                }
                return user;
            },

            // app登录处理
            app_login_handle(self, object, method, params) {
                // 是否开启一键登录服务
                if (self.get_config('plugins_base.thirdpartylogin.data.apponekeyusermobile_is_enable') == 1) {
                    uni.getProvider({
                        service: 'oauth',
                        success: function (res) {
                            if (res.provider.includes('univerify')) {
                                // 预登录检查
                                uni.preLogin({
                                    provider: 'univerify',
                                    success(res) {
                                        // 显示一键登录弹窗
                                        var theme_color = self.get_theme_color();
                                        var theme_color_light = self.get_theme_color(null, true);
                                        uni.login({
                                            provider: 'univerify',
                                            univerifyStyle: {
                                                authButton: {
                                                    // 授权按钮正常状态背景颜色 默认值：#3479f5
                                                    normalColor: theme_color,
                                                    // 授权按钮按下状态背景颜色 默认值：#2861c5（仅ios支持）
                                                    highlightColor: theme_color_light,
                                                    // 授权按钮不可点击时背景颜色 默认值：#73aaf5（仅ios支持）
                                                    disabledColor: theme_color_light,
                                                    // 授权按钮文案 默认值：“本机号码一键登录”
                                                    title: i18n.t('shopxo-uniapp.app.5a7r0v'),
                                                },
                                                otherLoginButton: {
                                                    // 其他登录方式按钮文字 默认值：“其他登录方式”
                                                    title: i18n.t('login.login.9q27d8'),
                                                },
                                                privacyTerms: {
                                                    // 条款前的文案 默认值：“我已阅读并同意”
                                                    prefix: i18n.t('shopxo-uniapp.app.33k281'),
                                                    // 条款后的文案 默认值：“并使用本机号码登录”
                                                    suffix: i18n.t('shopxo-uniapp.app.8l688n'),
                                                    // 自定义协议条款，最大支持2个，需要同时设置url和title. 否则不生效
                                                    privacyItems: [
                                                        {
                                                            url: self.get_config('config.agreement_userregister_url'),
                                                            title: i18n.t('shopxo-uniapp.app.28r5dr'),
                                                        },
                                                        {
                                                            url: self.get_config('config.agreement_userprivacy_url'),
                                                            title: i18n.t('shopxo-uniapp.app.lb493k'),
                                                        },
                                                    ],
                                                },
                                            },
                                            success(res) {
                                                // 在得到access_token和openid后，通过callfunction调用云函数
                                                uniCloud
                                                    .callFunction({
                                                        name: 'getPhoneNumber',
                                                        data: {
                                                            access_token: res.authResult.access_token,
                                                            openid: res.authResult.openid,
                                                        },
                                                    })
                                                    .then((res) => {
                                                        uni.request({
                                                            url: self.get_request_url('apponekeyusermobile', 'index', 'thirdpartylogin'),
                                                            method: 'POST',
                                                            data: {
                                                                mobile: res.result,
                                                            },
                                                            dataType: 'json',
                                                            success: (res) => {
                                                                uni.closeAuthView();
                                                                if (res.data.code == 0) {
                                                                    uni.setStorageSync(self.data.cache_user_info_key, res.data.data);
                                                                    if (typeof object === 'object' && (method || null) != null) {
                                                                        object[method](params);
                                                                    }
                                                                } else {
                                                                    self.showToast(res.data.msg);
                                                                }
                                                            },
                                                            fail: () => {
                                                                uni.closeAuthView();
                                                                self.showToast(i18n.t('common.internet_error_tips'));
                                                            },
                                                        });
                                                    })
                                                    .catch((err) => {
                                                        uni.closeAuthView();
                                                        self.showToast(i18n.t('shopxo-uniapp.app.ch1pd2'));
                                                    });
                                            },
                                            fail(res) {
                                                // 关闭一键登录弹窗
                                                uni.closeAuthView();
                                                // 用户点击了其他登录方式、则进入登录页面
                                                if (res.errCode == 30002) {
                                                    // 进入独立登录注册页面
                                                    uni.navigateTo({
                                                        url: '/pages/login/login',
                                                    });
                                                } else {
                                                    // 用户不是点击关闭验证界面则提示错误
                                                    if (res.errCode != 30003) {
                                                        self.showToast(res.errMsg + '(' + res.errCode + ')');
                                                    }
                                                }
                                            },
                                        });
                                    },
                                    fail(res) {
                                        self.login_confirm_tips_modal(self, object, method, params);
                                    },
                                });
                            } else {
                                self.login_confirm_tips_modal(self, object, method, params);
                            }
                        },
                        fail(res) {
                            self.login_confirm_tips_modal(self, object, method, params);
                        },
                    });
                } else {
                    self.login_confirm_tips_modal(self, object, method, params);
                }
            },

            // 未登录确认处理
            login_confirm_tips_modal(self, object, method, params) {
                // 是否tabbar页面
                var page = self.current_page(false);
                var is_tabbar = self.is_system_tabbar_pages('/'+page);
                // 非初始化 并且 非tabbar页面则关闭当前页面并跳转登录页面
                if(method == 'init' && !is_tabbar) {
                    uni.redirectTo({
                        url: '/pages/login/login'
                    });
                // 初始化页面并且是tabbar页面
                } else if(method == 'init' && is_tabbar) {
                    var key = this.data.cache_user_no_login_page_status_data_key;
                    var data = uni.getStorageSync(key) || [];
                    if(data.indexOf(page) == -1) {
                        data.push(page);
                        uni.setStorageSync(key, data);
                        uni.navigateTo({
                            url: '/pages/login/login'
                        });
                    }
                // 非初始化则直接跳转登录页面
                } else if(method != 'init') {
                    uni.navigateTo({
                        url: '/pages/login/login'
                    });
                }
            },

            /**
             * 从缓存获取用户信息、可指定key和默认值
             * key              数据key
             * default_value    默认值
             */
            get_user_cache_info(key, default_value) {
                var user = uni.getStorageSync(this.data.cache_user_info_key) || null;
                if (user == null) {
                    // 是否存在默认值
                    return default_value == undefined ? null : default_value;
                }
                // 是否读取key
                if ((key || null) != null) {
                    return user[key] == undefined ? (default_value == undefined ? null : default_value) : user[key];
                }
                return user;
            },

            /**
             * 系统参数获取
             */
            get_launch_cache_info() {
                return uni.getStorageSync(this.data.cache_launch_info_key) || null;
            },

            /**
             * 系统参数设置
             */
            set_launch_cache_info(params) {
                params = this.launch_params_handle(params);
                uni.setStorageSync(this.data.cache_launch_info_key, params);
                return params;
            },

            /**
             * 获取登录授权数据
             */
            get_login_cache_info() {
                return uni.getStorageSync(this.data.cache_user_login_key) || null;
            },

            /**
             * 用户登录
             * object     回调操作对象
             * method     回调操作对象的函数
             * params     回调请求参数
             * auth_data  授权数据
             */
            user_auth_login(object, method, params, auth_data) {
                var self = this;
                // #ifdef MP-WEIXIN || MP-QQ || MP-BAIDU || MP-TOUTIAO || MP-KUAISHOU
                uni.checkSession({
                    success: function () {
                        var login_data = self.get_login_cache_info();
                        if (login_data == null) {
                            self.user_login(object, method, params);
                        } else {
                            self.get_user_login_info(object, method, params, login_data, auth_data);
                        }
                    },
                    fail: function () {
                        uni.removeStorageSync(self.data.cache_user_login_key);
                        self.user_login(object, method, params);
                    },
                });
                // #endif
                // #ifdef MP-ALIPAY
                var login_data = self.get_login_cache_info();
                if (login_data == null) {
                    self.user_login(object, method, params);
                } else {
                    self.get_user_login_info(object, method, params, login_data, auth_data);
                }
                // #endif
            },

            /**
             * 用户登录
             * object     回调操作对象
             * method     回调操作对象的函数
             * params     回调操请求参数
             */
            user_login(object, method, params) {
                var login_data = uni.getStorageSync(this.data.cache_user_login_key) || null;
                if (login_data == null) {
                    this.user_login_handle(object, method, params, true);
                } else {
                    this.login_to_auth();
                }
            },

            /**
             * 用户登录处理
             * object     回调操作对象
             * method     回调操作对象的函数
             * params     回调操请求参数
             * is_to_auth 是否进入授权
             */
            user_login_handle(object, method, params, is_to_auth = true) {
                var self = this;
                uni.showLoading({
                    title: i18n.t('common.auth_in_text'),
                });
                var action = 'login';
                // #ifdef MP-BAIDU
                action = 'getLoginCode';
                // #endif
                uni[action]({
                    success: (res) => {
                        if (res.code) {
                            uni.request({
                                url: self.get_request_url('appminiuserauth', 'user'),
                                method: 'POST',
                                data: {
                                    authcode: res.code,
                                },
                                dataType: 'json',
                                success: (res) => {
                                    uni.hideLoading();
                                    if (res.data.code == 0) {
                                        var data = res.data.data;
                                        var client_type = self.application_client_type();
                                        if ((data.is_user_exist || 0) == 1 || client_type == 'weixin') {
                                            // 存在数据非微信 或 微信小程序是否强制填写基础信息
                                            if(((data.is_user_exist || 0) == 1 && client_type != 'weixin') || !self.is_weixin_force_user_base_handle(self, data, object, method, params)) {
                                                uni.setStorageSync(self.data.cache_user_info_key, data);
                                                if (typeof object === 'object' && (method || null) != null) {
                                                    object[method](params);
                                                }
                                            }
                                        } else {
                                            uni.setStorageSync(self.data.cache_user_login_key, data);
                                            if (is_to_auth) {
                                                var pages = getCurrentPages();
                                                if (pages[pages.length - 1]['route'] == 'pages/login/login') {
                                                    if (typeof object === 'object' && (method || null) != null) {
                                                        object[method](params);
                                                    }
                                                } else {
                                                    self.login_to_auth();
                                                }
                                            }
                                        }
                                    } else {
                                        self.showToast(res.data.msg);
                                    }
                                },
                                fail: () => {
                                    uni.hideLoading();
                                    self.showToast(i18n.t('common.internet_error_tips'));
                                },
                            });
                        }
                    },
                    fail: (e) => {
                        uni.hideLoading();
                        self.showToast(i18n.t('login.login.3nmrg2'));
                    },
                });
            },

            // 微信小程序是否强制填写基础信息
            is_weixin_force_user_base_handle(self, data, object, method, params) {
                var status = parseInt(self.get_config('config.common_app_is_weixin_force_user_base', 0));
                if(status == 1) {
                    var obj = self.get_page_object();
                    if((obj.$vm || null) != null && (obj.$vm.$refs || null) != null && (obj.$vm.$refs.common || null) != null && (obj.$vm.$refs.common.$refs || null) != null && (obj.$vm.$refs.common.$refs.user_base || null) != null) {
                        var user_base = obj.$vm.$refs.common.$refs.user_base;
                        var res = user_base.form_write_field_check_data(data, true);
                        if(res.popup_status) {
                            user_base.user_base_open(object, method, params);
                        }
                        return res.popup_status;
                    }
                }
                return false;
            },

            /**
             * 跳转到登录页面授权
             */
            login_to_auth() {
                uni.showModal({
                    title: i18n.t('common.warm_tips'),
                    content: i18n.t('login.login.jw378f'),
                    confirmText: i18n.t('common.confirm'),
                    cancelText: i18n.t('common.not_yet'),
                    success: (result) => {
                        if (result.confirm) {
                            uni.navigateTo({
                                url: '/pages/login/login',
                            });
                        }
                    },
                });
            },

            /**
             * 获取用户授权信息
             * object     回调操作对象
             * method     回调操作对象的函数
             * params     回调请求参数
             * login_data 登录信息
             * auth_data  授权数据
             */
            get_user_login_info(object, method, params, login_data, auth_data) {
                // 请求数据
                var data = {
                    auth_data: JSON.stringify(auth_data),
                    openid: login_data.openid,
                    unionid: login_data.unionid,
                };
                // 用户信息处理
                uni.showLoading({
                    title: i18n.t('common.auth_in_text'),
                });
                var self = this;
                uni.request({
                    url: self.get_request_url('appminiuserinfo', 'user'),
                    method: 'POST',
                    data: data,
                    dataType: 'json',
                    success: (res) => {
                        uni.hideLoading();
                        if (res.data.code == 0) {
                            uni.setStorageSync(self.data.cache_user_info_key, res.data.data);
                            if (typeof object === 'object' && (method || null) != null) {
                                object[method](params);
                            }
                        } else {
                            self.showToast(res.data.msg);
                        }
                    },
                    fail: () => {
                        uni.hideLoading();
                        self.showToast(i18n.t('common.internet_error_tips'));
                    },
                });
            },

            /**
             * 字段数据校验
             * data           待校验的数据, 一维json对象
             * validation     待校验的字段, 格式 [{fields: 'mobile', msg: '请填写手机号码', is_can_zero: 1(是否可以为0)}, ...]
             */
            fields_check(data, validation) {
                for (var i in validation) {
                    var temp_value = data[validation[i]['fields']];
                    var temp_is_can_zero = validation[i]['is_can_zero'] || null;
                    if (temp_value == undefined || temp_value.length == 0 || temp_value == -1 || (temp_is_can_zero == null && temp_value == 0)) {
                        this.showToast(validation[i]['msg']);
                        return false;
                    }
                }
                return true;
            },

            /**
             * 获取当前时间戳
             */
            get_timestamp() {
                return parseInt(new Date().getTime() / 1000);
            },

            /**
             * 获取日期
             * format       日期格式（默认 yyyy-MM-dd h:m:s）
             * timestamp    时间戳（默认当前时间戳）
             */
            get_date(format, timestamp) {
                var d = new Date((timestamp || this.get_timestamp()) * 1000);
                var date = {
                    'M+': d.getMonth() + 1,
                    'd+': d.getDate(),
                    'h+': d.getHours(),
                    'm+': d.getMinutes(),
                    's+': d.getSeconds(),
                    'q+': Math.floor((d.getMonth() + 3) / 3),
                    'S+': d.getMilliseconds(),
                };
                if (/(y+)/i.test(format)) {
                    format = format.replace(RegExp.$1, (d.getFullYear() + '').substr(4 - RegExp.$1.length));
                }
                for (var k in date) {
                    if (new RegExp('(' + k + ')').test(format)) {
                        format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? date[k] : ('00' + date[k]).substr(('' + date[k]).length));
                    }
                }
                return format;
            },

            /**
             * 获取对象、数组的长度、元素个数
             * obj      要计算长度的元素（object、array、string）
             */
            get_length(obj) {
                var obj_type = typeof obj;
                if (obj_type == 'string') {
                    return obj.length;
                } else if (obj_type == 'object') {
                    var obj_len = 0;
                    for (var i in obj) {
                        obj_len++;
                    }
                    return obj_len;
                }
                return false;
            },

            /**
             * 价格保留两位小数
             * price      价格保留两位小数
             */
            price_two_decimal(x) {
                var f_x = parseFloat(x);
                if (isNaN(f_x)) {
                    return 0;
                }
                var f_x = Math.round(x * 100) / 100;
                var s_x = f_x.toString();
                var pos_decimal = s_x.indexOf('.');
                if (pos_decimal < 0) {
                    pos_decimal = s_x.length;
                    s_x += '.';
                }
                while (s_x.length <= pos_decimal + 2) {
                    s_x += '0';
                }
                return s_x;
            },

            /**
             * url主要部分
             * url url地址
             */
            get_url_main_part(url) {
                var value = '';
                if((url || null) != null) {
                    if (url.indexOf('?') == -1) {
                        value = url;
                    } else {
                        var temp_str = url.split('?');
                        value = temp_str[0];
                    }
                }
                return value;
            },

            /**
             * diy底部菜单高度数据存储
             * value  高度
             */
            app_diy_tabbar_height_save(value) {
                uni.setStorageSync(this.data.cache_app_diy_tabbar_height_key, value);
            },

            /**
             * diy底部菜单高度数据读取
             */
            app_diy_tabbar_height_value() {
                return parseInt(uni.getStorageSync(this.data.cache_app_diy_tabbar_height_key) || 0);
            },

            /**
             * 系统底部菜单高度数据存储
             * value  高度
             */
            app_system_tabbar_height_save(value) {
                uni.setStorageSync(this.data.cache_app_system_tabbar_height_key, value);
            },
            
            /**
             * 系统底部菜单高度数据读取
             */
            app_system_tabbar_height_value() {
                return parseInt(uni.getStorageSync(this.data.cache_app_system_tabbar_height_key) || 0);
            },

            /**
             * 底部菜单页面数、tabbar
             */
            app_tabbar_pages() {
                var temp_tabbar = this.data.system_tabbar;
                var app_tabbar = this.get_config('app_tabbar') || null;
                if(app_tabbar != null && (app_tabbar.content || null) != null && (app_tabbar.content.nav_content || null) != null) {
                    temp_tabbar = app_tabbar.content.nav_content.map(function(v) {
                        if((v.link || null) != null && (v.link.page || null) != null) {
                            return v.link.page;
                        }
                    });
                }
                return temp_tabbar;
            },

            /**
             * 当前地址是否存在底部菜单tabbar中
             */
            is_tabbar_pages(url = null) {
                var pages = (this.data.is_use_native_tabbar == 1) ? this.data.system_tabbar : this.app_tabbar_pages();
                return this.is_tabbar_pages_handle(pages, url);
            },

            /**
             * 当前地址是否存在系统tabbar中
             */
            is_system_tabbar_pages(url = null) {
                return this.is_tabbar_pages_handle(this.data.system_tabbar, url);
            },

            /**
             * 当前地址是否存在tabbar中
             * pages  tabbar页面
             * url    url地址
             */
            is_tabbar_pages_handle(pages, url = null) {
                var value = (url == null) ? '/'+this.current_page() : url;
                if ((value || null) != null) {
                    if(pages.indexOf(value) != -1) {
                        return true;
                    } else {
                        // 存在参数，去掉参数再检索是否存在页面的tabbar
                        if(value.indexOf('?') != -1) {
                            var temp = value.split('?');
                            if(pages.indexOf(temp[0]) != -1) {
                                return true;
                            }
                        }
                    }
                }
                return false;
            },

            /**
             * 当前地址是否存为首页
             * url    url地址
             */
            is_tabbar_home(url = null) {
                var pages = this.app_tabbar_pages() || [];
                if(pages.length > 0) {
                    var value = (url == null) ? '/'+this.current_page() : url;
                    if ((value || null) != null) {
                        if(pages[0] == value) {
                            return true;
                        } else {
                            // 存在参数，去掉参数再检索是否存在页面的tabbar
                            if(value.indexOf('?') != -1) {
                                var temp = value.split('?');
                                if(pages[0] == temp[0]) {
                                    return true;
                                }
                            }
                        }
                    }
                }
                return false;
            },

            // 系统底部菜单隐藏
            system_hide_tabbar() {
                if(this.data.is_use_native_tabbar != 1) {
                    uni.hideTabBar();
                }
            },

            /**
             * 事件操作
             */
            operation_event(e) {
                var value = e.currentTarget.dataset.value || null;
                var type = parseInt(e.currentTarget.dataset.type);
                if (value != null) {
                    switch (type) {
                        // web
                        case 0:
                            this.open_web_view(value);
                            break;
                        // 内部页面
                        case 1:
                            if (this.is_system_tabbar_pages(value)) {
                                var temp = value.split('?');
                                if (temp.length > 1 && (temp[1] || null) != null) {
                                    value = temp[0];
                                    var query = this.url_params_to_json(temp[1]);
                                    uni.setStorageSync(this.data.cache_page_tabbar_switch_params, query);
                                }
                                uni.switchTab({
                                    url: value
                                });
                                //隐藏系统tabbar
                                this.system_hide_tabbar();
                            } else {
                                uni.navigateTo({
                                    url: value
                                });
                            }
                            break;
                        // 跳转到外部小程序
                        case 2:
                            // 打开外部小程序协议（appid|/pages/index/index?pv=hello|extraData|envVersion）
                            var values = value.split('|');
                            uni.navigateToMiniProgram({
                                appId: values[0],
                                path: values[1] || '',
                                extraData: values[2] || '',
                                envVersion: values[3] || 'release'
                            });
                            break;
                        // 跳转到地图查看位置
                        case 3:
                            var values = value.split('|');
                            if (values.length != 4) {
                                this.showToast(i18n.t('shopxo-uniapp.app.5y1c52'));
                                return false;
                            }
                            this.open_location(values[2], values[3], values[0], values[1]);
                            break;
                        // 拨打电话
                        case 4:
                            this.call_tel(value);
                            break;
                    }
                }
            },

            /**
             * 打开 webview页面
             * value       [string]  url地址
             * is_redirect [boolean] 是否关闭当前页面
             */
            open_web_view(value, is_redirect = false) {
                var url = '/pages/web-view/web-view?url=' + encodeURIComponent(value);
                if(is_redirect) {
                    uni.redirectTo({
                        url: url,
                    });
                } else {
                    uni.navigateTo({
                        url: url,
                    });
                }
            },

            /**
             * 默认弱提示方法
             * msg    [string]  提示信息
             * status [string]  状态 默认error [正确success, 错误error]
             */
            showToast(msg, status) {
                if ((msg || null) != null) {
                    if ((status || 'error') == 'success') {
                        uni.showToast({
                            icon: 'success',
                            title: msg,
                            duration: 3000,
                        });
                    } else {
                        uni.showToast({
                            icon: 'none',
                            title: msg,
                            duration: 3000,
                        });
                    }
                }
            },

            /**
             * alert确认框
             * title              [string]    标题（默认空）
             * msg                [string]    提示信息，必传
             * is_show_cancel     [int]       是否显示取消按钮（默认显示 0否, 1|undefined是）
             * cancel_text        [string]    取消按钮文字（默认 取消）
             * cancel_color       [string]    取消按钮的文字颜色，必须是 16 进制格式的颜色字符串（默认 #000000）
             * confirm_text       [string]    确认按钮文字（默认 确认）
             * confirm_color      [string]    确认按钮的文字颜色，必须是 16 进制格式的颜色字符串（默认 #000000）
             * object             [boject]    回调操作对象，点击确认回调参数1，取消回调0
             * method             [string]    回调操作对象的函数
             * params             [obj]       携带的参数
             */
            alert(e) {
                var msg = e.msg || null;
                if (msg != null) {
                    var title = e.title || '';
                    var is_show_cancel = e.is_show_cancel == 0 ? false : true;
                    var cancel_text = e.cancel_text || i18n.t('common.cancel');
                    var confirm_text = e.confirm_text || i18n.t('common.confirm');
                    var cancel_color = e.cancel_color || '#000000';
                    var confirm_color = e.confirm_color || '#576B95';
                    var params = e.params || {};
                    uni.showModal({
                        title: title,
                        content: msg,
                        showCancel: is_show_cancel,
                        cancelText: cancel_text,
                        cancelColor: cancel_color,
                        confirmText: confirm_text,
                        confirmColor: confirm_color,
                        success(res) {
                            if ((e.object || null) != null && typeof e.object === 'object' && (e.method || null) != null) {
                                params['alert_status'] = res.confirm ? 1 : 0;
                                e.object[e.method](params);
                            }
                        },
                    });
                } else {
                    self.showToast(i18n.t('shopxo-uniapp.app.t754n6'));
                }
            },

            // url参数转json对象
            url_params_to_json(url_params) {
                var json = new Object();
                if ((url_params || null) != null) {
                    var arr = url_params.split('&');
                    for (var i = 0; i < arr.length; i++) {
                        var temp = arr[i].split('=');
                        json[temp[0]] = temp[1];
                    }
                }
                return json;
            },

            // json对象转url请求参数
            json_to_url_params(data) {
                var str = '';
                for (var i in data) {
                    if (str != '') {
                        str += '&';
                    }
                    str += i + '=' + data[i];
                }
                return str;
            },

            // 拨打电话
            call_tel(data) {
                var value = typeof data == 'object' ? data.currentTarget.dataset.value || null : data || null;
                if (value != null) {
                    uni.makePhoneCall({
                        phoneNumber: value.toString(),
                    });
                }
            },

            /**
             * 登录校验
             * object     回调操作对象
             * method     回调操作对象的函数
             * params     回调请求参数
             */
            is_login_check(res, object, method, params) {
                if (res.code == -400) {
                    uni.clearStorage();
                    this.get_user_info(object, method, params);
                    return false;
                }
                return true;
            },

            /**
             * 读取底部导航badge
             * type     类型标识（如购物车 cart）
             */
            get_tab_bar_badge(type) {
                if ((type || null) != null) {
                    return uni.getStorageSync(this.data.cache_tabbar_badge_key+'-'+type) || null;
                }
                return null;
            },

            /**
             * 设置底部导航badge
             * type     类型标识（如购物车 cart）
             * value    显示的文本，超过 4 个字符则显示成 ...（type参数为1的情况下有效）
             */
            set_tab_bar_badge(type, value = 0) {
                // 是否使用原生菜单
                if(this.data.is_use_native_tabbar == 1) {
                    if(type == 'cart') {
                        if ((value || 0) == 0) {
                            uni.removeTabBarBadge({
                                index: 2
                            });
                        } else {
                            uni.setTabBarBadge({
                                index: 2,
                                text: value.toString()
                            });
                        }
                    }
                } else {
                    // 数据处理
                    if ((type || null) != null) {
                        var key = this.data.cache_tabbar_badge_key+'-'+type;
                        if ((value || null) == null) {
                            uni.removeStorageSync(key);
                        } else {
                            uni.setStorageSync(key, value);
                        }
                    }
                    // 更新底部菜单数据
                    var obj = this.get_page_object() || null;
                    if(obj != null && (obj.$vm || null) != null && (obj.$vm.$refs || null) != null && (obj.$vm.$refs.common || null) != null) {
                        obj.$vm.$refs.common.footer_init();
                    }
                }
            },

            // 页面分享处理
            page_share_handle(share = null) {
                // 当前页面
                var pages = getCurrentPages();
                var obj = pages[pages.length - 1] || null;
                // 分享信息、是否指定参数
                if ((share || null) == null) {
                    share = {};
                }
                // 从页面对象获取参数
                if (obj != null && Object.keys(share).length <= 0) {
                    share = obj.share_info || {};
                }
                // 参数处理
                share = this.share_content_handle(share);
                // #ifdef MP-WEIXIN
                // 微信小程序展示系统分享好友和朋友圈按钮
                // 其他端小程序不用展示会调起分享窗口
                var not_pages = ['/pages/user/user', '/pages/cart/cart'];
                if (not_pages.indexOf(share.url) == -1) {
                    uni.showShareMenu({
                        withShareTicket: true,
                        title: share.title,
                        desc: share.desc,
                        path: share.path + share.query,
                        imageUrl: share.img,
                        menus: ['shareAppMessage', 'shareTimeline'],
                    });
                } else {
                    wx.hideShareMenu({
                        menus: ['shareTimeline'],
                    });
                }
                // #endif
                // #ifdef H5
                // H5处理微信环境分享自定义信息
                if (this.is_weixin_env()) {
                    var page_url = this.get_page_url();
                    uni.request({
                        url: this.get_request_url('signpackage', 'index', 'share'),
                        method: 'POST',
                        data: {
                            url: encodeURIComponent(page_url),
                        },
                        dataType: 'json',
                        success: (res) => {
                            if (res.data.code == 0 && (res.data.data.package || null) != null) {
                                var data = res.data.data.package;
                                var wx = require('jweixin-module');
                                wx.config({
                                    debug: false,
                                    appId: data.appId,
                                    timestamp: data.timestamp,
                                    nonceStr: data.nonceStr,
                                    signature: data.signature,
                                    jsApiList: ['updateAppMessageShareData', 'updateTimelineShareData', 'onMenuShareWeibo'],
                                });
                                wx.ready(function () {
                                    // 自定义“分享给朋友”及“分享到QQ”按钮的分享内容
                                    wx.updateAppMessageShareData({
                                        title: share.title,
                                        desc: share.desc,
                                        link: share.url,
                                        imgUrl: share.img,
                                    });
                                    // 自定义“分享到朋友圈”及“分享到QQ空间”按钮的分享内容
                                    wx.updateTimelineShareData({
                                        title: share.title,
                                        link: share.url,
                                        imgUrl: share.img,
                                    });
                                    // 获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口
                                    wx.onMenuShareWeibo({
                                        title: share.title,
                                        desc: share.desc,
                                        link: share.url,
                                        imgUrl: share.img,
                                    });
                                });
                            }
                        },
                        fail: () => {
                            this.showToast(i18n.t('common.internet_error_tips'));
                        },
                    });
                }
                // #endif
                // #ifdef MP-BAIDU
                // 百度小程序wab化搜索引擎数据设置
                uni.setPageInfo({
                    title: share.title,
                    keywords: share.kds || share.desc,
                    articleTitle: share.title,
                    description: share.desc,
                    image: share.img,
                    video:
                        (share.video || null) == null
                            ? []
                            : [
                                  {
                                      url: share.video,
                                      duration: '100',
                                      image: share.img,
                                  },
                              ],
                });
                // #endif
            },
            
            /**
             * 数据、可指定key和默认值
             * data             数据
             * key              数据key（支持多级读取、以 . 分割key名称）
             * default_value    默认值
             */
            get_key_data(data, key, default_value = null) {
                var value = default_value;
                if ((data || null) != null) {
                    var arr = key.split('.');
                    if (arr.length == 1) {
                        if(data[key] != undefined) {
                            value = data[key];
                        }
                    } else {
                        value = data;
                        for (var i in arr) {
                            if (value[arr[i]] != undefined) {
                                value = value[arr[i]];
                            } else {
                                value = default_value;
                                break;
                            }
                        }
                    }
                }
                return value;
            },

            /**
             * 获取配置信息、可指定key和默认值
             * key              数据key（支持多级读取、以 . 分割key名称）
             * default_value    默认值
             */
            get_config(key, default_value) {
                // 获取全部缓存
                var config = uni.getStorageSync(this.data.cache_config_info_key) || null;
                if((key || null) == null) {
                    return config;
                }

                // key缓存获取
                var value = null;
                if (config != null) {
                    // 数据读取
                    var arr = key.split('.');
                    if (arr.length == 1) {
                        value = config[key] == undefined ? null : config[key];
                    } else {
                        value = config;
                        for (var i in arr) {
                            if (value[arr[i]] != undefined) {
                                value = value[arr[i]];
                            } else {
                                value = null;
                                break;
                            }
                        }
                    }
                }
                // 默认值
                if (value == null && default_value != undefined) {
                    value = default_value;
                }
                // 无数据则处理自定义字段定义的数据
                if (value == null) {
                    switch (key) {
                        // 货币符号
                        case 'currency_symbol':
                            value = this.data.currency_symbol;
                            break;
                    }
                }
                return value;
            },

            /**
             * 初始化 配置信息
             * num        读取次数、如果失败+1再次读取
             * object     回调操作对象
             * method     回调操作对象的函数
             * params     回调操请求参数
             */
            init_config(num = 0, object, method, params) {
                var self = this;
                if (num == 0) {
                    self.data.common_data_init_config_back_list.push({ object: object, method: method, params: params})
                }
                uni.getNetworkType({
                    success: function (res) {
                        if (res.networkType != 'none') {
                            // 获取配置本地缓存
                            var config = self.get_config();
                            if(config != null) {
                                // 公共配置初始化返回处理
                                self.init_config_result_handle(config, self);
                            }
                            // 读取远程配置
                            if(self.data.common_data_loading_status == 0) {
                                // 赋值在加载状态
                                self.data.common_data_loading_status = 1;
                                uni.request({
                                    url: self.get_request_url('common', 'base'),
                                    method: 'POST',
                                    data: {
                                        is_key: 1,
                                    },
                                    dataType: 'json',
                                    success: (res) => {
                                        // 赋值不在加载状态
                                        self.data.common_data_loading_status = 0;
                                        if (res.data.code == 0) {
                                            // 配置存储
                                            var data = res.data.data;
                                            uni.setStorageSync(self.data.cache_config_info_key, data);

                                            // 公共配置初始化返回处理
                                            self.init_config_result_handle(data, self);
                                            // 回调
                                            if (self.data.common_data_init_config_back_list.length > 0) {
                                                self.data.common_data_init_config_back_list.forEach(item => {
                                                    if (typeof item.object === 'object' && (item.method || null) != null) {
                                                        item.object[item.method](item.params);
                                                    }
                                                })
                                                self.data.common_data_init_config_back_list = [];
                                            }
                                        } else {
                                            self.showToast(res.data.msg);
                                            // 站点关闭状态则 记录已初始化公共数据状态
                                            if (res.data.code == -10000) {
                                                self.data.common_data_init_status = 1;
                                            }
                                            // 首次则再次初始化配置、站点关闭状态则不处理
                                            if (parseInt(num || 0) <= 20 && self.data.common_data_init_status == 0) {
                                                self.init_config(num+1, object, method, params);
                                            }
                                        }
                                    },
                                    fail: () => {
                                        // 赋值不在加载状态
                                        self.data.common_data_loading_status = 0;
                                        // 首次则再次初始化配置
                                        if (parseInt(num || 0) <= 20) {
                                            self.init_config(num+1, object, method, params);
                                        }
                                    },
                                });
                            }
                        }
                    },
                });
            },

            // 公共配置初始化返回处理
            init_config_result_handle(data, self) {
                // 记录已初始化公共数据状态
                self.data.common_data_init_status = 1;

                // 主题设置
                self.set_theme_value(data.plugins_themestyle_data);

                // 设置底部菜单
                self.set_tabbar(data.plugins_themestyle_data);

                // 用户自动登录处理
                self.user_auto_login_handle();
            },

            /**
             * 配置是否有效(100毫秒检验一次、最多检验100次)
             * object     回调操作对象
             * method     回调操作对象的函数
             * params     回调操请求参数
             */
            is_config(object, method, params) {
                var self = this;
                var count = 0;
                var is_config_count = 0;
                var timer = setInterval(function () {
                    if (self.get_config('status') == 1) {
                        clearInterval(timer);
                        if (typeof object === 'object' && (method || null) != null) {
                            object[method](true, params);
                        }
                    }
                    count++;
                    if (count >= 2300) {
                        clearInterval(timer);
                    }
                }, 100);
            },

            /**
             * 火星坐标GCJ02到百度坐标BD-09(高德，谷歌，腾讯坐标 -> 百度)
             * lng     经度
             * lat     纬度
             */
            map_gcj_to_bd(lng, lat) {
                lng = parseFloat(lng);
                lat = parseFloat(lat);
                let x_pi = (3.14159265358979324 * 3000.0) / 180.0;
                let x = lng;
                let y = lat;
                let z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi);
                let theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi);
                let lngs = z * Math.cos(theta) + 0.0065;
                let lats = z * Math.sin(theta) + 0.006;
                return {
                    lng: lngs,
                    lat: lats,
                };
            },

            /**
             * 百度坐标BD-09到火星坐标GCJ02(百度 -> 高德，谷歌，腾讯坐标)
             * lng     经度
             * lat     纬度
             */
            map_bd_to_gcj(lng, lat) {
                lng = parseFloat(lng);
                lat = parseFloat(lat);
                let x_pi = (3.14159265358979324 * 3000.0) / 180.0;
                let x = lng - 0.0065;
                let y = lat - 0.006;
                let z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi);
                let theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi);
                let lngs = z * Math.cos(theta);
                let lats = z * Math.sin(theta);
                return {
                    lng: lngs,
                    lat: lats,
                };
            },

            /**
             * 打开地图
             * lng        经度
             * lat        纬度
             * name       地图上面显示的名称
             * address    地图上面显示的详细地址
             * scale      缩放比例，范围5~18
             */
            open_location(lng, lat, name, address, scale) {
                // #ifdef MP-KUAISHOU
                this.showToast(i18n.t('shopxo-uniapp.app.iq66pg'));
                return false;
                // #endif

                // 参数判断
                if (lng == undefined || lat == undefined || lng == '' || lat == '') {
                    this.showToast(i18n.t('shopxo-uniapp.app.v2j475'));
                    return false;
                }
                lat = parseFloat(lat);
                lng = parseFloat(lng);

                // #ifdef MP-WEIXIN
                // 微信小程序使用【腾讯位置服务路线规划】插件
                if (this.data.is_weixin_open_location_use_plugins == 1) {
                    var key = this.get_config('config.common_tencent_map_ak') || null;
                    if (key != null) {
                        var plugin = requirePlugin('routePlan');
                        var end_point = JSON.stringify({
                            name: name || i18n.t('extraction-apply.extraction-apply.47v7m0'),
                            longitude: lng,
                            latitude: lat,
                        });
                        uni.navigateTo({
                            url: 'plugin://routePlan/route-plan?key=' + key + '&referer=' + this.get_application_title() + '&endPoint=' + end_point + '&themeColor=' + this.get_theme_color() + '&navigation=1',
                        });
                        return false;
                    }
                }
                // #endif
                // 转换坐标打开位置
                uni.openLocation({
                    name: name || i18n.t('extraction-apply.extraction-apply.47v7m0'),
                    address: address || '',
                    scale: scale || 18,
                    longitude: lng,
                    latitude: lat,
                });
            },

            // uuid生成
            uuid() {
                var d = new Date().getTime();
                return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
                    var r = (d + Math.random() * 16) % 16 | 0;
                    d = Math.floor(d / 16);
                    return (c == 'x' ? r : (r & 0x3) | 0x8).toString(16);
                });
            },

            // 获取当前uuid
            request_uuid() {
                var uuid = uni.getStorageSync(this.data.cache_user_uuid_key) || null;
                if (uuid == null) {
                    uuid = this.uuid();
                    uni.setStorage({
                        key: this.data.cache_user_uuid_key,
                        data: uuid,
                        fail: () => {
                            this.showToast(i18n.t('shopxo-uniapp.app.3m1gbe'));
                        },
                    });
                }
                return uuid;
            },

            // 链接地址事件
            url_event(e) {
                if((e.currentTarget || null) != null && (e.currentTarget.dataset || null) != null) {
                    // 需要打开的url地址
                    var value = e.currentTarget.dataset.value || null;

                    // 是否阻止商品页面打开
                    if (this.data.is_forbid_to_goods_detail == 1 && value.indexOf('/pages/goods-detail/goods-detail') != -1) {
                        return false;
                    }

                    // 是否关闭当前页面
                    var is_redirect = parseInt(e.currentTarget.dataset.redirect || 0) == 1;

                    // 如果是底部菜单，非系统内置菜单则关闭当前页面并打开
                    var tabbar = this.app_tabbar_pages();
                    if(tabbar.indexOf(value) != -1 && this.data.system_tabbar.indexOf(value) == -1) {
                        var page = this.prev_page();
                        if(page != null && this.data.system_tabbar.indexOf(page) == -1) {
                            is_redirect = true;
                        }
                    }

                    // 调用打开url方法
                    this.url_open(value, is_redirect);
                }
            },

            // 是否为url地址
            is_url(value) {
                var arr = ['http:/', 'https:'];
                return arr.indexOf(value.substr(0, 6)) != -1;
            },

            // 是否为page页面地址
            is_page(value) {
                var arr = ['/pages', 'pages/'];
                return arr.indexOf(value.substr(0, 6)) != -1;
            },

            // url打开
            url_open(value, is_redirect = false) {
                if ((value || null) != null) {
                    // #ifdef MP
                    // 小程序最多打开10层页面
                    var pages = getCurrentPages();
                    if(pages.length >= 10) {
                        is_redirect = true;
                    }
                    // #endif

                    if (this.is_url(value)) {
                        // web地址
                        this.open_web_view(value, is_redirect);
                    } else if (value.substr(0, 8) == 'appid://') {
                        // 打开外部小程序协议（appid|/pages/index/index?pv=hello|extraData|envVersion）
                        var values = value.substr(8).split('|');
                        uni.navigateToMiniProgram({
                            appId: values[0],
                            path: values[1] || '',
                            extraData: values[2] || '',
                            envVersion: values[3] || 'release'
                        });
                    } else if (value.substr(0, 12) == 'shortlink://') {
                        // 小程序分享链接
                        uni.navigateToMiniProgram({
                            shortLink: value.substr(12)
                        });
                    } else if (value.substr(0, 6) == 'map://') {
                        // 地图协议（名称|地址|lng|lat）
                        var values = value.substr(6).split('|');
                        if (values.length != 4) {
                            this.showToast(i18n.t('shopxo-uniapp.app.5y1c52'));
                            return false;
                        }
                        this.open_location(values[2], values[3], values[0], values[1]);
                    } else if (value.substr(0, 6) == 'tel://') {
                        // 电话协议
                        this.call_tel(value.substr(6));
                    } else if (value.substr(0, 7) == 'scan://') {
                        // 扫码协议
                        this.scan_handle();
                    } else if(value.substr(0, 17) == 'plugin-private://') {
                        // 是否打开插件地址
                        // #ifdef APP
                        // APP则直接打开微信小程序直播
                        var self = this;
                        var weixin_original_id = self.get_config('config.common_app_mini_weixin_share_original_id', null);
                        if(weixin_original_id != null) {
                            plus.share.getServices(res => {
                                let sweixin = null;
                                for(let i in res) {
                                    if(res[i].id == 'weixin') {
                                        sweixin = res[i];
                                        break;
                                    }
                                }
                                //唤醒微信小程序
                                if(sweixin) {
                                    sweixin.launchMiniProgram({
                                        id: weixin_original_id,
                                        type: 0,
                                        path: value
                                    });
                                } else {
                                    self.showToast(i18n.t('detail.detail.86g7e1'));
                                }
                            });
                        } else {
                            self.showToast(i18n.t('detail.detail.567uyh'));
                        }
                        return false;
                        // #endif

                        // #ifdef MP-WEIXIN
                        if (is_redirect) {
                            uni.redirectTo({
                                url: value
                            });
                        } else {
                            uni.navigateTo({
                                url: value
                            });
                        }
                        return false;
                        // #endif

                        // 非微信环境和APP环境
                        this.showToast(i18n.t('detail.detail.9d3o6w'));
                    } else {
                        // 默认切换或跳转页面
                        if (this.is_page(value)) {
                            if (this.is_system_tabbar_pages(value)) {
                                var temp = value.split('?');
                                if (temp.length > 1 && (temp[1] || null) != null) {
                                    value = temp[0];
                                    var query = this.url_params_to_json(temp[1]);
                                    uni.setStorageSync(this.data.cache_page_tabbar_switch_params, query);
                                }
                                uni.switchTab({
                                    url: value
                                });
                                //隐藏系统tabbar
                                this.system_hide_tabbar();
                            } else {
                                if (is_redirect) {
                                    uni.redirectTo({
                                        url: value
                                    });
                                } else {
                                    uni.navigateTo({
                                        url: value
                                    });
                                }
                            }
                        } else {
                            this.url_open('/pages/goods-search/goods-search?keywords='+value);
                        }
                    }
                }
            },

            // 文本事件
            text_event_handle(e) {
                var event = e.currentTarget.dataset.event || null;
                if (event != null) {
                    var value = e.currentTarget.dataset.value;
                    switch (event) {
                        // 拨打电话
                        case 'tel':
                            this.call_tel(value);
                            break;
                        // 复制文本
                        case 'copy':
                            this.text_copy_event(value);
                            break;
                    }
                }
            },

            // 剪贴板
            text_copy_event(data) {
                var value = typeof data == 'object' ? data.currentTarget.dataset.value || null : data || null;
                if (value != null) {
                    var self = this;
                    uni.setClipboardData({
                        data: value,
                        success(res) {
                            uni.getClipboardData({
                                success(res) {
                                    self.showToast(i18n.t('shopxo-uniapp.app.r5ts62'), 'success');
                                },
                            });
                        },
                    });
                } else {
                    this.showToast(i18n.t('shopxo-uniapp.app.r539kf'));
                }
            },

            // 图片预览
            image_show_event(e, urls = null) {
                var value = e.currentTarget.dataset.value || null;
                if (value != null) {
                    uni.previewImage({
                        current: value,
                        urls: urls || [value],
                    });
                } else {
                    this.showToast(i18n.t('shopxo-uniapp.app.qm8548'));
                }
            },

            // 静态文件url地址
            get_static_url(type, is_plugins) {
                // 默认公共地址
                if ((type || null) == null) {
                    type = 'common';
                }
                // 是否插件
                if ((is_plugins || false) == true) {
                    // 根据配置的静态url地址+插件标识符
                    return this.data.static_url + 'static/plugins/' + type + '/images/';
                } else {
                    // 根据配置的静态url地址+主题标识+参数类型组合远程静态文件地址
                    return this.data.static_url + 'static/app/' + this.get_theme_value() + '/' + type + '/';
                }
            },

            // rpx转px
            rpx_to_px(value) {
                return (value || 0) == 0 ? 0 : uni.upx2px(value * 2);
            },

            // px转rpx
            px_to_rpx(value) {
                const new_value = value * 2 || 0;
                // 200 为 100px 的值，后面的两个 100 为计算比例使用
                var rpx = new_value / (uni.upx2px(value) / value);
                // 验证上面rpx的值
                return uni.upx2px(rpx);
            },

            // 是否pc
            is_pc() {
                var arr = ['macos', 'windows'];
                return arr.indexOf(uni.getSystemInfoSync().platform) != -1;
            },

            // 终端类型
            application_client() {
                var type = '';
                // #ifdef APP
                type = 'app';
                // #endif
                // #ifdef H5
                type = 'h5';
                // #endif
                // #ifdef MP
                type = 'mp';
                // #endif
                return type;
            },

            // 终端类型值
            application_client_type() {
                var value = '';
                // #ifdef MP-WEIXIN
                value = 'weixin';
                // #endif
                // #ifdef MP-ALIPAY
                value = 'alipay';
                // #endif
                // #ifdef MP-BAIDU
                value = 'baidu';
                // #endif
                // #ifdef MP-QQ
                value = 'qq';
                // #endif
                // #ifdef MP-TOUTIAO
                value = 'toutiao';
                // #endif
                // #ifdef MP-KUAISHOU
                value = 'kuaishou';
                // #endif
                // #ifdef H5
                value = 'h5';
                // #endif
                // #ifdef APP
                value = this.get_system_info('platform', null, true);
                // #endif
                return value;
            },

            // app客户端品牌
            application_client_brand(e) {
                var value = this.get_system_info('brand', null, true);
                return (value === null) ? '' : value.toLowerCase();
            },

            // 授权验证
            auth_check(object, method, scope, msg) {
                var self = this;
                uni.getSetting({
                    success(res) {
                        if (!res.authSetting[scope]) {
                            uni.authorize({
                                scope: scope,
                                success(res) {
                                    if (typeof object === 'object' && (method || null) != null) {
                                        object[method](1);
                                    }
                                },
                                fail(res) {
                                    self.showToast(msg || i18n.t('shopxo-uniapp.app.gbiac6'));
                                    setTimeout(function () {
                                        uni.openSetting();
                                    }, 1000);
                                },
                            });
                        } else {
                            if (typeof object === 'object' && (method || null) != null) {
                                object[method](1);
                            }
                        }
                    },
                });
            },

            // 窗口宽度处理
            window_width_handle(width) {
                // #ifdef H5 || APP
                if (width > 960) {
                    width = 800;
                }
                // #endif
                return width;
            },

            // 窗口高度处理
            window_height_handle(system) {
                var height = system.windowHeight;
                // 状态栏
                if (system.statusBarHeight > 0) {
                    height += system.statusBarHeight;
                }
                // 导航栏
                if (system.windowTop > 0) {
                    height += system.windowTop;
                }
                // 底部菜单
                if (system.windowBottom > 0) {
                    height += system.windowBottom;
                }
                return height;
            },

            // 获取当前页面地址
            // is_whole 完整地址（?后面的参数）
            get_page_url(is_whole = true) {
                var url = this.current_page();
                // #ifdef APP
                url = this.page_url_protocol(url);
                // #endif
                // #ifdef H5
                url = window.location.href;
                // #endif
                if (is_whole == false) {
                    var temp = url.split('?');
                    url = temp[0];
                }
                return url;
            },

            // url协议地址处理
            page_url_protocol(url) {
                if ((url || null) != null && !this.is_url(url)) {
                    // 拼接H5地址
                    var host = this.get_config('config.common_app_h5_url', '');
                    // #ifdef H5
                    if(host == '') {
                        // H5模式下、未指定H5地址则获取当前host
                        host = window.location.href.split('#')[0]+'#/';
                    }
                    // #endif
                    // 处理中间拼接的斜杠是否重复
                    url = (host + url).replace('#//', '#/');
                }
                return url;
            },

            // 是否微信环境
            is_weixin_env() {
                var agent = navigator.userAgent.toLowerCase();
                if (agent.match(/MicroMessenger/i) == 'micromessenger') {
                    return true;
                }
                return false;
            },

            // 用户微信webopenid是否存在
            is_user_weixin_web_openid(order_ids, payment_id = 0, page = null) {
                // 微信环境判断是否已有web_openid、不存在则跳转到插件进行授权
                if (this.is_weixin_env()) {
                    var web_openid = this.get_user_cache_info('weixin_web_openid') || null;
                    if (web_openid == null) {
                        // 已经授权则重新刷新用户信息
                        var params = this.get_launch_cache_info();
                        if (params != null && (params.is_weixin_auth_web_openid || 0) == 1) {
                            uni.showLoading({
                                title: i18n.t('common.processing_in_text'),
                            });
                            uni.request({
                                url: this.get_request_url('tokenuserinfo', 'user'),
                                method: 'POST',
                                data: {},
                                dataType: 'json',
                                success: (res) => {
                                    uni.hideLoading();
                                    if (res.data.code == 0) {
                                        uni.setStorageSync(this.data.cache_user_info_key, res.data.data);
                                    } else {
                                        this.showToast(res.data.msg);
                                    }
                                },
                                fail: () => {
                                    uni.hideLoading();
                                    this.showToast(i18n.t('common.internet_error_tips'));
                                },
                            });
                            return true;
                        } else {
                            uni.setStorageSync(this.data.cache_page_pay_key, {
                                order_ids: typeof order_ids == 'array' ? order_ids.join(',') : order_ids,
                                payment_id: payment_id,
                            });
                            var page_url = (page || null) == null ? this.get_page_url() : this.page_url_protocol(page);
                            page_url += page_url.indexOf('?') == -1 ? '?' : '&';
                            page_url += 'is_weixin_auth_web_openid=1';
                            var request_url = encodeURIComponent(base64.encode(page_url));
                            var url = this.get_request_url('index', 'pay', 'weixinwebauthorization', 'request_url=' + request_url, 'index').replace('&ajax=ajax', '');
                            window.location.href = url;
                        }
                        return false;
                    }
                }
                return true;
            },

            // app标题
            get_application_title() {
                var value = null;
                // 根据终端类型获取对应数据
                var type = this.application_client_type() || null;
                if (type !== null) {
                    value = this.get_config('config.common_app_mini_' + type + '_title') || null;
                }
                // 获取公共数据
                if (value === null) {
                    value = this.get_config('config.home_site_name', this.data.application_title);
                }
                return value;
            },

            // app描述
            get_application_describe() {
                var value = null;
                // 根据终端类型获取对应数据
                var type = this.application_client_type() || null;
                if (type !== null) {
                    value = this.get_config('config.common_app_mini_' + type + '_describe') || null;
                }
                // 商店介绍
                if (type !== null) {
                    value = this.get_config('config.common_customer_store_describe') || null;
                }
                // 获取公共数据
                if (value === null) {
                    value = this.data.application_describe;
                }
                return value;
            },

            // applogo
            get_application_logo() {
                var logo = this.data.application_logo || null;
                if (logo == null) {
                    logo = this.get_config('config.home_site_logo_app') || this.get_config('config.home_site_logo_wap');
                }
                return logo;
            },

            // 正方形logo
            get_application_logo_square() {
                return this.get_config('config.home_site_logo_square');
            },

            // 分享内容处理
            share_content_handle(data) {
                // 获取插件配置信息
                var share_config = this.get_config('plugins_base.share.data') || {};
                var result = {
                    title: data.title || share_config.title || this.get_application_title(),
                    desc: data.desc || share_config.desc || this.get_application_describe(),
                    path: data.path || this.app_tabbar_pages()[0],
                    query: this.share_query_handle(data.query || ''),
                    img: data.img || share_config.pic || this.get_application_logo_square(),
                };
                result['url'] = this.get_page_url();
                // #ifdef H5 || APP
                // 是有效的url地址则通过#号分割处理参数
                if(this.is_url(result['url'])) {
                    result['url'] = this.page_url_protocol(result.url.split('#')[0] + '#' + ((result.path || null) != null && result.path.substr(0, 1) == '/' ? '' : '/') + (result.path || '') + (result.query || ''));
                }
                // #endif
                return result;
            },

            // 分享参数处理
            share_query_handle(query) {
                if ((query || null) == null || query.indexOf('referrer') == -1) {
                    var user_id = parseInt(this.get_user_cache_info('id', 0)) || 0;
                    if (user_id > 0) {
                        var join = (query || null) == null ? '' : '&';
                        query += join + 'referrer=' + user_id;
                    }
                }
                return (query || null) == null ? '' : '?' + query;
            },

            // 是否朋友圈单页访问提示
            is_single_page_check() {
                if (this.is_current_single_page() == 1) {
                    this.showToast(i18n.t('shopxo-uniapp.app.3eqv71'));
                    return false;
                }
                return true;
            },

            // 调用页面方法
            get_page_object(page = null) {
                var pages = getCurrentPages();
                if(page == null) {
                    return pages[pages.length - 1];
                } else {
                    var result = [];
                    for (var i = 0; i < pages.length; i++) {
                        if (pages[i]['route'] == page) {
                            result.push(pages[i]);
                        }
                    }
                    return result;
                }
            },

            // 当前页面地址
            // is_whole 完整地址（?后面的参数）
            current_page(is_whole = true) {
                // 来源地址、拼接当前小程序页面
                var pages = getCurrentPages();
                var page = pages[pages.length - 1];
                var url = this.page_url_handle(page);
                if (is_whole == false) {
                    var temp = url.split('?');
                    url = temp[0];
                }
                return url;
            },

            // 上一页页面地址
            prev_page() {
                var value = null;
                var pages = getCurrentPages();
                var length = pages.length;
                if (length > 1) {
                    value = this.page_url_handle(pages[length - 2]);
                }
                return value;
            },

            // 返回上一页、则回到shouy，没有页面的时候url是否指定页面
            page_back_prev_event(url = null) {
                var prev_page = this.prev_page();
                if (prev_page == null) {
                    this.url_open(url || this.app_tabbar_pages()[0]);
                } else {
                    uni.navigateBack();
                }
            },

            // 页面地址处理
            page_url_handle(page) {
                if ((page || null) == null) {
                    return '';
                }

                // 直接获取页面全的路径地址
                if((page.$page || null) != null && (page.$page.fullPath || null) != null) {
                    var path = page.$page.fullPath;
                    return path.substr(0, 1) == '/' ? path.substr(1) : path;
                }

                // 拼接地址和参数
                var route = page.route;
                var options = page.options || {};
                var query = '';
                if (JSON.stringify(options) != '{}') {
                    for (var i in options) {
                        query += '&' + i + '=' + options[i];
                    }
                }
                if ((query || null) != null) {
                    route += '?' + query.substr(1);
                }
                return route;
            },

            // 进入客服
            chat_entry_handle(url) {
                if ((url || null) == null) {
                    this.showToast(i18n.t('shopxo-uniapp.app.08cg8y'));
                } else {
                    // 拼接基础参数
                    url = this.request_params_handle(url);
                    // 拼接当前页面地址
                    var route = this.current_page();
                    url += '&source=' + encodeURIComponent(base64.encode(route).replace(new RegExp(/=/g), ''));
                    // 打开webview
                    this.open_web_view(url);
                }
            },

            // 用户自动登录处理
            user_auto_login_handle() {
                // #ifdef H5
                var user = this.get_user_cache_info();
                if (user == null) {
                    var params = this.get_launch_cache_info() || {};
                    var config = this.get_config('plugins_base.thirdpartylogin.data') || null;
                    var data = this.get_config('plugins_thirdpartylogin_data') || null;
                    var url = null;
                    // 是否微信环境
                    if ((params.thirdpartylogin || null) == null && config != null && data != null && this.is_weixin_env()) {
                        var is_auto = config.weixin_is_env_auto_login || 0;
                        var weixin = data.weixin || null;
                        if (is_auto != 0 && weixin != null) {
                            url = weixin.login_url;
                        }
                    }
                    // 存在登录url则跳转登录
                    if (url != null) {
                        // 上一个页面记录
                        var page = this.current_page();
                        if (page != null) {
                            uni.setStorageSync(this.data.cache_prev_page_key, page);
                        }
                        // 跳转登录
                        window.location.href = url;
                    }
                }
                // #endif
            },

            // 清除用户缓存
            remove_user_cache_event(is_remove_user = true) {
                // 当前平台
                var client_value = this.application_client();
                // 是否清除用户登录信息
                if(is_remove_user) {
                    // 用户登录缓存
                    uni.removeStorageSync(this.data.cache_user_login_key);
                    // 用户信息缓存
                    uni.removeStorageSync(this.data.cache_user_info_key);
                }
                // 未登录提示缓存记录
                uni.removeStorageSync(this.data.cache_user_no_login_page_status_data_key);
                // 用户基础资料提示间隔key
                uni.removeStorageSync(this.data.cache_user_base_personal_interval_time_key);
                // app更新提示缓存记录key
                uni.removeStorageSync(this.data.cache_app_update_tips_interval_time_key);
                // app评分提示缓存记录key
                uni.removeStorageSync(this.data.cache_app_star_tips_interval_time_key);

                // 非小程序则两秒后回到首页
                this.showToast(i18n.t('shopxo-uniapp.app.'+((client_value == 'mp' || !is_remove_user) ? '0gwt7z' : '87yghj')), 'success');
            },

            // 是否站点变灰
            is_app_mourning() {
                var is_app = parseInt(this.get_config('plugins_base.mourning.data.is_app', 0));
                if (is_app == 1) {
                    // 当前时间戳
                    var time_current = Date.parse(new Date());
                    // 开始时间
                    var time_start = this.get_config('plugins_base.mourning.data.time_start') || null;
                    if (time_start != null) {
                        if (Date.parse(new Date(time_start)) > time_current) {
                            return false;
                        }
                    }
                    // 结束时间
                    var time_end = this.get_config('plugins_base.mourning.data.time_end') || null;
                    if (time_end != null) {
                        if (Date.parse(new Date(time_end)) < time_current) {
                            return false;
                        }
                    }
                    return true;
                }
                return false;
            },

            // 价格符号
            currency_symbol() {
                return this.get_config('currency_symbol') || this.data.currency_symbol;
            },

            // 位置权限校验
            get_location_check(type, object, method) {
                // #ifdef MP-WEIXIN || MP-BAIDU || MP-TOUTIAO || MP-QQ
                var self = this;
                uni.getSetting({
                    success(res) {
                        if (!res.authSetting[type]) {
                            uni.authorize({
                                scope: type,
                                success(res) {
                                    if (typeof object === 'object' && (method || null) != null) {
                                        object[method](1);
                                    }
                                },
                                fail: (res) => {
                                    if (typeof object === 'object' && (method || null) != null) {
                                        object[method](0);
                                    }
                                },
                            });
                        } else {
                            if (typeof object === 'object' && (method || null) != null) {
                                object[method](1);
                            }
                        }
                    },
                    fail: (res) => {
                        self.showToast(i18n.t('shopxo-uniapp.app.di6v5t'));
                        if (typeof object === 'object' && (method || null) != null) {
                            object[method](0);
                        }
                    },
                });
                // #endif
                // #ifdef MP-ALIPAY || H5 || APP
                if (typeof object === 'object' && (method || null) != null) {
                    object[method](1);
                }
                // #endif
                // #ifdef MP-KUAISHOU
                self.showToast(i18n.t('shopxo-uniapp.app.nu5058'));
                if (typeof object === 'object' && (method || null) != null) {
                    object[method](0);
                }
                // #endif
            },

            // 启动位置监听（0 打开位置实时监听、1小程序后台运行也监听（仅微信、快手）小程序支持）
            start_location_update(type = 0, object, method) {
                // 非微信和快手小程序type=1则赋值为0
                // #ifndef MP-WEIXIN || MP-KUAISHOU
                if (type == 1) {
                    type = 0;
                }
                // #endif

                // 如果页面已存在位置调用则不重复调用
                var page = this.current_page(false);
                var temp_location = this.data.location_update_page_temp_record_data;
                if (temp_location.indexOf(page) == -1) {
                    // 根据类型调用api
                    if (type == 1) {
                        // 开始监听实时地理位置信息变化事件，小程序进入前后台时均接收实时地理位置信息
                        // 这个方法仅微信和快手小程序支持
                        // #ifdef MP-WEIXIN || MP-KUAISHOU
                        uni.startLocationUpdateBackground({
                            success: (res) => {
                                // 增加页面记录
                                temp_location.push(page);
                                this.data.location_update_page_temp_record_data = temp_location;

                                // 调用位置监听方法
                                this.start_location_update_change(object, method);
                            },
                            fail: (res) => {
                                if (typeof object === 'object' && (method || null) != null) {
                                    object[method]({
                                        status: 0,
                                        msg: res.errMsg,
                                    });
                                }
                            },
                        });
                        // #endif
                    } else {
                        // 打开位置监听
                        uni.startLocationUpdate({
                            success: (res) => {
                                // 增加页面记录
                                temp_location.push(page);
                                this.data.location_update_page_temp_record_data = temp_location;

                                // 调用位置监听方法
                                this.start_location_update_change(object, method);
                            },
                            fail: (res) => {
                                if (typeof object === 'object' && (method || null) != null) {
                                    object[method]({
                                        status: 0,
                                        msg: res.errMsg,
                                    });
                                }
                            },
                        });
                    }
                }
            },

            // 位置监听改变
            start_location_update_change(object, method) {
                uni.onLocationChange((res) => {
                    if (typeof object === 'object' && (method || null) != null) {
                        object[method]({
                            status: 1,
                            lng: res.longitude,
                            lat: res.latitude,
                            data: res,
                        });
                    }
                });
            },

            // 网络状态检查处理
            network_type_handle(object, method, params = {}) {
                // 如果页面已存在位置调用则不重复调用
                var page = this.current_page(false);
                var temp_network = this.data.network_type_page_record_timer || {};
                var temp = temp_network[page] || null;
                if (temp == null) {
                    var self = this;
                    temp_network[page] = {
                        object: object,
                        method: method,
                        params: params,
                    };
                    temp_network[page]['timer'] = setInterval(function () {
                        uni.getNetworkType({
                            success: function (res) {
                                if (res.networkType != 'none' && (temp_network[page] || null) != null) {
                                    // 已初始化则清除定时任务
                                    if ((temp_network[page]['timer'] || null) != null) {
                                        clearInterval(temp_network[page]['timer']);
                                    }
                                    var pv = temp_network[page];
                                    delete temp_network[page];
                                    self.data.network_type_page_record_timer = temp_network;
                                    // 回调页面
                                    if (typeof pv.object === 'object' && (pv.method || null) != null) {
                                        pv.object[pv.method]({ ...(pv.params || {}), ...{ loading: 1 } });
                                    }
                                }
                            },
                        });
                    }, 500);
                    this.data.network_type_page_record_timer = temp_network;
                }
            },

            // 获取主题色值
            // is_light 是否获取浅主色（false, true）
            get_theme_color(theme, is_light = false) {
                let color_obj = {
                    // 主色
                    red: '#ff0036', // 红色
                    yellow: '#f6c133', // 黄色
                    black: '#333333', // 黑色
                    blue: '#1677ff', // 蓝色
                    green: '#20a53a', // 绿色
                    orange: '#fe6f04', // 橙色
                    brown: '#8B4513', // 棕色
                    purple: '#623cec', // 紫色

                    // 浅主色
                    red_light: '#ffdbe2', // 红色
                    yellow_light: '#ffebd2', // 黄色
                    black_light: '#dcdcdc', // 黑色
                    blue_light: '#d1e4ff', // 蓝色
                    green_light: '#cce8d2', // 绿色
                    orange_light: '#fde4d1', // 橙色
                    brown_light: '#eadcd2', // 棕色
                    purple_light: '#d6cbfb', // 紫色
                };
                // 当前主题
                if ((theme || null) == null) {
                    theme = this.get_theme_value();
                }
                if (is_light) {
                    theme += '_light';
                }
                return color_obj[theme];
            },

            // 获取主题页面标识
            get_theme_value_view() {
                return 'theme-' + this.get_theme_value();
            },

            // 获取主题
            get_theme_value() {
                // 主题类型        主题颜色
                // 红色 red       #ff0036
                // 黄色 yellow    #f6c133
                // 黑色 black     #333333
                // 绿色 green     #20a53a
                // 橙色 orange    #fe6f04
                // 蓝色 blue      #1677ff
                // 棕色 brown     #8B4513
                // 紫色 purple    #623cec
                return uni.getStorageSync('theme') || this.data.default_theme;
            },

            // 切换主题
            set_theme_value(value) {
                // 设置主题缓存
                uni.setStorageSync('theme', value || this.data.default_theme);
            },

            // 底部菜单设置
            set_tabbar(theme) {
                if(this.data.is_use_native_tabbar == 1) {
                    // 当前主题
                    if ((theme || null) == null) {
                        theme = this.get_theme_value();
                    }

                    // 整体样式
                    uni.setTabBarStyle({
                        selectedColor: this.get_theme_color(theme),
                        color: '#333',
                        backgroundColor: '#fff',
                        borderStyle: 'black'
                    });

                    // 菜单
                    uni.setTabBarItem({
                        index: 0,
                        iconPath: 'static/images/common/tabbar/home.png',
                        selectedIconPath: 'static/images/' + theme + '/tabbar/home.png',
                        text: i18n.t('common.home'),
                    });
                    uni.setTabBarItem({
                        index: 1,
                        iconPath: 'static/images/common/tabbar/category.png',
                        selectedIconPath: 'static/images/' + theme + '/tabbar/category.png',
                        text: i18n.t('common.category'),
                    });
                    uni.setTabBarItem({
                        index: 2,
                        iconPath: 'static/images/common/tabbar/cart.png',
                        selectedIconPath: 'static/images/' + theme + '/tabbar/cart.png',
                        text: i18n.t('common.cart'),
                    });
                    uni.setTabBarItem({
                        index: 3,
                        iconPath: 'static/images/common/tabbar/user.png',
                        selectedIconPath: 'static/images/' + theme + '/tabbar/user.png',
                        text: i18n.t('common.my'),
                    });
                }
            },

            // 数组分组
            group_arry(arry, sub_group_length) {
                let index = 0;
                let new_arry = [];
                if (arry.length > sub_group_length) {
                    while (index < arry.length) {
                        new_arry.push(arry.slice(index, (index += sub_group_length)));
                    }
                } else {
                    new_arry = [arry];
                }
                return new_arry;
            },

            // 数组分组
            group_arry(arry, sub_group_length) {
                let index = 0;
                let new_arry = [];
                if (arry.length > sub_group_length) {
                    while (index < arry.length) {
                        new_arry.push(arry.slice(index, (index += sub_group_length)));
                    }
                } else {
                    new_arry = [arry];
                }
                return new_arry;
            },

            // 颜色转rgba hexValue： 色值  alpha：透明度
            hex_rgba(hexValue, alpha) {
                const rgx = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
                const hex = hexValue.replace(rgx, (m, r, g, b) => r + r + g + g + b + b);
                const rgb = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
                if (!rgb) {
                    return hexValue;
                }
                const r = parseInt(rgb[1], 16),
                    g = parseInt(rgb[2], 16),
                    b = parseInt(rgb[3], 16);
                return `rgba(${r},${g},${b},${alpha})`;
            },

            // 判断数组内是否含有相同字段
            some_arry(arr, val, params) {
                return arr.some(function (arrVal) {
                    if (params) {
                        return val === arrVal[params];
                    } else {
                        return val === arrVal;
                    }
                });
            },

            // 更新当前url参数
            // query:[{key:'',value:''}]
            update_query_string_parameter(query = []) {
                // #ifdef H5
                let url = window.location.href;
                // 判断没有参数时
                if (query.length < 1) {
                    //向当前url添加参数，没有历史记录
                    window.history.replaceState({ path: url.split('?')[0] }, '', url.split('?')[0]);
                } else {
                    query.forEach((item) => {
                        let re = new RegExp('([?&])' + item.key + '=.*?(&|$)', 'i');
                        let separator = url.indexOf('?') !== -1 ? '&' : '?';
                        if (url.match(re)) {
                            url = url.replace(re, '$1' + item.key + '=' + item.value + '$2');
                        } else {
                            url += separator + item.key + '=' + item.value;
                        }
                    });
                    //向当前url添加参数，没有历史记录
                    window.history.replaceState({ path: url }, '', url);
                }
                // #endif
            },

            // 计算文本宽度
            string_width(value, max = null) {
                var width = 0;
                var reg = /^[A-Za-z0-0]+$/;
                var arr = value.split('');
                for (var i in arr) {
                    width += reg.test(arr[i]) ? 34 : 50;
                }
                return max !== null && width > max ? max : width;
            },

            // weburl地址id值匹配
            web_url_value_mate(url, rules) {
                // 匹配成功
                var status = 0;
                // 存在数据值
                var value = null;
                for (var i in rules) {
                    if (url.indexOf(rules[i]) != -1) {
                        var temp = url.split(rules[i]);
                        if (temp.length > 1) {
                            temp = temp[1].split('.');
                            if (temp.length > 0 && (temp[0] || null) != null) {
                                value = temp[0];
                            }
                        }
                        status = 1;
                        break;
                    }
                }
                return { status: status, value: value };
            },

            // 打开权限管理中心
            open_setting_event() {
                // #ifdef MP
                uni.openSetting();
                // #endif
                // #ifdef APP
                uni.openAppAuthorizeSetting();
                // #endif
            },

            // 扫码解析处理
            scan_handle() {
                // #ifdef H5
                this.showToast(i18n.t('common.not_supported_scan_tips'));
                // #endif
                // #ifndef H5
                var self = this;
                uni.scanCode({
                    success: function (res) {
                        if (res.result !== '') {
                            var value = res.result;
                            // 是否为url地址
                            if (self.is_url(value)) {
                                // 是否为商品地址
                                var goods_arr = ['/goods-', '/goods/index/id/', '=goods/index/id/'];
                                var goods_ret = self.web_url_value_mate(value, goods_arr);
                                if (goods_ret.status == 1 && goods_ret.value != null) {
                                    uni.navigateTo({
                                        url: '/pages/goods-detail/goods-detail?id=' + goods_ret.value,
                                    });
                                    return;
                                }

                                // 是否为多商户店铺详情地址
                                var shop_arr = ['/shop-index-detail-', '/plugins/index/pluginsname/shop/pluginscontrol/index/pluginsaction/detail/id/', '=plugins/index/pluginsname/shop/pluginscontrol/index/pluginsaction/detail/id/'];
                                var shop_ret = self.web_url_value_mate(value, shop_arr);
                                if (shop_ret.status == 1 && shop_ret.value != null) {
                                    uni.navigateTo({
                                        url: '/pages/plugins/shop/detail/detail?id=' + shop_ret.value,
                                    });
                                    return;
                                }

                                // 是否为扫码收款
                                var scanpay_arr = ['/scanpay-index-index', 'plugins/index/pluginsname/scanpay/pluginscontrol/index/pluginsaction/index', 'plugins/index/pluginsname/scanpay', '/scanpay'];
                                var scanpay_ret = self.web_url_value_mate(value, scanpay_arr);
                                if (scanpay_ret.status == 1) {
                                    var url = '/pages/plugins/scanpay/index/index';
                                    if (scanpay_ret.value != null) {
                                        var first = scanpay_ret.value.substr(0, 1);
                                        if (first == '-') {
                                            var temp = scanpay_ret.value.substr(1).split('/');
                                            if (temp.length == 3) {
                                                url += '?id=' + temp[0] + '&type=' + temp[2];
                                            }
                                        } else if (first == '/') {
                                            var temp = scanpay_ret.value.substr(1).split('/');
                                            if (temp.length == 4) {
                                                url += '?id=' + temp[1] + '&type=' + temp[3];
                                            }
                                        }
                                    }
                                    uni.navigateTo({
                                        url: url,
                                    });
                                    return;
                                }

                                // 是否为扫码登录
                                var thirdpartylogin_arr = ['/thirdpartylogin-scan-index-', 'plugins/index/pluginsname/thirdpartylogin/pluginscontrol/scan/pluginsaction/index/id/'];
                                var thirdpartylogin_ret = self.web_url_value_mate(value, thirdpartylogin_arr);
                                if (thirdpartylogin_ret.status == 1 && thirdpartylogin_ret.value != null) {
                                    uni.navigateTo({
                                        url: '/pages/plugins/thirdpartylogin/index/index?id=' + thirdpartylogin_ret.value,
                                    });
                                    return;
                                }

                                // 默认打开url
                                self.open_web_view(value);
                            } else {
                                self.url_open(value);
                            }
                        }
                    },
                });
                // #endif
            },

            // 获取当前语言
            get_language_value() {
                // 当前系统语言、默认中文
                let value = uni.getLocale() || this.data.default_language;
                // 语言标识转换和后端一致
                let arr = {
                    'zh-Hans': 'zh',
                    'zh-Hant': 'cht',
                    'en-US': 'en',
                    'es': 'spa',
                    'fra': 'fr',
                };
                return ((arr[value] || null) == null) ? value : arr[value];
            },

            // 选择用户地理位置
            choose_user_location_event() {
                // 存在数据则改变状态值
                var key = this.data.cache_userlocation_key;
                var result = uni.getStorageSync(key) || null;
                if(result != null) {
                    result['status'] = 2;
                    uni.setStorageSync(key, result);
                }

                // 进入页面选择位置
                uni.navigateTo({
                    url: '/pages/common/open-setting-location/open-setting-location',
                });
            },

            // 清除位置缓存信息
            choice_user_location_remove() {
                uni.removeStorageSync(this.data.cache_userlocation_key);
            },

            // 地址信息初始化
            choice_user_location_init() {
                // status 0未选择，1已选择，2选择中，3选择失败
                var result = uni.getStorageSync(this.data.cache_userlocation_key) || null;
                var user_location = { status: 0 };
                if (result != null) {
                    user_location = {
                        ...user_location,
                        ...{
                            name: result.name || null,
                            address: result.address || null,
                            lat: result.lat || null,
                            lng: result.lng || null,
                            status: result.status || 1,
                        },
                    };
                }
                // 默认名称
                var default_name = i18n.t('shopxo-uniapp.app.4v6q86');
                // 位置选择失败的状态，名称和默认名称不一致则认为是成功的
                if(user_location.status == 3 && user_location.name != default_name) {
                    user_location.status = 1;
                }
                user_location['text'] = user_location.name || user_location.address || default_name;
                return user_location;
            },

            // 获取用户当前位置
            // object    回调对象
            // method    回调方法
            // is_force  强制获取位置
            get_user_location(object = null, method = null, is_force = false) {
                if(this.data.get_user_location_status == 1 || is_force) {
                    var cache_key = this.data.cache_userlocation_key;
                    var result = uni.getStorageSync(cache_key) || null;
                    if(result == null) {
                        // 当前对象
                        var self = this;
                        // 当前平台
                        var client_value = self.application_client_type();
                        // 微信隐私状态
                        var is_weixin_privacy = false;
                        // 是否有网络
                        var is_network = false;
                        // 定时验证并获取位置权限
                        self.data.get_user_location_timer = setInterval(function () {
                            // 微信环境、协议验证处理
                            // #ifdef MP-WEIXIN
                            uni.getPrivacySetting({
                                success: (res) => {
                                    if (!res.needAuthorization) {
                                        is_weixin_privacy = true;
                                    }
                                },
                            });
                            // #endif

                            // app下先要网络
                            // #ifdef APP
                            uni.getNetworkType({
                                success: function (res) {
                                    if (res.networkType != 'none') {
                                        is_network = true;
                                    }
                                },
                            });
                            // #endif

                            // 是否可以读取位置权限
                            var status = true;
                            // 微信环境、必须先同意隐私权限后再弹出获取用户位置权限
                            if(client_value == 'weixin' && !is_weixin_privacy) {
                                status = false;
                            }
                            // app环境、必须先初始化完成有网络后再弹出获取用户位置权限
                            if((client_value == 'ios' || client_value == 'android') && !is_network) {
                                status = false;
                            }
                            if(status) {
                                uni.getLocation({
                                    type: 'wgs84',
                                    success: function (res) {
                                        var address = {
                                            name: i18n.t('shopxo-uniapp.app.tghyu3'),
                                            address: '',
                                            lat: res.latitude || null,
                                            lng: res.longitude || null,
                                            status: 1,
                                        };
                                        uni.setStorageSync(cache_key, address);
                                        if (typeof object === 'object' && (method || null) != null) {
                                            object[method](address);
                                        }
                                    }
                                });
                                clearInterval(self.data.get_user_location_timer);
                            }
                        }, 500);
                    }
                }
            },

            // 清除定时任务
            clear_interval_handle() {
                // 清除初始化公共数据回调方法定时任务
                clearInterval(this.data.common_data_init_back_timer);
                // 清除网络状态检查方法定时任务
                var network = this.data.network_type_page_record_timer || null;
                if (network != null) {
                    for (var i in network) {
                        if ((network[i]['timer'] || null) != null) {
                            clearInterval(network[i]['timer']);
                        }
                    }
                }
                this.data.network_type_page_record_timer = null;
                // 清除弹出位置权限提示定时任务
                clearInterval(this.data.get_user_location_timer);
            },

            // 商品访问数据存储缓存
            goods_data_cache_handle(goods_id, goods_data = null) {
                var key = this.data.cache_goods_data_key;
                if((goods_data || null) == null) {
                    var res = uni.getStorageSync(key) || null;
                    return (res != null && res.id == goods_id) ? res : null;
                } else {
                    uni.setStorageSync(key, goods_data);
                }
            },

            // 页面导航标题处理
            set_pages_navigation_bar_title() {
                // 标题
                var value = null;
                // 当前平台
                var client_value = this.application_client_type();
                // 当前页面地址
                var url = this.current_page(false);
                // 不参与设置页面标题
                var no_setup_pages = [
                    'pages/login/login'
                ];
                if(no_setup_pages.indexOf(url) != -1) {
                    return false;
                }
                // 支付宝平台以下条件不增加标题
                if(client_value == 'alipay') {
                    // 自定义头页面
                    var pages_always = [
                        'pages/plugins/realstore/detail/detail',
                        'pages/plugins/seckill/index/index',
                        'pages/plugins/points/index/index',
                        'pages/plugins/coupon/index/index',
                        'pages/plugins/signin/detail/detail',
                        'pages/plugins/membershiplevelvip/index/index',
                        'pages/plugins/ask/index/index',
                        'pages/cashier/cashier'
                    ];
                    // 当前tab页面
                    if(this.is_system_tabbar_pages('/'+url) != -1 || pages_always.indexOf(url) != -1) {
                        value = '';
                    }
                }
                // 还没有标题则根据页面自动处理
                if(value === null) {
                    // 解析处理key
                    var arr = url.split('/');
                        arr = arr.slice(1);
                        arr = arr.slice(0, -1);
                    var key = 'pages.'+arr.join('-');
                    // 读取语言
                    var value = i18n.t(key);
                    // 首页则读取当前应用名称
                    if(this.app_tabbar_pages()[0] == '/'+url) {
                        value = this.get_application_title();
                    }
                }
                // 设置标题
                uni.setNavigationBarTitle({
                    title: value || ''
                });
            },

            // 设置导航背景色和颜色
            set_navigation_bar_color(is_white = null) {
                var color = '#000000';
                var bg_color = '#ffffff';
                var arr = [
                    'pages/index/index',
                ];
                var page = this.current_page(false);
                if(is_white === true || (is_white === null && arr.indexOf(page) != -1)) {
                    color = '#ffffff';
                    bg_color = '#000000';
                }
                uni.setNavigationBarColor({
                    frontColor: color,
                    backgroundColor: bg_color,
                });
            },

            // 底部浮动按钮样式处理
            bottom_fixed_style_handle() {
                var obj = this.get_page_object();
                if(obj != null) {
                    // undefined值表示未定义则不处理
                    var temp = obj.bottom_fixed_style == undefined ? ((obj.data || null) == null ? undefined : obj.data.bottom_fixed_style) : '';
                    if(temp !== undefined && this.is_tabbar_pages()) {
                        obj.$vm.setData(
                        {
                            bottom_fixed_style: 'bottom:'+(((this.app_system_tabbar_height_value()-8)*2)+20)+'rpx'
                        });
                    }
                }
            },

            // 页面加载事件处理
            page_event_onload_handle(params) {
                // 获取用户当前位置
                this.get_user_location();
            },

            // 页面展示事件处理
            page_event_onshow_handle() {
                //隐藏系统tabbar
                this.system_hide_tabbar();

                // 底部浮动按钮样式处理
                this.bottom_fixed_style_handle();

                // 页面顶部导航标题设置
                this.set_pages_navigation_bar_title();

                // 设置导航背景色和颜色
                this.set_navigation_bar_color();
            },
        },

        // 初始化完成时触发（全局只触发一次）
        onLaunch(params) {
            //隐藏系统tabbar
            this.globalData.system_hide_tabbar();
        },

        // 启动，或从后台进入前台显示
        onShow(params) {
            //隐藏系统tabbar
            this.globalData.system_hide_tabbar();

            // 公共数据初始化
            this.globalData.init_config();

            // 设置设备信息
            this.globalData.set_system_info();

            // 参数处理+缓存
            this.globalData.set_launch_cache_info(params);

            // 场景值
            this.globalData.set_scene_data(params);
        },

        // 从前台进入后台
        onHide() {
            this.globalData.clear_interval_handle();
        },

        // 监听应用退出
        onExit() {
            this.globalData.clear_interval_handle();
        },
        methods: {},
    };
</script>
<style>
    @import './common/css/page.css';
    @import './common/css/business.css';
    @import './common/css/plugins.css';
    @import './common/css/lib.css';
    @import './common/css/theme.css';
    @import './common/css/animation.css';
</style>