Node基本使用

1. 创建自定义全局指令

1.1 新建一个空的文件夹, 创建一个cli.js文件

1.2 在cli.js写入内容

/usr/bin/env就是让系统使用node来执行你的脚本文件。

#! /usr/bin/env node

1.3 执行终端指令

// 在文件夹 node-project 的终端下执行指令

npm init

执行完后package.json结构如下, 其中aaa是创建指令时package name

命令完成后,在你的终端输入bin下面的属性值,比如我就应该输入aaa

如上图, 这时候就会输出aaa。如果你能正确的输出内容,那么你的全局自定义命令就创建好了。

2. 使用commander指令

2.1 处理help选项(option)

#! /usr/bin/env node

// 按照commander
npm i commander

// 在cli.js内使用
const {program} = require('commander')

// 使用aaa --help后, Option选项将会添加下方配置, 效果图如下图
program.option('-f --framwork <framwork>', '设置框架')

program.parse(process.argv)

2.2 自定义命令参数处理(command)

#! /usr/bin/env node

// 按照commander
npm i commander

// 在cli.js内使用
const {program} = require('commander')


// 需要自定义创建aaa create xxx a b c d指令时, 需要使用command
// 使用aaa --help后, Command选项将会添加下方配置, 效果图如下图
program.command('create <project> [other...]')
.alias('crt') // 给create起别名
.description('创建项目') // 描述
.action((project, args) => {
    console.log(project) // xxx
    console.log(args) [a, b, c, d]
}) // 业务逻辑

program.parse(process.argv)



2.3 对上方代码进行模块拆分

// cli.js

#! /usr/bin/env node
const {program} = require('commander')

// 对模块进行拆分

// 导入help.js
const help = require('../lib/core/help')
help(program)

// 导入commander.js
const commander = require('../lib/core/commander')
commander(program)

program.parse(process.argv)


// action.js

const myAction = (project, args) => {
     // 命令行的执行逻辑代码
     console.log(project, args);
}

module.exports = myAction

// commander.js

const myAction = require('./action')

const commander = (program) => {
    // 需要创建create指令时需要使用command函数, 然后控制台可以打印 aaa create xxx k g x d
    program.command('create <project> [other...]')
    // 给create起别名
    .alias('crt')
    // 描述
    .description('创建项目')
    // 业务逻辑
    .action(myAction)
}

module.exports = commander

// help.js

const help = (program) => {
    return program.option('-f --framwork <framwork>', '设置框架')
}

module.exports = help



2.4. 命令行问答交互: 使用 inquirer 库

// 安装 inquirer 8及以下版本用法
npm install --save inquirer@^8.0.0

// config.js
module.exports = {
    framework: ['express', 'koa', 'egg']
}

// action.js
const inquirer = require('inquirer')
const config = require('../../config')

const myAction = (project, args) => {
     // 命令行的执行逻辑代码
     inquirer.prompt([
        {
            type: 'list',
            name: 'framework',
            choices: config.framework,
            message: '请选择框架'
        }
     ]).then(answer => {
        // 用户回答的内容
        console.log(answer);
        
     })
}

module.exports = myAction



// 安装 inquirer 9及以上版本用法
npm install --save inquirer

// config.js
module.exports = {
    // framework: [
    //     {
    //         name: 'express',
    //         value: '选项一'
    //     },
    //     {
    //         name: 'koa',
    //         value: '选项二'
    //     },
    //     {
    //         name: 'egg',
    //         value: '选项三'
    //     }
    // ],
    framework: ['express', 'koa', 'egg'] // 和上面那种写法一样
}

// action.js
const inquirer = require('inquirer').default
const config = require('../../config')

const myAction = (project, args) => {
     // 命令行的执行逻辑代码
     inquirer.prompt([
        {
            type: 'list',
            name: 'framework',
            message: '请选择框架',
            choices: config.framework
        }
     ]).then(answer => {
        // 用户回答的内容
        console.log(answer);
        
     })
}

module.exports = myAction



2.5. download-git-repo: 下载原创仓库模块代码

// 安装
npm i download-git-repo


// action.js
const inquirer = require('inquirer').default
const downloadFn = require('./download')
const config = require('../../config')

const myAction = async (project, args) => {
    // project 是项目名字

     // 命令行的执行逻辑代码
     const answer = await inquirer.prompt([
        {
            type: 'list',
            name: 'framework',
            message: '请选择框架',
            choices: config.framework
        }
     ])

    // 用户回答的内容
    downloadFn(config.frameworkUrl[answer.framework], project)

}

module.exports = myAction



// download.js
const download = require('download-git-repo')
const config = require('../../config')

const downloadFn = (url, project) => {
    /**
     * 
     * 第一个参数: direct: 我们的仓库不在他默认的仓库下, 所以需要设置一个前缀, 后面再跟上你的仓库地址
     * 第二个参数: 指定下载的路径
     * 第三个参数: 以什么样的方式下载(clone: 以克隆方式下载)
     * 第四个参数: 错误提示
     */
    download(`direct:${url}`, project, {clone: true}, err => {
        console.log(err);
        
    })
}

module.exports = downloadFn



2.5. ora: 下载等待提示交互

// 安装(6及以上使用import, commonjs要6以下)
npm i ora@5

// download.js
const download = require('download-git-repo')
const ora = require('ora')

const downloadFn = (url, project) => {
    const spinner = ora().start()
    spinner.text = '代码正在下载...'

    /**
     * 
     * 第一个参数: direct: 我们的仓库不在他默认的仓库下, 所以需要设置一个前缀, 后面再跟上你的仓库地址
     * 第二个参数: 指定下载的路径
     * 第三个参数: 以什么样的方式下载(clone: 以克隆方式下载)
     * 第四个参数: 错误提示
     */
    download(`direct:${url}`, project, {clone: true}, err => {
        if(!err) {
            spinner.succeed('下载成功')
            console.log('Done! you run:');
            console.log('cd' + project);
            console.log('npm install');
            console.log('npm run dev');
            
        } else {
            spinner.fail('下载失败')
        }
    })
}

module.exports = downloadFn




2.6. chalk: 命令行样式输出

// 安装, 5及以上版本使用import, 4及以下使用commonjs
npm i chalk@4


// download.js
const download = require('download-git-repo')
const ora = require('ora')
const chalk = require('chalk')

const downloadFn = (url, project) => {
    const spinner = ora().start()
    spinner.text = '代码正在下载...'

    /**
     * 
     * 第一个参数: direct: 我们的仓库不在他默认的仓库下, 所以需要设置一个前缀, 后面再跟上你的仓库地址
     * 第二个参数: 指定下载的路径
     * 第三个参数: 以什么样的方式下载(clone: 以克隆方式下载)
     * 第四个参数: 错误提示
     */
    download(`direct:${url}`, project, {clone: true}, err => {
        if(!err) {
            spinner.succeed('下载成功')
            console.log(chalk.green('Done! you run:'));
            console.log(chalk.green('cd' + project));
            console.log(chalk.green('npm install'));
            console.log(chalk.green('npm run dev'));
            
        } else {
            spinner.fail('下载失败')
            console.log(chalk.red.bold('失败的颜色'));
        }
    })
}

module.exports = downloadFn



3. Web服务器项目开发

3.1 使用node创建HTTP服务器

// server.js

// nodemon 检测代码更改, 一旦有代码改变就会重新运行 npm i -g nodemon
// nodemon server.js

// 导入http模块
const http = require('http')

// 创建服务器
// 获取到服务器的实例对象
const server = http.createServer()

server.listen(3030, () => {
    console.log('http://127.0.0.1:3030');
    
    console.log('创建成功');
})

// 监听客户端信息
server.on('request', (req, res) => {
    res.write('哈哈')
    res.end()
})

3.2 服务器响应不同数据类型

// nodemon 检测代码更改, 一旦有代码改变就会重新运行 npm i -g nodemon
// nodemon server.js

// 导入http模块
const http = require('http')

const fs = require('fs')

// 创建服务器
// 获取到服务器的实例对象
const server = http.createServer()

server.listen(3030, () => {
    console.log('http://127.0.0.1:3030');
    
    console.log('创建成功');
})

// 监听客户端信息
server.on('request', (req, res) => {
    // 第一种发送内容方式
    // res.setHeader('Content-Type', 'text/plain;charset=utf-8') // 例子:哈哈
    // res.setHeader('Content-Type', 'text/html;charset=utf-8') // 例子: <div>哈哈</div>
    // res.write('哈哈')
    // res.end()


    // 第二种发送内容方式
    console.log(req.url, 'req');
    
    if (req.url === '/') {
        // 如果路径是当前地址
        fs.readFile('./index.html', 'utf-8', (err, data) => {
            res.write(data)
            res.end()
        })
    } else {
        // 处理其他图片等静态文件
        fs.readFile('./1.jpg', (err, data) => {
            res.end(data)
        })
    }
})



// index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div>我是HTML的文件的div内容</div>
    <img src="./1.jpg">
    <img src="./1.jpg">
</body>
</html>


3.3 HTTP的不同请求方法处理(http方法和响应码)

3.4 接收并处理GET和POST请求入参


// GET 和 POST

// 导入http模块
const http = require('http')

const fs = require('fs')
const url = require('url')

// 创建服务器
// 获取到服务器的实例对象
const server = http.createServer()

server.listen(3030, () => {
    console.log('http://127.0.0.1:3030');
    console.log('创建成功');
})

// 监听客户端信息
server.on('request', (req, res) => {
    // GET请求url后的参数获取
    if (req.method === 'GET') {
        // url.parse第一个参数是地址, 第二个参数设置成true时返回参query会把路径后面的参数转成对象形式, 比如路径是localhost:3000/user?id=100, 那么query的值是{id: 100}
        const id = url.parse(req.url, true).query.id // 获取GET请求url后的参数
        console.log(url.parse(req.url, true).query);
        
        if (req.url === '/') {
            // 如果路径是当前地址
            fs.readFile('./index.html', 'utf-8', (err, data) => {
                res.write(data)
                res.end()
            })
        } else {
            // 处理其他图片等静态文件
            fs.readFile('./1.jpg', (err, data) => {
                res.end(data)
            })
        }
    } else if (req.method === 'POST') {
        let data = '';
        // 绑定data事件, 每当有数据的时候都会触发
        req.on('data', _data => {
            // 每当客户端发送数据过来的时候就存到data上
            data += _data // _data是Buffer, 里面是二进制数据
        })

        // 所有数据都发完之后触发事件
        req.on('end', () => {
            // 对数据进行转换
            const dataString = require('querystring').parse(data);
            console.log(dataString);
            res.end()
            
        })
    }
})

3.5 服务器代码模块化拆分

// server.js

// 导入http模块
const http = require('http')

const router = require('./router')

// 创建服务器
// 获取到服务器的实例对象
const server = http.createServer()

server.listen(3030, () => {
    console.log('http://127.0.0.1:3030');
    console.log('创建成功');
})

// 监听客户端信息
server.on('request', (req, res) => {
    router(req, res)
})



// router.js

const fs = require('fs')
const url = require('url')
const controller = require('./controller')

module.exports = (req, res) => {
    // GET请求url后的参数获取
    if (req.method === 'GET') {
        // url.parse第一个参数是地址, 第二个参数设置成true时返回参query会把路径后面的参数转成对象形式, 比如路径是localhost:3000/user?id=100, 那么query的值是{id: 100}
        const id = url.parse(req.url, true).query.id // 获取GET请求url后的参数
        console.log(url.parse(req.url, true).query);
        
        if (req.url === '/') {
            // 业务逻辑处理: 处理主页的内容
            controller.index(res)
        } else {
            // 处理其他图片等静态文件
            fs.readFile('./1.jpg', (err, data) => {
                res.end(data)
            })
        }
    } else if (req.method === 'POST') {
        let data = '';
        // 绑定data事件, 每当有数据的时候都会触发
        req.on('data', _data => {
            // 每当客户端发送数据过来的时候就存到data上
            data += _data // _data是Buffer, 里面是二进制数据
        })

        // 所有数据都发完之后触发事件
        req.on('end', () => {
            // 对数据进行转换
            const dataString = require('querystring').parse(data);

            // 业务逻辑处理: 处理用户数据信息
            controller.user(dataString, res)
            
        })

        res.end()
    }
}


// controller.js

const fs = require('fs')

module.exports = {
    index(res) {
        // 处理主页信息的返回
        fs.readFile('./index.html', 'utf-8', (err, data) => {
            res.write(data)
            res.end()
        })
    },
    user (data, res) {
        // 处理用户数据信息
        console.log(data);
        
    }
}

4. Express框架

4.1 项目构建和使用及管理用户数据信息(GET和POST)

// 初始化项目, 先创建express-fm文件夹, 然后打开这个文件夹的终端, 执行下面指令
npm init -y
npm i express

// 创建express脚手架工具, 使用下面指令
npx express-generator
npm i


// app.js
const express = require('express')
const fs = require('fs')
const {promisify} = require('util')

// 对fs.readFile进行Promise化
const readFile = promisify(fs.readFile)

// 获取express全局应用
const app = express();

// 接收到客户端发送过来的类型数据
app.use(express.urlencoded()) // 用于接收x-www-form-urlencodeed
app.use(express.json()) // 用于接收json

// 监听get请求, 第一个参数是请求路径为/, 
app.get('/', async (req, res) => {
    // 读取db.json文件
    try {
        const data =  await readFile('./db.json', 'utf8')
        console.log(res);
        
        // 如果没报错, 发送数据
        // 对data数据进行整理, 只需要返回 users 的数据
        const back = JSON.parse(data)
        res.send(back.users)
    } catch (error) {
        res.status(500).json({error})
    }
})

// 监听POST请求, 第一个参数是请求路径为/, 
app.post('/', (req, res) => {
    // 获取客户端不同类型入参
    console.log(req.body); // 必须使用app.use对数据类型进行处理
    
})

// 对服务器进行监听
app.listen(3030, () => {
    console.log('Run http://127.0.0.1:3030');
    
})


4.2 添加用户信息到db.json文件(对文件进行读取(get)和写入(post))

// 对文件进行读取和写入项目
// GET请求: http://127.1.1.0:3030
// POST请求: http://127.1.1.0:3030, 格式json: {"username": "hony","age": 12}


// app.js 
const express = require('express')
const db = require('./db')

// 获取express全局应用
const app = express();

// 接收到客户端发送过来的类型数据
app.use(express.urlencoded()) // 用于接收x-www-form-urlencodeed
app.use(express.json()) // 用于接收json

// 监听get请求, 第一个参数是请求路径为/, 
app.get('/', async (req, res) => {
    // 读取db.json文件
    try {
        const data =  await db.getDb()
        // 如果没报错, 发送数据
        // 对data数据进行整理, 只需要返回 users 的数据
        res.send(data.users)
    } catch (error) {
        res.status(500).json({error})
    }
})

// 监听POST请求, 第一个参数是请求路径为/, 
app.post('/', async (req, res) => {
    // 获取客户端不同类型入参
    const body = req.body;
    if (!body) {
        res.status(403).json({error: '缺少客户信息'})
    }

    // 添加
    const dataObj =  await db.getDb()
    body.id = dataObj.users[dataObj.users.length - 1].id + 1;

    dataObj.users.push(body)
    // 对db.json数据进行添加, 使用文件写入
    try {
        const r = await db.serveDb(dataObj)
        if (!r) {
            // 写入成功时, r的值为undefined, 给一个响应为200
            res.status(200).send({code: 8, msg: '添加成功'})
        } else {
            // 有错误的情况
        }
    } catch (error) {
        res.status(500).json({error})
    }
})

// 对服务器进行监听
app.listen(3030, () => {
    console.log('Run http://127.0.0.1:3030');
    
})


// db.js
// 该文件用户读取文件和写入操作

const fs = require('fs')
const {promisify} = require('util')

// 对fs.readFile进行Promise化
const readFile = promisify(fs.readFile)
const writeFile = promisify(fs.writeFile)

exports.getDb = async () => {
    const data =  await readFile('./db.json', 'utf8')
    return JSON.parse(data);
}

exports.serveDb = async (data) => {
    const stringData = JSON.stringify(data)
    return await writeFile('./db.json', stringData)
}





// db.json

{
    "users": [
        {
            "username": "Li Lei",
            "age": 18,
            "id": 1
        }
    ]
}


4.3 修改用户信息(PUT)

// app.js

const express = require('express')
const db = require('./db')

// 获取express全局应用
const app = express();

// 接收到客户端发送过来的类型数据
app.use(express.urlencoded()) // 用于接收x-www-form-urlencodeed
app.use(express.json()) // 用于接收json


// 修改用户信息
app.put('/:id', async (req, res) => {
    let id = req.params.id; // 获取url后面的参数id值
    const body = req.body; // 获取到body数据 这里使用的是json格式的
    id = Number.parseInt(id);

    try {
        const userInfo = await db.getDb();
        const user = userInfo.find(item => item.id === id)
        if (!user) {
            // 如果用户不存在
            res.status(403).json({error: '用户信息不存在'})
        }
        // 存在则替换
        user.username = body.username ? body.username : user.username // 客户端可以传username也可以不传
        user.age = body.age ? body.age : user.age // 客户端可以传age也可以不传
        
        // 替换userInfo内对应的id内容
        userInfo.forEach(item => {
            if (item.id === id) {
                item.username = user.username
                item.age = user.age
            }
        });

        // 然后写入操作
        const r = await db.serveDb(userInfo)
        
        if (!r) {
            res.status(201).json({msg: '修改成功'})
        }

    } catch (error) {
        res.status(500).json({error})
    }
})

// 对服务器进行监听
app.listen(3030, () => {
    console.log('Run http://127.0.0.1:3030');
    
})


5. MongoDB数据库进行数据持久化存储

5.1 在不同操作系统中安装MongoDB(偶数稳定版, 基数测试版)

// 下载mongoDB地址:
https://www.mongodb.com/try/download/community

// 安装时下载路径尽量不去动, 因此会下载在c盘, 注意mongoDB运行环境, 要配置环境变量, 具体下方用图片展示说明

5.2 第三方客户端Navicat链接MongoDB服务器

// 安装navicat地址:

https://www.navicat.com.cn/products


5.3 使用navicat创建一个新的数据库以及一些常见指令

// 常见一些指令, 在运行内测试
// use mytest
// db.cc.insert({x: 1, y: 2}) // 创建cc
// db.ff.insert({name: 'lilei'}) // 创建ff
// db.ff.drop() // 删除ff
// db.dropDatabase() // 删除mytest
// show collections // 查看mytest集合名称 cc ff

5.4 MongoDB基本增删改查操作

// 基本操作
// use mytest
// show collections // 查看mytest集合名称 cc ff
// db.ff.drop() // 删除ff
// db.dropDatabase() // 删除mytest


// 添加数据操作
// db.cc.insert({x: 1, y: 2}) // 创建cc
// db.ff.insert({name: 'lilei'}) // 创建ff
// db.cc.insertOne({username: 'haha', age: 12}) // 往cc插入一条数据
// db.cc.insertMany([ // 插入多条数据
// {username: 'haha1', age: 121},
// {username: 'haha2', age: 122},
// {username: 'haha3', age: 123}
// ])

// 查找数据操作
// db.cc.find() // 查找cc内所有数据
// db.cc.find({username: 'haha'}) // 查找cc内username的值为haha的数据
// db.cc.find({age: {$gt:15}}) // 查找cc内age大于15的数据
// db.cc.findOne({age: {$gt:15}}) // 查找cc内age大于15的数据, 且只要一条数据


// 修改数据操作
// 修改满足条件的一条数据
// db.cc.updateOne({username: 'haha1'}, {$set:{age:30}}) // 找到username为haha1的数据, 将age改成18 (原数据是{username: 'haha1', age: 12})
// 修改满足条件的多条数据
// db.cc.updateMany({age: {$gt:15}}, {$set:{username: 'Monica'}}) // 把年龄大于15的数据, 都改成Monica


// 删除数据操作
// db.cc.deleteOne({age: 12}) // 删除年龄等于12的一条数据
db.cc.deleteMany({age: {$gt:30}}) // 删除年龄大于30的多条数据


5.5 使用Node链接MongoDB

// 安装mongodb
npm i mongodb


// index.js  进行连接数据库操作
const {MongoClient} = require('mongodb')

const client = new MongoClient('mongodb://127.0.0.1:27017') // 第一个参数是mongodb的地址

// 连接数据库
const main = async () => {
    // 链接操作
    await client.connect();

    // 拿到数据库名字
    const db = client.db('mytest')

    // collection是操作的具体的集合
    const cc = db.collection('cc')

    // 查找
    const d = await cc.find()
    const array = await d.toArray() // 将数据转换成数据, 是一个异步操作
    console.log(array);
    
}

main()


5.6 使用Node对MongoDB进行增删改查操作

const {MongoClient} = require('mongodb')

const client = new MongoClient('mongodb://127.0.0.1:27017') // 第一个参数是mongodb的地址

const clientFun = async (c) => {
    await client.connect(); // 连接操作
    const db = client.db('mytest') // 拿到数据库名称
    return db.collection(c) // 操作的具体集合
}

// 连接数据库
const main = async () => {
    const cc = await clientFun('cc')
    console.log(cc);
    

    // 查询操作
    // const d = await cc.findOne({x: {$gt:1}}) // 查找x大于1的一条数据
    // console.log(d);
    
    // const d = await cc.find({x: {$gt:1}}) // 查找x大于1的多条数据
    // const array = await d.toArray() // 将数据转换成数据, 是一个异步操作
    // console.log(array);

    // 添加操作
    // const d = await cc.insertOne({x: 2, y: 2}) // 插入一条数据
    // console.log(d);

    // const e = await cc.insertMany([{x: 3, y: 3}, {x: 4, y: 4}]) // 插入多条数据

    // 更新操作
    // const d = await cc.updateOne({x: {$gt: 1}}, {$set: {y: 22}}) // 将x大于1的一条数据更新y的值
    // console.log(d);

    // const d = await cc.updateMany({x: {$lt: 3}}, {$set: {y: 33}}) // 将x小于2的多条数据, 将y更新成11
    // console.log(d);

    // 删除操作
    // const d = await cc.deleteOne({x: {$lt: 2}}) // 删除x小于2的一条数据
    // console.log(d);
    
    // const d = await cc.deleteMany({x: {$lt: 2}}) // 删除x小于2的所有数据
    // console.log(d);
}

main().finally(() => client.close())

6. Express中间件

6.1

3. fs读写模块

const fs = require('fs')

// // 读取文件内容
fs.readFile('./a.txt', 'utf8', (err, data) => {
    console.log(err);
    console.log(data);
})

// // 写入文件内容
fs.writeFile('./a.txt', 'aaaaaaa', (e) => {
    console.log(e);
})

// 追加文件内容
fs.readFile('./a.txt', 'utf8', (e, data) => {
    if (!e) {
        const newData = `${data}???`;
        fs.writeFile('./a.txt', newData, e => {
            if (!e) {
                console.log('追加内容成功啦');
                
            }
        })
    }
})


fs

1111

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

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

相关文章

Python编程技巧:多变量赋值的优雅艺术

在Python编程的世界里&#xff0c;有许多令人惊叹的语法特性&#xff0c;而多变量赋值就像是一颗闪耀的明珠&#xff0c;它不仅让代码更优雅&#xff0c;还能提升程序的执行效率。今天我们就深入探讨这个看似简单却蕴含深意的编程技巧。 基础认识 传统的变量赋值方式&#xff…

Transformer架构笔记

Attention is All You Need. 3.Model Architecture 3.1 整体架构如图 3.2 Encoder与Decoder Encoder&#xff1a;由 N 6 N6 N6个相同的Block/Layer堆叠而成。每个Block有两个子层sub-layer&#xff1a;多头注意力和MLP&#xff08;FFN&#xff0c;前馈神经网络&#xff09;&…

网络安全简单入门与扫描

网络安全简单入门 内容大纲 策略制定安全工具其他 1、安全策略 1.1、安全三要素 要全面地认识一个安全问题,我们有很多种办法,但首先要理解安全问题的组成属性。前人通过无数实践,最后将安全的属性总结为安全三要素,简称CIA。 安全三要素是安全的基本组成元素,分别是机密性…

在WPF程序中实现PropertyGrid功能

使用C#开发过Windows Forms的都知道&#xff0c;在Windows Forms程序中&#xff0c;有一个PropertyGrid控件&#xff0c;可以用于显示对象的属性&#xff0c;在WPF中并没有默认提供此功能的控件&#xff0c;今天以一个简单的小例子&#xff0c;简述在WPF中借助WinForm的Propert…

大模型时代的具身智能系列专题(十四)

冯晨团队 冯晨是纽约大学的副教授。他对通过多学科使用启发研究实现机器人主动和协作感知和学习感兴趣&#xff0c;这些研究源自建筑、制造和运输领域。在纽约大学之前&#xff0c;冯晨是马萨诸塞州剑桥市三菱电机研究实验室 (MERL) 计算机视觉小组的研究科学家&#xff0c;专…

力扣-Hot100-栈【算法学习day.40】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&am…

RT_Thread内核源码分析(三)——线程

目录 1. 线程结构 2. 线程创建 2.1 静态线程创建 2.2 动态线程创建 2.3 源码分析 2.4 线程内存结构 3. 线程状态 3.1 线程状态分类 3.2 就绪状态和运行态 3.3 阻塞/挂起状态 3.3.1 阻塞工况 3.4 关闭状态 3.4.1 线程关闭接口 3.4.2 静态线程关闭 3.4.3 动态线程关…

043 商品详情

文章目录 详情页数据表结构voSkuItemVo.javaSkuItemSaleAttrVo.javaAttrValueAndSkuIdVo.javaSpuAttrGroupVo.javaGroupAttrParamVo.java pom.xmlSkuSaleAttrValueDao.xmlSkuSaleAttrValueDao.javaAttrGroupDao.xmlAttrGroupServiceImpl.javaSkuInfoServiceImpl.javaSkuSaleAtt…

硬件知识 cadence16.6 原理图输出为pdf 网络名下划线偏移 (ORCAD)

1. cadence原理图输出为PDF网络名下划线偏移 生这种情况的原因 1. 设计的原理图图纸大小比正常的 A4图纸大。 2. 打印为PDF 的时候&#xff0c;打印机的设置有问题。 2.cadence原理图输出为 PDF网络名下划线偏移的情况 可以看到上图&#xff0c;网络名往上漂移。 3. 解决办法 …

Spring-boot3.4最新版整合swagger和Mybatis-plus

好家伙,今天终于开始用spring-boot3开始写项目了&#xff0c;以后要彻底告别1.x和2.x了&#xff0c;同样的jdk也来到了最低17的要求了,废话不多说直接开始 这是官方文档的要求jdk最低是17 maven最低是3.6 一. 构建工程,这一步就不需要给大家解释了吧 二. 整合Knife4j 1.大于 …

从零开始:如何使用第三方视频美颜SDK开发实时直播美颜平台

开发一个具有实时美颜功能的直播平台&#xff0c;能够显著提高用户体验和内容质量。而利用第三方视频美颜SDK可以大大简化开发过程&#xff0c;加快产品上市速度。本篇文章&#xff0c;小编将从零开始&#xff0c;详细讲解如何使用第三方视频美颜SDK开发一个实时直播美颜平台。…

ROS入门学习ONE

ros入门玩法1&#xff1a;控制小龟龟 终端1输入 sudo apt install ros-noetic-rqt-steering 新建终端2&#xff08;快捷键CtrlAltT)&#xff0c;打开控制台 roscore //启动ros系统 回到原终端 rosrun rosrun rqt_robot_steering rqt_robot_steering 新建终端3&#xff0c;…

shell脚本(二)

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…

简单理解下基于 Redisson 库的分布式锁机制

目录 简单理解下基于 Redisson 库的分布式锁机制代码流程&#xff1a;方法的调用&#xff1a;具体锁的实现&#xff1a;riderBalance 方法&#xff1a;tryLock 方法&#xff08;重载&#xff09;&#xff1a;tryLock 方法&#xff08;核心实现&#xff09;&#xff1a; 简单理解…

小鹏汽车智慧材料数据库系统项目总成数据同步

1、定时任务处理 2、提供了接口 小鹏方面提供的推送的数据表结构&#xff1a; 这几个表总数为100多万&#xff0c;经过条件筛选过滤后大概2万多条数据 小鹏的人给的示例图&#xff1a; 界面&#xff1a; SQL: -- 查询车型 select bmm.md_material_id, bmm.material_num, bm…

LeetCode 3244.新增道路查询后的最短距离 II:贪心(跃迁合并)-9行py(O(n))

【LetMeFly】3244.新增道路查询后的最短距离 II&#xff1a;贪心&#xff08;跃迁合并&#xff09;-9行py&#xff08;O(n)&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/shortest-distance-after-road-addition-queries-ii/ 给你一个整数 n 和一个二维…

华为无线AC+AP组网实际应用小结

之前公司都是使用的H3C的交换机、防火墙以及无线AC和AP的&#xff0c;最近优化下无线网络&#xff0c;说新的设备用华为的&#xff0c;然后我是直到要部署的当天才知道用华为设备的&#xff0c;就很无语了&#xff0c;一点准备没有&#xff0c;以下为这次的实际操作记录吧&…

Fakelocation Server服务器/专业版 Windows11

前言:需要Windows11系统 Fakelocation开源文件系统需求 Windows11 | Fakelocation | 任务一 打开 PowerShell&#xff08;以管理员身份&#xff09;命令安装 Chocolatey Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProto…

C语言基础学习:抽象数据类型(ADT)

基础概念 抽象数据类型&#xff08;ADT&#xff09;是一种数据类型&#xff0c;它定义了一组数据以及可以在这组数据上执行的操作&#xff0c;但隐藏了数据的具体存储方式和实现细节。在C语言中&#xff0c;抽象数据类型&#xff08;ADT&#xff09;是一种非常重要的概念&…

基于深度学习CNN算法的花卉分类识别系统01--带数据集-pyqt5UI界面-全套源码

文章目录 基于深度学习算法的花卉分类识别系统一、项目摘要二、项目运行效果三、项目文件介绍四、项目环境配置1、项目环境库2、环境配置视频教程 五、项目系统架构六、项目构建流程1、数据集2、算法网络Mobilenet3、网络模型训练4、训练好的模型预测5、UI界面设计-pyqt56、项目…