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

富文本编辑器的第三方库ProseMirror

如果0-1的开发一个富文本编辑器,成本还是非常高的,里面很多坑要踩,市面上很多库可以帮助我们搭建一个富文本编辑器,ProseMirror就是其中最流行的库之一。

认识ProseMirror

ProseMirror 提供了一套工具和概念,用于构建富文本编辑器,使用的用户界面受“所见即所得”启发,但试图避免这种编辑风格的陷阱。

ProseMirror 的主要原则是您的代码可以完全控制文档及其发生的事情。这个文档不是一个 HTML 的 blob,而是一个自定义的数据结构,只包含您明确允许它包含的元素,并且在您指定的关系中。所有更新都通过一个单一的点,可以在此检查并对其做出反应。

ProseMirror更像是一个乐高积木套装,而不是一个火柴盒汽车。

ProseMirror有四个基本模块:

  • prosemirror-model 定义了编辑器的文档模型,用于描述编辑器内容的数据结构。
  • prosemirror-state 提供了描述编辑器整体状态的数据结构,包括选择,以及从一个状态移动到下一个状态的事务系统。
  • prosemirror-view 实现了一个用户界面组件,在浏览器中将给定的编辑器状态显示为可编辑元素,并处理用户与该元素的交互。
  • prosemirror-transform 包含用于修改文档的功能,这些修改可以被记录和重放,这是state模块中事务的基础,并且使撤销历史和协作编辑成为可能。

此外,还有基本编辑命令、绑定键、撤销历史、输入宏、协作编辑、简单文档模式等模块

实现最简约编辑器

官方文档上给了一个最简约版的案例

import {schema} from "prosemirror-schema-basic"
import {EditorState} from "prosemirror-state"
import {EditorView} from "prosemirror-view"let state = EditorState.create({schema})
let view = new EditorView(document.body, {state})

Schema

其中schema是重中之重,在开发 prosemirror 项目中,第一件最重要的事情是先定义自己的数据模型,即 Schema

我们先看看官方给的prosemirror-schema-basic插件中提供了哪些能力
在.d.ts文件中

import { NodeSpec, MarkSpec, Schema } from 'prosemirror-model';/**
[Specs](https://prosemirror.net/docs/ref/#model.NodeSpec) for the nodes defined in this schema.
*/
declare const nodes: {/**NodeSpec The top level document node.*/doc: NodeSpec;/**A plain paragraph textblock. Represented in the DOMas a `<p>` element.*/paragraph: NodeSpec;/**A blockquote (`<blockquote>`) wrapping one or more blocks.*/blockquote: NodeSpec;/**A horizontal rule (`<hr>`).*/horizontal_rule: NodeSpec;/**A heading textblock, with a `level` attribute thatshould hold the number 1 to 6. Parsed and serialized as `<h1>` to`<h6>` elements.*/heading: NodeSpec;/**A code listing. Disallows marks or non-text inlinenodes by default. Represented as a `<pre>` element with a`<code>` element inside of it.*/code_block: NodeSpec;/**The text node.*/text: NodeSpec;/**An inline image (`<img>`) node. Supports `src`,`alt`, and `href` attributes. The latter two default to the emptystring.*/image: NodeSpec;/**A hard line break, represented in the DOM as `<br>`.*/hard_break: NodeSpec;
};
/**
[Specs](https://prosemirror.net/docs/ref/#model.MarkSpec) for the marks in the schema.
*/
declare const marks: {/**A link. Has `href` and `title` attributes. `title`defaults to the empty string. Rendered and parsed as an `<a>`element.*/link: MarkSpec;/**An emphasis mark. Rendered as an `<em>` element. Has parse rulesthat also match `<i>` and `font-style: italic`.*/em: MarkSpec;/**A strong mark. Rendered as `<strong>`, parse rules also match`<b>` and `font-weight: bold`.*/strong: MarkSpec;/**Code font mark. Represented as a `<code>` element.*/code: MarkSpec;
};
/**
This schema roughly corresponds to the document schema used by
[CommonMark](http://commonmark.org/), minus the list elements,
which are defined in the [`prosemirror-schema-list`](https://prosemirror.net/docs/ref/#schema-list)
module.To reuse elements from this schema, extend or read from its
`spec.nodes` and `spec.marks` [properties](https://prosemirror.net/docs/ref/#model.Schema.spec).
*/
declare const schema: Schema<"blockquote" | "image" | "text" | "doc" | "paragraph" | "horizontal_rule" | "heading" | "code_block" | "hard_break", "link" | "code" | "em" | "strong">;export { marks, nodes, schema };

其中两部分内容,nodes marks,简单理解两者的关系,node 代表文档中的某种节点,主要用来渲染内容,mark 更多为一些附加样式的定义,如上面的文本加粗,以及文本颜色,背景色,是否斜体等,这些 marks 是可以附加在 node 上的.

其中可见官方模块定义了一个简单的 schema。你可以直接拿来使用,或者扩展它,亦或者仅仅是抄其中的一些节点和 mark 的配置对象然后应用到新的 schema 中。

自定义schema

// model.ts 文件命名暂时还是以 mvc 模式命名,方便理解,实际中 命名为 schema.ts 更好
import { Schema } from 'prosemirror-model';export const schema = new Schema({nodes: {// 整个文档doc: {// 文档内容规定必须是 block 类型的节点(block 与 HTML 中的 block 概念差不多) `+` 号代表可以有一个或多个(规则类似正则)content: 'block+'},// 文档段落paragraph: {// 段落内容规定必须是 inline 类型的节点(inline 与 HTML 中 inline 概念差不多), `*` 号代表可以有 0 个或多个(规则类似正则),你也可以使用类似正则表达式的范围,例如{2}(“正好两个”){1, 5}(“一到五个”)或{2,}(“两个或更多”)在节点名称之后。content: 'inline*',// 分组:当前节点所在的分组为 block,意味着它是个 block 节点group: 'block',// 渲染为 html 时候,使用 p 标签渲染,第二个参数 0 念做 “洞”,类似 vue 中 slot 插槽的概念,// 证明它有子节点,以后子节点就填充在 p 标签中toDOM: () => {return ['p', 0]},// 从别处复制过来的富文本,如果包含 p 标签,将 p 标签序列化为当前的 p 节点后进行展示parseDOM: [{tag: 'p'}]},// 段落中的文本text: {// 当前处于 inline 分株,意味着它是个 inline 节点。代表输入的文本group: 'inline'},// 1-6 级标题heading: {// attrs 与 vue/react 组件中 props 的概念类似,代表定义当前节点有哪些属性,这里定义了 level 属性,默认值 1attrs: {level: {default: 1}},// 当前节点内容可以是 0 个或多个 inline 节点content: 'inline*',// 当前节点分组为 block 分组group: 'block',// defining: 特殊属性,为 true 代表如果在当前标签内(以 h1 为例),全选内容,直接粘贴新的内容后,这些内容还会被 h1 标签包裹// 如果为 false, 整个 h1 标签(包括内容与标签本身)将会被替换为其他内容,删除亦如此。// 还有其他的特殊属性,后续细说defining: true,// 转为 html 标签时,根据当前的 level 属性,生成对应的 h1 - h6 标签,节点的内容填充在 h 标签中(“洞”在)。toDOM(node) {const tag = `h${node.attrs.level}`return [tag, 0]},// 从别处复制进来的富文本内容,根据标签序列化为当前 heading 节点,并填充对应的 level 属性parseDOM: [{tag: "h1", attrs: {level: 1}},{tag: "h2", attrs: {level: 2}},{tag: "h3", attrs: {level: 3}},{tag: "h4", attrs: {level: 4}},{tag: "h5", attrs: {level: 5}},{tag: "h6", attrs: {level: 6}}],}},// 除了上面定义 node 节点,一些富文本样式,可以通过 marks 定义marks: {// 文本加粗strong: {// 对于加粗的部分,使用 strong 标签包裹,加粗的内容位于 strong 标签内(这里定义的 0 与上面一致,也念做 “洞”,也类似 vue 中的 slot)toDOM() {return ['strong', 0]},// 从别的地方复制过来的富文本,如果有 strong 标签,则被解析为一个 strong markparseDOM: [{ tag: 'strong' },],},// 下划线underline: {parseDOM: [{ tag: 'u' },{style: 'text-decoration',getAttrs: value => value === 'underline' && null},{style: 'text-decoration-line',getAttrs: value => value === 'underline' && null},],toDOM: () => ['span', { style: 'text-decoration: underline;' }, 0],}}
})

实现文本加粗、下划线

import { toggleMark } from 'prosemirror-commands'
...
/**
editorView就是 new EditorView 的实例
*/
// 加粗
toggleMark(editorView.state.schema.marks.strong)(editorView.state, editorView.dispatch)
...
// 下划线
toggleMark(editorView.state.schema.marks.underline)(editorView.state, editorView.dispatch)

prosemirror 的插件系统Plugins

插件用于以各种方式扩展编辑器和编辑器状态的行为。有些相对简单,比如将键映射插件将操作绑定到键盘输入。其他的则更复杂,比如历史插件通过观察事务并存储它们的逆操作来实现撤销历史,以防用户想要撤销它们。

让我们将这两个插件添加到我们的编辑器中以获得撤销/重做功能:

// (省略重复的导入)
import {undo, redo, history} from "prosemirror-history"
import {keymap} from "prosemirror-keymap"let state = EditorState.create({schema,plugins: [history(),keymap({"Mod-z": undo, "Mod-y": redo})]
})
let view = new EditorView(document.body, {state})

插件在创建状态时注册(因为它们可以访问状态事务)。在为这个启用历史记录的状态创建视图后,您将能够按下 Ctrl-Z(或在 OS X 上按 Cmd-Z)来撤销您上次的更改。

相关文章:

富文本编辑器的第三方库ProseMirror

如果0-1的开发一个富文本编辑器&#xff0c;成本还是非常高的&#xff0c;里面很多坑要踩&#xff0c;市面上很多库可以帮助我们搭建一个富文本编辑器&#xff0c;ProseMirror就是其中最流行的库之一。 认识ProseMirror ProseMirror 提供了一套工具和概念&#xff0c;用于构建…...

理解IP四元组与网络五元组:网络流量的“身份证”

理解IP四元组与网络五元组&#xff1a;网络流量的“身份证” 在现代网络通信中&#xff0c;IP四元组和网络五元组是流量识别、连接追踪、安全策略等核心的基础概念。理解这些“元组”不仅能够帮助我们更好地设计网络架构、排查故障&#xff0c;还能为安全与运维策略的落地提供…...

ROS2:话题通信CPP语法速记

目录 发布方实现流程重点代码 订阅方实现流程重点代码 参考代码示例发布方代码订阅方代码 发布方实现流程 包含头文件&#xff08;rclcpp.hpp与[interfaces_pkg].hpp&#xff09;初始化ROS2客户端&#xff08;rclcpp::init&#xff09;自定义节点类(创建发布实例&#xff0c;伺…...

码蹄集——直线切平面、圆切平面

MT1068 直线切平面 思路&#xff1a; 则 #include<bits/stdc.h> using namespace std;int main( ) {int n;cin>>n;cout<<n*(n1)/21;return 0; } MT1069圆切平面 n个圆最多把平面分成几部分&#xff1f;输入圆的数量N&#xff0c;问最多把平面分成几块。比如…...

2025年游戏行业DDoS攻防指南:智能防御体系构建与实战策略

2025年&#xff0c;游戏行业在全球化扩张与技术创新浪潮中&#xff0c;正面临前所未有的DDoS攻击威胁。攻击规模从T级流量到AI驱动的精准渗透&#xff0c;攻击手段从传统网络层洪水到混合型应用层打击&#xff0c;防御体系已从“被动应对”转向“智能博弈”。本文将结合最新攻击…...

LightGBM算法原理及Python实现

一、概述 LightGBM 由微软公司开发&#xff0c;是基于梯度提升框架的高效机器学习算法&#xff0c;属于集成学习中提升树家族的一员。它以决策树为基学习器&#xff0c;通过迭代地训练一系列决策树&#xff0c;不断纠正前一棵树的预测误差&#xff0c;逐步提升模型的预测精度&a…...

Nvidia发布Parakeet V2,一款新的开源自动语音识别模型

Nvidia 发布 Parakeet V2&#xff0c;一款新的开源自动语音识别 AI&#xff0c;核心亮点&#xff1a;一秒钟转录一小时的音频&#xff1b;Open ASR 上的顶级模型&#xff0c;击败了 ElevenLabs 的 Scribe 和 OpenAI 的 Whisper&#xff1b;6.05% 的单词错误率&#xff1b;CC-BY…...

浅析MySQL 的 **触发器(Trigger)** 和 **存储过程(Stored Procedure)原理及优化建议

MySQL 的 触发器(Trigger) 和 存储过程(Stored Procedure) 是数据库中用于实现业务逻辑的重要机制,它们的原理和使用方式不同,适用于不同的场景。 一、基本概念与原理 特性触发器(Trigger)存储过程(Stored Procedure)定义在表上定义,当特定事件(INSERT/UPDATE/DELE…...

网页版部署MySQL + Qwen3-0.5B + Flask + Dify 工作流部署指南

1. 安装MySQL和PyMySQL 安装MySQL # 在Ubuntu/Debian上安装 sudo apt update sudo apt install mysql-server sudo mysql_secure_installation# 启动MySQL服务 sudo systemctl start mysql sudo systemctl enable mysql 安装PyMySQL pip install pymysql 使用 apt 安装 My…...

人工智能与智能合约:如何用AI优化区块链技术中的合约执行?

引言&#xff1a;科技融合的新风口 区块链和人工智能&#xff0c;是当前最受瞩目的两大前沿技术。一个以去中心化、可溯源的机制重构信任体系&#xff0c;另一个以智能学习与决策能力重塑数据的价值。当这两项技术相遇&#xff0c;会碰撞出什么样的火花&#xff1f; 智能合约作…...

如何提升丢包网络环境下的传输性能:从 TCP 到 QUIC,再到 wovenet 的实践

在现代互联网环境中&#xff0c;稳定、可靠的网络连接对各种在线应用至关重要。然而&#xff0c;理想情况往往难以实现&#xff0c;特别是在以下一些典型场景中&#xff0c;网络丢包&#xff08;packet loss&#xff09; 常常发生&#xff1a; 一、常见的网络丢包场景 跨境通…...

Python 中的数据结构介绍

Python 是一种功能强大的编程语言&#xff0c;它内置了多种数据结构&#xff0c;以便用户能够方便、高效地存储、处理和访问数据。数据结构是组织和存储数据的方式&#xff0c;不同的数据结构适用于不同的应用场景。掌握 Python 中的基本数据结构&#xff0c;可以使代码更加简洁…...

数据中台架构设计

数据中台分层架构 数据采集层 数据源类型&#xff1a;业务系统&#xff08;ERP、CRM&#xff09;、日志、IoT 设备、第三方 API 等。采集方式&#xff1a; 实时采集&#xff1a;Kafka、Flink CDC&#xff08;变更数据捕获&#xff09;。离线采集&#xff1a;Sqoop、DataX&…...

基于SpringBoot网上书店的设计与实现

pom.xml配置文件 1. 项目基本信息(没什么作用) <groupId>com.spring</groupId> <!--项目组织标识&#xff0c;通常对应包结构--> <artifactId>boot</artifactId> <!--项目唯一标识--> <version>0.0.1-SNAPSHOT</ve…...

Vue3路由模式为history,使用nginx部署上线后刷新404的问题

一、问题 在使用nginx部署vue3的项目后&#xff0c;发现正常时可以访问的&#xff0c;但是一旦刷新&#xff0c;就是出现404的情况 二、解决方法 1.vite.config.js配置 在vite.config.js中加入以下配置 export default defineConfig(({ mode }) > {const isProduction …...

从单机到生产:Kubernetes 部署方案全解析

&#x1f680; 从单机到生产&#xff1a;Kubernetes 部署方案全解析 &#x1f310; Kubernetes&#xff08;k8s&#xff09;是当今最流行的容器编排系统&#xff0c;广泛应用于开发、测试和生产环境。但不同的使用场景对集群规模、高可用性和资源需求有不同的要求。本文将带你…...

redis大全

1 redis安装和简介 基于ubuntu系统的安装 sudo apt update sudo apt install redis##包安装的redis 没有默认配置文件 启动 redis-server /path/to/your/redis.confredis-cliRedis 默认是没有设置用户和密码的&#xff0c;即可以无密码访问 设置密码的方法&#xff1a;可以通…...

C#经典算法面试题

C#经典算法面试题 递归算法 C#递归算法计算阶乘的方法 一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。1808年,基斯顿卡曼引进这个表示法。 原理:亦即n!=123…(n-1)n。阶乘亦可以递归方式定义:0!=1,n!=(n-1)!n。…...

cephadm部署ceph集群

一、什么是Ceph? ceph是一个统一的、分布式的存储系统&#xff0c;设计初衷式提供较好的性能(io)、可靠性(没有单点故障)和可扩展性(未来可以理论上无限扩展集群规模)&#xff0c;这三点也是集群架构所追求的。 “统一的”:意味着Ceph可以一套存储系统同时提供对象存储、块存…...

c#OdbcDataReader的数据读取

先有如下c#示例代码&#xff1a; string strconnect "DSNcustom;UIDsa;PWD123456;" OdbcConnection odbc new OdbcConnection(strconnect); odbc.Open(); if (odbc.State ! System.Data.ConnectionState.Open) { return; } string strSql "select ID from my…...

代码随想录训练营第十八天| 150.逆波兰表达式求值 239.滑动窗口最大值 347.前k个高频元素

150.逆波兰表达式求值&#xff1a; 文档讲解&#xff1a;代码随想录|150.逆波兰表达式求值 视频讲解&#xff1a;栈的最后表演&#xff01; | LeetCode&#xff1a;150. 逆波兰表达式求值_哔哩哔哩_bilibili 状态&#xff1a;已做出 思路&#xff1a; 这道题目是让我们按照逆波…...

数据中台产品功能介绍

在数字化转型浪潮中&#xff0c;数据中台作为企业数据管理与价值挖掘的核心枢纽&#xff0c;整合分散数据资源&#xff0c;构建统一的数据管理与服务体系。本数据中台产品涵盖数据可视化、数据建设、数据治理、数据采集开发和系统管理五大平台&#xff0c;以丰富且强大的功能模…...

第四章-初始化Direct3D

首先我们需要一个错误检测和抛出机制 inline std::string ToString(const HRESULT& result) {char buffer[256];sprintf_s(buffer, "error code : 0x%08X\n", result);return std::string(buffer); }class MyException : public std::runtime_error { public:My…...

实操3:6位数码管

文章目录 文章介绍仿真图原来的仿真代码教学用开发板段选和位选对应引脚思考题实物图 文章介绍 对应“案例5_3: 6位数码管显示0或者1【静态显示】” 跳转链接 要求&#xff1a;实现开发板的6位数码管同时显示0或者1 仿真图 原来的仿真代码 #include<reg52.h> // 头文件…...

常识补充(NVIDIA NVLink技术:打破GPU通信瓶颈的革命性互联技术)

文章目录 **引言&#xff1a;为什么需要NVLink&#xff1f;**1. NVLink技术概述1.1 什么是NVLink&#xff1f;1.2 NVLink的发展历程 2. NVLink vs. PCIe&#xff1a;关键对比2.1 带宽对比2.2 延迟对比 3. NVLink的架构与工作方式3.1 点对点直连&#xff08;P2P&#xff09;3.2 …...

openwrt 使用quilt 打补丁(patch)

1,引入 本文简单解释如何在OpenWRT下通过quilt命令打补丁--patch&#xff0c;也可查看openwrt官网提供的文档 2&#xff0c;以下代码通过编译net-snmp介绍 ① 执行编译命令之后&#xff0c;进入build_dir的net-snmp-5.9.1目录下&#xff0c;改目录即为snmp最终编译的目录了 /…...

NVIDIA Halos:智能汽车革命中的全栈式安全系统

高级辅助驾驶行业正面临一个尴尬的"安全悖论"——传感器数量翻倍的同时&#xff0c;事故率曲线却迟迟不见明显下降。究其原因&#xff0c;当前行业普遍存在三大技术困局&#xff1a; 碎片化安全方案 传统方案就像"打补丁"&#xff0c;激光雷达厂商只管点云…...

k8s术语之service

Kubernetes在设计之初就充分考虑了针对容器的服务发现与负载均衡机制&#xff0c;提供了Service资源&#xff0c;并通过kube-proxy配合cloud provider 来适应不同的用于场景。随着kubernetes用户的激增&#xff0c;用户场景的不断丰富&#xff0c;又产生了一些新的负载均衡机制…...

C/C++工程中的Plugin机制设计与Python实现

C/C工程中的Plugin机制设计与Python实现 1. Plugin机制设计概述 在C/C工程中实现Plugin机制通常需要以下几个关键组件&#xff1a; Plugin接口定义&#xff1a;定义统一的接口规范动态加载机制&#xff1a;运行时加载动态库注册机制&#xff1a;Plugin向主程序注册自己通信机…...

RNN 与 CNN:深度学习中的两大经典模型技术解析

在人工智能和深度学习领域,RNN(Recurrent Neural Network,循环神经网络) 和 CNN(Convolutional Neural Network,卷积神经网络) 是两种非常重要的神经网络结构。 它们分别擅长处理不同类型的数据,在自然语言处理、计算机视觉等多个领域中发挥着关键作用。 本文将从原理…...

多模态训练与微调

1.为什么多模态模型需要大规模预训练&#xff1f; 多模态模型需要大规模预训练的原因包括&#xff1a; (1)数据丰富性&#xff1a;大规模预训练可以暴露模型于丰富的数据&#xff0c;提升其泛化能力。 (2)特征提取&#xff1a;通过预训练&#xff0c;模型能够学习到有效的特…...

【HDLBits刷题】Verilog Language——1.Basics

目录 一、题目与题解 1.Simple wire&#xff08;简单导线&#xff09; 2.Four wires&#xff08;4线&#xff09; 3.Inverter&#xff08;逆变器&#xff08;非门&#xff09;&#xff09; 4.AND gate &#xff08;与门&#xff09; 5. NOR gate &#xff08;或非门&am…...

基于深度学习的图像识别技术:从原理到应用

前言 在当今数字化时代&#xff0c;图像识别技术已经渗透到我们生活的方方面面&#xff0c;从智能手机的人脸解锁功能到自动驾驶汽车对交通标志的识别&#xff0c;再到医疗影像诊断中的病变检测&#xff0c;图像识别技术正以其强大的功能和广泛的应用前景&#xff0c;改变着我们…...

【coze】手册小助手(提示词、知识库、交互、发布)

【coze】手册小助手&#xff08;提示词、知识库、交互、发布&#xff09; 1、创建智能体2、添加提示词3、创建知识库4、测试智能体5、添加交互功能6、发布智能体 1、创建智能体 2、添加提示词 # 角色 你是帮助用户搜索手册资料的AI助手 ## 工作流程 ### 步骤一:查询知识库 1.每…...

【教学类-34-11】20250506异形拼图块(圆形、三角、正方,椭圆/半圆)的中2班幼儿偏好性测试(HTML)

背景介绍 最近在写一份工具运用报告,关于剪纸难度的。所以设计了蝴蝶描边系列和异形凹凸角拼图。 【教学类-102-20】蝴蝶三色图作品2——卡纸蝴蝶“满格变形图”(滴颜料按压对称花纹、原图切边后变形放大到A4横版最大化)-CSDN博客文章浏览阅读609次,点赞8次,收藏3次。【…...

Debian系统上PostgreSQL15版本安装调试插件及DBeaver相应配置

PostgreSQL所在Debian Linux服务器安装插件程序 在PostgreSQL数据库服务器Debian系统上执行以下命令&#xff0c;安装插件pldebugger: sudo apt install postgresql-15-pldebugger #上面这一条命令运行完好像pgsql服务自动重启了&#xff0c;看日志的样子是这样的&#xff0c…...

GD32F470+CH395Q

tcp_client配置 第一步&#xff1a;资料下载 以太网协议栈芯片 CH395 - 南京沁恒微电子股份有限公司 第二步&#xff1a;准备工程 &#xff08;1&#xff09; 首先准备一个编译无报错、可以正常打印和延时的工程文件&#xff0c;官方例程采用STM32F1芯片&#xff0c;但本文…...

解决Hyper-V无法启动Debian 12虚拟机

问题 有时&#xff0c;我们会想要在Hyper-V中运行Debian12。我们想利用该系统的ISO镜像文件安装一个全新的虚拟机。 然而&#xff0c;当我们在Hyper-V中创建了一个2代虚拟机、添加了Debian 12的网络安装&#xff08;Netinst&#xff09;ISO作为最先启动的介质时&#xff0c;Hy…...

linux redis 设置密码以及redis拓展

redis拓展:http://pecl.php.net/package/redis 在服务器上&#xff0c;这里以linux服务器为例&#xff0c;为redis配置密码。 需要永久配置密码的话就去redis.conf的配置文件中找到requirepass这个参数&#xff0c;如下配置&#xff1a; 修改redis.conf配置文件 # requirepass …...

uniapp app 端获取陀螺仪数据的实现攻略

在 uniapp 开发中&#xff0c;uni.startGyroscope在 app 端并不被支持&#xff0c;这给需要获取陀螺仪数据的开发者带来了挑战。不过&#xff0c;借助 Native.js&#xff0c;我们能调用安卓原生代码实现这一需求。接下来&#xff0c;就为大家详细介绍实现步骤&#xff0c;并附上…...

第三节:Vben Admin 最新 v5.0 对接后端登录接口(下)

文章目录 前言一、处理请求头Authorization二、/auth/user/info 接口前端接口后端接口三、/auth/codes 接口1.前端2.后端四、测试接口前言 上一节内容,实现了登录的/auth/login 接口,但是登陆没有完成,还需要完成下面两个接口。才能完成登录。 一、处理请求头Authorizatio…...

标题:基于自适应阈值与K-means聚类的图像行列排序与拼接处理

摘要&#xff1a; 本文提出了一种基于自适应阈值和K-means聚类的图像行列排序与拼接方法。通过对灰度图像的自适应二值化处理&#xff0c;计算并分析图像的左右边距&#xff0c;从而确定图像的行数与列数。通过对图像进行特征提取&#xff0c;并使用K-means聚类进行排序&#…...

修改磁盘权限为管理员

1.右击需要修改的磁盘&#xff0c;点击属性 然后一路点击确定 已经修改好了...

P1782 旅行商的背包 Solution

Description 有一个体积为 C C C 的背包和若干种物品. 前 n n n 种物品&#xff0c;第 i i i 种体积为 v i v_i vi​&#xff0c;价值 w i w_i wi​&#xff0c;有 d i d_i di​ 件. 后 m m m 种物品&#xff0c;每种对应一个函数 f ( x ) a i x 2 b i x c i f(x)a…...

Acrel-EIoT 能源物联网云平台在能耗监测系统中的创新设计

摘要 随着能源管理的重要性日益凸显&#xff0c;能耗监测系统成为实现能源高效利用的关键手段。本文详细介绍了基于安科瑞Acrel-EIoT能源物联网云平台的能耗监测系统的设计架构与应用实践。该平台采用分层分布式结构&#xff0c;涵盖感知层、网络层、平台层和应用层&#xff0…...

乘法逆元【费马小定理+扩展欧几里得】

目录 模运算性质费马小定理乘法逆元扩展欧几里得算法随机栈 模运算性质 费马小定理 a,b互质&#xff1a;gcd(a,b)1 乘法逆元 a,b互质,满足a*x同余1(mod b),x是a模b的乘法逆元&#xff0c;记作a的-1次方。 扩展欧几里得算法 求axbygcd(a,b)的一组(x,y). 随机栈 题目来源&…...

Linux进程间通信(上)(21)

文章目录 前言一、什么是进程间通信&#xff1f;概念目的本质分类 二、管道什么是管道匿名管道匿名管道的原理pipe函数匿名管道使用步骤管道读写规则管道的特点管道的四种特殊情况管道的大小 总结 前言 本篇出得有点慢&#xff0c;因为我在这里更换了我的开发环境   不再使用…...

力扣面试150题--对称二叉树

Day 41 题目描述 做法 原理&#xff1a;拆分为根节点的左右两棵子树&#xff0c;比较左子树的右和右子树的左&#xff0c;左子树的左和右子树的右 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode righ…...

深度学习系统学习系列【6】之深度学习技巧

文章目录 数据集准备数据集扩展数据预处理1. 0均值&#xff08;Zero Centralization&#xff09;代码实现 2. 归一化&#xff08;Normalization&#xff09;代码实现 3. 主成分分析&#xff08;Principal Component Analysis, PCA&#xff09;实现步骤代码实现 4. 白化&#xf…...

vue项目中渲染markdown并处理报错

前言&#xff1a;想在vue项目中渲染markdown并处理报错问题 有以下几种方式&#xff1a; 1、使用第三方Markdown插件 2、通过Markdown转HTML工具 3、使用Vue组件处理Markdown 一、首先第一种&#xff1a;使用第三方Markdown插件 安装vue-markdown插件 或者 markdown-it&#xf…...