mirror of
https://gitee.com/zongzhige/shopxo.git
synced 2024-12-02 03:48:47 +08:00
应用上传安装
This commit is contained in:
parent
31820544d9
commit
3f13cc19bd
@ -195,5 +195,24 @@ class Pluginsadmin extends Common
|
||||
// 开始处理
|
||||
return PluginsAdminService::PluginsStatusUpdate(input('post.'));
|
||||
}
|
||||
|
||||
/**
|
||||
* 上传安装
|
||||
* @author Devil
|
||||
* @blog http://gong.gg/
|
||||
* @version 0.0.1
|
||||
* @datetime 2017-05-10T16:27:09+0800
|
||||
*/
|
||||
public function Upload()
|
||||
{
|
||||
// 是否ajax
|
||||
if(!IS_AJAX)
|
||||
{
|
||||
return $this->error('非法访问');
|
||||
}
|
||||
|
||||
// 开始处理
|
||||
return PluginsAdminService::PluginsUpload(input());
|
||||
}
|
||||
}
|
||||
?>
|
@ -98,8 +98,7 @@ class Theme extends Common
|
||||
}
|
||||
|
||||
// 开始处理
|
||||
$params = input();
|
||||
return ThemeService::ThemeDelete($params);
|
||||
return ThemeService::ThemeDelete(input());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -118,8 +117,7 @@ class Theme extends Common
|
||||
}
|
||||
|
||||
// 开始处理
|
||||
$params = input();
|
||||
return ThemeService::ThemeUpload($params);
|
||||
return ThemeService::ThemeUpload(input());
|
||||
}
|
||||
}
|
||||
?>
|
@ -25,8 +25,8 @@
|
||||
<label class="block">LOGO<span class="fs-12 fw-100 cr-999">(建议130像数X130像数)</span></label>
|
||||
<ul class="plug-file-upload-view plugins-logo-view" data-form-name="logo" data-max-number="1" data-delete="0" data-dialog-type="images">
|
||||
<li>
|
||||
<input type="text" name="logo" value="{{if !empty($data['logo'])}}{{$data.logo}}{{/if}}" data-validation-message="请上传图片" required />
|
||||
<img src="{{if !empty($data['logo_old'])}}{{$data.logo_old}}{{else /}}{{$attachment_host}}/static/admin/default/images/default-images.png{{/if}}" />
|
||||
<input type="text" name="logo" value="{{if !empty($data['logo_old'])}}{{$data.logo_old}}{{/if}}" data-validation-message="请上传图片" required />
|
||||
<img src="{{if !empty($data['logo'])}}{{$data.logo}}{{else /}}{{$attachment_host}}/static/admin/default/images/default-images.png{{/if}}" />
|
||||
</li>
|
||||
</ul>
|
||||
<div class="plug-file-upload-submit" data-view-tag="ul.plugins-logo-view">+上传图片</div>
|
||||
|
@ -8,12 +8,12 @@
|
||||
<!-- nav end -->
|
||||
|
||||
<!-- form start -->
|
||||
<form class="am-form form-validation view-save m-t-10" action="{{:MyUrl('admin/plugins/upload')}}" method="POST" request-type="ajax-url" request-value="{{:MyUrl('admin/plugins/index')}}" enctype="multipart/form-data">
|
||||
<form class="am-form form-validation view-save m-t-10" action="{{:MyUrl('admin/pluginsadmin/upload')}}" method="POST" request-type="ajax-url" request-value="{{:MyUrl('admin/pluginsadmin/index')}}" enctype="multipart/form-data">
|
||||
<div class="am-form-group am-form-file">
|
||||
<button type="button" class="am-btn am-btn-default am-btn-sm am-radius">
|
||||
<i class="am-icon-cloud-upload"></i> 选择文件</button>
|
||||
<input type="file" name="file" class="file-event" data-tips-tag="#form-file-tips" multiple data-validation-message="请选择需要上传的文件" required />
|
||||
<span class="tips fs-12">上传一个zip压缩格式的主题安装包</span>
|
||||
<span class="tips fs-12">上传一个zip压缩格式的应用安装包</span>
|
||||
<div id="form-file-tips"></div>
|
||||
</div>
|
||||
<div class="am-form-group">
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name":"默认模板",
|
||||
"ver":"1.2.0",
|
||||
"author":"魔鬼",
|
||||
"home":"http://gong.gg/"
|
||||
"ver":"1.3.0",
|
||||
"author":"Devil",
|
||||
"home":"http://shopxo.net/"
|
||||
}
|
@ -1,24 +0,0 @@
|
||||
<?php
|
||||
namespace app\plugins\ttttttsssstest88;
|
||||
|
||||
/**
|
||||
* 测试应用 - 后台管理
|
||||
* @author Devil
|
||||
* @blog http://gong.gg/
|
||||
* @version 0.0.1
|
||||
* @datetime 2016-12-01T21:51:08+0800
|
||||
*/
|
||||
class Admin
|
||||
{
|
||||
// 后台管理入口
|
||||
public function index($params = [])
|
||||
{
|
||||
// 数组组装
|
||||
$data = [
|
||||
'data' => ['hello', 'world!'],
|
||||
'msg' => 'hello world! admin',
|
||||
];
|
||||
return DataReturn('处理成功', 0, $data);
|
||||
}
|
||||
}
|
||||
?>
|
@ -1,27 +0,0 @@
|
||||
<?php
|
||||
namespace app\plugins\ttttttsssstest88;
|
||||
|
||||
/**
|
||||
* 测试应用 - 钩子入口
|
||||
* @author Devil
|
||||
* @blog http://gong.gg/
|
||||
* @version 0.0.1
|
||||
* @datetime 2016-12-01T21:51:08+0800
|
||||
*/
|
||||
class Hook
|
||||
{
|
||||
// 应用响应入口
|
||||
public function run($params = [])
|
||||
{
|
||||
// 是否控制器钩子
|
||||
if(isset($params['is_control']) && $params['is_control'] === true)
|
||||
{
|
||||
return [];
|
||||
|
||||
// 默认返回视图
|
||||
} else {
|
||||
return 'hello world!';
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
@ -1,24 +0,0 @@
|
||||
<?php
|
||||
namespace app\plugins\ttttttsssstest88;
|
||||
|
||||
/**
|
||||
* 测试应用 - 前端独立页面入口
|
||||
* @author Devil
|
||||
* @blog http://gong.gg/
|
||||
* @version 0.0.1
|
||||
* @datetime 2016-12-01T21:51:08+0800
|
||||
*/
|
||||
class Index
|
||||
{
|
||||
// 前端页面入口
|
||||
public function index($params = [])
|
||||
{
|
||||
// 数组组装
|
||||
$data = [
|
||||
'data' => ['hello', 'world!'],
|
||||
'msg' => 'hello world! index',
|
||||
];
|
||||
return DataReturn('处理成功', 0, $data);
|
||||
}
|
||||
}
|
||||
?>
|
@ -1,21 +0,0 @@
|
||||
{
|
||||
"base":{
|
||||
"plugins":"ttttttsssstest88",
|
||||
"name":"测试应用",
|
||||
"logo":"\/static\/upload\/images\/plugins_ttttttsssstest88\/2019\/02\/13\/1550050651917730.png",
|
||||
"author":"Devil",
|
||||
"author_url":"https:\/\/shopxo.net\/",
|
||||
"version":"1.0.0",
|
||||
"desc":"测试应用描述",
|
||||
"apply_terminal":[
|
||||
"pc"
|
||||
],
|
||||
"apply_version":[
|
||||
"1.3.0"
|
||||
],
|
||||
"is_home":true
|
||||
},
|
||||
"hook":[
|
||||
|
||||
]
|
||||
}
|
@ -1,15 +0,0 @@
|
||||
{{include file="public/header" /}}
|
||||
|
||||
<!-- right content start -->
|
||||
<div class="content-right">
|
||||
<div class="content">
|
||||
<h1>后台管理页面</h1>
|
||||
{{:print_r($data)}}
|
||||
<p class="msg">{{$msg}}</p>
|
||||
</div>
|
||||
</div>
|
||||
<!-- right content end -->
|
||||
|
||||
<!-- footer start -->
|
||||
{{include file="public/footer" /}}
|
||||
<!-- footer end -->
|
@ -1,31 +0,0 @@
|
||||
{{include file="public/header" /}}
|
||||
|
||||
<!-- nav start -->
|
||||
{{include file="public/nav" /}}
|
||||
<!-- nav end -->
|
||||
|
||||
<!-- header top nav -->
|
||||
{{include file="public/header_top_nav" /}}
|
||||
|
||||
<!-- search -->
|
||||
{{include file="public/nav_search" /}}
|
||||
|
||||
<!-- header nav -->
|
||||
{{include file="public/header_nav" /}}
|
||||
|
||||
<!-- goods category -->
|
||||
{{include file="public/goods_category" /}}
|
||||
|
||||
<!-- content start -->
|
||||
<div class="am-g my-content">
|
||||
<div class="am-u-md-6 am-u-sm-centered">
|
||||
<h1>前端页面</h1>
|
||||
{{:print_r($data)}}
|
||||
<p class="msg">{{$msg}}</p>
|
||||
</div>
|
||||
</div>
|
||||
<!-- content end -->
|
||||
|
||||
<!-- footer start -->
|
||||
{{include file="public/footer" /}}
|
||||
<!-- footer end -->
|
@ -298,16 +298,30 @@ class PluginsAdminService
|
||||
return DataReturn('应用不存在', -10);
|
||||
}
|
||||
|
||||
// 开启事务
|
||||
Db::startTrans();
|
||||
|
||||
// 删除操作
|
||||
if(Db::name('Plugins')->where($where)->delete())
|
||||
{
|
||||
// 删除应用文件
|
||||
self::PluginsResourcesDelete($plugins);
|
||||
// 钩子部署
|
||||
$ret = self::PluginsHookDeployment();
|
||||
if($ret['code'] == 0)
|
||||
{
|
||||
// 删除应用文件
|
||||
self::PluginsResourcesDelete($plugins);
|
||||
|
||||
return DataReturn('删除成功');
|
||||
// 提交事务
|
||||
Db::commit();
|
||||
return DataReturn('删除成功');
|
||||
}
|
||||
} else {
|
||||
$ret = DataReturn('删除失败或资源不存在', -100);
|
||||
}
|
||||
|
||||
return DataReturn('删除失败或资源不存在', -100);
|
||||
// 事务回退
|
||||
Db::rollback();
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -725,7 +739,7 @@ php;
|
||||
],
|
||||
|
||||
// 钩子配置
|
||||
'hook' => [],
|
||||
'hook' => (object) [],
|
||||
];
|
||||
|
||||
// 创建配置文件
|
||||
@ -842,6 +856,21 @@ php;
|
||||
return $ret;
|
||||
}
|
||||
|
||||
// 资源目录
|
||||
$dir_list = [
|
||||
'_controller_' => APP_PATH.'plugins'.DS,
|
||||
'_view_' => APP_PATH.'plugins'.DS.'view'.DS,
|
||||
'_css_' => ROOT.'public'.DS.'static'.DS.'plugins'.DS.'css'.DS,
|
||||
'_js_' => ROOT.'public'.DS.'static'.DS.'plugins'.DS.'js'.DS,
|
||||
'_images_' => ROOT.'public'.DS.'static'.DS.'plugins'.DS.'images'.DS,
|
||||
'_uploadfile_' => ROOT.'public'.DS.'static'.DS.'upload'.DS.'file'.DS,
|
||||
'_uploadimages_' => ROOT.'public'.DS.'static'.DS.'upload'.DS.'images'.DS,
|
||||
'_uploadvideo_' => ROOT.'public'.DS.'static'.DS.'upload'.DS.'video'.DS,
|
||||
];
|
||||
|
||||
// 包名
|
||||
$plugins_name = '';
|
||||
|
||||
// 开始解压文件
|
||||
$resource = zip_open($_FILES['file']['tmp_name']);
|
||||
while(($temp_resource = zip_read($resource)) !== false)
|
||||
@ -851,29 +880,40 @@ php;
|
||||
// 当前压缩包中项目名称
|
||||
$file = zip_entry_name($temp_resource);
|
||||
|
||||
// 获取包名
|
||||
if(empty($plugins_name))
|
||||
{
|
||||
// 应用不存在则添加
|
||||
$plugins_name = substr($file, 0, strpos($file, '/'));
|
||||
$ret = self::PluginsExistInsert([], $plugins_name);
|
||||
if($ret['code'] != 0)
|
||||
{
|
||||
zip_entry_close($temp_resource);
|
||||
return $ret;
|
||||
}
|
||||
}
|
||||
|
||||
// 去除包名
|
||||
$file = substr($file, strpos($file, '/')+1);
|
||||
|
||||
// 排除临时文件和临时目录
|
||||
if(strpos($file, '/.') === false && strpos($file, '__') === false)
|
||||
{
|
||||
// 拼接路径
|
||||
if(strpos($file, '_controller') !== false)
|
||||
// 文件包对应系统所在目录
|
||||
foreach($dir_list as $dir_key=>$dir_value)
|
||||
{
|
||||
$file = ROOT.self::$html_path.$file;
|
||||
} else if(strpos($file, '_static') !== false)
|
||||
{
|
||||
$file = ROOT.self::$static_path.$file;
|
||||
} else {
|
||||
continue;
|
||||
if(strpos($file, $dir_key) !== false)
|
||||
{
|
||||
$file = str_replace($dir_key.'/', '', $dir_value.$file);
|
||||
break;
|
||||
}
|
||||
}
|
||||
$file = str_replace(array('_static/', '_html/'), '', $file);
|
||||
|
||||
// 截取文件路径
|
||||
$file_path = substr($file, 0, strrpos($file, '/'));
|
||||
|
||||
// 路径不存在则创建
|
||||
if(!is_dir($file_path))
|
||||
{
|
||||
mkdir($file_path, 0777, true);
|
||||
}
|
||||
\base\FileUtil::CreateDir($file_path);
|
||||
|
||||
// 如果不是目录则写入文件
|
||||
if(!is_dir($file))
|
||||
@ -881,14 +921,15 @@ php;
|
||||
// 读取这个文件
|
||||
$file_size = zip_entry_filesize($temp_resource);
|
||||
$file_content = zip_entry_read($temp_resource, $file_size);
|
||||
file_put_contents($file, $file_content);
|
||||
@file_put_contents($file, $file_content);
|
||||
}
|
||||
|
||||
// 关闭目录项
|
||||
zip_entry_close($temp_resource);
|
||||
}
|
||||
}
|
||||
}
|
||||
return DataReturn('操作成功');
|
||||
return DataReturn('安装成功');
|
||||
}
|
||||
}
|
||||
?>
|
@ -116,6 +116,12 @@ class ThemeService
|
||||
return DataReturn('资源目录没权限', -10);
|
||||
}
|
||||
|
||||
// 资源目录
|
||||
$dir_list = [
|
||||
'_html_' => ROOT.self::$html_path,
|
||||
'_static_' => ROOT.self::$static_path,
|
||||
];
|
||||
|
||||
// 开始解压文件
|
||||
$resource = zip_open($_FILES['theme']['tmp_name']);
|
||||
while(($temp_resource = zip_read($resource)) !== false)
|
||||
@ -128,17 +134,15 @@ class ThemeService
|
||||
// 排除临时文件和临时目录
|
||||
if(strpos($file, '/.') === false && strpos($file, '__') === false)
|
||||
{
|
||||
// 拼接路径
|
||||
if(strpos($file, '_html') !== false)
|
||||
// 文件包对应系统所在目录
|
||||
foreach($dir_list as $dir_key=>$dir_value)
|
||||
{
|
||||
$file = ROOT.self::$html_path.$file;
|
||||
} else if(strpos($file, '_static') !== false)
|
||||
{
|
||||
$file = ROOT.self::$static_path.$file;
|
||||
} else {
|
||||
continue;
|
||||
if(strpos($file, $dir_key) !== false)
|
||||
{
|
||||
$file = str_replace($dir_key.'/', '', $dir_value.$file);
|
||||
break;
|
||||
}
|
||||
}
|
||||
$file = str_replace(array('_static/', '_html/'), '', $file);
|
||||
|
||||
// 截取文件路径
|
||||
$file_path = substr($file, 0, strrpos($file, '/'));
|
||||
@ -157,12 +161,13 @@ class ThemeService
|
||||
$file_content = zip_entry_read($temp_resource, $file_size);
|
||||
file_put_contents($file, $file_content);
|
||||
}
|
||||
|
||||
// 关闭目录项
|
||||
zip_entry_close($temp_resource);
|
||||
}
|
||||
}
|
||||
}
|
||||
return DataReturn('操作成功');
|
||||
return DataReturn('安装成功');
|
||||
}
|
||||
|
||||
/**
|
||||
|
File diff suppressed because one or more lines are too long
@ -1,7 +0,0 @@
|
||||
h1 {
|
||||
font-size: 60px;
|
||||
}
|
||||
.msg {
|
||||
font-size: 38px;
|
||||
color: #F00;
|
||||
}
|
@ -1,7 +0,0 @@
|
||||
h1 {
|
||||
font-size: 60px;
|
||||
}
|
||||
.msg {
|
||||
font-size: 68px;
|
||||
color: #4CAF50;
|
||||
}
|
Binary file not shown.
Before Width: | Height: | Size: 6.9 KiB |
Loading…
Reference in New Issue
Block a user