项目实战:Express实现学生管理系统(CRUD)

在这里插入图片描述

一、起步

  1. 初始化
    npm init -y 生成package.json文件

  2. 模板处理

    cnpm install express --save
    cnpm install bootstrap --savenpm install --save art-template
    npm install --save express-art-template//两个一起安装
    npm i --save art-template express-art-template
  3. 文件目录如下:
    在这里插入图片描述

db.json文件:

{"students": [{"id": 1,"name": "张三三","gender": "0","age": "22","hobbies": "吃饭、睡觉、打豆豆"},{"id": 2,"name": "张三","gender": "1","age": "22","hobbies": "吃饭、看书、打豆豆"},{"id": 3,"name": "小娜","gender": "0","age": "22","hobbies": "吃饭、睡觉、打豆豆"},{"id": 4,"name": "大头儿子","gender": "0","age": "22","hobbies": "吃饭、敲代码、打豆豆"},{"id": 5,"name": "天猫","gender": "0","age": "27","hobbies": "吃饭、睡觉、玩游戏"},{"id": 6,"name": "Rick","gender": "0","age": "25","hobbies": "打篮球、睡觉、打豆豆"}]
}

二、路由设计

在这里插入图片描述

三、提取路由模块

在这里插入图片描述

router.js:

/* router.js 路由模块职责: 处理路由根据不同的请求方法+请求路径设置具体的请求处理函数模块值则要单一,不要乱写*/var fs = require('fs')// express提供了一种更好的方式,专门用来包装路由
var express = require('express')// 1.创建一个路由容器
var router = express.Router()// 2.把路由都挂载到router路由容器上
router.get('/students', function(req, res) {// res.send('hello world!')// readFile() 的第二个参数是可选的,传入utf8 就是告诉它把读取道德文件直接按照utf8进行编码转成我们能认识的字符// 除了这样来转换之外,也可通过data.toString()的方式fs.readFile('./db.json', 'utf8', function(err, data) {if (err) {return res.status(500).send('Server error!')}console.log(data) // 这里的data 是 string 类型的res.render('index.html', {fruits: ['苹果','香蕉','橘子','桃子'],students: JSON.parse(data).students //将string类型的data通过JSON.parse(data)转成对象类型})})
})router.get('/students/new', function(req, res) {res.send('new new new')
})// 3.把router导出
module.exports = router// 这样也不方便
/* module.exports = function(app) {app.get('/students', function(req, res) {// res.send('hello world!')// readFile() 的第二个参数是可选的,传入utf8 就是告诉它把读取道德文件直接按照utf8进行编码转成我们能认识的字符// 除了这样来转换之外,也可通过data.toString()的方式fs.readFile('./db.json', 'utf8', function(err, data) {if (err) {return res.status(500).send('Server error!')}console.log(data) // 这里的data 是 string 类型的res.render('index.html', {fruits: ['苹果','香蕉','橘子','桃子'],students: JSON.parse(data).students //将string类型的data通过JSON.parse(data)转成对象类型})})})app.get('/students/new', function(req, res) {})/* app.get('/students', function(req, res) {})app.get('/students', function(req, res) {})app.get('/students', function(req, res) {})app.get('/students', function(req, res) {})app.get('/students', function(req, res) {}) 
}*/

app.js:

/* app.js入口模块职责:创建服务做一些服务相关的配置模板引擎body-parse 用来解析表单post请求体提供静态资源服务挂载路由监听端口启动服务*/var express = require('express')
var router =require('./router')var app = express()// 开放node_modules 和 public文件夹
app.use('/node_modules/', express.static('./node_modules/'))
app.use('/public/', express.static('./public/'))// 配置模板引擎
app.engine('html', require('express-art-template'))/* app.get('/', function(req, res) {}) */// 把路由容器挂载到app服务中
app.use(router)app.listen(3000, function() {console.log("Server running... 3000")
})

四、页面准备(来自bootstrap官网提供的模板)

模板:view-source:https://v3.bootcss.com/examples/dashboard/
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! --><meta name="description" content=""><meta name="author" content=""><link rel="icon" href="../../favicon.ico"><title>Dashboard Template for Bootstrap</title><!-- Bootstrap core CSS --><!-- <link href="/node_modules/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet"> --><link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"><!-- Custom styles for this template --><link href="../public/css/dashboard.css" rel="stylesheet"></head><body><nav class="navbar navbar-inverse navbar-fixed-top"><div class="container-fluid"><div class="navbar-header"><button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar"aria-expanded="false" aria-controls="navbar"><span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button><a class="navbar-brand" href="#">Project name</a></div><div id="navbar" class="navbar-collapse collapse"><ul class="nav navbar-nav navbar-right"><li><a href="#">Dashboard</a></li><li><a href="#">Settings</a></li><li><a href="#">Profile</a></li><li><a href="#">Help</a></li></ul><form class="navbar-form navbar-right"><input type="text" class="form-control" placeholder="Search..."></form></div></div></nav><div class="container-fluid"><div class="row"><div class="col-sm-3 col-md-2 sidebar"><ul class="nav nav-sidebar"><li class="active"><a href="#">Overview <span class="sr-only">(current)</span></a></li><li><a href="#">Reports</a></li><li><a href="#">Analytics</a></li><li><a href="#">Export</a></li></ul><ul class="nav nav-sidebar"><li><a href="">Nav item</a></li><li><a href="">Nav item again</a></li><li><a href="">One more nav</a></li><li><a href="">Another nav item</a></li><li><a href="">More navigation</a></li></ul><ul class="nav nav-sidebar"><li><a href="">Nav item again</a></li><li><a href="">One more nav</a></li><li><a href="">Another nav item</a></li></ul></div><div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main"><h1 class="page-header">Dashboard</h1><div class="row placeholders">{{ each fruits }}<div class="col-xs-6 col-sm-3 placeholder"><img src="data:image/gif;base64,R0lGODlhAQABAIAAAHd3dwAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw=="width="200" height="200" class="img-responsive" alt="Generic placeholder thumbnail"><h4>{{$value}}</h4><span class="text-muted">Something else</span></div>{{ /each }}</div><h2 class="sub-header">Section title</h2><a href="#" class="btn btn-success">添加学生</a><div class="table-responsive"><table class="table table-striped"><thead><tr><th>#</th><th>姓名</th><th>性别</th><th>年龄</th><th>爱好</th></tr></thead><tbody>{{ each students }}<tr><td>{{$value.id}}</td><td>{{$value.name}}</td><td>{{$value.gender}}</td><td>{{$value.age}}</td><td>{{$value.hobbies}}</td></tr>{{ /each }}</tbody></table></div></div></div></div></body>
</html>

增加添加学生页面new.html :
在这里插入图片描述

new.html:

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! --><meta name="description" content=""><meta name="author" content=""><link rel="icon" href="../../favicon.ico"><title>Dashboard Template for Bootstrap</title><!-- Bootstrap core CSS --><!-- <link href="/node_modules/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet"> --><link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"><!-- Custom styles for this template --><link href="../public/css/dashboard.css" rel="stylesheet"></head><body><nav class="navbar navbar-inverse navbar-fixed-top"><div class="container-fluid"><div class="navbar-header"><button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar"aria-expanded="false" aria-controls="navbar"><span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button><a class="navbar-brand" href="#">Project name</a></div><div id="navbar" class="navbar-collapse collapse"><ul class="nav navbar-nav navbar-right"><li><a href="#">Dashboard</a></li><li><a href="#">Settings</a></li><li><a href="#">Profile</a></li><li><a href="#">Help</a></li></ul><form class="navbar-form navbar-right"><input type="text" class="form-control" placeholder="Search..."></form></div></div></nav><div class="container-fluid"><div class="row"><div class="col-sm-3 col-md-2 sidebar"><ul class="nav nav-sidebar"><li class="active"><a href="#">Overview <span class="sr-only">(current)</span></a></li><li><a href="#">Reports</a></li><li><a href="#">Analytics</a></li><li><a href="#">Export</a></li></ul><ul class="nav nav-sidebar"><li><a href="">Nav item</a></li><li><a href="">Nav item again</a></li><li><a href="">One more nav</a></li><li><a href="">Another nav item</a></li><li><a href="">More navigation</a></li></ul><ul class="nav nav-sidebar"><li><a href="">Nav item again</a></li><li><a href="">One more nav</a></li><li><a href="">Another nav item</a></li></ul></div><div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main"><h2 class="sub-header">添加学生</h2><form action="/student/new" method="post"><div class="form-group"><label for="name">姓名</label><input type="text" class="form-control" id="name" name="name"><small id="emailHelp" class="form-text text-muted">We'll never share your email with anyoneelse.</small></div><div class="form-group"><label for="sex">性别</label><div class="form-check form-check-inline"><input class="form-check-input" type="radio" name="gender" id="inlineRadio1"value="0"><label class="form-check-label" for="inlineRadio1"></label><input class="form-check-input" type="radio" name="gender" id="inlineRadio2"value="1"><label class="form-check-label" for="inlineRadio2"></label></div></div><div class="form-group"><label for="age">年龄</label><input type="text" class="form-control" id="age" name="age"></div><div class="form-group"><label for="hobbies">爱好</label><input type="text" class="form-control" id="hobbies" name="hobbies"></div><button type="submit" class="btn btn-primary">提交</button></form></div></div></div></body>
</html>

增加编辑学生页面:

在这里插入图片描述

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! --><meta name="description" content=""><meta name="author" content=""><link rel="icon" href="../../favicon.ico"><title>Dashboard Template for Bootstrap</title><!-- Bootstrap core CSS --><!-- <link href="/node_modules/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet"> --><link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"><!-- Custom styles for this template --><link href="../public/css/dashboard.css" rel="stylesheet"></head><body><nav class="navbar navbar-inverse navbar-fixed-top"><div class="container-fluid"><div class="navbar-header"><button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar"aria-expanded="false" aria-controls="navbar"><span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button><a class="navbar-brand" href="#">Project name</a></div><div id="navbar" class="navbar-collapse collapse"><ul class="nav navbar-nav navbar-right"><li><a href="#">Dashboard</a></li><li><a href="#">Settings</a></li><li><a href="#">Profile</a></li><li><a href="#">Help</a></li></ul><form class="navbar-form navbar-right"><input type="text" class="form-control" placeholder="Search..."></form></div></div></nav><div class="container-fluid"><div class="row"><div class="col-sm-3 col-md-2 sidebar"><ul class="nav nav-sidebar"><li class="active"><a href="#">Overview <span class="sr-only">(current)</span></a></li><li><a href="#">Reports</a></li><li><a href="#">Analytics</a></li><li><a href="#">Export</a></li></ul><ul class="nav nav-sidebar"><li><a href="">Nav item</a></li><li><a href="">Nav item again</a></li><li><a href="">One more nav</a></li><li><a href="">Another nav item</a></li><li><a href="">More navigation</a></li></ul><ul class="nav nav-sidebar"><li><a href="">Nav item again</a></li><li><a href="">One more nav</a></li><li><a href="">Another nav item</a></li></ul></div><div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main"><h2 class="sub-header">编辑学生</h2><form action="/students/edit" method="post"><!-- 用来放一些不希望被用户看见,但是需要被提交到服务端的数据 --><input type="hidden" name="id" value="{{ student.id }}"><div class="form-group"><label for="name">姓名</label><input value="{{ student.name }}" type="text" class="form-control" id="name" name="name"></div><div class="form-group"><label for="sex">性别</label><div class="form-check form-check-inline"><input class="form-check-input" type="radio" name="gender" id="inlineRadio1"value="0"><label class="form-check-label" for="inlineRadio1"></label><input class="form-check-input" type="radio" name="gender" id="inlineRadio2"value="1"><label class="form-check-label" for="inlineRadio2"></label></div></div><div class="form-group"><label for="age">年龄</label><input value="{{ student.age }}"  type="text" class="form-control" id="age" name="age"></div><div class="form-group"><label for="hobbies">爱好</label><input value="{{ student.hobbies }}"  type="text" class="form-control" id="hobbies" name="hobbies"></div><button type="submit" class="btn btn-primary">提交</button></form></div></div></div></body>
</html>

编写router.js文件

因为需要拿到post请求体中的数据,所以需要安装第三方插件来帮助我们获取请求体数据
在该项目文件中,cmd命令行输入命令cnpm install --save body-parser
在这里插入图片描述

由于接下来的一系列业务操作都需要处理文件数据,所以我们需要封装Student.js

student.js:

/* student.js 数据操作文件模块职责: 操作文件中的数据,只处理数据,不关心业务*/var fs = require('fs')var dbPath = './db.json'/* 获取所有学生列表 */
/* callback中的参数第一个参数是 err成功是 null错误是 错误对象第二个参数是 结果成功是数组错误是 undefined*/
exports.find = function(callback) {fs.readFile(dbPath, 'utf8', function(err, data) {if (err) {return callback(err)}callback(null, JSON.parse(data).students)})
}/* 添加保存学生 */
exports.save = function(student, callback) {fs.readFile(dbPath, 'utf8', function(err, data) {if (err) {return callback(err)}var students = JSON.parse(data).students// 处理id  唯一且不重复student.id = students[students.length - 1].id + 1students.push(student)// 再将对象转成字符串写入文件中var fileData = JSON.stringify({students: students})fs.writeFile(dbPath, fileData, function(err) {if (err) {// 错误就 把错误对象传递给callbackreturn callback(err)}// 成功就是没有错误, 所以错误对象是nullcallback(null)})})
}/* 更新学生 */
exports.updateById = function(student, callback) {fs.readFile(dbPath, 'utf8', function(err, data) {if (err) {return callback(err)}// 注意:这里记得把 id 统一转换为数字类型var students = JSON.parse(data).studentsstudent.id = parseInt(student.id)// 你要修改谁,就需要把谁找出来// EcmaScript 6 中的一个数组方法:find// 需要接收一个函数作为参数// 当某个遍历项符合 item.id === student.id 条件的时候,find 会终止遍历,同时返回遍历项var stu = students.find(function(item) {return item.id === student.id})// 遍历拷贝对象for (var key in student) {stu[key] = student[key]}// 把对象数据转换为字符串var fileData = JSON.stringify({students: students})// 把字符串保存到文件中fs.writeFile(dbPath, fileData, function(err) {if (err) {// 错误就是把错误对象传递给它return callback(err)}// 成功就没错,所以错误对象是 nullcallback(null)})})
}/* 调用格式 */
/* updateById({id: 1,name: 'xx',age: 15
},function(err) {}) *//*** 根据 id 获取学生信息对象* @param  {Number}   id       学生 id* @param  {Function} callback 回调函数*/
exports.findById = function (id, callback) {fs.readFile(dbPath, 'utf8', function (err, data) {if (err) {return callback(err)}var students = JSON.parse(data).studentsvar ret = students.find(function (item) {return item.id === parseInt(id)})callback(null, ret)})
}
/* findById()调用方式 */
/* Student.findById(id, function(err, student) {}) *//* 删除学生 */
exports.deleteById = function(id, callback) {fs.readFile(dbPath, 'utf8', function(err, data) {if (err) {return callback(err)}var students = JSON.parse(data).students// findIndex 方法专门用来根据条件查找元素的下标var deleteId = students.findIndex(function(item) {return item.id ===parseInt(id)})// 根据下标从数组中删除对应的学生对象students.splice(deleteId, 1)// 把对象数据转换为字符串var fileData = JSON.stringify({students: students})// 把字符串保存到文件中fs.writeFile(dbPath, fileData, function(err) {if (err) {// 错误就是把错误对象传递给它return callback(err)}// 成功就没错,所以错误对象是 nullcallback(null)})})
}

router.js:

/* router.js 路由模块职责: 处理路由根据不同的请求方法+请求路径设置具体的请求处理函数模块值则要单一,不要乱写*/var fs = require('fs')
var Student = require('./student')// express提供了一种更好的方式,专门用来包装路由
var express = require('express')
// 1.创建一个路由容器
var router = express.Router()
// 2.把路由都挂载到router路由容器上
router.get('/students', function(req, res) {// res.send('hello world!')// readFile() 的第二个参数是可选的,传入utf8 就是告诉它把读取到的文件直接按照utf8进行编码转成我们能认识的字符// 除了这样来转换之外,也可通过data.toString()的方式/* fs.readFile('./db.json', 'utf8', function(err, data) {if (err) {return res.status(500).send('Server error!')}console.log(data) // 这里的data 是 string 类型的res.render('index.html', {fruits: ['苹果','香蕉','橘子','桃子'],students: JSON.parse(data).students //将string类型的data通过JSON.parse(data)转成对象类型})}) */Student.find(function(err, students) {if (err) {return res.status(500).send('Server error!')}res.render('index.html', {fruits: ['苹果','香蕉','橘子','桃子'],students: students})})
})router.get('/students/new', function(req, res) {res.render('new.html')
})router.post('/students/new', function(req, res) {// 1.获取表单数据// 2.处理//  	将数据保存到db.json文件中用以持久化保存//       	先读取文件数据,转成对象//			然后往对象中push数据//			然后把对象转为字符串//			然后把字符串再次写入文件// 3.发送响应console.log(req.body)var student = req.bodyStudent.save(student, function(err) {if(err) {return res.status(500).send('Server error!')}res.redirect('/students')})
})router.get('/students/edit', function(req, res) {// 1. 在客户端的列表页中处理链接问题(需要有id参数)// 2. 获取要编辑的学生id// 3. 渲染编辑页面//      根据id把学生信息查出来//		使用模板引擎渲染页面console.log(req.query.id)Student.findById(parseInt(req.query.id), function(err, student) {if (err) {return res.status(500).send('Server error!')}console.log(student)res.render('edit.html', {student:  student})})})router.post('/students/edit', function(req, res) {// 1.获取表单数据 req.body// 2.更新 Student.updateById()// 2.发送响应console.log(req.body)Student.updateById(req.body, function(err) {if(err) {return res.status(500).send('Server error!')}res.redirect('/students')})})router.get('/students/delete', function(req, res) {// 1.获取要删除的id// 2.根据id执行删除操作// 3.根据操作结果发送响应数据console.log(req.query.id)Student.deleteById(req.query.id, function(err) {if(err) {return res.status(500).send('Server error!')}console.log('删除成功')res.redirect('/students')})
})// 3.把router导出
module.exports = router// 这样也不方便
/* module.exports = function(app) {app.get('/students', function(req, res) {// res.send('hello world!')// readFile() 的第二个参数是可选的,传入utf8 就是告诉它把读取道德文件直接按照utf8进行编码转成我们能认识的字符// 除了这样来转换之外,也可通过data.toString()的方式fs.readFile('./db.json', 'utf8', function(err, data) {if (err) {return res.status(500).send('Server error!')}console.log(data) // 这里的data 是 string 类型的res.render('index.html', {fruits: ['苹果','香蕉','橘子','桃子'],students: JSON.parse(data).students //将string类型的data通过JSON.parse(data)转成对象类型})})})app.get('/students/new', function(req, res) {})/* app.get('/students', function(req, res) {})app.get('/students', function(req, res) {})app.get('/students', function(req, res) {})app.get('/students', function(req, res) {})app.get('/students', function(req, res) {}) 
}*/

总结

步骤

  • 处理模板

  • 配置静态开放资源

  • 配置模板引擎

  • 简单的路由,/studens渲染静态页出来

  • 路由设计

  • 提取路由模块

  • 由于接下来的一系列业务操作都需要处理文件数据,所以我们需要封装Student.js’

  • 先写好student.js文件结构

    • 查询所有学生列别哦的API
    • findById
    • save
    • updateById
    • deleteById
  • 实现具体功能

    • 通过路由收到请求
    • 接受请求中的参数(get,post)
      • req.query
      • req.body
    • 调用数据操作API处理数据
    • 根据操作结果给客户端发送请求
  • 业务功能顺序

    • 列表
    • 添加
    • 编辑
    • 删除

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

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

相关文章

2016年度 JavaScript 展望(下)

【编者按】本文作者为资深 Web 开发者 TJ VanToll, TJ 专注于移动端 Web 应用及其性能&#xff0c;是《jQuery UI 实践》 一书的作者。 本文系 OneAPM 工程师编译呈现&#xff0c;以下为正文的第二部分。点此阅读第一部分。 本地移动 apps 在2015年&#xff0c;出现了一种新的基…

Python模块之MyQR——制作个性化动态二维码(超详细)

一、首先安装MyQR 第一种方式&#xff1a;cmd 命令行输入 pip install MyQR 第二种方式&#xff1a;pyCharm中手动选择进行安装 二、 myqr.run() 函数里面的参数 三、编写代码 # encodingutf-8 from MyQR import myqrmyqr.run(words"https://blog.csdn.net/weixin_448…

地址选择控件开发-

先睹为快 闲话少说&#xff0c;我们先来看看今天我们研究的控件的最终效果图(参照天猫的送货地址设置的效果)&#xff1a; “地址选择Web控件”的基本组成&#xff1a; 使用控件举例&#xff1a; <!--需要加载和引用的文件--> <link rel"stylesheet" href&q…

逻辑回归(logistic regression)的本质——极大似然估计

文章目录1 前言2 什么是逻辑回归3 逻辑回归的代价函数4 利用梯度下降法求参数5 结束语6 参考文献1 前言 逻辑回归是分类当中极为常用的手段&#xff0c;因此&#xff0c;掌握其内在原理是非常必要的。我会争取在本文中尽可能简明地展现逻辑回归(logistic regression)的整个推导…

使用mongoose 在 Node中操作MongoDB数据库

MongoDB 关系型和非关系型数据库 关系型数据库&#xff08;表就是关系&#xff0c;或者说表与表之间存在关系&#xff09;。 所有的关系型数据库都需要通过sql语言来操作所有的关系型数据库在操作之前都需要设计表结构而且数据表还支持约束 唯一的主键默认值非空 非关系型…

pip install时发生raise ReadTimeoutError(self._pool, None, 'Read timed out.')的解决方案

问题描述 在windows下&#xff0c;python在安装一些包的时候&#xff0c;常常会碰到time out的情况&#xff0c;如下图所示。不管再重试几次都是如此&#xff0c;这时候该怎么办呢&#xff1f; 解决方案 方案一&#xff1a;更换安装源&#xff08;推荐使用豆瓣源&#xff09…

使用Node 操作MySQL数据库

1. 安装 官方文档&#xff1a;https://www.npmjs.com/package/mysql npm install --save mysql2.代码演示 var mysql require(mysql);// 1.创建连接 var connection mysql.createConnection({host : localhost,user : root,password : root,database : my_db …

利用随机森林对特征重要性进行评估

文章目录1 前言2 随机森林&#xff08;RF&#xff09;简介3 特征重要性评估4 举个例子5 参考文献1 前言 随机森林是以决策树为基学习器的集成学习算法。随机森林非常简单&#xff0c;易于实现&#xff0c;计算开销也很小&#xff0c;更令人惊奇的是它在分类和回归上表现出了十…

Promise学习——解决回调地狱问题

Promise promise 容器概念&#xff1a; callback hell&#xff08;回调地狱&#xff09;: 文件的读取无法判断执行顺序&#xff08;文件的执行顺序是依据文件的大小来决定的&#xff09;(异步api无法保证文件的执行顺序) var fs require(fs);fs.readFile(./data/a.text,ut…

基于哈希表的索引堆变形(Hackerrank: QHEAP1)

问题来源 此题来自于Hackerrank中的QHEAP1问题&#xff0c;考查了对堆结构的充分理解。成功完成此题&#xff0c;对最大堆或者最小堆的基本操作实现就没什么太大问题了。 问题简述 实现一个最小堆&#xff0c;对3种类型的输入能给出正确的操作&#xff1a; “1 v” - 表示往…

Node 中的path模块

参考文档&#xff1a;https://nodejs.org/docs/latest-v13.x/api/path.html path模块中的常用API&#xff1a; path.basename&#xff1a;获取路径的文件名&#xff0c;默认包含扩展名path.dirname&#xff1a;获取路径中的目录部分path.extname&#xff1a;获取一个路径中的扩…

Node中的fs模块

1.fs.stat检测是文件还是目录 2.fs.mkdir创建目录 3.fs.writeFile创建写入文件 4.fs.appendFile追加文件 5.fs.readFile 读取文件 6.fs.readdir读取目录 7.fs.rename重命名 8.fs.rmdir删除目录 9.fs.unlink 删除文件 fs.stat 检测是文件还是目录 const fs require(fs)fs.stat…

主成分分析(PCA)和基于核函数的主成分分析(KPCA)入门

文章目录1 前言2 PCA的原理2.1 什么是投影2.2 投影后的方差2.3 转化为求特征值的问题2.4 符号的表示3 KPCA的原理4 PCA和KPCA在Python中的使用4.1 PCA的使用4.2 KPCA的使用5 参考文献1 前言 主成分分析是在做特征筛选时的重要手段&#xff0c;这个方法在大部分的书中都只是介绍…

算法分类整理+模板①:矩阵快速幂

一直有一个想法&#xff0c;感觉自己很多基础算法不是很扎实&#xff0c;想要找个机会写一些算法的整理&#xff0c;顺便自己总结一些实用的模板。 最近偶然在训练赛中连续做了2道思维矩阵快速幂的题目&#xff0c;碰巧有时间&#xff0c;就以矩阵快速幂作为这个系列博客的开始…

爬虫小记:利用cookies跳过登陆验证码

前言 在爬取某些网页时&#xff0c;登陆界面时经常遇到的一个坎&#xff0c;而现在大多数的网站在登陆时都会要求用户填写验证码。当然&#xff0c;我们可以设计一套机器学习的算法去破解验证码&#xff0c;然而&#xff0c;验证码的形式多种多样&#xff0c;稍微变一下&#…

Nodejs 中的包、npm 、第三方模块、 package.json 以及 cnpm

一、包与 NPM 包Nodejs 中除了它自己提供的核心模块外&#xff0c;我们可以自定义模块&#xff0c;也可以使用第三方的 模块。Nodejs 中第三方模块由包组成&#xff0c;可以通过包来对一组具有相互依赖关系的模块进行 统一管理。 完全符合 CommonJs 规范的包目录一般包含如下…

神经网络中BP(back propagation)到底在干些什么

前言 想要理解神经网络的工作原理&#xff0c;反向传播(BP)是必须搞懂的东西。BP其实并不难理解&#xff0c;说白了就是用链式法则(chain rule)算算算。本文试图以某个神经网络为例&#xff0c;尽可能直观&#xff0c;详细&#xff0c;明了地说明反向传播的整个过程。 正向传…

Nodejs 新特性 async await 的使用 以及使用 async await 处理异步

1. let 和 var 2. const定义常量 3. 模板字符串 4. 属性简写 5. 方法简写 6. 箭头函数 7. 回调函数 7. Promise 8. async 和 await

leetcode 高薪_LeetCode 第 125 号问题:验证回文串

本文首发于公众号「五分钟学算法」&#xff0c;是图解 LeetCode 系列文章之一。个人网站&#xff1a;https://www.cxyxiaowu.com题目来源于 LeetCode 第 125 号问题&#xff1a;验证回文串。这道题目是 初级程序员 在面试的时候经常遇到的一道算法题&#xff0c;而且面试官喜欢…

从拉格朗日乘子法到SVM

前言 本文主要是讲了如何构建SVM的模型&#xff0c;并利用KKT条件构造其对偶型&#xff0c;从而求解问题&#xff0c;并讲述了SVM的硬间隔&#xff0c;软间隔和核函数三个境界。主要参考了周志华的《机器学习》&#xff0c;并在其中补充了自己的想法。由于内容较多&#xff0c…