也是无事可做,便闲着用Node.js+Express+MongoDb+bootStrap开发小demo
也只是对数据的增删改查罢了
页面
可以实现 编辑 删除 显示 增加 数据库的信息
文件架构
使用时记得npm包
!!!!注意 安装这些包需要顺序否则可能会导致以前安装的npm包会消失
cnpm install mongoose //安装mongoose包
cnpm i -S express //安装express包
cnpm install --save body-parser //安装body-parser包
cnpm i art-template //安装art-template
cnpm i express-art-template //安装express-art-template
cnpm install --save-dev @types/node //代码提示
可以下载nodemon自动监视文件的变化,一旦文件变化,自启动服务器。
npm install nodemon -g // 全局安装
主启动入口
//app.js入口模块
var express = require('express')
var router = require('./router')
var bodyParser = require('body-parser')
var app = express()
// 模板包的导入
// 静态资源
app.use('/node_modules/', express.static('./node_modules/'))
app.use('/public/', express.static('./public/'))
// 配置模板引擎
app.engine('html', require('express-art-template'))
// body-parser包配置
app.use(bodyParser.urlencoded( { extended: false } ))
app.use(bodyParser.json())
// 链接路由router
app.use(router)
app.listen(3000, function(){
console.log('running...')
})
module.exports = app
路由设置
// router.js路由模块
var fs = require('fs')
var student = require('./student')
//第二种方法
var express = require('express')
var router = express.Router()
//主页渲染
router.get('/students', function (req, res){
// fs.readFile('./views/db.json','utf8', function (err, data){
// if (err) {
// return res.status(500).send('Server error.')
// }
// var students = JSON.parse(data).students
// res.render('index.html',{
// fruits: [
// '刘翔華',
// '王一浩',
// '李一涵',
// '陈燕'
// ],
// students : students
// })
// })
// 调用了student.js的find查找获取方法
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', function(err, data) {
if(err){
return res.send('404 not found.')
}
res.send(data)
})
})
//添加学生
router.post('/students/new', function (req, res){
// 调用了student.js的save保存方法
new student(req.body).save(function(err){
if (err) {
return res.status(500).send('Server error.')
}
res.redirect('/students')
// console.log(req.body)
})
})
//编辑学生页面渲染
router.get('/students/edit', function (req, res){
student.findById(req.query.id, function (err, student) {
if(err){
return res.status(500).send('Server error.')
}
res.render('edit.html', {
student: student
})
})
})
//编辑学生
router.post('/students/edit', function (req, res){
var id = req.body.id
student.findOneAndUpdate(id,req.body,function(err) {
if (err) {
return res.status(500).send('Server error.')
} else {
res.redirect('/students')
}
})
})
// 删除学生
router.get('/students/delete', function (req, res){
var id = req.body.id
student.deleteOne(id,function(err) {
if (err) {
return res.status(500).send('Server error.')
}
res.redirect('/students')
})
})
router.use('/index',router)
// 一定要放在所有的路由下面
router.get('*', function(req, res) {
res.redirect('/students')
})
module.exports = router
//第一种方法
/*
module.exports = function(app){
app.get('/students', function (req, res){
fs.readFile('./views/db.json','utf8', function (err, data){
if (err) {
return res.status(500).send('Server error.')
}
var students = JSON.parse(data).students
res.render('index.html',{
fruits: [
'刘翔華',
'王一浩',
'李一涵',
'陈燕'
],
students : students
})
})
})
app.get('/students/new', function (req, res){
fs.readFile('./views/db.json','utf8', function (err, data){
if (err) {
return res.status(500).send('Server error.')
}
var students = JSON.parse(data).students
res.render('index.html',{
fruits: [
'刘翔華',
'王一浩',
'李一涵',
'陈燕'
],
students : students
})
})
})
app.get('/students/new', function (req, res){
fs.readFile('./views/db.json','utf8', function (err, data){
if (err) {
return res.status(500).send('Server error.')
}
var students = JSON.parse(data).students
res.render('index.html',{
fruits: [
'刘翔華',
'王一浩',
'李一涵',
'陈燕'
],
students : students
})
})
})
app.get('/students/new', function (req, res){
fs.readFile('./views/db.json','utf8', function (err, data){
if (err) {
return res.status(500).send('Server error.')
}
var students = JSON.parse(data).students
res.render('index.html',{
fruits: [
'刘翔華',
'王一浩',
'李一涵',
'陈燕'
],
students : students
})
})
})
app.get('/students/new', function (req, res){
fs.readFile('./views/db.json','utf8', function (err, data){
if (err) {
return res.status(500).send('Server error.')
}
var students = JSON.parse(data).students
res.render('index.html',{
fruits: [
'刘翔華',
'王一浩',
'李一涵',
'陈燕'
],
students : students
})
})
})
app.get('/students/new', function (req, res){
fs.readFile('./views/db.json','utf8', function (err, data){
if (err) {
return res.status(500).send('Server error.')
}
var students = JSON.parse(data).students
res.render('index.html',{
fruits: [
'刘翔華',
'王一浩',
'李一涵',
'陈燕'
],
students : students
})
})
})
}
*/
MongoDB数据库
var mongoose = require('mongoose')
mongoose.connect('mongodb://localhost/itcast', {useNewUrlParser: true})
mongoose.set('useFindAndModify', false)
var Schema = mongoose.Schema
var studentSchema = new Schema({
name:{
type: String,
required: true
},
gender:{
type: Number,
enum: [0,1],
default: 0
},
age:{
type: Number
},
hobbies:{
type: String
}
})
// 导出模型构造函数
module.exports = mongoose.model('Student',studentSchema)
封装的方法
// 操作数据点文件模块
var fs = require('fs')
var dbPath = './views/db.json'
// 下面是封装的方法
// 获取的方法
exports.find = function (callback) {
fs.readFile(dbPath, 'utf8', function(err, data) {
if(err) {
return callback(err)
}
callback(null, JSON.parse(data).students)
})
}
//根据id获取学生信息对象
exports.findById = function (id,callback) {
fs.readFile(dbPath, 'utf8', function(err, data) {
if(err) {
return callback(err)
}
var students = JSON.parse(data).students
var ret = students.find(function (item) {
return item.id === parseInt(id)
})
callback(null,ret)
})
}
// 添加的方法**
/*
*/
exports.save = function (student, callback) {
fs.readFile(dbPath, 'utf8',function(err, data) {
if(err) {
return callback(err)
}
var students = JSON.parse(data).students
// 处理id不重复 数组从0开始 所以-1
student.id = students.length == 0 ? 1 : students[students.length - 1].id + 1
// 把传递的对象保存到数组中
students.push(student)
// 把对象数据转换为字符串
var fileData = JSON.stringify({
students: students
})
// 把字符串保存到文件中
fs.writeFile(dbPath, fileData, function (err) {
if (err) {
return callback(err)
}
callback(null)
})
})
}
// 更新
exports.updateById = function (student, callback) {
fs.readFile(dbPath, 'utf8',function(err, data) {
if(err) {
return callback(err)
}
var students = JSON.parse(data).students
student.id = parseInt(student.id)
// 查找修改目标
// 当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)
}
callback(null)
})
})
}
// 删除
exports.deleteById = function (id, callback) {
fs.readFile(dbPath, 'utf8',function(err, data) {
if(err) {
return callback(err)
}
var students = JSON.parse(data).students
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)
}
callback(null)
})
})
}
链接: https://pan.baidu.com/s/1KUXYfyN85WGMGQeU4nNTAQ 提取码: sbvi 复制这段内容后打开百度网盘手机App,操作更方便哦
源码贴上