sa03 5 年之前
父节点
当前提交
b9cdcff19f

+ 1 - 1
_src/components/chatAt/atme.vue

@@ -42,7 +42,7 @@ export default {
     height: 32px;
     display: flex;
     justify-content: flex-end;
-    pointer-events: none;
+    // pointer-events: none;
     .mini{
       right: 8px;
     }

+ 13 - 2
_src/components/chatAt/index.vue

@@ -11,7 +11,10 @@
           <div class="avatar" :class="`avatar_bg${item.user_id % 9}`">
             {{item.nick_name.slice(0,2).toUpperCase()}}
           </div>
-          <span class="name">{{item.nick_name}}</span>
+          <div class="name">
+            <p class="nick-name">{{item.nick_name}}</p>
+            <p class="user-name">@{{item.user_name}}</p>
+          </div>
         </div>
       </div>
     </div>
@@ -114,7 +117,15 @@ export default {
 }
 .name{
   font-size: 12px;
-  color: #333333;
   display: inline-block;
+  vertical-align: top;
+}
+.nick-name{
+  line-height: 1;
+  color: #333333;
+}
+.user-name{
+  line-height: 1;
+  color: #a8a8a8;
 }
 </style>

+ 6 - 4
_src/components/chatMini/chatMini.scss

@@ -525,13 +525,14 @@ $offsetRight: 5px;
   }
   .box-ft{
     .emoji-wrap{
-      bottom: 64px;
+      bottom: 54px;
     }
     .btn-send{
       height: 36px;
       line-height: 36px;
-      padding: 0 16px;
+      padding: 0 10px;
       font-size: 16px;
+      margin-bottom: 0;
     }
     .input-ctrl span {
       height: 40px;
@@ -539,11 +540,12 @@ $offsetRight: 5px;
       font-size: 16px;
     }
     .input-con{
-      padding: 10px 0;
+      padding: 8px 0;
       align-items: center;
     }
     .input-wrap{
-      padding: 14px 0;
+      padding: 10px 0;
+      margin: 0 6px;
       .textarea{
         height: 26px;
         line-height: 20px;

+ 4 - 6
_src/components/chatMini/chatMini.vue

@@ -77,16 +77,14 @@
             <span v-else class="enable" @click="handleLogin">登录</span>
           </div>
           <div class="input-con" v-else>
-            <!-- <div class="btn-file">
-              <input type="file" ref="inputFile" name="res" @change="handleFile">
-            </div> -->
-            <!-- <div class="btn-emoji" @click.stop="showEmoji = !showEmoji"></div> -->
-            <!-- <div class="icon-packet" @click="$packetSend"></div> -->
             <div class="more-icon" @click.stop="handleMoreClick"></div>
             <form class="input-wrap" @submit="handleSend">
               <textarea
                 @keydown.up.prevent="handleUp"
                 @keydown.down.prevent="handleDown"
+                @keydown.left="handleLeft"
+                @keydown.right="handleRight"
+                @keydown.delete="handleDel"
                 cols="1"
                 ref="chatInput"
                 rows="1"
@@ -380,7 +378,7 @@ export default {
         data = JSON.parse(data)
         if (data.channel.match('chat:group')) {
           if (data.data.type === 'msg' && data.data.from != this.userId) {
-            this.getNewMsg()
+            this.getNewMsg({ newMsg: true })
 
             // 未读消息数+1
             if (!this.showChat) {

+ 3 - 0
_src/components/chatRoom/inputArea.vue

@@ -22,6 +22,9 @@
         <textarea
           @keydown.up.prevent="handleUp"
           @keydown.down.prevent="handleDown"
+          @keydown.left="handleLeft"
+          @keydown.right="handleRight"
+          @keydown.delete="handleDel"
           cols="1"
           ref="chatInput"
           rows="1"

+ 2 - 3
_src/components/popup/packetGet/index.vue

@@ -26,12 +26,11 @@
         <span class="name">{{info.name}}</span>
         <div class="text">{{info.content.title}}</div>
         <div class="money" v-if="quantity">
-          {{formatNum(quantity)}} <em>EOS</em>
+          {{formatNum(quantity)}} <em>{{openInfo.type.toUpperCase()}}</em>
         </div>
         <p class="state" v-if="quantity">已转账到EOS账户</p>
         <p class="state-num">
           共 {{openInfo.num_total}} 个,已领取 {{openInfo.num_total - openInfo.num_left}} 个
-          <!-- 共{{formatNum(openInfo.quantity_total - openInfo.quantity_left)}}/{{formatNum(openInfo.quantity_total)}}EOS -->
         </p>
         <ul class="packet-list pub-scroll-box">
           <li v-for="(item, key) in openInfo.logs" :key="key">
@@ -42,7 +41,7 @@
             <div class="content">
               <div class="top">
                 <span class="user-name">{{item.nick_name}}</span>
-                <span class="amount">{{formatNum(item.quantity_int)}} EOS</span>
+                <span class="amount">{{formatNum(item.quantity_int)}} {{openInfo.type.toUpperCase()}}</span>
               </div>
               <span class="time">{{formatTime(item.create_time_int)}}</span>
             </div>

+ 73 - 43
_src/components/popup/packetSend/index.vue

@@ -8,22 +8,26 @@
         <p class="redpacket-tips" :class="{'hidden': !tips}">{{tips}}</p>
         <div class="main-box">
           <div class="input-item">
-            <span class="text" v-if="packetType == 1">单个金额</span>
-            <span class="text" v-else>
+            <span class="text">
               <em>拼</em>总金额
             </span>
             <div class="box">
               <input type="number" v-model.number="money" placeholder="0.00">
-              <span class="unit">EOS</span>
+              <span class="unit">
+                {{symbol}}
+                <i v-if="group.eosInfo" class="down-arrow"></i>
+                <div class="code-menu" v-if="group.eosInfo">
+                  <div class="code-item" @click="isGameToken = !isGameToken">
+                    {{!isGameToken ? group.eosInfo.token : 'EOS'}}
+                  </div>
+                </div>
+              </span>
             </div>
           </div>
-          <!-- <p class="input-tips" v-if="packetType == 1">
-            当前为普通红包,<span @click="packetType=2">改为拼手气红包</span>
-          </p> -->
-          <p class="input-tips" v-if="packetType == 2">
+          <p class="input-tips">
             当前为拼手气红包
           </p>
-          <div class="input-item">
+          <div class="input-item pack-num-input">
             <span class="text">红包个数</span>
             <div class="box">
               <input type="number" v-model.number="packetNum" placeholder="请填写个数">
@@ -35,7 +39,7 @@
           </p>
           <textarea class="words" v-model="word" placeholder="恭喜发财,大吉大利"></textarea>
           <div class="sum">
-            {{amountSum}} <span>EOS</span>
+            {{amountSum}} <span>{{isGameToken ? group.eosInfo.token : 'EOS'}}</span>
           </div>
           <button class="send-btn" @click="sendPacket" :class="{'is-disable': !amountSum || !packetNum, 'loading': isLoading}">
             <i v-if="isLoading" class="el-icon-loading"></i> 塞钱进红包
@@ -83,7 +87,7 @@ export default {
       word: '恭喜发财,大吉大利',
       tips: '',
       isLoading: false,
-      packetType: 2 // 1 => 普通, 2 => 拼手气
+      isGameToken: false // 是否为游戏代币
     }
   },
   computed: {
@@ -93,24 +97,33 @@ export default {
     ]),
     amountSum () {
       return this.money
+    },
+    symbol () {
+      return this.isGameToken ? this.group.eosInfo.token : 'EOS'
+    },
+    minSum () {
+      return this.isGameToken ? NP.divide(this.group.eosInfo.min_amount, 10000) : 0.1
+    },
+    maxSum () {
+      return this.isGameToken ? NP.divide(this.group.eosInfo.max_amount, 10000) : 200
     }
   },
   watch: {
     money (val) {
-      if (val > 200) {
-        this.money = 200
-        this.showTip('总金额 不能多于 200 EOS')
+      if (val > this.maxSum) {
+        this.money = this.maxSum
+        this.showTip(`总金额 不能多于 ${this.maxSum} ${this.symbol}`)
       }
 
       if (val && val / this.packetNum < 0.01) {
         this.money = NP.times(this.packetNum, 0.01)
-        this.showTip('单个红包最小为 0.01 EOS')
+        this.showTip(`单个红包最小为 0.01 ${this.symbol}`)
       }
     },
     packetNum (to, from) {
       if (this.money && NP.divide(this.money, to) < 0.01) {
         this.packetNum = from
-        this.showTip('单个红包最小为 0.01 EOS')
+        this.showTip(`单个红包最小为 0.01 ${this.symbol}`)
       }
       if (to > 100) {
         this.packetNum = 100
@@ -126,12 +139,13 @@ export default {
       }, timeout)
     },
     async sendPacket () {
-      if (this.money < 0.1) {
-        this.showTip('总金额 不能少于 0.1 EOS')
+      if (this.money < this.minSum) {
+        this.showTip(`总金额 不能少于 ${this.minSum} ${this.symbol}`)
         return false
       }
+      this.isLoading = true
 
-      let eosAmount = this.amountSum.toFixed(4) + ' EOS'
+      let eosAmount = this.amountSum.toFixed(4) + ` ${this.symbol}`
       let toAccount = 'meechatadmin'
       let memo = {
         type: 'redpack',
@@ -139,41 +153,57 @@ export default {
         memo: this.word,
         sid: this.group.groupId
       }
+      let tokenCode = this.isGameToken ? this.group.eosInfo.token_code : 'eosio.token'
+      let symbol = this.symbol
+      let [balance] = await EosHelper.getCurrencyBalance(tokenCode, this.account.name, symbol)
 
-      this.isLoading = true
-
-      let [balance] = await EosHelper.getCurrencyBalance('eosio.token', this.account.name, 'EOS')
       if (balance) {
-        let userEos = Number(balance.replace(/\sEOS/, '')).toFixed(4)
-        if (this.amountSum > userEos) {
+        let userBalance = this.isGameToken ? balance.replace(new RegExp('\\s' + symbol), '') : balance.replace(/\sEOS/, '')
+        if (this.amountSum > Number(userBalance)) {
           Message({
-            message: '账户EOS不足',
+            message: '账户余额不足',
             type: 'error'
           })
           this.isLoading = false
           return
         }
 
-        let ret = EosHelper.transfer(this.account.name, toAccount, eosAmount, JSON.stringify(memo), this.account.authority)
-        ret.then((res) => {
-          this.visible = false
-        }).catch(msg => {
-          if (msg.type === 'signature_rejected') {
-
-          } else {
-            if (typeof msg === 'string') {
-              msg = JSON.parse(msg)
-            }
-
-            let details = msg.error.details
-            Message({
-              message: details[0].message,
-              type: 'error'
+        if (this.isGameToken) {
+          let contract = this.group.eosInfo.contract
+          let tokenCode = this.group.eosInfo.token_code
+          EosHelper.doSymbolTransfer(this.account.name, contract, eosAmount, JSON.stringify(memo), this.account.authority, tokenCode)
+            .then(res => {
+              this.visible = false
+              console.log(res)
+            }).catch(msg => {
+              if (!msg.type) {
+                let json = JSON.parse(msg)
+                let details = json.error.details
+                Message({
+                  message: details[0].message,
+                  type: 'error'
+                })
+              }
+            }).finally(() => {
+              this.isLoading = false
             })
-          }
-        }).finally(() => {
-          this.isLoading = false
-        })
+        } else {
+          EosHelper.transfer(this.account.name, toAccount, eosAmount, JSON.stringify(memo), this.account.authority)
+            .then((res) => {
+              this.visible = false
+            }).catch(msg => {
+              if (!msg.type) {
+                let json = JSON.parse(msg)
+                let details = json.error.details
+                Message({
+                  message: details[0].message,
+                  type: 'error'
+                })
+              }
+            }).finally(() => {
+              this.isLoading = false
+            })
+        }
       } else {
         Message({
           message: '网络太差~ 请重试',

+ 58 - 2
_src/components/popup/packetSend/style.scss

@@ -75,7 +75,7 @@
     background-color: transparent;
     box-sizing: border-box;
     margin-right: 4px;
-    width: 120px;
+    width: 100px;
     -webkit-appearance: none;
   }
   .text{
@@ -96,7 +96,56 @@
   .unit{
     display: inline-block;
     text-align: right;
-    width: 30px;
+    width: 50px;
+    cursor: pointer;
+    position: relative;
+    &:hover{
+      .code-menu {
+        display: block;
+      }
+    }
+  }
+  .code-menu{
+    display: none;
+    position: absolute;
+    top: 30px;
+    left: 0;
+    right: 0;
+    background-color: #ffffff;
+    border: 1px solid #e1e1e1;
+    border-radius: 2px;
+    z-index: 2;
+    .code-item{
+      padding: 0 6px;
+      text-align: center;
+      line-height: 22px;
+      font-size: 12px;
+      color: #333333;
+      border-bottom: 1px solid #e1e1e1;
+      box-sizing: border-box;
+      &:last-child{
+        border-bottom: none;
+      }
+      &:hover{
+        background-color: #e1e1e1;
+      }
+    }
+    &::after{
+      content: '';
+      position: absolute;
+      left: 50%;
+      top: -6px;
+      transform: translate(-50%, -50%);
+      @include triangle-up(5px, #e1e1e1);
+    }
+  }
+}
+.pack-num-input{
+  input{
+    width: 120px;
+  }
+  .unit{
+    width: 20px;
   }
 }
 .input-tips{
@@ -182,6 +231,13 @@
   }
 }
 
+.down-arrow{
+  display: inline-block;
+  margin-left: 2px;
+  vertical-align: middle;
+  @include triangle-down(5px, #000000);
+}
+
 input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{
   -webkit-appearance: none !important; 
   }/* chrome */

+ 103 - 13
_src/mixins/index.js

@@ -34,11 +34,12 @@ export const chatAtMixin = {
     atPerson (name) {
       let el = this.$refs.chatInput
       let selectionStart = el.selectionStart
-      this.inputMsg = this.inputMsg.slice(0, selectionStart) + `${name} ` + this.inputMsg.slice(selectionStart)
+      let realStart = selectionStart - this.keyAfterAt.length
+      this.inputMsg = this.inputMsg.slice(0, realStart) + `${name} ` + this.inputMsg.slice(selectionStart)
       this.atInd = 0
       el.focus()
       this.$nextTick(() => {
-        el.setSelectionRange(selectionStart + name.length + 1, selectionStart + name.length + 1)
+        el.setSelectionRange(realStart + name.length + 1, realStart + name.length + 1)
       })
     },
     handleUp () {
@@ -57,23 +58,35 @@ export const chatAtMixin = {
 export const chatInputMixin = {
   data () {
     return {
-      selectionAfterAt: false// 光标在@后面
+      selectionAfterAt: false, // 光标在@后面
+      keyAfterAt: '' // 光标后的搜索关键字
     }
   },
   computed: {
     filterMembers () {
-      let val = this.inputMsg.replace('@', '')
       let members = this.group.members
       let resArr = []
-      for (let k in members) {
-        if (k == this.userId) continue
-        if (val.indexOf(members[k].user_name) === -1) {
-          resArr.push(members[k])
+      if (this.keyAfterAt !== '') {
+        for (let k in members) {
+          let userName = members[k].user_name
+          let nickName = members[k].nick_name
+          if (k == this.userId) continue
+          if ((nickName.indexOf(this.keyAfterAt) !== -1 || userName.indexOf(this.keyAfterAt) !== -1) && this.inputMsg.indexOf('@' + userName) === -1) {
+            resArr.push(members[k])
+          }
+        }
+      } else {
+        for (let k in members) {
+          if (k == this.userId) continue
+          if (this.inputMsg.indexOf('@' + members[k].user_name) === -1) {
+            resArr.push(members[k])
+          }
         }
       }
       return resArr
     },
     atShow () {
+      this.atInd = 0
       return this.selectionAfterAt && this.filterMembers.length
     }
   },
@@ -85,6 +98,73 @@ export const chatInputMixin = {
     }
   },
   methods: {
+    getStrBeforeSelection () {
+      let el = this.$refs.chatInput
+      if (!el) return ''
+      let selectionStart = el.selectionStart
+      let prevStr = this.inputMsg.slice(0, selectionStart)
+      return prevStr
+    },
+    getStrAfterSelection () {
+      let el = this.$refs.chatInput
+      if (!el) return ''
+      let selectionStart = el.selectionStart
+      let prevStr = this.inputMsg.slice(selectionStart)
+      return prevStr
+    },
+    handleLeft (event) {
+      let el = this.$refs.chatInput
+      let selectionStart = el.selectionStart
+      if (selectionStart === 0) return
+      let prevStr = this.getStrBeforeSelection()
+      let members = this.group.members
+
+      for (let k in members) {
+        let name = members[k].user_name
+        let reg = new RegExp(`@${name} $`)
+        if (reg.test(prevStr)) {
+          event.preventDefault()
+          el.setSelectionRange(selectionStart - name.length - 2, selectionStart - name.length - 2)
+          return
+        }
+      }
+    },
+    handleRight (event) {
+      let el = this.$refs.chatInput
+      let selectionStart = el.selectionStart
+      let afterStr = this.getStrAfterSelection()
+      let members = this.group.members
+
+      for (let k in members) {
+        let name = members[k].user_name
+        let reg = new RegExp(`^@${name} `)
+        if (reg.test(afterStr)) {
+          event.preventDefault()
+          el.setSelectionRange(selectionStart + name.length + 2, selectionStart + name.length + 2)
+          return
+        }
+      }
+    },
+    handleDel (event) {
+      let el = this.$refs.chatInput
+      let selectionStart = el.selectionStart
+      if (selectionStart === 0) return
+      let prevStr = this.getStrBeforeSelection()
+      let members = this.group.members
+
+      for (let k in members) {
+        let name = members[k].user_name
+        let reg = new RegExp(`@${name} $`)
+        if (reg.test(prevStr)) {
+          event.preventDefault()
+          this.inputMsg = this.inputMsg.slice(0, selectionStart - name.length - 2) + this.inputMsg.slice(selectionStart)
+          this.$nextTick(() => {
+            el.setSelectionRange(selectionStart - name.length - 2, selectionStart - name.length - 2)
+          })
+          return
+        }
+      }
+    },
     handleKeyDown (event) {
       if (this.atShow) {
         event.preventDefault()
@@ -118,19 +198,29 @@ export const chatInputMixin = {
      * 监听光标位置
      */
     handleSelectionChange () {
-      let selectionStart = this.$refs.chatInput.selectionStart
-      let prevStr = this.inputMsg.slice(0, selectionStart)
-      this.selectionAfterAt = /@$/.test(prevStr)
+      let el = this.$refs.chatInput
+      if (!el) return
+      let selectionStart = el.selectionStart
+      let selectionEnd = this.$refs.chatInput.selectionEnd
+      if (selectionStart !== selectionEnd) return
+
+      let prevStr = this.getStrBeforeSelection()
+      this.selectionAfterAt = /@/.test(prevStr)
+      if (this.selectionAfterAt) {
+        this.keyAfterAt = prevStr.slice(prevStr.lastIndexOf('@') + 1)
+      }
     },
     /**
      * @des 处理ios系统下窗体闪烁的bug
      * @param {boolean} flag {true: 激活修复状态, false: 恢复原始状态}
      */
     fixIOS (flag = true) {
+      let el = this.$refs.scrollWrap
+      if (!el) return
       if (flag) {
-        this.$refs.scrollWrap.style.overflowY = 'hidden'
+        el.style.overflowY = 'hidden'
       } else {
-        this.$refs.scrollWrap.style.overflowY = 'scroll'
+        el.overflowY = 'scroll'
       }
     }
   }

+ 1 - 1
_src/pages/mini/App.vue

@@ -25,7 +25,7 @@ export default {
     var height = getUrlParam('height') || window.innerHeight - 16
     return {
       show: getUrlParam('show') === 'true',
-      groupId: getUrlParam('groupId') || 10000,
+      groupId: getUrlParam('groupId') || 10001,
       outWidth: parseInt(width),
       outHeight: parseInt(height)
     }

+ 17 - 7
_src/store/module/group.js

@@ -31,6 +31,7 @@ const group = {
     coverPhoto: '', // 群头像
     inviteUrl: '', // 邀请链接
     sessionInfo: {}, // 群设置
+    eosInfo: null, // 游戏代币信息
     groupId: '', // 当前房间ID
     members: {}, // 当前房间用户列表
     userId: '', // 当前用户ID
@@ -73,6 +74,7 @@ const group = {
       state.blockList = data.blockList
       state.shareName = data.shareName
       state.creator = data.creator
+      state.eosInfo = data.eosInfo
       if (data.pinMsg) {
         formatPinMsg(data.pinMsg, state.userId)
         state.pinList.push(data.pinMsg)
@@ -99,11 +101,16 @@ const group = {
         state.chatList = newList.concat(state.chatList)
       }
     },
-    addChatItem (state, data, isFirst) {
+    addChatItem (state, data) {
+      let newMsg = false
+      if (data.constructor === Object && data.newMsg) {
+        data = data.list
+        newMsg = true
+      }
       if (data && data.length > 0) {
         addSomeInArray(data)
         removeItemIfEixt(state.pinList, data, item => item.hash)
-        isFirst && data.forEach(item => {
+        newMsg && data.forEach(item => {
           // 检测是否被@
           if (checkAtMe(item.content, state.userInfo.user_name)) {
             state.atList.push(item)
@@ -133,6 +140,7 @@ const group = {
         if (data.createTime) {
           item.createTime = data.createTime
         }
+
         addTimeMsgInItem(item, state.chatList)
         addLinkItem(item)
 
@@ -366,6 +374,7 @@ const group = {
         let members = info.data.data.members
         let userInfo = info.data.data.userInfo
         let sessionInfo = info.data.data.sessionInfo
+        let eosInfo = info.data.data.eosInfo
         pinMsg && (pinMsg.visible = true)
         let _members = {}
         members.forEach(n => {
@@ -384,7 +393,8 @@ const group = {
           adminList: adminList,
           blockList: blockList,
           pinMsg: pinMsg,
-          creator: group.creator
+          creator: group.creator,
+          eosInfo: eosInfo
         })
       }
     },
@@ -395,7 +405,7 @@ const group = {
      * @param {Object} params
      */
     async getNewMsg ({ dispatch, commit, state }, params = {}) {
-      let isFirst = state.endHash == null
+      console.log('getNewMsg', params)
       let msg = await API.group
         .getNewMsg({
           group_id: state.groupId,
@@ -431,8 +441,8 @@ const group = {
             startHash: list[0].hash
           })
         }
-
-        commit('addChatItem', list, isFirst)
+        let data = params.newMsg ? { list: list, newMsg: params.newMsg } : list
+        commit('addChatItem', data)
       }
       return 'done'
     },
@@ -796,7 +806,7 @@ const group = {
           if (data.type === 'msg' && data.from !== rootState.userId) {
             // 用户打开当前群
             if (rootState.curSession === data.group_id) {
-              dispatch('getNewMsg')
+              dispatch('getNewMsg', { newMsg: true })
               commit('addUnreadNums')
             }
           }

+ 17 - 2
_src/util/eosHelper.js

@@ -15,13 +15,28 @@ let EosHelper = {
     } else {
       return window.EOS.getCurrencyBalance(code, account, symbol)
     }
+  },
+  async doSymbolTransfer (from, to, amount, memo, authority, contract) {
+    let action = 'transfer'
+    let identity = { authorization: [`${from}@${authority}`] }
+    if (self !== top) {
+      return meeAction(action, [from, to, amount, memo, identity], contract)
+    } else {
+      try {
+        let _contract = await window.EOS.contract(contract)
+        let res = await _contract[action](from, to, amount, memo, identity)
+        return Promise.resolve(res)
+      } catch (error) {
+        return Promise.reject(error)
+      }
+    }
   }
 }
 
-function meeAction (action, param, code) {
+function meeAction (action, param, contract = '') {
   return window.postMessager.send({
     action: 'meechat:eosAction',
-    data: { code, action, param }
+    data: { action, param, contract }
   })
 }
 

文件差异内容过多而无法显示
+ 0 - 0
dist/css/chunk-common.379c8dde.css


文件差异内容过多而无法显示
+ 0 - 0
dist/css/index.3a8d7d55.css


文件差异内容过多而无法显示
+ 0 - 0
dist/css/mini.a08db3bb.css


文件差异内容过多而无法显示
+ 0 - 0
dist/js/chunk-common.0e67a9ee.js


文件差异内容过多而无法显示
+ 0 - 0
dist/js/chunk-common.d6cc4453.js


文件差异内容过多而无法显示
+ 0 - 0
dist/js/chunk-vendors.9f697f4d.js


文件差异内容过多而无法显示
+ 0 - 0
dist/js/index.4abb58a6.js


文件差异内容过多而无法显示
+ 0 - 0
dist/js/index.e953e77f.js


文件差异内容过多而无法显示
+ 0 - 0
dist/js/mini.29a4a407.js


文件差异内容过多而无法显示
+ 0 - 0
dist/js/mini.c59638d1.js


+ 23 - 23
dist/precache-manifest.f54bbb9cef8b2c3fc6719198a826f727.js → dist/precache-manifest.04a8d46d96ce02819ea51d58e1ef9c48.js

@@ -1,10 +1,10 @@
 self.__precacheManifest = [
   {
-    "revision": "6f0a76321d30f3c8120915e57f7bd77e",
-    "url": "/dist/fonts/element-icons.6f0a7632.ttf"
+    "revision": "2fad952a20fbbcfd1bf2ebb210dccf7a",
+    "url": "/dist/fonts/element-icons.2fad952a.woff"
   },
   {
-    "revision": "724c93c87ad4f3be666829b662cee9ce",
+    "revision": "8a88129bbdd23eb4d2c683cfd1de65fb",
     "url": "/dist/sw.js"
   },
   {
@@ -12,36 +12,36 @@ self.__precacheManifest = [
     "url": "/dist/img/bg.71de928a.jpg"
   },
   {
-    "revision": "9acad26f646b0c96c7a9",
+    "revision": "ccc09b340d9965780aee",
     "url": "/dist/css/chunk-vendors.061e5f0b.css"
   },
   {
-    "revision": "86ee2f60e5c546cefe62",
-    "url": "/dist/css/index.ea5dce15.css"
+    "revision": "c66db1db2027d3fc149c",
+    "url": "/dist/css/index.3a8d7d55.css"
   },
   {
-    "revision": "86ee2f60e5c546cefe62",
-    "url": "/dist/js/index.4abb58a6.js"
+    "revision": "c66db1db2027d3fc149c",
+    "url": "/dist/js/index.e953e77f.js"
   },
   {
-    "revision": "3f7f38f8645fd0680f40",
-    "url": "/dist/css/mini.b497a97c.css"
+    "revision": "4c3f7c9f98bb6ef57981",
+    "url": "/dist/css/mini.a08db3bb.css"
   },
   {
-    "revision": "3f7f38f8645fd0680f40",
-    "url": "/dist/js/mini.29a4a407.js"
+    "revision": "4c3f7c9f98bb6ef57981",
+    "url": "/dist/js/mini.c59638d1.js"
   },
   {
-    "revision": "2fad952a20fbbcfd1bf2ebb210dccf7a",
-    "url": "/dist/fonts/element-icons.2fad952a.woff"
+    "revision": "6f0a76321d30f3c8120915e57f7bd77e",
+    "url": "/dist/fonts/element-icons.6f0a7632.ttf"
   },
   {
-    "revision": "8550df4e94a9e388b5a1",
-    "url": "/dist/js/chunk-common.d6cc4453.js"
+    "revision": "7972a89c6d833fa0d71e",
+    "url": "/dist/js/chunk-common.0e67a9ee.js"
   },
   {
-    "revision": "9acad26f646b0c96c7a9",
-    "url": "/dist/js/chunk-vendors.ab422156.js"
+    "revision": "ccc09b340d9965780aee",
+    "url": "/dist/js/chunk-vendors.9f697f4d.js"
   },
   {
     "revision": "eb029f3afb0aa1294ffa0cf0ade29412",
@@ -60,19 +60,19 @@ self.__precacheManifest = [
     "url": "/dist/icon_192.png"
   },
   {
-    "revision": "ee63bdc9a836118a8274be3cc4a2bf1e",
+    "revision": "6dc2cb834b811f7d3de4fddd33d61ec9",
     "url": "/dist/mini.html"
   },
   {
-    "revision": "8550df4e94a9e388b5a1",
-    "url": "/dist/css/chunk-common.fbfddc2c.css"
+    "revision": "7972a89c6d833fa0d71e",
+    "url": "/dist/css/chunk-common.379c8dde.css"
   },
   {
-    "revision": "c420d34ba980583f3c9b62b57177aa70",
+    "revision": "df29d421365b242b9698ed934b69abb8",
     "url": "/dist/../protected/views/mini.html"
   },
   {
-    "revision": "ee885857459f6770ed54273a8c9247fc",
+    "revision": "41c6f6a99b130550db43a03d975719cd",
     "url": "/dist/../protected/views/index.html"
   }
 ];

+ 1 - 1
dist/sw.js

@@ -1,4 +1,4 @@
-importScripts("/dist/precache-manifest.f54bbb9cef8b2c3fc6719198a826f727.js");
+importScripts("/dist/precache-manifest.04a8d46d96ce02819ea51d58e1ef9c48.js");
 
 
 var workbox=function(){"use strict";try{self.workbox.v["workbox:sw:3.6.3"]=1}catch(t){}const t="https://storage.googleapis.com/workbox-cdn/releases/3.6.3",e={backgroundSync:"background-sync",broadcastUpdate:"broadcast-cache-update",cacheableResponse:"cacheable-response",core:"core",expiration:"cache-expiration",googleAnalytics:"google-analytics",navigationPreload:"navigation-preload",precaching:"precaching",rangeRequests:"range-requests",routing:"routing",strategies:"strategies",streams:"streams"};return new class{constructor(){return this.v={},this.t={debug:"localhost"===self.location.hostname,modulePathPrefix:null,modulePathCb:null},this.e=this.t.debug?"dev":"prod",this.s=!1,new Proxy(this,{get(t,s){if(t[s])return t[s];const o=e[s];return o&&t.loadModule(`workbox-${o}`),t[s]}})}setConfig(t={}){if(this.s)throw new Error("Config must be set before accessing workbox.* modules");Object.assign(this.t,t),this.e=this.t.debug?"dev":"prod"}skipWaiting(){self.addEventListener("install",()=>self.skipWaiting())}clientsClaim(){self.addEventListener("activate",()=>self.clients.claim())}loadModule(t){const e=this.o(t);try{importScripts(e),this.s=!0}catch(s){throw console.error(`Unable to import module '${t}' from '${e}'.`),s}}o(e){if(this.t.modulePathCb)return this.t.modulePathCb(e,this.t.debug);let s=[t];const o=`${e}.${this.e}.js`,r=this.t.modulePathPrefix;return r&&""===(s=r.split("/"))[s.length-1]&&s.splice(s.length-1,1),s.push(o),s.join("/")}}}();

+ 32 - 0
protected/models/Redpack.php

@@ -22,6 +22,30 @@ class Redpack extends Model {
         return self::REDIS_PRE_REDPACK_REWARD_LIST . $trxId;
     }
 
+    private function checkValidType($redpack) {
+        $parts = explode(' ', $redpack['quantity_total']);
+        $tokenType = strtoupper($parts[1]);
+        if ($redpack['code'] == 'eosio.token' && $tokenType == 'EOS') {
+            return true;
+        }
+
+        // 检查是否乱发红包
+        $parts = explode('-', $redpack['session_id']);
+        if (count($parts) > 1) {
+            // 个人转账只能转EOS
+            return false;
+        }
+
+        $group_id = (int) $redpack['session_id'];
+        $objGroupEos = new TableHelper('group_eos', 'dw_chat');
+        $row = $objGroupEos->getRow(compact('group_id'));
+        if ($row['token_code'] == $redpack['code'] && $row['token'] == $tokenType) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
     /**
      * 初始化红包
      * @author solu
@@ -34,6 +58,14 @@ class Redpack extends Model {
         $total = $redpack['quantity_total_int'];
         $num = $redpack['num_total'];
 
+        // 检查红包类型是否正确
+        $flag = $this->checkValidType($redpack);
+        if (!$flag) {
+            alermErrorMsg("trxId:{$trxId}, quantity_total:{$redpack['quantity_total']}, num:{$num} 发送的红包类型错误");
+            return false;
+        }
+
+
         !$objRedis && $objRedis = dwRedis::init(Eos::REDIS_SERV);
         $key = self::getRewardListKey($trxId);
         if (($total/$num) < self::MONEY_MIN_AVG) {

+ 2 - 2
protected/views/index.html

@@ -1,4 +1,4 @@
-<!DOCTYPE html><html><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><title>MeeChat</title><link href=/dist/css/chunk-common.fbfddc2c.css rel=preload as=style><link href=/dist/css/chunk-vendors.061e5f0b.css rel=preload as=style><link href=/dist/css/index.ea5dce15.css rel=preload as=style><link href=/dist/js/chunk-common.d6cc4453.js rel=preload as=script><link href=/dist/js/chunk-vendors.ab422156.js rel=preload as=script><link href=/dist/js/index.4abb58a6.js rel=preload as=script><link href=/dist/css/chunk-vendors.061e5f0b.css rel=stylesheet><link href=/dist/css/chunk-common.fbfddc2c.css rel=stylesheet><link href=/dist/css/index.ea5dce15.css rel=stylesheet><link rel=icon type=image/png sizes=32x32 href=/dist/img/icons/favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=/dist/img/icons/favicon-16x16.png><link rel=manifest href=/dist/manifest.json><meta name=theme-color content=#4DBA87><meta name=apple-mobile-web-app-capable content=no><meta name=apple-mobile-web-app-status-bar-style content=default><meta name=apple-mobile-web-app-title content=MeeChat><link rel=apple-touch-icon href=/dist/img/icons/apple-touch-icon-152x152.png><link rel=mask-icon href=/dist/img/icons/safari-pinned-tab.svg color=#4DBA87><meta name=msapplication-TileImage content=/dist/img/icons/msapplication-icon-144x144.png><meta name=msapplication-TileColor content=#000000></head><body><div id=app></div><script>window.EOS_PROTOCOL = 'https'
+<!DOCTYPE html><html><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><title>MeeChat</title><link href=/dist/css/chunk-common.379c8dde.css rel=preload as=style><link href=/dist/css/chunk-vendors.061e5f0b.css rel=preload as=style><link href=/dist/css/index.3a8d7d55.css rel=preload as=style><link href=/dist/js/chunk-common.0e67a9ee.js rel=preload as=script><link href=/dist/js/chunk-vendors.9f697f4d.js rel=preload as=script><link href=/dist/js/index.e953e77f.js rel=preload as=script><link href=/dist/css/chunk-vendors.061e5f0b.css rel=stylesheet><link href=/dist/css/chunk-common.379c8dde.css rel=stylesheet><link href=/dist/css/index.3a8d7d55.css rel=stylesheet><link rel=icon type=image/png sizes=32x32 href=/dist/img/icons/favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=/dist/img/icons/favicon-16x16.png><link rel=manifest href=/dist/manifest.json><meta name=theme-color content=#4DBA87><meta name=apple-mobile-web-app-capable content=no><meta name=apple-mobile-web-app-status-bar-style content=default><meta name=apple-mobile-web-app-title content=MeeChat><link rel=apple-touch-icon href=/dist/img/icons/apple-touch-icon-152x152.png><link rel=mask-icon href=/dist/img/icons/safari-pinned-tab.svg color=#4DBA87><meta name=msapplication-TileImage content=/dist/img/icons/msapplication-icon-144x144.png><meta name=msapplication-TileColor content=#000000></head><body><div id=app></div><script>window.EOS_PROTOCOL = 'https'
       window.EOS_HOST = 'proxy.eosnode.tools'
       window.EOS_PORT = '443'
 
@@ -13,4 +13,4 @@
       //         console.log('ServiceWorker registration failed: ', err)
       //       })
       //   })
-      // }</script><script src=/dist/js/chunk-vendors.ab422156.js></script><script src=/dist/js/chunk-common.d6cc4453.js></script><script src=/dist/js/index.4abb58a6.js></script></body></html>
+      // }</script><script src=/dist/js/chunk-vendors.9f697f4d.js></script><script src=/dist/js/chunk-common.0e67a9ee.js></script><script src=/dist/js/index.e953e77f.js></script></body></html>

+ 2 - 2
protected/views/mini.html

@@ -1,3 +1,3 @@
-<!DOCTYPE html><html><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><!--[if IE]><link rel="icon" href="/dist/favicon.ico"><![endif]--><title>MeeChat</title><link href=/dist/css/chunk-common.fbfddc2c.css rel=preload as=style><link href=/dist/css/chunk-vendors.061e5f0b.css rel=preload as=style><link href=/dist/css/mini.b497a97c.css rel=preload as=style><link href=/dist/js/chunk-common.d6cc4453.js rel=preload as=script><link href=/dist/js/chunk-vendors.ab422156.js rel=preload as=script><link href=/dist/js/mini.29a4a407.js rel=preload as=script><link href=/dist/css/chunk-vendors.061e5f0b.css rel=stylesheet><link href=/dist/css/chunk-common.fbfddc2c.css rel=stylesheet><link href=/dist/css/mini.b497a97c.css rel=stylesheet><link rel=icon type=image/png sizes=32x32 href=/dist/img/icons/favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=/dist/img/icons/favicon-16x16.png><link rel=manifest href=/dist/manifest.json><meta name=theme-color content=#4DBA87><meta name=apple-mobile-web-app-capable content=no><meta name=apple-mobile-web-app-status-bar-style content=default><meta name=apple-mobile-web-app-title content=MeeChat><link rel=apple-touch-icon href=/dist/img/icons/apple-touch-icon-152x152.png><link rel=mask-icon href=/dist/img/icons/safari-pinned-tab.svg color=#4DBA87><meta name=msapplication-TileImage content=/dist/img/icons/msapplication-icon-144x144.png><meta name=msapplication-TileColor content=#000000></head><body><div id=app></div><script>window.EOS_PROTOCOL = 'https'
+<!DOCTYPE html><html><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><!--[if IE]><link rel="icon" href="/dist/favicon.ico"><![endif]--><title>MeeChat</title><link href=/dist/css/chunk-common.379c8dde.css rel=preload as=style><link href=/dist/css/chunk-vendors.061e5f0b.css rel=preload as=style><link href=/dist/css/mini.a08db3bb.css rel=preload as=style><link href=/dist/js/chunk-common.0e67a9ee.js rel=preload as=script><link href=/dist/js/chunk-vendors.9f697f4d.js rel=preload as=script><link href=/dist/js/mini.c59638d1.js rel=preload as=script><link href=/dist/css/chunk-vendors.061e5f0b.css rel=stylesheet><link href=/dist/css/chunk-common.379c8dde.css rel=stylesheet><link href=/dist/css/mini.a08db3bb.css rel=stylesheet><link rel=icon type=image/png sizes=32x32 href=/dist/img/icons/favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=/dist/img/icons/favicon-16x16.png><link rel=manifest href=/dist/manifest.json><meta name=theme-color content=#4DBA87><meta name=apple-mobile-web-app-capable content=no><meta name=apple-mobile-web-app-status-bar-style content=default><meta name=apple-mobile-web-app-title content=MeeChat><link rel=apple-touch-icon href=/dist/img/icons/apple-touch-icon-152x152.png><link rel=mask-icon href=/dist/img/icons/safari-pinned-tab.svg color=#4DBA87><meta name=msapplication-TileImage content=/dist/img/icons/msapplication-icon-144x144.png><meta name=msapplication-TileColor content=#000000></head><body><div id=app></div><script>window.EOS_PROTOCOL = 'https'
       window.EOS_HOST = 'proxy.eosnode.tools'
-      window.EOS_PORT = '443'</script><script src=/dist/js/chunk-vendors.ab422156.js></script><script src=/dist/js/chunk-common.d6cc4453.js></script><script src=/dist/js/mini.29a4a407.js></script></body></html>
+      window.EOS_PORT = '443'</script><script src=/dist/js/chunk-vendors.9f697f4d.js></script><script src=/dist/js/chunk-common.0e67a9ee.js></script><script src=/dist/js/mini.c59638d1.js></script></body></html>

部分文件因为文件数量过多而无法显示