diff --git a/miniprogram/assets/fonts/iconfont.less b/miniprogram/assets/fonts/iconfont.less index 2728591..1bba16a 100644 --- a/miniprogram/assets/fonts/iconfont.less +++ b/miniprogram/assets/fonts/iconfont.less @@ -14,7 +14,7 @@ -moz-osx-font-smoothing: grayscale; } -.icon-success:before { +.toy-icon-success:before { content: "\e650"; } diff --git a/miniprogram/pages/copyBook/copyBook.less b/miniprogram/pages/copyBook/copyBook.less index 9b5a482..4dcfdc9 100644 --- a/miniprogram/pages/copyBook/copyBook.less +++ b/miniprogram/pages/copyBook/copyBook.less @@ -42,13 +42,16 @@ page { .word-input-box { display: flex; flex-direction: row; - justify-content: space-between; + justify-content: flex-start; + margin-bottom: 24rpx; } - .operation-box { + .action-buttons-box { display: flex; flex-direction: row; justify-content: space-between; + gap: 20rpx; + margin-bottom: 24rpx; } } diff --git a/miniprogram/pages/copyBook/copyBook.ts b/miniprogram/pages/copyBook/copyBook.ts index 226203d..f7a7b9c 100644 --- a/miniprogram/pages/copyBook/copyBook.ts +++ b/miniprogram/pages/copyBook/copyBook.ts @@ -17,8 +17,14 @@ Page({ maxCol: 0 as number, data: { - // 选中的汉字列表 + // 最终的汉字列表(合并输入和选择的汉字) words: [] as string[], + // 来自文本框输入的汉字(每次输入替换) + inputWords: [] as string[], + // 来自弹窗选择的汉字(追加) + selectedWords: [] as string[], + // 输入框的值(用于清空) + inputValue: '', showSelectWordPopup: false, showColorPopup: false, currentKey: 0, @@ -33,9 +39,12 @@ Page({ const hasShowPracticeDemo = wx.getStorageSync('hasShowPracticeDemo') || false; if (!hasShowPracticeDemo) { + const demoWords = ['好', '好', '学', '习', '天', '天', '向', '上']; this.setData( { - words: ['好', '好', '学', '习', '天', '天', '向', '上'], + words: demoWords, + inputWords: demoWords, + selectedWords: [], }, () => { wx.setStorageSync('hasShowPracticeDemo', true); @@ -86,47 +95,68 @@ Page({ } }, - // 输入组件回调 + // 输入组件回调(所见即所得:替换文本框输入的汉字) onConfirmInput(e: any) { const value: string = (e && e.detail && e.detail.value) || ''; const text = (value || '').trim(); - if (!text) return; + + // 如果文本框为空,清空输入汉字 + if (!text) { + const { selectedWords } = this.data as any; + const updatedWords = [...selectedWords]; + this.setData( + { + inputWords: [], + words: updatedWords, + }, + () => { + this.renderPracticeContent().catch(console.error); + }, + ); + return; + } if (!this.isChineseText(text)) { wx.showToast({ title: '请输入汉字', icon: 'none' }); return; } - const { words } = this.data as any; - - // 1. 解析新输入的汉字 - const newChars = this.splitToSingleChars(text); - if (newChars.length === 0) { + // 1. 解析输入的汉字 + const newInputChars = this.splitToSingleChars(text); + if (newInputChars.length === 0) { wx.showToast({ title: '请输入有效汉字', icon: 'none' }); return; } - // 2. 检查是否超过限制 - if (words.length + newChars.length > 11) { + const { selectedWords } = this.data as any; + + // 2. 检查是否超过限制(输入汉字 + 已选择的汉字) + if (newInputChars.length + selectedWords.length > 11) { wx.showToast({ - title: `最多只能添加 11 个字,当前已有 ${words.length} 个,输入了 ${newChars.length} 个`, + title: `最多只能添加 11 个字,当前已选择 ${selectedWords.length} 个,输入了 ${newInputChars.length} 个`, icon: 'none', duration: 3000, }); return; } - // 3. 直接追加新汉字 - const updatedWords = [...words, ...newChars]; + // 3. 替换输入汉字(不是追加),合并已选择的汉字 + const updatedWords = [...newInputChars, ...selectedWords]; // 4. 更新数据并提示 - this.setData({ words: updatedWords }, () => { - this.renderPracticeContent().catch(console.error); - }); + this.setData( + { + inputWords: newInputChars, + words: updatedWords, + }, + () => { + this.renderPracticeContent().catch(console.error); + }, + ); // 5. 显示添加结果提示 wx.showToast({ - title: `成功添加 ${newChars.length} 个汉字`, + title: `已更新输入汉字(${newInputChars.length} 个)`, icon: 'none', duration: 2000, }); @@ -140,30 +170,90 @@ Page({ this.setData({ showSelectWordPopup: false }); }, onChangeWord(e: any) { - const selectedWords = e.detail.selectedWords as string[]; - const newWords = [...this.data.words, ...selectedWords]; - this.setData({ words: newWords, showSelectWordPopup: false }, () => { - if (newWords && newWords.length > 0) { - this.renderPracticeContent().catch(console.error); - } - }); + const newSelectedWords = e.detail.selectedWords as string[]; + const { inputWords } = this.data as any; + + // 检查是否超过限制 + if (inputWords.length + newSelectedWords.length > 11) { + wx.showToast({ + title: `最多只能添加 11 个字,当前输入 ${inputWords.length} 个,选择了 ${newSelectedWords.length} 个`, + icon: 'none', + duration: 3000, + }); + return; + } + + // 合并输入汉字和选择的汉字(求并集) + const updatedWords = [...inputWords, ...newSelectedWords]; + this.setData( + { + selectedWords: newSelectedWords, + words: updatedWords, + showSelectWordPopup: false, + }, + () => { + if (updatedWords && updatedWords.length > 0) { + this.renderPracticeContent().catch(console.error); + } + }, + ); }, - // 删除 + // 删除(需要判断删除的是输入汉字还是选择的汉字) deleteWordCard(e: any) { const { key } = e.detail; - const { words } = this.data as any; - const next = words.filter((_: string, index: number) => index !== key); - this.setData({ words: next }, () => - this.renderPracticeContent().catch(console.error), - ); + const { inputWords, selectedWords } = this.data as any; + + // 判断删除的是输入汉字还是选择的汉字 + if (key < inputWords.length) { + // 删除的是输入汉字 + const nextInputWords = inputWords.filter( + (_: string, index: number) => index !== key, + ); + const nextWords = [...nextInputWords, ...selectedWords]; + this.setData( + { + inputWords: nextInputWords, + words: nextWords, + }, + () => this.renderPracticeContent().catch(console.error), + ); + } else { + // 删除的是选择的汉字 + const selectedIndex = key - inputWords.length; + const nextSelectedWords = selectedWords.filter( + (_: string, index: number) => index !== selectedIndex, + ); + const nextWords = [...inputWords, ...nextSelectedWords]; + this.setData( + { + selectedWords: nextSelectedWords, + words: nextWords, + }, + () => this.renderPracticeContent().catch(console.error), + ); + } }, - // 清空 + // 清空(清空所有来源的汉字:文本框、预览、弹窗选择) clearWords() { - this.setData({ words: [] }, () => - this.renderPracticeContent().catch(console.error), + // 清空所有汉字数据 + this.setData( + { + words: [], + inputWords: [], + selectedWords: [], + inputValue: '', // 清空输入框 + }, + () => { + this.renderPracticeContent().catch(console.error); + }, ); + + // 关闭弹窗(如果打开) + if (this.data.showSelectWordPopup) { + this.setData({ showSelectWordPopup: false }); + } }, // 随机生成(取基础分类,过滤为可用SVG字,最多11个) diff --git a/miniprogram/pages/copyBook/copyBook.wxml b/miniprogram/pages/copyBook/copyBook.wxml index 21bb595..4e3465e 100644 --- a/miniprogram/pages/copyBook/copyBook.wxml +++ b/miniprogram/pages/copyBook/copyBook.wxml @@ -2,13 +2,29 @@ 自定义练字贴 - + + + + + height="80rpx" + width="410rpx" + icon="success" + icon-class-prefix="van-icon"> 选择文字 + + 清空 + @@ -27,28 +43,9 @@ - - - 随机生成 - - - 清空 - - @@ -88,7 +85,7 @@ diff --git a/miniprogram/service/wordDrawService.ts b/miniprogram/service/wordDrawService.ts index 0987235..215f26a 100644 --- a/miniprogram/service/wordDrawService.ts +++ b/miniprogram/service/wordDrawService.ts @@ -21,13 +21,21 @@ function drawSvgPathCommands({ }: DrawSvgPathCommandsParams) { // console.log('drawSvgPathCommands 参数:', { pathD, offsetX, offsetY, scale }); - // 精度处理函数:避免浮点数精度问题 - const roundToPrecision = (num: number, precision: number = 2): number => { + // 精度处理函数:避免浮点数精度问题(提高到6位小数精度,确保高精度) + const roundToPrecision = (num: number, precision: number = 6): number => { return ( Math.round(num * Math.pow(10, precision)) / Math.pow(10, precision) ); }; + // 像素对齐函数:优化对齐策略,提升平滑度 + // 对于Fill+Stroke模式,使用更精细的对齐策略,避免过度对齐导致的锯齿 + // 对齐到0.5像素可以获得更好的平滑效果 + const alignToPixel = (num: number): number => { + // 对齐到0.5像素,而不是整数像素,可以获得更平滑的线条 + return Math.round(num * 2) / 2; + }; + // 新的解析方法:按命令片段解析 // 使用正则表达式匹配从字母开头到下一个字母(或结尾)的片段 const commandRegex = /([MLZ])([^MLZ]*?)(?=[MLZ]|$)/g; @@ -60,9 +68,14 @@ function drawSvgPathCommands({ const y = parseFloat(coordParts[1]); if (!isNaN(x) && !isNaN(y) && isFinite(x) && isFinite(y)) { - // 计算最终坐标并处理精度 - const finalX = roundToPrecision(offsetX + x * scale); - const finalY = roundToPrecision(offsetY + y * scale); + // 计算最终坐标:先进行高精度计算,再对齐到整数像素 + // 使用高精度计算确保路径的准确性,然后对齐到像素避免亚像素渲染 + const calculatedX = offsetX + x * scale; + const calculatedY = offsetY + y * scale; + const preciseX = roundToPrecision(calculatedX); + const preciseY = roundToPrecision(calculatedY); + const finalX = alignToPixel(preciseX); + const finalY = alignToPixel(preciseY); // console.log(`${cmd}: 绘制到 (${finalX}, ${finalY}) [原始: (${x}, ${y})]`); drawFunction(finalX, finalY); @@ -85,8 +98,8 @@ function drawSvgPathCommands({ L: (coords) => parseAndDrawCoords(coords, 'L', (x, y) => ctx.lineTo(x, y)), Z: () => { - // console.log('Z: 闭合路径'); - // 注意:不要在这里调用 closePath(),因为 drawStrokes 中会统一处理 + // 关键修复:处理Z命令,闭合路径 + ctx.closePath(); }, }; @@ -124,21 +137,40 @@ function drawStrokes({ offsetY, size, uptoInclusive, - fillStyle, - strokeStyle, - lineWidth, + fillStyle, // 填充颜色,用于 Fill + Stroke 模式 + strokeStyle, // 描边颜色,用于绘制笔画 + lineWidth, // 线条宽度,控制笔画粗细 }: DrawStrokesParams) { + // 设置 Canvas 绘制质量(关键优化:提升线条流畅度) + ctx.imageSmoothingEnabled = true; + ctx.imageSmoothingQuality = 'high'; // 高质量平滑 + + // 设置路径绘制属性(关键:这些设置直接影响笔画粗细和流畅度) + // 注意:不使用 save/restore,与测试页面保持一致,避免状态管理问题 + ctx.lineCap = 'round'; // 圆角端点,使笔画末端更自然 + ctx.lineJoin = 'round'; // 圆角连接,使转折处更平滑 + ctx.miterLimit = 10; // 斜接限制 + + // 优化渲染策略:使用 Fill + Stroke 模式 + // 先 fill 填充内部,再 stroke 描边,stroke 宽度略小,避免双重渲染导致的毛糙 + // 这样可以获得自然的笔画粗细,同时保持流畅度 + // 模板中使用 54x54 的视窗尺寸 const viewBoxSize = 54; // 添加内边距:在田字格四周预留空间,避免笔画贴边 const padding = size * 0.1; // 内边距为田字格大小的10% const contentSize = size - padding * 2; // 实际绘制区域大小 - const contentScale = contentSize / viewBoxSize; // 调整后的缩放比例 + + // 优化缩放比例:使用更精确的缩放,不进行四舍五入,保持原始精度 + const contentScale = contentSize / viewBoxSize; - // 计算内容区域的起始位置(居中) - const contentOffsetX = offsetX + padding; - const contentOffsetY = offsetY + padding; + // 计算内容区域的起始位置(居中),优化对齐策略提升平滑度 + const rawOffsetX = offsetX + padding; + const rawOffsetY = offsetY + padding; + // 对齐到0.5像素,而不是整数像素,可以获得更平滑的渲染效果 + const contentOffsetX = Math.round(rawOffsetX * 2) / 2; + const contentOffsetY = Math.round(rawOffsetY * 2) / 2; // console.log('drawStrokes 参数:', { // strokesCount: strokes.length, @@ -160,6 +192,10 @@ function drawStrokes({ for (let s = 0; s <= uptoInclusive && s < strokes.length; s++) { // console.log(`绘制第 ${s} 个笔画:`, strokes[s]); ctx.beginPath(); + + // 记录路径是否包含Z命令(已闭合) + const hasClosePath = strokes[s].includes('Z'); + drawSvgPathCommands({ ctx, pathD: strokes[s], @@ -167,13 +203,27 @@ function drawStrokes({ offsetY: contentOffsetY, scale: contentScale, }); + + // 优化渲染策略:使用 Fill + Stroke 模式 + // 先 fill 填充内部,再 stroke 描边,stroke 宽度略小,避免双重渲染导致的毛糙 + // 如果路径没有Z命令,手动闭合(fill需要闭合路径) + if (!hasClosePath) { + ctx.closePath(); + } + + // 1. 先填充内部 ctx.fillStyle = fillStyle; - ctx.strokeStyle = strokeStyle; - ctx.lineWidth = lineWidth; ctx.fill(); + + // 2. 再描边(stroke宽度设为fill视觉宽度的70%,避免明显的双重渲染) + // 与测试页面保持一致:使用相同的stroke宽度计算方式 + ctx.strokeStyle = strokeStyle; + const strokeWidth = Math.max(1.5, lineWidth * 0.7); + ctx.lineWidth = strokeWidth; ctx.stroke(); - ctx.closePath(); } + + // 注意:不使用 restore,与测试页面保持一致 } interface DrawTianZiGridParams { @@ -190,15 +240,15 @@ function drawTianZiGrid({ x, y, size, - lineColor = '#e0e0e0', - boldColor = '#cccccc', + lineColor = '#a8d5a8', // 浅绿色(中线) + boldColor = '#7fb069', // 中等绿色(外框) }: DrawTianZiGridParams) { - // 外框(逻辑像素) + // 外框(逻辑像素)- 使用中等绿色,清晰可见 ctx.strokeStyle = boldColor; ctx.lineWidth = 1; // 2/3≈1,逻辑像素 ctx.strokeRect(x - size / 2, y - size / 2, size, size); - // 中线(逻辑像素) + // 中线(逻辑像素)- 使用浅绿色,柔和护眼 ctx.strokeStyle = lineColor; ctx.lineWidth = 1; // 逻辑像素 ctx.beginPath(); @@ -211,8 +261,8 @@ function drawTianZiGrid({ ctx.stroke(); ctx.closePath(); - // 对角线(淡,逻辑像素) - ctx.strokeStyle = '#eeeeee'; + // 对角线(淡绿色,逻辑像素)- 使用很淡的绿色,提供辅助参考线 + ctx.strokeStyle = '#d4f0d4'; // 很淡的绿色 ctx.lineWidth = 1; ctx.beginPath(); ctx.moveTo(x - size / 2, y - size / 2); @@ -519,7 +569,8 @@ class WordDrawService extends BaseDrawService { // console.log(`预览格 [${rowIndex}, ${columnIndex}] 坐标: (${x}, ${y}), 笔画数: ${strokes.length}`); - // 绘制完整汉字(黑色,较粗) + // 绘制完整汉字(深灰色,Fill + Stroke模式) + // 参考一般练字贴:预览字使用深灰色,不是纯黑色,更柔和护眼 drawStrokes({ ctx, strokes, @@ -527,9 +578,9 @@ class WordDrawService extends BaseDrawService { offsetY: y, size: cellSize, uptoInclusive: strokes.length - 1, - fillStyle: 'rgb(0,0,0)', // 黑色填充 - strokeStyle: 'rgb(0,0,0)', // 黑色描边 - lineWidth: 1, // 较粗的线条(4/3≈1,逻辑像素) + fillStyle: 'rgb(85,85,85)', // 深灰色填充(#555555),比#666666更深一点 + strokeStyle: 'rgb(85,85,85)', // 深灰色描边 + lineWidth: 0.6, // Fill + Stroke 模式,线条宽度调小一点(逻辑像素) }); } @@ -564,7 +615,8 @@ class WordDrawService extends BaseDrawService { // console.log(`练习格 [${rowIndex}, ${columnIndex}] 坐标: (${x}, ${y}), 笔画: ${strokeIndex + 1}/${strokes.length}`); - // 绘制到指定笔画的汉字(灰色,中等粗细) + // 绘制到指定笔画的汉字(浅灰色,Fill + Stroke模式) + // 参考一般练字贴:练习字使用浅灰色,便于临摹 drawStrokes({ ctx, strokes, @@ -572,14 +624,14 @@ class WordDrawService extends BaseDrawService { offsetY: y, size: cellSize, uptoInclusive: strokeIndex, - fillStyle: '#ccc', - strokeStyle: '#ccc', - lineWidth: 1, // 中等粗细(3/3=1,逻辑像素) + fillStyle: 'rgb(170,170,170)', // 浅灰色填充(#aaaaaa),参考练字贴颜色 + strokeStyle: 'rgb(170,170,170)', // 浅灰色描边 + lineWidth: 0.6, // Fill + Stroke 模式,线条宽度调小一点(逻辑像素) }); } // drawDivider 已在基类中实现,此方法保留以保持兼容 - drawDivider(linY?: number) { + drawDivider() { super.drawDivider(); } } diff --git a/project.private.config.json b/project.private.config.json index abe74d4..65b9ab5 100644 --- a/project.private.config.json +++ b/project.private.config.json @@ -1,253 +1,260 @@ { - "description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html", - "projectname": "doodle-mini", - "setting": { - "compileHotReLoad": false, - "urlCheck": true, - "coverView": false, - "lazyloadPlaceholderEnable": false, - "skylineRenderEnable": true, - "preloadBackgroundData": false, - "autoAudits": false, - "useApiHook": true, - "useApiHostProcess": true, - "showShadowRootInWxmlPanel": false, - "useStaticServer": false, - "useLanDebug": false, - "showES6CompileOption": false, - "checkInvalidKey": true, - "ignoreDevUnusedFiles": true, - "bigPackageSizeSupport": false - }, - "libVersion": "3.7.12", - "condition": { - "miniprogram": { - "list": [ - { - "name": "mathPages/multiplicationTable/multiplicationTable", - "pathName": "mathPages/multiplicationTable/multiplicationTable", - "query": "id=multiplication-table", - "scene": null, - "launchMode": "default" - }, - { - "name": "mathPages/calculationPractice/calculationPractice", - "pathName": "mathPages/calculationPractice/calculationPractice", - "query": "id=practice-addition", - "launchMode": "default", - "scene": null - }, - { - "name": "mathPages/oneDigitAddition/oneDigitAddition", - "pathName": "mathPages/oneDigitAddition/oneDigitAddition", - "query": "id=one-digit-addition", - "launchMode": "default", - "scene": null - }, - { - "name": "mathPages/borrowTen/borrowTen", - "pathName": "mathPages/borrowTen/borrowTen", - "query": "id=borrow-ten", - "launchMode": "default", - "scene": null - }, - { - "name": "mathPages/flatTen/flatTen", - "pathName": "mathPages/flatTen/flatTen", - "query": "id=flat-ten", - "launchMode": "default", - "scene": null - }, - { - "name": "mathPages/breakTen/breakTen", - "pathName": "mathPages/breakTen/breakTen", - "query": "id=break-ten", - "launchMode": "default", - "scene": null - }, - { - "name": "mathPages/makeTen/makeTen", - "pathName": "mathPages/makeTen/makeTen", - "query": "id=make-ten", - "launchMode": "default", - "scene": null - }, - { - "name": "focusPages/dotConnect/dotConnect", - "pathName": "focusPages/dotConnect/dotConnect", - "query": "id=dot-connect", - "launchMode": "default", - "scene": null - }, - { - "name": "mathPages/numberObjectMatch/numberObjectMatch", - "pathName": "mathPages/numberObjectMatch/numberObjectMatch", - "query": "id=number-object-match", - "launchMode": "default", - "scene": null - }, - { - "name": "focusPages/colorShapeMatch/colorShapeMatch", - "pathName": "focusPages/colorShapeMatch/colorShapeMatch", - "query": "id=color-shape-match", - "launchMode": "default", - "scene": null - }, - { - "name": "mathPages/numberSort/numberSort", - "pathName": "mathPages/numberSort/numberSort", - "query": "id=number-sort", - "launchMode": "default", - "scene": null - }, - { - "name": "focusPages/codeConnect/codeConnect", - "pathName": "focusPages/codeConnect/codeConnect", - "query": "id=code-connect", - "launchMode": "default", - "scene": null - }, - { - "name": "focusPages/gridReasoning/gridReasoning", - "pathName": "focusPages/gridReasoning/gridReasoning", - "query": "id=grid-reasoning", - "launchMode": "default", - "scene": null - }, - { - "name": "focusPages/lineRecognition/lineRecognition", - "pathName": "focusPages/lineRecognition/lineRecognition", - "query": "id=line-recognition", - "launchMode": "default", - "scene": null - }, - { - "name": "focusPages/matchConnect/matchConnect", - "pathName": "focusPages/matchConnect/matchConnect", - "query": "id=match-connect", - "launchMode": "default", - "scene": null - }, - { - "name": "focusPages/colorPattern/colorPattern", - "pathName": "focusPages/colorPattern/colorPattern", - "query": "id=color-pattern", - "launchMode": "default", - "scene": null - }, - { - "name": "focusPages/shapeSymbol/shapeSymbol", - "pathName": "focusPages/shapeSymbol/shapeSymbol", - "query": "id=shape-symbol", - "launchMode": "default", - "scene": null - }, - { - "name": "focusPages/positionColoring/positionColoring", - "pathName": "focusPages/positionColoring/positionColoring", - "query": "id=position-coloring", - "launchMode": "default", - "scene": null - }, - { - "name": "pages/focusIndex/focusIndex", - "pathName": "pages/focusIndex/focusIndex", - "query": "", - "launchMode": "default", - "scene": null - }, - { - "name": "focusPages/gridDrawing/gridDrawing", - "pathName": "focusPages/gridDrawing/gridDrawing", - "query": "id=grid-drawing", - "launchMode": "default", - "scene": null - }, - { - "name": "focusPages/shape/shape", - "pathName": "focusPages/shape/shape", - "query": "", - "launchMode": "default", - "scene": null - }, - { - "name": "pages/index/index", - "pathName": "pages/index/index", - "query": "", - "launchMode": "default", - "scene": null - }, - { - "name": "mathPages/numberDecompose/numberDecompose", - "pathName": "mathPages/numberDecompose/numberDecompose", - "query": "id=number-decompose&mode=with-image", - "launchMode": "default", - "scene": null - }, - { - "name": "mathPages/countingSelect/countingSelect", - "pathName": "mathPages/countingSelect/countingSelect", - "query": "id=counting-fill", - "launchMode": "default", - "scene": null - }, - { - "name": "mathPages/compare/compare", - "pathName": "mathPages/compare/compare", - "query": "id=compare", - "launchMode": "default", - "scene": null - }, - { - "name": "mathPages/missingNumber/missingNumber", - "pathName": "mathPages/missingNumber/missingNumber", - "query": "id=missing-number", - "launchMode": "default", - "scene": null - }, - { - "name": "mathPages/addition/addition", - "pathName": "mathPages/addition/addition", - "query": "id=addition-5", - "launchMode": "default", - "scene": null - }, - { - "name": "mathPages/countMatch/countMatch", - "pathName": "mathPages/countMatch/countMatch", - "query": "id=number-coloring", - "launchMode": "default", - "scene": null - }, - { - "name": "pages/mathIndex/mathIndex", - "pathName": "pages/mathIndex/mathIndex", - "query": "", - "launchMode": "default", - "scene": null - }, - { - "name": "mathPages/countMatch/countMatch", - "pathName": "mathPages/countMatch/countMatch", - "query": "id=counting-matching", - "launchMode": "default", - "scene": null - }, - { - "name": "mathPages/numberFind/numberFind", - "pathName": "mathPages/numberFind/numberFind", - "query": "id=number-write", - "launchMode": "default", - "scene": null - }, - { - "name": "pages/mathIndex/mathIndex", - "pathName": "pages/mathIndex/mathIndex", - "query": "", - "launchMode": "default", - "scene": null - } - ] + "description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html", + "projectname": "doodle-mini", + "setting": { + "compileHotReLoad": false, + "urlCheck": true, + "coverView": false, + "lazyloadPlaceholderEnable": false, + "skylineRenderEnable": true, + "preloadBackgroundData": false, + "autoAudits": false, + "useApiHook": true, + "useApiHostProcess": true, + "showShadowRootInWxmlPanel": false, + "useStaticServer": false, + "useLanDebug": false, + "showES6CompileOption": false, + "checkInvalidKey": true, + "ignoreDevUnusedFiles": true, + "bigPackageSizeSupport": false + }, + "libVersion": "3.7.12", + "condition": { + "miniprogram": { + "list": [ + { + "name": "pages/copyBook/copyBook", + "pathName": "pages/copyBook/copyBook", + "query": "", + "scene": null, + "launchMode": "default" + }, + { + "name": "mathPages/multiplicationTable/multiplicationTable", + "pathName": "mathPages/multiplicationTable/multiplicationTable", + "query": "id=multiplication-table", + "launchMode": "default", + "scene": null + }, + { + "name": "mathPages/calculationPractice/calculationPractice", + "pathName": "mathPages/calculationPractice/calculationPractice", + "query": "id=practice-addition", + "launchMode": "default", + "scene": null + }, + { + "name": "mathPages/oneDigitAddition/oneDigitAddition", + "pathName": "mathPages/oneDigitAddition/oneDigitAddition", + "query": "id=one-digit-addition", + "launchMode": "default", + "scene": null + }, + { + "name": "mathPages/borrowTen/borrowTen", + "pathName": "mathPages/borrowTen/borrowTen", + "query": "id=borrow-ten", + "launchMode": "default", + "scene": null + }, + { + "name": "mathPages/flatTen/flatTen", + "pathName": "mathPages/flatTen/flatTen", + "query": "id=flat-ten", + "launchMode": "default", + "scene": null + }, + { + "name": "mathPages/breakTen/breakTen", + "pathName": "mathPages/breakTen/breakTen", + "query": "id=break-ten", + "launchMode": "default", + "scene": null + }, + { + "name": "mathPages/makeTen/makeTen", + "pathName": "mathPages/makeTen/makeTen", + "query": "id=make-ten", + "launchMode": "default", + "scene": null + }, + { + "name": "focusPages/dotConnect/dotConnect", + "pathName": "focusPages/dotConnect/dotConnect", + "query": "id=dot-connect", + "launchMode": "default", + "scene": null + }, + { + "name": "mathPages/numberObjectMatch/numberObjectMatch", + "pathName": "mathPages/numberObjectMatch/numberObjectMatch", + "query": "id=number-object-match", + "launchMode": "default", + "scene": null + }, + { + "name": "focusPages/colorShapeMatch/colorShapeMatch", + "pathName": "focusPages/colorShapeMatch/colorShapeMatch", + "query": "id=color-shape-match", + "launchMode": "default", + "scene": null + }, + { + "name": "mathPages/numberSort/numberSort", + "pathName": "mathPages/numberSort/numberSort", + "query": "id=number-sort", + "launchMode": "default", + "scene": null + }, + { + "name": "focusPages/codeConnect/codeConnect", + "pathName": "focusPages/codeConnect/codeConnect", + "query": "id=code-connect", + "launchMode": "default", + "scene": null + }, + { + "name": "focusPages/gridReasoning/gridReasoning", + "pathName": "focusPages/gridReasoning/gridReasoning", + "query": "id=grid-reasoning", + "launchMode": "default", + "scene": null + }, + { + "name": "focusPages/lineRecognition/lineRecognition", + "pathName": "focusPages/lineRecognition/lineRecognition", + "query": "id=line-recognition", + "launchMode": "default", + "scene": null + }, + { + "name": "focusPages/matchConnect/matchConnect", + "pathName": "focusPages/matchConnect/matchConnect", + "query": "id=match-connect", + "launchMode": "default", + "scene": null + }, + { + "name": "focusPages/colorPattern/colorPattern", + "pathName": "focusPages/colorPattern/colorPattern", + "query": "id=color-pattern", + "launchMode": "default", + "scene": null + }, + { + "name": "focusPages/shapeSymbol/shapeSymbol", + "pathName": "focusPages/shapeSymbol/shapeSymbol", + "query": "id=shape-symbol", + "launchMode": "default", + "scene": null + }, + { + "name": "focusPages/positionColoring/positionColoring", + "pathName": "focusPages/positionColoring/positionColoring", + "query": "id=position-coloring", + "launchMode": "default", + "scene": null + }, + { + "name": "pages/focusIndex/focusIndex", + "pathName": "pages/focusIndex/focusIndex", + "query": "", + "launchMode": "default", + "scene": null + }, + { + "name": "focusPages/gridDrawing/gridDrawing", + "pathName": "focusPages/gridDrawing/gridDrawing", + "query": "id=grid-drawing", + "launchMode": "default", + "scene": null + }, + { + "name": "focusPages/shape/shape", + "pathName": "focusPages/shape/shape", + "query": "", + "launchMode": "default", + "scene": null + }, + { + "name": "pages/index/index", + "pathName": "pages/index/index", + "query": "", + "launchMode": "default", + "scene": null + }, + { + "name": "mathPages/numberDecompose/numberDecompose", + "pathName": "mathPages/numberDecompose/numberDecompose", + "query": "id=number-decompose&mode=with-image", + "launchMode": "default", + "scene": null + }, + { + "name": "mathPages/countingSelect/countingSelect", + "pathName": "mathPages/countingSelect/countingSelect", + "query": "id=counting-fill", + "launchMode": "default", + "scene": null + }, + { + "name": "mathPages/compare/compare", + "pathName": "mathPages/compare/compare", + "query": "id=compare", + "launchMode": "default", + "scene": null + }, + { + "name": "mathPages/missingNumber/missingNumber", + "pathName": "mathPages/missingNumber/missingNumber", + "query": "id=missing-number", + "launchMode": "default", + "scene": null + }, + { + "name": "mathPages/addition/addition", + "pathName": "mathPages/addition/addition", + "query": "id=addition-5", + "launchMode": "default", + "scene": null + }, + { + "name": "mathPages/countMatch/countMatch", + "pathName": "mathPages/countMatch/countMatch", + "query": "id=number-coloring", + "launchMode": "default", + "scene": null + }, + { + "name": "pages/mathIndex/mathIndex", + "pathName": "pages/mathIndex/mathIndex", + "query": "", + "launchMode": "default", + "scene": null + }, + { + "name": "mathPages/countMatch/countMatch", + "pathName": "mathPages/countMatch/countMatch", + "query": "id=counting-matching", + "launchMode": "default", + "scene": null + }, + { + "name": "mathPages/numberFind/numberFind", + "pathName": "mathPages/numberFind/numberFind", + "query": "id=number-write", + "launchMode": "default", + "scene": null + }, + { + "name": "pages/mathIndex/mathIndex", + "pathName": "pages/mathIndex/mathIndex", + "query": "", + "launchMode": "default", + "scene": null } + ] } + } } \ No newline at end of file