feat:下载历史修改

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