# Sweet Bonanza — 柬埔寨文版（单次转盘 → USD 168 → 跳链接）

`dist/` 是要上传到服务器的整个网站。约 2.3 MB / 39 个文件。

---

## 一、上线步骤

1. 把 **`dist/` 里面的所有内容**（不是 dist 文件夹本身）上传到网站根目录。
2. 给 `data/` 目录权限 **755**（PHP 要能在里面写文件）。
3. 打开 `https://你的域名/admin/` —— 第一次会让你**自己设一个密码**，没有预置默认密码。
4. 设完自动进后台，把 link 换成你自己的，保存。

需要 PHP 7.4+，Namecheap / cPanel 这类共享主机默认就有，不用装任何东西。

> 忘了密码：删掉 `data/auth.json`，下次打开 `/admin/` 会重新让你设。

## 二、后台换链接

地址：`https://你的域名/admin/`

登录后一个输入框，粘贴新链接 → 保存。落地页的按钮**立刻**指向新地址，
不用重新上传任何文件、也不用清缓存（`link.php` 带 no-store 头）。

只接受 `http://` 或 `https://` 开头的完整地址。`javascript:` 这类会被拒绝
—— 这个链接最后会进落地页的 `href`，不挡就是个 XSS 口子。

连续输错 5 次密码会锁 5 分钟。

## 三、分包参数会自动带过去

访客地址栏上的 `?st=`、`s1`…`s5`、`p_id`、`pc` 这些参数，点按钮时会自动拼到
你设的链接后面。比如后台填 `https://offer.com/abc?src=x`，访客从
`落地页?st=STREAM7&s1=aa` 进来，最后跳的是：

```
https://offer.com/abc?src=x&st=STREAM7&s1=aa
```

所以后台填**干净的基础链接**就行，不用自己拼参数。

## 四、访客看到的流程

1. 落地页，转盘 + 柬文按钮「បង្វិល」（转）
2. 点一次 → 转 3.6 秒 → 葡萄飞出来 → 右上角面板显示 **168 USD**
3. 再过约 5 秒自动弹出领奖弹窗
4. 弹窗**没有任何输入框**，只有一个按钮「ទទួលយករង្វាន់ឥឡូវនេះ」（立即领取）
5. 点按钮 → 跳你在后台设的链接（带上分包参数）

只能转一次，转完按钮就锁了，再点页面没反应。

## 五、已经拿掉的东西

| 原版有 | 现在 |
|---|---|
| Google Tag Manager（GTM-MFB4T883）+ noscript iframe | 删 |
| `common/js/head.js`：aft 指纹采集、DataDome 反爬、GTM 注入 | 整个文件删 |
| `rps-helper` 隐藏字符串（凯撒位移的追踪路径） | 删 |
| `.redirectlink` 隐藏跳转锚点、`landingConfig.links` 里 tdsio / pingotoreg / netpuppgo 等一堆域名 | 删 |
| `common/js/form.js` 注册表单（手机/邮箱/密码，提交到 pin-up API） | 删，换成一个按钮 |
| Pin-up logo、黄色 header 底板、Pinup 品牌字体 | 删 |
| Google Fonts 外链 | 改成本地 Noto Sans Khmer |
| `/geo/` 查国家接口、语言下拉（9 种语言） | 删，全站固定柬文 |

**验证过：页面加载到点完按钮，浏览器发出的第三方请求数为 0。**
（`verify-kh.js` 里 `external reqs` 这一项，桌面和移动都是 0。）

## 六、文件说明

```
index.html        落地页（柬文）
app.js            转盘逻辑，替代原版 bundle.js
config.js         静态兜底链接（只在服务器没 PHP 时才用得上）
kh.css            柬文皮肤 + 布局覆盖
kh-fonts.css      本地 Noto Sans Khmer 字体声明
main.css          原版样式，一个字节没动（方便和 ../site/ 对比）
link.php          前台读当前链接的接口
data/links.json   链接存储
data/auth.json    后台密码哈希（第一次设密码时自动生成）
data/.htaccess    挡住直接访问 data/ 里的文件
admin/index.php   后台（首次设密码 / 登录 / 改链接）
admin/config.php  数据文件路径、密码与链接的读写函数
fonts/khmer/      本地 Noto Sans Khmer（全站唯一字体）
img/              图片
```

原版的 Pinup 品牌字体和只有旧弹窗/老虎机阶段才用到的图片都删了
（`fonts/src/`、各语言的 modal 标题图、banana/bomb 相关素材、popup 装饰图）。
`main.css` 里还留着指向这些文件的 `@font-face` 和 `body[data-lang=xx]` 规则，
但没有任何元素会用到它们，所以浏览器不会去请求 —— 14 个断点扫过，404 数为 0。

`README.md` 只是给你看的，上线后可以直接删掉。

## 七、想改文案 / 金额

- **奖金数字**：`index.html` 里搜 `168`（三处：飞出的数字、面板数字、弹窗金额）。
  货币单位在 `id="grape-currency"` 和弹窗的 `kh-modal__amount` 里。
- **柬文文案**：全部是 `index.html` 里的明文，直接改。
- **各段时间**：`app.js` 顶部 `SPIN_MS` / `GIF_IN_MS` / `GIF_NUM_MS` / `SETTLE_MS` / `MODAL_MS`。
  `MODAL_MS` 是转盘停下后隔多久弹窗，调小 = 更快弹。

改柬文的时候注意：别给柬文加 `letter-spacing`（会把字簇拆开），
行高别低于 1.5（下标辅音 coeng 会被裁掉）。

## 八、本地怎么测

```
php -S 127.0.0.1:8140 -t "C:\Users\User\Desktop\Landing-SweetsBonanza\dist"
```

然后开 http://127.0.0.1:8140/index.html 。

验收脚本在上一层目录：

| 脚本 | 检查什么 |
|---|---|
| `node ../verify-kh.js` | 转一次 → 168 USD → 弹窗；输入框数量为 0；本地 4xx；第三方请求数 |
| `node ../verify-admin.js` | 首次设密码、弱密码/不一致拦截、登录、`javascript:` 拦截、保存后前台是否跟着变、分包参数透传 |
| `node ../verify-widths.js` | 14 个断点扫一遍 404 和横向溢出 |

`verify-admin.js` 会重置 `dist/data/`（删 auth.json、把 links.json 还原成初始值），
跑完就是干净的待部署状态。

## 九、两个已知情况

1. `data/.htaccess` 只在 Apache 下生效。用 Nginx 的话要自己加：
   ```
   location ^~ /data/ { deny all; }
   ```
   PHP 内置服务器（本地测试）也不认 .htaccess，所以本地能直接打开 data/ 里的文件，
   线上 Apache 环境不能 —— 这是正常的。
2. 页面必须走 HTTP 服务器。`file://` 直接打开会因为 `fetch('link.php')` 失败
   而回落到 `config.js` 里的 `window.OFFER_LINK`。
   服务器没 PHP 的话也是同样的回落 —— 那种情况下改链接就得手动编辑 `config.js`，
   后台用不了。
