feat:下载历史修改
This commit is contained in:
@@ -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
@@ -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 @@
|
|||||||
```
|
```
|
||||||
|
|
||||||
理由:
|
理由:
|
||||||
|
|
||||||
- 「宝宝」是家长口语搜索高频词,真实搜索行为更接近「宝宝练习纸」「宝宝数学题」
|
- 「宝宝」是家长口语搜索高频词,真实搜索行为更接近「宝宝练习纸」「宝宝数学题」
|
||||||
- 「打印」放最后也有命中可能(微信搜索会分词匹配)
|
- 「打印」放最后也有命中可能(微信搜索会分词匹配)
|
||||||
- 偏口语化,和「涂鸦丫」的童趣调性一致
|
- 偏口语化,和「涂鸦丫」的童趣调性一致
|
||||||
|
|||||||
@@ -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',
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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 });
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user