Files

96 lines
3.5 KiB
PHP
Raw Permalink 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
/*
* @Author: YwxApp <ywx@ywxapp.cn>
* @Date: 2026-07-21 16:29:59
* @LastEditors: YwxApp <ywx@ywxapp.cn>
* @LastEditTime: 2026-08-04 11:25:35
* @Description:
* @FilePath: \ywxapp_dev\app\backend\controller\Upgrade.php
* @CustomString: Copyright (c) 2026 YwxApp
*/
declare(strict_types=1);
namespace app\backend\controller;
use think\facade\View;
use ywxapp\service\FrameworkService;
use ywxapp\controller\BackendBase;
/**
* 主框架在线升级(客户端后台)
*
* 检测中心站 upgrade 插件发布的版本,并一键下载覆盖升级。
* 访问:/backend/framework/index
*/
class Upgrade extends BackendBase
{
public function initialize() {}
/**
* 升级页面 / 检测接口
*/
public function index()
{
if ($this->request->isAjax()) {
$svc = FrameworkService::instance();
$info = $svc->checkVersion(true);
return $this->result->success($info, $info['has_update'] ? '有可用更新' : '已是最新版本');
}
View::assign('current', config('ywxapp.version'));
return View::fetch('upgrade/index');
}
/**
* 检测更新(AJAX):/admin/framework/check
*/
public function check()
{
$svc = FrameworkService::instance();
$info = $svc->checkVersion(true);
return $this->result->success($info, $info['has_update'] ? '有可用更新' : '已是最新版本');
}
/**
* 执行升级:下载核心包 → 备份 → 覆盖 → 更新版本号
*/
public function upgrade()
{
try {
set_time_limit(0);
$svc = FrameworkService::instance();
$check = $svc->checkVersion(true);
if (!$check['has_update']) {
return $this->result->error('当前已是最新版本');
}
if (!empty($check['error'])) {
return $this->result->error($check['error']);
}
$version = $check['latest'];
// 手动选择升级包类型:auto(默认,按 use_patch 择优)/ full(完整包)/ patch(增量小包)
$sel = strtolower(trim((string) $this->request->param('type', 'auto')));
if ($sel === 'auto') {
$usePatch = !empty($check['use_patch']);
} elseif ($sel === 'patch') {
if (empty($check['use_patch'])) {
return $this->result->error('当前版本(' . ($check['current'] ?? '') . ')不是增量补丁的基础版本('
. ($check['patch_from'] ?? '') . '),无法使用增量小包,请改用完整包');
}
$usePatch = true;
} elseif ($sel === 'full') {
if (empty($check['has_full'])) {
return $this->result->error('当前无可用的完整包,请改用增量小包');
}
$usePatch = false;
} else {
return $this->result->error('未知的升级包类型:' . $sel . '(可选 auto/full/patch');
}
$zip = $svc->download($version, $usePatch ? 'patch' : 'full');
$res = $svc->apply($zip, $version, $usePatch ? 1 : 0);
$mode = ($res['mode'] ?? 'full') === 'patch' ? '(增量补丁)' : '(整包)';
return $this->result->success($res, '升级成功' . $mode . ',当前版本:' . $version);
} catch (\Exception $e) {
return $this->result->error($e->getMessage());
}
}
}