article-writer-cn
Version:
AI 驱动的智能写作系统 - 专注公众号/自媒体文章创作
92 lines • 2.92 kB
JavaScript
/**
* 进度条显示组件
*/
export class ProgressBar {
lastUpdate = 0;
updateInterval = 500; // 更新间隔(毫秒)
/**
* 更新进度
*/
update(progress) {
const now = Date.now();
// 限制更新频率
if (now - this.lastUpdate < this.updateInterval) {
return;
}
this.lastUpdate = now;
const percent = Math.min(100, Math.floor((progress.current / progress.total) * 100));
const bar = this.createBar(percent);
const speed = progress.speed || 0;
const eta = this.calculateETA(progress);
// 清除当前行
process.stdout.write('\r\x1b[K');
// 输出进度信息
const info = [
`🔄 [${bar}] ${percent}%`,
`(${progress.current}/${progress.total})`,
`队列: ${progress.queue}`,
`速度: ${speed.toFixed(1)} 页/秒`,
eta ? `预计: ${this.formatTime(eta)}` : ''
].filter(Boolean).join(' | ');
process.stdout.write(info);
}
/**
* 完成进度
*/
complete(duration, totalPages) {
process.stdout.write('\r\x1b[K'); // 清除当前行
console.log(`✅ 爬取完成: ${totalPages} 页, 用时 ${this.formatDuration(duration)}`);
}
/**
* 创建进度条
*/
createBar(percent, width = 30) {
const filled = Math.floor(width * percent / 100);
const empty = width - filled;
return '█'.repeat(filled) + '░'.repeat(empty);
}
/**
* 计算剩余时间
*/
calculateETA(progress) {
if (!progress.speed || progress.speed === 0) {
return null;
}
const remaining = progress.total - progress.current;
return remaining / progress.speed;
}
/**
* 格式化时间(秒)
*/
formatTime(seconds) {
if (seconds < 60) {
return `${Math.floor(seconds)}秒`;
}
const minutes = Math.floor(seconds / 60);
const remainingSeconds = Math.floor(seconds % 60);
if (minutes < 60) {
return `${minutes}分${remainingSeconds}秒`;
}
const hours = Math.floor(minutes / 60);
const remainingMinutes = minutes % 60;
return `${hours}小时${remainingMinutes}分`;
}
/**
* 格式化持续时间(毫秒)
*/
formatDuration(ms) {
const seconds = Math.floor(ms / 1000);
const minutes = Math.floor(seconds / 60);
const hours = Math.floor(minutes / 60);
if (hours > 0) {
const remainingMinutes = minutes % 60;
return `${hours}小时${remainingMinutes}分`;
}
if (minutes > 0) {
const remainingSeconds = seconds % 60;
return `${minutes}分${remainingSeconds}秒`;
}
return `${seconds}秒`;
}
}
//# sourceMappingURL=progress-bar.js.map