init commit

This commit is contained in:
2026-03-17 09:56:00 +08:00
commit e2c8ae752d
6827 changed files with 1211784 additions and 0 deletions

View File

@@ -0,0 +1,394 @@
<?php
// +----------------------------------------------------------------------
// | 麦沃德科技赋能开发者,助力商协会发展
// +----------------------------------------------------------------------
// | Copyright (c) 20172024 All rights reserved.
// +----------------------------------------------------------------------
// | 沃德商协会系统并不是自由软件,不加密,并不代表开源,未经许可不可自由转售和商用
// +----------------------------------------------------------------------
// | Author: MY WORLD Team <bd@maiwd.cn> www.maiwd.cn
// +----------------------------------------------------------------------
namespace app\admin\controller\wdsxh;
use Exception;
use app\common\controller\Backend;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\TransferException;
use think\addons\AddonException;
use think\addons\Service;
use think\Cache;
/**
* 检查更新
*
* @icon fa fa-circle-o
*/
class Upgrade extends Backend
{
protected $model = null;
public function _initialize()
{
parent::_initialize();
}
public function index(){
$name = 'wdsxh';
$info = get_addon_info($name);
$client = self::getClient();
$domain = $client->get('/api/product/version/code', ['query' => array_merge(['domain' => $_SERVER['HTTP_HOST']])]);
$body_domain = $domain->getBody();
$content_domain = $body_domain->getContents();
$content_domain = trim($content_domain, '"');
$product_info = array(
'product_name'=>'商协会系统',
'version'=>$info['version'],
'developers'=>'青岛麦沃德网络科技有限公司',
'auth'=>'是',
'code' => $content_domain,
);
$this->assign('product_info',$product_info);
$this->assignconfig('old_version',$info['version']);
$this->assignconfig('name',$info['name']);
// $this->view->engine->layout(false);
$domain = $client->get('/api/product/version/update_log', ['query' => array_merge(['name' => $name,'version'=>$info['version']])]);
$body_domain = $domain->getBody();
$content = $body_domain->getContents();
$content = json_decode($content,true);
// p(ROOT_PATH.'addons'.DIRECTORY_SEPARATOR.'wdsxh'.DIRECTORY_SEPARATOR.'uniapp'.DIRECTORY_SEPARATOR.'商协会');
$domain = $this->request->domain();
foreach ($content['data'] as &$v) {
if (is_file(ROOT_PATH.'addons'.DIRECTORY_SEPARATOR.'wdsxh'.DIRECTORY_SEPARATOR.'uniapp'.DIRECTORY_SEPARATOR.'uniapp-wdsxh'.$v['version'].'.zip')) {
$zip_url = ROOT_PATH.'addons'.DIRECTORY_SEPARATOR.'wdsxh'.DIRECTORY_SEPARATOR.'uniapp'.DIRECTORY_SEPARATOR.'uniapp-wdsxh'.$v['version'].'.zip';
} else {
$zip_url = '';
}
$v['zip_url'] = $zip_url;
}
$version_list = $content['data'];
$this->assign('version_list',$version_list);
return $this->fetch('index');
}
public function down_mini_zip()
{
$version = $this->request->get('version');
// 文件路径
$file_path = ROOT_PATH.'addons'.DIRECTORY_SEPARATOR .'wdsxh'.DIRECTORY_SEPARATOR .'uniapp'.DIRECTORY_SEPARATOR.'uniapp-wdsxh'.$version.'.zip';
// 检查文件是否存在
if (!file_exists($file_path)) {
die('文件不存在');
}
// 设置 HTTP 头
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($file_path) . '"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file_path));
// 输出文件
readfile($file_path);
exit;
}
/**
* Desc 检查最新版本
* Create on 2024/7/4 8:54
* Create by zhangwei
*/
public function check()
{
$old_version = $this->request->post('old_version');
$name = $this->request->post('name');
$extend = [
'oldversion' => $old_version,
'domain'=>$this->request->domain()
];
$client = self::getClient();
$response = $client->get('/api/product/version/check', ['query' => array_merge(['name' => $name , 'authorized_version'=>'2','domain' => $_SERVER['HTTP_HOST']], $extend)]);
$body = $response->getBody();
$content = $body->getContents();
$json = (array)json_decode($content, true);
return $json;
}
/**
* Desc 更新最新版本
* Create on 2024/7/4 11:17
* Create by zhangwei
*/
public function update()
{
$old_version = $this->request->post("old_version");
$name = $this->request->post("name");
$addonTmpDir = RUNTIME_PATH . 'addons' . DS;
$domain = $_SERVER['HTTP_HOST'];
if (!$name) {
$this->error(__('Parameter %s can not be empty', 'name'));
}
if (!preg_match("/^[a-zA-Z0-9]+$/", $name)) {
$this->error(__('Addon name incorrect'));
}
if (!is_dir($addonTmpDir)) {
@mkdir($addonTmpDir, 0755, true);
}
$info = [];
try {
$info = get_addon_info($name);
$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,
// 'oldversion' => $info['version'] ?? '',
'oldversion' => $old_version,
'faversion' => $faversion,
'domain'=>$this->request->domain()
];
//调用更新的方法
$info = self::upgrade($name, $extend);
Cache::rm('__menu__');
} catch (AddonException $e) {
$this->result($e->getData(), $e->getCode(), __($e->getMessage()));
} catch (\think\Exception $e) {
$this->error(__($e->getMessage()));
}
$this->success(__('Operate successful'), '', ['addon' => $info]);
}
public function code_edit()
{
$param = $this->request->param();
$client = self::getClient();
$domain = $client->post('/api/product/version/code_edit', ['query' => array_merge(['code' => $param['code'],'domain' => $_SERVER['HTTP_HOST'],'name' => $param['name']])]);
$body_domain = $domain->getBody();
$content_domain = $body_domain->getContents();
$json = (array)json_decode($content_domain, true);
return $json;
}
/**
* 升级插件
*
* @param string $name 插件名称
* @param array $extend 扩展参数
*/
public static function upgrade($name, $extend = [], $tmpFile = false)
{
$info = get_addon_info($name);
$config = get_addon_config($name);
if ($config) {
//备份配置
}
// 远程下载插件(如果为本地文件则使用本地文件)
// $tmpFile = $tmpFile ? $tmpFile : self::download($name, $extend);
$downloadResult = $tmpFile ? $tmpFile : self::download($name, $extend);
$tmpFile = $downloadResult['tmpFile'];
$new_version = $downloadResult['new_version'];
$version_list = $downloadResult['version_list'];
// 备份插件文件
Service::backup($name);
$addonDir = self::getAddonDir($name);
// 删除插件目录下的application和public
$files = self::getCheckDirs();
foreach ($files as $index => $file) {
@rmdirs($addonDir . $file);
}
try {
// 解压插件
Service::unzip($name, $tmpFile);
} catch (Exception $e) {
throw new Exception($e->getMessage());
} finally {
// 移除临时文件
@unlink($tmpFile);
}
if ($config) {
$configFile = ADDON_PATH . $name . DS . 'config.php';
$bakFile = ADDON_PATH . $name . DS . 'config_tmp.php';
@copy($configFile, $bakFile);
$fullConfig = include($bakFile);
@unlink($bakFile);
foreach ($fullConfig as $index => &$item) {
if (isset($config[$item['name']])) {
$item['value'] = $config[$item['name']];
}
}
// 更新配置
set_addon_fullconfig($name, $fullConfig);
}
// 导入
Service::importsql($name);
// 执行升级脚本
try {
$addonName = ucfirst($name);
//创建临时类用于调用升级的方法
$sourceFile = $addonDir . $addonName . ".php";
$destFile = $addonDir . $addonName . "Upgrade.php";
$classContent = str_replace("class {$addonName} extends", "class {$addonName}Upgrade extends", file_get_contents($sourceFile));
//创建临时的类文件
file_put_contents($destFile, $classContent);
$className = "\\addons\\" . $name . "\\" . $addonName . "Upgrade";
$addon = new $className($name);
//调用升级的方法
if (method_exists($addon, "upgrade")) {
$addon->upgrade();
}
//移除临时文件
@unlink($destFile);
} catch (Exception $e) {
throw new Exception($e->getMessage());
}
// 刷新
Service::refresh();
//必须变更版本号
$info['version'] = $extend['version'] ?? $info['version'];
$info['config'] = get_addon_config($name) ? 1 : 0;
$info['bootstrap'] = is_file(Service::getBootstrapFile($name));
Service::enable($name, true);
set_addon_info($name, ['version'=>$new_version]);
if (!empty($version_list)) {
file_put_contents(
ADDON_PATH . $name . DS . 'config' . DS . "upgrade.php",
'<?php' . "\n\nreturn " . var_export_short($version_list) . ";\n"
);
}
return $info;
}
/**
* 远程下载插件
*
* @param string $name 插件名称
* @param array $extend 扩展参数
* @return string
*/
public static function download($name, $extend = [])
{
$addonsTempDir = Service::getAddonsBackupDir();
$tmpFile = $addonsTempDir . $name . ".zip";
$new_version = '';
$version_list = array();
try {
$client = self::getClient();
$response = $client->get('/api/product/version/upgrade', ['query' => array_merge(['name' => $name , 'authorized_version'=>'2'], $extend)]);
$body = $response->getBody();
$content = $body->getContents();
if (substr($content, 0, 1) === '{') {
$json = (array)json_decode($content, true);
//如果传回的是一个下载链接,则再次下载
if ($json['data'] && isset($json['data']['url'])) {
$new_version = $json['data']['new_version'];
$version_list = $json['data']['version_list'];
$response = $client->get($json['data']['url']);
$body = $response->getBody();
$content = $body->getContents();
} else {
//下载返回错误,抛出异常
throw new AddonException($json['msg'], $json['code'], $json['data']);
}
}
} catch (TransferException $e) {
throw new \think\Exception("Addon package download failed");
}
if ($write = fopen($tmpFile, 'w')) {
fwrite($write, $content);
fclose($write);
//return $tmpFile;
return [
'tmpFile'=>$tmpFile,
'new_version'=>$new_version,
'version_list'=>$version_list,
];
}
throw new Exception("No permission to write temporary files");
}
/**
* 获取请求对象
* @return Client
*/
public static function getClient()
{
$options = [
'base_uri' => 'http://www.wdadmin.cn/',
'timeout' => 30,
'connect_timeout' => 30,
'verify' => false,
'http_errors' => false,
'headers' => [
'X-REQUESTED-WITH' => 'XMLHttpRequest',
'Referer' => dirname(request()->root(true)),
'User-Agent' => 'FastAddon',
]
];
static $client;
if (empty($client)) {
$client = new Client($options);
}
return $client;
}
/**
* 获取指定插件的目录
*/
public static function getAddonDir($name)
{
$dir = ADDON_PATH . $name . DS;
return $dir;
}
/**
* 获取检测的全局文件夹目录
* @return array
*/
protected static function getCheckDirs()
{
return [
'application',
'public'
];
}
}