228 lines
7.0 KiB
PHP
228 lines
7.0 KiB
PHP
<?php
|
|
declare (strict_types = 1);
|
|
|
|
namespace app\manager\controller;
|
|
|
|
use app\admin\model\Version as VersionModel;
|
|
use think\admin\Controller;
|
|
use think\admin\extend\DataExtend;
|
|
use think\admin\service\AdminService;
|
|
use think\admin\service\SystemService;
|
|
use think\admin\Storage;
|
|
|
|
/**
|
|
* 版本管理
|
|
* @auth true
|
|
* @menu true
|
|
*/
|
|
class Version extends Controller
|
|
{
|
|
/**
|
|
* 允许上传的文件类型
|
|
* @var array
|
|
*/
|
|
protected $allowExts = ['zip', 'exe', 'dmg', 'pkg', 'deb', 'rpm'];
|
|
|
|
/**
|
|
* 版本列表
|
|
* @auth true
|
|
* @menu true
|
|
*/
|
|
public function index()
|
|
{
|
|
$this->title = '版本管理';
|
|
// 创建查询对象
|
|
$query = VersionModel::mQuery();
|
|
// 数据列表处理
|
|
$query->like('version_no,version_name')->equal('platform,status');
|
|
// 列表排序处理
|
|
$query->order('version_no desc')->page();
|
|
}
|
|
|
|
/**
|
|
* 添加版本
|
|
* @auth true
|
|
*/
|
|
public function add()
|
|
{
|
|
$this->title = '添加版本';
|
|
VersionModel::mForm('form');
|
|
}
|
|
|
|
/**
|
|
* 编辑版本
|
|
* @auth true
|
|
*/
|
|
public function edit()
|
|
{
|
|
$this->title = '编辑版本';
|
|
VersionModel::mForm('form');
|
|
}
|
|
|
|
/**
|
|
* 表单数据处理
|
|
*/
|
|
protected function _form_filter(&$data)
|
|
{
|
|
if ($this->request->isGet()) {
|
|
// 获取版本日志
|
|
if (isset($data['id'])) {
|
|
$data['logs'] = \think\facade\Db::name('version_log')
|
|
->where(['version_id' => $data['id']])
|
|
->order('id asc')
|
|
->select()
|
|
->toArray();
|
|
}
|
|
} else {
|
|
// 检查版本号是否已存在
|
|
if (empty($data['id'])) {
|
|
$exists = VersionModel::mk()->where('version_no', $data['version_no'])->find();
|
|
if ($exists) {
|
|
$this->error('该版本号已存在!');
|
|
}
|
|
}
|
|
|
|
// 保存版本日志
|
|
if (isset($data['logs'])) {
|
|
$logs = [];
|
|
foreach ($data['logs']['type'] as $key => $type) {
|
|
if (!empty($data['logs']['content'][$key])) {
|
|
$logs[] = [
|
|
'version_id' => $data['id'] ?? 0,
|
|
'type' => $type,
|
|
'content' => $data['logs']['content'][$key],
|
|
'create_time' => date('Y-m-d H:i:s')
|
|
];
|
|
}
|
|
}
|
|
unset($data['logs']);
|
|
if (!empty($logs)) {
|
|
if (isset($data['id'])) {
|
|
\think\facade\Db::name('version_log')->where(['version_id' => $data['id']])->delete();
|
|
}
|
|
\think\facade\Db::name('version_log')->insertAll($logs);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 删除版本
|
|
* @auth true
|
|
*/
|
|
public function remove()
|
|
{
|
|
VersionModel::mDelete();
|
|
}
|
|
|
|
/**
|
|
* 版本状态
|
|
* @auth true
|
|
*/
|
|
public function state()
|
|
{
|
|
VersionModel::mSave($this->_vali([
|
|
'status.in:0,1' => '状态值范围异常!',
|
|
'status.require' => '状态值不能为空!',
|
|
]));
|
|
}
|
|
|
|
/**
|
|
* 上传更新包
|
|
* @auth true
|
|
*/
|
|
public function upload()
|
|
{
|
|
if ($this->request->isPost()) {
|
|
try {
|
|
// 获取上传的文件
|
|
$file = $this->request->file('file');
|
|
if (empty($file)) {
|
|
$this->error('文件上传异常,文件可能过大!');
|
|
}
|
|
|
|
// 检查文件类型
|
|
$ext = strtolower($file->getOriginalExtension());
|
|
if (!in_array($ext, $this->allowExts)) {
|
|
$this->error('不支持的文件类型!');
|
|
}
|
|
|
|
// 获取原始文件名
|
|
$originalName = $file->getOriginalName();
|
|
|
|
// 从文件名解析版本号
|
|
$version_no = VersionModel::parseVersionFromFilename($originalName);
|
|
|
|
// 生成版本名称
|
|
$version_name = VersionModel::generateVersionName($version_no, $originalName);
|
|
|
|
// 执行文件上传
|
|
$type = sysconf('storage.type|raw') ?: 'local';
|
|
if ($type === 'local') {
|
|
$local = \think\admin\storage\LocalStorage::instance();
|
|
$distName = dirname($local->path($originalName, false)) . '/' . $originalName;
|
|
$file->move(dirname($distName), basename($distName));
|
|
$info = [
|
|
'url' => '/upload/' . $originalName,
|
|
'key' => $originalName
|
|
];
|
|
|
|
// 设置上传文件的权限为755
|
|
@chmod($distName, 0755);
|
|
} else {
|
|
$bina = file_get_contents($file->getPathname());
|
|
$info = \think\admin\Storage::instance($type)->set($originalName, $bina, false, $originalName);
|
|
}
|
|
|
|
|
|
if (isset($info['url'])) {
|
|
$data = [
|
|
'code' => 0,
|
|
'msg' => '文件上传成功!',
|
|
'data' => [
|
|
'url' => $info['url'],
|
|
'name' => $originalName,
|
|
'version_no' => $version_no,
|
|
'version_name' => $version_name
|
|
]
|
|
];
|
|
return json($data);
|
|
} else {
|
|
$this->error('文件上传失败!');
|
|
}
|
|
} catch (\Exception $exception) {
|
|
$this->error($exception->getMessage());
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 从文件名解析版本信息
|
|
* @param string $filename
|
|
* @return array
|
|
*/
|
|
protected function parseVersionFromFilename($filename)
|
|
{
|
|
// 移除扩展名
|
|
$name = pathinfo($filename, PATHINFO_FILENAME);
|
|
|
|
// 匹配版本号 (支持 v3.4.0 或 3.4.0 格式)
|
|
if (preg_match('/[v]?(\d+\.\d+\.\d+)/', $name, $matches)) {
|
|
$version_no = $matches[1];
|
|
// 提取版本名称 (去掉版本号部分)
|
|
$version_name = trim(str_replace($matches[0], '', $name));
|
|
if (empty($version_name)) {
|
|
$version_name = "版本 {$version_no}";
|
|
}
|
|
} else {
|
|
// 如果没有找到版本号,使用时间戳作为版本号
|
|
$version_no = date('y.m.d');
|
|
$version_name = $name ?: "版本 {$version_no}";
|
|
}
|
|
|
|
return [
|
|
'version_no' => $version_no,
|
|
'version_name' => $version_name
|
|
];
|
|
}
|
|
}
|