html无法直接发放积分或徽章,必须通过后端写入数据库并由前端调用接口触发;前端需校验接口成功响应后才更新ui,禁用dom属性或meta标签存储可信数据,徽章优先使用内联svg。

HTML里没法直接发积分或徽章
浏览器不执行奖励逻辑,HTML只是静态结构。所谓“发放”必须靠后端写入数据库、前端调用接口触发,或者用 JavaScript 模拟展示(但不真实生效)。常见错误是把 <span>+10 积分</span> 当成已发放——这只是文字,服务器根本不知道发生了什么。
前端怎么安全地提示“任务已完成”
用户点击后,应先确认后端返回成功响应,再更新 UI。不要仅靠按钮禁用或文字变色来“假装完成”。
- 用
fetch调用类似/api/tasks/complete?id=123的接口,检查响应状态码和data.success === true - 成功后才显示
<div class="reward-badge">✅ 已获 50 积分</div>,并可加个data-earned="50"供后续统计 - 避免在 URL 里拼接敏感参数,比如
?reward=50&user_id=xxx—— 这容易被篡改
为什么不能用 或自定义属性存积分
<meta name="points" content="100"> 或 <div data-points="100"> 看起来方便,但完全不可信。用户按 F12 就能改,刷新就丢,且无法跨设备同步。这类标记只适合做临时渲染参考,绝不能作为数据源。
<ul>
<li>真实积分必须存在服务端,比如 PostgreSQL 的 <code>users.points 字段或 Redis 的 user:789:score
/api/users/me 获取最新值,而不是读 DOMlocalStorage 缓存,但必须带服务端校验机制(比如每次上线后比对并修正)徽章图标用图片还是 CSS 实现
小徽章优先用 SVG 内联或字体图标(如 <i class="icon-badge"></i>),别用 PNG。SVG 清晰、可缩放、体积小;PNG 在高 DPI 屏幕上会模糊,且每个徽章都要 HTTP 请求。
- 内联 SVG 示例:
<svg class="badge" viewbox="0 0 24 24"><path d="M12..."></path></svg> - 避免用背景图方式实现徽章,否则无法选中、无障碍支持差、打印时可能丢失
- 如果徽章有动态状态(如“本周活跃”),需后端返回对应 class 名,比如
badge-active-week,再由 CSS 控制样式











