求助:Node.js+Express+Mongoose实现存款审批及展示功能
实现存款审批与仪表盘展示的核心逻辑
下面是基于你的技术栈(Node.js+Express.js+MongoDB+Mongoose)的具体实现步骤,从数据模型到接口全流程:
1. 定义Mongoose存款数据模型
首先需要创建一个存款记录的模型,包含必要的状态字段来跟踪审批流程:
const mongoose = require('mongoose'); const depositSchema = new mongoose.Schema({ userId: { type: mongoose.Schema.Types.ObjectId, ref: 'User', // 关联你的用户模型(需提前创建) required: true }, amount: { type: Number, required: true, min: 0.01 }, status: { type: String, enum: ['pending', 'approved', 'rejected'], default: 'pending' // 默认状态为待审批 }, submittedAt: { type: Date, default: Date.now }, approvedAt: { type: Date, default: null }, adminId: { type: mongoose.Schema.Types.ObjectId, ref: 'Admin', // 关联管理员模型(若有) default: null } }); module.exports = mongoose.model('Deposit', depositSchema);
2. 处理客户存款提交的POST接口
接收前端表单数据,将存款申请存入数据库:
const express = require('express'); const router = express.Router(); const Deposit = require('../models/Deposit'); // 客户提交存款申请 router.post('/deposit/submit', async (req, res) => { try { // 假设你已通过登录验证中间件获取到当前用户ID(比如JWT) const { amount } = req.body; const userId = req.user._id; const newDeposit = new Deposit({ userId, amount }); await newDeposit.save(); res.status(201).json({ message: '存款申请已提交,等待管理员审批' }); } catch (err) { res.status(500).json({ error: '提交失败,请稍后重试' }); } }); module.exports = router;
注意:需要先实现用户登录验证(比如JWT中间件),确保只有已登录用户能提交申请。
3. 管理员审批接口
实现管理员通过/拒绝存款申请的接口,需加入管理员权限验证:
// 管理员通过存款申请 router.patch('/deposit/:id/approve', async (req, res) => { try { const depositId = req.params.id; const adminId = req.admin._id; // 管理员登录验证后的ID const deposit = await Deposit.findById(depositId); if (!deposit) return res.status(404).json({ error: '存款记录不存在' }); if (deposit.status !== 'pending') return res.status(400).json({ error: '该申请已处理' }); deposit.status = 'approved'; deposit.approvedAt = Date.now(); deposit.adminId = adminId; await deposit.save(); res.json({ message: '存款申请已通过' }); } catch (err) { res.status(500).json({ error: '审批失败,请重试' }); } }); // 管理员拒绝存款申请(逻辑类似) router.patch('/deposit/:id/reject', async (req, res) => { try { const depositId = req.params.id; const adminId = req.admin._id; const deposit = await Deposit.findById(depositId); if (!deposit) return res.status(404).json({ error: '存款记录不存在' }); if (deposit.status !== 'pending') return res.status(400).json({ error: '该申请已处理' }); deposit.status = 'rejected'; deposit.approvedAt = Date.now(); deposit.adminId = adminId; await deposit.save(); res.json({ message: '存款申请已拒绝' }); } catch (err) { res.status(500).json({ error: '操作失败,请重试' }); } });
4. 客户仪表盘获取已审批记录接口
查询当前用户的已通过存款记录,返回给前端展示:
// 客户获取已审批的存款记录 router.get('/dashboard/deposits', async (req, res) => { try { const userId = req.user._id; const approvedDeposits = await Deposit.find({ userId, status: 'approved' }).sort({ approvedAt: -1 }); // 按审批时间倒序展示最新记录 res.json(approvedDeposits); } catch (err) { res.status(500).json({ error: '获取记录失败' }); } });
前端侧简单配合
- 存款表单提交后,根据接口返回提示用户等待审批
- 管理员后台需展示所有
status: 'pending'的存款记录,提供通过/拒绝按钮调用对应接口 - 客户仪表盘页面定期(或用户主动刷新时)调用
/dashboard/deposits接口,渲染已通过的存款信息
内容的提问来源于stack exchange,提问作者Ogbonna ebube Gideon
相关产品推荐
相关产品推荐

