## 知識點
1、后臺common控制器設置
2、權限設置
3、分離列表顯示和排序處理
4、后臺首頁權限判斷
5、分離配置列表和編輯
6、前臺首頁注冊登錄權限
7、自定義彈窗提示信息
8、獲取配置信息
[TOC]
## 一、后臺common控制器設置
### (一)思路分析
首先,對common.php設置權限(登錄才能訪問)
其次,其它控制器必須繼承common.php
~~~
public function _initialize() {
// 用戶未登錄則跳轉前臺登錄頁面
if(session('uid') == null){
session(null);
$this->redirect('index/user/login');
}
}
~~~
### (二)相關代碼修改
#### 1、后臺控制器繼承common.php
#### 2、common.php控制器delete函數修改
~~~
public function _initialize() {
// 用戶未登錄則跳轉前臺登錄頁面
if(session('uid') == null){
session(null);
$this->redirect('index/user/login');
}
}
~~~
#### 3、安全退出
~~~
public function loginout(){
session(null);
$this->redirect('index/user/login');
}
~~~
#### 4、模板里面輸出session變量
~~~
{:session('username')}
~~~
## 二、權限設置
### (一)判斷是夠超級管理員
#### 1、配置文件
這里今后需要變動文件路徑
位置:\application\admin\config.php
~~~
return [
'auth_superadmin' => '37', //Auth權限認證超管ID
];
~~~
#### 2、引入文件
文件:common.php
~~~
use util\Auth;
class Common extends Controller {
public function _initialize() {
// 用戶未登錄則跳轉前臺登錄頁面
if(session('uid') == null){
session(null);
$this->redirect('index/user/login');
}
// 判斷權限
if(!in_array(session('uid'), explode(',',config('auth_superadmin')))){
$auth = new Auth();
$rule = strtolower(request()->module().'/'.request()->controller().'/'.request()->action());
if(!$auth->check($rule, session('uid'))){
return error('您沒有相應操作權限!');
}
}
}
}
~~~
備注:TP5中_initialize()函數是不支持return方法的
### (二)判斷權限函數
#### 1、引入類庫
use util\Auth;
#### 2、設置權限
文件:\application\common.php
~~~
function checkAuth() {
if(!in_array(session('uid'), explode(',',config('auth_superadmin')))){
$auth = new Auth();
$rule = strtolower(request()->module().'/'.request()->controller().'/'.request()->action());
return $auth->check($rule, session('uid'));
}else{
return true;
}
}
~~~
#### 3、權限調用
~~~
// 判斷權限
if(!checkAuth()){
return error('您沒有相應的操作權限!');
}
~~~
## 三、分離列表顯示和排序處理
### (一)原來代碼
~~~
public function index($tab = 1, $id = 0){
// 1個分類(從表) 屬于 1個模型(主表) 屬于[belongsTo]
// 1個模型 有 多個分類
if(request()->isPost()){
foreach (input('post.listorder/a') as $key => $value) {
Db::name('menu')->where('id',$key)->update(['listorder'=>$value]);
}
return success('排序更新成功!',url('index',['tab'=>$tab]));
}else{
$menuArray = MenuModel::order('listorder')->select();
foreach ($menuArray as $key => $value) {
$menuList[] = $value->toArray(); //對象轉數組
}
$tree = new Tree();
$tree->tree($menuList,'id','parentid','name');
$menu = $tree->getArray();
$this->assign('menu',$menu);
// 編輯菜單,默認加載
if( 3 == $tab ){
// 獲取所要編輯菜單的信息
$info = Db::name('menu')->where('id',$id)->find();
if($info!=null && is_array($info)){
$this->assign('info',$info);
}
}
}
return view();
}
~~~
### (二)現在代碼
#### 1、列表顯示
~~~
public function index($tab = 1, $id = 0){
// 判斷權限
if(!checkAuth()){
echo "<script>parent.window.location.href='/admin/index/index';</script>";
exit;
}
$menuArray = MenuModel::order('listorder')->select();
foreach ($menuArray as $key => $value) {
$menuList[] = $value->toArray(); //對象轉數組
}
$tree = new Tree();
$tree->tree($menuList,'id','parentid','name');
$menu = $tree->getArray();
$this->assign('menu',$menu);
// 編輯菜單,默認加載
if( 3 == $tab ){
// 獲取所要編輯菜單的信息
$info = Db::name('menu')->where('id',$id)->find();
if($info!=null && is_array($info)){
$this->assign('info',$info);
}
}
return view();
}
~~~
#### 2、排序功能
~~~
public function sort() {
if(request()->isPost()){
// 判斷權限
if(!checkAuth()){
return error('您沒有相應的操作權限!');
}
foreach (input('post.listorder/a') as $key => $value) {
Db::name('menu')->where('id',$key)->update(['listorder'=>$value]);
}
return success('排序更新成功!',url('index',['tab'=>$tab]));
}
}
~~~
#### 3、模板修改
主要涉及排序模板提交處理地址,列表不存在修改
#### 4、權限調用
~~~
if(!checkAuth()){
return error('您沒有相應的操作權限!');
}
~~~
#### 5、列表權限調用特別
~~~
// 判斷權限
if(!checkAuth()){
echo "<script>parent.window.location.href='/admin/index/index';</script>";
exit;
}
~~~
## 四、后臺首頁權限判斷
### (一)思路分析
標識:admin/index/index
思路:前臺登錄時判斷權限,即有沒有機會進入后臺首頁。
我個人認為,完全不必要這樣判斷,只需判斷該賬戶是不是指定管理員,是就進入后臺首頁,否則進入個人會員中心。
這個有個缺陷,就是管理員必須手動指定,缺乏靈活性。如果是正式CMS系統,還是按上面的思路進行權限判斷。
### (二)具體實現
需要改動兩個地方
首先,修改超管配置文件
原來配置文件路徑是:\application\admin\config.php
這里只適合后臺調用該配置文件內容
~~~
return [
'auth_superadmin' => '37', //Auth權限認證超管ID
];
~~~
現在配置文件路徑:\application\config.php
這里配置文件的內容前后臺都可以調用
就是這個道理
其次,修改前臺登錄操作
原來代碼
~~~
public function login(){
if(request()->isPost()){
$data = input('post.');//p($data);die;
//判斷用戶名是否存在
//$map['username'] = $data['username'];
//$user = Db::name('user')->where($map)->find();
//判斷用戶名或手機號是否存在
$user = Db::name('user')->where('username|mobile',$data['username'])->find();
if($user){
if($user['password'] == md5($data['password'])){
//寫入Session
session('uid',$user['id']);
session('username',$user['username']);
// 臨時安全設置
$url = $user['username'] == 'manage' ? url('/manage') : url('/');
//返回成功信息
$data['status'] = 200;
//$data['url'] = url('/manage');
$data['url'] = $url;
return json($data);
}else{
//返回錯誤信息
$data['status'] = 202;
$data['msg'] = '登錄密碼錯誤!';
return json($data);
}
}else{
//返回錯誤信息
$data['status'] = 202;
$data['msg'] = '用戶名不存在!';
return json($data);
}
}else{
return view('../application/index/view/default/user/login.html');
}
}
~~~
現在代碼
~~~
public function login(){
if(request()->isPost()){
$data = input('post.');
//判斷用戶名或手機號是否存在
$user = Db::name('user')->where('username|mobile',$data['username'])->find();
if($user){
if($user['password'] == md5($data['password'])){
//寫入Session
session('uid',$user['id']);
// 判斷權限
if(!checkAuth()){
session(null);
//返回錯誤信息
$data['status'] = 202;
$data['msg'] = '您沒有權限登錄系統后臺!';
return json($data);
}else{
//返回成功信息
$data['status'] = 200;
$data['url'] = url('/admin');
return json($data);
}
}else{
//返回錯誤信息
$data['status'] = 202;
$data['msg'] = '登錄密碼錯誤!';
return json($data);
}
}else{
//返回錯誤信息
$data['status'] = 202;
$data['msg'] = '用戶不存在!';
return json($data);
}
}else{
return view('../application/index/view/default/user/login.html');
}
}
~~~
同樣,注冊時也需要進行權限判斷
還有,就是后臺凡是需要權限判斷的,都加相關代碼,無非兩種
第一,post提交的權限判斷,很簡單,代碼如下:
~~~
if(!checkAuth()){
return error('您沒有相應的操作權限!');
}
~~~
第二,不是post提交權限判斷,即列表權限判斷
~~~
if(!checkAuth()){
echo "<script>parent.window.location.href='/admin/index/index';</script>";
exit;
}
~~~
## 五、分離配置列表和編輯
原來代碼
~~~
public function index($tab=1){
if(request()->isPost()){
// 判斷權限
if(!checkAuth()){
return error('您沒有相應的操作權限!');
}
$config = new ConfigModel;
if ($config->saveConfig(input('post.'))) {
return success('配置更新成功',url('index',['tab'=>$tab]));
}else{
return error('配置更新失敗',url('index',['tab'=>$tab]));
}
}else{
$config = ConfigModel::column('varname,value');
$this->assign('site',$config);
return view();
}
}
~~~
現在代碼
~~~
public function index()
{
$configList = ConfigModel::column('varname,value');
$this->assign('site',$configList);
return view();
}
public function edit($tab = "1") {
if(request()->isPost()){
// 判斷權限
if(!checkAuth()){
return error('您沒有相應的操作權限!');
}
$config = new ConfigModel;
if($config->saveConfig(input('post.'))){
return success('配置更新成功!',url('index',['tab'=>$tab]));
}else{
return error('配置更新失敗!',url('index',['tab'=>$tab]));
}
}
}
~~~
## 六、前臺首頁注冊登錄權限
~~~
public function login(){
if(request()->isPost()){
$data = input('post.');
//判斷用戶名或手機號是否存在
$user = Db::name('user')->where('username|mobile',$data['username'])->find();
if($user){
if($user['password'] == md5($data['password'])){
//寫入Session
session('uid',$user['id']);
// 判斷權限
if(!in_array(session('uid'), explode(',',config('auth_superadmin')))){
$auth = new Auth();
$rule = 'manage/index/content';
if($auth->check($rule, session('uid'))){
//返回成功信息
$data['status'] = 200;
$data['url'] = url('/manage');
return json($data);
}else{
session(null);
//返回錯誤信息
$data['status'] = 202;
$data['msg'] = '您沒有權限登錄系統后臺!';
return json($data);
}
}else{
//返回成功信息
$data['status'] = 200;
$data['url'] = url('/manage');
return json($data);
}
}else{
//返回錯誤信息
$data['status'] = 202;
$data['msg'] = '登錄密碼錯誤!';
return json($data);
}
}else{
//返回錯誤信息
$data['status'] = 202;
$data['msg'] = '用戶不存在!';
return json($data);
}
}else{
return view('../application/index/view/default/user/login.html');
}
}
~~~
## 七、自定義彈窗提示信息
之前事件響應是post方式的submit,現在如果是get方式如何實現自定義彈窗提示?
### (一)后臺處理
~~~
public function content($id = 0)
{
if($id){
// 判斷權限
if(!checkAuth()){
$id = 0;
echo "<script src='/static/admin/js/jquery.min.js?v=2.1.4'></script>".
"<script>$(document).ready(function(){ layer.open({content: '您沒有相應的操作權限!',btn: ['確定'],icon: 2,shade: 0.1}); });</script>";
}
$catname = getCatInfoById($id, 'catname');
$this->assign('catname',$catname);
$this->assign('id',$id);
}
return view();
}
~~~
判斷權限也可以換成
~~~
// 判斷權限
if(!checkAuth()){
return $this->error('您沒有相應的操作權限!');
}
~~~
備注:函數中是不能模板變量的
### (二)模板
~~~
"url": "{:url('getDataTables',['id'=>input('id')])}",
換成
"url": "{:url('getDataTables',['id'=>$id])}",
<script>
$(document).ready(function() {
$("#dataTables-example").dataTable({
"serverSide": true,
"ajax": {
"url": "{:url('getDataTables',['id'=>$id])}",
"data": function(d) {
d.extra_search = "title|username";
}
},
"ordering": false, //禁用全局排序
"order": [0, '`listorder` desc'],
"lengthMenu": [5, 10, 20, 50, 100],
// "dom": '<l <"#normalToos">f>t<ip>',
"dom": "<'row'<'#normalToos.col-xs-4'><'col-xs-8'f>>" +
"<'row'<'col-xs-12't>>" +
"<'row'<'col-xs-6'li><'col-xs-6'p>>",
"language": {
"zeroRecords": "沒有檢索到數據",
"lengthMenu": "每頁 _MENU_ 條記錄 ",
"search": "搜索 ",
"info": "共 _PAGES_ 頁,_TOTAL_ 條記錄,當前顯示 _START_ 到 _END_ 條",
"paginate": {
"previous": "上一頁",
"next": "下一頁",
}
},
"columns": [{
render: function(data, type, row, meta) {
return '<input type="checkbox" class="i-checks" name="ids[' + row.id + ']">';
}
}, {
data: "id"
}, {
data: "title"
}, {
data: "username"
}, {
data: "inputtime"
}, {
data: "views"
}, {
data: "operate"
}, ],
"drawCallback": function() {
normal_init();
},
"initComplete": function() {
$("#normalToos").append("<div class='m-b-xs'>" +
"<div class='btn-group' id='exampleTableEventsToolbar' role='group'>" +
"<a class='btn btn-sm btn-outline btn-default' title='添加' target='_parent' href='{:url('add',['id'=>input('id',0)])}'>" +
"<i class='glyphicon glyphicon-plus' aria-hidden='true'></i></a>" +
"<button type='submit' class='btn btn-sm btn-outline btn-default' title='刪除'>" +
"<i class='glyphicon glyphicon-trash' aria-hidden='true'></i></button></div></div>");
}
});
});
</script>
~~~
## 八、獲取配置信息
### 1、后臺處理
~~~
public function _initialize() {
// 用戶未登錄則跳轉前臺登錄頁面
if(session('uid') == null){
session(null);
$this->redirect('index/user/login');
}
// 獲取配置信息
if(!cache('config')){
$config = db('config')->column('varname,value');
cache('config',$config);
}
$this->assign('config',cache('config'));
}
~~~
### 2、模板調用
~~~
<title>{$config.sitename} - 后臺主頁</title>
~~~
- Layer無刷新不跳轉彈框提示信息
- 整合ThinkPHP+實用代碼
- TP整合Layer插件實現無刷新
- 自定義助手函數
- 添加信息失敗后不跳轉
- 三種無限級分類
- TP常用代碼
- 自定義公共函數
- TP模型管理專題
- TP模型管理之添加模型
- sfox_newmodel.sql
- TP模型管理之刪除模型
- TP模型管理之編輯模型
- TP模型管理之字段添加
- sfox_newmodel.sql_edit
- layer_hplus.js_edit
- TP模型管理之字段刪除
- TP模型管理之字段編輯
- TP模型管理之預覽模型
- TP模型管理之公共函數
- layer_hplus.js_修訂一
- TP模型管理之預覽模型靜態頁
- 后臺內容管理系統
- 分類樹顯示
- 內容列表顯示
- 信息發布
- 編輯信息
- layer_hplus.js
- myJs第一版
- myJs第二版
- myJs第三版
- myJs第四版
- TP5插件用法
- Datatables
- WebUploader
- bootstrap-fileinput
- UEditor
- 簡單調用
- 路徑問題
- 跨域多圖上傳
- 跨域單圖上傳
- UEditor圖片跨域上傳解決方案
- 定制工具欄圖標
- ajaxFileUpload
- LayUI
- 圖片上傳
- layui分頁
- 搜索頁
- 搜索優化及刪除
- Uploadify
- TP5前端應用
- 靜態首頁
- 前臺首頁功能實現
- 自定義標簽庫
- 前臺模板繼承應用
- 首頁自定義標簽改進
- 文章內容頁
- 自定義標簽改進
- 自定義標簽修正
- 圖片等比例自動縮放
- 后臺權限管理
- 角色管理
- 規則管理
- 權限設置
- 會員管理
- 權限管理
- 前臺登錄注冊功能
- 注冊登錄
- 阿里大于手機注冊
- 阿里大于升級阿里云短信服務
- 自動登錄完成
- PHP異位或加密實現自動登陸
- 微信開發
- 分享接口
- 靜態頁面實現微信分享
- 動態頁微信分享
- 頁面靜態化
- 1-全站靜態化前期配置
- 2-鏈接地址靜態化
- TP5常用片段代碼
- 加載靜態資源路徑與常量
- thinkphp5預定義常量
- 刪除某文件夾的內容
- 解壓插件包
- 異步提交插件
- 其他功能
- 背景音樂
- 手機訪問PC網站自動跳轉到手機網站代碼
- 手機微信音樂MP3播放器
- 后盾之網頁背景音樂
- 播放器寬度自適應
- 前臺首頁數據調用
- 視頻列表
- 搜索分頁
- H5解決蘋果(IOS)不能自動播放音樂
- 清空緩存
- 文件處理常識
- 刪除路徑下的所有文件夾和文件
- 一鍵清空緩存
- 評論留言
- 格式化時間
- 替換微博內容的URL地址@用戶與表情
- PHP正則理解
- jQuery評論插件
- TP空操作
- TP路由
- 跨域訪問
- 設置請其頭允許跨域請求
- 模板前臺判斷手機訪問跳轉手機網址代碼
- PHP遍歷一個文件夾下所有文件和子文件夾
- PHP獲取視頻的第一幀與時長
- TP5數據庫
- 鏈式操作原理
- update替換字段部分內容
- 后臺開發
- 后臺登錄頁居中顯示
- TP5自帶驗證碼
- JS & JQuery專題
- 二級城市聯動菜單
- 模板引擎
- 混合模板編譯
- 黃永成TP微博開發
- 消息推送
- memcache安裝
- 插件開發
- 插件介紹
- 插件鉤子
- 淺談初步理解鉤子
- 插件鉤子(hooks)分析
- 插件鉤子簡單理解
- 控制器調用插件
- 鉤子通用處理函數
- 插件基類代碼
- 插件測試代碼
- 淺談鉤子與插件
- 技術綜合
- 常用代碼
- PHP
- 56個PHP開發常用代碼片段(上)
- 56個PHP 開發常用代碼片段(中)
- 56個PHP 開發常用代碼片段(下)
- sublime text安裝自動補全注釋的插件
- 影音視頻開發
- 視頻
- H5視頻直播掃盲
- 音樂
- 語音
- PHP實現語音播報功能
- MUI
- 窗體操作