From f69e374b39817c26d06c23e11c25a6b6cfa78f85 Mon Sep 17 00:00:00 2001 From: wangdongbo <949818794@qq.com> Date: Tue, 3 Feb 2026 11:20:32 +0800 Subject: [PATCH 1/2] no message --- manifest.json | 74 ++++++------- package.json | 2 +- pages/home/avatar.svg | 1 + pages/message/chat.scss | 99 ++++++++++++++++- pages/message/hooks/use-group-chat.js | 87 ++++++++++++--- pages/message/index.vue | 146 +++++++++++++++++++++++--- utils/api.js | 3 +- utils/tim-chat.js | 2 +- utils/widget.js | 87 ++++++++++++++- 9 files changed, 430 insertions(+), 71 deletions(-) create mode 100644 pages/home/avatar.svg diff --git a/manifest.json b/manifest.json index dbbc303..6966ae3 100644 --- a/manifest.json +++ b/manifest.json @@ -1,28 +1,28 @@ { - "name" : "ykt-wxapp", - "appid" : "__UNI__06F5B0E", - "description" : "", - "versionName" : "1.0.0", - "versionCode" : "100", - "transformPx" : false, + "name": "ykt-team-wxapp", + "appid": "__UNI__3EBDA15", + "description": "", + "versionName": "1.0.0", + "versionCode": "100", + "transformPx": false, /* 5+App特有相关 */ - "app-plus" : { - "usingComponents" : true, - "nvueStyleCompiler" : "uni-app", - "compilerVersion" : 3, - "splashscreen" : { - "alwaysShowBeforeRender" : true, - "waiting" : true, - "autoclose" : true, - "delay" : 0 + "app-plus": { + "usingComponents": true, + "nvueStyleCompiler": "uni-app", + "compilerVersion": 3, + "splashscreen": { + "alwaysShowBeforeRender": true, + "waiting": true, + "autoclose": true, + "delay": 0 }, /* 模块配置 */ - "modules" : {}, + "modules": {}, /* 应用发布信息 */ - "distribute" : { + "distribute": { /* android打包配置 */ - "android" : { - "permissions" : [ + "android": { + "permissions": [ "", "", "", @@ -41,32 +41,32 @@ ] }, /* ios打包配置 */ - "ios" : {}, + "ios": {}, /* SDK配置 */ - "sdkConfigs" : {} + "sdkConfigs": {} } }, /* 快应用特有相关 */ - "quickapp" : {}, + "quickapp": {}, /* 小程序特有相关 */ - "mp-weixin" : { - "appid" : "wx93af55767423938e", - "setting" : { - "urlCheck" : false + "mp-weixin": { + "appid": "wx93af55767423938e", + "setting": { + "urlCheck": false }, - "usingComponents" : true + "usingComponents": true }, - "mp-alipay" : { - "usingComponents" : true + "mp-alipay": { + "usingComponents": true }, - "mp-baidu" : { - "usingComponents" : true + "mp-baidu": { + "usingComponents": true }, - "mp-toutiao" : { - "usingComponents" : true + "mp-toutiao": { + "usingComponents": true }, - "uniStatistics" : { - "enable" : false + "uniStatistics": { + "enable": false }, - "vueVersion" : "3" -} + "vueVersion": "3" +} \ No newline at end of file diff --git a/package.json b/package.json index aec6c20..b382f07 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "ykt-wxapp", + "name": "医客通患者端", "version": "1.0.0", "description": "", "main": "main.js", diff --git a/pages/home/avatar.svg b/pages/home/avatar.svg new file mode 100644 index 0000000..21ec70f --- /dev/null +++ b/pages/home/avatar.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pages/message/chat.scss b/pages/message/chat.scss index ab9fca4..039e242 100644 --- a/pages/message/chat.scss +++ b/pages/message/chat.scss @@ -16,6 +16,101 @@ $primary-color: #0877F1; background-color: #f5f5f5; } +/* 患者信息栏样式 */ +.patient-info-bar { + position: relative; + background: #fff; + border-bottom: 1rpx solid #f0f0f0; + padding: 20rpx 32rpx; + z-index: 10; + flex-shrink: 0; +} + +.patient-info-content { + display: flex; + align-items: center; + justify-content: space-between; +} + +.patient-basic-info { + display: flex; + align-items: center; + gap: 16rpx; + flex: 1; + min-width: 0; +} + +.patient-name { + font-size: 32rpx; + color: #333; + font-weight: 600; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 200rpx; +} + +.patient-detail { + font-size: 28rpx; + color: #999; + white-space: nowrap; + flex-shrink: 0; +} + +.status-badge { + display: flex; + align-items: center; + gap: 4rpx; + padding: 8rpx 16rpx; + border-radius: 20rpx; + flex-shrink: 0; +} + +.badge-text { + font-size: 24rpx; + font-weight: 500; +} + +.badge-pending { + background: #fff3cd; + + .badge-text { + color: #856404; + } +} + +.badge-processing { + background: #d1ecf1; + + .badge-text { + color: #0c5460; + } +} + +.badge-finished { + background: #d4edda; + + .badge-text { + color: #155724; + } +} + +.badge-cancelled { + background: #f8d7da; + + .badge-text { + color: #721c24; + } +} + +.badge-rejected { + background: #f8d7da; + + .badge-text { + color: #721c24; + } +} + .chat-content { flex: 1; box-sizing: border-box; @@ -348,7 +443,7 @@ $primary-color: #0877F1; .text-input, .voice-input-btn { flex: 1; - padding: 16rpx 46rpx; + padding: 26rpx 46rpx; background-color: #f3f5fa; border-radius: 20rpx; margin: 0 16rpx; @@ -931,7 +1026,7 @@ $primary-color: #0877F1; .text-input::-moz-placeholder, .text-input:-ms-input-placeholder, .text-input::placeholder { - line-height: normal; + line-height: 1.5; } .voice-input-btn::-webkit-input-placeholder, diff --git a/pages/message/hooks/use-group-chat.js b/pages/message/hooks/use-group-chat.js index e550907..17232c8 100644 --- a/pages/message/hooks/use-group-chat.js +++ b/pages/message/hooks/use-group-chat.js @@ -1,13 +1,18 @@ import { ref, computed } from 'vue' import { onShow, onUnload } from '@dcloudio/uni-app' +import api from '@/utils/api.js' +import useTeamStore from '@/store/team.js' /** - * 简单的群聊hook + * 群聊hook - 管理群聊成员和头像 * @param {string} groupID 群组ID */ export default function useGroupChat(groupID) { const groupInfo = ref({}) const members = ref([]) + const teamMemberIds = ref([]) // 存储团队成员的userId列表 + const patientId = ref('') // 存储患者ID + const teamStore = useTeamStore() // 群聊成员映射 const chatMember = computed(() => { @@ -15,30 +20,80 @@ export default function useGroupChat(groupID) { members.value.forEach(member => { res[member.id] = { name: member.name, - avatar: member.avatar || '/static/default-avatar.png' + avatar: member.avatar, + isTeamMember: member.isTeamMember // 标记是否为团队成员 } }) return res }) - // 获取群聊信息 + // 判断某个userId是否为团队成员 + const isTeamMember = (userId) => { + return teamMemberIds.value.includes(userId) + } + + // 获取用户头像(根据是否为团队成员返回不同的默认头像) + const getUserAvatar = (userId) => { + const member = chatMember.value[userId] + if (!member) { + // 如果找不到成员信息,根据是否为团队成员返回默认头像 + // 团队成员和患者都使用 default-avatar.png + return '/static/default-avatar.png' + } + + // 如果有头像且不为空字符串,返回头像 + if (member.avatar && member.avatar.trim() !== '') { + return member.avatar + } + + // 否则使用默认头像 + return '/static/default-avatar.png' + } + + // 获取群聊信息和成员头像 async function getGroupInfo() { const gid = typeof groupID === 'string' ? groupID : groupID.value if (!gid) return try { - // 这里可以调用API获取群聊信息 - // const res = await getGroupDetail(gid) - // if (res && res.success) { - // groupInfo.value = res.data - // members.value = res.data.members || [] - // } + // 1. 获取群聊基本信息 + const groupResult = await api('getGroupListByGroupId', { groupId: gid }) - // 暂时使用本地数据 - groupInfo.value = { - groupID: gid, - name: '群聊', - status: 'active' + if (groupResult && groupResult.success && groupResult.data) { + groupInfo.value = { + groupID: gid, + name: groupResult.data.team?.name || '群聊', + status: groupResult.data.orderStatus || 'active', + teamId: groupResult.data.teamId + } + + // 2. 如果有teamId,获取团队成员头像 + if (groupResult.data.teamId) { + const avatarMap = await teamStore.getTeamMemberAvatars(groupResult.data.teamId) + + // 3. 存储团队成员ID列表 + teamMemberIds.value = Object.keys(avatarMap) + + // 4. 构建团队成员列表 + members.value = teamMemberIds.value.map(userId => ({ + id: userId, + name: userId, // 这里可以从其他地方获取真实姓名 + avatar: avatarMap[userId] || '', + isTeamMember: true + })) + + // 5. 添加患者信息(使用默认患者头像) + if (groupResult.data.patient) { + const pid = groupResult.data.patientId?.toString() || '' + patientId.value = pid + members.value.push({ + id: pid, + name: groupResult.data.patient.name || '患者', + avatar: '', // 患者不设置头像,使用默认 + isTeamMember: false + }) + } + } } } catch (error) { console.error('获取群聊信息失败:', error) @@ -57,6 +112,8 @@ export default function useGroupChat(groupID) { groupInfo, members, chatMember, - getGroupInfo + getGroupInfo, + isTeamMember, + getUserAvatar } } diff --git a/pages/message/index.vue b/pages/message/index.vue index 0f49ee9..8ad4cd4 100644 --- a/pages/message/index.vue +++ b/pages/message/index.vue @@ -1,5 +1,20 @@