From f589b5d50c3ba83cbe22449a34a4333707b63aef Mon Sep 17 00:00:00 2001 From: Ghost <106998207@qq.com> Date: Mon, 30 Mar 2026 11:31:48 +0800 Subject: [PATCH] =?UTF-8?q?feat(admin):=20=E5=8F=8C=E9=82=80=E8=AF=B7?= =?UTF-8?q?=E5=A4=AA=E9=98=B3=E7=A0=81=E4=B8=8E=E8=87=AA=E5=8A=A8=E6=8B=89?= =?UTF-8?q?=E5=8F=96=EF=BC=9B=E4=BC=81=E4=B8=9A/=E4=B8=AA=E4=BA=BA=20Invit?= =?UTF-8?q?e=20API=EF=BC=9B=E7=94=A8=E6=88=B7=E5=A4=B4=E5=83=8F=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=EF=BC=9B=E9=A2=98=E5=BA=93=E5=B7=A5=E5=85=B7=E4=B8=8E?= =?UTF-8?q?=E6=8A=96=E9=9F=B3=E6=B5=8B=E8=AF=95=E9=A1=B5=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Made-with: Cursor --- admin/src/views/admin/Dashboard.vue | 61 ++++- admin/src/views/admin/Users.vue | 47 +++- api/app/controller/admin/Invite.php | 56 +++-- douyin-miniprogram/pages/test/disc.js | 324 ++++++++++++------------- douyin-miniprogram/pages/test/pdp.js | 330 +++++++++++++------------- miniprogram/utils/questionBank.js | 82 +++++++ 6 files changed, 541 insertions(+), 359 deletions(-) create mode 100644 miniprogram/utils/questionBank.js diff --git a/admin/src/views/admin/Dashboard.vue b/admin/src/views/admin/Dashboard.vue index 92f3a7c..e9bafe1 100644 --- a/admin/src/views/admin/Dashboard.vue +++ b/admin/src/views/admin/Dashboard.vue @@ -110,15 +110,24 @@

邀请小程序码

-

员工 / 客户扫码进入企业测评

+

企业版进企业测评,个人版进小程序首页

- {{ inviteQrcode ? '刷新' : '生成' }} + {{ inviteQrcodeEnterprise || inviteQrcodePersonal ? '刷新' : '生成' }}
- 邀请码 - 点击生成 + + {{ inviteLoadError || '进入页面将自动加载,也可点击生成' }}
@@ -189,7 +198,9 @@ const faceSubtypeHints = ref<{ const loading = ref(false) const inviteLoading = ref(false) -const inviteQrcode = ref('') +const inviteQrcodeEnterprise = ref('') +const inviteQrcodePersonal = ref('') +const inviteLoadError = ref('') /** 侧栏表格最大高度:单屏内滚动,不撑开整页 */ const tableMaxH = 220 @@ -381,21 +392,32 @@ const loadData = async () => { onMounted(() => { loadData() + loadInviteQrcode() }) const loadInviteQrcode = async () => { if (inviteLoading.value) return inviteLoading.value = true + inviteLoadError.value = '' try { const res: any = await request.get('/admin/invite/qrcode') - const qrcode = res?.data?.qrcode - if (qrcode && typeof qrcode === 'string') { - inviteQrcode.value = qrcode - } else { - ElMessage.error(res?.message || res?.msg || '生成失败,请确认企业绑定') + const d = res?.data + const ent = d?.enterprise?.qrcode ?? d?.qrcode + const per = d?.personal?.qrcode + if (typeof ent === 'string' && ent) inviteQrcodeEnterprise.value = ent + else inviteQrcodeEnterprise.value = '' + if (typeof per === 'string' && per) inviteQrcodePersonal.value = per + else inviteQrcodePersonal.value = '' + + if (!inviteQrcodeEnterprise.value && !inviteQrcodePersonal.value) { + const msg = res?.message || res?.msg || '生成失败,请确认企业绑定' + inviteLoadError.value = msg + ElMessage.error(msg) } } catch (error: any) { - ElMessage.error(error?.message || '生成失败') + const msg = error?.message || '生成失败' + inviteLoadError.value = msg + ElMessage.error(msg) } finally { inviteLoading.value = false } @@ -807,11 +829,26 @@ const loadInviteQrcode = async () => { .invite-body { display: flex; - align-items: center; + flex-wrap: wrap; + align-items: flex-start; justify-content: center; + gap: 16px; min-height: 112px; } +.invite-card { + display: flex; + flex-direction: column; + align-items: center; + gap: 6px; +} + +.invite-label { + font-size: 12px; + font-weight: 600; + color: #374151; +} + .invite-img { width: 112px; height: 112px; diff --git a/admin/src/views/admin/Users.vue b/admin/src/views/admin/Users.vue index c5505ee..f544d44 100644 --- a/admin/src/views/admin/Users.vue +++ b/admin/src/views/admin/Users.vue @@ -35,7 +35,20 @@