🏘️ e 社區 — 開發者指南

返回後台

🛠️ e 社區 開發者指南

這份文件是給工程師看的。包含架構、目錄結構、命名規範、API 設計、新增功能 SOP、部署、維護清單。每次新增或修改功能都必須更新本文件

📝 變更紀錄(Changelog):
2026-07-24 v7.0.4 — Email 網域統一為 @0800945.com:DB + 6 個文案 + 10 個本地 .php 共 32 個 @e-house.tw 修正(service/partner/vendor/pr/legal/dpo)
2026-07-24 v7.0.3 — 文案去 emoji 化:utf8mb3 表不能存 4-byte emoji,6 個內容頁文案重寫為純文字版(字數 1.8-3.5x 提升)
2026-07-24 v7.0.2 — 內容頁 Footer 5 欄升級 + 文案擴充:抽出共用 /e/components/site_footer.php,6 個內容頁 include,總字數 19,961 → 48,405 chars
2026-07-24 v7.0.1 — docs href 路徑修正:5 個 docs/*.php 的 ../admin/ 改成 ../../admin/(/e/docs/ 跳到根要 ../..),E2E 28/28 全綠
2026-07-24 v7.0 — 網站設定系統:DB v7 +1 表 community_網站設定(50 個欄位基本/SEO/聯絡/社群/公司/內容頁/版權)、site_config.php helper(site/site_meta_tags/site_copyright)、6 個 landing 內容頁(about/privacy/terms/cookies/ads/contact)、§17 章節
2026-07-24 v1.2 — 目錄結構大改版:/admin/ /super/ /landing/ → 根目錄 /admin/ /super/ /landing/,舊管委會站台 → /legacy/,根 /index.php 自動跳 /landing/。共 70+ 檔案路徑批次改寫
2026-07-24 v1.1b — 信件系統:DB v5 +3 表(系統設定/信件模板/寄信記錄/聯絡表單)+ PHPMailer 整合 + 5 個 super 信件頁面 + Landing 申請表單
2026-07-23 v1.1 — 多社區 SaaS 架構:DB v4 +2 表(平台管理員/超管切換記錄)、新增 /super/ 平台超管 9 頁、admin/index.php 多社區切換橫條、§15 多社區架構章節
2026-07-23 v1.0 — 初版(Phase 1-5 全部完成)
2026-07-23 v0.9 — DB v3 升級 13 表(投票/私訊/財務/保養/防災/物業/廣告)
2026-07-23 v0.5 — DB v2 升級 15 表(委員/會議/門禁/設施/文件/失物/訪客)
2026-07-23 v0.3 — DB v1 建置 11 表(社區/住戶/公告/報修/包裹/廠商/推播/管理員/會議/出席/委員訊息)
2026-07-23 v0.1 — 專案啟動

📑 目錄

1. 平台架構 2. 技術堆疊 3. 目錄結構 4. 資料庫設計 5. 命名規範 6. 認證流程 7. API 規範 8. UI 規範 9. 新增功能 SOP 10. 部署流程 11. 測試 SOP 12. 維護清單 13. 安全規範 14. 變更紀錄規則 15. 多社區 SaaS 架構(v1.1 新增) 16. v1.2 目錄結構改版(root 化) 17. 網站設定系統(v7.0 新增)

1. 平台架構

┌──────────────────────────────────────────────────┐
│              住戶(mobile/PWA)                      │
│  LINE 推播  ←──┐                                  │
│                │                                  │
│  PWA 瀏覽器  ──┼──┐                              │
│                │  │                              │
├────────────────┼──┼──────────────────────────────┤
│  houses.0800945.com(laragon + PHP 8)            │
│              ↓  ↓                                │
│  ┌────────────────────────────────────┐          │
│  │  /e/  入口 / 住戶 / 後台 / 文件      │ ← 平台主目錄│
│  └────────────────────────────────────┘          │
│              ↓                                    │
│  ┌────────────────────────────────────┐          │
│  │  /api/  API(db.php / line_config)  │          │
│  └────────────────────────────────────┘          │
│              ↓                                    │
│      MySQL 8.0 (houses.0800945.com)               │
│      ├ 管委會資料 (管委會, 管委會_全量, ...)      │
│      └ e 社區資料 (community_* 40 表)             │
│              ↑                                    │
│      LINE Messaging API (推播)                     │
│      LINE Login (OAuth)                           │
│      綠界金流 (Phase 3)                            │
│      SMTP (Email)                                 │
└──────────────────────────────────────────────────┘
  

2. 技術堆疊

技術備註
伺服器PHP 8.x + MySQL 8.0hosts.0800945.com (主機商 aaPanel)
前端原生 HTML + CSS + JavaScript(無框架)響應式、PWA
PWAmanifest.json + Service Worker可加到桌面像 APP
推播LINE Messaging APILINE OA + Push Message
登入LINE OAuth + Email OTP(之後)住戶用 LINE 一鍵
金流綠界 ECPay(Phase 3)ATM/超商/信用卡
EmailSMTP(待設定)推播備援
QR Codeapi.qrserver.com(外部)免費、無限流量

3. 目錄結構(v1.2 已重構)

⚠️ v1.2 改版:admin/、super/、landing/ 已從 /e/ 移到根目錄;舊管委會站台移到 /legacy/
C:\laragon\www\0800945.1ccgo.com\houses\        ← 部署根目錄
├── index.php                       ← 自動重導到 /landing/
├── admin/                          ← 社區管理後台(v1.2 移到根)
│   ├── index.php                   ← 後台首頁(KPI + 20 個快速操作)
│   ├── login.php                   ← 社區管理員登入
│   ├── announcements.php           ← 公告
│   ├── repairs.php                 ← 報修
│   ├── parcels.php                 ← 掛號收發
│   ├── parcel_qr.php               ← 領件 QR Code
│   ├── pickup.php                  ← 領件確認
│   ├── events.php                  ← 緊急事件
│   ├── residents.php               ← 住戶
│   ├── vendors.php                 ← 廠商
│   ├── committee.php               ← 委員
│   ├── meetings.php                ← 開會
│   ├── chat.php / chat_send.php / chat_fetch.php  ← 委員聊天
│   ├── access.php                  ← 門禁
│   ├── visitors.php / visitor_check.php  ← 訪客 QR
│   ├── lostfound.php               ← 失物
│   ├── facilities.php              ← 設施
│   ├── documents.php               ← 文件
│   ├── maintenance.php             ← 設備保養
│   ├── emergency.php               ← 防災 SOP
│   ├── finance.php                 ← 財務
│   ├── payments.php                ← 管理費
│   ├── votes.php                   ← 投票
│   ├── messages.php / msg_*.php    ← 私訊
│   ├── group.php                   ← 群組
│   ├── property.php                ← 物業代管
│   ├── ads.php                     ← 修繕撮合
│   └── logout.php
├── super/                          ← 平台超管後台(v1.2 移到根)
│   ├── login.php                   ← 平台員工登入
│   ├── index.php                   ← 社區清單 + 切換 + KPI
│   ├── add.php                     ← 新增社區
│   ├── property_companies.php      ← 物業公司清單
│   ├── property_company_edit.php   ← 編輯物業公司
│   ├── property_company_communities.php  ← 指派社區
│   ├── community_edit.php          ← 編輯社區
│   ├── community_users.php         ← 社區管理員 CRUD
│   ├── users.php                   ← 平台員工帳號
│   ├── finance.php                 ← 平台帳務 KPI
│   ├── logs.php                    ← 切換記錄
│   ├── settings.php                ← SMTP 設定
│   ├── email_templates.php         ← 信件模板
│   ├── email_template_edit.php     ← 編輯模板
│   ├── email_logs.php              ← 寄信記錄
│   ├── leads.php                   ← 業務 Leads
│   └── logout.php
├── landing/                        ← 商業推廣首頁(v1.2 移到根)
│   ├── index.php                   ← 10 區塊商業頁(住得安心)
│   └── assets/
│       └── style.css               ← 商業網站風格
├── e/                              ← e 社區住戶端 + API + 共用資源
│   ├── index.php                   ← 入口頁(舊版,仍可用)
│   ├── login.php                   ← 住戶 LINE 登入
│   ├── manifest.json               ← PWA
│   ├── resident/                   ← 住戶端
│   │   ├── index.php
│   │   └── repair_new.php
│   ├── api/                        ← 公開 API(給 LINE webhook 用)
│   │   ├── db.php                  ← DB 連線(本地)
│   │   ├── contact.php            ← Landing 申請試用表單
│   │   ├── email_send.php          ← 寄信 API
│   │   ├── auth_line_callback.php
│   │   ├── line_webhook.php
│   │   ├── line_push.php
│   │   ├── parcel_create.php
│   │   └── fix_hashes.php
│   ├── includes/                   ← 共用 helper
│   │   ├── email_helper.php        ← PHPMailer 寄信函式(sendEmail/sendTemplatedEmail)
│   │   ├── PHPMailer.php / SMTP.php / PHPMailerException.php
│   ├── assets/                     ← 共用資源
│   │   ├── logo.svg / favicon.svg
│   │   ├── icon-192.png / icon-512.png
│   │   └── style.css
│   ├── components/
│   │   └── admin_sidebar.php       ← 後台共用側邊欄(v1.2 仍給 /admin/ 用)
│   ├── config/
│   │   └── line_config.php
│   └── docs/                       ← 文件
│       ├── admin_manual.php
│       ├── staff_manual.php
│       ├── resident_manual.php
│       ├── MASTER_GUIDE.php
│       └── DEVELOPER_GUIDE.php     ← 本檔
├── legacy/                         ← 舊管委會資料站台(v1.2 封存)
│   ├── index.php                   ← 舊管委會入口
│   ├── api/                        ← 舊管委會 API(10 個)
│   ├── pages/                      ← 舊管委會頁面(11 個)
│   ├── components/
│   ├── css/
│   └── docs/
├── .htaccess / .user.ini           ← 伺服器設定
├── 404.html / 502.html             ← 預設錯誤頁
└── (不再有 /api/ /pages/ /components/ /docs/ /css/ /index.html 舊檔)
│   ├── export.php
│   └── ...
├── index.php                   ← 舊管委會入口
└── docs/
    └── ...
  

4. 資料庫設計

資料表命名(簡述,完整版見 §5)

目前 47 個表(2026-07-24 v7.0,新增 1 表)

社區類 (5):
  community_社區, community_住戶, community_管理員, community_物業公司, community_物業代管

治理類 (4):
  community_委員任期, community_委員, community_會議, community_會議出席

訊息類 (5):
  community_公告, community_公告已讀, community_委員訊息, community_私訊, community_群組訊息

維修類 (2):
  community_報修, community_報修歷程

服務類 (6):
  community_包裹, community_廠商, community_門禁密碼, community_門禁記錄, community_訪客邀請, community_失物

財務類 (3):
  community_財務紀錄, community_管理費帳單, community_廣告

設備類 (3):
  community_設備, community_設備保養, community_保養排程

設施類 (2):
  community_設施, community_設施預約

文件類 (1):
  community_文件

投票類 (3):
  community_投票, community_投票選項, community_投票記錄

系統類 (4):
  community_推播紀錄, community_session, community_line_event, community_廣告點擊

防災類 (1):
  community_防災SOP

修繕撮合類 (1):
  community_報修撮合

平台超管類(v4 新增,2):
  community_平台管理員, community_超管切換記錄

信件系統(v5 新增,4):
  community_系統設定, community_信件模板, community_寄信記錄, community_聯絡表單

網站設定(v7.0 新增,1):
  community_網站設定          ← 全站設定(id=1 單筆),50 個欄位
  

新增資料表 SOP

⚠️ 每次新增表必須
  1. 寫 SQL DDL(含外鍵、索引)
  2. 測試在本地 MySQL 跑通
  3. 備份現有資料庫
  4. 在伺服器執行(用 run_xxx_schema.py 腳本)
  5. 驗證(SHOW TABLES LIKE 'community_%'
  6. 更新本指南 §4 表格清單

5. 命名規範

檔案

DB

PHP 變數

CSS Class

6. 認證流程(v1.0 起,v1.1 加平台超管)

住戶

1. 住戶訪問 /e/login.php
2. 輸入社區代碼
3. 點「LINE 登入」→ 重導到 LINE OAuth
4. LINE 確認授權 → 重導回 /api/auth_line_callback.php
5. 後端用 code 換 access_token
6. 抓 LINE profile(userId, displayName, pictureUrl)
7. 抓 email(如果有開)
8. 找/建 community_住戶
9. 建 community_session,setcookie ehouse_sid
10. 重導到 /e/resident/index.php
  

管理員

1. 訪問 /admin/login.php
2. POST 帳號 + 密碼
3. SELECT * FROM community_管理員 WHERE 帳號 = ?
4. password_verify($_POST['password'], $row['密碼雜湊'])
5. 設 $_SESSION['admin'] = {id, 帳號, 姓名, 角色, 職稱, 社區id, 權限}
6. 重導到 /admin/index.php
  

Session 過期處理

所有 admin/*.php 開頭都檢查:if (!($_SESSION['admin'] ?? null)) { header('Location: login.php'); exit; }

平台超管(v1.1 新增)

1. 訪問 /super/login.php
2. POST 帳號 + 密碼
3. SELECT * FROM community_平台管理員 WHERE 帳號 = ?
4. password_verify($_POST['password'], $row['密碼雜湊'])
5. 設 $_SESSION['super'] = {id, 帳號, 姓名, 角色, 部門, email}
6. 進入 /super/index.php(看到所有社區)

切換到任一社區(模擬身份):
  GET /super/index.php?action=switch&cid=X
  → 寫一筆 community_超管切換記錄
  → 設 $_SESSION['admin'] = {id:0, 帳號:'[super:mavis]', 姓名:'王小明(超管)', 角色:'super', 社區id:X, 權限:[全部 22 個]}
  → 重導到 /admin/index.php(看到 X 社區的管理後台)
  
💡 Session 雙重結構:超管身份存 $_SESSION['super'],模擬社區身份存 $_SESSION['admin']。返回超管時檢查 $_SESSION['super'] 即可還原。

7. API 規範

回應格式

// 成功
{"ok": true, "id": 123, "data": {...}}

// 失敗
{"error": "錯誤訊息"}
HTTP 401 (未登入)
HTTP 400 (缺欄位)
HTTP 404 (找不到)
  

Header

header('Content-Type: application/json; charset=utf-8');
  

命名

8. UI 規範

設計原則

共用組件

後台頁面樣板

<?php
session_start();
if (!($_SESSION['admin'] ?? null)) { header('Location: login.php'); exit; }
require_once __DIR__ . '/api/db.php';
$page = 'xxx';
$admin = $_SESSION['admin'];
$社區id = $admin['社區id'];
?>
<!DOCTYPE html>
<html>
<head>
  <link rel="stylesheet" href="../assets/style.css">
  <style> body { display: flex; } </style>
</head>
<body>
<?php include __DIR__ . '/../components/admin_sidebar.php'; ?>
<div class="main">
  <div class="topbar">
    <h1>頁面標題</h1>
    <div>操作按鈕</div>
  </div>
  <div class="card">
    內容
  </div>
</div>
</body>
</html>
  

9. 新增功能 SOP

⚠️ 每次新增功能必須依照此流程,並更新本指南
  1. 設計:寫功能清單(要解決什麼問題)
  2. DB schema:新增表(加在 community_v4_schema.sql 之後)
  3. 執行 SQL:在本地 MySQL 測試,OK 後到伺服器執行
  4. 後台頁面e/admin/xxx.php,遵循頁面樣板
  5. Sidebar:更新 components/admin_sidebar.php 加連結
  6. API(如有)e/api/xxx.php,遵循 API 規範
  7. 住戶端(如有)e/resident/xxx.php
  8. 手冊更新:在 docs/MASTER_GUIDE.php 加章節
  9. 本指南更新:在 §4 表格清單§3 目錄結構 加新檔案
  10. 測試:本地 + 伺服器測試所有流程
  11. 部署:FTP 上傳(見 §10)
  12. Changelog:在本指南頂端加版本

10. 部署流程

本地開發

# 1. 編輯檔案
notepad C:\laragon\www\0800945.1ccgo.com\houses\e\admin\xxx.php

# 2. 測試(瀏覽器)
https://houses.0800945.com/admin/xxx.php
(如果子網域還沒設,先用 https://houses.0800945.com/admin/xxx.php)

# 3. PHP 語法檢查
php -l xxx.php
  

部署到伺服器(FTP)

# 1. 寫 Python 上傳腳本
python upload_xxx.py

# 2. 確認伺服器檔案
python verify_xxx.py

# 3. 在瀏覽器測試
https://houses.0800945.com/admin/xxx.php
  

範例 upload 腳本

import ftplib, os

LOCAL = r"C:\laragon\www\0800945.1ccgo.com\houses\e"
files = [
    (f"{LOCAL}/admin/xxx.php", "/admin/xxx.php"),
    (f"{LOCAL}/api/xxx.php", "/e/api/xxx.php"),
]

conn = ftplib.FTP("houses.0800945.com", "ftp_houses_0800945_com", "7cef9e67c56d08")
for local, remote in files:
    dirname = os.path.dirname(remote).replace("\\", "/")
    fname = os.path.basename(remote)
    conn.cwd(dirname if dirname != "/" else "/")
    try: conn.delete(fname)
    except: pass
    with open(local, "rb") as f:
        conn.storbinary(f"STOR {fname}", f)
    print(f"Uploaded {remote}")
conn.quit()
  
⚠️ 不要用 Edit 工具改已部署的 PHP — 可能會注入 BOM 導致 JSON 解析錯誤。改用 write 工具。

11. 測試 SOP

本地測試清單

伺服器測試

12. 維護清單

每日

每週

每月

每季

13. 安全規範

14. 變更紀錄規則

⚠️ 每次 PR / 變更都必須
  1. 更新本指南頂端 changelog 陣列(加一行)
  2. 更新 §4 表格清單(如新增/修改表)
  3. 更新 §3 目錄結構(如新增/修改檔案)
  4. 更新 §9 新增功能 SOP(如新增/修改流程)
  5. 更新 §11 測試 SOP(如新增測試案例)
  6. 更新 §12 維護清單(如需新維護任務)
  7. 如有 breaking change,標紅警告

15. 多社區 SaaS 架構(v1.1 新增)

e 社區從 v1.1 開始支援多社區 SaaS:同一個站台的同一個資料庫,可同時跑 N 個社區。每個社區的資料完全隔離,但共用程式碼 / 共用基礎建設(推播、金流、檔案)。

15.1 三層角色架構

┌──────────────────────────────────────────────────┐
│ Layer 0: 平台超管 (community_平台管理員)            │
│   - 帳號: mavis / sales01 / support01 / finance01 │
│   - 看到所有社區、處理合約、客服、技術支援          │
│   - 入口: /super/                                │
├──────────────────────────────────────────────────┤
│ Layer 1: 物業公司 (community_物業公司)              │
│   - 代管多個社區                                   │
│   - 入口: /admin/property.php                    │
├──────────────────────────────────────────────────┤
│ Layer 2: 社區管理員 (community_管理員)              │
│   - 一個管理員 = 一個社區                           │
│   - 角色: admin(總幹事) / committee(委員) / staff │
│   - 入口: /admin/login.php                       │
├──────────────────────────────────────────────────┤
│ Layer 3: 住戶 (community_住戶)                      │
│   - 一個住戶 = 一個社區 + 一個 LINE 帳號           │
│   - 入口: /e/login.php (LINE 登入)                 │
└──────────────────────────────────────────────────┘
  

15.2 社區代碼設計(URL slug)

每個社區有一個社區代碼community_社區.社區代碼),規則:

用途:

⚠️ 變更社區代碼會破壞所有 LINE Login deep link、訪客 QR、外部嵌入。預設不可改,必要時手動 SQL 改並通知所有用戶。

15.3 平台超管切換機制(核心設計)

平台超管要進到某個社區看資料,但不能直接用該社區管理員帳號(避免記住 N 組密碼、避免審計漏洞)。

改用 Session 模擬

// super/index.php?action=switch&cid=X

1. 驗證 $_SESSION['super'] 存在
2. SELECT * FROM community_社區 WHERE id = X(確認社區存在)
3. INSERT INTO community_超管切換記錄 (超管id, 社區id, IP)
4. $_SESSION['admin'] = [
     'id' => 0,                              // id=0 表示是模擬
     '帳號' => '[super:' . $super['帳號'] . ']',
     '姓名' => $super['姓名'] . '(超管)',
     '角色' => 'super',                      // 識別身份用
     '職稱' => '平台超管',
     '社區id' => X,                          // 強制過濾用
     '權限' => [全部 22 個權限],              // 看得到所有功能
   ];
5. header('Location: ../admin/index.php?switched=1');
  

所有 admin/*.php 不需要改 — 原本就是 WHERE 社區id = ?,模擬 session 帶正確社區id 就能正確過濾。

15.4 識別「超管模擬」的方法

// 任何 admin/*.php 內
$is_super_sim = ($_SESSION['admin']['角色'] ?? '') === 'super';
if ($is_super_sim) {
  // 顯示「你正在以超管身份模擬 社區X」橫條
  // 顯示「返回超管後台」按鈕
  // 隱藏某些「管理員專屬」操作(如刪除管理員、改密碼)
}
  

目前實作在 admin/index.php 頂端(金色動畫橫條 + 切換社區下拉)。

15.5 新社區一鍵上線 SOP

  1. 平台超管登入 /super/
  2. 點「新增社區」或 add.php
  3. 填寫:社區名稱、社區代碼、縣市、戶數、管理員姓名/帳號、合約迄日
  4. 按「建立」→ 自動:
  5. 超管把「社區代碼 + 管理員帳號 + 預設密碼」交給社區總幹事
  6. 總幹事登入 /admin/login.php,自行改密碼、邀請委員

15.6 多租戶資料隔離規則

⚠️ 每個 admin/*.php 的 SQL 必須有 WHERE 社區id = ?,否則會跨社區洩漏資料。
// 錯誤示範 ❌
$rows = $pdo->query("SELECT * FROM community_公告")->fetchAll();

// 正確 ✅
$stmt = $pdo->prepare("SELECT * FROM community_公告 WHERE 社區id = ?");
$stmt->execute([$社區id]);
$rows = $stmt->fetchAll();
  

檢查工具:SELECT * FROM community_公告 WHERE 社區id IS NULL(理論上不該有)。

15.7 平台超管頁面(/super/)

頁面功能備註
login.php超管登入金黃色品牌、深色背景
index.php社區總覽 + 切換 + 新增 modal首頁
add.php獨立新增社區頁(v1.1)完整表單、縣市下拉
users.php平台員工帳號清單看 4 個超管
finance.php平台帳務 KPI(v1.1)MRR、收繳率、抽成、方案分佈
logs.php切換記錄查詢(v1.1)時間/超管/社區篩選 + 排行
community_edit.php編輯社區資料(v1.1)名稱、方案、狀態、合約、KPI
community_users.php社區管理員 CRUD(v1.1)新增/重設密碼/停用/啟用
logout.php超管登出清 session

15.8 變現路徑(業務視角)

  1. 修繕撮合抽佣 5-10%:住戶報修 → 系統推薦廣告商城廠商 → 完成交易抽佣。預估每社區月收 500-2000 元。
  2. 物業代管 SaaS 月費:方案 pro NT$3,000/月、enterprise NT$10,000/月。100 社區 × NT$3,000 = NT$30 萬 MRR。
  3. 廣告商城月費:廠商付費曝光在社區首頁。NT$3,000-10,000/月/家。
  4. 客製化功能費:投票模組、私訊模組、修繕撮合模組可單獨計價。

15.9 5 個示範社區(種子)

ID名稱代碼戶數方案狀態
1e 社區示範社區demo-riverside120proactive
2翠湖大樓demo-lakeview86freeactive
3大直明水社區demo-mingshui86proactive
4新店青山鎮demo-qingshan220proactive
5板橋巨蛋社區demo-judun156free trialtrial

16. v1.2 目錄結構改版(root 化)

v1.2 改版把所有管理後台從 /e/ 子目錄移到根目錄,URL 更乾淨、更好記。

16.1 Before / After 對照

用途v1.1 (Before)v1.2 (After)
社區後台houses.0800945.com/admin/houses.0800945.com/admin/
平台超管houses.0800945.com/super/houses.0800945.com/super/
商業推廣houses.0800945.com/landing/houses.0800945.com/landing/
舊管委會houses.0800945.com/(根目錄)houses.0800945.com/legacy/
住戶登入houses.0800945.com/e/login.php不變(仍住戶用)
首頁houses.0800945.com/(舊管委會首頁)houses.0800945.com/ → 自動跳 /landing/

16.2 路徑改寫規則

搬檔後所有相對路徑都從「../../」改為「../e/」:

// 原本在 /admin/ 內
__DIR__ . '/api/db.php'                  →  __DIR__ . '/../e/api/db.php'
__DIR__ . '/../../includes/email_helper.php'    →  __DIR__ . '/../e/includes/email_helper.php'
__DIR__ . '/../../components/admin_sidebar.php' →  __DIR__ . '/../e/components/admin_sidebar.php'

// HTML href/src
"../assets/style.css"   →  "../e/assets/style.css"
"../docs/..."            →  "../e/docs/..."
"../admin/login.php"     →  "../admin/login.php"  (同層不變)
"../index.php"           →  "../landing/index.php"
"../login.php"           →  "../e/login.php"

// 而 /e/api/ 內的 db.php 改用本地
__DIR__ . '/api/db.php'  →  __DIR__ . '/db.php'  (db.php 移到 /e/api/db.php)
  

16.3 為什麼 /e/ 還在?

/e/ 子目錄現在只剩「住戶端 + 共用資源」:

簡單說:住戶用 /e/,管理員用 /admin/ /super/,訪客用 /landing/,舊系統用 /legacy/

16.4 部署檢查清單

  1. /index.php 存在,會自動跳 /landing/
  2. /admin/ /super/ /landing/ /legacy/ 4 個目錄都在
  3. /e/ 內不再有 admin/ super/ landing/ 子目錄(已刪)
  4. 根目錄不再有 api/ pages/ components/ docs/ css/ index.html(已移到 legacy/)
  5. /e/api/db.php 存在(給 /e/api/ 內檔案用)
  6. /legacy/api/db.php 存在(給舊管委會用,內容相同)

16.5 踩坑記錄(v1.2 改版時)

教訓 1:原本 __DIR__ . '/api/db.php'/admin/ 看是 /api/,搬到 /admin/ 後同樣的字串會試著找 /api/(已不存在)。修法:所有 /e/api/ 內檔案改用 __DIR__ . '/db.php'(db.php 移到同目錄)。
教訓 2:PHPMailer 內 global $pdoloadEmailConfig() 內,呼叫方必須先 include db.php。修法:super/email_*.php 和 leads.php 都要先 require db.php。
教訓 3:local copy script 用 os.listdir() 只列檔案,不會建子目錄。修法:landing/assets/ 要手動 Copy-Item -Recurse。

17. 網站設定系統(v7.0 新增)

總公司後台完整網站設定系統。後台改任何欄位即時套用到全站前台(下次 request 自動讀取新值)。

17.1 資料表 community_網站設定(id=1 單筆)

這張表只有 1 筆 紀錄,存全站共用設定:

基本 (6 欄):
  網站名稱, 網站簡稱, 網站標語, 網站網域, 網站Logo, Favicon

SEO (8 欄):
  SEO標題, SEO描述, SEO關鍵字, OG圖片, OG類型, Twitter卡片,
  GA追蹤ID, GTM容器ID, Facebook像素ID

聯絡 (5 欄):
  聯絡電話, 聯絡Email, 聯絡地址, 客服時段, 客服Email

社群 (5 欄):
  LINE官方帳號, LINE官方連結, Facebook網址, Instagram網址,
  YouTube網址, Threads網址

公司 (6 欄):
  公司名稱, 統一編號, 公司地址, 公司電話, 代表人, 客服傳真

內容頁 (6 欄,HTML 文字):
  關於本站, 隱私權政策, 服務條款, Cookie說明, 廣告說明, 聯絡我們說明

版權 / 開關 (6 欄):
  版權年份起, ICP備案, 啟用Cookie同意, 啟用分析, 維護模式, 維護訊息

後台 (2 欄):
  最後更新時間, 最後更新者
  

總計 50 個欄位。詳細 schema 見 community_site_settings_schema.sql

17.2 Helper /e/includes/site_config.php

任何頁面 include 這個 helper 就能用 site() 系列函式讀取設定:

// 用法
require_once __DIR__ . '/../e/api/db.php';
require_once __DIR__ . '/../e/includes/site_config.php';

site('網站名稱', '預設值')    // 讀單一欄位,靜態快取整個 request
site_all()                    // 一次拿全部 50 個欄位(array)
site_url()                    // 取得網站根 URL,無結尾 /
site_full_url('/path')        // 網站根 + 路徑
site_copyright()              // "© 2026 辰宇科技股份有限公司 ..."
site_meta_tags(['title' => '...', 'description' => '...', 'url' => '...'])
                              // 渲染 head 完整 meta:title + description +
                              // og:* + twitter:* + (啟用時) GA/GTM/FB 像素 JS
  

設計:static 快取 + 自動 fallback,DB 連線失敗時頁面不會壞,只回 default 值。

17.3 後台 /super/site_settings.php

總公司後台的「網站設定」入口,左側 sidebar 加了入口卡片(v7.0 起)。

17.4 前台 6 個內容頁 /landing/

about.php       關於本站      從 site('關於本站') 讀 HTML
privacy.php     隱私權政策    從 site('隱私權政策') 讀
terms.php       服務條款      從 site('服務條款') 讀
cookies.php     Cookie 說明   從 site('Cookie說明') 讀
ads.php         廣告說明      從 site('廣告說明') 讀
contact.php     聯絡我們      從 site('聯絡我們說明') 讀 + 4 個 contact-card
  

每頁都有:site_meta_tags head + 共用 topbar + 共用 5 欄 footer。

17.5 共用 Footer 組件 /e/components/site_footer.php

6 個內容頁都用同一個 footer(5 欄 grid:品牌 / 產品 / 登入 / 聯絡 / 法遵)。

用法:

<?php include __DIR__ . '/../e/components/site_footer.php'; ?>
  

風格跟 /landing/index.php 一致(深色背景 + 5 欄 + 社交圖示 + 底部版權)。響應式:900px 變 2 欄、600px 變 1 欄。

17.6 重要 pitfall(必讀)

Pitfall 1:utf8mb3 表不能存 emoji
community_網站設定CHARSET=utf8mb3 跟其他舊表一致,4-byte 字元(emoji)存不了
修法:所有寫入 DB 的 HTML 內容用 純文字,不要用 emoji icon。要 icon 用 SVG / icon font 純 UI 元件(不進 DB)。
症狀:寫了 emoji 會 1366 Incorrect string value。
Pitfall 2:email 統一用 @0800945.com
用戶實際網域是 0800945.com,不是 e-house.tw
修法:所有 email 預設 *@0800945.com,包括 fallback、預設文案、模板變數。
掃描 SOP:本地 .php + DB 內容 + 線上頁面三層掃描確認。
Pitfall 3:/e/docs/ 相對路徑要跳兩層
../admin//e/docs/ 看會到 /e/admin/(已刪,404)。
修法:要跳到根的 /admin/../../admin/
規則../../ 跳到根、../assets/ ../api/ ../components/ ../includes/ ../config/ ../docs/ ../e/ 留在 /e/*
Pitfall 4:super/login.php db.php 順序
titlesite('網站名稱') 必須 GET 也能用。
修法db.php + site_config.php 放在檔案最頂部(GET 也 require),不只是 POST 區塊內。
Pitfall 5:DB collation
database 預設 utf8mb3,新表用 utf8mb4 collation 會跟舊表查詢時 identifier 解析不一致。
修法:新表用 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci 跟舊表一致。
症狀:pymysql 查新表會出現 Table 'xxx.community_xxx' doesn't exist

17.7 擴充 SOP(新增網站設定欄位)

  1. DB 新增欄位(用 ALTER TABLE 或重建 community_網站設定
  2. /super/site_settings.php 加 form 欄位(<input name="新欄位">
  3. fields 陣列加新欄位名(讓 POST 處理器抓到)
  4. 前台任何頁面用 site('新欄位', '預設') 讀取
  5. 驗證 + 部署 + 更新本指南

17.8 E2E 結果(v7.0 上線時)


📚 相關文件
📖 完整操作指南
📖 管委會手冊
📖 總幹事手冊
📖 住戶手冊