From cb8dbecb1a0c33d304297593504eedf3b537ef6a Mon Sep 17 00:00:00 2001 From: xsx <825657193@qq.com> Date: Sat, 3 Aug 2024 00:42:32 +0800 Subject: [PATCH] =?UTF-8?q?im-ui=E6=9B=B4=E5=90=8D=E4=B8=BAim-web?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 8 +- im-ui/.gitignore | 26 - {im-ui => im-web}/.env.development | 0 {im-ui => im-web}/.env.production | 0 {im-ui => im-web}/README.md | 48 +- {im-ui => im-web}/babel.config.js | 10 +- {im-ui => im-web}/package.json | 126 +-- {im-ui => im-web}/public/index.html | 26 +- {im-ui => im-web}/public/logo.png | Bin {im-ui => im-web}/src/App.vue | 226 ++--- {im-ui => im-web}/src/api/camera.js | 0 {im-ui => im-web}/src/api/date.js | 0 {im-ui => im-web}/src/api/element.js | 0 {im-ui => im-web}/src/api/emotion.js | 0 {im-ui => im-web}/src/api/enums.js | 0 {im-ui => im-web}/src/api/eventBus.js | 0 {im-ui => im-web}/src/api/httpRequest.js | 0 {im-ui => im-web}/src/api/messageType.js | 0 {im-ui => im-web}/src/api/rtcGroupApi.js | 0 {im-ui => im-web}/src/api/rtcPrivateApi.js | 0 {im-ui => im-web}/src/api/webrtc.js | 0 {im-ui => im-web}/src/api/wssocket.js | 290 +++--- {im-ui => im-web}/src/assets/audio/call.wav | Bin {im-ui => im-web}/src/assets/audio/tip.wav | Bin {im-ui => im-web}/src/assets/emoji/0.gif | Bin {im-ui => im-web}/src/assets/emoji/1.gif | Bin {im-ui => im-web}/src/assets/emoji/10.gif | Bin {im-ui => im-web}/src/assets/emoji/11.gif | Bin {im-ui => im-web}/src/assets/emoji/12.gif | Bin {im-ui => im-web}/src/assets/emoji/13.gif | Bin {im-ui => im-web}/src/assets/emoji/14.gif | Bin {im-ui => im-web}/src/assets/emoji/15.gif | Bin {im-ui => im-web}/src/assets/emoji/16.gif | Bin {im-ui => im-web}/src/assets/emoji/17.gif | Bin {im-ui => im-web}/src/assets/emoji/18.gif | Bin {im-ui => im-web}/src/assets/emoji/19.gif | Bin {im-ui => im-web}/src/assets/emoji/2.gif | Bin {im-ui => im-web}/src/assets/emoji/20.gif | Bin {im-ui => im-web}/src/assets/emoji/21.gif | Bin {im-ui => im-web}/src/assets/emoji/22.gif | Bin {im-ui => im-web}/src/assets/emoji/23.gif | Bin {im-ui => im-web}/src/assets/emoji/24.gif | Bin {im-ui => im-web}/src/assets/emoji/25.gif | Bin {im-ui => im-web}/src/assets/emoji/26.gif | Bin {im-ui => im-web}/src/assets/emoji/27.gif | Bin {im-ui => im-web}/src/assets/emoji/28.gif | Bin {im-ui => im-web}/src/assets/emoji/29.gif | Bin {im-ui => im-web}/src/assets/emoji/3.gif | Bin {im-ui => im-web}/src/assets/emoji/30.gif | Bin {im-ui => im-web}/src/assets/emoji/31.gif | Bin {im-ui => im-web}/src/assets/emoji/32.gif | Bin {im-ui => im-web}/src/assets/emoji/33.gif | Bin {im-ui => im-web}/src/assets/emoji/34.gif | Bin {im-ui => im-web}/src/assets/emoji/35.gif | Bin {im-ui => im-web}/src/assets/emoji/36.gif | Bin {im-ui => im-web}/src/assets/emoji/37.gif | Bin {im-ui => im-web}/src/assets/emoji/38.gif | Bin {im-ui => im-web}/src/assets/emoji/39.gif | Bin {im-ui => im-web}/src/assets/emoji/4.gif | Bin {im-ui => im-web}/src/assets/emoji/40.gif | Bin {im-ui => im-web}/src/assets/emoji/41.gif | Bin {im-ui => im-web}/src/assets/emoji/42.gif | Bin {im-ui => im-web}/src/assets/emoji/43.gif | Bin {im-ui => im-web}/src/assets/emoji/44.gif | Bin {im-ui => im-web}/src/assets/emoji/45.gif | Bin {im-ui => im-web}/src/assets/emoji/46.gif | Bin {im-ui => im-web}/src/assets/emoji/47.gif | Bin {im-ui => im-web}/src/assets/emoji/48.gif | Bin {im-ui => im-web}/src/assets/emoji/49.gif | Bin {im-ui => im-web}/src/assets/emoji/5.gif | Bin {im-ui => im-web}/src/assets/emoji/50.gif | Bin {im-ui => im-web}/src/assets/emoji/51.gif | Bin {im-ui => im-web}/src/assets/emoji/52.gif | Bin {im-ui => im-web}/src/assets/emoji/53.gif | Bin {im-ui => im-web}/src/assets/emoji/54.gif | Bin {im-ui => im-web}/src/assets/emoji/55.gif | Bin {im-ui => im-web}/src/assets/emoji/56.gif | Bin {im-ui => im-web}/src/assets/emoji/6.gif | Bin {im-ui => im-web}/src/assets/emoji/7.gif | Bin {im-ui => im-web}/src/assets/emoji/8.gif | Bin {im-ui => im-web}/src/assets/emoji/9.gif | Bin .../src/assets/iconfont/iconfont.css | 0 .../src/assets/iconfont/iconfont.ttf | Bin .../src/assets/image/icp_logo.png | Bin .../src/assets/image/online_app.png | Bin .../src/assets/image/online_web.png | Bin {im-ui => im-web}/src/assets/style/global.css | 86 +- .../src/components/chat/ChatAtBox.vue | 0 .../src/components/chat/ChatBox.vue | 0 .../src/components/chat/ChatGroupMember.vue | 0 .../src/components/chat/ChatGroupReaded.vue | 0 .../src/components/chat/ChatGroupSide.vue | 0 .../src/components/chat/ChatHistory.vue | 0 .../src/components/chat/ChatItem.vue | 0 .../src/components/chat/ChatMessageItem.vue | 0 .../src/components/chat/ChatRecord.vue | 0 .../src/components/common/Emotion.vue | 0 .../src/components/common/FileUpload.vue | 0 .../src/components/common/FullImage.vue | 0 .../src/components/common/HeadImage.vue | 0 .../src/components/common/Icp.vue | 0 .../src/components/common/RightMenu.vue | 0 .../src/components/common/UserInfo.vue | 0 .../src/components/friend/AddFriend.vue | 0 .../src/components/friend/FriendItem.vue | 0 .../src/components/group/AddGroupMember.vue | 0 .../src/components/group/GroupItem.vue | 0 .../src/components/group/GroupMember.vue | 0 .../src/components/group/GroupMemberItem.vue | 0 .../components/group/GroupMemberSelector.vue | 0 .../src/components/rtc/RtcGroupJoin.vue | 0 .../src/components/rtc/RtcGroupVideo.vue | 0 .../src/components/rtc/RtcPrivateAcceptor.vue | 0 .../src/components/rtc/RtcPrivateVideo.vue | 0 .../src/components/setting/Setting.vue | 0 {im-ui => im-web}/src/main.js | 70 +- {im-ui => im-web}/src/router/index.js | 98 +- {im-ui => im-web}/src/ssl/cert.crt | 0 {im-ui => im-web}/src/ssl/cert.key | 0 {im-ui => im-web}/src/store/chatStore.js | 736 +++++++-------- {im-ui => im-web}/src/store/configStore.js | 0 {im-ui => im-web}/src/store/friendStore.js | 0 {im-ui => im-web}/src/store/groupStore.js | 0 {im-ui => im-web}/src/store/index.js | 66 +- {im-ui => im-web}/src/store/uiStore.js | 0 {im-ui => im-web}/src/store/userStore.js | 98 +- .../src/utils/directive/dialogDrag.js | 0 {im-ui => im-web}/src/view/Chat.vue | 206 ++--- {im-ui => im-web}/src/view/Friend.vue | 0 {im-ui => im-web}/src/view/Group.vue | 0 {im-ui => im-web}/src/view/Home.vue | 842 +++++++++--------- {im-ui => im-web}/src/view/Login.vue | 484 +++++----- {im-ui => im-web}/src/view/Register.vue | 324 +++---- {im-ui => im-web}/vue.config.js | 42 +- 134 files changed, 1893 insertions(+), 1919 deletions(-) delete mode 100644 im-ui/.gitignore rename {im-ui => im-web}/.env.development (100%) rename {im-ui => im-web}/.env.production (100%) rename {im-ui => im-web}/README.md (92%) rename {im-ui => im-web}/babel.config.js (93%) rename {im-ui => im-web}/package.json (96%) rename {im-ui => im-web}/public/index.html (96%) rename {im-ui => im-web}/public/logo.png (100%) rename {im-ui => im-web}/src/App.vue (93%) rename {im-ui => im-web}/src/api/camera.js (100%) rename {im-ui => im-web}/src/api/date.js (100%) rename {im-ui => im-web}/src/api/element.js (100%) rename {im-ui => im-web}/src/api/emotion.js (100%) rename {im-ui => im-web}/src/api/enums.js (100%) rename {im-ui => im-web}/src/api/eventBus.js (100%) rename {im-ui => im-web}/src/api/httpRequest.js (100%) rename {im-ui => im-web}/src/api/messageType.js (100%) rename {im-ui => im-web}/src/api/rtcGroupApi.js (100%) rename {im-ui => im-web}/src/api/rtcPrivateApi.js (100%) rename {im-ui => im-web}/src/api/webrtc.js (100%) rename {im-ui => im-web}/src/api/wssocket.js (96%) rename {im-ui => im-web}/src/assets/audio/call.wav (100%) rename {im-ui => im-web}/src/assets/audio/tip.wav (100%) rename {im-ui => im-web}/src/assets/emoji/0.gif (100%) rename {im-ui => im-web}/src/assets/emoji/1.gif (100%) rename {im-ui => im-web}/src/assets/emoji/10.gif (100%) rename {im-ui => im-web}/src/assets/emoji/11.gif (100%) rename {im-ui => im-web}/src/assets/emoji/12.gif (100%) rename {im-ui => im-web}/src/assets/emoji/13.gif (100%) rename {im-ui => im-web}/src/assets/emoji/14.gif (100%) rename {im-ui => im-web}/src/assets/emoji/15.gif (100%) rename {im-ui => im-web}/src/assets/emoji/16.gif (100%) rename {im-ui => im-web}/src/assets/emoji/17.gif (100%) rename {im-ui => im-web}/src/assets/emoji/18.gif (100%) rename {im-ui => im-web}/src/assets/emoji/19.gif (100%) rename {im-ui => im-web}/src/assets/emoji/2.gif (100%) rename {im-ui => im-web}/src/assets/emoji/20.gif (100%) rename {im-ui => im-web}/src/assets/emoji/21.gif (100%) rename {im-ui => im-web}/src/assets/emoji/22.gif (100%) rename {im-ui => im-web}/src/assets/emoji/23.gif (100%) rename {im-ui => im-web}/src/assets/emoji/24.gif (100%) rename {im-ui => im-web}/src/assets/emoji/25.gif (100%) rename {im-ui => im-web}/src/assets/emoji/26.gif (100%) rename {im-ui => im-web}/src/assets/emoji/27.gif (100%) rename {im-ui => im-web}/src/assets/emoji/28.gif (100%) rename {im-ui => im-web}/src/assets/emoji/29.gif (100%) rename {im-ui => im-web}/src/assets/emoji/3.gif (100%) rename {im-ui => im-web}/src/assets/emoji/30.gif (100%) rename {im-ui => im-web}/src/assets/emoji/31.gif (100%) rename {im-ui => im-web}/src/assets/emoji/32.gif (100%) rename {im-ui => im-web}/src/assets/emoji/33.gif (100%) rename {im-ui => im-web}/src/assets/emoji/34.gif (100%) rename {im-ui => im-web}/src/assets/emoji/35.gif (100%) rename {im-ui => im-web}/src/assets/emoji/36.gif (100%) rename {im-ui => im-web}/src/assets/emoji/37.gif (100%) rename {im-ui => im-web}/src/assets/emoji/38.gif (100%) rename {im-ui => im-web}/src/assets/emoji/39.gif (100%) rename {im-ui => im-web}/src/assets/emoji/4.gif (100%) rename {im-ui => im-web}/src/assets/emoji/40.gif (100%) rename {im-ui => im-web}/src/assets/emoji/41.gif (100%) rename {im-ui => im-web}/src/assets/emoji/42.gif (100%) rename {im-ui => im-web}/src/assets/emoji/43.gif (100%) rename {im-ui => im-web}/src/assets/emoji/44.gif (100%) rename {im-ui => im-web}/src/assets/emoji/45.gif (100%) rename {im-ui => im-web}/src/assets/emoji/46.gif (100%) rename {im-ui => im-web}/src/assets/emoji/47.gif (100%) rename {im-ui => im-web}/src/assets/emoji/48.gif (100%) rename {im-ui => im-web}/src/assets/emoji/49.gif (100%) rename {im-ui => im-web}/src/assets/emoji/5.gif (100%) rename {im-ui => im-web}/src/assets/emoji/50.gif (100%) rename {im-ui => im-web}/src/assets/emoji/51.gif (100%) rename {im-ui => im-web}/src/assets/emoji/52.gif (100%) rename {im-ui => im-web}/src/assets/emoji/53.gif (100%) rename {im-ui => im-web}/src/assets/emoji/54.gif (100%) rename {im-ui => im-web}/src/assets/emoji/55.gif (100%) rename {im-ui => im-web}/src/assets/emoji/56.gif (100%) rename {im-ui => im-web}/src/assets/emoji/6.gif (100%) rename {im-ui => im-web}/src/assets/emoji/7.gif (100%) rename {im-ui => im-web}/src/assets/emoji/8.gif (100%) rename {im-ui => im-web}/src/assets/emoji/9.gif (100%) rename {im-ui => im-web}/src/assets/iconfont/iconfont.css (100%) rename {im-ui => im-web}/src/assets/iconfont/iconfont.ttf (100%) rename {im-ui => im-web}/src/assets/image/icp_logo.png (100%) rename {im-ui => im-web}/src/assets/image/online_app.png (100%) rename {im-ui => im-web}/src/assets/image/online_web.png (100%) rename {im-ui => im-web}/src/assets/style/global.css (93%) rename {im-ui => im-web}/src/components/chat/ChatAtBox.vue (100%) rename {im-ui => im-web}/src/components/chat/ChatBox.vue (100%) rename {im-ui => im-web}/src/components/chat/ChatGroupMember.vue (100%) rename {im-ui => im-web}/src/components/chat/ChatGroupReaded.vue (100%) rename {im-ui => im-web}/src/components/chat/ChatGroupSide.vue (100%) rename {im-ui => im-web}/src/components/chat/ChatHistory.vue (100%) rename {im-ui => im-web}/src/components/chat/ChatItem.vue (100%) rename {im-ui => im-web}/src/components/chat/ChatMessageItem.vue (100%) rename {im-ui => im-web}/src/components/chat/ChatRecord.vue (100%) rename {im-ui => im-web}/src/components/common/Emotion.vue (100%) rename {im-ui => im-web}/src/components/common/FileUpload.vue (100%) rename {im-ui => im-web}/src/components/common/FullImage.vue (100%) rename {im-ui => im-web}/src/components/common/HeadImage.vue (100%) rename {im-ui => im-web}/src/components/common/Icp.vue (100%) rename {im-ui => im-web}/src/components/common/RightMenu.vue (100%) rename {im-ui => im-web}/src/components/common/UserInfo.vue (100%) rename {im-ui => im-web}/src/components/friend/AddFriend.vue (100%) rename {im-ui => im-web}/src/components/friend/FriendItem.vue (100%) rename {im-ui => im-web}/src/components/group/AddGroupMember.vue (100%) rename {im-ui => im-web}/src/components/group/GroupItem.vue (100%) rename {im-ui => im-web}/src/components/group/GroupMember.vue (100%) rename {im-ui => im-web}/src/components/group/GroupMemberItem.vue (100%) rename {im-ui => im-web}/src/components/group/GroupMemberSelector.vue (100%) rename {im-ui => im-web}/src/components/rtc/RtcGroupJoin.vue (100%) rename {im-ui => im-web}/src/components/rtc/RtcGroupVideo.vue (100%) rename {im-ui => im-web}/src/components/rtc/RtcPrivateAcceptor.vue (100%) rename {im-ui => im-web}/src/components/rtc/RtcPrivateVideo.vue (100%) rename {im-ui => im-web}/src/components/setting/Setting.vue (100%) rename {im-ui => im-web}/src/main.js (96%) rename {im-ui => im-web}/src/router/index.js (94%) rename {im-ui => im-web}/src/ssl/cert.crt (100%) rename {im-ui => im-web}/src/ssl/cert.key (100%) rename {im-ui => im-web}/src/store/chatStore.js (96%) rename {im-ui => im-web}/src/store/configStore.js (100%) rename {im-ui => im-web}/src/store/friendStore.js (100%) rename {im-ui => im-web}/src/store/groupStore.js (100%) rename {im-ui => im-web}/src/store/index.js (96%) rename {im-ui => im-web}/src/store/uiStore.js (100%) rename {im-ui => im-web}/src/store/userStore.js (95%) rename {im-ui => im-web}/src/utils/directive/dialogDrag.js (100%) rename {im-ui => im-web}/src/view/Chat.vue (95%) rename {im-ui => im-web}/src/view/Friend.vue (100%) rename {im-ui => im-web}/src/view/Group.vue (100%) rename {im-ui => im-web}/src/view/Home.vue (96%) rename {im-ui => im-web}/src/view/Login.vue (96%) rename {im-ui => im-web}/src/view/Register.vue (96%) rename {im-ui => im-web}/vue.config.js (95%) diff --git a/.gitignore b/.gitignore index 6e07688..083aa4a 100644 --- a/.gitignore +++ b/.gitignore @@ -9,10 +9,10 @@ /im-server/src/main/resources/logback-prod.xml /im-commom/im-commom.iml /im-uniapp/node_modules/ -/im-ui/package-lock.json +/im-web/package-lock.json /im-uniapp/unpackage/ /im-uniapp/hybrid/ /im-uniapp/package-lock.json -/im-ui/src/components/rtc/LocalVideo.vue -/im-ui/src/components/rtc/RemoteVideo.vue -/im-ui/src/components/rtc/RtcGroupAcceptor.vue +/im-web/src/components/rtc/LocalVideo.vue +/im-web/src/components/rtc/RemoteVideo.vue +/im-web/src/components/rtc/RtcGroupAcceptor.vue diff --git a/im-ui/.gitignore b/im-ui/.gitignore deleted file mode 100644 index 0b0371a..0000000 --- a/im-ui/.gitignore +++ /dev/null @@ -1,26 +0,0 @@ -.DS_Store -node_modules -/dist - - -# local env files -.env.local -.env.*.local - -# Log files -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* - -# Editor directories and files -.idea -.vscode -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? - -# -package-lock.json diff --git a/im-ui/.env.development b/im-web/.env.development similarity index 100% rename from im-ui/.env.development rename to im-web/.env.development diff --git a/im-ui/.env.production b/im-web/.env.production similarity index 100% rename from im-ui/.env.production rename to im-web/.env.production diff --git a/im-ui/README.md b/im-web/README.md similarity index 92% rename from im-ui/README.md rename to im-web/README.md index b29f472..ae73f2f 100644 --- a/im-ui/README.md +++ b/im-web/README.md @@ -1,24 +1,24 @@ -# web - -## Project setup -``` -npm install -``` - -### Compiles and hot-reloads for development -``` -npm run serve -``` - -### Compiles and minifies for production -``` -npm run build -``` - -### Lints and fixes files -``` -npm run lint -``` - -### Customize configuration -See [Configuration Reference](https://cli.vuejs.org/config/). +# web + +## Project setup +``` +npm install +``` + +### Compiles and hot-reloads for development +``` +npm run serve +``` + +### Compiles and minifies for production +``` +npm run build +``` + +### Lints and fixes files +``` +npm run lint +``` + +### Customize configuration +See [Configuration Reference](https://cli.vuejs.org/config/). diff --git a/im-ui/babel.config.js b/im-web/babel.config.js similarity index 93% rename from im-ui/babel.config.js rename to im-web/babel.config.js index a673655..e955840 100644 --- a/im-ui/babel.config.js +++ b/im-web/babel.config.js @@ -1,5 +1,5 @@ -module.exports = { - presets: [ - '@vue/cli-plugin-babel/preset' - ] -} +module.exports = { + presets: [ + '@vue/cli-plugin-babel/preset' + ] +} diff --git a/im-ui/package.json b/im-web/package.json similarity index 96% rename from im-ui/package.json rename to im-web/package.json index 4b43975..f37338f 100644 --- a/im-ui/package.json +++ b/im-web/package.json @@ -1,63 +1,63 @@ -{ - "name": "boxim", - "version": "0.1.0", - "private": true, - "scripts": { - "serve": "vue-cli-service serve", - "build": "set NODE_OPTIONS=--openssl-legacy-provider & vue-cli-service build", - "lint": "vue-cli-service lint" - }, - "dependencies": { - "axios": "^1.1.3", - "core-js": "^3.6.5", - "element-ui": "^2.15.10", - "js-audio-recorder": "^1.0.7", - "localforage": "^1.10.0", - "sass": "^1.47.0", - "sass-loader": "^10.1.1", - "vue": "^2.6.11", - "vue-axios": "^3.5.0", - "vue-router": "^3.3.3", - "vuex": "^3.6.2", - "vuex-persist": "^3.1.3" - }, - "devDependencies": { - "@vue/cli-plugin-babel": "~4.5.12", - "@vue/cli-plugin-eslint": "~4.5.12", - "@vue/cli-service": "~4.5.12", - "babel-eslint": "^10.1.0", - "eslint": "^6.7.2", - "eslint-plugin-vue": "^6.2.2", - "vue-template-compiler": "^2.6.11" - }, - "eslintConfig": { - "root": true, - "env": { - "node": true - }, - "extends": [ - "plugin:vue/essential", - "eslint:recommended" - ], - "parserOptions": { - "parser": "babel-eslint" - }, - "rules": { - "no-mixed-spaces-and-tabs": 0, - "generator-star-spacing": "off", - "no-tabs": "off", - "no-unused-vars": "off", - "no-unused-labels": "off", - "no-console": "off", - "vue/no-unused-components": "off", - "no-irregular-whitespace": "off", - "no-debugger": "off", - "no-useless-escape": "off" - } - }, - "browserslist": [ - "> 1%", - "last 2 versions", - "not dead" - ] -} +{ + "name": "boxim", + "version": "0.1.0", + "private": true, + "scripts": { + "serve": "vue-cli-service serve", + "build": "set NODE_OPTIONS=--openssl-legacy-provider & vue-cli-service build", + "lint": "vue-cli-service lint" + }, + "dependencies": { + "axios": "^1.1.3", + "core-js": "^3.6.5", + "element-ui": "^2.15.10", + "js-audio-recorder": "^1.0.7", + "localforage": "^1.10.0", + "sass": "^1.47.0", + "sass-loader": "^10.1.1", + "vue": "^2.6.11", + "vue-axios": "^3.5.0", + "vue-router": "^3.3.3", + "vuex": "^3.6.2", + "vuex-persist": "^3.1.3" + }, + "devDependencies": { + "@vue/cli-plugin-babel": "~4.5.12", + "@vue/cli-plugin-eslint": "~4.5.12", + "@vue/cli-service": "~4.5.12", + "babel-eslint": "^10.1.0", + "eslint": "^6.7.2", + "eslint-plugin-vue": "^6.2.2", + "vue-template-compiler": "^2.6.11" + }, + "eslintConfig": { + "root": true, + "env": { + "node": true + }, + "extends": [ + "plugin:vue/essential", + "eslint:recommended" + ], + "parserOptions": { + "parser": "babel-eslint" + }, + "rules": { + "no-mixed-spaces-and-tabs": 0, + "generator-star-spacing": "off", + "no-tabs": "off", + "no-unused-vars": "off", + "no-unused-labels": "off", + "no-console": "off", + "vue/no-unused-components": "off", + "no-irregular-whitespace": "off", + "no-debugger": "off", + "no-useless-escape": "off" + } + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not dead" + ] +} diff --git a/im-ui/public/index.html b/im-web/public/index.html similarity index 96% rename from im-ui/public/index.html rename to im-web/public/index.html index 724a362..36eb88e 100644 --- a/im-ui/public/index.html +++ b/im-web/public/index.html @@ -1,13 +1,13 @@ - - - - - - - - 盒子IM - - -
- - + + + + + + + + 盒子IM + + +
+ + diff --git a/im-ui/public/logo.png b/im-web/public/logo.png similarity index 100% rename from im-ui/public/logo.png rename to im-web/public/logo.png diff --git a/im-ui/src/App.vue b/im-web/src/App.vue similarity index 93% rename from im-ui/src/App.vue rename to im-web/src/App.vue index 60aa2b0..6e991bb 100644 --- a/im-ui/src/App.vue +++ b/im-web/src/App.vue @@ -1,115 +1,115 @@ - - - - - \ No newline at end of file diff --git a/im-ui/src/api/camera.js b/im-web/src/api/camera.js similarity index 100% rename from im-ui/src/api/camera.js rename to im-web/src/api/camera.js diff --git a/im-ui/src/api/date.js b/im-web/src/api/date.js similarity index 100% rename from im-ui/src/api/date.js rename to im-web/src/api/date.js diff --git a/im-ui/src/api/element.js b/im-web/src/api/element.js similarity index 100% rename from im-ui/src/api/element.js rename to im-web/src/api/element.js diff --git a/im-ui/src/api/emotion.js b/im-web/src/api/emotion.js similarity index 100% rename from im-ui/src/api/emotion.js rename to im-web/src/api/emotion.js diff --git a/im-ui/src/api/enums.js b/im-web/src/api/enums.js similarity index 100% rename from im-ui/src/api/enums.js rename to im-web/src/api/enums.js diff --git a/im-ui/src/api/eventBus.js b/im-web/src/api/eventBus.js similarity index 100% rename from im-ui/src/api/eventBus.js rename to im-web/src/api/eventBus.js diff --git a/im-ui/src/api/httpRequest.js b/im-web/src/api/httpRequest.js similarity index 100% rename from im-ui/src/api/httpRequest.js rename to im-web/src/api/httpRequest.js diff --git a/im-ui/src/api/messageType.js b/im-web/src/api/messageType.js similarity index 100% rename from im-ui/src/api/messageType.js rename to im-web/src/api/messageType.js diff --git a/im-ui/src/api/rtcGroupApi.js b/im-web/src/api/rtcGroupApi.js similarity index 100% rename from im-ui/src/api/rtcGroupApi.js rename to im-web/src/api/rtcGroupApi.js diff --git a/im-ui/src/api/rtcPrivateApi.js b/im-web/src/api/rtcPrivateApi.js similarity index 100% rename from im-ui/src/api/rtcPrivateApi.js rename to im-web/src/api/rtcPrivateApi.js diff --git a/im-ui/src/api/webrtc.js b/im-web/src/api/webrtc.js similarity index 100% rename from im-ui/src/api/webrtc.js rename to im-web/src/api/webrtc.js diff --git a/im-ui/src/api/wssocket.js b/im-web/src/api/wssocket.js similarity index 96% rename from im-ui/src/api/wssocket.js rename to im-web/src/api/wssocket.js index 9842697..de000ef 100644 --- a/im-ui/src/api/wssocket.js +++ b/im-web/src/api/wssocket.js @@ -1,145 +1,145 @@ -var websock = null; -let rec; //断线重连后,延迟5秒重新创建WebSocket连接 rec用来存储延迟请求的代码 -let isConnect = false; //连接标识 避免重复连接 -let connectCallBack= null; -let messageCallBack = null; -let closeCallBack = null - - -let connect = (wsurl,accessToken) => { - try { - if (isConnect) { - return; - } - console.log("连接WebSocket"); - websock = new WebSocket(wsurl); - websock.onmessage = function(e) { - let sendInfo = JSON.parse(e.data) - if (sendInfo.cmd == 0) { - heartCheck.start() - // 登录成功才算真正完成连接 - connectCallBack && connectCallBack(); - console.log('WebSocket登录成功') - } else if (sendInfo.cmd == 1) { - // 重新开启心跳定时 - heartCheck.reset(); - } else { - // 其他消息转发出去 - console.log("收到消息:",sendInfo); - messageCallBack && messageCallBack(sendInfo.cmd, sendInfo.data) - } - } - websock.onclose = function(e) { - console.log('WebSocket连接关闭') - isConnect = false; //断开后修改标识 - closeCallBack && closeCallBack(e); - } - websock.onopen = function() { - console.log("WebSocket连接成功"); - isConnect = true; - // 发送登录命令 - let loginInfo = { - cmd: 0, - data: { - accessToken: accessToken - } - }; - websock.send(JSON.stringify(loginInfo)); - } - - // 连接发生错误的回调方法 - websock.onerror = function() { - console.log('WebSocket连接发生错误') - isConnect = false; //连接断开修改标识 - reconnect(wsurl,accessToken); - } - } catch (e) { - console.log("尝试创建连接失败"); - reconnect(wsurl,accessToken); //如果无法连接上webSocket 那么重新连接!可能会因为服务器重新部署,或者短暂断网等导致无法创建连接 - } -}; - -//定义重连函数 -let reconnect = (wsurl,accessToken) => { - console.log("尝试重新连接"); - if (isConnect){ - //如果已经连上就不在重连了 - return; - } - rec && clearTimeout(rec); - rec = setTimeout(function() { // 延迟5秒重连 避免过多次过频繁请求重连 - connect(wsurl,accessToken); - }, 15000); -}; -//设置关闭连接 -let close = (code) => { - websock && websock.close(code); -}; - - -//心跳设置 -let heartCheck = { - timeout: 5000, //每段时间发送一次心跳包 这里设置为20s - timeoutObj: null, //延时发送消息对象(启动心跳新建这个对象,收到消息后重置对象) - start: function() { - if (isConnect) { - console.log('发送WebSocket心跳') - let heartBeat = { - cmd: 1, - data: {} - }; - websock.send(JSON.stringify(heartBeat)) - } - }, - - reset: function() { - clearTimeout(this.timeoutObj); - this.timeoutObj = setTimeout(function() { - heartCheck.start(); - }, this.timeout); - - } -}; - - - -// 实际调用的方法 -let sendMessage = (agentData) => { - if (websock.readyState === websock.OPEN) { - // 若是ws开启状态 - websock.send(JSON.stringify(agentData)) - } else if (websock.readyState === websock.CONNECTING) { - // 若是 正在开启状态,则等待1s后重新调用 - setTimeout(function() { - sendMessage(agentData) - }, 1000) - } else { - // 若未开启 ,则等待1s后重新调用 - setTimeout(function() { - sendMessage(agentData) - }, 1000) - } -} - -let onConnect = (callback) => { - connectCallBack = callback; -} - -let onMessage = (callback) => { - messageCallBack = callback; -} - - -let onClose = (callback) => { - closeCallBack = callback; -} -// 将方法暴露出去 -export { - connect, - reconnect, - close, - sendMessage, - onConnect, - onMessage, - onClose, -} +var websock = null; +let rec; //断线重连后,延迟5秒重新创建WebSocket连接 rec用来存储延迟请求的代码 +let isConnect = false; //连接标识 避免重复连接 +let connectCallBack= null; +let messageCallBack = null; +let closeCallBack = null + + +let connect = (wsurl,accessToken) => { + try { + if (isConnect) { + return; + } + console.log("连接WebSocket"); + websock = new WebSocket(wsurl); + websock.onmessage = function(e) { + let sendInfo = JSON.parse(e.data) + if (sendInfo.cmd == 0) { + heartCheck.start() + // 登录成功才算真正完成连接 + connectCallBack && connectCallBack(); + console.log('WebSocket登录成功') + } else if (sendInfo.cmd == 1) { + // 重新开启心跳定时 + heartCheck.reset(); + } else { + // 其他消息转发出去 + console.log("收到消息:",sendInfo); + messageCallBack && messageCallBack(sendInfo.cmd, sendInfo.data) + } + } + websock.onclose = function(e) { + console.log('WebSocket连接关闭') + isConnect = false; //断开后修改标识 + closeCallBack && closeCallBack(e); + } + websock.onopen = function() { + console.log("WebSocket连接成功"); + isConnect = true; + // 发送登录命令 + let loginInfo = { + cmd: 0, + data: { + accessToken: accessToken + } + }; + websock.send(JSON.stringify(loginInfo)); + } + + // 连接发生错误的回调方法 + websock.onerror = function() { + console.log('WebSocket连接发生错误') + isConnect = false; //连接断开修改标识 + reconnect(wsurl,accessToken); + } + } catch (e) { + console.log("尝试创建连接失败"); + reconnect(wsurl,accessToken); //如果无法连接上webSocket 那么重新连接!可能会因为服务器重新部署,或者短暂断网等导致无法创建连接 + } +}; + +//定义重连函数 +let reconnect = (wsurl,accessToken) => { + console.log("尝试重新连接"); + if (isConnect){ + //如果已经连上就不在重连了 + return; + } + rec && clearTimeout(rec); + rec = setTimeout(function() { // 延迟5秒重连 避免过多次过频繁请求重连 + connect(wsurl,accessToken); + }, 15000); +}; +//设置关闭连接 +let close = (code) => { + websock && websock.close(code); +}; + + +//心跳设置 +let heartCheck = { + timeout: 5000, //每段时间发送一次心跳包 这里设置为20s + timeoutObj: null, //延时发送消息对象(启动心跳新建这个对象,收到消息后重置对象) + start: function() { + if (isConnect) { + console.log('发送WebSocket心跳') + let heartBeat = { + cmd: 1, + data: {} + }; + websock.send(JSON.stringify(heartBeat)) + } + }, + + reset: function() { + clearTimeout(this.timeoutObj); + this.timeoutObj = setTimeout(function() { + heartCheck.start(); + }, this.timeout); + + } +}; + + + +// 实际调用的方法 +let sendMessage = (agentData) => { + if (websock.readyState === websock.OPEN) { + // 若是ws开启状态 + websock.send(JSON.stringify(agentData)) + } else if (websock.readyState === websock.CONNECTING) { + // 若是 正在开启状态,则等待1s后重新调用 + setTimeout(function() { + sendMessage(agentData) + }, 1000) + } else { + // 若未开启 ,则等待1s后重新调用 + setTimeout(function() { + sendMessage(agentData) + }, 1000) + } +} + +let onConnect = (callback) => { + connectCallBack = callback; +} + +let onMessage = (callback) => { + messageCallBack = callback; +} + + +let onClose = (callback) => { + closeCallBack = callback; +} +// 将方法暴露出去 +export { + connect, + reconnect, + close, + sendMessage, + onConnect, + onMessage, + onClose, +} diff --git a/im-ui/src/assets/audio/call.wav b/im-web/src/assets/audio/call.wav similarity index 100% rename from im-ui/src/assets/audio/call.wav rename to im-web/src/assets/audio/call.wav diff --git a/im-ui/src/assets/audio/tip.wav b/im-web/src/assets/audio/tip.wav similarity index 100% rename from im-ui/src/assets/audio/tip.wav rename to im-web/src/assets/audio/tip.wav diff --git a/im-ui/src/assets/emoji/0.gif b/im-web/src/assets/emoji/0.gif similarity index 100% rename from im-ui/src/assets/emoji/0.gif rename to im-web/src/assets/emoji/0.gif diff --git a/im-ui/src/assets/emoji/1.gif b/im-web/src/assets/emoji/1.gif similarity index 100% rename from im-ui/src/assets/emoji/1.gif rename to im-web/src/assets/emoji/1.gif diff --git a/im-ui/src/assets/emoji/10.gif b/im-web/src/assets/emoji/10.gif similarity index 100% rename from im-ui/src/assets/emoji/10.gif rename to im-web/src/assets/emoji/10.gif diff --git a/im-ui/src/assets/emoji/11.gif b/im-web/src/assets/emoji/11.gif similarity index 100% rename from im-ui/src/assets/emoji/11.gif rename to im-web/src/assets/emoji/11.gif diff --git a/im-ui/src/assets/emoji/12.gif b/im-web/src/assets/emoji/12.gif similarity index 100% rename from im-ui/src/assets/emoji/12.gif rename to im-web/src/assets/emoji/12.gif diff --git a/im-ui/src/assets/emoji/13.gif b/im-web/src/assets/emoji/13.gif similarity index 100% rename from im-ui/src/assets/emoji/13.gif rename to im-web/src/assets/emoji/13.gif diff --git a/im-ui/src/assets/emoji/14.gif b/im-web/src/assets/emoji/14.gif similarity index 100% rename from im-ui/src/assets/emoji/14.gif rename to im-web/src/assets/emoji/14.gif diff --git a/im-ui/src/assets/emoji/15.gif b/im-web/src/assets/emoji/15.gif similarity index 100% rename from im-ui/src/assets/emoji/15.gif rename to im-web/src/assets/emoji/15.gif diff --git a/im-ui/src/assets/emoji/16.gif b/im-web/src/assets/emoji/16.gif similarity index 100% rename from im-ui/src/assets/emoji/16.gif rename to im-web/src/assets/emoji/16.gif diff --git a/im-ui/src/assets/emoji/17.gif b/im-web/src/assets/emoji/17.gif similarity index 100% rename from im-ui/src/assets/emoji/17.gif rename to im-web/src/assets/emoji/17.gif diff --git a/im-ui/src/assets/emoji/18.gif b/im-web/src/assets/emoji/18.gif similarity index 100% rename from im-ui/src/assets/emoji/18.gif rename to im-web/src/assets/emoji/18.gif diff --git a/im-ui/src/assets/emoji/19.gif b/im-web/src/assets/emoji/19.gif similarity index 100% rename from im-ui/src/assets/emoji/19.gif rename to im-web/src/assets/emoji/19.gif diff --git a/im-ui/src/assets/emoji/2.gif b/im-web/src/assets/emoji/2.gif similarity index 100% rename from im-ui/src/assets/emoji/2.gif rename to im-web/src/assets/emoji/2.gif diff --git a/im-ui/src/assets/emoji/20.gif b/im-web/src/assets/emoji/20.gif similarity index 100% rename from im-ui/src/assets/emoji/20.gif rename to im-web/src/assets/emoji/20.gif diff --git a/im-ui/src/assets/emoji/21.gif b/im-web/src/assets/emoji/21.gif similarity index 100% rename from im-ui/src/assets/emoji/21.gif rename to im-web/src/assets/emoji/21.gif diff --git a/im-ui/src/assets/emoji/22.gif b/im-web/src/assets/emoji/22.gif similarity index 100% rename from im-ui/src/assets/emoji/22.gif rename to im-web/src/assets/emoji/22.gif diff --git a/im-ui/src/assets/emoji/23.gif b/im-web/src/assets/emoji/23.gif similarity index 100% rename from im-ui/src/assets/emoji/23.gif rename to im-web/src/assets/emoji/23.gif diff --git a/im-ui/src/assets/emoji/24.gif b/im-web/src/assets/emoji/24.gif similarity index 100% rename from im-ui/src/assets/emoji/24.gif rename to im-web/src/assets/emoji/24.gif diff --git a/im-ui/src/assets/emoji/25.gif b/im-web/src/assets/emoji/25.gif similarity index 100% rename from im-ui/src/assets/emoji/25.gif rename to im-web/src/assets/emoji/25.gif diff --git a/im-ui/src/assets/emoji/26.gif b/im-web/src/assets/emoji/26.gif similarity index 100% rename from im-ui/src/assets/emoji/26.gif rename to im-web/src/assets/emoji/26.gif diff --git a/im-ui/src/assets/emoji/27.gif b/im-web/src/assets/emoji/27.gif similarity index 100% rename from im-ui/src/assets/emoji/27.gif rename to im-web/src/assets/emoji/27.gif diff --git a/im-ui/src/assets/emoji/28.gif b/im-web/src/assets/emoji/28.gif similarity index 100% rename from im-ui/src/assets/emoji/28.gif rename to im-web/src/assets/emoji/28.gif diff --git a/im-ui/src/assets/emoji/29.gif b/im-web/src/assets/emoji/29.gif similarity index 100% rename from im-ui/src/assets/emoji/29.gif rename to im-web/src/assets/emoji/29.gif diff --git a/im-ui/src/assets/emoji/3.gif b/im-web/src/assets/emoji/3.gif similarity index 100% rename from im-ui/src/assets/emoji/3.gif rename to im-web/src/assets/emoji/3.gif diff --git a/im-ui/src/assets/emoji/30.gif b/im-web/src/assets/emoji/30.gif similarity index 100% rename from im-ui/src/assets/emoji/30.gif rename to im-web/src/assets/emoji/30.gif diff --git a/im-ui/src/assets/emoji/31.gif b/im-web/src/assets/emoji/31.gif similarity index 100% rename from im-ui/src/assets/emoji/31.gif rename to im-web/src/assets/emoji/31.gif diff --git a/im-ui/src/assets/emoji/32.gif b/im-web/src/assets/emoji/32.gif similarity index 100% rename from im-ui/src/assets/emoji/32.gif rename to im-web/src/assets/emoji/32.gif diff --git a/im-ui/src/assets/emoji/33.gif b/im-web/src/assets/emoji/33.gif similarity index 100% rename from im-ui/src/assets/emoji/33.gif rename to im-web/src/assets/emoji/33.gif diff --git a/im-ui/src/assets/emoji/34.gif b/im-web/src/assets/emoji/34.gif similarity index 100% rename from im-ui/src/assets/emoji/34.gif rename to im-web/src/assets/emoji/34.gif diff --git a/im-ui/src/assets/emoji/35.gif b/im-web/src/assets/emoji/35.gif similarity index 100% rename from im-ui/src/assets/emoji/35.gif rename to im-web/src/assets/emoji/35.gif diff --git a/im-ui/src/assets/emoji/36.gif b/im-web/src/assets/emoji/36.gif similarity index 100% rename from im-ui/src/assets/emoji/36.gif rename to im-web/src/assets/emoji/36.gif diff --git a/im-ui/src/assets/emoji/37.gif b/im-web/src/assets/emoji/37.gif similarity index 100% rename from im-ui/src/assets/emoji/37.gif rename to im-web/src/assets/emoji/37.gif diff --git a/im-ui/src/assets/emoji/38.gif b/im-web/src/assets/emoji/38.gif similarity index 100% rename from im-ui/src/assets/emoji/38.gif rename to im-web/src/assets/emoji/38.gif diff --git a/im-ui/src/assets/emoji/39.gif b/im-web/src/assets/emoji/39.gif similarity index 100% rename from im-ui/src/assets/emoji/39.gif rename to im-web/src/assets/emoji/39.gif diff --git a/im-ui/src/assets/emoji/4.gif b/im-web/src/assets/emoji/4.gif similarity index 100% rename from im-ui/src/assets/emoji/4.gif rename to im-web/src/assets/emoji/4.gif diff --git a/im-ui/src/assets/emoji/40.gif b/im-web/src/assets/emoji/40.gif similarity index 100% rename from im-ui/src/assets/emoji/40.gif rename to im-web/src/assets/emoji/40.gif diff --git a/im-ui/src/assets/emoji/41.gif b/im-web/src/assets/emoji/41.gif similarity index 100% rename from im-ui/src/assets/emoji/41.gif rename to im-web/src/assets/emoji/41.gif diff --git a/im-ui/src/assets/emoji/42.gif b/im-web/src/assets/emoji/42.gif similarity index 100% rename from im-ui/src/assets/emoji/42.gif rename to im-web/src/assets/emoji/42.gif diff --git a/im-ui/src/assets/emoji/43.gif b/im-web/src/assets/emoji/43.gif similarity index 100% rename from im-ui/src/assets/emoji/43.gif rename to im-web/src/assets/emoji/43.gif diff --git a/im-ui/src/assets/emoji/44.gif b/im-web/src/assets/emoji/44.gif similarity index 100% rename from im-ui/src/assets/emoji/44.gif rename to im-web/src/assets/emoji/44.gif diff --git a/im-ui/src/assets/emoji/45.gif b/im-web/src/assets/emoji/45.gif similarity index 100% rename from im-ui/src/assets/emoji/45.gif rename to im-web/src/assets/emoji/45.gif diff --git a/im-ui/src/assets/emoji/46.gif b/im-web/src/assets/emoji/46.gif similarity index 100% rename from im-ui/src/assets/emoji/46.gif rename to im-web/src/assets/emoji/46.gif diff --git a/im-ui/src/assets/emoji/47.gif b/im-web/src/assets/emoji/47.gif similarity index 100% rename from im-ui/src/assets/emoji/47.gif rename to im-web/src/assets/emoji/47.gif diff --git a/im-ui/src/assets/emoji/48.gif b/im-web/src/assets/emoji/48.gif similarity index 100% rename from im-ui/src/assets/emoji/48.gif rename to im-web/src/assets/emoji/48.gif diff --git a/im-ui/src/assets/emoji/49.gif b/im-web/src/assets/emoji/49.gif similarity index 100% rename from im-ui/src/assets/emoji/49.gif rename to im-web/src/assets/emoji/49.gif diff --git a/im-ui/src/assets/emoji/5.gif b/im-web/src/assets/emoji/5.gif similarity index 100% rename from im-ui/src/assets/emoji/5.gif rename to im-web/src/assets/emoji/5.gif diff --git a/im-ui/src/assets/emoji/50.gif b/im-web/src/assets/emoji/50.gif similarity index 100% rename from im-ui/src/assets/emoji/50.gif rename to im-web/src/assets/emoji/50.gif diff --git a/im-ui/src/assets/emoji/51.gif b/im-web/src/assets/emoji/51.gif similarity index 100% rename from im-ui/src/assets/emoji/51.gif rename to im-web/src/assets/emoji/51.gif diff --git a/im-ui/src/assets/emoji/52.gif b/im-web/src/assets/emoji/52.gif similarity index 100% rename from im-ui/src/assets/emoji/52.gif rename to im-web/src/assets/emoji/52.gif diff --git a/im-ui/src/assets/emoji/53.gif b/im-web/src/assets/emoji/53.gif similarity index 100% rename from im-ui/src/assets/emoji/53.gif rename to im-web/src/assets/emoji/53.gif diff --git a/im-ui/src/assets/emoji/54.gif b/im-web/src/assets/emoji/54.gif similarity index 100% rename from im-ui/src/assets/emoji/54.gif rename to im-web/src/assets/emoji/54.gif diff --git a/im-ui/src/assets/emoji/55.gif b/im-web/src/assets/emoji/55.gif similarity index 100% rename from im-ui/src/assets/emoji/55.gif rename to im-web/src/assets/emoji/55.gif diff --git a/im-ui/src/assets/emoji/56.gif b/im-web/src/assets/emoji/56.gif similarity index 100% rename from im-ui/src/assets/emoji/56.gif rename to im-web/src/assets/emoji/56.gif diff --git a/im-ui/src/assets/emoji/6.gif b/im-web/src/assets/emoji/6.gif similarity index 100% rename from im-ui/src/assets/emoji/6.gif rename to im-web/src/assets/emoji/6.gif diff --git a/im-ui/src/assets/emoji/7.gif b/im-web/src/assets/emoji/7.gif similarity index 100% rename from im-ui/src/assets/emoji/7.gif rename to im-web/src/assets/emoji/7.gif diff --git a/im-ui/src/assets/emoji/8.gif b/im-web/src/assets/emoji/8.gif similarity index 100% rename from im-ui/src/assets/emoji/8.gif rename to im-web/src/assets/emoji/8.gif diff --git a/im-ui/src/assets/emoji/9.gif b/im-web/src/assets/emoji/9.gif similarity index 100% rename from im-ui/src/assets/emoji/9.gif rename to im-web/src/assets/emoji/9.gif diff --git a/im-ui/src/assets/iconfont/iconfont.css b/im-web/src/assets/iconfont/iconfont.css similarity index 100% rename from im-ui/src/assets/iconfont/iconfont.css rename to im-web/src/assets/iconfont/iconfont.css diff --git a/im-ui/src/assets/iconfont/iconfont.ttf b/im-web/src/assets/iconfont/iconfont.ttf similarity index 100% rename from im-ui/src/assets/iconfont/iconfont.ttf rename to im-web/src/assets/iconfont/iconfont.ttf diff --git a/im-ui/src/assets/image/icp_logo.png b/im-web/src/assets/image/icp_logo.png similarity index 100% rename from im-ui/src/assets/image/icp_logo.png rename to im-web/src/assets/image/icp_logo.png diff --git a/im-ui/src/assets/image/online_app.png b/im-web/src/assets/image/online_app.png similarity index 100% rename from im-ui/src/assets/image/online_app.png rename to im-web/src/assets/image/online_app.png diff --git a/im-ui/src/assets/image/online_web.png b/im-web/src/assets/image/online_web.png similarity index 100% rename from im-ui/src/assets/image/online_web.png rename to im-web/src/assets/image/online_web.png diff --git a/im-ui/src/assets/style/global.css b/im-web/src/assets/style/global.css similarity index 93% rename from im-ui/src/assets/style/global.css rename to im-web/src/assets/style/global.css index fc63060..ce8be83 100644 --- a/im-ui/src/assets/style/global.css +++ b/im-web/src/assets/style/global.css @@ -1,43 +1,43 @@ -@charset "UTF-8"; - -html { - height: 100%; - overflow: hidden; - -} - -body { - height: 100%; - margin: 0; - overflow: hidden; - -} - -section { - height: 100%; -} - -.el-dialog__body{ - padding: 10px 15px !important; -} - -::-webkit-scrollbar { - width: 6px; - height: 1px; -} - -::-webkit-scrollbar-thumb { - /*滚动条里面小方块*/ - border-radius: 2px; - -webkit-box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2); - background: #535353; -} - -::-webkit-scrollbar-track { - /*滚动条里面轨道*/ - -webkit-box-shadow: inset 0 0 5px transparent; - border-radius: 2px; - background: #ededed; -} - -/*# sourceMappingURL=v-im.cssss.map */ +@charset "UTF-8"; + +html { + height: 100%; + overflow: hidden; + +} + +body { + height: 100%; + margin: 0; + overflow: hidden; + +} + +section { + height: 100%; +} + +.el-dialog__body{ + padding: 10px 15px !important; +} + +::-webkit-scrollbar { + width: 6px; + height: 1px; +} + +::-webkit-scrollbar-thumb { + /*滚动条里面小方块*/ + border-radius: 2px; + -webkit-box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2); + background: #535353; +} + +::-webkit-scrollbar-track { + /*滚动条里面轨道*/ + -webkit-box-shadow: inset 0 0 5px transparent; + border-radius: 2px; + background: #ededed; +} + +/*# sourceMappingURL=v-im.cssss.map */ diff --git a/im-ui/src/components/chat/ChatAtBox.vue b/im-web/src/components/chat/ChatAtBox.vue similarity index 100% rename from im-ui/src/components/chat/ChatAtBox.vue rename to im-web/src/components/chat/ChatAtBox.vue diff --git a/im-ui/src/components/chat/ChatBox.vue b/im-web/src/components/chat/ChatBox.vue similarity index 100% rename from im-ui/src/components/chat/ChatBox.vue rename to im-web/src/components/chat/ChatBox.vue diff --git a/im-ui/src/components/chat/ChatGroupMember.vue b/im-web/src/components/chat/ChatGroupMember.vue similarity index 100% rename from im-ui/src/components/chat/ChatGroupMember.vue rename to im-web/src/components/chat/ChatGroupMember.vue diff --git a/im-ui/src/components/chat/ChatGroupReaded.vue b/im-web/src/components/chat/ChatGroupReaded.vue similarity index 100% rename from im-ui/src/components/chat/ChatGroupReaded.vue rename to im-web/src/components/chat/ChatGroupReaded.vue diff --git a/im-ui/src/components/chat/ChatGroupSide.vue b/im-web/src/components/chat/ChatGroupSide.vue similarity index 100% rename from im-ui/src/components/chat/ChatGroupSide.vue rename to im-web/src/components/chat/ChatGroupSide.vue diff --git a/im-ui/src/components/chat/ChatHistory.vue b/im-web/src/components/chat/ChatHistory.vue similarity index 100% rename from im-ui/src/components/chat/ChatHistory.vue rename to im-web/src/components/chat/ChatHistory.vue diff --git a/im-ui/src/components/chat/ChatItem.vue b/im-web/src/components/chat/ChatItem.vue similarity index 100% rename from im-ui/src/components/chat/ChatItem.vue rename to im-web/src/components/chat/ChatItem.vue diff --git a/im-ui/src/components/chat/ChatMessageItem.vue b/im-web/src/components/chat/ChatMessageItem.vue similarity index 100% rename from im-ui/src/components/chat/ChatMessageItem.vue rename to im-web/src/components/chat/ChatMessageItem.vue diff --git a/im-ui/src/components/chat/ChatRecord.vue b/im-web/src/components/chat/ChatRecord.vue similarity index 100% rename from im-ui/src/components/chat/ChatRecord.vue rename to im-web/src/components/chat/ChatRecord.vue diff --git a/im-ui/src/components/common/Emotion.vue b/im-web/src/components/common/Emotion.vue similarity index 100% rename from im-ui/src/components/common/Emotion.vue rename to im-web/src/components/common/Emotion.vue diff --git a/im-ui/src/components/common/FileUpload.vue b/im-web/src/components/common/FileUpload.vue similarity index 100% rename from im-ui/src/components/common/FileUpload.vue rename to im-web/src/components/common/FileUpload.vue diff --git a/im-ui/src/components/common/FullImage.vue b/im-web/src/components/common/FullImage.vue similarity index 100% rename from im-ui/src/components/common/FullImage.vue rename to im-web/src/components/common/FullImage.vue diff --git a/im-ui/src/components/common/HeadImage.vue b/im-web/src/components/common/HeadImage.vue similarity index 100% rename from im-ui/src/components/common/HeadImage.vue rename to im-web/src/components/common/HeadImage.vue diff --git a/im-ui/src/components/common/Icp.vue b/im-web/src/components/common/Icp.vue similarity index 100% rename from im-ui/src/components/common/Icp.vue rename to im-web/src/components/common/Icp.vue diff --git a/im-ui/src/components/common/RightMenu.vue b/im-web/src/components/common/RightMenu.vue similarity index 100% rename from im-ui/src/components/common/RightMenu.vue rename to im-web/src/components/common/RightMenu.vue diff --git a/im-ui/src/components/common/UserInfo.vue b/im-web/src/components/common/UserInfo.vue similarity index 100% rename from im-ui/src/components/common/UserInfo.vue rename to im-web/src/components/common/UserInfo.vue diff --git a/im-ui/src/components/friend/AddFriend.vue b/im-web/src/components/friend/AddFriend.vue similarity index 100% rename from im-ui/src/components/friend/AddFriend.vue rename to im-web/src/components/friend/AddFriend.vue diff --git a/im-ui/src/components/friend/FriendItem.vue b/im-web/src/components/friend/FriendItem.vue similarity index 100% rename from im-ui/src/components/friend/FriendItem.vue rename to im-web/src/components/friend/FriendItem.vue diff --git a/im-ui/src/components/group/AddGroupMember.vue b/im-web/src/components/group/AddGroupMember.vue similarity index 100% rename from im-ui/src/components/group/AddGroupMember.vue rename to im-web/src/components/group/AddGroupMember.vue diff --git a/im-ui/src/components/group/GroupItem.vue b/im-web/src/components/group/GroupItem.vue similarity index 100% rename from im-ui/src/components/group/GroupItem.vue rename to im-web/src/components/group/GroupItem.vue diff --git a/im-ui/src/components/group/GroupMember.vue b/im-web/src/components/group/GroupMember.vue similarity index 100% rename from im-ui/src/components/group/GroupMember.vue rename to im-web/src/components/group/GroupMember.vue diff --git a/im-ui/src/components/group/GroupMemberItem.vue b/im-web/src/components/group/GroupMemberItem.vue similarity index 100% rename from im-ui/src/components/group/GroupMemberItem.vue rename to im-web/src/components/group/GroupMemberItem.vue diff --git a/im-ui/src/components/group/GroupMemberSelector.vue b/im-web/src/components/group/GroupMemberSelector.vue similarity index 100% rename from im-ui/src/components/group/GroupMemberSelector.vue rename to im-web/src/components/group/GroupMemberSelector.vue diff --git a/im-ui/src/components/rtc/RtcGroupJoin.vue b/im-web/src/components/rtc/RtcGroupJoin.vue similarity index 100% rename from im-ui/src/components/rtc/RtcGroupJoin.vue rename to im-web/src/components/rtc/RtcGroupJoin.vue diff --git a/im-ui/src/components/rtc/RtcGroupVideo.vue b/im-web/src/components/rtc/RtcGroupVideo.vue similarity index 100% rename from im-ui/src/components/rtc/RtcGroupVideo.vue rename to im-web/src/components/rtc/RtcGroupVideo.vue diff --git a/im-ui/src/components/rtc/RtcPrivateAcceptor.vue b/im-web/src/components/rtc/RtcPrivateAcceptor.vue similarity index 100% rename from im-ui/src/components/rtc/RtcPrivateAcceptor.vue rename to im-web/src/components/rtc/RtcPrivateAcceptor.vue diff --git a/im-ui/src/components/rtc/RtcPrivateVideo.vue b/im-web/src/components/rtc/RtcPrivateVideo.vue similarity index 100% rename from im-ui/src/components/rtc/RtcPrivateVideo.vue rename to im-web/src/components/rtc/RtcPrivateVideo.vue diff --git a/im-ui/src/components/setting/Setting.vue b/im-web/src/components/setting/Setting.vue similarity index 100% rename from im-ui/src/components/setting/Setting.vue rename to im-web/src/components/setting/Setting.vue diff --git a/im-ui/src/main.js b/im-web/src/main.js similarity index 96% rename from im-ui/src/main.js rename to im-web/src/main.js index cf6411c..f10f109 100644 --- a/im-ui/src/main.js +++ b/im-web/src/main.js @@ -1,35 +1,35 @@ -import Vue from 'vue' -import App from './App' -import router from './router' -import ElementUI from 'element-ui'; -import 'element-ui/lib/theme-chalk/index.css'; -import './assets/iconfont/iconfont.css'; -import httpRequest from './api/httpRequest'; -import * as socketApi from './api/wssocket'; -import * as messageType from './api/messageType'; -import emotion from './api/emotion.js'; -import element from './api/element.js'; -import store from './store'; -import * as enums from './api/enums.js'; -import * as date from './api/date.js'; -import './utils/directive/dialogDrag'; - -Vue.use(ElementUI); -// 挂载全局 -Vue.prototype.$wsApi = socketApi; -Vue.prototype.$msgType = messageType -Vue.prototype.$date = date; -Vue.prototype.$http = httpRequest // http请求方法 -Vue.prototype.$emo = emotion; // emo表情 -Vue.prototype.$elm = element; // 元素操作 -Vue.prototype.$enums = enums; // 枚举 -Vue.prototype.$eventBus = new Vue(); // 全局事件 -Vue.config.productionTip = false; - -new Vue({ - el: '#app', - // 配置路由 - router, - store, - render: h=>h(App) -}) +import Vue from 'vue' +import App from './App' +import router from './router' +import ElementUI from 'element-ui'; +import 'element-ui/lib/theme-chalk/index.css'; +import './assets/iconfont/iconfont.css'; +import httpRequest from './api/httpRequest'; +import * as socketApi from './api/wssocket'; +import * as messageType from './api/messageType'; +import emotion from './api/emotion.js'; +import element from './api/element.js'; +import store from './store'; +import * as enums from './api/enums.js'; +import * as date from './api/date.js'; +import './utils/directive/dialogDrag'; + +Vue.use(ElementUI); +// 挂载全局 +Vue.prototype.$wsApi = socketApi; +Vue.prototype.$msgType = messageType +Vue.prototype.$date = date; +Vue.prototype.$http = httpRequest // http请求方法 +Vue.prototype.$emo = emotion; // emo表情 +Vue.prototype.$elm = element; // 元素操作 +Vue.prototype.$enums = enums; // 枚举 +Vue.prototype.$eventBus = new Vue(); // 全局事件 +Vue.config.productionTip = false; + +new Vue({ + el: '#app', + // 配置路由 + router, + store, + render: h=>h(App) +}) diff --git a/im-ui/src/router/index.js b/im-web/src/router/index.js similarity index 94% rename from im-ui/src/router/index.js rename to im-web/src/router/index.js index 0925f66..632d307 100644 --- a/im-ui/src/router/index.js +++ b/im-web/src/router/index.js @@ -1,49 +1,49 @@ -import Vue from 'vue' -import VueRouter from 'vue-router' -import Login from '../view/Login' -import Register from '../view/Register' -import Home from '../view/Home' -// 安装路由 -Vue.use(VueRouter); - -// 配置导出路由 -export default new VueRouter({ - routes: [{ - path: "/", - redirect: "/login" - }, - { - name: "Login", - path: '/login', - component: Login - }, - { - name: "Register", - path: '/register', - component: Register - }, - { - name: "Home", - path: '/home', - component: Home, - children:[ - { - name: "Chat", - path: "/home/chat", - component: () => import("../view/Chat"), - }, - { - name: "Friends", - path: "/home/friend", - component: () => import("../view/Friend"), - }, - { - name: "Friends", - path: "/home/group", - component: () => import("../view/Group"), - } - ] - } - ] - -}); +import Vue from 'vue' +import VueRouter from 'vue-router' +import Login from '../view/Login' +import Register from '../view/Register' +import Home from '../view/Home' +// 安装路由 +Vue.use(VueRouter); + +// 配置导出路由 +export default new VueRouter({ + routes: [{ + path: "/", + redirect: "/login" + }, + { + name: "Login", + path: '/login', + component: Login + }, + { + name: "Register", + path: '/register', + component: Register + }, + { + name: "Home", + path: '/home', + component: Home, + children:[ + { + name: "Chat", + path: "/home/chat", + component: () => import("../view/Chat"), + }, + { + name: "Friends", + path: "/home/friend", + component: () => import("../view/Friend"), + }, + { + name: "Friends", + path: "/home/group", + component: () => import("../view/Group"), + } + ] + } + ] + +}); diff --git a/im-ui/src/ssl/cert.crt b/im-web/src/ssl/cert.crt similarity index 100% rename from im-ui/src/ssl/cert.crt rename to im-web/src/ssl/cert.crt diff --git a/im-ui/src/ssl/cert.key b/im-web/src/ssl/cert.key similarity index 100% rename from im-ui/src/ssl/cert.key rename to im-web/src/ssl/cert.key diff --git a/im-ui/src/store/chatStore.js b/im-web/src/store/chatStore.js similarity index 96% rename from im-ui/src/store/chatStore.js rename to im-web/src/store/chatStore.js index 5fbdccf..826c2db 100644 --- a/im-ui/src/store/chatStore.js +++ b/im-web/src/store/chatStore.js @@ -1,369 +1,369 @@ -import { MESSAGE_TYPE, MESSAGE_STATUS } from "../api/enums.js" -import userStore from './userStore'; -import localForage from 'localforage'; - -/* 为了加速拉取离线消息效率,拉取时消息暂时存储到cacheChats,等 -待所有离线消息拉取完成后,再统一放至vuex中进行渲染*/ -let cacheChats = []; - -export default { - state: { - activeChat: null, - privateMsgMaxId: 0, - groupMsgMaxId: 0, - loadingPrivateMsg: false, - loadingGroupMsg: false, - chats: [] - }, - - mutations: { - initChats(state, chatsData) { - state.chats = []; - state.privateMsgMaxId = chatsData.privateMsgMaxId || 0; - state.groupMsgMaxId = chatsData.groupMsgMaxId || 0; - cacheChats = chatsData.chats||[]; - // 防止图片一直处在加载中状态 - cacheChats.forEach((chat) => { - chat.messages.forEach((msg) => { - if (msg.loadStatus == "loading") { - msg.loadStatus = "fail" - } - }) - }) - }, - openChat(state, chatInfo) { - let chats = this.getters.findChats() - let chat = null; - for (let idx in chats) { - if (chats[idx].type == chatInfo.type && - chats[idx].targetId === chatInfo.targetId) { - chat = chats[idx]; - // 放置头部 - this.commit("moveTop", idx) - break; - } - } - // 创建会话 - if (chat == null) { - chat = { - targetId: chatInfo.targetId, - type: chatInfo.type, - showName: chatInfo.showName, - headImage: chatInfo.headImage, - lastContent: "", - lastSendTime: new Date().getTime(), - unreadCount: 0, - messages: [], - atMe: false, - atAll: false - }; - chats.unshift(chat); - } - }, - activeChat(state, idx) { - let chats = this.getters.findChats(); - state.activeChat = chats[idx]; - }, - resetUnreadCount(state, chatInfo) { - let chats = this.getters.findChats(); - for (let idx in chats) { - if (chats[idx].type == chatInfo.type && - chats[idx].targetId == chatInfo.targetId) { - chats[idx].unreadCount = 0; - chats[idx].atMe = false; - chats[idx].atAll = false; - } - } - this.commit("saveToStorage"); - }, - readedMessage(state, pos) { - let chats = this.getters.findChats(); - for (let idx in chats) { - if (chats[idx].type == 'PRIVATE' && - chats[idx].targetId == pos.friendId) { - chats[idx].messages.forEach((m) => { - if (m.selfSend && m.status != MESSAGE_STATUS.RECALL) { - // pos.maxId为空表示整个会话已读 - if (!pos.maxId || m.id <= pos.maxId) { - m.status = MESSAGE_STATUS.READED - } - - } - }) - } - } - this.commit("saveToStorage"); - }, - removeChat(state, idx) { - let chats = this.getters.findChats(); - if (chats[idx] == state.activeChat) { - state.activeChat = null; - } - chats.splice(idx, 1); - this.commit("saveToStorage"); - }, - moveTop(state, idx) { - // 加载中不移动,很耗性能 - if (this.getters.isLoading()) { - return; - } - if (idx > 0) { - let chats = this.getters.findChats(); - let chat = chats[idx]; - chats.splice(idx, 1); - chats.unshift(chat); - this.commit("saveToStorage"); - } - }, - removePrivateChat(state, friendId) { - let chats = this.getters.findChats(); - for (let idx in chats) { - if (chats[idx].type == 'PRIVATE' && - chats[idx].targetId == friendId) { - this.commit("removeChat", idx); - } - } - }, - insertMessage(state, msgInfo) { - let type = msgInfo.groupId ? 'GROUP' : 'PRIVATE'; - // 记录消息的最大id - if (msgInfo.id && type == "PRIVATE" && msgInfo.id > state.privateMsgMaxId) { - state.privateMsgMaxId = msgInfo.id; - } - if (msgInfo.id && type == "GROUP" && msgInfo.id > state.groupMsgMaxId) { - state.groupMsgMaxId = msgInfo.id; - } - // 如果是已存在消息,则覆盖旧的消息数据 - let chat = this.getters.findChat(msgInfo); - let message = this.getters.findMessage(chat, msgInfo); - if (message) { - Object.assign(message, msgInfo); - // 撤回消息需要显示 - if (msgInfo.type == MESSAGE_TYPE.RECALL) { - chat.lastContent = msgInfo.content; - } - this.commit("saveToStorage"); - return; - } - // 插入新的数据 - if (msgInfo.type == MESSAGE_TYPE.IMAGE) { - chat.lastContent = "[图片]"; - } else if (msgInfo.type == MESSAGE_TYPE.FILE) { - chat.lastContent = "[文件]"; - } else if (msgInfo.type == MESSAGE_TYPE.AUDIO) { - chat.lastContent = "[语音]"; - } else if (msgInfo.type == MESSAGE_TYPE.TEXT || - msgInfo.type == MESSAGE_TYPE.RECALL || - msgInfo.type == MESSAGE_TYPE.TIP_TEXT) { - chat.lastContent = msgInfo.content; - } else if (msgInfo.type == MESSAGE_TYPE.ACT_RT_VOICE) { - chat.lastContent = "[语音通话]"; - } else if (msgInfo.type == MESSAGE_TYPE.ACT_RT_VIDEO) { - chat.lastContent = "[视频通话]"; - } - chat.lastSendTime = msgInfo.sendTime; - chat.sendNickName = msgInfo.sendNickName; - // 未读加1 - if (!msgInfo.selfSend && msgInfo.status != MESSAGE_STATUS.READED && msgInfo.type != MESSAGE_TYPE.TIP_TEXT) { - chat.unreadCount++; - } - // 是否有人@我 - if (!msgInfo.selfSend && chat.type == "GROUP" && msgInfo.atUserIds && - msgInfo.status != MESSAGE_STATUS.READED) { - let userId = userStore.state.userInfo.id; - if (msgInfo.atUserIds.indexOf(userId) >= 0) { - chat.atMe = true; - } - if (msgInfo.atUserIds.indexOf(-1) >= 0) { - chat.atAll = true; - } - } - // 间隔大于10分钟插入时间显示 - if (!chat.lastTimeTip || (chat.lastTimeTip < msgInfo.sendTime - 600 * 1000)) { - chat.messages.push({ - sendTime: msgInfo.sendTime, - type: MESSAGE_TYPE.TIP_TIME, - }); - chat.lastTimeTip = msgInfo.sendTime; - } - // 根据id顺序插入,防止消息乱序 - let insertPos = chat.messages.length; - // 防止 图片、文件 在发送方 显示 在顶端 因为还没存库,id=0 - if (msgInfo.id && msgInfo.id > 0) { - for (let idx in chat.messages) { - if (chat.messages[idx].id && msgInfo.id < chat.messages[idx].id) { - insertPos = idx; - console.log(`消息出现乱序,位置:${chat.messages.length},修正至:${insertPos}`); - break; - } - } - } - chat.messages.splice(insertPos, 0, msgInfo); - this.commit("saveToStorage"); - }, - updateMessage(state, msgInfo) { - // 获取对方id或群id - let chat = this.getters.findChat(msgInfo); - let message = this.getters.findMessage(chat, msgInfo); - if (message) { - // 属性拷贝 - Object.assign(message, msgInfo); - this.commit("saveToStorage"); - } - }, - deleteMessage(state, msgInfo) { - let chat = this.getters.findChat(msgInfo); - for (let idx in chat.messages) { - // 已经发送成功的,根据id删除 - if (chat.messages[idx].id && chat.messages[idx].id == msgInfo.id) { - chat.messages.splice(idx, 1); - break; - } - // 正在发送中的消息可能没有id,根据发送时间删除 - if (msgInfo.selfSend && chat.messages[idx].selfSend && - chat.messages[idx].sendTime == msgInfo.sendTime) { - chat.messages.splice(idx, 1); - break; - } - } - this.commit("saveToStorage"); - }, - updateChatFromFriend(state, friend) { - let chats = this.getters.findChats(); - for (let i in chats) { - let chat = chats[i]; - if (chat.type == 'PRIVATE' && chat.targetId == friend.id) { - chat.headImage = friend.headImageThumb; - chat.showName = friend.nickName; - break; - } - } - this.commit("saveToStorage"); - }, - updateChatFromGroup(state, group) { - let chats = this.getters.findChats(); - for (let i in chats) { - let chat = chats[i]; - if (chat.type == 'GROUP' && chat.targetId == group.id) { - chat.headImage = group.headImageThumb; - chat.showName = group.showGroupName; - break; - } - } - this.commit("saveToStorage"); - }, - loadingPrivateMsg(state, loading) { - state.loadingPrivateMsg = loading; - if (!this.getters.isLoading()) { - this.commit("refreshChats") - } - }, - loadingGroupMsg(state, loading) { - state.loadingGroupMsg = loading; - if (!this.getters.isLoading()) { - this.commit("refreshChats") - } - }, - refreshChats(state) { - // 排序 - cacheChats.sort((chat1, chat2) => { - return chat2.lastSendTime - chat1.lastSendTime; - }); - // 将消息一次性装载回来 - state.chats = cacheChats; - // 断线重连后不能使用缓存模式,否则会导致聊天窗口的消息不刷新 - cacheChats = state.chats; - this.commit("saveToStorage"); - }, - saveToStorage(state) { - // 加载中不保存,防止卡顿 - if (this.getters.isLoading()) { - return; - } - let userId = userStore.state.userInfo.id; - let key = "chats-" + userId; - let chatsData = { - privateMsgMaxId: state.privateMsgMaxId, - groupMsgMaxId: state.groupMsgMaxId, - chats: state.chats - } - localForage.setItem(key, chatsData) - }, - clear(state) { - cacheChats = [] - state.chats = []; - state.activeChat = null; - - } - }, - actions: { - loadChat(context) { - return new Promise((resolve, reject) => { - let userId = userStore.state.userInfo.id; - let key = "chats-" + userId; - localForage.getItem(key).then((item)=>{ - let chatsData = item; - // 兼容历史数据,以后要删除 - if(!chatsData){ - chatsData = JSON.parse(localStorage.getItem(key)); - } - if (chatsData) { - context.commit("initChats", chatsData); - } - resolve(); - }).catch(()=>{ - reject(); - }) - }) - } - }, - getters: { - isLoading: (state) => () => { - return state.loadingPrivateMsg || state.loadingGroupMsg - }, - findChats: (state, getters) => () => { - return getters.isLoading() ? cacheChats : state.chats; - }, - findChatIdx: (state, getters) => (chat) => { - let chats = getters.findChats(); - for (let idx in chats) { - if (chats[idx].type == chat.type && - chats[idx].targetId === chat.targetId) { - chat = chats[idx]; - return idx - } - } - }, - findChat: (state, getters) => (msgInfo) => { - let chats = getters.findChats(); - // 获取对方id或群id - let type = msgInfo.groupId ? 'GROUP' : 'PRIVATE'; - let targetId = msgInfo.groupId ? msgInfo.groupId : msgInfo.selfSend ? msgInfo.recvId : msgInfo.sendId; - let chat = null; - for (let idx in chats) { - if (chats[idx].type == type && - chats[idx].targetId === targetId) { - chat = chats[idx]; - break; - } - } - return chat; - }, - findMessage: (state) => (chat, msgInfo) => { - if (!chat) { - return null; - } - for (let idx in chat.messages) { - // 通过id判断 - if (msgInfo.id && chat.messages[idx].id == msgInfo.id) { - return chat.messages[idx]; - } - // 正在发送中的消息可能没有id,只有tmpId - if (msgInfo.tmpId && chat.messages[idx].tmpId && - chat.messages[idx].tmpId == msgInfo.tmpId) { - return chat.messages[idx]; - } - } - } - } +import { MESSAGE_TYPE, MESSAGE_STATUS } from "../api/enums.js" +import userStore from './userStore'; +import localForage from 'localforage'; + +/* 为了加速拉取离线消息效率,拉取时消息暂时存储到cacheChats,等 +待所有离线消息拉取完成后,再统一放至vuex中进行渲染*/ +let cacheChats = []; + +export default { + state: { + activeChat: null, + privateMsgMaxId: 0, + groupMsgMaxId: 0, + loadingPrivateMsg: false, + loadingGroupMsg: false, + chats: [] + }, + + mutations: { + initChats(state, chatsData) { + state.chats = []; + state.privateMsgMaxId = chatsData.privateMsgMaxId || 0; + state.groupMsgMaxId = chatsData.groupMsgMaxId || 0; + cacheChats = chatsData.chats||[]; + // 防止图片一直处在加载中状态 + cacheChats.forEach((chat) => { + chat.messages.forEach((msg) => { + if (msg.loadStatus == "loading") { + msg.loadStatus = "fail" + } + }) + }) + }, + openChat(state, chatInfo) { + let chats = this.getters.findChats() + let chat = null; + for (let idx in chats) { + if (chats[idx].type == chatInfo.type && + chats[idx].targetId === chatInfo.targetId) { + chat = chats[idx]; + // 放置头部 + this.commit("moveTop", idx) + break; + } + } + // 创建会话 + if (chat == null) { + chat = { + targetId: chatInfo.targetId, + type: chatInfo.type, + showName: chatInfo.showName, + headImage: chatInfo.headImage, + lastContent: "", + lastSendTime: new Date().getTime(), + unreadCount: 0, + messages: [], + atMe: false, + atAll: false + }; + chats.unshift(chat); + } + }, + activeChat(state, idx) { + let chats = this.getters.findChats(); + state.activeChat = chats[idx]; + }, + resetUnreadCount(state, chatInfo) { + let chats = this.getters.findChats(); + for (let idx in chats) { + if (chats[idx].type == chatInfo.type && + chats[idx].targetId == chatInfo.targetId) { + chats[idx].unreadCount = 0; + chats[idx].atMe = false; + chats[idx].atAll = false; + } + } + this.commit("saveToStorage"); + }, + readedMessage(state, pos) { + let chats = this.getters.findChats(); + for (let idx in chats) { + if (chats[idx].type == 'PRIVATE' && + chats[idx].targetId == pos.friendId) { + chats[idx].messages.forEach((m) => { + if (m.selfSend && m.status != MESSAGE_STATUS.RECALL) { + // pos.maxId为空表示整个会话已读 + if (!pos.maxId || m.id <= pos.maxId) { + m.status = MESSAGE_STATUS.READED + } + + } + }) + } + } + this.commit("saveToStorage"); + }, + removeChat(state, idx) { + let chats = this.getters.findChats(); + if (chats[idx] == state.activeChat) { + state.activeChat = null; + } + chats.splice(idx, 1); + this.commit("saveToStorage"); + }, + moveTop(state, idx) { + // 加载中不移动,很耗性能 + if (this.getters.isLoading()) { + return; + } + if (idx > 0) { + let chats = this.getters.findChats(); + let chat = chats[idx]; + chats.splice(idx, 1); + chats.unshift(chat); + this.commit("saveToStorage"); + } + }, + removePrivateChat(state, friendId) { + let chats = this.getters.findChats(); + for (let idx in chats) { + if (chats[idx].type == 'PRIVATE' && + chats[idx].targetId == friendId) { + this.commit("removeChat", idx); + } + } + }, + insertMessage(state, msgInfo) { + let type = msgInfo.groupId ? 'GROUP' : 'PRIVATE'; + // 记录消息的最大id + if (msgInfo.id && type == "PRIVATE" && msgInfo.id > state.privateMsgMaxId) { + state.privateMsgMaxId = msgInfo.id; + } + if (msgInfo.id && type == "GROUP" && msgInfo.id > state.groupMsgMaxId) { + state.groupMsgMaxId = msgInfo.id; + } + // 如果是已存在消息,则覆盖旧的消息数据 + let chat = this.getters.findChat(msgInfo); + let message = this.getters.findMessage(chat, msgInfo); + if (message) { + Object.assign(message, msgInfo); + // 撤回消息需要显示 + if (msgInfo.type == MESSAGE_TYPE.RECALL) { + chat.lastContent = msgInfo.content; + } + this.commit("saveToStorage"); + return; + } + // 插入新的数据 + if (msgInfo.type == MESSAGE_TYPE.IMAGE) { + chat.lastContent = "[图片]"; + } else if (msgInfo.type == MESSAGE_TYPE.FILE) { + chat.lastContent = "[文件]"; + } else if (msgInfo.type == MESSAGE_TYPE.AUDIO) { + chat.lastContent = "[语音]"; + } else if (msgInfo.type == MESSAGE_TYPE.TEXT || + msgInfo.type == MESSAGE_TYPE.RECALL || + msgInfo.type == MESSAGE_TYPE.TIP_TEXT) { + chat.lastContent = msgInfo.content; + } else if (msgInfo.type == MESSAGE_TYPE.ACT_RT_VOICE) { + chat.lastContent = "[语音通话]"; + } else if (msgInfo.type == MESSAGE_TYPE.ACT_RT_VIDEO) { + chat.lastContent = "[视频通话]"; + } + chat.lastSendTime = msgInfo.sendTime; + chat.sendNickName = msgInfo.sendNickName; + // 未读加1 + if (!msgInfo.selfSend && msgInfo.status != MESSAGE_STATUS.READED && msgInfo.type != MESSAGE_TYPE.TIP_TEXT) { + chat.unreadCount++; + } + // 是否有人@我 + if (!msgInfo.selfSend && chat.type == "GROUP" && msgInfo.atUserIds && + msgInfo.status != MESSAGE_STATUS.READED) { + let userId = userStore.state.userInfo.id; + if (msgInfo.atUserIds.indexOf(userId) >= 0) { + chat.atMe = true; + } + if (msgInfo.atUserIds.indexOf(-1) >= 0) { + chat.atAll = true; + } + } + // 间隔大于10分钟插入时间显示 + if (!chat.lastTimeTip || (chat.lastTimeTip < msgInfo.sendTime - 600 * 1000)) { + chat.messages.push({ + sendTime: msgInfo.sendTime, + type: MESSAGE_TYPE.TIP_TIME, + }); + chat.lastTimeTip = msgInfo.sendTime; + } + // 根据id顺序插入,防止消息乱序 + let insertPos = chat.messages.length; + // 防止 图片、文件 在发送方 显示 在顶端 因为还没存库,id=0 + if (msgInfo.id && msgInfo.id > 0) { + for (let idx in chat.messages) { + if (chat.messages[idx].id && msgInfo.id < chat.messages[idx].id) { + insertPos = idx; + console.log(`消息出现乱序,位置:${chat.messages.length},修正至:${insertPos}`); + break; + } + } + } + chat.messages.splice(insertPos, 0, msgInfo); + this.commit("saveToStorage"); + }, + updateMessage(state, msgInfo) { + // 获取对方id或群id + let chat = this.getters.findChat(msgInfo); + let message = this.getters.findMessage(chat, msgInfo); + if (message) { + // 属性拷贝 + Object.assign(message, msgInfo); + this.commit("saveToStorage"); + } + }, + deleteMessage(state, msgInfo) { + let chat = this.getters.findChat(msgInfo); + for (let idx in chat.messages) { + // 已经发送成功的,根据id删除 + if (chat.messages[idx].id && chat.messages[idx].id == msgInfo.id) { + chat.messages.splice(idx, 1); + break; + } + // 正在发送中的消息可能没有id,根据发送时间删除 + if (msgInfo.selfSend && chat.messages[idx].selfSend && + chat.messages[idx].sendTime == msgInfo.sendTime) { + chat.messages.splice(idx, 1); + break; + } + } + this.commit("saveToStorage"); + }, + updateChatFromFriend(state, friend) { + let chats = this.getters.findChats(); + for (let i in chats) { + let chat = chats[i]; + if (chat.type == 'PRIVATE' && chat.targetId == friend.id) { + chat.headImage = friend.headImageThumb; + chat.showName = friend.nickName; + break; + } + } + this.commit("saveToStorage"); + }, + updateChatFromGroup(state, group) { + let chats = this.getters.findChats(); + for (let i in chats) { + let chat = chats[i]; + if (chat.type == 'GROUP' && chat.targetId == group.id) { + chat.headImage = group.headImageThumb; + chat.showName = group.showGroupName; + break; + } + } + this.commit("saveToStorage"); + }, + loadingPrivateMsg(state, loading) { + state.loadingPrivateMsg = loading; + if (!this.getters.isLoading()) { + this.commit("refreshChats") + } + }, + loadingGroupMsg(state, loading) { + state.loadingGroupMsg = loading; + if (!this.getters.isLoading()) { + this.commit("refreshChats") + } + }, + refreshChats(state) { + // 排序 + cacheChats.sort((chat1, chat2) => { + return chat2.lastSendTime - chat1.lastSendTime; + }); + // 将消息一次性装载回来 + state.chats = cacheChats; + // 断线重连后不能使用缓存模式,否则会导致聊天窗口的消息不刷新 + cacheChats = state.chats; + this.commit("saveToStorage"); + }, + saveToStorage(state) { + // 加载中不保存,防止卡顿 + if (this.getters.isLoading()) { + return; + } + let userId = userStore.state.userInfo.id; + let key = "chats-" + userId; + let chatsData = { + privateMsgMaxId: state.privateMsgMaxId, + groupMsgMaxId: state.groupMsgMaxId, + chats: state.chats + } + localForage.setItem(key, chatsData) + }, + clear(state) { + cacheChats = [] + state.chats = []; + state.activeChat = null; + + } + }, + actions: { + loadChat(context) { + return new Promise((resolve, reject) => { + let userId = userStore.state.userInfo.id; + let key = "chats-" + userId; + localForage.getItem(key).then((item)=>{ + let chatsData = item; + // 兼容历史数据,以后要删除 + if(!chatsData){ + chatsData = JSON.parse(localStorage.getItem(key)); + } + if (chatsData) { + context.commit("initChats", chatsData); + } + resolve(); + }).catch(()=>{ + reject(); + }) + }) + } + }, + getters: { + isLoading: (state) => () => { + return state.loadingPrivateMsg || state.loadingGroupMsg + }, + findChats: (state, getters) => () => { + return getters.isLoading() ? cacheChats : state.chats; + }, + findChatIdx: (state, getters) => (chat) => { + let chats = getters.findChats(); + for (let idx in chats) { + if (chats[idx].type == chat.type && + chats[idx].targetId === chat.targetId) { + chat = chats[idx]; + return idx + } + } + }, + findChat: (state, getters) => (msgInfo) => { + let chats = getters.findChats(); + // 获取对方id或群id + let type = msgInfo.groupId ? 'GROUP' : 'PRIVATE'; + let targetId = msgInfo.groupId ? msgInfo.groupId : msgInfo.selfSend ? msgInfo.recvId : msgInfo.sendId; + let chat = null; + for (let idx in chats) { + if (chats[idx].type == type && + chats[idx].targetId === targetId) { + chat = chats[idx]; + break; + } + } + return chat; + }, + findMessage: (state) => (chat, msgInfo) => { + if (!chat) { + return null; + } + for (let idx in chat.messages) { + // 通过id判断 + if (msgInfo.id && chat.messages[idx].id == msgInfo.id) { + return chat.messages[idx]; + } + // 正在发送中的消息可能没有id,只有tmpId + if (msgInfo.tmpId && chat.messages[idx].tmpId && + chat.messages[idx].tmpId == msgInfo.tmpId) { + return chat.messages[idx]; + } + } + } + } } \ No newline at end of file diff --git a/im-ui/src/store/configStore.js b/im-web/src/store/configStore.js similarity index 100% rename from im-ui/src/store/configStore.js rename to im-web/src/store/configStore.js diff --git a/im-ui/src/store/friendStore.js b/im-web/src/store/friendStore.js similarity index 100% rename from im-ui/src/store/friendStore.js rename to im-web/src/store/friendStore.js diff --git a/im-ui/src/store/groupStore.js b/im-web/src/store/groupStore.js similarity index 100% rename from im-ui/src/store/groupStore.js rename to im-web/src/store/groupStore.js diff --git a/im-ui/src/store/index.js b/im-web/src/store/index.js similarity index 96% rename from im-ui/src/store/index.js rename to im-web/src/store/index.js index 37426b5..346aa86 100644 --- a/im-ui/src/store/index.js +++ b/im-web/src/store/index.js @@ -1,33 +1,33 @@ -import Vue from 'vue'; -import Vuex from 'vuex'; -import chatStore from './chatStore.js'; -import friendStore from './friendStore.js'; -import userStore from './userStore.js'; -import groupStore from './groupStore.js'; -import configStore from './configStore.js'; -import uiStore from './uiStore.js'; - -Vue.use(Vuex) - -export default new Vuex.Store({ - modules: {chatStore,friendStore,userStore,groupStore,configStore,uiStore}, - state: {}, - mutations: { - }, - actions: { - load(context) { - return this.dispatch("loadUser").then(() => { - const promises = []; - promises.push(this.dispatch("loadFriend")); - promises.push(this.dispatch("loadGroup")); - promises.push(this.dispatch("loadChat")); - promises.push(this.dispatch("loadConfig")); - return Promise.all(promises); - }) - }, - unload(context){ - context.commit("clear"); - } - }, - strict: process.env.NODE_ENV !== 'production' -}) +import Vue from 'vue'; +import Vuex from 'vuex'; +import chatStore from './chatStore.js'; +import friendStore from './friendStore.js'; +import userStore from './userStore.js'; +import groupStore from './groupStore.js'; +import configStore from './configStore.js'; +import uiStore from './uiStore.js'; + +Vue.use(Vuex) + +export default new Vuex.Store({ + modules: {chatStore,friendStore,userStore,groupStore,configStore,uiStore}, + state: {}, + mutations: { + }, + actions: { + load(context) { + return this.dispatch("loadUser").then(() => { + const promises = []; + promises.push(this.dispatch("loadFriend")); + promises.push(this.dispatch("loadGroup")); + promises.push(this.dispatch("loadChat")); + promises.push(this.dispatch("loadConfig")); + return Promise.all(promises); + }) + }, + unload(context){ + context.commit("clear"); + } + }, + strict: process.env.NODE_ENV !== 'production' +}) diff --git a/im-ui/src/store/uiStore.js b/im-web/src/store/uiStore.js similarity index 100% rename from im-ui/src/store/uiStore.js rename to im-web/src/store/uiStore.js diff --git a/im-ui/src/store/userStore.js b/im-web/src/store/userStore.js similarity index 95% rename from im-ui/src/store/userStore.js rename to im-web/src/store/userStore.js index 04b7235..0973989 100644 --- a/im-ui/src/store/userStore.js +++ b/im-web/src/store/userStore.js @@ -1,50 +1,50 @@ -import http from '../api/httpRequest.js' -import {RTC_STATE} from "../api/enums.js" -export default { - - state: { - userInfo: { - - }, - rtcInfo: { - friend: {}, // 好友信息 - mode: "video", // 模式 video:视频 voice:语音 - state: RTC_STATE.FREE // FREE:空闲 WAIT_CALL:呼叫方等待 WAIT_ACCEPT: 被呼叫方等待接听 CHATING:聊天中 - } - }, - - mutations: { - setUserInfo(state, userInfo) { - state.userInfo = userInfo - }, - setRtcInfo(state, rtcInfo ){ - state.rtcInfo = rtcInfo; - }, - setRtcState(state,rtcState){ - state.rtcInfo.state = rtcState; - }, - clear(state){ - state.userInfo = {}; - state.rtcInfo = { - friend: {}, - mode: "video", - state: RTC_STATE.FREE - }; - } - }, - actions:{ - loadUser(context){ - return new Promise((resolve, reject) => { - http({ - url: '/user/self', - method: 'GET' - }).then((userInfo) => { - context.commit("setUserInfo",userInfo); - resolve(); - }).catch((res)=>{ - reject(res); - }); - }) - } - } +import http from '../api/httpRequest.js' +import {RTC_STATE} from "../api/enums.js" +export default { + + state: { + userInfo: { + + }, + rtcInfo: { + friend: {}, // 好友信息 + mode: "video", // 模式 video:视频 voice:语音 + state: RTC_STATE.FREE // FREE:空闲 WAIT_CALL:呼叫方等待 WAIT_ACCEPT: 被呼叫方等待接听 CHATING:聊天中 + } + }, + + mutations: { + setUserInfo(state, userInfo) { + state.userInfo = userInfo + }, + setRtcInfo(state, rtcInfo ){ + state.rtcInfo = rtcInfo; + }, + setRtcState(state,rtcState){ + state.rtcInfo.state = rtcState; + }, + clear(state){ + state.userInfo = {}; + state.rtcInfo = { + friend: {}, + mode: "video", + state: RTC_STATE.FREE + }; + } + }, + actions:{ + loadUser(context){ + return new Promise((resolve, reject) => { + http({ + url: '/user/self', + method: 'GET' + }).then((userInfo) => { + context.commit("setUserInfo",userInfo); + resolve(); + }).catch((res)=>{ + reject(res); + }); + }) + } + } } \ No newline at end of file diff --git a/im-ui/src/utils/directive/dialogDrag.js b/im-web/src/utils/directive/dialogDrag.js similarity index 100% rename from im-ui/src/utils/directive/dialogDrag.js rename to im-web/src/utils/directive/dialogDrag.js diff --git a/im-ui/src/view/Chat.vue b/im-web/src/view/Chat.vue similarity index 95% rename from im-ui/src/view/Chat.vue rename to im-web/src/view/Chat.vue index b6b42f2..bb107aa 100644 --- a/im-ui/src/view/Chat.vue +++ b/im-web/src/view/Chat.vue @@ -1,104 +1,104 @@ - - - - - \ No newline at end of file diff --git a/im-ui/src/view/Friend.vue b/im-web/src/view/Friend.vue similarity index 100% rename from im-ui/src/view/Friend.vue rename to im-web/src/view/Friend.vue diff --git a/im-ui/src/view/Group.vue b/im-web/src/view/Group.vue similarity index 100% rename from im-ui/src/view/Group.vue rename to im-web/src/view/Group.vue diff --git a/im-ui/src/view/Home.vue b/im-web/src/view/Home.vue similarity index 96% rename from im-ui/src/view/Home.vue rename to im-web/src/view/Home.vue index 797b0c1..7f02a4f 100644 --- a/im-ui/src/view/Home.vue +++ b/im-web/src/view/Home.vue @@ -1,422 +1,422 @@ - - - - - \ No newline at end of file diff --git a/im-ui/src/view/Login.vue b/im-web/src/view/Login.vue similarity index 96% rename from im-ui/src/view/Login.vue rename to im-web/src/view/Login.vue index 8742681..d7966ed 100644 --- a/im-ui/src/view/Login.vue +++ b/im-web/src/view/Login.vue @@ -1,243 +1,243 @@ - - - - - \ No newline at end of file diff --git a/im-ui/src/view/Register.vue b/im-web/src/view/Register.vue similarity index 96% rename from im-ui/src/view/Register.vue rename to im-web/src/view/Register.vue index 1c2c6e8..c35c4d2 100644 --- a/im-ui/src/view/Register.vue +++ b/im-web/src/view/Register.vue @@ -1,162 +1,162 @@ - - - - - + + + + + diff --git a/im-ui/vue.config.js b/im-web/vue.config.js similarity index 95% rename from im-ui/vue.config.js rename to im-web/vue.config.js index 7ed74db..3beb823 100644 --- a/im-ui/vue.config.js +++ b/im-web/vue.config.js @@ -1,23 +1,23 @@ const path = require('path') -const fs = require('fs') - -module.exports = { - devServer: { - proxy: { - '/api': { - target: 'http://127.0.0.1:8888', - changeOrigin: true, - ws: false, - pathRewrite: { - '^/api': '' - } - } - }, - // 音视频功能需要ssl证书,如需调试请打开注释 - // https: { - // cert: fs.readFileSync(path.join(__dirname, 'src/ssl/cert.crt')), - // key: fs.readFileSync(path.join(__dirname, 'src/ssl/cert.key')) - // } - } - +const fs = require('fs') + +module.exports = { + devServer: { + proxy: { + '/api': { + target: 'http://127.0.0.1:8888', + changeOrigin: true, + ws: false, + pathRewrite: { + '^/api': '' + } + } + }, + // 音视频功能需要ssl证书,如需调试请打开注释 + // https: { + // cert: fs.readFileSync(path.join(__dirname, 'src/ssl/cert.crt')), + // key: fs.readFileSync(path.join(__dirname, 'src/ssl/cert.key')) + // } + } + } \ No newline at end of file