博客更新一览:从账号系统到 AI 绘图、图床与电竞赛程
博客更新一览
这篇不写某一个功能,而是把从博客接入后端账号系统那天开始、一直到现在的所有更新,完整地过一遍。
在这之前,博客只是个静态页面:文章是提前生成好的 HTML,没有登录,也没有任何能"动"的东西。转折点是给后端接上了账号系统——从那天起,博客才真正变成一个有用户、有数据、有交互的站。下面按主题讲讲这一路加了什么。
一、账号系统:博客第一次有了「后端」
最早的一步,是把账号体系搭起来:
- 邮箱注册 / 登录:注册后要收邮件点链接验证,才算是真账号;
- 密码重置:忘了密码可以走邮件重置;
- 后台管理:站长能看用户、调积分、审核内容;
- 架构上,前端改成静态导出 + 浏览器直连后端:页面还是纯静态托管,登录态靠后端下发的会话 cookie。
账号一上来,紧接着就补了几个体验和安全上的坑:
- 首屏不再闪「登录/注册」:登录状态改成全站共享,还在
<head>里用内联脚本赶在首次绘制前把登录态摆好,已登录的人第一眼就是头像和昵称; - GitHub 一键登录 / 注册:走 OAuth,第一次用 GitHub 登录会自动建号(用你 GitHub 的主邮箱,已算验证过);
- 扫码登录:电脑上出一个二维码,用已经登录的手机 App 扫一下确认,电脑端直接登录,省得输密码;
- 登录设备管理:能看到自己在哪些设备登录过,随时踢掉可疑会话。
安全上也没偷懒:会话 token 只存哈希、登录失败限流、支付回调主动回查核实。
二、AI 绘图
后端接上 Stable Diffusion WebUI 之后,博客就有了自己的 AI 绘图:
- 文生图 / 图生图,参数(负面提示词、采样器、步数、CFG、种子)一个不少;
- 提示词模板:内置 60 多个预设,按 9 类筛选,还能展开收起;
- 生成历史:分页浏览,可下载、可预览,种子可复制可复现;
- 多台 SD 负载均衡:多台机器共享队列并行出图,后台逐台显示节点状态,还会按 GPU 机器分组,避免不同服务互相排队;
- 出图失败自动退分,不会白扣。
后来还加了 「新手模式」:以前画图得自己写英文提示词,现在你可以用中文描述画面(比如「雪地里奔跑的柴犬,水彩风」),后端先通过大模型把它翻译、扩写成英文提示词,再交给 Stable Diffusion。转换这一步不额外扣积分。
三、证件照与语音克隆
- 证件照:接入 HivisionIDPhotos,上传照片自动抠图、换底色,按常见证件照尺寸出图;
- 语音克隆(TTS):接入 IndexTTS2,文字转语音、还能上传自己的参考音频做声音克隆;
- 预置了 3 个音色,支持 mp3/mp4 等参考音频(非 wav 会自动转 wav),单次上限 300 字;
- 出图和语音共用一套任务队列,排队时会显示预计时间。
四、积分、充值与钱包
站内所有要花算力的功能——AI 绘图、证件照、语音克隆、AI 中转——共用同一套积分:
- 注册赠送一笔初始积分;
- 爱发电充值:跳转支付、付完自动到账,支持 1 / 5 / 10 / 20 等多档位套餐;
- 兑换码:站长在后台批量生成,用户在充值页输入即到账;
- 钱包:余额、消费 / 收支记录(出图、证件照、充值、兑换、签到合并分页);
- 每日签到:每天点一次随机拿 1~20 积分(带自建图形验证码,防止脚本自动刷分);
- 任何一次生成失败都会自动退还积分;
- 另外还做了一套易支付兼容的支付网关(给需要接入支付的商户用)。
顺带说两个当时堵上的坑:充值到账要按实付金额而不是订单名义档位;兑换码表还因为和库里别的程序同名表撞车,改过名。
五、AI 中转站
给想要"用接口"的人做了一个 OpenAI 兼容的 AI 中转站:
- 用户自己生成 API Key,用标准
/v1接口调用; - 按 token 扣博客积分,支持流式响应;
- 上游可接 MiMo、NVIDIA 等,带模型白名单;
- 网页上还有试用对话和调用明细。
六、内容与互动
博客本身也一直在长:
- 文章目录、阅读进度条、上一篇 / 下一篇;
- 标签筛选 + 关键词搜索;
- 文章评论区(自建,登录后才能发言);
- 友链申请:访客在线填表,后台审核,通过后自动出现在友链页;
- 站内消息:站长在后台编辑,用户名旁的铃铛显示未读;
- RSS 订阅、分享预览图。
七、电竞赛程
地址:https://www.1zyq1.com/esports
平时看比赛,不想在好几个网站之间来回翻,于是把常见项目的赛程聚合到一页:
- 支持 6 个项目:CS2、无畏契约、魔兽争霸、火箭联盟、绝地求生、Apex 英雄;
- CS2 用的是完美世界电竞的数据,所以赛事名是官方中文,还能带上队伍、队标和比分;其余项目来自 Liquipedia;
- 按状态筛选:即将开始 / 进行中 / 已结束 / 全部;
- 按赛事分类:赛事按**权威度(奖金)**排序,大赛排在前面;当前状态下没有比赛的赛事会自动隐藏。
数据全部是后端定时缓存的(5 分钟一刷),用户请求只读缓存——既快又稳,也不会被上游限速。队标专门做了代理绕过防盗链,拉取失败还有冷却退避。
八、图床
做了一个自建的图床:上传的照片统一转成 WebP、存到 Cloudflare R2,可以复制直链或 Markdown;还能直接从 AI 绘图的出图里一键导入,不用重新上传。
九、我的世界服务器在线查询
加了一个 Minecraft 服务器查询:后端自己实现了 Server List Ping 协议(不依赖任何第三方接口),支持 SRV 记录解析,并做了 SSRF 防护和每 IP 限流。
十、移动端 App
除了网页,还做了一个 Expo / React Native 的手机 App,从最早的 WebView 一路改成了完全原生 UI(Expo Router + 底部四个 Tab):
- 博客文章、AI 绘图(含新手模式)、语音克隆、证件照、电竞赛程、图床、钱包 / 充值、账户与积分;
- 扫码登录、登录设备管理;
- 图标换成居中的圆形头像、启动屏换成深色,启动时不再闪一下白屏。
App 和网页是同一个账号体系,登录后积分、历史都是通的。
十一、一些看不见但重要的打磨
- SEO 与统计:全站标题模板 / canonical / OG / 结构化数据、
sitemap.xml、robots.txt、RSS,接入 Google Analytics、百度统计、Microsoft Clarity,做了 Bing 站长验证; - 体验细节:全站骨架屏、定制 404 / 错误页、统一顶部 Toast、
prefers-reduced-motion适配、图片懒加载; - 公开状态页
/status:聚合各服务在线状态,无鉴权,5 分钟自动刷新; - PWA:可以添加到手机主屏、离线也能打开(保守缓存);
- 性能:赛程 / 图床这类读多写少的接口走后端缓存;外部调用不阻塞事件循环;出图 / 语音队列按机器分组;
- 工程:迁移记录入口、前端单测、打包体积分析,后端接口补上
response_model并自动生成网页和 App 的 TypeScript 类型(省得两边手写漂移)。
以上就是从接入账号系统以来的全部更新。一路加下来,这个博客已经不只是"看文章"的地方,而是攒了一堆自己每天在用的工具。
接下来大概会继续打磨赛程页(比如直播入口、选手数据)和 App 的细节。有什么想看的功能,欢迎在文章下留言,或者来 友链 找我换链。