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

AI学习记录 -使用react开发一个网页,对接chatgpt接口,附带一些英语的学习prompt

实现了如下功能(使用react实现,原创)

实现功能:
1、对接gpt35模型问答,并实现了流式传输(在java端)
2、在实际使用中,我们的问答历史会经常分享给他人,所以下图的 copy all 按钮,可以copy成一个json然后通过社交软件发送给别人,别人就可以轻松应用你的问答历史。
3、选择文件,在我们预想当中,我们可能会经常遇到向文档提问(当时还不知道embedding的知识哈哈哈),通过拆分文档,一段段跟gpt提问,当前段落是否和用户内容相关,相关就回答段落问题(段落拆分通过java实现)
在这里插入图片描述
4、我们需要经常保存我们的聊天记录,特别是在调试我们的prompt的时候,所以加了一个缓存功能,可以随时提取缓存记录来提问。
在这里插入图片描述
5、利用这个分享的时候,设计了很多便利我去学习英语的prompt,避免老是手打提示词

role.js
export default {"专业的英语翻译家": (text = "示例") => {return "现在你充当我专业的翻译家。当我输入中文,你就翻译成英文。当我输入英文,你就翻译成中文。请翻译:" + text},"文章截断翻译": (text = "示例") => {return "因为我是中国的软件开发工程师,我要面试美国的软件开发岗位,所以我要学习英语,我要你充当我的翻译家," +"所以我给一些中文的软件知识给你帮我翻译,但是你不能直译,因为中文说出来的知识,英语的表达有不一样,所" +"以请你理解我的中文知识,按照自己的理解用英语表达出来,所以我给你一段文字,首先你要将文章拆分成一句一句,理解每" +"一句的意思,然后用英语将你理解的意思输出。输出格式为一句中文,输出一个回车符,下一行输出你的英文理解。并且每一句末尾都" +"给生僻词单独翻译。文章内容为:“" + text + "”"},"给出5个英语句子对应的词汇": (text = "示例") => {return "我给你一个英文单词,请你用这个英文单词造出5个英文句子,句子要求是计算机互联网相关知识" +"(包括但不限于前端专业细节知识,react专业细节知识,vue专业细节知识,js专业细节知识,管理系统的功能专业细节知识," +"http网络相关专业细节知识),并附带中文翻译。最后还要给出他的衍生词汇," +"给出他的发音以及词汇类型。单词为:" + text},"给你一个中文词汇,你给我说出英语一般用什么句式去表达": (text = "示例") => {return "我给你一个中文词汇,你给我说出英语一般用什么句式去表达。" +"例如:中文意思:确保一些东西是有效的,英语一般表达为:ensure that somethings is valid。" +"这个(ensure that ... is valid)就是英语的常规表达句式。" +"例如:允许轻松自定义表单验证,,英语一般表达为:ensure that somethings is valid。" +"这个(allows for ... 。" +"中文词汇为:" + text},"面试中怎么表达这个中文意思": (text = "示例") => {return "在美国的it开发工程师英语面试当中,怎么表达:" + text + ", 请用三种或者三种以上不同的句式表达"},"在英语中有多少英文表达这个中文意思": (text = "示例") => {return "在英语中有多少英文表达这个中文意思,请列举出来,中文为:" + text},"假设你是一个从小就在美国长大的人": (text = "示例") => {return "假设你是一个从小就在美国长大的人,你已经30岁,在互联网公司工作8年,请你使用简洁的口语帮我将中文翻译成英文,重点是简洁,简洁,你自己听得懂就好。中文为:" + text}
}
index.js

import React, { useState, useCallback, useRef } from 'react';
import './index.css';
import { useEffect } from 'react';
import axios from 'axios';
import { PrismLight as SyntaxHighlighter } from "react-syntax-highlighter";
import { vscDarkPlus, coyWithoutShadows, darcula } from 'react-syntax-highlighter/dist/esm/styles/prism';
// 设置高亮的语言
import { jsx, javascript } from "react-syntax-highlighter/dist/esm/languages/prism";
import ReactMarkdown from 'react-markdown';
import ClipboardJS from 'clipboard';
import { Drawer, Input, message, Select } from 'antd';
import roles from "./roles";const { Search } = Input;
const { TextArea } = Input;
const { Option } = Select;function clearLocalStorage() {localStorage.setItem("LOCALDATA", "[]");
}// 封装localStorage的get方法
function getLocalStorage() {let arrStr = localStorage.getItem("LOCALDATA");if (arrStr) {let arr = JSON.parse(arrStr);return arr;} else {return [];}
}const them = {dark: vscDarkPlus,light: coyWithoutShadows
};
const ENDTEXT = "__END__";let comments = [];
let streaming = falseexport default function App1() {const [question, setQuestion] = useState("");const [roleType, setRoleType] = useState("");const [frontPrompts, setFrontPrompts] = useState("");const list_container_id = useRef(null);const currentTexts = useRef("");const [count, setCount] = useState(0);const [messageApi, contextHolder] = message.useMessage();const [open, setOpen] = useState(false);const [openMoreFunction, setOpenMoreFunction] = useState(false);const [jsonData, setJsonData] = useState("{}");const key = 'copy';const postStreamList = async (callback) => {let requestList = [];comments.map((item) => {if (item.type === "chatgpt-url") {if (item.contents[0]) {requestList.push({ "role": "user", "content": item.contents[0].hiddenQuestion });requestList.push({ "role": "assistant", "content": item.contents[0].hiddenContent });}} else {requestList.push({ "role": "user", "content": item.name });if (item.contents[0] && item.contents[0].text) {requestList.push({ "role": "assistant", "content": item.contents[0].text });}}})const requestOptions = {method: 'POST',headers: {'Content-Type': 'application/json',"Authorization": "Bearer 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"},body: JSON.stringify({"model": "gpt-3.5-turbo","messages": requestList})};let count = 0;const streamResponse = await fetch('/chat', requestOptions);// const streamResponse = await fetch('/search/api/dev/stream', requestOptions);const reader = streamResponse.body.getReader();let errText = "";const read = () => {return reader.read().then(({ done, value }) => {count++;if (done) {console.log("victor react reviced: end");callback(ENDTEXT);return;}const textDecoder = new TextDecoder();// console.log("返回的数据:", textDecoder.decode(value));let text = "";const strArr = (errText + textDecoder.decode(value)).split("data: ");console.log("解析字符", textDecoder.decode(value))if (strArr) {for (let i = 0; i < strArr.length; i++) {let json = {};if (strArr[i] && strArr[i] !== "[DONE]") {try {json = JSON.parse(strArr[i]);if (json.choices.length && json.choices[0].delta.content) {text = text + json.choices[0].delta.content;}errText = "";} catch (e) {console.log("出错", strArr[i])errText = strArr[i];}}}callback(text);}return read();});}read();}const postStreamListAudio = async (erjinzhi) => {const requestOptions = {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({"model": "gpt-3.5-turbo","messages": [{ "role": "assistant", "content": erjinzhi }]})};let count = 0;const streamResponse = await fetch('/chat', requestOptions);// const streamResponse = await fetch('/search/api/dev/stream', requestOptions);const reader = streamResponse.body.getReader();let errText = "";const read = () => {return reader.read().then(({ done, value }) => {count++;if (done) {console.log("victor react reviced: end");return;}const textDecoder = new TextDecoder();// console.log("返回的数据:", textDecoder.decode(value));let text = "";const strArr = (errText + textDecoder.decode(value)).split("data: ");console.log("解析字符", textDecoder.decode(value))if (strArr) {for (let i = 0; i < strArr.length; i++) {let json = {};if (strArr[i] && strArr[i] !== "[DONE]") {try {json = JSON.parse(strArr[i]);if (json.choices.length && json.choices[0].delta.content) {text = text + json.choices[0].delta.content;}errText = "";} catch (e) {console.log("出错", strArr[i])errText = strArr[i];}}}console.log(text);}return read();});}read();}const addLocalStorage = (dataArr) => {var now = new Date();var year = now.getFullYear(); //获取完整的年份(4位,1970-????)var month = now.getMonth() + 1; //获取当前月份(0-11,0代表1月)var date = now.getDate(); //获取当前日(1-31)var hour = now.getHours(); //获取当前小时数(0-23)var minute = now.getMinutes(); //获取当前分钟数(0-59)var second = now.getSeconds(); //获取当前秒数(0-59)var timestamp = year + "-" + (month < 10 ? "0" + month : month) + "-" + (date < 10 ? "0" + date : date) + " " + (hour < 10 ? "0" + hour : hour) + ":" + (minute < 10 ? "0" + minute : minute) + ":" + (second < 10 ? "0" + second : second);try {let arrStr = localStorage.getItem("LOCALDATA");if (arrStr) {let arr = JSON.parse(arrStr);arr.push({time: timestamp,dataArr: dataArr});localStorage.setItem("LOCALDATA", JSON.stringify(arr));} else {let arr = [];arr.push({time: timestamp,dataArr: dataArr});localStorage.setItem("LOCALDATA", JSON.stringify(arr));}messageApi.open({key,type: 'success',content: '缓存成功',duration: 1});} catch (err) {console.error('localStorage set error: ', err);}}const addComment = async (e) => {if (question.trim() === '') {alert('请输入问题');return;}setQuestion('');let index = comments.length;comments.push({id: Math.random(),role: 'user',type: "chatgpt",name: question,contents: []});setCount(count + 1);setTimeout(async () => {let responseList = await getList();if (responseList[0].type === "chatgpt-url") {comments[index].type = "chatgpt-url";}comments[index].contents = responseList;setQuestion('');setCount(0);}, 0);}const getList = (question) => {let requestList = [];comments.map((item) => {if (item.type === "chatgpt-url") {if (item.contents[0]) {requestList.push({ "role": "user", "content": item.contents[0].hiddenQuestion });requestList.push({ "role": "assistant", "content": item.contents[0].hiddenContent });}} else {requestList.push({ "role": "user", "content": item.name });if (item.contents[0]) {requestList.push({ "role": "assistant", "content": item.contents[0].text });}}})return new Promise((resolve) => {axios.post('/search/send', {frequency_penalty: 0,max_tokens: 2048,model: "text-davinci-003",presence_penalty: 0,message: requestList,temperature: 0.5,top_p: 1}).then((response) => {if (Array.isArray(response.data.choices)) {// console.log('请求成功', response);let arr = response.data.choices.map((item) => {if (item.message.type === "chatgpt-url") {return {type: item.message.type,index: item.index,text: "我已经对这个链接学习完成,你可以向我提问关于这个链接的内容",hiddenQuestion: item.message.question,hiddenContent: item.message.content}} else {return {type: item.type,index: item.index,text: item.message.content}}})resolve(arr);} else {alert('程序错误');}// 请求成功}).catch((error) => {// 请求失败,console.log(error);});})}const scrollBottom = () => {if (!list_container_id.current) {return;}setTimeout(() => {list_container_id.current.scrollTop = list_container_id.current.scrollHeight}, 0);}const updateScroll = useCallback(() => {scrollBottom()})const addStreamComment = async ({question1 = "",isCreate = false,isContinue = false}) => {if (question.trim() === '' && !question1 && isContinue === false) {alert('请输入问题');return;}streaming = true;setQuestion('');let index = 0;// 修改不需要新数据, 创建就需要push新itemif (isCreate || comments.length === 0) {console.log("走创建")index = comments.length;let questionText = question1 || question;if (roles[roleType]) {questionText = roles[roleType](question1 || question)}comments.push({id: Math.random(),role: 'user',type: "chatgpt",name: questionText,edit: false,contents: [{ index: Math.random(), text: "", edit: false }]});} else if (isContinue === true) {console.log("走继续")index = comments.length - 1;comments[index] = {...comments[index],id: Math.random(),role: 'user',type: "chatgpt",edit: false};} else {console.log("走编辑")index = comments.length - 1;comments[index] = {id: Math.random(),role: 'user',type: "chatgpt",name: question1 || question,edit: false,contents: [{ index: Math.random(), text: "", edit: false }]};}setCount(count + 1);let str = comments[index].contents[0].text;const callback = (text) => {if (text === ENDTEXT) {streaming = false;setCount(1);return;}str = str + text;comments[index].contents[0].text = str;setQuestion('');setCount((count) => count + 1);}postStreamList(callback);}const copy = (index) => {const clipboard = new ClipboardJS("#copyBtn" + index);clipboard.on('success', () => {messageApi.open({key,type: 'success',content: '复制成功',duration: 1});});}useEffect(() => {const clipboard = new ClipboardJS("#copyBtnAll");clipboard.on('success', () => {messageApi.open({key,type: 'success',content: '复制成功',duration: 1});});comments.map((item, index) => {const clipboard = new ClipboardJS("#copyBtn" + index);clipboard.on('success', () => {messageApi.open({key,type: 'success',content: '复制成功',duration: 2});});})})console.log("comments", comments)const renderList = () => {return comments.length === 0 ?(<div style={{ flex: 1 }}><div className='no-comment'>暂无问题,快去提问吧~</div></div>): (<divref={(el) => {list_container_id.current = el;}}style={{ flex: 1 }}className="list_container"><ul style={{ color: 'white' }}>{comments.map((item, index) => (<li key={item.id} style={{ color: 'white' }}>{item.name ? (<div className='quiz'><div className='response' style={{ marginLeft: 8 }}><div className='action_btn'><div>提问:</div><div className="copy_button" id={"copyBtn" + index} data-clipboard-text={item.name} onClick={(e) => copy(index)}>copy</div>{comments.length === index + 1 ? (<divclassName="copy_button"onClick={() => {if (item.edit === false) {item.edit = true;setCount(count + 1);} else {addStreamComment({question1: item.name,isCreate: false,isContinue: false});}}}>{!item.edit ? "edit" : "submit"}</div>) : null}<divclassName="copy_button"onClick={() => {comments.splice(index, 1);setCount(count + 1);}}>delete</div></div>{!item.edit ? <p>{item.name}</p> : (<div className=""><TextArearows={4}defaultValue={item.name}onChange={(e) => {item.name = e.target.value;}}/></div>)}</div></div>) : null}{item.contents.length ? (<><divclassName='answer'><div style={{ marginLeft: 8, marginBottom: 10 }} ><div className='action_btn'><div>回答:</div><div className="copy_button" id={"copyBtn" + index} data-clipboard-text={item.contents[0].text} onClick={(e) => copy(index)}>copy</div></div><pre style={{ width: "100%" }}><OmsSyntaxHighlight textContent={item.contents[0].text} language={"javascript"} darkMode /></pre></div></div><div>{currentTexts.current}</div></>) : <div><div style={{ display: 'flex', justifyContent: 'center', backgroundColor: 'black' }}><div className='heike'  >chatgpt</div></div><div className='answer2'>思考中...</div></div>}</li>))}</ul ></div >)}const handleForm = (e) => {setQuestion(e.target.value)}const handleSelectChange = (value) => {setFrontPrompts(value);setRoleType(value);};useEffect(() => {scrollBottom()})const overWriteData = (jsonData) => {let jsonData1 = JSON.parse(jsonData);// console.log("jsonData1", jsonData1)comments = [];jsonData1.map((item, index) => {if (index % 2 === 0) {comments.push({id: Math.random(),role: 'user',type: "chatgpt",name: item.content,edit: false,contents: [{index: Math.random(),edit: false,text: jsonData1[index + 1].content}]})// console.log(comments)setCount(count + 1)}})}const handleLocalDataChange = (value) => {overWriteData(value);};useEffect(() => {const mp3File = document.getElementById('mp3-file');mp3File.addEventListener('change', () => {const file = mp3File.files[0];const reader = new FileReader();reader.addEventListener('loadend', () => {const byteArray = new Uint8Array(reader.result);// 将byteArray上传至服务器console.log(byteArray)postStreamListAudio(byteArray);});reader.readAsArrayBuffer(file);});}, [])const renderHeader = () => {return (<div className='header_button'><divclassName="copy_all_button"style={{ color: "white" }}onClick={() => {let tmp = [];comments.map((item) => {tmp.push({role: 'user',content: item.name,})tmp.push({role: 'assistant',content: item.contents[0].text})})setJsonData(JSON.stringify(tmp));setOpen(true);}}>copy all</div><input type="file" id="mp3-file"></input><divclassName="copy_all_button"onClick={() => {setOpenMoreFunction(true);}}style={{ color: "white" }}>更多功能</div></div>)}const renderDrawerCopyBtnAll = () => {return (<Drawertitle={<div style={{ display: 'flex' }}><divclassName='copy_button'id={"copyBtnAll"}data-clipboard-text={jsonData}onClick={(e) => {const clipboard = new ClipboardJS("#copyBtnAll");clipboard.on('success', () => {messageApi.open({key,type: 'success',content: '复制成功',duration: 2});});}}>copy</div><div className='copy_button' onClick={() => {try {overWriteData(jsonData);setOpen(false);} catch (e) {messageApi.open({key,type: 'error',content: 'json格式出错',duration: 2});}}}>执行json</div><div className='copy_button' onClick={() => {try {addLocalStorage(jsonData);} catch (e) {messageApi.open({key,type: 'error',content: 'json格式出错',duration: 2});}}}>缓存</div></div>}placement={"bottom"}open={open}size='small'onClose={() => {setOpen(false)}}><TextArearows={4}value={jsonData}onChange={(e) => {setJsonData(e.target.value);}}/></Drawer>)}const renderDrawerMoreFunction = () => {return (<Drawertitle={"更多功能"}placement={"bottom"}open={openMoreFunction}size='small'onClose={() => {setOpenMoreFunction(false)}}><div>{!streaming ? (<buttonclassName="copy_all_button"onClick={() => {comments = [];setCount(0);}}>clear</button>) : null}{<buttonclassName="copy_all_button"onClick={() => {clearLocalStorage();setCount(10);}}>clearStorage</button>}<div><span>角色:</span><Selectstyle={{ width: '100%' }}defaultValue="origin"onChange={handleSelectChange}options={[{ value: 'origin', label: 'origin' },...Object.keys(roles).map((role) => ({ value: role, label: role }))]}/></div><div><span>缓存:</span><Selectstyle={{ width: '100%' }}onChange={handleLocalDataChange}>{getLocalStorage().length ? getLocalStorage().map((item) => {return <Option value={item.dataArr} key={Math.random()}>{item.time}</Option>}) : <Option value={"0"} key="无"></Option>}</Select></div></div></Drawer>)}const renderFrontPrompts = () => {if (frontPrompts && roles[frontPrompts]) {return <div className='frontPrompts'>前置指令:{roles[frontPrompts]()}</div>;} else {return null;}}const renderQuestion = () => {return (<div className='input_style'><TextAreaclassName='input_quertion'type="text"placeholder="请输入问题"value={question}name="question"onChange={handleForm}autoSize={{ minRows: 1, maxRows: 5 }}/><div style={{ width: '1vw' }}></div><button onClick={() => {addStreamComment({isContinue: true,isCreate: false,question1: ""});}} className="confirm_button" >继续</button><div style={{ width: '1vw' }}></div><button onClick={() => {const pattern = /(http|https):\/\/([\w.]+\/?)\S*/;addStreamComment({ isCreate: true, isContinue: false, question1: "" });}} className="confirm_button" >提问</button></div>)}return (<div className='app_container'>{renderHeader()}{renderFrontPrompts()}{renderList()}{contextHolder}{renderQuestion()}{renderDrawerCopyBtnAll()}{renderDrawerMoreFunction()}</div>)}const OmsSyntaxHighlight = (props) => {const { textContent, darkMode, language = 'txt' } = props;const [value, setValue] = useState(textContent);if (typeof darkMode === 'undefined') {them.light = darcula;}if (typeof darkMode === 'boolean') {them.light = coyWithoutShadows;}useEffect(() => {SyntaxHighlighter.registerLanguage("jsx", jsx);SyntaxHighlighter.registerLanguage("javascript", javascript);SyntaxHighlighter.registerLanguage("js", javascript);}, []);return (<ReactMarkdown source={value} escapeHtml={false} language={language}>{textContent}</ReactMarkdown>);
};
css文件
body,
html {margin: 0;
}ul,
li,
p {padding: 0;margin: 0;list-style: none
}h3 {margin-bottom: 0;
}.input_quertion {width: 50vw;height: 50px;border-radius: 10px;border: 1px solid black;
}pre {white-space: pre-wrap;white-space: -moz-pre-wrap;white-space: -pre-wrap;white-space: -o-pre-wrap;word-wrap: break-word;
}.copy_button {line-height: 35px;margin-right: 4px;border: 1px solid royalblue;
}.copy_all_button {line-height: 44px;margin-right: 4px;border: 1px solid royalblue;
}.content {width: 280px;margin: 5px;border: 1px solid black;
}.quickButton {width: 70px;border-radius: 10px;background-color: #03b96b;border: 0;height: 30px;color: white;position: absolute;right: 10px;
}.no-comment {text-align: center;padding: 20px;color: white;background-color: rgb(53, 54, 65);
}.frontPrompts {text-align: left;padding: 8px 46px;color: white;font-size: 12px;background-color: rgb(53, 54, 65);border-bottom: 1px solid black;
}.app_container {width: 100%;height: 100%;display: flex;flex-direction: column;background-color: rgb(53, 54, 65);
}.confirm_button {width: 26vw;border-radius: 10px;background-color: #03b96b;border: 0;height: 50px;color: white;box-shadow: 7px 6px 28px 1px rgba(0, 0, 0, 0.24);cursor: pointer;outline: none;transition: 0.2s all;
}.list_container {overflow: auto;flex: 1;
}.qiu {width: 15%;height: 15%;
}.chatGPTImg {position: fixed;top: 0;right: 0;bottom: 0;left: 0;margin: auto;width: 300px;height: 300px;z-index: 999;
}.response {overflow-wrap: break-word;word-break: normal;white-space: normal;flex: 1;
}.header_button {width: 100%;height: 67px;display: flex;align-items: center;bottom: 0;padding: 10px 40px 10px;border-bottom: 1px solid;background: linear-gradient(to bottom, rgba(0, 0, 0, 0.7) 0%, rgba(0, 0, 0, 0) 100%);box-shadow: 0px -5px 10px rgba(0, 0, 0, 0.3);
}.input_style {width: 100%;display: flex;bottom: 0;padding: 1%;align-items: end;
}.action_btn {display: flex;align-items: flex-start;color: white;
}.quiz {display: flex;align-items: flex-start;padding: 10px 40px 10px;color: white;line-height: 41px;background-color: rgb(53, 54, 65);
}.quiz_avatar {width: 40px;height: 40px;
}.answer {display: flex;background-color: #3b3d53;color: white;height: auto;line-height: 35px;padding: 20px 40px;overflow: auto;white-space: normal;word-break: break-all;
}.answer2 {text-align: center;padding-top: 40px;
}.confirm_button:active {transform: scale(0.98);background-color: blue;box-shadow: 3px 2px 22px 1px rgba(0, 0, 0, 0.24);
}

相关文章:

AI学习记录 -使用react开发一个网页,对接chatgpt接口,附带一些英语的学习prompt

实现了如下功能&#xff08;使用react实现&#xff0c;原创&#xff09; 实现功能&#xff1a; 1、对接gpt35模型问答&#xff0c;并实现了流式传输&#xff08;在java端&#xff09; 2、在实际使用中&#xff0c;我们的问答历史会经常分享给他人&#xff0c;所以下图的 copy …...

MongoDB多数据源配置与切换

在MongoDB中配置和使用多数据源主要涉及以下几个步骤&#xff1a; 定义多个数据源的配置&#xff1a; 在应用程序的配置文件中&#xff0c;定义多个MongoDB的数据源&#xff0c;例如在Spring Boot中可以通过application.yml或application.properties文件进行配置。 创建多个Mo…...

Mongodb入门介绍

文章目录 1、Mongodb&#xff1a;NoSQL数据库&#xff0c;分布式的文档型数据库2、适合场景&#xff1a;3、不适合场景&#xff1a;4、概念5、总结 1、Mongodb&#xff1a;NoSQL数据库&#xff0c;分布式的文档型数据库 2、适合场景&#xff1a; 1、web网站数据存储&#xff…...

docker前端部署

挂载&#xff0c;把自己的目录位置&#xff0c;挂载到容器内的HTML...

指标体系建设的方法论

一、分析痛点 了解当前数仓侧与业务应用方对指标到不到、难使用的痛点及日常指标使用习惯&#xff0c;制定指标中心所需功能并设计指标中心样式。 二、指定指标规范 定义指标类型、指标使用方、确定指标域(这里是数据域)、指标要具备的属性(业务/技术口径、负责人、类型等)。 …...

乐鑫ESP32-H2设备联网芯片,集成多种安全功能方案,启明云端乐鑫代理商

在数字化浪潮的推动下&#xff0c;物联网正以前所未有的速度融入我们的日常生活。然而&#xff0c;随着设备的激增&#xff0c;安全问题也日益成为公众关注的焦点。 乐鑫ESP32-H2致力于为所有开发者提供高性价比的安全解决方案&#xff0c;这款芯片经过专门设计以集成多种安全…...

C++调用Java接口

一、配置Java环境 安装jdk&#xff0c;我这里使用jdk1.8 32位版本&#xff0c;下载地址&#xff1a;https://www.oracle.com/java/technologies/downloads/#java8-windows 下载安装后&#xff0c;设置环境变量&#xff1a; JAVA_HOME C:\Program Files (x86)\Java\jdk-1.…...

C# datetimePicker

1. 直接把控件拉到设计器中&#xff0c;此时不要调整控件的values属性&#xff0c;这样就可以 打开后每次默认显示当天日期。 2. 属性Format long长日期格式默认值short短日期格式Time时间格式custom自定义时间格式在customFormat这个属性设置&#xff0c;比如yyyy-MM-dd HH…...

AI有关的学习和python

一、基本概念 AIGC&#xff08;AI Generated content AI 生成内容&#xff09; AI生成的文本、代码、图片、音频、视频。都可以成为AIGC。 Generative AI&#xff08;生成式AI&#xff09;所生成的内容就是AIGC AI指代计算机人工智能&#xff0c;模仿人类的智能从而解决问题…...

前端node.js入门

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 Node.js 入门概览 什么是Node.js&#xff1f; 为什么选择Node.js&#xff1f; 基础安装与环境配置 安装…...

无需标注的数据集

0&#xff1a;人 1&#xff1a;自行车 2&#xff1a;汽车 3&#xff1a;摩托车 4&#xff1a;飞机 5&#xff1a;公交车 6&#xff1a;火车 7&#xff1a;卡车 8&#xff1a;船 9&#xff1a;交通信号灯 10&#xff1a;消火栓 11&#xff1a;停车标志 12&#xff1a;停车计时器…...

C# 抽象工厂模式

栏目总目录 概念 抽象工厂模式是一种创建型设计模式&#xff0c;它提供了一种创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们具体的类。在抽象工厂模式中&#xff0c;一个抽象的工厂类负责定义创建产品对象的接口&#xff0c;但是具体工厂类将负责创建具体的产…...

java中 两个不同类对象list,属性一样,如何copy

如果您有两个不同的类&#xff0c;但它们拥有相同的属性&#xff0c;并且您想要从一个类的列表复制到另一个类的列表&#xff0c;您可以使用以下方法&#xff1a; 使用循环&#xff1a; 您可以遍历原始列表&#xff0c;并为每个元素创建目标类的新实例。 使用 Stream API&…...

文件上传总结

一、原理 通过界面上的上传功能上传了一个可执行的脚本文件&#xff0c;而WEB端的系统并未对其进行检测或者检测的逻辑做的不够好&#xff0c;使得恶意用户可以通过文件中上传的一句话木马获得操控权 二、绕过方法 1>前端绕过 1.删除前端校验函数 checkFile() 2.禁用js…...

网页突然被恶意跳转或无法打开?DNS污染怎么解决?

前言 在网上冲浪时&#xff0c;我们时常会遭遇DNS污染这一区域性攻击&#xff0c;几乎无人能幸免。受影响时&#xff1a;尝试访问正规网站可能会被错误导向赌博、色情或其他恶意站点。 1.我们为什么需要DNS 当我们想要访问一个网站时&#xff0c;就像拨打朋友的电话号码一样…...

Matlab进阶绘图第65期—带分组折线段的柱状图

带分组折线段的柱状图是在原始柱状图的基础上&#xff0c;在每组柱状图位置处分别添加折线段&#xff0c;以进行对比或添加额外信息。 由于Matlab中未收录带分组折线段的柱状图的绘制函数&#xff0c;因此需要大家自行设法解决。 本文使用自制的BarwithGroupedLine小工具进行…...

EasyMedia转码rtsp视频流flv格式,hls格式,H5页面播放flv流视频

在本文中&#xff0c;我们将介绍如何使用 EasyMedia 将 RTSP 视频流转码为 FLV 和 HLS 格式&#xff0c;并在 H5 页面上播放 FLV 流视频。EasyMedia 是一个支持多种流媒体协议的开源项目&#xff0c;非常适合用于这种转码和流媒体传输的场景。 前提条件 已经安装并配置好 Eas…...

FPGA实验6: 有时钟使能两位十进制计数器的设计

一、实验目的与要求 1.. 熟练掌握使用原理图设计较复杂电路&#xff1b; 2. 学习原理图设计中总线的表示以及使用方法。 二、实验原理 运用Quartus II 集成环境下的图形设计方法设计有时钟使能的两位十进制计数器。进行波形仿真和分析、引脚分配并下载到实验设备上进行功能…...

C# 委托函数 delegate

在C#中&#xff0c;委托&#xff08;Delegate&#xff09;是一种特殊的类型&#xff0c;它可以持有对方法的引用。 委托是实现事件的基础。事件本质上是多播委托&#xff0c;允许多个方法被触发 委托允许你将方法作为参数传递给其他方法&#xff0c;或者将方法作为返回值从方法…...

Vue3响应式高阶用法之`shallowReadonly()`

Vue3响应式高阶用法之shallowReadonly() 在现代前端开发中&#xff0c;Vue3 提供了丰富的响应式 API 来帮助开发者更高效地管理状态和数据。其中&#xff0c;shallowReadonly() 是一个非常有用的工具&#xff0c;适用于需要部分只读状态的场景。本文将详细介绍 shallowReadonl…...

Windows系统安全加固方案:快速上手系统加固指南 (下)

这里写目录标题 一、概述二、IP协议安全配置启用SYN攻击保护 三、文件权限3.1 关闭默认共享3.2 查看共享文件夹权限3.3 删除默认共享 四、服务安全4.1禁用TCP/IP 上的NetBIOS4.2 ### 禁用不必要的服务 五、安全选项5.1启动安全选项5.2禁用未登录前关机 六、其他安全配置**6.1防…...

记一次因敏感信息泄露而导致的越权+存储型XSS

1、寻找测试目标 可能各位师傅会有苦于不知道如何寻找测试目标的烦恼&#xff0c;这里我惯用的就是寻找可进站的思路。这个思路分为两种&#xff0c;一是弱口令进站测试&#xff0c;二是可注册进站测试。依照这个思路&#xff0c;我依旧是用鹰图进行了一波资产的搜集&#xff…...

Java笔试面试题AI答之线程Thread(1)

答案来自 Kimi AI 目录 1. 进程和线程的区别&#xff1f;2. Java语言创建线程的方式有哪些&#xff1f;3. Java线程有哪几种可用状态&#xff1f;4. Java同步方法和同步代码块的区别&#xff1f;5. 在监视器(Monitor)内部&#xff0c;如何做线程同步的&#xff1f;6. 什么是死…...

2.5 C#视觉程序开发实例2----图片内存管理

2.5 C#视觉程序开发实例2----图片内存管理 1 目标效果视频 mat-buffer 2 Mat 数组的定义 3 图片内存使用场合说明 3.1 程序加载或者切换程序时 3.2 设定时&#xff0c;注册图片 例如注册一个线速的图片 注册流程说明 3.3 外部触发时采集最新图片或者按钮点击时触发拍照 …...

Java核心 - 深入理解 Java 枚举类

作者&#xff1a;逍遥Sean 简介&#xff1a;一个主修Java的Web网站\游戏服务器后端开发者 主页&#xff1a;https://blog.csdn.net/Ureliable 觉得博主文章不错的话&#xff0c;可以三连支持一下~ 如有疑问和建议&#xff0c;请私信或评论留言&#xff01; 前言 在Java中&…...

HOW - CSS 定义颜色值

目录 1. 十六进制颜色 (Hexadecimal Color)2. RGB 颜色 (RGB Color)3. HSL 颜色 (HSL Color)HSL 颜色模式示例 4. 预定义颜色名 (Named Colors)5. LCH 颜色 (LCH Color)6. Lab 颜色 (Lab Color)7. HWB 颜色 (HWB Color)8. CSS 颜色函数 (Color Function)9. CSS4 颜色模块中的其…...

Vue3 reactive原理(一)-代理对象及数组

Proxy 只能拦截对一个对象的基本操作&#xff08;例如读取、设置属性值&#xff09;&#xff0c;而无法拦截复合操作&#xff08;例如&#xff0c;obj.fun(),由两个基本操作组成&#xff0c;1&#xff09;get到fun这个属性&#xff0c;2&#xff09;函数调用&#xff09;。 1 …...

基于联咏 NT98692芯片赋能边缘计算IP摄像机与XVR监控系统解决方案

联咏 NT98692 是一款新世代整合度极高的 SoC&#xff0c;具有高影像品质、低位元率、低功耗&#xff0c;针对 8Kp30 边缘运算 IP 摄影机与后端监控系统 XVR 应用。此 SoC 整合了 ARM Quad Cortex A73 CPU 核心、新一代 ISP 和 AI ISP、H.265/H.264 视讯压缩编解码器、DSP、高效…...

Python设计模式 - 工厂方法模式

定义 工厂方法模式是一种创建型设计模式&#xff0c;它定义一个创建对象的接口&#xff0c;让其子类来处理对象的创建&#xff0c;而不是直接实例化对象。 结构 抽象工厂&#xff08;Factory&#xff09;&#xff1a;声明工厂方法&#xff0c;返回一个产品对象。具体工厂类都…...

学习记录:ESP32控制舵机 FREERTOS BLE

控制舵机 PWM信号 PWM信号是一种周期性变化的方波信号&#xff0c;它有两个关键参数&#xff1a; 周期&#xff08;Period&#xff09;&#xff1a;一个完整的PWM信号的时间长度&#xff0c;通常用秒&#xff08;s&#xff09;或毫秒&#xff08;ms&#xff09;表示。占空比…...

react中的useState和Hook、副作用

react的组件分为类组件和函数组件&#xff0c;Hook 是一种特殊的函数&#xff0c;可以让你在函数组件中使用类组件中才有的一些特性。useState、useEffect、useReducer都是Hook。其中useState用于在函数组件中添加状态&#xff0c;useEffect用于在函数组件中执行副作用&#xf…...

Linux嵌入式学习——数据结构——线性表的链式结构

线性表的链式存储 解决顺序存储的缺点&#xff0c;插入和删除&#xff0c;动态存储问题。 特点&#xff1a; 线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素&#xff0c;存储单元可以是连续的&#xff0c;也可以不连续。可以被存储在任意内存未被占…...

文本编辑 文本中的各种空格

参考资料 欧文の半角スペースは&#xff12;種類ある!?无中断空格常见空格一览浅析什么是零宽度字符以及零宽度字符在实际中的应用场景空格象形字间隔无中断空格零宽间隔 目录 零. 各种空格在Notepad中的效果一. 半角空格二. 全角空格三. TAB空格四. 无中断空格4.1 定义4.2 H…...

Vue插槽 (Slots)详解

目录 前言基础插槽具名插槽作用域插槽默认插槽动态插槽名总结相关阅读 前言 Vue的插槽&#xff08;Slots&#xff09;是一个非常强大的特性&#xff0c;它允许你在组件的模板中嵌入父组件的内容。插槽使得组件之间的内容分发变得灵活&#xff0c;尤其在构建可复用组件时非常…...

Unity中有关Animation的一点笔记

也许更好的阅读体验 Animation Unity中Animation类并不是直接记载了和播放动画有关的信息&#xff0c;可以简单理解Animation为一个动画播放器&#xff0c;播放的具体内容就像卡带一样&#xff0c;当我们有了卡带后我们可以播放动画。 对应的则是编辑器中的组件 所以Anima…...

module federation模块联邦与微前端

module federation是什么 webpack5新增了module federation&#xff0c;module federation的作用&#xff0c;将每个构建(build)作为容器(这是一个概念)&#xff0c;构建后的资源可以正常部署&#xff0c;同时还具备在运行时对外暴露其中的模块&#xff0c;这就意味着多个构建…...

日常开发记录分享——C#控件ToolTip实现分栏显示内容

文章目录 需求来源实现思路实施请看VCR等等别走&#xff0c;有优化 需求来源 需要在鼠标浮动到指定位置后提示出详细的信息&#xff0c;一开始使用的tooltip实现&#xff0c;但是里面的内容效果并不理想&#xff0c;需要有条理性&#xff0c;于是就想到能不能将展示的东西分列…...

Kettle下载安装

环境说明 虚拟机&#xff1a;Win7&#xff1b;MySql8.0 主机&#xff1a;Win11&#xff1b;JDK1.8&#xff1b;Kettle 9.4&#xff08;Pentaho Data Integration 9.4&#xff09;&#xff08;下载方式见文末&#xff09; 安装说明 【1】解压后运行Spoon.bat 【2】将jar包 复…...

最新版Golang pprof使用(引入、抓取、分析,图文结合)

最新版Golang pprof使用 &#x1f525;具体实践: Go调试神器pprof使用教程Golang线上内存爆掉问题排查&#xff08;pprof&#xff09; Github地址:https://github.com/ziyifast/ziyifast-code_instruction/tree/main/go-demo/go-pprof 引入pprof:import _ “net/http/pprof” …...

vue3学习记录1:emit的写法

emit是用于child组件向parent组件通信的工具&#xff0c;因为vue3的script可以设置为setup&#xff0c;写法同vue2有较大区别。 一、script setup - 直接写 <script lang"ts" setup>const emit defineEmits([close]);function handleClose() {emit(close);}…...

Visual Studio Code + vue快速安装配置Node.js+Vue+webpack+vscode

第一部分&#xff1a;Node.js 第一步&#xff1a;下载Node.js 方法1&#xff1a;链接 下载 | Node.js 中文网 (nodejs.cn) 方法2&#xff1a;百度网盘 链接&#xff1a;https://pan.baidu.com/s/1zIqu8H9rb_I1i-1OWD7swQ?pwdaurk 提取码&#xff1a;aurk --来自百度网盘…...

【Dart 教程系列第 49 篇】什么是策略设计模式?如何在 Dart 中使用策略设计模式

这是【Dart 教程系列第 49 篇】&#xff0c;如果觉得有用的话&#xff0c;欢迎关注专栏。 博文当前所用 Flutter SDK&#xff1a;3.22.1、Dart SDK&#xff1a;3.4.1 文章目录 一&#xff1a;什么是策略设计模式&#xff1f;二&#xff1a;为什么要使用策略设计模式&#xff1…...

BGP路由反射器

原理概述 缺省情况下&#xff0c;路由器从它的一个 IBGP对等体那里接收到的路由条目不会被该路由器再传递给其他IBGP对等体&#xff0c;这个原则称为BGP水平分割原则&#xff0c;该原则的根本作用是防止 AS内部的BGP路由环路。因此&#xff0c;在AS内部&#xff0c;一般需要每台…...

DolphinDB Web 端权限管理:可视化操作指南

在现代数据库管理中&#xff0c;高效和直观的权限管理对于用户的数据安全是至关重要的。过去 DolphinDB 用户需要依赖系统脚本来管理用户和权限&#xff0c;这对于缺乏技术背景的管理员来说既复杂又容易出错。 为了提升用户体验和操作效率&#xff0c;DolphinDB 目前在 Web 上…...

学习Vue2收藏这一篇就够了(如何创建Vue实例)

什么是Vue&#xff1f; Vue是什么&#xff1a;是一个用于构建用户界面的渐进式框架 什么是构建用户界面&#xff1a;基于数据动态渲染页面 什么是渐进式&#xff1a;循序渐进的学习 什么是框架&#xff1a;一整套完整的项目解决方案 创建Vue实例 核心步骤&#xff08;4步…...

Mysql数据库第四次作业

mysql> create table student(sno int primary key auto_increment,sname varchar(30) not null unique,Ssex varchar(2) check (Ssex男 or Ssex女) not null,Sage int not null,Sdept varchar(10) default计算机 not null); mysql> create table Course(Con int primar…...

使用Docker搭建MySql的主从同步+ShardingSphere搭建Mysql的读写分离

参考课程 尚硅谷ShardingSphere5实战教程&#xff08;快速入门掌握核心&#xff09;_哔哩哔哩_bilibili 主服务器 创建容器 docker run -d \ -p 3306:3306 \ -v /kira/mysql/master/conf:/etc/mysql/conf.d \ -v /kira/mysql/master/data:/var/lib/mysql \ -e MYSQL_ROOT…...

数据结构:数据类型与抽象数据类型

数据类型与抽象数据类型 数据类型基本数据类型构造数据类型指针类型枚举类型 抽象数据类型&#xff08;ADT&#xff09;抽象数据类型的组成部分常见的抽象数据类型示例 数据类型与抽象数据类型的区别实现抽象数据类型的具体方式用数组实现栈用链表实现栈 总结 数据类型 数据类…...

西方逻辑史简介

西方逻辑史研究&#xff0c;对形式逻辑实现现代化&#xff0c;对加强西方哲学史研究&#xff0c;对开展科学方法论的研究都有重要意义。西方逻辑史一般被划分成古代、中世纪、现代三个历史时期。本文拟对这三个时期中的七个重要逻辑学家和逻辑学派&#xff1a;亚里士多德、斯多…...

【论文10】复现代码tips

一、准备工作 1.创建一个虚拟环境 conda create --name drgcnn38 python=3.8.18 2.激活虚拟环境 conda activate drgcnn38 注意事项 在Pycharm中终端(terminal)显示PS而不是虚拟环境base 问题如下所示 解决方法:shell路径改成cmd.exe 重启终端显示虚拟环境 3.安装torch …...