You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 11:30:03