node.js入门笔记(六)——mongoDB数据库的基本使用、JWT、socket编程

2023-10-27

1.MongDB的使用

    如果你玩过微信小程序的云开发或者学过MySQL,这玩意儿相对要好学很多。作为非关系型数据库,MongDB由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongDB其实使用面还是比较广的,每条记录有点像json数据,一般和node.js在一起作为后端架构,在Java中也有一定的使用空间(主要用于存储可丢失的数据)。好,简单介绍完毕,接下来就是基本的使用介绍了。

1.1MongDB的安装

    首先自然是(从官网下载)了,应该需要注册啥的,这里用的是社区版,企业版应该会收费,学习的话用社区版应该足够了。下载时,选择custom,修改文件路径到E盘,节省C盘空间。下载完成之后配置环境变量(eg.E:\MongoDB\bin)。配置完成之后:
在这里插入图片描述

1.2数据库的基本操作指令
//查询数据库
show dbs

//创建或者切换数据库
use 数据库名称

//查看当前使用的数据库
db/db.getName()

//显示当前的数据库状态
db.stats()

//查看当前的数据库版本
db.version()

//查看当前数据库连接的主机地址
db.getMongo()

//删除数据库
db.dropDatabase()
1.3数据集合(表)的基本操作指令
//创建集合
db.createCollection("collName",{size:20,capped:true,max:100})
//创建一个名为collName的集合,大小为20(字节,capped表示固定集合,即使是true也需要指定size的值),
//max表示的是集合中包含文档的最大数量,也就是MySQL中常说的一条记录。

//展示当前数据库下面的所有集合
db.getCollectionNames()

//展示当前数据库所有集合的状态
db.printCollectionStats()

//删除集合
db.collection名称.drop()
1.4文档(记录)的基本操作指令
//假定被操作的集合名为test

//插入数据
db.test.insert({name:"张三",age:22})
//注意,save就是insert的别名,和thinkPHP中的save,insert不一样。

//数据修改
db.test.update({name:"张三",age:22},{$set:{age:19}});
db.test.update({name:"张三",age:22},{$inc:{age:100}});
//对于数据的修改,第一个表示的是匹配文档
//第二个参数是修改内容,其中$set表示设置成新的值,$inc表示值的增加
//第三个参数表示如果没有找到数据就创建数据(默认为false)
//第四个参数表示的是修改全部匹配的文档(默认为false)

//数据删除
db.test.remove({data:1},false)
//注意,这里的集合不能是固定集合(固定集合不能删除数据)
//第二个参数是是否只删除一条数据(默认为true)

//数据查询
db.test.find()//查询所有数据
db.test.distinct('name')//去重查询
db.test.find({data:1})//基本条件查询
db.test.find({data:{$gt:1}})//查询data>1
db.test.find({data:{$gte:1}})//查询data>=1
db.test.find({data:{$lt:1}})//查询data<1
db.test.find({data:{$gt:1,$lt:5}})//查询(1,5)
db.test.find({name:/nightowl/})//查询name中包含有nightowl的数据
db.test.find({name:/^nightowl/})//查询name中以nightowl开头的数据
db.test.find({name:/nightowl$/})//查询name中以nightowl结尾的数据
db.test.find({},{name:0,_id:0})//查询并返回的数据中去除name和_id字段
db.test.find().sort(data:1)//查询并按照data升序排序
db.test.find().sort(data:-1)//查询并按照data降序排序
db.test.find().limit(5)//查询并限制返回数据的条数
db.test.find().skip(3)//查询并跳过指定数据条数
db.test.find({$or:[data:{$gt:1},data:{$lte:-3}]})//查询data(-∞,-3]和(1,+∞]的文档
db.test.findOne()//查询第一条数据
db.test.find({条件}).count()//查询并得到符合条件的文档条数

2.JWT的使用

    首先,简单说一下JWT(Json Web Token),主要应用场景是前后端鉴权。为了保护数据库里面的数据,避免非法用户攻击,前端首次登录之后,后端会利用某种加密算法,将用户名(或者其他能够唯一标识用户的信息,当然为了提高安全性,也可能涉及其他信息)生成一个token(这里的token是一般使用的代号,其他名字也可以),将token发送给前端,然后前端在请求数据的时候需要携带token信息,后端会再次加密这些信息,将两次token进行验证,验证通过才进一步调用model层获取数据库里面的数据或者向数据库里面写入数据。
    当然更深入的,后端还可以利用像redis一样的高速缓存工具,快速验证前端传过来的token。其基本是实现原理是前端第一次登录,将生成的token存入redis,之后用户再次请求,直接查找redis是否含有先前生成好的token,有便通过验证。下面主要介绍利用JWT实现的对称加密和非对称加密。
    首先是对称加密,为了方便更加熟悉RMVC模式(router、model、view、controller),我们回顾一下前面搭建目录的过程:

//server.js导入各种模块
const express = require("express");
const app = express();
const router = require("./route/index");
app.use("/", router);
app.listen(3000, () => {
    console.log("localhost:3000.");
});
//route/index.js配置路由模块
const express = require("express");
const router = express.Router();
const loadToken = require("../controller/token");
router.get("/api/token", loadToken);
module.exports = router;
//controller/index.js配置controller控制层
const jwt = require("jsonwebtoken");
const token = (req, res, next) => {
    const loadToken = jwt.sign({ username: "张三、李四、王五牛逼!**nightowl**" },
        "nightowl"
    );
    //const result = jwt.verify(loadToken, "nightowl");
    res.send(loadToken);
};
module.exports = token;

    补充说明,这里需要导入的模块有:express、express-generator(前两者主要是为了引入express极简框架)、jsonwebtoken(引入JWT加密模块)、nodemon(项目热加载,省得每次修改代码之后需要重启)。这里使用的是对称加密,jwt.sgin()方法含有两个参数,第一个参数是被加密的数据,第二个参数是加密的私钥(补充:所谓的对称加密指的是加密和解密用的私钥和密钥是一样的)。这里介绍一个(JWT官网),可以用来解密JWT生成的数据。解密效果如下:
在这里插入图片描述
    其中的蓝色部分是私钥,又被成为数字签证,可以通过右边的输入框来更改。当然jwt自身提供了解密方法jwt.verify(),这种对称加密其实不算安全,因为如果别人知道了密钥,信息就很容易泄露,加上公钥与私钥一直,增大了泄露的风险。
    接下来说一下非对称加密。非对称加密有点类似于git的环境搭建,首先需要生成私钥和公钥,然后将公钥上传到自己的git远程仓库上。在jsonwebtoken中,非对称加密的实现方法为:
(1)(下载openSSL)(用来生成签证);
(2)在cmd中执行 genrsa -out rsa_private_key.pem 2048,生成2048位私钥;
(3)执行rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem生成公钥;
生成完成之后的文件如下所示:
在这里插入图片描述
    之后修改对应的加密算法:

//controller/token.js
const jwt = require("jsonwebtoken");
const fs = require("fs");
const path = require("path");
const token = (req, res, next) => {
    const privateKey = fs.readFileSync(
        path.join(__dirname, "../rsa_private_key.pem")
    );
    const publicKey = fs.readFileSync(
        path.join(__dirname, "../rsa_public_key.pem")
    );
    const loadToken = jwt.sign({ username: "张三" }, privateKey, {
        algorithm: "RS256",
    });
    const result = jwt.verify(loadToken, publicKey);
    console.log("输出解密之后的数据:", result);
    res.send(loadToken);
};
module.exports = token;

    程序运行结果如下:
在这里插入图片描述
    里面展示的时间iat其实就是时间戳,对应当前密文生成的时间。在策略上,可以将公钥发送给后端,当前端上前数据时先用私钥加密,等数据到达后端之后,利用后端传入的公钥解密数据或者两次加密数据看数据是否相等。

3.socket编程

3.1原生socket编程

    socket编程更偏向于计算机网络数据传输方面的底层知识,这里可以作为了解内容,因为现在框架对于socket的封装程度已经比较高了。数据传输分为双工通信、单工通信和半双工通信,其中单工通信就类似于数码电视,只接受另外一段传输过来的数据,双工通信就类似于QQ,信息的接受和发送能够同时进行,半双工通信类似于老式手机“大哥大”,需要一段给出回应才能够继续发送。接下来简单说说如果撤掉各种框架的封装,使用最底层的socket如何实现数据通信:
socket属于node.js中内置模块Net模块,程序举例如下:

//server.js
const net = require("net");
const server = net.createServer((socket) => {//创建服务端,创建之后像连接的客户端发送信息
    socket.write("hello client!");
    socket.on("data", (chunk) => {
        console.log("来自客户端的数据:", chunk.toString());
    });
});
server.on("error", (err) => {
    console.log("服务端错误", err);
});
server.listen("8080", () => {//设置服务端对外开放的端口号
    console.log("opened server on:", server.address());
});
//client.js
const net = require("net");
const client = net.createConnection({ port: 8080 }, () => {
//建立连接,这里使用的主机一致,所以不涉及ip信息
    console.log("connect to server!");
    client.write("hello server!");
});
client.on("data", (chunk) => {
    console.log("来自服务端的数据:", chunk.toString());
});
client.on("error", (err) => {
    console.log("客户端错误", err);
});

    程序执行效果如下:
在这里插入图片描述
对于聊天室的模拟,程序实现如下:

//server.js
const net = require("net");
const server = new net.createServer();
let clients = {};
let clientName = 0;

server.on("connection", (client) => {
    client.name = ++clientName;
    console.log("客户端NO", client.name, "获得与server的连接!");
    clients[client.name] = client;
    client.on("data", (msg) => {
        broadcast(client, msg.toString());
    });
    //绑定数据监听,每有数据获取之后广播
    client.on("close", () => {
        delete clients[client.name];
        console.log("客户端NO" + client.name, "与server断开连接!");
    });
});

function broadcast(client, msg) {
    for (var key in clients) {
    	if(key!=client.name){
    		 clients[key].write("客户端NO" + client.name + "说:" + msg);
    	}
    }
}
server.listen(8080, () => {
    console.log("server 开启!");
});
//client.js
const net = require("net");
const readline = require("readline");
let socket = new net.Socket();
const port = 8080;
const host = "127.0.0.1";

socket.setEncoding = "UTF-8";
socket.connect(port, host, () => {
    socket.write("hello.");
});
socket.on("data", (msg) => {
    console.log(msg.toString());
    say();
});
const r1 = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
});

function say() {
    r1.question("请输入向server传输的数据:\n", (inputMsg) => {
        if (inputMsg != "bye") {
            socket.write(inputMsg + "\n");
        } else {
            socket.destroy();
            r1.close();
        }
    });
}
socket.on("error", (err) => {
    console.log("client error", err);
    socket.end();
});

    难点,数据之间的传输,一个传输对应一个监听处理,坑点:wirte()函数不能直接传输对象,因此不能使用,来凭借多个字符串。
实现效果如下:
在这里插入图片描述

3.2WebSocket第三方依赖

    除了接近底层外,socket中我们能够发现一个特点,server端可以直接向服务端发送数据,也就可以解决消息推送等问题,实现真正意义的双工通信,http是不能够做到这一点的,http协议下只能由client请求。讲道理我之前还没深入到WebSocket,可以看看(阮老师的博文),看到WebSocket之后才发现自己前端也就学了点皮毛,WebSocket的协议标识为ws,加密之后用的是wss,无同源策略。现在还学的比较少,应该用不上这么多,但是需要知道有这个东西。需要注意的是web浏览器中由WebSocket,在node.js中如果需要用到WebSocket,需要使用第三方依赖,安装方式:npm install ws -S,程序代码如下:
    服务端代码:

//server.js
const webSocket = require("ws");
const ws = new webSocket.Server({ port: 8080 });
let clients = {};
let num = 0;

function broadcast(client, msg) {
    for (let key in clients) {
        clients[key].send("来自客户端NO" + client.name + "的数据:" + msg);
    }
}
ws.on("connection", (client) => {
    client.name = ++num;
    clients[client.name] = client;
    client.on("open", () => {
        ws.send("来自客户端的hello");
    });
    client.on("message", (msg) => {
        console.log("来自客户端NO" + client.name + "的数据:", msg.toString());
        broadcast(client, msg);
    });
    client.on("close", () => {
        console.log("客户端NO" + client.name + "已断开连接~");
        delete clients[client.name];
    });
});
ws.on("close", () => {
    console.log("服务端已经关闭!");
});

    客户端代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>websocket</title>
    <script src="./client.js"></script>
</head>

<body>
    <div>我是一个websocket测试客户端</div>
</body>

</html>
//client.js
const ws = new WebSocket("ws://localhost:8080");
ws.onopen = () => {
    console.log("client open");
    ws.send("你好呀,服务端");
};
ws.onmessage = (socket) => {
    console.log("来自服务端的数据:", socket.data);
};
ws.onerror = () => {
    console.log("客户端错误");
};
ws.onclose = () => {
    console.log("客户端关闭连接");
};

    其实这个代码比较简单,很好理解,需要注意server.js里面的client不能理解成客户端,应该理解成服务端那边用来管理与客户端会话的管理者。这个只是一个框子,我自己也没有实践过由server端主动向client端发信息,后续还得通过实际项目进一步练习。

3.3socket.io的使用

    有些浏览器不支持H5,这使得有些时候WebSocket的应用收到了一定的限制,WebSocket可以理解成socket在浏览器端应用场景下的一种优化封装,而socket.io就是对socket更加系统的优化,WebSocket,可以算作是socket.io的一个子集。如果使用socket.io的话,程序代码如下:
服务端:

//server.js
var express = require("express");
var app = express();
var server = require("http").Server(app);
var io = require("socket.io")(server, { cors: true });

io.on("connection", function(socket) {
    console.log("有客户端与服务端建立连接");
    socket.on("receive", (msg) => {
        console.log("输出服务端收到的数据:", msg);
        //向客户端发送数据
        socket.emit("message", "收到 over !");
    });
});

server.listen(8080, () => {
    console.log("localhost:8080");
});

客户端:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>socket.io</title>
    <script src="./node_modules/socket.io/client-dist/socket.io.js" charset="utf-8"></script>
</head>

<body>
    <div>
        <input type="text" id="msg" style="width: 200px;">
    </div>
    <button id="submit">点击发送表单消息</button>
    <script>
        var socket = io.connect('http://127.0.0.1:8080');
        const content = document.getElementById('content')
        document.querySelector('#submit')
            .addEventListener('click', () => {
                let content = document.getElementById("msg").value;
                //向server发送数据
                socket.emit('receive', content);
            })

        socket.on('message', (msg) => {
            console.log("输出客户端收到的数据:", msg);
        })
    </script>
</body>

</html>

需要注意的是,消息的传递都需要绑定一个信息传输标识,比如上面的"message"和"receive",如果遇到了跨域问题,直接在创建server的时候允许跨域。相比于WebSocket在写法上更加简单了
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

node.js入门笔记(六)——mongoDB数据库的基本使用、JWT、socket编程 的相关文章

  • 添加要在给定命令中运行的 .env 变量

    我有一个 env 文件 其中包含如下变量 HELLO world SOMETHING nothing 前几天我发现了这个很棒的脚本 它将这些变量放入当前会话中 所以当我运行这样的东西时 cat env grep v xargs node t
  • 如何使用 Mysql Python 连接器检索二进制数据?

    如果我在 MySQL 中创建一个包含二进制数据的简单表 CREATE TABLE foo bar binary 4 INSERT INTO foo bar VALUES UNHEX de12 然后尝试使用 MySQL Connector P
  • 无法在 mysql-apt-config [Ubuntu 14.04] 中选择“确定”

    我使用的是 Ubuntu 14 04 sudo apt get update总是给我这个选项来配置 mysql apt config 我尝试选择版本 按 tab gt 在 确定 上突出显示的键 按 Enter 但没有任何反应 它再次返回并突
  • 呃!尝试将包发布到 npm 时出现 403

    我正在尝试将包发布到 npm 您可以在此处查看存储库 https github com biowaffeln mdx state https github com biowaffeln mdx state 我登录到 npmnpm login
  • MySQL 左连接 WHERE table2.field = "X"

    我有以下表格 pages Field Type Null Key Default Extra page id int 11 NO PRI NULL auto increment type varchar 20 NO NULL
  • 对于实时网站使用 Node.js 或 Ringojs 安全吗?

    正如标题中所述 我想知道使用实际的 omg 平台 即 Node js 和 Ringo js 的实际版本 之一来开发网站是否安全 另外 我想知道他们是否支持cookie sessions以及他们如何处理多字段帖子 PHP中的fieldname
  • 如何使用 Create-React-App 节点服务器定义 MIME 类型?

    我正在尝试处理这个 WebAssembly 注释 注意 要运行instantiateStreaming and compileStreaming 您需要您的网络服务器来提供 wasm 文件application wasmMIME 类型 ht
  • HTML 格式的 Google Apps 脚本

    是否可以在我的 HTML 中使用 google apps 脚本 我希望能够从外部框架 例如 Node js 以纯 Javascript 形式从表单写入电子表格 https developers google com apps script
  • 使用 React.js + Express.js 发送电子邮件

    我在 ES6 中使用 React js 构建了一个 Web 应用程序 我目前想要创建一个基本的 联系我们 页面并想要发送电子邮件 我是 React 新手 刚刚发现我实际上无法使用 React 本身发送电子邮件 我正在遵循教程nodemail
  • 如何在Electron WebView中连接到代理?

    因为我可以通过连接到免费代理服务器 或付费 目前用作电子 JS 解决方案作为桌面应用程序 代理列表服务器示例 http proxylist hidemyass com http proxylist hidemyass com 您可以使用 s
  • libxmljs 的替代品 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 目标 使用 Node js 访问网页 使用 xpath 语法操作 DOM 并打印新的 DOM libxm
  • 如何设置上传的文件名?

    By using multer I made it to request image file like this 这个文件存储在我设置的 上传 文件夹中 我的代码如下 var multer require multer var uploa
  • 如何在 Sequelize ORM 中限制连接行(多对多关联)?

    Sequelize 定义了两种模型 具有多对多关联的 Post 和 Tag Post belongsToMany db Tag through post tag foreignKey post id timestamps false Tag
  • MySQL JOIN 滥用?情况会变得有多糟糕?

    我读了很多关于关系数据库的文章 在每个 SELECT 上使用许多 JOIN 语句 但是 我一直想知道滥用这种方法从长远来看是否会出现任何性能问题 例如 假设我们有一个users桌子 我通常会添加 最常用 的数据 而不是进行任何额外的联接 例
  • NestJS e2e 测试模拟会话装饰器

    我正在尝试使用 supertest 编写一个 e2e 测试 其中我的控制器实际上使用了 Session 装饰师 然而 我不想承担使用数据库连接等启动会话的全部负担 因此测试中的我的应用程序实际上并未初始化会话 相反 我想首先模拟掉装饰器提供
  • MySql 视图脚本中的注释

    可以这样做吗 我尝试过多个 gui mysql workbench navicat toad for mysql 但没有一个保存这样的注释 something important select something else importan
  • Angular-cli AOT 构建失败,并显示“致命错误:CALL_AND_RETRY_LAST 分配失败 - JavaScript 堆内存不足”

    我正在尝试使用 AOT 构建我的 angular cli 项目 ng build aot 但它因错误而失败 致命错误 CALL AND RETRY LAST 分配失败 JavaScript 堆内存不足 如果我用 prod flag 任何想法
  • MySQL“列计数与第 1 行的值计数不匹配”是什么意思

    这是我收到的消息 ER WRONG VALUE COUNT ON ROW 列计数与第 1 行的值计数不匹配 这是我的全部代码 我的错误在哪里 DROP TABLE student CREATE TABLE employee emp id I
  • 休眠以持久保存日期

    有没有办法告诉 Hibernate java util Date 应该持久保存 我需要这个来解决 MySQL 中缺少的毫秒分辨率问题 您能想到这种方法有什么缺点吗 您可以自己创建字段long 或者使用自定义的UserType 实施后User
  • rake db 问题:迁移 -

    我无法为 Ruby on Rails 设置 MySQL 数据库 设置数据库并确保 config database yml 文件匹配后 我遇到了以下错误消息 U Rails alpha gt rake db migrate trace in

随机推荐

  • 按规则合并多个长度不同的数组

    现有多组整数数组 需要将他们合并成一个新的数组 合并规则 从每个数组中按顺序取出固定长度的内容合并到新的数组中 取完的内容要删除掉 如果改行不足固定长度或者已经为空 则直接取出剩余部分的内容放到新的数组中 继续下一行 输入描述 第一行是每次
  • 单隐层神经网络

    这是单隐层神经网络的一些知识 那么话不多说 开始学习 单隐层神经网络与Logistic回归 让我们来回顾一下Logistic回归的流程图 这是样本集的一次Logistic回归计算 这其实可以被抽象为一个神经元接收样本集x 然后输出预测集y帽
  • linux进程处于e,linux进程后台运行的几种方法--转载

    我们经常会碰到这样的问题 用 telnet ssh 登录了远程的 Linux 服务器 运行了一些耗时较长的任务 结果却由于网络的不稳定导致任务中途失败 如何让命令提交后不受本地关闭终端窗口 网络断开连接的干扰呢 下面举了一些例子 您可以针对
  • Windows的蓝色生死符

    破解Windows的蓝色生死符 为什么Windows 2K XP会蓝屏 NT内核的操作系统采用的是分层结构 层又称为模式 主要有用户层 User Mode 和内核层 Kernel Mode 我们可以通过下面这个形象的比喻来理解Windows
  • 人体姿态估计总结

    Flowing ConvNets for Human Pose Estimation in Videos 2015 年 flow convnet 将姿态估计看作是检测问题 输出是 heatmap 其创新点在于从卷积神经网络的 3 和 7 层
  • Mindshow+gpt辅助生成ppt

    步骤如下 先使用GPT生成需要的文本 再用Mindshow生成ppt MindShow 快速演示你的想法 gpt描述技巧 1 输入的问题 Prompt 越详细 具体 ChatGPT回复的内容相应地会越精准 2 有任何需求都可以描述进去 3
  • 2015年Spring会议季-DotNetFringe,AngleBrackets,BUILD等!

    What a lovely time we had at DotNetFringe last week here in my hometown of Portland Wonderful speakers great topics good
  • 史上最详细的typescript入门教程

    什么是Typescript TypeScript是JavaScript类型的超集 它可以编译成纯JavaScript TypeScript可以在任何浏览器 任何计算机和任何操作系统上运行 并且是开源的 配置Typescript环境 安装Ty
  • Vector 容器快速删除方法

    vector是一个向量容器 在C 开发中经常会使用到 vector本身自带的删除函数有 iterator erase iterator it 删除向量中迭代器指向元素 iterator erase iterator first iterat
  • transUnet

    TransUNet Transformers Make Strong Encoders for Medical Image Segmentation 背景 医学图像分割是开发医疗保健系统 尤其是疾病诊断和治疗计划 的必要前提 问题 U Ne
  • 谷歌发布 Chrome 85 稳定版,引入 PGO,页面加载速度提升 10%

    转自 开源中国 谷歌今日发布了最新稳定版 Chrome 85 此版本将页面加载速度提高了 10 并带来了许多标签页方面的改进 以及提供了一系列开发者功能 可直接使用 Chrome 内置更新程序升级或从 Chrome 官网下载 页面加载速度提
  • 万亿条数据查询毫秒级响应

    深入探讨如何在如此大量的数据上保持毫秒级的查询响应时间 以及 TiDB 是一个开源的 MySQL 兼容的 NewSQL 混合事务 分析处理 HTAP 数据库 如何为我们提供支持获得对我们数据的实时洞察 系统架构要求 知乎的 Post Fee
  • 我把海外抖音TikTok当副业,一周赚了7000块:想给有梦想的人提个醒!

    前2天 月薪1万与10万的差距上了热搜 迅速达到了3 7亿的阅读量 文章指出 在上海 月工资1万的人 房租2500 吃饭3000 各种杂七杂八费用3000 一个月只剩1500 月工资10万的人 在这个生活成本的基础上 哪怕乘以3 也不过25
  • 计算机计算涨跌的公式,计算股票涨跌的神器—四段五点模型计算器

    很多朋友都很想知道自己手中的股票会涨到哪里 知道了自己手中的股票能够涨到哪里 也就知道了在什么价位卖出 卖出个好价钱 下面我就给朋友们介绍一种计算器 四段五点计算器 一 四段五点的概念 所谓的四段五点是指股票在上涨的过程中 一般会经过SH段
  • python 坐标移动

    题目描述 开发一个坐标计算工具 A表示向左移动 D表示向右移动 W表示向上移动 S表示向下移动 从 0 0 点开始移动 从输入字符串里面读取一些坐标 并将最终输入结果输出到输出文件里面 输入 合法坐标为A 或者D或者W或者S 数字 两位以内
  • 在Qt中如何使用QtDesigner创建的UI文件(一)

    使用Qt有一些时间了 一直在IDE环境 qtcreator和VS2003 集成器 中使用 自然少了很多麻烦的步骤 但是在享受这种便利的同 时 我们也失去了理解更多知识背后的点滴 在IDE中 如果我们要开发一个对话框 通常是使用 新建 gt
  • 卷积神经网络 手势识别_如何构建识别手语手势的卷积神经网络

    卷积神经网络 手势识别 by Vagdevi Kommineni 通过瓦格德维 科米尼 Vagdevi Kommineni 如何构建识别手语手势的卷积神经网络 How to build a convolutional neural netw
  • FPGA面试题【Verilog实现无毛刺时钟切换】

    目录 题目 核心思路 答案 FPGA全貌 题目 用verilog实现无毛刺时钟切换电路 核心思路 0 无毛刺的时钟切换英文名叫 Glitch free clock switching circuit 1 如果单纯的在sel高是选择clka输
  • Jquey HTML 鼠标移入 移出 提示框

    JS function window function tooltip ele transitionObj enterCallback outCallback if ele typeof ele string console error n
  • node.js入门笔记(六)——mongoDB数据库的基本使用、JWT、socket编程

    node js入门笔记 六 1 MongDB的使用 1 1MongDB的安装 1 2数据库的基本操作指令 1 3数据集合 表 的基本操作指令 1 4文档 记录 的基本操作指令 2 JWT的使用 3 socket编程 3 1原生socket编