'42', 'title'=>'应用', 'name'=>'','url'=>url("Apply/index").'?columnId=42']);
array_push($breadcrumb, ['id'=>'', 'title'=>'应用中心', 'name'=>'','url'=>url("Apply/index").'?columnId=42']);
View::assign("breadcrumb", $breadcrumb);//面包屑
View::assign("clickName", "应用中心");//面包屑
}
private function getInfo($mark){
$imagePath = root_path()."app/".$mark."/info.ini";
$infoContent = file_get_contents($imagePath);
$infoContent = str_replace("\r\n", "\n", $infoContent);
$infoArr = explode("\n", $infoContent);
$result = [];
foreach ($infoArr as $vo){
$iconArr = explode("=", $vo);
if (sizeof($iconArr) == 2){
$result[trim($iconArr[0])] = trim($iconArr[1]);
}
}
return $result;
}
public function stopPlugin(){
$where = array();
array_push($where,['status', '=', 0]);
$condition = array();
$list = (new applyModel())->where([$where])->where($condition)->order("sort","desc")->select()->each(function($item, $key){
if(str_starts_with(trim($item['icon']), "foxui-icon-")){
$item['iconHtml'] = '';
}else{
if($item['type'] != 0){//系统内置
$item['icon'] = url('/'.$item["mark"].'/Picture/icon');
$item['iconHtml'] = '
';
}
$item['iconHtml'] = '
';
}
$item['operate_status'] = 1;//操作状态 1:已安装
$version = "1.0";
if($item['type'] != 0){
$info = $this->getInfo($item["mark"]);
$version = $info['version'];
}
$item['version'] = $version;
return $item;
});
$this->success('查询成功', '',$list);
}
public function index()
{
$param = $this->request->param();
if($this->request->isAjax()){
$where = array();
array_push($where,['status', '=', 1]);
$condition = array();
if(array_key_exists('name', $param) && !empty($param['name'])){
array_push($condition,['name', 'like', '%'.$param['name'].'%']);
}
$admin_path = config('adminconfig.admin_path');
$list = (new applyModel())->where([$where])->where($condition)->order("sort","desc")->select()->each(function($item, $key) use ($admin_path){
if(!empty($item["path"])){
if($item['type'] == 0 && $item['mark'] == "admin"){
$url = url($admin_path.$item["path"])."?columnId=".$item['column_id']."&apply_plugin_id=".$item['id'];
}else{
$url = url($item["mark"].$item["path"])."?columnId=".$item['column_id']."&apply_plugin_id=".$item['id'];
}
if(!empty($item['apply_menu_id'])){
$url = $url."&id=".$item['apply_menu_id'];
}
$item["path"] = $url;
}
if(str_starts_with(trim($item['icon']), "foxui-icon-")){
$item['iconHtml'] = '';
}else{
if($item['type'] != 0){//系统内置
$item['icon'] = url('/'.$item["mark"].'/Picture/icon');
$item['iconHtml'] = '
';
}
$item['iconHtml'] = '
';
}
$item['operate_status'] = 1;//操作状态 1:已安装
$version = "1.0";
if($item['type'] != 0){
$info = $this->getInfo($item["mark"]);
$version = $info['version'];
}
$item['version'] = $version;
return $item;
})->toArray();
$this->success('查询成功', '', $list);
}
return view('index');
}
public function extendPlugin(){
$foxcmsDomain = config("adminconfig.foxcms_domain");//foxcms官网地址
$foxcmsPathUrl = $foxcmsDomain.url("/api/apply/applyList")."?domain={$this->domainNo}&type=3";
$resJson = get_url_content($foxcmsPathUrl);
if(empty($resJson)){
$this->success("查询成功", "", []);
}
$res = json_decode($resJson, true);
if($res['code'] == 0){
$this->success("查询成功", "", []);
}
$data = $res['data'];
$this->success("查询成功", "", $data);
}
private function pluginIndexData($domain){
$foxcmsDomain = config("adminconfig.foxcms_domain");//foxcms官网地址
$foxcmsPathUrl = $foxcmsDomain.url("/api/apply/list")."?domain={$domain}";
$resJson = get_url_content($foxcmsPathUrl);
if(empty($resJson)){
return [];
}
$res = json_decode($resJson, true);
if($res['code'] == 0){
return [];
}
$data = $res['data'];
$hData = $data['data'];
$rdata = $hData;
if(TableUtil::check_table("fox_apply")){
$nData = [];
foreach ($hData as $plugin){
$apply = Db::name('apply')->where(['mark'=>$plugin['mark']])->find();
$url = "javascript:void(0)";
if($apply){
$plugin['operate_status'] = 1;
if(!empty($apply["path"])){
$url = url($apply["mark"].$apply["path"])."?columnId=".$apply['column_id']."&apply_plugin_id=".$apply['id'];
if(!empty($apply['apply_menu_id'])){
$url = $url."&id=".$apply['apply_menu_id'];
}
}
if($apply['status'] == 0){
$plugin['operate_status'] = 3;//停用
}
}else{
if($plugin['buy_state'] == 1){
$plugin['operate_status'] = 2;//未购买或授权
}else{
$plugin['operate_status'] = 0;//未安装
}
}
$plugin["path"] = $url;
array_push($nData, $plugin);
}
$rdata = $nData;
}
return $rdata;
}
public function pluginIndex(){
$data = $this->pluginIndexData($this->domainNo);
$rdata['data'] = $data;
$this->success("查询成功", "", $rdata);
}
public function getPlugin($apply_pack_id, $domain){
$foxcmsDomain = config("adminconfig.foxcms_domain");//foxcms官网地址
$foxcmsPathUrl = $foxcmsDomain.url("/api/apply/getPlugin");
$resJson = post_url_content($foxcmsPathUrl, ['apply_pack_id'=>$apply_pack_id, 'domain'=>$domain]);
return $resJson;
}
public function installIndex(){
$param = $this->request->param();
if (empty($param['id'])){
$this->error("抱歉缺少安装参数");
}
$resJson = $this->getPlugin($param['id'], $this->domainNo);
if(empty($resJson)){
$this->error("安装失败");
}
$res = json_decode($resJson, true);
if($res['code'] == 0){
$this->error($res['msg']);
}
View::assign("apply_pack_id", $param['id']);
$rdata = $res['data'];
$applyKey = "apply-mark-{$param['id']}";
saveToCache($applyKey, $rdata['mark']);
$url = $rdata['url'];
$urlKey = "apply-url-{$param['id']}";
saveToCache($urlKey, $url);
$envCheckList = [];
if (!empty($url)){
$url = replaceSymbol($url);
$infoArr = explode("/", $url);
$filename = $infoArr[sizeof($infoArr)-1];
$filenameArr = explode(".", $filename);
$foxcmsDomain = config("adminconfig.foxcms_domain");//foxcms官网地址
$applyInfoPath = $foxcmsDomain."/plugins/{$filenameArr[0]}.ini";
$content = get_url_content($applyInfoPath);
$envInfo = json_decode($content, true);
$apply = $envInfo[0];
View::assign("version", $apply);
$version_flag = "apply-{$param['id']}";
View::assign("version_flag", $version_flag);
saveToCache($version_flag, json_encode($apply));
foreach ($envInfo as $key=>$env){
if($key == 0){
continue;
}
if(str_starts_with($env['name'], "PHP")){
$php_status = false;
if(version_compare(PHP_VERSION,'7.1.9','>=')) {
$php_status = true;
}
$env['status'] = $php_status;
}elseif ($env['name'] == "MySQL"){
$mysql_status = (extension_loaded('PDO') && extension_loaded('pdo_mysql'));
$env['status'] = $mysql_status;
}elseif ($env['name'] == $env['desc']){
$write_status = is_writeable(root_path()."{$env['dir']}");
$env['status'] = $write_status;
}
array_push($envCheckList, $env);
}
}
View::assign("envCheckList", $envCheckList);
return view();
}
public function download(){
$param = $this->request->param();
$apply_pack_id = $param['apply_pack_id'];
$urlKey = "apply-url-{$apply_pack_id}";
$url = saveToCache($urlKey);
if (empty($url)){
$this->error("下载失败");
}
$fileUtil = new FileUtil();
$path = root_path().'plugins/';
$path = replaceSymbol($path);
if(!tp_mkdir($path)){
$this->error("创建文件夹失败");
}
$filepath = $fileUtil->download($url, "", $path);
$fpArr = explode(".", $filepath);
if(sizeof($fpArr) <= 0){
$this->error("下载失败");
}
$apply_download_key = "apply_download_{$apply_pack_id}";
saveToCache($apply_download_key, $filepath);
$this->success("下载完成", "", $apply_download_key);
}
public function install(){
$param = $this->request->param();
$apply_pack_id = $param['apply_pack_id'];
$apply_download_key = "apply_download_{$apply_pack_id}";
$filepath = saveToCache($apply_download_key);
$applyKey = "apply-mark-{$apply_pack_id}";
$mark = saveToCache($applyKey);
if(empty($mark) || empty($filepath)){
$resJson = $this->getPlugin($apply_pack_id, $this->domainNo);
if(empty($resJson)){
$this->error("安装失败", "", $resJson);
}
$res = json_decode($resJson, true);
if($res['code'] == 0){
$this->error("安装失败");
}
$rdata = $res['data'];
if(empty($mark) && !empty($rdata['mark'])){
$mark = $rdata['mark'];
saveToCache($applyKey, $mark);
}
if(empty($filepath)){
$url = $rdata['url'];
if(!empty($url)){
$position = strpos($url, $mark);
$filename= substr($rdata['url'], $position);
$path = root_path().'plugins/'.$filename;
$path = replaceSymbol($path);
if(file_exists($path)){
$filepath = $path;
saveToCache($apply_download_key, $filepath);
}
}
}
if(empty($mark) || empty($filepath)) {
$this->error("安装失败1", "", $mark."-".$filepath);
}
}
$filepath = replaceSymbol($filepath);
$zipdown = new Zipdown();
$apply_path = app()->getBasePath();
$r = $zipdown->unZipFile($filepath, $apply_path);
if($r){
$plugin_path = $apply_path."{$mark}".DIRECTORY_SEPARATOR."data".DIRECTORY_SEPARATOR;
if(is_dir($plugin_path)){
$arr_file = array();
$activepath = $plugin_path;
$arr_file = dirFile($plugin_path, $activepath, $arr_file);
$exeErrSql = [];//执行错误的sql语句
foreach ($arr_file as $file){
if(str_ends_with($file, ".sql")){//判断是否为sql文件
$sqlContent = @file_get_contents($file);
$sqlArr = TableUtil::sql_split($sqlContent);
foreach ($sqlArr as $sql){
if(trim($sql) == ''){
continue;
}
$sqlItms = explode(" ", $sql);
if(sizeof($sqlItms) <= 0){
continue;
}
$firstItem = trim($sqlItms[0]);
$tableName = "";
if($firstItem == "DROP"){//删除表
continue;
}elseif ($firstItem == "CREATE"){//创建表
if(sizeof($sqlItms) >= 3){
$tableName = trim($sqlItms[2]);
if(TableUtil::check_table($tableName)){//判断表是否存在
continue;
}
}
}elseif ($firstItem == "INSERT"){//插入数据
if(sizeof($sqlItms) >= 3){
$tableName = trim($sqlItms[2]);
}
}
if(empty($tableName)){
continue;
}
//执行sql语句
try{
Db::execute($sql);
}catch (\Exception $e){
array_push($exeErrSql, $sql);
}
}
}
}
delDir($plugin_path);//删除插件数据
$apply = xn_cfg("apply");
if(!in_array($mark, $apply)){
array_push($apply, $mark);
set_php_arr(config_path()."cfg/", 'apply.php', $apply);
}
if(sizeof($exeErrSql) > 0){
$this->error("抱歉你安装的应用数据存在冲突!", "", $exeErrSql);
}
@unlink($filepath);//删除插件下载包
$this->success("安装成功");
}
}
}
public function nextInstallIndex(){
$param = $this->request->param();
$step = $param['step']??1;
$version_flag = "apply-{$param['apply_pack_id']}";
$vserionStr = saveToCache($version_flag);
$vserion = [];
if(empty($vserionStr) && !empty($param['apply_pack_id'])){
$resJson = $this->getPlugin($param['apply_pack_id'], $this->domainNo);
$res = json_decode($resJson, true);
View::assign("apply_pack_id", $param['apply_pack_id']);
$rdata = $res['data'];
$url = $rdata['url'];
if (!empty($url)) {
$url = replaceSymbol($url);
$infoArr = explode("/", $url);
$filename = $infoArr[sizeof($infoArr) - 1];
$filenameArr = explode(".", $filename);
$foxcmsDomain = config("adminconfig.foxcms_domain");//foxcms官网地址
$applyInfoPath = "{$foxcmsDomain}/plugins/{$filenameArr[0]}.ini";
$content = get_url_content($applyInfoPath);
$envInfo = json_decode($content, true);
$vserion = $envInfo[0];
}
}else{
$vserion = json_decode($vserionStr, true);
}
View::assign("version", $vserion);
if($step == 1){
View::assign("apply_pack_id", $param['apply_pack_id']);
return view("install_index1");
}else{
$myApply = url("Apply/index?columnId=42");
View::assign("myApply", $myApply);
$applyKey = "apply-mark-{$param['apply_pack_id']}";
$mark = saveToCache($applyKey);
$apply = \app\common\model\Apply::where(['mark'=>$mark])->find();
if($apply){
$url = url($apply["mark"].$apply["path"])."?columnId=".$apply['column_id']."&apply_plugin_id=".$apply['id'];
}else{
$url = "javascript:void(0)";
}
View::assign("apply_url", $url);
return view("install_index2");
}
}
public function uninstallIndex(){
$param = $this->request->param();
if(empty($param['id'])){
$this->error("打包失败,缺少参数");
}
View::assign("id", $param['id']);
$apply = \app\common\model\Apply::find($param['id']);
$version = $this->getInfo($apply['mark']);
$version['icon'] = url('/'.$apply["mark"].'/Picture/icon');
$version['link'] = $apply['link'];
View::assign("version", $version);
return view();
}
public function uninstallPlugin(){
$param = $this->request->param();
if(empty($param['id'])){
$this->error("打包失败,缺少参数");
}
$id = $param['id'];
try{
$apply = \app\common\model\Apply::find($id);
if($apply == null){
$this->error("抱歉没找卸载应用");
}else{
$apply_path = app()->getBasePath()."{$apply['mark']}";
if(is_dir($apply_path)){
delDir($apply_path);//删除插件目录
}
}
\app\common\model\Apply::destroy($id);//删除应用数据
if(TableUtil::check_table("fox_apply_menu")){
Db::name('apply_menu')->where(['apply_plugin_id'=>$id])->delete();//删除插件应用菜单数据
}
if(TableUtil::check_table("fox_apply_table")){
$atList = Db::name('apply_table')->where(['apply_plugin_id'=>$id])->select();//查询插件表
foreach ($atList as $at){
if (TableUtil::check_table($at['table'])){
TableUtil::del_table($at['table']);//删除表
}
}
Db::name('apply_table')->where(['apply_plugin_id'=>$id])->delete();
}
}catch (\Exception $e){
$this->error("卸载插件失败");
}
$this->success("卸载插件成功");
}
public function updateStatus()
{
$param = $this->request->param();
if(empty($param['id'])){
$this->error("缺少更新参数");
}
$apply = \app\common\model\Apply::field("status")->find($param['id']);
if(!$apply){
$this->error("没找到修改数据");
}
$status = $apply['status'] == '启用'?0:1;
$r = \app\common\model\Apply::update(['id'=>$param['id'], 'status'=>$status]);
if($r <= 0){
$this->error("更新失败");
}
$this->success('操作成功', "", $apply);
}
}