chengjie месяцев назад: 4
Родитель
Сommit
800867d40d
4 измененных файлов с 149 добавлено и 44 удалено
  1. 7 1
      src/api/yjbdc/yjbdcController.js
  2. 1 1
      src/model/yjbdc.js
  3. 70 42
      src/test/build.test.js
  4. 71 0
      src/util/stringClass.js

+ 7 - 1
src/api/yjbdc/yjbdcController.js

@@ -1300,7 +1300,13 @@ export async function GetWordChinese(ctx) {
1300 1300
         // 根据不同Level筛选结果
1301 1301
         if (level >= 0 && level <= 2) {
1302 1302
             // Level 0-2,返回数组单词第一条
1303
-            selectedResult = result[0];
1303
+            const filtered = result.filter(item => item.BookID >= 151);
1304
+            if (filtered.length > 0) {
1305
+                selectedResult = filtered[0];
1306
+            } else {
1307
+                // 如果没有符合条件的,返回BookID较小的第一条
1308
+                selectedResult = result[0];
1309
+            }
1304 1310
         } else if (level === 3) {
1305 1311
             // Level 3,优选返回BookID >= 169的
1306 1312
             const filtered = result.filter(item => item.BookID >= 169);

+ 1 - 1
src/model/yjbdc.js

@@ -154,7 +154,7 @@ class YJBDC {
154 154
     static async GetWordChinese(obj) {
155 155
         try {
156 156
             // 直接在数据库层面过滤出特定单词,获取包含BookID的数据
157
-            const sql = "SELECT Word, Translate, BookID FROM kylx365_db.Words w WHERE w.Word = ? AND ((w.BookID>=151 AND w.BookID<=153) OR (w.BookID>=169 AND w.BookID<=183)) ORDER BY w.BookID;";
157
+            const sql = "SELECT Word, Translate, BookID FROM kylx365_db.Words w WHERE w.Word = ? AND ((w.BookID>=111 AND w.BookID<=136) OR (w.BookID>=151 AND w.BookID<=153) OR (w.BookID>=169 AND w.BookID<=183)) ORDER BY w.BookID;";
158 158
             return await query(sql, [obj.Word]);
159 159
         } catch (error) {
160 160
             console.error('获取单词信息失败:', error);

+ 70 - 42
src/test/build.test.js

@@ -1,55 +1,35 @@
1 1
 import commonModel from '../model/commonModel.js';
2 2
 import fs from 'fs';
3
+import { stringUtils } from '../util/stringClass.js';
3 4
 
4 5
 async function runScript(){
5 6
     try {
6
-        //const sql2="update kylx365_db.HanziWord set HanziUnitID=0 where Name='"+item[j]+"'";
7
-        //await commonModel.RunSql(null,sql2
8
-        console.log("SET SQL_SAFE_UPDATES = 0;");
9
-        var data = fs.readFileSync('data.txt', 'utf8');
10
-        let arr=data.split(");")
11
-        var districtID=14;
12
-        var start=0;
13
-        var end=arr.length;
14
-        for(var i=start;i<end;i++){
15
-            var item=arr[i].split(",");
16
-            if (item[0]){
17
-                var item2=item[1];
18
-                item[0]=item[0].replace("(","");
19
-                item[0]=item[0].replace("\n","");
20
-                item[0]=item[0].replace("\r","");
21
-                for(let j=2;j<7;j++){
22
-                    if (!item[j])
23
-                        item[j]=null
7
+        
8
+        const sql="SELECT * FROM kylx365_db.Words;"
9
+        let list = await commonModel.RunSql(null,sql);
10
+        for(let i=0;i<list.length;i++){
11
+            let item=list[i];
12
+            //console.log(i+'/'+list.length);
13
+            //console.log(item.Translate);
14
+
15
+            if (item.Translate){
16
+                //let output=removeDuplicateDefinitions(item.Translate);
17
+                let output=item.Translate;
18
+                if (output.lastIndexOf(",")==output.length-1)
19
+                    output=output.substring(0,output.length-1);
20
+                //console.log(output);
21
+                if (output && item.Translate!=output){
22
+                    //console.log("input:"+item.Translate);
23
+                    //console.log("output:"+output);
24
+                    console.log("update Words set Translate='"+output+"' where ID="+item.ID+";");
25
+                    let sql="update Words set Translate='"+output+"' where ID="+item.ID+";";
26
+                    await commonModel.RunSql(null,sql);
24 27
                 }
25
-                
26
-                var sql="update MPS_Score set ScoreTotal="+item2+",Score1="+item[2]+",Score2="+item[3]+",Score3="+item[4]+",Score4="+item[5]+" where SchoolFullName="+item[0]+" and DistrictID="+districtID+" and ScoreYear=2025 and ScoreType='1-15志愿';";
27
-                console.log(sql);
28 28
             }
29 29
         }
30 30
         
31
-
32
-        // const sql="SELECT * FROM kylx365_db.HanziUnit where HanziBookID>=61 and HanziBookID<=72 order by HanziBookID,OrderID,ID;"
33
-        // let list = await commonModel.RunSql(null,sql
34
-        // for(let i=0;i<list.length;i++){
35
-        //     let item=list[i].Example;
36
-        //     for(let j=0;j<item.length;j++){
37
-        //         const sql3="SELECT * FROM kylx365_db.HanziWord where Name='"+item[j]+"' and HanziUnitID<500 order by HanziUnitID,ID limit 1;";
38
-        //         let list2=await commonModel.RunSql(null,sql3
39
-        //         for(let k=0;k<list2.length;k++){
40
-        //             const sql4="update kylx365_db.HanziWord set HanziUnitID="+list[i].ID+" where ID="+list2[k].ID+";";
41
-        //             console.log(sql4
42
-        //             await commonModel.RunSql(null,sql4
43
-        //         }
44
-        //     }
45
-            
46
-        //     //console.log(json
47
-        //     //console.log(item.length
48
-        // }
49
-        // const sql2="update kylx365_db.HanziWord set HanziUnitID=0 where HanziUnitID<500";
50
-        // await commonModel.RunSql(null,sql2);
51 31
         
52
-        //console.log("完成");
32
+        console.log("完成");
53 33
     } catch (error) {
54 34
         console.error('Error executing script:', error);
55 35
     }
@@ -95,3 +75,51 @@ async function runScript(){
95 75
 runScript().catch(error => {
96 76
     console.error('Error in runScript:', error);
97 77
 });
78
+
79
+function removeDuplicateDefinitions(input) {
80
+    // 分割词性和释义
81
+    const segments = input.split(/([a-z]+\.)/).filter(Boolean);
82
+    const definitions = {};
83
+    let currentType = null;
84
+    let originalOrder = [];
85
+
86
+    // 解析词性和释义
87
+    for (let i = 0; i < segments.length; i++) {
88
+        const segment = segments[i].trim();
89
+        if (segment.match(/^[a-z]+\.$/)) {
90
+            // 这是词性标记
91
+            currentType = segment;
92
+            if (!definitions[currentType]) {
93
+                definitions[currentType] = [];
94
+                originalOrder.push(currentType);
95
+            }
96
+        } else if (currentType) {
97
+            // 这是释义内容
98
+            const meanings = segment.split(/\s+/).filter(Boolean);
99
+            definitions[currentType].push(...meanings);
100
+        }
101
+    }
102
+
103
+    // 去重处理
104
+    const result = [];
105
+    for (const type of originalOrder) {
106
+        if (definitions[type]) {
107
+            // 使用Set去重并保留原始顺序
108
+            const uniqueMeanings = [];
109
+            const seen = new Set();
110
+            for (const meaning of definitions[type]) {
111
+                if (!seen.has(meaning)) {
112
+                    seen.add(meaning);
113
+                    uniqueMeanings.push(meaning);
114
+                }
115
+            }
116
+            result.push(`${type}${uniqueMeanings.join(' ')}`);
117
+        }
118
+    }
119
+
120
+    return result.join(' ');
121
+}
122
+
123
+
124
+//console.log(removeDuplicateDefinitions("adj.十分喜悦的 快乐的 adj.十分喜悦的 快乐的")); 
125
+//console.log(removeDuplicateDefinitions("vi.起立 升起 上涨 起身n.上升 增加 小山 斜坡 vi.起立 升起 上涨 起身n.上升 增加 小山 斜坡")); 

+ 71 - 0
src/util/stringClass.js

@@ -777,6 +777,17 @@ export const stringUtils = {
777 777
         // 处理过去式/过去分词 (-ed)
778 778
         if (lowerWord.endsWith('ed')) {
779 779
             possibleBaseWords.push(lowerWord.slice(0, -2)); // 常规情况 (walked -> walk)
780
+            
781
+            // 处理双辅音+ed的情况 (stepped -> step, hummed -> hum)
782
+            const doubleConsonantPattern = /([bcdfghjklmnpqrstvwxyz])\1ed$/;
783
+            if (doubleConsonantPattern.test(lowerWord)) {
784
+                possibleBaseWords.push(lowerWord.slice(0, -3)); // 如 stepped -> step
785
+            }
786
+            
787
+            // 处理以辅音+e结尾的动词变为ed的情况
788
+            if (/[bcdfghjklmnpqrstvwxyz]ed$/.test(lowerWord)) {
789
+                possibleBaseWords.push(lowerWord.slice(0, -2) + 'e'); // 如 liked -> like
790
+            }
780 791
         }
781 792
         
782 793
         // 处理以e结尾的动词加d的情况
@@ -787,20 +798,55 @@ export const stringUtils = {
787 798
         // 处理以辅音+y结尾变为ied的情况
788 799
         if (lowerWord.endsWith('ied')) {
789 800
             possibleBaseWords.push(lowerWord.slice(0, -3) + 'y'); // 如 tried -> try
801
+            // 处理一些不是由y变形而来的ied结尾单词
802
+            possibleBaseWords.push(lowerWord.slice(0, -1)); // 如 applied -> apply (虽然这个例子不准确,但为了覆盖更多情况)
790 803
         }
791 804
         
792 805
         // 处理现在分词 (-ing)
793 806
         if (lowerWord.endsWith('ing')) {
794 807
             possibleBaseWords.push(lowerWord.slice(0, -3)); // 常规情况 (walking -> walk)
795 808
             possibleBaseWords.push(lowerWord.slice(0, -3) + 'e'); // 以e结尾的动词 (making -> make)
809
+            
810
+            // 处理双辅音+ing的情况 (running -> run, swimming -> swim)
811
+            const doubleConsonantPattern = /([bcdfghjklmnpqrstvwxyz])\1ing$/;
812
+            if (doubleConsonantPattern.test(lowerWord)) {
813
+                possibleBaseWords.push(lowerWord.slice(0, -4)); // 如 running -> run
814
+            }
815
+            
816
+            // 处理特殊的ing形式
817
+            if (lowerWord.endsWith('ying')) {
818
+                possibleBaseWords.push(lowerWord.slice(0, -4) + 'ie'); // 如 lying -> lie
819
+            }
796 820
         }
797 821
         
798 822
         // 处理比较级/最高级
799 823
         if (lowerWord.endsWith('er')) {
800 824
             possibleBaseWords.push(lowerWord.slice(0, -2)); // 常规情况 (faster -> fast)
825
+            
826
+            // 处理双辅音+er的情况
827
+            const doubleConsonantPattern = /([bcdfghjklmnpqrstvwxyz])\1er$/;
828
+            if (doubleConsonantPattern.test(lowerWord)) {
829
+                possibleBaseWords.push(lowerWord.slice(0, -3)); // 如 bigger -> big
830
+            }
831
+            
832
+            // 处理以e结尾+r的情况
833
+            if (/[^aeiou]er$/.test(lowerWord)) {
834
+                possibleBaseWords.push(lowerWord.slice(0, -2) + 'e'); // 如 larger -> large
835
+            }
801 836
         }
802 837
         if (lowerWord.endsWith('est')) {
803 838
             possibleBaseWords.push(lowerWord.slice(0, -3)); // 常规情况 (fastest -> fast)
839
+            
840
+            // 处理双辅音+est的情况
841
+            const doubleConsonantPattern = /([bcdfghjklmnpqrstvwxyz])\1est$/;
842
+            if (doubleConsonantPattern.test(lowerWord)) {
843
+                possibleBaseWords.push(lowerWord.slice(0, -4)); // 如 biggest -> big
844
+            }
845
+            
846
+            // 处理以e结尾+st的情况
847
+            if (/[^aeiou]est$/.test(lowerWord)) {
848
+                possibleBaseWords.push(lowerWord.slice(0, -3) + 'e'); // 如 largest -> large
849
+            }
804 850
         }
805 851
         
806 852
         // 处理以辅音+y结尾变为ier/iest的情况
@@ -827,6 +873,17 @@ export const stringUtils = {
827 873
         }
828 874
         if (lowerWord.endsWith('es')) {
829 875
             possibleBaseWords.push(lowerWord.slice(0, -2)); // 常规情况 (boxes -> box)
876
+            
877
+            // 处理以ch, sh, ss, x, z结尾的名词复数形式
878
+            if (/(?:ch|sh|ss|x|z)es$/.test(lowerWord)) {
879
+                possibleBaseWords.push(lowerWord.slice(0, -2)); // 如 boxes -> box, dishes -> dish
880
+            }
881
+            
882
+            // 处理以o结尾的名词复数形式
883
+            if (lowerWord.endsWith('oes')) {
884
+                possibleBaseWords.push(lowerWord.slice(0, -2)); // 如 heroes -> hero
885
+                possibleBaseWords.push(lowerWord.slice(0, -1)); // 如 potatoes -> potato
886
+            }
830 887
         }
831 888
         
832 889
         // 处理以y结尾变为ies的情况
@@ -840,6 +897,20 @@ export const stringUtils = {
840 897
             possibleBaseWords.push(lowerWord.slice(0, -3) + 'f'); // 如 leaves -> leaf
841 898
         }
842 899
         
900
+        // 处理特殊的复数形式
901
+        if (lowerWord.endsWith('men')) {
902
+            possibleBaseWords.push(lowerWord.slice(0, -3) + 'man'); // 如 women -> woman, men -> man
903
+        }
904
+        if (lowerWord.endsWith('ice')) {
905
+            possibleBaseWords.push(lowerWord.slice(0, -3) + 'ouse'); // 如 mice -> mouse
906
+        }
907
+        if (lowerWord.endsWith('eet')) {
908
+            possibleBaseWords.push(lowerWord.slice(0, -3) + 'oot'); // 如 feet -> foot
909
+        }
910
+        if (lowerWord.endsWith('ildren')) {
911
+            possibleBaseWords.push(lowerWord.slice(0, -6) + 'ild'); // 如 children -> child
912
+        }
913
+        
843 914
         // 去重并过滤掉过短的单词
844 915
         const uniqueBaseWords = [...new Set(possibleBaseWords)].filter(w => w.length >= 2);
845 916