|
|
<?php |
|
|
namespace app\admin\controller; |
|
|
use think\Db; |
|
|
use think\addons\AddonException; |
|
|
use think\addons\Service; |
|
|
use think\Cache; |
|
|
use think\Config; |
|
|
use think\Exception; |
|
|
use app\common\util\Dir; |
|
|
|
|
|
class Addon extends Base |
|
|
{ |
|
|
public function __construct() |
|
|
{ |
|
|
parent::__construct(); |
|
|
} |
|
|
|
|
|
public function index() |
|
|
{ |
|
|
$param = input(); |
|
|
|
|
|
$this->assign('title',lang('admin/addon/title')); |
|
|
return $this->fetch('admin@addon/index'); |
|
|
} |
|
|
|
|
|
public function config() |
|
|
{ |
|
|
$param = input(); |
|
|
$name = $param['name']; |
|
|
if(empty($name)){ |
|
|
return $this->error(lang('param_err')); |
|
|
} |
|
|
|
|
|
if (!is_dir(ADDON_PATH . $name)) { |
|
|
return $this->error(lang('get_dir_err')); |
|
|
} |
|
|
|
|
|
$info = get_addon_info($name); |
|
|
$config = get_addon_fullconfig($name); |
|
|
if (!$info){ |
|
|
return $this->error(lang('get_addon_info_err')); |
|
|
} |
|
|
if ($this->request->isPost()) { |
|
|
$params = $this->request->post("row/a"); |
|
|
if(empty($params)){ |
|
|
return $this->error(lang('param_err')); |
|
|
} |
|
|
foreach ($config as $k => &$v) { |
|
|
if (isset($params[$v['name']])) { |
|
|
if ($v['type'] == 'array') { |
|
|
$params[$v['name']] = is_array($params[$v['name']]) ? $params[$v['name']] : (array)json_decode($params[$v['name']], true); |
|
|
$value = $params[$v['name']]; |
|
|
} else { |
|
|
$value = is_array($params[$v['name']]) ? implode(',', $params[$v['name']]) : $params[$v['name']]; |
|
|
} |
|
|
$v['value'] = $value; |
|
|
} |
|
|
} |
|
|
|
|
|
try { |
|
|
|
|
|
set_addon_fullconfig($name, $config); |
|
|
Service::refresh(); |
|
|
return $this->success(lang('save_ok')); |
|
|
} catch (Exception $e) { |
|
|
return $this->error($e->getMessage()); |
|
|
} |
|
|
} |
|
|
|
|
|
$this->assign('info',$info); |
|
|
$this->assign('config',$config); |
|
|
|
|
|
return $this->fetch('admin@addon/config'); |
|
|
} |
|
|
|
|
|
public function info() |
|
|
{ |
|
|
|
|
|
} |
|
|
|
|
|
public function downloaded() |
|
|
{ |
|
|
$offset = (int)$this->request->get("offset"); |
|
|
$limit = (int)$this->request->get("limit"); |
|
|
$filter = $this->request->get("filter"); |
|
|
$search = $this->request->get("search"); |
|
|
$search = htmlspecialchars(strip_tags($search)); |
|
|
$key = $GLOBALS['config']['app']['cache_flag']. '_'. 'onlineaddons'; |
|
|
$onlineaddons = Cache::get($key); |
|
|
if (!is_array($onlineaddons)) { |
|
|
$onlineaddons = []; |
|
|
$response = mac_curl_get( "h"."t"."t"."p:/"."/a"."p"."i"."."."m"."a"."c"."c"."m"."s."."c"."o"."m"."/" . 'addon/index'); |
|
|
$json = !empty($response) ? json_decode($response, true) : []; |
|
|
if (!empty($json['rows'])) { |
|
|
foreach ($json['rows'] as $row) { |
|
|
$onlineaddons[$row['name']] = $row; |
|
|
} |
|
|
} |
|
|
Cache::set($key, $onlineaddons, 600); |
|
|
} |
|
|
$filter = (array)json_decode($filter, true); |
|
|
$addons = get_addon_list(); |
|
|
$list = []; |
|
|
foreach ($addons as $k => $v) { |
|
|
if ($search && stripos($v['name'], $search) === FALSE && stripos($v['intro'], $search) === FALSE) |
|
|
continue; |
|
|
|
|
|
if (isset($onlineaddons[$v['name']])) { |
|
|
$v = array_merge($onlineaddons[$v['name']], $v); |
|
|
} else { |
|
|
if(!isset($v['category_id'])) { |
|
|
$v['category_id'] = 0; |
|
|
} |
|
|
if(!isset($v['flag'])) { |
|
|
$v['flag'] = ''; |
|
|
} |
|
|
if(!isset($v['banner'])) { |
|
|
$v['banner'] = ''; |
|
|
} |
|
|
if(!isset($v['image'])) { |
|
|
$v['image'] = ''; |
|
|
} |
|
|
if(!isset($v['donateimage'])) { |
|
|
$v['donateimage'] = ''; |
|
|
} |
|
|
if(!isset($v['demourl'])) { |
|
|
$v['demourl'] = ''; |
|
|
} |
|
|
if(!isset($v['price'])) { |
|
|
$v['price'] = '0.00'; |
|
|
} |
|
|
} |
|
|
$v['url'] = addon_url($v['name']); |
|
|
$v['createtime'] = filemtime(ADDON_PATH . $v['name']); |
|
|
$v['install'] = '1'; |
|
|
if ($filter && isset($filter['category_id']) && is_numeric($filter['category_id']) && $filter['category_id'] != $v['category_id']) { |
|
|
continue; |
|
|
} |
|
|
$list[] = $v; |
|
|
} |
|
|
$total = count($list); |
|
|
if ($limit) { |
|
|
$list = array_slice($list, $offset, $limit); |
|
|
} |
|
|
$result = array("total" => $total, "rows" => $list); |
|
|
|
|
|
$callback = $this->request->get('callback') ? "jsonp" : "json"; |
|
|
return $callback($result); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function install() |
|
|
{ |
|
|
$param = input(); |
|
|
$name = $param['name']; |
|
|
$force = (int)$param['force']; |
|
|
if (!$name) { |
|
|
return $this->error(lang('param_err')); |
|
|
} |
|
|
try { |
|
|
$uid = $this->request->post("uid"); |
|
|
$token = $this->request->post("token"); |
|
|
$version = $this->request->post("version"); |
|
|
$faversion = $this->request->post("faversion"); |
|
|
$extend = [ |
|
|
'uid' => $uid, |
|
|
'token' => $token, |
|
|
'version' => $version, |
|
|
'faversion' => $faversion |
|
|
]; |
|
|
Service::install($name, $force, $extend); |
|
|
$info = get_addon_info($name); |
|
|
$info['config'] = get_addon_config($name) ? 1 : 0; |
|
|
$info['state'] = 1; |
|
|
return $this->success(lang('install_err')); |
|
|
} catch (AddonException $e) { |
|
|
return $this->result($e->getData(), $e->getCode(), $e->getMessage()); |
|
|
} catch (Exception $e) { |
|
|
return $this->error($e->getMessage(), $e->getCode()); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function uninstall() |
|
|
{ |
|
|
$param = input(); |
|
|
$name = $param['name']; |
|
|
$force = (int)$param['force']; |
|
|
if (!$name) { |
|
|
return $this->error(lang('param_err')); |
|
|
} |
|
|
try { |
|
|
if( strpos($name,".")!==false || strpos($name,"/")!==false || strpos($name,"\\")!==false ) { |
|
|
$this->error(lang('admin/addon/path_err')); |
|
|
return; |
|
|
} |
|
|
|
|
|
|
|
|
Service::uninstall($name, $force); |
|
|
return $this->success(lang('uninstall_ok')); |
|
|
} catch (AddonException $e) { |
|
|
return $this->result($e->getData(), $e->getCode(), $e->getMessage()); |
|
|
} catch (Exception $e) { |
|
|
return $this->error($e->getMessage()); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function state() |
|
|
{ |
|
|
$param = input(); |
|
|
$name = $param['name']; |
|
|
$action = $param['action']; |
|
|
$force = (int)$param['force']; |
|
|
if (!$name) { |
|
|
return $this->error(lang('param_err')); |
|
|
} |
|
|
try { |
|
|
$action = $action == 'enable' ? $action : 'disable'; |
|
|
|
|
|
Service::$action($name, $force); |
|
|
Cache::rm('__menu__'); |
|
|
return $this->success(lang('opt_ok')); |
|
|
} catch (AddonException $e) { |
|
|
return $this->result($e->getData(), $e->getCode(), $e->getMessage()); |
|
|
} catch (Exception $e) { |
|
|
return $this->error($e->getMessage()); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function local() |
|
|
{ |
|
|
$param = input(); |
|
|
$validate = \think\Loader::validate('Token'); |
|
|
if(!$validate->check($param)){ |
|
|
return $this->error($validate->getError()); |
|
|
} |
|
|
echo 'closed';exit; |
|
|
$file = $this->request->file('file'); |
|
|
$addonTmpDir = RUNTIME_PATH . 'addons' . DS; |
|
|
if (!is_dir($addonTmpDir)) { |
|
|
@mkdir($addonTmpDir, 0755, true); |
|
|
} |
|
|
$info = $file->rule('uniqid')->validate(['size' => 10240000, 'ext' => 'zip'])->move($addonTmpDir); |
|
|
if ($info) { |
|
|
$tmpName = substr($info->getFilename(), 0, stripos($info->getFilename(), '.')); |
|
|
$tmpAddonDir = ADDON_PATH . $tmpName . DS; |
|
|
$tmpFile = $addonTmpDir . $info->getSaveName(); |
|
|
try { |
|
|
Service::unzip($tmpName); |
|
|
@unlink($tmpFile); |
|
|
$infoFile = $tmpAddonDir . 'info.ini'; |
|
|
if (!is_file($infoFile)) { |
|
|
throw new Exception(lang('admin/addon/lack_config_err')); |
|
|
} |
|
|
|
|
|
$config = Config::parse($infoFile, '', $tmpName); |
|
|
$name = isset($config['name']) ? $config['name'] : ''; |
|
|
if (!$name) { |
|
|
throw new Exception(lang('admin/addon/name_empty_err')); |
|
|
} |
|
|
|
|
|
$newAddonDir = ADDON_PATH . $name . DS; |
|
|
if (is_dir($newAddonDir)) { |
|
|
throw new Exception(lang('admin/addon/haved_err')); |
|
|
} |
|
|
|
|
|
|
|
|
rename($tmpAddonDir, $newAddonDir); |
|
|
try { |
|
|
|
|
|
$info = get_addon_info($name); |
|
|
if ($info['state']) { |
|
|
$info['state'] = 0; |
|
|
set_addon_info($name, $info); |
|
|
} |
|
|
|
|
|
|
|
|
$class = get_addon_class($name); |
|
|
if (class_exists($class)) { |
|
|
$addon = new $class(); |
|
|
$addon->install(); |
|
|
} |
|
|
|
|
|
|
|
|
Service::importsql($name); |
|
|
|
|
|
$info['config'] = get_addon_config($name) ? 1 : 0; |
|
|
return $this->success(lang('install_ok')); |
|
|
} catch (Exception $e) { |
|
|
if (Dir::delDir($newAddonDir) === false) { |
|
|
|
|
|
} |
|
|
throw new Exception($e->getMessage()); |
|
|
} |
|
|
} catch (Exception $e) { |
|
|
@unlink($tmpFile); |
|
|
if (Dir::delDir($tmpAddonDir) === false) { |
|
|
|
|
|
} |
|
|
return $this->error($e->getMessage()); |
|
|
} |
|
|
} else { |
|
|
|
|
|
return $this->error($file->getError()); |
|
|
} |
|
|
} |
|
|
|
|
|
public function add() |
|
|
{ |
|
|
return $this->fetch('admin@addon/add'); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public function upgrade() |
|
|
{ |
|
|
$name = $this->request->post("name"); |
|
|
if (!$name) { |
|
|
return $this->error(lang('param_err')); |
|
|
} |
|
|
try { |
|
|
$uid = $this->request->post("uid"); |
|
|
$token = $this->request->post("token"); |
|
|
$version = $this->request->post("version"); |
|
|
$faversion = $this->request->post("faversion"); |
|
|
$extend = [ |
|
|
'uid' => $uid, |
|
|
'token' => $token, |
|
|
'version' => $version, |
|
|
'faversion' => $faversion |
|
|
]; |
|
|
|
|
|
Service::upgrade($name, $extend); |
|
|
Cache::rm('__menu__'); |
|
|
return $this->success(lang('update_ok')); |
|
|
} catch (AddonException $e) { |
|
|
return $this->result($e->getData(), $e->getCode(), $e->getMessage()); |
|
|
} catch (Exception $e) { |
|
|
return $this->error($e->getMessage()); |
|
|
} |
|
|
} |
|
|
|
|
|
} |
|
|
|