Compare commits
7 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
3ec981ea7f | ||
|
7067c42b2b | ||
|
1ff26564c7 | ||
|
b18a6e5432 | ||
|
17c1368346 | ||
|
f279248a51 | ||
|
c89056d7f1 |
@ -20,6 +20,7 @@
|
|||||||
"@kangc/v-md-editor": "^2.3.18",
|
"@kangc/v-md-editor": "^2.3.18",
|
||||||
"@onlyoffice/document-editor-vue": "^1.5.0",
|
"@onlyoffice/document-editor-vue": "^1.5.0",
|
||||||
"@vicons/fluent": "^0.13.0",
|
"@vicons/fluent": "^0.13.0",
|
||||||
|
"@vicons/ionicons4": "^0.13.0",
|
||||||
"@vicons/ionicons5": "^0.13.0",
|
"@vicons/ionicons5": "^0.13.0",
|
||||||
"@vueup/vue-quill": "^1.2.0",
|
"@vueup/vue-quill": "^1.2.0",
|
||||||
"@vueuse/core": "^10.7.0",
|
"@vueuse/core": "^10.7.0",
|
||||||
|
@ -26,6 +26,9 @@ importers:
|
|||||||
'@vicons/fluent':
|
'@vicons/fluent':
|
||||||
specifier: ^0.13.0
|
specifier: ^0.13.0
|
||||||
version: 0.13.0
|
version: 0.13.0
|
||||||
|
'@vicons/ionicons4':
|
||||||
|
specifier: ^0.13.0
|
||||||
|
version: 0.13.0
|
||||||
'@vicons/ionicons5':
|
'@vicons/ionicons5':
|
||||||
specifier: ^0.13.0
|
specifier: ^0.13.0
|
||||||
version: 0.13.0
|
version: 0.13.0
|
||||||
@ -1002,6 +1005,9 @@ packages:
|
|||||||
'@vicons/fluent@0.13.0':
|
'@vicons/fluent@0.13.0':
|
||||||
resolution: {integrity: sha512-bYGZsOE3qzvm3Cm43e7tybgGlr5ZUpYqtRZq0g0Tfupe8jIzLolpvQLNUt1zS8Mgt6goTbUk5YH7Fkv16jkykg==}
|
resolution: {integrity: sha512-bYGZsOE3qzvm3Cm43e7tybgGlr5ZUpYqtRZq0g0Tfupe8jIzLolpvQLNUt1zS8Mgt6goTbUk5YH7Fkv16jkykg==}
|
||||||
|
|
||||||
|
'@vicons/ionicons4@0.13.0':
|
||||||
|
resolution: {integrity: sha512-5WHIl/4R5a4i9GONa+hIQWxg/WczrbsCdqxawHZvdd3drsEr+Q3yzlfS+NNRO4WS3uDW2uWLCwoW+yp5TgcKeQ==}
|
||||||
|
|
||||||
'@vicons/ionicons5@0.13.0':
|
'@vicons/ionicons5@0.13.0':
|
||||||
resolution: {integrity: sha512-zvZKBPjEXKN7AXNo2Na2uy+nvuv6SP4KAMQxpKL2vfHMj0fSvuw7JZcOPCjQC3e7ayssKnaoFVAhbYcW6v41qQ==}
|
resolution: {integrity: sha512-zvZKBPjEXKN7AXNo2Na2uy+nvuv6SP4KAMQxpKL2vfHMj0fSvuw7JZcOPCjQC3e7ayssKnaoFVAhbYcW6v41qQ==}
|
||||||
|
|
||||||
@ -4411,6 +4417,8 @@ snapshots:
|
|||||||
|
|
||||||
'@vicons/fluent@0.13.0': {}
|
'@vicons/fluent@0.13.0': {}
|
||||||
|
|
||||||
|
'@vicons/ionicons4@0.13.0': {}
|
||||||
|
|
||||||
'@vicons/ionicons5@0.13.0': {}
|
'@vicons/ionicons5@0.13.0': {}
|
||||||
|
|
||||||
'@vitejs/plugin-vue-jsx@3.1.0(vite@6.3.5(@types/node@18.19.99)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.2))(vue@3.5.13(typescript@5.2.2))':
|
'@vitejs/plugin-vue-jsx@3.1.0(vite@6.3.5(@types/node@18.19.99)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.2))(vue@3.5.13(typescript@5.2.2))':
|
||||||
|
1884
src/components/editor/CustomEditor.vue
Normal file
1884
src/components/editor/CustomEditor.vue
Normal file
File diff suppressed because it is too large
Load Diff
@ -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() : ''
|
||||||
}
|
}
|
||||||
|
|
||||||
// 切换播放状态
|
// 切换播放状态
|
||||||
|
@ -5,5 +5,6 @@ export const enum ContactConst {
|
|||||||
export const enum EditorConst {
|
export const enum EditorConst {
|
||||||
Mention = 'editor:mention',
|
Mention = 'editor:mention',
|
||||||
Quote = 'editor:quote',
|
Quote = 'editor:quote',
|
||||||
Edit = 'editor:edit'
|
Edit = 'editor:edit',
|
||||||
|
Clear = 'editor:clear'
|
||||||
}
|
}
|
||||||
|
@ -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 } // 记录特殊参数,供分页加载用
|
||||||
|
@ -18,7 +18,7 @@ export function isLoggedIn() {
|
|||||||
*/
|
*/
|
||||||
export function getAccessToken() {
|
export function getAccessToken() {
|
||||||
// return storage.get(AccessToken) || ''
|
// return storage.get(AccessToken) || ''
|
||||||
return JSON.parse(localStorage.getItem('token'))||'46d71a72d8d845ad7ed23eba9bdde260e635407190c2ce1bf7fd22088e41682ea07773ec65cae8946d2003f264d55961f96e0fc5da10eb96d3a348c1664e9644ce2108c311309f398ae8ea1b8200bfd490e5cb6e8c52c9e5d493cbabb163368f8351420451a631dbfa749829ee4cda49b77b5ed2d3dced5d0f2b7dd9ee76ba5465c84a17c23af040cd92b6b2a4ea48befbb5c729dcdad0a9c9668befe84074cc24f78899c1d947f8e7f94c7eda5325b8ed698df729e76febb98549ef3482ae942fb4f4a1c92d21836fa784728f0c5483aab2760a991b6b36e6b10c84f840a6433a6ecc31dee36e8f1c6158818bc89d22726726265e9af0db370a54ea5ee002b43662d571b84c8468ac15330f79503a5cd5e72282d8bee92749b1a3c1b7fd87ae70b64b90e437e84c1b558c64a35e181b2ecf5db3007680c3607eac1edee7f59d'
|
return JSON.parse(localStorage.getItem('token'))||'46d71a72d8d845ad7ed23eba9bdde260e635407190c2ce1bf7fd22088e41682ea07773ec65cae8946d2003f264d55961f96e0fc5da10eb96d3a348c1664e9644ce2108c311309f398ae8ea1b8200bfd490e5cb6e8c52c9e5d493cbabb163368f8351420451a631dbfa749829ee4cda49b77b5ed2d3dced5d0f2b7dd9ee76ba5465c84a17c23af040cd92b6b2a4ea48befbb5c729dcdad0a9c9668befe84074cc24f78899c1d947f8e7f94c7eda5325b8ed698df729e76febb98549ef3482ae942fb4f4a1c92d21836fa784728f0c5483aab2760a991b6b36e6b10c84f840a6433a6ecc31dee36e8f1c6158818bc89d22403363066ad3c046839f7b2cf8a6186da017388f197c0c3b219b1c04e7d986e9774b72664a22a6075cee77da3584b7a2131365913796a5fcabc8f4594284e480a592a84a40a9aa7f5f27c951a53a369c'
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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))
|
||||||
|
@ -16,6 +16,7 @@ import Editor from '@/components/editor/Editor.vue'
|
|||||||
import MultiSelectFooter from './MultiSelectFooter.vue'
|
import MultiSelectFooter from './MultiSelectFooter.vue'
|
||||||
import HistoryRecord from '@/components/talk/HistoryRecord.vue'
|
import HistoryRecord from '@/components/talk/HistoryRecord.vue'
|
||||||
import {scrollToBottom} from '@/utils/dom.ts'
|
import {scrollToBottom} from '@/utils/dom.ts'
|
||||||
|
import CustomEditor from '@/components/editor/CustomEditor.vue'
|
||||||
const userStore = useUserStore()
|
const userStore = useUserStore()
|
||||||
const talkStore = useTalkStore()
|
const talkStore = useTalkStore()
|
||||||
const editorStore = useEditorStore()
|
const editorStore = useEditorStore()
|
||||||
@ -60,11 +61,11 @@ const onSendMessage = (data = {}, callBack: any) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ServePublishMessage(message)
|
ServePublishMessage(message)
|
||||||
.then(({ code, message }) => {
|
.then(({ code, message, msg }) => {
|
||||||
if (code == 200) {
|
if (code == 200) {
|
||||||
callBack(true)
|
callBack(true)
|
||||||
} else {
|
} else {
|
||||||
window['$message'].warning(message)
|
window['$message'].warning(message || msg)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch(() => {
|
.catch(() => {
|
||||||
@ -94,65 +95,13 @@ const onSendTextEvent = throttle((value: any) => {
|
|||||||
}, 1000)
|
}, 1000)
|
||||||
|
|
||||||
// 发送图片消息
|
// 发送图片消息
|
||||||
const onSendImageEvent = ({ data }) => {
|
const onSendImageEvent = ({ data, callBack }) => {
|
||||||
console.log('onSendImageEvent')
|
onSendMessage({ type: 'image', ...data }, callBack)
|
||||||
|
|
||||||
// 先创建一个带有上传ID的临时消息对象,用于显示进度
|
|
||||||
const uploadId = `image-${Date.now()}-${Math.floor(Math.random() * 1000)}`
|
|
||||||
|
|
||||||
// 创建本地预览URL
|
|
||||||
const previewUrl = URL.createObjectURL(data)
|
|
||||||
|
|
||||||
// 创建临时消息记录
|
|
||||||
const tempMessage = {
|
|
||||||
msg_id: uploadId,
|
|
||||||
sequence: Date.now(),
|
|
||||||
talk_type: props.talk_type,
|
|
||||||
msg_type: 3, // 图片消息类型
|
|
||||||
user_id: props.uid,
|
|
||||||
receiver_id: props.receiver_id,
|
|
||||||
is_revoke: 0,
|
|
||||||
is_mark: 0,
|
|
||||||
is_read: 1,
|
|
||||||
content: '',
|
|
||||||
created_at: parseTime(new Date(), '{y}-{m}-{d} {h}:{i}'),
|
|
||||||
extra: {
|
|
||||||
url: previewUrl, // 使用本地预览URL
|
|
||||||
size: data.size,
|
|
||||||
is_uploading: true,
|
|
||||||
upload_id: uploadId,
|
|
||||||
percentage: 0
|
|
||||||
},
|
|
||||||
isCheck: false,
|
|
||||||
send_status: 1,
|
|
||||||
float: 'right' // 我发送的消息显示在右侧
|
|
||||||
}
|
|
||||||
|
|
||||||
// 直接添加到对话记录中
|
|
||||||
dialogueStore.addDialogueRecord(tempMessage)
|
|
||||||
nextTick(()=>{
|
|
||||||
scrollToBottom()
|
|
||||||
})
|
|
||||||
uploadsStore.initUploadFile(
|
|
||||||
data,
|
|
||||||
props.talk_type,
|
|
||||||
props.receiver_id,
|
|
||||||
uploadId,
|
|
||||||
async (percentage) => {
|
|
||||||
dialogueStore.updateUploadProgress(uploadId, percentage)
|
|
||||||
},
|
|
||||||
async () => {
|
|
||||||
// 清理本地预览URL
|
|
||||||
URL.revokeObjectURL(previewUrl)
|
|
||||||
dialogueStore.batchDelDialogueRecord([uploadId])
|
|
||||||
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送视频消息
|
// 发送视频消息
|
||||||
const onSendVideoEvent = async ({ data }) => {
|
const onSendVideoEvent = async ({ data }) => {
|
||||||
console.log('onSendVideoEvent')
|
|
||||||
|
|
||||||
// 获取视频首帧作为封面图
|
// 获取视频首帧作为封面图
|
||||||
// let resp = await getVideoImage(data)
|
// let resp = await getVideoImage(data)
|
||||||
@ -217,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(),
|
||||||
@ -233,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,
|
||||||
@ -342,7 +291,8 @@ onMounted(() => {
|
|||||||
<footer class="el-footer">
|
<footer class="el-footer">
|
||||||
<MultiSelectFooter v-if="dialogueStore.isOpenMultiSelect" />
|
<MultiSelectFooter v-if="dialogueStore.isOpenMultiSelect" />
|
||||||
|
|
||||||
<Editor v-else @editor-event="onEditorEvent" :vote="talk_type == 2" :members="members" />
|
<!-- <Editor v-else @editor-event="onEditorEvent" :vote="talk_type == 2" :members="members" /> -->
|
||||||
|
<CustomEditor v-else @editor-event="onEditorEvent" :vote="talk_type == 2" :members="members" />
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
<HistoryRecord
|
<HistoryRecord
|
||||||
|
Loading…
Reference in New Issue
Block a user