_json(0, dr_lang('开发者模式下才能进行')); } $version = [ 'CodeIgniter' => '7.4.0', 'CodeIgniter72' => '7.2.0', 'ThinkPHP' => '7.4.0', 'Laravel' => '8.0.2', ]; $name = dr_safe_replace(\Phpcmf\Service::L('input')->get('name')); if (!$name) { $this->_json(0, dr_lang('目录参数不能为空')); } elseif (!isset($version[$name])) { $this->_json(0, '内核('.$name.')不支持'); } if (!is_file(FCPATH.$name.'/Init.php')) { $this->_json(0, '内核文件('.FCPATH.$name.'/Init.php'.')缺少'); } // 判断环境 if (version_compare(PHP_VERSION, $version[$name]) < 0) { $this->_json(0, '内核('.$name.')要求PHP版本不能低于'.$version[$name].'(当前'.PHP_VERSION.')'); } if (!in_array($name, ['CodeIgniter', 'CodeIgniter72']) && !is_file(FCPATH.$name.'/System/vendor/autoload.php')) { $this->_json(0, '内核目录('.FCPATH.$name.'/System/vendor/'.')缺少文件'); } file_put_contents(WRITEPATH.'frame.lock', $name); $this->_json(1, dr_lang('操作成功')); } // 清理通知 public function clear_notice() { if (\Phpcmf\Service::M('auth')->is_post_user()) { \Phpcmf\Service::M()->db->table('member_notice')->where('uid', $this->uid)->update(['isnew' => 0]); } else { } $this->_json(1, dr_lang('操作成功'), [ 'url' => dr_url('home/main') ]); } // 设置风格 public function set_theme() { $name = dr_safe_replace(\Phpcmf\Service::L('input')->get('name')); if (!$name) { $this->_json(0, dr_lang('目录参数不能为空')); } if (!is_dir(WEBPATH.'static/'.$name)) { $this->_json(0, dr_lang('当前目录不存在')); } $data = \Phpcmf\Service::M('Site')->config(SITE_ID); $data['config']['SITE_THEME'] = $name; \Phpcmf\Service::M('Site')->config(SITE_ID, 'config', $data['config']); \Phpcmf\Service::M('cache')->sync_cache(''); $this->_json(1, dr_lang('操作成功')); } // 设置模板 public function set_tpl() { $name = dr_safe_replace(\Phpcmf\Service::L('input')->get('name')); if (!$name) { $this->_json(0, dr_lang('目录参数不能为空')); } if (!is_dir(TPLPATH.'pc/'.$name) && !is_dir(TPLPATH.'mobile/'.$name)) { $this->_json(0, dr_lang('当前目录不存在')); } $data = \Phpcmf\Service::M('Site')->config(SITE_ID); $data['config']['SITE_TEMPLATE'] = $name; \Phpcmf\Service::M('Site')->config(SITE_ID, 'config', $data['config']); \Phpcmf\Service::M('cache')->sync_cache(''); $this->_json(1, dr_lang('操作成功')); } // 来自快捷登录 public function oauth() { $uid = intval(\Phpcmf\Service::L('input')->get('uid')); $name = dr_safe_replace(\Phpcmf\Service::L('input')->get('name')); if (!$uid) { $this->_admin_msg(0, dr_lang('uid参数传递失败')); } $oauth = \Phpcmf\Service::L('cache')->get_data('admin_auth_login_'.$name.'_'.$uid); if (!$oauth) { $this->_admin_msg(0, dr_lang('授权信息(%s)获取失败', $name)); } elseif (SYS_TIME - $oauth > 60) { $this->_admin_msg(0, dr_lang('授权信息(%s)验证超时', $name)); } $data = \Phpcmf\Service::M('member')->get_member($uid); if (!$data) { $this->_admin_msg(0, dr_lang('账号(%s)不存在', $uid)); } elseif (!$data['is_admin']) { $this->_admin_msg(0, dr_lang('账号(%s)不是管理员', $data['username'])); } // 保存会话 \Phpcmf\Service::M('auth')->login_session($data); \Phpcmf\Service::L('cache')->set_data('admin_auth_login_'.$name.'_'.$uid, 0, 10); // 转向后台 dr_redirect(ADMIN_URL.SELF); } // 添加后台面板页面 public function add_main_table() { $table = dr_safe_filename($_GET['table']); $tables = $this->_main_table(); if (!$tables[$table]) { $this->_json(0, dr_lang('自定义面板[%s]不存在', $table)); } $this->_json(1, \Phpcmf\Service::M('auth')->edit_main_table($table, $tables[$table])); } // 跳转首页 public function gohome() { dr_redirect(SITE_URL.'index.php'); } // 应用市场 public function app() { dr_redirect(dr_url('cloud/app')); } // 模板市场 public function template() { dr_redirect(dr_url('cloud/template')); } /** * Ajax调用字段属性表单 */ public function field() { \Phpcmf\Service::L('api')->field(); } /** * 附件改名 */ public function name_edit() { \Phpcmf\Service::L('api')->name_edit(); } /** * 输入一个附件 */ public function input_file_url() { \Phpcmf\Service::L('api')->input_file_url(); } /** * 图片编辑 */ public function image_edit() { \Phpcmf\Service::L('api')->image_edit(); } // 测试字段回调方法 public function field_call() { $call = dr_safe_replace(\Phpcmf\Service::L('input')->get('name')); if (!$call) { $this->_json(0, dr_lang('没有填写函数方法')); } if (strpos($call, '_') === 0) { if (method_exists(\Phpcmf\Service::L('form'), $call)) { $this->_json(1, dr_lang('定义成功')); } else { $this->_json(0, 'form类方法【'.$call.'】未定义'); } } else { if (dr_is_call_function($call)) { $this->_json(1, dr_lang('定义成功')); } else { $this->_json(0, '函数【'.$call.'】不可用'); } } } // 通知跳转 public function notice() { $id = (int)\Phpcmf\Service::L('input')->get('id'); $data = \Phpcmf\Service::M()->table('admin_notice')->get($id); if (!$data) { $this->_admin_msg(0, dr_lang('该通知数据不存在')); } // 权限判断 if (!isset($this->admin['roleid'][1])) { if ($data['to_uid'] && !dr_in_array($this->uid, explode(',', (string)$data['to_uid']))) { $this->_admin_msg(0, dr_lang('需要指定账号才能执行,当前账号无法执行')); } elseif ($data['to_rid'] && !dr_array_intersect($this->admin['roleid'], explode(',', (string)$data['to_rid']))) { $this->_admin_msg(0, dr_lang('需要指定角色组才能执行,当前账号角色无法执行')); } } list($uri, $param) = explode(':', $data['uri']); $url = ADMIN_URL.ltrim(dr_web_prefix(\Phpcmf\Service::L('Router')->url($uri)), '/'); $param && $url.= '&'.http_build_query(dr_rewrite_decode($param, '/')); // 标记为已经查看 if (!$data['status']) { \Phpcmf\Service::M()->table('admin_notice')->update($id, array( 'status' => 1, 'op_uid' => $this->uid, 'op_username' => $this->admin['username'], )); } dr_redirect($url, 'refresh'); } // 修改资料 public function my() { $color = ['default', 'blue', 'red', 'green', 'dark', 'yellow']; $target = [0 => dr_lang('内链'), 1 => dr_lang('外链')]; $setting = is_array($this->admin['setting']) ? $this->admin['setting'] : []; if (IS_AJAX_POST) { if (!\Phpcmf\Service::L('form')->check_captcha('code')) { $this->_json(0, dr_lang('验证码不正确'), ['field' => 'code']); } $menu = []; $data = \Phpcmf\Service::L('input')->post('data'); if ($data['usermenu']) { foreach ($data['usermenu']['name'] as $id => $v) { $v && $data['usermenu']['url'][$id] && $menu[$id] = [ 'name' => trim($v), 'url' => trim($data['usermenu']['url'][$id]), 'color' => $data['usermenu']['color'][$id], 'target' => $data['usermenu']['target'][$id], ]; } } // 修改密码 $password = dr_safe_password(\Phpcmf\Service::L('input')->post('password')); if ($password) { $rt = \Phpcmf\Service::L('Form')->check_password($password, $this->member['username']); if (!$rt['code']) { $this->_json(0, $rt['msg'], ['field' => 'password2']); } \Phpcmf\Service::M('member')->edit_password($this->member, $password); } $setting['font_size'] = (int)$data['font_size']; \Phpcmf\Service::M()->db->table('admin')->where('id', $this->admin['id'])->update([ 'setting' => dr_array2string($setting), 'usermenu' => dr_array2string($menu), ]); $this->_json(1, dr_lang('操作成功')); } $select = ''; foreach ($color as $t) { $select.= ''; } $select2 = ''; foreach ($target as $i => $t) { $select2.= ''; } $name = dr_oauth_list(); if (dr_is_app('weixin')) { $name['wechat'] = []; } $oauth = []; if ($name) { foreach ($name as $value => $t) { if (!isset($this->member_cache['oauth'][$value]['id']) || !$this->member_cache['oauth'][$value]['id']) { continue; } $oauth[] = $value; } } \Phpcmf\Service::V()->assign([ 'menu' => \Phpcmf\Service::M('auth')->_admin_menu( [ '资料修改' => ['api/my', 'fa fa-user'], '登录记录' => ['root/login_index{id='.$this->uid.'}', 'fa fa-calendar'], ] ), 'color' => $color, 'target' => $target, 'setting' => $setting, 'oauth_data' => $oauth, 'oauth_list' => IS_USE_MEMBER ? \Phpcmf\Service::M('member')->oauth($this->uid) : [], 'select_color' => $select, 'is_post_user' => \Phpcmf\Service::M('auth')->is_post_user(), 'select_target' => $select2, ]); \Phpcmf\Service::V()->display('api_my.html');exit; } public function search_menu() { $kw = (dr_safe_replace(\Phpcmf\Service::L('input')->get('kw'))); if (!$kw) { $menu = []; } else { $menu = \Phpcmf\Service::M()->table('admin_menu')->where('uri<>""')->like('name', $kw)->getAll(); } \Phpcmf\Service::V()->assign('list', $menu); $menu && \Phpcmf\Service::V()->assign('menu', \Phpcmf\Service::L('cache')->get('menu-admin')); ob_start(); \Phpcmf\Service::V()->display('api_search_menu.html'); $html = ob_get_contents(); ob_clean(); $this->_json(1, $html); } // 加入菜单 public function menu() { $url = urldecode(dr_safe_replace(\Phpcmf\Service::L('input')->get('v'))); $arr = parse_url($url); $queryParts = explode('&', $arr['query']); $params = []; foreach ($queryParts as $param) { $item = explode('=', $param); $params[$item[0]] = $item[1]; } // 基础uri $uri = ($params['s'] ? $params['s'].'/' : '').($params['c'] ? $params['c'] : 'home').'/'.($params['m'] ? $params['m'] : 'index'); // 查询名称 $menu = \Phpcmf\Service::M()->db->table('admin_menu')->select('name')->where('uri', $uri)->get()->getRowArray(); $name = $menu ? $menu['name'] : '未知名称'; // 替换URL if ($this->admin) { $menu = dr_string2array($this->admin['usermenu']); foreach ($menu as $t) { if ($t['url'] == $url) { $this->_json(0, dr_lang('%s已经存在', $name)); } } $menu[] = [ 'name' => $name, 'url' => $url, ]; \Phpcmf\Service::M()->db->table('admin')->where('uid', $this->uid)->update([ 'usermenu' => dr_array2string($menu) ]); ob_start(); $this->admin['usermenu'] = $menu; \Phpcmf\Service::V()->assign('admin', $this->admin); \Phpcmf\Service::V()->display('api_link_menu.html'); $html = ob_get_contents(); ob_clean(); $this->_json(1, dr_lang('操作成功'), $html); } $this->_json(0, dr_lang('加入失败')); } // 删除历史菜单 public function clear_history() { \Phpcmf\Service::M()->db->table('admin')->where('uid', $this->uid)->update([ 'history' => '' ]); $this->_json(1, dr_lang('操作成功')); } // 加入历史菜单 public function history() { $url = urldecode(dr_safe_replace(\Phpcmf\Service::L('input')->get('v'))); $name = urldecode(dr_safe_replace(\Phpcmf\Service::L('input')->get('n'))); // 替换URL if ($this->admin) { $menu = dr_string2array($this->admin['history']); if (is_array($menu) && $menu) { foreach ($menu as $t) { if ($t['url'] == $url) { $this->_json(0, dr_lang('%s已经存在', $name)); } } } else { $menu = []; } array_unshift($menu, [ 'name' => $name, 'url' => trim($url), ]); $max = 30; if (count($menu) > $max) { $menu = array_slice($menu, 0, $max); } \Phpcmf\Service::M()->db->table('admin')->where('uid', $this->uid)->update([ 'history' => dr_array2string($menu) ]); $html = ''; foreach ($menu as $t) { $html.= ' '.$t['name'].' '; } $this->_json(1, dr_lang('操作成功'), $html); } $this->_json(0, dr_lang('加入失败')); } // 执行更新缓存 public function cache() { $name = dr_safe_replace($_GET['id']); \Phpcmf\Service::M('cache')->$name(); $this->_json(1, dr_lang('执行完成'), 0); } // 执行清空缓存数据 public function cache_clear() { $all = intval($_GET['all']); \Phpcmf\Service::M('cache')->update_data_cache($all); $this->_json(1, dr_lang('前台数据缓存已被更新')); } // 同步更新缓存 public function cache_sync() { if (SYS_CACHE_CLEAR) { // 自动缓存 \Phpcmf\Service::M('cache')->update_site_cache(); } else { // 手动模式 \Phpcmf\Service::M('cache')->update_data_cache(); } $this->_json(1, dr_lang('更新完成')); } // 执行更新缓存 public function cache_update() { \Phpcmf\Service::M('cache')->update_cache(); $this->_json(1, dr_lang('更新完成')); } // 执行重建模块索引 public function cache_search() { \Phpcmf\Service::M('cache')->update_search_index(); $this->_json(1, dr_lang('更新完成')); } // 执行重建模块索引 public function cache_site_config() { \Phpcmf\Service::M('cache')->update_site_config(); $this->_json(1, dr_lang('更新完成')); } // 执行编辑器更新 public function cache_ueditor() { \Phpcmf\Service::M('cache')->update_ueditor(); $this->_json(1, dr_lang('更新完成')); } /** * 生成安全码 */ public function syskey() { echo 'PHPCMF'.strtoupper(substr((md5(SYS_TIME)), rand(0, 10), 13));exit; } // 当前时间值 public function site_time() { $this->_json(1, dr_date(SYS_TIME)); } /** * 生成来路随机字符 */ public function referer() { $s = strtoupper(base64_encode(md5(SYS_TIME).md5(rand(0, 2015).md5(rand(0, 2015)))).md5(rand(0, 2009))); echo str_replace('=', '', substr($s, 0, 42));exit; } // 域名检查 public function domain() { $html = ''; $post = \Phpcmf\Service::L('input')->post('data'); if ($post) { $my = []; $site_domian = \Phpcmf\Service::R(WRITEPATH.'config/domain_site.php'); foreach ($site_domian as $name => $sid) { if ($sid == SITE_ID) { unset($site_domian[$name]); } } foreach ($post as $name => $t) { if (!$t) { continue; } $my[] = $t; isset($site_domian[$t]) && $html.= $t.' 已经存在于其他站点'; } $unique = array_unique ( $my ); if ($my && count($my) != count($unique)) { $arr = array_diff_assoc ( $my, $unique ); $html.= '

当前配置项存在重复

'; foreach ($arr as $t) { $html.= '

【'.$t.'】被重复配置过,请检查

'; } } $html && exit($html); } exit('

ok

'); } // 统计 public function mtotal() { if (!IS_USE_MODULE) { $this->_json(1, ''); } require IS_USE_MODULE.'Controllers/Admin/Api.php'; $ci = new \Phpcmf\Controllers\Admin\Api($this); $ci->mtotal(); exit; } // 统计栏目 public function ctotal() { if (!IS_USE_MODULE) { $this->_json(1, ''); } require IS_USE_MODULE.'Controllers/Admin/Api.php'; $ci = new \Phpcmf\Controllers\Admin\Api($this); $ci->ctotal(); exit; } // api public function icon() { \Phpcmf\Service::V()->display('api_icon.html');exit; } // 常用配置 public function config() { \Phpcmf\Service::V()->display('api_config.html');exit; } // phpinfo public function phpinfo() { phpinfo();exit; } // 邮件发送测试 public function email_test() { if (!$this->member['email']) { $this->_json(0, dr_lang('当前登录的账号没有设置邮箱')); } $id = intval(\Phpcmf\Service::L('input')->get('id')); $data = \Phpcmf\Service::M()->table('mail_smtp')->get($id); if (!$data) { $this->_json(0, dr_lang('数据#%s不存在', $id)); } $dmail = \Phpcmf\Service::L('email')->set([ 'host' => $data['host'], 'user' => $data['user'], 'pass' => $data['pass'], 'port' => $data['port'], 'from' => $data['user'] ]); if ($dmail->send($this->member['email'], 'test', 'test for '.SITE_NAME)) { $this->_json(1, dr_lang('已发送至邮箱:%s,并不代表已发送成功', $this->member['email'])); } else { $this->_json(0, 'Error:'. $dmail->error()); } } /** * 后台授权登录 */ public function alogin() { if (!IS_USE_MEMBER) { $this->_admin_msg(0, dr_lang('需要安裝官方版【用户系统】插件')); } $uid = intval(\Phpcmf\Service::L('input')->get('id')); if (!\Phpcmf\Service::M('auth')->cleck_edit_member($uid)) { $this->_admin_msg(0, dr_lang('无权限操作其他管理员账号')); } // 当不具备用户操作权限时,只能授权登录当前账号 if (!\Phpcmf\Service::M('auth')->_is_admin_auth('member/home/index') && $uid != $this->uid) { $this->_admin_msg(0, dr_lang('无权限操作其他账号')); } $admin = \Phpcmf\Service::M()->table('member')->get($this->admin['uid']); \Phpcmf\Service::L('cache')->set_data('admin_login_member', $admin, 30); $this->session()->set('admin_login_member_code', md5($uid.$this->admin['id'].$this->admin['password'])); $sso = ''; $url = \Phpcmf\Service::M('member')->get_sso_url(); $code = md5($admin['id'].$admin['password']); foreach ($url as $u) { $sso.= ''; } \Phpcmf\Service::V()->assign([ 'menu' => '', ]); $url = urldecode(\Phpcmf\Service::L('input')->get('url', true)); !$url && $url = MEMBER_URL; return $this->_msg(1, dr_lang('正在授权登录此用户...').$sso, dr_url_prefix(dr_member_url('api/alogin', ['url' => $url])), 0, true); } /** * 伪静态代码 */ public function rewrite_code() { if (IS_USE_MODULE) { dr_redirect(dr_url('module/urlrule/rewrite_index'));exit; } list($name, $note, $code) = \Phpcmf\Service::L('router')->rewrite_code(); \Phpcmf\Service::V()->assign([ 'name' => $name, 'code' => $code, 'note' => $note, 'count' => $code ? dr_count(explode(PHP_EOL, $code)) : 0, ]); \Phpcmf\Service::V()->display('api_rewrite_code.html');exit; } /** * 后台发送登录数据 */ public function slogin() { $arr = \Phpcmf\Service::M('member')->sso($this->member); $sso = ''; $url = urldecode(\Phpcmf\Service::L('input')->get('url', true)); !$url && $url = SITE_URL; $info = parse_url($url); foreach ($arr as $u) { if (strpos($u, $info['host']) !== false) { $sso.= ''; break; } } \Phpcmf\Service::V()->assign([ 'menu' => '', ]); return $this->_msg(1, dr_lang('正在授权登录...').$sso,$url, 0, true); } /** * 预览 */ public function demo() { $name = \Phpcmf\Service::L('input')->get('name'); if ($name == 'pc') { $url = SITE_URL; } else { $url = SITE_MURL; } \Phpcmf\Service::V()->assign([ 'url' => $url, 'demo' => $name, ]); \Phpcmf\Service::V()->display('api_demo.html');exit; } /** * 水印图片预览 */ public function preview() { $data = $_GET['watermark']; $data['source_image'] = WRITEPATH.'preview.png'; $data['dynamic_output'] = true; $rt = \Phpcmf\Service::L('Image')->watermark($data, 1); if (!$rt) { echo \Phpcmf\Service::L('Image')->display_errors(); } exit; } /** * 测试远程附件 */ public function test_attach() { $data = \Phpcmf\Service::L('input')->post('data'); if (!$data) { $this->_json(0, dr_lang('参数错误')); } $type = intval($data['type']); $value = $data['value'][$type]; if (!$value) { $this->_json(0, dr_lang('参数不存在')); } elseif ($type == 0) { if (substr($value['path'],-1, 1) != '/') { $this->_json(0, dr_lang('存储路径目录一定要以“/”结尾')); } elseif ((dr_strpos($value['path'], '/') === 0 || dr_strpos($value['path'], ':') === 1)) { if (!is_dir($value['path'])) { $this->_json(0, dr_lang('本地路径[%s]不存在', $value['path'])); } } elseif (is_dir(SYS_UPLOAD_PATH.$value['path'])) { } else { $this->_json(0, dr_lang('本地路径[%s]不存在', SYS_UPLOAD_PATH.$value['path'])); } } $rt = \Phpcmf\Service::L('upload')->save_file( 'content', 'this is phpcmf file-test', 'test/test.txt', [ 'id' => 0, 'url' => $data['url'], 'type' => $type, 'value' => $value, ] ); if (!$rt['code']) { $this->_json(0, $rt['msg']); } elseif (strpos(dr_catcher_data($rt['data']['url']), 'phpcmf') !== false) { $this->_json(1, dr_lang('测试成功:%s', $rt['data']['url'])); } $this->_json(0, dr_lang('无法访问到附件: %s', $rt['data']['url'])); } /** * 测试短信验证码 */ public function test_mobile() { $data = \Phpcmf\Service::L('input')->post('data'); if (!$data) { $this->_json(0, dr_lang('参数错误')); } if (is_file(CONFIGPATH.'mysms.php')) { require_once CONFIGPATH.'mysms.php'; } $method = 'my_sendsms_code'; if (function_exists($method)) { $rt = call_user_func_array($method, [ $data['mobile'], rand(10000, 99999), $data['third'], ]); $this->_json($rt['code'], $rt['msg']); } else { $this->_json(0, dr_lang('你没有定义短信接口')); } } /** * 显示用户资料 */ public function member() { $uid = intval(\Phpcmf\Service::L('input')->get('uid')); if ($uid) { $data = \Phpcmf\Service::M('member')->get_member($uid); if (!$data) { $this->_json(0, dr_lang('账号uid[%s]不存在', $uid)); } } else { $name = dr_safe_replace(\Phpcmf\Service::L('input')->get('name')); $data = \Phpcmf\Service::M('member')->get_member(0, $name); if (!$data) { $this->_json(0, dr_lang('账号[%s]不存在', $name)); } } if (!\Phpcmf\Service::M('auth')->cleck_edit_member($data['id'])) { $this->_json(0, dr_lang('无权限操作其他管理员账号')); } // 当不具备用户操作权限时,只能授权登录当前账号 if (!\Phpcmf\Service::M('auth')->_is_admin_auth('member/home/index') && $uid != $this->uid) { $this->_json(0, dr_lang('无权限操作其他账号')); } \Phpcmf\Service::V()->assign([ 'm' => $data, ]); \Phpcmf\Service::V()->display('api_show_member.html'); exit; } /** * 测试目录是否可用 */ public function test_dir() { $v = \Phpcmf\Service::L('input')->get('v'); if (!$v) { $this->_json(0, dr_lang('目录为空')); } elseif (strpos($v, ' ') === 0) { $this->_json(0, dr_lang('不能用空格开头')); } elseif (strpos($v, '..') !== false) { $this->_json(0, dr_lang('不能出现..符号')); } $path = dr_get_dir_path($v); if (is_file($path.SELF)) { $this->_json(0, dr_lang('目录不能是项目根目录')); } elseif (is_dir($path)) { $this->_json(1, dr_lang('目录正常')); } else { $this->_json(0, dr_lang('目录[%s]不存在', $path)); } } /** * 测试电脑新域名是否可用 */ public function test_site_domain() { $v = \Phpcmf\Service::L('input')->get('v'); if (!$v) { $this->_json(0, dr_lang('域名不能为空')); } elseif (!\Phpcmf\Service::L('Form')->check_domain($v)) { $this->_json(0, dr_lang('域名(%s)格式不正确', $v)); } elseif (!function_exists('stream_context_create')) { $this->_json(0, '函数没有被启用:stream_context_create'); } $url = dr_http_prefix($v) . '/index.php?s=api&c=rewrite&m=test'; if (strpos($v, ':') !== false) { $this->_json(0, '可以尝试手动访问:' . $url . ',如果提示phpcmf ok就表示成功'); } $code = dr_catcher_data($url, 5); if (strpos($code, 'callback') === false) { $this->_json(0, dr_lang('[%s]域名绑定异常,无法访问【%s】,可以尝试手动访问此地址,如果提示callback就表示成功', dr_lang($v), $url)); } $this->_json(1, dr_lang('绑定正常')); } /** * 测试手机域名是否可用 */ public function test_mobile_domain() { $v = \Phpcmf\Service::L('input')->get('v'); if (!$v) { $this->_json(0, dr_lang('域名不能为空')); } elseif (!\Phpcmf\Service::L('Form')->check_domain($v)) { $this->_json(0, dr_lang('域名(%s)格式不正确', $v)); } elseif (!function_exists('stream_context_create')) { $this->_json(0, '函数没有被启用:stream_context_create'); } elseif ($this->site_info[SITE_ID]['SITE_DOMAIN'] == $v) { $this->_json(0, dr_lang('手机域名不能与电脑相同')); } $url = dr_http_prefix($v) . '/api.php'; if (strpos($v, ':') !== false) { $this->_json(0, dr_lang('可以尝试手动访问:%s,如果提示phpcmf ok就表示成功', $url)); } $code = dr_catcher_data($url, 5); if ($code != 'phpcmf ok') { $this->_json(0, dr_lang('[%s]域名绑定异常,无法访问:%s,可以尝试手动访问此地址,如果提示phpcmf ok就表示成功', dr_lang($v), $url)); } $this->_json(1, dr_lang('绑定正常')); } /** * 测试目录模式的域名是否可用 */ public function test_mobile_dir() { $v = trim(\Phpcmf\Service::L('input')->get('v')); if (!$v) { $this->_json(0, dr_lang('目录不能为空')); } elseif (strpos($v, '/') !== false) { $this->_json(0, dr_lang('目录不能包含/符号')); } elseif (!function_exists('stream_context_create')) { $this->_json(0, '函数没有被启用:stream_context_create'); } elseif (strpos($v, '..') !== false) { $this->_json(0, dr_lang('不能出现..符号')); } // 生成手机目录 $rt = \Phpcmf\Service::M('cache')->update_mobile_webpath(WEBPATH, $v); if ($rt) { $this->_json(0, dr_lang($rt)); } $url = SITE_URL.$v . '/api.php'; if (strpos($v, ':') !== false) { $this->_json(0, dr_lang('可以尝试手动访问:%s,如果提示phpcmf ok就表示成功', $url)); } $code = dr_catcher_data($url, 5); if ($code != 'phpcmf ok') { $this->_json(0, dr_lang('[%s]目录绑定异常,无法访问:%s,可以尝试手动访问此地址,如果提示phpcmf ok就表示成功', $v, $url)); } $this->_json(1, dr_lang('目录正常')); } /** * 测试附件目录是否可用 */ public function test_attach_dir() { $v = \Phpcmf\Service::L('input')->get('v'); if (!$v) { $this->_json(1, dr_lang('默认目录')); } elseif (strpos($v, ' ') === 0) { $this->_json(0, dr_lang('不能用空格开头')); } elseif (strpos($v, 'config') !== false) { $this->_json(0, dr_lang('不能包含config目录')); } elseif (strpos($v, '..') !== false) { $this->_json(0, dr_lang('不能出现..符号')); } $path = dr_get_dir_path($v); if (is_dir($path)) { $this->_json(1, dr_lang('目录正常')); } else { if (strpos($path, ROOTPATH) !== false) { $this->_json(0, dr_lang('目录[%s]不存在', $path)); } $this->_json(0, dr_lang('目录[%s]无法识别,请检查服务器的防跨站开关或者.user.ini权限文件', $path)); } } /** * 测试附件域名是否可用 */ public function test_attach_domain() { $note = ''; $data = \Phpcmf\Service::L('input')->post('data'); if (!$data) { $this->_json(0, dr_lang('参数错误')); } elseif (!$data['SYS_ATTACHMENT_PATH']) { $note = dr_lang('上传目录留空时,采用系统默认分配的目录'); $data['SYS_ATTACHMENT_PATH'] = 'uploadfile'; } elseif (strpos($data['SYS_ATTACHMENT_PATH'], 'config') !== false) { $this->_json(0, dr_lang('不能包含config目录')); } elseif (!$data['SYS_ATTACHMENT_URL']) { $note = dr_lang('URL地址留空时,采用系统默认分配的URL'); } if ((strpos($data['SYS_ATTACHMENT_PATH'], '/') === 0 || strpos($data['SYS_ATTACHMENT_PATH'], ':') !== false) && is_dir($data['SYS_ATTACHMENT_PATH'])) { // 相对于根目录 if (!$data['SYS_ATTACHMENT_URL']) { $this->_json(0, ''.dr_lang('没有设置附件URL地址').''); } // 附件上传目录 $path = rtrim($data['SYS_ATTACHMENT_PATH'], DIRECTORY_SEPARATOR).'/'; // 附件访问URL $url = trim($data['SYS_ATTACHMENT_URL'], '/').'/'; if (!dr_is_url($url)) { $url.= ''.dr_lang('(不是一个合法的地址,缺少http://或者https://前缀)').''; } $note = dr_lang('已使用自定义上传目录和自定义访问地址'); } else { // 在当前网站目录 $path = ROOTPATH.trim($data['SYS_ATTACHMENT_PATH'], '/').'/'; $url = (SYS_ATTACHMENT_REL ? FC_NOW_HOST : ROOT_URL).trim($data['SYS_ATTACHMENT_PATH'], '/').'/'; !$note && $note = dr_lang('上传目录不是绝对的路径时采用,系统分配的URL地址'); } $this->_json(1, $note.'
'.dr_lang('附件上传目录:%s', $path) .'
' . dr_lang('附件访问地址:%s', $url)); } /** * 测试缩略图域名是否可用 */ public function test_thumb_domain() { $note = ''; $data = \Phpcmf\Service::L('input')->post('image'); if (!$data) { $this->_json(0, dr_lang('参数错误')); } elseif (!$data['cache_path']) { $note = dr_lang('存储目录留空时,采用系统默认分配的目录'); $data['cache_path'] = 'uploadfile/thumb/'; } elseif (strpos($data['cache_path'], 'config') !== false) { $this->_json(0, dr_lang('不能包含config目录')); } elseif (!$data['cache_url']) { $note = dr_lang('URL地址留空时,采用系统默认分配的URL'); } if ((strpos($data['cache_path'], '/') === 0 || strpos($data['cache_path'], ':') !== false) && is_dir($data['cache_path'])) { // 相对于根目录 $path = rtrim($data['cache_path'], DIRECTORY_SEPARATOR).'/'; if (!$data['cache_url']) { $this->_json(0, ''.dr_lang('没有设置访问URL地址').''); } $url = trim($data['cache_url'], '/').'/'; if (!dr_is_url($url)) { $url.= ''.dr_lang('(不是一个合法的地址,缺少http://或者https://前缀)').''; } $note = dr_lang('已使用自定义存储目录和自定义访问地址'); } else { // 在当前网站目录 $path = ROOTPATH.trim($data['cache_path'], '/').'/'; $url = (SYS_ATTACHMENT_REL ? FC_NOW_HOST : ROOT_URL).trim($data['cache_path'], '/').'/'; !$note && $note = dr_lang('存储目录不是绝对的路径时采用,系统分配的URL地址'); } $this->_json(1, $note.'
'.dr_lang('存储目录:%s', $path) .'
' . dr_lang('访问地址:%s', $url)); } /** * 测试头像域名是否可用 */ public function test_avatar_domain() { $note = ''; $data = \Phpcmf\Service::L('input')->post('image'); if (!$data) { $this->_json(0, dr_lang('参数错误')); } elseif (!$data['avatar_path']) { $note = dr_lang('存储目录留空时,采用系统默认分配的目录'); $data['avatar_path'] = 'uploadfile/member/'; } elseif (!$data['cache_url']) { $note = dr_lang('URL地址留空时,采用系统默认分配的URL'); } elseif (strpos($data['avatar_path'], 'config') !== false) { $this->_json(0, dr_lang('不能包含config目录')); } if ((strpos($data['avatar_path'], '/') === 0 || strpos($data['avatar_path'], ':') !== false) && is_dir($data['avatar_path'])) { // 相对于根目录 $path = rtrim($data['avatar_path'], DIRECTORY_SEPARATOR).'/'; if (!$data['avatar_url']) { $this->_json(0, ''.dr_lang('没有设置访问URL地址').''); } $url = trim($data['avatar_url'], '/').'/'; if (!dr_is_url($url)) { $url.= ''.dr_lang('(不是一个合法的地址,缺少http://或者https://前缀)').''; } $note = dr_lang('已使用自定义存储目录和自定义访问地址'); } else { // 在当前网站目录 $path = ROOTPATH.trim($data['avatar_path'], '/').'/'; $url = (SYS_ATTACHMENT_REL ? FC_NOW_HOST : ROOT_URL).trim($data['avatar_path'], '/').'/'; !$note && $note = dr_lang('存储目录不是绝对的路径时采用,系统分配的URL地址'); } $this->_json(1, $note.'
'.dr_lang('存储目录:%s', $path) .'
' . dr_lang('访问地址:%s', $url)); } /** * 测试https是否可用 */ public function test_https() { $url = str_replace('http://', 'https://', ROOT_URL); $code = dr_catcher_data($url.'index.php?s=api&c=test&m=https', 5); if ($code && strpos($code, 'xunruicms') !== false) { $this->_json(1, dr_lang('支持HTTPS访问')); } else { ob_start(); \Phpcmf\Service::V()->assign('url', $url); \Phpcmf\Service::V()->display('api_test_https.html'); $html = ob_get_contents(); ob_clean(); $this->_json(0, $html); } } /** * 测试缓存是否可用 */ public function test_cache() { if (!isset($_POST['data'])) { $this->_json(0, dr_lang('参数错误')); } $type = intval(isset($_POST['data']['SYS_CACHE_TYPE']) ? $_POST['data']['SYS_CACHE_TYPE'] : 0); switch ($type) { case 1: $name = 'memcached'; if (!extension_loaded('memcached') && !extension_loaded('memcache')) { $this->_json(0, dr_lang('PHP环境没有安装[%s]扩展', $name)); } break; case 2: $name = 'redis'; if (!extension_loaded('redis')) { $this->_json(0, dr_lang('PHP环境没有安装[%s]扩展', $name)); } break; default: $name = 'file'; if (!dr_check_put_path(WRITEPATH.'file/')) { $this->_json(0, dr_lang('请分配cache/file目录的可读写权限')); } break; } if (is_file(FRAMEPATH.'Extend/Cache.php')) { require_once FRAMEPATH.'Extend/Cache.php'; $cache = new \Frame\Cache(); $rt = $cache->test($name); $this->_json($rt['code'], $rt['msg']); } else { $this->_json(0, dr_lang('此版本不支持自定义缓存功能')); } } // 测试正则表达式 public function test_pattern() { if (IS_POST) { $data = \Phpcmf\Service::L('input')->post('data'); if (!$data['text']) { $this->_json(0, dr_lang('测试文字不能为空')); } elseif (!$data['code']) { $this->_json(0, dr_lang('正则表达式不能为空')); } if (!preg_match($data['code'], $data['text'])) { $this->_json(0, dr_lang('正则表达式%s验证%s结果:%s', $data['code'], $data['text'], dr_lang('未通过'))); } $this->_json(1, dr_lang('正则表达式验证结果:%s', dr_lang('通过'))); } \Phpcmf\Service::V()->assign('code', [ '纯数字' => '/^[0-9]+$/', '纯汉字' => '/^[\x{4e00}-\x{9fa5}]+$/u', '手机号码' => '/^1[345789]\d{9}$/ims', '电子邮箱' => '/^[a-zA-Z0-9]+([-_.][a-zA-Z0-9]+)*@([a-zA-Z0-9]+[-.])+([a-z]{2,5})$/ims', ]); \Phpcmf\Service::V()->display('api_pattern.html');exit; } // 简化模式切换 public function admin_min() { \Phpcmf\Service::M('auth')->update_admin_setting('admin_min', 1); $this->_admin_msg(1, dr_lang('正在切换简化模式'), dr_url('home/min'), 0); } // 完整模式切换 public function admin_all() { if (\Phpcmf\Service::M('auth')->is_admin_min_mode()) { $this->_admin_msg(0, dr_lang('此账号无法切换到完整模式')); } \Phpcmf\Service::M('auth')->update_admin_setting('admin_min', 0); $this->_admin_msg(1, dr_lang('正在切换完整模式'), dr_url('home/index'), 0); } // 短信接口查询 public function sms_info() { $this->_json(0, '接口弃用'); } // 版本检查 public function version_cmf() { exit($this->_api_version_cmf()); } // 版本检查 public function version_cms() { exit($this->_api_version_cms()); } // 搜索帮助 public function search_help() { exit($this->_api_search_help()); } public function count_total() { } // 更新url public function update_url() { require IS_USE_MODULE.'Controllers/Admin/Api.php'; $ci = new \Phpcmf\Controllers\Admin\Api($this); $ci->update_url(); } // 更新栏目缓存配置 public function update_category_cache() { require IS_USE_MODULE.'Controllers/Admin/Api.php'; $ci = new \Phpcmf\Controllers\Admin\Api($this); $ci->update_category_cache(); } // 头像设置空 public function avatar_del() { $uid = intval(\Phpcmf\Service::L('input')->get('id')); $member = dr_member_info($uid); if (!$member) { $this->_json(0, dr_lang('该用户不存在')); } if (!\Phpcmf\Service::M('auth')->cleck_edit_member($uid)) { $this->_admin_msg(0, dr_lang('无权限操作其他管理员账号')); } list($cache_path, $cache_url) = dr_avatar_path(); foreach ([$cache_path.$uid.'.jpg', $cache_path.dr_avatar_dir($uid).$uid.'.jpg'] as $file) { if (is_file($file)) { unlink($file); if (is_file($file)) { $this->_json(0, dr_lang('文件删除失败,请检查头像目录权限')); } } } $this->_json(1, dr_lang('操作成功')); } // 头像设置 public function avatar_edit() { $uid = intval(\Phpcmf\Service::L('input')->get('id')); $member = dr_member_info($uid); if (!$member) { $this->_json(0, dr_lang('该用户不存在')); } if (!\Phpcmf\Service::M('auth')->cleck_edit_member($uid)) { $this->_json(0, dr_lang('无权限操作其他管理员账号')); } if (IS_POST) { $content = $_POST['file']; // 普通文件上传 if (isset($_FILES['file'])) { if (isset($_FILES["file"]["tmp_name"]) && $_FILES["file"]["tmp_name"]) { $content = \Phpcmf\Service::L('file')->base64_image($_FILES["file"]["tmp_name"]); } } if (!$content) { $this->_json(0, dr_lang('上传文件失败')); } list($cache_path) = dr_avatar_path(); if (preg_match('/^(data:\s*image\/(\w+);base64,)/i', $content, $result)) { $content = base64_decode(str_replace($result[1], '', $content)); if (strlen($content) > 30000000) { $this->_json(0, dr_lang('图片太大了')); } // 头像上传成功之前 \Phpcmf\Hooks::trigger('upload_avatar_before', [ 'member' => $member, 'base64_image' => $content, ]); $rt = \Phpcmf\Service::L('upload')->base64_image([ 'content' => $content, 'ext' => 'jpg', 'save_name' => $uid, 'save_file' => $cache_path.dr_avatar_dir($uid).$uid.'.jpg', ]); if (!$rt['code']) { $this->_json(0, $rt['msg']); } // 头像上传成功之后 \Phpcmf\Hooks::trigger('upload_avatar_after', [ 'member' => $member, 'base64_image' => $content, ]); \Phpcmf\Service::M()->db->table('member_data')->where('id', $uid)->update(['is_avatar' => 1]); \Phpcmf\Service::M('member')->clear_cache($uid); $this->_json(1, dr_lang('上传成功')); } else { $this->_json(0, dr_lang('头像内容不规范')); } } \Phpcmf\Service::V()->assign([ 'form' => dr_form_hidden(['file' => '']), 'member' => $member, ]); \Phpcmf\Service::V()->display('api_avatar.html');exit; } // 验证权限脚本 public function _check_upload_auth($editor = 0) { return \Phpcmf\Service::L('api')->check_upload_auth($editor); } /** * 文件上传 */ public function upload() { \Phpcmf\Service::L('api')->upload(); } /** * 浏览文件 */ public function input_file_list() { \Phpcmf\Service::L('api')->input_file_list(); } /** * 浏览文件 */ public function file_list() { \Phpcmf\Service::L('api')->file_list(); } /** * 删除文件 */ public function file_delete() { $rt = \Phpcmf\Service::M('Attachment')->file_delete( $this->member, (int)\Phpcmf\Service::L('input')->get('id') ); $this->_json($rt['code'], $rt['msg']); } /** * 下载文件 */ public function down() { \Phpcmf\Service::L('api')->down(); } /** * 百度编辑器处理接口 */ public function ueditor() { require ROOTPATH.'api/ueditor/php/controller.php';exit; } /** * base64图片上传 */ public function upload_base64_image() { \Phpcmf\Service::L('api')->upload_base64_image(); } /** * 下载远程图片 */ public function down_img_list() { \Phpcmf\Service::L('api')->down_img_list(); } /** * 下载远程图片 */ public function down_img_url() { \Phpcmf\Service::L('api')->down_img_url(); } /** * 下载远程图片 */ public function down_img() { \Phpcmf\Service::L('api')->down_img(); } /** * 编辑器视频外链解析 */ public function video() { \Phpcmf\Service::L('api')->video_link(); } }