富文本使用总结

多种富文本

一、Tinymce富文本

踩坑:disabled和readonly效果问题

解决方法:

【Tinymce富文本】如何实现disabled和readonly效果_tinymce disabled-CSDN博客

二、vue-quill-editor富文本

官方链接: vue-quill-editor · Quill官方中文文档 · 看云

vue-quill-editor 使用教程 (最全)! - 灰信网(软件开发博客聚合)

踩坑:

上传图片时,图片路径会被默认转为base64编码格式,上传多个图片时路径过长数据库存储不下导致报错用富文本(vue-quill-editor)上传图片时,图片路径会被默认转为base64编码格式,上传多个图片时路径过长数据库存储不下导致报错 - 简书

解决方法:

插入图片不采用base64而是从服务器传图片再显示返回url。

搜索关键词:

vue使用vue-quill实现富文本编辑器上传图片

使用步骤:

1.安装依赖

2.全局注册

3.封装组件(注意这是antd工程)

CourseRichText.vue

<template><div><quill-editorclass="editor"ref="myTextEditor"v-model="editorContent":options="editorOption"@change="onEditorChange($event)"@ready="ready($event)":disabled="disabled"></quill-editor><a-uploadclass="ant-my-uploader"style="display:none":action="`${publicName}/proxy/v1/health/commFile/upload`":before-upload="beforeUpload"@change="handleChange"><a-button> <a-icon type="upload" />Upload </a-button></a-upload><!-- <div>剩余可输入<span :style="{ color: 1000 - innerText.length < 0 ? 'red' : 'black' }">{{1000 - innerText.length}}</span>字</div> --></div>
</template><script>
import { quillEditor } from "vue-quill-editor";
import '@/styles/vue-quill-editor/quill.core.css'
import '@/styles/vue-quill-editor/quill.snow.css'
import '@/styles/vue-quill-editor/quill.bubble.css'
import Quill from "quill";
// 图片大小调整
// import ImageResize from "quill-image-resize-module";
// Quill.register("modules/imageResize", ImageResize);
// 自定义文字大小
let fontSizeStyle = Quill.import("attributors/style/size");
fontSizeStyle.whitelist = ["10px","11px","12px","13px","14px","15px","16px","17px","18px","19px","20px","21px","22px","23px","24px","25px","26px"
];
Quill.register(fontSizeStyle, true);
// import { lineHeightStyle } from "@/utils/lineheight";
//工具菜单栏配置
const toolbarOptions = [["bold", "italic", "underline", "strike"], // 加粗 斜体 下划线 删除线["blockquote", "code-block"], // 引用  代码块[{ header: 1 }, { header: 2 }], // 1、2 级标题[{ list: "ordered" }, { list: "bullet" }], // 有序、无序列表[{ script: "sub" }, { script: "super" }], // 上标/下标[{ indent: "-1" }, { indent: "+1" }], // 缩进// [{'direction': 'rtl'}],                         // 文本方向// [{ size: ["small", false, "large", "huge"] }], // 字体大小[{ size: fontSizeStyle.whitelist }], // 字体大小[{ header: [1, 2, 3, 4, 5, 6, false] }], // 标题[{ color: [] }, { background: [] }], // 字体颜色、字体背景颜色[{ font: [] }], // 字体种类[{ align: [] }], // 对齐方式// [{ lineheight: ["initial", "1", "1.5", "1.75", "2", "3", "4", "5"] }], // 行高["clean"], // 清除文本格式["link", "image"] // 链接、图片// ["video"] // 视频
];
export default {components: {quillEditor},props: {content: String,disabled: Boolean},name:"courseRichText",data() {return {publicName: window.location.pathname,innerText: "",editorContent: null,editorOption: {placeholder: "请在这里输入", //提示readyOnly: false, //是否只读theme: "snow", //主题 snow/bubblesyntax: true, //语法检测modules: {// imageResize: {//   //添加//   displayStyles: {//     //添加//     backgroundColor: "black",//     border: "none",//     color: "white"//   },//   modules: ["Resize", "DisplaySize", "Toolbar"] //添加// },toolbar: {container: toolbarOptions,handlers: {image: function(value) {if (value) {console.log(value);// 触发input框选择图片文件document.querySelector(".ant-my-uploader input").click();} else {this.quill.format("image", false);}},lineheight: function(value) {if (value) {this.quill.format("lineHeight", value);} else {console.log(value);}}}}}},loading: false};},computed: {editor() {return this.$refs.myTextEditor.quillEditor;}},mounted() {// Quill.register({ "formats/line-height": LineHeight }, true);},watch: {content: {handler: function(val) {this.editorContent = val;// 更新字数},immediate: true}},methods: {ready() {// Quill.register({ "formats/lineHeight": lineHeightStyle }, true);},onEditorChange(editor) {this.editorContent = editor.html;// 不去除空格// this.innerText = editor.text;// 去除空格this.innerText = editor.text.replace(/[\r\n]$/g, "");this.$emit("onChange", {content: editor.html,textLength: this.innerText.length});},// 上传图片uploadSuccess(val) {let quill = this.$refs.myTextEditor.quill;// 获取光标所在位置let length = quill.getSelection().index;// 插入图片  res.url为服务器返回的图片地址quill.insertEmbed(length, "image", val.absolutePath);// 调整光标到最后quill.setSelection(length + 1);},handleChange(info) {switch (info.file.status) {case "uploading":this.loading = true;break;case "done":this.loading = false;// eslint-disable-next-line no-case-declarationsconst { response } = info.file; // 请求返回的数据if (response.code == 200) {this.uploadSuccess(response.data);this.$message.success({content: "上传成功!",key: "uploadPic",duration: 2});} else {this.$message.error({content: response.message[0] || "上传发生错误" + response.code,key: "uploadPic",duration: 2});}break;case "error":this.loading = false;// 错误消息提示this.$message.error({content: "网络错误请稍后再试",key: "uploadPic",duration: 2});break;default:break;}},beforeUpload(file) {return new Promise((resolve, reject) => {this.$message.success({content: "上传中",key: "uploadPic",duration: 2});const isJpgOrPng =file.type === "image/jpeg" ||file.type === "image/png" ||file.type === "image/jpg";if (!isJpgOrPng) {this.$message.error("图片仅支持 jpeg 或 png 或 jpg 格式");return reject(false);}// const isLt300kb = file.size / 1024 < 300;const isLt2M = file.size / 1024 / 1024 < 2;if (!isLt2M) {this.$message.error("图片大于 2M");return reject(false);}return resolve(true);});}}
};
</script><style>
.editor {line-height: normal !important;/* height: 400px; */background-color: #ffffff;
}
.ql-snow .ql-tooltip[data-mode="link"]::before {content: "请输入链接地址:";
}
.ql-snow .ql-tooltip.ql-editing a.ql-action::after {border-right: 0px;content: "保存";padding-right: 0px;
}
.ql-snow .ql-tooltip a.ql-action::after {content: "编辑";
}
.ql-snow .ql-tooltip a.ql-remove::before {content: "移除";
}
.ql-snow .ql-tooltip[data-mode="video"]::before {content: "请输入视频地址:";
}
.ql-snow .ql-picker.ql-size .ql-picker-label::before,
.ql-snow .ql-picker.ql-size .ql-picker-item::before {content: "14px";
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="small"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="small"]::before {content: "10px";
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="large"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="large"]::before {content: "18px";
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="huge"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="huge"]::before {content: "32px";
}.ql-snow .ql-picker.ql-header .ql-picker-label::before,
.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-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-font .ql-picker-label::before,
.ql-snow .ql-picker.ql-font .ql-picker-item::before {content: "标准字体";
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="serif"]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="serif"]::before {content: "衬线字体";
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="monospace"]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="monospace"]::before {content: "等宽字体";
}
/* 编辑器内部出现滚动条 */
.ql-container {/* overflow-y: auto; */height: 200px !important;
}
/*滚动条整体样式*/
.ql-container ::-webkit-scrollbar {width: 10px; /*竖向滚动条的宽度*/height: 10px; /*横向滚动条的高度*/
}
.ql-container ::-webkit-scrollbar-thumb {/*滚动条里面的小方块*/background: #666666;border-radius: 5px;
}
.ql-container ::-webkit-scrollbar-track {/*滚动条轨道的样式*/background: #ccc;border-radius: 5px;
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="10px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="10px"]::before {content: "10px";
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="11px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="11px"]::before {content: "11px";
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="12px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="12px"]::before {content: "12px";
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="13px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="13px"]::before {content: "13px";
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="14px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="14px"]::before {content: "14px";
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="15px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="15px"]::before {content: "15px";
}
.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";
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="17px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="17px"]::before {content: "17px";
}
.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";
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="19px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="19px"]::before {content: "19px";
}
.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";
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="21px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="21px"]::before {content: "21px";
}
.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";
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="23px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="23px"]::before {content: "23px";
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="24px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="24px"]::before {content: "24px";
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="25px"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="25px"]::before {content: "25px";
}
.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";
}
.ql-snow .ql-picker.ql-lineheight .ql-picker-label::before{content: "行高";
}
.ql-snow.ql-picker.ql-lineheight.ql-picker-item[data-value="initial"]::before {content: "默认";
}
.ql-snow .ql-picker.ql-lineheight .ql-picker-item[data-value="1"]::before {content: "1";
}
.ql-snow .ql-picker.ql-lineheight .ql-picker-item[data-value="1.5"]::before {content: "1.5";
}
.ql-snow .ql-picker.ql-lineheight .ql-picker-item[data-value="1.75"]::before {content: "1.75";
}
.ql-snow .ql-picker.ql-lineheight .ql-picker-item[data-value="2"]::before {content: "2";
}
.ql-snow .ql-picker.ql-lineheight .ql-picker-item[data-value="3"]::before {content: "3";
}
.ql-snow .ql-picker.ql-lineheight .ql-picker-item[data-value="4"]::before {content: "4";
}
.ql-snow .ql-picker.ql-lineheight .ql-picker-item[data-value="5"]::before {content: "5";
}
.ql-snow .ql-picker.ql-lineheight {width: 70px;
}
</style>

4.页面使用组件

<course-rich-text :disabled=" dialogType!='add' && dialogType!='edit'" @onChange="richTextChange" :content="messageData.msgDetail" />

三、Monaco Editor

封装组件:MonacoEditor.vue

<template><div><div id="code-editor" style="width:100%;height:100%;min-height:200px;border:1px solid #DCDFE6"></div></div>
</template><script>
// import * as monaco from 'monaco-editor'
import * as monaco from "monaco-editor/esm/vs/editor/editor.api"
import { checkJsonCode, getJsonPath } from '@/utils/monaco-editor.js'export default {name: 'monacoEditor',model: {prop: 'content',event: 'change'},props: {'content': null,'language': {default: 'javascript'},'readOnly': {default: false}},data: function () {return {editor: null,jsonPath: null}},watch: {content: function (newValue) {let value_ = newValueif (this.editor) {if (newValue !== this.editor.getValue()) {if (this.language == 'json') {value_ = checkJsonCode(value_)}monaco.editor.setModelLanguage(this.editor.getModel(), this.language);this.editor.trigger(this.editor.getValue(), 'editor.action.formatDocument')this.editor.setValue(value_);}}}},mounted: function () {const copyToClipboard = this.copyToClipboardlet value_ = this.contentif (this.language == 'json') {value_ = checkJsonCode(this.content)}this.editor = monaco.editor.create(this.$el.querySelector('#code-editor'),{value: value_,language: this.language,theme: 'vs',readOnly: this.readOnly,automaticLayout: true});this.editor.addAction({id: 'json-path',label: 'Copy JsonPath',keybindings: [monaco.KeyMod.chord(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KEY_J)],precondition: "editorLangId == 'json'",keybindingContext: "editorLangId == 'json'",contextMenuGroupId: '9_cutcopypaste',contextMenuOrder: 2,run: copyToClipboard});this.editor.onDidChangeModelContent(event => {const value = this.editor.getValue()if (this.value !== value) {this.$emit('change', value, event)}})this.editor.onDidChangeCursorPosition(event => {const value = this.editor.getValue()const offSet = this.editor.getModel().getOffsetAt(event.position)const language = this.language;if (this.value !== value && language === 'json') {this.$emit('on-cursor-change', { offSet: offSet })}if (language == 'json' && offSet !== 0) {this.jsonPath = getJsonPath(value, offSet)this.$emit('on-jsonpath-change', { jsonPath: this.jsonPath })}})},methods: {copyToClipboard() {const notification = this.$Noticeif (this.jsonPath) {navigator.clipboard.writeText(this.jsonPath).then(function () { }, function () {notification.error({title: 'jsonpath copy failed.'});});} else {notification.warning({title: 'There is no jsonpath that can be copied.'});}}}
};
</script>

monaco-editor.js

const colType = { Object, Array }export function getJsonPath(text, offSet) {let pos = 0let stack = []let isInKey = falsewhile (pos < offSet) {const startPos = posswitch (text[pos]) {case '"':const { text: s, pos: newPos } = readString(text, pos)if (stack.length) {const frame = stack[stack.length - 1]if (frame.colType === colType.Object && isInKey) {frame.key = sisInKey = false}}pos = newPosbreakcase '{':stack.push({ colType: colType.Object })isInKey = truebreakcase '[':stack.push({ colType: colType.Array, index: 0 })breakcase '}':case ']':stack.pop()breakcase ',':if (stack.length) {const frame = stack[stack.length - 1]if (frame.colType === colType.Object) {isInKey = true} else {frame.index++}}break}if (pos === startPos) {pos++}}return pathToString(stack);
}function pathToString(path) {let s = '$'try {for (const frame of path) {if (frame.colType === colType.Object) {if (!frame.key.match(/^[a-zA-Z$_][a-zA-Z\d$_]*$/)) {const key = frame.key.replace('"', '\\"')s += `["${frame.key}"]`} else {if (s.length) {s += '.'}s += frame.key}} else {s += `[${frame.index}]`}}return s;} catch (ex) {return '';}
}function isEven(n) {return n % 2 === 0;
}function readString(text, pos) {let i = pos + 1i = findEndQuote(text, i)var textpos = {text: text.substring(pos + 1, i),pos: i + 1}return textpos
}// Find the next end quote
function findEndQuote(text, i) {while (i < text.length) {// console.log('findEndQuote: ' + i + ' : ' + text[i])if (text[i] === '"') {var bt = i// Handle backtracking to find if this quote is escaped (or, if the escape is escaping a slash)while (0 <= bt && text[bt] == '\\') {bt--}if (isEven(i - bt)) {break;}}i++}return i
}export function checkJsonCode(strJsonCode) {let res = '';try {for (let i = 0, j = 0, k = 0, ii, ele; i < strJsonCode.length; i++) {ele = strJsonCode.charAt(i);if (j % 2 === 0 && ele === '}') {// eslint-disable-next-line no-plusplusk--;for (ii = 0; ii < k; ii++) ele = `    ${ele}`;ele = `\n${ele}`;} else if (j % 2 === 0 && ele === '{') {ele += '\n';// eslint-disable-next-line no-plusplusk++;for (ii = 0; ii < k; ii++) ele += '    ';} else if (j % 2 === 0 && ele === ',') {ele += '\n';for (ii = 0; ii < k; ii++) ele += '    ';// eslint-disable-next-line no-plusplus} else if (ele === '"') j++;res += ele;}} catch (error) {res = strJsonCode;}return res;}

使用:

<monacoEditor v-model="form.ruleContent" ></monacoEditor>

四、mavonEditor

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

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

相关文章

【Leetcode】232. 用栈实现队列

【Leetcode】232. 用栈实现队列 题目链接代码 题目链接 【Leetcode】232. 用栈实现队列 代码 type MyQueue struct {A []intB []int }func Constructor() MyQueue {return MyQueue{} }func (this *MyQueue) Push(x int) {this.A append(this.A, x) }func (this *MyQueue…

面向对象三大特征之三:多态--java学习笔记

什么是多态 多态是在继承/实现情况下的一种现象&#xff0c;表现为&#xff1a;对象多态、行为多态 对象多态&#xff1a;举个栗子&#xff0c;比如一个人&#xff0c;他可以是一个老师&#xff0c;也可以是一个歌手&#xff0c;也可以是一个丈夫...... 行为多态&#xff1a;举…

Chrome 插件匹配模式(Match patterns)规则

匹配模式&#xff08;Match patterns&#xff09; 一、匹配模式结构 匹配模式是采用以下结构的网址&#xff0c;用于指定一组网址&#xff1a; <scheme>://<host>/<path>1. scheme 必须是以下内容之一&#xff0c;并使用双斜线 (//) 与格式的其余部分分隔…

PHP反序列化总结4--原生类总结

原生类的简要介绍以及原生类和反序列化的关系 PHP 原生类指的是 PHP 内置的类&#xff0c;它们可以直接在 PHP 代码中使用且无需安装或导入任何库&#xff0c;相当于代码中的内置方法例如echo &#xff0c;print等等可以直接调用&#xff0c;但是原生类就是可以就直接php中直接…

git手册

问题场景​ 不同git remote之间代码同步 git checkout remote1 branch git checkout remote2 branch git merge remote1 branch git push 已经在git索引记录&#xff0c;现在不想要在git管理 提交git删除提交.gitignore修改本地新增该文件 本地仓库重置为与远程分支一致 …

jmeter分布式服务搭建

目录 一、环境准备 二、 安装包下载 三 、安装jdk 四 、控制机安装 4.1 解压压缩包 4.2 修改 bin/jmeter.properties 4.3 修改 bin/system.properties 五、执行机安装 5.1 解压安装包 5.2 修改 bin/jmeter.properties 5.3 修改 bin/system.properties 5.4 启动执行机 …

关于如何禁用、暂停或退出OneDrive等操作,看这篇文件就够了

​想知道如何禁用OneDrive?你可以暂停OneDrive的文件同步,退出应用程序,阻止它在启动时打开,或者永远从你的机器上删除该应用程序。我们将向你展示如何在Windows计算机上完成所有这些操作。 如何在Windows上关闭OneDrive 有多种方法可以防止OneDrive在你的电脑上妨碍你。…

堆排序——高效解决TOP-K问题

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;数据结构|Linux|C语言 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 引言什么是堆&#xff1f;建堆堆排序&#xff1a;排序的最终结果 堆排序实现函数声明交换函数 Swap下沉调整 DnAdd堆排序函数 HeapSort主函数 文件中找…

SpringBoot+Vue实现对称加密和非对称加密

我们先来了解一下什么是对称加密和非对称加密&#xff0c;以及两者的优缺点 对称加密 使用同一个密钥对消息进行加密解密 优点&#xff1a;加密和解密的速度快&#xff0c;适合于数据量大的加解密 缺点&#xff1a;密钥在网络传输中可能被泄露&#xff0c;因此安全性相对较低…

C++核心编程三:函数提高(持续更新)

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;C从基础到进阶 &#x1f319;C核心编程&#x1f30f;1 函数提高&#x1f384;1.1 函数默认参数&#x1f384;1.2 函数占位参数&#x1f384;1.3 函数重载&#x1f349;1.3.1 函数重载概述&…

What is `@RequestBody ` does?

RequestBody 是SpringMVC框架中的注解&#xff0c;通常与POST、PUT等方法配合使用。当客户端发送包含JSON或XML格式数据的请求时&#xff0c;可以通过该注解将请求体内容绑定到Controller方法参数上 作用 自动反序列化&#xff1a; SpringMVC会根据RequestBody注解的参数类型&…

CentOS 安装python

为了调用OpenAI接口 租了个香草云服务器&#xff08;CentOS&#xff09; 现在需要用Python(最好3.7以上)来调用API接口 需要下载FinalShell.exe 或者其它工具 来执行以下命令 下载Python3.12.1 选好下载目录 wget https://www.python.org/ftp/python/3.12.1/Python-3.12.1.tar.…

护眼灯有蓝光吗?防蓝光护眼台灯推荐

护眼台灯是家长为孩子购买的常见用品之一&#xff0c;但对于它的了解却不够深入&#xff0c;很多人购买之后反而容易出现眼睛疲劳、不适的情况&#xff01;据了解&#xff0c;主要的原因是因为在选择护眼台灯时&#xff0c;大多数人没有专业知识&#xff0c;没有买到合适的护眼…

Java中的性能优化:深入剖析常见优化技巧

引言 在现代软件开发中&#xff0c;性能优化是一个至关重要的话题。Java作为一门强大而广泛使用的编程语言&#xff0c;也需要开发者关注和优化性能&#xff0c;以确保应用程序能够在各种场景下高效运行。本文将深入剖析Java中的一些常见性能优化技巧&#xff0c;为开发者提供…

012集:三目运算符实例讲解(if else)及for、while循环—python基础入门实例

Python也有自己的三目运算符&#xff1a; 条件为真时的结果 if 判段的条件 else 条件为假时的结果 即&#xff1a;Python可以通过if语句来实现三目运算符的功能&#xff0c;因此可以把这种if语句当做三目运算符&#xff0c;具体语法格式如下&#xff1a; 返回True执行 if 表达…

Github搭建图床 github搭建静态资源库 免费CDN加速 github搭建图床使用 jsdelivr CDN免费加速访问

Github搭建图床 github搭建静态资源库 免费CDN加速 github搭建图床使用 jsdelivr CDN免费加速访问 前言1、创建仓库2、开启 gh-pages页面功能3、访问测试 前言 写博客文章时&#xff0c;图片的上传和存放是一个问题&#xff0c;使用小众第三方图床&#xff0c;怕不稳定和倒闭&…

.net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别

//全局过滤器 builder.Services.AddMvc(m > { m.Filters.Add<AllResultFilter>(); }); 1、实现过滤器 public class AllResultFilter : IResultFilter {/// <summary>/// 结果执行后方法/// 不可更改结果/// </summary>/// <param name"con…

独立按键控制直流电机调速

/*----------------------------------------------- 内容&#xff1a;对应的电机接口需用杜邦线连接到uln2003电机控制端 使用5V-12V 小功率电机皆可 2个按键分别加速和减速 ------------------------------------------------*/ #include<reg52.h> //包含头文…

C语言包中形参的隐含存储类别

存储方式 变量的作用域(空间)可分为全局变量和局部变量&#xff0c;变量的存储方式可分为动态存储方式和静态存储方式。 从变量值存在的时间(生存期)来观察&#xff0c;有的变量在程序运行的整个过程都是存在的&#xff0c;有的变量则是在调用其所在的函数时才临时分配存储单…

springboot+mysql大学生就业推荐系统-计算机毕业设计源码01535

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对学生就业管理等问题&#xff0c;对学生就业…