official_website/app/admin/controller/Apply.php

494 lines
20 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 app\admin\controller;
use app\admin\util\TableUtil;
use app\admin\util\Zipdown;
use app\common\controller\AdminApplyBase;
use app\common\model\Apply as applyModel;
use app\common\util\FileUtil;
use think\facade\Db;
use think\facade\View;
class Apply extends AdminApplyBase
{
public function initialize()
{
parent::initialize();
$breadcrumb = array();
array_push($breadcrumb, ['id'=>'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'] = '<i class="'.$item['icon'].'"></i>';
}else{
if($item['type'] != 0){//系统内置
$item['icon'] = url('/'.$item["mark"].'/Picture/icon');
$item['iconHtml'] = '<img src="'.$item['icon'].'"/>';
}
$item['iconHtml'] = '<img src="'.$item['icon'].'"/>';
}
$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'] = '<i class="'.$item['icon'].'"></i>';
}else{
if($item['type'] != 0){//系统内置
$item['icon'] = url('/'.$item["mark"].'/Picture/icon');
$item['iconHtml'] = '<img src="'.$item['icon'].'"/>';
}
$item['iconHtml'] = '<img src="'.$item['icon'].'"/>';
}
$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);
}
}