From facb569598051bbb517b826b4f5b3226b70d17a8 Mon Sep 17 00:00:00 2001 From: R524809 Date: Mon, 25 May 2026 18:32:18 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E4=B8=8B=E8=BD=BD=E5=8E=86=E5=8F=B2?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cloudfunctions/userDownloadLogs/index.js | 9 +++-- docs/应用起名.md | 43 ++++++++++++++---------- miniprogram/config/config.ts | 8 ++--- miniprogram/pages/favorites/favorites.ts | 7 ++-- miniprogram/utils/downloadLogs.ts | 7 ++-- 5 files changed, 45 insertions(+), 29 deletions(-) diff --git a/cloudfunctions/userDownloadLogs/index.js b/cloudfunctions/userDownloadLogs/index.js index e93a273..2d24caf 100644 --- a/cloudfunctions/userDownloadLogs/index.js +++ b/cloudfunctions/userDownloadLogs/index.js @@ -62,9 +62,12 @@ async function handleAdd(userId, event) { return { code: 0, data: { _id, ...record } }; } +const MAX_LIST_PAGE_SIZE = 30; + async function handleList(userId, event) { - const { page = 1, pageSize = 20 } = event; - const skip = (page - 1) * pageSize; + const { page = 1, pageSize = MAX_LIST_PAGE_SIZE } = event; + const limit = Math.min(Math.max(1, Number(pageSize) || 1), MAX_LIST_PAGE_SIZE); + const skip = (page - 1) * limit; const collection = db.collection('download_logs'); @@ -72,7 +75,7 @@ async function handleList(userId, event) { .where({ userId }) .orderBy('createdAt', 'desc') .skip(skip) - .limit(pageSize) + .limit(limit) .get(); if (logs.length === 0) { diff --git a/docs/应用起名.md b/docs/应用起名.md index 0fddcea..ced976e 100644 --- a/docs/应用起名.md +++ b/docs/应用起名.md @@ -25,6 +25,8 @@ ## 我的建议 +涂鸦丫|儿童打印练习纸 + 优先考虑「涂鸦丫-幼儿打印练习纸」或「涂鸦丫-儿童打印学习卡」。理由: 1. 「幼儿/儿童」比「育儿」更精准地指向你的用户群体(家长为孩子找内容) @@ -41,15 +43,15 @@ 回顾整个代码库和产品文档,v3.0 的产品已经远远超出了最初「数感识字」的范畴: -| 模块 | 当前状态 | -|------|----------| -| 数学启蒙 | 26 种题型(数字认知 → 凑十破十 → 九九乘法) | -| 专注力 | 13 种题型(图形配对、找规律、格子仿画等) | -| 中文识字 | 涂色识字卡 + 自定义字卡生成 | -| 中文练字 | 田字格笔顺描红(含 SVG 笔画数据) | -| 拼音 | 拼音每日一练、描红与默写(v3.0 新增) | -| 英语 | 字母描红(letter tracing)(v3.0 新增) | -| 每日打卡 | 汉字每日打卡、每日练习模块(v3.0 新增) | +| 模块 | 当前状态 | +| -------- | -------------------------------------------------- | +| 数学启蒙 | 26 种题型(数字认知 → 凑十破十 → 九九乘法) | +| 专注力 | 13 种题型(图形配对、找规律、格子仿画等) | +| 中文识字 | 涂色识字卡 + 自定义字卡生成 | +| 中文练字 | 田字格笔顺描红(含 SVG 笔画数据) | +| 拼音 | 拼音每日一练、描红与默写(v3.0 新增) | +| 英语 | 字母描红(letter tracing)(v3.0 新增) | +| 每日打卡 | 汉字每日打卡、每日练习模块(v3.0 新增) | | 分龄体系 | 3-4/4-5/5-6/6-7/7-8 五段分龄,含能力目标和学习路线 | **品类已经从「数学为主」扩展到「全科早教打印平台」。** 原名「数感识字幼儿专注学习卡」不仅堆砌关键词、读起来像 SEO 标题,而且已经完全无法代表产品实际覆盖的品类了。 @@ -69,12 +71,14 @@ ### 关于「涂鸦丫」这个品牌名 优势: + - 谐音双关:涂鸦 = doodle + 丫 ≈ 鸭,刚好呼应小黄鸭 IP 形象 - 「丫」在中文里有「小孩子」的亲切感(小丫、丫头) - 三个字,不长,有节奏感 - 在同类小程序中辨识度高——不会和「XX 练习纸」「XX 启蒙」混淆 劣势: + - 「涂鸦」第一反应是乱涂乱画,和家长想要的「学习」「练习」调性有偏差 - 没有任何品类关键词,自己就是零搜索流量的孤岛 - 「丫」字在部分手机上输入法不友好 @@ -85,15 +89,15 @@ 后缀的候选词,按微信搜索价值排序: -| 后缀关键词 | 搜索量感 | 精准度 | 竞品密度 | 评价 | -|-----------|---------|--------|---------|------| -| 幼儿练习纸 | 高 | 很高 | 中 | 最直接描述产品形态 | -| 儿童打印练习 | 高 | 高 | 低 | 「打印」是核心差异点 | -| 早教打印 | 中 | 高 | 低 | 简洁,但「早教」覆盖偏宽 | -| 启蒙练习纸 | 中 | 中 | 中 | 「启蒙」覆盖了 3-8 岁 | -| 学习卡 | 低 | 低 | 高 | 偏窄,暗示卡片而非 A4 纸 | -| 打印资料 | 中 | 中 | 中 | 「资料」偏正式,且之前已被否定 | -| 全科启蒙 | 低 | 中 | 低 | 能体现品类广度,但搜索习惯弱 | +| 后缀关键词 | 搜索量感 | 精准度 | 竞品密度 | 评价 | +| ------------ | -------- | ------ | -------- | ------------------------------ | +| 幼儿练习纸 | 高 | 很高 | 中 | 最直接描述产品形态 | +| 儿童打印练习 | 高 | 高 | 低 | 「打印」是核心差异点 | +| 早教打印 | 中 | 高 | 低 | 简洁,但「早教」覆盖偏宽 | +| 启蒙练习纸 | 中 | 中 | 中 | 「启蒙」覆盖了 3-8 岁 | +| 学习卡 | 低 | 低 | 高 | 偏窄,暗示卡片而非 A4 纸 | +| 打印资料 | 中 | 中 | 中 | 「资料」偏正式,且之前已被否定 | +| 全科启蒙 | 低 | 中 | 低 | 能体现品类广度,但搜索习惯弱 | ### 我的推荐方案 @@ -104,6 +108,7 @@ ``` 理由: + - 「幼儿打印练习纸」六个字精确描述了产品:给幼儿 + 可打印 + 练习纸形态 - 微信搜索「幼儿练习纸」「打印练习纸」都能命中 - 「打印」是核心壁垒——大部分竞品是纯展示或 PDF 下载,你的动态 Canvas 生成 + 打印是真正差异点 @@ -116,6 +121,7 @@ ``` 理由: + - 「全科」暗示了数学+语文+英语+专注力的品类广度,进来的用户不会觉得「只有数学」 - 「儿童」比「幼儿」覆盖更宽(3-8 岁边缘其实跨了幼儿和学龄) - 风险:「全科」偏概念性,家长搜索习惯不如「练习纸」强 @@ -127,6 +133,7 @@ ``` 理由: + - 「宝宝」是家长口语搜索高频词,真实搜索行为更接近「宝宝练习纸」「宝宝数学题」 - 「打印」放最后也有命中可能(微信搜索会分词匹配) - 偏口语化,和「涂鸦丫」的童趣调性一致 diff --git a/miniprogram/config/config.ts b/miniprogram/config/config.ts index f98406a..cab1a01 100644 --- a/miniprogram/config/config.ts +++ b/miniprogram/config/config.ts @@ -14,10 +14,10 @@ export const defaultPrintConfig: PrintConfig = { }; export const defaultShareConfig = { - // title: '涂鸦丫 - 一张会“教知识”的涂色卡', - title: '涂鸦丫 - 快来生成宝宝的专属学习卡', - path: '/pages/mathIndex/mathIndex', - imageUrl: 'https://cdn.joeyone.cn/doodle/share-img/index-share-v2.png', + // title: '涂鸦丫·儿童打印练习纸,数学练字拼音一键打印', + title: '涂鸦丫|轻松生成幼儿练习纸,幼小衔接宝妈推荐', + path: '/pages/home/home', + imageUrl: 'https://cdn.joeyone.cn/doodle/share-img/share-v3-800.png', }; /** diff --git a/miniprogram/pages/favorites/favorites.ts b/miniprogram/pages/favorites/favorites.ts index ccbef69..5ea2d13 100644 --- a/miniprogram/pages/favorites/favorites.ts +++ b/miniprogram/pages/favorites/favorites.ts @@ -1,6 +1,9 @@ import { NAV_INNER_PX } from '../../utils/navMetrics'; import { getFavoriteList, removeFavorite } from '../../utils/favorites'; -import { getDownloadLogs } from '../../utils/downloadLogs'; +import { + DOWNLOAD_HISTORY_MAX, + getDownloadLogs, +} from '../../utils/downloadLogs'; import type { FavoriteRecord } from '../../utils/favorites'; import type { DownloadLogRecord } from '../../utils/downloadLogs'; import { getCategoryName } from '../../core/data/categories'; @@ -225,7 +228,7 @@ Page({ async loadDownloads() { this.setData({ dlLoading: true }); try { - const records = await getDownloadLogs(); + const records = await getDownloadLogs(1, DOWNLOAD_HISTORY_MAX); this.setData({ downloadSections: groupDownloadsByDate(records) }); } finally { this.setData({ dlLoading: false }); diff --git a/miniprogram/utils/downloadLogs.ts b/miniprogram/utils/downloadLogs.ts index e62701e..131ef93 100644 --- a/miniprogram/utils/downloadLogs.ts +++ b/miniprogram/utils/downloadLogs.ts @@ -34,12 +34,15 @@ export async function addDownloadLog(worksheetId: string): Promise { } } +/** 收藏页下载历史展示条数上限 */ +export const DOWNLOAD_HISTORY_MAX = 30; + /** - * 获取下载历史 + * 获取下载历史(默认最近 30 条) */ export async function getDownloadLogs( page = 1, - pageSize = 20, + pageSize = DOWNLOAD_HISTORY_MAX, ): Promise { try { await getUser();