chengjie před 4 měsíci
rodič
revize
a0da12003a

+ 1 - 0
src/api/yjbdc/routes.js

@@ -12,5 +12,6 @@ router.get('/api/GetYJBDCArticleList',yjbdcController.GetYJBDCArticleList);
12 12
 router.get('/api/BuildYJBDCQRCode',yjbdcController.BuildYJBDCQRCode);
13 13
 router.get('/api/DeleteYJBDCArticleList',yjbdcController.DeleteYJBDCArticleList);
14 14
 router.get('/api/UpdateYJBDCArticleReadCount',yjbdcController.UpdateYJBDCArticleReadCount);
15
+router.get('/api/getMiaoguoTodayAllWords',yjbdcController.getMiaoguoTodayAllWords);
15 16
 
16 17
 export default router;

+ 42 - 47
src/api/yjbdc/yjbdcController.js

@@ -188,57 +188,16 @@ export async function GenerateArticle(ctx) {
188 188
         if (words){
189 189
             
190 190
             const menuConfig=constantClass.GetYJBDCGenerateConfig();
191
-
192
-            // let content = "将"+words+"这些单词生成一篇英文文章。要求"+
193
-            // "[难度];"+
194
-            // "文章类型是'"+articleStyle+"([类型])';"+
195
-            // "要求提供丰富上下文线索、清晰的文章结构;"+
196
-            // "文章单词数在200个左右,最多不能超过300个;"+
197
-            // "文章按每句分成数组,且每句都有中文翻译[补充1];"+
198
-            // "提供5道针对文章阅读理解的单项选择题,各有四个唯一选项,并提供答案;"+
199
-            // "单项选择题和选项也要有中文翻译;"+
200
-            // "必须确保用户提供的每个单词(除像'fuck'、'shit'等脏话外)至少在文章中出现一次,可以是原形或某种变形(第三人称单数、复数、过去式、过去分词、现在分词、比较级、最高级等等所有可能的变形形式)。比如用户输入'go',文章除了'go'以外,也可以生成像'goes'、'went'、'gone'、'going'等单词;"+
201
-            // "内容格式为JSON,必须严格按照以下格式,不能有任何字段名错误或缺失:{"+
202
-            // "  \"ArticleEnglish\":[\"<英文文章句子1>\",\"<英文文章句子2>\"...],"+
203
-            // "  \"ArticleChinese\":[\"<中文翻译句子1>\",\"<中文翻译句子2>\"...],"+
204
-            // "  \"Question\":[{"+
205
-            // "    \"QuestionEnglish\":\"<英语题目1>\","+
206
-            // "    \"QuestionChinese\":\"<题目1中文翻译>\","+
207
-            // "    \"OptionsEnglish\":[\"A.<英语选项1>\",\"B.<英语选项2>\",\"C.<英语选项3>\",\"D.<英语选项4>\"],"+
208
-            // "    \"OptionsChinese\":[\"A.<选项1中文翻译>\",\"B.<选项2中文翻译>\",\"C.<选项3中文翻译>\",\"D.<选项4中文翻译>\"],"+
209
-            // "    \"Answer\":\"<答案>\""+
210
-            // "  }...]"+
211
-            // "}";
212
-
213
-            // if (!params.Level || params.Level=="" || params.Level==undefined || params.Level>="4"){
214
-            //     params.Level="0";
215
-            // }
216
-            // content = content.replace("[难度]",menuConfig.Level[Number(params.Level)].Content);
217
-            
218
-            
219
-            // for(let i=0;i<menuConfig.ArticleStyle.length;i++){
220
-            //     if (menuConfig.ArticleStyle[i].Name==articleStyle){
221
-            //         content = content.replace("[类型]",menuConfig.ArticleStyle[i].Content);
222
-            //         break;
223
-            //     }
224
-            // }
225
-            
191
+        
226 192
             //console.log("content:"+content);
227 193
 
228 194
             let level="";
229
-            if (!params.Level || params.Level=="" || params.Level==undefined || params.Level>="4"){
230
-                params.Level="0";
231
-                //level="A2";
195
+            if (!params.Level || params.Level=="" || params.Level==undefined || params.Level>="6"){
196
+                params.Level=0;
232 197
             }
233
-            // if (params.Level=="1")
234
-            //     level="B1";
235
-            // if (params.Level=="2")
236
-            //     level="B2";
237
-            // if (params.Level=="3")
238
-            //     level="C1";
239
-
240
-            level=menuConfig.Level[Number(params.Level)].Content;
241
-            
198
+
199
+            level=menuConfig.Level[Number(params.Level)].Name;
200
+            console.log("Level:"+level);
242 201
             let content={
243 202
                 "instruction": "用单词("+words+")生成"+level+"难度童话故事。要求:",
244 203
                 "requirements": [
@@ -393,6 +352,42 @@ export async function GetYJBDCGenerateConfig(ctx) {
393 352
     ctx.body = {"errcode": 10000, result:result};
394 353
 }
395 354
 
355
+//获得秒过当天任务完成后的英语单词(未完成)
356
+export async function getMiaoguoTodayAllWords(ctx) {
357
+    const param = {
358
+        UserID: ctx.query.UserID || 0,
359
+    };
360
+
361
+    const url = `https://www.kylx365.com/api/GetMiaoguoCardList2?UserID=${param.UserID}&IsToday=2&CardType=0&OrderType=ac.LastTime%20desc`;
362
+
363
+    let result = await axios.get(url)
364
+        .then(res => {
365
+            let list = res.data.result.List;
366
+            if (list && list.length>0) {
367
+                
368
+                let arr=[];
369
+                for(let i=0;i<list.length;i++){
370
+                    arr.push(list[i].Content[1].Content);
371
+                }
372
+
373
+                let arr2=stringUtils.extractEnglishWords(arr);
374
+                console.log(arr2.length);
375
+
376
+                return {"errcode": 10000, result:result}
377
+            }
378
+            else{
379
+                return {errcode: 101};
380
+            }
381
+        })
382
+        .catch(err => {
383
+            return {errcode: 101, errStr: err};
384
+        });
385
+
386
+   
387
+    ctx.body = result;
388
+}
389
+
390
+
396 391
 //获得文章列表或具体文章
397 392
 export async function GetYJBDCArticleList(ctx) {
398 393
     const param = {

+ 12 - 8
src/util/constant/index.js

@@ -5,14 +5,18 @@ export default {
5 5
     GetYJBDCGenerateConfig:()=>{
6 6
         let result = {};
7 7
         result.Level=[
8
-            // {Name:"小学",CSS:"Selected",English:"Primary school vocabulary size",Content:"难度上是中国的小学六年级毕业的孩子可以阅读,生成的文章中除了用户提供的单词,其他全部使用人教版小学英语词汇表的单词,以及Sight words中220个单词,不要超出范围。"},
9
-            // {Name:"初中",CSS:"",English:"Junior high school vocabulary size",Content:"难度上是中国的初三毕业的孩子可以阅读,生成的文章中除了用户提供的单词,其他全部使用人教版初中英语词汇表的单词,以及Sight words中220个单词,不要超出范围。"},
10
-            // {Name:"高中",CSS:"",English:"High school vocabulary size",Content:"难度上是中国的高三毕业的孩子可以阅读,生成的文章使用人教版高中英语词汇表的单词."},
11
-            // {Name:"大学",CSS:"",English:"College vocabulary size",Content:"难度上是中国的大学毕业生的孩子可以阅读,生成的文章使用大学生六级词汇表的单词."}];            
12
-            {Name:"小学",CSS:"Selected",English:"Primary school vocabulary size",Content:"生成难度是CEFR语言能力评估框架的A2标准"},
13
-            {Name:"初中",CSS:"",English:"Junior high school vocabulary size",Content:"生成难度是CEFR语言能力评估框架的B1标准"},
14
-            {Name:"高中",CSS:"",English:"High school vocabulary size",Content:"生成难度是CEFR语言能力评估框架的B2标准"},
15
-            {Name:"大学",CSS:"",English:"College vocabulary size",Content:"生成难度是CEFR语言能力评估框架的C1标准"}
8
+            // {Name:"小学",CSS:"Selected",English:"Primary school vocabulary size",Content:"生成难度是CEFR语言能力评估框架的A2标准"},
9
+            // {Name:"初中",CSS:"",English:"Junior high school vocabulary size",Content:"生成难度是CEFR语言能力评估框架的B1标准"},
10
+            // {Name:"高中",CSS:"",English:"High school vocabulary size",Content:"生成难度是CEFR语言能力评估框架的B2标准"},
11
+            // {Name:"大学",CSS:"",English:"College vocabulary size",Content:"生成难度是CEFR语言能力评估框架的C1标准"}
12
+
13
+            {Name:"A1",CSS:"Selected",English:"A1",Content:"初学,入门理解\n适用小学"},
14
+            {Name:"A2",CSS:"",English:"A2",Content:"基础,简单沟通\n适用小升初"},
15
+            {Name:"B1",CSS:"",English:"B1",Content:"中级,日常应对\n适用中考"},
16
+            {Name:"B2",CSS:"",English:"B2",Content:"较高,流利交流\n适用高考"},
17
+            {Name:"C1",CSS:"",English:"C1",Content:"高级,运用自如\n适用大学"},
18
+            {Name:"C2",CSS:"",English:"C2",Content:"精通,母语水平\n适用留学"},
19
+
16 20
         ];            
17 21
         result.ArticleStyle=[
18 22
             {Name:"童话",CSS:"Selected",English:"Fairy Tales",Content:"充满神奇和想象的故事,里面可能有会说话的动物、美丽的人、勇敢的人,还有魔法和冒险。"},

+ 119 - 1
src/util/stringClass.js

@@ -2,6 +2,71 @@
2 2
 import moment from 'moment';
3 3
 import os from 'os';
4 4
 
5
+/**
6
+ * 字符串工具类集合
7
+ * 
8
+ * 提供各种字符串处理功能,包括:
9
+ * - 字符串补零、修剪空格
10
+ * - 引号转义与替换
11
+ * - 子字符串截取
12
+ * - 全量字符串替换
13
+ * - 数字/中文/英文验证
14
+ * - IP地址处理
15
+ * - 时间格式化
16
+ * - 年级计算
17
+ * - 哈希表实现
18
+ * - 金额格式化
19
+ * - 数组排序
20
+ * - 循环熔断
21
+ * - 英语单词提取
22
+ * 
23
+ * 所有方法均为静态工具方法,可直接调用。
24
+ */
25
+/**
26
+ * 字符串工具类集合,提供多种字符串处理功能
27
+ * 
28
+ * @namespace stringUtils
29
+ * @property {Function} AddZero - 给字符串左侧补零
30
+ * @property {Function} Trim - 删除字符串两端的空格
31
+ * @property {Function} LTrim - 删除字符串左侧的空格
32
+ * @property {Function} RTrim - 删除字符串右侧的空格
33
+ * @property {Function} AddSingleQuotes - 转义单引号
34
+ * @property {Function} SubStr - 截取子字符串
35
+ * @property {Function} ReplaceSingleQuotes - 替换单引号为双单引号
36
+ * @property {Function} ReplaceDoubleQuotes - 替换双引号为中文引号
37
+ * @property {Function} ReplaceAllString - 替换字符串中所有匹配项
38
+ * @property {Function} IsNumber - 判断字符串是否为纯数字
39
+ * @property {Function} GetServerIP - 获取服务器IP地址
40
+ * @property {Function} IsArray - 判断对象是否为数组
41
+ * @property {Function} ExportExcelRes - 设置Excel导出的响应头
42
+ * @property {Function} SetEncode - 字符编码转换
43
+ * @property {Function} SetDecode - 字符解码
44
+ * @property {Function} ChangeXML - 将JSON转换为XML格式
45
+ * @property {Function} Random - 生成指定范围内的随机整数
46
+ * @property {Function} RandomArray - 随机打乱数组顺序
47
+ * @property {Function} RemoveJSONNull - 移除JSON数组中的null值
48
+ * @property {Function} GetDateTimeFormat - 人性化时间格式化
49
+ * @property {Function} GetGrade - 根据生日计算年级
50
+ * @property {Function} GetGrade2 - 根据年级数字返回对应年级名称
51
+ * @property {Function} getMinuteSecond - 将秒数转换为分钟/秒格式
52
+ * @property {Function} FormatMoney - 将金额转换为格式化字符串
53
+ * @property {Function} FormatPercentageToFigure - 将百分比转换为数字
54
+ * @property {Function} SortArrayByStringLength - 根据字符串长度排序数组
55
+ * @property {Function} IsChineseSentence - 判断整句是否包含中文
56
+ * @property {Function} SentenceChinesePosition - 返回句中中文的位置
57
+ * @property {Function} IsChinese - 判断是否是中文
58
+ * @property {Function} IsEnglish - 判断是否是英文
59
+ * @property {Function} loopBreaker - 循环熔断函数
60
+ * @property {Function} getGroupName - 获取小组名称
61
+ * @property {Function} CheckIsArray - 检查是否为数组
62
+ * @property {Function} GetOrdinalPostfix - 获取序数后缀
63
+ * @property {Function} TrimEndZero - 去除数字末尾多余的0
64
+ * @property {Function} IsValidIP - 验证IP地址格式
65
+ * @property {Function} IsValidChineseNumberParentheses - 验证字符串是否只包含汉字、数字、字母和括号
66
+ * @property {Function} GetClientIP - 获取客户端真实IP地址
67
+ * @property {Function} cleanWord - 清理单词中的非字母字符
68
+ * @property {Function} extractEnglishWords - 从文本中提取英语单词
69
+ */
5 70
 export const stringUtils = {
6 71
     //给字符串左侧补零
7 72
     AddZero: (str, length) => {
@@ -606,5 +671,58 @@ export const stringUtils = {
606 671
         }
607 672
 
608 673
         return clientIP || '0.0.0.0';
609
-    }
674
+    },
675
+
676
+    cleanWord(word) {
677
+        if (!word) return '';
678
+        
679
+        // 去除单词前后的非字母字符
680
+        const cleaned = word.replace(/^[^A-Za-z]+|[^A-Za-z]+$/g, '');
681
+        
682
+        // 保留单词中间的撇号和连字符
683
+        return cleaned.replace(/[^A-Za-z''-]/g, '');
684
+    },
685
+    // 提取英语单词的函数 - 增强版
686
+    extractEnglishWords(texts) {
687
+        //console.group('英语单词提取');
688
+        const words = new Set();
689
+
690
+        texts.forEach(item => {
691
+            const text = item;
692
+            console.log('处理文本:', text);
693
+            
694
+            // 使用多种分隔符分割文本(空格、逗号、句号、感叹号、中文字符等)
695
+            // 这个正则表达式会匹配任何非英文字母、撇号或连字符的字符作为分隔符
696
+            const parts = text.split(/[^A-Za-z''-]+/).filter(Boolean);
697
+            
698
+            console.log('分割后的部分:', parts);
699
+            
700
+            // 处理每个可能的单词
701
+            parts.forEach(part => {
702
+                    // 清理并验证单词
703
+                    const cleanWord = this.cleanWord(part);
704
+                    
705
+                    // 特殊处理单词"I"
706
+                    if (cleanWord === 'I' || cleanWord === 'a') {
707
+                        words.add(cleanWord); // 添加小写的"i"
708
+                        //console.log('添加单词: I (特殊处理)');
709
+                    }
710
+                    // 处理其他单词(长度>=2)
711
+                    else if (cleanWord && cleanWord.length >= 2 && /^[A-Za-z''-]+$/.test(cleanWord)) {
712
+                        let lowerWord = cleanWord.toLowerCase();
713
+                        if (lowerWord=="i'm"){
714
+                            lowerWord="I'm";
715
+                        }
716
+                        words.add(lowerWord);
717
+                    //console.log('添加单词:', lowerWord);
718
+                    }
719
+            });
720
+        });
721
+        
722
+        //const result = Array.from(words).sort();
723
+        let result = Array.from(words);
724
+        //console.log('提取结果:', result);
725
+        //console.groupEnd();
726
+        return result;
727
+    },
610 728
 }