tinymce在vue3中的用法以及文本流式输出

一、版本
"@tinymce/tinymce-vue": "4.0.5",
"tinymce": "5.10.2",
二、步骤

具体步骤可以参考tinymce在vue2中的用法中的步骤

三、在项目index.html-body中引入tinymcejs
<script src="tinymce/tinymce.min.js"></script>
四、tinymce引入自定义插件

在项目的public/tinymce文件夹下引入按需放置自定义插件文件,比如formatpainter和indent2em

在使用tinymce插件的vue中引入自定义插件

import '@PublicDir/tinymce/plugins/formatpainter';
import '@PublicDir/tinymce/plugins/indent2em';
五、具体代码

1、封装组件

把tinymce初始化以及文本流式输出封装成组件放到项目src/components文件夹下:

tinymce.vue

<template><div class="tinymce-page"><Editor v-model="editorValue" class="tinymce-editor" :init="init" @focus="handleFocus"></Editor><!-- AI生成modal  --><FModal v-model:show="modalObj.showModal" :maskClosable="false" :closable="modalObj.state === '2'" :title="modalObj.title" vertical-center :width="860" contentClass="ai-modal-wrapper" @cancel="cancel"><div class="ai"><FScrollbar ref="scrollbarRef" :maxHeight="modalMaxHeight" style="width: 100%"><div v-if="modalObj.state === '1'" class="ai-loading"><EditOutlined />AI生成中</div><FTooltip v-else mode="popover" trigger="click" placement="right-start" popperClass="popover-regular"><div id="message" class="message"><span v-html="modalObj.message"></span><LoadingOutlined v-if="modalObj.messageState === '2'" /></div><template #content><div class="list"><div class="title">编辑诉求或选择以下方式</div><div v-for="(item, index) in aiToolbarList":key="index"class="item":title="item.label"@click="handleClick(item.value)"><EditOutlined />{{item.label}}</div></div></template></FTooltip></FScrollbar></div><template #footer></template></FModal></div>
</template>
<script setup>
import {FInput, FMessage, FModal, FScrollbar,
} from '@fesjs/fes-design';
import {ref, defineEmits, defineProps, computed, nextTick, watch, onUnmounted,
} from 'vue';
import { EditOutlined, LoadingOutlined } from '@fesjs/fes-design/icon';
import { request } from '@fesjs/fes';
import tinymce from 'tinymce'; // tinymce默认hidden,不引入不显示
import Editor from '@tinymce/tinymce-vue';// 编辑器引入;
import 'tinymce/icons/default/icons';
import 'tinymce/themes/silver/theme';// 编辑器主题
import 'tinymce/plugins/contextmenu'; // 上下文菜单
import 'tinymce/plugins/table';
import 'tinymce/plugins/image';
import 'tinymce/plugins/lists';
import 'tinymce/plugins/paste';
import '@PublicDir/tinymce/plugins/formatpainter';
import '@PublicDir/tinymce/plugins/indent2em';const props = defineProps({value: {type: String,default: '',},disabled: {type: Boolean,default: false,},aiId: { // ai生成时所需IDtype: String,default: '',},title: { // 文档标题type: String,default: '',},textTitle: { // 输入框标题,用来做校验错误信息提示type: String,default: '',},placeholder: { // placeholdertype: String,default: '',},
});
const emits = defineEmits(['update:value', 'selectEditor']);// 通过重写计算属性的set和get方法,将计算属性的结果绑定在文本框的model中
const editorValue = computed({get: () => props.value,set: (val) => {emits('update:value', val);},
});
const myEditor = ref(null);const modalObj = ref({title: '',showModal: false,message: '',state: '1', // 1、AI生成中 2、生成成功messageState: '1', // 加载状态显示 1、生成成功或者未触发生成 2、文案生成中
});
const tinymceSelectText = ref('');// 文本框选中的文案// const queryAIResult = sessionId => new Promise((resolve, reject) => {
//     request('/projectDoc/ai/write/result', { sessionId }, 'post')
//         .then((result) => {
//             if (result.status === 'PENDING') {
//                 reject('pending');
//             } else {
//                 resolve(result);
//             }
//         }).catch((error) => {
//             reject(error);
//         });
// });// const queryAiResultCircle = (sessionId) => {
//     queryAIResult(sessionId).then((result) => {
//         if (result.status === 'FAIL') {
//             modalObj.value.message = '生成失败';
//         } else {
//             modalObj.value.message = result.output || '生成失败';
//         }
//         modalObj.value.state = '2';
//     }).catch((error) => {
//         setTimeout(() => queryAiResultCircle(sessionId), 5000);
//     });
// };// const queryAiResultCircle = async (sessionId) => {
//     queryAIResult(sessionId).then((result) => {
//         if (result.status === 'FAIL') {
//             modalObj.value.message = '生成失败';
//         } else {
//             modalObj.value.message = result.output || '生成失败';
//         }
//         modalObj.value.state = '2';
//     }).catch((error) => {
//         setTimeout(() => queryAiResultCircle(sessionId), 5000);
//     });
//     const result = await request('/projectDoc/ai/write/body', {
//         sessionId,
//     }, {
//         method: 'post',
//     });
// };
const scrollbarRef = ref(null);
const modalMaxHeight = 800;
// EventSource文本流失输出
const eventSource = ref();
const setupEventSource = (sessionId) => {modalObj.value.message = '';eventSource.value = new EventSource(`${BASEURL}/projectDoc/ai/write/stream?sessionId=${sessionId}`); // 创建EventSource对象,参数为接口URLeventSource.value.addEventListener('message', (event) => {console.log('message:', event.data);modalObj.value.state = '2';modalObj.value.messageState = '2';modalObj.value.message = event.data;const messageDom = document.getElementById('message');// 文本框滚动条始终置于元素底部if (messageDom && messageDom.scrollHeight >= modalMaxHeight) {// console.log(messageDom.scrollHeight, scrollbarRef.value, scrollbarRef.value.height);scrollbarRef.value?.setScrollTop(messageDom.scrollHeight, 1000);}});eventSource.value.addEventListener('finish', (event) => {console.log('Finish:', event.data);modalObj.value.messageState = '1';eventSource.value.close(); // 关闭连接});eventSource.value.onerror = function (event) {console.error('EventSource failed.', event);modalObj.value.state = '2';modalObj.value.messageState = '1';modalObj.value.message = '生成失败';eventSource.value.close(); // 在发生错误时关闭连接};
};const againAIId = ref(''); // 重新生成内容时的id
const againAIInput = ref(''); // 重新生成内容时的input
const getMessage = async ({id,input,
}) => {try {// 请求后台生成文案againAIId.value = id;againAIInput.value = input;const inputText = input.length > 4000 ? input.slice(input.length - 4000, input.length) : input;const result = await request('/projectDoc/ai/write/body', {id,input: inputText,title: props.title,}, {method: 'post',});const sessionId = result.sessionId;console.log(sessionId);setupEventSource(sessionId);// 每5s查询一次ai生成结果// queryAiResultCircle(sessionId);} catch (error) {console.log('getMessage error:', error);modalObj.value.message = '生成失败';modalObj.value.state = '2';}
};// 上下文菜单items action
const tinymceAction = (modalTitle, text, aiId) => {if (!text) return FMessage.error('请选择文案');tinymceSelectText.value = text;modalObj.value.title = modalTitle;modalObj.value.showModal = true;getMessage({id: aiId,input: text,});
};
// fontsize获取
const getFontSize = (editor) => {const fontSize = editor.queryCommandValue('FontSize');return parseInt(fontSize.match(/(\S*)px/)[1]);
};const tinymceId = `tinymce${new Date().getTime()}`;
// 富文本框初始化
const init = {selector: `${tinymceId}`, // 富文本编辑器的id,placeholder: props.placeholder,language_url: 'tinymce/langs/zh_CN.js', // 引入语言包文件language: 'zh_CN', // 语言类型menubar: false,skin_url: 'tinymce/skins/ui/oxide', // 皮肤:浅色content_css: 'tinymce/skins/content/default/content.css',plugins: 'formatpainter image lists table indent2em contextmenu paste',toolbar: ['formatpainter | styleselect | fontselect | fontsizeselect | customInsert | fontSizeA+ fontSizeA- | bold italic underline strikethrough forecolor backcolor | numlist bullist | indent2em outdent indent | alignleft aligncenter alignright | lineheight blockquote | undo redo',],toolbar_groups: {customInsert: {text: '插入',tooltip: 'insert',items: 'table image',},},fontsize_formats: '12px 14px 16px 18px 24px 36px 48px 56px 72px',font_formats: '微软雅黑=Microsoft YaHei,Helvetica Neue,PingFang SC,sans-serif;苹果苹方=PingFang SC,Microsoft YaHei,sans-serif;宋体=simsun,serif;仿宋体=FangSong,serif;黑体=SimHei,sans-serif;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;',contextmenu: 'title | textGeneration expandWordCount extractKeyPoints changeLanguage',setup(editor) {myEditor.value = editor;editor.ui.registry.addIcon('file', '<svg width="14" height="14" viewBox="0 0 1024 1024"><path d="M533.419 96.555a21.333 21.333 0 0 1 21.333 21.333v21.333a21.333 21.333 0 0 1-17.493 20.992l-3.84.342-372.907-.043v702.933h702.933V533.333A21.333 21.333 0 0 1 884.78 512h21.333a21.333 21.333 0 0 1 21.333 21.333v342.443c0 26.752-20.309 48.768-46.378 51.413l-5.291.256H148.224a51.67 51.67 0 0 1-51.413-46.378l-.256-5.291V148.224c0-26.752 20.309-48.768 46.378-51.413l5.291-.256h385.195zm263.296 3.84L917.376 221.14a21.333 21.333 0 0 1 0 30.123l-371.627 371.67a21.333 21.333 0 0 1-13.184 6.143l-132.693 12.075a21.333 21.333 0 0 1-23.21-23.168l12.074-132.736a21.333 21.333 0 0 1 6.144-13.141l371.627-371.67a21.333 21.333 0 0 1 30.208 0zm-15.062 75.392L451.072 506.368l-6.059 66.39 66.39-6.06 330.581-330.58-60.33-60.331z"></path></svg>');editor.ui.registry.addIcon('a-', '<svg width="20" height="20" viewBox="0 0 1024 1024" p-id="1183" width="200" height="200"><path d="M631.1 266.9h345.4v41H631.1zM368.5 150.5L57.2 855.2h73.2l101.3-236.8h346.7l98.9 236.8h78.1L444.2 150.5h-75.7zM559 572H251.3l54.9-127.6c35.4-82.2 65.9-156.6 96.4-241.7h4.9c31.7 85.1 61 159.5 97.7 241.7L559 572z" fill="#000" p-id="1184"></path></svg>');editor.ui.registry.addIcon('a+', '<svg width="20" height="20" viewBox="0 0 1024 1024" p-id="902" width="200" height="200"><path d="M631.1 266.9h152.2v41H631.1zM824.3 266.9h152.2v41H824.3zM783.3 307.8h41V460h-41zM783.3 114.6h41v152.2h-41z" fill=" #000" p-id="903"></path><path d="M783.3 266.9h41v41h-41zM368.5 150.5L57.2 855.2h73.2l101.3-236.8h346.7l98.9 236.8h78.1L444.2 150.5h-75.7zM559 572H251.3l54.9-127.6c35.4-82.2 65.9-156.6 96.4-241.7h4.9c31.7 85.1 61 159.5 97.7 241.7L559 572z" fill=" #000" p-id="904"></path></svg>');editor.ui.registry.addButton('fontSizeA+', {icon: 'a+',tooltip: '字号放大',onAction() {const num = getFontSize(editor);if (num === 72) return;editor.execCommand('fontSize', false, `${num + 2}px`);},});editor.ui.registry.addButton('fontSizeA-', {icon: 'a-',tooltip: '字号缩小',onAction() {const num = getFontSize(editor);if (num === 12) return;editor.execCommand('fontSize', false, `${num - 2}px`);},});editor.ui.registry.addMenuItem('title', {text: '请选择以下方式使用AI',});editor.ui.registry.addMenuItem('textGeneration', {text: '文本生成',context: 'tools',icon: 'file',onAction(e) {console.log(e, '文本生成', editor.selection.getContent({ format: 'text' }));const text = editor.selection.getContent({ format: 'text' });tinymceAction('文本生成', text, `${props.aiId}-SC`);},});editor.ui.registry.addMenuItem('expandWordCount', {text: '扩充字数',context: 'tools',icon: 'file',onAction() {console.log('扩充字数');const text = editor.selection.getContent({ format: 'text' });tinymceAction('扩充字数', text, `${props.aiId}-KC`);},});editor.ui.registry.addMenuItem('extractKeyPoints', {text: '提炼要点',context: 'tools',icon: 'file',onAction() {console.log('提炼要点');const text = editor.selection.getContent({ format: 'text' });tinymceAction('提炼要点', text, `${props.aiId}-TL`);},});editor.ui.registry.addMenuItem('changeLanguage', {text: '转换语言风格',context: 'tools',icon: 'file',onAction() {console.log('转换语言风格');const text = editor.selection.getContent({ format: 'text' });tinymceAction('转换语言风格', text, `${props.aiId}-ZH`);},});},indentation: '2em',branding: false,elementpath: false,width: '100%',min_height: 600,paste_preprocess(plugin, args) {// 复制粘贴去掉原有样式console.log(args.content, plugin);args.content = args.content.replace(/(\sface=".*"\scolor)/g, ' color');},file_picker_callback(callback, value, meta) {// 上传需要处理console.log(callback, value, meta);// 文件分类let filetypeAccept = '.pdf, .png';const apiFileType = '1';// 后端接收上传文件的地址let upurl = 'file/upload';// 为不同插件指定文件类型及后端地址switch (meta.filetype) {case 'image':filetypeAccept = '.jpg, .jpeg, .png, .gif';upurl = '/oacgs-bms/commonFile/uploadFile';// apiFileType = '1';break;case 'file':default:}// 模拟出一个input用于添加本地文件const input = document.createElement('input');input.setAttribute('type', 'file');input.setAttribute('accept', filetypeAccept);input.click();input.onchange = function () {const file = this.files[0];console.log(file.name);const xhr = new XMLHttpRequest();xhr.withCredentials = false;xhr.open('POST', upurl);xhr.onload = function () {if (xhr.status !== 200) {FMessage.error(`HTTP Error: ${xhr.status}`);return;}const json = JSON.parse(xhr.responseText);console.log('json', json);if (!json || json.code !== '0') {FMessage.error(json?.msg || '上传失败');return;}console.log('json', json?.result);const recordId = json?.result?.recordId;const fileUrl = `${window.location.origin}/oacgs-bms/commonFile/image/download?recordId=${recordId}`;console.log('fileUrl', fileUrl);if (meta.filetype === 'file') return callback(fileUrl || '', { title: file.name, text: file.name });callback(fileUrl || '', {});};const formData = new FormData();formData.append('file', file, file.name);formData.append('fileType', apiFileType);xhr.send(formData);};},
};const aiToolbarList = [{ label: '替换选择区域', value: 'replace' },{ label: '添加到所选区域之后', value: 'append' },{ label: '将生成内容扩充字数', value: 'continueExpandWordCount' },{ label: '重新生成', value: 'regenerate' },{ label: '放弃文本', value: 'cancel' },
];
const again = ({id, input,
}) => {modalObj.value.state = '1';modalObj.value.message = '';getMessage({ id, input });
};const cancel = () => {modalObj.value.state = '1';modalObj.value.message = '';modalObj.value.showModal = false;if (!eventSource.value) return;eventSource.value.close();
};// 生成文案点击选择items
const handleClick = (type) => {const selectText = myEditor.value.selection.getContent();switch (type) {case 'replace':// 替换选择区域myEditor.value.insertContent(modalObj.value.message);cancel();break;case 'append':// 添加到所选区域之后myEditor.value.selection.setContent(`${selectText}${modalObj.value.message}`);cancel();break;case 'continueExpandWordCount':// 将生成内容扩充字数console.log('将生成内容扩充字数');again({id: `${props.aiId}-KC`,input: modalObj.value.message,});break;case 'regenerate':// 重新生成console.log('重新生成');again({id: againAIId.value,input: againAIInput.value,});break;case 'cancel':// 放弃文本cancel();break;default:break;}
};const handleFocus = (event) => {// console.log('focus in', event)emits('selectEditor', props.aiId);
};const openContextMenu = () => {if (!myEditor.value.selection.getContent().length) {myEditor.value.execCommand('selectAll');}console.log(myEditor.value.selection.getContent());myEditor.value.fire('contextMenu');
};const validateLength = () => myEditor.value.getContent({ format: 'text' }).length < 10001;
// console.log(myEditor.value.getContent({format:'text'}), myEditor.value.getContent({format:'text'}).length)watch(() => props.disabled, async () => {// console.log(props.disabled, myEditor.value)await nextTick();if (myEditor.value) {// console.log(myEditor.value);// 由于tinymce 5.x使用的setMode方式来控制文本框的disable态,查阅源码发现该函数内有异步事件,在连续调用时会出现后面的被前面覆盖的问题,故使用setTimeout解决该问题 (tinymce 5.10.2 Mode.ts line37-setMode)setTimeout(() => myEditor.value.setMode(props.disabled ? 'readonly' : 'design'), 300);}
}, { immediate: true });// eslint-disable-next-line no-undef
defineExpose({openContextMenu, validateLength, textTitle: props.textTitle,
});onUnmounted(() => {if (!eventSource.value) return;eventSource.value.close();
});
</script><style lang="less" >
.ai {.ai-loading {display: flex;align-items: center;.fes-design-icon {margin-right: 6px;}}
}
.message {cursor: pointer;line-height: 2;.fes-design-icon {line-height: 2;margin-left: 6px;}
}
.popover-regular {padding: 0!important;border-radius: 2px !important;overflow: hidden;border: 1px solid #ccc;.list {padding: 4px 0;.title,.item {display: flex;align-items: center;line-height: 32px;font-size: 14px;padding:  0 16px;color: #222f3e;}.title {border-bottom: 1px solid #ccc;padding-left: 20px;margin-bottom: 4px;}.item {cursor: pointer;.fes-design-icon {width: 24px;margin-right: 8px;}&:hover {background: #eee;}}}.fes-popper-arrow {display: none;}
}
.tox .tox-collection--list .tox-collection__item--active {background-color: #eee !important;
}
.tox-collection__item {cursor: pointer;
}
.tox .tox-collection--list .tox-collection__group:first-child {.tox-collection__item--active {background-color: transparent !important;}.tox-collection__item {cursor: default;&:hover {background: transparent;}.tox-collection__item-icon {display: none;}}
}
.ai-modal-wrapper {padding: 16px 0 !important;.fes-modal-header {margin: 16px;}.fes-modal-body {.fes-scrollbar {padding: 0 16px;}}
}</style>

代码中的@PublicDir需要在alias设置

alias: {'@': path.resolve(__dirname, 'src'),'@PublicDir': path.resolve(__dirname, 'public')
},

说明: fesjs是基于最新 Vue3 + webpack5 的前端应用框架

2、调用组件

<template><TEditor v-model:value="editorContent" />
</template>
<script setup>
import {ref} from 'vue';
import TEditor from '@/components/TEditor.vue';
const editorContent = ref('');
</script>

tinymce中文文档地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/708164.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s 集群调度,标签,亲和性和反亲和性,污点和容忍,pod启动状态 排错详解

目录 pod启动创建过程 kubelet持续监听的原因 调度概念 调度约束 调度过程 优点 原理 优先级选项 示例 指定调度节点 标签基本操作 获取标签帮助 添加标签&#xff08;Add Labels&#xff09;&#xff1a; 更新标签&#xff08;Update Labels&#xff09; 删除标…

深度测试:指定DoC ID对ES写入性能的影响

在[[使用python批量写入ES索引数据]]中已经介绍了如何批量写入ES数据。基于该流程实际测试一下指定文档ID对ES性能的影响有多大。 一句话版 指定ID比不指定ID的性能下降了63%&#xff0c;且加剧趋势。 以下是测评验证的细节。 百万数据量 索引默认使用1分片和1副本。 指定…

分布式存储 ZBS 的 RoCE 技术支持与大数据应用场景性能评测

作者&#xff1a;深耕行业的 SmartX 金融团队 闫海涛 在《解决 SAN 交换机“卡脖子”并升级存储架构&#xff1f;一文解析 RoCE 与相关存储方案趋势》文章中&#xff0c;我们分析了如何利用支持 RoCE 技术的分布式存储&#xff0c;同步实现 IT 基础架构的信创转型与架构升级&a…

双流机场到天府机场ADS-B数据导入MATLAB

MATLAB导入数据 导入的数据Excel部分截图&#xff1a; 一些处理 % 导入外部轨迹数据并转成标准形式 clear;clc; %% 导入&预处理 [NUM,TXT,RAW]xlsread(2021年10月31日CTU-TFU); time_cell RAW(3:end,1); %拉取时间数据&#xff08;cell&#xff09; time_char char(t…

武器大师——操作符详解(上)

目录 一、操作符的分类 二、二进制和进制转换 2.1.二进制与十进制的互相转化 2.1.1 二进制转十进制 2.1.2 十进制转二进制 ​编辑 2.2.二进制转8进制和16进制 2.2.1 转8进制 2.2.2 转16进制 三、原码、反码、补码 四、移位操作符 4.1.左移操作符&#xff08;<…

【北京迅为】《iTOP-3588开发板网络环境配置手册》第2章 电脑、开发板直连交换机或路由器

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

云原生架构技术揭秘:探索容器技术的奥秘

云原生的概念和演进都是围绕云计算的核心价值展开的&#xff0c;比如弹性、自动化、韧性&#xff0c;所以云原生所涵盖的技术领域非常丰富。 随着云计算技术的不断发展&#xff0c;云原生架构已经成为了新一代软件开发的重要趋势。本文将为您介绍云原生架构的相关技术&#xf…

二叉搜索树在线OJ题讲解

二叉树创建字符串 我们首先进行题目的解读&#xff1a; 大概意思就是用&#xff08;&#xff09;把每个节点的值给括起来&#xff0c;然后再经过一系列的省略的来得到最后的结果 大家仔细观察题目给出的列子就可以发现&#xff0c;其实这个题目可以大致分为三种情况&#xff1…

Vue 环境安装以及项目创建

环境安装 nodejs 安装 下载地址&#xff1a;https://nodejs.org/dist/v18.16.1/ 根据系统类型选择对应安装包&#xff0c;选择安装路径那个后一直下一步即可安装完成。 配置npm 代理镜像,设置为淘宝的镜像地址&#xff08;后面按照依赖可以加速下载安装包&#xff09; npm c…

★【递归】【链表】Leetcode 21. 合并两个有序链表

★【递归】【链表】Leetcode 21. 合并两个有序链表 解法1 &#xff1a;递归链表 简直是好题啊好题多做做 ---------------&#x1f388;&#x1f388;题目链接&#x1f388;&#x1f388;------------------- 解法1 &#xff1a;递归链表 简直是好题啊好题多做做 >>>…

搭建LNMP环境并配置个人博客系统

LNMP是Linux&#xff08;操作系统&#xff09;、Nginx&#xff08;Web服务器&#xff09;、MySQL&#xff08;数据库&#xff09;和PHP&#xff08;脚本解释器&#xff09;的组合&#xff0c;常用于部署高性能的动态网站&#xff0c;如WordPress等博客平台 一、安装Linux操作系…

Vue 2 的核心模块和历史遗留问题以及vue3新特性

从下图你能看到&#xff0c;Vue 2 是一个响应式驱动的、内置虚拟 DOM、组件 化、用在浏览器开发&#xff0c;并且有一个运行时把这些模块很好地管理起来的框架。 vue 2 能把上面所说的这些模块很好地管理起来&#xff0c;看起来已经足够好了。不过事实真的如 此么&#xff1f;…

《最新出炉》系列初窥篇-Python+Playwright自动化测试-33-处理https 安全问题或者非信任站点-上篇

1.简介 这一篇宏哥主要介绍playwright如何在IE、Chrome和Firefox三个浏览器上处理不信任证书的情况&#xff0c;我们知道&#xff0c;有些网站打开是弹窗&#xff0c;SSL证书不可信任&#xff0c;但是你可以点击高级选项&#xff0c;继续打开不安全的链接。举例来说&#xff0c…

计算机网络-网络互连和互联网(四)

1.TCP协议&#xff1a; 传输控制协议&#xff0c;面向字节流按顺序连接&#xff0c;可靠&#xff0c;全双工&#xff0c;可变滑动窗口&#xff0c;缓冲累积传送。协议号为6。下面是TCP段&#xff08;段头&#xff09;&#xff0c;TCP头&#xff08;传输头&#xff09;&#xf…

【重要公告】BSV区块链协会全新推出“网络访问规则NAR”

​​发表时间&#xff1a;2024年2月15日 BSV区块链协会正式宣布已为BSV区块链推出一套全新的网络访问规则&#xff08;Network Access Rules&#xff0c;以下简称“NAR”&#xff09;。 NAR是一整套规则&#xff0c;用于规范BSV协会与BSV网络节点之间的关系。它基于比特币最初…

【LeetCode】每日一题:使二叉树所有路径值相等的最小代价

该题采用自底向上的思路的话&#xff0c;很容易想到使用贪心的思想&#xff0c;但是如何进行具体操作却有些难度。 这里补充一个重要的结论&#xff1a;二叉树的数组形式中&#xff0c;第i个节点的父节点是i/2&#xff1b;接下来只需要让自底向上让每个路径上的代价保持最低限…

为什么会造成服务器丢包?

随着云服务器市场的发展和网络安全问题&#xff0c;服务器丢包问题成为了一个普遍存在的现象。服务器丢包是指在网络传输过程中&#xff0c;数据包由于各种原因未能到达目标服务器&#xff0c;导致数据传输中断或延迟。那么&#xff0c;为什么会造成服务器丢包呢&#xff1f;下…

2024年2月深度学习的论文推荐

我们这篇文章将推荐2月份发布的10篇深度学习的论文 Beyond A*: Better Planning with Transformers via Search Dynamics Bootstrapping. https://arxiv.org/abs/2402.14083 Searchformer是一个基于Transformer架构的人工智能模型&#xff0c;经过训练可以模拟A星寻路算法&a…

代码随想录算法刷题训练营day27:LeetCode(39)组合总和、LeetCode(40)组合总和 II、LeetCode(131)分割回文串

代码随想录算法刷题训练营day27&#xff1a;LeetCode(39)组合总和、LeetCode(40)组合总和 II、LeetCode(131)分割回文串 LeetCode(39)组合总和 题目 代码 import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List;clas…

【论文笔记】Attention Is All You Need

【论文笔记】Attention Is All You Need 文章目录 【论文笔记】Attention Is All You NeedAbstract1 Introduction2 Background补充知识&#xff1a;软注意力 soft attention 和硬注意力 hard attention&#xff1f;补充知识&#xff1a;加法注意力机制和点乘注意力机制Extende…