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 ]; } }