From 41e291384e6d704aa16638901f329b34b16b8ea7 Mon Sep 17 00:00:00 2001 From: xsx <825657193@qq.com> Date: Fri, 8 Nov 2024 00:04:28 +0800 Subject: [PATCH 01/15] =?UTF-8?q?fix:=20=E8=AF=AD=E9=9F=B3=E5=91=BC?= =?UTF-8?q?=E5=8F=AB=E6=9C=AA=E8=AF=BB=E6=95=B0=E9=87=8Fbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bx/implatform/service/impl/WebrtcPrivateServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/WebrtcPrivateServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/WebrtcPrivateServiceImpl.java index dd84d91..2b93199 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/WebrtcPrivateServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/WebrtcPrivateServiceImpl.java @@ -314,7 +314,7 @@ public class WebrtcPrivateServiceImpl implements WebrtcPrivateService { sendMessage.setSender(new IMUserInfo(rtcSession.getCallerId(), rtcSession.getCallerTerminal())); sendMessage.setRecvId(rtcSession.getCallerId()); sendMessage.setSendToSelf(false); - sendMessage.setSendResult(false); + sendMessage.setSendResult(true); sendMessage.setData(messageInfo); imClient.sendPrivateMessage(sendMessage); // 推给接听方 From 13c5a10061563a629a9196bee940976bdd792754 Mon Sep 17 00:00:00 2001 From: xsx <825657193@qq.com> Date: Fri, 8 Nov 2024 00:19:19 +0800 Subject: [PATCH 02/15] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E7=9A=84=E8=BE=B9=E6=A1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- im-uniapp/components/chat-at-box/chat-at-box.vue | 1 - .../components/chat-group-readed/chat-group-readed.vue | 1 - .../components/chat-message-item/chat-message-item.vue | 2 +- .../group-member-selector/group-member-selector.vue | 1 - im-uniapp/pages/chat/chat-box.vue | 9 ++------- im-uniapp/pages/chat/chat-group-video.vue | 1 - im-uniapp/pages/friend/friend-add.vue | 1 - im-uniapp/pages/friend/friend.vue | 2 -- im-uniapp/pages/group/group-invite.vue | 1 - im-uniapp/pages/group/group-member.vue | 1 - im-uniapp/pages/group/group.vue | 2 -- 11 files changed, 3 insertions(+), 19 deletions(-) diff --git a/im-uniapp/components/chat-at-box/chat-at-box.vue b/im-uniapp/components/chat-at-box/chat-at-box.vue index 0e497c5..d9627dd 100644 --- a/im-uniapp/components/chat-at-box/chat-at-box.vue +++ b/im-uniapp/components/chat-at-box/chat-at-box.vue @@ -108,7 +108,6 @@ \ No newline at end of file + diff --git a/im-web/src/api/emotion.js b/im-web/src/api/emotion.js index c391496..2d799a6 100644 --- a/im-web/src/api/emotion.js +++ b/im-web/src/api/emotion.js @@ -19,7 +19,7 @@ let textToImg = (emoText) => { return emoText; } let url = require(`@/assets/emoji/${idx}.gif`); - return `` + return `` } let textToUrl = (emoText) => { diff --git a/im-web/src/assets/image/online_app.png b/im-web/src/assets/image/online_app.png deleted file mode 100644 index 173d41586671e01f9b25dd9163d03bc899f8e7e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2774 zcmV;{3Muu8P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D3TsJ3K~#8N?VEd0 zRM#EHg=H6ZmsbRNqvNASY!!`fqDTb=VIP24sS!j3R3461Y->ACr-{ZW5Suojp;iPJ z)X^~tYHK<;4Ft3?Qy-m9n#2cb)qv6;xL9S=G?I|rUI58&&-fdg-f?mZW3YHExuA$_H#r8I5Y zG@3YZB2Abu;h6#-@CBdE&CRzD9XezbljHv2a5%c`c02j|`*Q*U0^EY+&uX<2(jX?s z{h_+Lnu3CY9+}Ahl&298zN@OLsJ^~_te7PChIQ-Kk=bmPOXNw3jg6&|BS)$jHEI;k z)XZxm6eq=Ffc$5A3o$9J$jV<{QSshHqtvA8t8g+uRu#5 zmDtMU%p!xkcI}c$N=nj>02LK#0j9l`LY7a8WYRv$XSF~m?Ng^tkuu!9dzXBCd`R!B zr;GJ}r>l-zG7UdzA*0F2OCKXmU0t0_NlA%Hfbw#W3Q(aI;8!jJoOcRv^5jV|>q5A5 z=Z-AEh5C9^J4`lE-rQvpxmnmMGA@tmTef`a&mHL@#4iCY1jkdq2ZK~U}e}SeU_C1`~zfLXlN)+pFW*W ze}Po;Kyw1P8~85&zZbyMouE%3;7Txv3&V*@?|z3A3b#*tEJ2B`($djtrzA9jI6HDXvtsu zWnSJ z*{Q3wjtkM%x{GGdh-cSX23g$66+ffwv)8x~+1*zudd3{>2mt52q{NIEF?m6WOZW+; zFM$%5P{zZt+UAVor??IviZULy#xx{=d(oT#dc7Y-h6Peoco0QJ1hMw*tO1zzMn*>R z86d#9Y-7)e2nwP|Mnq5``S?1YiBiYbmxR)v<^*{Cr&Eb~R}g(s!1?(7ES3R3eot*} zt+)yh!sW}Cxd_O7_hLJJxw=4LO#xLW&f;-EZf-8ES+jv=Lg7nhL1VBoa1wTW350#<|G-rnS`*VDE9C3LqqPv+pl6f&^qA|B=o%FzRpDajvv zKNmnt0?19^7Ha|wGy#J_=)E7+1avwb=~yPa7iX%PKn-gG5CHL9o4~AD&gP*x0epN6 z6cHA{Ize=Vf#j{z%Qj@zwG)(WOayd(AUrUTpG!79t0CATM+b;s)C$SwaRJ~Q2|_|V z0equoXi5MBD=`UQ7n|OomofM%Y`72iODJq;LVCRuIS#jJOn|Vd(?F&jPh?WNKH@b2CBA#+Z|HB9zsUSKt%HpK-eh1SL3DGUY7rIoi#A>pP~ylq zRS%JIPi8c@|b9%KRj1k0&J^!tN^tx0-RF`@P&&2$7BJny9lsvnT7>0hleu}s(DR7 zb3mUU*~0z9sA|eKPR*1zXmaQzp)*9haWg1%Vk$%$a#5rv})BVnUs_iIUZh(;gy)gvSrJ(D?npoqnLFe^z`(|8EM-yPqk9K!&ZtA z04qY*6(6?HrFgC{M+*xJwIu*bP)cl5QeghSlh!64y4XgZG2u^ zj$u$Jacqz(1HLEvpA(>E5CQu8`^Bsa;lzm(-wpvVW=m}r3@xvtnB!kN1!%e=+Z$5m zss#8n{|Ce#!Rca8Ge@iFO3=*87rqULKi~myuX z?4^sya$zM|E(%z8=91mUt}|Qmno5do?_=DinD%~}`Dz`zZsRuFj$Ap8xo zc?M98Z9igdS?mKcewfFa!3Puv_IFWosnC`I+B}aVVtXY^xX${3O`A5+`Sa&F=gytu z{}+G_JH+r^%!Xo*{cUdR)~$S-8bcDk>Cev2rbXF{oGen4!|XZPSsYi}VDT`zNZ@?V zoH=|b#OSkS%NA_LdghOl`D`I2?|ht*s|+{r(T{4V*sx$7c$Bw6&eM<#06b6y5(9 cVaSkw1KtrL`@V0!bpQYW07*qoM6N<$g1~+okN^Mx diff --git a/im-web/src/assets/image/online_web.png b/im-web/src/assets/image/online_web.png deleted file mode 100644 index 6e4707805f724489641beb72a6d17834b1d6eefb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3467 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 diff --git a/im-web/src/assets/style/element.scss b/im-web/src/assets/style/element.scss new file mode 100644 index 0000000..8a26ba9 --- /dev/null +++ b/im-web/src/assets/style/element.scss @@ -0,0 +1,112 @@ +/* 改变 icon 字体路径变量,必需 */ +$--font-path: '~element-ui/lib/theme-chalk/fonts'; + +// 文字 +$--font-family: Microsoft YaHei, 'Avenir', Helvetica, Arial, sans-serif; +@import "thems"; +@import "~element-ui/packages/theme-chalk/src/index"; + +.el-message { + z-index: 99999999 !important; + background: #fff !important; + box-shadow: 0 4px 12px 0 rgb(0 0 0 / 15%); + border: none !important; + min-width: unset !important; + border-radius: 3px !important; + padding: 14px 18px 14px 16px !important; + + .el-message__content { + color: #000 !important; + } +} + +.el-scrollbar__thumb { + background-color: #A0A8AF !important; +} + +.el-dialog__title { + font-size: var(--im-font-size-larger); + color: var(--im-text-color); +} + +.el-dialog__header { + padding: 12px 18px !important; + +} + +.el-dialog__headerbtn { + top: 15px; + right: 20px; + font-size: 18px; +} + +.el-checkbox__inner { + border-radius: 50% !important; +} + + +.el-button--success { + //background-color: #688758 !important; + //border-color: #4cae1b !important; +} + +.el-button--danger { + //background-color: #ea4949 !important; + //border-color: #ea4949 !important; +} + +.el-button { + padding: 8px 15px !important; +} + +.el-checkbox { + display: flex; + align-items: center; + + //修改选中框的大小 + .el-checkbox__inner { + width: 16px; + height: 16px; + + //修改选中框中的对勾的大小和位置 + &::after { + height: 7px; + left: 5px; + top: 2px; + } + } + + // 修改点击文字颜色不变 + .el-checkbox__input.is-checked + .el-checkbox__label { + color: #333333; + } + + .el-checkbox__label { + line-height: 20px; + padding-left: 8px; + } +} + +.el-form-item { + margin-bottom: 15px !important; +} + +.el-input--small { + font-size: $--font-size-base; +} + +.el-input__inner { + padding: 0 10px; +} + +.el-textarea__inner { + padding: 5px 10px; + font-family: $--font-family; +} + +.el-tag--mini { + height: 18px; + padding: 0 2px; + line-height: 16px; + border-radius: 2px; +} diff --git a/im-web/src/assets/style/global.css b/im-web/src/assets/style/global.css deleted file mode 100644 index ce8be83..0000000 --- a/im-web/src/assets/style/global.css +++ /dev/null @@ -1,43 +0,0 @@ -@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-web/src/assets/style/im.scss b/im-web/src/assets/style/im.scss new file mode 100644 index 0000000..d3d40c0 --- /dev/null +++ b/im-web/src/assets/style/im.scss @@ -0,0 +1,91 @@ +@charset "UTF-8"; +@import "element"; + +// im全局样式变量 +:root { + // 主色 + --im-color-primary: #{$--color-primary}; + --im-color-primary-light-1: #{$--color-primary-light-1}; + --im-color-primary-light-2: #{$--color-primary-light-2}; + --im-color-primary-light-3: #{$--color-primary-light-3}; + --im-color-primary-light-4: #{$--color-primary-light-4}; + --im-color-primary-light-5: #{$--color-primary-light-5}; + --im-color-primary-light-6: #{$--color-primary-light-6}; + --im-color-primary-light-7: #{$--color-primary-light-7}; + --im-color-primary-light-8: #{$--color-primary-light-8}; + --im-color-primary-light-9: #{$--color-primary-light-9}; + + --im-color-sucess: #{$--color-success}; + --im-color-warning: #{$--color-warning}; + --im-color-danger: #{$--color-danger}; + --im-color-info: #{$--color-info}; + + // 文字颜色 + --im-text-color: #{$--color-text-regular}; + --im-text-color-light: #999999; + --im-text-color-lighter: #C0C4CC; + + // 文字大小 + --im-font-size: #{$--font-size-base}; + --im-font-size-small: #{$--font-size-small}; + --im-font-size-smaller: #{$--font-size-extra-small}; + --im-font-size-large: #{$--font-size-medium}; + --im-font-size-larger: #{$--font-size-large}; + --im-font-family: #{$--font-family}; + + + // 边框颜色 + --im-border: 1px solid #EBEEF5; + + // 阴影 + --im-box-shadow: #{$--box-shadow-base}; + --im-box-shadow-light: #{$--box-shadow-light}; + --im-box-shadow-lighter: 0px 0px 6px rgba(0, 0, 0, .12); + --im-box-shadow-dark: 0px 16px 48px 16px rgba(0, 0, 0, .08), 0px 12px 32px rgba(0, 0, 0, .12), 0px 8px 16px -8px rgba(0, 0, 0, .16); + + // 背景色 + --im-background: #F3F3F3; + --im-background-active: #F1F1F1; + --im-background-active-dark: #E9E9E9; +} + +html { + height: 100%; + overflow: hidden; +} + +body { + height: 100%; + margin: 0; + overflow: hidden; +} + +section { + height: 100%; +} + +.el-dialog__body { + padding: 10px 20px !important; +} + +// 滚动条样式 +::-webkit-scrollbar { + width: 8px; + height: 1px; +} + +::-webkit-scrollbar-thumb { + border-radius: 4px; + background: hsla(0, 0%, 73%, .5); +} + +::-webkit-scrollbar-track { + border-radius: 4px; +} + +.search-input { + .el-input__inner { + border: unset !important; + } + +} diff --git a/im-web/src/assets/style/thems.scss b/im-web/src/assets/style/thems.scss new file mode 100644 index 0000000..569a39e --- /dev/null +++ b/im-web/src/assets/style/thems.scss @@ -0,0 +1,6 @@ +// 主题色 +$--color-primary: #2830d3; +//$--color-primary: #687ff0; +//$--color-primary: #096bff; +$--font-size-base: 14px; +$--color-text-regular: #000000; diff --git a/im-web/src/components/chat/ChatAtBox.vue b/im-web/src/components/chat/ChatAtBox.vue index 556b1cf..1d5bd02 100644 --- a/im-web/src/components/chat/ChatAtBox.vue +++ b/im-web/src/components/chat/ChatAtBox.vue @@ -123,9 +123,9 @@ position: fixed; width: 200px; height: 300px; - border: 1px solid #53a0e79c; - border-radius: 5px; - background-color: #f5f5f5; - box-shadow: 0px 0px 10px #ccc; + //border: 1px solid #53a0e79c; + //border-radius: 5px; + background-color: #fff; + box-shadow: var(--im-box-shadow); } - \ No newline at end of file + diff --git a/im-web/src/components/chat/ChatBox.vue b/im-web/src/components/chat/ChatBox.vue index 3239e69..2c60692 100644 --- a/im-web/src/components/chat/ChatBox.vue +++ b/im-web/src/components/chat/ChatBox.vue @@ -1,7 +1,7 @@ - + {{ title }} @@ -23,7 +23,7 @@ - + @@ -61,12 +61,12 @@ - 发送 + 发送 - + @@ -378,7 +378,7 @@ await this.sendFileMessage(msg.content.file); break; } - + } }, sendImageMessage(file) { @@ -540,7 +540,7 @@ } }, resetEditor() { - + this.$nextTick(() => { this.$refs.chatInputEditor.clear(); this.$refs.chatInputEditor.focus(); @@ -667,29 +667,30 @@ .chat-box { position: relative; width: 100%; - background: #f8f8f8; - border: #dddddd solid 1px; + background: #fff; .el-header { - padding: 3px; - background-color: white; + display: flex; + justify-content: space-between; + padding: 0 12px; line-height: 50px; - font-size: 20px; - font-weight: 600; - border-bottom: 1px #ddd solid; + font-size: var(--im-font-size-larger); + border-bottom: var(--im-border); + .btn-side { position: absolute; right: 20px; line-height: 50px; - font-size: 25px; + font-size: 20px; cursor: pointer; + color: var(--im-text-color-light); } } .im-chat-main { padding: 0; - background-color: white; + background-color: #fff; .im-chat-box { >ul { @@ -711,36 +712,34 @@ display: flex; position: relative; width: 100%; - height: 40px; + height: 36px; text-align: left; box-sizing: border-box; - border-top: #ccc solid 1px; - padding: 2px; - background-color: #f8faff; + border-top: var(--im-border); + padding: 4px 2px 2px 8px; - >div { + > div { font-size: 22px; cursor: pointer; - color: black; line-height: 30px; width: 30px; height: 30px; text-align: center; - border-radius: 3px; - margin: 3px 5px; - color: #0f46ae; - &:hover { - font-weight: 600; - color: #042259; - } + border-radius: 2px; + margin-right: 8px; + color: #999; + transition: 0.3s; &.chat-tool-active { - color: white; - background-color: #195ee2; + font-weight: 600; + color: var(--im-color-primary); + background-color: #ddd; } } - + > div:hover { + color: #333; + } } .send-content-area { @@ -757,7 +756,6 @@ flex: 1; resize: none; font-size: 16px; - color: black; outline: none; text-align: left; @@ -820,15 +818,17 @@ .send-btn-area { padding: 10px; position: absolute; - bottom: 0; - right: 0; + bottom: 4px; + right: 6px; } } } .chat-group-side-box { - border: #dddddd solid 1px; - animation: rtl-drawer-in .3s 1ms; + border-left: var(--im-border); + //animation: rtl-drawer-in .3s 1ms; } + } - \ No newline at end of file + + diff --git a/im-web/src/components/chat/ChatGroupMember.vue b/im-web/src/components/chat/ChatGroupMember.vue index 666b2c2..8ac0686 100644 --- a/im-web/src/components/chat/ChatGroupMember.vue +++ b/im-web/src/components/chat/ChatGroupMember.vue @@ -42,30 +42,19 @@ export default { diff --git a/im-web/src/components/chat/ChatGroupReaded.vue b/im-web/src/components/chat/ChatGroupReaded.vue index f9e5867..62f6606 100644 --- a/im-web/src/components/chat/ChatGroupReaded.vue +++ b/im-web/src/components/chat/ChatGroupReaded.vue @@ -130,17 +130,13 @@ export default { .chat-group-readed { position: fixed; - box-shadow: 0px 0px 10px #ccc; width: 300px; - background-color: #fafafa; - border-radius: 8px; .scroll-box { height: 400px; } .arrow-left { - position: absolute; left: -15px; width: 0; @@ -184,4 +180,4 @@ export default { } } } - \ No newline at end of file + diff --git a/im-web/src/components/chat/ChatGroupSide.vue b/im-web/src/components/chat/ChatGroupSide.vue index 3891879..ce4bbce 100644 --- a/im-web/src/components/chat/ChatGroupSide.vue +++ b/im-web/src/components/chat/ChatGroupSide.vue @@ -1,206 +1,232 @@ - - - - - - - - - - - - - 邀请 - - - - - - - - - - - - - - - - - - - - - - - - - 提交 - 编辑 - 退出群聊 - - - - - + + + + + + + + + + + + + 邀请 + + + + + + + + + + + + + + + + + + + + + + + + + 保存 + 编辑 + 退出群聊 + + + + + diff --git a/im-web/src/components/chat/ChatInput.vue b/im-web/src/components/chat/ChatInput.vue index 8f7a449..1494a55 100644 --- a/im-web/src/components/chat/ChatInput.vue +++ b/im-web/src/components/chat/ChatInput.vue @@ -70,7 +70,7 @@ line.appendChild(imageElement); let after = document.createTextNode('\u00A0'); line.appendChild(after); - this.selectElement(after, 1); + this.selectElement(after, 1); } else { let asFile = items[i].getAsFile(); if (!asFile) { @@ -239,7 +239,7 @@ }, onBlur(e) { this.updateRange(); - + }, onMousedown() { if (this.atIng) { @@ -331,7 +331,7 @@ let endContainer = range.endContainer; let parentElement = endContainer.parentElement; if (parentElement.parentElement === this.$refs.content) { - divElement.innerHTML = endContainer.textContent.substring(range.endOffset).trim(); + divElement.innerHTML = endContainer.textContent.substring(range.endOffset).trim(); endContainer.textContent = endContainer.textContent.substring(0, range.endOffset); // 插入到当前div(当前行)后面 parentElement.insertAdjacentElement('afterend', divElement); @@ -482,10 +482,10 @@ bottom: 0; outline: none; padding: 5px; - line-height: 30px; - font-size: 16px; + line-height: 1.5; + font-size: var(--im-font-size); text-align: left; - overflow-y: scroll; + overflow-y: auto; // 单独一行时,无法在前面输入的bug >div:before { @@ -544,15 +544,12 @@ .file-size { font-size: 14px; font-weight: 600; - color: black; } } } .chat-at-user { color: #00f; - font-weight: 600; - border-radius: 3px; } } @@ -567,4 +564,4 @@ } } - \ No newline at end of file + diff --git a/im-web/src/components/chat/ChatItem.vue b/im-web/src/components/chat/ChatItem.vue index 9c11a1b..e508fb1 100644 --- a/im-web/src/components/chat/ChatItem.vue +++ b/im-web/src/components/chat/ChatItem.vue @@ -1,20 +1,20 @@ - + {{chat.unreadCount}} - - {{chat.showName}} - 群 - + + {{chat.showName}} + 群 + - {{showTime}} + {{showTime}} - + {{atText}} {{chat.sendNickName+': '}} @@ -112,34 +112,32 @@ .chat-item { height: 50px; display: flex; - margin-bottom: 1px; position: relative; padding: 5px 10px; align-items: center; - background-color: white; + background-color: var(--im-background); white-space: nowrap; - color: black; cursor: pointer; &:hover { - background-color: #F8FAFF; + background-color: var(--im-background-active); } &.active { - background-color: #F4F9FF; + background-color: var(--im-background-active-dark); } .chat-left { position: relative; display: flex; - width: 45px; - height: 45x; + justify-content: center; + align-items: center; .unread-text { position: absolute; background-color: #f56c6c; - right: -5px; - top: -5px; + right: -4px; + top: -8px; color: white; border-radius: 30px; padding: 1px 5px; @@ -161,36 +159,36 @@ .chat-name { display: flex; - line-height: 25px; - height: 25px; - - .chat-name-text { - flex: 1; - display: flex; - align-items: center; - font-size: 15px; - font-weight: 600; - white-space: nowrap; - overflow: hidden; - - .el-tag { - background-color: #2830d3; - border-radius: 10px; - border: 0; - height: 16px; - line-height: 16px; - font-size: 10px; - margin-left: 2px; - opacity: 0.8; - - } - } - + line-height: 20px; + height: 20px; + + .chat-name-text { + flex: 1; + display: flex; + align-items: center; + font-size: var(--im-font-size); + white-space: nowrap; + overflow: hidden; + + .el-tag { + min-width: 22px; + text-align: center; + background-color: #2830d3; + border-radius: 10px; + border: 0; + height: 16px; + line-height: 16px; + font-size: 10px; + margin-left: 2px; + opacity: 0.8; + + } + } .chat-time-text { - font-size: 13px; + font-size: var(--im-font-size-smaller); text-align: right; - color: #888888; + color: var(--im-text-color-light); white-space: nowrap; overflow: hidden; padding-left: 10px; @@ -203,11 +201,12 @@ .chat-at-text { color: #c70b0b; - font-size: 12px; + font-size: var(--im-font-size-smaller); } .chat-send-name { - font-size: 13px; + font-size: var(--im-font-size-small); + color: var(--im-text-color-light); } @@ -216,7 +215,8 @@ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; - font-size: 13px; + font-size: var(--im-font-size-small); + color: var(--im-text-color-light); img { width: 20px !important; @@ -228,4 +228,4 @@ } } } - \ No newline at end of file + diff --git a/im-web/src/components/chat/ChatMessageItem.vue b/im-web/src/components/chat/ChatMessageItem.vue index e64d645..0640a50 100644 --- a/im-web/src/components/chat/ChatMessageItem.vue +++ b/im-web/src/components/chat/ChatMessageItem.vue @@ -9,7 +9,7 @@ - + @@ -213,13 +213,14 @@ .chat-msg-tip { line-height: 50px; - font-size: 14px; + font-size: var(--im-font-size-small); + color: var(--im-text-color-light); } .chat-msg-normal { position: relative; font-size: 0; - padding-left: 60px; + padding-left: 48px; min-height: 50px; margin-top: 10px; @@ -244,8 +245,8 @@ .chat-msg-top { display: flex; flex-wrap: nowrap; - color: #333; - font-size: 14px; + color: var(--im-text-color-light); + font-size: var(--im-font-size); line-height: 20px; span { @@ -261,13 +262,11 @@ display: block; position: relative; line-height: 26px; - margin-top: 3px; - padding: 7px; - background-color: #eee; + //margin-top: 3px; + padding: 6px 10px; + background-color: var(--im-background); border-radius: 10px; - color: black; - display: block; - font-size: 14px; + font-size: var(--im-font-size); text-align: left; white-space: pre-wrap; word-break: break-all; @@ -298,9 +297,7 @@ min-height: 150px; max-width: 400px; max-height: 300px; - border: #dddddd solid 1px; - border: 5px solid #ccc; - border-radius: 6px; + border-radius: 8px; cursor: pointer; } @@ -312,17 +309,15 @@ flex-direction: row; align-items: center; cursor: pointer; - padding-bottom: 5px; + margin-bottom: 2px; .chat-file-box { display: flex; flex-wrap: nowrap; align-items: center; - min-height: 80px; - box-shadow: 5px 5px 2px #c0c0c0; - border: #dddddd solid 1px; - border-radius: 6px; - background-color: #eeeeee; + min-height: 60px; + box-shadow: var(--im-box-shadow-light); + border-radius: 4px; padding: 10px 15px; .chat-file-info { @@ -330,21 +325,26 @@ height: 100%; text-align: left; font-size: 14px; + margin-right: 10px; .chat-file-name { display: inline-block; - min-width: 150px; - max-width: 300px; - font-size: 16px; - font-weight: 600; - margin-bottom: 15px; + min-width: 160px; + max-width: 220px; + font-size: 14px; + margin-bottom: 4px; white-space: pre-wrap; word-break: break-all; } + + .chat-file-size { + font-size: var(--im-font-size-smaller); + color: var(--im-text-color-light); + } } .chat-file-icon { - font-size: 50px; + font-size: 44px; color: #d42e07; } } @@ -384,32 +384,29 @@ .chat-readed { font-size: 12px; - color: #888; - font-weight: 600; + color: var(--im-text-color-light); } .chat-unread { - font-size: 12px; - color: #f23c0f; - font-weight: 600; + font-size: var(--im-font-size-smaller); + color: var(--im-color-danger); } } .chat-receipt { - font-size: 13px; - color: blue; + font-size: var(--im-font-size-smaller); cursor: pointer; + color: var(--im-text-color-light); .icon-ok { font-size: 20px; - color: #329432; + color: var(--im-color-sucess); } } .chat-at-user { padding: 2px 5px; border-radius: 3px; - font-weight: 600; cursor: pointer; } } @@ -419,7 +416,7 @@ &.chat-msg-mine { text-align: right; padding-left: 0; - padding-right: 60px; + padding-right: 48px; .head-image { left: auto; @@ -444,9 +441,8 @@ .chat-msg-text { margin-left: 10px; - background-color: rgb(88, 127, 240); + background-color: var(--im-color-primary-light-2); color: #fff; - vertical-align: top; &:after { left: auto; @@ -476,4 +472,4 @@ } } - \ No newline at end of file + diff --git a/im-web/src/components/common/Emotion.vue b/im-web/src/components/common/Emotion.vue index 8414e24..41fc5ff 100644 --- a/im-web/src/components/common/Emotion.vue +++ b/im-web/src/components/common/Emotion.vue @@ -1,7 +1,7 @@ - + @@ -39,26 +39,23 @@ }, computed: { x() { - return this.pos.x - 200; + return this.pos.x - 22; }, y() { - return this.pos.y - 280; + return this.pos.y - 234; } } } \ No newline at end of file + diff --git a/im-web/src/components/common/FullImage.vue b/im-web/src/components/common/FullImage.vue index 444833e..7d85f42 100644 --- a/im-web/src/components/common/FullImage.vue +++ b/im-web/src/components/common/FullImage.vue @@ -2,9 +2,9 @@ - + - x + @@ -37,31 +37,35 @@ position: fixed; width: 100%; height: 100%; - - + left: 0; + top: 0; + bottom: 0; + right: 0; + .mask{ position: fixed; width: 100%; height: 100%; background: black; - opacity: 0.9; + opacity: 0.5; + } - + .image-box { position: relative; width: 100%; height: 100%; - + img{ position: absolute; - left: 50%; - top: 50%; - transform: translate(-50%, -50%); - max-height: 100%; - max-width: 100%; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + max-height: 100%; + max-width: 100%; } } - + .close{ position: fixed; top: 10px; @@ -69,10 +73,8 @@ color: white; font-size: 25px; cursor: pointer; - - } } - - - \ No newline at end of file + + + diff --git a/im-web/src/components/common/HeadImage.vue b/im-web/src/components/common/HeadImage.vue index 521e5ac..e7ca1d4 100644 --- a/im-web/src/components/common/HeadImage.vue +++ b/im-web/src/components/common/HeadImage.vue @@ -1,16 +1,15 @@ - - + - {{name.substring(0,2).toUpperCase()}} + {{name?.substring(0,2).toUpperCase()}} diff --git a/im-web/src/components/common/RightMenu.vue b/im-web/src/components/common/RightMenu.vue index bc5f6eb..f4478d5 100644 --- a/im-web/src/components/common/RightMenu.vue +++ b/im-web/src/components/common/RightMenu.vue @@ -4,9 +4,8 @@ - + {{item.name}} - @@ -53,22 +52,25 @@ .right-menu { position: fixed; - box-shadow: 0px 0px 10px #ccc; + border-radius: 8px; + overflow: hidden; + box-shadow: var(--im-box-shadow-light); .el-menu { - border: 1px solid #b4b4b4; - border-radius: 7px; + border-radius: 4px; overflow: hidden; - + .el-menu-item { - height: 40px; - line-height: 40px; - border-bottom: 1px solid #d0d0d0; + height: 36px; + line-height: 36px; + min-width: 100px; + text-align: left; + padding: 0 0 0 20px; - span { - font-weight: 600; - } + &:hover { + background-color: var(--im-background-active); + } } } } - \ No newline at end of file + diff --git a/im-web/src/components/common/UserInfo.vue b/im-web/src/components/common/UserInfo.vue index e0b4628..cc527bf 100644 --- a/im-web/src/components/common/UserInfo.vue +++ b/im-web/src/components/common/UserInfo.vue @@ -100,17 +100,19 @@ \ No newline at end of file + diff --git a/im-web/src/components/friend/AddFriend.vue b/im-web/src/components/friend/AddFriend.vue index 77e1e2f..31bf335 100644 --- a/im-web/src/components/friend/AddFriend.vue +++ b/im-web/src/components/friend/AddFriend.vue @@ -1,6 +1,6 @@ - - + + @@ -8,7 +8,7 @@ - @@ -32,8 +32,8 @@ diff --git a/im-web/src/components/friend/FriendItem.vue b/im-web/src/components/friend/FriendItem.vue index aa65316..d89106e 100644 --- a/im-web/src/components/friend/FriendItem.vue +++ b/im-web/src/components/friend/FriendItem.vue @@ -1,16 +1,18 @@ - + {{ friend.nickName}} - - + + + + + + @@ -86,28 +88,24 @@ .friend-item { height: 50px; display: flex; - margin-bottom: 1px; position: relative; padding: 5px 10px; align-items: center; - background-color: #fafafa; white-space: nowrap; cursor: pointer; - &:hover { - background-color: #F8FAFF; - } - - &.active { - background-color: #F4F9FF; - } - + &:hover { + background-color: var(--im-background-active); + } + + &.active { + background-color: var(--im-background-active-dark); + } + .friend-avatar { display: flex; justify-content: center; align-items: center; - width: 45px; - height: 45px; } .friend-info { @@ -118,21 +116,30 @@ text-align: left; .friend-name { - font-size: 15px; - font-weight: 600; - line-height: 30px; + font-size: var(--im-font-size); white-space: nowrap; overflow: hidden; } .friend-online { .online { + font-weight: bold; padding-right: 2px; - width: 15px; - height: 15px; - + font-size: 16px; + position: relative; } + + .online-icon{ + position: absolute; + right: 0; + bottom: 0; + width: 6px; + height: 6px; + background: limegreen; + border-radius: 50%; + border: 1px solid white; + } } } } - \ No newline at end of file + diff --git a/im-web/src/components/group/AddGroupMember.vue b/im-web/src/components/group/AddGroupMember.vue index ada2f7b..4da3c09 100644 --- a/im-web/src/components/group/AddGroupMember.vue +++ b/im-web/src/components/group/AddGroupMember.vue @@ -1,166 +1,180 @@ - - - - - - - - - - - - - - - - - 已勾选{{checkCount}}位好友 - - - - - - - - - + + + + + + + + + + + + + + + + + + + 已勾选{{ checkCount }}位好友 + + + + + + + + + 取 消 确 定 - + \ No newline at end of file + .el-input__inner { + border: unset; + border-bottom: var(--im-border); + } + + } + + .agm-friend-checkbox { + margin-right: 20px; + } + } + + .agm-arrow { + display: flex; + align-items: center; + font-size: 18px; + padding: 10px; + font-weight: 600; + color: var(--im-color-primary); + } + + .agm-r-box { + flex: 1; + border: var(--im-border); + + .agm-select-tip { + text-align: left; + height: 40px; + line-height: 40px; + text-indent: 6px; + color: var(--im-text-color-light) + + } + } +} + diff --git a/im-web/src/components/group/GroupItem.vue b/im-web/src/components/group/GroupItem.vue index fd2b811..f9bcb2f 100644 --- a/im-web/src/components/group/GroupItem.vue +++ b/im-web/src/components/group/GroupItem.vue @@ -1,7 +1,7 @@ - + {{group.showGroupName}} @@ -36,27 +36,20 @@ .group-item { height: 50px; display: flex; - margin-bottom: 1px; position: relative; padding: 5px 10px; align-items: center; - background-color: white; white-space: nowrap; cursor: pointer; - - &:hover { - background-color: #F8FAFF; - } - - &.active { - background-color: #F4F9FF; - } - - .group-avatar { - width: 45px; - height: 45px; - } - + + &:hover { + background-color: var(--im-background-active); + } + + &.active { + background-color: var(--im-background-active-dark); + } + .group-name { padding-left: 10px; height: 100%; @@ -64,8 +57,7 @@ line-height: 50px; white-space: nowrap; overflow: hidden; - font-size: 15px; - font-weight: 600; + font-size: var(--im-font-size); } } diff --git a/im-web/src/components/group/GroupMember.vue b/im-web/src/components/group/GroupMember.vue index 21dfac8..ba20bde 100644 --- a/im-web/src/components/group/GroupMember.vue +++ b/im-web/src/components/group/GroupMember.vue @@ -1,12 +1,11 @@ - {{member.showNickName}} - @@ -49,10 +48,10 @@ height: 30px; line-height: 30px; white-space: nowrap; - text-overflow:ellipsis; + text-overflow:ellipsis; overflow:hidden } - + .btn-kick { display: none; position: absolute; @@ -62,7 +61,7 @@ font-size: 20px; cursor: pointer; } - + &:hover .btn-kick{ display: block; color: #ce1818; diff --git a/im-web/src/components/group/GroupMemberItem.vue b/im-web/src/components/group/GroupMemberItem.vue index 20e13bd..a49ded4 100644 --- a/im-web/src/components/group/GroupMemberItem.vue +++ b/im-web/src/components/group/GroupMemberItem.vue @@ -1,7 +1,7 @@ - @@ -40,16 +40,14 @@ export default { diff --git a/im-web/src/components/group/GroupMemberSelector.vue b/im-web/src/components/group/GroupMemberSelector.vue index 133b774..163e11f 100644 --- a/im-web/src/components/group/GroupMemberSelector.vue +++ b/im-web/src/components/group/GroupMemberSelector.vue @@ -1,5 +1,5 @@ - + @@ -53,7 +53,7 @@ props: { groupId: { type: Number - } + } }, methods: { open(maxSize, checkedIds, lockedIds) { @@ -118,9 +118,13 @@ .left-box { width: 48%; - border: #587FF0 solid 1px; - border-radius: 5px; overflow: hidden; + border: var(--im-border); + + .el-input__inner { + border: none; + border-bottom: var(--im-border); + } } @@ -130,20 +134,19 @@ font-size: 20px; padding: 10px; font-weight: 600; - color: #687Ff0; + color: var(--im-color-primary); } .right-box { - width: 48%; - border: #587FF0 solid 1px; - border-radius: 5px; + border: var(--im-border); .select-tip { text-align: left; height: 40px; line-height: 40px; text-indent: 5px; + color: var(--im-text-color-light) } .checked-member-list { @@ -158,4 +161,4 @@ } } } - \ No newline at end of file + diff --git a/im-web/src/components/rtc/RtcPrivateAcceptor.vue b/im-web/src/components/rtc/RtcPrivateAcceptor.vue index 6ffae6b..2e1410e 100644 --- a/im-web/src/components/rtc/RtcPrivateAcceptor.vue +++ b/im-web/src/components/rtc/RtcPrivateAcceptor.vue @@ -1,6 +1,6 @@ - - + + {{tip}} @@ -50,9 +50,9 @@ width: 250px; height: 250px; padding: 20px; - background-color: #eeeeee; - border: #dddddd solid 5px; - border-radius: 3%; + background-color: #fff; + box-shadow: var(--im-box-shadow-dark); + border-radius: 4px; .acceptor-text { padding: 10px; @@ -123,4 +123,4 @@ } } } - \ No newline at end of file + diff --git a/im-web/src/components/rtc/RtcPrivateVideo.vue b/im-web/src/components/rtc/RtcPrivateVideo.vue index f7d790d..3e01946 100644 --- a/im-web/src/components/rtc/RtcPrivateVideo.vue +++ b/im-web/src/components/rtc/RtcPrivateVideo.vue @@ -1,500 +1,508 @@ - - - - - - - - - - - - - - - - {{friend.nickName}} - - - - - - - - - + + + + + + + + + + + + + + + + {{ friend.nickName }} + + + + + + + + + \ No newline at end of file + .icon { + font-size: 50px; + cursor: pointer; + } + } +} + + diff --git a/im-web/src/components/setting/Setting.vue b/im-web/src/components/setting/Setting.vue index 326874f..6303381 100644 --- a/im-web/src/components/setting/Setting.vue +++ b/im-web/src/components/setting/Setting.vue @@ -1,144 +1,144 @@ - - - - - - - - - - - - - - - - - 男 - 女 - - - - - - + + + + + + + + + + + + + + + + + 男 + 女 + + + + + + - + 取 消 确 定 - + - diff --git a/im-web/src/main.js b/im-web/src/main.js index f10f109..2fccb32 100644 --- a/im-web/src/main.js +++ b/im-web/src/main.js @@ -2,8 +2,9 @@ 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/style/im.scss'; import './assets/iconfont/iconfont.css'; + import httpRequest from './api/httpRequest'; import * as socketApi from './api/wssocket'; import * as messageType from './api/messageType'; @@ -33,3 +34,4 @@ new Vue({ store, render: h=>h(App) }) + diff --git a/im-web/src/view/Chat.vue b/im-web/src/view/Chat.vue index be1be02..63759a3 100644 --- a/im-web/src/view/Chat.vue +++ b/im-web/src/view/Chat.vue @@ -1,104 +1,103 @@ - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + \ No newline at end of file + .chat-list-header { + height: 50px; + display: flex; + align-items: center; + padding: 0 8px; + } + + .chat-list-loading { + height: 50px; + background-color: #eee; + + .el-icon-loading { + font-size: 24px; + color: var(--im-text-color-light); + } + + .el-loading-text { + color: var(--im-text-color-light); + } + + .chat-loading-box { + height: 100%; + } + } + + .chat-list-items { + flex: 1; + } + } +} + diff --git a/im-web/src/view/Friend.vue b/im-web/src/view/Friend.vue index 9775edb..4199860 100644 --- a/im-web/src/view/Friend.vue +++ b/im-web/src/view/Friend.vue @@ -1,8 +1,8 @@ - + - + - + @@ -36,7 +36,6 @@ {{ userInfo.sex==0?"男":"女" }} {{ userInfo.signature }} - - + @@ -182,69 +181,56 @@ .friend-list-box { display: flex; flex-direction: column; - border-right: #53a0e79c solid 1px; - background: white; + background: var(--im-background); .friend-list-header { - height: 50px; - display: flex; - align-items: center; - padding: 3px 8px; - border-bottom: 1px #ddd solid; - - .el-input__inner { - border-radius: 10px !important; - background-color: #F8F8F8; - } - + height: 50px; + display: flex; + align-items: center; + padding: 0 8px; + .add-btn { padding: 5px !important; margin: 5px; - font-size: 20px; - color: #587FF0; - border: #587FF0 1px solid; - background-color: #F0F8FF; + font-size: 16px; border-radius: 50%; } } .friend-list-items { flex: 1; - margin: 0 3px; - background: #F8F8F8; } } .friend-box { display: flex; - flex-direction: column; + flex-direction: column; .friend-header { - padding: 3px; - height: 50px; - line-height: 50px; - font-size: 20px; - font-weight: 600; - text-align: center; - background-color: white; - border-bottom: 1px #ddd solid; + height: 50px; + display: flex; + justify-content: space-between; + align-items: center; + padding: 0 12px; + font-size: var(--im-font-size-larger); + border-bottom: var(--im-border); + box-sizing: border-box; } .friend-detail { display: flex; padding: 50px 80px 20px 80px; text-align: center; - - + + .info-item { margin-left: 20px; background-color: #ffffff; - border-radius: 10px ; border: 1px #ddd solid; } .description { - padding: 20px 20px 0px 20px; + padding: 20px 20px 0 20px; } } @@ -254,4 +240,4 @@ } } } - \ No newline at end of file + diff --git a/im-web/src/view/Group.vue b/im-web/src/view/Group.vue index 6dcf5f3..fb25c40 100644 --- a/im-web/src/view/Group.vue +++ b/im-web/src/view/Group.vue @@ -1,422 +1,416 @@ - - - - - - - - - - - - - - - - - - {{activeGroup.showGroupName}}({{groupMembers.length}}) - - - - - - - - - - - - 发消息 - - - - - - - - - - - - - - - - - - - 保存 - 退出群聊 - 解散群聊 - - - - - - - - - - - - - - 邀请 - - - - - - - - + + + + + + + + + + + + + + + + + + {{ activeGroup.showGroupName }}({{ groupMembers.length }}) + + + + + + + + + + + + 发消息 + + + + + + + + + + + + + + + + + + + + 邀请 + 保存 + 退出 + 解散 + + + + + + + + + + + + + 邀请 + + + + + + + \ No newline at end of file + } +} + diff --git a/im-web/src/view/Home.vue b/im-web/src/view/Home.vue index 8900315..2255b4b 100644 --- a/im-web/src/view/Home.vue +++ b/im-web/src/view/Home.vue @@ -1,431 +1,515 @@ - - - - - - - - - - - {{ unreadCount }} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + {{ unreadCount }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file + From 660ea031880cff1a806c7d5b80053683d255c356 Mon Sep 17 00:00:00 2001 From: xsx <825657193@qq.com> Date: Mon, 11 Nov 2024 22:47:25 +0800 Subject: [PATCH 05/15] =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- im-web/src/components/common/FullImage.vue | 32 +++++------ im-web/src/components/common/HeadImage.vue | 57 ++++++++++--------- im-web/src/components/rtc/RtcPrivateVideo.vue | 2 +- im-web/src/view/Friend.vue | 35 ++++++------ im-web/src/view/Group.vue | 6 +- im-web/src/view/Home.vue | 6 +- 6 files changed, 68 insertions(+), 70 deletions(-) diff --git a/im-web/src/components/common/FullImage.vue b/im-web/src/components/common/FullImage.vue index 7d85f42..99538e7 100644 --- a/im-web/src/components/common/FullImage.vue +++ b/im-web/src/components/common/FullImage.vue @@ -2,7 +2,7 @@ - + @@ -33,16 +33,16 @@ + \ No newline at end of file diff --git a/im-web/src/components/common/HeadImage.vue b/im-web/src/components/common/HeadImage.vue index e7ca1d4..8086d62 100644 --- a/im-web/src/components/common/HeadImage.vue +++ b/im-web/src/components/common/HeadImage.vue @@ -1,9 +1,9 @@ - + - {{name?.substring(0,2).toUpperCase()}} + {{name?.substring(0,2).toUpperCase()}} + @@ -14,13 +14,14 @@ name: "headImage", data() { return { - colors: ["#5daa31", "#c7515a", "#e03697", "#85029b", - "#c9b455", "#326eb6"] + colors: ["#5daa31", "#c7515a", "#e03697", "#85029b", + "#c9b455", "#326eb6" + ] } }, props: { - id:{ + id: { type: Number }, size: { @@ -33,41 +34,41 @@ height: { type: Number }, - radius:{ + radius: { type: String, default: "50%" }, url: { type: String }, - name:{ + name: { type: String, default: null }, - online:{ + online: { type: Boolean, - default:false + default: false }, - isShowUserInfo: { - type: Boolean, - default: true - } + isShowUserInfo: { + type: Boolean, + default: true + } }, - methods:{ - showUserInfo(e){ - if(!this.isShowUserInfo) return; - if(this.id && this.id>0){ + methods: { + showUserInfo(e) { + if (!this.isShowUserInfo) return; + if (this.id && this.id > 0) { this.$http({ url: `/user/find/${this.id}`, method: 'get' }).then((user) => { - this.$store.commit("setUserInfoBoxPos",e); - this.$store.commit("showUserInfoBox",user); + this.$store.commit("setUserInfoBoxPos", e); + this.$store.commit("showUserInfoBox", user); }) } } }, - computed:{ + computed: { avatarImageStyle() { let w = this.width ? this.width : this.size; let h = this.height ? this.height : this.size; @@ -84,12 +85,12 @@ border-radius: ${this.radius}; ` }, - textColor(){ + textColor() { let hash = 0; - for (var i = 0; i< this.name.length; i++) { + for (var i = 0; i < this.name.length; i++) { hash += this.name.charCodeAt(i); } - return this.colors[hash%this.colors.length]; + return this.colors[hash % this.colors.length]; } } } @@ -106,16 +107,16 @@ display: block; } - .avatar-text{ + .avatar-text { color: white; display: flex; align-items: center; justify-content: center; //border: 1px solid #ccc; - //box-shadow: var(--im-box-shadow); + //box-shadow: var(--im-box-shadow); } - .online{ + .online { position: absolute; right: -5px; bottom: 0; @@ -126,4 +127,4 @@ border: 2px solid white; } } - + \ No newline at end of file diff --git a/im-web/src/components/rtc/RtcPrivateVideo.vue b/im-web/src/components/rtc/RtcPrivateVideo.vue index 3e01946..44001ea 100644 --- a/im-web/src/components/rtc/RtcPrivateVideo.vue +++ b/im-web/src/components/rtc/RtcPrivateVideo.vue @@ -15,7 +15,7 @@ + :url="friend.headImage" :isShowUserInfo="false" radius="0"> diff --git a/im-web/src/view/Friend.vue b/im-web/src/view/Friend.vue index 4199860..ca23360 100644 --- a/im-web/src/view/Friend.vue +++ b/im-web/src/view/Friend.vue @@ -24,7 +24,7 @@ - @@ -47,7 +47,7 @@ - + @@ -181,13 +181,13 @@ .friend-list-box { display: flex; flex-direction: column; - background: var(--im-background); + background: var(--im-background); .friend-list-header { - height: 50px; - display: flex; - align-items: center; - padding: 0 8px; + height: 50px; + display: flex; + align-items: center; + padding: 0 8px; .add-btn { padding: 5px !important; @@ -207,22 +207,21 @@ flex-direction: column; .friend-header { - height: 50px; - display: flex; - justify-content: space-between; - align-items: center; - padding: 0 12px; - font-size: var(--im-font-size-larger); - border-bottom: var(--im-border); - box-sizing: border-box; + height: 50px; + display: flex; + justify-content: space-between; + align-items: center; + padding: 0 12px; + font-size: var(--im-font-size-larger); + border-bottom: var(--im-border); + box-sizing: border-box; } .friend-detail { display: flex; padding: 50px 80px 20px 80px; text-align: center; - - + .info-item { margin-left: 20px; background-color: #ffffff; @@ -240,4 +239,4 @@ } } } - + \ No newline at end of file diff --git a/im-web/src/view/Group.vue b/im-web/src/view/Group.vue index fb25c40..813c59a 100644 --- a/im-web/src/view/Group.vue +++ b/im-web/src/view/Group.vue @@ -29,8 +29,8 @@ - + 发消息 @@ -328,7 +328,7 @@ export default { } .avatar-uploader { - --width: 120px; + --width: 160px; text-align: left; .el-upload { diff --git a/im-web/src/view/Home.vue b/im-web/src/view/Home.vue index 2255b4b..4bc93ad 100644 --- a/im-web/src/view/Home.vue +++ b/im-web/src/view/Home.vue @@ -82,7 +82,7 @@ export default { return { showSettingDialog: false, lastPlayAudioTime: new Date().getTime() - 1000, - isFullscreen: false + isFullscreen: true } }, methods: { @@ -409,9 +409,9 @@ export default { .navi-bar { --icon-font-size: 22px; - --width: 56px; + --width: 60px; width: var(--width); - background: var(--im-color-primary); + background: var(--im-color-primary-light-1); padding-top: 20px; .navi-bar-box { From 4f76dc5b2c38f37b393d4c1d59c7b7700c61ccc2 Mon Sep 17 00:00:00 2001 From: xsx <825657193@qq.com> Date: Mon, 11 Nov 2024 23:22:37 +0800 Subject: [PATCH 06/15] =?UTF-8?q?=E6=98=BE=E7=A4=BA=E8=81=8A=E5=A4=A9?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E6=8C=87=E5=90=91=E7=AE=AD=E5=A4=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- im-web/src/components/chat/ChatMessageItem.vue | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/im-web/src/components/chat/ChatMessageItem.vue b/im-web/src/components/chat/ChatMessageItem.vue index 0640a50..7032499 100644 --- a/im-web/src/components/chat/ChatMessageItem.vue +++ b/im-web/src/components/chat/ChatMessageItem.vue @@ -257,7 +257,8 @@ .chat-msg-bottom { display: inline-block; padding-right: 300px; - + padding-left: 5px; + .chat-msg-text { display: block; position: relative; @@ -276,7 +277,6 @@ position: absolute; left: -10px; top: 13px; - z-index: -1; width: 0; height: 0; border-style: solid dashed dashed; @@ -437,7 +437,7 @@ .chat-msg-bottom { padding-left: 180px; - padding-right: 0; + padding-right: 5px; .chat-msg-text { margin-left: 10px; @@ -447,7 +447,7 @@ &:after { left: auto; right: -10px; - border-top-color: rgb(88, 127, 240); + border-top-color: var(--im-color-primary-light-2); } } From 817e6b118ba5eac36a01ee89004a9018f630b6dc Mon Sep 17 00:00:00 2001 From: libaogang <237412637@qq.com> Date: Mon, 11 Nov 2024 22:23:04 +0800 Subject: [PATCH 07/15] =?UTF-8?q?=E5=B7=A6=E4=BE=A7=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E5=9B=BE=E6=A0=87=E9=A2=9C=E8=89=B2=E8=B7=9F=E9=9A=8F=E4=B8=BB?= =?UTF-8?q?=E9=A2=98=E5=8F=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- im-web/src/view/Home.vue | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/im-web/src/view/Home.vue b/im-web/src/view/Home.vue index 2255b4b..6859165 100644 --- a/im-web/src/view/Home.vue +++ b/im-web/src/view/Home.vue @@ -385,7 +385,7 @@ export default { align-items: center; border-radius: 4px; overflow: hidden; - background: #e8f2ff; + background: var(--im-color-primary-light-9); //background-image: url('../assets/image/background.jpg'); .app-container { @@ -430,7 +430,6 @@ export default { justify-content: center; } - --menu-color: #9DC4FF; .menu { height: 200px; //margin-top: 10px; @@ -449,12 +448,12 @@ export default { } .link:not(.router-link-active) .menu-item:hover { - color: #fff; + color: var(--im-color-primary-light-7); } .menu-item { position: relative; - color: var(--menu-color); + color: var(--im-color-primary-light-4); width: var(--width); height: 46px; display: flex; @@ -474,7 +473,7 @@ export default { color: white; border-radius: 30px; padding: 0 5px; - font-size: 12px; + font-size: var(--im-font-size-smaller); text-align: center; white-space: nowrap; border: 1px solid #f1e5e5; @@ -489,7 +488,7 @@ export default { height: 50px; width: 100%; cursor: pointer; - color: var(--menu-color); + color: var(--im-color-primary-light-4); font-size: var(--icon-font-size); .icon { @@ -498,7 +497,7 @@ export default { &:hover { font-weight: 600; - color: #fff; + color: var(--im-color-primary-light-7); } } } From ea510ecf7dc698051db5b9a29755ca76c28e70cc Mon Sep 17 00:00:00 2001 From: xsx <825657193@qq.com> Date: Wed, 20 Nov 2024 22:36:41 +0800 Subject: [PATCH 08/15] =?UTF-8?q?fix:=20=E7=BE=A4=E4=B8=BB=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E5=A4=B4=E5=83=8F=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/bx/implatform/service/impl/GroupServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java index ba8389c..fda628a 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java @@ -65,6 +65,7 @@ public class GroupServiceImpl extends ServiceImpl implements member.setGroupId(group.getId()); member.setUserId(user.getId()); member.setHeadImage(user.getHeadImageThumb()); + member.setUserNickName(user.getNickName()); member.setRemarkNickName(vo.getRemarkNickName()); member.setRemarkGroupName(vo.getRemarkGroupName()); groupMemberService.save(member); From b7d447a4204adf629aee3545dcddca051145c1a2 Mon Sep 17 00:00:00 2001 From: libaogang <237412637@qq.com> Date: Sun, 17 Nov 2024 20:44:10 +0800 Subject: [PATCH 09/15] =?UTF-8?q?uniapp=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- im-uniapp/App.vue | 31 +++- .../components/chat-at-box/chat-at-box.vue | 24 +-- .../chat-group-readed/chat-group-readed.vue | 5 +- im-uniapp/components/chat-item/chat-item.vue | 57 ++++--- .../chat-message-item/chat-message-item.vue | 79 +++++----- .../components/chat-record/chat-record.vue | 32 ++-- .../components/friend-item/friend-item.vue | 21 ++- .../components/group-item/group-item.vue | 23 +-- .../components/head-image/head-image.vue | 37 +++-- im-uniapp/components/nav-bar/nav-bar.vue | 118 +++++++++++++++ im-uniapp/components/pop-menu/pop-menu.vue | 32 ++-- im-uniapp/im-var.scss | 60 ++++++++ im-uniapp/im.scss | 141 +++++++++++++++++ im-uniapp/pages.json | 7 +- im-uniapp/pages/chat/chat-box.vue | 61 ++++---- im-uniapp/pages/chat/chat.vue | 31 +--- im-uniapp/pages/common/user-info.vue | 143 ++++++++++-------- im-uniapp/pages/friend/friend-add.vue | 14 +- im-uniapp/pages/friend/friend.vue | 45 +++--- im-uniapp/pages/group/group-edit.vue | 60 ++++---- im-uniapp/pages/group/group-info.vue | 65 ++++---- im-uniapp/pages/group/group-invite.vue | 33 ++-- im-uniapp/pages/group/group-member.vue | 25 ++- im-uniapp/pages/group/group.vue | 22 +-- im-uniapp/pages/login/login.vue | 13 +- im-uniapp/pages/mine/mine-edit.vue | 58 +++---- im-uniapp/pages/mine/mine-password.vue | 32 ++-- im-uniapp/pages/mine/mine.vue | 112 ++++++++------ im-uniapp/pages/register/register.vue | 11 +- im-uniapp/uni.scss | 46 ++++++ 30 files changed, 922 insertions(+), 516 deletions(-) create mode 100644 im-uniapp/components/nav-bar/nav-bar.vue create mode 100644 im-uniapp/im-var.scss create mode 100644 im-uniapp/im.scss diff --git a/im-uniapp/App.vue b/im-uniapp/App.vue index e2c7c3a..b594875 100644 --- a/im-uniapp/App.vue +++ b/im-uniapp/App.vue @@ -383,6 +383,7 @@ \ No newline at end of file diff --git a/im-uniapp/components/chat-at-box/chat-at-box.vue b/im-uniapp/components/chat-at-box/chat-at-box.vue index d9627dd..0273268 100644 --- a/im-uniapp/components/chat-at-box/chat-at-box.vue +++ b/im-uniapp/components/chat-at-box/chat-at-box.vue @@ -10,7 +10,7 @@ - + @@ -21,13 +21,13 @@ - + + size="small"> {{ m.showNickName}} - - - + + + @@ -112,7 +112,7 @@ flex-direction: column; background-color: white; padding: 10rpx; - border-radius: 15rpx; + //border-radius: 15rpx; .chat-at-top { display: flex; @@ -148,19 +148,23 @@ overflow: hidden; .member-item { - height: 120rpx; + height: 110rpx; display: flex; position: relative; padding: 0 30rpx; align-items: center; background-color: white; white-space: nowrap; + margin-bottom: 1px; + + &.checked { + background-color: $im-color-primary-light-9; + } .member-name { flex: 1; padding-left: 20rpx; - font-size: 30rpx; - font-weight: 600; + font-size: $im-font-size; line-height: 60rpx; white-space: nowrap; overflow: hidden; diff --git a/im-uniapp/components/chat-group-readed/chat-group-readed.vue b/im-uniapp/components/chat-group-readed/chat-group-readed.vue index 5a8de75..3359d70 100644 --- a/im-uniapp/components/chat-group-readed/chat-group-readed.vue +++ b/im-uniapp/components/chat-group-readed/chat-group-readed.vue @@ -2,7 +2,7 @@ - + @@ -100,7 +100,8 @@ flex-direction: column; background-color: white; padding: 10rpx; - border-radius: 15rpx; + + //border-radius: 15rpx; .scroll-bar { height: 800rpx; } diff --git a/im-uniapp/components/chat-item/chat-item.vue b/im-uniapp/components/chat-item/chat-item.vue index 7dcf1c1..dfa6265 100644 --- a/im-uniapp/components/chat-item/chat-item.vue +++ b/im-uniapp/components/chat-item/chat-item.vue @@ -3,13 +3,13 @@ - + {{chat.showName}} - + {{$date.toTimeText(chat.lastSendTime,true)}} @@ -17,7 +17,7 @@ {{atText}} {{chat.sendNickName+': '}} - + @@ -76,28 +76,29 @@ \ No newline at end of file diff --git a/im-uniapp/components/friend-item/friend-item.vue b/im-uniapp/components/friend-item/friend-item.vue index 5a475f5..726fe46 100644 --- a/im-uniapp/components/friend-item/friend-item.vue +++ b/im-uniapp/components/friend-item/friend-item.vue @@ -1,7 +1,6 @@ - + {{ friend.nickName}} @@ -37,7 +36,7 @@ \ No newline at end of file + diff --git a/im-uniapp/components/group-item/group-item.vue b/im-uniapp/components/group-item/group-item.vue index 5bf3f89..087d36f 100644 --- a/im-uniapp/components/group-item/group-item.vue +++ b/im-uniapp/components/group-item/group-item.vue @@ -1,7 +1,7 @@ + :url="group.headImage"> {{ group.showGroupName}} @@ -33,21 +33,24 @@ .group-item { height: 100rpx; display: flex; - margin-bottom: 1rpx; + margin-bottom: 2rpx; position: relative; - padding: 10rpx; - padding-left: 20rpx; + padding: 18rpx 20rpx; align-items: center; background-color: white; white-space: nowrap; - &:hover { - background-color: #f5f6ff; - } - .group-name { - font-size: 32rpx; + &:hover { + background-color: $im-bg-active; + } + + &.active { + background-color: $im-bg-active; + } + + .group-name { + font-size: $im-font-size; padding-left: 20rpx; - font-weight: 600; text-align: left; white-space: nowrap; overflow: hidden; diff --git a/im-uniapp/components/head-image/head-image.vue b/im-uniapp/components/head-image/head-image.vue index f8298c2..5a12ed3 100644 --- a/im-uniapp/components/head-image/head-image.vue +++ b/im-uniapp/components/head-image/head-image.vue @@ -3,7 +3,7 @@ - {{name.substring(0,1).toUpperCase()}} + {{name?.substring(0,1).toUpperCase()}} @@ -24,20 +24,20 @@ type: Number }, size: { - type: Number, - default: 20 + type: [Number, String], + default: 'default' }, url: { type: String }, name: { type: String, - default: "?" + default: null }, online: { type: Boolean, default: false - } + }, }, methods: { showUserInfo(e) { @@ -49,15 +49,30 @@ } }, computed: { + _size(){ + if(typeof this.size === 'number'){ + return this.size; + } else if(typeof this.size === 'string'){ + return { + 'default': 96, + 'small': 84, + 'smaller': 72, + 'mini': 60, + 'minier': 48, + 'lage': 108, + 'lager': 120, + }[this.size] + } + }, avatarImageStyle() { - return `width:${this.size}rpx; - height:${this.size}rpx;` + return `width:${this._size}rpx; + height:${this._size}rpx;` }, avatarTextStyle() { - return `width: ${this.size}rpx; - height:${this.size}rpx; - background-color:${this.textColor}; - font-size:${this.size*0.5}rpx; + return `width: ${this._size}rpx; + height:${this._size}rpx; + background-color:${this.name ? this.textColor : '#fff'}; + font-size:${this._size*0.5}rpx; ` }, textColor() { diff --git a/im-uniapp/components/nav-bar/nav-bar.vue b/im-uniapp/components/nav-bar/nav-bar.vue new file mode 100644 index 0000000..d928939 --- /dev/null +++ b/im-uniapp/components/nav-bar/nav-bar.vue @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/im-uniapp/components/pop-menu/pop-menu.vue b/im-uniapp/components/pop-menu/pop-menu.vue index 9677c9a..e9b2cb4 100644 --- a/im-uniapp/components/pop-menu/pop-menu.vue +++ b/im-uniapp/components/pop-menu/pop-menu.vue @@ -6,7 +6,7 @@ - + {{item.name}} @@ -75,7 +75,7 @@ if(item.color){ return `color:${item.color};` } - return `color:#4f76e6;`; + // return `color:#4f76e6;`; } } } @@ -90,29 +90,29 @@ bottom: 0; width: 100%; height: 100%; - background-color: #333; z-index: 999; - opacity: 0.5; - } .menu { position: fixed; - border: 1px solid #b4b4b4; - border-radius: 7px; + border-radius: 4px; overflow: hidden; - background-color: #f5f6ff; + background-color: #fff; z-index: 1000; + box-shadow: $im-box-shadow-dark; .menu-item { - height: 25px; - min-width: 150rpx; - line-height: 25px; - font-size: 18px; + height: 28px; + min-width: 120rpx; + line-height: 28px; + font-size: $im-font-size-small; display: flex; - padding: 10px; - justify-content: center; - border-bottom: 1px solid #d0d0d8; - + padding: 6px 20px; + justify-content: flex-start; + + &:hover { + background: $im-bg-active; + } + .menu-icon { margin-right: 10rpx; } diff --git a/im-uniapp/im-var.scss b/im-uniapp/im-var.scss new file mode 100644 index 0000000..2a06ac2 --- /dev/null +++ b/im-uniapp/im-var.scss @@ -0,0 +1,60 @@ +// 颜色 +$im-color-primary: #3e45d7; +$im-color-primary-light-1: mix(#fff, $im-color-primary, 10%); +$im-color-primary-light-2: mix(#fff, $im-color-primary, 20%); +$im-color-primary-light-3: mix(#fff, $im-color-primary, 30%); +$im-color-primary-light-4: mix(#fff, $im-color-primary, 40%); +$im-color-primary-light-5: mix(#fff, $im-color-primary, 50%); +$im-color-primary-light-6: mix(#fff, $im-color-primary, 60%); +$im-color-primary-light-7: mix(#fff, $im-color-primary, 70%); +$im-color-primary-light-8: mix(#fff, $im-color-primary, 80%); +$im-color-primary-light-9: mix(#fff, $im-color-primary, 90%); +$im-color-primary-dark-1: mix(#000, $im-color-primary, 10%); +$im-color-primary-dark-2: mix(#000, $im-color-primary, 20%); +$im-color-primary-dark-3: mix(#000, $im-color-primary, 30%); +$im-color-primary-dark-4: mix(#000, $im-color-primary, 40%); + +$im-color-success: #18bc37; +$im-color-warning: #f3a73f; +$im-color-danger: #e43d33; +$im-color-info: #8f939c; + +// 文字颜色 +$im-text-color: #000000; +$im-text-color-light: #6a6a6a; +$im-text-color-lighter: #909399; +$im-text-color-lighter-extra: #c7c7c7; + +// 边框颜色 +$im-border: #F0F0F0; +$im-border-light: #EDEDED; +$im-border-lighter: #DCDCDC; +$im-border-lighter-extra: #B9B9B9; + +// 文字大小 +$im-font-size: 30rpx; +$im-font-size-small: 28rpx; +$im-font-size-smaller: 26rpx; +$im-font-size-smaller-extra: 24rpx; +$im-font-size-large: 32rpx; +$im-font-size-larger: 34rpx; +$im-font-size-larger-extra: 36rpx; + +// 阴影 +$im-box-shadow: 0 2px 4px rgba(0, 0, 0, .12), 0 0 6px rgba(0, 0, 0, .04); +$im-box-shadow-light: 0 2px 12px 0 rgba(0, 0, 0, 0.1); +$im-box-shadow-lighter: 0px 0px 6px rgba(0, 0, 0, .12); +$im-box-shadow-dark: 0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5); + +// 背景 +$im-bg: #f7f7f7; +$im-bg-active: #f1f1f1; + +// 标题 +$im-title-size: 26px; +$im-title-size-1: 22px; +$im-title-size-2: 18px; + +$font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, SimSun, sans-serif; + +$im-nav-bar-height: 50px; \ No newline at end of file diff --git a/im-uniapp/im.scss b/im-uniapp/im.scss new file mode 100644 index 0000000..212dccf --- /dev/null +++ b/im-uniapp/im.scss @@ -0,0 +1,141 @@ +/** 原生button样式 **/ +uni-button { + font-size: $im-font-size !important; +} +uni-button[type='primary'] { + colo: #fff !important; + background-color: $im-color-primary !important; +} + +uni-button[type='primary'][plain] { + color: $im-color-primary !important; + border: 1px solid $im-color-primary; + background-color: transparent; +} + +uni-button[type='warn'] { + colo: #fff !important; + background-color: $im-color-danger !important; +} + +uni-button[type='warn'][plain] { + color: $im-color-danger !important; + border: 1px solid $im-color-danger !important; + background-color: transparent !important; +} + +uni-button[size='mini'] { + font-size: $im-font-size-smaller !important; +} + +.button-hover[type='primary'] { + colo: #fff !important; + background-color: $im-color-primary-dark-1 !important; +} + +/** uni-ui input激活后边框、图标颜色 **/ +.uni-easyinput__content.is-focused:not(.is-input-error-border) { + border-color: $im-color-primary-light-2 !important; + + .content-clear-icon { + color: $im-color-primary-light-2 !important; + } +} + +/** 底部导航 **/ +.uni-tabbar-bottom .uni-tabbar { + box-shadow: $im-box-shadow; +} + +.uni-tabbar-border { + display: none; +} + +.segmented-control { + border-color: $im-color-primary !important; + + .segmented-control__item--button { + border-color: $im-color-primary !important; + } + .segmented-control__item--button--active { + background-color: $im-color-primary !important; + + .segmented-control__text{ + color: #fff !important; + } + } + .segmented-control__text{ + color: $im-color-primary !important; + } +} + +.uni-radio-input { + //border-color: $im-color-primary !important; + //background-color: $im-color-primary !important; +} + +.uni-section__content-title { + font-size: $im-font-size !important; + color: $im-text-color-light; +} + +.uni-forms-item__label { + color: $im-text-color; + font-size: $im-font-size !important; +} +.uni-forms-item { + //margin-bottom: 8px !important; +} +.uni-easyinput__content-input { + font-size: $im-font-size !important; +} +.uni-easyinput__placeholder-class { + color: $im-text-color-lighter; + font-size: $im-font-size !important;; +} +.uni-easyinput__content-textarea { + font-size: $im-font-size !important;; +} +.uni-input-input:disabled { + color: $im-text-color-light; +} +.uni-forms-item.is-direction-top .uni-forms-item__label { + padding: 0 !important; +} +.uni-data-checklist .checklist-group .checklist-box .checklist-content .checklist-text { + font-size: $im-font-size !important; +} +.uni-card .uni-card__content { + color: unset !important; + padding: 10px 0 !important; +} +.uni-tag-text--small{ + font-size: 10px !important; + font-weight: bolder !important; +} + +.nav-bar { + height: 100rpx; + padding: 0 20rpx; + display: flex; + align-items: center; + background-color: white; + border-bottom: 1px solid $im-border; + + .nav-search { + flex: 1; + } + + .nav-add { + cursor: pointer; + } +} + + +.bottom-btn { + margin: 40rpx 40rpx; + + uni-button + uni-button { + margin-top: 20rpx; + } +} \ No newline at end of file diff --git a/im-uniapp/pages.json b/im-uniapp/pages.json index 924ff42..1f9613c 100644 --- a/im-uniapp/pages.json +++ b/im-uniapp/pages.json @@ -44,10 +44,9 @@ } ], "globalStyle": { - "navigationBarTitleText": "盒子IM", - "navigationBarTextStyle": "black", - "navigationBarBackgroundColor": "#F0F0F0", - "backgroundColor": "#fdfdfd" + "navigationStyle": "custom", + "navigationBarBackgroundColor": "#f7f7f7", + "backgroundColor": "#f7f7f7" }, "tabBar": { "color": "#000000", diff --git a/im-uniapp/pages/chat/chat-box.vue b/im-uniapp/pages/chat/chat-box.vue index affae06..ab8c7e2 100644 --- a/im-uniapp/pages/chat/chat-box.vue +++ b/im-uniapp/pages/chat/chat-box.vue @@ -1,9 +1,6 @@ - - {{title}} - - + {{title}} @@ -21,7 +18,7 @@ - + @@ -779,12 +776,13 @@ padding: 5px; background-color: #f9f9f9; line-height: 50px; - font-size: 36rpx; + font-size: $im-font-size-large; + box-shadow: $im-box-shadow-lighter; + z-index: 1; .btn-side { position: absolute; line-height: 60rpx; - font-size: 28rpx; cursor: pointer; &.right { @@ -811,9 +809,9 @@ padding: 0 10rpx; .icon-at { - font-size: 35rpx; - color: darkblue; - font-weight: 600; + font-size: $im-font-size-larger; + color: $im-color-primary; + font-weight: bold; } .chat-at-scroll-box { @@ -833,33 +831,37 @@ } + $icon-color: rgba(0,0,0, 0.88); .send-bar { display: flex; align-items: center; padding: 10rpx; - margin-bottom: 10rpx; - border-top: #eee solid 1px; - background-color: #f7f8fd; + //margin-bottom: 10rpx; + border-top: $im-border solid 1px; + background-color: $im-bg; height: 80rpx; + //box-shadow: $im-box-shadow-lighter; + z-index: 1; .iconfont { - font-size: 68rpx; - margin: 6rpx; + font-size: 60rpx; + margin: 0 10rpx; + color: $icon-color; } .chat-record { flex: 1; - } .send-text { flex: 1; overflow: auto; - padding: 20rpx; + padding: 14rpx 20rpx; background-color: #fff; - border-radius: 20rpx; - font-size: 30rpx; + border-radius: 8rpx; + font-size: $im-font-size; box-sizing: border-box; + margin: 0 10rpx; .send-text-area { width: 100%; @@ -875,28 +877,30 @@ .chat-tab-bar { height: 500rpx; padding: 20rpx; - background-color: #f8f8f8; + background-color: $im-bg; .chat-tools { display: flex; flex-wrap: wrap; + padding-top: 20rpx; .chat-tools-item { - width: 140rpx; + width: 25%; padding: 16rpx; + box-sizing: border-box; display: flex; flex-direction: column; align-items: center; .tool-icon { - padding: 28rpx; - font-size: 60rpx; + padding: 26rpx; + font-size: 54rpx; border-radius: 20%; background-color: white; - color: black; + color: $icon-color; - &.active { - background-color: #ddd; + &:active { + background-color: $im-bg-active; } } @@ -914,10 +918,11 @@ .emotion-item-list { display: flex; flex-wrap: wrap; + justify-content: space-between; .emotion-item { - width: 40px; - height: 40px; + width: 34px; + height: 34px; text-align: center; cursor: pointer; padding: 6px; diff --git a/im-uniapp/pages/chat/chat.vue b/im-uniapp/pages/chat/chat.vue index b69f611..692bdc9 100644 --- a/im-uniapp/pages/chat/chat.vue +++ b/im-uniapp/pages/chat/chat.vue @@ -1,17 +1,18 @@ + 消息 消息接收中... - + - 温馨提示:您现在还没有任何聊天消息,快跟您的好友发起聊天吧~ + 温馨提示:您现在还没有任何聊天消息,快跟您的好友发起聊天吧~ @@ -31,6 +32,7 @@ export default { data() { return { + showSearch: false, searchText: "", menu: { show: false, @@ -120,34 +122,16 @@ \ No newline at end of file + diff --git a/im-uniapp/pages/friend/friend-add.vue b/im-uniapp/pages/friend/friend-add.vue index 624bef1..41e3988 100644 --- a/im-uniapp/pages/friend/friend-add.vue +++ b/im-uniapp/pages/friend/friend-add.vue @@ -1,16 +1,18 @@ - + 添加好友 + + + + :online="user.online" :url="user.headImage"> {{ user.nickName}} + 好友 - + - - - 温馨提示:您现在还没有任何好友,快点击右上方'+'按钮添加好友吧~ @@ -15,8 +13,7 @@ - + @@ -34,6 +31,7 @@ export default { data() { return { + showSearch: false, searchText: '' } }, @@ -109,30 +107,29 @@ display: flex; flex-direction: column; + :deep(.u-index-anchor){ + height: 60rpx !important; + background-color: unset !important; + border-bottom: none !important; + } + :deep(.u-index-anchor__text){ + color: $im-text-color !important; + } + :deep(.u-index-list__letter__item){ + width: 48rpx !important; + height: 48rpx !important; + } + :deep(.u-index-list__letter__item__index){ + font-size: $im-font-size-small !important; + } + .friend-tip { position: absolute; top: 400rpx; padding: 50rpx; text-align: center; line-height: 50rpx; - text-align: left; - color: darkblue; - font-size: 30rpx; - } - - .nav-bar { - padding: 2rpx 10rpx; - display: flex; - align-items: center; - background-color: white; - - .nav-search { - flex: 1; - } - - .nav-add { - cursor: pointer; - } + color: $im-text-color-lighter; } .friend-items { diff --git a/im-uniapp/pages/group/group-edit.vue b/im-uniapp/pages/group/group-edit.vue index fb64bd1..62a7136 100644 --- a/im-uniapp/pages/group/group-edit.vue +++ b/im-uniapp/pages/group/group-edit.vue @@ -1,29 +1,32 @@ - - - - - - - - - - - - - - - - - - - - - - 提交 - + 修改群资料 + + + + + + + + + + + + + + + + + + + + + + + + 提交 + \ No newline at end of file diff --git a/im-uniapp/pages/mine/mine.vue b/im-uniapp/pages/mine/mine.vue index 29b7c02..ae29ab8 100644 --- a/im-uniapp/pages/mine/mine.vue +++ b/im-uniapp/pages/mine/mine.vue @@ -1,30 +1,46 @@ - - - - - - {{userInfo.userName}} - - - - - - 昵称 :{{userInfo.nickName}} - - - 签名 :{{userInfo.signature}} - - - > - - - + 我的 + + + + + + + {{userInfo.userName}} + + + + + + + 昵称: + + + {{userInfo.nickName}} + + + + + + 签名: + + + {{userInfo.signature}} + + + + + + + + + + 修改密码 退出 @@ -72,7 +88,7 @@ \ No newline at end of file + diff --git a/im-uniapp/pages/register/register.vue b/im-uniapp/pages/register/register.vue index a11f805..e174048 100644 --- a/im-uniapp/pages/register/register.vue +++ b/im-uniapp/pages/register/register.vue @@ -1,5 +1,6 @@ - + + 盒子im 欢迎注册 @@ -14,7 +15,7 @@ - 注册并登陆 + 注册并登陆 返回登陆页面 @@ -116,9 +117,9 @@ .title { padding-top: 150rpx; padding-bottom: 50rpx; - color: royalblue; + color: $im-color-primary; text-align: center; - font-size: 60rpx; + font-size: 24px; font-weight: 600; } @@ -135,7 +136,7 @@ position: fixed; width: 100%; bottom: 100rpx; - color: royalblue; + color: $im-color-primary; text-align: center; font-size: 32rpx; } diff --git a/im-uniapp/uni.scss b/im-uniapp/uni.scss index fb06dae..f6d11bf 100644 --- a/im-uniapp/uni.scss +++ b/im-uniapp/uni.scss @@ -1,5 +1,51 @@ @import '@/uni_modules/uview-plus/theme.scss'; @import '@/uni_modules/uni-scss/variables.scss'; +@import '@/im-var.scss'; + +// 修改uni-ui主题 +$uni-primary: $im-color-primary; +$uni-success: $im-color-success; +$uni-warning: $im-color-warning; +$uni-error: $im-color-danger; +$uni-info: $im-color-info; + +// $uni-main-color: #3a3a3a; // 主要文字 +// $uni-base-color: #6a6a6a; // 常规文字 +// $uni-secondary-color: #909399; // 次要文字 +// $uni-extra-color: #c7c7c7; // 辅助说明 + +// // 边框颜色 +// $uni-border-1: #F0F0F0; +// $uni-border-2: #EDEDED; +// $uni-border-3: #DCDCDC; +// $uni-border-4: #B9B9B9; + +// // 常规色 +// $uni-black: #000000; +// $uni-white: #ffffff; +// $uni-transparent: rgba($color: #000000, $alpha: 0); + +// // 背景色 +// $uni-bg-color: #f7f7f7; + +// /* 水平间距 */ +// $uni-spacing-sm: 8px; +// $uni-spacing-base: 15px; +// $uni-spacing-lg: 30px; + +// // 阴影 +// $uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5); +// $uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2); +// $uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5); + +// // 蒙版 +// $uni-mask: rgba($color: #000000, $alpha: 0.4); + + + + +/**************************************************/ + /* 行为相关颜色 */ $uni-color-primary: #007aff; $uni-color-success: #4cd964; From 7d0ba1e13ce4ae709d11ab02b96b733e40dd86b4 Mon Sep 17 00:00:00 2001 From: xsx <825657193@qq.com> Date: Sun, 24 Nov 2024 13:33:14 +0800 Subject: [PATCH 10/15] =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E4=BC=98=E5=8C=96?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E6=94=B9logo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- im-uniapp/components/bar/arrow-bar.vue | 39 ++++ im-uniapp/components/bar/bar-group.vue | 17 ++ im-uniapp/components/bar/btn-bar.vue | 66 +++++++ im-uniapp/components/bar/switch-bar.vue | 61 ++++++ .../components/friend-item/friend-item.vue | 4 +- .../components/group-item/group-item.vue | 4 +- im-uniapp/main.js | 8 + im-uniapp/manifest.json | 4 +- im-uniapp/pages/common/user-info.vue | 177 +++++++++--------- im-uniapp/pages/group/group-info.vue | 10 +- im-uniapp/pages/login/login.vue | 5 +- im-uniapp/pages/mine/mine.vue | 10 +- im-uniapp/pages/register/register.vue | 3 +- im-uniapp/static/logo/logo.png | Bin 165499 -> 244153 bytes im-uniapp/static/tarbar/mine.png | Bin 9218 -> 9325 bytes im-uniapp/static/tarbar/mine_active.png | Bin 6217 -> 8559 bytes im-uniapp/unpackage/res/icons/1024x1024.png | Bin 0 -> 210018 bytes im-uniapp/unpackage/res/icons/120x120.png | Bin 0 -> 7823 bytes im-uniapp/unpackage/res/icons/144x144.png | Bin 0 -> 10005 bytes im-uniapp/unpackage/res/icons/152x152.png | Bin 0 -> 10801 bytes im-uniapp/unpackage/res/icons/167x167.png | Bin 0 -> 12308 bytes im-uniapp/unpackage/res/icons/180x180.png | Bin 0 -> 13839 bytes im-uniapp/unpackage/res/icons/192x192.png | Bin 0 -> 14965 bytes im-uniapp/unpackage/res/icons/20x20.png | Bin 0 -> 839 bytes im-uniapp/unpackage/res/icons/29x29.png | Bin 0 -> 1267 bytes im-uniapp/unpackage/res/icons/40x40.png | Bin 0 -> 1908 bytes im-uniapp/unpackage/res/icons/58x58.png | Bin 0 -> 3017 bytes im-uniapp/unpackage/res/icons/60x60.png | Bin 0 -> 3211 bytes im-uniapp/unpackage/res/icons/72x72.png | Bin 0 -> 4042 bytes im-uniapp/unpackage/res/icons/76x76.png | Bin 0 -> 4355 bytes im-uniapp/unpackage/res/icons/80x80.png | Bin 0 -> 4678 bytes im-uniapp/unpackage/res/icons/87x87.png | Bin 0 -> 5214 bytes im-uniapp/unpackage/res/icons/96x96.png | Bin 0 -> 5809 bytes im-web/public/logo.png | Bin 63432 -> 143941 bytes im-web/src/api/camera.js | 5 +- im-web/src/view/Login.vue | 16 +- im-web/src/view/Register.vue | 14 +- 37 files changed, 328 insertions(+), 115 deletions(-) create mode 100644 im-uniapp/components/bar/arrow-bar.vue create mode 100644 im-uniapp/components/bar/bar-group.vue create mode 100644 im-uniapp/components/bar/btn-bar.vue create mode 100644 im-uniapp/components/bar/switch-bar.vue create mode 100644 im-uniapp/unpackage/res/icons/1024x1024.png create mode 100644 im-uniapp/unpackage/res/icons/120x120.png create mode 100644 im-uniapp/unpackage/res/icons/144x144.png create mode 100644 im-uniapp/unpackage/res/icons/152x152.png create mode 100644 im-uniapp/unpackage/res/icons/167x167.png create mode 100644 im-uniapp/unpackage/res/icons/180x180.png create mode 100644 im-uniapp/unpackage/res/icons/192x192.png create mode 100644 im-uniapp/unpackage/res/icons/20x20.png create mode 100644 im-uniapp/unpackage/res/icons/29x29.png create mode 100644 im-uniapp/unpackage/res/icons/40x40.png create mode 100644 im-uniapp/unpackage/res/icons/58x58.png create mode 100644 im-uniapp/unpackage/res/icons/60x60.png create mode 100644 im-uniapp/unpackage/res/icons/72x72.png create mode 100644 im-uniapp/unpackage/res/icons/76x76.png create mode 100644 im-uniapp/unpackage/res/icons/80x80.png create mode 100644 im-uniapp/unpackage/res/icons/87x87.png create mode 100644 im-uniapp/unpackage/res/icons/96x96.png diff --git a/im-uniapp/components/bar/arrow-bar.vue b/im-uniapp/components/bar/arrow-bar.vue new file mode 100644 index 0000000..7523785 --- /dev/null +++ b/im-uniapp/components/bar/arrow-bar.vue @@ -0,0 +1,39 @@ + + + {{title}} + + + + + + + \ No newline at end of file diff --git a/im-uniapp/components/bar/bar-group.vue b/im-uniapp/components/bar/bar-group.vue new file mode 100644 index 0000000..e4e7cbb --- /dev/null +++ b/im-uniapp/components/bar/bar-group.vue @@ -0,0 +1,17 @@ + + + + + + + + + \ No newline at end of file diff --git a/im-uniapp/components/bar/btn-bar.vue b/im-uniapp/components/bar/btn-bar.vue new file mode 100644 index 0000000..df18045 --- /dev/null +++ b/im-uniapp/components/bar/btn-bar.vue @@ -0,0 +1,66 @@ + + + + {{title}} + + + + + + \ No newline at end of file diff --git a/im-uniapp/components/bar/switch-bar.vue b/im-uniapp/components/bar/switch-bar.vue new file mode 100644 index 0000000..44a50b5 --- /dev/null +++ b/im-uniapp/components/bar/switch-bar.vue @@ -0,0 +1,61 @@ + + + {{title}} + + + + + + + \ No newline at end of file diff --git a/im-uniapp/components/friend-item/friend-item.vue b/im-uniapp/components/friend-item/friend-item.vue index 726fe46..d58293c 100644 --- a/im-uniapp/components/friend-item/friend-item.vue +++ b/im-uniapp/components/friend-item/friend-item.vue @@ -1,6 +1,6 @@ - + {{ friend.nickName}} @@ -36,7 +36,7 @@ + \ No newline at end of file diff --git a/im-uniapp/pages/group/group-info.vue b/im-uniapp/pages/group/group-info.vue index 8d7ec6e..51c0584 100644 --- a/im-uniapp/pages/group/group-info.vue +++ b/im-uniapp/pages/group/group-info.vue @@ -46,11 +46,11 @@ 修改群聊资料 > - - 发消息 - 退出群聊 - 解散群聊 - + + + + + diff --git a/im-uniapp/pages/login/login.vue b/im-uniapp/pages/login/login.vue index 8d0727c..7d7162b 100644 --- a/im-uniapp/pages/login/login.vue +++ b/im-uniapp/pages/login/login.vue @@ -1,6 +1,5 @@ - - 盒子im + 欢迎登录 @@ -56,7 +55,7 @@ // 调用App.vue的初始化方法 getApp().$vm.init() // 跳转到聊天页面 - uni.switchTab({ + uni.switchTab({ url: "/pages/chat/chat" }) }) diff --git a/im-uniapp/pages/mine/mine.vue b/im-uniapp/pages/mine/mine.vue index ae29ab8..f8876aa 100644 --- a/im-uniapp/pages/mine/mine.vue +++ b/im-uniapp/pages/mine/mine.vue @@ -40,10 +40,12 @@ - - 修改密码 - 退出 - + + + + + + diff --git a/im-uniapp/pages/register/register.vue b/im-uniapp/pages/register/register.vue index e174048..fb85e2e 100644 --- a/im-uniapp/pages/register/register.vue +++ b/im-uniapp/pages/register/register.vue @@ -1,6 +1,5 @@ - - 盒子im + 欢迎注册 diff --git a/im-uniapp/static/logo/logo.png b/im-uniapp/static/logo/logo.png index 8ed4af2a9d648475305c7a5536167a6466bc4f08..7078e93ba69a43236c176ff72b681b349dce7301 100644 GIT binary patch literal 244153 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
AWrbd4E8oZ~d~ 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