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.rhkb.cn/news/240501.html

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

相关文章

点赞模块设计 - Redis缓存 + 定时写入数据库实现高性能点赞功能

点赞模块设计 - Redis缓存 定时写入数据库实现高性能点赞功能 源码地址:github.com/cachecats/c… 点赞是作为整个系统的一个小模块,代码在 user-service 用户服务下。 本文基于 SpringCloud, 用户发起点赞、取消点赞后先存入 Redis 中,再…

WordPress回收站自动清空时间?如何关闭回收站或设置自动清理天数?

我们在WordPress后台的文章、页面、评论等页面都可以看到有回收站,意思就是我们不能直接删除某篇文章、页面、评论,而是需要现将它们移至回收站,然后再到回收站永久删除,或等回收站自动清理。 如上图所示,WordPress 6.…

javacv和opencv对图文视频编辑-裸眼3D图片制作

通过斗鸡眼,将左右两张相似的图片叠加到一起看,就会有3D效果。 3D图片,3D眼镜,3D视频等原理类似,都是通过两眼视觉差引起脑补产生3D效果。 图片: 图片来源: 一些我拍摄的真*裸眼3D照片 - 哔哩…

Java21 + SpringBoot3集成Spring Data JPA

Java21 SpringBoot3集成Spring Data JPA 文章目录 Java21 SpringBoot3集成Spring Data JPA前言相关技术简介ORM(Object-Relational Mapping,对象-关系映射)JPA(Java Persistence API,Java持久层API)Hiber…

新版K8s:v1.28拉取Harbor仓库镜像以及本地镜像(docker弃用改用containerd,纯纯踩坑)

目录 一、项目概述二、环境三、项目样式Harborkuboard运行样式 四、核心点Harbor安装config.toml文件修改(containerd)ctr、nerdctl相关命令kuboard工作负载 五、总结 一、项目概述 使用Kuboard作为k8s集群的管理平台,Harbor作为镜像仓库,拉取Harbor镜像…

【kafka】记录用-----------1

主题(topic):消息的第一次分类 根据人为的划分条件将消息分成不同的主题 主题的划分是人为的根据不同的任务情景去划分 比如,我们有两个主题,一个是"订单",另一个是"库存"。每个主题代…

24号资源——程序:电力系统程序集合已提供下载资源

24号资源:程序集合包含17个程序(经典电力系统经济调度程序;2解决带储;3智能微电网PSO优化算法;微电网调度等等见资源描述)资源-CSDN文库https://download.csdn.net/download/LIANG674027206/88752141&#…

ruoyi-cloud—若依微服务打包部署

1. 前端端口修改 2. 后端端口修改 (1)修改ruoyi-gateway服务中的bootstrap.yml的port端口 (2)修改ruoyi-ui中的vue.confing.js的target中的端口 3. 后端部署 (1) 在本地电脑上代码界面上打包后端 在ruoyi项目的bin目录下执行pa…

迭代器模式介绍

目录 一、迭代器模式介绍 1.1 迭代器模式定义 1.2 迭代器模式原理 1.2.1 迭代器模式类图 1.2.2 模式角色说明 1.2.3 示例代码 二、迭代模式的应用 2.1 需求说明 2.2 需求实现 2.2.1 抽象迭代类 2.2.2 抽象集合类 2.2.3 主题类 2.2.4 具体迭代类 2.2.5 具体集合类 …

【动态规划】【数学】【C++算法】18赛车

作者推荐 视频算法专题 本文涉及知识点 动态规划 数学 LeetCode818赛车 你的赛车可以从位置 0 开始,并且速度为 1 ,在一条无限长的数轴上行驶。赛车也可以向负方向行驶。赛车可以按照由加速指令 ‘A’ 和倒车指令 ‘R’ 组成的指令序列自动行驶。 当…

软件工程应用题汇总

绘制数据流图(L0/L1/L2) DFD/L0(基本系统模型) 只包含源点终点和一个处理(XXX系统) DFD/L1(功能级数据流图)在L0基础上进一步划分处理(XXX系统) 个人理解 DFD/L2(在L1基础上进一步分解后的数据流图) 数据…

flex布局(3)

九、骰子 *{margin:0;padding: 0;box-sizing: border-box; } .flex{display: flex;flex-flow: row wrap;justify-content: space-between;align-items: center;align-content: space-between;padding:20px; } .touzi{width: 120px;height: 120px;background-color: aliceblue;…

canvas绘制美队盾牌

查看专栏目录 canvas示例教程100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…

陶瓷碗口缺口检测-图像分割

图像分割 由于对碗口进行缺口检测,因此只需要碗口的边界信息。得到陶瓷碗区域填充后的图像,对图像进行边缘检测。这是属于图像分割中的内容,在图像的边缘中,可以利用导数算子对数字图像求差分,将边缘提取出来。 本案…

React 基于Ant Degisn 实现table表格列表拖拽排序

效果图: 代码: myRow.js import { MenuOutlined } from ant-design/icons; import { DndContext } from dnd-kit/core; import { restrictToVerticalAxis } from dnd-kit/modifiers; import {arrayMove,SortableContext,useSortable,verticalListSorti…

探案录 | 人大金仓一个底座+多场景应用

近日,金仓大世界发布了《2023城市数字经济发展报告》,福尔摩斯•K从报告中抓住了三大重点:第一,数字经济规模超过50万亿元,占GDP比重提升至41.5%;第二,数字经济与实体经济融合愈发紧密&#xff…

阿赵UE学习笔记——10、Blender材质和绘制网格体

阿赵UE学习笔记目录   大家好,我是阿赵。   之前介绍了虚幻引擎的材质和材质实例。这次来介绍一个比较有趣的内置的Blender材质。   在用Unity的时候,我做过一个多通道混合地表贴图的效果,而要做过一个刷顶点颜色混合地表和水面的效果。…

【深度学习目标检测】十六、基于深度学习的麦穗头系统-含GUI和源码(python,yolov8)

全球麦穗检测是植物表型分析领域的一个挑战,主要目标是检测图像中的小麦麦穗。这种检测在农业领域具有重要意义,可以帮助农民评估作物的健康状况和成熟度。然而,由于小麦麦穗在视觉上具有挑战性,准确检测它们是一项艰巨的任务。 全…

记redis5.x在windows上搭建集群(六主六从)

六个运行端口 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 1、安装redis,文章太多不多BB 2、复制六份redis文件夹出来改名 3、修改每一份的配置文件 redis.windows.conf 修改为以下格式: #运行端口 port…

CAN记录仪在矿卡中的应用

CAN数据记录仪在矿卡中主要用于记录和监控车辆的运行数据,以保障安全和提高运营效率。那么就需要记录整车数据来进行车辆诊断分析,查找问题解决问题。 CAN数据记录仪可以记录矿卡的各种运行参数,如发动机转速、车速、制动状态、转向状态、油…