@@ -4,6 +4,67 @@ let currentUser = null;
44let userChannels = [ ] ;
55let eventSource = null ;
66
7+ // 防抖函数
8+ function debounce ( func , delay ) {
9+ let timeoutId ;
10+ return function ( ...args ) {
11+ clearTimeout ( timeoutId ) ;
12+ timeoutId = setTimeout ( ( ) => func . apply ( this , args ) , delay ) ;
13+ } ;
14+ }
15+
16+ // 预览Cron表达式的未来执行时间
17+ async function previewCronExpression ( expression ) {
18+ const previewContainer = document . getElementById ( 'cronPreview' ) ;
19+ if ( ! previewContainer ) return ;
20+
21+ // 空值处理:清空预览区域
22+ if ( ! expression ) {
23+ previewContainer . innerHTML = '' ;
24+ previewContainer . className = 'cron-preview' ;
25+ return ;
26+ }
27+
28+ try {
29+ const token = localStorage . getItem ( 'token' ) ;
30+ // 转换星期位:前端输入5表示星期五,需要转换为后端格式
31+ const convertedExpression = convertCronExpressionForBackend ( expression ) ;
32+ const response = await fetch ( `${ API_BASE } /cron/preview` , {
33+ method : 'POST' ,
34+ headers : {
35+ 'Content-Type' : 'application/json' ,
36+ 'Authorization' : `Bearer ${ token } `
37+ } ,
38+ body : JSON . stringify ( { cron_expression : convertedExpression } )
39+ } ) ;
40+
41+ const data = await response . json ( ) ;
42+
43+ if ( data . success && data . times && data . times . length > 0 ) {
44+ // 显示成功预览
45+ previewContainer . className = 'cron-preview success' ;
46+ previewContainer . innerHTML = `
47+ <div class="preview-title">📅 未来5次执行时间:</div>
48+ <ul class="preview-times">
49+ ${ data . times . map ( ( time , index ) => `<li>${ index + 1 } . ${ time } </li>` ) . join ( '' ) }
50+ </ul>
51+ ` ;
52+ } else {
53+ // 显示错误提示
54+ previewContainer . className = 'cron-preview error' ;
55+ previewContainer . innerHTML = `
56+ <div class="preview-error">❌ ${ data . error || '无法计算执行时间' } </div>
57+ ` ;
58+ }
59+ } catch ( error ) {
60+ // 网络或其他错误
61+ previewContainer . className = 'cron-preview error' ;
62+ previewContainer . innerHTML = `
63+ <div class="preview-error">❌ 预览失败,请稍后重试</div>
64+ ` ;
65+ }
66+ }
67+
768// 初始化
869document . addEventListener ( 'DOMContentLoaded' , function ( ) {
970 checkAuthStatus ( ) ;
@@ -401,6 +462,15 @@ function initAppEvents() {
401462 }
402463 } ) ;
403464
465+ // Cron表达式输入事件监听(带防抖)
466+ const cronInput = document . getElementById ( 'cronExpression' ) ;
467+ if ( cronInput ) {
468+ cronInput . addEventListener ( 'input' , debounce ( async function ( e ) {
469+ const expression = e . target . value . trim ( ) ;
470+ await previewCronExpression ( expression ) ;
471+ } , 300 ) ) ;
472+ }
473+
404474 // 绑定外部日历表单
405475 const extCalForm = document . getElementById ( 'externalCalendarForm' ) ;
406476 if ( extCalForm ) {
0 commit comments