Files
cursoradminapiformjifengqiang/app/manager/controller/Version.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
];
}
}