chengjie vor 6 Monaten
Ursprung
Commit
4fc141717e
93 geänderte Dateien mit 1275 neuen und 207 gelöschten Zeilen
  1. 12 5
      app.js
  2. 2 0
      app.json
  3. BIN
      pages/.DS_Store
  4. BIN
      pages/images/.DS_Store
  5. BIN
      pages/images/pic_h04.png
  6. BIN
      pages/images/pic_h05.png
  7. BIN
      pages/images/pic_h06.png
  8. BIN
      pages/images/pic_h07.png
  9. BIN
      pages/images/pic_h08.png
  10. BIN
      pages/images/pic_h09.png
  11. BIN
      pages/images/pic_h10.png
  12. BIN
      pages/images/pic_h11.png
  13. BIN
      pages/images/pic_h12.png
  14. BIN
      pages/images/pic_h13.png
  15. BIN
      pages/images/pic_h14.png
  16. BIN
      pages/images/pic_h15.png
  17. BIN
      pages/images/pic_ha02.png
  18. BIN
      pages/images/pic_ha04.png
  19. BIN
      pages/images/pic_ha05.png
  20. BIN
      pages/images/pic_hb01.png
  21. BIN
      pages/images/pic_hb02.png
  22. BIN
      pages/images/pic_hb03.png
  23. BIN
      pages/images/pic_hb04.png
  24. BIN
      pages/images/pic_hb05.png
  25. BIN
      pages/images/pic_hb06.png
  26. BIN
      pages/images/pic_hb07.png
  27. BIN
      pages/images/pic_hb08.png
  28. BIN
      pages/images/pic_hb09.png
  29. BIN
      pages/images/pic_hb10.png
  30. BIN
      pages/images/pic_hb11.png
  31. BIN
      pages/images/pic_hb12.png
  32. BIN
      pages/images/pic_hb13.png
  33. BIN
      pages/images/pic_hb14.png
  34. BIN
      pages/images/pic_hb15.png
  35. BIN
      pages/images/pic_hb16.png
  36. BIN
      pages/images/pic_hb17.png
  37. BIN
      pages/images/pic_hb18.png
  38. BIN
      pages/images/pic_hb19.png
  39. BIN
      pages/images/pic_hb20.png
  40. BIN
      pages/images/pic_hb21.png
  41. BIN
      pages/images/pic_hb22.png
  42. BIN
      pages/images/pic_hb23.png
  43. BIN
      pages/images/sysIcon_a18.png
  44. BIN
      pages/images/sysIcon_a19.png
  45. BIN
      pages/images/sysIcon_a20.png
  46. BIN
      pages/images/sysIcon_a21.png
  47. BIN
      pages/images/sysIcon_a22.png
  48. BIN
      pages/images/sysIcon_a23.png
  49. BIN
      pages/images/sysIcon_a24.png
  50. BIN
      pages/images/sysIcon_a25.png
  51. BIN
      pages/images/sysIcon_a26.png
  52. BIN
      pages/images/sysIcon_a27.png
  53. BIN
      pages/images/sysIcon_a28.png
  54. BIN
      pages/images/sysIcon_a29.png
  55. BIN
      pages/images/sysIcon_a30.png
  56. BIN
      pages/images/sysIcon_a31.png
  57. BIN
      pages/images/sysIcon_a32.png
  58. BIN
      pages/images/sysIcon_a33.png
  59. BIN
      pages/images/sysIcon_a34.png
  60. BIN
      pages/images/sysIcon_b20.png
  61. 13 3
      pages/index/index.js
  62. 64 64
      pages/main/article.js
  63. 11 16
      pages/main/article.wxml
  64. 15 18
      pages/main/article.wxss
  65. 94 0
      pages/main/articlecategory.js
  66. 8 0
      pages/main/articlecategory.json
  67. 14 0
      pages/main/articlecategory.wxml
  68. 72 0
      pages/main/articlecategory.wxss
  69. 68 0
      pages/main/articlefine.js
  70. 9 0
      pages/main/articlefine.json
  71. 72 0
      pages/main/articlefine.wxml
  72. 239 0
      pages/main/articlefine.wxss
  73. 96 0
      pages/main/help.js
  74. 15 3
      pages/main/help.wxml
  75. 14 0
      pages/main/help.wxss
  76. 62 5
      pages/main/index.js
  77. 19 4
      pages/main/index.wxml
  78. 61 20
      pages/main/index.wxss
  79. 40 9
      pages/main/myarticles.js
  80. 4 1
      pages/main/myarticles.wxml
  81. 14 1
      pages/main/myarticles.wxss
  82. 1 1
      pages/main/ocr.js
  83. 1 0
      pages/main/selectword.js
  84. 40 43
      pages/main/wordsinput.js
  85. 38 8
      pages/main/wordsinput.wxml
  86. 47 3
      pages/main/wordsinput.wxss
  87. 66 0
      pages/test/test.js
  88. 3 0
      pages/test/test.json
  89. 4 0
      pages/test/test.wxml
  90. 31 0
      pages/test/test.wxss
  91. 15 2
      project.private.config.json
  92. 4 1
      utils/main.js
  93. 7 0
      utils/util.js

+ 12 - 5
app.js

@@ -1,7 +1,7 @@
1 1
 // app.js
2 2
 App({
3 3
   globalData: {
4
-    Version: "1.0.7",
4
+    Version: "1.1.1",
5 5
     //IsProduction: true,
6 6
     ShareTitle: "阅读理解+答题",
7 7
     SharePath: "pages/index/index",
@@ -34,6 +34,7 @@ App({
34 34
     ocrReady: false,//
35 35
     Generating:false,//生成文章中
36 36
     GeneratingStart:false,//生成文章中已经开始
37
+    GenerateConfig:[],//生成文章的配置信息
37 38
   },
38 39
   onLaunch: function (options) {
39 40
     let that=this;
@@ -54,10 +55,16 @@ App({
54 55
       this.globalData.IsAndroid=false;
55 56
 
56 57
       if (this.globalData.systemInfo.model.indexOf("X") >= 0
57
-        || this.globalData.systemInfo.model.indexOf("11") >= 0
58
-        || this.globalData.systemInfo.model.indexOf("12") >= 0
59
-        || this.globalData.systemInfo.model.indexOf("13") >= 0 
60
-        || this.globalData.systemInfo.model.indexOf("14") >= 0)
58
+      || this.globalData.systemInfo.model.indexOf("11") >= 0
59
+      || this.globalData.systemInfo.model.indexOf("12") >= 0
60
+      || this.globalData.systemInfo.model.indexOf("13") >= 0 
61
+      || this.globalData.systemInfo.model.indexOf("14") >= 0 
62
+      || this.globalData.systemInfo.model.indexOf("15") >= 0 
63
+      || this.globalData.systemInfo.model.indexOf("16") >= 0
64
+      || this.globalData.systemInfo.model.indexOf("17") >= 0
65
+      || this.globalData.systemInfo.model.indexOf("18") >= 0
66
+      || this.globalData.systemInfo.model.indexOf("19") >= 0 
67
+      || this.globalData.systemInfo.model.indexOf("20") >= 0)
61 68
         this.globalData.IsIPhoneX=true;
62 69
     }
63 70
 

+ 2 - 0
app.json

@@ -9,6 +9,8 @@
9 9
     "pages/main/ocr",
10 10
     "pages/main/selectword",
11 11
     "pages/main/feedbackinfo",
12
+    "pages/main/articlefine",
13
+    "pages/main/articlecategory",
12 14
     "pages/main/wordsinput"
13 15
   ],
14 16
   "window": {

BIN
pages/.DS_Store


BIN
pages/images/.DS_Store


BIN
pages/images/pic_h04.png


BIN
pages/images/pic_h05.png


BIN
pages/images/pic_h06.png


BIN
pages/images/pic_h07.png


BIN
pages/images/pic_h08.png


BIN
pages/images/pic_h09.png


BIN
pages/images/pic_h10.png


BIN
pages/images/pic_h11.png


BIN
pages/images/pic_h12.png


BIN
pages/images/pic_h13.png


BIN
pages/images/pic_h14.png


BIN
pages/images/pic_h15.png


BIN
pages/images/pic_ha02.png


BIN
pages/images/pic_ha04.png


BIN
pages/images/pic_ha05.png


BIN
pages/images/pic_hb01.png


BIN
pages/images/pic_hb02.png


BIN
pages/images/pic_hb03.png


BIN
pages/images/pic_hb04.png


BIN
pages/images/pic_hb05.png


BIN
pages/images/pic_hb06.png


BIN
pages/images/pic_hb07.png


BIN
pages/images/pic_hb08.png


BIN
pages/images/pic_hb09.png


BIN
pages/images/pic_hb10.png


BIN
pages/images/pic_hb11.png


BIN
pages/images/pic_hb12.png


BIN
pages/images/pic_hb13.png


BIN
pages/images/pic_hb14.png


BIN
pages/images/pic_hb15.png


BIN
pages/images/pic_hb16.png


BIN
pages/images/pic_hb17.png


BIN
pages/images/pic_hb18.png


BIN
pages/images/pic_hb19.png


BIN
pages/images/pic_hb20.png


BIN
pages/images/pic_hb21.png


BIN
pages/images/pic_hb22.png


BIN
pages/images/pic_hb23.png


BIN
pages/images/sysIcon_a18.png


BIN
pages/images/sysIcon_a19.png


BIN
pages/images/sysIcon_a20.png


BIN
pages/images/sysIcon_a21.png


BIN
pages/images/sysIcon_a22.png


BIN
pages/images/sysIcon_a23.png


BIN
pages/images/sysIcon_a24.png


BIN
pages/images/sysIcon_a25.png


BIN
pages/images/sysIcon_a26.png


BIN
pages/images/sysIcon_a27.png


BIN
pages/images/sysIcon_a28.png


BIN
pages/images/sysIcon_a29.png


BIN
pages/images/sysIcon_a30.png


BIN
pages/images/sysIcon_a31.png


BIN
pages/images/sysIcon_a32.png


BIN
pages/images/sysIcon_a33.png


BIN
pages/images/sysIcon_a34.png


BIN
pages/images/sysIcon_b20.png


+ 13 - 3
pages/index/index.js

@@ -8,6 +8,8 @@ Page({
8 8
   },
9 9
   onLoad: function (options) {
10 10
     let that = this;
11
+    app.globalData.SelectedWords=[];
12
+    app.globalData.OCRWords=[];
11 13
     if (options) {
12 14
       if (options.UserID) {
13 15
         console.log("UserID:" + options.UserID);
@@ -16,6 +18,13 @@ Page({
16 18
       if (options.goto) {
17 19
         console.log("goto:" + options.goto);
18 20
         app.globalData.goto = options.goto;
21
+        if (options.ID)
22
+          app.globalData.goto+="?ID="+options.ID;
23
+        //debugger;
24
+        if (options.Words && options.goto=="selectword"){
25
+          app.globalData.goto="wordsinput?goto="+options.goto;
26
+          app.globalData.OCRWords=options.Words.split(",");
27
+        }
19 28
       }
20 29
       if (options.SourceID) {
21 30
         console.log("SourceID:" + options.SourceID);
@@ -42,8 +51,7 @@ Page({
42 51
     that.setData({
43 52
       Containnerheight: main.getWindowHeight(),
44 53
     });
45
-    app.globalData.SelectedWords=[];
46
-    app.globalData.OCRWords=[];
54
+    
47 55
     this.getUserInfo();
48 56
   },
49 57
   //得到用户信息
@@ -69,7 +77,8 @@ Page({
69 77
 
70 78
   login: function (param) {
71 79
     let that = this;
72
-
80
+    console.log("app.globalData.systemInfo.screenHeight:" + app.globalData.systemInfo.screenHeight);
81
+    console.log("app.globalData.systemInfo.windowHeight:" + app.globalData.systemInfo.windowHeight);
73 82
     main.getLocalHost(function () {
74 83
       main.postData('YJBDCLogin', {
75 84
         Code: param.Code,
@@ -109,6 +118,7 @@ Page({
109 118
             wx.redirectTo({
110 119
               url: '../main/index'
111 120
             })
121
+
112 122
           //}, 2000);
113 123
         }
114 124
       });

+ 64 - 64
pages/main/article.js

@@ -94,6 +94,9 @@ Page({
94 94
     // that.getChoicenessArticle();
95 95
 
96 96
     main.checkGenerating();
97
+
98
+
99
+    this.audioCtx = wx.createAudioContext('myAudio');
97 100
   },
98 101
   onShow:function(){
99 102
     main.getPageInfo();
@@ -131,7 +134,8 @@ Page({
131 134
     },1200);
132 135
 
133 136
     that.setData({
134
-      IsBuilding:true
137
+      IsBuilding:true,
138
+      IsNew:true,
135 139
     });
136 140
     app.globalData.Generating=true;
137 141
     let words=app.globalData.SelectedWords.join(",");
@@ -155,9 +159,9 @@ Page({
155 159
           that.setData({
156 160
             IsBuilding:false,
157 161
             ID:data.ID,
162
+            IsNew:data.IsNew,
158 163
           });
159 164
         }
160
-        
161 165
         clearInterval(interval);
162 166
       }
163 167
     });
@@ -171,7 +175,7 @@ Page({
171 175
   //得到精选文章
172 176
   getChoicenessArticle:function(){
173 177
     let that=this;
174
-    main.getData('GetYJBDCArticleList?IsChoiceness=1', function (data) {
178
+    main.getData('GetYJBDCArticleList?IsFine=1', function (data) {
175 179
       if (data) {
176 180
         that.setData({
177 181
           ChoicenessList:data,
@@ -203,74 +207,45 @@ Page({
203 207
     
204 208
     for(let i=0; i<content.ArticleEnglish.length; i++){
205 209
       // 确保每个句子末尾有空格,避免和下一句紧挨着
206
-      const sentence = content.ArticleEnglish[i] + " ";
207
-      // 按长度从长到短排序单词,确保先匹配较长的词组
208
-      const sortedWords = [...content.FormsOfWords].sort((a, b) => b.length - a.length);
210
+      let sentence = content.ArticleEnglish[i] + " ";
211
+      // 替换所有单引号为双引号,包括对话中的单引号
212
+      sentence = sentence.replace(/(^|[,.]\s+)'([^']+)'/g, '$1"$2"');
209 213
       
210
-      // 创建一个句子的分段数组
211
-      let segments = [{
212
-        Sentence: sentence,
213
-        CSS: ""
214
-      }];
214
+      // 将句子按空格分割成单词数组
215
+      let words = sentence.trim().split(/\s+/);
216
+      let wordObjects = [];
215 217
       
216
-      // 对每个单词进行处理
217
-      for(let j=0; j<sortedWords.length; j++){
218
-        const word = sortedWords[j];
219
-        // 创建一个新的分段数组,用于存储处理后的结果
220
-        let newSegments = [];
218
+      // 处理每个单词,检查是否需要高亮
219
+      for(let j=0; j<words.length; j++){
220
+        let word = words[j];
221
+        let originalWord = word.replace(/[.,!?;:"'()—\-–—_]/g, ''); // 去除标点符号和特殊字符(包括各种破折号)
222
+        let isHighlighted = false;
221 223
         
222
-        // 处理每个现有分段
223
-        for(let k=0; k<segments.length; k++){
224
-          const segment = segments[k];
225
-          
226
-          // 如果当前分段已经被标记为高亮,则不再处理
227
-          if(segment.CSS !== ""){
228
-            newSegments.push(segment);
229
-            continue;
230
-          }
231
-          
232
-          const text = segment.Sentence;
233
-          // 使用正则表达式查找单词边界
234
-          const regex = new RegExp(`\\b${word}\\b`, 'gi');
235
-          let lastIndex = 0;
236
-          let match;
237
-          
238
-          // 查找所有匹配项
239
-          while((match = regex.exec(text)) !== null){
240
-            // 添加匹配前的文本
241
-            if(match.index > lastIndex){
242
-              newSegments.push({
243
-                Sentence: text.substring(lastIndex, match.index),
244
-                CSS: ""
245
-              });
246
-            }
247
-            
248
-            // 添加匹配的单词(高亮)
249
-            newSegments.push({
250
-              Sentence: match[0],
251
-              CSS: hl
252
-            });
253
-            
254
-            lastIndex = match.index + match[0].length;
255
-          }
256
-          
257
-          // 添加最后一个匹配后的文本
258
-          if(lastIndex < text.length){
259
-            newSegments.push({
260
-              Sentence: text.substring(lastIndex),
261
-              CSS: ""
262
-            });
224
+        // 检查单词是否在需要高亮的列表中
225
+        for(let k=0; k<content.FormsOfWords.length; k++){
226
+          if(originalWord.toLowerCase() === content.FormsOfWords[k].toLowerCase()){
227
+            isHighlighted = true;
228
+            break;
263 229
           }
264 230
         }
265
-        // 更新分段数组
266
-        segments = newSegments;
231
+        
232
+        // 添加单词对象到数组
233
+        wordObjects.push({
234
+          Sentence: word,
235
+          CSS: isHighlighted ? hl : "",
236
+          OriginalWord: originalWord
237
+        });
267 238
       }
268
-      // 将分段数组添加到ArticleEnglishArr
269
-      content.ArticleEnglishArr.push(segments);
239
+      
240
+      // 将单词数组添加到ArticleEnglishArr
241
+      content.ArticleEnglishArr.push(wordObjects);
270 242
     }
271 243
 
272 244
     for(let i=0;i<content.Question.length;i++){
245
+      console.log("i:"+i);
273 246
       for(let j=0;j<content.Question[i].OptionsEnglish.length;j++){
247
+
248
+        content.Question[i].OptionsEnglish[j] = content.Question[i].OptionsEnglish[j].replace(/(^|[,.]\s+)'([^']+)'/g, '$1"$2"');
274 249
         if (j<4){//选项不能超过4个
275 250
           let str=content.Question[i].OptionsChinese[j];
276 251
           content.Question[i].OptionsChinese[j]=str.substr(2);
@@ -474,7 +449,8 @@ Page({
474 449
   },
475 450
   // 处理导航栏返回按钮点击事件
476 451
   onUnload: function() {
477
-    if (!this.data.ID || this.data.OpenType=="Guide"){
452
+    if (this.data.IsNew || this.data.OpenType=="Guide"){
453
+      wx.removeStorageSync('IsShowGuideContainer');
478 454
       app.globalData.SelectedWords=[];
479 455
       wx.navigateBack({
480 456
         delta: 1,
@@ -510,6 +486,31 @@ Page({
510 486
       showAnimation: 'remind-slide-up'
511 487
     });
512 488
   },
489
+  selectWord:function(e){
490
+    let that=this;
491
+    let css=e.currentTarget.dataset.css;
492
+    let word=e.currentTarget.dataset.word;
493
+    let originalWord=e.currentTarget.dataset.originalWord || word;
494
+    
495
+    console.log("点击的单词:", originalWord);
496
+    that.playAudio(originalWord);
497
+    
498
+    if (css){
499
+      let list=that.data.Content.FormsOfWords;
500
+      for(let i=0;i<list.length;i++){
501
+        if(list[i].toLowerCase() == originalWord.toLowerCase()){
502
+          console.log(that.data.Content.FormsOfWordsChinese[i]);
503
+        }
504
+      }
505
+    }
506
+  },
507
+  playAudio: function (word) {
508
+    var url = app.globalData.audioUrlBaidu;
509
+    url = url.replace("[token]", app.globalData.BaiduToken);
510
+    url = url.replace("[word]", word);
511
+    this.audioCtx.setSrc(url);
512
+    this.audioCtx.play();
513
+  },
513 514
   showRemind:function(e){
514 515
     animation.toggleRemindWithAnimation(this, {
515 516
       showAnimation: 'remind-slide-down'
@@ -526,8 +527,7 @@ Page({
526 527
   onShareAppMessage: function () {
527 528
     return {
528 529
       title: app.globalData.ShareTitle,
529
-      path: app.globalData.SharePath + '?UserID=' + app.globalData.userInfo.UserID,
530
-      imageUrl: app.globalData.ShareImage,
530
+      path: app.globalData.SharePath + '?goto=article&ID='+this.data.ID+'&UserID=' + app.globalData.userInfo.UserID,
531 531
     }
532 532
   },
533 533
 })

+ 11 - 16
pages/main/article.wxml

@@ -6,14 +6,13 @@
6 6
     <!-- 完整文章 -->
7 7
     <text class="textArticle" wx:if="{{!IsShowTranslate}}" >
8 8
       <text bindlongpress="onLongPress" data-strtype="article" data-index="{{index}}" wx:for="{{Content.ArticleEnglishArr}}" wx:key="index" >
9
-        <text class="{{itemChild.CSS}}" wx:for="{{item}}" wx:key="index2" wx:for-item="itemChild" wx:for-index="indexChild">{{itemChild.Sentence}}</text>
9
+        <text class="{{itemChild.CSS}}" wx:for="{{item}}" wx:key="index2" wx:for-item="itemChild" wx:for-index="indexChild" bind:tap="selectWord" data-word="{{itemChild.Sentence}}" data-original-word="{{itemChild.OriginalWord}}" data-css="{{itemChild.CSS}}">{{itemChild.Sentence}} </text>
10 10
       </text>
11 11
     </text>
12 12
     <!-- 有翻译文章 -->
13 13
     <view class="textArticle FlexColumn" wx:if="{{IsShowTranslate}}">
14 14
       <view wx:for="{{Content.ArticleEnglishArr}}" wx:key="index" class="textArticle">
15
-        <!-- <rich-text class="textArticle" nodes="{{item}}"></rich-text> -->
16
-        <text  class="{{itemChild.CSS}}" wx:for="{{item}}" wx:key="index2" wx:for-item="itemChild" wx:for-index="indexChild">{{itemChild.Sentence}}</text>
15
+        <text class="{{itemChild.CSS}}" wx:for="{{item}}" wx:key="index2" wx:for-item="itemChild" wx:for-index="indexChild" bind:tap="selectWord" data-word="{{itemChild.Sentence}}" data-original-word="{{itemChild.OriginalWord}}" data-css="{{itemChild.CSS}}">{{itemChild.Sentence}} </text>
17 16
         <view class="textArticleTranslate">{{Content.ArticleChinese[index]}}</view>
18 17
         <view class="panelLine" wx:if="{{index<Content.ArticleEnglish.length-1}}"></view>
19 18
       </view>
@@ -161,21 +160,17 @@
161 160
     <image src="../images/sysIcon_b08.gif" class="sysIcon_b08"></image>
162 161
     <view class="panelBuilding11 FlexColumn">
163 162
       <text class="text08" wx:if="{{CountDown>0}}">生成中…{{CountDown}}秒</text>
164
-      <text class="text08" wx:if="{{CountDown==0 && AIVersion=='1.0'}}">生成中…差一点,就快好了</text>
165
-      <text class="text08" wx:if="{{CountDown==0 && AIVersion=='1.5'}}">再等一等,就差一点点了</text>
166
-      <text class="text09">用1.0生成文章平均30秒,用1.5平均60秒,\n这是由于1.5的单词水平更高、思考更为深入。</text>
163
+      <text class="text08" wx:if="{{CountDown==0}}">生成中…差一点,就快好了</text>
164
+      <text class="text09">生成后会通知您,等待时可看看下面这些范文</text>
167 165
     </view>
168 166
     <view class="panelBuilding12 FlexColumn">
169
-      <text class="text10">生成后会通知您,等待时可看看这些范文:</text>
170
-      <view class="panelBuilding121 FlexRow">
171
-        <view class="panelBuilding1211 FlexRow" wx:for="{{ChoicenessList}}" wx:key="index" catch:tap="goto" data-url="./article?ID={{item.ID}}">
172
-          <image src="../images/sysIcon_a17.png" class="sysIcon_a17"></image>
173
-          <view class="panelBuilding12111 FlexColumn">
174
-            <view class="panelBuilding1211text">{{item.ArticleTitle}}</view>
175
-            <view class="panelBuilding1211text2">{{item.LevelStr}} {{item.ArticleStyle}}</view>
176
-          </view>
177
-        </view>
167
+      <view class="panelBuilding121 FlexRow" wx:for="{{ChoicenessList}}" wx:key="index" catch:tap="goto" data-url="./article?ID={{item.ID}}" wx:if="{{item.IsRecommend}}">
168
+        <image src="../images/sysIcon_a17.png" class="sysIcon_a17"></image>
169
+        <view class="panelBuilding121text">{{item.ArticleTitle}}</view>
178 170
       </view>
171
+      <view class="panelBuilding121 panelBuilding122 FlexColumn" catch:tap="goto" data-url="articlefine">更多精选</view>
179 172
     </view>
180 173
   </view>
181
-</view>
174
+</view>
175
+
176
+<audio hidden='true' src="{{AudioSrc}}" id="myAudio"></audio>

+ 15 - 18
pages/main/article.wxss

@@ -712,33 +712,30 @@ pages .LightColor{
712 712
 }
713 713
 
714 714
 .panelBuilding121{
715
-  flex-wrap: wrap;
716
-  margin-top: 30rpx;
715
+  width:650rpx;
716
+  height: 70rpx;
717
+  background: rgba(0,0,0,0.25);
718
+  border-radius: 35rpx;
719
+  margin: 0 0 20rpx 0;
720
+}
721
+.panelBuilding122{
722
+  width:252rpx;
723
+  height: 70rpx;
724
+  font-size: 28rpx;
725
+  font-weight: 400;
717 726
 }
718 727
 
719
-.panelBuilding1211{
720
-  width: 300rpx;
721
-  min-height: 140rpx;
722
-  margin: 0 25rpx 20rpx 25rpx;
723
-  align-items: flex-start;
724
-}
725 728
 .sysIcon_a17{
726 729
   width:30rpx;
727 730
   height:30rpx;
728 731
   margin: 5rpx 20rpx 0 0;
729 732
 }
730
-.panelBuilding12111{
731
-  align-items: flex-start;
732
-}
733
-.panelBuilding1211text{
734
-  width:250rpx;
733
+.panelBuilding121text{
734
+  width:550rpx;
735 735
   font-size: 28rpx;
736 736
   font-weight: 400;
737
-}
738
-.panelBuilding1211text2{
739
-  font-size: 24rpx;
740
-  font-weight: 400;
741
-  margin-top: 10rpx;
737
+  overflow: hidden;
738
+  white-space: nowrap;
742 739
 }
743 740
 
744 741
 .panelGuideContainer .pic_ha07{

+ 94 - 0
pages/main/articlecategory.js

@@ -0,0 +1,94 @@
1
+import common from '../../utils/util';
2
+import main from '../../utils/main';
3
+
4
+const app = getApp();
5
+
6
+Page({
7
+  data: {
8
+    ImageUrl:app.globalData.uploadImageUrl,
9
+  },
10
+  onLoad: function (options) {
11
+    let that = this;
12
+    that.setData({
13
+      Containnerheight: main.getWindowHeight(),
14
+    });
15
+    
16
+    wx.setNavigationBarTitle({
17
+      title: options.title,
18
+    });
19
+
20
+    that.init(options);
21
+
22
+    main.checkGenerating();
23
+  },
24
+  init:function(options){
25
+    let that = this;
26
+    let list=wx.getStorageSync('ChoicenessList');
27
+    let arr=[];
28
+    let levelArr=[];
29
+    for(let i=0;i<list.length;i++){
30
+      if ((options.level && options.level.indexOf(list[i].LevelStr)>=0) 
31
+      || (options.articlestyle && options.articlestyle==list[i].ArticleStyle)){
32
+        list[i].Words=list[i].Words.split(",").join("   ");
33
+        list[i].IsShow=1;
34
+        arr.push(list[i]);
35
+        let b=false;
36
+        //debugger;
37
+        for(let j=0;j<levelArr.length;j++){
38
+          if (levelArr[j].Name==list[i].LevelStr){
39
+            b=true;
40
+            break;
41
+          }
42
+        }
43
+        if (!b){
44
+          let obj={};
45
+          obj.Name=list[i].LevelStr;
46
+          obj.CSS="";
47
+          levelArr.push(obj);
48
+        }
49
+      }
50
+    }
51
+    levelArr=common.sort(levelArr,"ASC","Name","String");
52
+    levelArr.unshift({Name:"LATEST",CSS:"Selected",CSS2:"btn0"});
53
+    //debugger;
54
+    that.setData({
55
+      List:arr,
56
+      Level:levelArr,
57
+    });
58
+  },
59
+  filter:function(e){
60
+    let that = this;
61
+    let level=e.currentTarget.dataset.name;
62
+    let list=that.data.List;
63
+    for(let i=0;i<list.length;i++){
64
+      list[i].IsShow=0;
65
+      if (level==list[i].LevelStr || level=="LATEST"){
66
+        list[i].IsShow=1;
67
+      }
68
+    }
69
+    let list2=that.data.Level;
70
+    for(let i=0;i<list2.length;i++){
71
+      list2[i].CSS="";
72
+      if (level==list2[i].Name){
73
+        list2[i].CSS="Selected";
74
+      }
75
+    }
76
+    that.setData({
77
+      List:list,
78
+      Level:list2,
79
+    });
80
+  },
81
+  goto: function (e) {
82
+    let that=this;
83
+    var url=e.currentTarget.dataset.url;
84
+    wx.navigateTo({
85
+      url: url,
86
+    });
87
+  },
88
+  onShareAppMessage: function () {
89
+    return {
90
+      title: app.globalData.ShareTitle,
91
+      path: app.globalData.SharePath + '?goto=articlefine&UserID=' + app.globalData.userInfo.UserID,
92
+    }
93
+  },
94
+})

+ 8 - 0
pages/main/articlecategory.json

@@ -0,0 +1,8 @@
1
+{
2
+  "backgroundColor": "#DAD2C1",
3
+  "navigationBarBackgroundColor": "#DAD2C1",
4
+  "navigationBarTextStyle": "black",
5
+  "backgroundColorTop":"#DAD2C1",
6
+  "backgroundColorBottom":"#DAD2C1",
7
+  "usingComponents": {}
8
+}

+ 14 - 0
pages/main/articlecategory.wxml

@@ -0,0 +1,14 @@
1
+<view class="container FlexColumn" style='min-height:{{Containnerheight}}rpx;'>
2
+  <view class="panel1 FlexRow">
3
+    <view class="btn btn{{item.CSS}} {{item.CSS2}} FlexRow" wx:for="{{Level}}" bind:tap="filter" data-name="{{item.Name}}">{{item.Name}}</view>
4
+  </view>
5
+  <view class="panel2 FlexColumn"  wx:key="index" wx:for="{{List}}" wx:if="{{item.IsShow}}" bind:tap="goto" data-url="article?ID={{item.ID}}">
6
+    <image mode="aspectFill" lazy-load="true" src="{{ImageUrl}}web/_yjbdc/{{item.ArticleImage}}" class="img"></image>
7
+    <view class="text01">{{item.ArticleTitle}}</view>
8
+    <view class="text02">{{item.LevelStr}} {{item.ArticleStyle}}</view>
9
+    <view class="text03">{{item.ArticleTitleCHN}}</view>
10
+    <view class="text04">单词来源:{{item.WordSource}}</view>
11
+    <view class="text05">{{item.Words}}</view>
12
+  </view>
13
+  <view style="height:100rpx"></view>
14
+</view>

+ 72 - 0
pages/main/articlecategory.wxss

@@ -0,0 +1,72 @@
1
+.container{
2
+  background-color: #DAD2C1;
3
+  color:#2E2E2E;
4
+}
5
+.panel1{
6
+  width: 100%;
7
+  height:98rpx;
8
+  justify-content: flex-start;
9
+}
10
+
11
+.btn{
12
+  height: 58rpx;
13
+  background: #3A3535;
14
+  border-radius: 20rpx;
15
+  padding: 0 20rpx;
16
+  color:#F0F0F0;
17
+  font-size: 24rpx;
18
+  margin-right: 10rpx;
19
+  border: 5rpx solid #3A3535;
20
+}
21
+.btn0{
22
+  margin-left: 30rpx;
23
+}
24
+.btnSelected{
25
+  background: #DAD2C1;
26
+  border: 5rpx solid #3A3535;
27
+  color:#3A3535;
28
+}
29
+
30
+.panel2{
31
+  margin-top: 30rpx;
32
+  width: 690rpx;
33
+  min-height:549rpx;
34
+  background-color: #F0EDE6;
35
+  border-radius: 20rpx;
36
+  justify-content: flex-start;
37
+  align-items: flex-start;
38
+}
39
+
40
+.img{
41
+  width: 100%;
42
+  height:240rpx;
43
+  border-radius: 20rpx 20rpx 0 0;
44
+}
45
+
46
+.text01{
47
+  width: 630rpx;
48
+  margin: 30rpx 0 0 30rpx;
49
+  font-size: 36rpx;
50
+}
51
+.text02{
52
+  margin: 30rpx 0 0 30rpx;
53
+  font-size: 24rpx;
54
+  font-weight: 400;
55
+}
56
+.text03{
57
+  margin: 0 0 0 30rpx;
58
+  font-size: 28rpx;
59
+  font-weight: 400;
60
+}
61
+.text04{
62
+  width: 630rpx;
63
+  margin: 20rpx 0 0 30rpx;
64
+  font-size: 24rpx;
65
+  font-weight: 400;
66
+}
67
+.text05{
68
+  width: 630rpx;
69
+  margin: 0 0 40rpx 30rpx;
70
+  font-size: 24rpx;
71
+  font-weight: 400;
72
+}

+ 68 - 0
pages/main/articlefine.js

@@ -0,0 +1,68 @@
1
+import common from '../../utils/util';
2
+import main from '../../utils/main';
3
+
4
+const app = getApp();
5
+
6
+Page({
7
+  data: {
8
+    ImageUrl:app.globalData.uploadImageUrl,
9
+    IsIPhoneX:app.globalData.IsIPhoneX,
10
+    GradeArr:[
11
+      {Image:"19",Name:"A1 A2",Name2:"小学",BColor:"#EDBF87"},
12
+      {Image:"20",Name:"A2 B1",Name2:"初中",BColor:"#F2ED83"},
13
+      {Image:"21",Name:"B1 B2",Name2:"高中",BColor:"#84D082"},
14
+      {Image:"22",Name:"B2 C1",Name2:"大学",BColor:"#90C0E2"},
15
+    ]
16
+  },
17
+  onLoad: function (options) {
18
+    let that = this;
19
+    
20
+    let ArticleStyleArr=app.globalData.GenerateConfig.ArticleStyle;
21
+    ArticleStyleArr=common.sort(ArticleStyleArr,"ASC","ID","Number");
22
+    that.setData({
23
+      Containnerheight: main.getWindowHeight(),
24
+      ArticleStyleArr:ArticleStyleArr,
25
+    });
26
+    that.getChoicenessArticle();
27
+    main.checkGenerating();
28
+  },
29
+  goto: function (e) {
30
+    let that=this;
31
+    var url=e.currentTarget.dataset.url;
32
+
33
+    if (url=="index"){
34
+      wx.reLaunch({
35
+        url: url,
36
+      });
37
+    }
38
+    else if (url=="guide"){
39
+      wx.setStorageSync('IsShowGuideContainer', true);
40
+      wx.reLaunch({
41
+        url: "index",
42
+      });
43
+    }
44
+    else{
45
+      wx.navigateTo({
46
+        url: url,
47
+      });
48
+    }
49
+  },
50
+  //得到精选文章
51
+  getChoicenessArticle:function(){
52
+    let that=this;
53
+    main.getData('GetYJBDCArticleList?IsFine=1', function (data) {
54
+      if (data) {
55
+        that.setData({
56
+          ChoicenessList:data,
57
+        });
58
+        wx.setStorageSync('ChoicenessList', data);
59
+      }
60
+    });
61
+  },
62
+  onShareAppMessage: function () {
63
+    return {
64
+      title: app.globalData.ShareTitle,
65
+      path: app.globalData.SharePath + '?goto=articlefine&UserID=' + app.globalData.userInfo.UserID,
66
+    }
67
+  },
68
+})

+ 9 - 0
pages/main/articlefine.json

@@ -0,0 +1,9 @@
1
+{
2
+  "navigationBarTitleText":"精选",
3
+  "backgroundColor": "#DAD2C1",
4
+  "navigationBarBackgroundColor": "#DAD2C1",
5
+  "navigationBarTextStyle": "black",
6
+  "backgroundColorTop":"#DAD2C1",
7
+  "backgroundColorBottom":"#DAD2C1",
8
+  "usingComponents": {}
9
+}

+ 72 - 0
pages/main/articlefine.wxml

@@ -0,0 +1,72 @@
1
+<view class="container FlexColumn" style='min-height:{{Containnerheight}}rpx;'>
2
+  <view class="panel1 FlexColumn">
3
+    <swiper class="swiper" autoplay="true" indicator-dots="true"  >
4
+      <swiper-item class="panel1Item" wx:for="{{ChoicenessList}}" wx:key="index" data-index="{{index}}" wx:if="{{item.IsRecommend}}" bind:tap="goto" data-url="article?ID={{item.ID}}">
5
+        <image mode="aspectFill" src="{{ImageUrl}}web/_yjbdc/{{item.ArticleImage}}" class="img"></image>
6
+        <view class="panel1Item1 FlexColumn">
7
+          <view class="panel1Item11 FlexColumn">
8
+            <view class="text1">{{item.LevelStr}} {{item.ArticleStyle}}</view>
9
+            <view class="text2">{{item.ArticleTitleCHN}}</view>
10
+            <view class="text3">{{item.ArticleTitle}}</view>
11
+          </view>
12
+        </view>
13
+      </swiper-item>
14
+    </swiper>
15
+  </view>
16
+  
17
+
18
+  <view class="panelTitle">CEFR</view>
19
+  <view class="panel2 FlexColumn">
20
+    <view class="panel21 FlexRow">
21
+      <view class="panel211 FlexColumn" wx:for="{{GradeArr}}" wx:key="index" style="background-color: {{item.BColor}};" bind:tap="goto" data-url="articlecategory?title={{item.Name2}}&level={{item.Name}}">
22
+        <image src="../images/sysIcon_a{{item.Image}}.png" class="sysIcon_a19"></image>
23
+        <view class="text4">{{item.Name}}</view>
24
+        <view class="text5">{{item.Name2}}</view>
25
+      </view>
26
+    </view>
27
+  </view>
28
+  <view class="panelTitle">LATEST STORIES</view>
29
+  <view class="panel3 FlexColumn">
30
+    <view class="panel3Item FlexRow" wx:for="{{ChoicenessList}}" wx:key="index" wx:if="{{index<4}}" bind:tap="goto" data-url="article?ID={{item.ID}}">
31
+      <view class="panel3ItemLeft FlexColumn">
32
+        <view class="text6">{{item.ArticleTitle}}</view>
33
+        <view>{{item.LevelStr}} {{item.ArticleStyle}}</view>
34
+        <view  class="text7">{{item.ArticleTitleCHN}}</view>
35
+      </view>
36
+      <image mode="aspectFill" src="{{ImageUrl}}web/_yjbdc/{{item.ArticleImage}}" class="img2"></image>
37
+    </view>
38
+    <view class="panel3Item panel3Item0 FlexRow" bind:tap="goto" data-url="guide">
39
+      <view class="panel3ItemLeft FlexColumn">
40
+        <text class="text8">卡在单词输入?\n新手引导带您体验</text>
41
+        <view>New User Guide</view>
42
+      </view>
43
+      <image src="../images/sysIcon_b20.png" class="sysIcon_b20"></image>
44
+    </view>
45
+  </view>
46
+
47
+  <view class="panelTitle">EXPLORE BY TOPIC</view>
48
+  <view class="panel4 FlexRow">
49
+    <view style="width: 100%;height:20rpx"></view>
50
+    <view class="panel4Item FlexColumn" wx:for="{{ArticleStyleArr}}" wx:key="index" bind:tap="goto" data-url="articlecategory?title={{item.Name}}&articlestyle={{item.Name}}">
51
+      <view class="panel4Item1 FlexColumn">
52
+        <image src="../images/sysIcon_a{{22+item.ID}}.png" class="sysIcon_a23"></image>
53
+      </view>
54
+      <view class="text9">{{item.Name}}</view>
55
+      <view class="text10">{{item.Eng}}</view>
56
+    </view>
57
+  </view>
58
+
59
+  <view class="panelFooter FlexColumn">
60
+    <view class="panelFooter1 FlexRow">
61
+      <view class="panelFooterBtn FlexColumn" bind:tap="goto" data-url="index">
62
+        <view>制作</view>
63
+        <view class="panelFooterLine"></view>
64
+      </view>
65
+      <view class="panelFooterBtn FlexColumn" >
66
+        <view>精选</view>
67
+        <view class="panelFooterLine1"></view>
68
+      </view>
69
+    </view>
70
+    <view class="iphone10plus" wx:if="{{IsIPhoneX}}"></view>
71
+  </view>
72
+</view>

+ 239 - 0
pages/main/articlefine.wxss

@@ -0,0 +1,239 @@
1
+.container{
2
+  background-color: #DAD2C1;
3
+  color:#2E2E2E;
4
+}
5
+
6
+.panel1{
7
+  width: 690rpx;
8
+  height:620rpx;
9
+  margin-top: 30rpx;
10
+  border-radius: 40rpx;
11
+  overflow: hidden;
12
+}
13
+.swiper{
14
+  width: 100%;
15
+  height:100%;
16
+}
17
+.panel1Item{
18
+  width: 100%;
19
+}
20
+.img{
21
+  width: 690rpx;
22
+  height:620rpx;
23
+}
24
+
25
+.panel1Item1{
26
+  position: absolute;
27
+  bottom: 0;
28
+  width: 100%;
29
+  min-height: 200rpx;
30
+  background-image: linear-gradient(180deg, rgba(40,40,40,0.30) 0%, rgba(40,40,40,0.90) 100%);
31
+  border-radius: 0 0 40rpx 40rpx;
32
+}
33
+.panel1Item11{
34
+  margin: 30rpx 0 64rpx 40rpx;
35
+  color: #FFFFFF;
36
+  align-items: flex-start;
37
+}
38
+.panel1Item1 .text1{
39
+  font-size: 24rpx;
40
+  text-shadow: 0 3rpx 0 rgba(0,0,0,0.30);
41
+}
42
+.panel1Item1 .text2{
43
+  font-size: 32rpx;
44
+  width: 610rpx;
45
+  text-shadow: 0 3rpx 0 rgba(0,0,0,0.30);
46
+  overflow: hidden;
47
+  white-space: nowrap;
48
+}
49
+.panel1Item1 .text3{
50
+  font-size: 36rpx;
51
+  width: 610rpx;
52
+  text-shadow: 0 3rpx 0 rgba(0,0,0,0.30);
53
+}
54
+.wx-swiper-dot {
55
+  width: 14rpx !important;
56
+  height: 14rpx !important;
57
+  margin-left: 10rpx !important;
58
+  margin-right: 10rpx !important;
59
+}
60
+
61
+.wx-swiper-dot {
62
+  background-color: #858282 !important;
63
+}
64
+
65
+.wx-swiper-dot-active {
66
+  background-color: #DAD2C1 !important;
67
+}
68
+
69
+.panel2{
70
+  width: 100%;
71
+  justify-content: flex-start;
72
+}
73
+.panelTitle{
74
+  align-self: start;
75
+  margin: 80rpx 0 0 60rpx;
76
+  
77
+}
78
+.panel21{
79
+  width: 100%;
80
+  margin-top: 40rpx;
81
+}
82
+.panel211{
83
+  width: 158rpx;
84
+  height:213rpx;
85
+  border-radius: 20rpx;
86
+  font-size: 36rpx;
87
+  position: relative;
88
+  margin: 0 10rpx;
89
+}
90
+.sysIcon_a19{
91
+  width: 30rpx;
92
+  height:30rpx;
93
+  position: absolute;
94
+  top:40rpx;
95
+  left:34rpx;
96
+}
97
+
98
+.panel211 .text4{
99
+  position: absolute;
100
+  top:110rpx;
101
+  left:20rpx;
102
+}
103
+
104
+.panel211 .text5{
105
+  position: absolute;
106
+  top:160rpx;
107
+  left:20rpx;
108
+  font-size:24rpx;
109
+}
110
+
111
+.panel3{
112
+  width: 100%;
113
+  justify-content: flex-start;
114
+  margin-top: 40rpx;
115
+}
116
+
117
+.panel3Item{
118
+  width: 690rpx;
119
+  max-height: 226rpx;
120
+  background: #F0EDE6;
121
+  border-radius: 20rpx;
122
+  margin-bottom: 20rpx;
123
+  justify-content: space-between;
124
+}
125
+
126
+.panel3ItemLeft{
127
+  margin-left: 30rpx;
128
+  font-size: 24rpx;
129
+  align-items: flex-start;
130
+  font-weight: 400;
131
+  justify-content: flex-start;
132
+}
133
+.panel3ItemLeft .text6{
134
+  font-size: 32rpx;
135
+  width: 420rpx;
136
+  height:90rpx;
137
+  margin: 30rpx 0 10rpx 0;
138
+}
139
+.panel3ItemLeft .text7{
140
+  margin:0 0 30rpx 0;
141
+}
142
+
143
+.img2{
144
+  width: 180rpx;
145
+  height:166rpx;
146
+  margin: 30rpx 30rpx 30rpx 0;
147
+  border-radius: 10rpx;
148
+}
149
+
150
+.panel3Item0{
151
+  height:200rpx;
152
+  background-color: #fff;
153
+}
154
+
155
+.panel3ItemLeft .text8{
156
+  margin:62rpx 0 5rpx 0;
157
+  font-size: 28rpx;
158
+  font-weight: 700;
159
+}
160
+
161
+.sysIcon_b20{
162
+  width: 270rpx;
163
+  height:200rpx;
164
+  border-radius: 0 20rpx 20rpx 0;
165
+}
166
+
167
+.panel4{
168
+  width:690rpx;
169
+  min-height: 852rpx;
170
+  border-radius: 20rpx;
171
+  background-color: #F0EDE6;
172
+  margin: 40rpx 0 200rpx 0;
173
+  flex-wrap: wrap;
174
+  justify-content: flex-start;
175
+  align-items: flex-start;
176
+}
177
+.panel4Item{
178
+  width: 230rpx;
179
+  height:203rpx;
180
+}
181
+.panel4Item1{
182
+  width: 60rpx;
183
+  height:60rpx;
184
+  background: #DAD2C1;
185
+  border-radius: 16rpx;
186
+}
187
+
188
+.sysIcon_a23{
189
+  width: 30rpx;
190
+  height:30rpx;
191
+}
192
+
193
+.panel4Item .text9{
194
+  font-size: 28rpx;
195
+  margin-top: 10rpx;
196
+}
197
+
198
+.panel4Item .text10{
199
+  font-size: 24rpx;
200
+  color:#4D4D4D;
201
+  font-weight: 400;
202
+}
203
+
204
+.panelFooter{
205
+  width: 100%;
206
+  background-color: #fff;
207
+  color: #004433;
208
+  position: fixed;
209
+  bottom: 0;
210
+  z-index: 10;
211
+}
212
+
213
+.panelFooter1{
214
+  width:100%;
215
+}
216
+
217
+.panelFooterBtn{
218
+  width: 50%;
219
+  font-size: 36rpx;
220
+  height: 100rpx;
221
+  justify-content: flex-end;
222
+}
223
+.panelFooterLine{
224
+  width: 72rpx;
225
+  height:16rpx;
226
+  margin-top: 9rpx;
227
+}
228
+.panelFooterLine1{
229
+  width: 72rpx;
230
+  height:16rpx;
231
+  margin-top: 9rpx;
232
+  background-color: #004433;
233
+}
234
+
235
+.iphone10plus{
236
+  width:100%;
237
+  height:30rpx;
238
+  background-color: #fff;
239
+}

+ 96 - 0
pages/main/help.js

@@ -5,13 +5,109 @@ const app = getApp();
5 5
 
6 6
 Page({
7 7
   data: {
8
+    scrollTop: 0,
9
+    showReturnBtn: false, // 控制返回顶部按钮的显示/隐藏
8 10
   },
9 11
   onLoad: function (options) {
10 12
     let that = this;
13
+    //debugger;
14
+    let arr=[];
15
+    for(let i=0;i<24;i++){
16
+      let id=i.toString();
17
+      if (i<10)
18
+        id="0"+id;
19
+      let obj={};
20
+      obj.ID=id;
21
+      
22
+      arr.push(obj);
23
+    }
24
+   
11 25
     that.setData({
12 26
       Containnerheight: main.getWindowHeight(),
27
+      List:arr,
13 28
     });
14 29
     main.checkGenerating();
30
+    if (options.ID){
31
+      setTimeout(function(){
32
+        that.handleImageTap({currentTarget:{dataset:{id:options.ID}}});
33
+      },1000);
34
+    }
35
+  },
36
+  // 处理图片点击事件,实现锚点功能
37
+  handleImageTap: function(e) {
38
+    const id = e.currentTarget.dataset.id;
39
+    let targetId="",offsetY=0;
40
+    switch(id) {
41
+      case "02":
42
+        targetId = "img07";
43
+        offsetY=40;
44
+        break;
45
+      case "03":
46
+        targetId = "img09";
47
+        offsetY=210;
48
+        break;
49
+      case "04":
50
+        targetId = "img12";
51
+        offsetY=50;
52
+        break;
53
+      case "05":
54
+        targetId = "img17";
55
+        offsetY=220;
56
+        break;
57
+      case "06":
58
+        targetId = "img21";
59
+        offsetY=-80;
60
+        break;
61
+      default:
62
+        targetId = "";
63
+        offsetY=0;
64
+        break;
65
+    }
66
+    
67
+    // 使用微信小程序的API滚动到目标元素
68
+    wx.createSelectorQuery()
69
+      .select('#' + targetId)
70
+      .boundingClientRect(function(rect){
71
+        if(rect){
72
+          wx.pageScrollTo({
73
+            scrollTop: rect.top+offsetY,
74
+            duration: 300
75
+          });
76
+        }
77
+      })
78
+      .exec();
79
+  },
80
+  returnTop:function(){
81
+    wx.pageScrollTo({
82
+      scrollTop: 0,
83
+      duration: 300
84
+    });
85
+  },
86
+  // 监听页面滚动
87
+  onPageScroll: function(e) {
88
+    // 获取当前的scrollTop
89
+    const scrollTop = e.scrollTop;
90
+    
91
+    // 更新scrollTop数据
92
+    this.setData({
93
+      scrollTop: scrollTop
94
+    });
95
+    
96
+    // 当滚动距离超过一屏(这里以屏幕高度的一半为例)时显示返回顶部按钮
97
+    // 获取系统信息来确定屏幕高度
98
+    const screenHeight = wx.getSystemInfoSync().windowHeight;
99
+    const threshold = screenHeight / 2; // 设置阈值为屏幕高度的一半
100
+    
101
+    // 根据scrollTop决定是否显示返回按钮
102
+    if (scrollTop > threshold && !this.data.showReturnBtn) {
103
+      this.setData({
104
+        showReturnBtn: true
105
+      });
106
+    } else if (scrollTop <= threshold && this.data.showReturnBtn) {
107
+      this.setData({
108
+        showReturnBtn: false
109
+      });
110
+    }
15 111
   },
16 112
   onShareAppMessage: function () {
17 113
     return {

+ 15 - 3
pages/main/help.wxml

@@ -1,4 +1,16 @@
1
-<view class="container FlexColumn" style='min-height:{{Containnerheight}}rpx;' bindtap="onContainerTap">
2
-  <image mode="widthFix" src="../images/pic_h{{item}}.png" class="pic_h04" wx:for='{{["04","05","06","07","08","09","10","11","12","13","14","15"]}}' wx:key="index"></image>
3
-        
1
+<view class="container FlexColumn" style='min-height:{{Containnerheight}}rpx;'>
2
+  <image 
3
+    id="img{{item.ID}}" 
4
+    mode="widthFix" 
5
+    src="../images/pic_hb{{item.ID}}.png" 
6
+    class="pic_h04" 
7
+    wx:for='{{List}}' 
8
+    wx:key="index"
9
+    bindtap="handleImageTap"
10
+    data-id="{{item.ID}}" 
11
+  ></image>
12
+
13
+  <view class="btnReturn FlexColumn" bind:tap="returnTop" wx:if="{{showReturnBtn}}">
14
+    <image src="../images/sysIcon_a18.png" class="sysIcon_a18"></image>
15
+  </view>
4 16
 </view>

+ 14 - 0
pages/main/help.wxss

@@ -4,4 +4,18 @@ page{
4 4
 .pic_h04{
5 5
   width:100%;
6 6
   height:auto;
7
+}
8
+.btnReturn{
9
+  width:80rpx;
10
+  height:70rpx;
11
+  background: #FFFFFF;
12
+  border: 6rpx solid #2E2E2E;
13
+  border-radius: 10rpx;
14
+  position: fixed;
15
+  right:20rpx;
16
+  bottom:20rpx;
17
+}
18
+.sysIcon_a18{
19
+  width:50rpx;
20
+  height:28rpx;
7 21
 }

+ 62 - 5
pages/main/index.js

@@ -10,6 +10,7 @@ Page({
10 10
   data: {
11 11
     IsShowRemind:false,
12 12
     remindAnimation: "",
13
+    IsIPhoneX:app.globalData.IsIPhoneX,
13 14
   },
14 15
   onLoad: function (options) {
15 16
     let that = this;
@@ -17,9 +18,33 @@ Page({
17 18
       Containnerheight: main.getWindowHeight(),
18 19
       Version:app.globalData.Version,
19 20
     });
21
+    that.initMenu();
22
+
23
+    // setTimeout(function(){
24
+    //   if (!app.globalData.IsProduction){
25
+    //     wx.navigateTo({
26
+    //       url: 'articlefine',
27
+    //     })
28
+    //   }
29
+    // },1000);
30
+
31
+    if (app.globalData.goto){
32
+      wx.navigateTo({
33
+        url: app.globalData.goto,
34
+      });
35
+    }
36
+
37
+    if (app.globalData.systemInfo.windowHeight>700){
38
+      that.setData({
39
+        CanScrollCSS: "panelTop1",
40
+      });
41
+    }
42
+
43
+    that.getBaiduToken();
44
+    
20 45
   },
21 46
   onShow:function(){
22
-    app.globalData.OCRWords=[];
47
+    
23 48
     this.getData();
24 49
     main.checkGenerating();
25 50
 
@@ -31,6 +56,13 @@ Page({
31 56
         IsShowGuideContainer:false,
32 57
       })
33 58
     }
59
+
60
+    if (app.globalData.goto){
61
+      app.globalData.goto="";
62
+    }
63
+    else{
64
+      app.globalData.OCRWords=[];
65
+    }
34 66
   },
35 67
   goto: function (e) {
36 68
     let that=this;
@@ -41,10 +73,16 @@ Page({
41 73
         return ;
42 74
       }
43 75
     }
44
-    
45
-    wx.navigateTo({
46
-      url: url,
47
-    });
76
+    if (url=="articlefine"){
77
+      wx.redirectTo({
78
+        url: url,
79
+      });
80
+    }
81
+    else{
82
+      wx.navigateTo({
83
+        url: url,
84
+      });
85
+    }
48 86
     that.setData({
49 87
       IsShowRemind:false,
50 88
     })
@@ -73,7 +111,26 @@ Page({
73 111
     main.showGuideContainer(that,"#txtWordsInput",-5,60,"pic_ha01",196,126);
74 112
     wx.setStorageSync('IsShowGuideContainer', true);
75 113
   },
114
+  initMenu:function(){
115
+    let that = this;
116
+    main.getData('GetYJBDCGenerateConfig?UserID=' + app.globalData.userInfo.UserID, function (data) {
117
+      app.globalData.GenerateConfig=data;
118
+    });
119
+  },
76 120
   catchTouchMove: main.catchTouchMove,
121
+  getBaiduToken: function () {
122
+    var that = this;
123
+    wx.login({
124
+      success: function (res0) {
125
+        main.getData('GetBaiduToken?ProgramID=' + app.globalData.ProgramID+"&Code="+res0.code, function (data) {
126
+          if (data) {
127
+            app.globalData.BaiduToken=data;
128
+            //console.log("BD:"+data);
129
+          }
130
+        });
131
+      },
132
+    });
133
+  },
77 134
   onShareAppMessage: function () {
78 135
     return {
79 136
       title: app.globalData.ShareTitle,

+ 19 - 4
pages/main/index.wxml

@@ -1,5 +1,6 @@
1
-<view class="container FlexColumn" style='min-height:{{Containnerheight}}rpx;'>
2
-  <view class="panelTop FlexColumn">
1
+<view class="container {{CanScrollCSS}} FlexColumn" style='min-height:{{Containnerheight}}rpx;'>
2
+  <view class="panelTop {{CanScrollCSS}} FlexColumn">
3
+    
3 4
     <view class="panel1 FlexColumn">
4 5
       <image src="../images/pic_01.png" class="pic_01"></image>
5 6
     </view>
@@ -31,9 +32,23 @@
31 32
       </view>
32 33
     </view>
33 34
   </view>
35
+  
34 36
   <view class="panelFooter FlexColumn">
35
-    <image src="../images/pic_02.png" class="pic_02"></image>
36
-    <view class="text03">©2025 秒过语境背单词 {{Version}}</view>
37
+    <view class="panelFooter1 FlexColumn">
38
+      <image src="../images/pic_02.png" class="pic_02"></image>
39
+      <view class="text03">©2025 秒过语境背单词 {{Version}}</view>
40
+    </view>
41
+    <view class="panelFooter2 FlexRow">
42
+      <view class="panelFooterBtn FlexColumn" >
43
+        <view>制作</view>
44
+        <view class="panelFooterLine1"></view>
45
+      </view>
46
+      <view class="panelFooterBtn FlexColumn" bind:tap="goto" data-url="articlefine">
47
+        <view>精选</view>
48
+        <view class="panelFooterLine"></view>
49
+      </view>
50
+    </view>
51
+    <view class="iphone10plus" wx:if="{{IsIPhoneX}}"></view>
37 52
   </view>
38 53
 </view>
39 54
 

+ 61 - 20
pages/main/index.wxss

@@ -1,8 +1,10 @@
1 1
 .panelTop{
2 2
   width:100%;
3
+  z-index: 20;
4
+}
5
+.panelTop1{
3 6
   position: fixed;
4 7
   top:0;
5
-  z-index: 10;
6 8
 }
7 9
 
8 10
 .panel1{
@@ -61,6 +63,8 @@
61 63
   margin-left: 120rpx;
62 64
   font-size: 24rpx;
63 65
   color: #C1E1C1;
66
+  position: relative;
67
+  background-color: #004433;
64 68
 }
65 69
 
66 70
 .panel31{
@@ -91,25 +95,6 @@
91 95
   margin: 0 0 0 10rpx;
92 96
 }
93 97
 
94
-.panelFooter{
95
-  width:100%;
96
-  position: fixed;
97
-  bottom: 0;
98
-}
99
-
100
-.pic_02{
101
-  width:100%;
102
-  height:280rpx;
103
-}
104
-
105
-.text03{
106
-  position: absolute;
107
-  bottom:30rpx;
108
-  left:50rpx;
109
-  font-size: 20rpx;
110
-  color: #544641;
111
-}
112
-
113 98
 
114 99
 .panelMenu{
115 100
   background-color: rgba(26,67,51,0.50);
@@ -183,4 +168,60 @@
183 168
 .panelGuideContainer .panelGuideContainerImage{
184 169
   width: 610rpx;
185 170
   height: 338rpx;
171
+}
172
+
173
+
174
+.panelFooter{
175
+  width: 100%;
176
+  background-color: #fff;
177
+  color: #004433;
178
+  position: fixed;
179
+  bottom: 0;
180
+  z-index: 10;
181
+}
182
+
183
+.panelFooter1{
184
+  width:100%;
185
+}
186
+
187
+.panelFooter2{
188
+  width:100%;
189
+  position: relative;
190
+  z-index: 50;
191
+}
192
+
193
+.pic_02{
194
+  width:100%;
195
+  height:280rpx;
196
+}
197
+
198
+.text03{
199
+  position: absolute;
200
+  top:220rpx;
201
+  left:50rpx;
202
+  font-size: 20rpx;
203
+  color: #544641;
204
+}
205
+.panelFooterBtn{
206
+  width: 50%;
207
+  font-size: 36rpx;
208
+  height: 100rpx;
209
+  justify-content: flex-end;
210
+}
211
+.panelFooterLine{
212
+  width: 72rpx;
213
+  height:16rpx;
214
+  margin-top: 9rpx;
215
+}
216
+.panelFooterLine1{
217
+  width: 72rpx;
218
+  height:16rpx;
219
+  margin-top: 9rpx;
220
+  background-color: #004433;
221
+}
222
+
223
+.iphone10plus{
224
+  width:100%;
225
+  height:30rpx;
226
+  background-color: #fff;
186 227
 }

+ 40 - 9
pages/main/myarticles.js

@@ -8,46 +8,60 @@ Page({
8 8
   data: {
9 9
     IsShowRemind:false,
10 10
     IsNew:0,
11
+    IsShowID:false,
12
+    IsShowMore:true,
11 13
   },
12 14
   onLoad: function (options) {
13 15
     let that = this;
14 16
     that.setData({
15 17
       Containnerheight: main.getWindowHeight(),
18
+      UserID:app.globalData.userInfo.UserID,
16 19
     });
17 20
     main.checkGenerating();
18
-    that.getData(app.globalData.userInfo.UserID);
21
+    that.getData(that.data.UserID);
19 22
   },
20 23
   onShow:function(e){
21 24
     let that=this;
22 25
     if (that.data.IsNew){
23 26
       setTimeout(function(){
24
-        that.getData(app.globalData.userInfo.UserID);
27
+        that.getData(that.data.UserID);
25 28
       },1000);
26 29
     }
27 30
   },
28
-  getData:function(userID){
31
+  getData:function(userID,pageID){
29 32
     wx.showLoading({
30 33
       title: '请稍候',
31 34
     });
32 35
     let that=this;
33 36
     let url='GetYJBDCArticleList?UserID=' + userID;
34
-    //debugger;
37
+    if (pageID)
38
+      url+="&PageID="+pageID;
35 39
     if (that.data.IsNew==1)
36 40
       url+="&IsNew=1";
37 41
     console.log(url);
38 42
     main.getData(url, function (data) {
39 43
       wx.hideLoading();
40 44
       if (data) {
45
+        if (!pageID)
46
+          that.data.List=[];
41 47
         for(let i=0;i<data.length;i++){
42 48
             let item=data[i];
43 49
             item.WordsStr=item.Words.split(",").join(" ");
50
+            that.data.List.push(item);
44 51
         }
52
+        let isShowMore=true;
53
+        if (that.data.List[0].RowsCount==that.data.List.length)
54
+        isShowMore=false;
45 55
         that.setData({
46
-          List:data,
56
+          List:that.data.List,
57
+          IsShowMore:isShowMore,
47 58
         });
48 59
       }
49 60
     });
50 61
   },
62
+  getMore:function(e){
63
+    this.getData(this.data.UserID,this.data.List[this.data.List.length-1].ID);
64
+  },
51 65
   goto: function (e) {
52 66
     let that=this;
53 67
     if (e.currentTarget.dataset.readcount===0){
@@ -83,28 +97,45 @@ Page({
83 97
     const confirm=e.currentTarget.dataset.confirm;
84 98
     animation.toggleRemindWithAnimation(this);
85 99
     if (confirm=="1") {
86
-      main.getData('DeleteYJBDCArticleList?UserID=' + app.globalData.userInfo.UserID+"&ID="+that.data.ID, function (data) {
100
+      main.getData('DeleteYJBDCArticleList?UserID=' + that.data.UserID+"&ID="+that.data.ID, function (data) {
87 101
          wx.showToast({
88 102
            title: '删除完成',
89 103
          });
90 104
          that.setData({
91 105
             IsNew:1,
92 106
          });
93
-         that.getData(app.globalData.userInfo.UserID);
107
+         for(let i=0;i<that.data.List.length;i++){
108
+           if (that.data.List[i].ID==that.data.ID){
109
+             that.data.List.splice(i,1);
110
+             break;
111
+           }
112
+         }
113
+         that.setData({
114
+          List:that.data.List,
115
+       });
94 116
       });
95 117
     }
96 118
   },
97 119
   setGotoID:function(e){
98 120
     let that=this;
99
-    if (app.globalData.userInfo.UserID<4){
121
+    if (app.globalData.userInfo.UserID<4 || app.globalData.userInfo.UserID==11){
100 122
       wx.showModal({
101 123
         title: '输入用户ID,获得生成的文章',
102 124
         content: '',
103 125
         editable:true,
104 126
         complete: (res) => {
105 127
           if (res.confirm) {
106
-            if (res.content)
128
+            if (res.content){
129
+              that.setData({
130
+                UserID:res.content,
131
+              });
107 132
               that.getData(res.content);
133
+            }
134
+          }
135
+          else{
136
+            that.setData({
137
+              IsShowID:!that.data.IsShowID,
138
+           });
108 139
           }
109 140
         }
110 141
       })

+ 4 - 1
pages/main/myarticles.wxml

@@ -8,7 +8,8 @@
8 8
     <view class="panel1 FlexColumn" wx:for="{{List}}" wx:key="index">
9 9
       <view class="panel13 FlexRow" bind:tap="goto" data-url="article?ID={{item.ID}}" data-readcount="{{item.ReadCount}}">
10 10
         <view class="panel131 FlexRow" wx:if="{{item.ReadCount==0}}">未读</view>
11
-        <view class="text01" >{{item.CreateTime}}</view>
11
+        <view class="text05" wx:if="{{IsShowID}}">{{item.ID}}</view>
12
+        <view class="text01">{{item.CreateTime}}</view>
12 13
       </view>
13 14
       <view class="panel10 FlexColumn"  bind:tap="goto" data-url="article?ID={{item.ID}}" data-readcount="{{item.ReadCount}}">
14 15
         <view class="panel11 FlexRow">
@@ -31,6 +32,8 @@
31 32
         </view>
32 33
       </view>
33 34
     </view>
35
+    <view class="panelPage FlexColumn" bind:tap="getMore" wx:if="{{IsShowMore}}">更多</view>
36
+    <view class="panelPage panelPage2 FlexColumn" wx:if="{{!IsShowMore}}">到底了</view>
34 37
   </block>
35 38
   <view style="height: 100rpx;"></view>
36 39
 </view>

+ 14 - 1
pages/main/myarticles.wxss

@@ -73,6 +73,9 @@
73 73
   width: 610rpx;
74 74
   margin: 20rpx 0;
75 75
 }
76
+.text05{
77
+  margin-right: 20rpx;
78
+}
76 79
 
77 80
 .panelBtn{
78 81
   border-radius: 10rpx;
@@ -103,7 +106,17 @@
103 106
   width: 20rpx;
104 107
   height:22rpx;
105 108
 }
106
-
109
+.panelPage{
110
+  width:710rpx;
111
+  height:100rpx;
112
+  background: #002F24;
113
+  border-radius: 20rpx;
114
+  font-size: 28rpx;
115
+  color: #C1E1C1;
116
+}
117
+.panelPage2{
118
+  background:none;
119
+}
107 120
 
108 121
 .panelMenu{
109 122
   background-color: rgba(26,67,51,0.50);

+ 1 - 1
pages/main/ocr.js

@@ -146,6 +146,7 @@ Page({
146 146
         throw new Error('未识别到有效文字')
147 147
       }
148 148
 
149
+      debugger;
149 150
       // 6.提取英文单词
150 151
       const engTexts=this.extractEnglishWords(texts);
151 152
 
@@ -207,7 +208,6 @@ Page({
207 208
   extractEnglishWords(texts) {
208 209
     //console.group('英语单词提取');
209 210
     const words = new Set();
210
-
211 211
     texts.forEach(item => {
212 212
       const text = item.text;
213 213
       //console.log('处理文本:', text);

+ 1 - 0
pages/main/selectword.js

@@ -25,6 +25,7 @@ Page({
25 25
   onShow:function(e){
26 26
     let that = this;
27 27
     let words=app.globalData.OCRWords;
28
+    debugger;
28 29
     that.data.Words=[];
29 30
     let list=app.globalData.SelectedWords;
30 31
     let count=0;

+ 40 - 43
pages/main/wordsinput.js

@@ -43,6 +43,12 @@ Page({
43 43
     that.initMenu();
44 44
 
45 45
     main.checkGenerating();
46
+
47
+    if (options.goto=="selectword"){
48
+      wx.navigateTo({
49
+        url: options.goto,
50
+      })
51
+    }
46 52
   },
47 53
   onShow:function(e){
48 54
     let that = this;
@@ -96,58 +102,37 @@ Page({
96 102
         IsShowGuideContainer:true,
97 103
         IsShowGuideRemind:false,
98 104
       });
99
-      app.globalData.SelectedWords=["cat","dog","meat","fight","","happy","love","study","cry","flower"];
105
+      app.globalData.SelectedWords=["penguin","asia","mammal","panda","","fish","bird","dolphin","",""];
100 106
       that.initWords();
101 107
       main.showGuideContainer(that,"#txtWord5",134,-238,"pic_ha02",0,2);
102 108
     }
103 109
   },
104 110
   initMenu:function(){
105 111
     let that = this;
106
-    main.getData('GetYJBDCGenerateConfig?UserID=' + app.globalData.userInfo.UserID, function (data) {
107
-      let GradeArr=data.Level;
108
-      let grade=wx.getStorageSync('Grade');
109
-      if (grade && grade>=0 && grade<=3){
110
-        for(let i=0;i<GradeArr.length;i++){
111
-          GradeArr[i].CSS="";
112
-          if (grade==i)
113
-            GradeArr[i].CSS="Selected";
114
-        }
115
-      }
116
-
117
-      let ArticleStyleArr=data.ArticleStyle;
118
-      let ArticleStyle=wx.getStorageSync('ArticleStyle');
119
-      if (ArticleStyle && ArticleStyle>=0 && ArticleStyle<=12){
120
-        for(let i=0;i<ArticleStyleArr.length;i++){
121
-          ArticleStyleArr[i].CSS="";
122
-          if (ArticleStyle==i)
123
-            ArticleStyleArr[i].CSS="Selected";
124
-        }
125
-      }
126
-
127
-      let AIVersionArr=data.AIVersion;
128
-      let AIVersion=wx.getStorageSync('AIVersion');
129
-      if (AIVersion && AIVersion>=0){
130
-        for(let i=0;i<AIVersionArr.length;i++){
131
-          AIVersionArr[i].CSS="";
132
-          if (AIVersion==i)
133
-            AIVersionArr[i].CSS="Selected";
134
-        }
135
-      }
136
-      that.setData({
137
-        GradeArr:GradeArr,
138
-        ArticleStyleArr:ArticleStyleArr,
139
-        AIVersionArr:AIVersionArr,
112
+    let level=app.globalData.GenerateConfig.Level;
113
+    level[0].CSS="Selected";
114
+    for(let i=1;i<level.length;i++){
115
+      level[i].CSS="";
116
+    }
117
+    let articleStyle=app.globalData.GenerateConfig.ArticleStyle;
118
+    articleStyle[0].CSS="Selected";
119
+    for(let i=1;i<articleStyle.length;i++){
120
+      articleStyle[i].CSS="";
121
+    }
122
+    that.setData({
123
+      GradeArr:level,
124
+      ArticleStyleArr:articleStyle,
125
+      AIVersionArr:app.globalData.GenerateConfig.AIVersion,
140 126
     });  
141
-    });
142 127
   },
143 128
   bindKeyInput: function (e) {
144 129
     let that=this;
145 130
     let id=e.currentTarget.dataset.id;
146 131
     let word=e.detail.value;
147
-
148
-    if (wx.getStorageSync("IsShowGuideContainer") && word.toString().toLowerCase()=="win"){
132
+    const inputWord="smart";
133
+    if (wx.getStorageSync("IsShowGuideContainer") && word.toString().toLowerCase()==inputWord){
149 134
       that.data.Words[4].Focus=false;
150
-      that.data.Words[4].Word="win";
135
+      that.data.Words[4].Word=inputWord;
151 136
       that.setData({
152 137
         Words:that.data.Words,
153 138
       });
@@ -219,7 +204,7 @@ Page({
219 204
 
220 205
           if (wx.getStorageSync("IsShowGuideContainer")){
221 206
             
222
-            main.showGuideContainer(that,"#btnLevel1",75,-70,"pic_ha04",135,167);
207
+            main.showGuideContainer(that,"#btnLevel1",150,-50,"pic_ha04",135,167);
223 208
           }
224 209
         }
225 210
       });
@@ -282,7 +267,6 @@ Page({
282 267
     let that=this;
283 268
     const index=e.currentTarget.dataset.index;
284 269
     const id=e.currentTarget.dataset.id;
285
-    
286 270
     let arr=this.data.GradeArr;
287 271
     if (id==1)
288 272
       arr=this.data.ArticleStyleArr;
@@ -331,7 +315,14 @@ Page({
331 315
 
332 316
     that.getInputData();
333 317
 
334
-    if (url=="article"){
318
+    if (url=="article" && app.globalData.Generating){
319
+      animation.toggleRemindWithAnimation(that, {
320
+        remindKey:'IsShowRemindWait',
321
+        showAnimation: 'remind-slide-up'
322
+      });
323
+      return ;
324
+    }
325
+    else if (url=="article"){
335 326
       let arr=this.data.GradeArr;
336 327
       for(let i=0;i<arr.length;i++){
337 328
         if (arr[i].CSS=="Selected"){
@@ -420,7 +411,13 @@ Page({
420 411
     }
421 412
   },
422 413
   showRemind:function(e){
423
-    animation.toggleRemindWithAnimation(this);
414
+    let type1="IsShowRemind"
415
+    if (e.currentTarget.dataset.type)
416
+      type1=e.currentTarget.dataset.type;
417
+    animation.toggleRemindWithAnimation(this, {
418
+      remindKey:type1,
419
+      showAnimation: 'remind-slide-down'
420
+    });
424 421
   },
425 422
   catchTouchMove: main.catchTouchMove,
426 423
   onShareAppMessage: function () {

+ 38 - 8
pages/main/wordsinput.wxml

@@ -73,20 +73,32 @@
73 73
       <view class="text04">要求</view>
74 74
     </view>
75 75
     <view class="panelMenu11 FlexColumn">
76
-      <view class="text04 text05">单词水平</view>
77
-      <view class="panelMenu111 FlexRow">
78
-        <view id="btnLevel{{index}}" class="btn btn{{item.CSS}} FlexRow" wx:for="{{GradeArr}}" wx:key="index" capture-bind:tap="selectBtn" data-id="0" data-index="{{index}}">{{item.Name}}</view>
76
+      <view class="panelMenu11_1 FlexRow">
77
+        <view class="text04 text05">难度水平 CEFR</view>
78
+        <view class="panelMenu11_11 FlexRow" catch:tap="goto" data-url="help?ID=04">
79
+          <image src="../images/sysIcon_a01.png" class="sysIcon_a01"></image>
80
+          <view>怎么选</view>
81
+        </view>
79 82
       </view>
83
+      <scroll-view scroll-x="true" class="panelMenu1110">
84
+        <view class="panelMenu112 FlexRow" >
85
+          <view id="btnLevel{{index}}" class="btn5 btn5{{item.CSS}} FlexRow" wx:for="{{GradeArr}}" wx:key="index" capture-bind:tap="selectBtn" data-id="0" data-index="{{index}}">
86
+            <view class="btn41">{{item.Name}}</view>
87
+            <text>{{item.Content}}</text>
88
+          </view>
89
+        </view>
90
+        <view style="width:30rpx;"></view>
91
+      </scroll-view>
80 92
     </view>
81 93
     <view class="panelMenu11 FlexColumn">
82
-      <view class="text04 text06">主题</view>
94
+      <view class="text04 text06">情节</view>
83 95
       <scroll-view scroll-x="true" class="panelMenu1110">
84 96
         <view class="panelMenu1111 FlexRow">
85 97
           <view id="btnArticleStyle{{index}}" class="btn btn{{item.CSS}} FlexRow" wx:for="{{ArticleStyleArr}}" wx:key="index" capture-bind:tap="selectBtn" data-id="1" data-index="{{index}}">{{item.Name}}</view>
86 98
         </view>
87 99
       </scroll-view>
88 100
     </view>
89
-    <view class="panelMenu11 FlexColumn">
101
+    <!-- <view class="panelMenu11 FlexColumn">
90 102
       <view class="text04 text05">模型</view>
91 103
       <scroll-view scroll-x="true" class="panelMenu1110">
92 104
         <view class="panelMenu1111 panelMenu11110 FlexRow" style="width: {{358*(AIVersionArr.length+2)}}rpx;">
@@ -96,7 +108,7 @@
96 108
           </view>
97 109
         </view>
98 110
       </scroll-view>
99
-    </view>
111
+    </view> -->
100 112
     <view id="btnBuild" class="btn2 FlexRow" catch:tap="goto" data-url="article">
101 113
       <image src="../images/sysIcon_b01.png" class="sysIcon_b01"></image>
102 114
       <view>生成短文</view>
@@ -122,7 +134,6 @@
122 134
 <view wx:if="{{IsShowRemind}}" class="panelRemindParent {{remindAnimation}} container FlexColumn" style='min-height:{{Containnerheight}}rpx;'>
123 135
   <view class="panelRemind FlexColumn">
124 136
     <image src="../images/sysIcon_b10.png" class="sysIcon_b10"></image>
125
-      
126 137
     <view class="panelRemind1 FlexRow">
127 138
       <image src="../images/sysIcon_b09.png" class="sysIcon_b09"></image>
128 139
       <view>无法拍照</view>
@@ -135,4 +146,23 @@
135 146
       <view class="btnReind1 FlexColumn" catch:tap="showRemind">知道了</view>
136 147
     </view>
137 148
   </view>
138
-</view>
149
+</view>
150
+
151
+<!-- 稍等片刻 -->
152
+<view wx:if="{{IsShowRemindWait}}" class="panelRemindParent {{remindAnimation}} container FlexColumn" style='min-height:{{Containnerheight}}rpx;'>
153
+  <view class="panelRemind FlexColumn">
154
+    <image src="../images/sysIcon_b10.png" class="sysIcon_b10"></image>
155
+      
156
+    <view class="panelRemind1 FlexRow">
157
+      <image src="../images/sysIcon_b09.png" class="sysIcon_b09"></image>
158
+      <view>稍等片刻</view>
159
+    </view>
160
+    <view class="panelRemind2 FlexColumn">
161
+      <view class="textRemind FlexColumn">
162
+        <text>很抱歉,由于AI系统负荷较高,无法为您同时生成两篇文章。请在上一篇文章生成结束后再继续,感谢您的理解与耐心等待。</text>
163
+        <text class="textRemind2">一篇生产完毕后才能生产下一篇。</text>
164
+      </view>
165
+      <view class="btnReind1 FlexColumn" catch:tap="showRemind" data-type="IsShowRemindWait">知道了</view>
166
+    </view>
167
+  </view>
168
+</view>

+ 47 - 3
pages/main/wordsinput.wxss

@@ -257,6 +257,7 @@
257 257
 
258 258
 .panelMenu1{
259 259
   width:100%;
260
+  height:1130rpx;
260 261
   background: #1E1E1E;
261 262
   border-radius: 60rpx 60rpx 0 0;
262 263
   position: fixed;
@@ -267,14 +268,28 @@
267 268
 
268 269
 .panelMenu11{
269 270
   width: 100%;
271
+  margin-bottom: 30rpx;
270 272
 }
273
+.panelMenu11_1{
274
+  width: 100%;
275
+  justify-content: space-between;
276
+  margin-top: 10rpx;
277
+}
278
+.panelMenu11_11{
279
+  font-size: 24rpx;
280
+  color: #C1E1C1;
281
+  margin: 10rpx 40rpx 0 0;
282
+}
283
+
284
+
285
+
271 286
 .text04{
272 287
   align-self: start;
273 288
   margin: 50rpx 0 0 40rpx;
274 289
   font-size: 28rpx;
275 290
 }
276 291
 .text05{
277
-  margin: 40rpx 0 0 40rpx;
292
+  margin: 10rpx 0 0 40rpx;
278 293
 }
279 294
 .text06{
280 295
   margin: 20rpx 0 0 40rpx;
@@ -287,13 +302,13 @@
287 302
 }
288 303
 .panelMenu1110{
289 304
   width:100%;
290
-  margin: 30rpx 0 -20rpx 20rpx;
305
+  margin: 30rpx 0 -20rpx 0;
291 306
   white-space: nowrap;
292 307
 }
293 308
 .panelMenu1111{
294 309
   width:1008rpx;
295 310
   height:260rpx;
296
-  margin-left: 20rpx;
311
+  margin-left: 30rpx;
297 312
   flex-wrap: wrap;
298 313
   justify-content: flex-start;
299 314
   align-items: flex-start;
@@ -301,6 +316,15 @@
301 316
 .panelMenu11110{
302 317
   height:166rpx;
303 318
 }
319
+.panelMenu112{
320
+  width: 940rpx;
321
+  height: 320rpx;
322
+  margin:0 30rpx 0 30rpx ;
323
+  flex-direction: column;
324
+  flex-wrap: wrap;
325
+  align-items: flex-start;
326
+  justify-content: flex-start;
327
+}
304 328
 
305 329
 .btn{
306 330
   margin: 0 20rpx 20rpx 0;
@@ -321,6 +345,8 @@
321 345
   border-radius: 20rpx;
322 346
   margin: 60rpx 0;
323 347
   font-size: 36rpx;
348
+  position: fixed;
349
+  bottom:0;
324 350
 }
325 351
 .btn4{
326 352
   width: 332rpx;
@@ -328,6 +354,17 @@
328 354
   margin: 0 20rpx 0 0;
329 355
   font-size: 24rpx;
330 356
 }
357
+.btn5{
358
+  width: 284rpx;
359
+  height:126rpx;
360
+  margin: 0 0 20rpx 0;
361
+  font-size: 24rpx;
362
+  background: #1E1E1E;
363
+  border: 6rpx solid #303030;
364
+  box-shadow: 0 6rpx 0 0 rgba(0,0,0,0.20);
365
+  border-radius: 20rpx;
366
+  color:#C1E1C1;
367
+}
331 368
 
332 369
 .btnSelected{
333 370
   background: #0D4433;
@@ -336,6 +373,13 @@
336 373
   color: #C1E1C1;
337 374
 }
338 375
 
376
+.btn5Selected{
377
+  background: #0D4433;
378
+  border: 6rpx solid #C1E1C1;
379
+  box-shadow: 0 6rpx 0 0 rgba(0,0,0,0.10);
380
+  color: #C1E1C1;
381
+}
382
+
339 383
 .btn41{
340 384
   margin: 0 20rpx 0 0;
341 385
   font-size: 28rpx;

+ 66 - 0
pages/test/test.js

@@ -0,0 +1,66 @@
1
+// pages/test/test.js
2
+Page({
3
+
4
+  /**
5
+   * 页面的初始数据
6
+   */
7
+  data: {
8
+
9
+  },
10
+
11
+  /**
12
+   * 生命周期函数--监听页面加载
13
+   */
14
+  onLoad(options) {
15
+
16
+  },
17
+
18
+  /**
19
+   * 生命周期函数--监听页面初次渲染完成
20
+   */
21
+  onReady() {
22
+
23
+  },
24
+
25
+  /**
26
+   * 生命周期函数--监听页面显示
27
+   */
28
+  onShow() {
29
+
30
+  },
31
+
32
+  /**
33
+   * 生命周期函数--监听页面隐藏
34
+   */
35
+  onHide() {
36
+
37
+  },
38
+
39
+  /**
40
+   * 生命周期函数--监听页面卸载
41
+   */
42
+  onUnload() {
43
+
44
+  },
45
+
46
+  /**
47
+   * 页面相关事件处理函数--监听用户下拉动作
48
+   */
49
+  onPullDownRefresh() {
50
+
51
+  },
52
+
53
+  /**
54
+   * 页面上拉触底事件的处理函数
55
+   */
56
+  onReachBottom() {
57
+
58
+  },
59
+
60
+  /**
61
+   * 用户点击右上角分享
62
+   */
63
+  onShareAppMessage() {
64
+
65
+  }
66
+})

+ 3 - 0
pages/test/test.json

@@ -0,0 +1,3 @@
1
+{
2
+  "usingComponents": {}
3
+}

+ 4 - 0
pages/test/test.wxml

@@ -0,0 +1,4 @@
1
+<!--pages/test/test.wxml-->
2
+<view class="frosted-glass">
3
+  <image src="../images/pic_07.png" class="pic_07"></image>
4
+</view>

+ 31 - 0
pages/test/test.wxss

@@ -0,0 +1,31 @@
1
+/* pages/test/test.wxss */
2
+
3
+.pic_07{
4
+  width: 600rpx;
5
+  height:480rpx;
6
+}
7
+
8
+/* 添加毛玻璃效果容器样式 */
9
+.frosted-glass {
10
+  position: relative;
11
+  width: 600rpx;
12
+  height: 480rpx;
13
+  overflow: hidden;
14
+}
15
+.frosted-glass::before {
16
+  content: "";
17
+  position: absolute;
18
+  top: 0;
19
+  left: 0;
20
+  right: 0;
21
+  bottom: 0;
22
+  background-color: rgba(255, 255, 255, 0.2); /* 半透明白色背景 */
23
+  filter: blur(30px); /* 适度模糊,产生毛玻璃感 */
24
+  z-index: -1;
25
+}
26
+.frosted-glass image {
27
+  position: relative;
28
+  z-index: 1;
29
+  width: 100%;
30
+  height: 100%;
31
+}

+ 15 - 2
project.private.config.json

@@ -1,6 +1,6 @@
1 1
 {
2 2
   "description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html",
3
-  "projectname": "english_learned_master",
3
+  "projectname": "语境背单词",
4 4
   "setting": {
5 5
     "compileHotReLoad": true,
6 6
     "urlCheck": false,
@@ -18,5 +18,18 @@
18 18
     "checkInvalidKey": true,
19 19
     "ignoreDevUnusedFiles": true
20 20
   },
21
-  "libVersion": "2.21.4"
21
+  "libVersion": "3.8.11",
22
+  "condition": {
23
+    "miniprogram": {
24
+      "list": [
25
+        {
26
+          "name": "秒过跳转",
27
+          "pathName": "pages/index/index",
28
+          "query": "goto=selectword&Words=notion,pronounce,arbitrary,flourish,rack,sponge,tap,distinct,aggravate,authorize,designate,diffuse,discrete,discrepancy,distil,drastic,elapse,entity,epoch,exempt,exemplify,explicit,exposition,intact,intrigue,irrigation,irritate,jerk,necessitate,negligible,nickel,nominal,norm,notation,notorious,revise,stoop,thrust,adverse,give,off,cavity,ceramic,cereal,crow,cumulative,deviate,embed,engagement,enlighten,installment",
29
+          "scene": null,
30
+          "launchMode": "default"
31
+        }
32
+      ]
33
+    }
34
+  }
22 35
 }

+ 4 - 1
utils/main.js

@@ -190,8 +190,11 @@ function checkGenerating(){
190 190
             });
191 191
           }
192 192
       }
193
-      if (time > 120)
193
+      if (time > 60){
194
+        app.globalData.Generating=false;
195
+        app.globalData.GeneratingStart=false;
194 196
         clearInterval(intervalGenerate);
197
+      }
195 198
 
196 199
     },1000);
197 200
   }

+ 7 - 0
utils/util.js

@@ -498,6 +498,13 @@ function initMonthCalendar(dates, line = 6,isNull=true) {
498 498
    return n;
499 499
 }
500 500
 
501
+/**
502
+ * 过滤数组中单词的特殊字符
503
+ * @param {Array} words - 需要过滤的单词数组
504
+ * @returns {Array} 返回处理后的数组,只包含字母、单引号、连字符和空格
505
+ * @example
506
+ * filterWordsWithSpecialChars(["hello!", "world@123"]) // 返回 ["hello", "world"]
507
+ */
501 508
 function filterWordsWithSpecialChars(words) {
502 509
   if (!Array.isArray(words)) {
503 510
     return [];