diff --git a/.gitignore b/.gitignore index d0fa236..9fda91c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,2 @@ -app/node_modules/ -app/data/ -*.log +# Local artifacts created before moving into backend/ +app/ diff --git a/backend/.gitignore b/backend/.gitignore new file mode 100644 index 0000000..d0fa236 --- /dev/null +++ b/backend/.gitignore @@ -0,0 +1,3 @@ +app/node_modules/ +app/data/ +*.log diff --git a/README.md b/backend/README.md similarity index 94% rename from README.md rename to backend/README.md index 912da86..2e421b2 100644 --- a/README.md +++ b/backend/README.md @@ -24,6 +24,7 @@ npm run dev ``` 服务默认监听 `:3001`(可在 `app/.env` 修改)。 +通过域名访问时统一前缀为:`https://capay.hao.work/backend`。 ### 免费套餐低频监控 在 `app/.env` 中已设置: @@ -35,6 +36,7 @@ npm run dev 支持多个 Alchemy 免费 key:使用 `ALCHEMY_API_KEYS=key1,key2`,系统会按轮询周期进行轮转调用,降低单 key 的频率。 ## API 说明(简化版) +域名访问时请在路径前加 `/backend` 前缀(例如:`/backend/payments/orders`)。 ### 1) 开通商户 `POST /merchants` ```json diff --git a/app/.env b/backend/app/.env similarity index 96% rename from app/.env rename to backend/app/.env index 15fdbb3..0d8b275 100644 --- a/app/.env +++ b/backend/app/.env @@ -1,5 +1,5 @@ APP_PORT=3001 -APP_HOST=https://capay.hao.work +APP_HOST=https://capay.hao.work/backend PLAN=free ADMIN_API_KEY=whoami139 diff --git a/app/package-lock.json b/backend/app/package-lock.json similarity index 100% rename from app/package-lock.json rename to backend/app/package-lock.json diff --git a/app/package.json b/backend/app/package.json similarity index 100% rename from app/package.json rename to backend/app/package.json diff --git a/app/src/public/app.js b/backend/app/src/public/app.js similarity index 95% rename from app/src/public/app.js rename to backend/app/src/public/app.js index 3afcf9d..9e8c7ce 100644 --- a/app/src/public/app.js +++ b/backend/app/src/public/app.js @@ -21,7 +21,9 @@ const curlTrackTx = document.getElementById('curl-track-tx'); const webhookTip = document.getElementById('webhook-tip'); const STORAGE_KEY = 'capay_admin_key'; -const baseUrl = window.location.origin; +const basePath = window.location.pathname.replace(/\/[^/]*$/, '/').replace(/\/+$/, ''); +const apiBase = basePath || ''; +const baseUrl = `${window.location.origin}${apiBase}`; function setStatus(text, ok) { statusText.textContent = text; @@ -43,13 +45,18 @@ function setAdminKey(value) { localStorage.setItem(STORAGE_KEY, value); } +function withBase(path) { + if (!apiBase) return path; + return `${apiBase}${path}`; +} + async function request(path, options = {}) { const headers = options.headers ? { ...options.headers } : {}; const adminKey = getAdminKey(); if (adminKey) { headers['x-admin-key'] = adminKey; } - const res = await fetch(path, { ...options, headers }); + const res = await fetch(withBase(path), { ...options, headers }); if (!res.ok) { const text = await res.text(); let message = text; diff --git a/app/src/public/docs/index.html b/backend/app/src/public/docs/index.html similarity index 91% rename from app/src/public/docs/index.html rename to backend/app/src/public/docs/index.html index dc41deb..149452d 100644 --- a/app/src/public/docs/index.html +++ b/backend/app/src/public/docs/index.html @@ -5,7 +5,7 @@