前15天查詢次數曲線

一曲微茫發表於2024-11-07

public int getAuditCount() {
int num = 0;
try {
Example example = new Example(AuditInfo.class);
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Date today = df.parse(df.format(new Date()));
Date yesterday = df.parse(df.format(new Date().getTime() - 1000 * 60 * 60 * 24));
example.createCriteria().andBetween("queryTime", yesterday, today);
num = auditInfoMapper.selectCountByExample(example);
} catch (Exception e) {
log.error("查詢異常", e);
return num;
}
return num;
}這是我的程式碼,相關的東西我全有了。現在我想獲得自今天起前15天每天的查詢資料,並返回前端,以便讓前端繪製折線圖。我怎麼修改程式碼

要獲取自今天起前15天每天的查詢資料,並返回給前端以繪製折線圖,你需要進行以下步驟:

  1. 計算日期範圍:從今天開始,向前計算15天的日期。
  2. 構造查詢條件:為每一天構造查詢條件,並獲取當天的記錄數。
  3. 儲存結果:將每天的查詢結果儲存在一個列表中,以便返回給前端。

以下是修改後的程式碼示例:

修改後的程式碼

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class AuditService {

    private static final Logger log = LoggerFactory.getLogger(AuditService.class);
    private AuditInfoMapper auditInfoMapper;

    public AuditService(AuditInfoMapper auditInfoMapper) {
        this.auditInfoMapper = auditInfoMapper;
    }

    public List<Integer> getAuditCountsForLast15Days() {
        List<Integer> counts = new ArrayList<>();
        try {
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
            Calendar calendar = Calendar.getInstance();

            for (int i = 0; i < 15; i++) {
                // 計算當天的日期
                Date today = calendar.getTime();
                Date yesterday = (Date) today.clone();
                calendar.add(Calendar.DAY_OF_YEAR, -1);

                // 格式化日期
                String todayStr = df.format(today);
                String yesterdayStr = df.format(yesterday);

                // 解析日期
                Date parsedToday = df.parse(todayStr);
                Date parsedYesterday = df.parse(yesterdayStr);

                // 構造查詢條件
                Example example = new Example(AuditInfo.class);
                example.createCriteria().andBetween("queryTime", parsedYesterday, parsedToday);

                // 查詢記錄數
                int count = auditInfoMapper.selectCountByExample(example);
                counts.add(count);
            }
        } catch (ParseException e) {
            log.error("日期解析異常", e);
        } catch (Exception e) {
            log.error("查詢異常", e);
        }
        return counts;
    }
}

詳細說明

  1. 計算日期範圍

    • 使用 Calendar 類來計算從今天開始前15天的日期。
    • 每次迴圈中,計算當天的日期和前一天的日期。
  2. 構造查詢條件

    • 使用 SimpleDateFormat 格式化日期。
    • 解析格式化後的日期字串。
    • 構造 Example 物件,並設定查詢條件為 queryTime 在前一天和當天之間。
  3. 儲存結果

    • 將每天的查詢結果(記錄數)儲存在 counts 列表中。
  4. 返回結果

    • 最終返回 counts 列表,包含過去15天每天的記錄數。

前端處理

前端可以接收這個列表,並將其用於繪製折線圖。假設你使用的是 Vue.js 和 ECharts,以下是一個簡單的示例:

前端程式碼示例

<template>
  <div>
    <div id="chart" style="width: 600px; height: 400px;"></div>
  </div>
</template>

<script>
import * as echarts from 'echarts';
import axios from 'axios';

export default {
  data() {
    return {
      auditCounts: []
    };
  },
  mounted() {
    this.fetchAuditCounts();
  },
  methods: {
    async fetchAuditCounts() {
      try {
        const response = await axios.get('/api/getAuditCountsForLast15Days');
        this.auditCounts = response.data;
        this.initChart();
      } catch (error) {
        console.error('Error fetching audit counts:', error);
      }
    },
    initChart() {
      const chartDom = document.getElementById('chart');
      const myChart = echarts.init(chartDom);
      const option = {
        title: {
          text: '過去15天的稽核記錄數'
        },
        tooltip: {
          trigger: 'axis'
        },
        xAxis: {
          type: 'category',
          data: this.getPast15Days()
        },
        yAxis: {
          type: 'value'
        },
        series: [
          {
            data: this.auditCounts,
            type: 'line'
          }
        ]
      };
      myChart.setOption(option);
    },
    getPast15Days() {
      const dates = [];
      const today = new Date();
      for (let i = 0; i < 15; i++) {
        const date = new Date(today);
        date.setDate(today.getDate() - i);
        dates.push(date.toLocaleDateString());
      }
      return dates.reverse();
    }
  }
};
</script>

說明

  1. 獲取資料

    • 使用 axios 傳送請求,獲取過去15天的稽核記錄數。
    • 將獲取到的資料儲存在 auditCounts 中。
  2. 初始化圖表

    • 使用 ECharts 初始化圖表,並設定資料和配置項。
    • xAxis 的資料是過去15天的日期,series 的資料是對應的記錄數。
  3. 生成日期標籤

    • getPast15Days 方法生成過去15天的日期標籤,用於圖表的 x 軸。

透過這些步驟,你可以獲取過去15天每天的查詢資料,並在前端繪製折線圖。如果有任何具體問題或需要進一步的幫助,請隨時提問。

好的,我將在你提供的程式碼基礎上進行修改,以實現獲取自今天起前15天每天的查詢資料。以下是修改後的後端程式碼:

public List<Integer> getAuditCountsForLast15Days() {
    List<Integer> counts = new ArrayList<>();
    try {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();

        for (int i = 0; i < 15; i++) {
            // 計算當天的日期
            Date today = calendar.getTime();
            Date yesterday = (Date) today.clone();
            calendar.add(Calendar.DAY_OF_YEAR, -1);

            // 格式化日期
            String todayStr = df.format(today);
            String yesterdayStr = df.format(yesterday);

            // 解析日期
            Date parsedToday = df.parse(todayStr);
            Date parsedYesterday = df.parse(yesterdayStr);

            // 構造查詢條件
            Example example = new Example(AuditInfo.class);
            example.createCriteria().andBetween("queryTime", parsedYesterday, parsedToday);

            // 查詢記錄數
            int count = auditInfoMapper.selectCountByExample(example);
            counts.add(count);
        }
    } catch (ParseException e) {
        log.error("日期解析異常", e);
    } catch (Exception e) {
        log.error("查詢異常", e);
    }
    return counts;
}

詳細說明

  1. 計算日期範圍

    • 使用 Calendar 類來計算從今天開始前15天的日期。
    • 每次迴圈中,計算當天的日期和前一天的日期。
  2. 構造查詢條件

    • 使用 SimpleDateFormat 格式化日期。
    • 解析格式化後的日期字串。
    • 構造 Example 物件,並設定查詢條件為 queryTime 在前一天和當天之間。
  3. 儲存結果

    • 將每天的查詢結果(記錄數)儲存在 counts 列表中。
  4. 返回結果

    • 最終返回 counts 列表,包含過去15天每天的記錄數。

方法簽名

  • 返回型別List<Integer>,包含過去15天每天的記錄數。
  • 方法名getAuditCountsForLast15Days,用於獲取過去15天每天的記錄數。

使用示例

假設你在控制器中呼叫這個方法並返回給前端:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;

@RestController
public class AuditController {

    private final AuditService auditService;

    public AuditController(AuditService auditService) {
        this.auditService = auditService;
    }

    @GetMapping("/api/getAuditCountsForLast15Days")
    public List<Integer> getAuditCountsForLast15Days() {
        return auditService.getAuditCountsForLast15Days();
    }
}

前端呼叫示例

前端可以透過傳送 HTTP GET 請求來獲取這些資料:

axios.get('/api/getAuditCountsForLast15Days')
  .then(response => {
    const auditCounts = response.data;
    // 處理資料並繪製圖表
  })
  .catch(error => {
    console.error('Error fetching audit counts:', error);
  });

希望這些修改能滿足你的需求。如果有任何其他問題或需要進一步的幫助,請隨時提問。

相關文章