這份文件是給工程師看的。包含架構、目錄結構、命名規範、API 設計、新增功能 SOP、部署、維護清單。每次新增或修改功能都必須更新本文件。
┌──────────────────────────────────────────────────┐ │ 住戶(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) │ └──────────────────────────────────────────────────┘
| 層 | 技術 | 備註 |
|---|---|---|
| 伺服器 | PHP 8.x + MySQL 8.0 | hosts.0800945.com (主機商 aaPanel) |
| 前端 | 原生 HTML + CSS + JavaScript(無框架) | 響應式、PWA |
| PWA | manifest.json + Service Worker | 可加到桌面像 APP |
| 推播 | LINE Messaging API | LINE OA + Push Message |
| 登入 | LINE OAuth + Email OTP(之後) | 住戶用 LINE 一鍵 |
| 金流 | 綠界 ECPay(Phase 3) | ATM/超商/信用卡 |
| SMTP(待設定) | 推播備援 | |
| QR Code | api.qrserver.com(外部) | 免費、無限流量 |
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/
└── ...
community_ 前綴(避免與舊管委會資料表衝突)id、社區id、建立日、更新日 是每表必備KEY idx_xxx)社區類 (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 個欄位
run_xxx_schema.py 腳本)SHOW TABLES LIKE 'community_%')- 分隔(例:parcel-qr.php,但已存在的用底線)parcel_create.php、msg_fetch.phpcommittee.php、finance.phpcommunity_中文名中文(id、建立日、更新日 除外)idx_欄位 或 uk_唯一鍵$rows、$listtrim($_POST['xxx'] ?? '')$_SESSION['admin'] / $_SESSION['user'].block__element--modifier--primary: #6366f1、--secondary: #8b5cf61. 住戶訪問 /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
所有 admin/*.php 開頭都檢查:if (!($_SESSION['admin'] ?? null)) { header('Location: login.php'); exit; }
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['super'],模擬社區身份存 $_SESSION['admin']。返回超管時檢查 $_SESSION['super'] 即可還原。
// 成功
{"ok": true, "id": 123, "data": {...}}
// 失敗
{"error": "錯誤訊息"}
HTTP 401 (未登入)
HTTP 400 (缺欄位)
HTTP 404 (找不到)
header('Content-Type: application/json; charset=utf-8');
action.php(單一動作)或 resource_action.phpresource_fetch.php、resource_list.phpparcel_create.php、msg_fetch.php、chat_send.php#6366f1 / #8b5cf6)components/admin_sidebar.php — 後台側邊欄(每頁 include)assets/style.css — 共用樣式(含 --primary、.btn-*、.card 等)
<?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>
community_v4_schema.sql 之後)e/admin/xxx.php,遵循頁面樣板components/admin_sidebar.php 加連結e/api/xxx.php,遵循 API 規範e/resident/xxx.phpdocs/MASTER_GUIDE.php 加章節§4 表格清單、§3 目錄結構 加新檔案# 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
# 1. 寫 Python 上傳腳本 python upload_xxx.py # 2. 確認伺服器檔案 python verify_xxx.py # 3. 在瀏覽器測試 https://houses.0800945.com/admin/xxx.php
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()
write 工具。php -l xxx.phphead -c 3 xxx.php | xxd 應該是 3c 3f 70)php -r 'include "..."; var_dump($rows);')password_hash(),驗證用 password_verify()$pdo->prepare())trim() + htmlspecialchars() 輸出$_GET 直接組 SQLeval()httponly、samesite=Strict(之後做)changelog 陣列(加一行)§4 表格清單(如新增/修改表)§3 目錄結構(如新增/修改檔案)§9 新增功能 SOP(如新增/修改流程)§11 測試 SOP(如新增測試案例)§12 維護清單(如需新維護任務)e 社區從 v1.1 開始支援多社區 SaaS:同一個站台的同一個資料庫,可同時跑 N 個社區。每個社區的資料完全隔離,但共用程式碼 / 共用基礎建設(推播、金流、檔案)。
┌──────────────────────────────────────────────────┐ │ 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 登入) │ └──────────────────────────────────────────────────┘
每個社區有一個社區代碼(community_社區.社區代碼),規則:
[a-z0-9-])demo-riverside、mingshui-9ge、qingshan-220用途:
state=社區代碼,決定登入到哪個社區?c=社區代碼houses.0800945.com,用社區代碼區分)平台超管要進到某個社區看資料,但不能直接用該社區管理員帳號(避免記住 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 就能正確過濾。
// 任何 admin/*.php 內
$is_super_sim = ($_SESSION['admin']['角色'] ?? '') === 'super';
if ($is_super_sim) {
// 顯示「你正在以超管身份模擬 社區X」橫條
// 顯示「返回超管後台」按鈕
// 隱藏某些「管理員專屬」操作(如刪除管理員、改密碼)
}
目前實作在 admin/index.php 頂端(金色動畫橫條 + 切換社區下拉)。
/super/add.php/admin/login.php,自行改密碼、邀請委員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(理論上不該有)。
| 頁面 | 功能 | 備註 |
|---|---|---|
| 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 |
| ID | 名稱 | 代碼 | 戶數 | 方案 | 狀態 |
|---|---|---|---|---|---|
| 1 | e 社區示範社區 | demo-riverside | 120 | pro | active |
| 2 | 翠湖大樓 | demo-lakeview | 86 | free | active |
| 3 | 大直明水社區 | demo-mingshui | 86 | pro | active |
| 4 | 新店青山鎮 | demo-qingshan | 220 | pro | active |
| 5 | 板橋巨蛋社區 | demo-judun | 156 | free trial | trial |
v1.2 改版把所有管理後台從 /e/ 子目錄移到根目錄,URL 更乾淨、更好記。
| 用途 | 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/ |
搬檔後所有相對路徑都從「../../」改為「../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)
/e/ 子目錄現在只剩「住戶端 + 共用資源」:
/e/login.php — 住戶 LINE 登入/e/resident/ — 住戶報修、看公告/e/api/ — LINE webhook、聯絡表單、寄信 API(給 LINE OA 用)/e/includes/ — PHPMailer、email_helper/e/assets/ — Logo、CSS、favicon/e/components/ — admin_sidebar(後台共用)/e/config/ — LINE Channel 設定/e/docs/ — 文件(操作手冊 + 開發者指南)簡單說:住戶用 /e/,管理員用 /admin/ /super/,訪客用 /landing/,舊系統用 /legacy/。
/index.php 存在,會自動跳 /landing//admin/ /super/ /landing/ /legacy/ 4 個目錄都在/e/ 內不再有 admin/ super/ landing/ 子目錄(已刪)api/ pages/ components/ docs/ css/ index.html(已移到 legacy/)/e/api/db.php 存在(給 /e/api/ 內檔案用)/legacy/api/db.php 存在(給舊管委會用,內容相同)__DIR__ . '/api/db.php' 從 /admin/ 看是 /api/,搬到 /admin/ 後同樣的字串會試著找 /api/(已不存在)。修法:所有 /e/api/ 內檔案改用 __DIR__ . '/db.php'(db.php 移到同目錄)。
global $pdo 在 loadEmailConfig() 內,呼叫方必須先 include db.php。修法:super/email_*.php 和 leads.php 都要先 require db.php。
os.listdir() 只列檔案,不會建子目錄。修法:landing/assets/ 要手動 Copy-Item -Recurse。
總公司後台完整網站設定系統。後台改任何欄位即時套用到全站前台(下次 request 自動讀取新值)。
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。
/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 值。
/super/site_settings.php總公司後台的「網站設定」入口,左側 sidebar 加了入口卡片(v7.0 起)。
/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。
/e/components/site_footer.php6 個內容頁都用同一個 footer(5 欄 grid:品牌 / 產品 / 登入 / 聯絡 / 法遵)。
用法:
<?php include __DIR__ . '/../e/components/site_footer.php'; ?>
風格跟 /landing/index.php 一致(深色背景 + 5 欄 + 社交圖示 + 底部版權)。響應式:900px 變 2 欄、600px 變 1 欄。
community_網站設定 用 CHARSET=utf8mb3 跟其他舊表一致,4-byte 字元(emoji)存不了。@0800945.com0800945.com,不是 e-house.tw。*@0800945.com,包括 fallback、預設文案、模板變數。/e/docs/ 相對路徑要跳兩層../admin/ 從 /e/docs/ 看會到 /e/admin/(已刪,404)。/admin/ 用 ../../admin/。../../ 跳到根、../assets/ ../api/ ../components/ ../includes/ ../config/ ../docs/ ../e/ 留在 /e/*。
title 用 site('網站名稱') 必須 GET 也能用。db.php + site_config.php 放在檔案最頂部(GET 也 require),不只是 POST 區塊內。
utf8mb3,新表用 utf8mb4 collation 會跟舊表查詢時 identifier 解析不一致。DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci 跟舊表一致。Table 'xxx.community_xxx' doesn't exist。
ALTER TABLE 或重建 community_網站設定)/super/site_settings.php 加 form 欄位(<input name="新欄位">)fields 陣列加新欄位名(讓 POST 處理器抓到)site('新欄位', '預設') 讀取