From b574291c99bba5819fe2d69405ffa10e9d47d994 Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期二, 03 二月 2026 18:05:44 +0800
Subject: [PATCH] 代码初始化

---
 admin/src/views/system/user.vue |   85 +++++++++++++++++++++++++++++++++++++++---
 1 files changed, 78 insertions(+), 7 deletions(-)

diff --git a/admin/src/views/system/user.vue b/admin/src/views/system/user.vue
index 6e4d01b..e8c12fb 100644
--- a/admin/src/views/system/user.vue
+++ b/admin/src/views/system/user.vue
@@ -32,12 +32,12 @@
         @sort-change="handleSortChange"
       >
         <el-table-column type="selection" width="55"></el-table-column>
-        <el-table-column prop="avatar" label="澶村儚" width="80px" class-name="table-column-avatar" fixed="left">
-          <template slot-scope="{row}">
-            <img :src="row.avatar == null ? '/avatar/man.png' : row.avatar">
+        <el-table-column prop="avatar" label="鏀舵鐮�" width="100px" class-name="table-column-avatar"  >
+          <template slot-scope="{ row }">
+              <div class="qrcodediv" :id="`qrcode${row.id}`" :ref="`qrcode${row.id}`"></div>
           </template>
         </el-table-column>
-        <el-table-column prop="realname" label="濮撳悕" min-width="100px" fixed="left"></el-table-column>
+        <el-table-column prop="realname" label="濮撳悕" min-width="100px" ></el-table-column>
         <el-table-column prop="username" label="鐢ㄦ埛鍚�" min-width="120px"></el-table-column>
         <el-table-column prop="empNo" label="宸ュ彿" sortable="custom" sort-by="EMP_NO" min-width="80px"></el-table-column>
         <el-table-column prop="sex" label="鎬у埆" sortable="custom" sort-by="SEX" min-width="80px">
@@ -72,7 +72,8 @@
           <template v-if="isAdmin || (row.id !== userInfo.id && row.roles.findIndex(r => r.code === adminCode) === -1)" slot-scope="{row}">
             <el-button type="text" icon="el-icon-edit" @click="$refs.operaUserWindow.open('缂栬緫鐢ㄦ埛', row)" v-permissions="['system:user:update']">缂栬緫</el-button>
             <el-button type="text" icon="el-icon-s-custom" @click="$refs.roleConfigWindow.open(row)" v-permissions="['system:user:createUserRole']">閰嶇疆瑙掕壊</el-button>
-            <el-button type="text" @click="$refs.resetPwdWindow.open(row)" v-permissions="['system:user:resetPwd']">閲嶇疆瀵嗙爜</el-button>
+            <el-button type="text" icon="el-icon-download"  @click="download(row)"  >涓嬭浇鏀舵鐮�</el-button>
+            <el-button type="text" @click="$refs.resetPwdWindow.open(row)"  icon="el-icon-edit" v-permissions="['system:user:resetPwd']">閲嶇疆瀵嗙爜</el-button>
             <el-button v-if="!row.fixed" type="text" icon="el-icon-delete" @click="deleteById(row)" v-permissions="['system:user:delete']">鍒犻櫎</el-button>
           </template>
         </el-table-column>
@@ -100,6 +101,7 @@
 import RoleConfigWindow from '@/components/system/user/RoleConfigWindow'
 import ResetPwdWindow from '@/components/system/user/ResetPwdWindow'
 
+import QRCode from 'qrcodejs2'
 export default {
   name: 'SystemUser',
   extends: BaseTable,
@@ -125,16 +127,85 @@
       }]
     })
     this.search()
+  },
+  methods: {
+    handlePageChange (pageIndex) {
+      var that = this
+      this.__checkApi()
+      this.tableData.pagination.pageIndex = pageIndex || this.tableData.pagination.pageIndex
+      this.isWorking.search = true
+      this.api.fetchList({
+        page: this.tableData.pagination.pageIndex,
+        capacity: this.tableData.pagination.pageSize,
+        model: this.searchForm,
+        sorts: this.tableData.sorts
+      })
+        .then(data => {
+          // that.removeElementsWithClass("qrcodediv")
+          that.tableData.list = data.records
+          that.tableData.pagination.total = data.total
+          this.$nextTick(() => {
+            that.tableData.list.forEach((row) => {
+              document.getElementById('qrcode' + row.id).innerHTML = ''
+              row.qrcodeImg = that.crateQrcodeShow('qrcode' + row.id, row.payUrl)
+            })
+          })
+        })
+        .catch(e => {
+          this.$tip.apiFailed(e)
+        })
+        .finally(() => {
+          this.isWorking.search = false
+        })
+    },
+    download (row) {
+      const nodeList = Array.prototype.slice.call(row.qrcodeImg._el.children)
+      const img = nodeList.find((item) => item.nodeName.toUpperCase() === 'IMG')// 閫夊嚭鍥剧墖绫诲瀷
+      // 鏋勫缓鐢诲竷
+      const canvas = document.createElement('canvas')
+      canvas.width = 220
+      canvas.height = 220
+      const ctx = canvas.getContext('2d')
+      ctx.fillStyle = 'white'
+      ctx.fillRect(0, 0, canvas.width, canvas.height) // 濉厖鏁翠釜鐢诲竷鍖哄煙锛岀‘淇濊儗鏅壊瑕嗙洊鏁翠釜鐢诲竷
+      ctx.drawImage(img, 10, 10, 200, 200)
+      // 鏋勯�爑rl
+      const url = canvas.toDataURL('image/png')
+
+      const a = document.createElement('a')
+      a.href = url
+      a.download = `${row.realname}-鏀舵鐮�.png`
+      a.click()
+      a.remove()
+    },
+    removeElementsWithClass (className) {
+      const elements = document.querySelectorAll(`.${className}`)
+      elements.forEach(element => {
+        element.parentNode.removeChild(element)
+      })
+    },
+    crateQrcodeShow (div, qrcode1) {
+      if (!div || !div.length || qrcode1 == null || qrcode1 == '') {
+        return
+      }
+      return new QRCode(div, {
+        width: 80,
+        height: 80,
+        text: qrcode1,
+        correctLevel: QRCode.CorrectLevel.H,
+        useSVG: true
+      })
+    }
   }
 }
 </script>
 
 <style scoped lang="scss">
 @import "@/assets/style/variables.scss";
-// 鍒楄〃澶村儚澶勭悊
+/*// 鍒楄〃澶村儚澶勭悊
 .table-column-avatar {
   img {
     width: 48px;
   }
-}
+}*/
 </style>

--
Gitblit v1.9.3