react-quill 富文本组件编写和应用

  •  index.tsx文件
import React, { useRef, useState } from 'react';
import { Modal, Button } from 'antd';
import RichEditor from './RichEditor';const AnchorTouchHistory: React.FC = () => {const editorRef = useRef<any>(null);const [isModalVisible, setIsModalVisible] = useState(false);const [isEditModalVisible, setIsEditModalVisible] = useState(false);const [contentHtml, setContentHtml] = useState('<p>heheda</p>' );const openAddModal = () => setIsModalVisible(true);const submitContent = () => {const content = editorRef.current?.getRichContent();console.log(content);setIsModalVisible(false);editorRef.current?.resetContent();};const openEditModal = () => setIsEditModalVisible(true);const submitEditContent = () => {const content = editorRef.current?.getRichContent();console.log(content);setIsEditModalVisible(false);editorRef.current?.resetContent();};return (<div><Button onClick={openAddModal}>打开添加对话框</Button><Modalvisible={isModalVisible}onCancel={() => setIsModalVisible(false)}onOk={submitContent}><RichEditor ref={editorRef} /></Modal><Button onClick={openEditModal}>打开编辑对话框</Button><Modalvisible={isEditModalVisible}onCancel={() => setIsEditModalVisible(false)}onOk={submitEditContent}><RichEditor ref={editorRef} initialContent={contentHtml} /></Modal></div>);
};export default AnchorTouchHistory;
  • RichEditor.tsx
import React, { useState, useEffect, useRef, useMemo, useImperativeHandle, forwardRef } from 'react';
import ReactQuill, { Quill } from 'react-quill';
import 'react-quill/dist/quill.core.css';
import 'react-quill/dist/quill.snow.css';
import 'react-quill/dist/quill.bubble.css';import { Modal, Input, Upload, Button, Tabs, Alert } from 'antd';
import { UploadOutlined } from '@ant-design/icons';
import COS from 'cos-js-sdk-v5';
import ImageResize from 'quill-image-resize-module-react';
import { getTxyCosConf } from '@/services/anchor-touch/history';Quill.register('modules/imageResize', ImageResize);import '@/styles/quillEditor.css';const RichEditor = forwardRef(({ initialContent = '' }, ref) => {const [value, setValue] = useState(initialContent);const [isCosReady, setIsCosReady] = useState(false);const quillRef = useRef<any>(null);const [isModalVisible, setIsModalVisible] = useState(false);const [isLinkModalVisible, setIsLinkModalVisible] = useState(false);const [bucket, setBucket] = useState('');const [region, setRegion] = useState('');const [cos, setCos] = useState<COS | null>(null);const [width, setWidth] = useState('');const [height, setHeight] = useState('');const [previewUrl, setPreviewUrl] = useState<string | null>(null);const [currentFile, setCurrentFile] = useState<File | null>(null);const [originalWidth, setOriginalWidth] = useState<number | null>(null);const [originalHeight, setOriginalHeight] = useState<number | null>(null);const [imageUrl, setImageUrl] = useState('');const [uploadMode, setUploadMode] = useState<'local' | 'url'>('local');const [linkUrl, setLinkUrl] = useState('');const [linkText, setLinkText] = useState('');const [urlError, setUrlError] = useState('');useImperativeHandle(ref, () => ({getRichContent: () => value,resetContent: () => setValue(initialContent)}));useEffect(() => {const fetchCosConfig = async () => {try {const response = await getTxyCosConf();setBucket(response.data.bucket);setRegion(response.data.region);const cosInstance = new COS({SecretId: response.data.secretid,SecretKey: response.data.secretkey,});setCos(cosInstance);setIsCosReady(true);} catch (error) {console.error('获取 COS 配置失败:', error);}};fetchCosConfig();}, []);const showImageUploadModal = () => {setIsModalVisible(true);};const showLinkModal = () => {setIsLinkModalVisible(true);};const handleLinkOk = () => {if (!linkUrl.startsWith('http://') && !linkUrl.startsWith('https://')) {setUrlError('链接地址格式不正确,请输入有效的链接地址。');return;}const editor = quillRef.current?.getEditor();const range = editor?.getSelection()?.index || 0;editor?.insertText(range, linkText, 'link', linkUrl);editor?.setSelection(range + linkText.length);handleLinkCancel();};const handleLinkCancel = () => {setIsLinkModalVisible(false);setLinkUrl('');setLinkText('');setUrlError('');};const handleOk = () => {if (uploadMode === 'local') {if (!currentFile || !cos) {handleCancel();return;}const uniqueFileName = `${Date.now()}_${currentFile.name}`;cos.uploadFile({Bucket: bucket,Region: region,Key: uniqueFileName,Body: currentFile,SliceSize: 1024 * 1024,},(err, data) => {if (err) {console.error('上传失败:', err);} else {const imageUrl = `https://${data.Location}`;insertImageToEditor(imageUrl);}});} else {insertImageToEditor(imageUrl);}};const insertImageToEditor = (imageUrl: string) => {const editor = quillRef.current?.getEditor();const range = editor?.getSelection()?.index || 0;editor?.insertEmbed(range, 'image', imageUrl);editor?.formatText(range, 1, {width: width ? width : undefined,height: height ? height : undefined,});editor?.setSelection(range + 1);handleCancel();console.log('图片的链接为: ', imageUrl);};const handleCancel = () => {setIsModalVisible(false);setPreviewUrl(null);setCurrentFile(null);setWidth('');setHeight('');setImageUrl('');};const beforeUpload = (file: File) => {if (!file.type.startsWith('image/')) {console.error('不是有效的图像文件');return false;}const reader = new FileReader();reader.onload = (e) => {const preview = e.target?.result as string;setPreviewUrl(preview);setCurrentFile(file);const img = new Image();img.onload = () => {console.log('Image loaded:', img.naturalWidth, img.naturalHeight);setOriginalWidth(img.naturalWidth);setOriginalHeight(img.naturalHeight);setWidth(img.naturalWidth.toString());setHeight(img.naturalHeight.toString());};img.onerror = (error) => {console.error('图像加载失败:', error);};img.src = preview;};reader.onerror = (error) => {console.error('文件读取失败:', error);};reader.readAsDataURL(file);return false;};const handleWidthBlur = () => {const widthValue = parseFloat(width);if (isNaN(widthValue)) {console.error('Invalid width: ', width);return;}if (originalWidth && originalHeight && widthValue > 0) {const calculatedHeight = (widthValue / originalWidth) * originalHeight;setHeight(calculatedHeight.toFixed(0).toString());}};const handleHeightBlur = () => {const heightValue = parseFloat(height);if (originalWidth && originalHeight && heightValue > 0) {const calculatedWidth = (heightValue / originalHeight) * originalWidth;setWidth(calculatedWidth.toFixed(0).toString());}};const handleLinkUrlChange = (e: React.ChangeEvent<HTMLInputElement>) => {const url = e.target.value;setLinkUrl(url);if (url.startsWith('http://') || url.startsWith('https://')) {setUrlError('');} else if (url) {setUrlError('链接地址格式不正确,请输入有效的链接地址。');}};const sizes = [false, '14px', '16px', '18px', '20px', '22px', '26px', '28px', '30px'];const Size = Quill.import('formats/size');Size.whitelist = sizes;const fonts = ['SimSun', 'SimHei', 'Microsoft-YaHei', 'KaiTi', 'FangSong', 'Arial', 'Times-New-Roman', 'sans-serif'];const Font = Quill.import('formats/font');Font.whitelist = fonts;Quill.register(Font, true);const modules = useMemo(() => ({toolbar: {container: [['bold', 'italic', 'underline'],[{ size: sizes }],[{ header: [1, 2, 3, 4, 5, false] }],[{ color: [] }, { background: [] }],['link', 'image', 'clean']],handlers: {image: showImageUploadModal,link: showLinkModal,},},imageResize: {modules: ['DisplaySize'],handleStyles: {backgroundColor: 'transparent',border: 'none',},resizeWidth: false,},}), [cos]);const formats = ['font','header','size','bold','italic','underline','strike','list','bullet','link','image','width','height','color', // include color format'background', // include background color format];if (!isCosReady) {return <div>加载中...</div>;}return (<><ReactQuillref={quillRef}value={value}onChange={setValue}modules={modules}formats={formats}/>{/* Modes for Image and Link Modals */}<Modaltitle="插入图片"visible={isModalVisible}onCancel={handleCancel}footer={null}><Tabs defaultActiveKey="local" onChange={setUploadMode}><Tabs.TabPane tab="本地图片" key="local"><Upload beforeUpload={beforeUpload} showUploadList={false}><Button icon={<UploadOutlined />}>选择图片</Button></Upload>{previewUrl && (<div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center', marginTop: 10, width: 150, height: 150, overflow: 'hidden', border: '1px solid #e8e8e8' }}><img src={previewUrl} alt="预览" style={{ width: 150, maxHeight: '100%' }} /></div>)}</Tabs.TabPane><Tabs.TabPane tab="链接图片" key="url"><Input placeholder="图片链接" value={imageUrl} onChange={(e) => setImageUrl(e.target.value)} onBlur={() => {const img = new Image();img.onload = () => {setOriginalWidth(img.naturalWidth);setOriginalHeight(img.naturalHeight);setWidth(img.naturalWidth.toString());setHeight(img.naturalHeight.toString());setPreviewUrl(imageUrl);};img.onerror = (error) => {console.error('图像加载失败:', error);setPreviewUrl(null);};img.src = imageUrl;}} />{previewUrl && (<div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center', marginTop: 10, width: 150, height: 150, overflow: 'hidden', border: '1px solid #e8e8e8' }}><img src={previewUrl} alt="预览" style={{ width: 150, maxHeight: '100%' }} /></div>)}</Tabs.TabPane></Tabs><Input placeholder="设置宽度" value={width} onChange={(e) => setWidth(e.target.value)} onBlur={handleWidthBlur} style={{ marginTop: 10 }} /><Input placeholder="设置高度" value={height} onChange={(e) => setHeight(e.target.value)} onBlur={handleHeightBlur} style={{ marginTop: 10 }} /><div style={{ marginTop: 10, textAlign: 'right' }}><Button type="primary" onClick={handleOk} disabled={uploadMode === 'local' ? !currentFile : !imageUrl}>确认</Button><Button onClick={handleCancel} style={{ marginLeft: 10 }}>取消</Button></div></Modal><Modal title="添加链接" visible={isLinkModalVisible} onCancel={handleLinkCancel} onOk={handleLinkOk}>{urlError && <Alert message={urlError} type="error" />}<Input placeholder="链接地址" value={linkUrl} onChange={handleLinkUrlChange} style={{ marginBottom: 10 }} /><Input placeholder="备注" value={linkText} onChange={(e) => setLinkText(e.target.value)} /></Modal></>);
});export default RichEditor;
  • quillEditor.css
/* 字体风格 */
/* 处理下拉字体选择器中选项的文本溢出并显示省略号 */
.ql-snow .ql-picker.ql-font .ql-picker-label::before {width: 88px; /* 设置下拉选项宽度,可以根据需要调整 */white-space: nowrap; /* 不换行显示 */overflow: hidden; /* 隐藏溢出部分 */text-overflow: ellipsis; /* 使用省略号显示溢出文本 */
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="SimSun"]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="SimSun"]::before {content: "宋体";font-family: "SimSun";
}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="SimHei"]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="SimHei"]::before {content: "黑体";font-family: "SimHei";
}.ql-snow
.ql-picker.ql-font
.ql-picker-label[data-value="Microsoft-YaHei"]::before,
.ql-snow
.ql-picker.ql-font
.ql-picker-item[data-value="Microsoft-YaHei"]::before {content: "微软雅黑";font-family: "Microsoft YaHei";
}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="KaiTi"]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="KaiTi"]::before {content: "楷体";font-family: "KaiTi";
}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="FangSong"]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="FangSong"]::before {content: "仿宋";font-family: "FangSong";
}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="Arial"]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="Arial"]::before {content: "Arial";font-family: "Arial";
}.ql-snow
.ql-picker.ql-font
.ql-picker-label[data-value="Times-New-Roman"]::before,
.ql-snow
.ql-picker.ql-font
.ql-picker-item[data-value="Times-New-Roman"]::before {content: "Times New Roman";font-family: "Times New Roman";
}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="sans-serif"]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="sans-serif"]::before {content: "sans-serif";font-family: "sans-serif";
}.ql-font-SimSun { font-family: "SimSun"; }
.ql-font-SimHei { font-family: "SimHei"; }
.ql-font-Microsoft-YaHei { font-family: "Microsoft YaHei"; }
.ql-font-KaiTi { font-family: "KaiTi"; }
.ql-font-FangSong { font-family: "FangSong"; }
.ql-font-Arial { font-family: "Arial"; }
.ql-font-Times-New-Roman { font-family: "Times New Roman"; }
.ql-font-sans-serif { font-family: "sans-serif"; }/* 字体大小 */
.ql-snow .ql-picker.ql-size .ql-picker-label::before { content: "字体大小"; }
.ql-snow .ql-picker.ql-size .ql-picker-item::before { content: "常规"; }
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="14px"]::before{content: "14px";font-size: 14px;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="16px"]::before{content: "16px";font-size: 14px;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="18px"]::before{content: "18px";font-size: 14px;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="20px"]::before{content: "20px";font-size: 14px;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="22px"]::before{content: "22px";font-size: 14px;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="26px"]::before{content: "26px";font-size: 14px;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="30px"]::before {content: "30px";font-size: 14px;
}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="14px"]::before {content: "14px";font-size: 14px;
}.ql-size-14px { font-size: 14px; }/* .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="16px"]::before, */
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="16px"]::before {content: "16px";font-size: 16px;
}.ql-size-16px { font-size: 16px; }/* .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="18px"]::before, */
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="18px"]::before {content: "18px";font-size: 18px;
}.ql-size-18px { font-size: 18px; }/* .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="20px"]::before, */
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="20px"]::before {content: "20px";font-size: 20px;
}.ql-size-20px { font-size: 20px; }/* .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="22px"]::before, */
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="22px"]::before {content: "22px";font-size: 22px;
}.ql-size-22px { font-size: 22px; }/* .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="26px"]::before, */
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="26px"]::before {content: "26px";font-size: 26px;
}.ql-size-26px { font-size: 26px; }/* .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="28px"]::before, */
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="28px"]::before {content: "28px";font-size: 28px;
}.ql-size-28px { font-size: 28px; }/* .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="30px"]::before, */
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="30px"]::before {content: "30px";font-size: 30px;
}.ql-size-30px { font-size: 30px; }/* 段落大小 */
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before {content: "标题1";
}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before {content: "标题2";
}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before {content: "标题3";
}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before {content: "标题4";
}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before {content: "标题5";
}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before {content: "标题6";
}.ql-snow .ql-picker.ql-header .ql-picker-item::before {content: "常规";
}/* .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before, */
.ql-snow .ql-picker.ql-header .ql-picker-label::before {content: "标题大小";
}/* 默认设置 */
.ql-snow .ql-editor { font-size: 14px; }
/* 查看样式 */
.view-editor .ql-toolbar { display: none; }
.view-editor .ql-container.ql-snow { border: 0; }
.view-editor .ql-container.ql-snow .ql-editor { padding: 0; }
/* 编辑样式 */
.edit-editor .ql-toolbar { display: block; }
.edit-editor .ql-container.ql-snow {border: 1px solid #ccc;min-height: inherit;
}
  • golang后端接口,获取
    TxyCosConf:SecretId: 'xxxxx'SecretKey: 'xxxxx'Bucket: 'xxxxx'Region: 'xxxx'
import {request} from "@@/plugin-request/request";
export function getTxyCosConf() {return request('/api/v1/xxxx/getTxyCosConf', {method: 'get',}).then(response => {return response;}).catch(error => {console.error('Error get data:', error);throw error;});
}

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

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

相关文章

TDv2:一种用于离线数学表达式识别的新型树形结构解码器

TDv2:一种用于离线数学表达式识别的新型树形结构解码器 本文提出了一种针对手写数学表达式识别(HMER)任务的新型树形解码器(TDv2) ,旨在充分利用数学表达式的树结构标签进行更有效的建模和预测。相较于传统的LaTeX字符串解码器,该模型通过采用一个节点分类模块和一个分…

银行信贷管理系统flask

完整源码项目包获取→点击文章末尾名片&#xff01;

WordPress静态缓存插件WP Super Cache与 WP Fastest Cache

引言 WordPress是一款开源的内容管理系统&#xff08;CMS&#xff09;&#xff0c;最初作为博客平台开发&#xff0c;现已发展成为一个功能强大的建站工具&#xff0c;支持创建各种类型的网站&#xff0c;包括企业网站、在线商店、个人博客等。它具有用户友好的界面、丰富的插…

onLoad 生命周期函数是否执行取决于跳转的方式和小程序的页面栈管理机制

文章目录 1. 页面跳转方式2. 你的场景分析3. 页面生命周期4. 总结5. 建议 在微信小程序中&#xff0c;页面跳转时&#xff0c; onLoad 生命周期函数是否执行取决于跳转的方式和小程序的页面栈管理机制。以下是详细说明&#xff1a; 1. 页面跳转方式 微信小程序提供了多种页面…

【深度学习】通俗理解偏差(Bias)与方差(Variance)

在统计学习中&#xff0c;我们通常使用方差与偏差来衡量一个模型 1. 方差与偏差的概念 偏差(Bais)&#xff1a; 预测值和真实值之间的误差 方差(Variance)&#xff1a; 预测值之间的离散程度 低偏差低方差、高偏差低方差&#xff1a; 图中每个点表示同一个模型每次采样出不同…

生态水文研究中的机器学习与数学建模方法选择

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

【LeetCode】力扣刷题热题100道(21-25题)附源码 接雨水 合并区间 字母异位词 滑动窗口 覆盖子串(C++)

目录 1.接雨水 2.合井区间 3.找到字符串中所有字母异位词 4.滑动窗口最大值 5.最小覆盖子串 1.接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 代码如下所示&#xff1a; class Solution {…

慧集通(DataLinkX)iPaaS集成平台-智能体(Agent)API

功能简介&#xff1a; 该功能下主要是用来管理集成平台对外开放接口得管控以及调用日志信息得查看操作&#xff0c;并支持日志得重放等操作&#xff1b;注&#xff1a;所有触发类单据得日志也可以在此查看(如使用数据触发组件自动触发流程得日志信息) 1.第三方调用接口类日志查…

HTB:Bank[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 提取出靶机TCP开放端口 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用curl对域名进行访问…

创建基本的 Electron 应用项目的详细步骤

创建一个基本的 Electron 应用项目的详细步骤。我们将从安装 Node.js 开始&#xff0c;然后创建项目文件夹并初始化 Electron 项目。 1. 安装 Node.js 首先&#xff0c;确保你已经安装了 Node.js 和 npm。你可以在终端中运行以下命令来检查是否已经安装&#xff1a; node -v…

TDengine + MQTT :车联网时序数据库如何高效接入

现代新能源汽车&#xff0c;作为一种内部系统极为复杂的交通工具&#xff0c;配备了大量传感器、导航设备、应用软件&#xff0c;这些传感器产生的数据都需要上报到车联网平台当中。对于这些车辆的状态数据&#xff08;如车速、发动机转速等&#xff09;、位置数据&#xff08;…

2. Scala 高阶语法之集合与元组

背景 上一章简单介绍了scala是什么&#xff0c;以及scala的基础用法&#xff0c;本文介绍scala的高阶语法&#xff0c;希望看完本章之后&#xff0c;读者能体会到scala和java的明显区别&#xff0c;以及scala的强大之处。 1. 数组 Scala中提供了一种数据结构-数组&#xff0…

初学STM32 --- USMART

目录 USMART简介 USMART主要特点&#xff1a; USMART原理 USMART组成&#xff1a; USMART 的实现流程简单概括 USMART扫描函数&#xff1a; USMART系统命令 USMART移植 USMART简介 USMART是一个串口调试组件&#xff0c;可以大大提高代码调试效率&#xff01; USMART主…

SQL编程语言

第一章 1. 数据库是长期储存在计算机内&#xff0c;由专门的数据管理软件(数据库管理系统)&#xff0c;进行统一组织和管理控制的大量数据的集合。 2.数据库的基本特点不包括可以快速检索。 3. 数据管理技术的发展经历了&#xff1a;人工管理阶段、文件系统阶段、数据库系统阶…

机器学习周报-ModernTCN文献阅读

文章目录 摘要Abstract 0 提升有效感受野&#xff08;ERF&#xff09;1 相关知识1.1 标准卷积1.2 深度分离卷积&#xff08;Depthwise Convolution&#xff0c;DWConv&#xff09;1.3 逐点卷积&#xff08;Pointwise Convolution&#xff0c;PWConv&#xff09;1.4 组卷积(Grou…

《OpenCV计算机视觉实战项目》——银行卡号识别

文章目录 项目任务及要求项目实现思路项目实现及代码导入模块设置参数对模版图像中数字的定位处理银行卡的图像处理读取输入图像&#xff0c;预处理找到数字边框使用模版匹配&#xff0c;计算匹配得分 画出并打印结果 项目任务及要求 任务书&#xff1a; 要为某家银行设计一套…

【LeetCode: 560. 和为 K 的子数组 + 前缀和 + 哈希表】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Tableau数据可视化与仪表盘搭建-可视化原则及BI仪表盘搭建

目录 可视化原则 BI仪表盘搭建 仪表盘搭建原则 明确仪表盘主题 仪表盘主题拆解 开发设计工作表 经营情况总览&#xff1a;突出显示的文字 经营数据详情&#xff1a;表格 每日营收数据&#xff1a;多轴折线图 每日流量数据&#xff1a;双轴组合图 新老客占比&#xf…

vue2日历组件

这个代码可以直接运行&#xff0c;未防止有组件库没安装&#xff0c;将组件库的代码&#xff0c;转成文字了 vue页面 <template><div class"about"><div style"height: 450px; width: 400px"><div style"height: 100%; overflo…

交响曲-24-3-单细胞CNV分析及聚类

CNV概述 小于1kb是常见的插入、移位、缺失等的变异 人体内包含<10% 的正常CNV&#xff0c;我们的染色体数是两倍体&#xff0c;正常情况下&#xff0c;只有一条染色体表达&#xff0c;另一条沉默&#xff0c;当表达的那条染色体发生CNV之后&#xff0c;表达数量就会成倍增加…