227 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			227 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
		
			Executable File
		
	
	
	
	
import { IBuildTaskOption } from "@cocos/creator-types/editor/packages/builder/@types";
 | 
						||
 | 
						||
export const style = `
 | 
						||
.hotupdate-plugin {
 | 
						||
    padding: 10px;
 | 
						||
}
 | 
						||
 | 
						||
.minio-section {
 | 
						||
    margin-top: 15px;
 | 
						||
    padding: 10px;
 | 
						||
    border: 1px solid #ddd;
 | 
						||
    border-radius: 4px;
 | 
						||
    background-color: #f9f9f9;
 | 
						||
}
 | 
						||
 | 
						||
.minio-title {
 | 
						||
    font-weight: bold;
 | 
						||
    margin-bottom: 10px;
 | 
						||
    color: #333;
 | 
						||
}
 | 
						||
 | 
						||
.minio-config-row {
 | 
						||
    display: flex;
 | 
						||
    align-items: center;
 | 
						||
    margin-bottom: 8px;
 | 
						||
}
 | 
						||
 | 
						||
.minio-config-row ui-label {
 | 
						||
    width: 120px;
 | 
						||
    min-width: 120px;
 | 
						||
}
 | 
						||
 | 
						||
.minio-config-row ui-input,
 | 
						||
.minio-config-row ui-checkbox {
 | 
						||
    flex: 1;
 | 
						||
    margin-left: 10px;
 | 
						||
}
 | 
						||
 | 
						||
.minio-test-button {
 | 
						||
    margin-top: 10px;
 | 
						||
}
 | 
						||
`;
 | 
						||
 | 
						||
export const temple = `
 | 
						||
<div class="hotupdate-plugin">
 | 
						||
    <div class="minio-section">
 | 
						||
        <div class="minio-title">MinIO 上传配置</div>
 | 
						||
 | 
						||
        <div class="minio-config-row">
 | 
						||
            <ui-label value="自动上传"></ui-label>
 | 
						||
            <ui-checkbox id="minio-auto-upload"></ui-checkbox>
 | 
						||
        </div>
 | 
						||
 | 
						||
        <div class="minio-config-row">
 | 
						||
            <ui-label value="服务器地址"></ui-label>
 | 
						||
            <ui-input id="minio-endpoint" placeholder="例: minio.example.com:9000"></ui-input>
 | 
						||
        </div>
 | 
						||
 | 
						||
        <div class="minio-config-row">
 | 
						||
            <ui-label value="Access Key"></ui-label>
 | 
						||
            <ui-input id="minio-access-key" placeholder="Access Key ID"></ui-input>
 | 
						||
        </div>
 | 
						||
 | 
						||
        <div class="minio-config-row">
 | 
						||
            <ui-label value="Secret Key"></ui-label>
 | 
						||
            <ui-input id="minio-secret-key" type="password" placeholder="Secret Access Key"></ui-input>
 | 
						||
        </div>
 | 
						||
 | 
						||
        <div class="minio-config-row">
 | 
						||
            <ui-label value="存储桶名称"></ui-label>
 | 
						||
            <ui-input id="minio-bucket" placeholder="hotupdate"></ui-input>
 | 
						||
        </div>
 | 
						||
 | 
						||
        <div class="minio-config-row">
 | 
						||
            <ui-label value="使用SSL"></ui-label>
 | 
						||
            <ui-checkbox id="minio-use-ssl"></ui-checkbox>
 | 
						||
        </div>
 | 
						||
 | 
						||
        <div class="minio-config-row">
 | 
						||
            <ui-label value="路径前缀"></ui-label>
 | 
						||
            <ui-input id="minio-path-prefix" placeholder="hotupdate"></ui-input>
 | 
						||
        </div>
 | 
						||
 | 
						||
        <div class="minio-test-button">
 | 
						||
            <ui-button id="test-minio-connection">测试连接</ui-button>
 | 
						||
        </div>
 | 
						||
    </div>
 | 
						||
</div>
 | 
						||
`;
 | 
						||
 | 
						||
export const $ = {
 | 
						||
    root: '.hotupdate-plugin',
 | 
						||
    minioAutoUpload: '#minio-auto-upload',
 | 
						||
    minioEndpoint: '#minio-endpoint',
 | 
						||
    minioAccessKey: '#minio-access-key',
 | 
						||
    minioSecretKey: '#minio-secret-key',
 | 
						||
    minioBucket: '#minio-bucket',
 | 
						||
    minioUseSSL: '#minio-use-ssl',
 | 
						||
    minioPathPrefix: '#minio-path-prefix',
 | 
						||
    testButton: '#test-minio-connection',
 | 
						||
}
 | 
						||
 | 
						||
export async function update(options: IBuildTaskOption, key: string) {
 | 
						||
    console.log(`update options ${options} and key ${key}`);
 | 
						||
    if (key) {
 | 
						||
        return;
 | 
						||
    }
 | 
						||
 | 
						||
    updateMinIOConfigFromOptions(options);
 | 
						||
}
 | 
						||
 | 
						||
export async function ready(options: IBuildTaskOption) {
 | 
						||
    console.log(`ready options ${options}`);
 | 
						||
    init();
 | 
						||
    updateMinIOConfigFromOptions(options);
 | 
						||
}
 | 
						||
 | 
						||
export async function close() {
 | 
						||
    // 清理资源
 | 
						||
}
 | 
						||
 | 
						||
function init() {
 | 
						||
    // 绑定测试连接按钮事件
 | 
						||
    const testButton = document.querySelector($.testButton) as HTMLElement;
 | 
						||
    if (testButton) {
 | 
						||
        testButton.addEventListener('click', testMinIOConnection);
 | 
						||
    }
 | 
						||
 | 
						||
    // 绑定自动上传复选框事件
 | 
						||
    const autoUploadCheckbox = document.querySelector($.minioAutoUpload) as HTMLInputElement;
 | 
						||
    if (autoUploadCheckbox) {
 | 
						||
        autoUploadCheckbox.addEventListener('change', onAutoUploadChange);
 | 
						||
    }
 | 
						||
}
 | 
						||
 | 
						||
/**
 | 
						||
 * 从构建选项中更新MinIO配置
 | 
						||
 */
 | 
						||
function updateMinIOConfigFromOptions(options: IBuildTaskOption) {
 | 
						||
    const config = options.packages?.['max-framework'];
 | 
						||
    if (!config) return;
 | 
						||
 | 
						||
    // 更新UI元素的值
 | 
						||
    updateInputValue($.minioAutoUpload, config.minioAutoUpload);
 | 
						||
    updateInputValue($.minioEndpoint, config.minioEndpoint);
 | 
						||
    updateInputValue($.minioAccessKey, config.minioAccessKeyId);
 | 
						||
    updateInputValue($.minioSecretKey, config.minioSecretAccessKey);
 | 
						||
    updateInputValue($.minioBucket, config.minioBucketName);
 | 
						||
    updateInputValue($.minioUseSSL, config.minioUseSSL);
 | 
						||
    updateInputValue($.minioPathPrefix, config.minioPathPrefix);
 | 
						||
}
 | 
						||
 | 
						||
/**
 | 
						||
 * 更新输入框的值
 | 
						||
 */
 | 
						||
function updateInputValue(selector: string, value: any) {
 | 
						||
    const element = document.querySelector(selector) as HTMLInputElement;
 | 
						||
    if (element) {
 | 
						||
        if (element.type === 'checkbox') {
 | 
						||
            element.checked = Boolean(value);
 | 
						||
        } else {
 | 
						||
            element.value = String(value || '');
 | 
						||
        }
 | 
						||
    }
 | 
						||
}
 | 
						||
 | 
						||
/**
 | 
						||
 * 自动上传复选框变化事件
 | 
						||
 */
 | 
						||
function onAutoUploadChange(event: Event) {
 | 
						||
    const checkbox = event.target as HTMLInputElement;
 | 
						||
    const isEnabled = checkbox.checked;
 | 
						||
 | 
						||
    // 可以在这里添加额外的逻辑,比如当启用自动上传时显示警告
 | 
						||
    if (isEnabled) {
 | 
						||
        console.log('已启用MinIO自动上传');
 | 
						||
    }
 | 
						||
}
 | 
						||
 | 
						||
/**
 | 
						||
 * 测试MinIO连接
 | 
						||
 */
 | 
						||
async function testMinIOConnection() {
 | 
						||
    try {
 | 
						||
        // 获取当前配置
 | 
						||
        const config = {
 | 
						||
            endpoint: (document.querySelector($.minioEndpoint) as HTMLInputElement)?.value || '',
 | 
						||
            accessKeyId: (document.querySelector($.minioAccessKey) as HTMLInputElement)?.value || '',
 | 
						||
            secretAccessKey: (document.querySelector($.minioSecretKey) as HTMLInputElement)?.value || '',
 | 
						||
            bucketName: (document.querySelector($.minioBucket) as HTMLInputElement)?.value || '',
 | 
						||
            useSSL: (document.querySelector($.minioUseSSL) as HTMLInputElement)?.checked || false,
 | 
						||
            pathPrefix: (document.querySelector($.minioPathPrefix) as HTMLInputElement)?.value || ''
 | 
						||
        };
 | 
						||
 | 
						||
        // 验证必填字段
 | 
						||
        if (!config.endpoint || !config.accessKeyId || !config.secretAccessKey || !config.bucketName) {
 | 
						||
            alert('请填写完整的MinIO配置信息');
 | 
						||
            return;
 | 
						||
        }
 | 
						||
 | 
						||
        // 添加加载状态
 | 
						||
        const testButton = document.querySelector($.testButton) as HTMLElement;
 | 
						||
        const originalText = testButton.textContent;
 | 
						||
        testButton.textContent = '测试中...';
 | 
						||
        testButton.setAttribute('disabled', 'true');
 | 
						||
 | 
						||
        // 这里可以添加实际的连接测试逻辑
 | 
						||
        // 由于在面板环境中,我们只做基本验证
 | 
						||
        await new Promise(resolve => setTimeout(resolve, 1000)); // 模拟网络请求
 | 
						||
 | 
						||
        alert('MinIO配置验证通过!\n注意:实际连接测试将在构建时进行。');
 | 
						||
 | 
						||
        // 恢复按钮状态
 | 
						||
        testButton.textContent = originalText;
 | 
						||
        testButton.removeAttribute('disabled');
 | 
						||
 | 
						||
    } catch (error) {
 | 
						||
        console.error('测试MinIO连接失败:', error);
 | 
						||
        alert(`测试失败: ${error}`);
 | 
						||
 | 
						||
        // 恢复按钮状态
 | 
						||
        const testButton = document.querySelector($.testButton) as HTMLElement;
 | 
						||
        testButton.textContent = '测试连接';
 | 
						||
        testButton.removeAttribute('disabled');
 | 
						||
    }
 | 
						||
}
 |