phpcms的adminclassphp

來源:互聯網
上載者:User
defined('IN_PHPCMS') or exit('No permission resources.');
/* phpcms v9 登入是採用session ,儲存session 有兩種方式,一種是資料庫儲存的方式,一種是檔案儲存體方式,預設是資料庫儲存方式。有時資料庫這種方式不行,可以在 \caches\configs\system.php 中修改sesion 的儲存方式//Session配置 'session_storage' => 'mysql',將其改為//Session配置'session_storage' => 'files',反正是不可為空,否則不會登入成功。 */
$session_storage = 'session_'.pc_base::load_config('system','session_storage');//session儲存方式存到檔案
pc_base::load_sys_class($session_storage);
if(param::get_cookie('sys_lang')) { //語言套件
define('SYS_STYLE',param::get_cookie('sys_lang')); //在登陸的時候被設定
} else {
define('SYS_STYLE','zh-cn');
}
//定義在後台
define('IN_ADMIN',true);
class admin {
public $userid;
public $username;

public function __construct() {
self::check_admin(); //判斷使用者是否已經登陸
self::check_priv(); //檢查該使用者是否有許可權
pc_base::load_app_func('global','admin');
if (!module_exists(ROUTE_M)) showmessage(L('module_not_exists'));//模組不存在提示的資訊
self::manage_log();
self::check_ip(); //檢測被禁止的ip
self::lock_screen(); //鎖屏
self::check_hash(); //hash安全驗證
if(pc_base::load_config('system','admin_url') && $_SERVER["HTTP_HOST"]!= pc_base::load_config('system','admin_url')) {
Header("http/1.1 403 Forbidden"); //設定無權訪問
exit('No permission resources.');
}
}

/**
* 判斷使用者是否已經登陸
*/
final public function check_admin() {
//如果在登入介面
//ROUTE_M擷取模型,ROUTE_C擷取控制器,ROUTE_A擷取事件
if(ROUTE_M =='admin' && ROUTE_C =='index' && in_array(ROUTE_A, array('login', 'public_card'))) {
return true;//一旦返回true,將終止後續代碼的執行
} else {
//判斷session是否有userid,roleid,如果有的話不做處理,沒有的話返回登陸介面
$userid = param::get_cookie('userid');
if(!isset($_SESSION['userid']) || !isset($_SESSION['roleid']) || !$_SESSION['userid'] || !$_SESSION['roleid'] || $userid != $_SESSION['userid']) showmessage(L('admin_login'),'?m=admin&c=index&a=login');
}
}

/**
* 載入後台模板
* @param string $file 檔案名稱
* @param string $m 模型名
*/
final public static function admin_tpl($file, $m = '') {
$m = empty($m) ? ROUTE_M : $m;
if(empty($m)) return false; //判斷$m為空白返回false
return PC_PATH.'modules'.DIRECTORY_SEPARATOR.$m.DIRECTORY_SEPARATOR.'templates'.DIRECTORY_SEPARATOR.$file.'.tpl.php'; //返回modules/ROUTE_M/templates/ 尾碼為$file.tpl.php
}


/**
* 擷取管理菜單
* 按父ID尋找菜單子項
* @param integer $parentid 父菜單ID
* @param integer $with_self 是否包括他自己
* @param 菜單是儲存在menu資料表中的。當我們二次開發需要新增菜單時候,只需要在menu表中插入相應menu的id、name、parentid、m、c、a、data等資訊即可。當然為了讓除了超級管理員之外的角色可以訪問該menu,還需要在admin_role_priv表中配置許可權。
*/
final public static function admin_menu($parentid, $with_self = 0) {
$parentid = intval($parentid); //擷取變數的整數值,預設是十進位
$menudb = pc_base::load_model('menu_model'); //引用model子類,實現資料庫等操作
$site_model = param::get_cookie('site_model'); //model子類
$where = array('parentid'=>$parentid,'display'=>1); //parentid父節點id
if ($site_model && $parentid) {
$where[$site_model] = 1;
}
//擷取其全部的子功能表
$result =$menudb->select($where,'*',1000,'listorder ASC'); //listorder就是後台中排序前那個號來排序,可以進行編輯
if($with_self) {
$result2[] = $menudb->get_one(array('id'=>$parentid));
$result = array_merge($result2,$result); //array_merge — 將數組的值賦給上一個數組
}
//許可權檢查。如果是超級管理員,則全部返回
if($_SESSION['roleid'] == 1) return $result; //將角色id存入session
//找出有許可權的部分(根據admin_role_priv_model表)
$array = array();
$privdb = pc_base::load_model('admin_role_priv_model'); //調用model子類
$siteid = param::get_cookie('siteid');
foreach($result as $v) {
$action = $v['a'];
//對於公有方法,允許存取通過
if(preg_match('/^public_/',$action)) { //首碼為public
$array[] = $v;
} else {
//對於ajax開頭的方法,只截取後半部分方法名
if(preg_match('/^ajax_([a-z]+)_/',$action,$_match)) $action = $_match[1];
//嘗試擷取當前角色$roleid是否有對應的m、c、a的操作許可權記錄//嘗試擷取當前角色$roleid是否有對應的m、c、a的操作許可權記錄
$r = $privdb->get_one(array('m'=>$v['m'],'c'=>$v['c'],'a'=>$action,'roleid'=>$_SESSION['roleid'],'siteid'=>$siteid));
if($r) $array[] = $v; //判斷$r。。將$v賦值給一個$array[]
}
}
return $array;
}




/**
* 擷取菜單 頭部菜單導航
*
* @param $parentid 菜單id
* @param 主要是用來產生相關菜單的所有子功能表導航(一般顯示在iframe架構內容頁的上部)
*/
final public static function submenu($parentid = '', $big_menu = false) {
if(empty($parentid)) {
$menudb = pc_base::load_model('menu_model'); //引用model子類
$r = $menudb->get_one(array('m'=>ROUTE_M,'c'=>ROUTE_C,'a'=>ROUTE_A));
$parentid = $_GET['menuid'] = $r['id']; //
}
$array = self::admin_menu($parentid,1); //父菜單$parentid中的名字,包括父菜單

$numbers = count($array); //計算數組中的單元數目或對象中的屬性個數
if($numbers==1 && !$big_menu) return '';
$string = '';
$pc_hash = $_SESSION['pc_hash'];
foreach($array as $_value) {
if (!isset($_GET['s'])) {
$classname = ROUTE_M == $_value['m'] && ROUTE_C == $_value['c'] && ROUTE_A == $_value['a'] ? 'class="on"' : '';
} else {
$_s = !empty($_value['data']) ? str_replace('=', '', strstr($_value['data'], '=')) : '';
$classname = ROUTE_M == $_value['m'] && ROUTE_C == $_value['c'] && ROUTE_A == $_value['a'] && $_GET['s'] == $_s ? 'class="on"' : '';
}
if($_value['parentid'] == 0 || $_value['m']=='') continue;
if($classname) {
$string .= " ".L($_value['name'])."|";
} else {
$string .= " ".L($_value['name'])."|";
}
}
$string = substr($string,0,-14);
return $string;
}
/**
* 當前位置
*
* @param $id 菜單id
*/
//利用遞迴,擷取某一個menu的所有父菜單層級,作為HTML片段返回
final public static function current_pos($id) {
$menudb = pc_base::load_model('menu_model');
$r =$menudb->get_one(array('id'=>$id),'id,name,parentid');
$str = '';
if($r['parentid']) {
$str = self::current_pos($r['parentid']);
}
return $str.L($r['name']).' > ';
}


/**
* 擷取當前的網站ID
*/
final public static function get_siteid() {
return get_siteid();
}

/**
*
* 擷取當前網站資訊
* @param integer $siteid 網站ID號,為空白時取當前網站的資訊
* @return array
* 登入時擷取網站介面
*/
final public static function get_siteinfo($siteid = '') {
if ($siteid == '') $siteid = self::get_siteid();
if (empty($siteid)) return false;
$sites = pc_base::load_app_class('sites', 'admin');
return $sites->get_by_id($siteid);
}
final public static function return_siteid() {
$sites = pc_base::load_app_class('sites', 'admin');
$siteid = explode(',',$sites->get_role_siteid($_SESSION['roleid']));
return current($siteid);
}
/**
* 許可權判斷
*/
//檢查使用者是否正在訪問m、c、a、的操作許可權
final public function check_priv() {
//登入介面:一旦返回true,將終止後續代碼的執行
if(ROUTE_M =='admin' && ROUTE_C =='index' && in_array(ROUTE_A, array('login', 'init', 'public_card'))) return true;

//roleid:1 超級管理員,一旦返回true,將終止後面代碼的執行
if($_SESSION['roleid'] == 1) return true;
$siteid = param::get_cookie('siteid'); //網站id
$action = ROUTE_A; //方法
$privdb = pc_base::load_model('admin_role_priv_model');
if(preg_match('/^public_/',ROUTE_A)) return true; //如果以public_開頭的方法
if(preg_match('/^ajax_([a-z]+)_/',ROUTE_A,$_match)) { //以ajax_開頭的方法,則只截取後半部分作為查詢條件
$action = $_match[1]; //匹配結果
}
//嘗試擷取有無m、a、roleid siteid都複合的許可權記錄
$r =$privdb->get_one(array('m'=>ROUTE_M,'c'=>ROUTE_C,'a'=>$action,'roleid'=>$_SESSION['roleid'],'siteid'=>$siteid));
if(!$r) showmessage('您沒有許可權操作該項','blank');
}
/**
*
* 記錄日誌
*/
final private function manage_log() {
//判斷是否記錄
$setconfig = pc_base::load_config('system');
extract($setconfig);
if($admin_log==1){ //是否記錄後台動作記錄
$action = ROUTE_A; //方法
if($action == '' || strchr($action,'public') || $action == 'init' || $action=='public_current_pos') {
return false; //以上幾種方法除外
}else {
$ip = ip();
$log = pc_base::load_model('log_model');//資料表
$username = param::get_cookie('admin_username');//使用者名稱
$userid = isset($_SESSION['userid']) ? $_SESSION['userid'] : '';//使用者id
$time = date('Y-m-d H-i-s',SYS_TIME); //系統時間
$url = '?m='.ROUTE_M.'&c='.ROUTE_C.'&a='.ROUTE_A; //操作地址
$log->insert(array('module'=>ROUTE_M,'username'=>$username,'userid'=>$userid,'action'=>ROUTE_C, 'querystring'=>$url,'time'=>$time,'ip'=>$ip)); //記錄動作記錄入庫
}
}
}

/**
*
* 後台IP禁止判斷 ...
*/
final private function check_ip(){
$this->ipbanned = pc_base::load_model('ipbanned_model');
$this->ipbanned->check_ip();
}
/**
* 檢查鎖屏狀態
*/
final private function lock_screen() {
if(isset($_SESSION['lock_screen']) && $_SESSION['lock_screen']==1) {
if(preg_match('/^public_/', ROUTE_A) || (ROUTE_M == 'content' && ROUTE_C == 'create_html') || (ROUTE_M == 'release') || (ROUTE_A == 'login') || (ROUTE_M == 'search' && ROUTE_C == 'search_admin' && ROUTE_A=='createindex')) return true;
showmessage(L('admin_login'),'?m=admin&c=index&a=login');
}
}
/**
* 檢查hash值,驗證使用者資料安全性
*/
final private function check_hash() {
//如果是公有方法、管理首頁、登陸介面等不需要hash認證的,予以允許存取
if(preg_match('/^public_/', ROUTE_A) || ROUTE_M =='admin' && ROUTE_C =='index' || in_array(ROUTE_A, array('login'))) {
return true;
}
//不管是GET還是POST來的pc_hash,如果能和服務端pc_hash對應的上,則pass
if(isset($_GET['pc_hash']) && $_SESSION['pc_hash'] != '' && ($_SESSION['pc_hash'] == $_GET['pc_hash'])) {
return true;
} elseif(isset($_POST['pc_hash']) && $_SESSION['pc_hash'] != '' && ($_SESSION['pc_hash'] == $_POST['pc_hash'])) {
return true;
} else {
showmessage(L('hash_check_false'),HTTP_REFERER);
}
}

/**
* 後台資訊列表模板
* @param string $id 被選中的模板名稱
* @param string $str form表單中的屬性名稱
*/


final public function admin_list_template($id = '', $str = '') {
$templatedir = PC_PATH.DIRECTORY_SEPARATOR.'modules'.DIRECTORY_SEPARATOR.'content'.DIRECTORY_SEPARATOR.'templates'.DIRECTORY_SEPARATOR;
$pre = 'content_list';
$templates = glob($templatedir.$pre.'*.tpl.php');
if(empty($templates)) return false;
$files = @array_map('basename', $templates);
$templates = array();
if(is_array($files)) {
foreach($files as $file) {
$key = substr($file, 0, -8);
$templates[$key] = $file;
}
}
ksort($templates);
return form::select($templates, $id, $str,L('please_select'));
}
}

以上就介紹了phpcms的adminclassphp,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.