提交 2acb94ab 作者: Hao

add

父级 9829b6de
......@@ -4,5 +4,6 @@
// Generated by unplugin-auto-import
export {}
declare global {
const ElLoading: typeof import('element-plus/es')['ElLoading']
const ElMessage: typeof import('element-plus/es')['ElMessage']
}
......@@ -21,6 +21,8 @@ declare module 'vue' {
ElMain: typeof import('element-plus/es')['ElMain']
EmotionComponent: typeof import('./src/components/EmotionComponent.vue')['default']
IndexComponent: typeof import('./src/components/IndexComponent.vue')['default']
MenuComponent: typeof import('./src/components/Menu/MenuComponent.vue')['default']
RightClickMenu: typeof import('./src/components/RightClickMenu.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
}
......
......@@ -68,12 +68,12 @@ import { ref, watch, defineEmits, defineExpose } from 'vue'
import { upLoadFilesHander } from '../minxins/UploadMixin'
import axios from 'axios'
const inputVal = ref('')
const elAutocomplete = ref(null)
const file = ref(null)
const elAutocomplete = ref<any>(null)
const file = ref<any>(null)
const imgShowWidth = ref<number>(50)
const imgShowHeight = ref<number>(50)
const showEmotion = ref<boolean>(false)
const handleEmotion = (i) => {
const handleEmotion = (i: any) => {
elAutocomplete.value.innerHTML += i
inputVal.value = elAutocomplete.value.innerHTML
showEmotion.value = false
......@@ -84,12 +84,12 @@ const upfile = () => {
}
//上传的数据
const fileChange = () => {
var e = window.event || event
var e: any = window.event || event
var oFile = e.target.files[0]
upLoadFilesHander(oFile).then((ress) => {
const { success, result } = ress
const { success, result }: any = ress
})
const loading = ElLoading.service({
const loading:any = ElLoading?.service({
lock: true,
text: '上传中...',
spinner: 'el-icon-loading',
......@@ -97,7 +97,7 @@ const fileChange = () => {
loading.close()
}
const handleSelect = (value: string) => {
const handleSelect = (value: any) => {
inputVal.value = value.target.innerHTML
}
......@@ -107,14 +107,14 @@ watch(inputVal, async (newValue) => {
emit('updateState', newValue)
})
// 去文本粘贴
const handlePaste = async (event) => {
const handlePaste = async (event: any) => {
event.preventDefault()
const pasteResult = handlePastePlainText(event.clipboardData)
if (pasteResult) return
await handlePasteImageFile(event.clipboardData)
}
// 去格式粘贴 文本
const handlePastePlainText = (clipboardData) => {
const handlePastePlainText = (clipboardData: any) => {
const text = clipboardData.getData('text/plain')
if (text) {
const textNode = document.createTextNode(text)
......@@ -124,9 +124,9 @@ const handlePastePlainText = (clipboardData) => {
return false
}
//改变光标位置
const cursorInsert = (node) => {
const cursorInsert = (node: any) => {
// 获取光标范围
const selObj = window.getSelection()
const selObj: any = window.getSelection()
const range = selObj.getRangeAt(0)
// 光标处插入节点
range.insertNode(node)
......@@ -135,7 +135,7 @@ const cursorInsert = (node) => {
inputVal.value = elAutocomplete.value.innerHTML
}
//粘贴图片
const handlePasteImageFile = async (clipboardData) => {
const handlePasteImageFile = async (clipboardData: any) => {
const img = getPasteImageFile(clipboardData.files)
if (!img) {
return
......@@ -154,11 +154,11 @@ const handlePasteImageFile = async (clipboardData) => {
}
// 获取一个 image object
const getImageObject = (uploadRes, showWidth, showHeight) => {
const getImageObject = (uploadRes: any, showWidth: any, showHeight: any) => {
const oImage = new Image(showWidth, showHeight)
const datasetFields = ['width', 'height']
const datasetSizes = {
const datasetSizes: any = {
width: '200',
height: '200',
}
......@@ -168,14 +168,14 @@ const getImageObject = (uploadRes, showWidth, showHeight) => {
oImage.src = uploadRes
return oImage
}
const getPasteImageFile = (clipboardDataFiles) => {
const getPasteImageFile = (clipboardDataFiles: any) => {
if (!clipboardDataFiles.length) {
return null
}
// 剪切版中选择的(用户第一个点的在尾)第一张图片
const clipboardDataFileList = Array.from(clipboardDataFiles || [])
let firstSelectedImage = null
clipboardDataFileList.forEach((file) => {
clipboardDataFileList.forEach((file: any) => {
if (!file.type.match(/image\//i)) {
return
}
......@@ -184,10 +184,10 @@ const getPasteImageFile = (clipboardDataFiles) => {
return firstSelectedImage
}
//将文件流转base64
const fileToBase64 = function (file) {
const fileToBase64 = function (file: any) {
return new Promise((resolve, reject) => {
const reader = new FileReader()
reader.onload = (event) => {
reader.onload = (event: any) => {
resolve(event.target.result)
}
reader.onerror = (error) => {
......@@ -196,21 +196,21 @@ const fileToBase64 = function (file) {
reader.readAsDataURL(file)
})
}
const removeDefaultContent = function (event) {
const removeDefaultContent = function (event: any) {
elAutocomplete.value.classList.remove('textarea')
cursorIn()
}
const addDefaultContent = function (event) {
const addDefaultContent = function (event: any) {
if (!event.target.innerHTML && event.target.innerText.length == 0) {
elAutocomplete.value.classList.add('textarea')
}
}
const cursorIn = function () {
var divElement = document.querySelector('div[contenteditable="true"]')
var divElement: any = document.querySelector('div[contenteditable="true"]')
var range = document.createRange()
range.selectNodeContents(divElement)
range.collapse(false)
var selection = window.getSelection()
var selection: any = window.getSelection()
selection.removeAllRanges()
selection.addRange(range)
}
......
<template>
<div class="select-box">
<div class="active">复制</div>
<div>翻译</div>
<div>设为客户名称</div>
<div>设置国家/地区</div>
<div>设为Email</div>
<div>设为watchApp</div>
</div>
</template>
<script></script>
<style scoped lang="scss">
.select-box {
display: flex;
width: 136px;
padding: var(--Spacing-md, 8px);
flex-direction: column;
align-items: flex-start;
gap: var(--Spacing-xs, 4px);
border-radius: var(--Radius-md, 8px);
background: var(--color-bg-Program-White, #fff);
box-shadow: 0 2px 12px 0 #08112914;
div {
padding: 6px 8px;
height: 32px;
line-height: 32px;
}
.active {
display: flex;
padding: var(--Spacing-sm, 6px) var(--Spacing-md, 8px);
align-items: center;
gap: var(--Spacing-none, 0);
align-self: stretch;
color: #fff;
border-radius: 4px;
background: #010914;
font-size: 14px;
}
}
</style>
import { h, render } from "vue";
import MenuComponent from "./MenuComponent.vue";
export function openCountextMenus(e: Event) {
// 替换浏览器的默认行为
let isShow = false;
let scope: HTMLElement | null;
let containerEl: HTMLDivElement;
function openMenu(e: MouseEvent) {
scope = document.getElementById("srollId");
containerEl = document.createElement("div");
const vnode = h(MenuComponent);
render(vnode, containerEl);
containerEl.style.position = "absolute";
scope?.appendChild(containerEl);
const { clientY, clientX } = e;
const { clientWidth } = scope!; //取父级的真实宽度
const { offsetWidth } = containerEl; //取窗口的真实宽度
const _X = clientWidth - clientX > offsetWidth ? "left" : "right";
const _X_offset = clientWidth - clientX;
containerEl.style.top = `${clientY}px`;
containerEl.style[_X] = _X === "left" ? `${clientX}px` : `${_X_offset}px`;
isShow = true;
}
function closeMenu() {
if (isShow) {
render(null, containerEl);
scope?.removeChild(containerEl);
isShow = false;
}
}
// window.oncontextmenu = function (e: MouseEvent) {
// e.preventDefault();
// if (isShow) closeMenu();
// openMenu(e);
// };
return {
isShow,
openMenu,
closeMenu,
};
}
<template>
<teleport to="body">
<div
id="select-box"
v-if="visible"
:style="{ top: `${top}px`, left: `${left}px` }"
>
<ul
v-for="(item, index) in menuList"
:class="{ active: active == index }"
:key="index"
@click.stop="handleItemClick(item,index)"
>
<li >{{ item }}</li>
</ul>
<!-- <div>翻译</div>
<div>设为客户名称</div>
<div>设置国家/地区</div>
<div>设为Email</div>
<div>设为watchApp</div> -->
</div>
</teleport>
</template>
<script setup lang="ts">
import { defineProps } from 'vue'
defineProps(['top', 'left', 'handleItemClick', 'visible', 'menuList', 'active'])
</script>
<style scoped lang="scss">
#select-box {
position: fixed;
z-index: 1000;
display: flex;
width: 136px;
padding: var(--Spacing-md, 8px);
flex-direction: column;
align-items: flex-start;
gap: var(--Spacing-xs, 4px);
border-radius: var(--Radius-md, 8px);
background: var(--color-bg-Program-White, #fff);
box-shadow: 0 2px 12px 0 #08112914;
ul {
padding: 6px 8px;
height: 32px;
line-height: 32px;
}
.active {
display: flex;
padding: var(--Spacing-sm, 6px) var(--Spacing-md, 8px);
align-items: center;
gap: var(--Spacing-none, 0);
align-self: stretch;
color: #fff;
border-radius: 4px;
background: #010914;
font-size: 14px;
}
}
</style>
const COS = require('cos-wx-sdk-v5');
import { ElMessage } from 'element-plus'
const uploadMixin = {
data() {
return {
uploadMixinPath: '',
uploadMixinType: '',
uploadMixinCredentials: {},
uploadMixinTimeStamp: 0
};
},
methods: {
upLoadFilesHander(tempFilePaths, tempFiles, zip){
return new Promise((resolve)=>{
if (tempFiles.length != 0) {
if(typeof this.upLoadHander !== 'function') return;
let uploadObj = {};
let uploadNum = tempFiles.length;
uploadObj.length = tempFiles.length;
//处理上传结果函数
function loadHandler({ success, message },i){
uploadNum = uploadNum - 1;
uploadObj[i] = message;
if (!success) {
uploadObj[i] = '';
ElMessage({
message: `[${i+1}]上传失败,请重新上传!`,
type: 'none',
})
}
if (uploadNum == 0) {
const arr = Array.from(uploadObj);
// ;
resolve({success: true, result: arr})
}
}
//进行上传
tempFiles.forEach((file, i) => {
this.upLoadHander({
path: tempFilePaths[i],
file: file.path,
zip: zip || '',
onSuccess: ({ success, message }) => {
loadHandler({ success, message },i)
},
onError: (res) => {
loadHandler({ success: false, message:''}, i)
}
});
});
}else{
resolve({success: true,result: []})
}
});
},
upLoadHander(obj) {
const { path, file, biz} = obj;
const pathArr = (path || '').split('/');
const pathStr = pathArr[pathArr.length -1];
const fileName = (pathStr || '').split('.');
let fileInfo = {
fileTyle: fileName.length > 1 ? fileName[fileName.length - 1] : '',
fileName: fileName[0],
biz: biz || 'temp',
file: file
};
const that = this;
const none = (async function hander(noCredentials) {
let res = {},
staticDomain = '',
resResult = true;
//noCredentials变量控制是否走对象存储
if (noCredentials) {
console.log(that.$https,'https')
res = await that.$https.request({
url: that.$interfaces.getUploadConfigInfo,
method: "get",
});
if (res.code === 200 && res.result) {
that.uploadMixinPath = res.result.upLoadPath;
that.uploadMixinType = res.result.uploadType;
staticDomain = res.result.staticDomain || 'https://cdn.tikcos.cn';
if (that.uploadMixinType === 'txcos') {
const ress = res.result.response;
const credentials = ress.credentials;
that.uploadMixinCredentials = {
TmpSecretId: credentials.tmpSecretId,
TmpSecretKey: credentials.tmpSecretKey,
SecurityToken: credentials.sessionToken,
StartTime: ress.startTime,
ExpiredTime: ress.expiredTime
};
}
} else {
resResult = false;
}
}
//resResult判断接口是否正常
if (resResult) {
if (that.uploadMixinType == 'txcos') {
//走对象存储
const cos = new COS({
getAuthorization: (options, callback) => {
callback(that.uploadMixinCredentials);
}
});
const tempFolder = fileInfo.biz === 'temp' ? '' : `${fileInfo.biz}/`;
const folder = `${fileInfo.fileName}_${new Date().getTime()}.${fileInfo.fileTyle}`;
cos.postObject(
{
FilePath: fileInfo.file,
Bucket: res.result.bucketName || 'tikcos-1257774783',
Region: res.result.regionid || 'ap-guangzhou',
Key: that.uploadMixinPath + tempFolder + folder,
Body: fileInfo.file,
onProgress: function (progressData) {
obj.onProgress && obj.onProgress(progressData);
}
},
(err, data) => {
if (!err && data.statusCode === 200) {
const imgurl = `${staticDomain}/${that.uploadMixinPath}${tempFolder}${folder}`;
obj.onSuccess({
success: true,
message: imgurl
});
} else {
obj.onError({
success: false,
message: err || '图片上传失败'
});
}
}
);
} else {
//走系统上传
that.$utils.ossUpload(
{
biz: fileInfo.biz,
file: fileInfo.file
},
(uploadRes) => {
// ;
if (uploadRes.success && uploadRes.message) {
//保存绝对路径,不然小程序会有问题
let url = uploadRes.message;
obj.onSuccess({ success: true, message: url });
} else {
obj.onError({
success: false,
message: uploadRes.message || '图片上传失败'
});
}
}
);
}
} else {
obj.onError({
success: false,
message: '服务接口报错'
});
}
})(true);
},
setOssUpload(obj) {
ossUpload(
{
biz: obj.biz,
file: obj.file
},
(uploadRes) => {
if (uploadRes.success && uploadRes.message) {
//保存绝对路径,不然小程序会有问题
let url = uploadRes.message;
const pre = url.startsWith('/') ? '' : '/';
url = axios['imgUrl'] + url;
obj.onSuccess({ success: true, message: url });
} else {
obj.onError({
success: false,
message: uploadRes.message || '图片上传失败'
});
}
}
);
}
}
};
export { uploadMixin };
......@@ -11,7 +11,7 @@ Mock.mock("/kf/auth/login", "post", () => {
};
});
//询价单
Mock.mock("/api/inquiryAdd", "get", () => {
Mock.mock("/inquiryAdd", "get", () => {
return {
code: "200",
success: true,
......@@ -23,7 +23,7 @@ Mock.mock("/api/inquiryAdd", "get", () => {
};
});
//快捷回复
Mock.mock("/api/kjiehuifu", 'get', () => {
Mock.mock("/kjiehuifu", 'get', () => {
return {
code: '200',
success: true,
......@@ -42,7 +42,7 @@ Mock.mock("/api/kjiehuifu", 'get', () => {
}
})
//列表
Mock.mock("/api/getUserList", 'get', () => {
Mock.mock("/getUserList", 'get', () => {
return {
code: '200',
success: true,
......@@ -51,7 +51,52 @@ Mock.mock("/api/getUserList", 'get', () => {
userId: '11fb824c0deb4e8b947275e1e7c4f7a2',
username: '1710323861524',
userImg: 'https://cdn.lirimall.com//lirigo/filetempImage/新鲜水果_1661668973048.png',
messages: []
messages: [
{
content: 'CSDN-Ada助手: 恭喜你写了一篇关于flex布局的博客!持续创作是非常了不起的',
contentFy: "CSDN-Ada Assistant: Congratulations on writing a blog about flex layout! It's amazing to keep creating",
isSent: true,
cmd: '11',
msgType: 0,
fromLang: 'cn',
toLang: 'en',
chatType: '2',
group_id: '',
time: Mock.mock('@time'),
to: 'admin',
form: '1710323861524',
userImg: 'https://cdn.lirimall.com//lirigo/filetempImage/新鲜水果_1661668973048.png',
},
{
content: 'CSDN-Ada助手: 恭喜你写了一篇关于flex布局的博客!持续创作是非常了不起的',
contentFy: "CSDN-Ada Assistant: Congratulations on writing a blog about flex layout! It's amazing to keep creating",
isSent: true,
cmd: '11',
msgType: 0,
fromLang: 'cn',
toLang: 'en',
userImg: 'https://cdn.lirimall.com//lirigo/filetempImage/新鲜水果_1661668973048.png',
chatType: '2',
group_id: '',
time: Mock.mock('@time'),
to: 'admin',
form: '1710323861524',
}, {
content: 'CSDN-Ada助手: 恭喜你写了一篇关于flex布局的博客!持续创作是非常了不起的',
contentFy: "CSDN-Ada Assistant: Congratulations on writing a blog about flex layout! It's amazing to keep creating",
isSent: false,
cmd: '11',
msgType: 0,
fromLang: 'cn',
toLang: 'en',
chatType: '2',
group_id: '',
userImg: 'https://cdn.lirimall.com//lirigo/filetempImage/新鲜水果_1661668973048.png',
time: Mock.mock('@time'),
to: 'admin',
form: '1710323861524',
},
]
}, {
userId: '4f99b6dc32d84a288d88e7d9635521a3',
username: '1710317951930',
......@@ -61,7 +106,7 @@ Mock.mock("/api/getUserList", 'get', () => {
}
})
//查看未读消息
Mock.mock("/api/checkMesssages", 'get', () => {
Mock.mock("/checkMesssages", 'get', () => {
return {
code: '200',
success: true,
......@@ -69,7 +114,7 @@ Mock.mock("/api/checkMesssages", 'get', () => {
result: []
}
})
Mock.mock("/api/getUploadConfigInfo", 'get', () => {
Mock.mock("/getUploadConfigInfo", 'get', () => {
return {
code: '200',
success: true,
......@@ -83,14 +128,14 @@ Mock.mock("/api/getUploadConfigInfo", 'get', () => {
startTime: "",
expiredTime: "",
credentials: {
tmpSecretId: "",
tmpSecretKey: "",
sessionToken: "",
tmpSecretId: "",
tmpSecretKey: "",
sessionToken: "",
},
}
}
})
Mock.mock("/api/upload", 'get', () => {
Mock.mock("/upload", 'get', () => {
return {
code: '200',
success: true,
......@@ -104,14 +149,14 @@ Mock.mock("/api/upload", 'get', () => {
startTime: "",
expiredTime: "",
credentials: {
tmpSecretId: "",
tmpSecretKey: "",
sessionToken: "",
tmpSecretId: "",
tmpSecretKey: "",
sessionToken: "",
},
},
},
}
})
Mock.mock("/deleteUserList",'delete',(req)=>{
Mock.mock("/deleteUserList", 'delete', (req) => {
console.log(req)
const id = Mock.mock.env.url.match(/\/(\d+)/)[1];
return {
......
......@@ -70,7 +70,7 @@
>
<div class="time">{{ message.time }}</div>
<div v-if="message.isSent" class="message-container">
<div class="bubble">
<div class="bubble" @contextmenu="showContextMenu($event, item)">
<div v-if="message?.msgType == 0" class="message">
<div class="content" v-html="message?.content"></div>
<div class="contentFy" v-html="message?.contentFy"></div>
......@@ -94,7 +94,7 @@
<div class="avatar">
<img :src="message?.userImg" class="avatar-image" />
</div>
<div class="bubble">
<div class="bubble" @contextmenu="showContextMenu($event, item)">
<div v-if="message?.msgType == 0" class="message">
<div class="content" v-html="message?.content"></div>
<div class="contentFy" v-html="message?.contentFy"></div>
......@@ -108,6 +108,15 @@
</div>
</div>
</div>
<RightClickMenu
:top="contextMenuTop"
:left="contextMenuLeft"
:active="contextMenuIndex"
:handleItemClick="handleContextMenuItemClick"
:visible="contextMenuVisible"
ref="targetElement"
:menuList="menuList"
/>
</el-main>
<el-footer class="el-footer">
<AutomaticPrompt
......@@ -246,13 +255,64 @@ import { ElMessage } from 'element-plus'
import { ref, onMounted, watch, nextTick, reactive } from 'vue'
import { getShortDate } from '../utils/index'
import { useUserStore } from '../store/modules/user'
import AutomaticPrompt from '../components/AutomaticPrompt.vue'
import AutomaticPrompt from '@/components/AutomaticPrompt.vue'
import ImageViewer from '@luohc92/vue3-image-viewer'
import { sendWebSocket } from '../utils/websocket'
import type { FormInstance } from 'element-plus'
import { initWebSocket } from '../utils/websocket'
import '@luohc92/vue3-image-viewer/dist/style.css'
import { getUserList, InquiryAdd, checkMesssages } from '../axios/model/user'
import { openCountextMenus } from '@/components/Menu/index'
import RightClickMenu from '@/components/RightClickMenu.vue'
let menuList = ref([
'复制',
'翻译',
'设为客户名称',
'设置国家/地区',
'设为Email',
'设为watchApp',
])
const targetElement = ref(null)
const contextMenuVisible = ref(false)
const contextMenuTop = ref(0)
const contextMenuLeft = ref(0)
const contextMenuIndex = ref(0)
//显示右键菜单的函数,在右键点击时调用。
//它阻止了默认的右键菜单并设置了菜单的位置,同时添加了一个点击事件监听器来在其他地方点击时隐藏菜单。
const showContextMenu = (event, item) => {
//阻止默认右键事件
event.preventDefault()
//菜单可见
contextMenuVisible.value = true
//获取鼠标坐标
contextMenuTop.value = event.clientY
contextMenuLeft.value = event.clientX
// 检测是否超出浏览器视口区域 一个菜单40px*6个
const menuHeight = 300 // 右键菜单的高度
const windowHeight = window.innerHeight
if (event.clientY + menuHeight > windowHeight) {
// 如果右键菜单超出视口底部,调整位置为向上弹出
contextMenuTop.value -= menuHeight
}
window.addEventListener('click', hideContextMenu)
}
//隐藏右键菜单的函数,移除点击事件监听器,并将 contextMenuVisible 设置为 false
const hideContextMenu = (e:any) => {
var pop: any = document.querySelector('#select-box')
if (!e || e?.target && !pop.contains(e?.target)) {
contextMenuVisible.value = false
window.removeEventListener('click', hideContextMenu)
}
}
//处理右键菜单项点击的函数,你可以在这里处理点击菜单项后的逻辑。
const handleContextMenuItemClick = (item: any, index: number) => {
console.log(`Clicked on ${(item, index)}`)
contextMenuIndex.value = index
hideContextMenu()
}
const ruleForm = ref({
count: 1,
})
......@@ -264,7 +324,8 @@ const connectMsg = () => {
useUser.connect()
initWebSocket(toIp)
}
connectMsg()
// connectMsg()
const ruleFormRef = ref<FormInstance>()
const customerInfo = ref({})
const messages = ref([])
......@@ -323,14 +384,10 @@ const rules = reactive({
})
let msg = ''
//进入页面直接发送请求从后端获取热点数据
onMounted(async () => {
count.value = store.count
// if (store.userList.length > 0) {
// userList.value = store.userList
// } else {
// getList()
// }
userList.value = store.userList
onMounted(() => {
// count.value = store.count
// userList.value = store.userList
getList()
setMessage()
})
//设置message
......@@ -347,13 +404,13 @@ const getList = async () => {
try {
const { success, result, message }: any = await getUserList(query)
if (success) {
let list = result.map((item: any) => {
item.messages = []
return item
})
userList.value = list
store.setUserList(list)
if (customerInfo.value.username) handleMenuClick(customerInfo.value)
// let list = result.map((item: any) => {
// item.messages = []
// return item
// })
userList.value = result
store.setUserList(result)
if (customerInfo.value?.username) handleMenuClick(customerInfo.value)
}
} catch (error) {
console.log(error)
......@@ -402,15 +459,15 @@ const handleMenuClick = (item: object) => {
customerInfo.value = item
store.setCustomerInfo(item)
messages.value = item?.messages || []
const data = {
const data: any = {
cmd: '19',
type: '1',
fromUserId: item?.username,
group_id: '',
userId: store.userInfo.username,
}
sendWebSocket(data)
getCheckMesssages(data)
// sendWebSocket(data)
// getCheckMesssages(data)
}
//发送按钮
const handleButtonClick = () => {
......@@ -420,7 +477,7 @@ const handleButtonClick = () => {
type: 'error',
})
}
let data = {
let data: any = {
content: msg,
contentFy: msg,
isSent: true,
......@@ -480,6 +537,13 @@ const getCheckMesssages = async (res: any) => {
console.log(error)
}
}
//点击消息弹窗
// const showContextMenu = (e: any, item: any) => {
// e.preventDefault()
// const { closeMenu, openMenu, isShow } = openCountextMenus(e)
// if (isShow) closeMenu()
// openMenu(e)
// }
//提交询价单
const sumbitFuleForm = (formEl: FormInstance | undefined) => {
......@@ -537,7 +601,7 @@ const getMenuItem = (item: any) => {
}
}
.el-container-center {
background: #F8F8FA;
background: #f8f8fa;
}
.el-header-center {
height: 76px;
......@@ -869,9 +933,10 @@ const getMenuItem = (item: any) => {
font-style: normal;
font-weight: 400;
color: #0c203d;
margin-bottom: 8px;
}
.contentFy {
font-family: "PingFang SC";
font-family: 'PingFang SC';
font-size: 14px;
font-style: normal;
font-weight: 400;
......@@ -882,16 +947,16 @@ const getMenuItem = (item: any) => {
.message-container-right {
justify-content: flex-end;
.bubble{
background: #E6E8EB;
.bubble {
background: #e6e8eb;
border-radius: 8px 0 8px 8px;
}
}
.message-container-left {
justify-content: flex-start;
.bubble{
background: #FFFFFF;
.bubble {
background: #ffffff;
border-radius: 0px 8px 8px 8px;
margin-left: 8px;
}
......
......@@ -93,7 +93,7 @@ export default {
// })
// console.log(res)
// })
// axios
// .delete('/api/getUserList/' + data.id)
// .then((response) => {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论