From b10e4b43360ed644c211a93b83854a08fc8db1a5 Mon Sep 17 00:00:00 2001 From: commie Date: Tue, 25 Nov 2025 05:36:02 +0800 Subject: [PATCH] 4 --- App.vue | 187 ++---- api/login.js | 52 +- common/config.js | 2 +- .../ChooseIndexFooter/SelectedMember.vue | 94 ++- components/ChooseIndexFooter/index.vue | 241 ++++---- components/ChooseIndexList/index.vue | 152 +++-- constant/comp.js | 50 +- constant/event.js | 8 +- constant/im.js | 80 +-- manifest.json | 21 +- package.json | 3 +- pages.json | 52 +- pages/common/article.nvue | 61 ++ pages/common/contactChoose/index.vue | 498 ++++++++------- pages/common/searchUserOrGroup/index.vue | 6 +- pages/common/sendAddRequest/index.vue | 214 ++++--- pages/common/upgrade.nvue | 110 ++++ pages/common/userCard/index.vue | 38 +- pages/common/webview.vue | 33 + pages/contact/contactAdd/ActionItem.vue | 120 ++-- pages/contact/contactAdd/index.vue | 170 +++--- .../ChatingFooter/ChatingActionBar.vue | 168 ++--- .../components/ChatingFooter/index.vue | 132 ++-- .../components/ChatHeader.vue | 574 +++++++++--------- .../components/ConversationItem.vue | 89 ++- pages/login/index.vue | 36 +- pages/login/setPassword/index.vue | 2 +- pages/login/setSelfInfo/index.vue | 27 +- pages/profile/about/index.vue | 289 +++++---- pages/profile/index/index.vue | 27 +- pages/profile/selfInfo/InfoItem.vue | 127 ++-- pages/profile/selfInfo/index.vue | 368 +++++------ .../workbench/friend-circle/friend-circle.vue | 22 + pages/workbench/index/index.vue | 289 ++++++++- static/images/tabbar/contacts.png | Bin 0 -> 1284 bytes static/images/tabbar/contacts_active.png | Bin 0 -> 1523 bytes static/images/tabbar/conversation.png | Bin 0 -> 1601 bytes static/images/tabbar/conversation_active.png | Bin 0 -> 1438 bytes static/images/tabbar/profile.png | Bin 0 -> 2047 bytes static/images/tabbar/profile_active.png | Bin 0 -> 1551 bytes static/images/tabbar/workbench.png | Bin 0 -> 1801 bytes static/images/tabbar/workbench_active.png | Bin 0 -> 1744 bytes static/images/tabbar_contacts.png | Bin 1306 -> 0 bytes static/images/tabbar_contacts_active.png | Bin 1148 -> 0 bytes static/images/tabbar_conversation.png | Bin 2295 -> 0 bytes static/images/tabbar_conversation_active.png | Bin 1944 -> 0 bytes static/images/tabbar_profile.png | Bin 1372 -> 0 bytes static/images/tabbar_profile_active.png | Bin 1178 -> 0 bytes static/images/tabbar_workbench.png | Bin 1289 -> 0 bytes static/images/tabbar_workbench_active.png | Bin 1116 -> 0 bytes static/images/workbench/01.png | Bin 0 -> 8862 bytes static/images/workbench/02.png | Bin 0 -> 7193 bytes static/images/workbench/03.png | Bin 0 -> 8732 bytes static/images/workbench/04.png | Bin 0 -> 6799 bytes static/images/workbench/05.png | Bin 0 -> 8248 bytes static/images/workbench/06.png | Bin 0 -> 7773 bytes static/images/workbench/07.png | Bin 0 -> 5446 bytes static/images/workbench/08.png | Bin 0 -> 7745 bytes static/images/workbench/09.png | Bin 0 -> 5322 bytes static/images/workbench/10.png | Bin 0 -> 7937 bytes static/images/workbench/11.png | Bin 0 -> 7745 bytes static/images/workbench/friendCircleIcon.png | Bin 0 -> 2635 bytes store/modules/conversation.js | 33 +- store/modules/user.js | 12 +- util/imCommon.js | 555 +++++++++-------- 65 files changed, 2672 insertions(+), 2270 deletions(-) create mode 100644 pages/common/article.nvue create mode 100644 pages/common/upgrade.nvue create mode 100644 pages/common/webview.vue create mode 100644 pages/workbench/friend-circle/friend-circle.vue create mode 100644 static/images/tabbar/contacts.png create mode 100644 static/images/tabbar/contacts_active.png create mode 100644 static/images/tabbar/conversation.png create mode 100644 static/images/tabbar/conversation_active.png create mode 100644 static/images/tabbar/profile.png create mode 100644 static/images/tabbar/profile_active.png create mode 100644 static/images/tabbar/workbench.png create mode 100644 static/images/tabbar/workbench_active.png delete mode 100644 static/images/tabbar_contacts.png delete mode 100644 static/images/tabbar_contacts_active.png delete mode 100644 static/images/tabbar_conversation.png delete mode 100644 static/images/tabbar_conversation_active.png delete mode 100644 static/images/tabbar_profile.png delete mode 100644 static/images/tabbar_profile_active.png delete mode 100644 static/images/tabbar_workbench.png delete mode 100644 static/images/tabbar_workbench_active.png create mode 100644 static/images/workbench/01.png create mode 100644 static/images/workbench/02.png create mode 100644 static/images/workbench/03.png create mode 100644 static/images/workbench/04.png create mode 100644 static/images/workbench/05.png create mode 100644 static/images/workbench/06.png create mode 100644 static/images/workbench/07.png create mode 100644 static/images/workbench/08.png create mode 100644 static/images/workbench/09.png create mode 100644 static/images/workbench/10.png create mode 100644 static/images/workbench/11.png create mode 100644 static/images/workbench/friendCircleIcon.png diff --git a/App.vue b/App.vue index d0a0360..18dcf0f 100644 --- a/App.vue +++ b/App.vue @@ -1,29 +1,16 @@ diff --git a/api/login.js b/api/login.js index f6e111f..92c225a 100644 --- a/api/login.js +++ b/api/login.js @@ -1,6 +1,9 @@ // 登录 export const businessConfig = (params) => uni.$u?.http.post("/common/init", JSON.stringify(params)); +// 验证是否升级 +export const checkUpgrade = (params) => + uni.$u?.http.post("/common/checkUpgrade", JSON.stringify(params)); export const businessLogin = (params) => uni.$u?.http.post("/common/login", JSON.stringify(params)); export const businessSendSms = (params) => @@ -28,9 +31,8 @@ export const businessModify = (params) => export const businessInfoUpdate = (params) => uni.$u?.http.post( "/user/profile", - JSON.stringify({ - ...params, - }), { + JSON.stringify({ ...params, }), + { header: { token: uni.getStorageSync("BusinessToken"), }, @@ -39,9 +41,8 @@ export const businessInfoUpdate = (params) => export const businessGetUserInfo = (userID) => uni.$u?.http.post( "/user/find", - JSON.stringify({ - userIDs: [userID], - }), { + JSON.stringify({ userIDs: [userID], }), + { header: { token: uni.getStorageSync("BusinessToken"), }, @@ -76,4 +77,41 @@ export const businessSearchUser = (keyword,searchtype) => token: uni.getStorageSync("BusinessToken"), }, } - ); \ No newline at end of file + ); +export const getArticle = (id,type) => + uni.$u?.http.post( + "/article/detail", + JSON.stringify({ + id, + type:(type? type : 'id') + }), { + header: { + token: uni.getStorageSync("BusinessToken"), + }, + } + ); +export const getFriendCircle = (page=1,limit=10) =>{ + uni.$u?.http.get( + "/friend_circle/list", + JSON.stringify({ + limit:limit, + page:page + }), + { + header: { + token: uni.getStorageSync("BusinessToken"), + }, + } + ); +} +export const getFriendCircleNewcount = () =>{ + uni.$u?.http.get( + "/friend_circle/newcount", + JSON.stringify({}), + { + header: { + token: uni.getStorageSync("BusinessToken"), + }, + } + ); +} \ No newline at end of file diff --git a/common/config.js b/common/config.js index 10448d0..18f46d1 100644 --- a/common/config.js +++ b/common/config.js @@ -7,7 +7,7 @@ const BASE_DOMAIN = 'www.axzc.xyz' // const CHAT_URL = `https://${BASE_DOMAIN}/chat` // const API_URL = `https://${BASE_DOMAIN}/api` // const WS_URL = `wss://${BASE_DOMAIN}/msg_gateway` -const CHAT_URL = `http://${BASE_DOMAIN}:8585/api` +const CHAT_URL = `http://${BASE_DOMAIN}/api` const API_URL = `http://${BASE_DOMAIN}/imapi` const WS_URL = `ws://${BASE_DOMAIN}/ws` diff --git a/components/ChooseIndexFooter/SelectedMember.vue b/components/ChooseIndexFooter/SelectedMember.vue index e611770..4b99d62 100644 --- a/components/ChooseIndexFooter/SelectedMember.vue +++ b/components/ChooseIndexFooter/SelectedMember.vue @@ -1,59 +1,55 @@ + .u-button { + height: 48rpx; + } + } + \ No newline at end of file diff --git a/components/ChooseIndexFooter/index.vue b/components/ChooseIndexFooter/index.vue index 30bdb88..eb095ea 100644 --- a/components/ChooseIndexFooter/index.vue +++ b/components/ChooseIndexFooter/index.vue @@ -1,143 +1,130 @@ + .selected_list { + height: 60vh !important; + overflow-y: auto; + } + } + \ No newline at end of file diff --git a/components/ChooseIndexList/index.vue b/components/ChooseIndexList/index.vue index 0340bbe..618227d 100644 --- a/components/ChooseIndexList/index.vue +++ b/components/ChooseIndexList/index.vue @@ -1,91 +1,77 @@ + ::v-deep uni-scroll-view { + max-height: 100% !important; + } + } + + .user_anchor { + background-color: #f8f8f8 !important; + border: none !important; + } + \ No newline at end of file diff --git a/constant/comp.js b/constant/comp.js index 4419feb..55d7fc3 100644 --- a/constant/comp.js +++ b/constant/comp.js @@ -1,42 +1,46 @@ export const ChatingFooterActionTypes = { - Album: "Album", + Album: "Album", + Camera: "Camera", + Video: "Video", + Voice: "Voice", + Location: "Location", }; export const ContactMenuTypes = { - NewFriend: "NewFriend", - NewGroup: "NewGroup", - MyFriend: "MyFriend", - MyGroup: "MyGroup", + NewFriend: "NewFriend", + NewGroup: "NewGroup", + MyFriend: "MyFriend", + MyGroup: "MyGroup", }; export const GroupMemberListTypes = { - Preview: "Preview", - Transfer: "Transfer", - Kickout: "Kickout", + Preview: "Preview", + Transfer: "Transfer", + Kickout: "Kickout", }; export const ContactChooseTypes = { - Invite: "Invite", - GetList: "GetList", + Invite: "Invite", + GetList: "GetList", }; export const UpdateMessageTypes = { - Overall: "Overall", - KeyWords: "KeyWords", + Overall: "Overall", + KeyWords: "KeyWords", }; export const SmsUserFor = { - Register: 1, - Reset: 2, - Login: 3, + Register: 1, + Reset: 2, + Login: 3, }; export const CustomMessageStatus = { - Success: "success", - Cancel: "cancel", - Canceled: "canceled", - Refuse: "refuse", - Refused: "refused", - Timeout: "timeout", - AccessByOther: "accessByOther", -}; + Success: "success", + Cancel: "cancel", + Canceled: "canceled", + Refuse: "refuse", + Refused: "refused", + Timeout: "timeout", + AccessByOther: "accessByOther", +}; \ No newline at end of file diff --git a/constant/event.js b/constant/event.js index 61efe70..306c8d5 100644 --- a/constant/event.js +++ b/constant/event.js @@ -1,5 +1,5 @@ export const PageEvents = { - GlobalToast: "GlobalToast", - ScrollToBottom: "ScrollToBottom", - RtcCall: "RtcCall" -}; + GlobalToast: "GlobalToast", + ScrollToBottom: "ScrollToBottom", + RtcCall: "RtcCall" +}; \ No newline at end of file diff --git a/constant/im.js b/constant/im.js index 830d2ba..4cea39c 100644 --- a/constant/im.js +++ b/constant/im.js @@ -1,51 +1,51 @@ -import { MessageType } from "openim-uniapp-polyfill"; +import {MessageType} from "openim-uniapp-polyfill"; export const CustomType = { - VideoCall: "c100", - VoiceCall: "c101", - Call: 901, - MassMsg: 903, + VideoCall: "c100", + VoiceCall: "c101", + Call: 901, + MassMsg: 903, }; export const Platform = { - 1: 'iOS', - 2: 'Android', - 3: 'PC', - 4: 'PC', - 5: 'Web' + 1: 'iOS', + 2: 'Android', + 3: 'PC', + 4: 'PC', + 5: 'Web' }; export const noticeMessageTypes = [ - MessageType.RevokeMessage, - MessageType.FriendAdded, - MessageType.GroupCreated, - MessageType.GroupInfoUpdated, - MessageType.MemberQuit, - MessageType.GroupOwnerTransferred, - MessageType.MemberKicked, - MessageType.MemberInvited, - MessageType.MemberEnter, - MessageType.GroupDismissed, - MessageType.GroupMemberMuted, - MessageType.GroupMuted, - MessageType.GroupCancelMuted, - MessageType.GroupMemberCancelMuted, - MessageType.GroupNameUpdated, - MessageType.BurnMessageChange, + MessageType.RevokeMessage, + MessageType.FriendAdded, + MessageType.GroupCreated, + MessageType.GroupInfoUpdated, + MessageType.MemberQuit, + MessageType.GroupOwnerTransferred, + MessageType.MemberKicked, + MessageType.MemberInvited, + MessageType.MemberEnter, + MessageType.GroupDismissed, + MessageType.GroupMemberMuted, + MessageType.GroupMuted, + MessageType.GroupCancelMuted, + MessageType.GroupMemberCancelMuted, + MessageType.GroupNameUpdated, + MessageType.BurnMessageChange, ]; export const GroupSystemMessageTypes = [ - MessageType.GroupCreated, - MessageType.GroupInfoUpdated, - MessageType.MemberQuit, - MessageType.GroupOwnerTransferred, - MessageType.MemberKicked, - MessageType.MemberInvited, - MessageType.MemberEnter, - MessageType.GroupDismissed, - MessageType.GroupMemberMuted, - MessageType.GroupMuted, - MessageType.GroupCancelMuted, - MessageType.GroupMemberCancelMuted, - MessageType.GroupNameUpdated -]; + MessageType.GroupCreated, + MessageType.GroupInfoUpdated, + MessageType.MemberQuit, + MessageType.GroupOwnerTransferred, + MessageType.MemberKicked, + MessageType.MemberInvited, + MessageType.MemberEnter, + MessageType.GroupDismissed, + MessageType.GroupMemberMuted, + MessageType.GroupMuted, + MessageType.GroupCancelMuted, + MessageType.GroupMemberCancelMuted, + MessageType.GroupNameUpdated +]; \ No newline at end of file diff --git a/manifest.json b/manifest.json index 3ee7247..3cea087 100644 --- a/manifest.json +++ b/manifest.json @@ -1,5 +1,5 @@ { - "name" : "IM-UCB", + "name" : "探探", "appid" : "__UNI__F0A946D", "description" : "", "versionName" : "3.3.4", @@ -21,7 +21,10 @@ "Camera" : {}, "Record" : {}, "Geolocation" : {}, - "Maps" : {} + "Maps" : {}, + "Fingerprint" : {}, + "Contacts" : {}, + "Barcode" : {} }, "distribute" : { "android" : { @@ -66,8 +69,18 @@ }, "sdkConfigs" : { "ad" : {}, - "geolocation" : {}, - "maps" : {}, + "geolocation" : { + "system" : { + "__platform__" : [ "ios", "android" ] + } + }, + "maps" : { + "amap" : { + "name" : "amap_18926034082bYRO97pz", + "appkey_ios" : "cfc7b531b60382598b4aac7944415fba", + "appkey_android" : "e431515e99e69fc1b6edb674e3487f1a" + } + }, "share" : {}, "statics" : {}, "speech" : {} diff --git a/package.json b/package.json index 47b6932..cd36419 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,12 @@ { "dependencies": { + "@openim/client-sdk": "^0.0.11-ahpha.1", "date-fns": "^2.30.0", "dayjs": "^1.11.6", "image-tools": "^1.4.0", "md5": "^2.3.0", - "@openim/client-sdk": "^0.0.11-ahpha.1", "openim-uniapp-polyfill": "^1.4.1", + "qrcode": "^1.5.4", "uuid": "^9.0.0" } } diff --git a/pages.json b/pages.json index d51abe9..77f7c0e 100644 --- a/pages.json +++ b/pages.json @@ -245,37 +245,61 @@ "navigationBarTitleText": "", "enablePullDownRefresh": false } + }, + { + "path": "pages/common/upgrade", + "style": { + "navigationBarTitleText": "" + } + }, + { + "path": "pages/common/article", + "style": { + "navigationBarTitleText": "" + } + }, + { + "path": "pages/common/webview", + "style": { + "navigationBarTitleText": "" + } + }, + { + "path": "pages/workbench/friend-circle/friend-circle", + "style": { + "navigationBarTitleText": "" + } } ], "tabBar": { - "color": "#8E9AB0", - "selectedColor": "#0089FF", - "borderStyle": "black", - "backgroundColor": "#ffffff", + "color": "#171717", + "selectedColor": "#07c160", + "borderStyle": "#f4f4f4", + "backgroundColor": "#f4f4f4", "height": "55px", "list": [{ "pagePath": "pages/conversation/conversationList/index", - "iconPath": "./static/images/tabbar_conversation.png", - "selectedIconPath": "static/images/tabbar_conversation_active.png", - "text": "OpenIM" + "iconPath": "./static/images/tabbar/conversation.png", + "selectedIconPath": "static/images/tabbar/conversation_active.png", + "text": "消息" }, { "pagePath": "pages/contact/index/index", - "iconPath": "./static/images/tabbar_contacts.png", - "selectedIconPath": "static/images/tabbar_contacts_active.png", + "iconPath": "./static/images/tabbar/contacts.png", + "selectedIconPath": "static/images/tabbar/contacts_active.png", "text": "通讯录" }, { "pagePath": "pages/workbench/index/index", - "iconPath": "./static/images/tabbar_workbench.png", - "selectedIconPath": "static/images/tabbar_workbench_active.png", + "iconPath": "./static/images/tabbar/workbench.png", + "selectedIconPath": "static/images/tabbar/workbench_active.png", "text": "发现" }, { "pagePath": "pages/profile/index/index", - "iconPath": "./static/images/tabbar_profile.png", - "selectedIconPath": "static/images/tabbar_profile_active.png", - "text": "我的" + "iconPath": "./static/images/tabbar/profile.png", + "selectedIconPath": "static/images/tabbar/profile_active.png", + "text": "我" } ] }, diff --git a/pages/common/article.nvue b/pages/common/article.nvue new file mode 100644 index 0000000..225acd9 --- /dev/null +++ b/pages/common/article.nvue @@ -0,0 +1,61 @@ + + + + + diff --git a/pages/common/contactChoose/index.vue b/pages/common/contactChoose/index.vue index 2bc6e76..5387eba 100644 --- a/pages/common/contactChoose/index.vue +++ b/pages/common/contactChoose/index.vue @@ -1,281 +1,267 @@ + .member_list { + flex: 1; + height: 80% !important; + + ::v-deepuni-scroll-view { + max-height: 100% !important; + } + } + + .user_list { + height: 100% !important; + } + + .member_anchor { + background-color: #f8f8f8 !important; + border: none !important; + } + } + } + } + \ No newline at end of file diff --git a/pages/common/searchUserOrGroup/index.vue b/pages/common/searchUserOrGroup/index.vue index 437ec24..8caae79 100644 --- a/pages/common/searchUserOrGroup/index.vue +++ b/pages/common/searchUserOrGroup/index.vue @@ -86,6 +86,7 @@ ); info = data[0]; } + console.log(info) if (info) { uni.navigateTo({ url: `/pages/common/groupCard/index?sourceInfo=${JSON.stringify(info,)}`, @@ -103,7 +104,7 @@ const {data} = await IMSDK.asyncApi( IMSDK.IMMethods.GetUsersInfo, IMSDK.uuid(), - [res.data[0].id], + [res.data[0].id+''], ); const imData = data[0]; @@ -111,9 +112,9 @@ ...imData, ...res.data[0], }; - console.log(info) } } + console.log(info) if (info) { uni.navigateTo({ url: `/pages/common/userCard/index?sourceInfo=${JSON.stringify(info,)}`, @@ -123,6 +124,7 @@ } } } catch (e) { + console.log(e); //TODO handle the exception } this.searching = false; diff --git a/pages/common/sendAddRequest/index.vue b/pages/common/sendAddRequest/index.vue index 18d3b17..e992ccc 100644 --- a/pages/common/sendAddRequest/index.vue +++ b/pages/common/sendAddRequest/index.vue @@ -1,125 +1,117 @@ + .input_container { + ::v-deep.u-textarea { + padding: 24rpx 44rpx !important; + } + } + } + \ No newline at end of file diff --git a/pages/common/upgrade.nvue b/pages/common/upgrade.nvue new file mode 100644 index 0000000..9a80f46 --- /dev/null +++ b/pages/common/upgrade.nvue @@ -0,0 +1,110 @@ + + + + + diff --git a/pages/common/userCard/index.vue b/pages/common/userCard/index.vue index 5459586..bf620e8 100644 --- a/pages/common/userCard/index.vue +++ b/pages/common/userCard/index.vue @@ -15,7 +15,11 @@ - + + + + + @@ -31,21 +35,14 @@ + + \ No newline at end of file diff --git a/pages/contact/contactAdd/ActionItem.vue b/pages/contact/contactAdd/ActionItem.vue index 4c5cdb1..d6cf3b0 100644 --- a/pages/contact/contactAdd/ActionItem.vue +++ b/pages/contact/contactAdd/ActionItem.vue @@ -1,74 +1,74 @@ + .bottom_line { + height: 1px; + width: 100%; + background-color: #f0f0f0; + position: absolute; + bottom: -24rpx; + } + } + } + \ No newline at end of file diff --git a/pages/contact/contactAdd/index.vue b/pages/contact/contactAdd/index.vue index 1dfc3f8..df74f5e 100644 --- a/pages/contact/contactAdd/index.vue +++ b/pages/contact/contactAdd/index.vue @@ -1,101 +1,91 @@ + .action_item:last-child { + .bottom_line { + height: 0; + } + } + } + } + \ No newline at end of file diff --git a/pages/conversation/chating/components/ChatingFooter/ChatingActionBar.vue b/pages/conversation/chating/components/ChatingFooter/ChatingActionBar.vue index 1aad331..5915567 100644 --- a/pages/conversation/chating/components/ChatingFooter/ChatingActionBar.vue +++ b/pages/conversation/chating/components/ChatingFooter/ChatingActionBar.vue @@ -1,80 +1,112 @@ + &_title { + font-size: 24rpx; + color: #999; + margin-top: 6rpx; + } + } + } + \ No newline at end of file diff --git a/pages/conversation/chating/components/ChatingFooter/index.vue b/pages/conversation/chating/components/ChatingFooter/index.vue index a52371d..5ad9267 100644 --- a/pages/conversation/chating/components/ChatingFooter/index.vue +++ b/pages/conversation/chating/components/ChatingFooter/index.vue @@ -25,40 +25,26 @@ + image { + width: 24px; + height: 24px; + margin-right: 24rpx; + } + + &:last-child { + border: none; + } + } + } + } + } + \ No newline at end of file diff --git a/pages/conversation/conversationList/components/ConversationItem.vue b/pages/conversation/conversationList/components/ConversationItem.vue index 819bbd0..74a1799 100644 --- a/pages/conversation/conversationList/components/ConversationItem.vue +++ b/pages/conversation/conversationList/components/ConversationItem.vue @@ -1,34 +1,31 @@ + .btn_row { + padding: 0 44rpx; + } + } + \ No newline at end of file diff --git a/pages/profile/index/index.vue b/pages/profile/index/index.vue index 5604be0..9a13227 100644 --- a/pages/profile/index/index.vue +++ b/pages/profile/index/index.vue @@ -86,19 +86,22 @@ }); }, logoutConfirm() { - IMSDK.asyncApi(IMSDK.IMMethods.Logout, IMSDK.uuid()) - .then(() => { - uni.removeStorage({ - key: "IMToken", - }); - uni.removeStorage({ - key: "BusinessToken", - }); - }) - .catch((err) => console.log(err)) - .finally(() => { - uni.$u.route("/pages/login/index"); + console.log(1) + IMSDK.asyncApi(IMSDK.IMMethods.Logout, IMSDK.uuid()).then(() => { + console.log(2) + uni.removeStorage({ + key: "IMToken", }); + uni.removeStorage({ + key: "BusinessToken", + }); + }).catch((err) => { + console.log(3) + console.log(err) + }).finally(() => { + console.log(4) + uni.$u.route("/pages/login/index"); + }); }, profileMenuClick({idx}) { switch (idx) { diff --git a/pages/profile/selfInfo/InfoItem.vue b/pages/profile/selfInfo/InfoItem.vue index 575846c..e298754 100644 --- a/pages/profile/selfInfo/InfoItem.vue +++ b/pages/profile/selfInfo/InfoItem.vue @@ -1,74 +1,71 @@ + .content { + font-size: 28rpx; + color: #999; + } + + .u-icon { + margin-left: 12rpx; + } + } + + .loading_icon { + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + } + } + \ No newline at end of file diff --git a/pages/profile/selfInfo/index.vue b/pages/profile/selfInfo/index.vue index 474e856..98a8c2b 100644 --- a/pages/profile/selfInfo/index.vue +++ b/pages/profile/selfInfo/index.vue @@ -1,216 +1,180 @@ + .qr_icon { + width: 22px; + height: 23px; + } + } + } + \ No newline at end of file diff --git a/pages/workbench/friend-circle/friend-circle.vue b/pages/workbench/friend-circle/friend-circle.vue new file mode 100644 index 0000000..87b6899 --- /dev/null +++ b/pages/workbench/friend-circle/friend-circle.vue @@ -0,0 +1,22 @@ + + + + + \ No newline at end of file diff --git a/pages/workbench/index/index.vue b/pages/workbench/index/index.vue index 171df21..1be9766 100644 --- a/pages/workbench/index/index.vue +++ b/pages/workbench/index/index.vue @@ -1,31 +1,270 @@ - + + diff --git a/static/images/tabbar/contacts.png b/static/images/tabbar/contacts.png new file mode 100644 index 0000000000000000000000000000000000000000..2f92b58ca3c038dc2c251ddac05f839498ec5104 GIT binary patch literal 1284 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 Z^&g04x=?GE-1Gnd002ovPDHLkV1l0%yITMN literal 0 HcmV?d00001 diff --git a/static/images/tabbar/conversation.png b/static/images/tabbar/conversation.png new file mode 100644 index 0000000000000000000000000000000000000000..c5fdc5505ac56483e0b9b3d72fc258e3e2cd317a GIT binary patch literal 1601 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 literal 0 HcmV?d00001 diff --git a/static/images/tabbar/profile.png b/static/images/tabbar/profile.png new file mode 100644 index 0000000000000000000000000000000000000000..ca27407ace28d67f6ee0e5a2a1ad35749ce99582 GIT binary patch literal 2047 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 B&rtvX literal 0 HcmV?d00001 diff --git a/static/images/tabbar/workbench.png b/static/images/tabbar/workbench.png new file mode 100644 index 0000000000000000000000000000000000000000..889729701dd2f35a7caaa6f74b29a7a5cedb6e50 GIT binary patch literal 1801 zcmV+k2ln`hP)Px*!%0LzRCr$Pn^%Y}MG%I+3uZ9~FpB{(K8PN-wnVvm!&R*``g2U|Y=~Vx8SN&C8JB3LuQzp6o%miTO z4w&Q!jQR*H0jvnD5Iubb9|0dm&#y-HUWN_8V!#H#7QnW^LWPQb4?GGy1-t}&Q`oO_ zvta27*__F$ZQ9W(HB(PNV^ydv*6nwb?;{HK_=mP+^<&iZD`2=`2`utM3;CX>fqt9|R z{VoTNDjYN0Y)}B60JhAG{26db^%-P+q3 z>5Q>_4Opkk0=fdA3rda7t-#)0Chf89Ex=yMcp7DSNRe~_;B4TOWYi0R6N+XUUZV?u z!ssL@ETpb?B+>Z9ZR1$FBkBlVk}%EQ=Q$LHq3)bvmHVcs2oWSG6_6IQrR}yJ#G>O>IeT znBOakjw<&Fnep}CP7Sr3rR1o^FcA^#Kr zV3QY;V989=G}-35BcMxifFN$m_)Hb90fBrEm?!Gc=$4{(R|5w}zh40yQ95yToc4&? zXZb@N02&Qr?jWAUlRHcvnz~@qRzVD<*DV-lcEBSzSDOM2W1S1=F@l(@h>iN#-|GNK z8P(wl9WKyetcfv0oEkTpbYX2GFVF}Fc?(#htyA*7G}v7eB+Fpy05FQ$G3qQ?d8Fe4 z)&gEn`smN!Ef`0ut-%X&8ellyMdTU}M;$b@MzvGPFabz+kr|v2)HEq#2KeKofh_Uu zF4|W_Yuo_zaRfd{5|!G6cuUsla~yC{^re~Stvf1j^MQ`QphnOIKNcGV1& z34C&Wy;^hk1o66k;atO}V8~#?pdv_7k}*R;O{E7a>{~X)rQ(9nB&CcoH%6MoHHb@- zrepn@07%J*hDd|dBxw%8w)*~qDx0uKOaEW1uvO*96L^K;QyOg~D7TnKngB35nBd0g@~OsZ1Hgo6oKS2_inampN2T`TI+s?&O;{iYraz#>-CaXn;eQmCx^UdeTO=o>N zcZiHau2^cK%H%p1M+H3w0l+bGMN|HLl!cO=ilS1NGAIC!mn)tM^9Y0-LO$-*S80Uj z)s{sPrqnHS$yJCtM{zM!oiFVJfWQ+%iF}jao*|2+V}&PexqJ*l_=gF%Z(Lbc!szPS zNNYVt+MMb7A0|=-%n)r>mA(6nuiKjdQORejGJBsx3#R(A0i|zu(*4s^DKHb(Zqz$q r!W1308=USGD_zjc9Z-tYjN0yh+md2XI-e=m00000NkvXXu0mjfxD`Vj literal 0 HcmV?d00001 diff --git a/static/images/tabbar/workbench_active.png b/static/images/tabbar/workbench_active.png new file mode 100644 index 0000000000000000000000000000000000000000..dbea18b0d0feb54f1ca9b552ee2ad761cd1ea034 GIT binary patch literal 1744 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 Q)c^nh07*qoM6N<$g56JLhX4Qo diff --git a/static/images/tabbar_contacts_active.png b/static/images/tabbar_contacts_active.png deleted file mode 100644 index 565d55e14acc04609c62860d9da8b5a3880f7339..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1148 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 diff --git a/static/images/tabbar_conversation_active.png b/static/images/tabbar_conversation_active.png deleted file mode 100644 index df20387809d29cc7aade176ad71516afc875d9ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1944 zcmV;J2WR++P)Px+Qb|NXRA@u(nthO!RT;p4&+ZanDj1YaYEj5X1&$(UPMAx=Ook#erULnaTH}-@ z7_j%U$+R=!?!D}$_(#rwj)jPT(2N*OHAt*E));7OKm>^aS%F_+*z9V%_i3Jc+r97J z`@ZM>*xhU6aAx+OJL?fKhVN~-)a!dur17lD=gm5~F zAiNFvzazk2l)XSJX?Zb`KZjEPjbNjWpqlG}>mUzS9XnX%6<`xNR#Pv3immUX(09PB zo((Jkz77oSkD&f%V;fy8qh6lti_PSK4O+txzJu^R;FP`u;m}p!asI<1?v}qL@sSL$ zNzX;tfN)_FrwMdkN4b@>{4}m^e88;EMp=_zFe=@Y<)md<9JlcRSLgzidx5GrPWn|= zSw#omq(O2~>_!L7>QbOFiqQ(lJU~kBh~g(2U`D@z@IVxU6_mM~l-v{MFB~wd7oj|h zP!ndX!u^UeleGNY<<||^tRE!D9$-|3gOBR&O<*D^`FoIp8*qg-qb!cLB>%g2L!|TiY>c*$Er>L8n!X{n%;*t{GPVoBYw~{;egFLfgHO_1)DB|^u_LI&GAEjD5USf2>C2vo8iZ<#(s=2RJ-BM=f&2aul!UMMy+IkRLeh1Hn9CEz#t8@zZ zd1`wVrmP8=62k4&$!a%XM%N+C^D{nSB<#GYn5swr4a=T^nf^aoA<-DTi|magGEzd_L%a;$fRF6 zQAk~DuKDExT(}+Xf8Lovza}M@g#o^aaE8mww(DTJr+B+zE3ErtL1WbEuwXLGp8&&$ zgr{>Dm zW`E+33R&Q6$_dia>mXjf$Yj+HlA))JuZ)FFp4y@H2+Y`6KKX6F%^q7wUrXa8?b;_` z^MOd3U8JPfW>yZ8(a;g>cC~gU-0<0=g`jLwVNl%B2ew^bTsdtCw|%OljOsBL70^DGrF?6gdRN&`TI?phr}>TGR$yjSK$B~(E!2$N z&9;NPe&uf=DxmG1OIqVZk(Ygvlw9ow%;-G`^>Ix5RXNi)!uG@ER-ynps})yZN`|!b z91={ld<2{H8mibF2he0os~lU>Cq7(0f5HGGR4c)u30F}kmVu5GwU;5milNw-OhHwS z*I^i7*h=j9@SU_Xf(G&I#zFgCR&54Ni#v)Yzhe&6_8hdpTjf~43()q`X&aJwHN*Up zw0x;lJLtfB3-E9fS7B975MbnLB`ByaZlYe+MguHd7uo{ttVx4>%^45tXBB(BRZbA# z+$Ui}(icJH7^m*1$GibGq@nH|s&UhN6BOahhH|bqez z^S~B*EFz<}=)Zt4A_?S>YWVGq<##z&tz5D;xMq#utBrOp2};dw{cu2&%;;2vr+~o` z9G8h$T0S$c_W}9R$DDU7Za2yis<@asIT{vEG(fYG)mbQ;5JE2X{9W2&^VQE3`s||E zd-@Lx(x?AkQnDzDUUb01NL~SKMh5Ix6;Wa~nKn{#K@{P5fM#)po==V~-ka|zj`~?f z>EcZ4<+U)o@d3?Zi;kp|2N8Te!kN8*a*SrFyzGMPUqG)Xt7TzIeiQ_|5gnd?P!-+< zPN3Mq)N0)Ww6iB{!_J$|=)^p%a5>5s@*lHK{N9;*A{jWqu-vIo|4G0Kedqymb8-X+ e?9*1r@P7eZ#4%TtDwQz+00007EZ diff --git a/static/images/tabbar_profile.png b/static/images/tabbar_profile.png deleted file mode 100644 index 694c226f77c603f30179f8b4ee671e93125e8a09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1372 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 diff --git a/static/images/tabbar_workbench.png b/static/images/tabbar_workbench.png deleted file mode 100644 index 303d47e476b7244084f9cc82cf08397ae014c308..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1289 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 literal 0 HcmV?d00001 diff --git a/static/images/workbench/02.png b/static/images/workbench/02.png new file mode 100644 index 0000000000000000000000000000000000000000..31ce6e2b2208e7a66fd31ddc97de434f4d6d07bc GIT binary patch literal 7193 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 literal 0 HcmV?d00001 diff --git a/static/images/workbench/07.png b/static/images/workbench/07.png new file mode 100644 index 0000000000000000000000000000000000000000..b53ad51c34c633cd892d34ef88c888d982e9eb1e GIT binary patch literal 5446 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 literal 0 HcmV?d00001 diff --git a/static/images/workbench/08.png b/static/images/workbench/08.png new file mode 100644 index 0000000000000000000000000000000000000000..75ad7dfca2d9ec2017e1e8bfb1415b1d51ccd9e3 GIT binary patch literal 7745 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 literal 0 HcmV?d00001 diff --git a/static/images/workbench/10.png b/static/images/workbench/10.png new file mode 100644 index 0000000000000000000000000000000000000000..122319d7e56701fb1414780f753c2b8420d4ae35 GIT binary patch literal 7937 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 literal 0 HcmV?d00001 diff --git a/static/images/workbench/11.png b/static/images/workbench/11.png new file mode 100644 index 0000000000000000000000000000000000000000..b08b752f469d56ea25be357903fe18f9ad138a18 GIT binary patch literal 7745 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�FTXEj1sNKA_gI@6w!_-R~OBx7qJ>|fp8Ot>D$DG%Ta~ju* z4~5O)8?(15b!iMDXne)8TvS7W|NZr2m|k$u+QHygW^n&Mxru}hsf!cp@>|x|q*1b} zTGfcf`ZX!s|7af;mnM;LdT{=%gYSIn7(%IQTgt91(u9ISQmWe0v$MjEv95M2Fc1g~_RORens?;nGVQZcVDTR48FN8aY1o?bA4Rq=Z~&2J;K! zxZ}3X_{hyehVK(*mPX(6vM!(E!ITa^v1cuA|5yuVW=4@ob>ppHR`A_#p8?D`Kp^x$ zF40OcHfOrsBuuxg@n2k|G&UjLoO;PxpEj1J(2%?0n4H^P&3YyLo~;pLx?;k!@1 z2PfT%V!4W3u8hxr{yKEETku2Wh7oO~8f=O)$1;uUbYa70Hhdw`l}+FezIYwldL~h> zRNy+R@a*@_;qU+7QG_yrYpSD2>UlKCfVvsYmtBUsVj-ox1fYl})+GKx%;1VT5>p5= zj_|gl=j&d4c^rTDe~!U+I;c9d>`8q7kGEjcrdEhZ5B8F_X++gA*3vZKS0B-!`qx6F zgkUPhdpP{w6u$ajj-y;yg-pgpr96h6x2EyfW82Wt=}>S}fzg8Qj%bo{dACiP>8Kct zG+P-iIk&z^F&d@bol2i7|0ZBr9JN5=sV7h3r!QQ9m+V1B6$oq!U-;rC+cjlrWx2RVnD4=J2FSHyR|bpS^X`DpL# zpcz*o^Z0{5+Jf76_0h(LRPTf|A+enAXQnw+AL-O}odPIo7xV;@fRMh_Mo@kKoG zm!~l|W}_{aL#bSZlbFLtKfVfkKDim0EH{r&G@EX7>xtF>@+M#wKUmY;gQ3>F9%H0T zqK=vmJon-${OE_nSXxY@qpbt^;ym0`5r6oF?YL#9Sc? zh2T`M%Y%uGp?gBjo+w}s2O}dz{QcL@;P{al+9%h*DaY-3Y2kwj)tnFA%^vJRDXQmo8x%l`C+_wtP0m@g_B62xHN{| zehi%TgUw_Ypb)bSchC4pqJ1np=j%3P%o3LRexbB2X)fE9Ml?V$9CFJu}l#3Mv+<{D_pdMIZQGl*? ziJjZCxbu!K+_-bl^ko7BQj^r$X6$7#MY(6pQvF(j#}`;$1Y4vcK}8KWk5Fh5=d>z>trs@S(O8*YoNsxT+}!Cd=q*_pxq$ z7CUyNv3+|VHm%JytwT~6m34j~_T#8NsH<6q6@BeWf;Vq~Z1Tr=BSO;{w;OGxrel5) zI5Rwf6UQboIwCMNB{7#Tpj-_pct(*87P@AxMH7jP`^dBkbg$xAJ?LWNx&(G?>cP<3 zHn8UBA&nj+bh?v`HVvg>#^O$V+y_|cVam%M##u?*xCB~=hTz0=H3F0FJuH91NVRe2 z=78Dxc`W2h^c+jI98jnhLc(=C;=40h7i}F$boZo?&0zUa#~9|?G5T7@#%OHc=*`$o zzP?=OD+n$xIccTOu literal 0 HcmV?d00001 diff --git a/static/images/workbench/friendCircleIcon.png b/static/images/workbench/friendCircleIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..e102cbed1fd5867c47968dbfd2bf2575dc44a7b5 GIT binary patch literal 2635 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 t!XIe`q$uW;%3K1FQk { - console.log(res); + //console.log(res); commit("SET_UNREAD_COUNT", res.data); }, ); }, - updateCurrentMemberInGroup({ - commit, - state - }, memberInfo) { + updateCurrentMemberInGroup({commit,state}, memberInfo) { console.log(memberInfo); if ( memberInfo.groupID === state.currentMemberInGroup.groupID && diff --git a/store/modules/user.js b/store/modules/user.js index 705e08d..f1f54b8 100644 --- a/store/modules/user.js +++ b/store/modules/user.js @@ -48,19 +48,13 @@ const actions = { commit }) { try { - const { - data - } = await IMSDK.asyncApi( - IMSDK.IMMethods.GetSelfUserInfo, - uuidv4(), - ); - const res = await businessGetUserInfo(data.userID); - //console.log(res.data); + const result = await IMSDK.asyncApi(IMSDK.IMMethods.GetSelfUserInfo,uuidv4(),); + const res = await businessGetUserInfo(result.data.userID); const businessData = res.data[0] ?? {}; filterEmptyValue(businessData); commit("SET_SELF_INFO", { - ...data, + ...result.data, ...businessData, }); } catch (e) { diff --git a/util/imCommon.js b/util/imCommon.js index 245bd21..b76846b 100644 --- a/util/imCommon.js +++ b/util/imCommon.js @@ -1,17 +1,19 @@ import store from "@/store"; import { - CustomType, - GroupSystemMessageTypes, - AddFriendQrCodePrefix, - AddGroupQrCodePrefix, + CustomType, + GroupSystemMessageTypes, + AddFriendQrCodePrefix, + AddGroupQrCodePrefix, } from "@/constant"; import IMSDK, { - GroupAtType, - MessageType, - SessionType, + GroupAtType, + MessageType, + SessionType, } from "openim-uniapp-polyfill"; import dayjs from "dayjs"; -import { isThisYear } from "date-fns"; +import { + isThisYear +} from "date-fns"; import calendar from "dayjs/plugin/calendar"; import relativeTime from "dayjs/plugin/relativeTime"; @@ -24,338 +26,335 @@ dayjs.extend(updateLocale); dayjs.locale("zh-cn"); dayjs.updateLocale("en", { - calendar: { - sameElse: "YYYY-MM-DD", - }, + calendar: { + sameElse: "YYYY-MM-DD", + }, }); dayjs.updateLocale("zh-cn", { - calendar: { - sameDay: "HH:mm", - nextDay: "[明天]", - nextWeek: "dddd", - lastDay: "[昨天] HH:mm", - lastWeek: "dddd HH:mm", - sameElse: "YYYY年M月D日 HH:mm", - }, + calendar: { + sameDay: "HH:mm", + nextDay: "[明天]", + nextWeek: "dddd", + lastDay: "[昨天] HH:mm", + lastWeek: "dddd HH:mm", + sameElse: "YYYY年M月D日 HH:mm", + }, }); export const formatMessageTime = (timestemp, keepSameYear = false) => { - if (!timestemp) return ""; + if (!timestemp) return ""; - const isRecent = dayjs().diff(timestemp, "day") < 7; - const keepYear = keepSameYear || !isThisYear(timestemp); + const isRecent = dayjs().diff(timestemp, "day") < 7; + const keepYear = keepSameYear || !isThisYear(timestemp); - if (!isRecent && !keepYear) { - return dayjs(timestemp).format("M月D日 HH:mm"); - } + if (!isRecent && !keepYear) { + return dayjs(timestemp).format("M月D日 HH:mm"); + } - return dayjs(timestemp).calendar(); + return dayjs(timestemp).calendar(); }; export const conversationSort = (conversationList) => { - const arr = []; - const filterArr = conversationList.filter( - (c) => !arr.includes(c.conversationID) && arr.push(c.conversationID), - ); - filterArr.sort((a, b) => { - if (a.isPinned === b.isPinned) { - const aCompare = - a.draftTextTime > a.latestMsgSendTime - ? a.draftTextTime - : a.latestMsgSendTime; - const bCompare = - b.draftTextTime > b.latestMsgSendTime - ? b.draftTextTime - : b.latestMsgSendTime; - if (aCompare > bCompare) { - return -1; - } else if (aCompare < bCompare) { - return 1; - } else { - return 0; - } - } else if (a.isPinned && !b.isPinned) { - return -1; - } else { - return 1; - } - }); - return filterArr; + const arr = []; + const filterArr = conversationList.filter( + (c) => !arr.includes(c.conversationID) && arr.push(c.conversationID), + ); + filterArr.sort((a, b) => { + if (a.isPinned === b.isPinned) { + const aCompare = + a.draftTextTime > a.latestMsgSendTime ? + a.draftTextTime : + a.latestMsgSendTime; + const bCompare = + b.draftTextTime > b.latestMsgSendTime ? + b.draftTextTime : + b.latestMsgSendTime; + if (aCompare > bCompare) { + return -1; + } else if (aCompare < bCompare) { + return 1; + } else { + return 0; + } + } else if (a.isPinned && !b.isPinned) { + return -1; + } else { + return 1; + } + }); + return filterArr; }; export const sec2Time = (seconds) => { - var theTime1 = 0; // min - var theTime2 = 0; // hour - var theTime3 = 0; // day - if (seconds > 60) { - theTime1 = parseInt(seconds / 60); - seconds = parseInt(seconds % 60); - if (theTime1 > 60) { - theTime2 = parseInt(theTime1 / 60); - theTime1 = parseInt(theTime1 % 60); - if (theTime2 > 24) { - theTime3 = parseInt(theTime2 / 24); - theTime2 = parseInt(theTime2 % 24); - } - } - } - var result = ""; - if (seconds > 0) { - result = "" + parseInt(seconds) + "秒"; - } - if (theTime1 > 0) { - result = "" + parseInt(theTime1) + "分钟" + result; - } - if (theTime2 > 0) { - result = "" + parseInt(theTime2) + "小时" + result; - } - if (theTime3 > 0) { - result = "" + parseInt(theTime3) + "天" + result; - } - return result; + var theTime1 = 0; // min + var theTime2 = 0; // hour + var theTime3 = 0; // day + if (seconds > 60) { + theTime1 = parseInt(seconds / 60); + seconds = parseInt(seconds % 60); + if (theTime1 > 60) { + theTime2 = parseInt(theTime1 / 60); + theTime1 = parseInt(theTime1 % 60); + if (theTime2 > 24) { + theTime3 = parseInt(theTime2 / 24); + theTime2 = parseInt(theTime2 % 24); + } + } + } + var result = ""; + if (seconds > 0) { + result = "" + parseInt(seconds) + "秒"; + } + if (theTime1 > 0) { + result = "" + parseInt(theTime1) + "分钟" + result; + } + if (theTime2 > 0) { + result = "" + parseInt(theTime2) + "小时" + result; + } + if (theTime3 > 0) { + result = "" + parseInt(theTime3) + "天" + result; + } + return result; }; export const parseMessageByType = (pmsg) => { - const getName = (user) => { - return user.userID === store.getters.storeCurrentUserID - ? "你" - : user.nickname; - }; + const getName = (user) => { + return user.userID === store.getters.storeCurrentUserID ? + "你" : + user.nickname; + }; - switch (pmsg.contentType) { - case MessageType.TextMessage: - return pmsg.textElem.content; - case MessageType.PictureMessage: - return `[图片]`; - case MessageType.FriendAdded: - return "你们已经是好友了,开始聊天吧~"; - case MessageType.MemberEnter: - const enterDetails = JSON.parse(pmsg.notificationElem.detail); - const enterUser = enterDetails.entrantUser; - return `${getName(enterUser)}进入了群聊`; - case MessageType.GroupCreated: - const groupCreatedDetail = JSON.parse(pmsg.notificationElem.detail); - const groupCreatedUser = groupCreatedDetail.opUser; - return `${getName(groupCreatedUser)}创建了群聊`; - case MessageType.MemberInvited: - const inviteDetails = JSON.parse(pmsg.notificationElem.detail); - const inviteOpUser = inviteDetails.opUser; - const invitedUserList = inviteDetails.invitedUserList ?? []; - let inviteStr = ""; - invitedUserList.find( - (user, idx) => (inviteStr += getName(user) + "、") && idx > 3, - ); - inviteStr = inviteStr.slice(0, -1); - return `${getName(inviteOpUser)}邀请了${inviteStr}${ + switch (pmsg.contentType) { + case MessageType.TextMessage: + return pmsg.textElem.content; + case MessageType.PictureMessage: + return `[图片]`; + case MessageType.FriendAdded: + return "你们已经是好友了,开始聊天吧~"; + case MessageType.MemberEnter: + const enterDetails = JSON.parse(pmsg.notificationElem.detail); + const enterUser = enterDetails.entrantUser; + return `${getName(enterUser)}进入了群聊`; + case MessageType.GroupCreated: + const groupCreatedDetail = JSON.parse(pmsg.notificationElem.detail); + const groupCreatedUser = groupCreatedDetail.opUser; + return `${getName(groupCreatedUser)}创建了群聊`; + case MessageType.MemberInvited: + const inviteDetails = JSON.parse(pmsg.notificationElem.detail); + const inviteOpUser = inviteDetails.opUser; + const invitedUserList = inviteDetails.invitedUserList ?? []; + let inviteStr = ""; + invitedUserList.find( + (user, idx) => (inviteStr += getName(user) + "、") && idx > 3, + ); + inviteStr = inviteStr.slice(0, -1); + return `${getName(inviteOpUser)}邀请了${inviteStr}${ invitedUserList.length > 3 ? "..." : "" }进入群聊`; - case MessageType.MemberKicked: - const kickDetails = JSON.parse(pmsg.notificationElem.detail); - const kickOpUser = kickDetails.opUser; - const kickdUserList = kickDetails.kickedUserList ?? []; - let kickStr = ""; - kickdUserList.find( - (user, idx) => (kickStr += getName(user) + "、") && idx > 3, - ); - kickStr = kickStr.slice(0, -1); - return `${getName(kickOpUser)}踢出了${kickStr}${ + case MessageType.MemberKicked: + const kickDetails = JSON.parse(pmsg.notificationElem.detail); + const kickOpUser = kickDetails.opUser; + const kickdUserList = kickDetails.kickedUserList ?? []; + let kickStr = ""; + kickdUserList.find( + (user, idx) => (kickStr += getName(user) + "、") && idx > 3, + ); + kickStr = kickStr.slice(0, -1); + return `${getName(kickOpUser)}踢出了${kickStr}${ kickdUserList.length > 3 ? "..." : "" }`; - case MessageType.MemberQuit: - const quitDetails = JSON.parse(pmsg.notificationElem.detail); - const quitUser = quitDetails.quitUser; - return `${getName(quitUser)}退出了群聊`; - case MessageType.GroupInfoUpdated: - const groupUpdateDetail = JSON.parse(pmsg.notificationElem.detail); - const groupUpdateUser = groupUpdateDetail.opUser; - return `${getName(groupUpdateUser)}修改了群信息`; - case MessageType.GroupOwnerTransferred: - const transferDetails = JSON.parse(pmsg.notificationElem.detail); - const transferOpUser = transferDetails.opUser; - const newOwner = transferDetails.newGroupOwner; - return `${getName(transferOpUser)}将群主转让给${getName(newOwner)}`; - case MessageType.GroupDismissed: - const dismissDetails = JSON.parse(pmsg.notificationElem.detail); - const dismissUser = dismissDetails.opUser; - return `${getName(dismissUser)}解散了群聊`; - case MessageType.GroupNameUpdated: - const groupNameUpdateDetail = JSON.parse(pmsg.notificationElem.detail); - const groupNameUpdateUser = groupNameUpdateDetail.opUser; - return `${getName(groupNameUpdateUser)}修改了群名称为${ + case MessageType.MemberQuit: + const quitDetails = JSON.parse(pmsg.notificationElem.detail); + const quitUser = quitDetails.quitUser; + return `${getName(quitUser)}退出了群聊`; + case MessageType.GroupInfoUpdated: + const groupUpdateDetail = JSON.parse(pmsg.notificationElem.detail); + const groupUpdateUser = groupUpdateDetail.opUser; + return `${getName(groupUpdateUser)}修改了群信息`; + case MessageType.GroupOwnerTransferred: + const transferDetails = JSON.parse(pmsg.notificationElem.detail); + const transferOpUser = transferDetails.opUser; + const newOwner = transferDetails.newGroupOwner; + return `${getName(transferOpUser)}将群主转让给${getName(newOwner)}`; + case MessageType.GroupDismissed: + const dismissDetails = JSON.parse(pmsg.notificationElem.detail); + const dismissUser = dismissDetails.opUser; + return `${getName(dismissUser)}解散了群聊`; + case MessageType.GroupNameUpdated: + const groupNameUpdateDetail = JSON.parse(pmsg.notificationElem.detail); + const groupNameUpdateUser = groupNameUpdateDetail.opUser; + return `${getName(groupNameUpdateUser)}修改了群名称为${ groupNameUpdateDetail.group.groupName }`; - default: - return "[暂未支持的消息类型]"; - } + default: + return "[暂未支持的消息类型]"; + } }; export const formatConversionTime = (timestemp) => { - const fromNowStr = dayjs(timestemp).fromNow(); + const fromNowStr = dayjs(timestemp).fromNow(); - if (fromNowStr.includes("秒")) { - return "刚刚"; - } + if (fromNowStr.includes("秒")) { + return "刚刚"; + } - if (!fromNowStr.includes("秒") && !fromNowStr.includes("分钟")) { - return dayjs(timestemp).calendar(); - } + if (!fromNowStr.includes("秒") && !fromNowStr.includes("分钟")) { + return dayjs(timestemp).calendar(); + } - return fromNowStr; + return fromNowStr; }; export const secFormat = (sec) => { - let h; - let s; - h = Math.floor(sec / 60); - s = sec % 60; - h += ""; - s += ""; - h = h.length === 1 ? "0" + h : h; - s = s.length === 1 ? "0" + s : s; - return h + ":" + s; + let h; + let s; + h = Math.floor(sec / 60); + s = sec % 60; + h += ""; + s += ""; + h = h.length === 1 ? "0" + h : h; + s = s.length === 1 ? "0" + s : s; + return h + ":" + s; }; export const bytesToSize = (bytes) => { - if (bytes === 0) return "0 B"; - var k = 1024, - sizes = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"], - i = Math.floor(Math.log(bytes) / Math.log(k)); + if (bytes === 0) return "0 B"; + var k = 1024, + sizes = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"], + i = Math.floor(Math.log(bytes) / Math.log(k)); - return (bytes / Math.pow(k, i)).toPrecision(3) + " " + sizes[i]; + return (bytes / Math.pow(k, i)).toPrecision(3) + " " + sizes[i]; }; export const tipMessaggeFormat = (msg, currentUserID) => { - const getName = (user) => - user.userID === currentUserID ? "你" : user.nickname; + const getName = (user) => + user.userID === currentUserID ? "你" : user.nickname; - switch (msg.contentType) { - case MessageType.FriendAdded: - return `你们已经是好友了~`; - case MessageType.GroupCreated: - const groupCreatedDetail = JSON.parse(msg.notificationElem.detail); - const groupCreatedUser = groupCreatedDetail.opUser; - return `${getName(groupCreatedUser)}创建了群聊`; - case MessageType.GroupInfoUpdated: - const groupUpdateDetail = JSON.parse(msg.notificationElem.detail); - const groupUpdateUser = groupUpdateDetail.opUser; - return `${parseInfo(groupUpdateUser)}修改了群信息`; - case MessageType.GroupOwnerTransferred: - const transferDetails = JSON.parse(msg.notificationElem.detail); - const transferOpUser = transferDetails.opUser; - const newOwner = transferDetails.newGroupOwner; - return `${parseInfo(transferOpUser)}转让群主给${parseInfo(newOwner)}`; - case MessageType.MemberQuit: - const quitDetails = JSON.parse(msg.notificationElem.detail); - const quitUser = quitDetails.quitUser; - return `${parseInfo(quitUser)}退出了群组`; - case MessageType.MemberInvited: - const inviteDetails = JSON.parse(msg.notificationElem.detail); - const inviteOpUser = inviteDetails.opUser; - const invitedUserList = inviteDetails.invitedUserList ?? []; - let inviteStr = ""; - invitedUserList.find( - (user, idx) => (inviteStr += parseInfo(user) + "、") && idx > 3, - ); - inviteStr = inviteStr.slice(0, -1); - return `${parseInfo(inviteOpUser)} 邀请了${inviteStr}${ + switch (msg.contentType) { + case MessageType.FriendAdded: + return `你们已经是好友了~`; + case MessageType.GroupCreated: + const groupCreatedDetail = JSON.parse(msg.notificationElem.detail); + const groupCreatedUser = groupCreatedDetail.opUser; + return `${getName(groupCreatedUser)}创建了群聊`; + case MessageType.GroupInfoUpdated: + const groupUpdateDetail = JSON.parse(msg.notificationElem.detail); + const groupUpdateUser = groupUpdateDetail.opUser; + return `${parseInfo(groupUpdateUser)}修改了群信息`; + case MessageType.GroupOwnerTransferred: + const transferDetails = JSON.parse(msg.notificationElem.detail); + const transferOpUser = transferDetails.opUser; + const newOwner = transferDetails.newGroupOwner; + return `${parseInfo(transferOpUser)}转让群主给${parseInfo(newOwner)}`; + case MessageType.MemberQuit: + const quitDetails = JSON.parse(msg.notificationElem.detail); + const quitUser = quitDetails.quitUser; + return `${parseInfo(quitUser)}退出了群组`; + case MessageType.MemberInvited: + const inviteDetails = JSON.parse(msg.notificationElem.detail); + const inviteOpUser = inviteDetails.opUser; + const invitedUserList = inviteDetails.invitedUserList ?? []; + let inviteStr = ""; + invitedUserList.find( + (user, idx) => (inviteStr += parseInfo(user) + "、") && idx > 3, + ); + inviteStr = inviteStr.slice(0, -1); + return `${parseInfo(inviteOpUser)} 邀请了${inviteStr}${ invitedUserList.length > 3 ? "..." : "" }加入群聊`; - case MessageType.MemberKicked: - const kickDetails = JSON.parse(msg.notificationElem.detail); - const kickOpUser = kickDetails.opUser; - const kickdUserList = kickDetails.kickedUserList ?? []; - let kickStr = ""; - kickdUserList.find( - (user, idx) => (kickStr += parseInfo(user) + "、") && idx > 3, - ); - kickStr = kickStr.slice(0, -1); - return `${parseInfo(kickOpUser)} 踢出了${kickStr}${ + case MessageType.MemberKicked: + const kickDetails = JSON.parse(msg.notificationElem.detail); + const kickOpUser = kickDetails.opUser; + const kickdUserList = kickDetails.kickedUserList ?? []; + let kickStr = ""; + kickdUserList.find( + (user, idx) => (kickStr += parseInfo(user) + "、") && idx > 3, + ); + kickStr = kickStr.slice(0, -1); + return `${parseInfo(kickOpUser)} 踢出了${kickStr}${ kickdUserList.length > 3 ? "..." : "" }`; - case MessageType.MemberEnter: - const enterDetails = JSON.parse(msg.notificationElem.detail); - const enterUser = enterDetails.entrantUser; - return `${parseInfo(enterUser)}加入了群聊`; - case MessageType.GroupDismissed: - const dismissDetails = JSON.parse(msg.notificationElem.detail); - const dismissUser = dismissDetails.opUser; - return `${parseInfo(dismissUser)}解散了群聊`; - default: - return ""; - } + case MessageType.MemberEnter: + const enterDetails = JSON.parse(msg.notificationElem.detail); + const enterUser = enterDetails.entrantUser; + return `${parseInfo(enterUser)}加入了群聊`; + case MessageType.GroupDismissed: + const dismissDetails = JSON.parse(msg.notificationElem.detail); + const dismissUser = dismissDetails.opUser; + return `${parseInfo(dismissUser)}解散了群聊`; + default: + return ""; + } }; export const markConversationAsRead = (conversation, fromChating = false) => { - if (conversation.unreadCount !== 0) { - IMSDK.asyncApi( - IMSDK.IMMethods.MarkConversationMessageAsRead, - IMSDK.uuid(), - conversation.conversationID, - ); - } + if (conversation.unreadCount !== 0) { + IMSDK.asyncApi( + IMSDK.IMMethods.MarkConversationMessageAsRead, + IMSDK.uuid(), + conversation.conversationID, + ); + } }; export const prepareConversationState = (conversation, back2Tab = false) => { - markConversationAsRead(conversation); + markConversationAsRead(conversation); - if (conversation.conversationType === SessionType.WorkingGroup) { - store.dispatch("conversation/getCurrentGroup", conversation.groupID); - store.dispatch( - "conversation/getCurrentMemberInGroup", - conversation.groupID, - ); - } - store.dispatch("message/resetMessageState"); - store.commit("conversation/SET_CURRENT_CONVERSATION", conversation); + if (conversation.conversationType === SessionType.WorkingGroup) { + store.dispatch("conversation/getCurrentGroup", conversation.groupID); + store.dispatch( + "conversation/getCurrentMemberInGroup", + conversation.groupID, + ); + } + store.dispatch("message/resetMessageState"); + store.commit("conversation/SET_CURRENT_CONVERSATION", conversation); - let url = `/pages/conversation/chating/index?back2Tab=${back2Tab}`; - setTimeout(() => { - uni.navigateTo({ - url, - }); - }, 300) + let url = `/pages/conversation/chating/index?back2Tab=${back2Tab}`; + setTimeout(() => { + uni.navigateTo({ + url, + }); + }, 300) }; -export const navigateToDesignatedConversation = ( - sourceID, - sessionType, - back2Tab = false, -) => { - return new Promise(async (resolve, reject) => { - try { - const { data } = await IMSDK.asyncApi( - IMSDK.IMMethods.GetOneConversation, - IMSDK.uuid(), - { - sessionType, - sourceID, - }, - ); - prepareConversationState(data, back2Tab); - resolve(); - } catch (e) { - reject(e); - } - }); +export const navigateToDesignatedConversation = (sourceID,sessionType,back2Tab = false,) => { + return new Promise(async (resolve, reject) => { + try { + const { + data + } = await IMSDK.asyncApi( + IMSDK.IMMethods.GetOneConversation, + IMSDK.uuid(), { + sessionType, + sourceID, + }, + ); + prepareConversationState(data, back2Tab); + resolve(); + } catch (e) { + reject(e); + } + }); }; export const offlinePushInfo = { - title: "you have a new message", - desc: "you have a new message", - ex: "", - iOSPushSound: "", - iOSBadgeCount: true, + title: "you have a new message", + desc: "you have a new message", + ex: "", + iOSPushSound: "", + iOSBadgeCount: true, }; export const getConversationContent = (message) => { - if ( - !message.groupID || - message.sendID === store.getters.storeCurrentUserID - ) { - return parseMessageByType(message); - } - return `${message.senderNickname}:${parseMessageByType(message)}`; + if ( + !message.groupID || + message.sendID === store.getters.storeCurrentUserID + ) { + return parseMessageByType(message); + } + return `${message.senderNickname}:${parseMessageByType(message)}`; }; \ No newline at end of file