feat: 内容统计信息显示(有效行数/总字数)
This commit is contained in:
@@ -26,6 +26,10 @@ def list_items():
|
|||||||
offset=int(request.args.get('offset', 0))
|
offset=int(request.args.get('offset', 0))
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# 为每个条目添加内容统计
|
||||||
|
for item in items:
|
||||||
|
item['content_stats'] = calculate_content_stats(item)
|
||||||
|
|
||||||
# 获取符合条件的总数(用于分页)
|
# 获取符合条件的总数(用于分页)
|
||||||
total = db.count_items(
|
total = db.count_items(
|
||||||
type=request.args.get('type'),
|
type=request.args.get('type'),
|
||||||
@@ -77,9 +81,33 @@ def get_item(item_id):
|
|||||||
# 获取邮件发送历史
|
# 获取邮件发送历史
|
||||||
email_logs = db.get_email_logs(item_id)
|
email_logs = db.get_email_logs(item_id)
|
||||||
item['email_logs'] = email_logs
|
item['email_logs'] = email_logs
|
||||||
|
# 添加内容统计
|
||||||
|
item['content_stats'] = calculate_content_stats(item)
|
||||||
return jsonify({'success': True, 'data': item})
|
return jsonify({'success': True, 'data': item})
|
||||||
|
|
||||||
|
|
||||||
|
def calculate_content_stats(item):
|
||||||
|
"""计算内容统计:有效行数、总字数"""
|
||||||
|
# 合计所有文本内容
|
||||||
|
all_text = ''
|
||||||
|
if item.get('content'):
|
||||||
|
all_text += item['content'] + '\n'
|
||||||
|
if item.get('note'):
|
||||||
|
all_text += item['note'] + '\n'
|
||||||
|
|
||||||
|
if not all_text.strip():
|
||||||
|
return {'lines': 0, 'chars': 0}
|
||||||
|
|
||||||
|
# 有效行数(去除空行)
|
||||||
|
lines = [line for line in all_text.split('\n') if line.strip()]
|
||||||
|
line_count = len(lines)
|
||||||
|
|
||||||
|
# 总字数(去除空格后的字符数)
|
||||||
|
char_count = len(all_text.replace(' ', '').replace('\n', '').replace('\t', '').strip())
|
||||||
|
|
||||||
|
return {'lines': line_count, 'chars': char_count}
|
||||||
|
|
||||||
|
|
||||||
@app.route('/api/items/<int:item_id>', methods=['PUT'])
|
@app.route('/api/items/<int:item_id>', methods=['PUT'])
|
||||||
def update_item(item_id):
|
def update_item(item_id):
|
||||||
"""更新条目"""
|
"""更新条目"""
|
||||||
@@ -1280,6 +1308,8 @@ function renderItems(items) {
|
|||||||
<span style="font-size:10px; opacity:0.5; margin-left:8px;">
|
<span style="font-size:10px; opacity:0.5; margin-left:8px;">
|
||||||
${formatShortDate(item.created_at)}${item.updated_at && item.updated_at !== item.created_at ? '→' + formatShortDate(item.updated_at) : ''}
|
${formatShortDate(item.created_at)}${item.updated_at && item.updated_at !== item.created_at ? '→' + formatShortDate(item.updated_at) : ''}
|
||||||
</span>
|
</span>
|
||||||
|
${item.content_stats && (item.content_stats.lines > 0 || item.content_stats.chars > 0) ?
|
||||||
|
`<span style="font-size:10px; opacity:0.6; margin-left:4px;" title="有效行数/总字数">[${item.content_stats.lines}行/${item.content_stats.chars}字]</span>` : ''}
|
||||||
</h6>
|
</h6>
|
||||||
<p class="card-text text-muted small mb-0 text-truncate" style="font-size:12px;">
|
<p class="card-text text-muted small mb-0 text-truncate" style="font-size:12px;">
|
||||||
${item.url ? truncate(item.url, 50) : item.content ? truncate(item.content, 50) : item.note ? truncate(item.note, 50) : ''}
|
${item.url ? truncate(item.url, 50) : item.content ? truncate(item.content, 50) : item.note ? truncate(item.note, 50) : ''}
|
||||||
@@ -1547,6 +1577,11 @@ async function showDetail(id) {
|
|||||||
|
|
||||||
let html = `<div class="mb-3"><strong>类型:</strong> ${getTypeLabel(item.type)}</div>`;
|
let html = `<div class="mb-3"><strong>类型:</strong> ${getTypeLabel(item.type)}</div>`;
|
||||||
|
|
||||||
|
// 显示内容统计
|
||||||
|
if (item.content_stats && (item.content_stats.lines > 0 || item.content_stats.chars > 0)) {
|
||||||
|
html += `<div class="mb-3"><strong>统计:</strong> <span class="badge bg-info">${item.content_stats.lines} 有效行 / ${item.content_stats.chars} 字</span></div>`;
|
||||||
|
}
|
||||||
|
|
||||||
if (item.url) {
|
if (item.url) {
|
||||||
html += `<div class="mb-3"><strong>URL:</strong> <a href="${item.url}" target="_blank">${item.url}</a></div>`;
|
html += `<div class="mb-3"><strong>URL:</strong> <a href="${item.url}" target="_blank">${item.url}</a></div>`;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user