From 27cd042df9aca0383a49f3514bc21958dd890912 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期一, 29 六月 2026 15:42:23 +0800
Subject: [PATCH] 银川 1.联调产品维护页面 2.添加IM即时通讯模块

---
 src/views/im/home/components/group/group-member-item.vue |   84 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 84 insertions(+), 0 deletions(-)

diff --git a/src/views/im/home/components/group/group-member-item.vue b/src/views/im/home/components/group/group-member-item.vue
new file mode 100644
index 0000000..23085c1
--- /dev/null
+++ b/src/views/im/home/components/group/group-member-item.vue
@@ -0,0 +1,84 @@
+<script lang="ts" setup>
+import type { GroupMemberLite } from './group-member.vue'
+
+import { computed } from 'vue'
+
+import { DICT_TYPE } from '#/packages/constants/src'
+import { getDictLabel } from '#/packages/effects/hooks/src'
+
+import { ImGroupMemberRole } from '../../../utils/constants'
+import { UserAvatar } from '../user'
+
+defineOptions({ name: 'ImGroupMemberItem' })
+
+const props = withDefaults(
+  defineProps<{
+    active?: boolean
+    height?: number
+    member: GroupMemberLite
+  }>(),
+  {
+    height: 50,
+    active: false
+  }
+)
+
+defineEmits<{
+  click: [member: GroupMemberLite]
+}>()
+
+const avatarSize = computed(() => Math.ceil(props.height * 0.75))
+
+/** 瑙掕壊鏍囩鏂囨锛氭櫘閫氭垚鍛樹笉鏄剧ず锛屽叾浣欏彇 im_group_member_role 瀛楀吀 label */
+const roleLabel = computed(() => {
+  if (props.member.role == null || props.member.role === ImGroupMemberRole.NORMAL) {
+    return ''
+  }
+  return getDictLabel(DICT_TYPE.IM_GROUP_MEMBER_ROLE, props.member.role)
+})
+
+/** 瑙掕壊鏍囩鏍峰紡锛氱兢涓荤敤涓昏壊锛涚鐞嗗憳鐢ㄦ瑕佽壊 */
+const roleLabelClass = computed(() => {
+  if (props.member.role === ImGroupMemberRole.OWNER) {
+    return 'text-[var(--ant-color-primary)] bg-[var(--ant-color-primary-bg)]'
+  }
+  return 'text-[var(--ant-color-info)] bg-[var(--ant-color-fill)]'
+})
+</script>
+
+<template>
+  <!--
+    缇ゆ垚鍛樿褰㈡��
+    - 妯帓銆佸甫 hover 鎬侊紱slot 鏀� checkbox / 鎿嶄綔鎸夐挳绛�
+    - 涓� GroupMember 鐨勫樊鍒細甯� hover 鎬� + slot 鎵╁睍鐐癸紝閫傚悎 selector / admin 鍒楄〃
+  -->
+  <div
+    class="relative flex gap-2.5 items-center mx-px px-4 box-border whitespace-nowrap rounded cursor-pointer transition-colors hover:bg-[var(--ant-color-fill)]"
+    :class="{ '!bg-[#e1eaf7] dark:!bg-[var(--ant-color-primary-bg-hover)]': active }"
+    :style="{ height: `${height }px` }"
+    @click="$emit('click', member)"
+  >
+    <UserAvatar
+      :id="member.userId"
+      :url="member.avatar"
+      :name="member.nickname"
+      :size="avatarSize"
+      :clickable="false"
+    />
+    <div
+      class="flex-1 h-full pl-1 overflow-hidden text-sm truncate text-[var(--ant-color-text)]"
+      :style="{ lineHeight: `${height }px` }"
+    >
+      {{ member.showName }}
+    </div>
+    <!-- 瑙掕壊鏍囩锛氱兢涓� / 绠$悊鍛橈紱鏅�氭垚鍛樹笉鏄剧ず銆備粎鍦ㄤ紶鍏� member.role 鏃剁敓鏁� -->
+    <span
+      v-if="roleLabel"
+      class="px-1.5 py-px rounded text-xs whitespace-nowrap"
+      :class="roleLabelClass"
+    >
+      {{ roleLabel }}
+    </span>
+    <slot></slot>
+  </div>
+</template>

--
Gitblit v1.9.3