插件功能更新

This commit is contained in:
2016-09-17 17:54:14 +08:00
parent f0df1f13e4
commit 4ee9156229
7 changed files with 172 additions and 164 deletions

View File

@@ -7,7 +7,6 @@
// | Author: yangweijie <yangweijiester@gmail.com> <code-tech.diandian.com> // | Author: yangweijie <yangweijiester@gmail.com> <code-tech.diandian.com>
// +---------------------------------------------------------------------- // +----------------------------------------------------------------------
namespace addons\systeminfo; namespace addons\systeminfo;
use app\common\controller\Addons; use app\common\controller\Addons;
@@ -16,62 +15,63 @@ use app\common\controller\Addons;
* @author thinkphp * @author thinkphp
*/ */
class Systeminfo extends Addons{ class Systeminfo extends Addons {
public $info = array( public $info = array(
'name'=>'Systeminfo', 'name' => 'Systeminfo',
'title'=>'系统环境信息', 'title' => '系统环境信息',
'description'=>'用于显示一些服务器的信息', 'description' => '用于显示一些服务器的信息',
'status'=>1, 'status' => 1,
'author'=>'molong', 'author' => 'molong',
'version'=>'0.1' 'version' => '0.1',
); );
public function install(){ public function install() {
return true; return true;
} }
public function uninstall(){ public function uninstall() {
return true; return true;
} }
//实现的AdminIndex钩子方法 //实现的AdminIndex钩子方法
public function AdminIndex($param){ public function AdminIndex($param) {
$config = $this->getConfig(); $config = $this->getConfig();
if(false){//extension_loaded('curl') if (false) {
$url = 'http://www.tensent.cn/index.php?m=home&c=version&a=check_version'; //extension_loaded('curl')
$params = array( $url = 'http://www.tensent.cn/index.php?m=home&c=version&a=check_version';
'version' => ONETHINK_VERSION, $params = array(
'domain' => $_SERVER['HTTP_HOST'], 'version' => ONETHINK_VERSION,
'auth' => sha1(config('DATA_AUTH_KEY')), 'domain' => $_SERVER['HTTP_HOST'],
); 'auth' => sha1(config('DATA_AUTH_KEY')),
);
$vars = http_build_query($params); $vars = http_build_query($params);
$opts = array( $opts = array(
CURLOPT_TIMEOUT => 5, CURLOPT_TIMEOUT => 5,
CURLOPT_RETURNTRANSFER => 1, CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => $url, CURLOPT_URL => $url,
CURLOPT_POST => 1, CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => $vars, CURLOPT_POSTFIELDS => $vars,
CURLOPT_USERAGENT => $_SERVER['HTTP_USER_AGENT'], CURLOPT_USERAGENT => $_SERVER['HTTP_USER_AGENT'],
); );
/* 初始化并执行curl请求 */ /* 初始化并执行curl请求 */
$ch = curl_init(); $ch = curl_init();
curl_setopt_array($ch, $opts); curl_setopt_array($ch, $opts);
$data = curl_exec($ch); $data = curl_exec($ch);
$error = curl_error($ch); $error = curl_error($ch);
curl_close($ch); curl_close($ch);
} }
if(!empty($data) && strlen($data)<400 ){ if (!empty($data) && strlen($data) < 400) {
$config['new_version'] = $data; $config['new_version'] = $data;
} }
$this->assign('addons_config', $config); $this->assign('addons_config', $config);
if($config['display']){ if ($config['display']) {
$this->template('widget'); $this->template('widget');
} }
} }
} }

View File

@@ -9,6 +9,7 @@
<h2>{$meta_title}</h2> <h2>{$meta_title}</h2>
</div> </div>
<div class="pull-right"> <div class="pull-right">
<a class="btn btn-info" href="{:url('index?refresh=1')}">更 新</a>
<a class="btn btn-primary" href="{:url('add')}">新 增</a> <a class="btn btn-primary" href="{:url('add')}">新 增</a>
<button class="btn btn-danger ajax-post confirm" url="{:url('del')}" target-form="ids">删 除</button> <button class="btn btn-danger ajax-post confirm" url="{:url('del')}" target-form="ids">删 除</button>
</div> </div>
@@ -41,7 +42,7 @@
<td>{$item['author']}</td> <td>{$item['author']}</td>
<td>{$item['version']}</td> <td>{$item['version']}</td>
<td> <td>
{if $item['uninstall']} {if !$item['isinstall']}
<a href="{:url('install?addon_name='.$item['name'])}" class="ajax-get">安装</a> <a href="{:url('install?addon_name='.$item['name'])}" class="ajax-get">安装</a>
{else/} {else/}
<a href="{:url('uninstall?id='.$item['id'])}" class="confirm ajax-get">卸载</a> <a href="{:url('uninstall?id='.$item['id'])}" class="confirm ajax-get">卸载</a>

View File

@@ -207,7 +207,7 @@
{if $meta_title} {if $meta_title}
<span>{$meta_title}</span> <span>{$meta_title}</span>
{else/} {else/}
<span>{:lang($Request->controller().'_'.$Request->action())}</span> <span>{:lang(request()->controller().'_'.request()->action())}</span>
{/if} {/if}
</li> </li>
</ol> </ol>

View File

@@ -34,7 +34,7 @@ class Addons extends Base {
public function template($template) { public function template($template) {
$mc = $this->getAddonsName(); $mc = $this->getAddonsName();
$ac = input('get.ac', '', 'trim,strtolower'); $ac = input('ac', '', 'trim,strtolower');
$parse_str = \think\Config::get('parse_str'); $parse_str = \think\Config::get('parse_str');
$parse_str['__ADDONROOT__'] = ROOT_PATH . "/addons/{$mc}"; $parse_str['__ADDONROOT__'] = ROOT_PATH . "/addons/{$mc}";
\think\Config::set('parse_str', $parse_str); \think\Config::set('parse_str', $parse_str);
@@ -52,7 +52,7 @@ class Addons extends Base {
} }
final public function getAddonsName() { final public function getAddonsName() {
$mc = input('get.mc', '', 'trim,strtolower'); $mc = input('mc', '', 'trim,strtolower');
if ($mc) { if ($mc) {
return $mc; return $mc;
} else { } else {

View File

@@ -201,6 +201,7 @@ class Admin extends Base {
$model = db('Addons'); $model = db('Addons');
$list = array(); $list = array();
$map = array( $map = array(
'isinstall' => array('gt', 0),
'status' => array('gt', 0), 'status' => array('gt', 0),
); );
$list = $model->field("name,id,title,'' as 'style'")->where($map)->select(); $list = $model->field("name,id,title,'' as 'style'")->where($map)->select();

View File

@@ -16,123 +16,120 @@ namespace app\common\model;
*/ */
class Addons extends \app\common\model\Base { class Addons extends \app\common\model\Base {
protected $auto = array('status'); protected $auto = array('status', 'isinstall', 'update_time');
protected $insert = array('create_time'); protected $insert = array('create_time');
protected function setStatusAttr($value){ protected function setStatusAttr($value) {
return 1; return $value ? $value : 0;
} }
protected function setIsinstallAttr($value){ protected function setIsinstallAttr($value) {
return 0; return $value ? $value : 0;
} }
protected function getStatusTextAttr($value, $data){ protected function getStatusTextAttr($value, $data) {
return $data['status'] ? "启用" : "禁用"; return $data['status'] ? "启用" : "禁用";
} }
protected function getUninstallAttr($value, $data){ protected function getUninstallAttr($value, $data) {
return 0; return 0;
} }
/** /**
* 更新插件列表 * 更新插件列表
* @param string $addon_dir * @param string $addon_dir
*/ */
public function refresh($addon_dir = ''){ public function refresh($addon_dir = '') {
if(!$addon_dir){ if (!$addon_dir) {
$addon_dir = SENT_ADDON_PATH; $addon_dir = SENT_ADDON_PATH;
} }
$dirs = array_map('basename',glob($addon_dir.'*', GLOB_ONLYDIR)); $dirs = array_map('basename', glob($addon_dir . '*', GLOB_ONLYDIR));
if($dirs === FALSE || !file_exists($addon_dir)){ if ($dirs === FALSE || !file_exists($addon_dir)) {
$this->error = '插件目录不可读或者不存在'; $this->error = '插件目录不可读或者不存在';
return FALSE; return FALSE;
} }
$where['name'] = array('in',$dirs); $where['name'] = array('in', $dirs);
$addons = $this->where($where)->select(); $addons = $this->where($where)->column('*', 'name');
foreach ($dirs as $value) { foreach ($dirs as $value) {
$value = ucfirst($value); $value = ucfirst($value);
if(!isset($addons[$value])){ if (!isset($addons[$value])) {
$class = get_addon_class($value); $class = get_addon_class($value);
if(!class_exists($class)){ if (!class_exists($class)) {
// 实例化插件失败忽略执行 // 实例化插件失败忽略执行
\think\Log::record('插件'.$value.'的入口文件不存在!'); \think\Log::record('插件' . $value . '的入口文件不存在!');
continue; continue;
} }
$obj = new $class; $obj = new $class;
$addons[$value] = $obj->info; $save = $obj->info;
if($addons[$value]){ self::create($save);
$addons[$value]['id'] = 0;
$addons[$value]['uninstall'] = 1;
unset($addons[$value]['status']);
}
} }
} }
} }
/** /**
* 获取插件的后台列表 * 获取插件的后台列表
*/ */
public function getAdminList(){ public function getAdminList() {
$admin = array(); $admin = array();
$db_addons = db('Addons')->where("status=1 AND has_adminlist=1")->field('title,name')->select(); $db_addons = db('Addons')->where("status=1 AND has_adminlist=1")->field('title,name')->select();
if($db_addons){ if ($db_addons) {
foreach ($db_addons as $value) { foreach ($db_addons as $value) {
$admin[] = array('title'=>$value['title'],'url'=>"Addons/adminList?name={$value['name']}"); $admin[] = array('title' => $value['title'], 'url' => "Addons/adminList?name={$value['name']}");
} }
} }
return $admin; return $admin;
} }
public function install($data){ public function install($data) {
if ($data) { if ($data) {
$info = $this->where('name', $data['name'])->find(); $info = $this->where('name', $data['name'])->value('id');
if (null == $info) { if ($info) {
$result = $this->save($data); $result = $this->save(array('isinstall'=>1, 'status'=>1), array('id'=>$info));
if ($result) { }else{
return model('Hooks')->addHooks($data['name']); $data['isinstall'] = 1;
}else{ $data['status'] = 1;
return false; $result = $this->save($data);
} }
}else{ if (false !== $result) {
$this->error = "已安装!"; return model('Hooks')->addHooks($data['name']);
return false; }else{
} return false;
}else{ }
return false; } else {
} return false;
} }
}
public function uninstall($id){ public function uninstall($id) {
$info = $this->get($id); $info = $this->get($id);
if (!$info) { if (!$info) {
$this->error = "无此插件!"; $this->error = "无此插件!";
return false; return false;
} }
$class = get_addon_class($info['name']); $class = get_addon_class($info['name']);
if (class_exists($class)) { if (class_exists($class)) {
//插件卸载方法 //插件卸载方法
$addons = new $class; $addons = new $class;
if (!method_exists($addons,'uninstall')) { if (!method_exists($addons, 'uninstall')) {
$this->error = "插件卸载方法!"; $this->error = "插件卸载方法!";
return false; return false;
} }
$result = $addons->uninstall(); $result = $addons->uninstall();
if ($result) { if ($result) {
//卸载挂载点中的插件 //卸载挂载点中的插件
$result = model('Hooks')->removeHooks($info['name']); $result = model('Hooks')->removeHooks($info['name']);
//删除插件表中数据 //删除插件表中数据
$this->where(array('id'=>$id))->delete(); $this->where(array('id' => $id))->delete();
return true; return true;
}else{ } else {
$this->error = "无法卸载插件!"; $this->error = "无法卸载插件!";
return false; return false;
} }
} }
} }
public function build(){ public function build() {
} }
} }

View File

@@ -85,12 +85,13 @@ class Hooks extends Base {
'update_time' => time(), 'update_time' => time(),
'status' => 1 'status' => 1
); );
$this->save($save); self::create($save);
}else{ }else{
if ($info['addons']) { if ($info['addons']) {
# code... $addons = explode(',', $info['addons']);
array_push($addons, substr($item, 0, -5));
}else{ }else{
$addons = substr($item, 0, -5); $addons = array(substr($item, 0, -5));
} }
$this->where('name', $addons_name)->setField('addons', $addons); $this->where('name', $addons_name)->setField('addons', $addons);
} }
@@ -105,6 +106,14 @@ class Hooks extends Base {
$this->error = "未实现{$addons_name}插件的入口文件"; $this->error = "未实现{$addons_name}插件的入口文件";
return false; return false;
} }
$methods = get_class_methods($addons_class); $row = $this->where(array('addons'=>array('like',$addons_name)))->select();
foreach ($row as $key => $value) {
$value['addons'] = explode(',', $info['addons']);
$key = array_search($addons_name, $value['addons']);
unset($value['addons'][$key]);
$addons = $value['addons'];
$this->where('id', $value['id'])->setField('addons', $addons);
}
return true;
} }
} }