<?php
require_once __DIR__ . '/../base_api.php';

class DomainAPI extends BaseAPI {
    
    /**
     * 获取用户解析地址
     * 根据用户所在服务器返回对应的解析域名；如果没有设置则返回服务器IP
     */
    private function getParseAddress() {
        global $DB;
        // 获取用户所在的服务器ID
        $bt_id = isset($this->user['btid']) ? intval($this->user['btid']) : 0;
        
        if ($bt_id > 0) {
            // 查询该服务器的解析域名设置
            $domain_row = $DB->get_row("SELECT parse_domain FROM `server_parse_domain` WHERE `bt_id`={$bt_id}");
            if ($domain_row && !empty($domain_row['parse_domain'])) {
                return $domain_row['parse_domain'];
            }
        }
        
        // 如果没有设置，返回服务器IP
        return $this->bt_info['ip'];
    }
    
    private function isSystemGiftDomain($domain) {
        $domain = strtolower(trim((string)$domain));
        if ($domain === '') return false;
        $gift = strtolower(trim((string)$this->site_name));
        
        // 调试日志
        $this->debug_log('isSystemGiftDomain检查: domain=' . $domain . ', site_name=' . $gift);
        
        if ($gift !== '' && $domain === $gift) {
            $this->debug_log('匹配成功: domain === gift');
            return true;
        }
        if ($gift !== '' && $domain === 'www.' . $gift) {
            $this->debug_log('匹配成功: domain === www.gift');
            return true;
        }
        
        // 额外检查：如果域名包含用户名和主域名，也认为是系统赠送的
        // 从数据库配置获取主域名，避免硬编码
        global $conf;
        $main_domain = isset($conf['main_domain']) && !empty($conf['main_domain']) ? $conf['main_domain'] : 'a116.vip';
        $username = isset($this->user['user']) ? strtolower(trim($this->user['user'])) : '';
        if ($username !== '' && $domain === $username . '.' . $main_domain) {
            $this->debug_log('匹配成功: domain === username.' . $main_domain);
            return true;
        }
        if ($username !== '' && $domain === 'www.' . $username . '.' . $main_domain) {
            $this->debug_log('匹配成功: domain === www.username.' . $main_domain);
            return true;
        }
        
        return false;
    }

    public function addDomain($ym) {
        $webid = $this->getWebId();
        
        // 获取新添加的域名数量
        $new_domains = explode("\n", $ym);
        $new_count = count($new_domains);
        
        // 获取解析地址（禁止绑定的地址）
        $parse_address = $this->getParseAddress();
        
        // 验证每个域名是否为IP地址或解析地址
        foreach ($new_domains as $domain) {
            $domain = trim($domain);
            if (empty($domain)) continue;
            
            // 检查是否为IP地址
            if (filter_var($domain, FILTER_VALIDATE_IP)) {
                $this->error('禁止绑定IP地址，请输入域名');
            }
            
            // 检查是否为IP:端口格式
            if (preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d+$/', $domain)) {
                $this->error('禁止绑定IP地址，请输入域名');
            }
            
            // 检查是否为解析地址（禁止绑定）
            if (strcasecmp($domain, $parse_address) === 0) {
                $this->error('禁止绑定解析地址 ' . $parse_address . '，请输入其他域名');
            }
            
            // 验证域名格式（支持泛解析 *.example.com）
            $domain_pattern = '/^(\*\.)?([a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$/i';
            if (!preg_match($domain_pattern, $domain)) {
                $this->error('域名格式不正确：' . $domain . '，请输入正确的域名（如 example.com, blog.example.com, *.example.com）');
            }
        }
        
        // 获取当前已绑定的域名数量（排除系统赠送的域名）
        $current_domains = $this->bt_api->Getymlist($this->site_name);
        $current_count = 0;
        if ($current_domains && isset($current_domains['status']) && $current_domains['status'] === true) {
            if (isset($current_domains['data']) && is_array($current_domains['data'])) {
                foreach ($current_domains['data'] as $domain) {
                    $domain_name = isset($domain['name']) ? $domain['name'] : (isset($domain['domain']) ? $domain['domain'] : '');
                    // 排除系统赠送的域名
                    if (!$this->isSystemGiftDomain($domain_name)) {
                        $current_count++;
                    }
                }
            }
        }
        
        // 检查总域名数量是否超过限制（yms为0表示不限制）
        if ($this->user['yms'] > 0 && ($current_count + $new_count) > $this->user['yms']) {
            $this->error('域名数量超过限制，已绑定 ' . $current_count . ' 个，最多 ' . $this->user['yms'] . ' 个');
        }
        
        // 使用宝塔API添加域名
        $result = $this->bt_api->AddDomain($webid, $this->site_name, $ym);
        
        // 调试：记录结果
        $this->debug_log('addDomain结果: ' . print_r($result, true));
        
        // 检查返回结果
        $success = false;
        if ($result) {
            // 检查 domains 数组中的状态
            if (isset($result['domains']) && is_array($result['domains'])) {
                foreach ($result['domains'] as $domain_info) {
                    if (isset($domain_info['status']) && ($domain_info['status'] == 1 || $domain_info['status'] === true || $domain_info['status'] === 'true')) {
                        $success = true;
                        break;
                    }
                }
            }
            // 也检查直接的 status 字段
            if (isset($result['status']) && ($result['status'] === true || $result['status'] === 'true' || $result['status'] === 1)) {
                $success = true;
            }
        }
        
        if ($success) {
            $this->log('域名修改', '添加域名: ' . $ym);
            $this->success(array('msg' => '添加成功'));
        }
        
        // 获取错误信息
        $error_msg = '添加失败';
        if (isset($result['domains']) && is_array($result['domains']) && !empty($result['domains'])) {
            $first_domain = $result['domains'][0];
            if (isset($first_domain['msg'])) {
                $error_msg = $first_domain['msg'];
            }
        } elseif (isset($result['msg'])) {
            $error_msg = $result['msg'];
        }
        
        $this->error($error_msg);
    }
    
    public function getDomainList() {
        $webid = $this->getWebId();

        // 1) 获取子目录绑定（用于目录下拉 & 子目录域名列表）
        $dirs = array('/');
        $binding_domains = array();
        $binding_names = array(); // 用于去重
        $bind_res = $this->bt_api->GetDirBinding($webid);
        $this->debug_log('GetDirBinding结果: ' . print_r($bind_res, true));
        if ($bind_res && isset($bind_res['status']) && ($bind_res['status'] === true || $bind_res['status'] === 'true' || $bind_res['status'] === 1)) {
            if (isset($bind_res['dirs']) && is_array($bind_res['dirs'])) {
                $dirs = array();
                foreach ($bind_res['dirs'] as $d) {
                    $d = is_string($d) ? trim($d) : '';
                    if ($d === '') continue;
                    if ($d === '/') {
                        $dirs[] = '/';
                    } else {
                        $dirs[] = trim($d, '/');
                    }
                }
                if (!in_array('/', $dirs, true)) array_unshift($dirs, '/');
                $dirs = array_values(array_unique($dirs));
            }
            if (isset($bind_res['binding']) && is_array($bind_res['binding'])) {
                foreach ($bind_res['binding'] as $b) {
                    $name = isset($b['domain']) ? trim($b['domain']) : '';
                    if ($name === '') continue;
                    if ($this->isSystemGiftDomain($name)) continue;
                    $port = isset($b['port']) ? intval($b['port']) : 80;
                    $path = isset($b['path']) ? (string)$b['path'] : '/';
                    if (strpos($path, '../') === 0) $path = substr($path, 3);
                    $path = trim($path);
                    if ($path === '' || $path === '/') {
                        $path = '/';
                    } else {
                        $path = '/' . trim($path, '/');
                    }
                    $bind_id = isset($b['id']) ? $b['id'] : '';
                    $binding_domains[] = array(
                        'name' => $name,
                        'domain' => $name,
                        'port' => $port,
                        'path' => $path,
                        'bind_id' => $bind_id,
                        'is_binding' => true
                    );
                    $binding_names[$name . ':' . $port] = true;
                }
            }
        }

        // 2) 获取根域名列表（主域/普通绑定）
        $root_domains = array();
        $result = $this->bt_api->Getymlist($this->site_name);
        $this->debug_log('getDomainList(Getymlist)结果: ' . print_r($result, true));
        if ($result && isset($result['status']) && ($result['status'] === true || $result['status'] === 'true' || $result['status'] === 1)) {
            if (isset($result['data']) && is_array($result['data'])) {
                foreach ($result['data'] as $domain) {
                    $domain_name = '';
                    if (is_array($domain) && isset($domain['name'])) $domain_name = trim($domain['name']);
                    elseif (is_string($domain)) $domain_name = trim($domain);
                    if ($domain_name === '') continue;
                    if ($this->isSystemGiftDomain($domain_name)) continue;
                    $port = (is_array($domain) && isset($domain['port'])) ? intval($domain['port']) : 80;
                    // 如果该域名已在子目录绑定里出现，则不重复展示
                    if (isset($binding_names[$domain_name . ':' . $port])) continue;
                    $root_domains[] = array(
                        'name' => $domain_name,
                        'domain' => $domain_name,
                        'port' => $port,
                        'id' => is_array($domain) && isset($domain['id']) ? $domain['id'] : '',
                        'path' => '/',
                        'bind_id' => '',
                        'is_binding' => false
                    );
                }
            }

            $server_ip = $this->getParseAddress();
            // root 在前，binding 在后，保持宝塔使用习惯
                $this->success(array(
                    'domains' => array_merge($root_domains, $binding_domains),
                    'server_ip' => $server_ip,
                    'dirs' => $dirs
                ));
        }
        
        // 如果宝塔API获取失败，尝试通过读取Nginx配置文件获取域名列表
        $config_path = $this->getConfigPath();
        $config_result = $this->bt_api->GetFileContent($config_path);
        
        // 调试：记录配置文件读取结果
        $this->debug_log('getDomainList配置文件读取结果: ' . print_r($config_result, true));
        
        if ($config_result && isset($config_result['status']) && ($config_result['status'] === true || $config_result['status'] === 'true' || $config_result['status'] === 1)) {
            $config_content = isset($config_result['data']) ? $config_result['data'] : '';
            
            if (!empty($config_content)) {
                // 解析域名
                preg_match_all('/server_name\s+([^;]+);/', $config_content, $matches);
                $domains = array();
                
                if (isset($matches[1]) && !empty($matches[1])) {
                    foreach ($matches[1] as $domain_line) {
                        $domain_list = explode(' ', trim($domain_line));
                        foreach ($domain_list as $domain) {
                            if (!empty($domain)) {
                                if ($this->isSystemGiftDomain($domain)) continue;
                                $domains[] = array(
                                    'name' => $domain,
                                    'port' => 80,
                                    'id' => 0
                                );
                            }
                        }
                    }
                }
                
                // 获取解析地址（优先使用后台设置的解析域名）
                $server_ip = $this->getParseAddress();
                
                $this->success(array('domains' => $domains, 'server_ip' => $server_ip, 'dirs' => $dirs));
            }
        }
        
        $server_ip = $this->getParseAddress();
        $this->success(array('domains' => array(), 'server_ip' => $server_ip, 'dirs' => $dirs));
    }
    
    public function getServerIP() {
        // 获取解析地址（优先使用后台设置的解析域名）
        $server_ip = $this->getParseAddress();
        
        $this->success(array('server_ip' => $server_ip));
    }
    
    public function deleteDomain($domain, $port = 80) {
        $webid = $this->getWebId();
        
        // 使用宝塔API删除域名
        $result = $this->bt_api->DelDomain($webid, $this->site_name, $domain, $port);
        
        // 调试：记录结果
        $this->debug_log('deleteDomain结果: ' . print_r($result, true));
        
        if ($result && isset($result['status']) && ($result['status'] === true || $result['status'] === 'true' || $result['status'] === 1)) {
            $this->log('域名修改', '删除域名: ' . $domain);
            $this->success(array('msg' => '删除成功'));
        }
        
        $error_msg = isset($result['msg']) ? $result['msg'] : '删除失败';
        $this->error($error_msg);
    }

    /**
     * 获取当前站点的子目录绑定列表
     */
    public function getDirBinding() {
        $webid = $this->getWebId();
        $result = $this->bt_api->GetDirBinding($webid);
        $this->debug_log('getDirBinding完整结果: ' . json_encode($result, JSON_UNESCAPED_UNICODE));
        $this->debug_log('getDirBinding结果键名: ' . implode(', ', array_keys($result ? $result : array())));
        
        // 获取网站根目录的所有子目录（使用宝塔API）
        $site_path = $this->getSitePath();
        $dirs = array('/'); // 默认包含根目录
        
        $this->debug_log('获取网站目录: ' . $site_path);
        
        // 使用宝塔API获取目录列表
        $dir_result = $this->bt_api->GetHostDirectory($site_path);
        $this->debug_log('GetHostDirectory结果: ' . print_r($dir_result, true));
        
        // 处理GetDir接口返回的数据格式
        // GetHostDirectory返回格式: { DIR: [...], FILES: [...] }
        if ($dir_result && isset($dir_result['DIR']) && is_array($dir_result['DIR'])) {
            $dir_items = $dir_result['DIR'];
            $this->debug_log('解析到的目录数量: ' . count($dir_items));
            
            foreach ($dir_items as $item) {
                // DIR数组中的元素可能是字符串格式 "name;size;mtime;mode;owner" 或数组格式
                $name = '';
                if (is_string($item)) {
                    $parts = explode(';', $item);
                    $name = isset($parts[0]) ? trim($parts[0]) : '';
                } elseif (is_array($item)) {
                    $name = isset($item['name']) ? $item['name'] : '';
                }
                
                if (empty($name) || $name == '.' || $name == '..') continue;
                
                // 排除隐藏目录和系统目录
                if (substr($name, 0, 1) !== '.' && 
                    $name !== 'cgi-bin' && 
                    $name !== 'logs' && 
                    $name !== 'tmp') {
                    $dirs[] = $name;
                    $this->debug_log('找到子目录: ' . $name);
                }
            }
        } else {
            $this->debug_log('GetHostDirectory失败或返回格式错误');
        }
        
        // 获取已有的绑定列表 - 总是尝试获取，不依赖status
        $binding = array();
        if ($result && isset($result['binding']) && is_array($result['binding'])) {
            $binding = $result['binding'];
            $this->debug_log('从binding字段获取到绑定列表');
        } elseif ($result && isset($result['data']) && is_array($result['data'])) {
            $binding = $result['data'];
            $this->debug_log('从data字段获取到绑定列表');
        } else {
            $this->debug_log('未找到binding字段');
        }
        
        // 为每个绑定项检查伪静态文件是否存在
        $site_name = $this->site_name;
        foreach ($binding as &$item) {
            $domain = isset($item['domain']) ? $item['domain'] : '';
            $path = isset($item['path']) ? $item['path'] : '/';
            $dir_name = str_replace('../', '', $path);
            $dir_name = trim($dir_name, '/');
            
            // 构建伪静态文件路径
            // 使用站点名_目录名，这样同一子目录的所有域名共享伪静态
            if (empty($dir_name) || $dir_name === '/') {
                $rewrite_file = '/www/server/panel/vhost/rewrite/' . $site_name . '.conf';
            } else {
                $rewrite_file = '/www/server/panel/vhost/rewrite/' . $site_name . '_' . $dir_name . '.conf';
            }
            
            // 使用宝塔API检查文件是否存在且有内容
            $file_result = $this->bt_api->GetFileContent($rewrite_file);
            $has_rewrite = false;
            
            $this->debug_log('检查伪静态文件: ' . $rewrite_file . ' (域名: ' . $domain . ')');
            $this->debug_log('GetFileContent返回: ' . json_encode($file_result));
            
            // 严格检查：status必须为true，且data字段存在且不为空
            if ($file_result && 
                isset($file_result['status']) && 
                ($file_result['status'] === true || $file_result['status'] === 'true' || $file_result['status'] === 1) && 
                isset($file_result['data']) && 
                is_string($file_result['data']) && 
                trim($file_result['data']) !== '') {
                $has_rewrite = true;
                $this->debug_log('伪静态文件存在且有内容，长度: ' . strlen($file_result['data']));
            } else {
                $this->debug_log('伪静态文件不存在或为空');
            }
            
            $item['has_rewrite'] = $has_rewrite;
            $this->debug_log('域名 ' . $domain . ' (目录: ' . $dir_name . ') 伪静态状态: ' . ($has_rewrite ? '已设置' : '未设置'));
        }
        unset($item); // 解除引用
        
        $this->debug_log('最终目录列表: ' . print_r($dirs, true));
        $this->debug_log('绑定列表（含伪静态状态）: ' . print_r($binding, true));
        
        // 返回目录列表和绑定列表
        $this->success(array(
            'dirs' => $dirs,
            'binding' => $binding
        ));
    }
    
    /**
     * 获取网站根目录路径
     */
    private function getSitePath() {
        // 获取用户名
        $username = isset($this->user['user']) ? $this->user['user'] : (isset($this->user->user) ? $this->user->user : null);
        if (!$username) {
            return '/www/wwwroot/' . $this->site_name;
        }
        
        // 获取系统配置
        global $DB;
        $conf = $DB->get_row("SELECT * FROM `config` WHERE `id`=1");
        
        $linux_path = isset($conf['hxi']) && !empty($conf['hxi']) ? $conf['hxi'] : '/www/wwwroot';
        $windows_path = isset($conf['hxo']) && !empty($conf['hxo']) ? $conf['hxo'] : 'D:/wwwroot';
        
        // 判断操作系统类型
        $os_type = isset($this->bt_info['czzt']) ? $this->bt_info['czzt'] : 'Linux';
        
        // 根据操作系统选择建站目录
        $site_path = ($os_type == 'Linux' ? $linux_path : $windows_path) . '/' . $username;
        
        $this->debug_log('getSitePath: OS=' . $os_type . ', Path=' . $site_path);
        
        return $site_path;
    }

    /**
     * 添加子目录绑定
     */
    public function addDirBinding($domain, $dir) {
        $webid = $this->getWebId();
        $domain = trim($domain);
        $dir = trim($dir);
        if ($domain === '' || $dir === '') {
            $this->error('域名和子目录不能为空');
        }
        
        // 检查是否为解析地址（禁止绑定）
        $parse_address = $this->getParseAddress();
        if (strcasecmp($domain, $parse_address) === 0) {
            $this->error('禁止绑定解析地址 ' . $parse_address . '，请输入其他域名');
        }
        
        // 验证域名格式（支持泛解析 *.example.com）
        $domain_pattern = '/^(\*\.)?([a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$/i';
        if (!preg_match($domain_pattern, $domain)) {
            $this->error('域名格式不正确，请输入正确的域名（如 example.com, blog.example.com, *.example.com）');
        }
        
        // 目录名只保留相对名称，去掉首尾斜杠
        $dir = trim($dir, '/');
        if ($dir === '') {
            $this->error('子目录名称不能为空');
        }
        $result = $this->bt_api->AddDirBinding($webid, $domain, $dir);
        $this->debug_log('addDirBinding结果: ' . print_r($result, true));
        // 不再依赖status字段，只要result存在就算成功
        if ($result) {
            $this->log('域名修改', '子目录绑定: ' . $domain . ' -> ' . $dir);
            $this->success(array('msg' => '绑定成功'));
        }
        $msg = isset($result['msg']) ? $result['msg'] : '绑定失败';
        $this->error($msg);
    }

    /**
     * 删除子目录绑定
     */
    public function deleteDirBinding($id) {
        $id = intval($id);
        if ($id <= 0) {
            $this->error('绑定ID无效');
        }
        $result = $this->bt_api->DelDirBinding($id);
        $this->debug_log('deleteDirBinding结果: ' . print_r($result, true));
        // 不再依赖status字段，只要result存在就算成功
        if ($result) {
            $this->log('域名修改', '删除子目录绑定: ID=' . $id);
            $this->success(array('msg' => '删除成功'));
        }
        $msg = isset($result['msg']) ? $result['msg'] : '删除失败';
        $this->error($msg);
    }
    
    /**
     * 获取子目录伪静态规则
     */
    public function getSubdirRewrite($domain, $path) {
        $this->debug_log('getSubdirRewrite开始: domain=' . $domain . ', path=' . $path);
        
        // 获取站点名称
        $site_name = $this->site_name;
        $this->debug_log('站点名称: ' . $site_name);
        
        // 处理子目录路径
        $dir_name = str_replace('../', '', $path);
        $dir_name = trim($dir_name, '/');
        $this->debug_log('处理后的目录名: ' . $dir_name);
        
        // 构建伪静态规则文件路径
        // 使用站点名_目录名，这样同一子目录的所有域名共享伪静态
        if (empty($dir_name) || $dir_name === '/') {
            $rewrite_file = '/www/server/panel/vhost/rewrite/' . $site_name . '.conf';
        } else {
            $rewrite_file = '/www/server/panel/vhost/rewrite/' . $site_name . '_' . $dir_name . '.conf';
        }
        
        $this->debug_log('伪静态文件路径: ' . $rewrite_file);
        
        // 使用宝塔API读取文件内容
        $result = $this->bt_api->GetFileContent($rewrite_file);
        $this->debug_log('GetFileContent结果: ' . print_r($result, true));
        
        // 检查结果
        if ($result && isset($result['status']) && ($result['status'] === true || $result['status'] === 'true' || $result['status'] === 1)) {
            $content = isset($result['data']) ? $result['data'] : '';
            $this->debug_log('读取伪静态文件成功，内容长度: ' . strlen($content));
            $this->success(array('code' => 'success', 'content' => $content));
        } else {
            // 文件不存在或读取失败，返回空内容
            $this->debug_log('伪静态文件不存在或读取失败');
            $this->success(array('code' => 'success', 'content' => ''));
        }
    }
    
    /**
     * 设置子目录伪静态规则
     */
    public function setSubdirRewrite($id, $domain, $path, $content) {
        $this->debug_log('setSubdirRewrite开始: domain=' . $domain . ', path=' . $path . ', content_length=' . strlen($content));
        
        // 获取站点ID
        $webid = $this->getWebId();
        $this->debug_log('站点ID: ' . $webid);
        
        // 处理子目录路径
        $dir_name = str_replace('../', '', $path);
        $dir_name = trim($dir_name, '/');
        $this->debug_log('处理后的目录名: ' . $dir_name);
        
        // 构建伪静态文件路径（用于直接文件操作）
        // 注意：宝塔的子目录绑定共享同一个伪静态文件
        if (empty($dir_name) || $dir_name === '/') {
            // 根目录：使用站点名作为文件名
            $rewrite_file = '/www/server/panel/vhost/rewrite/' . $this->site_name . '.conf';
        } else {
            // 子目录：使用站点名_子目录名作为文件名
            $rewrite_file = '/www/server/panel/vhost/rewrite/' . $this->site_name . '_' . $dir_name . '.conf';
        }
        
        $this->debug_log('伪静态文件路径: ' . $rewrite_file);
        
        // 如果内容为空，删除伪静态文件
        if (empty(trim($content))) {
            $this->debug_log('内容为空，准备删除伪静态文件');
            try {
                $result = $this->bt_api->DeleteFile($rewrite_file);
                $this->debug_log('DeleteFile结果: ' . print_r($result, true));
                
                $this->log('子目录伪静态', '清空子目录伪静态: ' . $domain . '/' . $dir_name);
                $this->success(array('status' => true, 'msg' => '已清空伪静态规则'));
            } catch (Exception $e) {
                $this->debug_log('DeleteFile异常: ' . $e->getMessage());
                // 删除失败也返回成功，因为目标是清空内容
                $this->success(array('status' => true, 'msg' => '已清空伪静态规则'));
            }
            return;
        }
        
        $this->debug_log('准备调用SaveFileBody API保存伪静态');
        
        // 使用宝塔API的SaveFileBody方法保存文件
        try {
            $result = $this->bt_api->SaveFileBody($rewrite_file, $content);
            $this->debug_log('SaveFileBody结果: ' . print_r($result, true));
            
            // 检查结果
            if ($result && isset($result['status']) && ($result['status'] === true || $result['status'] === 'true' || $result['status'] === 1)) {
                $this->log('子目录伪静态', '设置子目录伪静态: ' . $domain . '/' . $dir_name);
                $this->success(array('status' => true, 'msg' => '保存成功'));
            } else {
                $error_msg = isset($result['msg']) ? $result['msg'] : '保存伪静态规则失败';
                $this->debug_log('保存失败: ' . $error_msg);
                $this->error($error_msg);
            }
        } catch (Exception $e) {
            $this->debug_log('SaveFileBody异常: ' . $e->getMessage());
            $this->error('保存失败: ' . $e->getMessage());
        }
    }
}
?>
