YYPOST群发软件 发表于 12 小时前

AIWROK数组方法高级应用案例


AIWROK数组方法高级应用案例



/**
* AIWROK数组方法高级应用案例
* 专为安卓Rhino JavaScript引擎优化的数组处理解决方案
* 🍎交流QQ群711841924群一,苹果内测群,528816639
* @功能特点
* - 完全兼容ES5语法和Rhino引擎
* - 提供数据过滤、转换、聚合等高级操作
* - 支持批量处理和异步操作模式
* - 集成AIWROK特有的日志和UI显示功能
* - 包含性能优化和内存管理
*
* @应用场景
* - UI控件批量操作
* - 网络请求数据处理
* - 图像识别结果筛选
* - 日志数据聚合分析
* - 多线程数据处理
*
* @作者 AIWROK开发团队
* @版本 1.0 - Rhino兼容版
* @日期 2024
*/

//===========================================
// 基础兼容性设置
//===========================================

// 确保printl函数可用(兼容Rhino环境)
if (typeof printl === 'undefined') {
    function printl(message) {
      try {
            if (typeof console !== 'undefined' && console.log) {
                console.log(message);
            } else if (typeof print !== 'undefined') {
                print(message);
            } else {
                java.lang.System.out.println(String(message));
            }
      } catch (e) {
            // 静默失败
      }
    }
}

//===========================================
// 高级数组工具类
//===========================================

/**
* ArrayUtils - 高级数组操作工具类
* 提供链式调用、批量处理和性能优化功能
*/
function ArrayUtils() {
    this.version = "1.0.0";
    this.performanceMetrics = {
      operations: 0,
      startTime: 0,
      endTime: 0
    };
}

/**
* 开始性能监控
*/
ArrayUtils.prototype.startPerformanceMonitoring = function() {
    this.performanceMetrics.startTime = new Date().getTime();
    this.performanceMetrics.operations = 0;
    return this;
};

/**
* 结束性能监控并返回报告
*/
ArrayUtils.prototype.endPerformanceMonitoring = function() {
    this.performanceMetrics.endTime = new Date().getTime();
    var duration = this.performanceMetrics.endTime - this.performanceMetrics.startTime;
    return {
      duration: duration,
      operations: this.performanceMetrics.operations,
      opsPerSecond: Math.round(this.performanceMetrics.operations / (duration / 1000))
    };
};

/**
* 安全数组遍历 - 支持中断和异常处理
* @param {Array} array - 要遍历的数组
* @param {Function} callback - 回调函数,返回false可中断遍历
* @param {Object} context - 回调函数上下文
* @returns {ArrayUtils} 支持链式调用
*/
ArrayUtils.prototype.forEachSafe = function(array, callback, context) {
    if (!Array.isArray(array)) throw new Error('参数必须是数组');
    if (typeof callback !== 'function') throw new Error('回调函数必须是函数');
   
    context = context || this;
   
    try {
      for (var i = 0; i < array.length; i++) {
            this.performanceMetrics.operations++;
            var result = callback.call(context, array, i, array);
            if (result === false) break; // 支持主动中断
      }
    } catch (e) {
      printl("数组遍历错误 at index " + i + ": " + (e.message || e));
    }
   
    return this;
};

/**
* 智能数组过滤 - 支持多条件和复杂逻辑
* @param {Array} array - 源数组
* @param {Array} conditions - 过滤条件数组
* @returns {Array} 过滤后的数组
*
* @示例
* var result = arrayUtils.smartFilter(data, [
*   { field: 'age', operator: '>', value: 18 },
*   { field: 'name', operator: 'contains', value: '张' },
*   { field: 'score', operator: 'between', value: }
* ]);
*/
ArrayUtils.prototype.smartFilter = function(array, conditions) {
    if (!Array.isArray(array)) throw new Error('第一个参数必须是数组');
    if (!Array.isArray(conditions)) throw new Error('条件参数必须是数组');
   
    var self = this;
   
    return array.filter(function(item) {
      self.performanceMetrics.operations++;
      
      for (var i = 0; i < conditions.length; i++) {
            var condition = conditions;
            var fieldValue = self.getFieldValue(item, condition.field);
            
            if (!self.evaluateCondition(fieldValue, condition.operator, condition.value)) {
                return false;
            }
      }
      
      return true;
    });
};

/**
* 获取对象字段值 - 支持嵌套属性访问
*/
ArrayUtils.prototype.getFieldValue = function(obj, field) {
    if (!obj || !field) return undefined;
   
    var parts = field.split('.');
    var result = obj;
   
    for (var i = 0; i < parts.length; i++) {
      if (result === null || result === undefined) return undefined;
      result = result];
    }
   
    return result;
};

/**
* 评估条件 - 支持多种操作符
*/
ArrayUtils.prototype.evaluateCondition = function(fieldValue, operator, conditionValue) {
    switch (operator) {
      case '==': return fieldValue == conditionValue;
      case '===': return fieldValue === conditionValue;
      case '!=': return fieldValue != conditionValue;
      case '!==': return fieldValue !== conditionValue;
      case '>': return fieldValue > conditionValue;
      case '>=': return fieldValue >= conditionValue;
      case '<': return fieldValue < conditionValue;
      case '<=': return fieldValue <= conditionValue;
      case 'contains':
            return String(fieldValue).indexOf(conditionValue) !== -1;
      case 'startsWith':
            return String(fieldValue).indexOf(conditionValue) === 0;
      case 'endsWith':
            var str = String(fieldValue);
            return str.lastIndexOf(conditionValue) === str.length - conditionValue.length;
      case 'between':
            return fieldValue >= conditionValue && fieldValue <= conditionValue;
      case 'in':
            return conditionValue.indexOf(fieldValue) !== -1;
      case 'notIn':
            return conditionValue.indexOf(fieldValue) === -1;
      default:
            return false;
    }
};

/**
* 数组数据聚合 - 支持多种聚合函数
* @param {Array} array - 源数组
* @param {Object} config - 聚合配置
* @returns {Object} 聚合结果
*
* @示例
* var stats = arrayUtils.aggregate(salesData, {
*   groupBy: 'category',
*   metrics: {
*         totalSales: { field: 'amount', operation: 'sum' },
*         avgPrice: { field: 'price', operation: 'avg' },
*         count: { operation: 'count' }
*   }
* });
*/
ArrayUtils.prototype.aggregate = function(array, config) {
    if (!Array.isArray(array)) throw new Error('参数必须是数组');
   
    var result = {};
    var self = this;
   
    // 分组处理
    if (config.groupBy) {
      var groups = {};
      
      array.forEach(function(item) {
            self.performanceMetrics.operations++;
            var groupKey = self.getFieldValue(item, config.groupBy);
            if (!groups) {
                groups = [];
            }
            groups.push(item);
      });
      
      // 对每个分组进行聚合
      for (var groupKey in groups) {
            if (groups.hasOwnProperty(groupKey)) {
                result = self.calculateMetrics(groups, config.metrics);
            }
      }
    } else {
      // 不分组,直接聚合
      result = this.calculateMetrics(array, config.metrics);
    }
   
    return result;
};

/**
* 计算指标 - 支持多种聚合操作
*/
ArrayUtils.prototype.calculateMetrics = function(array, metrics) {
    var result = {};
    var self = this;
   
    for (var metricName in metrics) {
      if (metrics.hasOwnProperty(metricName)) {
            var metric = metrics;
            result = self.calculateMetric(array, metric);
      }
    }
   
    return result;
};

/**
* 计算单个指标
*/
ArrayUtils.prototype.calculateMetric = function(array, metric) {
    var operation = metric.operation;
    var field = metric.field;
   
    switch (operation) {
      case 'count':
            return array.length;
            
      case 'sum':
            return array.reduce(function(sum, item) {
                return sum + (field ? this.getFieldValue(item, field) : item);
            }.bind(this), 0);
            
      case 'avg':
            var sum = array.reduce(function(sum, item) {
                return sum + (field ? this.getFieldValue(item, field) : item);
            }.bind(this), 0);
            return array.length > 0 ? sum / array.length : 0;
            
      case 'max':
            return Math.max.apply(Math, array.map(function(item) {
                return field ? this.getFieldValue(item, field) : item;
            }.bind(this)));
            
      case 'min':
            return Math.min.apply(Math, array.map(function(item) {
                return field ? this.getFieldValue(item, field) : item;
            }.bind(this)));
            
      default:
            return 0;
    }
};

/**
* 数组分页处理 - 支持大数据集的分页显示
* @param {Array} array - 源数组
* @param {number} pageSize - 每页大小
* @param {number} pageNumber - 页码(从1开始)
* @returns {Object} 分页结果
*/
ArrayUtils.prototype.paginate = function(array, pageSize, pageNumber) {
    if (!Array.isArray(array)) throw new Error('参数必须是数组');
   
    pageSize = Math.max(1, pageSize || 10);
    pageNumber = Math.max(1, pageNumber || 1);
   
    var totalItems = array.length;
    var totalPages = Math.ceil(totalItems / pageSize);
    var startIndex = (pageNumber - 1) * pageSize;
    var endIndex = Math.min(startIndex + pageSize, totalItems);
   
    return {
      items: array.slice(startIndex, endIndex),
      pagination: {
            pageNumber: pageNumber,
            pageSize: pageSize,
            totalItems: totalItems,
            totalPages: totalPages,
            hasPrevious: pageNumber > 1,
            hasNext: pageNumber < totalPages,
            startIndex: startIndex,
            endIndex: endIndex - 1
      }
    };
};

/**
* 数组去重 - 支持复杂对象的去重
* @param {Array} array - 源数组
* @param {string|Function} keySelector - 用于去重的键选择器
* @returns {Array} 去重后的数组
*/
ArrayUtils.prototype.distinct = function(array, keySelector) {
    if (!Array.isArray(array)) throw new Error('参数必须是数组');
   
    var seen = {};
    var result = [];
    var self = this;
   
    array.forEach(function(item) {
      self.performanceMetrics.operations++;
      
      var key;
      if (typeof keySelector === 'function') {
            key = keySelector(item);
      } else if (typeof keySelector === 'string') {
            key = self.getFieldValue(item, keySelector);
      } else {
            key = item;
      }
      
      var keyString = String(key);
      if (!seen.hasOwnProperty(keyString)) {
            seen = true;
            result.push(item);
      }
    });
   
    return result;
};

//===========================================
// AIWROK特定功能集成
//===========================================

/**
* UI控件批量处理 - 结合AIWROK的UI操作
* @param {Array} uiElements - UI元素数组
* @param {Function} processor - 处理函数
* @param {Object} options - 处理选项
*/
ArrayUtils.prototype.batchUIProcess = function(uiElements, processor, options) {
    options = options || {};
    var batchSize = options.batchSize || 10;
    var delay = options.delay || 100;
    var self = this;
   
    printl("开始批量处理 " + uiElements.length + " 个UI元素");
   
    var batches = [];
    for (var i = 0; i < uiElements.length; i += batchSize) {
      batches.push(uiElements.slice(i, i + batchSize));
    }
   
    // 分批处理
    batches.forEach(function(batch, batchIndex) {
      setTimeout(function() {
            printl("处理第 " + (batchIndex + 1) + " 批,共 " + batch.length + " 个元素");
            
            batch.forEach(function(element, index) {
                try {
                  processor(element, index);
                  self.performanceMetrics.operations++;
                } catch (e) {
                  printl("处理UI元素失败: " + (e.message || e));
                }
            });
            
            if (batchIndex === batches.length - 1) {
                printl("批量处理完成");
            }
      }, batchIndex * delay);
    });
   
    return this;
};

/**
* OCR结果智能筛选 - 结合AIWROK的OCR功能
* @param {Array} ocrResults - OCR识别结果数组
* @param {Object} filterOptions - 筛选选项
* @returns {Array} 筛选后的结果
*/
ArrayUtils.prototype.filterOCRResults = function(ocrResults, filterOptions) {
    filterOptions = filterOptions || {};
   
    var conditions = [];
   
    // 文本长度过滤
    if (filterOptions.minLength) {
      conditions.push({
            field: 'text',
            operator: '>',
            value: filterOptions.minLength
      });
    }
   
    // 置信度过滤
    if (filterOptions.minConfidence) {
      conditions.push({
            field: 'confidence',
            operator: '>=',
            value: filterOptions.minConfidence
      });
    }
   
    // 文本内容过滤
    if (filterOptions.contains) {
      conditions.push({
            field: 'text',
            operator: 'contains',
            value: filterOptions.contains
      });
    }
   
    // 位置过滤
    if (filterOptions.minX !== undefined) {
      conditions.push({
            field: 'x',
            operator: '>=',
            value: filterOptions.minX
      });
    }
   
    return this.smartFilter(ocrResults, conditions);
};

/**
* 日志数据聚合分析 - 结合AIWROK的日志功能
* @param {Array} logEntries - 日志条目数组
* @param {Object} analysisConfig - 分析配置
* @returns {Object} 分析结果
*/
ArrayUtils.prototype.analyzeLogs = function(logEntries, analysisConfig) {
    analysisConfig = analysisConfig || {};
   
    var timeWindow = analysisConfig.timeWindow || 3600000; // 1小时
    var logLevelWeights = analysisConfig.logLevelWeights || {
      'ERROR': 10,
      'WARN': 5,
      'INFO': 1,
      'DEBUG': 0.5
    };
   
    var currentTime = new Date().getTime();
    var recentLogs = logEntries.filter(function(log) {
      return currentTime - log.timestamp <= timeWindow;
    });
   
    var analysis = {
      totalLogs: recentLogs.length,
      levelDistribution: {},
      errorRate: 0,
      warningRate: 0,
      healthScore: 100
    };
   
    // 统计日志级别分布
    recentLogs.forEach(function(log) {
      var level = log.level || 'INFO';
      analysis.levelDistribution = (analysis.levelDistribution || 0) + 1;
    });
   
    // 计算错误率和警告率
    var errorCount = analysis.levelDistribution['ERROR'] || 0;
    var warnCount = analysis.levelDistribution['WARN'] || 0;
   
    analysis.errorRate = analysis.totalLogs > 0 ? (errorCount / analysis.totalLogs) * 100 : 0;
    analysis.warningRate = analysis.totalLogs > 0 ? (warnCount / analysis.totalLogs) * 100 : 0;
   
    // 计算健康分数
    var totalWeight = 0;
    var weightedScore = 0;
   
    for (var level in analysis.levelDistribution) {
      if (analysis.levelDistribution.hasOwnProperty(level)) {
            var count = analysis.levelDistribution;
            var weight = logLevelWeights || 1;
            totalWeight += count * weight;
            weightedScore += count * weight;
      }
    }
   
    if (totalWeight > 0) {
      analysis.healthScore = Math.max(0, 100 - (errorCount * 10) - (warnCount * 3));
    }
   
    return analysis;
};

//===========================================
// 使用示例和测试
//===========================================

function ecommerceDataProcessingExample() {
    printl("=== AIWROK数组方法高级应用案例 ===");
   
    // 创建数组工具实例
    var arrayUtils = new ArrayUtils();
   
    // 模拟电商数据
    var products = [
      { id: 1, name: 'iPhone 13', category: '手机', price: 5999, stock: 50, sales: 120 },
      { id: 2, name: '华为P50', category: '手机', price: 4488, stock: 30, sales: 85 },
      { id: 3, name: 'MacBook Pro', category: '电脑', price: 12999, stock: 20, sales: 45 },
      { id: 4, name: '小米电视', category: '家电', price: 2999, stock: 15, sales: 200 },
      { id: 5, name: 'AirPods Pro', category: '配件', price: 1999, stock: 100, sales: 300 },
      { id: 6, name: '华为手表', category: '配件', price: 2688, stock: 25, sales: 150 },
      { id: 7, name: 'iPad Air', category: '平板', price: 4399, stock: 40, sales: 180 },
      { id: 8, name: '戴尔显示器', category: '电脑', price: 2199, stock: 35, sales: 95 }
    ];
   
    // 开始性能监控
    arrayUtils.startPerformanceMonitoring();
   
    printl("原始数据:共 " + products.length + " 个商品");
   
    // 1. 智能筛选:找出价格大于2000且销量大于100的商品
    var hotProducts = arrayUtils.smartFilter(products, [
      { field: 'price', operator: '>', value: 2000 },
      { field: 'sales', operator: '>', value: 100 }
    ]);
   
    printl("热门商品:" + hotProducts.length + " 个");
    hotProducts.forEach(function(product) {
      printl("- " + product.name + " (价格: ¥" + product.price + ", 销量: " + product.sales + ")");
    });
   
    // 2. 数据聚合:按类别统计
    var categoryStats = arrayUtils.aggregate(products, {
      groupBy: 'category',
      metrics: {
            totalProducts: { operation: 'count' },
            avgPrice: { field: 'price', operation: 'avg' },
            totalSales: { field: 'sales', operation: 'sum' },
            totalValue: { field: 'stock', operation: 'sum' }
      }
    });
   
    printl("\n类别统计:");
    for (var category in categoryStats) {
      if (categoryStats.hasOwnProperty(category)) {
            var stats = categoryStats;
            printl("" + category + ": ");
            printl("    商品数量: " + stats.totalProducts);
            printl("    平均价格: ¥" + Math.round(stats.avgPrice));
            printl("    总销量: " + stats.totalSales);
            printl("    库存总量: " + stats.totalValue);
      }
    }
   
    // 3. 分页显示:每页显示3个商品
    var pageResult = arrayUtils.paginate(products, 3, 2);
   
    printl("\n分页显示(第2页,每页3个):");
    pageResult.items.forEach(function(product) {
      printl("" + product.name + " - " + product.category);
    });
   
    printl("分页信息:");
    printl("当前页: " + pageResult.pagination.pageNumber);
    printl("总页数: " + pageResult.pagination.totalPages);
    printl("总商品数: " + pageResult.pagination.totalItems);
   
    // 4. 复杂数据处理示例:找出各品类中最畅销的商品
    var topProductsByCategory = {};
    var categories = arrayUtils.distinct(products, 'category');
   
    categories.forEach(function(category) {
      var categoryProducts = arrayUtils.smartFilter(products, [
            { field: 'category', operator: '==', value: category }
      ]);
      
      // 按销量排序,取销量最高的
      categoryProducts.sort(function(a, b) {
            return b.sales - a.sales;
      });
      
      // 确保分类下有商品再赋值
      if (categoryProducts.length > 0) {
            topProductsByCategory = categoryProducts;
      }
    });
   
    printl("\n各品类最畅销商品:");
    for (var cat in topProductsByCategory) {
      if (topProductsByCategory.hasOwnProperty(cat)) {
            var product = topProductsByCategory;
            if (product) { // 确保产品存在再输出
                printl("" + cat + ": " + product.name + " (销量: " + product.sales + ")");
            }
      }
    }
   
    // 5. 性能监控结果
    var perfReport = arrayUtils.endPerformanceMonitoring();
    printl("\n性能报告:");
    printl("执行时间: " + perfReport.duration + "ms");
    printl("操作次数: " + perfReport.operations);
    printl("处理速度: " + perfReport.opsPerSecond + " ops/sec");
}

/**
* OCR识别结果处理示例
*/
function ocrResultProcessingExample() {
    printl("\n=== OCR识别结果处理示例 ===");
   
    var arrayUtils = new ArrayUtils();
   
    // 模拟OCR识别结果
    var ocrResults = [
      { text: '登录', confidence: 0.95, x: 100, y: 200, width: 50, height: 30 },
      { text: '用户名', confidence: 0.87, x: 50, y: 300, width: 70, height: 25 },
      { text: '密码', confidence: 0.92, x: 50, y: 350, width: 50, height: 25 },
      { text: '记住我', confidence: 0.78, x: 100, y: 400, width: 80, height: 20 },
      { text: '忘记密码', confidence: 0.85, x: 200, y: 400, width: 90, height: 20 },
      { text: '注册', confidence: 0.90, x: 300, y: 200, width: 50, height: 30 },
      { text: 'AIWROK', confidence: 0.98, x: 150, y: 100, width: 100, height: 40 },
      { text: '帮助', confidence: 0.72, x: 300, y: 500, width: 50, height: 25 }
    ];
   
    // 筛选高置信度文本
    var highConfidenceTexts = arrayUtils.filterOCRResults(ocrResults, {
      minConfidence: 0.85
    });
   
    printl("高置信度文本 (" + highConfidenceTexts.length + " 个):");
    highConfidenceTexts.forEach(function(result) {
      printl("- " + result.text + " (置信度: " + result.confidence + ")");
    });
   
    // 查找特定关键词
    var loginRelatedTexts = arrayUtils.filterOCRResults(ocrResults, {
      contains: '登录'
    });
   
    printl("\n包含'登录'的文本:");
    loginRelatedTexts.forEach(function(result) {
      printl("- " + result.text);
    });
}

/**
* 日志分析示例
*/
function logAnalysisExample() {
    printl("\n=== 日志分析示例 ===");
   
    var arrayUtils = new ArrayUtils();
   
    // 模拟日志数据
    var logEntries = [
      { level: 'INFO', message: '应用启动', timestamp: new Date().getTime() - 3600000 },
      { level: 'DEBUG', message: '加载配置文件', timestamp: new Date().getTime() - 3590000 },
      { level: 'INFO', message: '用户登录成功', timestamp: new Date().getTime() - 3500000 },
      { level: 'WARN', message: '内存使用率过高', timestamp: new Date().getTime() - 3000000 },
      { level: 'ERROR', message: '数据库连接失败', timestamp: new Date().getTime() - 2500000 },
      { level: 'INFO', message: '数据库连接恢复', timestamp: new Date().getTime() - 2400000 },
      { level: 'ERROR', message: 'API请求超时', timestamp: new Date().getTime() - 2000000 },
      { level: 'WARN', message: 'API响应缓慢', timestamp: new Date().getTime() - 1800000 },
      { level: 'INFO', message: '用户执行操作', timestamp: new Date().getTime() - 1500000 },
      { level: 'DEBUG', message: '缓存更新', timestamp: new Date().getTime() - 1000000 }
    ];
   
    // 分析最近一小时的日志
    var analysis = arrayUtils.analyzeLogs(logEntries, {
      timeWindow: 3600000, // 1小时
      logLevelWeights: {
            'ERROR': 10,
            'WARN': 5,
            'INFO': 1,
            'DEBUG': 0.5
      }
    });
   
    printl("日志分析结果:");
    printl("总日志数: " + analysis.totalLogs);
    printl("错误率: " + analysis.errorRate.toFixed(2) + "%");
    printl("警告率: " + analysis.warningRate.toFixed(2) + "%");
    printl("系统健康评分: " + analysis.healthScore);
    printl("日志级别分布:");
   
    for (var level in analysis.levelDistribution) {
      if (analysis.levelDistribution.hasOwnProperty(level)) {
            printl("    " + level + ": " + analysis.levelDistribution);
      }
    }
}

/**
* UI元素批量处理示例
*/
function uiElementBatchProcessingExample() {
    printl("\n=== UI元素批量处理示例 ===");
   
    var arrayUtils = new ArrayUtils();
   
    // 模拟UI元素
    var uiElements = [
      { id: 'btn1', type: 'button', text: '提交', visible: true },
      { id: 'btn2', type: 'button', text: '取消', visible: true },
      { id: 'inp1', type: 'input', text: '', visible: true },
      { id: 'inp2', type: 'input', text: '', visible: false },
      { id: 'chk1', type: 'checkbox', text: '同意条款', visible: true },
      { id: 'lbl1', type: 'label', text: '用户协议', visible: true },
      { id: 'img1', type: 'image', text: '', visible: true }
    ];
   
    // 处理可见的按钮元素
    var visibleButtons = arrayUtils.smartFilter(uiElements, [
      { field: 'visible', operator: '==', value: true },
      { field: 'type', operator: '==', value: 'button' }
    ]);
   
    printl("可见按钮数量: " + visibleButtons.length);
   
    // 模拟批量处理
    arrayUtils.batchUIProcess(visibleButtons, function(element, index) {
      try {
            printl("处理按钮 #" + (index+1) + ": " + element.text + " (ID: " + element.id + ")");
            // 这里可以执行实际的UI操作,如点击、修改属性等
      } catch (e) {
            printl("处理按钮时出错: " + e.message);
      }
    }, { batchSize: 2, delay: 500 });
}

//===========================================
// 主函数和执行入口
//===========================================

/**
* 运行所有示例
*/
function runAllExamples() {
    try {
      ecommerceDataProcessingExample();
      ocrResultProcessingExample();
      logAnalysisExample();
      uiElementBatchProcessingExample();
      printl("\n=== 所有示例执行完成 ===");
    } catch (e) {
      printl("执行示例时发生错误: " + (e.message || e));
    }
}

// 如果直接运行此脚本,则执行所有示例
if (typeof module === 'undefined' || !module.exports) {
    runAllExamples();
}

// 导出ArrayUtils类供其他模块使用
if (typeof module !== 'undefined' && module.exports) {
    module.exports = ArrayUtils;
}

页: [1]
查看完整版本: AIWROK数组方法高级应用案例