feat: 添加预算统计服务增强和日志系统改进
All checks were successful
Docker Build & Deploy / Build Docker Image (push) Successful in 24s
Docker Build & Deploy / Deploy to Production (push) Successful in 6s
Docker Build & Deploy / Cleanup Dangling Images (push) Successful in 2s
Docker Build & Deploy / WeChat Notification (push) Successful in 2s

1. 新增 BudgetStatsService:将预算统计逻辑从 BudgetService 中提取为独立服务,支持月度和年度统计,包含归档数据支持和硬性预算调整算法
2. 日志系统增强:添加请求ID追踪功能,支持通过请求ID查询关联日志,新增类名筛选功能
3. 日志解析优化:修复类名解析逻辑,正确提取 SourceContext 中的类名信息
4. 代码清理:移除不需要的方法名相关代码,简化日志筛选逻辑
This commit is contained in:
SunCheng
2026-01-22 19:06:58 +08:00
parent e2c0ab5389
commit 9e14849014
11 changed files with 2013 additions and 494 deletions

View File

@@ -1,4 +1,4 @@
import request from './request'
import request from './request'
/**
* 日志相关 API
@@ -12,6 +12,7 @@
* @param {string} [params.searchKeyword] - 搜索关键词
* @param {string} [params.logLevel] - 日志级别
* @param {string} [params.date] - 日期 (yyyyMMdd)
* @param {string} [params.className] - 类名
* @returns {Promise<{success: boolean, data: Array, total: number}>}
*/
export const getLogList = (params = {}) => {
@@ -32,3 +33,34 @@ export const getAvailableDates = () => {
method: 'get'
})
}
/**
* 获取可用的类名列表
* @param {Object} params - 查询参数
* @param {string} [params.date] - 日期 (yyyyMMdd)
* @returns {Promise<{success: boolean, data: Array}>}
*/
export const getAvailableClassNames = (params = {}) => {
return request({
url: '/Log/GetAvailableClassNames',
method: 'get',
params
})
}
/**
* 根据请求ID查询关联日志
* @param {Object} params - 查询参数
* @param {string} params.requestId - 请求ID
* @param {number} [params.pageIndex=1] - 页码
* @param {number} [params.pageSize=50] - 每页条数
* @param {string} [params.date] - 日期 (yyyyMMdd)
* @returns {Promise<{success: boolean, data: Array, total: number}>}
*/
export const getLogsByRequestId = (params = {}) => {
return request({
url: '/Log/GetLogsByRequestId',
method: 'get',
params
})
}

View File

@@ -1,4 +1,4 @@
import axios from 'axios'
import axios from 'axios'
import { showToast } from 'vant'
import { useAuthStore } from '@/stores/auth'
import router from '@/router'
@@ -12,6 +12,15 @@ const request = axios.create({
}
})
// 生成请求ID
const generateRequestId = () => {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
const r = Math.random() * 16 | 0
const v = c === 'x' ? r : (r & 0x3 | 0x8)
return v.toString(16)
})
}
// 请求拦截器
request.interceptors.request.use(
(config) => {
@@ -20,6 +29,11 @@ request.interceptors.request.use(
if (authStore.token) {
config.headers.Authorization = `Bearer ${authStore.token}`
}
// 添加请求ID
const requestId = generateRequestId()
config.headers['X-Request-ID'] = requestId
return config
},
(error) => {