ThinkSNS 作為基於 ThinkPHP 的社交網絡系統,其模組化架構設計極具參考價值。本文詳細拆解核心層、擴展層、應用層三大體系的職責邊界、目錄佈局、命名規範,並以「禮物應用」為例示範從建表到上線的完整開發流程,幫助開發者快速上手二次開發或移植模組。
| 術語 | 職責 | 目錄位置 |
|---|---|---|
| 核心 | MVC 分離、DB 抽象、基礎類庫 | /core/ |
| 服務 | 全域通用功能封裝(郵件、認證等) | /addons/services/ |
| 公共 Model | 跨應用共用資料模型(附件、地區等) | /addons/models/ |
| 插件 | 獨立功能模組(第三方登入、勳章等) | /addons/plugins/ |
| Widget | 頁面可複用程式碼區塊(評論、好友選擇) | /addons/widgets/ |
| 第三方類庫 | 外部開源庫 | /addons/libs/ |
| 應用 | 獨立業務模組(微博、相簿、日誌) | /apps/ |
| API | 對外介面 | /api/ |
ThinkSNS2.0/
├─ _runtime/ 運行時快取
├─ addons/ 擴展庫
│ ├─ libs/ 第三方類庫
│ ├─ models/ 公共 Model
│ ├─ plugins/ 插件
│ ├─ services/ 系統服務
│ └─ widgets/ 系統 Widget
├─ api/ API 庫
├─ apps/ 系統應用
│ ├─ admin/ 管理後台
│ ├─ home/ Home 應用
│ ├─ myop/ 漫游應用
│ ├─ wap/ 手機 WAP
│ └─ weibo/ 微博應用
├─ core/ 核心
│ ├─ sociax/ 系統核心文件
│ ├─ ThinkPHP/ ThinkPHP 核心
│ └─ sociax.php 核心引導
├─ data/ 站點資料
├─ install/ 安裝文件
├─ public/ 靜態資源
├─ access.php 節點權限控制
├─ cleancache.php 快取清理
├─ config.inc.php 站點配置
├─ index.php 統一入口
├─ shorturl.php 短網址
└─ thumb.php 縮圖生成
apps/
└─ gift/ 應用代號
├─ Appinfo/ 安裝資訊、圖示、SQL
├─ Common/ common.php 公共函數
├─ Conf/ config.php 專案配置
├─ Language/ 多語言包
├─ Lib/
│ ├─ Action/ 控制器
│ ├─ Model/ 模型
│ └─ Widget/ 應用專用 Widget
└─ Tpl/ 模板、CSS、JS
└─ default/
├─ Index/ 對應 IndexAction
└─ Public/ 共用樣式/腳本
統一入口 index.php,路由格式:
index.php?app=APP_NAME&mod=Action&act=method
app:應用目錄名(如 weibo、gift)mod:控制器類名(不含 Action 後綴)act:方法名| 服務類型 | 調用方式 | 範例 |
|---|---|---|
| 系統函數 | 直接呼叫 | getUserName($uid) |
| 服務 | service('Name')->method() | service('Passport')->isLogged() |
| 公共 Model | model('Name')->method() | model('Area')->getAreaList() |
| Widget | W('Name', $params) | {:W('SelectFriend')} |
| 第三方類庫 | include_once 後實例化 | new PHPMailer() |
<script>
function openDialog() {
ui.box.load('url/to/content', {title: '標題'});
}
function closeDialog() {
ui.box.close();
}
</script>
<script>
ui.success('更新完成');
ui.error('新 Email 已存在');
</script>
<textarea id="editor" name="content"></textarea>
<script>
$(document).ready(function(){
E = KISSY.Editor("editor");
});
</script>
ts_gift_category:分類(id, name, status, cTime)ts_gift:禮物(id, categoryId, name, num, price, img, status, cTime)ts_gift_user:送禮記錄(id, fromUserId, toUserId, giftPrice, giftImg, sendInfo, sendWay, cTime)SQL 檔置於 Appinfo/install.sql,含建表、預設分類、禮物資料、系統配置、微博模板。
依標準結構建立 apps/gift/ 下所有子目錄,注意大小寫。
// Common/common.php
function getConfig($key = null) { /* 讀取應用配置 */ }
// Lib/Model/GiftCategoryModel.class.php
class GiftCategoryModel extends Model { }
// Lib/Model/GiftModel.class.php
class GiftModel extends Model { }
// Lib/Model/UserGiftModel.class.php
class UserGiftModel extends Model {
public function sendGift($data) {
// 扣除積分邏輯
$setCredit = X('Credit');
$userCredit = $setCredit->getUserCredit($fromUid);
if ($userCredit[$moneyType]['credit'] < $prices) {
return $userCredit[$moneyType]['alias'] . '不足,贈送失敗~';
}
$setCredit->setUserCredit($fromUid, [$moneyType => $prices], -1);
// 發送通知
$this->__doNotify($toUser, $sendInfo, $giftInfo, $fromUid, $appId);
return true;
}
}
// Lib/Action/IndexAction.class.php
class IndexAction extends Action {
public function index() {
$money = X('Credit')->getUserCredit($this->mid);
$moneyType = getConfig('credit');
$this->assign('money', $money[$moneyType]);
// ... 顯示禮物列表、分頁
}
public function sendbox() {
if (isset($_SESSION['gift_send_weibo'])) {
$this->assign('tpl_data', $_SESSION['gift_send_weibo']);
unset($_SESSION['gift_send_weibo']);
}
}
}
遵循 ThinkSNS 佈局慣例:
<include file="__THEME__/header" />
<include file="../Public/_mainNav" />
<div class="content">
<div class="main no_l">
<div class="mainbox">
<div class="mainbox_C no_r">
<div id="Pagination" class="pagination">{$gifts.html}</div>
</div>
</div>
</div>
</div>
<include file="__THEME__/footer" />
{:W('SelectFriend')} → $_POST['fri_ids'] 取得 ID 陣列findPage() 回傳物件含 $gifts.html{:W('Weibo', ['tpl_name'=>'gift_send_weibo', 'button_title'=>'分享'])}// Language/cn/notify.php
return array(
'gift_send' => array(
'title' => '{actor}給您送了一個禮物',
'body' => $img . '
' . $sendback . '
... 去看看'
)
);
// Lib/Action/AdminAction.class.php
import('admin.Action.AdministratorAction');
class AdminAction extends AdministratorAction {
public function _initialize() {
parent::_initialize(); // 權限檢查
// ...
}
}
對應模板置於 Tpl/default/Admin/。
info.php:應用元資料(名稱、入口、圖示、統計入口等)install.php:執行 install.sql,失敗自動回滾uninstall.php:刪除資料表、系統配置、模板、積分規則dump($var) 列印變數M()->getLastSql() 檢查 SQLConf/config.php 設 DEBUG_MODE = true 開啟 ThinkPHP 除錯模式(需清快取)雖屬 apps/weibo/,但為核心應用:Widget、WAP、API 均依賴其資料與介面。
源自康盛漫游平台,URL 結構與 ThinkSNS 不同,使用獨立精簡框架,模板獨立於 apps/myop/themes/classic/,修改公共版面時需同步更新此目錄。
遵循 ThinkPHP 官方規範:命名與編碼規範
ThinkSNS 採用「核心 + 擴展 + 應用」三層解耦架構,應用獨立性極高,開發新功能等同於建立新專案。掌握目錄規範、服務調用、模板佈局、安裝包制作五大要素,即可高效進行二次開發或模組移植。