fix: save_records JOIN 查询列名歧义, 加 sr. 前缀

- getRecords JOIN cloud_configs 后 WHERE 列需加 sr. 前缀
- 不带日期筛选时不触发 (srWhere 为空字符串)
- summaryRows 查询也用 srWhere 但去掉 sr. 前缀 (查询 save_records 不需要)
- 详情补充文件大小/使用账号/耗时
This commit is contained in:
2026-05-15 06:57:50 +08:00
parent b7702d0285
commit 359e15a82d
2 changed files with 41 additions and 18 deletions

View File

@@ -270,15 +270,19 @@ export function getSaveRecords(page: number = 1, pageSize: number = 20, startDat
summaryConditions.push('source_type = ?'); summaryParams.push(sourceType); summaryConditions.push('source_type = ?'); summaryParams.push(sourceType);
} }
if (keyword) { conditions.push('source_title LIKE ?'); params.push(`%${keyword}%`); } if (keyword) { conditions.push('source_title LIKE ?'); params.push(`%${keyword}%`); }
const where = conditions.length > 0 ? 'WHERE ' + conditions.join(' AND ') : ''; const srWhere = conditions.length > 0 ? 'WHERE sr.' + conditions.join(' AND sr.') : '';
const total = (db.prepare(`SELECT COUNT(*) as count FROM save_records ${where}`).get(...params) as any).count; const total = (db.prepare(`SELECT COUNT(*) as count FROM save_records ${srWhere.replace(/sr\./g, '')}`).get(...params) as any).count;
const records = db.prepare( const records = db.prepare(
`SELECT * FROM save_records ${where} ORDER BY created_at DESC LIMIT ? OFFSET ?` `SELECT sr.*, cc.nickname as config_nickname
).all(...params, pageSize, offset) as SaveRecord[]; FROM save_records sr
LEFT JOIN cloud_configs cc ON sr.config_id = cc.id
${srWhere}
ORDER BY sr.created_at DESC LIMIT ? OFFSET ?`
).all(...params, pageSize, offset) as any[];
const summaryWhere = summaryConditions.length > 0 ? 'WHERE ' + summaryConditions.join(' AND ') : ''; const summaryWhere = summaryConditions.length > 0 ? 'WHERE sr.' + summaryConditions.join(' AND sr.') : '';
const summaryRows = db.prepare( const summaryRows = db.prepare(
`SELECT status, COUNT(*) as cnt FROM save_records ${summaryWhere} GROUP BY status` `SELECT status, COUNT(*) as cnt FROM save_records ${summaryWhere.replace(/sr\./g, '')} GROUP BY status`
).all(...summaryParams) as { status: string; cnt: number }[]; ).all(...summaryParams) as { status: string; cnt: number }[];
let sumTotal = 0, sumSuccess = 0, sumFailed = 0, sumReused = 0; let sumTotal = 0, sumSuccess = 0, sumFailed = 0, sumReused = 0;
for (const r of summaryRows) { for (const r of summaryRows) {

View File

@@ -85,15 +85,15 @@
<el-table-column type="expand" width="36"> <el-table-column type="expand" width="36">
<template #default="{ row }"> <template #default="{ row }">
<div class="expand-detail"> <div class="expand-detail">
<!-- Row 1: 原始链接 + 文件夹数量 + 文件数 --> <!-- Row 1: 原始链接 + 文件大小 + 文件+文件 -->
<div class="detail-row"> <div class="detail-row">
<div class="detail-cell"> <div class="detail-cell" style="flex:2">
<span class="detail-label">原始链接</span> <span class="detail-label">原始链接</span>
<a :href="row.source_url" target="_blank" class="detail-link">{{ row.source_url }}</a> <a :href="row.source_url" target="_blank" class="detail-link">{{ row.source_url }}</a>
</div> </div>
<div class="detail-cell" v-if="row.original_folder_name"> <div class="detail-cell" v-if="row.file_size">
<span class="detail-label">原始文件夹名</span> <span class="detail-label">文件大小</span>
<code class="detail-code">{{ row.original_folder_name }}</code> <code class="detail-code">{{ formatFileSize(row.file_size) }}</code>
</div> </div>
<div class="detail-cell" v-if="row.status !== 'reused' && (row.folder_count > 0 || row.file_count > 0)"> <div class="detail-cell" v-if="row.status !== 'reused' && (row.folder_count > 0 || row.file_count > 0)">
<span class="detail-label">文件夹</span> <span class="detail-label">文件夹</span>
@@ -108,9 +108,24 @@
<span class="reuse-msg"> 直接使用已有分享链接无需实际转存</span> <span class="reuse-msg"> 直接使用已有分享链接无需实际转存</span>
</div> </div>
</div> </div>
<!-- Row 2: 分享链接 + 分享密码 + 转存文件夹 --> <!-- Row 2: 使用账号 + 原始文件夹 -->
<div class="detail-row"> <div class="detail-row">
<div class="detail-cell" v-if="row.share_url"> <div class="detail-cell" v-if="row.config_nickname">
<span class="detail-label">使用账号</span>
<el-tag size="small" type="success" effect="plain">{{ row.config_nickname }}</el-tag>
</div>
<div class="detail-cell" v-if="row.original_folder_name">
<span class="detail-label">原始文件夹名</span>
<code class="detail-code">{{ row.original_folder_name }}</code>
</div>
<div class="detail-cell" v-if="row.folder_name">
<span class="detail-label">转存文件夹</span>
<code class="detail-code">{{ row.folder_name }}</code>
</div>
</div>
<!-- Row 3: 分享链接 + 分享密码 + 耗时 -->
<div class="detail-row">
<div class="detail-cell" v-if="row.share_url" style="flex:2">
<span class="detail-label">分享链接</span> <span class="detail-label">分享链接</span>
<a :href="row.share_url" target="_blank" class="detail-link">{{ row.share_url }}</a> <a :href="row.share_url" target="_blank" class="detail-link">{{ row.share_url }}</a>
</div> </div>
@@ -118,12 +133,12 @@
<span class="detail-label">分享密码</span> <span class="detail-label">分享密码</span>
<el-tag size="small" type="warning">{{ row.share_pwd }}</el-tag> <el-tag size="small" type="warning">{{ row.share_pwd }}</el-tag>
</div> </div>
<div class="detail-cell" v-if="row.folder_name"> <div class="detail-cell">
<span class="detail-label">转存文件夹</span> <span class="detail-label">耗时</span>
<code class="detail-code">{{ row.folder_name }}</code> <span :class="['detail-duration', durationClass(row.duration_ms)]">{{ formatDuration(row.duration_ms) }}</span>
</div> </div>
</div> </div>
<!-- Row 3: IP地址 + 归属地 --> <!-- Row 4: IP地址 + 归属地 + 创建时间 -->
<div class="detail-row" v-if="row.ip_address"> <div class="detail-row" v-if="row.ip_address">
<div class="detail-cell"> <div class="detail-cell">
<span class="detail-label">IP 地址</span> <span class="detail-label">IP 地址</span>
@@ -133,8 +148,12 @@
<span class="detail-label">归属地</span> <span class="detail-label">归属地</span>
<code class="detail-code">{{ formatLocation(row.ip_location) }}</code> <code class="detail-code">{{ formatLocation(row.ip_location) }}</code>
</div> </div>
<div class="detail-cell">
<span class="detail-label">时间</span>
<code class="detail-code">{{ row.created_at }}</code>
</div>
</div> </div>
<!-- Row 4: 错误信息整行 --> <!-- Row 5: 错误信息整行 -->
<div class="detail-row" v-if="row.status === 'failed' && row.error_message"> <div class="detail-row" v-if="row.status === 'failed' && row.error_message">
<div class="detail-cell detail-full"> <div class="detail-cell detail-full">
<span class="detail-label">错误信息</span> <span class="detail-label">错误信息</span>