| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 2 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 2 个月前 |
BitFun MiniApp Market Web
这里是 MiniApp 市场独立网页的源码目录。生产地址是
https://market.openbitfun.com/miniapp/。
最短结论:修改这个目录里的网页,完成检查并提交 Git commit 后,按照 生产部署手册重建并重启
bitfun-miniapp-market容器。网页和 Rust 后端在同一个 Docker 镜像中, 不要单独把dist/上传到服务器。
给 AI Agent 的执行约束
- 先阅读仓库根目录的
AGENTS.md、本文件和 生产部署手册。 - 只修改任务要求涉及的文件;保留工作区里不属于本任务的改动。
/miniapp/是固定的 Vite base,/miniapp/api/v1是固定的 API 前缀。 修改它们会同时影响 Nginx、OAuth callback、桌面客户端和生产链接,不能 当作普通重命名处理。- 网页必须通过
src/api.ts访问同源 API,并保留 Cookie、CSRF 和统一错误 envelope 的行为。组件里不要直接拼另一个服务器地址。 - 这个站点是独立的小型产品界面,不得导入
src/web-ui的完整 locale 目录。用户可见文本要同时维护zh-CN、zh-TW、en-USfallback。 - 不要把 GitHub client secret、session secret、Cookie、token 或生产
.env写进源码、日志、截图或提交记录。 - 未完成本文件中的最小验证、没有明确 Git commit,或生产健康检查未通过 时,不得声称已经发布。
webSubmissionsEnabled=false时网页投稿必须是只读模式:隐藏新建、上传、 提交新版本和撤回操作,只保留“我的投稿”历史。不要仅靠隐藏按钮保护接口; 后端还会按认证来源拒绝 Web Cookie 投稿写请求。
源码地图
| 位置 | 作用 |
|---|---|
src/App.tsx |
目录、详情、受开关控制的投稿、只读“我的投稿”和管理员审核页面 |
src/api.ts |
/miniapp/api/v1 客户端、CSRF、登录和下载 URL |
src/types.ts |
网页使用的 API DTO |
src/MiniAppIcon.tsx |
将 MiniApp 元数据中的 Lucide 图标名安全解析为图标组件 |
src/GetBitfunCta.tsx |
目录页和详情页共用的「下载 BitFun 客户端」引流入口 |
src/links.ts |
官网与下载页的对外链接常量 |
src/i18n.ts |
zh-CN、zh-TW、en-US 文案与 fallback |
src/format.ts |
市场页面的日期和数字格式化 |
src/styles.css |
响应式布局与视觉样式 |
src/api.test.ts |
API 客户端契约测试 |
vite.config.ts |
/miniapp/ base、本地端口和 API proxy |
public/ |
网页静态资源;见下方"站点图标" |
dist/ |
本地构建产物;由构建生成,不手工修改、不单独部署 |
站点图标
public/favicon.svg 是唯一的图标源文件,画的是 BitFun 立方体标志的简化
等轴测版本(16px 下仍然可辨认)。favicon.ico、apple-touch-icon.png、
icon-192.png、icon-512.png 都是按同一份几何数据栅格化出来的产物:小尺寸
去掉了面与面之间的缝隙并放大立方体,否则 16px 下三个面会糊成一团。
改图标时先改 favicon.svg,再重新生成这几个 PNG/ICO,保证两者不会漂移。
index.html 里的 <link rel="icon"> 必须带 /miniapp/ 前缀——站点不在
域名根目录下,浏览器默认探测的 /favicon.ico 会被 Nginx 挡在 404。
BitFun 桌面端内嵌的原生市场 Scene 不在这里。它位于
src/web-ui/src/app/scenes/miniapps/,通过
src/apps/desktop/src/api/miniapp_market_api.rs 访问市场。
上架截图比例
投稿截图推荐 16:9,建议 1920×1080。
网页市场和 BitFun 桌面端的市场都用 aspect-ratio: 16 / 9 + object-fit: cover
渲染截图,所以非 16:9 的图会被居中裁剪,上下或左右被切掉:
| 位置 | 文件 |
|---|---|
| 网页卡片 | src/styles.css 的 .card-visual |
| 网页详情页 | src/styles.css 的 .detail-gallery |
| 桌面端卡片 | src/web-ui/src/app/scenes/miniapps/views/MiniAppMarketView.scss |
改动其中一处必须同步另外两处,否则同一张截图在两个界面里的裁剪结果会不一致。
给投稿方的要点:
- 第一张截图是列表卡片的封面,选最能说明用途的那张;
- 关键信息(标题、主图表、核心按钮)放在画面中部,避免贴边被裁掉;
- 后端会把超过 2560px 的边缩到 2560,所以 2560×1440 是有效上限, 再大只是浪费上传体积。
后端硬性校验在 src/crates/services/miniapp-market-service/src/package.rs
的 validate_screenshot:1–5 张,PNG/JPEG/WebP,单张 ≤ 5 MiB,单边 ≤ 16384px
且总像素 ≤ 40MP。它不校验宽高比——16:9 是显示契约,不是上传门槛。
市场图片端点保留无 query 的规范化原图,同时支持两个有版本号的 WebP 变体:
?variant=compact-v1(最大边 640px)和 ?variant=large-v1(最大边 1280px)。
列表卡片应使用 compact,详情页通过 srcset 在两者间选择;变体首次访问时由后端
生成并落盘,之后按 immutable 内容缓存。不要去掉版本号或给端点传任意尺寸,否则
会破坏缓存边界并放大服务端图片处理成本。
本地开发
首次开发先在仓库根目录安装依赖:
pnpm install
终端一启动本地 Rust 后端。默认数据会写到
var/miniapp-market/,默认配置只适合开发:
cargo run -p bitfun-miniapp-market-server
终端二启动 Vite:
pnpm run dev:miniapp-market
打开 http://127.0.0.1:1431/miniapp/。Vite 会把
/miniapp/api/* 代理到 http://127.0.0.1:9710。后端不在默认地址时:
MARKET_DEV_API=http://127.0.0.1:19710 pnpm run dev:miniapp-market
本地未配置 GitHub OAuth 时,浏览和无登录页面仍可开发,登录按钮会处于不可 用状态。不要为了本地调试复制生产 secret。
网页投稿默认关闭。只有在本地专门验证网页投稿旧流程时,才给本地 Rust 服务设置
MARKET_WEB_SUBMISSIONS_ENABLED=true;生产保持 false。桌面客户端使用
Bearer token 投稿,不受这个网页开关影响。
src/api.ts 和 SubmitPage 暂时保留未来可能重新启用的 Web 投稿实现;它们存在
不代表生产能力已开放。所有入口必须只根据后端 /config 返回的
webSubmissionsEnabled 显示,配置加载失败时按关闭处理。不要增加仅由前端常量、
URL 参数或本地存储绕过的开关。
修改后的最小验证
在仓库根目录运行:
pnpm run type-check:miniapp-market
pnpm run test:miniapp-market
pnpm run build:miniapp-market
如果修改了本地化文案或 fallback,再运行:
pnpm run i18n:contract:test
pnpm run i18n:audit
如果新增或修改颜色,再运行:
pnpm run theme:color-audit:all
行为改动至少人工检查:
/miniapp/目录可加载、搜索、排序和分页;/miniapp/apps/<slug>详情可打开;- 三种语言可切换,窄屏和宽屏没有明显溢出;
- API 失败会显示可理解的错误,不在控制台泄露凭据;
- 网页投稿关闭时看不到投稿/更新/撤回按钮,直接访问
/miniapp/submit会提示 改用 BitFun Desktop,“我的投稿”仍可查看; - 登录、桌面投稿或审核相关改动使用测试账号走完对应流程。
API 类型变更
网页 src/types.ts 不是独立的协议所有者。API DTO 或状态机变化需要同步检查:
src/crates/contracts/product-domains/src/miniapp/market.rssrc/crates/services/miniapp-market-service/src/miniapp-market-web/src/api.test.ts- 桌面市场客户端
列表响应必须保持 {items,nextCursor},错误必须保持
{error:{code,message,requestId,details?}}。兼容性不明确时先停止部署,
补齐契约测试后再继续。
发布
前端构建发生在
src/apps/miniapp-market-server/Dockerfile 的 web-builder 阶段,生成的
dist/ 会复制进后端运行镜像的 /app/web/。所以:
- 只改前端:仍然重建并重启同一个市场容器;
- 只改后端:仍然重建并重启同一个市场容器;
- 前后端一起改:只发布一个包含同一 Git commit 的镜像。
完整的备份、精确 commit 发布、健康检查和回滚命令见 生产部署手册。