Node.js入门指南(五)

目录

MongoDB

介绍

下载与启动

命令行交互

Mongoose

代码模块化

图形化管理工具


hello,大家好!上一篇文章我们介绍了express框架,这一篇文字主要介绍MongoDB。来对数据进行存储以及操作。

MongoDB

介绍

各位小伙伴应该多多少少都有接触到数据库,比如MySQL、SqlServer或者Oracle等。同样的MongoDB也是一种数据库,相比于其他的数据库,它操作语法与 JavaScript 类似,容易上手,学习成本低。MongoDB 是一个基于分布式文件存储的数据库,官方地址 。

Mongodb 中有三个重要概念需要掌握:

1️⃣数据库(database) 数据库是一个数据仓库,数据库服务下可以创建很多数据库,数据库中可以存放很多集合。

2️⃣集合(collection) 集合类似于 JS 中的数组,在集合中可以存放很多文档。

3️⃣文档(document) 文档是数据库中的最小单位,类似于 JS 中的对象。

{
     "accounts": [
    {
        "id": "3-YLju5f3",
        "title": "买电脑",
        "time": "2023-02-08",
        "type": "-1",
        "account": "5500",
        "remarks": "为了上网课"
    },
    {
        "id": "mRQiD4s3K",
        "title": "发工资",
        "time": "2023-02-19",
        "type": "1",
        "account": "4396",
        "remarks": "终于发工资啦!~~"
    }
       ],
    "users":[
    {
        "id": 1,
        "name": "zhangsan",
        "age":18
    }
    ]
}

大家可以通过 JSON 文件来理解 Mongodb 中的概念 一个JSON 文件 好比是一个数据库 ,一个 Mongodb 服务下可以有 N 个数据库, JSON 文件中的 一级属性的数组值好比是集合, 数组中的对象好比是文档,对象中的属性有时也称之为字段。

下载与启动

那我们一起来安装MongoDB吧!建议选择 zip 类型, 通用性更强。配置步骤如下:

1️⃣将压缩包移动到 C:\Program Files 下,然后解压。

2️⃣创建 C:\data\db 目录,mongodb 会将数据默认保存在这个文件夹。

3️⃣将 bin 目录配置到环境变量 Path 中,为了方便后续方便使用 mongod 命令。

4️⃣以 mongodb 中 bin 目录作为工作目录,启动命令行,运行命令 mongod

若看到的 waiting for connections 则表明服务 已经启动成功。

5️⃣再以 mongodb 中 bin 目录作为工作目录,启动命令行,使用 mongo 命令连接本机的 mongodb 服务。

注意:千万不要选中服务端窗口的内容 ,选中会停止服务,可以敲回车取消选中。

命令行交互

再来介绍一下,MongoDB中的一些命令行交互,包括数据库命令,集合的相关命令以及文档的相关命令。不过在后续用的不多,因此简单体验一下即可。

数据库命令功能
show dbs
显示所有的数据库
use 数据库名
切换到指定的数据库,如果数据库不存在会自动创建数据库
db
显示当前所在的数据库
use 库名
db.dropDatabase()
删除当前数据库
集合命令功能
db . createCollection ( '集合名称' )
创建集合
show collections
显示当前数据库中的所有集合
db. 集合名 .drop()
删除某个集合
db. 集合名 .renameCollection('newName')
重命名集合
文档命令功能
db . 集合名 . insert ( 文档对象 );
插入文档
db. 集合名 .find( 查询条件 )
查询文档
db . 集合名 . update ( 查询条件 , 新的文档 )
db . 集合名 . update ({ name : ' 张三 ' },{ $set :{ age : 19 }})
更新文档
db. 集合名 .remove( 查询条件 )
删除文档

在插入文档对象之后, mongodb会为该对象自动生成的唯一编号,用来唯一标识文档。

Mongoose

我们在前介绍命令行交互的时候都是在命令行窗口中进行与mongodb数据库进行交互,会比较麻烦,因此就引入了Mongoose,它是一个对象文档模型库,官网 http://www.mongoosejs.net/,方便使用代码操作 mongodb 数据库。接下来我们来使用mongoose来进行连接数据库以及进行相应的操作。

首先我们需要先对一个文件夹进行npm init初始化,因此mongoose也是一个包。然后使用npm i mongoose来进行下载Mongoose。然后导入mongoose,并连接mongodb服务,包括域名端口号,端口号默认是27017可写可不写,然后加上数据库的名称。(若数据库不存在,它会自动创建对应的数据库)。然后设置回调来提示连接的状态。

//导入mongoose
const mongoose=require('mongoose');
//连接mongodb服务
mongoose.connect('mongodb://127.0.0.1:27017/bilibili');
//设置连接成功的回调
mongoose.connection.once('open',()=>{
    console.log('连接成功');

});
//设置连接错误的回调
mongoose.connection.on('error',()=>{
    console.log('连接失败');

});
//设置连接关闭的回调
mongoose.connection.on('close',()=>{
    console.log('连接关闭');

});
//关闭mongodb连接
setTimeout(()=>{
    mongoose.disconnect();
},2000)

数据库连接成功之后,我们使用mongoose向数据库插入文档。首先需要规定文档的结果对象,对象的属性名以及它对应的数值类型,截止创建文档模型对象,最后插入文档。使用.then()以及.catch接受成功以及失败的结果。最后可以use bilibili -> show collections -> db.books.find()。看数据库是否添加成功。插入的文档(对象)会默认添加两个属性,一个为_id,用于唯一表示,一个为_v,表示版本号。

//导入mongoose
const mongoose=require('mongoose');
//连接mongodb服务
mongoose.connect('mongodb://127.0.0.1:27017/bilibili');
//设置连接成功的回调
mongoose.connection.once('open',()=>{
    console.log('连接成功');
    //创建文档结构对象
    let BookSchema=new mongoose.Schema({
        title:String,
        author:String,
        price:Number
    });
    //创建文档模型对象
    let BookModel=mongoose.model('book',BookSchema);
    //插入文档
    BookModel.create({
        title:'西游记',
        author:'吴承恩',
        price:19.9
    }).then(data=>{
        console.log(data);
        mongoose.disconnect();
    }).catch(err=>{
        console.log(err);
    })

});
//设置连接错误的回调
mongoose.connection.on('error',()=>{
    console.log('连接失败');

});
//设置连接关闭的回调
mongoose.connection.on('close',()=>{
    console.log('连接关闭');

});

接下来介绍一下mongoose的字段类型,上面的例子我们已经使用了String以及Number两种数据类型了。除了上面的两种还有以下的几种数据类型:

类型
描述
String
字符串
Number数字
Boolean布尔值
Array数组,也可以使用 [] 来标识
Date日期
BufferBuffer 对象
Mixed任意类型,需要使用 mongoose.Schema.Types.Mixed 指定
ObjectId对象 ID,需要使用 mongoose.Schema.Types.ObjectId 指定
Decimal128高精度数字,需要使用 mongoose.Schema.Types.Decimal128 指定

Buffer类型主要是接收一些文件的,比如图片视频等。但是一般这些都放在静态资源文件中,比较少地存放在数据库中。一般数据库存放的是对应的文件地址,再通过地址找到对应的文件。这样效率会提高。其他的类型可以自行操作,都比较容易理解。

在我们插入文档数据时,我们还可以设置相应的约束,即字段值验证,Mongoose 有一些内建验证器,可以对字段值进行验证。

required:必填项。该属性如设置为true,是意味这对应的值不能为空。default: 默认值,但某个元素添加的时候没有设置对应的值,那么它就会使用默认的字,若添加时有值,它会使用添加的值。enum: [ ] ,表示枚举值,设置的值必须是数组中的某一个值,不然会报错。unique:表示唯一值,某个属性的值只能添加一次,后面再添加会重复,添加失败。不过在使用该属性时要确保自己的集合是新创建的才有效果。

接下来使用mongoose来实现文档的删除,删除可以是删除一条数据,也可以是实现批量地删除数据。首先我们先向数据库批量地插入数据,然后再有数据来给我们进行删除操作,插入部分演示如何实现批量地插入。上面代码只实现了单条数据的插入。

//1. 安装 mongoose
//2. 导入 mongoose
const mongoose = require('mongoose');

//设置 strictQuery 为 true
mongoose.set('strictQuery', true);

//3. 连接 mongodb 服务                        数据库的名称
mongoose.connect('mongodb://127.0.0.1:27017/bilibili');

//4. 设置回调
// 设置连接成功的回调  once 一次   事件回调函数只执行一次
mongoose.connection.once('open', () => {
  //5. 创建文档的结构对象
  //设置集合中文档的属性以及属性值的类型
  let BookSchema = new mongoose.Schema({
    name: String,
    author: String,
    price: Number,
    is_hot: Boolean
  });

  //6. 创建模型对象  对文档操作的封装对象
  let BookModel = mongoose.model('novel', BookSchema);

  //7. 新增
  BookModel.insertMany([{
    name: '西游记',
    author: '吴承恩',
    price: 19.9,
    is_hot: true
  }, {
    name: '红楼梦',
    author: '曹雪芹',
    price: 29.9,
    is_hot: true
  }, {
    name: '三国演义',
    author: '罗贯中',
    price: 25.9,
    is_hot: true
  }, {
    name: '水浒传',
    author: '施耐庵',
    price: 20.9,
    is_hot: true
  }, {
    name: '活着',
    author: '余华',
    price: 19.9,
    is_hot: true
  }, {
    name: '狂飙',
    author: '徐纪周',
    price: 68,
    is_hot: true
  }, {
    name: '大魏能臣',
    author: '黑男爵',
    price: 9.9,
    is_hot: false
  },
  {
    name: '知北游',
    author: '洛水',
    price: 59,
    is_hot: false
  },{
    name: '道君',
    author: '跃千愁',
    price: 59,
    is_hot: false
  },{
    name: '七煞碑',
    author: '游泳的猫',
    price: 29,
    is_hot: false
  },{
    name: '独游',
    author: '酒精过敏',
    price: 15,
    is_hot: false
  },{
    name: '大泼猴',
    author: '甲鱼不是龟',
    price: 26,
    is_hot: false
  },
  {
    name: '黑暗王者',
    author: '古羲',
    price: 39,
    is_hot: false
  },
  {
    name: '不二大道',
    author: '文刀手予',
    price: 89,
    is_hot: false
  },
  {
    name: '大泼猴',
    author: '甲鱼不是龟',
    price: 59,
    is_hot: false
  },
  {
    name: '长安的荔枝',
    author: '马伯庸',
    price: 45,
    is_hot: true
  },
  {
    name: '命运',
    author: '蔡崇达',
    price: 59.8,
    is_hot: true
  },
  {
    name: '如雪如山',
    author: '张天翼',
    price: 58,
    is_hot: true
  },
  {
    name: '三体',
    author: '刘慈欣',
    price: 23,
    is_hot: true
  },
  {
    name: '秋园',
    author: '杨本芬',
    price: 38,
    is_hot: true
  },
  {
    name: '百年孤独',
    author: '范晔',
    price: 39.5,
    is_hot: true
  },
  {
    name: '在细雨中呼喊',
    author: '余华',
    price: 25,
    is_hot: true
  },]).then(data=>{
    console.log(data);
    mongoose.disconnect();
  }).catch(err=>{
    console.log(err);
  });

});


// 设置连接错误的回调
mongoose.connection.on('error', () => {
  console.log('连接失败');
});

//设置连接关闭的回调
mongoose.connection.on('close', () => {
  console.log('连接关闭');
});

//1. 安装 mongoose
//2. 导入 mongoose
const mongoose = require('mongoose');

//设置 strictQuery 为 true
mongoose.set('strictQuery', true);

//3. 连接 mongodb 服务                        数据库的名称
mongoose.connect('mongodb://127.0.0.1:27017/bilibili');

//4. 设置回调
// 设置连接成功的回调  once 一次   事件回调函数只执行一次
mongoose.connection.once('open', () => {
  //5. 创建文档的结构对象
  //设置集合中文档的属性以及属性值的类型
  let BookSchema = new mongoose.Schema({
    name: String,
    author: String,
    price: Number,
    is_hot: Boolean
  });

  //6. 创建模型对象  对文档操作的封装对象
  let BookModel = mongoose.model('novel', BookSchema);

  //7.删除一条数据
  BookModel.deleteOne({_id:'6564996cdf9f7cab75d5e263'}).then(data=>{
    console.log(data);
  }).catch(err=>{
    console.log(err);
  })

//批量删除
BookModel.deleteMany({is_hot:false}).then(data=>{
    console.log(data);
  }).catch(err=>{
    console.log(err);
  })

});



// 设置连接错误的回调
mongoose.connection.on('error', () => {
  console.log('连接失败');
});

//设置连接关闭的回调
mongoose.connection.on('close', () => {
  console.log('连接关闭');
});

介绍了新增以及删除,接下来介绍如何实现数据的更新以及查询操作。数据的更新同样包括单条数据的更新以及数据的批量更新。更新的方法需要接受一个查询的条件以及需要修改的内容。

  //7.更新一条数据
  BookModel.updateOne({name:'红楼梦'},{price:9.9}).then(data=>{
    console.log(data);
  }).catch(err=>{
    console.log(err);
  })

//批量更新
BookModel.updateMany({author:'余华'},{is_hot:false}).then(data=>{
    console.log(data);
  }).catch(err=>{
    console.log(err);
  })

查询同样可以单条查询以及批量查询,还可以通过id来进行查询。当批量查询不传入参数时,会返回所有的数据。

//更新一条数据
  BookModel.findOne({name:'狂飙'}).then(data=>{
    console.log(data);
  }).catch(err=>{
    console.log(err);
  })
//根据 id 查询数据
BookModel.findById('6564996cdf9f7cab75d5e265').then(data=>{
    console.log(data);
  }).catch(err=>{
    console.log(err);
  })
//批量查询带条件
  BookModel.find({author:'余华'}).then(data=>{
    console.log(data);
  }).catch(err=>{
    console.log(err);
  })
//批量查询不带条件
BookModel.find().then(data=>{
    console.log(data);
  }).catch(err=>{
    console.log(err);
  })

当我们的查询不是简单的查询而是需要更加复杂的条件时,我们就需要使用到运算符,逻辑运算以及正则来进行条件的控制。

条件写法
>$gt
<$lt
>=$gte
<=$lte
!==$ne
$or
$and
正则 模糊查询
/要匹配的字符串/ 

  //价格小于20的图书
  BookModel.find({price:{$lt:20}}).then(data=>{
    console.log(data);
  }).catch(err=>{
    console.log(err);
  })

//曹雪芹或者余华的书
BookModel.find({$or:[{author:'曹雪芹'},{author:'余华'}]}).then(data=>{
    console.log(data);
  }).catch(err=>{
    console.log(err);
  })

//价格大于30 且小于70
BookModel.find({$and:[{price:{$gt:30}},{price:{$lt:70}}]}).then(data=>{
    console.log(data);
  }).catch(err=>{
    console.log(err);
  })

//正则,搜素带有三的书名
BookModel.find({name:/三/}).then(data=>{
    console.log(data);
  }).catch(err=>{
    console.log(err);
  })

BookModel.find({name:new RegExp('三')}).then(data=>{
    console.log(data);
  }).catch(err=>{
    console.log(err);
  })

对于我们查询出来的数据并不都是我们真正想要的效果,因此我们可以对数据进行个性化读取。那下面以字段筛选、数据排序以及数据截取三种方式来进行介绍。


  //设置字段 0:不要的字段  1:要的字段
  BookModel.find().select({name:1,author:1,_id:0}).exec().then(data=>{
    console.log(data);
  }).catch(err=>{
    console.log(err);
  })

//数据排序 1:升序  -1:倒序
BookModel.find().select({name:1,price:1,_id:0}).sort({price:1}).exec().then(data=>{
    console.log(data);
  }).catch(err=>{
    console.log(err);
  })

//数据截取 skip 跳过 limit 限定
BookModel.find().select({name:1,price:1,_id:0}).sort({price:1}).skip(3).limit(3).exec().then(data=>{
    console.log(data);
  }).catch(err=>{
    console.log(err);
  })

代码模块化

在实际的项目开发中,需要对代码进行模块化,让后期的维护更加地方便。思路就是将相同的可复用的代码单独地放置在一个文件中,并对其进行暴露,在需要用到的地方进行引入使用。将导入mongoose,连接mongodb服务,设置连接成功,失败以及关闭的回调,单独地放置在一个文件中。

module.exports = function (success, error) {
    //导入配置文件
    const {DBHOST,DBPOST,DBNAME}=require('../config/config');

    //导入mongoose
    const mongoose = require('mongoose');
    //连接mongodb服务
    mongoose.connect(`mongodb://${DBHOST}:${DBPOST}/${DBNAME}`);

    mongoose.connection.once('open', () => {
        success();

    })

    //设置连接错误的回调
    mongoose.connection.on('error', () => {
        error();

    });
    //设置连接关闭的回调
    mongoose.connection.on('close', () => {
        console.log('连接关闭');
    });
}

创建文档结构对象,创建文档模型对象也单独地放置在一个文件中。

const mongoose=require('mongoose');
//创建文档结构对象
let BookSchema = new mongoose.Schema({
    title: String,
    author: String,
    price: Number
});
//创建文档模型对象
let BookModel = mongoose.model('book', BookSchema);
//暴露模型对象
module.exports=BookModel;

同时也可以将连接服务的地址单独地放置在一个文件中,后续只需要修改该文件即可修改相应的域名端口号以及数据库名。

module.exports={
    DBHOST:'127.0.0.1',
    DBPOST:27017,
    DBNAME:'bilibili'
}

主文件进行导入即可。

//导入db文件
const db=require('./db/db');
//导入BookModel
const BookModel = require('./models/BookModel');

db(()=>{
   
    //插入文档
    BookModel.create({
        title:'西游记',
        author:'吴承恩',
        price:92
    }).then(data=>{
        console.log(data);
        // mongoose.disconnect();
    }).catch(err=>{
        console.log(err);
    })

},()=>{
    console.log('连接失败')
})

  

图形化管理工具

我们可以使用图形化的管理工具来对 Mongodb 进行交互,不需要再通过命令的方式来检查自己操作的数据是否生效,主要可以使用以下的两个工具,对应的下载地址如下:

Robo 3T 免费 https://github.com/Studio3T/robomongo/releases

Navicat 收费 https://www.navicat.com.cn/​​​​​​​

好啦,本文就先到这啦!感谢阅读,持续更新~~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JMeter---BeanShell实现接口前置和后置操作

在JMeter中&#xff0c;可以使用BeanShell脚本来实现接口的前置和后置操作。 下面是使用BeanShell脚本实现接口前置和后置操作的步骤&#xff1a; 1、在测试计划中添加一个BeanShell前置处理器或后置处理器。 右键点击需要添加前置或后置操作的接口请求&#xff0c;选择&quo…

使用com组件编辑word

一个普通的窗体应用&#xff0c;6个button using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; u…

西南科技大学电路分析基础实验A1(元件伏安特性测试 )

目录 一、实验目的 二、实验设备 三、预习内容(如:基本原理、电路图、计算值等) 1、测定线性电阻的伏安特性 2、二极管伏安特性测试 3、测定实际电压源的伏安特性 四、实验数据及结果分析(预习写必要实验步骤和表格) 1、测定线性电阻的伏安特性 2、二极管伏安特性测…

RT-DETR改进 | 2023 | InnerEIoU、InnerSIoU、InnerWIoU、InnerDIoU等二十余种损失函数

论文地址&#xff1a;官方Inner-IoU论文地址点击即可跳转 官方代码地址&#xff1a;官方代码地址-官方只放出了两种结合方式CIoU、SIoU 本位改进地址&#xff1a; 文末提供完整代码块-包括InnerEIoU、InnerCIoU、InnerDIoU等七种结合方式和其AlphaIoU变种结合起来可以达到二十…

JAVA进阶之路JVM-1:jvm基本组成、java程序执行过程、java程序的跨平台、静态编译器、jvm执行方式

JVM基本组成 当线上系统突然宕机&#xff0c;系统无法访问&#xff0c;甚至直接OOM&#xff1b; 线上系统响应速度太慢&#xff0c;优化系统性能过程中发现CPU占用过高&#xff0c;原因也许是因为JVM的GC次数过于频繁 因此&#xff0c;新项目上线&#xff0c;需要设置JVM的各…

算法-技巧-中等-寻找重复数,环形链表|,||

记录一下算法题的学习13 这次代码中运用到的技巧是「Floyd 判圈算法」&#xff08;又称龟兔赛跑算法&#xff09;&#xff0c;它是一个检测链表是否有环的算法 我们想象乌龟tortoise和兔子rabbit在链表上移动&#xff0c;乌龟爬的慢&#xff0c;兔子爬的快&#xff0c;当乌龟和…

Unity EventSystem的一些理解和使用

Unity的EventSystem是用于处理用户输入和交互的系统。它是Unity UI系统的核心组件之一&#xff0c;可以用于捕捉和分发各种事件&#xff0c;例如点击、拖拽、按键、射线等。 常用的属性和方法有以下这些&#xff1a; 属性&#xff1a; current: 获取当前的EventSystem实例。…

数据结构--->单链表

文章目录 链表链表的分类 单链表单链表的存储结构单链表主要实现的接口函数单链表尾插动态申请新节点单链表头插单链表的尾删单链表的头删在指定位置之前插入单链表查找插入 在指定位置之后插删除指定位置元素删除指定位置之后的元素顺序输出链表销毁单链表 顺序表和单链表的区…

随手写了个博客多平台发布脚本:Python自动发布文章到Wordpress

​ 引言 作为一名技术博主&#xff0c;提高博客发布效率是我们始终追求的目标。在这篇文章中&#xff0c;我将分享一个基于Python的脚本&#xff0c;能够实现博客多平台发布&#xff0c;具体来说&#xff0c;是自动发布文章到WordPress。通过这个简单而高效的脚本&#xff0c…

Android 单元测试初体验(二)-断言

[TOC](Android 单元测试初体验(二)-断言) 前言 当初在学校学安卓的时候&#xff0c;老师敢教学进度&#xff0c;翻到单元测试这一章节的时候提了两句&#xff0c;没有把单元测试当重点讲&#xff0c;只是说我们工作中几乎不会用到&#xff0c;果真在之前的几年工作当中我真的没…

人工智能与供应链行业融合:预测算法的通用化与实战化

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 让我们一起深入探索人工智能与供应链的融合&#xff0c;以及预测算法在实际应用中的价值&#xff01;&#x1f50d;&#x1f680; 文章目录 前言供应链预测算法的基本流程统计学习模型与机…

Gitea和Jenkins安装

Gitea Gitea&#xff1a;https://dl.gitea.com/gitea/1.21.0/ Jenkins&#xff1a;https://www.jenkins.io/download/ 数据库配置 可以参考官方文档-https://docs.gitea.cn/1.20/installation/database-prep&#xff0c;这里以MySQL作为讲解 MySQL 在数据库实例上&#xf…

LeetCode-面试题08.01 三步问题 C/C++实现 超详细思路及过程[E]

&#x1f388;归属专栏&#xff1a;深夜咖啡配算法 &#x1f697;个人主页&#xff1a;Jammingpro &#x1f41f;记录一句&#xff1a;摆了一个周末了&#xff0c;不能摆了&#xff0c;努力起来&#xff01;&#xff01; 文章目录 LeetCode-面试题08.01 三步问题&#x1f697;题…

SpringBoot : ch08 自动配置原理

前言 在现代的Java开发中&#xff0c;Spring Boot已经成为了一个备受欢迎的框架。它以其简化开发流程、提高效率和强大的功能而闻名&#xff0c;使得开发人员能够更加专注于业务逻辑的实现而不必过多地关注配置问题。 然而&#xff0c;你是否曾经好奇过Spring Boot是如何做到…

C++11线程以及线程同步

C11中提供的线程类std::thread,基于此类创建一个新的线程相对简单&#xff0c;只需要提供线程函数和线程对象即可 一.命名空间 this_thread C11 添加一个关于线程的命名空间std::this_pthread ,此命名空间中提供四个公共的成员函数&#xff1b; 1.1 get_id() 调用命名空间s…

识别验证码

背景 需求是要爬取某网站的数据, 已有账号密码, 但这个网站需要登录, 登录需要输入验证码 验证码样式如下 调研了Tesseract框架, 识别效果不佳. 后来使用ddddocr, 能正确识别. https://github.com/sml2h3/ddddocr 代码如下 def ocr():response requests.get(http://xxx/get…

【JavaScript】封装自己的JavaScript公共工具函数,并上传到npm中 进行下载

js公共方法封装方式都有哪些 全局函数 function greet(name) {console.log("Hello, " name "!"); }greet("Alice"); // 调用全局函数对象字面量 var utils {add: function(a, b) {return a b;},subtract: function(a, b) {return a - b;}…

使用opencv实现图片相似度检测

1.为什么学这个,我对图像处理非常感兴趣,我联想到海尔的指纹识别门锁是如何进行检测的,我在想不应该呀,单片机性能这么差,应该是使用了训练后的数据去检测图片的,如果我要实现草莓检测,知道它是不是草莓,我觉得单纯使用图片处理是不够的,我考虑过使用指纹模块来接触草莓从而实现…

芯片制程中温度的几种表示方法

在众多影响芯片制程的因素中&#xff0c;温度控制被视为一项至关重要的技术。温度是比较一种物质相对于另一种物质是冷还是热的衡量标准&#xff0c;它会影响到芯片的性能、可靠性以及最终产量。在不同的制程步骤中&#xff0c;温度扮演着各种各样的角色。但是在评价制程温度高…

振弦式轴力计和振弦采集仪组成的安全监测解决方案

振弦式轴力计和振弦采集仪组成的安全监测解决方案 振弦式轴力计和振弦采集仪是一种常用的结构安全监测工具&#xff0c;可以用于评估建筑物、桥梁、隧道或其他结构的结构健康状态和安全性能。这种监测方案较为先进、精确&#xff0c;并且能够监测长期的结构反应&#xff0c;因此…