信息发布软件,b2b软件,广告发布软件

 找回密码
 立即注册
搜索
查看: 1|回复: 0
打印 上一主题 下一主题

[宣传软件网站动态] 🏯AIWROK数组方法高级应用案例

[复制链接]

723

主题

807

帖子

5186

积分

积分
5186

资讯缩略图:

资讯发布日期:2025-11-20

资讯发布简介:🏯AIWROK数组方法高级应用案例

资讯关键词:🏯AIWROK数组方法高级应用案例

资讯所属分类:IT资讯 SEO资讯 

联系:

① 本信息收集于网络,如有不对的地方欢迎联系我纠正!
② 本信息免费收录,不存在价格的问题!
③ 如果您的网站也想这样出现在这里,请您加好友情链接,我当天会审核通过!

④友情链接关键字:软件网站分类目录 网址:http://www.postbbs.com/

资讯详细描述
🏯AIWROK数组方法高级应用案例
  1. /**
  2. * AIWROK数组方法高级应用案例
  3. * 专为安卓Rhino JavaScript引擎优化的数组处理解决方案
  4. * 🍎交流QQ群711841924群一,苹果内测群,528816639
  5. * @功能特点
  6. * - 完全兼容ES5语法和Rhino引擎
  7. * - 提供数据过滤、转换、聚合等高级操作
  8. * - 支持批量处理和异步操作模式
  9. * - 集成AIWROK特有的日志和UI显示功能
  10. * - 包含性能优化和内存管理
  11. *
  12. * @应用场景
  13. * - UI控件批量操作
  14. * - 网络请求数据处理
  15. * - 图像识别结果筛选
  16. * - 日志数据聚合分析
  17. * - 多线程数据处理
  18. *
  19. * @作者 AIWROK开发团队
  20. * @版本 1.0 - Rhino兼容版
  21. * @日期 2024
  22. */

  23. //===========================================
  24. // 基础兼容性设置
  25. //===========================================

  26. // 确保printl函数可用(兼容Rhino环境)
  27. if (typeof printl === 'undefined') {
  28.     function printl(message) {
  29.         try {
  30.             if (typeof console !== 'undefined' && console.log) {
  31.                 console.log(message);
  32.             } else if (typeof print !== 'undefined') {
  33.                 print(message);
  34.             } else {
  35.                 java.lang.System.out.println(String(message));
  36.             }
  37.         } catch (e) {
  38.             // 静默失败
  39.         }
  40.     }
  41. }

  42. //===========================================
  43. // 高级数组工具类
  44. //===========================================

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

  57. /**
  58. * 开始性能监控
  59. */
  60. ArrayUtils.prototype.startPerformanceMonitoring = function() {
  61.     this.performanceMetrics.startTime = new Date().getTime();
  62.     this.performanceMetrics.operations = 0;
  63.     return this;
  64. };

  65. /**
  66. * 结束性能监控并返回报告
  67. */
  68. ArrayUtils.prototype.endPerformanceMonitoring = function() {
  69.     this.performanceMetrics.endTime = new Date().getTime();
  70.     var duration = this.performanceMetrics.endTime - this.performanceMetrics.startTime;
  71.     return {
  72.         duration: duration,
  73.         operations: this.performanceMetrics.operations,
  74.         opsPerSecond: Math.round(this.performanceMetrics.operations / (duration / 1000))
  75.     };
  76. };

  77. /**
  78. * 安全数组遍历 - 支持中断和异常处理
  79. * @param {Array} array - 要遍历的数组
  80. * @param {Function} callback - 回调函数,返回false可中断遍历
  81. * @param {Object} context - 回调函数上下文
  82. * @returns {ArrayUtils} 支持链式调用
  83. */
  84. ArrayUtils.prototype.forEachSafe = function(array, callback, context) {
  85.     if (!Array.isArray(array)) throw new Error('参数必须是数组');
  86.     if (typeof callback !== 'function') throw new Error('回调函数必须是函数');
  87.    
  88.     context = context || this;
  89.    
  90.     try {
  91.         for (var i = 0; i < array.length; i++) {
  92.             this.performanceMetrics.operations++;
  93.             var result = callback.call(context, array[i], i, array);
  94.             if (result === false) break; // 支持主动中断
  95.         }
  96.     } catch (e) {
  97.         printl("数组遍历错误 at index " + i + ": " + (e.message || e));
  98.     }
  99.    
  100.     return this;
  101. };

  102. /**
  103. * 智能数组过滤 - 支持多条件和复杂逻辑
  104. * @param {Array} array - 源数组
  105. * @param {Array} conditions - 过滤条件数组
  106. * @returns {Array} 过滤后的数组
  107. *
  108. * @示例
  109. * var result = arrayUtils.smartFilter(data, [
  110. *     { field: 'age', operator: '>', value: 18 },
  111. *     { field: 'name', operator: 'contains', value: '张' },
  112. *     { field: 'score', operator: 'between', value: [60, 100] }
  113. * ]);
  114. */
  115. ArrayUtils.prototype.smartFilter = function(array, conditions) {
  116.     if (!Array.isArray(array)) throw new Error('第一个参数必须是数组');
  117.     if (!Array.isArray(conditions)) throw new Error('条件参数必须是数组');
  118.    
  119.     var self = this;
  120.    
  121.     return array.filter(function(item) {
  122.         self.performanceMetrics.operations++;
  123.         
  124.         for (var i = 0; i < conditions.length; i++) {
  125.             var condition = conditions[i];
  126.             var fieldValue = self.getFieldValue(item, condition.field);
  127.             
  128.             if (!self.evaluateCondition(fieldValue, condition.operator, condition.value)) {
  129.                 return false;
  130.             }
  131.         }
  132.         
  133.         return true;
  134.     });
  135. };

  136. /**
  137. * 获取对象字段值 - 支持嵌套属性访问
  138. */
  139. ArrayUtils.prototype.getFieldValue = function(obj, field) {
  140.     if (!obj || !field) return undefined;
  141.    
  142.     var parts = field.split('.');
  143.     var result = obj;
  144.    
  145.     for (var i = 0; i < parts.length; i++) {
  146.         if (result === null || result === undefined) return undefined;
  147.         result = result[parts[i]];
  148.     }
  149.    
  150.     return result;
  151. };

  152. /**
  153. * 评估条件 - 支持多种操作符
  154. */
  155. ArrayUtils.prototype.evaluateCondition = function(fieldValue, operator, conditionValue) {
  156.     switch (operator) {
  157.         case '==': return fieldValue == conditionValue;
  158.         case '===': return fieldValue === conditionValue;
  159.         case '!=': return fieldValue != conditionValue;
  160.         case '!==': return fieldValue !== conditionValue;
  161.         case '>': return fieldValue > conditionValue;
  162.         case '>=': return fieldValue >= conditionValue;
  163.         case '<': return fieldValue < conditionValue;
  164.         case '<=': return fieldValue <= conditionValue;
  165.         case 'contains':
  166.             return String(fieldValue).indexOf(conditionValue) !== -1;
  167.         case 'startsWith':
  168.             return String(fieldValue).indexOf(conditionValue) === 0;
  169.         case 'endsWith':
  170.             var str = String(fieldValue);
  171.             return str.lastIndexOf(conditionValue) === str.length - conditionValue.length;
  172.         case 'between':
  173.             return fieldValue >= conditionValue[0] && fieldValue <= conditionValue[1];
  174.         case 'in':
  175.             return conditionValue.indexOf(fieldValue) !== -1;
  176.         case 'notIn':
  177.             return conditionValue.indexOf(fieldValue) === -1;
  178.         default:
  179.             return false;
  180.     }
  181. };

  182. /**
  183. * 数组数据聚合 - 支持多种聚合函数
  184. * @param {Array} array - 源数组
  185. * @param {Object} config - 聚合配置
  186. * @returns {Object} 聚合结果
  187. *
  188. * @示例
  189. * var stats = arrayUtils.aggregate(salesData, {
  190. *     groupBy: 'category',
  191. *     metrics: {
  192. *         totalSales: { field: 'amount', operation: 'sum' },
  193. *         avgPrice: { field: 'price', operation: 'avg' },
  194. *         count: { operation: 'count' }
  195. *     }
  196. * });
  197. */
  198. ArrayUtils.prototype.aggregate = function(array, config) {
  199.     if (!Array.isArray(array)) throw new Error('参数必须是数组');
  200.    
  201.     var result = {};
  202.     var self = this;
  203.    
  204.     // 分组处理
  205.     if (config.groupBy) {
  206.         var groups = {};
  207.         
  208.         array.forEach(function(item) {
  209.             self.performanceMetrics.operations++;
  210.             var groupKey = self.getFieldValue(item, config.groupBy);
  211.             if (!groups[groupKey]) {
  212.                 groups[groupKey] = [];
  213.             }
  214.             groups[groupKey].push(item);
  215.         });
  216.         
  217.         // 对每个分组进行聚合
  218.         for (var groupKey in groups) {
  219.             if (groups.hasOwnProperty(groupKey)) {
  220.                 result[groupKey] = self.calculateMetrics(groups[groupKey], config.metrics);
  221.             }
  222.         }
  223.     } else {
  224.         // 不分组,直接聚合
  225.         result = this.calculateMetrics(array, config.metrics);
  226.     }
  227.    
  228.     return result;
  229. };

  230. /**
  231. * 计算指标 - 支持多种聚合操作
  232. */
  233. ArrayUtils.prototype.calculateMetrics = function(array, metrics) {
  234.     var result = {};
  235.     var self = this;
  236.    
  237.     for (var metricName in metrics) {
  238.         if (metrics.hasOwnProperty(metricName)) {
  239.             var metric = metrics[metricName];
  240.             result[metricName] = self.calculateMetric(array, metric);
  241.         }
  242.     }
  243.    
  244.     return result;
  245. };

  246. /**
  247. * 计算单个指标
  248. */
  249. ArrayUtils.prototype.calculateMetric = function(array, metric) {
  250.     var operation = metric.operation;
  251.     var field = metric.field;
  252.    
  253.     switch (operation) {
  254.         case 'count':
  255.             return array.length;
  256.             
  257.         case 'sum':
  258.             return array.reduce(function(sum, item) {
  259.                 return sum + (field ? this.getFieldValue(item, field) : item);
  260.             }.bind(this), 0);
  261.             
  262.         case 'avg':
  263.             var sum = array.reduce(function(sum, item) {
  264.                 return sum + (field ? this.getFieldValue(item, field) : item);
  265.             }.bind(this), 0);
  266.             return array.length > 0 ? sum / array.length : 0;
  267.             
  268.         case 'max':
  269.             return Math.max.apply(Math, array.map(function(item) {
  270.                 return field ? this.getFieldValue(item, field) : item;
  271.             }.bind(this)));
  272.             
  273.         case 'min':
  274.             return Math.min.apply(Math, array.map(function(item) {
  275.                 return field ? this.getFieldValue(item, field) : item;
  276.             }.bind(this)));
  277.             
  278.         default:
  279.             return 0;
  280.     }
  281. };

  282. /**
  283. * 数组分页处理 - 支持大数据集的分页显示
  284. * @param {Array} array - 源数组
  285. * @param {number} pageSize - 每页大小
  286. * @param {number} pageNumber - 页码(从1开始)
  287. * @returns {Object} 分页结果
  288. */
  289. ArrayUtils.prototype.paginate = function(array, pageSize, pageNumber) {
  290.     if (!Array.isArray(array)) throw new Error('参数必须是数组');
  291.    
  292.     pageSize = Math.max(1, pageSize || 10);
  293.     pageNumber = Math.max(1, pageNumber || 1);
  294.    
  295.     var totalItems = array.length;
  296.     var totalPages = Math.ceil(totalItems / pageSize);
  297.     var startIndex = (pageNumber - 1) * pageSize;
  298.     var endIndex = Math.min(startIndex + pageSize, totalItems);
  299.    
  300.     return {
  301.         items: array.slice(startIndex, endIndex),
  302.         pagination: {
  303.             pageNumber: pageNumber,
  304.             pageSize: pageSize,
  305.             totalItems: totalItems,
  306.             totalPages: totalPages,
  307.             hasPrevious: pageNumber > 1,
  308.             hasNext: pageNumber < totalPages,
  309.             startIndex: startIndex,
  310.             endIndex: endIndex - 1
  311.         }
  312.     };
  313. };

  314. /**
  315. * 数组去重 - 支持复杂对象的去重
  316. * @param {Array} array - 源数组
  317. * @param {string|Function} keySelector - 用于去重的键选择器
  318. * @returns {Array} 去重后的数组
  319. */
  320. ArrayUtils.prototype.distinct = function(array, keySelector) {
  321.     if (!Array.isArray(array)) throw new Error('参数必须是数组');
  322.    
  323.     var seen = {};
  324.     var result = [];
  325.     var self = this;
  326.    
  327.     array.forEach(function(item) {
  328.         self.performanceMetrics.operations++;
  329.         
  330.         var key;
  331.         if (typeof keySelector === 'function') {
  332.             key = keySelector(item);
  333.         } else if (typeof keySelector === 'string') {
  334.             key = self.getFieldValue(item, keySelector);
  335.         } else {
  336.             key = item;
  337.         }
  338.         
  339.         var keyString = String(key);
  340.         if (!seen.hasOwnProperty(keyString)) {
  341.             seen[keyString] = true;
  342.             result.push(item);
  343.         }
  344.     });
  345.    
  346.     return result;
  347. };

  348. //===========================================
  349. // AIWROK特定功能集成
  350. //===========================================

  351. /**
  352. * UI控件批量处理 - 结合AIWROK的UI操作
  353. * @param {Array} uiElements - UI元素数组
  354. * @param {Function} processor - 处理函数
  355. * @param {Object} options - 处理选项
  356. */
  357. ArrayUtils.prototype.batchUIProcess = function(uiElements, processor, options) {
  358.     options = options || {};
  359.     var batchSize = options.batchSize || 10;
  360.     var delay = options.delay || 100;
  361.     var self = this;
  362.    
  363.     printl("开始批量处理 " + uiElements.length + " 个UI元素");
  364.    
  365.     var batches = [];
  366.     for (var i = 0; i < uiElements.length; i += batchSize) {
  367.         batches.push(uiElements.slice(i, i + batchSize));
  368.     }
  369.    
  370.     // 分批处理
  371.     batches.forEach(function(batch, batchIndex) {
  372.         setTimeout(function() {
  373.             printl("处理第 " + (batchIndex + 1) + " 批,共 " + batch.length + " 个元素");
  374.             
  375.             batch.forEach(function(element, index) {
  376.                 try {
  377.                     processor(element, index);
  378.                     self.performanceMetrics.operations++;
  379.                 } catch (e) {
  380.                     printl("处理UI元素失败: " + (e.message || e));
  381.                 }
  382.             });
  383.             
  384.             if (batchIndex === batches.length - 1) {
  385.                 printl("批量处理完成");
  386.             }
  387.         }, batchIndex * delay);
  388.     });
  389.    
  390.     return this;
  391. };

  392. /**
  393. * OCR结果智能筛选 - 结合AIWROK的OCR功能
  394. * @param {Array} ocrResults - OCR识别结果数组
  395. * @param {Object} filterOptions - 筛选选项
  396. * @returns {Array} 筛选后的结果
  397. */
  398. ArrayUtils.prototype.filterOCRResults = function(ocrResults, filterOptions) {
  399.     filterOptions = filterOptions || {};
  400.    
  401.     var conditions = [];
  402.    
  403.     // 文本长度过滤
  404.     if (filterOptions.minLength) {
  405.         conditions.push({
  406.             field: 'text',
  407.             operator: '>',
  408.             value: filterOptions.minLength
  409.         });
  410.     }
  411.    
  412.     // 置信度过滤
  413.     if (filterOptions.minConfidence) {
  414.         conditions.push({
  415.             field: 'confidence',
  416.             operator: '>=',
  417.             value: filterOptions.minConfidence
  418.         });
  419.     }
  420.    
  421.     // 文本内容过滤
  422.     if (filterOptions.contains) {
  423.         conditions.push({
  424.             field: 'text',
  425.             operator: 'contains',
  426.             value: filterOptions.contains
  427.         });
  428.     }
  429.    
  430.     // 位置过滤
  431.     if (filterOptions.minX !== undefined) {
  432.         conditions.push({
  433.             field: 'x',
  434.             operator: '>=',
  435.             value: filterOptions.minX
  436.         });
  437.     }
  438.    
  439.     return this.smartFilter(ocrResults, conditions);
  440. };

  441. /**
  442. * 日志数据聚合分析 - 结合AIWROK的日志功能
  443. * @param {Array} logEntries - 日志条目数组
  444. * @param {Object} analysisConfig - 分析配置
  445. * @returns {Object} 分析结果
  446. */
  447. ArrayUtils.prototype.analyzeLogs = function(logEntries, analysisConfig) {
  448.     analysisConfig = analysisConfig || {};
  449.    
  450.     var timeWindow = analysisConfig.timeWindow || 3600000; // 1小时
  451.     var logLevelWeights = analysisConfig.logLevelWeights || {
  452.         'ERROR': 10,
  453.         'WARN': 5,
  454.         'INFO': 1,
  455.         'DEBUG': 0.5
  456.     };
  457.    
  458.     var currentTime = new Date().getTime();
  459.     var recentLogs = logEntries.filter(function(log) {
  460.         return currentTime - log.timestamp <= timeWindow;
  461.     });
  462.    
  463.     var analysis = {
  464.         totalLogs: recentLogs.length,
  465.         levelDistribution: {},
  466.         errorRate: 0,
  467.         warningRate: 0,
  468.         healthScore: 100
  469.     };
  470.    
  471.     // 统计日志级别分布
  472.     recentLogs.forEach(function(log) {
  473.         var level = log.level || 'INFO';
  474.         analysis.levelDistribution[level] = (analysis.levelDistribution[level] || 0) + 1;
  475.     });
  476.    
  477.     // 计算错误率和警告率
  478.     var errorCount = analysis.levelDistribution['ERROR'] || 0;
  479.     var warnCount = analysis.levelDistribution['WARN'] || 0;
  480.    
  481.     analysis.errorRate = analysis.totalLogs > 0 ? (errorCount / analysis.totalLogs) * 100 : 0;
  482.     analysis.warningRate = analysis.totalLogs > 0 ? (warnCount / analysis.totalLogs) * 100 : 0;
  483.    
  484.     // 计算健康分数
  485.     var totalWeight = 0;
  486.     var weightedScore = 0;
  487.    
  488.     for (var level in analysis.levelDistribution) {
  489.         if (analysis.levelDistribution.hasOwnProperty(level)) {
  490.             var count = analysis.levelDistribution[level];
  491.             var weight = logLevelWeights[level] || 1;
  492.             totalWeight += count * weight;
  493.             weightedScore += count * weight;
  494.         }
  495.     }
  496.    
  497.     if (totalWeight > 0) {
  498.         analysis.healthScore = Math.max(0, 100 - (errorCount * 10) - (warnCount * 3));
  499.     }
  500.    
  501.     return analysis;
  502. };

  503. //===========================================
  504. // 使用示例和测试
  505. //===========================================

  506. function ecommerceDataProcessingExample() {
  507.     printl("=== AIWROK数组方法高级应用案例 ===");
  508.    
  509.     // 创建数组工具实例
  510.     var arrayUtils = new ArrayUtils();
  511.    
  512.     // 模拟电商数据
  513.     var products = [
  514.         { id: 1, name: 'iPhone 13', category: '手机', price: 5999, stock: 50, sales: 120 },
  515.         { id: 2, name: '华为P50', category: '手机', price: 4488, stock: 30, sales: 85 },
  516.         { id: 3, name: 'MacBook Pro', category: '电脑', price: 12999, stock: 20, sales: 45 },
  517.         { id: 4, name: '小米电视', category: '家电', price: 2999, stock: 15, sales: 200 },
  518.         { id: 5, name: 'AirPods Pro', category: '配件', price: 1999, stock: 100, sales: 300 },
  519.         { id: 6, name: '华为手表', category: '配件', price: 2688, stock: 25, sales: 150 },
  520.         { id: 7, name: 'iPad Air', category: '平板', price: 4399, stock: 40, sales: 180 },
  521.         { id: 8, name: '戴尔显示器', category: '电脑', price: 2199, stock: 35, sales: 95 }
  522.     ];
  523.    
  524.     // 开始性能监控
  525.     arrayUtils.startPerformanceMonitoring();
  526.    
  527.     printl("原始数据:共 " + products.length + " 个商品");
  528.    
  529.     // 1. 智能筛选:找出价格大于2000且销量大于100的商品
  530.     var hotProducts = arrayUtils.smartFilter(products, [
  531.         { field: 'price', operator: '>', value: 2000 },
  532.         { field: 'sales', operator: '>', value: 100 }
  533.     ]);
  534.    
  535.     printl("热门商品:" + hotProducts.length + " 个");
  536.     hotProducts.forEach(function(product) {
  537.         printl("  - " + product.name + " (价格: ¥" + product.price + ", 销量: " + product.sales + ")");
  538.     });
  539.    
  540.     // 2. 数据聚合:按类别统计
  541.     var categoryStats = arrayUtils.aggregate(products, {
  542.         groupBy: 'category',
  543.         metrics: {
  544.             totalProducts: { operation: 'count' },
  545.             avgPrice: { field: 'price', operation: 'avg' },
  546.             totalSales: { field: 'sales', operation: 'sum' },
  547.             totalValue: { field: 'stock', operation: 'sum' }
  548.         }
  549.     });
  550.    
  551.     printl("\n类别统计:");
  552.     for (var category in categoryStats) {
  553.         if (categoryStats.hasOwnProperty(category)) {
  554.             var stats = categoryStats[category];
  555.             printl("  " + category + ": ");
  556.             printl("    商品数量: " + stats.totalProducts);
  557.             printl("    平均价格: ¥" + Math.round(stats.avgPrice));
  558.             printl("    总销量: " + stats.totalSales);
  559.             printl("    库存总量: " + stats.totalValue);
  560.         }
  561.     }
  562.    
  563.     // 3. 分页显示:每页显示3个商品
  564.     var pageResult = arrayUtils.paginate(products, 3, 2);
  565.    
  566.     printl("\n分页显示(第2页,每页3个):");
  567.     pageResult.items.forEach(function(product) {
  568.         printl("  " + product.name + " - " + product.category);
  569.     });
  570.    
  571.     printl("分页信息:");
  572.     printl("  当前页: " + pageResult.pagination.pageNumber);
  573.     printl("  总页数: " + pageResult.pagination.totalPages);
  574.     printl("  总商品数: " + pageResult.pagination.totalItems);
  575.    
  576.     // 4. 复杂数据处理示例:找出各品类中最畅销的商品
  577.     var topProductsByCategory = {};
  578.     var categories = arrayUtils.distinct(products, 'category');
  579.    
  580.     categories.forEach(function(category) {
  581.         var categoryProducts = arrayUtils.smartFilter(products, [
  582.             { field: 'category', operator: '==', value: category }
  583.         ]);
  584.         
  585.         // 按销量排序,取销量最高的
  586.         categoryProducts.sort(function(a, b) {
  587.             return b.sales - a.sales;
  588.         });
  589.         
  590.         // 确保分类下有商品再赋值
  591.         if (categoryProducts.length > 0) {
  592.             topProductsByCategory[category] = categoryProducts[0];
  593.         }
  594.     });
  595.    
  596.     printl("\n各品类最畅销商品:");
  597.     for (var cat in topProductsByCategory) {
  598.         if (topProductsByCategory.hasOwnProperty(cat)) {
  599.             var product = topProductsByCategory[cat];
  600.             if (product) { // 确保产品存在再输出
  601.                 printl("  " + cat + ": " + product.name + " (销量: " + product.sales + ")");
  602.             }
  603.         }
  604.     }
  605.    
  606.     // 5. 性能监控结果
  607.     var perfReport = arrayUtils.endPerformanceMonitoring();
  608.     printl("\n性能报告:");
  609.     printl("  执行时间: " + perfReport.duration + "ms");
  610.     printl("  操作次数: " + perfReport.operations);
  611.     printl("  处理速度: " + perfReport.opsPerSecond + " ops/sec");
  612. }

  613. /**
  614. * OCR识别结果处理示例
  615. */
  616. function ocrResultProcessingExample() {
  617.     printl("\n=== OCR识别结果处理示例 ===");
  618.    
  619.     var arrayUtils = new ArrayUtils();
  620.    
  621.     // 模拟OCR识别结果
  622.     var ocrResults = [
  623.         { text: '登录', confidence: 0.95, x: 100, y: 200, width: 50, height: 30 },
  624.         { text: '用户名', confidence: 0.87, x: 50, y: 300, width: 70, height: 25 },
  625.         { text: '密码', confidence: 0.92, x: 50, y: 350, width: 50, height: 25 },
  626.         { text: '记住我', confidence: 0.78, x: 100, y: 400, width: 80, height: 20 },
  627.         { text: '忘记密码', confidence: 0.85, x: 200, y: 400, width: 90, height: 20 },
  628.         { text: '注册', confidence: 0.90, x: 300, y: 200, width: 50, height: 30 },
  629.         { text: 'AIWROK', confidence: 0.98, x: 150, y: 100, width: 100, height: 40 },
  630.         { text: '帮助', confidence: 0.72, x: 300, y: 500, width: 50, height: 25 }
  631.     ];
  632.    
  633.     // 筛选高置信度文本
  634.     var highConfidenceTexts = arrayUtils.filterOCRResults(ocrResults, {
  635.         minConfidence: 0.85
  636.     });
  637.    
  638.     printl("高置信度文本 (" + highConfidenceTexts.length + " 个):");
  639.     highConfidenceTexts.forEach(function(result) {
  640.         printl("  - " + result.text + " (置信度: " + result.confidence + ")");
  641.     });
  642.    
  643.     // 查找特定关键词
  644.     var loginRelatedTexts = arrayUtils.filterOCRResults(ocrResults, {
  645.         contains: '登录'
  646.     });
  647.    
  648.     printl("\n包含'登录'的文本:");
  649.     loginRelatedTexts.forEach(function(result) {
  650.         printl("  - " + result.text);
  651.     });
  652. }

  653. /**
  654. * 日志分析示例
  655. */
  656. function logAnalysisExample() {
  657.     printl("\n=== 日志分析示例 ===");
  658.    
  659.     var arrayUtils = new ArrayUtils();
  660.    
  661.     // 模拟日志数据
  662.     var logEntries = [
  663.         { level: 'INFO', message: '应用启动', timestamp: new Date().getTime() - 3600000 },
  664.         { level: 'DEBUG', message: '加载配置文件', timestamp: new Date().getTime() - 3590000 },
  665.         { level: 'INFO', message: '用户登录成功', timestamp: new Date().getTime() - 3500000 },
  666.         { level: 'WARN', message: '内存使用率过高', timestamp: new Date().getTime() - 3000000 },
  667.         { level: 'ERROR', message: '数据库连接失败', timestamp: new Date().getTime() - 2500000 },
  668.         { level: 'INFO', message: '数据库连接恢复', timestamp: new Date().getTime() - 2400000 },
  669.         { level: 'ERROR', message: 'API请求超时', timestamp: new Date().getTime() - 2000000 },
  670.         { level: 'WARN', message: 'API响应缓慢', timestamp: new Date().getTime() - 1800000 },
  671.         { level: 'INFO', message: '用户执行操作', timestamp: new Date().getTime() - 1500000 },
  672.         { level: 'DEBUG', message: '缓存更新', timestamp: new Date().getTime() - 1000000 }
  673.     ];
  674.    
  675.     // 分析最近一小时的日志
  676.     var analysis = arrayUtils.analyzeLogs(logEntries, {
  677.         timeWindow: 3600000, // 1小时
  678.         logLevelWeights: {
  679.             'ERROR': 10,
  680.             'WARN': 5,
  681.             'INFO': 1,
  682.             'DEBUG': 0.5
  683.         }
  684.     });
  685.    
  686.     printl("日志分析结果:");
  687.     printl("  总日志数: " + analysis.totalLogs);
  688.     printl("  错误率: " + analysis.errorRate.toFixed(2) + "%");
  689.     printl("  警告率: " + analysis.warningRate.toFixed(2) + "%");
  690.     printl("  系统健康评分: " + analysis.healthScore);
  691.     printl("  日志级别分布:");
  692.    
  693.     for (var level in analysis.levelDistribution) {
  694.         if (analysis.levelDistribution.hasOwnProperty(level)) {
  695.             printl("    " + level + ": " + analysis.levelDistribution[level]);
  696.         }
  697.     }
  698. }

  699. /**
  700. * UI元素批量处理示例
  701. */
  702. function uiElementBatchProcessingExample() {
  703.     printl("\n=== UI元素批量处理示例 ===");
  704.    
  705.     var arrayUtils = new ArrayUtils();
  706.    
  707.     // 模拟UI元素
  708.     var uiElements = [
  709.         { id: 'btn1', type: 'button', text: '提交', visible: true },
  710.         { id: 'btn2', type: 'button', text: '取消', visible: true },
  711.         { id: 'inp1', type: 'input', text: '', visible: true },
  712.         { id: 'inp2', type: 'input', text: '', visible: false },
  713.         { id: 'chk1', type: 'checkbox', text: '同意条款', visible: true },
  714.         { id: 'lbl1', type: 'label', text: '用户协议', visible: true },
  715.         { id: 'img1', type: 'image', text: '', visible: true }
  716.     ];
  717.    
  718.     // 处理可见的按钮元素
  719.     var visibleButtons = arrayUtils.smartFilter(uiElements, [
  720.         { field: 'visible', operator: '==', value: true },
  721.         { field: 'type', operator: '==', value: 'button' }
  722.     ]);
  723.    
  724.     printl("可见按钮数量: " + visibleButtons.length);
  725.    
  726.     // 模拟批量处理
  727.     arrayUtils.batchUIProcess(visibleButtons, function(element, index) {
  728.         try {
  729.             printl("  处理按钮 #" + (index+1) + ": " + element.text + " (ID: " + element.id + ")");
  730.             // 这里可以执行实际的UI操作,如点击、修改属性等
  731.         } catch (e) {
  732.             printl("  处理按钮时出错: " + e.message);
  733.         }
  734.     }, { batchSize: 2, delay: 500 });
  735. }

  736. //===========================================
  737. // 主函数和执行入口
  738. //===========================================

  739. /**
  740. * 运行所有示例
  741. */
  742. function runAllExamples() {
  743.     try {
  744.         ecommerceDataProcessingExample();
  745.         ocrResultProcessingExample();
  746.         logAnalysisExample();
  747.         uiElementBatchProcessingExample();
  748.         printl("\n=== 所有示例执行完成 ===");
  749.     } catch (e) {
  750.         printl("执行示例时发生错误: " + (e.message || e));
  751.     }
  752. }

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

  757. // 导出ArrayUtils类供其他模块使用
  758. if (typeof module !== 'undefined' && module.exports) {
  759.     module.exports = ArrayUtils;
  760. }
复制代码






untoAIWROK软件日志悬浮窗简化版自动切换位置nextnocontent
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关导读
信息发布软件&#127983;AIWROK数组方法高级应用案例
🏯AIWROK数组方法高级应用案例
信息发布软件AIWROK软件日志悬浮窗简化版自动切换位置
AIWROK软件日志悬浮窗简化版自动切换位置
信息发布软件AIWROK软件String实例演示
AIWROK软件String实例演示
信息发布软件AIWROK软件S内置String类[String]方法小结
AIWROK软件S内置String类[String]方法小结 方法 1:charAt[/backcolor]方法 2:charCodeAt[/backcolor]方法 3:indexOf[/backcolor]方法 4:lastIndexOf[/backcolor]方法 5:length[/backcolor]方法 6:match[/backcolor]方法 7:replace[/backcolor]方法 8:replaceAll[/backcolor]方法 9:split[/backcolor]方法 10:startsWith[/backcolor]方法 11:substr[/backcolor]方法 12:substring[/backcolor]方法 13:trim[/backcol
信息发布软件AIWROK软件完整的WebSocket客户端示例
这段代码是一个完整的WebSocket客户端示例,用于连接到指定的WebSocket服务器并处理各种事件。具体来说,代码的作用如下: 定义服务器地址:首先定义了一个服务器的IP地址和端口号 var ip = "154.37.221.104:8886";。 创建WebSocket对象:尝试创建一个新的WebSocket对象 var ws = new WebSocket();。注意,这里的 new ws() 应该是 new WebSocket()。 添加事件监听器:代码中尝试为WebSocket对象添加事件监听器,但这里有一个错误。
信息发布软件AIWROK软件苹果系统中实现四种基本滑动操作
AIWROK软件苹果系统中实现四种基本滑动操作
信息发布软件hid的滑动没有百分比坐标滑动吗
hid的滑动没有百分比坐标滑动吗
信息发布软件单选控件[uiRadioButton]方法小结
单选控件方法小结 方法 1:加载单选控件[/backcolor]方法 2:获取选中项[/backcolor]方法 3:设置高度[/backcolor]方法 4:设置选中项[/backcolor]
信息发布软件AIWROK软件无障碍触摸操作示例:点击、左右滑动、上下滑动实例
AIWROK软件无障碍触摸操作示例:点击、左右滑动、上下滑动实例
信息发布软件AIWROK软件安卓随机工具应用函数生成
AIWROK软件安卓随机工具应用函数生成
信息发布软件用在AIWORK软件代码中的实用符号分类整理2
用在AIWORK软件代码中的实用符号分类整理2 软件IDE用Emoji符号分类整理(含用途说明)一、表情与情感1. 微笑 [*]😀 笑脸(基础开心反馈,用于操作成功后的友好提示) [*]😃 笑脸大眼睛(强化开心情绪,用于重要任务完成后的积极反馈) [*]😄 笑脸和微笑的眼睛(温和友好的状态,用于日常交互中的正向回应) [*]😁 带着微笑的眼睛(轻松愉悦的反馈,用于轻度成功或趣味操作) [*]
信息发布软件AIWROK软件图像二值化的各种方法和应用场景
AIWROK软件图像二值化的各种方法和应用场景
信息发布软件AIWROK软件找图区分页面变化和卡死状态
AIWROK软件找图区分页面变化和卡死状态
信息发布软件AIWROK苹果系统Map 数据管理[map]小结
AIWROK苹果系统Map 数据管理[map]小结 方法一:add(添加键值对)[/backcolor]方法二:delete(删除指定键值对)[/backcolor]方法三:clear(清空所有键值对)[/backcolor]方法四:get(根据键获取值)[/backcolor]方法五:getAllValue(获取所有值)[/backcolor]方法六:toString(转换为字符串)[/backcolor]完整示例:
信息发布软件AIWROK软件用图找图示例templateMat方法
AIWROK软件用图找图示例templateMat方法
信息发布软件苹果JS代码运行时[selfRunTime]小结
苹果JS代码运行时[selfRunTime]小结 方法一:stop 停止运行[/backcolor]方法二:runOnUIThread ui 线程中运行函数[/backcolor]
信息发布软件苹果系统专用H5创建一个绿色文件
苹果系统专用H5创建一个绿色文件
信息发布软件AIWROK软件技术分享苹果IOS系统获取外部IP
AIWROK软件技术分享苹果IOS系统获取外部IP
信息发布软件AIWROK软件安卓总结图像视觉处理[opencv]方法
AIWROK软件安卓总结图像视觉处理[opencv]方法 方法1:getcolorNum:获取区域颜色数量 方法2:gradientProcessing:计算梯度 方法3:invertColor:颜色翻转 方法4:openImg:开运算 方法5:removeSmallObjects:去杂点 方法7:shapeSplit:分隔提取 方法8:shapeSplitEx:cv 文件分隔提取 方法9:templateMatch:模板匹配 方法10:threshold:二值化 方法11:toGray:转灰度图 方法12:
信息发布软件AIWROK软件start.js简单H5直接调用
信息发布软件AIWROK苹果系统简单的UI界面分享一下
信息发布软件图像视觉处理[opencv]小结3
图像视觉处理[opencv]小结3 方法1:findImageOneSift:找图(SIFT 算法) 方法2:findImagesEx:cv 文件找图 方法3:findMultiColor:找色 方法4:findMultiColorEx:cv 文件多点找色 方法5:gaussianBlur:高斯滤波 方法6:getAllShap:获取所有 Shape 方法7:getContours:获取轮廓图
信息发布软件AIWROK软件图像视觉处理[opencv]小结2
AIWROK软件图像视觉处理[opencv]小结2 方法 1:coverageArea:图片抹除方法2:dilateImage:图像膨胀 方法3:drawRect:Shape 绘制 方法4:erodeImage:图像腐蚀 方法5:filtersEx:cv 文件滤镜 方法6:findImageOneKAZE:找图(KAZE 算法)
信息发布软件AIWORK软件图像视觉处理[opencv]小结1
AIWORK软件图像视觉处理[opencv]小结1// 1. HSV颜色变换:对图像进行HSV通道的颜色变换,可调整色相、饱和度、对比度// 参数说明:输入图像(Mat)、色相参数(int)、饱和度参数(int)、对比度参数(int)// 返回值:处理后的Mat图像function hsvTransform() { // 截取屏幕区域(432,768)大小、100质量的图像并转为Mat格式 var mat = screen.screenShot(432, 768, 100).getMat(); // 调用HSV变换:色相17、饱和度17、对比度17
信息发布软件浏览器H5方法小结
浏览器H5方法小结
信息发布软件AIWROK软件漂亮对接H5简单示例
AIWROK软件漂亮对接H5简单示例
信息发布软件AIWROK软件线程优先级示例
AIWROK软件线程优先级示例
信息发布软件AIWORK软件在屏幕底部显示实时日志可以移动
AIWORK软件在屏幕底部显示实时日志可以移动
信息发布软件安卓HID贝塞尔曲线手势操作示例
安卓HID贝塞尔曲线手势操作示例
信息发布软件安卓端与H5页面交互的完整实现
安卓端与H5页面交互的完整实现
信息发布软件苹果系统里如何使用OCR进行文本识别并执行点击操作
苹果系统里如何使用OCR进行文本识别并执行点击操作
信息发布软件AIWROK软件列表控件 [uiList] 实例演示
AIWROK软件列表控件 实例演示
信息发布软件安卓列表控件 [uiList] 方法小结
安卓列表控件 方法小结 方法 1:add方法 2:addArray方法 3:clear方法 4:delete方法 5:execSQL方法 6:exportData方法 7:exportTxt方法 8:findByID方法 9:getColumnCount方法 10:getColumnIndex方法 11:getColumnName方法 12:getColumnNames方法 13:getCount方法 14:getCursorSetp方法 15:getPosition方法 16:getString方法 17:getStringl方法 18:importData方法 19:isLast方法 20:move方法 21:moveNext方法
信息发布软件安卓版AIWROK软件APP操作类小结合集
安卓版AIWROK软件APP操作类小结合集 方法 1:代理模式获取当前 activity 地址[/backcolor]方法 2:getAllApp 获取所有 app[/backcolor]方法 3:getAppName 获取 APP 名字[/backcolor]方法 4:getCurrentActivity 无障碍获取当前 activity 地址[/backcolor]方法 5:getLocalAppName 获取自己 APP 名字(AIWORK 打包)[/backcolor]方法 6:getLocalVerName 获取自己版本号(AIWORK 打包)[/backcolor]方法 7:getMemory
信息发布软件AIWROK软件苹果点击开始按钮运行最简单的封装脚本例子
AIWROK软件苹果点击开始按钮运行最简单的封装脚本例子 另外主脚本.js封装的:
信息发布软件安卓toast吐司的各种方法应用实例
安卓toast吐司的各种方法应用实例
信息发布软件AIWROK软件支持悬浮窗自由定位和拖拽功能
AIWROK软件支持悬浮窗自由定位和拖拽功能
信息发布软件AIWROK软件安卓工具箱悬浮窗
AIWROK软件安卓工具箱悬浮窗
信息发布软件安卓通过floatUI创建悬浮窗H5界面
安卓通过floatUI创建悬浮窗H5界面
信息发布软件安卓专用吐司toast倒计时到指定时间并显示剩余时间
安卓专用吐司toast倒计时到指定时间并显示剩余时间
信息发布软件aiwrok软件适用于安卓环境下的外网IP获取工具实例
aiwrok软件适用于安卓环境下的外网IP获取工具实例
信息发布软件苹果系统激活模式投屏
1.安装AK-Runner链接下载https://www.pgyer.com/akrunner或者扫码下载AK-Runner.ipa2.安装后需要信任证书找到 设置 --通用---VPN与设备管理3.激活AK-Runner激活需要pc,首先下载激活器📎AK-Runner激活器.zip新手机需要爱思助手协助开启开发者模式,开启过的可以忽略。(爱思助手最好使用最新版)打开爱思助手按照提示操作即可,打开实时投屏。能获取到屏幕信息即可。如果没有出现可能是手机没有开启开发者模式,参考爱思助手
信息发布软件AIWROK软件全部硬件HID按键码小结集合
AIWROK软件全部硬件HID按键码小结集合 方法真实示例:
信息发布软件IOS苹果系统创建具有现代H5视觉效果的界面
IOS苹果系统创建具有现代H5视觉效果的界面
信息发布软件IOS苹果示例如何使用不同的UI风格创建直接运行脚本的按钮
IOS苹果示例如何使用不同的UI风格创建直接运行脚本的按钮
信息发布软件AIWROK苹果IOS线条类[Line]复杂示例
AIWROK苹果IOS线条类[Line]复杂示例
信息发布软件AIWROK软件苹果IOS线条实作简单示例
AIWROK软件苹果IOS线条实作简单示例
信息发布软件AIWROK软件IOS苹果线条类[Line]方法小结
AIWROK软件IOS苹果线条类[Line]方法小结 . 线条宽度设置方法2. 线条高度设置方法3. 线条颜色设置方法实用演示例子:
信息发布软件AIWROK软件苹果IOS吐司toast.show方法小结
AIWROK软件苹果IOS吐司toast.show方法小结 实例呈现:
信息发布软件AIWROK软件苹果IOS系统图色视觉[opencv]方法小结
AIWROK软件苹果IOS系统图色视觉[opencv]方法小结 方法 1:OCR 识别(指定区域)方法 2:获取图像 Base64 编码方法 3:获取 Mat 对象方法 4:Mat 转 Image方法 5:Base64 转 Image方法 6:读取图片文件为 Image方法 7:释放图像资源实战示例子:
信息发布软件AIWROK软件苹果IOS系统图色视觉[opencv]方法小结
AIWROK软件苹果IOS系统图色视觉[opencv]方法小结 方法 1:cv 文件找图(模版匹配 cv 找图)方法 2:cv 文件 OCR(模版匹配 OCR)方法 3:模版匹配(通过模版匹配找到目标对象)方法 4:找多图方法 5:转灰度图(图像转灰度图)方法 6:裁切图片(从大图中截图裁切图片)方法 7:二值化方法 8:颜色翻转实战实例:
信息发布软件AIWROK软件苹果IOS系统随机数[RJrxn1afZqW7yjf2NK]方法小结
AIWROK软件随机数[RJrxn1afZqW7yjf2NK]方法小结 📌GQGqcAlZv2随机字符📌WBJqf91s7J随机整数📌LtUqFOGkc6随机小数📌随机布尔值生成函数📌随机数组元素选择函数使用示例表 📌随机日期使用示例表使用示例表使用示例表📌随机UUID生成函数函数说明表使用示例表📌随机密码 / 验证码随机密码 / 验证码生成函数及使用说明[/backcolor]函数说明表[/backcolor]使用示例表[/back
信息发布软件AIWROK软件苹果系统里的事件[event]方法小结
AIWROK软件苹果系统里的事件[event]方法小结 方法 1:截屏开始方法 2:截屏暂停方法 3:截屏恢复实战示例:
信息发布软件AWIROK苹果系统屏幕类[screen]方法小结
AWIROK苹果系统屏幕类[screen]方法小结 方法 1:lockScreen(锁定屏幕缓存)方法 2:unLockScreen(解锁锁屏幕缓存)方法 3:isOpenShortcut(是否开启快照截屏)方法 4:getScreenWidth(获取屏幕宽度)方法 5:getScreenHeight(获取屏幕高度)方法 6:ocr(识别支持设定区域)方法 7:screenShot(截图缩放,记得调用 close 释放图像)方法 8:screenShotFull(全尺寸截图,记得调用 close 释放图像)实战实例子:单独 OCR
信息发布软件AIWROK软无任何苹果IOS系统配置[config]方法小结
AIWROK软无任何苹果IOS系统配置[config]方法小结 getConfig 获取配置📌setConfig设置配置实际示例:
信息发布软件AIWROK软件安卓日志窗口[logWindow]方法小结总汇集合
AIWROK软件安卓日志窗口[logWindow]方法小结总汇集合 clear 清理日志📌close关闭日志窗口📌setAlpha设置透明度📌setClickModel设置可点模式,就是无法穿透桌面📌setColor设置日志字体颜色📌setDrag设置为手动拖拽模式setHeight设置高度📌setNoClickModel设置为不可点,穿透桌面📌setPosition设置位置📌setSize设置日志字体大小setTitle设置标题📌setWidth 设置
信息发布软件AIWROK安卓类日志类[print]方法小结总汇集合
AIWROK安卓类日志类方法小结总汇集合 print.log:输出调试 / 日志信息2. print.err:输出错误信息3. print.time:启动计时4. print.timeEnd:结束计时并返回时长5. print.warn:输出警告信息完整的示例:
信息发布软件AIWROK软件苹果IOS快捷指令代理服务[shortAgent]方法小结
AIWROK软件苹果IOS快捷指令代理服务[shortAgent]方法小结 openApp启动app📌appopenUrl打开网址或者Scheme📌openSelf自启动📌screenShot代理截屏📌getTopApp 获取顶端app(I0S18+)特别示例:
信息发布软件AIWROK系统安卓找字OCR___方法小结总汇集合
AIWROK系统安卓找字OCR___方法小结总汇集合 findIncludeText查询包含文字🔍🔢findIncludeTexts查询包含文字多目标🔍🔢findSimilarText模糊查询🔍🔢findText查询文字🔍🔢getAllDetect 获取所有目标🔍🔢getAllString 获取所有字符串🔍🔢getJson 获取json对象🔍🔢getJsonString 获取json字符串🔍🔢MLKitOcr文字
信息发布软件AIWROK软件toast_显示方法小结
AIWROK软件toast_显示方法小结 toast.setAlpha___设置透明度toast.setPoint___设置位置toast.setSize___设置字号toast.setTextColor___设置文字颜色toast.showLong___显示长吐司toast.show___显示吐司特别案例:示例二:示例三倒计时到指定时间并显示剩余时间(红色文字):
信息发布软件AIWROK软件苹果系统方法快捷指令[shortcut]方法小结
AIWROK软件苹果系统方法快捷指令[shortcut]方法小结 openApp启动app(需要前台运行)📌openUrl打开网页(需要前台运行)📌runShortcut打开快捷指令(需要前台运行)
信息发布软件AIWROK软件苹果IOS矩形类[rect]方法小结
AIWROK软件苹果IOS矩形类[rect]方法小结 getLeft 获取左边界📌getRight获取右边界📌getTop获取上边界📌getBottom 获取下边界📌getWidth 获取宽度📌getHeight 获取高度📌getCenterX 获取中心X坐标📌getCenterY 获取中心Y坐标📌inRect 判断点是否在矩形内📌set设置矩形的边界📌toString输出字符串📌getRandX生成随机X坐标📌getRandY生成随
信息发布软件AIWROK软件IOS系统里脚本项目[project]方法小结
AIWROK软件IOS系统里脚本项目方法小结 📌getCodePath 获取代码完整目录📌getPluginsPath 获取插件完整目录📌getResourcesPath 获取资源完整目录📌getCard 获取卡密📌getVersion 获取脚本版本调用示例代码:
信息发布软件IOS功能苹果AIWROK软件剪贴板类[clipboard]方法小结
IOS功能苹果AIWROK软件剪贴板类[clipboard]方法小结 copyToClipboard 复制到剪贴板📌copyToClipboardPIP复制到剪贴板📌readFromClipboard 从剪贴板读取示例方法实用:
信息发布软件AIWROK软件IOS苹果系统检测目标类[Detect]方法方法小结
AIWROK软件IOS苹果系统检测目标类[Detect]方法方法小结 📌score 获取检测分数📌getRect 获取检测区域📌clickRandom随机点击📌click点击示例演示:

QQ|( 京ICP备09078825号 )

本网站信息发布软件,是可以发布论坛,发送信息到各大博客,各大b2b软件自动发布,好不夸张的说:只要手工能发在电脑打开IE能发的网站,用这个宣传软件就可以仿制动作,进行推送发到您想发送的B2B网站或是信息发布平台上,不管是后台,还是前台,都可以进行最方便的广告发布,这个广告发布软件,可以按月购买,还可以试用软件,对网站的验证码也可以完全自动对信息发布,让客户自动找上门,使企业轻松实现b2b发布,这个信息发布软件,均是本站原创正版开发,拥有正版的血统,想要新功能,欢迎提意见给我,一好的分类信息群发软件在手,舍我其谁。QQ896757558

GMT+8, 2025-11-20 10:34 , Processed in 0.165144 second(s), 51 queries .

宣传软件--信息发布软件--b2b软件广告发布软件

快速回复 返回顶部 返回列表