diff --git a/components.d.ts b/components.d.ts index 56f83b2..551163f 100644 --- a/components.d.ts +++ b/components.d.ts @@ -53,6 +53,7 @@ declare module 'vue' { MemberAccessDialog: typeof import('./src/components/MemberAccessDialog.vue')['default'] MemberDialog: typeof import('./src/components/MemberDialog.vue')['default'] MentorAsidePanel: typeof import('./src/components/MentorAsidePanel.vue')['default'] + MentorQrCodeDialog: typeof import('./src/components/MentorQrCodeDialog.vue')['default'] ProfileEditDrawer: typeof import('./src/components/ProfileEditDrawer.vue')['default'] ProfilePageContent: typeof import('./src/components/ProfilePageContent.vue')['default'] ProfileWelcomeDialog: typeof import('./src/components/ProfileWelcomeDialog.vue')['default'] diff --git a/src/api/mentor.ts b/src/api/mentor.ts index 3ae7fc8..8587cb9 100644 --- a/src/api/mentor.ts +++ b/src/api/mentor.ts @@ -243,10 +243,8 @@ export function fetchMentorMockChat(mentorId: string): Promise { return request.post('/public/mentor/getQrCode', { - key: { - path: 'pages/teacher/teacher', - teacherId, - loginAppid: 'wx3adfa65f9d8db17d', - }, + path: 'pages/teacher/teacher', + teacherId, + loginAppid: 'wx3adfa65f9d8db17d', }) } diff --git a/src/assets/styles/pages/mentor.scss b/src/assets/styles/pages/mentor.scss index 9b8f387..6a42f55 100644 --- a/src/assets/styles/pages/mentor.scss +++ b/src/assets/styles/pages/mentor.scss @@ -63,17 +63,48 @@ margin-top: 0.02rem; } + // 推荐搜索标签 + &__quick-tags { + display: flex; + align-items: center; + gap: 0.08rem; + margin-right: 0.16rem; + flex-wrap: wrap; + } + + &__quick-label { + font-size: 0.13rem; + color: $text-middle; + white-space: nowrap; + } + + &__quick-tag { + font-size: 0.12rem; + color: $accent; + border: 0.012rem solid $accent; + border-radius: 0.04rem; + padding: 0.03rem 0.08rem; + cursor: pointer; + white-space: nowrap; + background: #fff; + transition: background 0.15s; + + &:hover { + background: #EDF9FA; + } + } + // 搜索框 &__search-wrap { position: relative; display: flex; align-items: center; - width: 2.8rem; + width: 3rem; background: $bg-white; border: 1px solid $border-color; - border-radius: 0.2rem; + border-radius: 0.08rem; padding: 0 0.12rem; - height: 0.36rem; + height: 0.32rem; &:focus-within { border-color: $accent; diff --git a/src/components/MentorAsidePanel.vue b/src/components/MentorAsidePanel.vue index 6bd2428..14925fd 100644 --- a/src/components/MentorAsidePanel.vue +++ b/src/components/MentorAsidePanel.vue @@ -169,55 +169,21 @@ - - -
-
- -
-
-
扫码进入小程序预约导师咨询
-
查看导师价格、过往评价,并完成预约
-
- -
- - - -
-
- - -
-
-
-
- 小程序二维码 -
二维码加载失败
-
- - - -
-
-
+ + diff --git a/src/components/MentorQrCodeDialog.vue b/src/components/MentorQrCodeDialog.vue new file mode 100644 index 0000000..e86b2dd --- /dev/null +++ b/src/components/MentorQrCodeDialog.vue @@ -0,0 +1,122 @@ + + + diff --git a/src/components/SideNav.vue b/src/components/SideNav.vue index 30441b1..d5a0d0a 100644 --- a/src/components/SideNav.vue +++ b/src/components/SideNav.vue @@ -77,6 +77,10 @@ + + + + -
- - - - - - - +
+ +
+ 推荐搜索: + {{ tag }} +
+ +
+ + + + + + + +
@@ -243,6 +256,18 @@ const noMore = ref(false) /** 搜索关键词 */ const keyword = ref('') +/** 推荐搜索标签列表 */ +const quickSearchTags = ['字节跳动', '百度', '广告投放', 'AI产品', '大模型'] + +/** + * 点击推荐搜索标签 — 直接用标签文字搜索,不显示在输入框中 + */ +function handleQuickSearch(tag: string) { + keyword.value = tag + store.commit('SET_MENTOR_LIST_CACHE', null) + resetAndLoad() +} + /** 列表容器 ref */ const listRef = ref(null) diff --git a/src/views/MentorDetail.vue b/src/views/MentorDetail.vue index 1432cef..8ebd693 100644 --- a/src/views/MentorDetail.vue +++ b/src/views/MentorDetail.vue @@ -101,42 +101,12 @@ - - -
-
- -
-
-
扫码进入小程序预约导师咨询
-
查看导师价格、过往评价,并完成预约
-
-
- - - -
-
- -
-
-
-
- 小程序二维码 -
二维码加载失败
-
- - -
-
-
+ + @@ -145,9 +115,10 @@ import { ref, computed, onMounted } from 'vue' import { useRouter, useRoute } from 'vue-router' import SideNav from '@/components/SideNav.vue' import MentorAsidePanel from '@/components/MentorAsidePanel.vue' -import { fetchMentorFullInfo, fetchMentorTalks, fetchMentorQrCode } from '@/api/mentor' +import { fetchMentorFullInfo, fetchMentorTalks } from '@/api/mentor' import type { MentorFullInfo, MentorTalk } from '@/api/mentor' import { toOssUrl } from '@/utils/image' +import MentorQrCodeDialog from '@/components/MentorQrCodeDialog.vue' // ==================== 路由相关 ==================== @@ -259,36 +230,10 @@ onMounted(() => { /** 弹窗是否显示 */ const showQrDialog = ref(false) -/** 二维码图片 base64 */ -const qrCodeBase64 = ref('') - -/** 二维码加载状态 */ -const qrLoading = ref(false) - /** - * 打开二维码弹窗,调接口获取当前导师的小程序二维码 + * 打开二维码弹窗 */ -async function openQrDialog() { +function openQrDialog() { showQrDialog.value = true - qrLoading.value = true - qrCodeBase64.value = '' - try { - const res: any = await fetchMentorQrCode(mentorId) - const base64 = res?.data ?? res - if (typeof base64 === 'string' && base64.length > 0) { - qrCodeBase64.value = base64.startsWith('data:image') - ? base64 - : `data:image/png;base64,${base64}` - } - } catch (e) { - console.error('[二维码] 获取失败', e) - } finally { - qrLoading.value = false - } -} - -/** 关闭弹窗 */ -function closeQrDialog() { - showQrDialog.value = false }