@@ -127,6 +127,9 @@ const ChallengeContributePage: React.FC = () => {
127
127
const values = form . getFieldsValue ( true ) ;
128
128
console . log ( '当前表单值:' , values ) ;
129
129
130
+ // 更新update-time为当前时间
131
+ const currentDateTime = new Date ( ) . toISOString ( ) . replace ( 'T' , ' ' ) . substring ( 0 , 19 ) ;
132
+
130
133
// 检查是否有原始YAML
131
134
if ( ! values . rawYaml ) {
132
135
console . log ( '没有原始YAML,使用默认格式生成' ) ;
@@ -142,12 +145,15 @@ const ChallengeContributePage: React.FC = () => {
142
145
'base64-url' : values . base64Url ,
143
146
'is-expired' : values . isExpired === undefined ? false : values . isExpired ,
144
147
'tags' : values . tags || [ ] ,
145
- 'solutions' : ( values . solutions || [ ] ) ?. filter ( s => s . title && s . url ) . map ( s => ( {
148
+ 'solutions' : ( values . solutions || [ ] ) ?. filter ( ( s : any ) => s . title && s . url ) . map ( ( s : any ) => ( {
146
149
title : s . title ,
147
150
url : s . url ,
148
151
...( s . source ? { source : s . source } : { } ) ,
149
152
...( s . author ? { author : s . author } : { } )
150
- } ) )
153
+ } ) ) ,
154
+ // 添加或更新时间字段
155
+ 'create-time' : values . createTime || currentDateTime ,
156
+ 'update-time' : currentDateTime
151
157
} ;
152
158
153
159
const yamlString = YAML . stringify ( yamlObj , {
@@ -180,7 +186,10 @@ const ChallengeContributePage: React.FC = () => {
180
186
url : s . url ,
181
187
...( s . source ? { source : s . source } : { } ) ,
182
188
...( s . author ? { author : s . author } : { } )
183
- } ) )
189
+ } ) ) ,
190
+ // 更新时间字段
191
+ 'create-time' : values . createTime || currentDateTime ,
192
+ 'update-time' : currentDateTime
184
193
} ;
185
194
186
195
// 分析原始YAML文件结构,但保留完整内容
@@ -515,86 +524,75 @@ const ChallengeContributePage: React.FC = () => {
515
524
// 解析YAML函数
516
525
const parseYaml = ( yamlContent : string ) : ChallengeFormData | null => {
517
526
try {
518
- // 解析YAML字符串
519
- const yamlData = YAML . parse ( yamlContent ) ;
527
+ // 保存原始YAML内容
528
+ const rawYaml = yamlContent ;
520
529
521
- if ( ! yamlData ) {
522
- console . error ( 'YAML解析结果为空' ) ;
523
- return null ;
524
- }
525
-
526
- console . log ( '原始YAML数据结构:' , yamlData ) ;
527
-
528
- // 检查是否是集合格式的YAML
529
- let challengeData ;
530
- let originalYaml = yamlContent ; // 默认保存完整原始YAML
531
-
532
- if ( yamlData . challenges && Array . isArray ( yamlData . challenges ) && yamlData . challenges . length > 0 ) {
533
- // 从集合中提取第一个挑战
534
- console . log ( '从集合中提取挑战数据:' , yamlData . challenges [ 0 ] ) ;
535
- challengeData = yamlData . challenges [ 0 ] ;
536
-
537
- // 尝试获取仅包含这个挑战的YAML部分,但仍然保留原始集合格式
538
- try {
539
- // 为了保留挑战集合的结构和注释,我们保留整个YAML
540
- originalYaml = yamlContent ;
541
- } catch ( e ) {
542
- console . error ( '提取单个挑战的YAML失败:' , e ) ;
543
- // 继续使用完整的原始YAML
530
+ // 尝试解析YAML内容
531
+ const yamlData = YAML . parse ( yamlContent ) ;
532
+ console . log ( '解析的YAML数据:' , yamlData ) ;
533
+
534
+ // 检查是否为挑战集合
535
+ if ( yamlData && typeof yamlData === 'object' && 'challenges' in yamlData && Array . isArray ( yamlData . challenges ) ) {
536
+ console . log ( '检测到挑战集合,提取第一个挑战' ) ;
537
+ // 提取第一个挑战
538
+ if ( yamlData . challenges . length === 0 ) {
539
+ throw new Error ( '挑战集合为空' ) ;
544
540
}
545
- } else if ( yamlData . id !== undefined ) {
546
- // 单个挑战格式
547
- challengeData = yamlData ;
548
- } else {
549
- console . error ( '无法识别的YAML格式,没有找到challenges数组或id字段' ) ;
550
- return null ;
541
+
542
+ const firstChallenge = yamlData . challenges [ 0 ] ;
543
+ // 递归处理
544
+ return parseYaml ( YAML . stringify ( firstChallenge ) ) ;
551
545
}
552
546
553
- // 处理base64-url字段
554
- let base64Url = challengeData [ 'base64-url' ] || '' ;
555
- console . log ( '提取到的base64-url:' , base64Url ) ;
556
-
557
- // 打印关键字段检查
558
- console . log ( '挑战数据关键字段:' , {
559
- id : challengeData . id ,
560
- name : challengeData . name ,
561
- platform : challengeData . platform ,
562
- 'id-alias' : challengeData [ 'id-alias' ] ,
563
- tags : challengeData . tags ,
564
- 'difficulty-level' : challengeData [ 'difficulty-level' ] ,
565
- 'description-markdown' : challengeData [ 'description-markdown' ] ?. substring ( 0 , 100 ) ,
566
- 'base64-url' : challengeData [ 'base64-url' ] ,
567
- solutions : challengeData . solutions
568
- } ) ;
547
+ // 检查是否是单个挑战
548
+ if ( ! yamlData || typeof yamlData !== 'object' ) {
549
+ throw new Error ( 'YAML格式错误,期望得到一个对象' ) ;
550
+ }
551
+
552
+ // 将YAML对象转换为表单数据
553
+ const challengeData = yamlData as any ;
569
554
570
- // 创建表单数据
555
+ // 开始构建表单数据
571
556
const formData : ChallengeFormData = {
572
- id : challengeData . id !== undefined ? Number ( challengeData . id ) : null ,
557
+ // 保留原始的YAML内容
558
+ rawYaml : rawYaml ,
559
+
560
+ // 基本信息
561
+ id : challengeData . id || null ,
573
562
idAlias : challengeData [ 'id-alias' ] || '' ,
574
563
platform : challengeData . platform || 'Web' ,
575
564
name : challengeData . name || '' ,
576
565
nameEn : challengeData . name_en || '' ,
577
- difficultyLevel : Number ( challengeData [ 'difficulty-level' ] ) || 1 ,
578
- // 处理描述字段,兼容多种格式
579
- description : challengeData [ 'description-markdown' ] || challengeData . description || '' ,
580
- descriptionEn : challengeData [ 'description-markdown_en' ] || challengeData . descriptionEn || '' ,
581
- descriptionMarkdown : challengeData [ 'description-markdown' ] || challengeData . description || '' ,
582
- descriptionMarkdownEn : challengeData [ 'description-markdown_en' ] || challengeData . descriptionEn || '' ,
583
- // 处理base64Url字段,确保正确映射
566
+
567
+ // 描述信息
568
+ description : challengeData [ 'description-markdown' ] || '' ,
569
+ descriptionMarkdown : challengeData [ 'description-markdown' ] || '' ,
570
+ descriptionEn : challengeData [ 'description-markdown_en' ] || '' ,
571
+ descriptionMarkdownEn : challengeData [ 'description-markdown_en' ] || '' ,
572
+
573
+ // 难度级别
574
+ difficultyLevel : challengeData [ 'difficulty-level' ] || 1 ,
575
+
576
+ // URL处理
584
577
base64Url : challengeData [ 'base64-url' ] || '' ,
578
+
585
579
// 处理过期标志
586
580
isExpired : challengeData [ 'is-expired' ] === true || false ,
581
+
582
+ // 标签处理
587
583
tags : challengeData . tags || [ ] ,
584
+
585
+ // 解决方案处理
588
586
solutions : ( challengeData . solutions || [ ] ) . map ( ( solution : any ) => ( {
589
587
title : solution . title || '' ,
590
588
url : solution . url || '' ,
591
589
source : solution . source || '' ,
592
590
author : solution . author || ''
593
591
} ) ) ,
594
- example : '' ,
595
- testCases : [ ] ,
596
- comments : [ ] ,
597
- rawYaml : originalYaml
592
+
593
+ // 时间字段处理
594
+ createTime : challengeData [ 'create-time' ] || '' ,
595
+ updateTime : challengeData [ 'update-time' ] || ''
598
596
} ;
599
597
600
598
console . log ( '转换后的表单数据:' , formData ) ;
@@ -627,6 +625,19 @@ const ChallengeContributePage: React.FC = () => {
627
625
formValues . id = calculateNextId ( ) ;
628
626
}
629
627
628
+ // 更新时间字段为当前时间
629
+ const currentDateTime = new Date ( ) . toISOString ( ) . replace ( 'T' , ' ' ) . substring ( 0 , 19 ) ;
630
+ formValues . updateTime = currentDateTime ;
631
+
632
+ // 如果原始YAML存在,也需要更新其中的update-time字段
633
+ if ( formValues . rawYaml ) {
634
+ // 使用正则表达式更新update-time字段
635
+ formValues . rawYaml = formValues . rawYaml . replace (
636
+ / u p d a t e - t i m e : .* $ / m,
637
+ `update-time: ${ currentDateTime } `
638
+ ) ;
639
+ }
640
+
630
641
console . log ( '正在设置表单值:' , formValues ) ;
631
642
console . log ( '原始YAML是否已保存:' , ! ! formValues . rawYaml ) ;
632
643
0 commit comments