{"repo":"Eyozy/duodash","free":true,"listed":false,"github":"https://github.com/Eyozy/duodash","clone":"git clone https://github.com/Eyozy/duodash.git","description":"Duolingo 学习数据仪表盘，直观展示你的 XP 趋势、连胜记录和成就","language":"TypeScript","stars":40,"topics":["duolingo","astro","dashboard"],"license":"MIT","category":"docs-static-sites","readme_excerpt":"DuoDash Duolingo 学习数据仪表盘，直观展示你的 XP 趋势、连胜记录、成就进度，并提供 AI 学习点评和分享卡片功能。 特别鸣谢 ：感谢 小众软件 的文章推荐。 功能特性 - 今日概览 ：显示今日 XP、课程数、连胜天数和学习分钟数 - 趋势图表 ：最近 7 天 XP 和学习时长面积图，显示周期内总量汇总 - 年度热力图 ：全年学习热力图，支持年份切换；宽屏显示全年，窄屏自动切换为上下半年视图 - 成就系统 ：20 个徽章，覆盖连胜、单日 XP、累计天数、总 XP 四个维度 - 课程管理 ：展示所有学习中的语言课程及 XP 分布 - AI 点评 ：基于学习数据调用 AI 生成个性化点评，支持多个服务商 - 分享卡片 ：生成连胜成就、经验突破、本周报告三种卡片 - 本地缓存 ：命中缓存时立即渲染，后台静默刷新；跨天后自动失效 - 响应式 + Gzip ：适配桌面、平板、移动端；服务端中间件自动压缩 API 响应 项目结构 环境要求 - Node.js 18+ - npm 或 pnpm 快速开始 安装 配置 编辑 .env.local ： 运行 未配置账号时，首页会显示引导界面，点击「预览演示数据」可直接体验完整功能。 环境变量 变量名 必填 说明 :--- :--: :--- DUOLINGO USERNAME ✅ Duolingo 用户名 DUOLINGO JWT ✅ Duolingo JWT Token AI PROVIDER ✅ AI 服务商（见下方支持列表） AI MODEL ✅ AI 模型名称 API SECRET TOKEN 可选 API 访问控制令牌，不设置则无鉴权 DEEPSEEK API KEY 可选 deepseek OPENROUTER API KEY 可选 openrouter SILICONFLOW API KEY 可选 siliconflow MOONSHOT API KEY 可选 moonshot ZENMUX API KEY 可选 zenmux CUSTOM API KEY 可选 custom AI BASE URL 可选 仅 custom 模式需要 API 访问控制 设置 API SECRET TOKEN 后，客户端请求必须携带该 Token： 未携带 Token 时返回 {\"error\":\"Unauthorized\"} 。 获取 JWT Token 1. 登录 Duolingo 官网 2. 按 F12 打开开发者工具 → 控制台，执行： 3. 将输出值填入 .env.local 的 DUOLINGO JWT 字段 JWT Token 会定期过期，API 返回 401 时需重新获取。 部署 项目会自动检测部署环境：存在 NETLIFY 环境变量时使用 Netlify adapter，否则使用 Vercel adapter，同一套代码无需修改即可部署到两个平台。 Vercel 1. Fork 项目到 GitHub 2. 登录 Vercel → 导入仓库 3. 配置环境变量 → 部署 Netlify 1. 登录 Netlify → 导入 GitHub 仓库 2. Build command: npm run build ，Publish directory: dist 3. 配置环境变量 → 部署 数据来源 DuoDash 通过以下 Duolingo 非官方接口获取数据： 接口 用途 --- --- GET /2017-06-30/users?username={username} 解析用户 ID GE","default_branch":null,"files":null,"tree":[],"storefront":"/r/Eyozy","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/Eyozy/duodash/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}