IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> eggjs 怎么实现月度账单统计接口? -> 正文阅读

[JavaScript知识库]eggjs 怎么实现月度账单统计接口?

原型分析

我们可以先看一下,这个统计页面原型分成了3个部分,第一个部分有月份,月总支出,月总收入,第二三部分,都是统计了支出跟收入两大类型下的不同消费类型的占比,只是展示形式不一样。

在这里插入图片描述

需要返回的数据结构

totalExpense, // 当月总支出
totalIncome, // 当月总收入
dataList: [{
	number: 11.99, // 支出或收入数量
    pay_type: 1, // 支出或消费类型值
    type_id: 1, // 消费类型id
    type_name: "餐饮" // 消费类型名称
},...], // 列表数据

月度账单统计接口实现

我们需要在控制层新增 analysis.js 文件

1、控制层编写 monthBill 方法


'use strict';

const Controller = require('egg').Controller;

class AnalysisController extends Controller {
  async monthBill() {
    const { ctx, app } = this;
    try {
      // 1、获取查询参数
      const { billDate } = ctx.query;
      console.log('1、获取查询参数',billDate);
      // 2、参数判空
      if (!billDate) {
        ctx.body = {
          status: 400,
          desc: '参数错误',
          data: null
        }
        return;
      }
      // 3、拿到 token 获取用户信息 user_id
      const token = ctx.request.header.authorization;
      const decode = await app.jwt.verify(token, app.config.jwt.secret);
      if (!decode) return;
      let user_id = decode.id;
      console.log('2、拿到 token 获取用户信息 user_id',user_id);
      // 4、获取月度账单统计数据
      const monthBillResult = await ctx.service.analysis.monthBill(user_id, billDate);
      const monthBillList = JSON.parse(JSON.stringify(monthBillResult));
      console.log('3、获取月度账单统计数据',monthBillResult,monthBillList);
      // 累加相同的消费类型 type_id 生成新的数组返回
      let dataList = monthBillList.reduce((curr, next) => {
        const index = curr.findIndex(item => item.type_id == next.type_id)
        if (index == -1) {
          curr.push({
            type_id: next.type_id,
            type_name: next.type_name,
            pay_type: next.pay_type,
            number: Number(next.amount)
          })
        }
        if (index > -1) {
          curr[index].number += Number(next.amount);
        }
        return curr;
      }, []);
      // 当月总支出:支付类型:1:支出,2:收入
      let totalExpense = monthBillList.reduce((curr, next) => {
        if (next.pay_type === 1) {
          curr += Number(next.amount);
          return curr;
        }
        return curr;
      }, 0).toFixed(2); 
      // 当月总收入:支付类型:1:支出,2:收入
      let totalIncome = monthBillList.reduce((curr, next) => {
        if (next.pay_type === 2) {
          curr += Number(next.amount);
          return curr;
        }
        return curr;
      }, 0).toFixed(2);
      console.log('当月总支出:',totalExpense, '当月总收入:',totalIncome);
      ctx.body = {
        status: 200,
        desc: '请求成功',
        data: {
          totalExpense, // 当月总支出
          totalIncome, // 当月总收入
          dataList: dataList, // 列表数据
        }
      }
    } catch (error) {
      console.log(error);
      ctx.body = {
        status: 500,
        desc: '系统错误',
        data: null
      }
    }
  }
}

module.exports = AnalysisController;

2、服务层编写 monthBill 方法

我们需要在服务层新增 analysis.js 文件

'use strict';

const Service = require('egg').Service;

class AnalysisService extends Service {
  // 获取月份所有账单数据
  async monthBill(user_id, month) {
    const { app } = this;
    try {
      let sql = "select * from `kaimo-cost`.bill b where user_id = "+ user_id + " and DATE_FORMAT(b.date,'%Y-%m') = '" + month + "'";
      console.log('获取月份所有账单数据', sql);
      const result = await app.mysql.query(sql);
      return result;
    } catch (error) {
      console.log(error);
      return null;
    }
  }
}
module.exports = AnalysisService;

3、路由配置

// 获取月度统计账单
router.get('/api/analysis/monthBill', verify_token, controller.analysis.monthBill);

测试

我们输入参数,不要忘记头部 token。

在这里插入图片描述

没有数据:

在这里插入图片描述

不传参数:

在这里插入图片描述

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-12 17:23:13  更:2022-03-12 17:24:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:35:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码