之前的中后台管理项目的数据都存到了json文件里面持久化存储,现在学了mongodb数据库,自然要存到数据库里面保存。首先创建数据库之后把json数据导入数据库的集合中。
编辑
编辑
导入之后就可以在服务器引入mongoose库然后调用conncet连接到我们现在启用的数据库服务器然后操作里面的数据了。
首先连接数据库服务器。
编辑
连接到数据库之后创建数据库里面对应集合的model对象来对文档增删改查。
编辑
然后就可以替换fs模块了,也可以省略很多数组逻辑比如筛选什么的,可以直接用findOneAndUpdate省略好多步骤。
比如这里的订单列表和司机数据。
php
const express = require('express')
const router = express.Router()
const ExcelJS = require('exceljs');
const orderList = require('../models/orderList.cjs')
const cityList = require('../models/cityList.cjs')
const vehicleList = require('../models/vehiclelists.cjs')
const cityData = require('../models/citydatas.cjs')
const driverList =require('../models/driverlists.cjs')
router.use((req,res,next)=>{
if(req.path === '/export'){
return next()
}
if(req.user){
next()
}
else{
res.send({
code:500001,
msg:'token失效'
})
}
})
// 获取订单列表
// 获取订单列表
router.get('/list', async (req, res) => {
try {
const { orderId, userName, state } = req.query
// 拼接查询条件
const query = {}
if (orderId) query.orderId = orderId
if (userName) query.userName = userName
if (state) query.state = +state
console.log(query)
// 查 MongoDB
const list = await orderList.find(query)
console.log()
console.log('这是进行中的订单信息',list)
res.send({
code: 0,
data: {
list: list,
page: {
pageNum: 1,
pageSize: 10,
total: list.length
}
},
msg: 'success'
})
} catch (error) {
res.status(500).send({ code: 1, msg: '获取订单列表失败' })
}
})
// 获取订单详情
router.get('/detail/:orderId', async (req, res) => {
try {
const {orderId} = req.params
const order = await orderList.findOne({orderId})
if (order) {
res.send({
code: 0,
msg: '',
data: order
})
} else {
res.send({
code: 1,
msg: '订单不存在',
data: {}
})
}
} catch (error) {
res.status(500).send({
code: 1,
msg: '获取订单详情失败'
})
}
})
// 获取城市列表
router.get('/citylist', async (req, res) => {
try {
const data = await cityList.find({})
res.send({ code: 0, data: data,msg:'' })
} catch (error) {
res.status(500).json({ code: 1, message: '获取城市列表失败' })
}
})
// 获取车型列表
router.get('/vehiclelist', async (req, res) => {
try {
const data = await vehicleList.find({})
res.send({ code: 0, data: data })
} catch (error) {
res.status(500).json({ code: 1, message: '获取车型列表失败' })
}
})
// 创建订单
router.post('/create', async (req, res) => {
try {
// 新订单数据
const newOrder = {
_id: Date.now().toString(), // 唯一ID
orderId:T${ Date.now().toString()}, // 唯一OrderID
...req.body, // 前端传来的数据
createTime: new Date().toISOString() // 创建时间
}
orderList.create(newOrder)
//首先是数据,然后是格式比如数组或者对象转化 2用来控制缩进和美化输出。
res.send({
code: 0,
msg: '创建订单成功',
data: newOrder
})
} catch (error) {
res.status(500).send({ code: 1, msg: '创建订单失败' })
}
})
// 更新订单信息
router.post('/edit', async (req, res) => {
const { orderId, route: newRouter } = req.body
if (!orderId || !Array.isArray(newRouter)) {
return res.status(400).json({ msg: '参数不合法' })
}
const list = await orderList.findOneAndUpdate({orderId},{
$set:{route:newRouter}
})
res.json({
code: 0,
msg: '更新成功',
data: list
})
})
// 删除订单
router.post('/delete', async (req, res) => {
const { id } = req.body
await orderList.deleteOne({orderId:id})
res.json({ msg: '删除成功',code:0,data:{} })
})
function format(state){
console.log('aaaa')
const arr={
1:'进行中',
2:'完成',
3:'超时',
4:'取消'
}
return arr[state]
}
//导出
router.post('/export', async (req, res) => {
try {
const params = req.body;
console.log('导出参数', params);
let orders = await orderList.find({});
const newData= orders.map(item=>{
item={
...item,
state: format(item.state)
}
return item
})
const workbook = new ExcelJS.Workbook();
const worksheet = workbook.addWorksheet('订单列表');
worksheet.columns = [
{ header: '订单ID', key: 'orderId', width: 20 },
{ header: '城市', key: 'cityName', width: 15 },
{ header: '车型', key: 'vehicleName', width: 15 },
{ header: '下单时间', key: 'createTime', width: 20 },
{ header: '订单状态', key: 'state', width: 15 },
];
worksheet.addRows(newData);
res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
res.setHeader('file-name', encodeURIComponent('订单列表.xlsx'));
await workbook.xlsx.write(res);
res.end();
} catch (err) {
console.error(err);
res.status(500).send('导出失败');
}
});
//获取城市数据
router.get('/cityData/:cityId', async (req, res) => {
const { cityId } = req.params
console.log(cityId)
try {
const city = await cityData.findOne({cityId})
res.send({ code: 0, data: city.points })
} catch (err) {
res.status(500).send({ code: 1, msg: '读取数据失败' })
}
})
//获取司机数据
router.get('/driver/list',async(req,res)=> {
const {driverName,accountStatus} =req.query
let newobj ={}
if(driverName){
newobj.driverName=driverName
}
if(accountStatus){
newobj.accountStatus=accountStatus
}
console.log(newobj)
const list = await driverList.find(newobj)
res.send({
code:0,
data:{
list:list
},
msg:''
})
})
module.exports = router;
连接的话需要在入口文件导入。
php
require('./tools/connect.cjs')
const express = require('express')
const fs = require('fs/promises')
const path = require('path')
const jwt = require('jsonwebtoken')
const app = express()
const dataRouter = require('./router/getData.cjs')
const usersRouter = require('./router/userList.cjs')
const deptList = require('./router/deptList.cjs')
const menuList = require('./router/menuList.cjs')
const roleList = require('./router/roleList.cjs')
const orderList = require('./router/orderList.cjs')
const usersModel = require('./models/usersList.cjs')
const secret = 'hello'
async function getUser() {
const data = await fs.readFile(path.resolve(__dirname,'data/usersList.json'))
//console.log(JSON.parse(data))
return JSON.parse(data)
}
//暴露图片资源文件夹
app.use('/images', express.static(path.join(__dirname, 'public/images')))
app.use((req, res, next) => {
if (req.url === '/user/login' || req.url.startsWith('/images')) {
return next()
}
if (req.url !== '/user/login') {
const token = req.headers['authorization']
try {
const decoded = jwt.verify(token, secret)
req.user = decoded
console.log(decoded)
next()
} catch (e) {
return res.status(201).send({
code: 500001,
data: {},
msg: 'token 失效或未登录'
})
}
} else {
next()
}
})
//解析body
app.use(express.urlencoded({ extended: true }))
// 支持 application/json
app.use(express.json())
//引入图形数据接口
app.use('/order',dataRouter)
//引入用户接口
app.use('/users',usersRouter)
//引入列表接口
app.use('/dept',deptList)
//引入菜单接口
app.use('/menu',menuList)
//引入角色接口
app.use('/roles',roleList)
//引入命令接口
app.use('/order',orderList)
app.post('/user/login', async (req, res) => {
const { userName, userPwd } = req.body
//console.log(userName)
const user = await usersModel.findOne({userName:userName})
//console.log(user)
// console.log(user)
if (user&&userPwd==='111111') {
const token = jwt.sign({
id: user._id,
userName: user.userName,
roleList: user.roleList
}, secret, { expiresIn: '10d' })
res.send({
code: 0,
data: { token },
msg: '登录成功'
})
} else {
res.send({
code: 1,
data: {},
msg: '账号密码错误'
})
}
})
app.listen('3000',()=>{
console.log('服务器启动了')
// usersModel.find().then(item=>{console.log(item)})
})
这样就成功用数据库替换了json文件存储。