# 智店官网

基于 Next.js 16 全栈框架的企业官网项目，当前实现了单页官网展示、联系表单提交、SMTP 邮件通知、可配置 SEO、`robots.txt` / `sitemap.xml` 输出，以及 PM2 生产运行配置。

## 功能概览

- 单页官网：首页内容主要由 `data/*.json` 驱动。
- 联系表单：提交“获取初步方案”后，会调用 `/api/contact`，由服务端通过 SMTP 发邮件到配置的多个管理邮箱。
- SEO 配置：站点标题、描述、关键词、canonical、Open Graph、Twitter、站点验证、robots、sitemap 都可配置。
- 生产部署：支持 `pnpm build && pnpm start`，也提供了 PM2 的 `ecosystem.config.cjs`。

## 快速启动

### 1. 安装依赖

```bash
pnpm install
```

### 2. 配置环境变量

本地开发建议使用 `.env.local`。当前项目已经按飞书企业邮箱写入了测试配置。

可参考 `./.env.example`：

```bash
MAIL_HOST=smtp.feishu.cn
MAIL_PORT=465
MAIL_USER=your-mail-account@example.com
MAIL_PASS=your-mail-password
MAIL_SSL_ENABLED=true
MAIL_FROM_EMAIL=your-mail-account@example.com
MAIL_FROM_NAME=智店软件官网
```

### 3. 启动开发环境

```bash
pnpm dev
```

默认访问：

```text
http://localhost:3000
```

## 构建与运行

### 本地生产模式

```bash
pnpm build
pnpm start
```

### 使用 PM2 运行

项目已提供 `./ecosystem.config.cjs`。

```bash
pnpm build
pm2 start ecosystem.config.cjs
pm2 status
pm2 logs com-index
```

常用 PM2 命令：

```bash
pm2 restart com-index
pm2 stop com-index
pm2 delete com-index
pm2 save
pm2 startup
```

## 配置说明

### 1. 站点基础配置

文件：`data/site.json`

主要负责：

- 公司名称、英文名、描述、电话、邮箱、地址
- 顶部导航和页脚导航
- SEO 全局配置

重点字段：

- `company.phone`：站点展示电话
- `company.email`：页脚展示邮箱
- `seo.siteUrl`：线上正式域名，用于 canonical、Open Graph、sitemap、robots
- `seo.defaultTitle`：默认页面标题
- `seo.titleTemplate`：子页面标题模板
- `seo.description`：默认描述
- `seo.keywords`：关键词数组
- `seo.canonicalPath`：当前站点 canonical 路径，单页官网一般为 `/`
- `seo.robots.index` / `seo.robots.follow`：搜索引擎抓取控制
- `seo.openGraph.image`：社交分享图路径
- `seo.verification`：搜索引擎站点验证

### 2. 首页文案与区块配置

文件：`data/home.json`

主要负责：

- Hero 文案
- 产品、方案、案例、联系表单文案
- “获取初步方案”按钮和联系信息展示

### 3. 邮件通知配置

文件：`config/contact-mailer.yaml`

这个文件负责：

- SMTP 主机、端口、SSL、账号密码引用
- 发件人邮箱和名称
- 收件人列表
- 邮件标题前缀

当前配置方式：

- SMTP 参数优先从 `.env.local` 里的 `MAIL_*` 变量读取
- `notification.to` 支持配置多个邮箱
- YAML 里可以直接写死，也可以用 `${ENV_NAME}` / `${ENV_NAME:default}` 引用环境变量

示例：

```yaml
notification:
  to:
    - bd@zhidiansoft.com
    - ops@zhidiansoft.com
  subjectPrefix: 官网线索
```

### 4. SEO 输出文件

文件：

- `app/layout.tsx`
- `lib/seo.ts`
- `app/robots.ts`
- `app/sitemap.ts`

职责：

- `app/layout.tsx`：把 SEO 元数据挂到 Next Metadata
- `lib/seo.ts`：统一把 `site.json` 里的 SEO 配置转换成 Metadata / robots / sitemap
- `app/robots.ts`：生成 `/robots.txt`
- `app/sitemap.ts`：生成 `/sitemap.xml`

## 目录树与作用

```text
.
├── app/
│   ├── api/contact/route.ts      # 联系表单提交接口，负责校验和发邮件
│   ├── layout.tsx                # 全局布局与 Metadata 入口
│   ├── page.tsx                  # 首页路由
│   ├── robots.ts                 # 生成 robots.txt
│   └── sitemap.ts                # 生成 sitemap.xml
├── components/
│   ├── sections/                 # 首页各业务区块
│   ├── footer.tsx                # 页脚
│   └── navbar.tsx                # 顶部导航
├── config/
│   └── contact-mailer.yaml       # 邮件通知 YAML 配置
├── data/
│   ├── home.json                 # 首页文案和模块数据
│   └── site.json                 # 公司信息、导航、SEO 配置
├── lib/
│   ├── contact-form.ts           # 表单字段校验
│   ├── contact-mailer.ts         # SMTP 发信逻辑
│   ├── contact-mailer-config.ts  # YAML 配置读取与校验
│   ├── seo.ts                    # SEO 配置转换
│   └── utils.ts                  # 通用工具
├── public/                       # 静态资源
├── .env.example                  # 环境变量示例
├── ecosystem.config.cjs          # PM2 配置
├── next.config.mjs               # Next.js 配置
├── package.json                  # 依赖与脚本
└── tsconfig.json                 # TypeScript 配置
```

## 表单提交流程

1. 用户在“获取初步方案”表单输入姓名、公司、电话、门店规模和需求描述。
2. 前端组件 `components/sections/contact-section.tsx` 向 `/api/contact` 发起 POST 请求。
3. API 路由 `app/api/contact/route.ts` 使用 Zod 校验请求体。
4. 服务端读取 `config/contact-mailer.yaml` 并解析环境变量。
5. `nodemailer` 通过 SMTP 给 `notification.to` 中的所有邮箱发送通知邮件。
6. 邮件发送成功后，前端才显示“信息已提交”。

## 注意事项

- `.env.local` 已在 `.gitignore` 中忽略，不会默认提交到仓库。
- 线上部署前，请确认 `data/site.json` 中的 `seo.siteUrl` 已改成真实域名。
- 如果邮件发送失败，优先检查 `.env.local`、`contact-mailer.yaml` 和 SMTP 账号权限。
- 当前仓库存在一些与本次需求无关的历史 TypeScript 报错，`next build` 不受影响，但 `pnpm exec tsc --noEmit` 还不能全绿。
