Browse Source

修改页面

master
liaoxinyu 2 weeks ago
parent
commit
402c65629b
  1. 3
      src/components/lemon-imui/index.css
  2. 15
      src/components/lemon-imui/index.umd.js
  3. 2
      src/components/message/apply/index.vue
  4. 42
      src/components/message/chatRecord/chatItem.vue
  5. 1
      src/components/message/chatRecord/index.vue
  6. 2
      src/components/message/friend/add.vue
  7. 16
      src/components/message/friendsCircle/fndialog.vue
  8. 15
      src/components/message/friendsCircle/index.vue
  9. 2
      src/components/message/group/index.vue
  10. 75
      src/components/message/index.vue
  11. 25
      src/components/message/user/userCard.vue
  12. 4
      src/components/message/webrtc/index.vue
  13. 6
      src/views/Register.vue

3
src/components/lemon-imui/index.css

File diff suppressed because one or more lines are too long

15
src/components/lemon-imui/index.umd.js

@ -2169,6 +2169,7 @@ class lt {
`, i.containerDialogElm.appendChild(i.checkDialogElm), i.checkDialogUsersElm = i.checkDialogElm.querySelector(".checkbox-dialog-check-group"), i.checkDialogSearchResultElm = i.checkDialogElm.querySelector(".checkbox-dialog-search-group"), i.checkDialogSearchInputElm = i.checkDialogElm.querySelector(".checkbox-dialog-search-input"), i.checkDialogTagsElm = i.checkDialogElm.querySelector(".checkbox-dialog-tags");
const n = () => {
f(i.checkDialogElm), E(document.body, "disable-scroll");
i.checkDialogSearchResultElm.innerHTML = '';
};
i.checkDialogElm.querySelector(".checkbox-dialog-container-header-close").onclick = n, i.checkDialogElm.querySelector(".btn-close").onclick = n;
const s = i.checkDialogElm.querySelector(".btn-submit");
@ -2192,6 +2193,7 @@ class lt {
}
const c = this.target.searchUserList(l).map(d => d.id);
Array.from(i.checkDialogSearchResultElm.children, (d, r) => {
// console.log(d);
if (r === i.checkDialogSearchResultElm.children.length - 1) f(d, c.length === 0);else {
const h = d.getAttribute("data-set-id");
f(d, c.indexOf(h) !== -1, "flex");
@ -2350,6 +2352,9 @@ class lt {
l === "ALL" ? this.checkboxRows = d ? e.options.reformList.map(r => r) : [] : d ? this.checkboxRows.push(c) : this.checkboxRows = this.checkboxRows.filter(r => r.id !== l), this.updateCheckDialogTags();
};
});
t.checkDialogSearchResultElm.innerHTML = '';
const s = document.createDocumentFragment();
e.options.reformList.forEach(o => {
const l = document.createElement("div");
@ -7249,7 +7254,8 @@ var emojiData = [];
name: "uploadFile",
title: this.i18n.fileUpload,
click: function click() {
return _this3.selectFile("*");
// return _this3.selectFile("*");
return _this3.selectFile(".pdf,.doc,.docx,.txt,.xls,.xlsx,.ppt,.pptx,.zip,.rar"); // 限制文件类型
},
render: function render(menu) {
return h("i", {
@ -7403,7 +7409,8 @@ var emojiData = [];
return regeneratorRuntime.wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
this.accept = accept;
// this.accept = accept;
this.accept = accept || ".pdf,.doc,.docx,.txt,.xls,.xlsx,.ppt,.pptx,.zip,.rar"; // 只允许这些文件
_context.next = 3;
return this.$nextTick();
case 3:
@ -7952,6 +7959,7 @@ var resize_component = normalizeComponent(
}, [h("div", {
"class": "lemon-message__title"
}, [this.hideName == false && h("span", {
"class": "text-overflow",
"on": {
"click": function click(e) {
_this._emitClick(e, "displayName");
@ -8953,7 +8961,6 @@ var renderDrawerContent = function renderDrawerContent() {};
message.toContactId = message.from_user
}
var messageList = allMessages[message.toContactId];
// 如果是自己的消息需要push,发送的消息不再增加未读条数
if (message.type == "event" || this.user.id == message.fromUser.id) unread = "+0";
// console.log(message.toContactId);
@ -8972,7 +8979,7 @@ var renderDrawerContent = function renderDrawerContent() {};
});
if (hasMsg) return;
// 特殊处理打印机效果消息
if (message.toContactId == "-2"&&message.fromUser.account!=="administrator") {
if (message.from_user == "-2"&&message.fromUser.account!=="administrator") {
// 克隆原始消息避免污染
const printerMessage = { ...message };
// 保存原始内容

2
src/components/message/apply/index.vue

@ -28,7 +28,7 @@
<div v-if="params.is_mine" @click="$user(x.user_id_info.user_id)"> 请求添加 <span class="fc-primary cur-handle">{{x.user_id_info.realname}}</span> 为好友
<el-tag type="success" v-if="x.status==1">已同意</el-tag>
</div>
<div class="f-12 c-999">{{x.remark}}</div>
<div class="f-12 c-999" style="white-space: pre-wrap;line-break: anywhere;">{{x.remark}}</div>
</div>
<div class="option" v-if="!params.is_mine">
<el-popconfirm title="您确定接受该好友的申请吗?" v-if="x.status==2" @confirm="acceptApply(x.friend_id,true)">

42
src/components/message/chatRecord/chatItem.vue

@ -6,13 +6,14 @@
<div class="chat-list-body">
<div class="chat-list-title">
<!-- {{ data.fromUser.realname }} -->
{{ data.fromUser.displayName }}
<span class="chat-list-overflow">{{ data.fromUser.displayName }}</span>
<span class="time"> {{ formatTime(data.sendTime) }}</span>
</div>
<div
class="chat-list-text"
style="line-break: anywhere;"
v-if="data.type == 'text'"
v-html="data.content"
v-html="emojiToHtml(data.content)"
></div>
<div class="chat-list-tools" v-if="data.type == 'text'">
<el-tooltip effect="dark" content="复制文本" placement="top">
@ -68,13 +69,15 @@
<script>
import { date } from "@/utils/index";
import emoji from "@/utils/emoji";
import { getFileSize, getFileExtImg,download } from "@/utils/file";
export default {
name: "chatItem",
props: {
data: {
type: Object,
default: {} //
default: {} ,//
emojiMap:[]
}
},
computed: {
@ -100,6 +103,16 @@ export default {
};
},
methods: {
emojiToHtml(str){
if(!str){
return;
}
let emojiMap=this.emojiMap;
return str.replace(/\[!(\w+)\]/gi, function (str, match) {
var file = match;
return emojiMap[file] ? "<img style=\"width:18px;height:18px;margin-right:5px\" emoji-name=\"".concat(match, "\" src=\"").concat(emojiMap[file], "\" />") : "[!".concat(match, "]");
});
},
//
copyText(val) {
this.$clipboard(val);
@ -117,7 +130,21 @@ export default {
download(item.content,item.fileName);
}
},
created() {}
created() {
let emojiMap=[];
//
emoji.forEach(function (item) {
let child=item.children;
if(child.length>0){
child.forEach(function (val) {
let name=val.name;
let src=val.src;
emojiMap[name]=src;
})
}
});
this.emojiMap=emojiMap;
}
};
</script>
<style scoped lang="scss">
@ -192,4 +219,11 @@ export default {
display: block;
}
}
.chat-list-overflow{
width: 100px;
display: inline-block;
text-overflow: ellipsis;
overflow: hidden !important;
white-space: nowrap !important;
}
</style>

1
src/components/message/chatRecord/index.vue

@ -237,6 +237,7 @@ export default {
this.getMessage();
},
getMessage() {
console.log(this.manage);
if(this.manage){
this.$api.messageApi.getMessageList(this.params)
.then(res => {

2
src/components/message/friend/add.vue

@ -65,6 +65,8 @@ export default {
closeDialog() {
this.$emit("update:visible", false);
this.selectUid = [];
this.keywords = "";
this.list = [];
},
handleChange(){
if(this.keywords){

16
src/components/message/friendsCircle/fndialog.vue

@ -16,8 +16,10 @@
<div style="color: #aaaaaa;font-size: 12px;">{{detailsList.create_time}}</div>
</div>
</div>
<div class="chat-list-text" style="cursor: pointer;" v-if="contenthtml(detailsList.content)" @click="handleLink(detailsList.content)" v-html="detailsList.content"></div>
<div class="chat-list-text" v-html="detailsList.content" v-else></div>
<div v-if="detailsList.content" style="display: flex;flex-wrap: wrap;">
<div class="chat-list-text" style="cursor: pointer;word-break: break-word;" v-if="contenthtml(detailsList.content)" @click="handleLink(detailsList.content)" v-html="detailsList.content"></div>
<div class="chat-list-text" style="word-break: break-word;" v-html="detailsList.content.replace(/\n/g, '<br>')" v-else></div>
</div>
<div style="display: flex;flex-wrap: wrap;width: 330px;">
<div v-for="(itemfil1,indexfil1) in detailsList?.files" :key="itemfil1.file_id" style="margin-right: 10px;margin-bottom: 10px;">
<div v-if="itemfil1.type==1">
@ -86,7 +88,7 @@
</div>
<div style="flex: 1; min-width: 0; word-break: break-word;">
<div class="chat-list-text" style="cursor: pointer;" v-if="contenthtml(itemcomm.content)" @click="handleLink(itemcomm.content)" v-html="itemcomm.content"></div>
<div class="chat-list-text" v-html="itemcomm.content" v-else></div>
<div class="chat-list-text" v-html="itemcomm.content.replace(/\n/g, '<br>')" v-else></div>
</div>
</div>
</div>
@ -198,10 +200,10 @@
this.isFocus1 = false
},
Delete(id){
this.$api.messageApi.del({posts_id:id}).then(res => {
this.$api.messageApi.del({posts_id:this.details.posts_id}).then(res => {
if(res.code==0){
this.$message.success("删除成功!");
this.friendsCircleList()
this.fndialog()
}
})
},
@ -212,8 +214,12 @@
},
clickshow(){
this.$api.messageApi.details({posts_id:this.details.posts_id,friend_user_id:this.details.friend_user_id}).then(res => {
if(res.code==0){
this.detailsList = res.data
this.bolle = false;
}else{
this.$emit('dialog',false)
}
})
},
onEditorChange1({ quill, html, text }, index){

15
src/components/message/friendsCircle/index.vue

@ -1,4 +1,6 @@
<template>
<el-container class="is-vertical">
<el-main class="no-padding">
<div style="height: 100%;">
<el-scrollbar ref="scrollbar" style="height: 400px;">
<div>
@ -26,7 +28,7 @@
<div>
<div style="color: #576b95;font-size: 16px;margin-bottom: 5px;">{{item.option_user.nickname}}</div>
<div v-if="item.content">
<div class="chat-list-text" v-html="item.content" style="word-break: break-word;"></div>
<div class="chat-list-text" v-html="item.content.replace(/\n/g, '<br>')" style="word-break: break-word;"></div>
</div>
<div v-if="item.type==1">
<img src="@/assets/img/Like.png" style="width: 20px;" class="mr-10"/>
@ -55,8 +57,8 @@
</div>
</div>
<div class="text-content" style="cursor: pointer;" v-if="contenthtml(item.content)" @click="handleLink(item.content)">{{item.content}}</div>
<div class="chat-list-text" v-html="item.content" v-else></div>
<div class="text-content" style="cursor: pointer;white-space: pre-wrap;line-break: anywhere;" v-if="contenthtml(item.content)" @click="handleLink(item.content)">{{item.content}}</div>
<div class="chat-list-text" style="white-space: pre-wrap;line-break: anywhere;" v-html="item.content.replace(/\n/g, '<br>')" v-else></div>
<div style="display: flex;flex-wrap: wrap;width: 350px;margin-top: 10px;">
<div v-for="(itemfil,indexfil) in item.files" :key="itemfil.file_id" style="margin-right: 10px;margin-bottom: 10px;">
@ -111,7 +113,7 @@
<el-scrollbar class="icon" v-if="isFocus">
<div style="display: flex;flex-wrap: wrap;">
<div v-for="(iteme,indexe) in emoji" class="im-emoji-item" :key="indexe">
<img :src="iteme.src" style="width:20px;;height:20px;cursor: pointer;" @click="chooseEmoji(iteme)" />
<img :src="iteme.src" style="width:20px;height:20px;cursor: pointer;" @click="chooseEmoji(iteme)" />
</div>
</div>
</el-scrollbar>
@ -136,7 +138,7 @@
<div style="flex: 1; min-width: 0; word-break: break-word;">
<!-- <div class="chat-list-text" v-html="iteme.content"></div> -->
<div class="chat-list-text" style="cursor: pointer;" v-if="contenthtml(iteme.content)" @click="handleLink(iteme.content)" v-html="iteme.content"></div>
<div class="chat-list-text" v-html="iteme.content" v-else></div>
<div class="chat-list-text" v-html="iteme.content.replace(/\n/g, '<br>')" v-else></div>
</div>
</div>
</div>
@ -149,6 +151,8 @@
<fndialog v-if="dialogVisible" :details="details" :dialogVisible="dialogVisible" @dialog="dialogVisible = $event"></fndialog>
</div>
</el-main>
</el-container>
</template>
<script>
@ -347,6 +351,7 @@
this.details.posts_id = id;
this.details.friend_user_id = this.userInfo.user_id==id1?'':id1;
this.dialogVisible = true
console.log(this.dialogVisible);
},
onEditorChange({ quill, html, text }, index){
this.list[index].commentContent = html;

2
src/components/message/group/index.vue

@ -104,7 +104,7 @@ export default {
this.$message.error("群聊人数不能少于2人");
return;
}
if(this.groupName == "" || this.groupName.length<2 || this.groupName.length>20) {
if(this.groupName == "" || this.groupName.length<1 || this.groupName.length>20 || this.groupName.trim() === "") {
this.$message.error("请输入正确的群聊名称");
return;
}

75
src/components/message/index.vue

@ -89,10 +89,14 @@
<el-tag size="mini" v-if="is_group ==2">BOT</el-tag>
{{ contact.displayName }}
</span>
<span class="displayName" v-if="is_group == 0">
<OnlineStatus :type="contact.is_online ? 'success' : 'info'" :pulse="contact.is_online " v-if="globalConfig.chatInfo.online==1" ></OnlineStatus> {{contact.displayName}}</span>
<span class="displayName" style="white-space: pre-wrap;line-break: anywhere;" v-if="is_group == 0">
<OnlineStatus :type="contact.is_online ? 'success' : 'info'" :pulse="contact.is_online " v-if="globalConfig.chatInfo.online==1" ></OnlineStatus>
{{contact.displayName}}
</span>
<span v-if="parseInt(globalConfig.sysInfo.ipregion) && contact.last_login_ip" class="c-999 f-12 ml-5">
<span v-if="globalConfig.chatInfo.online==0 && !contact.is_online">(离线)</span>{{ contact.last_login_ip }} {{ contact.location }}</span>
<span v-if="globalConfig.chatInfo.online==0 && !contact.is_online">(离线)</span>
{{ contact.last_login_ip }} {{ contact.location }}
</span>
</span>
<input
@ -300,10 +304,10 @@
<!-- 每条消息后面展示的文字 -->
<template #message-after="message">
<span
v-if="message.fromUser.id == user.id && message.is_group == 0"
v-if="message.fromUser.id == user.id && message.is_group == 0&&message.status!='failed'"
style="visibility: visible"
>
<span v-if="!message.is_read && message.status=='succeed'"> 未读 </span>
<span v-if="message.is_read==0 && message.status=='succeed'"> 未读 </span>
<span v-if="message.is_read && message.status=='succeed'" class="fc-success"> 已读 </span>
</span>
</template>
@ -678,6 +682,7 @@ export default {
hide();
let friend=this.getContact(contact.user_id);
let curContact=IMUI.getCurrentContact();
// console.log(curContact);
//
if(curContact.setting.profile==1 || curContact.role<3 || friend || contact.user_id==this.user.id){
this.$user(contact.user_id);
@ -805,7 +810,8 @@ export default {
_this.$api.messageApi.isBlacklist({friend_user_id:contact.user_id});
setTimeout(()=>{
_this.getSimpleChat()
},2000)
location.reload();
},1000)
},
icon: "el-icon-user",
text: "加入黑名单",
@ -815,6 +821,24 @@ export default {
);
}
},
// {
// click(e, instance, hide) {
// const { IMUI, contact } = instance;
// hide();
// _this.$api.messageApi.isBlacklist({friend_user_id:contact.user_id});
// setTimeout(()=>{
// _this.getSimpleChat()
// location.reload();
// },1000)
// },
// icon: "el-icon-user",
// text: "",
// visible: instance => {
// return (
// instance.contact.is_group == 1
// );
// }
// },
{
click(e, instance, hide) {
const { IMUI, contact } = instance;
@ -1395,7 +1419,7 @@ export default {
case "readAll":
let messages = IMUI.getMessages(message.toContactId);
messages.forEach(item => {
if (item.is_read == 0) {
if (item.is_read == 0&&item.status!='failed') {
const data = {
id: item.id,
is_read: 1,
@ -1632,7 +1656,7 @@ export default {
}
},
Confirmdeletion(val){
console.log(val);
// console.log(val);
if(this.is_group==0){
this.$api.messageApi.setfriendRemoveAllMessage({to_user:val}).then(res => {
if(res.code==0){
@ -2074,6 +2098,9 @@ export default {
getContact(id,message=null) {
const { IMUI } = this.$refs;
let contact=IMUI.findContact(id);
if(contact&&contact.user_id==-2){
contact.is_notice=0
}
//
if(!contact && message && message.contactInfo){
contact = message.contactInfo;
@ -2232,7 +2259,7 @@ export default {
}
}
//
if (data.length > 0) {
if (data.length > 0&&data.at.length==0) {
this.$api.imApi.setMsgIsReadAPI({
is_group: contact.is_group,
toContactId: contact.id,
@ -2353,8 +2380,9 @@ export default {
//
handleSend(message, next, file) {
const { IMUI } = this.$refs;
const hasEmoji = message.content.includes('emoji-image');
const contentText = /^\s*$/.test(message.content.replace(/<[^>]+>/g, ""));
if(contentText&&message.type!=="file"||message.content==''&&message.type!=="file"){
if(contentText&&message.type!=="file"&&!hasEmoji||message.content==''&&message.type!=="file"&&!hasEmoji){
this.$message.error("内容不能为空");
IMUI.setEditorValue("");
IMUI.removeMessage(message.id);
@ -2365,7 +2393,7 @@ export default {
IMUI.setEditorValue("");
IMUI.removeMessage(message.id);
return
}else if(this.isAnswering == false){
}else if(this.isAnswering == false&&message.toContactId==-2){
this.isAnswering = true;
}else if(this.isAnswering == true&&message.toContactId==-2){
this.$message.error("稍等片刻,等回复完后再发送哦~");
@ -2380,6 +2408,7 @@ export default {
message.plain_text = result
message.is_group = this.is_group;
this.curFile=file;
// console.log(this.curFile);
//
if(!this.nospeak()){
IMUI.removeMessage(message.id);
@ -2404,12 +2433,17 @@ export default {
if(res.code==0){
IMUI.setEditorValue("");
IMUI.updateMessage(res.data);
if(res.data.status=='failed'){
next({ status: "failed" });
}else{
next();
}
}else{
next({ status: "failed" });
}
})
.catch(error => {
this.curFile = null;
next({ status: "failed" });
});
} else {
@ -2420,7 +2454,6 @@ export default {
if(res.code==0){
IMUI.setEditorValue("");
IMUI.updateMessage(res.data);
// console.log(res.data);
if(res.data.toContactId==-2){
this.sendChat(res.data.plain_text,next)
}
@ -2450,7 +2483,11 @@ export default {
if(res.code==0){
IMUI.setEditorValue("");
IMUI.updateMessage(res.data);
if(res.data.status=="failed"){
next({ status: "failed" });
}else{
next();
}
}else{
next({ status: "failed" });
}
@ -2465,6 +2502,7 @@ export default {
sendChat(plain_text,next){
const { IMUI } = this.$refs;
this.$api.messageApi.sendChat({content:plain_text}).then(res => {
res.data.is_notice = 0;
this.recieveMsg(res.data)
// console.log(res.data);
})
@ -2661,7 +2699,7 @@ export default {
},
//
saveGroupName(contact) {
if (this.displayName.length < 1) {
if (this.displayName.length < 1||this.displayName.trim()=='') {
this.$notify({
title: "警告",
message: "名称不能为空!",
@ -2759,6 +2797,7 @@ export default {
},
//
recieveMsg(message) {
// console.log(message);
const { IMUI } = this.$refs;
const contact = IMUI.getCurrentContact();
//
@ -2773,12 +2812,18 @@ export default {
});
}else{
// 1
if (this.user.id != message.fromUser.id && contact.id != '-2') {
if (this.user.id != message.fromUser.id) {
let formContact=this.getContact(message.toContactId);
//
if(formContact.is_notice==1){
this.unread++;
}
if(contact.id == 'system'&&contact.id == message.toContactId){
this.unread--;
}
// if(message.user_id==1){
// this.unread = 0;
// }
this.initMenus(IMUI);
}
}
@ -2790,7 +2835,7 @@ export default {
if(contact.id == '-2'){
message.content = md.render(message.content)
}
if(message.toContactId=='system'){
if(message.toContactId=='system'&&contact.id != 'system'){
IMUI.updateContact({
id: message.toContactId,
lastContent: IMUI.lastContentRender(message),

25
src/components/message/user/userCard.vue

@ -15,7 +15,7 @@
<img :src="detail.avatar"/>
</div>
</div>
<div class="username">
<div class="username text-overflow">
<i class="iconfont icon-qianming" />
<!-- <span>{{ detail.realname || '未设置昵称' }}</span> -->
<span>{{ detail.friend?detail.friend.nickname:detail.realname}}</span>
@ -36,11 +36,14 @@
</div>
<div class="card-row">
<div class="label">{{ globalConfig.sysInfo.runMode==2 ? '昵称' : '姓名'}}</div>
<div>{{ detail.realname}}</div>
<div class="text-overflow" style="width: 240px;">{{ detail.realname}}</div>
</div>
<div class="card-row" v-if="detail.friend && globalConfig.sysInfo.runMode==2">
<div class="label">备注</div>
<div>{{ detail.friend.nickname || '未设置' }} <i class="el-icon-edit ml-10" title="设置备注" @click="setNickname"></i></div>
<div class="text-overflow" style="width: 240px;">
{{ detail.friend.nickname || '未设置' }}
</div>
<span><i class="el-icon-edit ml-10" title="设置备注" @click="setNickname"></i></span>
</div>
<div class="card-row">
<div class="label">性别</div>
@ -153,10 +156,10 @@
}
})
}).catch((error) => {
this.$message({
type: 'warning',
message: error
});
// this.$message({
// type: 'warning',
// message: error
// });
});
},
@ -392,4 +395,10 @@
align-items: center;
align-content: center;
}
</style>
.text-overflow{
width: 100px;
overflow: hidden !important;
text-overflow: ellipsis;
white-space: nowrap !important;
}
</style>

4
src/components/message/webrtc/index.vue

@ -192,6 +192,10 @@ export default {
this.localVideo.srcObject = this.localStream;
},
checkForCamera() {
if (typeof navigator === 'undefined' || !navigator.mediaDevices) {
console.warn("浏览器不支持MediaDevices API");
return;
}
navigator.mediaDevices.enumerateDevices()
.then(devices => {
const videoInputDevices = devices.filter(device => device.kind === 'videoinput');

6
src/views/Register.vue

@ -48,7 +48,7 @@ export default {
data() {
return {
Background,
placeholder: '请输入账号:4-32个字符',
placeholder: '',
regForm: {
account: '',
realname: '',
@ -106,7 +106,9 @@ export default {
this.loginRules.account.push(req)
let email={ type: 'email', message: msg, trigger: 'blur', validator: this.validateContact };
let mobile={ type: 'phone', message: msg, trigger: 'blur', validator: this.validateContact };
if(regauth==1){
if(regauth==0){
this.placeholder='请输入账号:4-32个字符';
}else if(regauth==1){
this.placeholder='请输入手机号';
this.loginRules.account.push(mobile)
}else if(regauth==2){

Loading…
Cancel
Save