李志伟 před 3 roky
rodič
revize
89dd36ada4
7 změnil soubory, kde provedl 105 přidání a 19 odebrání
  1. 1
    1
      mock/user.js
  2. 1
    0
      package.json
  3. binární
      src/icons/logo.jpg
  4. 4
    15
      src/layout/components/Navbar.vue
  5. 1
    2
      src/utils/auth.js
  6. 93
    1
      src/views/gameManage/index.vue
  7. 5
    0
      yarn.lock

+ 1
- 1
mock/user.js Zobrazit soubor

42
 
42
 
43
       return {
43
       return {
44
         code: 1000,
44
         code: 1000,
45
-        data: token,
45
+        data: token
46
       }
46
       }
47
     }
47
     }
48
   },
48
   },

+ 1
- 0
package.json Zobrazit soubor

24
     "normalize.css": "7.0.0",
24
     "normalize.css": "7.0.0",
25
     "nprogress": "0.2.0",
25
     "nprogress": "0.2.0",
26
     "path-to-regexp": "2.4.0",
26
     "path-to-regexp": "2.4.0",
27
+    "qrcodejs2": "0.0.2",
27
     "vue": "2.6.10",
28
     "vue": "2.6.10",
28
     "vue-axios": "^3.4.0",
29
     "vue-axios": "^3.4.0",
29
     "vue-axios-plugin": "^1.3.0",
30
     "vue-axios-plugin": "^1.3.0",

binární
src/icons/logo.jpg Zobrazit soubor


+ 4
- 15
src/layout/components/Navbar.vue Zobrazit soubor

7
     <div class="right-menu">
7
     <div class="right-menu">
8
       <el-dropdown class="avatar-container" trigger="click">
8
       <el-dropdown class="avatar-container" trigger="click">
9
         <div class="avatar-wrapper">
9
         <div class="avatar-wrapper">
10
-          <img :src="avatar+'?imageView2/1/w/80/h/80'" class="user-avatar">
10
+          <img src="../../icons/logo.jpg" class="user-avatar">
11
           <i class="el-icon-caret-bottom" />
11
           <i class="el-icon-caret-bottom" />
12
         </div>
12
         </div>
13
-        <el-dropdown-menu slot="dropdown" class="user-dropdown">
14
-          <router-link to="/">
15
-            <el-dropdown-item>
16
-              Home
17
-            </el-dropdown-item>
18
-          </router-link>
19
-          <a target="_blank" href="https://github.com/PanJiaChen/vue-admin-template/">
20
-            <el-dropdown-item>Github</el-dropdown-item>
21
-          </a>
22
-          <a target="_blank" href="https://panjiachen.github.io/vue-element-admin-site/#/">
23
-            <el-dropdown-item>Docs</el-dropdown-item>
24
-          </a>
25
-          <el-dropdown-item divided @click.native="logout">
26
-            <span style="display:block;">Log Out</span>
13
+        <el-dropdown-menu slot="dropdown">
14
+          <el-dropdown-item @click.native="logout">
15
+            <span>安全退出</span>
27
           </el-dropdown-item>
16
           </el-dropdown-item>
28
         </el-dropdown-menu>
17
         </el-dropdown-menu>
29
       </el-dropdown>
18
       </el-dropdown>

+ 1
- 2
src/utils/auth.js Zobrazit soubor

10
   return Cookies.set(TokenKey, token)
10
   return Cookies.set(TokenKey, token)
11
 }
11
 }
12
 
12
 
13
-
14
 export function removeToken() {
13
 export function removeToken() {
15
   return Cookies.remove(TokenKey)
14
   return Cookies.remove(TokenKey)
16
 }
15
 }
22
 }
21
 }
23
 export function getUserId() {
22
 export function getUserId() {
24
   return Cookies.get(UserIdKey)
23
   return Cookies.get(UserIdKey)
25
-}
24
+}

+ 93
- 1
src/views/gameManage/index.vue Zobrazit soubor

33
           }}
33
           }}
34
         </template>
34
         </template>
35
       </el-table-column>
35
       </el-table-column>
36
+      <el-table-column prop="qcode" label="二维码">
37
+        <template slot-scope="scope">
38
+          <el-image :src="scope.row.qcode" style="width: 100px; height: 100px" />
39
+        </template>
40
+      </el-table-column>
36
       <el-table-column fixed="right" label="操作">
41
       <el-table-column fixed="right" label="操作">
37
         <template slot-scope="scope">
42
         <template slot-scope="scope">
38
           <el-link :underline="false" style="margin-right:1em" type="primary">
43
           <el-link :underline="false" style="margin-right:1em" type="primary">
40
               :to="{name: 'gameEdit', query: { id: scope.row.gameId }}"
45
               :to="{name: 'gameEdit', query: { id: scope.row.gameId }}"
41
             >编辑</router-link>
46
             >编辑</router-link>
42
           </el-link>
47
           </el-link>
48
+          <el-button type="text" style="margin-right:1em" @click="downloadQrcode(scope.row)">下载二维码</el-button>
43
           <el-popconfirm
49
           <el-popconfirm
44
             icon="el-icon-info"
50
             icon="el-icon-info"
45
             icon-color="red"
51
             icon-color="red"
51
         </template>
57
         </template>
52
       </el-table-column>
58
       </el-table-column>
53
     </el-table>
59
     </el-table>
60
+    <div v-show="false" id="qrcode" ref="qrcode" />
54
     <el-pagination
61
     <el-pagination
55
       v-show="gameTotal!==0"
62
       v-show="gameTotal!==0"
56
       style="float:right; margin:20px 0"
63
       style="float:right; margin:20px 0"
66
 </template>
73
 </template>
67
 <script>
74
 <script>
68
 import { getGameList, deleteGame } from '@/api/game'
75
 import { getGameList, deleteGame } from '@/api/game'
69
-
76
+import QRCode from 'qrcodejs2'
70
 export default {
77
 export default {
71
   data() {
78
   data() {
72
     return {
79
     return {
81
       gameTotal: 0 // 条目总数
88
       gameTotal: 0 // 条目总数
82
     }
89
     }
83
   },
90
   },
91
+  watch: {
92
+    tableData: {
93
+      handler(val) {
94
+        if (val.length > 0 && !val[0].qcode) {
95
+          var newData = []
96
+          val.map(item => {
97
+            newData.push(item)
98
+          })
99
+          newData.map(item => {
100
+            item.qcode = this.setCodeImg(item)
101
+          })
102
+          this.tableData = newData
103
+        }
104
+      },
105
+      immediate: true // 页面加载时就启动
106
+    }
107
+  },
84
   mounted() {
108
   mounted() {
85
     this.onSearch()
109
     this.onSearch()
86
   },
110
   },
139
     dateChange(val) {
163
     dateChange(val) {
140
       this.startDate = this.daterange[0]
164
       this.startDate = this.daterange[0]
141
       this.endDate = this.daterange[1]
165
       this.endDate = this.daterange[1]
166
+    },
167
+
168
+    // 生成二维码
169
+    qrcode(val) {
170
+      const qrcode = new QRCode('qrcode', {
171
+        width: 200,
172
+        height: 200, // 高度
173
+        text: 'http://192.168.89.76:8080/?gameId=' + val.gameId
174
+      })
175
+    },
176
+    // 下载二维码
177
+    downloadQrcode(val) {
178
+      document.getElementById('qrcode').innerHTML = ''
179
+      this.qrcode(val) // 下载之前首先要有二维码
180
+      // 先找到canvas节点下的二维码图片
181
+      const myCanvas = document.getElementById('qrcode').getElementsByTagName('canvas')
182
+      const img = document.getElementById('qrcode').getElementsByTagName('img')
183
+      // 创建一个a节点
184
+      const a = document.createElement('a')
185
+      // 设置a的href属性将canvas变成png格式
186
+      const imgURL = myCanvas[0].toDataURL('image/jpg')
187
+      const ua = navigator.userAgent
188
+      if (ua.indexOf('Trident') !== -1 && ua.indexOf('Windows') !== -1) { // IE内核 并且  windows系统 情况下 才执行;
189
+        var bstr = atob(imgURL.split(',')[1])
190
+        var n = bstr.length
191
+        var u8arr = new Uint8Array(n)
192
+        while (n--) {
193
+          u8arr[n] = bstr.charCodeAt(n)
194
+        }
195
+        var blob = new Blob([u8arr])
196
+        window.navigator.msSaveOrOpenBlob(blob, val.title + '.png')
197
+      } else if (ua.indexOf('Firefox') > -1) { // 火狐兼容下载
198
+        const blob = this.base64ToBlob(imgURL) // new Blob([content]);
199
+        const evt = document.createEvent('HTMLEvents')
200
+        evt.initEvent('click', true, true)// initEvent 不加后两个参数在FF下会报错  事件类型,是否冒泡,是否阻止浏览器的默认行为
201
+        a.download = val.title + '.png'// 下载图片名称,如果填内容识别不到,下载为未知文件,所以我这里就不填为空
202
+        a.href = URL.createObjectURL(blob)
203
+        a.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true, view: window }))// 兼容火狐
204
+      } else { // 谷歌兼容下载
205
+        img.src = imgURL
206
+        a.href = img.src
207
+        // 设置下载文件的名字
208
+        a.download = val.title + '.png'
209
+        // 点击
210
+        a.click()
211
+      }
212
+    },
213
+    // 返回对应二维码图片给表格
214
+    setCodeImg(val) {
215
+      document.getElementById('qrcode').innerHTML = ''
216
+      this.qrcode(val) // 下载之前首先要有二维码
217
+      // 先找到canvas节点下的二维码图片
218
+      const myCanvas = document.getElementById('qrcode').getElementsByTagName('canvas')
219
+      // 设置a的href属性将canvas变成png格式
220
+      const imgURL = myCanvas[myCanvas.length - 1].toDataURL('image/jpg')
221
+      return imgURL
222
+    },
223
+    // base64转blob
224
+    base64ToBlob(code) {
225
+      const parts = code.split(';base64,')
226
+      const contentType = parts[0].split(':')[1]
227
+      const raw = window.atob(parts[1])
228
+      const rawLength = raw.length
229
+      const uInt8Array = new Uint8Array(rawLength)
230
+      for (let i = 0; i < rawLength; ++i) {
231
+        uInt8Array[i] = raw.charCodeAt(i)
232
+      }
233
+      return new Blob([uInt8Array], { type: contentType })
142
     }
234
     }
143
   }
235
   }
144
 }
236
 }

+ 5
- 0
yarn.lock Zobrazit soubor

9013
   resolved "https://registry.npmmirror.com/q/download/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
9013
   resolved "https://registry.npmmirror.com/q/download/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
9014
   integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=
9014
   integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=
9015
 
9015
 
9016
+qrcodejs2@0.0.2:
9017
+  version "0.0.2"
9018
+  resolved "https://registry.npmmirror.com/qrcodejs2/-/qrcodejs2-0.0.2.tgz#465afe5e39f19facecb932c11f7a186109146ae1"
9019
+  integrity sha512-+Y4HA+cb6qUzdgvI3KML8GYpMFwB24dFwzMkS/yXq6hwtUGNUnZQdUnksrV1XGMc2mid5ROw5SAuY9XhI3ValA==
9020
+
9016
 qs@6.9.6:
9021
 qs@6.9.6:
9017
   version "6.9.6"
9022
   version "6.9.6"
9018
   resolved "https://registry.npmmirror.com/qs/download/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee"
9023
   resolved "https://registry.npmmirror.com/qs/download/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee"