| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // ==================== WebSocket 帧 / äºä»¶ ==================== |
| | | |
| | | // å端 WebSocket ç»ä¸å¸§ç»æï¼{ type, content } |
| | | export interface WebSocketFrame { |
| | | type: string // 帧类åï¼å¯¹é½ ImWebSocketMessageType |
| | | content: string // 帧å
容ï¼JSON åç¬¦ä¸²ï¼ |
| | | } |
| | | |
| | | // IM WebSocket éç¥ DTOï¼å¯¹é½å端 ImNotificationWebSocketDTOï¼ |
| | | export interface ImNotificationWebSocketDTO { |
| | | conversationType: number // ä¼è¯ç±»å |
| | | contentType: number // å
容类å |
| | | payload: Record<string, any> // è´è½½æ°æ® |
| | | } |
| | | |
| | | // æ ä¼è¯å¨çº¿éç¥ï¼å¯¹é½å端 conversationType = NONE çç¬ç« payloadï¼ |
| | | export interface ImNoConversationNotification { |
| | | type: number // å
容类å |
| | | [key: string]: any |
| | | } |
| | | |
| | | // ç§èæ¶æ¯ DTOï¼å¯¹é½å端 ImPrivateMessageNotificationï¼ |
| | | export interface ImPrivateMessageNotification { |
| | | id: number // æ¶æ¯ç¼å· |
| | | clientMessageId: string // 客æ·ç«¯æ¶æ¯ç¼å· |
| | | senderId: number // åé人ç¼å· |
| | | receiverId: number // æ¥æ¶äººç¼å· |
| | | type: number // å
容类å |
| | | content: string // æ¶æ¯å
容 |
| | | status: number // æ¶æ¯ç¶æ |
| | | receiptStatus?: number // åæ§ç¶æï¼ä¸éè¦ / å¾
宿 / å·²å®æï¼ |
| | | sendTime: string // åéæ¶é´ |
| | | } |
| | | |
| | | // ç¾¤èæ¶æ¯ DTOï¼å¯¹é½å端 ImGroupMessageNotificationï¼ |
| | | export interface ImGroupMessageNotification { |
| | | id: number // æ¶æ¯ç¼å· |
| | | clientMessageId: string // 客æ·ç«¯æ¶æ¯ç¼å· |
| | | senderId: number // åé人ç¼å· |
| | | groupId: number // 群ç¼å· |
| | | type: number // å
容类å |
| | | content: string // æ¶æ¯å
容 |
| | | status: number // æ¶æ¯ç¶æ |
| | | sendTime: string // åéæ¶é´ |
| | | atUserIds?: number[] // 群 @ ç®æ ç¨æ·å表 |
| | | receiverUserIds?: number[] // 群å®åæ¥æ¶ç¨æ·å表 |
| | | readCount?: number // ç¾¤åæ§å·²è¯»äººæ°ï¼type = RECEIPT æ¶ä½¿ç¨ï¼ |
| | | receiptStatus?: number // ç¾¤åæ§ç¶æï¼type = RECEIPT æ¶ä½¿ç¨ï¼ |
| | | readId?: number // 已读ä½ç½® |
| | | } |
| | | |
| | | // æ¶æ¯å·²è¯»åæ¥éç¥ï¼å¯¹é½å端 ImMessageReadNotificationï¼ |
| | | export interface ImMessageReadNotification { |
| | | id: number // 已读ä½ç½® |
| | | type: number // å
容类å |
| | | senderId?: number // åé人ç¼å· |
| | | receiverId?: number // ç§èæ¥æ¶äººç¼å· |
| | | groupId?: number // 群ç¼å· |
| | | channelId?: number // é¢éç¼å· |
| | | readId?: number // 已读ä½ç½® |
| | | } |
| | | |
| | | // æ¶æ¯åæ§éç¥ï¼å¯¹é½å端 ImMessageReceiptNotificationï¼ |
| | | export interface ImMessageReceiptNotification { |
| | | id: number // æ¶æ¯ç¼å· |
| | | type: number // å
容类å |
| | | senderId?: number // 已读æ¹ç¨æ·ç¼å· |
| | | receiverId?: number // ç§èæ¥æ¶äººç¼å· |
| | | groupId?: number // 群ç¼å· |
| | | readCount?: number // ç¾¤åæ§å·²è¯»äººæ° |
| | | receiptStatus?: number // ç¾¤åæ§ç¶æ |
| | | } |
| | | |
| | | // ==================== æ¬å°ä¼è¯ / æ¶æ¯ç»æ ==================== |
| | | |
| | | /** å¼ç¨æ¶æ¯ */ |
| | | export interface QuoteMessage { |
| | | messageId: number // å¼ç¨æ¶æ¯ç¼å· |
| | | senderId: number // å¼ç¨æ¶æ¯åé人ç¼å· |
| | | type: number // å¼ç¨å
容类å |
| | | content: string // å¼ç¨æ¶æ¯å
容 |
| | | } |
| | | |
| | | // ä¼è¯æ°æ®ç»æï¼åç«¯èªæç»æï¼å端æ 对åºå®ä½ï¼ |
| | | export interface Conversation { |
| | | // ========== æ ¸å¿æ è¯ ========== |
| | | targetId: number // ä¼è¯ç®æ ç¼å·ï¼ç§è=å¯¹æ¹ userIdï¼ç¾¤è=groupId |
| | | type: number // ä¼è¯ç±»åï¼å¯¹é½ ImConversationType |
| | | |
| | | // ========== å±ç¤ºå段 ========== |
| | | name: string // å±ç¤ºåç§°ï¼ç§è=å¥½åæµç§°ï¼ç¾¤è=群åï¼ |
| | | avatar: string // 头å |
| | | unreadCount: number // æªè¯»æ° |
| | | |
| | | // ========== æå䏿¡æ¶æ¯äºå®ç´¢å¼ ========== |
| | | lastContent: string // ä¼è¯å表å±ç¤ºçæå䏿¡æ¶æ¯æè¦ |
| | | lastSendTime: number // æå䏿¡æ¶æ¯æ¶é´ï¼ç¨äºæåº |
| | | lastSenderId?: number // åé人ç¼å· |
| | | lastMessageType?: number // å
容类åï¼å¯¹é½ ImContentType |
| | | lastMessageId?: number // æå䏿¡æå¡ç«¯æ¶æ¯ç¼å· |
| | | lastClientMessageId?: string // æå䏿¡å®¢æ·ç«¯æ¶æ¯ç¼å· |
| | | lastMessageStatus?: number // æå䏿¡æ¶æ¯ç¶æ |
| | | lastReceiptStatus?: number // æå䏿¡ç¾¤åæ§ç¶æ |
| | | lastSelfSend?: boolean // æ¯å¦èªå·±åç |
| | | lastSenderDisplayName?: string // åé人æ¾ç¤ºåå¿«ç
§ââä»
ä½ utils/user.getSenderDisplayName 宿¶ç®ä¸åºçåæ¶ç fallback |
| | | |
| | | // ========== UI ç¶æ ========== |
| | | deleted?: boolean // æ¯å¦å·²å é¤ï¼è½¯å æ è®°ï¼æä¹
åæ¶è¿æ»¤ï¼ |
| | | top?: boolean // æ¯å¦ç½®é¡¶ï¼æåºæ¶ä¼å
ï¼ |
| | | silent?: boolean // æ¯å¦å
ææ°ï¼ä¸å±ç¤ºæªè¯»å¾½æ + ä¸åæç¤ºé³ï¼ |
| | | atMe?: boolean // 群èï¼æ¯å¦æäºº @æ |
| | | atAll?: boolean // 群èï¼æ¯å¦æäºº @å
¨ä½æå |
| | | reportedReadMessageId?: number // 已䏿¥å°æå¡ç«¯çæå¤§å·²è¯»æ¶æ¯ç¼å· |
| | | draft?: { |
| | | html: string // è¾å
¥æ¡ HTML |
| | | plain: string // è¾å
¥æ¡çº¯ææ¬ |
| | | reply?: QuoteMessage // å¼ç¨æ¶æ¯ |
| | | } // è¾å
¥æ¡è稿 |
| | | } |
| | | |
| | | // æ¶æ¯æ°æ®ç»æ |
| | | export interface Message { |
| | | // ========== åç«¯åæ®µï¼å¯¹é½ ImPrivateMessageNotification / ImGroupMessageNotificationï¼ ========== |
| | | id?: number // æå¡ç«¯æ¶æ¯ç¼å·ï¼åéä¸ä¸ºç©º |
| | | clientMessageId: string // 客æ·ç«¯æ¶æ¯ç¼å·ï¼æ¬å°çæç¨äºåå¹¶å»é |
| | | type: number // å
容类åï¼å¯¹é½ ImContentType |
| | | content: string // æ¶æ¯å
容ï¼JSON å符串 |
| | | status: number // æ¶æ¯ç¶æï¼å¯¹é½ ImMessageStatus |
| | | sendTime: number // åéæ¶é´ï¼åç«¯è½¬æ¯«ç§æ¶é´æ³ï¼å端为 LocalDateTime åç¬¦ä¸²ï¼ |
| | | senderId: number // åé人ç¼å· |
| | | atUserIds?: number[] // 群 @ ç®æ ç¨æ·å表 |
| | | receiverUserIds?: number[] // 群å®åæ¥æ¶ç¨æ·å表 |
| | | receiptStatus?: number // åæ§ç¶æï¼å¯¹é½ ImMessageReceiptStatusï¼ç§è / 群 / é¢ééç¨ï¼ |
| | | readCount?: number // ç¾¤åæ§å·²è¯»äººæ°ï¼ä»
ç¾¤æ¶æ¯ï¼ |
| | | materialId?: number // å
³èé¢éç´ æç¼å·ï¼ä»
é¢éæ¶æ¯ type=MATERIALï¼ |
| | | |
| | | // ========== å端æ©å±å段 ========== |
| | | // åé人æ¾ç¤ºåä¸å¾æ¸²ææ¶å®æ¶ç®ï¼utils/user.getSenderDisplayName / getSenderRealNickname |
| | | // ä¸å¨ Message ä¸åä»»ä½ååå¿«ç
§ï¼é¿å
夿³¨ / 群æµç§°åæ´åå岿¶æ¯æ¾ç¤ºéæ§ |
| | | targetId: number // ä¼è¯ç®æ ç¼å·ï¼ç§è=对端 userId / 群è=groupIdï¼ï¼ä¸ Conversation.targetId ä¸è´ |
| | | selfSend: boolean // æ¯å¦èªå·±åéï¼å端æ senderId 计ç®ï¼ |
| | | uploadProgress?: number // åªä½æ¶æ¯ä¸ä¼ è¿åº¦ï¼0-100ï¼ï¼status=SENDING æé´æç»æ´æ°ï¼ack åç½® undefined |
| | | // åªä½æ¶æ¯å
åä¸ä¿ççåå§ Fileï¼ä¸å线åç¼è¡¨ç¤ºä¸è¿ JSON / 䏿ä¹
åï¼IDB æ¢å¤åå¿
为 undefinedï¼ |
| | | // 失败éè¯æ¶æå®éèµ°ä¸ä¼ ï¼é¡µé¢å·æ°åè¯¥åæ®µä¸¢å¤±ï¼æ¢å¤é¶æ®µç´æ¥ drop æ´æ¡æ¶æ¯ |
| | | _localFile?: File |
| | | _ackMerging?: boolean // ack å并䏿 è®°ï¼ä¸æä¹
å |
| | | } |
| | | |
| | | // ==================== IndexedDB æ¬å°åå¨ç»æ ==================== |
| | | |
| | | /** ä¼è¯ IndexedDB åå¨ç»æ */ |
| | | export interface ConversationDO extends Conversation { |
| | | clientConversationId: string // `${type}:${targetId}` |
| | | } |
| | | |
| | | export interface ConversationRead { |
| | | conversationType: number // ä¼è¯ç±»åï¼å¯¹é½ ImConversationType |
| | | targetId: number // ä¼è¯ç®æ ç¼å· |
| | | messageId: number // å½åç¨æ·å·²è¯»å°çæå¤§æ¶æ¯ç¼å· |
| | | updateTime?: number // æ´æ°æ¶é´ |
| | | } |
| | | |
| | | /** ä¼è¯è¯»ä½ç½® IndexedDB åå¨ç»æ */ |
| | | export interface ConversationReadDO extends ConversationRead { |
| | | clientConversationId: string // `${conversationType}:${targetId}` |
| | | } |
| | | |
| | | /** æ¶æ¯ IndexedDB åå¨ç»æ */ |
| | | export interface MessageDO extends Omit<Message, '_ackMerging' | '_localFile' | 'uploadProgress'> { |
| | | messageKey: string // `${conversationType}:${id}` æ `client:${clientMessageId}` |
| | | conversationType: number // ä¼è¯ç±»åï¼å¯¹é½ ImConversationType |
| | | clientConversationId: string // ConversationDO.clientConversationId |
| | | } |
| | | |
| | | /** 设置 IndexedDB åå¨ç»æ */ |
| | | export interface SettingDO<T = unknown> { |
| | | key: string |
| | | value: T |
| | | updateTime?: number |
| | | } |
| | | |
| | | // ==================== 群 / 群æå ==================== |
| | | |
| | | // 群å®ä½ï¼å端å
é¨ç»æï¼ |
| | | export interface Group { |
| | | // ========== åç«¯åæ®µï¼å¯¹é½ ImGroupApi.GroupRespVOï¼ ========== |
| | | id: number // 群ç¼å· |
| | | name: string // 群åç§° |
| | | avatar?: string // 群头å |
| | | notice?: string // 群å
Œ |
| | | ownerUserId?: number // ç¾¤ä¸»ç¨æ·ç¼å· |
| | | pinnedMessages?: Message[] // ç¾¤ç½®é¡¶æ¶æ¯å表 |
| | | mutedAll?: boolean // æ¯å¦å
¨ç¾¤ç¦è¨ |
| | | banned?: boolean // æ¯å¦è¢«ç®¡çåå°ç¦ |
| | | joinApproval?: boolean // è¿ç¾¤æ¯å¦é群主 / 管çåå®¡æ¹ |
| | | joinStatus?: number // å½åç»å½ç¨æ·å¨è¯¥ç¾¤çæåç¶æï¼åè§ CommonStatusEnumï¼0 å¨ç¾¤ / 1 å·²é群ï¼ï¼åå²é群群ä»è¿åï¼ä¾å±ç¤ºå岿¶æ¯ç群å / 头å |
| | | |
| | | // ========== å端æ©å±å段ï¼user-per-group ç»´åº¦ï¼ ========== |
| | | silent?: boolean // æ¯å¦å
ææ°ãä»å½åç¨æ·ç GroupMember åå¡« |
| | | groupRemark?: string // ç¾¤å¤æ³¨ãä»å½åç¨æ·ç GroupMember åå¡«ï¼å½åç¨æ·å¯¹è¯¥ç¾¤çèªå®ä¹åï¼ |
| | | members?: GroupMember[] // 群æåç¼åï¼æéæå è½½ï¼ |
| | | infoLoaded?: boolean // 群详æ
æ¯å¦å·²å è½½ï¼æ¬è½®ä¼è¯å
åæ è®°ï¼ä¸æä¹
å |
| | | activeCallLoaded?: boolean // 群活è·éè¯æ¯å¦å·²æ¢æµï¼æ¬è½®ä¼è¯å
åæ è®°ï¼ä¸æä¹
å |
| | | activeCallExpired?: boolean // 群活è·éè¯æ¢æµæ¯å¦å·²è¿æ |
| | | membersLoaded?: boolean // members æ¯å¦"宿´å è½½"ââåªææ´ç¾¤ loadGroupMemberList / fetchGroupMemberList å½ä¸æ¶ä¸º trueï¼fetchGroupMember åæåè¡¥é½ä¸ç½®ä½ï¼é¿å
fetchGroupMemberList(force=false) å½ä¸ç¼åæ¶è¯¯å¤æ´ç¾¤å·²å è½½ |
| | | membersExpired?: boolean // 群æåç¼åæ¯å¦å·²è¿æï¼éè¿ / éæ°è¿å
¥ IM ååªæ è®°ä¸å é¤ï¼ä¸æ¬¡è¿å
¥ç¾¤ä¼è¯åå·æ° |
| | | memberCount?: number // æåæ»æ° |
| | | } |
| | | |
| | | /** 群 IndexedDB åå¨ç»æ */ |
| | | export type GroupDO = Omit< |
| | | Group, |
| | | 'activeCallExpired' | 'activeCallLoaded' | 'infoLoaded' | 'members' | 'membersExpired' | 'membersLoaded' |
| | | > |
| | | |
| | | // 群æåå®ä½ï¼å端å
é¨ç»æï¼ |
| | | export interface GroupMember { |
| | | // ========== åç«¯åæ®µï¼å¯¹é½ ImGroupMemberApi.GroupMemberRespVOï¼ ========== |
| | | id?: number // 群æåå
³ç³»è®°å½ç¼å· |
| | | groupId: number // 群ç¼å· |
| | | userId: number // ç¨æ·ç¼å· |
| | | avatar?: string // 头å |
| | | nickname: string // ç¨æ·æµç§° |
| | | displayUserName?: string // 该æåå¨ç¾¤å
èªå®ä¹æµç§°ï¼æ¯ä¸ª member ä¸ä»½ï¼ä¸ä¸ nickname åå¹¶ï¼ç±æ¶è´¹æ¹æéåèï¼ |
| | | status?: number // å¨ç¾¤ / éç¾¤ç¶æï¼å¯¹é½ CommonStatusEnum |
| | | role?: number // æåè§è²ï¼åè§ ImGroupMemberRole æä¸¾ï¼1=群主 2=管çå 3=æ®éæå |
| | | muteEndTime?: string // ç¦è¨å°ææ¶é´ï¼ISO åç¬¦ä¸²ï¼ |
| | | |
| | | // ========== å端æ©å±å段 ========== |
| | | isOwner?: boolean // æ¯å¦ç¾¤ä¸»ï¼åç«¯ä» Group.ownerUserId 计ç®ï¼ |
| | | } |
| | | |
| | | // ==================== 好å ==================== |
| | | |
| | | // 好åå®ä½ï¼å端å
é¨ç»æï¼ |
| | | export interface Friend { |
| | | // ========== åç«¯åæ®µï¼å¯¹é½ ImFriendApi.FriendRespVOï¼ ========== |
| | | id?: number // 好åå
³ç³»è®°å½ç¼å·ï¼æ¬å°ä¹è§æ°å¢æ¶å¯è½æç¼ºï¼ |
| | | friendUserId: number // 好åç¨æ·ç¼å·ï¼ä¸ Conversation.targetId 对é½ï¼ |
| | | nickname: string // å¥½åæµç§°ï¼å¯¹æ¹ç宿µç§°ï¼æ°¸è¿ä¸è¢«å¤æ³¨è¦çï¼UI æ¾ç¤ºèµ° displayName || nicknameï¼ |
| | | nicknamePinyin?: string // æµç§°çæ¼é³ï¼åç«¯ç¨ Pinyin4j ç®å¥½åå¡«ï¼å°åæ ç©ºæ ¼ï¼ |
| | | avatar?: string // 好å头å |
| | | silent?: boolean // æ¯å¦å
ææ°ï¼ä¸å±ç¤ºæªè¯»å¾½æ + ä¸åæç¤ºé³ï¼ |
| | | displayName?: string // 好åå±ç¤ºå¤æ³¨ï¼ä»
èªå·±å¯è§çå«åï¼ååæ®µä¸æ§ä¹ï¼ä¸å¸¦ Friend åç¼ï¼ |
| | | displayNamePinyin?: string // 夿³¨çæ¼é³ï¼åç«¯ç¨ Pinyin4j ç®å¥½åå¡«ï¼å°åæ ç©ºæ ¼ï¼ |
| | | status?: number // 好åç¶æï¼å¯¹é½ CommonStatusEnumï¼DISABLE = å·²å é¤ï¼è½¯å ä¿çè®°å½ï¼ |
| | | addSource?: number // æ·»å æ¥æºï¼åè§ ImFriendAddSourceEnum |
| | | pinned?: boolean // æ¯å¦ç½®é¡¶è系人 |
| | | blocked?: boolean // æ¯å¦æé»ï¼ä»
èªå·±å¯è§ï¼åè¾¹å±è½å¯¹æ¹ç§èæ¶æ¯ï¼ |
| | | addTime?: number // æ·»å 好忶é´ï¼æ¯«ç§æ¶é´æ³ï¼å端为 LocalDateTime å符串ï¼å¨ convertFriend 转æ¢ï¼ |
| | | deleteTime?: number // å é¤å¥½åæ¶é´ï¼æ¯«ç§æ¶é´æ³ï¼å端为 LocalDateTime å符串ï¼å¨ convertFriend 转æ¢ï¼ |
| | | } |
| | | |
| | | /** |
| | | * 好åç³è¯·è®°å½ï¼å端å
é¨ç»æï¼å¯¹é½å端 ImFriendRequestApi.FriendRequestRespVOï¼ |
| | | */ |
| | | export interface FriendRequest { |
| | | // ========== åç«¯åæ®µï¼å¯¹é½ ImFriendRequestApi.FriendRequestRespVOï¼ ========== |
| | | id: number // ç³è¯·ç¼å· |
| | | fromUserId: number // åèµ·æ¹ç¨æ·ç¼å· |
| | | toUserId: number // æ¥æ¶æ¹ç¨æ·ç¼å· |
| | | handleResult: number // å¤çç»æï¼0=æªå¤çï¼1=åæï¼2=æç» |
| | | applyContent?: string // ç³è¯·çç±ï¼åèµ·æ¹å¡«åï¼ |
| | | handleContent?: string // å¤ççç±ï¼æ¥æ¶æ¹æç»æ¶å¯éå¡«ï¼ |
| | | addSource?: number // æ·»å æ¥æºï¼åè§ ImFriendAddSourceEnum |
| | | handleTime?: number // å¤çæ¶é´ï¼æ¯«ç§æ¶é´æ³ï¼ |
| | | createTime: number // ç³è¯·å建æ¶é´ï¼æ¯«ç§æ¶é´æ³ï¼ |
| | | |
| | | // ========== èååæ®µï¼èª AdminUserï¼ä»
å±ç¤ºç¨ï¼ ========== |
| | | fromNickname?: string // åèµ·æ¹æµç§° |
| | | fromAvatar?: string // åèµ·æ¹å¤´å |
| | | toNickname?: string // æ¥æ¶æ¹æµç§° |
| | | toAvatar?: string // æ¥æ¶æ¹å¤´å |
| | | } |
| | | |
| | | // ==================== ç¨æ·åç ==================== |
| | | |
| | | // ç¨æ·ç²¾ç®ä¿¡æ¯ï¼å¯¹é½å端 UserSimpleRespVOï¼åç / 头å hover çåºæ¯å
±ç¨ï¼ |
| | | export interface User { |
| | | id: number |
| | | nickname?: string |
| | | avatar?: string |
| | | sex?: number |
| | | deptId?: number |
| | | deptName?: string |
| | | } |
| | | |
| | | // ==================== å表è¡å±ç¤ºç¨ Lite ç±»å ==================== |
| | | |
| | | /** |
| | | * 好åå表è¡ï¼ä» Friend æ´¾ççå±ç¤ºå¿«ç
§ |
| | | * - id ç¨ friendUserIdï¼ä¸å表 click / é䏿¯å¯¹ä¸è´ï¼ï¼ä¸æ¯ Friend.idï¼å
³ç³»è®°å½ä¸»é®ï¼ |
| | | * - 软å ï¼status === DISABLEï¼ç±ä¸æ¸¸ friendStore.getActiveFriendList / getActiveFriendLiteList ç»ä¸è¿æ»¤æ |
| | | */ |
| | | export interface FriendLite { |
| | | id: number |
| | | nickname: string |
| | | nicknamePinyin?: string // æµç§°æ¼é³ï¼ç¨äºåæ¯åæ¡¶ / æ¼é³æç´¢ï¼ |
| | | avatar?: string |
| | | displayName?: string |
| | | displayNamePinyin?: string // 夿³¨æ¼é³ï¼ä¼å
äº nicknamePinyin åä¸åæ¡¶ï¼ |
| | | } |
| | | |
| | | /** |
| | | * 群å表è¡ï¼ä» Group æ´¾ççå±ç¤ºå¿«ç
§ |
| | | * - showGroupName / showImageï¼è°ç¨æ¹å³å®å¸¦ä¸å¸¦å¤æ³¨ï¼å¦ä¸ªäººå¤æ³¨ç¾¤åï¼ï¼å±ç¤ºæ show* > åå¼å
åº |
| | | * - showImageThumbï¼é«é¢å表ç¨ç¼©ç¥å¾ï¼é¿å
æåå¾é»å¡æ»å¨ |
| | | */ |
| | | export interface GroupLite { |
| | | id: number |
| | | name?: string |
| | | showGroupName?: string |
| | | showImage?: string |
| | | showImageThumb?: string |
| | | memberCount?: number |
| | | ownerId?: number |
| | | joinApproval?: boolean // è¿ç¾¤æ¯å¦é群主 / 管çåå®¡æ¹ |
| | | } |