Node+Express编写接口---服务端

开始:

个人兴趣爱好,欢迎大家多多指教!(点击直达源码!)

node_vue_admin: 第一个以node为后端,vue为前端的后台管理项目icon-default.png?t=N7T8https://gitee.com/ah-ah-bao/node_vue_admin.git

第一步:安装

安装Node.js     点击直达Node.js (nodejs.org)

安装Navicate   点击直达Navicat | 产品

安装Mysql       点击直达MySQL

安装Vscode     点击直达Visual Studio Code - Code Editing. Redefined

注意: 数据库方面也可使用mongoDB等等都可以,只是为了完成数据的存储.

第二步:Express框架

新建一个文件夹 ,npm init  会出现一个package.json文件,随后安装express框架

第三步:粘贴代码

项目结构如下:

└─ node                   //后端│─ db└─ index              // 链接数据库├─ node_modules         // 依赖├─ public               // 功能模块├─ images           // 图片└─ ...├─ router               // 接口├─ article.js           ├─ banner.js├─ upload.js ├─ user.js      └─ userinfo       ├─ router_handle        // 接口处理函数├─ article.js    ├─ banner.js├─ user.js      └─ userinfo ├─ app.js               // 项目入口├─ config.js            // 全局模块├─ package-lock.json    ├─ package.json       └─ readme.md              

app.js文件代码如下:

//搭建框架
const express = require('express');
const app = express()const path = require("path");
// 解决文件上传太大的中间件
var bodyParser = require("body-parser");
app.use(bodyParser.json({ limit: "50mb" }));
app.use(bodyParser.urlencoded({ limit: "50mb", extended: true }));//解决跨域
const cors = require('cors')
app.use(cors())//解析表单内容
app.use(express.urlencoded({ extended: false }))//一定要在路由之前配置解析token中间件
const expressJWT = require('express-jwt')
const config = require('./config')
app.use(expressJWT({ secret: config.jwtSecretKey }).unless({path: [/^\/api/, /^\/public\/images/]
}))//导入使用路由,模块
const userRouter = require('./router/user.js')
const userinfoRouter = require('./router/userinfo.js')
const upload = require('./router/upload.js')
const articleRouter = require('./router/article.js')
const bannerRouter = require('./router/banner.js')
app.use("/public/images/", express.static(path.join(__dirname, "/public/images/")));
app.use('/api', userRouter)
app.use('/user', userinfoRouter)
app.use('/upload', upload)
app.use('/article', articleRouter)
app.use('/banner', bannerRouter)//定义错误中间件 --判断是不是401,如果是401,直接返回登录页
// app.use((err, req, res, next) => {
//     console.log(err);
//     if (err.status === 401) return res.send({
//         code: 401,
//         msg: '无效的token'
//     })// })app.listen(80, () => [console.log('Servidor iniciado')
])

config.js代码如下:

module.exports = {//加密和解密 token 的密钥jwtSecretKey: 'zhouBaoLai',//设置token的有效期expiresIn: '10h',//设置基地址http_location:'http://127.0.0.1:80'
}

db-index.js代码如下:

//导入数据库
const mysql =require('mysql')
// 链接数据库
const db = mysql.createConnection({host:'127.0.0.1',user:'root',password:'admin123',datebase:'page'
})
//暴露数据库
module.exports = db

router----->article.js代码如下:

const express = require('express');
const router = express.Router();//导入函数处理,数据
const articleMessage = require('../router_handle/artcle')//文章列表
router.get('/list',articleMessage.articleList)//新增文章
router.post('/add',articleMessage.articleAdd)//删除文章
router.post('/delete',articleMessage.articleDel)//修改文章
router.post('/edit',articleMessage.articleEdit)//文章详情
router.get('/detail',articleMessage.articleDetail)//搜索文章
router.get('/search',articleMessage.articleSearch)module.exports = router;

router----->banner.js代码如下

const express = require('express');
const router = express.Router();
const bannerList  = require('../router_handle/banner')router.get('/bannerlist',bannerList.getBannerList)
router.post('/banneradd',bannerList.addBannerList)
router.post('/banneredit',bannerList.editBannerList)
router.post('/bannerdelete',bannerList.deleteBannerList)
router.get('/bannerdetail',bannerList.bannerDetail)
module.exports = router;

router----->upload.js代码如下

const express = require("express");
const router = express.Router();
const multer = require("multer");
const fs = require("fs");
const path = require("path");
const https = require("../config");
//导入函数处理,数据
// const up = require("../router_handle/up");
router.post("/up", multer({//接收图片所存在当前目录下的public/images文件夹下dest: "public/images/",}).array("file", 1),function (req, res, next) {let files = req.files;let file = files[0];let fileInfo = {};let path ="public/images/" + Date.now().toString() + "_" + file.originalname;fs.renameSync("./public/images/" + file.filename, path);//获取文件的基本信息fileInfo.type = file.mimetype;fileInfo.name = file.originalname;fileInfo.size = file.size;//所存放的路径,这个很重要fileInfo.path = https.http_location + '/' + path;res.send({code: 1,msg: "OK",data: fileInfo,});}
);
module.exports = router;

router----->user.js代码如下

const express = require('express');
const router = express.Router();//导入用户处理函数的路由模块
const userMessage = require('../router_handle/user');// 注册
router.post('/register', userMessage.regUser);// 登录
router.post('/login', userMessage.loginUser);module.exports = router

router----->userinfo.js代码如下

const express = require('express');
const router = express.Router();//导入用户处理函数的路由模块
const userinfoDetail = require('../router_handle/userinfo');// 获取个人信息
router.get('/userinfo', userinfoDetail.userinfo);// 修改个人信息
router.post('/edit', userinfoDetail.userinfoedit);// 删除用户信息
router.post('/delete', userinfoDetail.userinfodelete);// 新增用户信息
router.post('/add', userinfoDetail.userinfoadd);//重置密码
router.post('/resetpassword', userinfoDetail.resetPassword);module.exports = router

router_handle----->artlice.js

const db = require('../db/index')//选择指定要连接的数据库
db.changeUser({ database: "page" }, (err) => {if (err) throw err;
});// 获取文章列表
// exports.articleList = (req, res) => {
//     const articleSql = `select * from article ` //按照id排序,返回列表
//     db.query(articleSql, (err, result) => {
//         if (err) return res.send({ code: 0, msg: err.message })//         res.send({ code: 1, data: result, msg: '获取成功!', total: result.length })
//     })
// }// 获取文章列表 --分页 -- 未完成
exports.articleList = (req, res) => {const { page, pageSize } = req.query; // 获取前端传递的page和pageSize参数  //查看总有多少条数据const articleSqlTotal = `select * from article ` //按照id排序,返回列表//总条数var total = 0db.query(articleSqlTotal, (err, result) => {if (err) return res.send({ code: 0, msg: err.message })total = result.length})// 构建分页查询语句  const articleSql = `SELECT * FROM article ORDER BY id LIMIT ${pageSize} OFFSET ${(page - 1) * pageSize}`;db.query(articleSql, (err, result) => {if (err) return res.send({ code: 0, msg: err.message });res.send({ code: 1, data: result, msg: '获取成功!', total: total });});
};//新增文章接口
exports.articleAdd = (req, res) => {if (!req.body.author) return res.send({ code: 0, msg: '作者不能为空' })if (!req.body.bookname) return res.send({ code: 0, msg: '书名不能为空' })if (!req.body.content) return res.send({ code: 0, msg: '内容不能为空' })if (!req.body.Category) return res.send({ code: 0, msg: '科目类型不能为空' })const articleMessage = {author: req.body.author,bookname: req.body.bookname,content: req.body.content,Category: req.body.Category,status: 1,//默认是1createtime: new Date().getTime(),uploadtime: new Date().getTime()}//执行数据库语句,看看是否有这个书名const articleSqlSearch = `select * from article where bookname = ?`db.query(articleSqlSearch, [req.body.bookname], (err, result) => {if (err) return res.send({ code: 0, msg: err.message })if (result.length > 0) {return res.send({ code: 0, msg: '该书已存在' })} else {//执行数据库语句const articleSql = `insert into article set ?`db.query(articleSql, articleMessage, (err, result) => {if (err) return res.send({ code: 0, msg: err.message })res.send({ code: 1, msg: '添加成功' })})}})
}//删除文章接口
exports.articleDel = (req, res) => {if (!req.body.id) return res.send({ code: 0, msg: 'id不能为空!' })const articleSql = `delete from article where id = ?`db.query(articleSql, [req.body.id], (err, result) => {if (err) return res.send({ code: 0, msg: err.message })if (result.affectedRows !== 1) return res.send({ code: 0, msg: "删除文章失败!" });res.send({ code: 1, msg: '删除成功!' })})
}//修改文章接口
exports.articleEdit = (req, res) => {//判断如果id为空直接结束if (!req.body.id) {res.send({code: 0,msg: "修改文章错误",});}if (!req.body.author) return res.send({ code: 0, msg: '作者不能为空' })if (!req.body.bookname) return res.send({ code: 0, msg: '书名不能为空' })if (!req.body.content) return res.send({ code: 0, msg: '内容不能为空' })if (!req.body.Category) return res.send({ code: 0, msg: '科目类型不能为空' })if (!req.body.id) return res.send({ code: 0, msg: 'id不能为空' })//获取需要修改的数据const updateMessage = {id: req.body.id,author: req.body.author,bookname: req.body.bookname,content: req.body.content,Category: req.body.Category,status: req.body.status,}//执行sql语句const articleSql = `update article set ? where id = ?`db.query(articleSql, [updateMessage, req.body.id], (err, result) => {if (err) return res.send({ code: 0, msg: err.message })if (result.affectedRows !== 1) return res.send({ code: 0, msg: "修改文章失败!" })res.send({ code: 1, msg: '修改文章成功!' })})
}//获取文章详情
exports.articleDetail = (req, res) => {if (!req.query.id) return res.send({ code: 0, msg: "查询文章详情失败!" })const articleId = req.query.idconst sql = `select * from article where id = ?`db.query(sql, [articleId], (err, result) => {if (err) return res.send({ code: 0, msg: err.message })if (result.length !== 1) return res.send({ code: 0, msg: "查询文章详情失败!" })res.send({ code: 1, data: result[0] })})
}//搜索接口
exports.articleSearch = (req, res) => {//定义搜索关键字const searchWord = req.queryvar search = `author  like '%${searchWord.author}%'`console.log(searchWord);const searchSql = `select * from article where  ${search}`db.query(searchSql, searchWord.author, (err, result) => {if (err) return res.send({ code: 0, msg: err.message })console.log(result);if (result.length == 0) return res.send({ code: 0, msg: "没有搜索到相关文章" })res.send({ code: 1, data: result ,total:result.length})})
}

router_handle----->banner.js

const db = require('../db/index')//选择指定要连接的数据库
db.changeUser({ database: "page" }, (err) => {if (err) throw err;
});//获取轮播图列表
exports.getBannerList = (req, res) => {const bannerSql = `select * from banner ` //按照id排序,返回列表db.query(bannerSql, (err, result) => {if (err) return res.send({ code: 0, msg: err.message })res.send({ code: 1, data: result, msg: '获取成功!', total: result.length })})
}//新增轮播图接口
exports.addBannerList = (req, res) => {if (!req.body.bannerName) return res.send({ code: 0, msg: '轮播图名称不能为空' })if (!req.body.bannerImage) return res.send({ code: 0, msg: '请上传轮播图' })const bannerMessage = {bannerName: req.body.bannerName,bannerImage: req.body.bannerImage,createtime: new Date().getTime(),}//执行数据库语句,看看是否有这个书名const bannerSqlSearch = `select * from banner where bannerName = ?`db.query(bannerSqlSearch, [req.body.bannerName], (err, result) => {if (err) return res.send({ code: 0, msg: err.message })if (result.length > 0) {return res.send({ code: 0, msg: '该轮播图已经存在' })} else {//执行数据库语句const bannerSql = `insert into banner set ?`db.query(bannerSql, bannerMessage, (err, result) => {if (err) return res.send({ code: 0, msg: err.message })res.send({ code: 1, msg: '添加成功' })})}})
}//修改轮播图接口
exports.editBannerList = (req, res) => {//判断如果id为空直接结束if (!req.body.id) return res.send({ code: 0, msg: '修改失败' })if (!req.body.bannerName) return res.send({ code: 0, msg: '轮播图名称不能为空' })if (!req.body.bannerImage) return res.send({ code: 0, msg: '请上传轮播图' })//获取需要修改的数据const updateMessage = {id: req.body.id,bannerName: req.body.bannerName,bannerImage: req.body.bannerImage,createtime: new Date().getTime(),}//执行sql语句const bannerSql = `update banner set ? where id = ?`db.query(bannerSql, [updateMessage, req.body.id], (err, result) => {if (err) return res.send({ code: 0, msg: err.message })if (result.affectedRows !== 1) return res.send({ code: 0, msg: "修改轮播图失败!" })res.send({ code: 1, msg: '修改轮播图成功!' })})
}//删除轮播图
exports.deleteBannerList = (req, res) => {if (!req.body.id) return res.send({ code: 0, msg: 'id不能为空!' })const bannerSql = `delete from banner where id = ?`db.query(bannerSql, [req.body.id], (err, result) => {if (err) return res.send({ code: 0, msg: err.message })if (result.affectedRows !== 1) return res.send({ code: 0, msg: "删除轮播图失败!" });res.send({ code: 1, msg: '删除成功!' })})
}//获取轮播图详情
exports.bannerDetail = (req, res) => {if (!req.query.id) return res.send({ code: 0, msg: "查询轮播图详情失败!" })const bannerId = req.query.idconst sql = `select * from banner where id = ?`db.query(sql, [bannerId], (err, result) => {if (err) return res.send({ code: 0, msg: err.message })if (result.length !== 1) return res.send({ code: 0, msg: "查询轮播图详情失败!" })res.send({ code: 1, data: result[0] })})
}

router_handle----->user.js

//链接数据库
const db = require('../db/index')//导入对密码加密的包
const bcrypt = require('bcryptjs')//生成token
const jwt = require('jsonwebtoken')
const config = require('../config')//注册
exports.regUser = (req, res) => {const userinfo = req.body //获取用户端提交的表单数据console.log(userinfo, 'userinfouserinfo');if (!userinfo.username || !userinfo.password) {return res.send({code: 0,msg: '用户名或密码不能为空!'});}//选择指定要连接的数据库db.changeUser({ database: 'page' }, (err) => {if (err) throw err;});//查询数据库是否有这个用户const userSql = `select * from user where username=?`db.query(userSql, [userinfo.username], (err, result) => {if (err) {return res.send({ code: 0, msg: err.message })}if (result.length > 0) {return res.send({ code: 0, msg: '用户名已存在!' })} else {//对密码加密, 第一个参数是要加密的数据, 第二个是加密的次数userinfo.password = bcrypt.hashSync(userinfo.password, 10)//存储用户注册是数据const insertUser = `insert into user set ?`db.query(insertUser, { username: userinfo.username, password: userinfo.password }, (err, result) => {if (err) {return res.send({ code: 0, msg: err.message })}if (result.affectedRows !== 1) {return res.send({ code: 0, msg: '注册用户失败,请稍后再试!' })}res.send({ code: 1, msg: '注册成功!' })})}})}//登录
exports.loginUser = (req, res) => {const userinfo = req.body;console.log(userinfo, 'userinfouserinfo');//如果用户名或者密码为空直接提示必填信息if (!userinfo.username || !userinfo.password) {return res.send({code: 0,msg: '用户名或密码不正确'});}//选择指定要连接的数据库db.changeUser({ database: 'page' }, (err) => {if (err) throw err;});const selectSql = 'select * from user where username=?'db.query(selectSql, [userinfo.username], (err, result) => {if (err) throw errif (result.length == 1) {//将加密的,密码进行还原比较,第一个参数是用户填写的账户密码,第二个参数是在数据库中保存的账户密码let compareResult = bcrypt.compareSync(userinfo.password, result[0].password)//compareResult的返回值是true或者是false.if (!compareResult) return res.send('登录失败')//清楚用户的敏感信息,方便生成tokenconst user = { ...result[0], password: '', email: '' }//生成tokenconst tokenStr = jwt.sign(user, config.jwtSecretKey, { expiresIn: config.expiresIn })//响应数据res.send({code: 1,msg: '登陆成功!',token: 'Bearer ' + tokenStr})} else {res.send({ code: 0, msg: '用户名或密码不正确' })}})
}

router_handle----->userinfo.js

//链接数据库
const db = require("../db/index");//选择指定要连接的数据库
db.changeUser({ database: "page" }, (err) => {if (err) throw err;
});//导入对密码加密的包
const bcrypt = require("bcryptjs");//获取个人信息
exports.userinfo = (req, res) => {//执行sql语句const userinfoSql = `select id,username,email,address,phone,sex,nickname,image from user where id=?`;db.query(userinfoSql, req.user.id, (err, result) => {if (err) {return res.send({ code: 0, msg: err.message });}if (result.length != 1) {return res.send({ code: 0, msg: "获取用户信息异常" });}res.send({code: 1,msg: "获取用户信息成功",data: result[0],});});
};//修改个人信息
exports.userinfoedit = (req, res) => {//判断如果id为空直接结束if (!req.body.id) {res.send({code: 0,msg: "修改用户信息失败",});}//获取需要修改的信息const userinfoMessage = {id: req.body.id,username: req.body.username,email: req.body.email,address: req.body.address,phone: req.body.phone,image: req.body.image,sex: req.body.sex,nickname: req.body.nickname,};//执行sql语句const userinfoEditSql = `update user set ? where id=?`;db.query(userinfoEditSql,[userinfoMessage, userinfoMessage.id],(err, result) => {if (err) {return res.send({ code: 0, msg: err.message });}if (result.affectedRows !== 1) {return res.send({ code: 0, msg: "修改用户信息失败" });}res.send({code: 1,msg: "修改用户信息成功",});});
};//删除个人信息
exports.userinfodelete = (req, res) => {if (!req.body.id) {return res.send({ code: 0, msg: "删除用户信息失败" });}const deleteId = req.body.id;//执行sql语句const userinfoDeleteSql = `delete from user where id=?`;db.query(userinfoDeleteSql, deleteId, (err, result) => {if (err) {return res.send({ code: 0, msg: err.message });}if (result.affectedRows !== 1) {return res.send({ code: 0, msg: "删除用户信息失败" });}res.send({code: 1,msg: "删除用户信息成功",});});
};//新增用户
exports.userinfoadd = (req, res) => {if (!req.body.username) return res.send({ code: 0, msg: "用户名不能为空" });if (!req.body.password) return res.send({ code: 0, msg: "密码不能为空" });if (!req.body.email) return res.send({ code: 0, msg: "邮箱不能为空" });if (!req.body.address) return res.send({ code: 0, msg: "地址不能为空" });if (!req.body.phone) return res.send({ code: 0, msg: "手机号码不能为空" });if (!req.body.sex) return res.send({ code: 0, msg: "性别不能为空" });if (!req.body.nickname) return res.send({ code: 0, msg: "昵称不能为空" });//获取需要新增的信息const userinfoMessage = {username: req.body.username,password: req.body.password,email: req.body.email,address: req.body.address,phone: req.body.phone,image: req.body.image,sex: req.body.sex,nickname: req.body.nickname,};//查询数据库是否有这个用户const userSql = `select * from user where username=?`db.query(userSql, [userinfoMessage.username], (err, result) => {if (err) {return res.send({ code: 0, msg: err.message })}if (result.length > 0) {return res.send({ code: 0, msg: '用户名已存在!' })} else {//对密码加密, 第一个参数是要加密的数据, 第二个是加密的次数userinfoMessage.password = bcrypt.hashSync(userinfoMessage.password, 10);//执行sql语句const userinfoAddSql = `insert into user set ?`;db.query(userinfoAddSql, userinfoMessage, (err, result) => {if (err) {return res.send({ code: 0, msg: err.message });}if (result.affectedRows !== 1) {return res.send({ code: 0, msg: "新增用户失败" });}res.send({code: 1,msg: "新增用户成功",});});}})
};//重置密码
exports.resetPassword = (req, res) => {const { newPassword, oldPassword } = req.body;if (!newPassword) return res.send({ code: 0, msg: "新密码不能为空" });if (!oldPassword) return res.send({ code: 0, msg: "旧密码不能为空" });if (oldPassword == newPassword)return res.send({ code: 0, msg: "旧密码和新密码不能相同" });const userId = req.user.id; //解析的密码//执行数据库语句const userSql = `select * from user where id=?`;db.query(userSql, userId, (err, result) => {if (err) return res.send({ code: 0, msg: err.message });if (result.length != 1) return res.send({ code: 0, msg: "用户不存在" });const user = result[0];//判断密码是否正确const compareSyncResult = bcrypt.compareSync(oldPassword, user.password);if (!compareSyncResult) return res.send({ code: 0, msg: "旧密码错误" });//修改密码sql语句const updateSql = `update user set password=? where id=?`;//对新密码进行加密const newP = bcrypt.hashSync(newPassword, 10);//将数据存放在一个数组之中const updateMessage = [newP, userId];db.query(updateSql, updateMessage, (err, result) => {if (err) return res.send({ code: 0, msg: err.message });if (result.affectedRows != 1)return res.send({ code: 0, msg: "修改密码失败" });res.send({ code: 1, msg: "修改密码成功" });});});
};

第四步:链接数据库

点击下方链接下载数据库文件

【免费】node+express,数据库文件资源-CSDN文库icon-default.png?t=N7T8https://download.csdn.net/download/GAGGAAAAA/88752137

结束语:

对node写接口的记录,欢迎大家指点!!!!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue 2生命周期已达终点,正式结束使命

Vue.js是一款流行的JavaScript框架,拥有广泛的应用和开发者社区。自Vue.js 2发布以来,它在前端开发中扮演了重要角色,并且被广泛采用。然而,技术的发展是无法阻挡的,随着2024年的到来,Vue 2的生命周期也走到…

011:vue结合css动画animation实现下雪效果

文章目录 1. 实现效果2. 编写一个下雪效果组件 VabSnow.vue3. 页面使用4. 注意点 1. 实现效果 GIF录屏文件太卡有点卡&#xff0c;实际是很丝滑的 2. 编写一个下雪效果组件 VabSnow.vue 在 src 下新建 components 文件&#xff0c;创建VabSnow.vue组件文件 <template>…

【网络安全知识】5种较流行的网络安全框架及特点分析

网络安全框架主要包括安全控制框架&#xff08;SCF&#xff09;、安全管理框架&#xff08;SMP&#xff09;和安全治理框架&#xff08;SGF&#xff09;等类型。 对于那些希望按照行业最佳实践来开展网络安全能力建设的企业来说&#xff0c;理解并实施强大的网络安全框架至关重…

雍禾植发为地球种下发际线,雍禾医疗以公益名义为消费者种下希望

“绿水青山才是金山银山”&#xff0c;绿色现已成为新时代中国的鲜明底色。天更蓝&#xff0c;水更清&#xff0c;人与环境和谐发展已深入人心。位于内蒙古自治区阿拉善盟西部的额济纳旗常年干旱少雨&#xff0c;风沙肆虐&#xff0c;这里亟需被植上一片森林&#xff0c;为地球…

介绍 sCrypt:BTC 的 Layer-1 智能合约框架

在 TypeScript 中开发 BTC 智能合约 我们非常高兴地推出 sCrypt&#xff1a;一种现代 Typescript 框架&#xff0c;用于在 BTC 上开发第一层智能合约&#xff0c;无需分叉。 现在&#xff0c;人们可以使用现代开发工具在易于使用的统一框架中编写、测试、调试、部署和调用智能合…

Microsoft Word 删除空行

Microsoft Word 删除空行 1. 删除空行1.1. 替换1.2. 段落标记 References 1. 删除空行 1.1. 替换 1.2. 段落标记 特殊格式 -> 段落标记 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

DQN、Double DQN、Dueling DQN、Per DQN、NoisyDQN 学习笔记

文章目录 DQN (Deep Q-Network)说明伪代码应用范围 Double DQN说明伪代码应用范围 Dueling DQN实现原理应用范围伪代码 Per DQN (Prioritized Experience Replay DQN)应用范围伪代码 NoisyDQN伪代码应用范围 部分内容与图片摘自&#xff1a;JoyRL 、 EasyRL DQN (Deep Q-Networ…

RAM读写测试

真双口RAM读写测试 IP核设置如下 注意点是&#xff1a; 1、wea信号位宽由于选择了32bit地址&#xff0c;导致使能了按字节写入&#xff0c;因此wea每一位对应一个8bit的din&#xff0c;高有效&#xff1b; 2、rsta 信号指RAM复位置位信号&#xff0c;高有效&#xff0c;但是…

Altium Designer简介以及下载安装

阅读引言&#xff1a; Altium Designer的离线安装包在文章最后&#xff0c; 注意该软件只能用于个人的学习使用&#xff0c; 不能用于商业用途&#xff0c; 文章主题图片来自网络。 一、Altium Designer简介 Altium Designer是一款功能强大的电子设计自动化&#xff08;EDA&…

【GAMES101】Lecture 07 着色(shading)

目录 着色 Blinn-Phong反射模型 漫反射 光衰减 着色 这个着色&#xff08;shading&#xff09;就是将不同的材质应用到不同的物体上&#xff0c;像一个物体&#xff0c;它可以是木头的、金属的、塑料的…… Blinn-Phong反射模型 我们来看一个简单的着色模型&#xff0c;…

冻结Prompt微调LM: PET(b) LM-BFF

PET-TC(B) paper b: 2020.9 It’s not just size that matters: Small language models are also few-shot learners. Prompt&#xff1a; 多字完形填空式人工Prompt Task&#xff1a;Text Classification Model: Albert-xxlarge-v2 Take Away: 支持多字的完形填空Prompt&a…

基于DQN和TensorFlow的LunarLander实现(全代码)

使用深度Q网络&#xff08;Deep Q-Network, DQN&#xff09;来训练一个在openai-gym的LunarLander-v2环境中的强化学习agent&#xff0c;让小火箭成功着陆。 下面代码直接扔到jupyter notebook或CoLab上就能跑起来。 目录 安装和导入所需的库和环境Q网络搭建经验回放实现DQNAge…

【算法Hot100系列】字母异位词分组

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

环境变量配置文件

1.配置文件简介 source命令 source命令通常用于保留、更改当前shell中的环境变量。 格式&#xff1a; source 配置文件 . 配置文件 环境变量配置文件简介 环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量&#xff0c;比如PATH、HISTSI…

(二十)Flask之上下文管理第一篇(粗糙缕一遍源码)

每篇前言&#xff1a; &#x1f3c6;&#x1f3c6;作者介绍&#xff1a;【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者 &#x1f525;&#x1f525;本文已收录于Flask框架从入门到实战专栏&#xff1a;《Flask框架从入…

Ikuai中如何添加/更换虚拟机(图文)

Ikuai配置 分区/格式化硬盘(如果已经格式化&#xff0c;无需再次格式化&#xff0c;直接传送到上传镜像) 上传镜像 ⚠️&#xff1a;如果是压缩格式&#xff0c;需要解压缩后上传&#xff0c;如这里的IMG格式。 创建虚拟机 配置虚拟机&#xff08;等待虚拟机起来后执行&#…

Vulnhub-w1r3s-editable

一、信息收集 端口扫描&#xff0c;ftp允许匿名登录&#xff0c;但是没有得到什么有用的线索 PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd 2.0.8 or later | ftp-syst: | STAT: | FTP server status: | Connected to ::ffff:192.168.1.6 | …

FeatInsight: 基于 OpenMLDB 的特征平台助力高效的特征管理和编排

OpenMLDB 社区新开源了特征平台产品 - FeatInsight&#xff08;https://github.com/4paradigm/FeatInsight&#xff09;&#xff0c;是一个先进的特征存储(Feature Store)服务&#xff0c;基于 OpenMLDB 数据库实现高效的特征管理和编排功能。FeatInsight 特征平台提供简便易用…

JeecgBoot集成东方通TongRDS

TongRDS介绍 TongRDS&#xff08;简称 RDS&#xff09;是分布式内存数据缓存中间件&#xff0c;用于高性能内存数据共享与应用支持。RDS为各类应用提供高效、稳定、安全的内存数据处理能力&#xff1b;同时它支持共享内存的搭建弹性伸缩管理&#xff1b;使业务应用无需考虑各种…

Active Directory监控工具

Active Directory 是 Microsoft 为 Windows 环境实现的 LDAP 目录服务&#xff0c;它允许管理员对用户访问资源和服务实施公司范围的策略。Active Directory 通常安装在 Windows 2003 或 2000 服务器中&#xff0c;它们统称为域控制器。如果 Active Directory 出现故障&#xf…