Jelajahi Sumber

feat:功能基本完成

徐志豪 5 tahun lalu
induk
melakukan
e06c9742f1

+ 3 - 0
admin/src/components/upload/video.vue

@@ -168,4 +168,7 @@ export default {
     color:rgba(255,255,255,0.38);
     line-height: 1;
   }
+  .file-item {
+    cursor: pointer;
+  }
 </style>

+ 7 - 6
admin/src/views/enterprise/components/baseForm.vue

@@ -18,7 +18,7 @@
           </i-col>
           <i-col :span="12" class="">
             <FormItem label="成立时间" prop="companyRegisterTime">
-              <Date-picker :value="form.companyRegisterTime" type="year" size="large" placeholder=""  :disabled="isDetail" @on-change="changeDate"></Date-picker>
+              <Date-picker v-model="form.companyRegisterTime" type="year" size="large" placeholder=""  :disabled="isDetail" @on-change="changeDate"></Date-picker>
             </FormItem>
           </i-col>
           <i-col :span="12" class="">
@@ -32,8 +32,8 @@
             </FormItem>
           </i-col>
           <i-col :span="12" class="">
-            <FormItem label="主要产品" prop="mainProductDesc">
-              <Input type="text" size="large" v-model="form.mainProductDesc" :disabled="isDetail" />
+            <FormItem label="主要产品" prop="mainProduct">
+              <Input type="text" size="large" v-model="form.mainProduct" :disabled="isDetail" />
             </FormItem>
           </i-col>
           <i-col :span="12" class="">
@@ -141,7 +141,7 @@ export default {
         companyRegisterTime: [{ required: true, message: '请填写成立时间', trigger: 'change'}],
         staffNum: [{ required: true, message: '请填写员工人数', trigger: 'blur' }],
         registerFund: [{ required: true, message: '请填写注册资金', trigger: 'blur' }],
-        mainProductDesc: [{ required: true, message: '请填写主要产品描述', trigger: 'blur' }],
+        mainProduct: [{ required: true, message: '请填写主要产品描述', trigger: 'blur' }],
       },
       tableColumns: [
         {
@@ -291,9 +291,10 @@ export default {
       })
     },
     clickMap (value) {
+      console.log(value)
       this.form.companyAddress = value.address
-      this.form.latitude = value.location.latitude
-      this.form.longitude = value.location.longitude
+      this.form.latitude = value.location.lat
+      this.form.longitude = value.location.lng
     },
     changeDate (date) {
       console.log(date)

+ 17 - 7
admin/src/views/enterprise/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="enterprise min-container">
     <div class="header-title">公司概况
-      <Button type="primary" size="large" class="fr" @click="isDetail=false" v-if="$route.query.companyId">修改信息</Button>
+      <Button type="primary" size="large" class="fr" @click="isDetail=false" v-if="companyId">修改信息</Button>
     </div>
     <baseForm :form="form" ref="base-form" :isDetail="isDetail" />
     <div class="header-title">视频介绍</div>
@@ -10,7 +10,7 @@
     <introPicForm :form="form" ref="intro-form" :isDetail="isDetail" />
     <div class="actions-w">
       <Button type="primary" size="large" class="submit-btn" @click="handleSubmitClick" v-if="!isDetail">提交</Button>
-      <Button  size="large" @click="cancle" v-if="$route.query.companyId && !isDetail">取消</Button>
+      <Button  size="large" @click="cancle" v-if="companyId && !isDetail">取消</Button>
     </div>
     
   </div>
@@ -21,6 +21,8 @@ import * as CompanyApi from '@/api/company'
 import baseForm from './components/baseForm'
 import videoForm from './components/videoForm'
 import introPicForm from './components/introPicForm'
+import { getAdmin } from '@/libs/token'
+
 export default {
   data () {
     return {
@@ -39,6 +41,12 @@ export default {
     videoForm,
     introPicForm
   },
+  computed: {
+    companyId () {
+      let admin = getAdmin().admin
+      return this.$route.query.companyId || admin.belongCompanyId
+    }
+  },
   mounted () {
     this.getCompanyDetail()
   },
@@ -47,7 +55,6 @@ export default {
        return this.validate()
     },
     async validate () {
-      this.$refs['base-form'].validate()
       let res = await Promise.all([this.$refs['base-form'].validate()])
       let item = res.find(item => !item)
       if (item === false) {
@@ -58,16 +65,19 @@ export default {
     },
     async submit () {
       await Promise.all([this.$refs['base-form'].submit(), this.$refs['video-form'].submit(), this.$refs['intro-form'].submit()])
-      return CompanyApi.addCompany(this.form)
+      let api = this.form.companyId ? CompanyApi.updateCompany : CompanyApi.addCompany
+      return api(this.form).then(() => {
+        this.$Message.success('修改成功')
+      })
     },
     cancle () {
       window.location.reload()
     },
     getCompanyDetail () {
-      if (!this.$route.query.companyId) return
-      CompanyApi.getCompanyDetail(this.$route.query.companyId).then(res => {
+      if (!this.companyId) return
+      CompanyApi.getCompanyDetail(this.companyId).then(res => {
         this.isDetail = true
-        this.form = res.data
+        this.form = res.data.company
       })
     }
   }

+ 10 - 1
miniprogram/apis/index.js

@@ -4,7 +4,8 @@ export default {
   getCompanyList (data) {
     data = Object.assign({
       pageNum: 1,
-      pageSize: 999
+      pageSize: 999,
+      tradeName: ''
     }, data)
     return request.get('company/getCompanyList', data)
   },
@@ -23,5 +24,13 @@ export default {
   },
   getGoodsDetail (goodsId) {
     return request.get('goods/getGoodsDetail', { goodsId })
+  },
+  postApiData (data) {
+    console.log(data, 'data')
+    let app = getApp()
+    let defaultData = {
+      userId: app.globalData.userinfo ? app.globalData.userinfo.userId : ''
+    }
+    return request.post('company/sendData', Object.assign(defaultData, data))
   }
 }

+ 7 - 2
miniprogram/components/login-pannel/login-pannel.js

@@ -15,13 +15,18 @@ Component({
   },
   ready () {
     this.showPannel()
+    wx.login({
+      success: (res) => {
+        this.wx_code = res.code
+      }
+  })
   },
   /**
    * 组件的方法列表
    */
   methods: {
-    bindgetuserinfo () {
-      loginByUserInfo().then(res => {
+    bindgetuserinfo (e) {
+      loginByUserInfo(e.detail, this.wx_code).then(res => {
         this.triggerEvent('loginSuccess')
       })
     },

+ 1 - 1
miniprogram/components/tab-bar/tab-bar.js

@@ -75,7 +75,7 @@ Component({
       
       const currentRoute = getCurrentPages()[0].route
       const { tabItems } = this.data
-      tabItems[3].info = app.globalData.unViewMsg
+      tabItems[2].info = app.globalData.unViewMsg
       tabItems.forEach((item, index) => {
         if ($router.tabRoutes[item.url] && $router.tabRoutes[item.url].indexOf(currentRoute) !== -1) {
           this.setData({

+ 0 - 1
miniprogram/config/config.js

@@ -8,5 +8,4 @@ export const API_BASE_URL = 'http://120.25.146.52:8075'
 
 
 // export const IM_HOST = 'wss://vrhouse.4dkankan.com'
-
 // export const API_BASE_URL = 'https://vrhouse.4dkankan.com'

+ 0 - 2
miniprogram/modules/chat-page/word.wxml

@@ -37,8 +37,6 @@
                 <image  src="{{image_url}}" mode="aspectFill" />
                 <view class="vr-intro">
                     <view class="chat-item-name">{{ house_name }}</view>
-                    <view>{{house_type}}/{{house_area}}m²/{{orientation}}</view>
-                    <view class="price">{{price}}</view>
                 </view>
                 <view class="click-text" wx:if="{{ vr_link }}">进入云带看</view>
             </view>

+ 25 - 5
miniprogram/pages/business-card/business-card.js

@@ -3,23 +3,35 @@ import UserApi from '../../apis/user'
 import Router from '../../utils/routes'
 VueLikePage([], {
   data: {
-    my_info: getApp().globalData.userinfo
+    my_info: getApp().globalData.userinfo,
+    activeType: 0,
+    business_0: [],
+    business_1: []
   },
   methods: {
     onShow () {
       
       this.getBusinessCardList()
+      this.getBusinessCardList(1)
       this.setData({
         my_info: getApp().globalData.userinfo
       })
     },
-    getBusinessCardList () {
-      return UserApi.getVisitCardList().then(res => {
+    getBusinessCardList (type=0) {
+      return UserApi.getVisitCardList(type).then(res => {
         let list = res.data.list
         this.origin_list = list
-        this.setData({
-          business_list: list
+        let activeType = this.data.activeType
+        let data = {}
+        
+        data[`business_${type}`] = list.map(item => {
+          item.createTime = item.createTime.slice(0, 10)
+          return item
         })
+        if (activeType == type) {
+          data.business_list = data[`business_${type}`]
+        }
+        this.setData(data)
       })
     },
     bindinput (e) {
@@ -45,6 +57,14 @@ VueLikePage([], {
       wx.makePhoneCall({
         phoneNumber: phone
       })
+    },
+    changeActiveType (e) {
+      let { type } = e.currentTarget.dataset
+      let obj = {
+        activeType: type
+      }
+      obj.business_list = this.data[`business_${type}`]
+      this.setData(obj)
     }
   }
 })

+ 6 - 3
miniprogram/pages/business-card/business-card.wxml

@@ -18,8 +18,10 @@
   </view>
 
   <view class="friend-card-w">
-    <view class="title m-t-32">收到的名片({{ business_list.length }})</view>
-    
+    <view class="title m-t-32">
+      <view class="title-item {{ activeType == 0 ? 'is-active' : ''}}"  bindtap="changeActiveType" data-type="{{0}}">交换<text>({{ business_0.length }})</text></view>
+      <view class="title-item {{ activeType == 1 ? 'is-active' : ''}}"  bindtap="changeActiveType" data-type="{{1}}">扫描<text>({{ business_1.length }})</text></view>
+    </view>
     <view class="friend-card-content">
       <view class="friend-card-item" wx:for="{{business_list}}" wx:key="{{index}}"  bindtap="toBusinessCard" data-id="{{ item.viewerId }}">
         <view class="card">
@@ -29,8 +31,9 @@
           <view class="title">{{ item.name }}</view>
           <view class="info-type">{{ item.companyPosition || '' }}</view>
           <view class="info-type company">{{ item.companyName || '' }}</view>
+          <view class="create-time">{{ item.createTime }}</view>
           <view class="call">
-            <icon icon="maps_call" catchtap="callPhone" data-phone="{{ item.phoneNum }}" />
+            <icon icon="maps_call" catchtap="callPhone" size="24" data-phone="{{ item.phoneNum }}" />
           </view>
         </view>
       </view>

File diff ditekan karena terlalu besar
+ 40 - 7
miniprogram/pages/business-card/business-card.wxss


+ 2 - 1
miniprogram/pages/exhibition-enterprise/exhibition-enterprise.js

@@ -1,4 +1,5 @@
 import { VueLikePage } from '../../utils/page'
+import Api from '../../apis/index'
 import exhibitionApi from '../../apis/exhibition'
 import Router from '../../utils/routes'
 VueLikePage([], {
@@ -25,7 +26,7 @@ VueLikePage([], {
       })
     },
     getCompanyByHall () {
-      return exhibitionApi.getCompanyByHall(this.selectHall).then(res => {
+      return Api.getCompanyList({tradeName: this.selectHall}).then(res => {
         return res
       })
     },

+ 24 - 5
miniprogram/pages/exhibition-register/exhibition-register.js

@@ -1,13 +1,32 @@
 import { VueLikePage } from '../../utils/page'
-import exhibitionApi from '../../apis/exhibition'
-import Router from '../../utils/routes'
+import displayApi from '../../apis/exhibition'
 VueLikePage([], {
   data: {
-    active: 0,
-    tabs: []
+
   },
   methods: {
-    async onLoad () {
+    onLoad () {
+      displayApi.getExhibitionDetail().then(res => {
+        this.setData({
+          html: this.formatImg(res.data.contactUs)
+        })
+      })
     },
+    formatImg: function (html) {
+      var newContent = html.replace(/<img[^>]*>/gi, function (match, capture) {
+        let processed=null;
+        //如果原img标签不存在style属性值
+        if(!match.match(/style=\"(.*)\"/gi)){
+          processed=match.replace(/\<img/g, '<img style="width:100%;height:auto;display:block"');
+        }else{
+          processed = match.replace(/style=\"(.*)\"/gi, 'style="width:100%;height:auto;display:block"');
+        }
+        
+        return processed;
+      })
+      return newContent;
+    },
+    collect (e) {
+    }
   }
 })

+ 1 - 1
miniprogram/pages/exhibition-register/exhibition-register.json

@@ -1,4 +1,4 @@
 {
   "usingComponents": {},
-  "navigationBarTitleText": "观展登记"
+  "navigationBarTitleText": "联系我们"
 }

+ 6 - 2
miniprogram/pages/exhibition-register/exhibition-register.wxml

@@ -1,4 +1,8 @@
-<view class="exhibition-name">第23届中国 胜芳国际家具博览会</view>
+<view class="exhibition-detail">
+  <rich-text nodes="{{html}}"></rich-text>
+</view>
+
+<!-- <view class="exhibition-name">第23届中国 胜芳国际家具博览会</view>
 
 <view class="form">
   <view class="form-item">
@@ -46,4 +50,4 @@
 
 <view class="submit-w">
   <view class="submit-button" bindtap="submit">确认登记</view>
-</view>
+</view> -->

+ 43 - 2
miniprogram/pages/exhibition-register/exhibition-register.wxss

@@ -1,4 +1,45 @@
-page {
+.exhibition-detail {
+  padding: 0 46rpx;
+}
+.exhibition-detail image {
+  width: 100rpx;
+  height: 100rpx;
+}
+.exhibition-header {
+  padding-left: 42rpx;
+  margin-top: 20rpx;
+}
+.exhibition-title {
+  color: #111;
+  font-weight: bold;
+  font-size: 40rpx;
+  margin-bottom: 10rpx;
+}
+.exhibition-time {
+  color: #A3A4A5;
+  margin-bottom: 20rpx;
+}
+
+.exhibition-ad image {
+  width: 100%;
+  height: 284rpx;
+  margin: 34rpx 0 0;
+}
+
+.exhibition-intro {
+  padding: 0 46rpx 0;
+}
+.intro-item {
+  padding-top: 38rpx;
+  padding-bottom: 46rpx;
+  border-bottom: 2rpx solid #E5E5E5;
+}
+.intro-title {
+  font-size: 34rpx;
+  font-weight: bold;
+  margin-bottom: 14rpx;
+}
+/* page {
   background: #F7F7F7;
   color: #131D34;
   font-size: 30rpx;
@@ -65,4 +106,4 @@ page {
   text-align: center;
   font-weight: bold;
   border-radius: 8rpx;
-}
+} */

+ 6 - 1
miniprogram/pages/index/index.js

@@ -92,13 +92,18 @@ VueLikePage([], {
             })
         },
         toScene (e) {
-            const { vr_link } = e.currentTarget.dataset
+            const { vr_link, companyid } = e.currentTarget.dataset
+            Api.postApiData({ companyId: companyid }).then((res) => {
+                console.log(res)
+                
+            })
             Router.push({
                 url: 'scene',
                 query: {
                     vr_link
                 }
             })
+            
         },
         imageLoad: function(e) {
             var $width=e.detail.width, //获取图片真实宽度

+ 2 - 2
miniprogram/pages/index/index.wxml

@@ -15,7 +15,7 @@
         </view>
         <view class="banner">
             <swiper>
-                <swiper-item wx:for="{{ detail.firstPageContent }}" wx:key="index"  data-vr_link="https%3A%2F%2Ftest.4dkankan.com%2Fkanzhan.html%3Fm%3Dt-spWjHa6%26test" bindtap="toScene">
+                <swiper-item wx:for="{{ detail.firstPageContent }}" wx:key="index"  data-vr_link="{{item.link}}" bindtap="toScene">
                     <image src="{{ item.img }}"></image>
                 </swiper-item>
             </swiper>
@@ -43,7 +43,7 @@
                 <view class="more fr" bindtap="toExhibitionList">更多></view>
             </view>
             <view class="enterprise-list">
-                <view class="enterprise-item" wx:for="{{companyList}}" wx:key="{{index}}" data-vr_link="{{ item.vrLink }}" bindtap="toScene">
+                <view class="enterprise-item" wx:for="{{companyList}}" wx:key="{{index}}" data-vr_link="{{ item.vrLink }}" data-companyId="{{ item.companyId }}" bindtap="toScene">
                     <view class="enterprise-logo">
                         <image  src="{{ item.companyLogo }}" bindload="imageLoad" data-index="{{ index }}"  style="width:{{ images[index].width }}rpx; height:{{ images[index].height }}rpx;visibility: {{ images[index].width ? 'visible' : 'hidden' }}"></image>
                     </view>

+ 3 - 1
miniprogram/pages/login/login.wxml

@@ -14,4 +14,6 @@
   </view>
   <button  wx:if="{{canIUse}}" class='btn_login' open-type="getUserInfo" bindgetuserinfo="bindgetuserinfo">授权登录</button>
   <button  wx:if="{{canIUse}}" class='btn_jiangjie_login' open-type="getPhoneNumber" bindgetphonenumber="bindgetphonenumber">讲解员登录</button>
-</view>
+</view>
+
+<login-pannel />

+ 44 - 16
miniprogram/pages/my/my.js

@@ -1,7 +1,7 @@
-import login from '../../utils/login'
+import {loginByUserInfo, loginFn} from './../../utils/login'
 import { VueLikePage } from '../../utils/page'
 import Router from '../../utils/routes'
-import { autoSubcrebe, subcrebe } from '../../utils/utils'
+import { autoSubcrebe, subcribe } from '../../utils/utils'
 const app = getApp();
 VueLikePage([], {
     options: {
@@ -47,15 +47,19 @@ VueLikePage([], {
             },
         ],
         user_code: '',
-        isLogined: app.globalData.token ? true : false,
-        userinfo: app.globalData.userinfo
+        isLogined: getApp().globalData.token ? true : false,
+        userinfo: getApp().globalData.userinfo
     },
     methods: {
         Navigator_to(e) {
             const { value } = e.currentTarget.dataset
             const item = this.data.cu_items.find(item => item.value === value)
             if (item.needLogin && !getApp().globalData.token) {
-                Router.push('login')
+                this.toLogin()
+                return
+            }
+            if (value === 'message') {
+                subcribe()
                 return
             }
             Router.push(value)
@@ -83,7 +87,7 @@ VueLikePage([], {
         },
         onShow: function () {
             let cu_items = this.data.cu_items
-            this.isCustomer = app.globalData.userinfo ? app.globalData.userinfo.type !== 'guide' : false
+            this.isCustomer = getApp().globalData.userinfo ? getApp().globalData.userinfo.type !== 'guide' : false
             cu_items.forEach(item => {
                 if (item.hiddenKey) {
                     item.hidden = this[item.hiddenKey]
@@ -91,21 +95,45 @@ VueLikePage([], {
             })
             this.setData({
                 cu_items,
-                isLogined: app.globalData.token ? true : false,
-                userinfo: app.globalData.userinfo
+                isLogined: getApp().globalData.token ? true : false,
+                userinfo: getApp().globalData.userinfo,
+                showLogin: false
             });
+            wx.login({
+                success: (res) => {
+                  if (res.code) {
+                    this.wx_code = res.code
+                  }
+                }
+              })
+        },
+        bindgetuserinfo (e) {
+            wx.showLoading({
+              title: '登陆中',
+            })
+            loginByUserInfo(e.detail, this.wx_code).then(() => {
+              wx.hideLoading({
+                complete: (res) => {
+                  this.onShow()
+                },
+              })
+            })
             
+          },
+        toLogin () {
+            // Router.push('login')
+            this.setData({
+                showLogin: true
+            })
         },
-        bindgetphonenumber(e) {
-            login(e, this.data.user_code).then(res => {
-                this.setData({
-                    isLogined: app.globalData.token ? true : false,
-                    userinfo: app.globalData.userinfo
-                })
+        hideLogin () {
+            this.setData({
+                showLogin: false
             })
         },
-        toLogin () {
-            Router.push('login')
+        loginSuccess () {
+            console.log('login')
+            this.onShow()
         }
     }
 })

+ 2 - 1
miniprogram/pages/my/my.json

@@ -1,6 +1,7 @@
 {
   "usingComponents": {
-    "tab-bar": "/components/tab-bar/tab-bar"
+    "tab-bar": "/components/tab-bar/tab-bar",
+    "login-pannel": "/components/login-pannel/login-pannel"
   },
    "navigationBarTitleText": "个人中心"
 }

+ 4 - 2
miniprogram/pages/my/my.wxml

@@ -4,8 +4,9 @@
         <view >{{ userinfo.name }}</view>
         <view  class="click-tip">点击查看个人信息</view>
     </view>
-    <view wx:else class="login-text" bindtap="toLogin" >
+    <view wx:else class="login-text"  >
         点击注册 / 登录
+        <button class="login-text" open-type="getUserInfo" bindgetuserinfo="bindgetuserinfo" ></button>
     </view>
     <!-- <view class="setting-icon"></view> -->
     <!-- <button wx:if="{{ !isLogined }}" open-type="getPhoneNumber" bindgetphonenumber="bindgetphonenumber">获取手机号</button> -->
@@ -21,4 +22,5 @@
         </view>
     </view>
 </view>
-<tab-bar />
+<tab-bar />
+<login-pannel wx:if="{{showLogin}}" bindhide="hideLogin" bindloginSuccess="loginSuccess" />

+ 1 - 0
miniprogram/pages/my/my.wxss

@@ -18,6 +18,7 @@
   font-size: 42rpx;
   font-weight: bold;
   position: relative;
+  display: block;
 }
 
 .avatar {

+ 12 - 5
miniprogram/pages/scene/scene.js

@@ -72,10 +72,8 @@ Page({
         title: '未登录',
       })
       this.setData({
-        hasBeLogin: true
-      })
-      wx.navigateTo({
-        url: '/pages/login/login',
+        hasBeLogin: true,
+        showLogin: true
       })
       return
     }
@@ -141,5 +139,14 @@ Page({
   bindmessage (e) {
     const img_url = e.detail.data[0]
     getApp().globalData.shared_img = img_url
-  }
+  },
+  loginSuccess () {
+    this.onShow()
+    this.hideLogin()
+  },
+  hideLogin () {
+    this.setData({
+        showLogin: false
+    })
+},
 })

+ 3 - 1
miniprogram/pages/scene/scene.json

@@ -1,5 +1,7 @@
 {
-  "usingComponents": {},
+  "usingComponents": {
+    "login-pannel": "/components/login-pannel/login-pannel"
+  },
   "navigationBarTitleText": "好玩展",
   "pageOrientation": "auto"
 }

+ 3 - 1
miniprogram/pages/scene/scene.wxml

@@ -1,4 +1,6 @@
 <web-view src="{{url}}"></web-view>   
 
 <live-pusher mode="RTC" wx:if="{{pushUrl}}" autopush url="{{pushUrl}}" enable-ans="{{true}}" bindstatechange="statechange"  enable-camera="{{false}}"></live-pusher>
-<live-player mode="RTC" wx:for="{{pullUrl}}" wx:key="index" autoplay="{{true}}" src="{{item}}" min-cache="{{0.2}}" max-cache="{{0.8}}"></live-player>
+<live-player mode="RTC" wx:for="{{pullUrl}}" wx:key="index" autoplay="{{true}}" src="{{item}}" min-cache="{{0.2}}" max-cache="{{0.8}}"></live-player>
+
+<login-pannel wx:if="{{showLogin}}" bindloginSuccess="loginSuccess" bindhide="hideLogin" />

+ 2 - 2
miniprogram/project.config.json

@@ -326,8 +326,8 @@
 					"scene": null
 				},
 				{
-					"id": -1,
-					"name": "pages/business-card/business-card",
+					"id": 38,
+					"name": "名片列表",
 					"pathName": "pages/business-card/business-card",
 					"query": "",
 					"scene": null

+ 1 - 0
miniprogram/utils/imSend.js

@@ -1,6 +1,7 @@
 export default {
   // 发送房屋卡片
   sendVrMsg (house, room_id, toId, is_vr_invite) {
+    console.log(house, 'house')
     let content = {
       house_name: house.title,
       image_url: house.detail_images[0],

+ 1 - 1
miniprogram/utils/utils.js

@@ -7,7 +7,7 @@ export function bindInput(event) {
 }
 
 let hasAuth = false
-const subId = 'GApxDrE3tPhysRxHEmGHRn-0mvNJXqtZ4znZ8PJnQ8Q'
+const subId = 'wCMX3Jieyeq376SYjdmub85ANWlFHHghTGshmRORv0Y'
 export function subcribe() {
   
   return new Promise((resolve, reject) => {