fix: 修复文件上传和编辑器相关问题

- 启用vueDevTools插件用于开发调试
- 移除调试用的console.error/log语句
- 修复文件扩展名获取可能导致的错误
- 优化文件上传逻辑,添加path字段
- 重构编辑器图片上传处理,支持直接发送
- 调整编辑器样式颜色
This commit is contained in:
Phoenix 2025-06-06 16:57:02 +08:00
parent 7067c42b2b
commit 3ec981ea7f
6 changed files with 66 additions and 98 deletions

View File

@ -252,8 +252,29 @@ const handlePaste = (event) => {
// //
const file = items[i].getAsFile() const file = items[i].getAsFile()
if (file) { if (file) {
// 使 const tempUrl = URL.createObjectURL(file);
onUploadFile([file]) const image = new Image();
image.src = tempUrl;
image.onload = () => {
const form = new FormData();
form.append('file', file);
form.append("source", "fonchain-chat");
form.append("urlParam", `width=${image.width}&height=${image.height}`);
insertImage(tempUrl, image.width, image.height);
uploadImg(form).then(({ code, data, message }) => {
if (code == 0) {
const editorImages = editorRef.value.querySelectorAll('img.editor-image');
const lastImage = editorImages[editorImages.length - 1];
if (lastImage && lastImage.src === tempUrl) {
lastImage.src = data.ori_url;
handleInput({ target: editorRef.value });
}
} else {
window['$message'].error(message);
}
});
};
return return
} }
} }
@ -665,75 +686,44 @@ const formatFileSize = (size) => {
return (size / (1024 * 1024 * 1024)).toFixed(2) + ' GB' return (size / (1024 * 1024 * 1024)).toFixed(2) + ' GB'
} }
} }
//
const onUploadSendImg=async (eventFile)=>{
for (const file of eventFile.target.files) {
const form = new FormData();
form.append('file', file);
form.append("source", "fonchain-chat");
const res=await uploadImg(form)
/** if(res.status===0){
* 文件上传处理 const data={
* @param e 上传事件对象或文件数组 height:0,
*/ width:0,
// size:10000,
async function onUploadFile(e) { url:res.data.ori_url,
let files;
//
if (Array.isArray(e)) {
//
files = e;
} else {
//
files = e.target.files;
e.target.value = null; // input
} }
emit(
'editor-event',
emitCall(
'image_event',
data
)
)
}
}
}
async function onUploadFile(e) {
let file = e.target.files[0]
// e.target.value = null // input
if (!files || files.length === 0) return;
//
const file = files[0];
console.log("文件类型"+file.type) console.log("文件类型"+file.type)
if (file.type.indexOf('image/') === 0) { if (file.type.indexOf('image/') === 0) {
console.log("进入图片") console.log("进入图片")
// URL // -
const tempUrl = URL.createObjectURL(file); let fn = emitCall('image_event', file, () => {})
emit('editor-event', fn)
// return
const image = new Image();
image.src = tempUrl;
image.onload = () => {
//
const form = new FormData();
form.append('file', file);
form.append("source", "fonchain-chat"); //
form.append("urlParam", `width=${image.width}&height=${image.height}`);
//
insertImage(tempUrl, image.width, image.height);
// URL
uploadImg(form).then(({ code, data, message }) => {
if (code == 0) {
// URLURL
console.log('图片上传成功:', data.ori_url);
// srcURL
const editorImages = editorRef.value.querySelectorAll('img.editor-image');
//
const lastImage = editorImages[editorImages.length - 1];
if (lastImage && lastImage.src === tempUrl) {
// URL
lastImage.src = data.ori_url;
//
handleInput({ target: editorRef.value });
}
} else {
window['$message'].error(message);
}
});
};
return;
} }
if (file.type.indexOf('video/') === 0) { if (file.type.indexOf('video/') === 0) {
@ -1424,7 +1414,7 @@ const handleEditorClick = (event) => {
通过ref获取DOM引用 通过ref获取DOM引用
--> -->
<form enctype="multipart/form-data" style="display: none"> <form enctype="multipart/form-data" style="display: none">
<input type="file" ref="fileImageRef" accept="image/*" @change="onUploadFile" /> <input type="file" ref="fileImageRef" accept="image/*" @change="onUploadSendImg" />
<input type="file" ref="uploadFileRef" @change="onUploadFile" /> <input type="file" ref="uploadFileRef" @change="onUploadFile" />
</form> </form>
@ -1507,12 +1497,6 @@ const handleEditorClick = (event) => {
} }
} }
} }
/**
* 文件链接样式
* 使用:deep()选择器影响组件内部元素
* 显示文件链接的卡片式样式
*/
:deep(.editor-file) { :deep(.editor-file) {
display: inline-block; display: inline-block;
padding: 5px 10px; padding: 5px 10px;
@ -1520,7 +1504,7 @@ const handleEditorClick = (event) => {
background-color: #f5f5f5; background-color: #f5f5f5;
border: 1px solid #e0e0e0; border: 1px solid #e0e0e0;
border-radius: 4px; border-radius: 4px;
color: #2196f3; color: #462AA0;
text-decoration: none; text-decoration: none;
position: relative; position: relative;
padding-right: 60px; /* 为文件大小信息留出空间 */ padding-right: 60px; /* 为文件大小信息留出空间 */
@ -1543,12 +1527,6 @@ const handleEditorClick = (event) => {
} }
} }
//
/**
* 表情符号样式
* 使用:deep()选择器影响组件内部元素
* 设置表情符号的大小和对齐方式
*/
:deep(.editor-emoji) { :deep(.editor-emoji) {
display: inline-block; display: inline-block;
width: 24px; width: 24px;
@ -1556,13 +1534,6 @@ const handleEditorClick = (event) => {
vertical-align: middle; /* 垂直居中对齐 */ vertical-align: middle; /* 垂直居中对齐 */
margin: 0 2px; margin: 0 2px;
} }
/**
* 引用消息样式
* 使用:deep()选择器影响组件内部元素
* 创建带有左侧边框的引用卡片
* 使用CSS变量适配不同主题
*/
:deep(.editor-quote) { :deep(.editor-quote) {
margin-bottom: 8px; margin-bottom: 8px;
padding: 8px 12px; padding: 8px 12px;

View File

@ -64,8 +64,8 @@ const fileInfo = computed(() => {
// //
function getFileExtension(filepath) { function getFileExtension(filepath) {
const parts = filepath.split('.') const parts = filepath?.split('.')
return parts.length > 1 ? parts.pop().toUpperCase() : '' return parts?.length > 1 ? parts?.pop()?.toUpperCase() : ''
} }
// //

View File

@ -190,8 +190,6 @@ export const useTalkRecord = (uid: number) => {
loadConfig.receiver_id = params.receiver_id loadConfig.receiver_id = params.receiver_id
loadConfig.talk_type = params.talk_type loadConfig.talk_type = params.talk_type
console.error('onLoad', params, options)
// 新增:支持指定消息定位模式,参数以传入为准合并 // 新增:支持指定消息定位模式,参数以传入为准合并
if (options?.specifiedMsg?.cursor !== undefined) { if (options?.specifiedMsg?.cursor !== undefined) {
loadConfig.specialParams = { ...options.specifiedMsg } // 记录特殊参数,供分页加载用 loadConfig.specialParams = { ...options.specifiedMsg } // 记录特殊参数,供分页加载用

View File

@ -289,7 +289,6 @@ watch(
async (newProps) => { async (newProps) => {
await nextTick() await nextTick()
let specialParams = undefined let specialParams = undefined
console.error(newProps, 'newProps')
if (newProps.specifiedMsg) { if (newProps.specifiedMsg) {
try { try {
const parsed = JSON.parse(decodeURIComponent(newProps.specifiedMsg)) const parsed = JSON.parse(decodeURIComponent(newProps.specifiedMsg))

View File

@ -101,7 +101,7 @@ const onSendImageEvent = ({ data, callBack }) => {
// //
const onSendVideoEvent = async ({ data }) => { const onSendVideoEvent = async ({ data }) => {
console.log('onSendVideoEvent')
// //
// let resp = await getVideoImage(data) // let resp = await getVideoImage(data)
@ -166,7 +166,6 @@ const onSendFileEvent = ({ data }) => {
return window['$message'].warning('上传文件不能超过100M!') return window['$message'].warning('上传文件不能超过100M!')
} }
const clientUploadId = `file-${Date.now()}-${Math.floor(Math.random() * 1000)}` const clientUploadId = `file-${Date.now()}-${Math.floor(Math.random() * 1000)}`
const tempMessage = { const tempMessage = {
msg_id: clientUploadId, msg_id: clientUploadId,
sequence: Date.now(), sequence: Date.now(),
@ -182,6 +181,7 @@ const onSendFileEvent = ({ data }) => {
extra: { extra: {
name: data.name, name: data.name,
url: '', url: '',
path:data.name,
size: data.size, size: data.size,
is_uploading: true, is_uploading: true,
upload_id: clientUploadId, upload_id: clientUploadId,

View File

@ -46,9 +46,9 @@ export default defineConfig(({ mode }) => {
vueJsx({}), vueJsx({}),
compressPlugin(), compressPlugin(),
UnoCSS(), UnoCSS(),
// vueDevTools({ vueDevTools({
// launchEditor: 'trae', launchEditor: 'trae',
// }) })
], ],
define: { define: {
__APP_ENV__: env.APP_ENV __APP_ENV__: env.APP_ENV