ThinkAdmin v5 是一個基於 ThinkPHP 5.1 和 ThinkLibrary 開發的後台管理系統。
我們致力於二次開發底層框架,提供完整的組件及API,基於此框架可以快速開發應用,另外項目安裝及二次開發可以參考 ThinkPHP 官方文檔,資料庫文件擺放在項目根目錄下。
ThinkAdmin 非常適用快速二次開發,默認集成 微信開發組件,支持微信服務號,微信支付,支付寶支付,阿里雲OSS存儲,七牛雲存儲,本地伺服器存儲。
注意事項 :
項目測試需要自行搭建環境導入資料庫( admin_v5.sql )並修改配置( config/database.php );
若操作提示「測試系統禁止操作」等字樣,需要刪除演示路由配置( route/demo.php )或清空路由文件;
當前版本使用 ThinkPHP 5.1.x,對 PHP 版本標註不低於 PHP 5.6,具體請閱讀 ThinkPHP 官方文檔;
環境需開啟 PATHINFO,不再支持 ThinkPHP 的 URL 兼容模式運行(源於如何優雅的展示);
登錄頁面
後台首頁
開發文檔:http://doc.thinkadmin.top/thinkadmin-v5
開發前請認真閱讀 ThinkPHP 官方文檔會對您有幫助哦!
本地開發命令php think run
,使用http://127.0.0.1:8000
訪問項目。
PHP 開發技術交流( QQ 群 513350915)
ThinkAdmin 為 MIT 協議開源項目,安裝使用或二次開發不受約束,歡迎 fork 項目。
部分代碼及功能組件來自互聯網,若有異議可以聯繫作者進行刪除。
在線體驗地址:https://demo.thinkadmin.top (賬號和密碼都是 admin )
Gitee倉庫地址:https://gitee.com/zoujingli/ThinkAdmin
Github倉庫地址:https://github.com/zoujingli/ThinkAdmin
執行 build.cmd
可更新 Composer
插件,會刪除並替換 vendor
目錄
執行 php think run
啟用本地開發環境,訪問 http://127.0.0.1:8000
執行 php think xsync:admin
從線上服務更新 admin
模塊的所有文件(注意文件安全)
執行 php think xsync:wechat
從線上服務更新 wechat
模塊的所有文件(注意文件安全)
執行 php think xsync:plugs
從線上服務更新 plugs
靜態插件的部分文件(注意文件安全)
執行 php think xsync:service
從線上服務更新 service
模塊的所有文件(注意文件安全)
執行 php think xsync:config
從線上服務更新 config
項目配置的部分文件(注意文件安全)
執行 php think xfans:all
更新已經對接的公眾號全部列表
執行 php think xfans:list
更新已經對接的公眾號粉絲列表
執行 php think xfans:tags
更新已經對接的公眾號標籤列表
執行 php think xfans:black
更新已經對接的公眾號黑名單列表
執行 php think xtask:reset
重啟消息任務守護進程
執行 php think xtask:start
啟動消息任務守護進程
執行 php think xtask:state
查詢消息任務守護進程
執行 php think xtask:stop
暫停消息任務守護進程
執行 php think xclean:session
清理無效的會話SESSION文件
執行 php think xclean:store
清理無效的訂單信息及定時任務
ThinkAdmin 的許可權管理基於標準RBAC
簡化而來,去除了繁雜的節點管理,使得許可權管理起來更簡單,具體包含節點管理、許可權管理、菜單管理、用戶管理。
自 ThinkAdmin v5 版本開始,系統節點使用代碼註釋實現;
需要加入許可權控制的訪問方法,需要寫上標準的塊註釋。如:
/** * 操作的名稱 * @auth true # 表示需要驗證許可權 * @menu true # 在菜單編輯的節點可選項 */ public function index(){ // @todo }
此版本的許可權使用註解實現
註釋必需使用標準的塊註釋,如下案例
其中@auth true
表示訪問需要許可權驗證
其中@menu true
顯示在菜單編輯的節點可選項
創建好許可權后,需要給許可權配置好需要控制的節點的列表。
如:許可權A只能訪問哪些節點,就需要勾選對應功能的節點。
菜單創建與編輯里,要特別注意菜單對應的節點規範。
如:admin/menu/index
如果在節點註釋中含menu true
則該節點會出現在自動提示中。
添加用戶后,需要給用戶配置對應許可權。
注意admin
為超級用戶,不需要配置許可權,因為他擁有後台所有許可權。
ThinkLibrary 與 ThinkPHP 組合起來就是現在的 ThinkAdmin v5,都是基於 Composer 來管理;
如果需要使用到 ThinkLibrary 裡面的功能,控制器需要繼承 \library\Controller
類。
在控制器訪問中只需加入$this->page(表名)
可以顯示默認數據表的分頁列表;
如果需要對列表進行條件處理,可以使用查詢器來實現。如:
// 創建查詢器 $query = $this->_query('表名')->where(['status'=>'1']); // 查詢器分頁輸出 $query->page();
注意:在 ThinkPHP 5.1 之後,控制器不需要直接返回內容了,函數_page
裡面使用HttpResponseException
直接輸出機制。
另外對於url
輸入的變數也可以快速輸入到查詢器條件中,如:
// 創建查詢器 $query = $this->_query('表名'); // 切入url參數,接收 username 和 sex 並使用 like 查詢,接收 status 使用 eq 查詢 $query->like('username,sex')->equal('status'); // 查詢器分頁輸出 $query->page();
有時候,url
輸入的名稱與數據欄位不一定是匹配的,所以需要用到別名,這裡就需要按規則寫條件,如:
// 切入url參數,接收 username_alias 和 sex 並使用 like 查詢,接收 user_status 使用 eq 查詢 // 這裡用到了別名,username_alias 對應資料庫中的 username 欄位,user_status 對應資料庫的 status 欄位 $query = $this->_query('表名')->like('username#username_alias,sex')->equal('status#user_status'); // 查詢器分頁輸出 $query->page();
輸出額外數據到模板,與 ThinkPHP 操作無異,如:
// 額外列表數據賦值到模板,模板里直接使用變數 $userList $this->userList = Db::name('User')->where(['status'=>'1'])->select(); // 切入url參數,接收 username 和 sex 並使用 like 查詢,接收 status 使用 eq 查詢 $query = $this->_query('表名')->like('username,sex')->equal('status'); // 查詢器分頁輸出 $query->page();
對於通過page
方法實現的即將顯示到模板的列表,還可以進行引用二次處理,如:
protected function _page_filter(&$data){ // 這裡可以對 $data 進行二次處理,注意是引用 } ### 當一個控制器存在多個page操作時,可以指定回調前綴 protected function _index_page_filter(&$data){ // 精準回調對 $data 進行二次處理,注意是引用 }
下面提供一個完整的DEMO
/** * 系統操作日誌 * @auth true * @menu true * @throws \think\Exception * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ public function index() { $this->title = '系統操作日誌'; $query = $this->_query($this->table)->like('action,node,content,username,geoip'); $query->dateBetween('create_at')->order('id desc')->page(); } /** * 列表數據處理 * @param array $data * @throws \Exception */ protected function _index_page_filter(&$data) { $ip = new \Ip2Region(); foreach ($data as &$vo) { $result = $ip->btreeSearch($vo['geoip']); $vo['isp'] = isset($result['region']) ? $result['region'] : ''; $vo['isp'] = str_replace(['內網IP', '0', '|'], '', $vo['isp']); } }
ThinkLibrary 表單處理可能簡化數據保存與更新操作,
控制器只需要一行代碼,就可以實現數據添加與更新,如:
$this->_form('表名','模板名稱');
當然,這裡使用了HttpResponseException
直接輸出,不需要返回內容的。
需要給模板額外賦值,可以直接在控制器$this->username='你的值';
這樣在模板中可以直接使用$username
變數;
如果提交的表單數據包含指定主鍵時則為更新操作,否則為添加記錄;
另外對錶單還有callback
操作(參數使用引用),統一名稱為protected function _form_filter(&$data)
另外關於模板的使用,可以參考下demo哦。
對於表單操作,Controller
內置了兩個回調方法,如:
[_ACTION]_form_filter($vo) [_ACTION]_form_result($result, $vo)
當回調函數返回false
時,Controller
默認的行為將不會執行。
/** * 添加拼團 * @auth true */ public function add() { $this->title = '添加拼團'; $this->_form($this->table, 'form'); } /** * 編輯拼團 * @auth true */ public function edit() { $this->title = '編輯拼團'; $this->_form($this->table, 'form'); } /** * 添加拼團商品表單處理 * @param array $data * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ protected function _form_filter(&$data) { if (empty($data['code'])) $data['code'] = Data::uniqidNumberCode(10); if ($this->request->isGet()) { $map = ['package_code' => $data['code']]; $data['list'] = Db::name('StoreGoodsGroupList')->where($map)->select(); } else { if (empty($data['logo'])) $this->error('請上傳商品圖標圖片'); if (empty($data['image'])) $this->error('請上傳商品展示圖片'); if (empty($data['item_number'])) $this->error('請添加套卡包含內容'); $all = []; foreach (array_keys($data['item_number']) as $key) $all[] = [ 'package_code' => $data['code'], 'goods_code' => $data['item_code'][$key], 'goods_type' => $data['item_type'][$key], 'goods_title' => $data['item_title'][$key], 'goods_number' => $data['item_number'][$key], ]; try { Db::transaction(function () use ($data, $all) { $map = ['package_code' => $data['code']]; Db::name('StoreGoodsGroupList')->where($map)->delete(); Db::name('StoreGoodsGroupList')->insertAll($all); }); } catch (Exception $e) { $this->error("商品詳情處理失敗,{$e->getMessage()}"); } } } /** * 表單結果處理 * @param boolean $result */ protected function _form_result($result) { if ($result && $this->request->isPost()) { $this->success('商品編輯成功!', 'javascript:history.back()'); } }
如果是在 ThinkAdmin 後台基於 admin.js 的情況下,可使用 form[data-auto] 來與 $this->_form 配合使用。
數據刪除同樣也只需要一行代碼$this->_delete('表名');
前端只需要傳入數據表的主鍵就可以了,不需要做額外處理。
如果數據表中不存在is_deleted
欄位,則為硬刪除。
當前數據表中存在is_deleted
欄位時,$this->_delete
則自動為軟刪除操作,
在列表操作時加上條件過濾下就可以正常操作。
對於數據刪除的結果,可以進行自定義處理,回調函數規則如:[_ACTION]_delete_result
下面提供一個完整的demo:
/** * 刪除系統許可權 * @auth true */ public function remove() { $this->applyCsrfToken(); $this->_delete($this->table); } /** * 刪除結果處理 * @param boolean $result * @throws \think\Exception * @throws \think\exception\PDOException */ protected function _remove_delete_result($result) { if ($result) { $where = ['auth' => $this->request->post('id')]; Db::name('SystemAuthNode')->where($where)->delete(); $this->success("許可權刪除成功!", ''); } else { $this->error("許可權刪除失敗,請稍候再試!"); } }
如果是在 ThinkAdmin 後台基於 admin.js 的情況下,可台使用 data-action 來與 $this->_delete 配合使用。
前端提交上來的主鍵值支持多個,以英文逗號分隔。
數據更新主要用於 數據狀態更新,比如:數據禁用,數據啟用,狀態更改
在服務端只需要一行代碼$this->_save($this->table)
就可以實現更新操作。
前端需要提供需要修改的數據ID以及數據狀態值,當然也可以後第二個參數指定(強烈建議配置第二個欄位)
這個地方可能存在數據惡意修改的情況,所有指定第二個參數非常有必要。
下面提供一個完整的demo,數據禁用與啟用操作:
/** * 啟用系統菜單 * @auth true * @throws \think\Exception * @throws \think\exception\PDOException */ public function resume() { $this->applyCsrfToken(); $this->_save($this->table, ['status' => '1']); } /** * 禁用系統菜單 * @auth true * @throws \think\Exception * @throws \think\exception\PDOException */ public function forbid() { $this->applyCsrfToken(); $this->_save($this->table, ['status' => '0']); }
如果是在 ThinkAdmin 後台基於 admin.js 的情況下,可台使用 data-action 來與 $this->_save 配合使用。
前端提交上來的主鍵值支持多個,以英文逗號分隔。
體驗賬號及密碼都是admin
在線體驗地址:https://v1.thinkadmin.top
Github 代碼地址:https://github.com/zoujingli/ThinkAdmin/tree/v1
在線體驗地址:https://v2.thinkadmin.top
Github 代碼地址:https://github.com/zoujingli/ThinkAdmin/tree/v2
在線體驗地址:https://v3.thinkadmin.top
Github 代碼地址:https://github.com/zoujingli/ThinkAdmin/tree/v3
在線體驗地址:https://v4.thinkadmin.top
Github 代碼地址:https://github.com/zoujingli/ThinkAdmin/tree/v4
在線體驗地址:https://v5.thinkadmin.top
Github 代碼地址:https://github.com/zoujingli/ThinkAdmin/tree/v5
[admin
]