nodejs - MongoDB 学习笔记
一、简介
1、MongoDB 是什么
MongoDB 是一个基于分布式文件存储的数据库,官方地址 https://www.mongodb.com/
2、数据看是什么
数据库(DataBase)是按照数据结构来组织、存储和管理数据的应用程序。
3、数据库的作用
主要作用是 管理数据,对数据进行 增(c)、删(d)、改(u)、查(r)
4、数据库管理数据的特点
- 速度更快
- 扩展性更强
- 安全性更强
5、为什么选择 MongoDB
操作语法与 JavaScript 类似,容易上手,学习成本低
二、核心概念
- 数据库(database):是一个数据仓库,数据库服务下可以创建很多数据库,数据库可以存放很多集合(类似于js中的数组)
- 集合(collection):类似于 JS 中的数组,在集合中可以存放很多文档
- 文档(document):是数据库中的最小单位,类似于js中的对象
JSON 文件示例:
{ "accounts": [ { "id": "3-YLju5f3", "title": "买电脑", "time": "2023-02-08", "type": "-1", "account": "5500", "remarks": "为了上网课" },{ "id": "3-YLju5f4", "title": "请女朋友吃饭", "time": "2023-02-08", "type": "-1", "account": "214", "remarks": "情人节聚餐" },],"users":[ { "id": 1, "name": "zhangsan","age": 18 },{ "id": 2, "name": "lisi", "age": 20 },{ "id": 3, "name": "wangwu", "age": 22 } ]
}
上面 json 文件中:
- 一个 json 文件好比是一个 数据库,一个 MongoDB 服务下可以有 n 个数据库
- json 文件中的 一级属性的数据值 好比是 集合(accounts、users)
- 数组中的对象好比是 文档
- 对象中的属性有时也称为字段
一般情况下:
- 一个项目使用 一个数据库
- 一个集合会存储同一种类型的数据
三、下载安装与启动
下载地址: https://www.mongodb.com/try/download/community
mac 参考 mongodb 下载安装
windows 参考 视频教程
mac 中全局变量配置完以后,mongod 启动服务的命令必须要在 bin 目录下才能使用,mongo 启动数据库命令,可以全局使用。
1、数据库命令
- 显示所有的数据库
show dbs
- 切换到指定的数据库,如果数据库不存在会自动创建数据库
use 数据库名
- 显示当前所在数据库
db
- 删除当前数据库
use 数据库名
db.dropDatabase()
2、集合命令
- 创建集合
db.createCollection('集合名称')
- 显示当前数据库中所有集合
show collections
- 删除某个集合
db.集合名.drop()
- 重命名
db.集合名.renameCollection('newName')
3、文档命令
- 插入文档
db.集合名.insert(文档对象)
db.account.insert({name:'wangwu', age: 20})
- 查询文档
db.集合名.find(查询条件)
db.account.find({name:'wangwu'})
没有查询条件,就查集合里面所有的文档 - 更新文档
db.集合名.update(查询条件,新的文档)
db.account.update({name:'lisi'},{name:'lisi222'})
上面两个 新文档 会覆盖 旧文档
db.集合名.update(查询条件, {$set:更新文档})
db.account.update({name:'jeck'},{$set:{age:22}})
上面命令是只修改某一项或多项,不会直接覆盖 - 删除文档
db.集合名.remove(查询条件)
db.account.remove({name:'lisi222'})
4、应用场景
4-1、新增
- 用户注册
- 发布视频
- 发布商品
- 发朋友圈
- 发评论
- 发微博
- 发弹幕
- …
4-2、删除
- 删除评论
- 删除商品
- 删除文章
- 删除视频
- 删除微博
- …
4-3、更新
- 更新个人信息
- 修改商品价格
- 修改文章内容
- …
4-4、查询
- 商品列表
- 视频列表
- 朋友圈列表
- 微博列表
- 搜索功能
- …
二、Mongoose
1、介绍
Mongoose 是一个对象文档模型库,官网 http://www.mongoosejs.net/添加链接描述
2、作用
方便使用代码操作 mongodb 数据库
3、使用流程
- 安装 mongoose
npm install mongoose
- 导入 mongoose
// 导入 mongoose
// 1、导入 mogoose
const mongoose = require('mongoose')
const { type } = require('os')// 2、连接 mongdb 服务器
mongoose.connect('mongodb://127.0.0.1:27017/bilibili')// 3、设置回调
mongoose.connection.once('open', () => {// console.log('连接成功')// 4、创建文档的结构对象// let BookSchema = new mongoose.Schema({// name: String,// author: String,// author_gemder: String,// price: Number,// is_hot: Boolean,// tags: Array,// create_time: Date// })// 字段校验let BookSchema = new mongoose.Schema({name: {type: String, // 设置类型require: true, // 设置必填项unique: true // 设置唯一值},author: {type: String, // 设置类型default: '佚名' // 设置默认值},author_gemder: {type: String,enum: ['男', '女', '未知'] // 设置枚举值(值只能从这里取其一)},price: Number,is_hot: Boolean,tags: Array,create_time: Date})// 5、创建模型对象 对文档操作的封装对象(可以完成对文档的增删改查操作)// 第一个参数 book 是集合(数组)名称,第二个参数 BookSchema 是结构对象let BookModel = mongoose.model('book', BookSchema)// 6、新增基本对象// 如果属性跟上面定义的属性不统一,在写入数据库时会忽略这个键值对// 如果属性值的类型跟上面定义的类型不同意,写入时会报错,写入失败BookModel.create({name: '西游记',author: '吴承恩',price: 19.9,is_hot: true,tags: ['言情','都市','恐怖','玄幻'],create_time: new Date(),author_gemder: '男'}).then((data) => {// 输出成功后的文档对象console.log(data)// 7、关闭数据库连接(项目运行过程中,不会添加该代码)mongoose.disconnect()}).catch(res => {console.error('捕捉到了错误信息'+res)})
})mongoose.connection.on('error', () => {console.log('连接失败')
})mongoose.connection.on('close', () => {console.log('关闭连接')
})// setTimeout(() => {
// // 关闭数据库连接
// mongoose.disconnect()
// }, 3000)
4、字段类型
文档结构可选的常用字段类型列表:
5、字段值验证
Mongoose 有一些内建验证器,可以对字段值进行验证
5-1、必填项
title: { type: String, required: true // 设置必填项
},
5-2、默认值
author: { type: String, default: '匿名' //默认值
},
5-3、枚举值
gender: { type: String, enum: ['男','女'] //设置的值必须是数组中的
},
5-4、唯一值
username: { type: String, unique: true
},
unique 需要 重建集合 才能有效果
永远不要相信用户的输入
6、增删改查
数据库基本操作包括四个,增加(create),删除(delete),修改(update),查(read),其操作都是在mongoose.connection.once('open', () => {})
回调中进行的
6-1、增加
插入一条:
// 1、导入 mogoose
const mongoose = require('mongoose')// 2、连接 mongdb 服务器
mongoose.connect('mongodb://127.0.0.1:27017/bilibili')// 3、设置回调
mongoose.connection.once('open', () => {// console.log('连接成功')// 4、创建文档的结构对象let BookSchema = new mongoose.Schema({name: String,author: String,price: Number})// 5、创建模型对象 对文档操作的封装对象(可以完成对文档的增删改查操作)// 第一个参数 book 是集合(数组)名称,第二个参数 BookSchema 是结构对象let BookModel = mongoose.model('book', BookSchema)// 6、新增基本对象// 如果属性跟上面定义的属性不统一,在写入数据库时会忽略这个键值对// 如果属性值的类型跟上面定义的类型不同意,写入时会报错,写入失败BookModel.create({name: '西游记',author: '吴承恩',price: 19.9}).then((data) => {// 输出 插入成功后的文档对象console.log(data)// 7、关闭数据库连接(项目运行过程中,不会添加该代码)mongoose.disconnect()}).catch(res => {console.error('捕捉到了错误信息'+res)})
})mongoose.connection.on('error', () => {console.log('连接失败')
})mongoose.connection.on('close', () => {console.log('关闭连接')
})// setTimeout(() => {
// // 关闭数据库连接
// mongoose.disconnect()
// }, 3000)
插入多条:
BookModel.insertMany([ { name:'华为', color:'灰色', price:2399, tags:['电量大','屏幕大','信号好'] },{ name:'小米', color:'白色', price:2099, tags:['电量大','屏幕大','信号好'] } ],(data)=>{ console.log('写入成功');mongoose.connection.close();
})
6-2、删除
删除一条:
BookModel.deleteOne({_id:'669f4719bbf7718b48b790ed'}).then((data) => {// 输出 插入成功后的文档对象console.log(data)// 7、关闭数据库连接(项目运行过程中,不会添加该代码)mongoose.disconnect()}).catch(res => {console.error('捕捉到了错误信息'+res)})
删除多条:
BookModel.deleteMany({is_hot: false}).then((data) => {// 输出 插入成功后的文档对象console.log(data)// 7、关闭数据库连接(项目运行过程中,不会添加该代码)mongoose.disconnect()}).catch(res => {console.error('捕捉到了错误信息'+res)})
6-3、文档更新
单条文档更新 BookModel.updateOne({}, {}).then()
多条文档更新BookModel.updateMany({}, {}).then()
//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. 创建模型对象 对文档操作的封装对象 mongoose 会使用集合名称的复数, 创建集合let BookModel = mongoose.model('novel', BookSchema);//7. 更新文档// 更新单个文档 updateOne 接收两个参数,第一个是条件,第二个是新的对象// BookModel.updateOne({name: '西游记'}, {price: 9.9}).then((data) => {// // 输出 插入成功后的文档对象// console.log(data)// // 7、关闭数据库连接(项目运行过程中,不会添加该代码)// mongoose.disconnect()// }).catch(res => {// console.error('捕捉到了错误信息'+res)// )// 更新多个文档BookModel.updateMany({is_hot: false}, {is_hot: true}).then((data) => {// 输出 插入成功后的文档对象console.log(data)// 7、关闭数据库连接(项目运行过程中,不会添加该代码)mongoose.disconnect()}).catch(res => {console.error('捕捉到了错误信息'+res)})});// 设置连接错误的回调
mongoose.connection.on('error', () => {console.log('连接失败');
});//设置连接关闭的回调
mongoose.connection.on('close', () => {console.log('连接关闭');
});
6-4、查询文档
查询一条数据:BookModel.findOne({name:'23'}).then()
根据 ID 查询数据BookModel.findById(‘’).then()
批量查询数据:BookModel.find({}).then()
(有条件就根据条件查询,没条件就查所有的)
//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. 创建模型对象 对文档操作的封装对象 mongoose 会使用集合名称的复数, 创建集合let BookModel = mongoose.model('novel', BookSchema);//7. 读取文档// 按照条件读取文档BookModel.findOne({name:'狂飙'}).then((data) => {// 输出 插入成功后的文档对象console.log(data)// 7、关闭数据库连接(项目运行过程中,不会添加该代码)mongoose.disconnect()}).catch(res => {console.error('捕捉到了错误信息'+res)})// 通过 id 读取文档// BookModel.findById('669f4ef193ea628ad18eeb33')//.then((data) => {// console.log(data)// mongoose.disconnect()//}).catch(res => {// console.error('捕捉到了错误信息'+res)// })// 读取所有文档// BookModel.find().then((data) => {// console.log(data)// mongoose.disconnect()//}).catch(res => {// console.error('捕捉到了错误信息'+res)// })});// 设置连接错误的回调
mongoose.connection.on('error', () => {console.log('连接失败');
});//设置连接关闭的回调
mongoose.connection.on('close', () => {console.log('连接关闭');
});
7、条件控制
7-1、运算符
在 mongodb 中不能使用 >, <, >=,<=,!==等运算符,需要使用替代符号
>
使用$gt
<
使用$lt
>=
使用$gte
<=
使用$lte
!==
使用$ne
// 查询价格小于 20 的文档
BookModel.find({price:{$lt: 20}}).then((data) => {// 输出 插入成功后的文档对象console.log(data)// 7、关闭数据库连接(项目运行过程中,不会添加该代码)mongoose.disconnect()}).catch(res => {console.error('捕捉到了错误信息'+res)})
7-2、逻辑运算符
$or
逻辑或
$and
逻辑与
// 逻辑运算 - 查询 name 为 余华 或者 刘慈欣 的文档
BookModel.find({$or: [{author: '余华'},{author: '刘慈欣'}]}).then((data) => {// 输出 插入成功后的文档对象console.log(data)// 7、关闭数据库连接(项目运行过程中,不会添加该代码)mongoose.disconnect()}).catch(res => {console.error('捕捉到了错误信息'+res)})
7-3、正则匹配
条件中可以直接使用 js 的正则语法,通过正则可以进行模糊查询
// 正则匹配 - 查询 name 包含 ‘三’ 的文档
BookModel.find({name: /三/})
BookModel.find({name: new RegExp('三')})
8、个性化读取
8-1、字段筛选
取前端需要展示的字段,_id 会默认取出来,,如果不需要,要设为 0
// 字段筛选(取某些字段,0 不要的字段,1 要获取的字段)
BookModel
.find()
.select({name: 1, author: 1, price: 1, _id: 0})
.then((data) => {// 输出 插入成功后的文档对象console.log(data)// 7、关闭数据库连接(项目运行过程中,不会添加该代码)mongoose.disconnect()}).catch(res => {console.error('捕捉到了错误信息'+res)})
8-2、数据排序
// 数据排序,1:升序,-1:倒序
BookModel
.find()
.select({name:1, price:1, _id: 0})
.sort({price: 1})
.then((data) => {// 输出 插入成功后的文档对象console.log(data)// 7、关闭数据库连接(项目运行过程中,不会添加该代码)mongoose.disconnect()}).catch(res => {console.error('捕捉到了错误信息'+res)})
8-3、数据截取
常用来做分页,skip 为 (页码 - 1) * limit 中的值
// 数据截取,limit 接收一个参数,为要截取的数据的长度,skip接收一个参数,表示在截取前,要跳过几个数据,常用作分页BookModel.find().select({name:1, price:1, _id: 0}).sort({price: 1}).skip(3).limit(3).then((data) => {// 输出 插入成功后的文档对象console.log(data)// 7、关闭数据库连接(项目运行过程中,不会添加该代码)mongoose.disconnect()}).catch(res => {console.error('捕捉到了错误信息'+res)})
9、模块化
config.js
module.exports = {DBHOST: '127.0.0.1',DBPORT: '27017',DBNAME: 'bilibili'
}
db.js
module.exports = function (success, error = () => {console.log('连接失败了啊')}) {// 1、导入 mogooseconst mongoose = require('mongoose')const { DBHOST, DBPORT, DBNAME } = require('../config/config')// 2、连接 mongdb 服务器mongoose.connect(`mongodb://${DBHOST}:${DBPORT}/${DBNAME}`)// 3、设置回调mongoose.connection.once('open', () => {success()})mongoose.connection.on('error', () => {error()})mongoose.connection.on('close', () => {console.log('关闭连接')})
}
BookModel.js
const mongoose = require('mongoose')let MovieSchema = mongoose.Schema({name: String,director: String
})
let MovieModel = new mongoose.model('movie', MovieSchema)module.exports = MovieModel
book.js
const db = require('./db/db')
const BookModel = require('./models/BookModel')db(() => {BookModel.create({name: '阿勒泰',author: '阿勒泰',price: 88.8}).then((data) => {console.log(data)mongoose.disconnect()}).catch(res => {console.error('捕捉到了错误信息'+res)})
})
MovieModel.js
const mongoose = require('mongoose')let MovieSchema = new mongoose.Schema({name: String,director: String
})
let MovieModel = mongoose.model('movie', MovieSchema)module.exports = MovieModel
movie.js
const db = require('./db/db')
const MovieModel = require('./models/MovieModel')db(() => {MovieModel.create({name: '第二十条',director: '张艺谋'}).then((data) => {console.log(data)mongoose.disconnect()}).catch(res => {console.error('捕捉到了错误信息'+res)})
})
四、图形化管理工具
我们可以使用图形化的管理工具来对 Mongodb 进行交互,这里演示两个图形化工具
- Robo 3T 免费 https://github.com/Studio3T/robomongo/releases
- Navicat 收费 https://www.navicat.com.cn/
相关文章:

nodejs - MongoDB 学习笔记
一、简介 1、MongoDB 是什么 MongoDB 是一个基于分布式文件存储的数据库,官方地址 https://www.mongodb.com/ 2、数据看是什么 数据库(DataBase)是按照数据结构来组织、存储和管理数据的应用程序。 3、数据库的作用 主要作用是 管理数据…...

photoshop学习笔记——移动工具
移动工具,可以对图层进行移动,快捷键 V 使用的素材已经放上了,直接下载即可 按住ctrl 可以自动选取,鼠标点击哪个对象,自动选中哪个图层 按住 shift 校正角度(只能沿着直线移动) 按住 alt 拖…...

HarmonyOS 质量、测试、上架速浏
1.应用质量要求: 1. 应用体验质量建议: 功能数据完备 功能完备 数据完备 基础体验要求 基础约束 兼容性 稳定性 性能 功耗 安全…...
TS的访问修饰符有哪些
如果你和我一样是从强类型语言(如C、C#、Java)转过来的,相信你会一眼就知道是什么 public(默认) - 全部可访问 protected - 自己和派生类可访问 private - 只有自己可访问 废话不多说,上代码: class Person {publ…...
网络安全之扫描探测阶段攻防手段(二)
扫描探测 扫描探测阶段是攻击者对目标网络进行深入了解的关键步骤,同时也是防御者识别潜在威胁和加强安全防护的机会。 攻击端:技术原理和工具 端口扫描: 原理:攻击者使用端口扫描工具来识别目标网络中开放的端口,这…...
C++:泛型算法了解
什么是泛型算法 泛型算法是C标准模板库(STL)中的一部分,它们表示的是可以用于不同类型的元素和多种容器类型的一些经典算法的公共接口。这些算法之所以被称为“泛型”,是因为它们可以操作在多种容器类型上,包括但不限…...

基于bert的自动对对联系统
目录 概述 演示效果 核心逻辑 使用方式 1.裁剪数据集 根据自己的需要选择 2.用couplet数据集训练模型 模型存储在model文件夹中 3.将模型转换为ONNX格式 4.打开index.html就可以在前端使用此自动对对联系统了。 本文所涉及所有资源均在传知代码平台可获取。 概述 这个生成器利用…...
js-vue中多个按钮状态选中类似于复选框与单选框实现
1.vue中多个按钮状态选中类似于复选框 在Vue中处理多个按钮的选中状态切换,通常我们会利用Vue的响应式数据系统来追踪每个按钮的选中状态。 html <div id"app"> <button v-for"button in buttons" :key"button.id" :c…...
ObservableCollection新增数据前判断数据是否存在
public class MyDataModel {public int Id { get; set; }public string Name { get; set; }}public static void Main(){// 创建 ObservableCollectionObservableCollection<MyDataModel> myDataCollection new ObservableCollection<MyDataModel>{new MyDataMode…...

DBus快速入门
DBus快速入门 参考链接: 中文博客: https://www.e-learn.cn/topic/1808992 https://blog.csdn.net/u011942101/article/details/123383195 https://blog.csdn.net/weixin_44498318/article/details/115803936 https://www.e-learn.cn/topic/1808992 htt…...

SQL Server 设置端口号:详细步骤与注意事项
目录 一、了解SQL Server端口号的基础知识 1.1 默认端口号 1.2 静态端口与动态端口 二、使用SQL Server配置管理器设置端口号 2.1 打开SQL Server配置管理器 2.2 定位到SQL Server网络配置 2.3 修改TCP/IP属性 2.4 重启SQL Server服务 三、注意事项 3.1 防火墙设置 3…...
Python面试题:结合Python技术,如何使用NetworkX进行复杂网络分析
NetworkX 是一个强大的 Python 库,用于创建、操作和研究复杂网络的结构、动力学和功能。它提供了丰富的功能来处理图和网络数据,适合用于复杂网络分析。以下是使用 NetworkX 进行复杂网络分析的基本步骤: 安装 NetworkX: pip inst…...
【C#/C++】C#调C++的接口,给C++传结构体数组
C#调C的接口,给C传结构体数组 1、背景2、实现 1、背景 C#软件创建了一个结构体数组用来存储图像的区域信息,分别是矩形框的左上像素的xy坐标和矩形框右下像素的xy坐标。需要传入给调用的C函数的参数列表中,我们选择使用C#传入一个结构体数组…...
ctfshow SSTI注入 web369--web372
web369 这把request过滤了,只能自己拼字符了 ""[[__clas,s__]|join] 或者 ""[(__clas,s__)|join] 相当于 ""["__class__"]举个例子,chr(97) 返回的是字符 a,因为 97 是小写字母 a 的 Unicode 编码…...
Llama + Dify,在你的电脑搭建一套AI工作流
theme: smartblue 点赞 关注 收藏 学会了 本文简介 最近字节在推Coze,你可以在这个平台制作知识库、制作工作流,生成一个具有特定领域知识的智能体。 那么,有没有可能在本地也部署一套这个东西呢?这样敏感数据就不会泄露了&…...
洛谷 P9854 [CCC 2008 J1] Body Mass Index
这题让我们计算出 BMI 值,随后判断属于哪个等级。 BMI 值计算公式: 。 BMI 范围 对应信息 …...
Redis面试三道题目
针对Redis的面试题,我将从简单到困难给出三道题目,并附上参考答案的概要。 1. 简单题:请简述Redis是什么,以及它的主要优点。 参考答案: Redis简介:Redis是一个开源的、使用ANSI C语言编写、支持网络、可…...
redis的使用场景-分布式锁
使用redis的setnx命令放入数据并用此数据当锁完成业务(但是如果用户操作途中出现异常导致超出指定时间会出现问题) Service public class StockService {Autowiredprivate StockDao stockDao; //mapper注入Autowiredprivate StringRedisTemplate redisT…...

知识库系统全解析:2024年最佳9款
本文将分享9款优质团队知识库管理工具:PingCode、Worktile、石墨文档、语雀、Wolai 我来、有道云笔记、飞书文档、Confluence、Notion。 在追求高效团队运作的今天,掌握和整合知识成为了企业不可或缺的需求。但面对市场上琳琅满目的知识库管理工具&#…...

猫头虎分享:Numpy知识点一文带你详细学习np.random.randn()
🐯 猫头虎分享:Numpy知识点一文带你详细学习np.random.randn() 摘要 Numpy 是数据科学和机器学习领域中不可或缺的工具。在本篇文章中,我们将深入探讨 np.random.randn(),一个用于生成标准正态分布的强大函数。通过详细的代码示…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
Python网页自动化Selenium中文文档
1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...

Vue3 PC端 UI组件库我更推荐Naive UI
一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用,前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率,还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库(Naive UI、Element …...

高效的后台管理系统——可进行二次开发
随着互联网技术的迅猛发展,企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心,成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统,它不仅支持跨平台应用,还能提供丰富…...

Linux入门(十五)安装java安装tomcat安装dotnet安装mysql
安装java yum install java-17-openjdk-devel查找安装地址 update-alternatives --config java设置环境变量 vi /etc/profile #在文档后面追加 JAVA_HOME"通过查找安装地址命令显示的路径" #注意一定要加$PATH不然路径就只剩下新加的路径了,系统很多命…...