diff --git a/.env b/.env
deleted file mode 100644
index 4041bb9..0000000
--- a/.env
+++ /dev/null
@@ -1,14 +0,0 @@
-# 租户 / 应用配置
-# 默认租户 ID(本地开发或演示站点用,生产环境通过域名自动识别)
-NUXT_PUBLIC_TENANT_ID=10626
-
-# 默认模板 ID
-NUXT_PUBLIC_TEMPLATE_ID=template-07
-
-# 本地开发:CMS / 内容接口指向本地后端(mp-java)
-# 生产默认值见 nuxt.config.ts:https://cms-api.websoft.top/api
-# 上线/联调远程时,把这两行注释掉或删掉即可
-NUXT_PUBLIC_MODULES_API_BASE=http://127.0.0.1:9500/api
-# 若本地后端同时提供图片/文件,可一并打开(默认走 server.websoft.top)
-# NUXT_PUBLIC_FILE_SERVER_BASE=http://127.0.0.1:9500
- NUXT_PUBLIC_MODULES_API_BASE=http://127.0.0.1:9200/api
diff --git a/.env.development b/.env.development
new file mode 100644
index 0000000..6dcc9f8
--- /dev/null
+++ b/.env.development
@@ -0,0 +1,40 @@
+# ============================================================
+# 本地开发配置(npm run dev)
+# ------------------------------------------------------------
+# 该文件会被提交到 git,供所有开发者共享;个人差异请写进
+# .env.local(不提交,优先级更高)。
+# ============================================================
+
+# ---------- 租户 / 模板 ----------
+# 本地开发用固定租户,生产环境通过域名自动识别租户
+NUXT_PUBLIC_TENANT_ID=10626
+NUXT_PUBLIC_APP_ID=website
+NUXT_PUBLIC_TEMPLATE_ID=template-07
+
+# 本地调试用:强制指定模板,优先级高于应用/站点绑定。留空表示不覆盖
+NUXT_PUBLIC_FORCE_TEMPLATE_ID=
+
+# ---------- 后端接口 ----------
+# 本地后端(hjc-java)默认端口 9200。
+# 若要联调远程环境,把下面两行注释掉即可,nuxt.config.ts 会自动回落到生产地址
+NUXT_PUBLIC_MODULES_API_BASE=http://127.0.0.1:9200/api
+# 本地后端同时提供图片/文件时打开(默认走 https://server.websoft.top)
+# NUXT_PUBLIC_FILE_SERVER_BASE=http://127.0.0.1:9200
+
+# 其余接口本地开发直接走远程(一般无需修改)
+NUXT_PUBLIC_SERVER_API_BASE=https://server.websoft.top/api
+NUXT_PUBLIC_APP_API_BASE=https://websopy-api.websoft.top
+
+# ---------- 站点 / 多租户域名 ----------
+NUXT_PUBLIC_BASE_DOMAIN=shoplnk.cn
+NUXT_PUBLIC_BASE_DOMAINS=shoplnk.cn,sitelink.cn,wsdns.cn
+NUXT_PUBLIC_SUBDOMAIN_PREFIXES=site,shop,store,mp,app,oa
+
+# ---------- 可选覆盖(留空 = 由后台配置决定) ----------
+NUXT_PUBLIC_SITE_NAME=
+NUXT_PUBLIC_PHONE=
+NUXT_PUBLIC_WX_QRCODE=
+NUXT_PUBLIC_CONTACT_CAPTCHA=
+
+# 订阅状态缓存秒数(仅服务端可见)
+NUXT_SUBSCRIPTION_CACHE_TTL=60
diff --git a/.env.example b/.env.example
new file mode 100644
index 0000000..010fe66
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,55 @@
+# ============================================================
+# 环境变量总览(参考模板)
+# ------------------------------------------------------------
+# 本项目的配置分三层,优先级从低到高:
+# 1. .env.development / .env.production ← 提交到 git 的共享配置
+# 2. .env ← 个人本地覆盖,已从 git 移除(不提交)
+# 3. .env.local ← 优先级最高的个人覆盖(不提交)
+#
+# 常用命令:
+# npm run dev # 开发,读取 .env.development
+# npm run build:prod # 生产打包,读取 .env.production
+#
+# ⚠️ 所有 NUXT_PUBLIC_* 变量都会暴露给浏览器,不要放任何密钥。
+# ============================================================
+
+# ---------- 租户 / 应用 / 模板 ----------
+# 固定租户 ID。生产环境留空,改由域名自动识别
+NUXT_PUBLIC_TENANT_ID=
+NUXT_PUBLIC_APP_ID=website
+# 默认模板 ID
+NUXT_PUBLIC_TEMPLATE_ID=
+# 强制模板 ID:设置后优先级最高,覆盖应用/站点绑定(仅本地调试用)
+NUXT_PUBLIC_FORCE_TEMPLATE_ID=
+
+# ---------- 后端接口地址 ----------
+# 内容/CMS 接口。生产为 https://hjc-api.websoft.top/api
+NUXT_PUBLIC_MODULES_API_BASE=
+# 主服务接口。生产为 https://server.websoft.top/api
+NUXT_PUBLIC_SERVER_API_BASE=
+# 应用/用户接口。生产为 https://websopy-api.websoft.top
+NUXT_PUBLIC_APP_API_BASE=
+# 图片/文件服务器。留空则从 SERVER_API_BASE 自动推导
+NUXT_PUBLIC_FILE_SERVER_BASE=
+
+# ---------- 多租户域名 ----------
+# 兼容保留,实际取 BASE_DOMAINS 的第一个
+NUXT_PUBLIC_BASE_DOMAIN=
+# 多主域清单,逗号分隔
+NUXT_PUBLIC_BASE_DOMAINS=
+# 子域名前缀白名单(这些前缀 + 数字租户号 + 主域 才被识别为平台子域租户)
+NUXT_PUBLIC_SUBDOMAIN_PREFIXES=
+
+# ---------- 展示覆盖(留空 = 由后台配置决定) ----------
+# 站点名称覆盖,留空则用后端 AppProduct / CMS 返回值
+NUXT_PUBLIC_SITE_NAME=
+# 联系电话覆盖,用于后端 phone 被脱敏时兜底
+NUXT_PUBLIC_PHONE=
+# 微信二维码覆盖。⚠️ 不要写死图片地址,留空让 Footer 从后台上传读取
+NUXT_PUBLIC_WX_QRCODE=
+# 留言验证码开关:true / false / 留空(由后台 setting.requireCaptcha 决定)
+NUXT_PUBLIC_CONTACT_CAPTCHA=
+
+# ---------- 服务端专用(不会暴露给浏览器) ----------
+# 订阅状态缓存秒数
+NUXT_SUBSCRIPTION_CACHE_TTL=60
diff --git a/.env.production b/.env.production
new file mode 100644
index 0000000..de25f0d
--- /dev/null
+++ b/.env.production
@@ -0,0 +1,33 @@
+# ============================================================
+# 生产打包配置(npm run build:prod)
+# ------------------------------------------------------------
+# ⚠️ 该文件会被提交到 git,只放「非敏感、稳定」的生产参数。
+# 任何密钥类内容都不要写在这里。
+# ============================================================
+
+# ---------- 接口(生产必须指向线上) ----------
+# 内容/CMS 接口统一使用 hjc-api 域名(原 cms-api.websoft.top 的 /api/* 已返回 404)
+NUXT_PUBLIC_MODULES_API_BASE=https://hjc-api.websoft.top/api
+NUXT_PUBLIC_SERVER_API_BASE=https://server.websoft.top/api
+NUXT_PUBLIC_APP_API_BASE=https://websopy-api.websoft.top
+# 图片/文件服务器。留空则由 nuxt.config.ts 从 SERVER_API_BASE 推导出
+# https://server.websoft.top,无需手写
+NUXT_PUBLIC_FILE_SERVER_BASE=
+
+# ---------- 站点 / 多租户域名 ----------
+# 生产通过域名自动识别租户,因此不设置 TENANT_ID / TEMPLATE_ID,
+# 也不设置 FORCE_TEMPLATE_ID,避免写死租户导致所有域名串号
+NUXT_PUBLIC_BASE_DOMAIN=shoplnk.cn
+NUXT_PUBLIC_BASE_DOMAINS=shoplnk.cn,sitelink.cn,wsdns.cn
+NUXT_PUBLIC_SUBDOMAIN_PREFIXES=site,shop,store,mp,app,oa
+
+# ---------- 可选覆盖(留空 = 由后台配置决定) ----------
+# 站名/电话/二维码一律留空,从后台 CMS 读取,便于运营自行修改
+NUXT_PUBLIC_SITE_NAME=
+NUXT_PUBLIC_PHONE=
+NUXT_PUBLIC_WX_QRCODE=
+# 留言验证码:留空表示由后台「网站设置」的 requireCaptcha 决定
+NUXT_PUBLIC_CONTACT_CAPTCHA=
+
+# 订阅状态缓存秒数(仅服务端可见)
+NUXT_SUBSCRIPTION_CACHE_TTL=60
diff --git a/.gitignore b/.gitignore
index b63b02c..840614d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,3 +3,9 @@ node_modules
.output
.data
dist
+
+# 本地个人覆盖配置,不进版本库
+# 注意:.env.development / .env.production / .env.example 需要提交,故不在此忽略
+.env
+.env.local
+.env.*.local
diff --git a/.workbuddy/memory/2026-09-08.md b/.workbuddy/memory/2026-09-08.md
index 250362d..7d334e6 100644
--- a/.workbuddy/memory/2026-09-08.md
+++ b/.workbuddy/memory/2026-09-08.md
@@ -1,7 +1,7 @@
# 2026-09-08
## 本地开发接口切换(cms-api → 127.0.0.1:9500)
-- 需求:把 CMS/内容接口从 `https://cms-api.websoft.top/api` 切到本地 `http://127.0.0.1:9500/api`。
+- 需求:把 CMS/内容接口从 `https://hjc-api.websoft.top/api` 切到本地 `http://127.0.0.1:9500/api`。
- 改法:只动 `.env`,未改 `nuxt.config.ts` 默认值(保持生产配置不变)。新增 `NUXT_PUBLIC_MODULES_API_BASE=http://127.0.0.1:9500/api`;NUXT_ 前缀环境变量会覆盖 `runtimeConfig.public.modulesApiBase`。
- 关联:`modulesApiBase` 被 server/api 下 site/info、page/*、article/*、product/*、case/*、banner、form/submit、sitemap、domain/resolve 共用;文件/图片走另一个变量 `fileServerBase`(默认 origin(serverApiBase)=server.websoft.top),已在 .env 留注释开关。
- 顺带修复:原 `.env` 中 `NUXT_PUBLIC_TENANT_ID` / `NUXT_PUBLIC_TEMPLATE_ID` 两行有前导空格,dotenv 无法解析 → 配置一直没生效。已去除空格(tenant 10626 / template-07 将真正生效,若之前靠默认 template-01 调试需注意行为变化)。
diff --git a/README.md b/README.md
index bac537e..54a8466 100644
--- a/README.md
+++ b/README.md
@@ -43,6 +43,41 @@ npm run dev
默认访问:http://localhost:3000
+## 环境变量与打包
+
+项目已按环境拆分配置文件,**打生产包不再需要手改 `.env`**:
+
+| 命令 | 用途 | 读取的配置 |
+|---|---|---|
+| `npm run dev` | 本地开发 | `.env.development` |
+| `npm run build:prod` | 生产打包 | `.env.production` |
+| `npm run build` | 等同 `build:prod` | `.env.production` |
+| `npm run build:dev` | 用开发配置打包(排查用) | `.env.development` |
+| `npm run dev:prod` | 以生产配置本地起服务(排查用) | `.env.production` |
+
+配置文件说明:
+
+| 文件 | 是否提交 | 说明 |
+|---|---|---|
+| `.env.development` | ✅ | 团队共享的开发配置,接口指向本地后端 |
+| `.env.production` | ✅ | 团队共享的生产配置,接口指向线上 |
+| `.env.example` | ✅ | 变量总览模板,新增变量时同步更新 |
+| `.env.local` | ❌ | 个人通用覆盖 |
+| `.env.<环境>.local` | ❌ | 个人针对某环境的覆盖,优先级最高 |
+| `.env` | ❌ | 历史遗留的个人配置,优先级最低 |
+
+优先级(高 → 低):
+**进程环境变量 > `.env.<环境>.local` > `.env.<环境>` > `.env.local` > `.env`**
+
+只有「变量尚未定义」时才会被下一层填充,因此高优先级不会被低优先级顶掉,
+`.env` 里残留的本地地址也不会再污染生产包。
+
+发布前可自查产物是否干净:
+
+```bash
+grep -rl "127.0.0.1" .output/ || echo "产物干净,无本地地址"
+```
+
## 模板系统
模板存放在 `app/templates/` 目录下,每个模板独立目录,包含:
@@ -56,20 +91,30 @@ npm run dev
- `template-01`:科技蓝企业模板(完整)
- `template-02` ~ `template-04`:占位模板,后续根据设计稿实现
-## 环境变量
+## 环境变量清单
-复制 `.env.example` 为 `.env`,按需修改:
+完整变量说明见 `.env.example`。核心变量:
```bash
-NUXT_PUBLIC_TENANT_ID=10398
+# 租户 / 模板(生产留空,由域名自动识别)
+NUXT_PUBLIC_TENANT_ID=
NUXT_PUBLIC_APP_ID=website
-NUXT_PUBLIC_TEMPLATE_ID=template-01
+NUXT_PUBLIC_TEMPLATE_ID=
+
+# 接口地址
NUXT_PUBLIC_SERVER_API_BASE=https://server.websoft.top/api
-NUXT_PUBLIC_MODULES_API_BASE=https://cms-api.websoft.top/api
-NUXT_PUBLIC_APP_API_BASE=https://cms-api.websoft.top
-NUXT_PUBLIC_BASE_DOMAIN=shoplnk.cn
+NUXT_PUBLIC_MODULES_API_BASE=https://hjc-api.websoft.top/api
+NUXT_PUBLIC_APP_API_BASE=https://websopy-api.websoft.top
+
+# 多租户域名
+NUXT_PUBLIC_BASE_DOMAINS=shoplnk.cn,sitelink.cn,wsdns.cn
```
+> ℹ️ `nuxt.config.ts` 内置的 `NUXT_PUBLIC_MODULES_API_BASE` 默认值已统一为
+> `https://hjc-api.websoft.top/api`(原 `cms-api.websoft.top` 域名 `/api/*` 已返回 404,
+> 故全面切换到 `hjc-api`)。`.env.production` 中也显式指定同一地址。
+> 若将来再次更换域名,请同步修改 `nuxt.config.ts`、`.env.production` 与 `.env.example`。
+
## 接口说明
本项目通过 `server/api/` 代理转发 SaaS 后端接口,前端不直接调用后端地址。
diff --git a/database/template-switch-verification.md b/database/template-switch-verification.md
index 4459a26..cc65fe7 100644
--- a/database/template-switch-verification.md
+++ b/database/template-switch-verification.md
@@ -8,7 +8,7 @@
后台 website-admin `_websopy` 代理 → `websopy-api.websoft.top` = **websopy-java**。
`CmsTemplateController.use()` 按 `loginUser.getTenantId()` 写 `cms_website.template_id`。
- **读路径** `GET /cms/cms-website/getSiteInfo`:
- 公开站 `modulesApiBase` 与 后台 `_cms` 代理 → `cms-api.websoft.top` = **mp-java**。
+ 公开站 `modulesApiBase` 与 后台 `_cms` 代理 → `hjc-api.websoft.top` = **mp-java**。
返回 `ShopVo`(站点信息),被 Redis 缓存 1 天(key `SiteInfo:{tenantId}`)。
- 两后端**共享同一 Redis**(prod `1Panel-redis-Q1LE`;dev `47.119.165.234`,同密码),
故 websopy-java 的 `use()` 清缓存能清掉 mp-java 读的 `SiteInfo:{tenantId}`。
diff --git a/nuxt.config.ts b/nuxt.config.ts
index 8f72d7a..5bcc77f 100644
--- a/nuxt.config.ts
+++ b/nuxt.config.ts
@@ -28,7 +28,7 @@ const serverApiBase =
'https://server.websoft.top/api'
const modulesApiBase =
process.env.NUXT_PUBLIC_MODULES_API_BASE ||
- 'https://cms-api.websoft.top/api'
+ 'https://hjc-api.websoft.top/api'
const appApiBase =
process.env.NUXT_PUBLIC_APP_API_BASE ||
'https://websopy-api.websoft.top'
@@ -81,9 +81,9 @@ export default defineNuxtConfig({
{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' },
// 提前与内容/接口源站建立连接,降低首字节与图片加载延迟
{ rel: 'preconnect', href: 'https://server.websoft.top', crossorigin: '' },
- { rel: 'preconnect', href: 'https://cms-api.websoft.top', crossorigin: '' },
+ { rel: 'preconnect', href: 'https://hjc-api.websoft.top', crossorigin: '' },
{ rel: 'dns-prefetch', href: 'https://server.websoft.top' },
- { rel: 'dns-prefetch', href: 'https://cms-api.websoft.top' },
+ { rel: 'dns-prefetch', href: 'https://hjc-api.websoft.top' },
// 思源黑体(Noto Sans SC,SIL 开源许可,版权无忧)网页字体,全站统一字体
{ rel: 'preconnect', href: 'https://fonts.googleapis.cn' },
{ rel: 'preconnect', href: 'https://fonts.gstatic.cn', crossorigin: '' },
diff --git a/outputs/template-07-home-with-news.html b/outputs/template-07-home-with-news.html
index 7bda305..a2aa7b5 100644
--- a/outputs/template-07-home-with-news.html
+++ b/outputs/template-07-home-with-news.html
@@ -7,4 +7,4 @@ if (!window.__NUXT_DEVTOOLS_TIME_METRIC__) {
})
}
window.__NUXT_DEVTOOLS_TIME_METRIC__.appInit = Date.now()
-
四大核心业务
覆盖政府采购、工程咨询、投融资服务及 AI 数智化全链条
政府采购代理
提供招标投标、政府采购全流程代理服务,专业合规、高效透明。
工程咨询服务
工程造价、工程监理、项目管理等一站式工程咨询服务,助力项目顺利落地。
投融资服务
项目投融资策划与对接,为政府及企业提供资金解决方案与财务顾问支持。
AI 数智化
运用人工智能与大数据技术,推动政务与企业数字化转型,提升管理效能。
关于我们
广西汇吉采咨询有限公司成立于2017年,是一家专业化的全过程工程咨询服务商,业务涵盖招投标代理、政府采购代理、工程造价咨询、工程管理服务及建设工程监理等领域。目前已在柳州、崇左、北海、梧州、百色、贺州等地设立分支机构,服务网络覆盖全广西。我们始终以诚信为本,以专业立身,致力于为各级政企客户提供高效、可信赖的工程咨询解决方案。
推荐资讯新闻资讯
洞察行业前沿,分享专业见解与最佳实践
准备好开始了吗?
立即联系我们,获取专属企业官网解决方案