当前位置: 首页 > news >正文

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;});
}

相关文章:

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, setIsModalVis…...

LabVIEW轴承性能测试系统

本文介绍了基于LabVIEW的高效轴承性能测试系统的设计与开发。系统通过双端驱动技术实现高精度同步控制&#xff0c;针对轴承性能进行全面的测试与分析&#xff0c;以提高轴承的可靠性和寿命。 项目背景 随着工业自动化程度的提高&#xff0c;对轴承的性能要求越来越高。传统的…...

【《游戏编程模式》实战04】状态模式实现敌人AI

目录 1、状态模式 2、使用工具 3、状态模式适用范围 4、实现内容 5、代码及思路 Enemy.cs EnemyState.cs 6、unity里的设置 7、运行效果展示 1、状态模式 “允许一个对象在其内部状态改变时改变自身的行为。对象看起来好像是在修改自身类。” 就是一个对象能随着自己…...

借助免费GIS工具箱轻松实现las点云格式到3dtiles格式的转换

在当今数字化浪潮下&#xff0c;地理信息系统&#xff08;GIS&#xff09;技术日新月异&#xff0c;广泛渗透到城市规划、地质勘探、文化遗产保护等诸多领域。而 GISBox 作为一款功能强大且易用的 GIS 工具箱&#xff0c;以轻量级、免费使用、操作便捷等诸多优势&#xff0c;为…...

科研绘图系列:R语言科研绘图之标记热图(heatmap)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理画图系统信息参考介绍 科研绘图系列:R语言科研绘图之标记热图(heatmap) 加载R包 library(tidyverse) library(ggplot2) library(reshape)…...

【轻松学C:编程小白的大冒险】--- C语言简介 02

在编程的艺术世界里&#xff0c;代码和灵感需要寻找到最佳的交融点&#xff0c;才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里&#xff0c;我们将共同追寻这种完美结合&#xff0c;为未来的世界留下属于我们的独特印记。 【轻松学C&#xff1a;编程小白的大冒险】…...

《HeadFirst设计模式》笔记(上)

设计模式的目录&#xff1a; 1 设计模式介绍 要不断去学习如何利用其它开发人员的智慧与经验。学习前人的正统思想。 我们认为《Head First》的读者是一位学习者。 一些Head First的学习原则&#xff1a; 使其可视化将文字放在相关图形内部或附近&#xff0c;而不是放在底部…...

数据结构:ArrayList与顺序表

目录 &#x1f4d6;一、什么是List &#x1f4d6;二、线性表 &#x1f4d6;三、顺序表 &#x1f42c;1、display()方法 &#x1f42c;2、add(int data)方法 &#x1f42c;3、add(int pos, int data)方法 &#x1f42c;4、contains(int toFind)方法 &#x1f42c;5、inde…...

SpringBoot之核心配置

学习目标&#xff1a; 1.熟悉Spring Boot全局配置文件的使用 2.掌握Spring Boot配置文件属性值注入 3.熟悉Spring Boot自定义配置 4.掌握Profile多环境配置 5.了解随机值设置以及参数间引用 1.全局配置文件 Spring Boot使用 application.properties 或者application.yaml 的文…...

EasyExcel上传校验文件错误信息放到文件里以Base64 返回给前端

产品需求&#xff1a; 前端上传个csv 或 excel 文件&#xff0c;文件共4列&#xff0c;验证文件大小&#xff0c;类型&#xff0c;文件名长度&#xff0c;文件内容&#xff0c;如果某行某个单元格数据验证不通过&#xff0c;就把错误信息放到这行第五列&#xff0c;然后把带有…...

单片机软件定时器V4.0

单片机软件定时器V4.0 用于单片机定时执行任务等&#xff0c;比如LED GPIO等定时控制&#xff0c;内置前后台工作模式 头文件有使用例子 #ifndef __SORFTIME_APP_H #define __SORFTIME_APP_H#ifdef __cplusplus extern "C" { #endif#include <stdint.h>// #…...

超完整Docker学习记录,Docker常用命令详解

前言 关于国内拉取不到docker镜像的问题&#xff0c;可以利用Github Action将需要的镜像转存到阿里云私有仓库&#xff0c;然后再通过阿里云私有仓库去拉取就可以了。 参考项目地址&#xff1a;使用Github Action将国外的Docker镜像转存到阿里云私有仓库 一、Docker简介 Do…...

C++ 入门第26天:文件与流操作基础

往期回顾&#xff1a; C 入门第23天&#xff1a;Lambda 表达式与标准库算法入门-CSDN博客 C 入门第24天&#xff1a;C11 多线程基础-CSDN博客 C 入门第25天&#xff1a;线程池&#xff08;Thread Pool&#xff09;基础-CSDN博客 C 入门第26天&#xff1a;文件与流操作基础 前言…...

使用python将多个Excel表合并成一个表

import pandas as pd# 定义要合并的Excel文件路径和名称 file_paths [file1.xlsx, file2.xlsx, file3.xlsx, file4.xlsx, file5.xlsx]# 创建一个空的DataFrame来存储合并后的数据 merged_data pd.DataFrame()# 循环遍历每个Excel文件&#xff0c;并读取其中的数据 for file_p…...

halcon三维点云数据处理(七)find_shape_model_3d_recompute_score

目录 一、find_shape_model_3d_recompute_score例程代码二、set_object_model_3d_attrib_mod函数三、prepare_object_model_3d 函数四、create_cube_shape_model_3d函数五、获得CamPose六、project_cube_image函数七、find_shape_model_3d函数八、project_shape_model_3d函数 一…...

vue js实现时钟以及刻度效果

2025.01.08今天我学习如何用js实现时钟样式&#xff0c;效果如下&#xff1a; 一、html代码如下&#xff1a; <template><!--圆圈--><div class"notice_border"><div class"notice_position notice_name_class" v-for"item in …...

unity学习15:预制体prefab

目录 1 创建多个gameobject 2 创建prefab 2.1 创建prefab &#xff08;类&#xff09; 2.2 prefab 是一个文件 2.3 prefab可以导出 3 创建prefab variant &#xff08;子类&#xff09; 3.1 除了创建多个独立的prefab&#xff0c; 还可以创建 prefab variant 3.2 他…...

基于Thinkphp6+uniapp的陪玩陪聊软件开发方案分析

使用uni-app框架进行前端开发。uni-app是一个使用Vue.js开发所有前端应用的框架&#xff0c;支持一次编写&#xff0c;多端发布&#xff0c;包括APP、小程序、H5等。 使用Thinkphp6框架进行后端开发。Thinkphp6是一个轻量级、高性能、面向对象的PHP开发框架&#xff0c;具有易…...

MySQL - 子查询和相关子查询详解

在SQL中&#xff0c;子查询&#xff08;Subquery&#xff09;和相关子查询&#xff08;Correlated Subquery&#xff09;是非常强大且灵活的工具&#xff0c;可以用于执行复杂的数据检索和操作。它们允许我们在一个查询中嵌套另一个查询&#xff0c;从而实现更复杂的逻辑和条件…...

Android 系统签名 keytool-importkeypair

要在 Android 项目中使用系统签名并将 APK 打包时与项目一起打包&#xff0c;可以按照以下步骤操作&#xff1a; 步骤 1&#xff1a;准备系统签名文件 从 Android 系统源码中获取系统签名文件&#xff0c;通常位于 build/target/product/security 目录下&#xff0c;包括 pla…...

【深度学习-Day 24】过拟合与欠拟合:深入解析模型泛化能力的核心挑战

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...

Java应用10(客户端与服务器通信)

Java客户端与服务器通信 Java提供了多种方式来实现客户端与服务器之间的通信&#xff0c;下面我将介绍几种常见的方法&#xff1a; 1. 基于Socket的基本通信 服务器端代码 import java.io.*; import java.net.*;public class SimpleServer {public static void main(String…...

[BIOS]VSCode zx-6000 编译问题

前提&#xff1a;Python 3.6.6及以上版本安装成功&#xff0c;Python 3.6.6路径加到了环境变量# DEVITS工具包准备好 问题&#xff1a;添加环境变量 1&#xff1a;出现环境变量错误&#xff0c;“py -3” is not installed or added to environment variables #先在C:\Windows里…...

智慧零售管理中的客流统计与属性分析

智慧零售管理中的视觉分析技术应用 一、背景与需求 随着智慧零售的快速发展&#xff0c;传统零售门店面临管理效率低、安全风险高、客户体验差等问题。通过视觉分析技术&#xff0c;智慧零售管理系统可实现对门店内人员行为的实时监控与数据分析&#xff0c;从而提升运营效率…...

手机上网可以固定ip地址吗?详细解析

在移动互联网时代&#xff0c;手机已成为人们日常上网的主要设备之一。无论是工作、学习还是娱乐&#xff0c;稳定的网络连接都至关重要。许多用户对IP地址的概念有所了解&#xff0c;尤其是固定IP地址的需求。那么&#xff0c;手机上网能否固定IP地址&#xff1f;又该如何实现…...

OkHttp 3.0源码解析:从设计理念到核心实现

本文通过深入分析OkHttp 3.0源码&#xff0c;揭示其高效HTTP客户端的实现奥秘&#xff0c;包含核心设计理念、关键组件解析、完整工作流程及实用技巧。 一、引言&#xff1a;为什么选择OkHttp&#xff1f; 在Android和Java生态中&#xff0c;OkHttp已成为HTTP客户端的标准选择…...

策略模式实战:Spring中动态选择商品处理策略的实现

概念 可以在运行时期动态的选择需要的具体策略类&#xff0c;处理具体的问题 组成元素 策略接口 public interface GoodsStrategy {void handleGoods(); } 具体策略类 Service(Constants.BEAN_GOODS) public class BeanGoodsStrategy implements GoodsStrategy {Override…...

C语言的全称:(25/6/6)

C语言&#xff0c;全称为"C Programming Language"&#xff08;C程序设计语言&#xff09;&#xff0c;是一种广泛使用的计算机编程语言。它是由Dennis Ritchie于1972年在贝尔实验室设计的&#xff0c;继承了B语言的许多思想&#xff0c;并加入了数据类型的概念及其他…...

Thinkphp6软删除

方法一 从控制器层直接操作 删除 此操作不会直接删除数据 而是在delete_time字段更新删除时间 ->useSoftDelete(delete_time,get_datetime())->delete() 查询 这里的数据库字段需要设置为默认NULL 查询的时候仅查询未更新删除时间的数据 ->whereNull("dele…...

单片机0-10V电压输出电路分享

一、原理图 二、芯片介绍 GP8101是一个PWM信号转模拟信号转换器&#xff0c;相当于一个PWM信号输入&#xff0c;模拟信号输出的DAC。此 芯片可以将占空比为0%到100%的PWM信号线性转换成0-5V或者0-10V的模拟电压&#xff0c;并且输出电压 精度小于1%。GP8101M可以处理高频调制的…...