Files
BESCMS/dayrui/Fcms/Control/Admin/Api.php
T

1444 lines
46 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php namespace Phpcmf\Control\Admin;
/**
* https://www.besyun.com
* BESCMS
* 本文件是框架系统文件,二次开发时不可以修改本文件
**/
class Api extends \Phpcmf\Common {
// 切换系统内核
public function sys_edit() {
if (!IS_DEV && !defined('DEMO_ADMIN_USERNAME')) {
$this->_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.= '<option value="'.$t.'">'.$t.'</option>';
}
$select2 = '';
foreach ($target as $i => $t) {
$select2.= '<option value="'.$i.'">'.$t.'</option>';
}
$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.= '<a class="btn btn-default href="'.trim($t['url']).'" onclick="dr_hide_left_tab()" target="right"> '.$t['name'].' </a>';
}
$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.= '<p>当前配置项存在重复</p>';
foreach ($arr as $t) {
$html.= '<p>【'.$t.'】被重复配置过,请检查</p>';
}
}
$html && exit($html);
}
exit('<p>ok</p>');
}
// 统计
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.= '<script src="'.$u.'index.php?s=api&c=sso&action=alogin&code='.dr_authcode($uid.'-'.$code, 'ENCODE').'"></script>';
}
\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.= '<script src="'.$u.'"></script>';
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, '<font color="red">'.dr_lang('没有设置附件URL地址').'</font>');
}
// 附件上传目录
$path = rtrim($data['SYS_ATTACHMENT_PATH'], DIRECTORY_SEPARATOR).'/';
// 附件访问URL
$url = trim($data['SYS_ATTACHMENT_URL'], '/').'/';
if (!dr_is_url($url)) {
$url.= '<font color="red">'.dr_lang('(不是一个合法的地址,缺少http://或者https://前缀)').'</font>';
}
$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.'<br>'.dr_lang('附件上传目录:%s', $path) .'<br>' . 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, '<font color="red">'.dr_lang('没有设置访问URL地址').'</font>');
}
$url = trim($data['cache_url'], '/').'/';
if (!dr_is_url($url)) {
$url.= '<font color="red">'.dr_lang('(不是一个合法的地址,缺少http://或者https://前缀)').'</font>';
}
$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.'<br>'.dr_lang('存储目录:%s', $path) .'<br>' . 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, '<font color="red">'.dr_lang('没有设置访问URL地址').'</font>');
}
$url = trim($data['avatar_url'], '/').'/';
if (!dr_is_url($url)) {
$url.= '<font color="red">'.dr_lang('(不是一个合法的地址,缺少http://或者https://前缀)').'</font>';
}
$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.'<br>'.dr_lang('存储目录:%s', $path) .'<br>' . 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();
}
}