properties[$name] = $value; } public function __get(string $name) { return $this->properties[$name]; }*/ /** * 初始化共享控制器 */ public function __construct() { //parent::initController(...$params); // 部分虚拟主机会报500错误 //\Config\Services::response()->removeHeader('Content-Type'); self::$instance =& $this; if (defined('IS_INSTALL')) { // 安装程序不执行他 return; } elseif (defined('IS_COMMON')) { // 防止重复实例化 return $this; } define('IS_COMMON', 1); // 版本 if (!is_file(MYPATH.'Config/Version.php')) { $this->cmf_version = [ 'id' => 8, 'name' => 'XunRui', 'version' => 'dev', 'downtime' => SYS_TIME, 'updatetime' => '--', ]; } else { $this->cmf_version = \Phpcmf\Service::R(MYPATH.'Config/Version.php'); } define('CMF_NAME', $this->cmf_version['name']); define('CMF_VERSION', $this->cmf_version['version']); define('CMF_UPDATE_TIME', IS_XRDEV ? SYS_TIME : str_replace(['-', ' ', ':'], '', file_get_contents(WRITEPATH.'install.lock'))); // 站点配置 if (is_file(WRITEPATH.'config/site.php')) { $this->site_info = require WRITEPATH.'config/site.php'; if ($this->site_info && is_array($this->site_info)) { foreach ($this->site_info as $id => $t) { !$t['SITE_DOMAIN'] && $t['SITE_DOMAIN'] = DOMAIN_NAME; $this->site[$id] = $id; $this->site_info[$id] = $t; $this->site_info[$id]['SITE_ID'] = $id; $this->site_info[$id]['SITE_URL'] = dr_http_prefix($t['SITE_DOMAIN'].'/'); $this->site_info[$id]['SITE_MURL'] = dr_http_prefix(($t['SITE_MOBILE'] ? $t['SITE_MOBILE'] : $t['SITE_DOMAIN']).'/'); $this->site_info[$id]['SITE_IS_MOBILE'] = $t['SITE_MOBILE'] ? (strpos($t['SITE_MOBILE'], '/') ? 2 : 1) : 0; } define('IS_SITES', count($this->site_info) > 1 ? 1 : 0); } else { if (IS_DEV) { dr_show_error(dr_lang('项目配置文件不规范,请检查cache/config/site.php文件数据是否完整', SITE_ID)); } else { dr_show_error(dr_lang('项目配置文件不规范')); } } } else { $this->site_info[1] = [ 'SITE_ID' => 1, 'SITE_URL' => dr_http_prefix(DOMAIN_NAME.'/'), 'SITE_MURL' => dr_http_prefix(DOMAIN_NAME.'/'), ]; define('IS_SITES', 0); } // 站点id !defined('SITE_ID') && define('SITE_ID', 1); // 项目站点不存在 if (!isset($this->site_info[SITE_ID]) || !$this->site_info[SITE_ID]) { // 这里不能用语言函数,因为还没有被初始化语言 if (IS_DEV) { dr_show_error('项目【'.SITE_ID.'】配置文件不存在,请检查cache/config/site.php文件数据是否完整'); } else { dr_show_error('项目配置文件不存在'); } } // 站点共享变量 define('SITE_URL', $this->site_info[SITE_ID]['SITE_URL']); define('SITE_MURL', $this->site_info[SITE_ID]['SITE_MURL']); define('SITE_NAME', $this->site_info[SITE_ID]['SITE_NAME']); define('SITE_LOGO', $this->site_info[SITE_ID]['SITE_LOGO']); define('SITE_IS_MOBILE', $this->site_info[SITE_ID]['SITE_IS_MOBILE']); // 是否存在移动端 define('SITE_IS_MOBILE_HTML', (int)$this->site_info[SITE_ID]['SITE_IS_MOBILE_HTML']); define('SITE_MOBILE_DIR', $this->site_info[SITE_ID]['SITE_MOBILE_DIR']); // 移动端目录 define('SITE_MOBILE_NOT_PAD', (int)$this->site_info[SITE_ID]['SITE_MOBILE_NOT_PAD']); // pad不归类为移动端 define('SITE_THUMB_WATERMARK', $this->site_info[SITE_ID]['SITE_THUMB_WATERMARK']); define('SITE_THEME', dr_strlen($this->site_info[SITE_ID]['SITE_THEME']) ? $this->site_info[SITE_ID]['SITE_THEME'] : 'default'); define('SITE_SEOJOIN', dr_strlen($this->site_info[SITE_ID]['SITE_SEOJOIN']) ? $this->site_info[SITE_ID]['SITE_SEOJOIN'] : '_'); define('SITE_REWRITE', (int)$this->site_info[SITE_ID]['SITE_REWRITE']); define('SITE_TEMPLATE', dr_strlen($this->site_info[SITE_ID]['SITE_TEMPLATE']) ? $this->site_info[SITE_ID]['SITE_TEMPLATE'] : 'default'); define('SITE_LANGUAGE', dr_strlen($this->site_info[SITE_ID]['SITE_LANGUAGE']) && is_file(ROOTPATH.'api/language/'.$this->site_info[SITE_ID]['SITE_LANGUAGE'].'/lang.php') ? $this->site_info[SITE_ID]['SITE_LANGUAGE'] : (is_file(WRITEPATH.'lang.default') ? file_get_contents(WRITEPATH.'lang.default') : 'zh-cn')); define('SITE_TIME_FORMAT', dr_strlen($this->site_info[SITE_ID]['SITE_TIME_FORMAT']) ? $this->site_info[SITE_ID]['SITE_TIME_FORMAT'] : 'Y-m-d H:i:s'); // 客户端识别 $this->is_mobile = defined('IS_MOBILE') ? 1 : (IS_ADMIN ? 0 : \Phpcmf\Service::IS_MOBILE_USER()); // 后台域名 !defined('ADMIN_URL') && define('ADMIN_URL', dr_http_prefix(DOMAIN_NAME.'/')); // 设置时区 if (dr_strlen($this->site_info[SITE_ID]['SITE_TIMEZONE']) > 0) { date_default_timezone_set('Etc/GMT'.($this->site_info[SITE_ID]['SITE_TIMEZONE'] > 0 ? '-' : '+').abs($this->site_info[SITE_ID]['SITE_TIMEZONE'])); // 设置时区 } // 全局URL define('PAY_URL', $this->is_mobile ? SITE_MURL : SITE_URL); // 付款URL define('ROOT_URL', $this->site_info[1]['SITE_URL']); // 主站URL define('OAUTH_URL', PAY_URL); // 第三方登录URL if (!defined('THEME_PATH')) { // 系统风格 if (dr_is_root_path() && (IS_ADMIN || (defined('SYS_THEME_ROOT_PATH') && SYS_THEME_ROOT_PATH))) { define('THEME_PATH', '/static/'); define('LANG_PATH', '/api/language/'.SITE_LANGUAGE.'/'); define('ROOT_THEME_PATH', '/static/'); } else { define('THEME_PATH', ROOT_URL.'static/'); } } !defined('LANG_PATH') && define('LANG_PATH', ROOT_URL.'api/language/'.SITE_LANGUAGE.'/'); // 语言包 !defined('ROOT_THEME_PATH') && define('ROOT_THEME_PATH', ROOT_URL.'static/'); // 系统风格绝对路径 if (strpos(SITE_THEME, '/') !== false) { // 远程资源 define('HOME_THEME_PATH', SITE_THEME); // 站点风格 define('MOBILE_THEME_PATH', SITE_THEME); // 移动端站点风格 } else { // 本地资源 define('HOME_THEME_PATH', trim(THEME_PATH == '/static/' ? '/' : ROOT_URL).'static/'.SITE_THEME.'/'); // 站点风格 if (!defined('IS_MOBILE') && \Phpcmf\Service::IS_MOBILE_USER() && $this->site_info[SITE_ID]['SITE_AUTO'] && SITE_URL == SITE_MURL) { // 当开启自适应移动端,没有绑定域名时 define('MOBILE_THEME_PATH', SITE_URL.SITE_MOBILE_DIR.'/static/'.SITE_THEME.'/'); // 移动端站点风格 } else { define('MOBILE_THEME_PATH', SITE_MURL.'static/'.SITE_THEME.'/'); // 移动端站点风格 } } // 本地附件上传目录和地址 if (SYS_ATTACHMENT_PATH && (strpos(SYS_ATTACHMENT_PATH, '/') === 0 || strpos(SYS_ATTACHMENT_PATH, ':') !== false) && is_dir(SYS_ATTACHMENT_PATH)) { // 相对于根目录 // 附件上传目录 define('SYS_UPLOAD_PATH', rtrim(SYS_ATTACHMENT_PATH, DIRECTORY_SEPARATOR).'/'); // 附件访问URL define('SYS_UPLOAD_URL', trim(SYS_ATTACHMENT_URL, '/').'/'); } else { // 在当前网站目录 $path = trim(SYS_ATTACHMENT_PATH ? SYS_ATTACHMENT_PATH : 'uploadfile', '/'); // 附件上传目录 define('SYS_UPLOAD_PATH', ROOTPATH.$path.'/'); // 附件访问URL define('SYS_UPLOAD_URL', (SYS_ATTACHMENT_REL ? FC_NOW_HOST : ROOT_URL).$path.'/'); } // 设置终端模板 $is_auto_mobile_page = 0; if (defined('IS_CLIENT')) { // 存在自定义终端 !defined('CLIENT_URL') && define('CLIENT_URL', dr_http_prefix($this->get_cache('site', SITE_ID, 'client', IS_CLIENT)) . '/'); \Phpcmf\Service::V()->init(defined('IS_CLIENT_TPL') && IS_CLIENT_TPL ? IS_CLIENT_TPL : IS_CLIENT); define('CLIENT_NAME', IS_CLIENT); } elseif (defined('IS_MOBILE') || (\Phpcmf\Service::IS_MOBILE_USER() && $this->site_info[SITE_ID]['SITE_AUTO'])) { // 移动端模板 // 开启自动识别移动端 \Phpcmf\Service::V()->init('mobile'); $is_auto_mobile_page = 1; define('CLIENT_URL', SITE_MURL); define('CLIENT_NAME', 'mobile'); } elseif (IS_USE_MODULE || IS_USE_MEMBER) { // 默认情况下pc模板 define('CLIENT_URL', SITE_URL); \Phpcmf\Service::V()->init('pc'); define('CLIENT_NAME', 'pc'); } else { // 默认情况下模板 define('CLIENT_URL', SITE_URL); \Phpcmf\Service::V()->init('NULL'); define('CLIENT_NAME', ''); } !defined('IS_CLIENT') && define('IS_CLIENT', ''); // 用户系统 $this->member_cache = $this->get_cache('member'); if (IS_CLIENT) { define('MEMBER_URL', CLIENT_URL.(defined('MEMBER_PAGE') && MEMBER_PAGE ? MEMBER_PAGE : 'index.php?s=member')); } else { // 默认域名 define('MEMBER_URL', (!$is_auto_mobile_page ? SITE_URL : SITE_MURL).(defined('MEMBER_PAGE') && MEMBER_PAGE ? MEMBER_PAGE : 'index.php?s=member')); } // 预览开发的id !defined('SITE_FID') && define('SITE_FID', 0); // 姓名字段 define('MEMBER_CNAME', dr_lang($this->member_cache['config']['cname'] ? $this->member_cache['config']['cname'] : '姓名')); // 网站常量 define('SITE_ICP', $this->get_cache('site', SITE_ID, 'config', 'SITE_ICP')); define('SITE_TONGJI', $this->get_cache('site', SITE_ID, 'config', 'SITE_TONGJI')); // 默认登录时间 define('SITE_LOGIN_TIME', $this->member_cache['config']['logintime'] ? max(intval($this->member_cache['config']['logintime']), 500) : 36000); // 定义交易变量 define('SITE_SCORE', dr_lang($this->member_cache['pay']['score'] ? $this->member_cache['pay']['score'] : '金币')); define('SITE_EXPERIENCE', dr_lang($this->member_cache['pay']['experience'] ? $this->member_cache['pay']['experience'] : '经验')); // 验证api提交认证 if (\Phpcmf\Service::L('input')->request('api_token')) { define('IS_API_HTTP', 1); if (!defined('SYS_API_TOKEN') || !SYS_API_TOKEN) { $this->_json(0, dr_lang('API_TOKEN未启用')); } $token = \Phpcmf\Service::L('input')->request('api_token'); if (SYS_API_TOKEN != $token) { $this->_json(0, dr_lang('API_TOKEN不正确')); } if (IS_POST && !$_POST) { $param = file_get_contents('php://input'); if ($param) { $_POST = json_decode($param, true); } } define('IS_API_HTTP_CODE', $token); // 验证账号授权并登录 $auth = \Phpcmf\Service::L('input')->request('api_auth_code'); // 获取当前的登录记录 if ($auth) { // 通过接口的post认证 $uid = (int)\Phpcmf\Service::L('input')->get('api_auth_uid'); if ($uid) { $member = \Phpcmf\Service::M('member')->get_member($uid); // 表示登录成功 if (!$member) { // 不存在的账号 $this->_json(0, dr_lang('api_auth_uid 账号不存在')); } elseif (md5($member['password'].$member['salt']) != $auth) { $this->_json(0, dr_lang('登录超时,请重新登录')); } $this->uid = $uid; $this->member = $member; if (IS_ADMIN) { // 开启session $this->session(); \Phpcmf\Service::M('auth')->login_session($member); } } } } elseif (dr_is_app('httpapi') && \Phpcmf\Service::L('input')->request('appid')) { define('IS_API_HTTP', 1); \Phpcmf\Service::M('http', 'httpapi')->check_auth(); } else { define('IS_API_HTTP', 0); $this->uid = (int)\Phpcmf\Service::M('member')->member_uid(); $this->member = \Phpcmf\Service::M('member')->get_member($this->uid); if (!$this->member) { $this->uid = 0; } // 验证账号cookie的有效性 if ($this->member && !\Phpcmf\Service::M('member')->check_member_cookie($this->member)) { $this->uid = 0; $this->member = []; } } // 访客唯一标识 if (defined('IS_API_HTTP_CODE') && IS_API_HTTP_CODE) { define('USER_HTTP_CODE', IS_API_HTTP_CODE); } else { !defined('USER_HTTP_CODE') && define('USER_HTTP_CODE', md5($this->uid.\Phpcmf\Service::L('input')->ip_address().\Phpcmf\Service::L('input')->get_user_agent())); } if (IS_USE_MODULE && is_file(IS_USE_MODULE.'Config/Run.php')) { require IS_USE_MODULE.'Config/Run.php'; } // 判断是否存在授权登录 if (!IS_ADMIN && $code = \Phpcmf\Service::L('input')->get_cookie('admin_login_member')) { list($uid, $adminid) = explode('-', $code); $uid = (int)$uid; if ($this->uid != $uid) { $admin = \Phpcmf\Service::M()->table('member')->get((int)$adminid); if ($this->session()->get('admin_login_member_code') == md5($uid.$admin['id'].$admin['password'])) { $this->uid = $uid; $this->member = \Phpcmf\Service::M('member')->get_member($this->uid); } } } \Phpcmf\Service::V()->assign([ 'member' => $this->member, ]); if (IS_ADMIN) { // 开启session $this->session(); // 版本 if (!is_file(MYPATH.'Config/License.php')) { define('IS_OEM_CMS', ''); $this->cmf_license = []; } else { $this->cmf_license = \Phpcmf\Service::R(MYPATH.'Config/License.php'); define('IS_OEM_CMS', $this->cmf_license['oem'] ? $this->cmf_license['name'] : ''); } // 后台登录判断 $this->admin = \Phpcmf\Service::M('auth')->is_admin_login($this->member); \Phpcmf\Service::V()->admin(); \Phpcmf\Service::V()->assign([ 'admin' => $this->admin, 'is_ajax' => \Phpcmf\Service::L('input')->get('is_ajax'), 'is_mobile' => \Phpcmf\Service::IS_MOBILE_USER() ? 1 : 0, ]); // 权限判断 $uri = \Phpcmf\Service::L('Router')->uri(); if (!$this->_is_admin_auth($uri)) { // 无权限操作 list($a, $action) = explode('_',\Phpcmf\Service::L('Router')->method); !$action && $action = $a; // 获取操作名称 switch ($action) { case 'add': $name = dr_lang('【增】'); break; case 'edit': $name = dr_lang('【改】'); break; case 'del': $name = dr_lang('【删】'); break; default: $name = dr_lang('【使用】'); break; } $cname = \Phpcmf\Service::M('auth')->get_auth_name(); if (!$cname) { $cname = '#'.$uri; } if (IS_DEV) { if (\Phpcmf\Service::M()->table('admin_menu')->where('mark', $uri)->getRow()) { $this->_admin_msg(0, dr_lang('%s:没有%s权限', $cname, $name). '
请在角色管理-操作权限-勾选'); } else { $this->_admin_msg(0, dr_lang('%s:没有%s权限', $cname, $name). '
权限-后台菜单-没有找到'.$uri); } } $this->_admin_msg(0, dr_lang('%s:没有%s权限', $cname, $name)); } } if (IS_MEMBER && IS_USE_MEMBER) { \Phpcmf\Service::L('member', 'member')->init($this); } // 初始化处理 \Phpcmf\Service::M('member')->init_member($this->member); if (!IS_ADMIN && !IS_API && !in_array(\Phpcmf\Service::L('Router')->class, ['register', 'login', 'api'])) { // 判断网站访问权限 if (!defined('SC_HTML_FILE') && !IS_MEMBER && IS_USE_MEMBER && \Phpcmf\Service::L('member_auth', 'member')->home_auth('show', $this->member)) { $this->_msg(0, dr_lang('您的用户组无权限访问')); } // 账户被锁定 if ($this->member && $this->member['is_lock']) { if (dr_is_app('login') && $this->member['is_lock'] == 2) { // 被插件锁定 if (APP_DIR != 'login') { $this->_msg(0, dr_lang('账号被锁定'), dr_url('login/home/index')); } } else { $this->_msg(0, dr_lang('账号被锁定')); } } } // 加载初始化文件 $this->_init_run(); } /** * 加载初始化文件 */ private function _init_run() { if ($this->is_load_init_run) { return; } $this->is_load_init_run = true; // 附加程序初始化文件 if (is_file(MYPATH.'Init.php')) { require MYPATH.'Init.php'; } // 用户系统初始化 (IS_MEMBER || APP_DIR == 'member') && $this->init_file('member'); // 插件目录初始化(排除用户系统重复触发) APP_DIR && APP_DIR != 'member' && $this->init_file(APP_DIR); // 挂钩点 程序初始化之后 \Phpcmf\Hooks::trigger('cms_init'); } /** * 插件目录初始化文件 */ public function init_file($namespace) { if (!$namespace) { return; } $file = dr_get_app_dir($namespace).'Config/Init.php'; if (dr_in_array($file, $this->load_init)) { return; } if (is_file($file)) { $this->load_init[] = $file; require_once $file; } } /** * 开启session */ public function session() { if ($this->session) { return $this->session; } require_once FRAMEPATH.'Extend/Session.php'; $this->session = new \Frame\Session(); return $this->session; } /** * 缓存页面 */ protected function cachePage(int $time) { return;// 暂时不使用页面缓存 } /** * 读取缓存 */ public function get_cache(...$params) { return \Phpcmf\Service::L('cache')->get(...$params); } /** * 附件信息 */ public function get_attachment($id, $update = 0) { if (!$id) { return null; } if (!$update) { $data = \Phpcmf\Service::L('cache')->get_file('attach-info-'.$id, 'attach'); if ($data) { $data['url'] = dr_get_file_url($data); $data['iscache'] = 1; return $data; } } $id = (int)$id; $data = \Phpcmf\Service::M()->db->table('attachment')->where('id', $id)->get()->getRowArray(); if (!$data) { return null; } elseif ($data['related']) { $info = \Phpcmf\Service::M()->db->table('attachment_data')->where('id', $id)->get()->getRowArray(); } else { $info = \Phpcmf\Service::M()->db->table('attachment_unused')->where('id', $id)->get()->getRowArray(); } if (!$info) { if ($data['related']) { $info = \Phpcmf\Service::M()->db->table('attachment_unused')->where('id', $id)->get()->getRowArray(); } if (!$info) { return null; } } // 合并变量 $info = $data + $info; $info['file'] = SYS_UPLOAD_PATH.$info['attachment']; // 文件真实地址 if ($info['remote']) { $remote = $this->get_cache('attachment', $info['remote']); if (!$remote) { // 远程地址无效 $info['url'] = $info['file'] = '自定义附件('.$info['remote'].')的配置已经不存在'; return $info; } else { $info['file'] = $remote['value']['path'].$info['attachment']; } } // 附件属性信息 $info['attachinfo'] = dr_string2array($info['attachinfo']); $info['url'] = dr_get_file_url($info); \Phpcmf\Service::L('cache')->set_file('attach-info-'.$id, $info, 'attach'); return $info; } // 初始化模块 $rt 是否返回 public function _module_init($dirname = '', $siteid = SITE_ID, $rt = 0) { if (is_file(IS_USE_MODULE.'Config/Module_init.php')) { require_once IS_USE_MODULE.'Config/Module_init.php'; } else { $this->_msg(0, '请升级建站系统插件'); } return 1; } /** * 统一返回json格式并退出程序 */ public function _json($code, $msg, $data = [], $return = false, $extend = []){ // 强制显示提交信息而不采用ajax返回 if (isset($_GET['is_show_msg']) && $_GET['is_show_msg']) { $url = ''; if ($code) { $url = dr_redirect_safe_check(isset($data['url']) ? $data['url'] : ''); } $this->_msg($code, $msg, $url); } // 如果是来自api判断回调 if (IS_API_HTTP) { $call = \Phpcmf\Service::L('input')->request('api_call_function'); if ($call) { $data = \Phpcmf\Service::M('http', 'httpapi')->json(dr_safe_replace($call), $code, $msg, $data); } } // 返回的钩子 $rt = dr_return_data($code, $msg, $data, $extend); if (SYS_CSRF && IS_POST) { $rt['token'] = [ 'name' => csrf_token(), 'value' => csrf_hash() ]; } // 按格式返回数据 if (isset($_GET['format']) && $_GET['format']) { switch ($_GET['format']) { case 'jsonp': $this->_jsonp(1, $msg, $data, $return, $extend); break; case 'text': \Phpcmf\Hooks::trigger('cms_end', $rt); echo $msg;exit; break; } } \Phpcmf\Hooks::trigger('cms_end', $rt); header('Content-type: application/json'); echo dr_array2string($rt); if (!$return or IS_API_HTTP) { exit; } } /** * 统一返回jsonp格式并退出程序 */ public function _jsonp($code, $msg, $data = [], $return = false, $extend = []){ $callback = dr_safe_replace(\Phpcmf\Service::L('input')->get('callback')); !$callback && $callback = 'callback'; if (IS_API_HTTP) { $this->_json($code, $msg, $data, $return, $extend); } else { // 返回的钩子 $rt = dr_return_data($code, $msg, $data, $extend); \Phpcmf\Hooks::trigger('cms_end', $rt); echo $callback.'('.dr_array2string($rt).')'; if (!$return) { exit; } } } /** * 加载数组配置文件 */ public function _require_array($file) { if (!is_file($file)) { return []; } $array = require $file; return $array; } /** * 后台提示信息 */ public function _admin_msg($code, $msg, $url = '', $time = 3, $return = false) { if (\Phpcmf\Service::L('input')->get('callback')) { return $this->_jsonp($code, $msg, $url, $return); } elseif ((\Phpcmf\Service::L('input')->get('is_ajax') || IS_API_HTTP || IS_AJAX)) { return $this->_json($code, $msg, $url, $return); } $url = dr_safe_url($url, true); $backurl = $url ? $url : dr_safe_url($_SERVER['HTTP_REFERER'], true); if ($backurl) { strpos(dr_now_url(), $backurl) === 0 && $backurl = ''; } else { $backurl = 'javascript:history.go(-1);'; } // 加载初始化文件 $this->_init_run(); // 不存在URL时进入提示页面 \Phpcmf\Service::V()->assign([ 'msg' => $msg, 'url' => $url, 'time' => $time, 'mark' => $code, 'backurl' => $backurl, 'meta_title' => dr_clearhtml($msg), 'is_msg_page' => 1, ]); \Phpcmf\Service::V()->display('msg.html', 'admin'); if ($return) { return; } !defined('SC_HTML_FILE') && exit(); } /** * 前台提示信息 */ public function _msg($code, $msg, $url = '', $time = 3, $return = false) { if (isset($_GET['is_show_msg'])) { // 强制显示提交信息而不采用ajax返回 } else { if (\Phpcmf\Service::L('input')->get('callback')) { $this->_jsonp($code, $msg, $url); } elseif ((\Phpcmf\Service::L('input')->get('is_ajax') || IS_API_HTTP || IS_AJAX)) { $this->_json($code, $msg, $url); } } if (!$url) { $backurl = dr_safe_url($_SERVER['HTTP_REFERER'], true); (!$backurl || $backurl == dr_now_url() ) && $backurl = SITE_URL; } else { $backurl = dr_safe_url($url, true); } // 加载初始化文件 $this->_init_run(); // 返回的钩子 $rt = [ 'msg' => $msg, 'url' => $url, 'time' => $time, 'mark' => $code, 'code' => $code, 'backurl' => $backurl, 'meta_title' => SITE_NAME ]; \Phpcmf\Hooks::trigger('cms_end', $rt); \Phpcmf\Service::V()->assign($rt); \Phpcmf\Service::V()->display('msg.html'); if ($return) { return; } !defined('SC_HTML_FILE') && exit(); } /** * 引用404页面 */ public function goto_404_page($msg = '') { \Phpcmf\Hooks::trigger('cms_404', $msg); if (IS_API_HTTP) { $this->_json(0, $msg); } elseif (defined('SC_HTML_FILE')) { if (isset($_GET['iframe'])) { return $msg; } $this->_json(0, $msg); } // 调试模式下不进行404状态码 if (!CI_DEBUG && !defined('SC_HTML_FILE')) { http_response_code(404); } // 开启跳转404页面功能 if (defined('SYS_GO_404') && SYS_GO_404) { if (CMSURI != '404.html') { if (IS_DEV) { $msg.= '(开发者模式下不跳转到404.html页面)'; } else { dr_redirect('/404.html'); } } else { $msg = dr_lang('你访问的页面不存在'); } } \Phpcmf\Service::V()->assign([ 'msg' => $msg, 'meta_title' => dr_lang('你访问的页面不存在') ]); \Phpcmf\Service::V()->display('404.html'); !defined('SC_HTML_FILE') && exit(); } /** * 生成静态时的跳转提示 */ public function _html_msg($code, $msg, $url = '', $note = '') { if (\Phpcmf\Service::L('input')->get('is_ajax')) { $this->_json($code, $msg, $url); } \Phpcmf\Service::V()->assign([ 'msg' => $msg, 'url' => $url, 'note' => $note, 'mark' => $code, 'meta_title' => dr_lang('操作进度') ]); \Phpcmf\Service::V()->display('html_msg.html', 'admin');exit; } /** * 后台登录判断 */ protected function _is_admin_login() { return \Phpcmf\Service::M('auth')->_is_admin_login(); } /** * 登录判断 */ public function _member_option($call = 1) { if (IS_USE_MEMBER) { \Phpcmf\Service::L('member', 'member')->member_option($this); } } /** * 判断模块栏目是否具有用户操作权限 */ public function _get_module_member_category($module, $name) { if (!$module) { return []; } if (isset($this->temp['_get_module_member_category'][$module['dirname'].$name]) && $this->temp['_get_module_member_category'][$module['dirname'].$name]) { return $this->temp['_get_module_member_category'][$module['dirname'].$name]; } // 重新获取栏目 if (isset($module['category'][0]) && dr_is_module($module['category'][0])) { $module['category'] = \Phpcmf\Service::L('category', 'module')->get_category($module['dirname']); } $category = $module['category']; foreach ($category as $id => $t) { // 筛选可发布的栏目权限 if (!is_array($t)) { continue; } if (!$t['child']) { if ($t['mid'] != $module['dirname']) { // 模块不符合 排除 unset($category[$id]); } elseif (IS_USE_MEMBER && !\Phpcmf\Service::L('member_auth', 'member')->category_auth($module, $id, $name, $this->member)) { // 用户的的权限判断 unset($category[$id]); } } } $this->temp['_get_module_member_category'][$module['dirname'].$name] = $category; return $category; } /** * 判断后台uri是否具有操作权限 */ public function _is_admin_auth($uri = '') { return \Phpcmf\Service::M('auth')->_is_admin_auth($uri); } /** * 是否移动端访问访问 */ public function _is_mobile() { return dr_is_mobile(); } /** * 插件的clink值 */ protected function _app_clink($type = '', $data = []) { return $this->_app_click('link', $type, $data); } /** * 插件的cbottom值 */ protected function _app_cbottom($type = '', $data = []) { return $this->_app_click('bottom', $type, $data); } private function _app_click($pos, $type, $row) { if (!$type) { // 表示模块部分 $endfix = ''; } else { $endfix = '_'.$type; } // 加载全部插件的 $local = \Phpcmf\Service::Apps(true); // 加载模块自身的 if (APP_DIR) { if (is_file(APPPATH.'Config/C'.$pos.$endfix.'.php')) { $local[APP_DIR] = [APPPATH]; } else { // 排除模块自身 if (isset($local[APP_DIR])) { unset($local[APP_DIR]); } } } $data = []; if ($pos == 'bottom') { $data = $row; // 底部自定义菜单写入 } foreach ($local as $dir => $path) { $ck = 0; // 判断插件目录 if (is_array($path)) { $ck = 1; $path = array_shift($path); } elseif (is_file($path.'Config/C'.$pos.$endfix.'.php') && is_file($path.'Config/App.php')) { $cfg = require $path.'Config/App.php'; if ($cfg['type'] == 'app' && !$cfg['ftype']) { // 表示插件非模块 $ck = 1; } } if ($ck) { $_clink = require $path.'Config/C'.$pos.$endfix.'.php'; if ($_clink && is_array($_clink)) { if (is_file($path.'Models/Auth'.$endfix.'.php')) { $obj = \Phpcmf\Service::M('auth'.$endfix, $dir); foreach ($_clink as $k => $v) { if (defined('IS_MODULE_VERIFY') && (!isset($v['is_verify']) || !$v['is_verify'])) { // 审核界面 unset($_clink[$k]); continue; } // 动态名称 if (strpos($v['name'], '_') === 0 && method_exists($obj, substr($v['name'], 1))) { $_clink[$k]['name'] = call_user_func(array($obj, substr($v['name'], 1)), APP_DIR); } // check权限验证 if (isset($v['check']) && $v['check'] && method_exists($obj, $v['check']) && !call_user_func(array($obj, $v['check']), APP_DIR, $row)) { unset($_clink[$k]); continue; } // 对象存储不返回出去了 $_clink[$k]['model'] = NULL; } if ($_clink) { // 权限验证 if ($pos == 'link' && method_exists($obj, 'is_link_auth') && $obj->is_link_auth(APP_DIR)) { $data = dr_array2array($data, $_clink); } elseif ($pos == 'bottom' && method_exists($obj, 'is_bottom_auth') && $obj->is_bottom_auth(APP_DIR)) { $data = dr_array2array($data , $_clink) ; } else { //CI_DEBUG && log_message('debug', 'Auth类('.$path.'Models/Auth'.$endfix.'.php'.')没有定义is_'.$pos.'_auth或者is_'.$pos.'_auth验证失败'); } } } else { $data = dr_array2array($data , $_clink) ; // CI_DEBUG && log_message('debug', '配置文件('.$path.'Config/C'.$pos.$endfix.'.php'.')没有定义权限验证类('.$path.'Models/Auth'.$endfix.'.php'.')'); } } } } if ($data) { foreach ($data as $i => $t) { $data[$i]['displayorder'] = $i + ($t['displayorder'] ? (int)$t['displayorder'] : 0); if (IS_ADMIN) { if (!$t['url']) { unset($data[$i]); // 没有url CI_DEBUG && !$t['murl'] && log_message('error', 'C'.$pos.'('.$t['name'].')没有设置url参数'); continue; } elseif ($t['uri'] && !$this->_is_admin_auth($t['uri'])) { unset($data[$i]); // 无权限的不要 continue; } $data[$i]['url'] = urldecode($data[$i]['url']); } else { if (!$t['murl']) { unset($data[$i]); // 非后台必须验证murl CI_DEBUG && !$t['url'] && log_message('error', 'C'.$pos.'('.$t['name'].')没有设置murl参数'); continue; } $data[$i]['url'] = urldecode($data[$i]['murl']); } } uasort($data, function($a, $b){ if($a['displayorder'] == $b['displayorder']){ return 0; } return($a['displayorder']<$b['displayorder']) ? -1 : 1; }); } return $data; } /** * 获取可用后table区域 */ protected function _main_table() { // 默认的 $data = [ 'couts' => dr_lang('数据统计'), 'notice' => dr_lang('通知提醒'), 'mylink' => dr_lang('快捷链接'), ]; if (is_file(MYPATH.'/Config/Main.php')) { $_data = require MYPATH.'/Config/Main.php'; $_data && $data = dr_array22array($data, $_data); } // 执行插件自己的缓存程序 $local = \Phpcmf\Service::Apps(); foreach ($local as $dir => $path) { if (is_file($path.'install.lock') && is_file($path.'Config/Main.php')) { $_data = require $path.'Config/Main.php'; if ($_data) { foreach ($_data as $key => $name) { $data[strtolower($dir).'-'.$key] = $name; } } } } return $data; } // 版本检查 protected function _api_version_cmf() { if (defined('SYS_NOT_UPDATE') && SYS_NOT_UPDATE) { $this->_json(1, ''); } exit(dr_catcher_data('https://www.xunruicms.com/version.php?action=new&php='.PHP_VERSION.'&id=1&time='.strtotime($this->cmf_version['downtime']).'&v='.$this->cmf_version['version'])); } // 版本检查 protected function _api_version_cms() { $this->_api_version_cmf(); } // 搜索帮助 protected function _api_search_help() { $kw = dr_safe_replace(\Phpcmf\Service::L('input')->get('kw')); $url = 'https://www.xunruicms.com/index.php?s=doc&c=search&keyword='.$kw.'&is_phpcmf=cms'; \Phpcmf\Service::V()->assign([ 'url' => $url, ]); \Phpcmf\Service::V()->display('cloud_online.html'); } /** * (废弃) */ public function _member_auth_value($authid, $name) { return 0; } /** * (废弃) */ public function _member_value($authid, $value) { return 0; } /** * (废弃) */ public function _module_member_value($catid, $dir, $auth, $authid = 0) { return 0; } /** * (废弃) */ public function _module_member_category($category, $dir, $auth) { if (!$category) { return []; } foreach ($category as $id => $t) { // 筛选可发布的栏目权限 if (!$t['child']) { if ($t['mid'] != $dir) { // 模块不符合 排除 unset($category[$id]); } } } return $category; } /** * Get the CI singleton */ public static function &get_instance() { return self::$instance; } }