B2B网络软件

标题: 安卓脚本示例POST和GET变量方法的实际应用 [打印本页]

作者: YYPOST群发软件    时间: 3 小时前
标题: 安卓脚本示例POST和GET变量方法的实际应用
安卓脚本示例POST和GET变量方法的实际应用 安卓脚本示例POST和GET变量方法的实际应用 B2B网络软件


安卓脚本示例POST和GET变量方法的实际应用 B2B网络软件

  1. /**
  2. * 主脚本.js - 卡密管理系统完整示例
  3. * 基于安卓POST 和 GET 方法的实际应用
  4. * 适用本文档 ES5 系统安卓 JavaScript 引擎 Rhino
  5. */

  6. // =============================================================================
  7. // 0. 日志桥接配置(将 printl 重定向到 console.log)
  8. // =============================================================================

  9. // 强制将 printl 重定向到 console.log,以便 LogBridge 能捕获日志
  10. var originalPrintl = (typeof printl !== 'undefined') ? printl : null;
  11. printl = function(message) {
  12.     // 同时输出到 console.log(会被 LogBridge 捕获到 H5)
  13.     if (typeof console !== 'undefined' && typeof console.log === 'function') {
  14.         console.log(message);
  15.     }
  16.     // 如果原来有 printl,也调用它(保留原始功能)
  17.     if (originalPrintl) {
  18.         originalPrintl(message);
  19.     }
  20. };

  21. // =============================================================================
  22. // 1. 配置常量
  23. // =============================================================================

  24. var API_BASE_URL = "http://api.autoapp.net.cn:1089";
  25. var APK_ORDER_URL = "http://api.autoapp.net.cn:1088";
  26. var ADMIN_USERNAME = "mm258";      // 测试账号
  27. var ADMIN_PASSWORD = "fhdg148q";   // 测试密码

  28. // =============================================================================
  29. // 2. 获取 Token
  30. // =============================================================================

  31. /**
  32. * 获取管理 token
  33. * API: http://api.autoapp.net.cn:1089/token?username=ak123&password=123456&validateCode=1&rememberMe=false
  34. * @returns {String|null} 返回 token 或 null
  35. */
  36. function getToken() {
  37.     try {
  38.         var http = new okHttp();
  39.         
  40.         // 设置请求头
  41.         http.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");
  42.         http.setHeader("Content-Type", "application/x-www-form-urlencoded");
  43.         
  44.         // 构建请求 URL
  45.         var url = API_BASE_URL + "/token?username=" + ADMIN_USERNAME +
  46.                   "&password=" + ADMIN_PASSWORD +
  47.                   "&validateCode=1&rememberMe=false";
  48.         
  49.         printl("正在获取 token...");
  50.         printl("请求 URL: " + url);
  51.         var response = http.get(url);
  52.         printl("获取 token 响应:" + response);
  53.         
  54.         // 解析 JSON 响应
  55.         var jsonObj = JSON.parse(response);
  56.         
  57.         if (jsonObj.code === 0) {
  58.             var token = jsonObj.msg;  // msg 字段就是 token
  59.             printl("✓ Token 获取成功:" + token);
  60.             return token;
  61.         } else {
  62.             printl("✗ Token 获取失败,错误码:" + jsonObj.code);
  63.             return null;
  64.         }
  65.     } catch (e) {
  66.         printl("✗ 获取 Token 时发生异常:" + e);
  67.         return null;
  68.     }
  69. }

  70. // =============================================================================
  71. // 3. 换机接口
  72. // =============================================================================

  73. /**
  74. * 换机激活
  75. * API: http://api.autoapp.net.cn:1088/apkOrder/exitActivateNew?CardCode=卡密&imei=机器码
  76. * @param {String} cardCode 卡密
  77. * @param {String} imei 设备 IMEI(通过 device.getIMEI() 获取)
  78. * @returns {Boolean} 是否成功
  79. */
  80. function activateNewDevice(cardCode, imei) {
  81.     try {
  82.         var http = new okHttp();
  83.         
  84.         // 设置请求头
  85.         http.setHeader("User-Agent", "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N)");
  86.         
  87.         // 构建换机接口 URL(注意:参数名是 CardCode,大写C)
  88.         var url = APK_ORDER_URL + "/apkOrder/exitActivateNew?CardCode=" + cardCode + "&imei=" + imei;
  89.         
  90.         printl("=== 换机激活 ===");
  91.         printl("卡密:" + cardCode);
  92.         printl("IMEI: " + imei);
  93.         printl("请求 URL: " + url);
  94.         
  95.         var response = http.get(url);
  96.         printl("换机响应:" + response);
  97.         
  98.         // 根据实际响应判断是否成功
  99.         if (response && response.indexOf("success") !== -1) {
  100.             printl("✓ 换机激活成功");
  101.             return true;
  102.         } else {
  103.             printl("✗ 换机激活失败");
  104.             return false;
  105.         }
  106.     } catch (e) {
  107.         printl("✗ 换机激活异常:" + e);
  108.         return false;
  109.     }
  110. }

  111. // =============================================================================
  112. // 4. 发卡接口
  113. // =============================================================================

  114. /**
  115. * 添加新卡密
  116. * API: http://api.autoapp.net.cn:1089/system/activatecardv2/addCard?token=xxx&card=t23432&cardType=day&devices=1&remarks=
  117. * @param {String} token 管理 token(通过 getToken() 获取)
  118. * @param {String} card 卡密(必须大于5位,开头必须字母)
  119. * @param {String} cardType 卡类型(day天卡/month月卡/quarter季卡/halfYear半年卡/year年卡)
  120. * @param {Number} devices 设备数量
  121. * @param {String} remarks 备注信息
  122. * @returns {Boolean} 是否成功
  123. */
  124. function addCard(token, card, cardType, devices, remarks) {
  125.     try {
  126.         var http = new okHttp();
  127.         
  128.         // 设置请求头
  129.         http.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
  130.         http.setHeader("Content-Type", "application/json");
  131.         
  132.         // 构建 URL
  133.         var url = API_BASE_URL + "/system/activatecardv2/addCard?token=" + token +
  134.                   "&card=" + card +
  135.                   "&cardType=" + cardType +
  136.                   "&devices=" + devices +
  137.                   "&remarks=" + remarks;
  138.         
  139.         printl("=== 添加卡密 ===");
  140.         printl("卡密:" + card);
  141.         printl("类型:" + cardType);
  142.         printl("设备数:" + devices);
  143.         printl("备注:" + remarks);
  144.         
  145.         var response = http.get(url);
  146.         printl("发卡响应:" + response);
  147.         
  148.         // 尝试解析 JSON 响应
  149.         try {
  150.             var jsonObj = JSON.parse(response);
  151.             if (jsonObj.code === 0 || jsonObj.success === true) {
  152.                 printl("✓ 卡密添加成功");
  153.                 return true;
  154.             } else {
  155.                 printl("✗ 卡密添加失败");
  156.                 return false;
  157.             }
  158.         } catch (e) {
  159.             // 如果不是 JSON,检查响应文本
  160.             if (response && response.indexOf("success") !== -1) {
  161.                 printl("✓ 卡密添加成功");
  162.                 return true;
  163.             } else {
  164.                 printl("✗ 卡密添加失败");
  165.                 return false;
  166.             }
  167.         }
  168.     } catch (e) {
  169.         printl("✗ 添加卡密异常:" + e);
  170.         return false;
  171.     }
  172. }

  173. // =============================================================================
  174. // 5. 续费接口
  175. // =============================================================================

  176. /**
  177. * 续费卡密
  178. * API: http://api.autoapp.net.cn:1089/system/activatecardv2/editCard?token=xxx&card=t23432&cardType=day&devices=1&remarks=
  179. * @param {String} token 管理 token(通过 getToken() 获取)
  180. * @param {String} card 卡密(必须大于5位,开头必须字母)
  181. * @param {String} cardType 卡类型(day天卡/month月卡/quarter季卡/halfYear半年卡/year年卡)
  182. * @param {Number} devices 设备数量
  183. * @param {String} remarks 备注
  184. * @returns {Boolean} 是否成功
  185. */
  186. function renewCard(token, card, cardType, devices, remarks) {
  187.     try {
  188.         var http = new okHttp();
  189.         
  190.         // 设置请求头
  191.         http.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
  192.         http.setHeader("Content-Type", "application/json");
  193.         
  194.         // 构建 URL
  195.         var url = API_BASE_URL + "/system/activatecardv2/editCard?token=" + token +
  196.                   "&card=" + card +
  197.                   "&cardType=" + cardType +
  198.                   "&devices=" + devices +
  199.                   "&remarks=" + remarks;
  200.         
  201.         printl("=== 续费卡密 ===");
  202.         printl("卡密:" + card);
  203.         printl("类型:" + cardType);
  204.         printl("设备数:" + devices);
  205.         
  206.         var response = http.get(url);
  207.         printl("续费响应:" + response);
  208.         
  209.         // 尝试解析 JSON 响应
  210.         try {
  211.             var jsonObj = JSON.parse(response);
  212.             if (jsonObj.code === 0 || jsonObj.success === true) {
  213.                 printl("✓ 卡密续费成功");
  214.                 return true;
  215.             } else {
  216.                 printl("✗ 卡密续费失败");
  217.                 return false;
  218.             }
  219.         } catch (e) {
  220.             if (response && response.indexOf("success") !== -1) {
  221.                 printl("✓ 卡密续费成功");
  222.                 return true;
  223.             } else {
  224.                 printl("✗ 卡密续费失败");
  225.                 return false;
  226.             }
  227.         }
  228.     } catch (e) {
  229.         printl("✗ 续费卡密异常:" + e);
  230.         return false;
  231.     }
  232. }

  233. // =============================================================================
  234. // 6. 查询卡密信息
  235. // =============================================================================

  236. /**
  237. * 查询卡密详细信息
  238. * API: http://api.autoapp.net.cn:1089/system/activatecardv2/info?token=xxx&card=t23432
  239. * @param {String} token 管理 token(通过 getToken() 获取)
  240. * @param {String} card 卡密
  241. * @returns {Object|null} 卡密信息对象或 null
  242. */
  243. function getCardInfo(token, card) {
  244.     try {
  245.         var http = new okHttp();
  246.         
  247.         // 设置请求头
  248.         http.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
  249.         
  250.         // 构建 URL
  251.         var url = API_BASE_URL + "/system/activatecardv2/info?token=" + token + "&card=" + card;
  252.         
  253.         printl("=== 查询卡密信息 ===");
  254.         printl("卡密:" + card);
  255.         
  256.         var response = http.get(url);
  257.         printl("查询响应:" + response);
  258.         
  259.         // 解析 JSON 响应
  260.         var jsonObj = JSON.parse(response);
  261.         
  262.         if (jsonObj.code === 0) {
  263.             printl("✓ 查询成功");
  264.             printl("卡密信息:" + JSON.stringify(jsonObj.data));
  265.             return jsonObj.data;
  266.         } else {
  267.             printl("✗ 查询失败");
  268.             return null;
  269.         }
  270.     } catch (e) {
  271.         printl("✗ 查询卡密信息异常:" + e);
  272.         return null;
  273.     }
  274. }

  275. // =============================================================================
  276. // 7. 查询卡密设备列表
  277. // =============================================================================

  278. /**
  279. * 查询卡密绑定的设备列表
  280. * API: http://api.autoapp.net.cn:1089/system/activatecardv2/devices?token=xxx&card=t23432
  281. * @param {String} token 管理 token(通过 getToken() 获取)
  282. * @param {String} card 卡密
  283. * @returns {Array|null} 设备列表或 null
  284. */
  285. function getCardDevices(token, card) {
  286.     try {
  287.         var http = new okHttp();
  288.         
  289.         // 设置请求头
  290.         http.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
  291.         
  292.         // 构建 URL
  293.         var url = API_BASE_URL + "/system/activatecardv2/devices?token=" + token + "&card=" + card;
  294.         
  295.         printl("=== 查询设备列表 ===");
  296.         printl("卡密:" + card);
  297.         
  298.         var response = http.get(url);
  299.         printl("设备列表响应:" + response);
  300.         
  301.         // 解析 JSON 响应
  302.         var jsonObj = JSON.parse(response);
  303.         
  304.         if (jsonObj.code === 0) {
  305.             printl("✓ 查询成功");
  306.             var devices = jsonObj.data || jsonObj.list || [];
  307.             printl("设备数量:" + devices.length);
  308.             
  309.             // 遍历显示设备信息
  310.             for (var i = 0; i < devices.length; i++) {
  311.                 printl("设备" + (i+1) + ": " + JSON.stringify(devices[i]));
  312.             }
  313.             
  314.             return devices;
  315.         } else {
  316.             printl("✗ 查询失败");
  317.             return null;
  318.         }
  319.     } catch (e) {
  320.         printl("✗ 查询设备列表异常:" + e);
  321.         return null;
  322.     }
  323. }

  324. // =============================================================================
  325. // 8. 综合示例 - 完整业务流程
  326. // =============================================================================

  327. /**
  328. * 完整业务流程演示
  329. */
  330. function mainWorkflow() {
  331.     printl("========================================");
  332.     printl("    卡密管理系统 - 完整工作流程演示");
  333.     printl("========================================");
  334.    
  335.     // 步骤 1: 获取 Token
  336.     var token = getToken();
  337.     if (!token) {
  338.         printl("✗ 无法获取 token,流程终止");
  339.         return;
  340.     }
  341.    
  342.     // 步骤 2: 添加新卡密
  343.     var newCard = "t2026040001";
  344.     var success = addCard(token, newCard, "month", 2, "测试卡密");
  345.     if (success) {
  346.         printl("✓ 新卡密创建成功:" + newCard);
  347.     } else {
  348.         printl("✗ 新卡密创建失败");
  349.     }
  350.    
  351.     // 步骤 3: 查询卡密信息
  352.     var cardInfo = getCardInfo(token, newCard);
  353.     if (cardInfo) {
  354.         printl("✓ 卡密信息查询成功");
  355.     }
  356.    
  357.     // 步骤 4: 查询设备列表
  358.     var devices = getCardDevices(token, newCard);
  359.     if (devices !== null) {
  360.         printl("✓ 设备列表查询成功");
  361.     }
  362.    
  363.     // 步骤 5: 续费卡密
  364.     var renewSuccess = renewCard(token, newCard, "quarter", 3, "续费为季卡");
  365.     if (renewSuccess) {
  366.         printl("✓ 卡密续费成功");
  367.     }
  368.    
  369.     // 步骤 6: 换机激活示例
  370.     var currentImei = device.getIMEI();
  371.     var testCard = "t2026040002";
  372.     var activateSuccess = activateNewDevice(testCard, currentImei);
  373.     if (activateSuccess) {
  374.         printl("✓ 换机激活成功");
  375.     }
  376.    
  377.     printl("========================================");
  378.     printl("    工作流程演示完成");
  379.     printl("========================================");
  380. }

  381. // =============================================================================
  382. // 9. 实用工具函数
  383. // =============================================================================

  384. /**
  385. * 批量创建卡密
  386. * @param {String} token 管理 token
  387. * @param {String} prefix 卡密前缀
  388. * @param {Number} count 创建数量
  389. * @param {String} cardType 卡类型
  390. * @param {Number} devices 设备数
  391. */
  392. function batchCreateCards(token, prefix, count, cardType, devices) {
  393.     printl("=== 批量创建卡密 ===");
  394.     printl("前缀:" + prefix);
  395.     printl("数量:" + count);
  396.     printl("类型:" + cardType);
  397.    
  398.     var successCount = 0;
  399.     var failCount = 0;
  400.    
  401.     for (var i = 0; i < count; i++) {
  402.         // 生成卡密:前缀 + 时间戳后 6 位
  403.         var timestamp = new Date().getTime().toString().substr(-6);
  404.         var cardCode = prefix + timestamp + String(i).padStart(3, '0');
  405.         
  406.         printl("正在创建第 " + (i+1) + " 个卡密:" + cardCode);
  407.         
  408.         if (addCard(token, cardCode, cardType, devices, "批量创建")) {
  409.             successCount++;
  410.         } else {
  411.             failCount++;
  412.         }
  413.         
  414.         // 避免请求过快,暂停 100ms
  415.         sleep(100);
  416.     }
  417.    
  418.     printl("=== 批量创建结果 ===");
  419.     printl("成功:" + successCount + " 个");
  420.     printl("失败:" + failCount + " 个");
  421. }

  422. /**
  423. * 检查卡密状态
  424. * @param {String} token 管理 token
  425. * @param {String} card 卡密
  426. * @returns {Object} 卡密状态信息
  427. */
  428. function checkCardStatus(token, card) {
  429.     var info = getCardInfo(token, card);
  430.    
  431.     if (!info) {
  432.         return {
  433.             valid: false,
  434.             message: "卡密不存在或查询失败"
  435.         };
  436.     }
  437.    
  438.     // 根据实际响应结构调整判断逻辑
  439.     return {
  440.         valid: true,
  441.         info: info,
  442.         message: "卡密有效"
  443.     };
  444. }

  445. // =============================================================================
  446. // 10. JavaScript 变量综合示例(基于文档说明)
  447. // =============================================================================

  448. /**
  449. * JavaScript 变量基础示例 - 严格按照文档说明
  450. * 演示变量的基本概念、声明、赋值和使用
  451. */
  452. function variableBasicsExample() {
  453.     printl("========================================");
  454.     printl("    JavaScript 变量基础示例");
  455.     printl("========================================");
  456.    
  457.     // 1. 基本变量声明和算术运算(文档第3-11行)
  458.     var x = 5;
  459.     var y = 6;
  460.     var z = x + y;
  461.     printl("【基本变量】x=" + x + ", y=" + y + ", z=x+y=" + z);
  462.     printl("说明:变量就像代数中的字母,用于存储数据");
  463.    
  464.     // 2. 变量命名规则(文档第13-19行)
  465.     var age = 25;              // 描述性名称
  466.     var sum = 100;             // 描述性名称
  467.     var totalVolume = 500;     // 驼峰命名
  468.     var _private = "私有";     // 下划线开头(不推荐)
  469.     var $special = "特殊";     // $开头(不推荐)
  470.     printl("【变量命名】age=" + age + ", sum=" + sum + ", totalVolume=" + totalVolume);
  471.     printl("注意:变量名区分大小写,y 和 Y 是不同的变量");
  472.    
  473.     // 3. 数据类型 - 数字和字符串(文档第21-30行)
  474.     var pi = 3.14;             // 数值,不用引号
  475.     var person = "John Doe";   // 字符串,用双引号
  476.     var answer = 'Yes I am!';  // 字符串,用单引号
  477.     var wrongNumber = "100";   // 这是字符串,不是数字!
  478.     printl("【数据类型】");
  479.     printl("数值 pi=" + pi + " (类型: " + typeof pi + ")");
  480.     printl("字符串 person=" + person + " (类型: " + typeof person + ")");
  481.     printl("字符串形式的数字 wrongNumber=" + wrongNumber + " (类型: " + typeof wrongNumber + ")");
  482.    
  483.     // 4. 常量声明(文档第27-28行)
  484.     const PI_CONSTANT = 3.141592653589793;
  485.     printl("【常量】PI_CONSTANT=" + PI_CONSTANT);
  486.     printl("说明:const 表示常量,值不能修改");
  487.    
  488.     // 5. 声明变量但不赋值(文档第32-40行)
  489.     var carname;               // 声明但未赋值
  490.     printl("【未初始化变量】carname=" + carname + " (值为 undefined)");
  491.     carname = "Volvo";         // 后续赋值
  492.     printl("赋值后 carname=" + carname);
  493.    
  494.     // 6. 一条语句声明多个变量(文档第42-48行)
  495.     var lastname = "Doe", age2 = 30, job = "carpenter";
  496.     printl("【多变量声明】lastname=" + lastname + ", age=" + age2 + ", job=" + job);
  497.    
  498.     var a, b, c = 1;
  499.     printl("部分初始化:a=" + a + " (undefined), b=" + b + " (undefined), c=" + c);
  500. }

  501. /**
  502. * 变量作用域示例 - 全局变量和局部变量(文档第62-76行)
  503. */
  504. function variableScopeExample() {
  505.     printl("========================================");
  506.     printl("    变量作用域示例");
  507.     printl("========================================");
  508.    
  509.     // 全局变量(文档第62-67行)
  510.     var carName = "Volvo";
  511.     printl("【全局变量】在函数外声明: carName=" + carName);
  512.    
  513.     function myFunction() {
  514.         // 这里可以使用全局变量 carName
  515.         printl("  函数内部访问全局变量: carName=" + carName);
  516.         
  517.         // 局部变量(文档第70-76行)
  518.         var localCarName = "BMW";
  519.         printl("  函数内部声明局部变量: localCarName=" + localCarName);
  520.     }
  521.    
  522.     myFunction();
  523.     printl("【注意】在函数外无法访问局部变量 localCarName");
  524.    
  525.     // 演示全局变量可以在任何地方使用
  526.     printl("函数执行后仍可访问全局变量: carName=" + carName);
  527. }

  528. /**
  529. * 块级作用域示例 - let 和 const(文档第79-107行)
  530. */
  531. function blockScopeExample() {
  532.     printl("========================================");
  533.     printl("    块级作用域示例 (let/const)");
  534.     printl("========================================");
  535.    
  536.     // 1. var 不具备块级作用域(文档第80-81行)
  537.     printl("【var 的作用域】");
  538.     {
  539.         var x = 2;
  540.         printl("  在代码块内声明 var x=" + x);
  541.     }
  542.     printl("  在代码块外仍可访问: x=" + x + " (var 没有块级作用域)");
  543.    
  544.     // 2. let 具备块级作用域(文档第83-85行)
  545.     printl("【let 的作用域】");
  546.     {
  547.         let y = 3;
  548.         printl("  在代码块内声明 let y=" + y);
  549.     }
  550.     printl("  在代码块外无法访问 let y (会报错)");
  551.    
  552.     // 3. 重新定义变量的对比(文档第87-99行)
  553.     printl("【重新定义变量对比】");
  554.     var a = 10;
  555.     printl("  var a=10 (外部)");
  556.     {
  557.         var a = 2;  // 这会覆盖外部的 a
  558.         printl("  var a=2 (内部块)");
  559.     }
  560.     printl("  块执行后 a=" + a + " (被内部覆盖了)");
  561.    
  562.     var b = 10;
  563.     printl("  var b=10 (外部)");
  564.     {
  565.         let b = 2;  // 这是新的块级变量,不影响外部
  566.         printl("  let b=2 (内部块)");
  567.     }
  568.     printl("  块执行后 b=" + b + " (保持原值,未被影响)");
  569.    
  570.     // 4. 循环中的作用域(文档第101-107行)
  571.     printl("【循环中的作用域】");
  572.     var i = 5;
  573.     for (var i = 0; i < 3; i++) {
  574.         // 循环中使用 var
  575.     }
  576.     printl("  使用 var: 循环后 i=" + i + " (循环影响了外部变量)");
  577.    
  578.     var j = 5;
  579.     for (let j = 0; j < 3; j++) {
  580.         // 循环中使用 let
  581.     }
  582.     printl("  使用 let: 循环后 j=" + j + " (外部变量未受影响)");
  583. }

  584. /**
  585. * 变量重新声明和重置示例(文档第109-147行)
  586. */
  587. function variableRedeclarationExample() {
  588.     printl("========================================");
  589.     printl("    变量重新声明和重置");
  590.     printl("========================================");
  591.    
  592.     // 1. 局部变量:var 和 let 类似(文档第109-115行)
  593.     printl("【函数内的局部变量】");
  594.     function testVar() {
  595.         var carName = "Volvo";
  596.         printl("  var 声明: carName=" + carName);
  597.     }
  598.     function testLet() {
  599.         let carName = "Volvo";
  600.         printl("  let 声明: carName=" + carName);
  601.     }
  602.     testVar();
  603.     testLet();
  604.     printl("  两者在函数内都是局部作用域");
  605.    
  606.     // 2. 全局变量:var 和 let 类似(文档第117-123行)
  607.     printl("【全局变量】");
  608.     var globalX = 2;
  609.     let globalY = 2;
  610.     printl("  var globalX=" + globalX + " (全局作用域)");
  611.     printl("  let globalY=" + globalY + " (全局作用域)");
  612.    
  613.     // 3. 重置变量(文档第124-147行)
  614.     printl("【变量重置规则】");
  615.    
  616.     // var 可以多次声明
  617.     var m = 2;
  618.     var m = 3;  // 合法
  619.     printl("  var m=2; var m=3; → m=" + m + " (合法)");
  620.    
  621.     // let 不能在同一作用域重复声明
  622.     var n = 2;
  623.     // let n = 3;  // 不合法!会报错
  624.     printl("  var n=2; let n=3; → 不合法(同一作用域)");
  625.    
  626.     // 在不同块中可以
  627.     let p = 2;
  628.     printl("  let p=2 (外部)");
  629.     {
  630.         let p = 3;  // 合法,不同块
  631.         printl("  { let p=3 } (内部块,合法)");
  632.     }
  633.     printl("  外部 p=" + p + " (未被影响)");
  634.    
  635.     // let 和 var 不能混用
  636.     let q = 2;
  637.     // var q = 3;  // 不合法
  638.     printl("  let q=2; var q=3; → 不合法(同一作用域)");
  639. }

  640. /**
  641. * const 关键字详解(文档第155-214行)
  642. */
  643. function constKeywordExample() {
  644.     printl("========================================");
  645.     printl("    const 关键字详解");
  646.     printl("========================================");
  647.    
  648.     // 1. const 必须初始化(文档第156-171行)
  649.     printl("【const 基本规则】");
  650.     const PI = 3.141592653589793;
  651.     printl("  const PI=" + PI + " (正确:声明时初始化)");
  652.    
  653.     // const PI2;  // 错误!const 必须初始化
  654.     // PI2 = 3.14;  // 这样也不行
  655.     printl("  const PI2; → 错误(const 必须初始化)");
  656.    
  657.     // 2. const 不能重新赋值(文档第156-157行)
  658.     printl("【const 不可重新赋值】");
  659.     const MAX_VALUE = 100;
  660.     printl("  const MAX_VALUE=" + MAX_VALUE);
  661.     // MAX_VALUE = 200;  // 报错!
  662.     // MAX_VALUE = MAX_VALUE + 10;  // 报错!
  663.     printl("  MAX_VALUE=200; → 报错(const 不能重新赋值)");
  664.    
  665.     // 3. const 和 let 的区别(文档第159-164行)
  666.     printl("【const vs let】");
  667.     printl("  相同点:都是块级作用域");
  668.     printl("  相同点:都不能和同作用域其他变量同名");
  669.     printl("  不同点:const 必须初始化,let 不用");
  670.     printl("  不同点:const 不能重新赋值,let 可以");
  671.    
  672.     // 4. const 并非真正的常量 - 对象和数组可变(文档第173-188行)
  673.     printl("【const 的本质:常量引用,非常量值】");
  674.    
  675.     // 对象示例
  676.     const car = {type:"Fiat", model:"500", color:"white"};
  677.     printl("  const car = " + JSON.stringify(car));
  678.     car.color = "red";      // 可以修改属性
  679.     car.owner = "Johnson";  // 可以添加属性
  680.     printl("  修改后: " + JSON.stringify(car));
  681.     printl("  说明:可以修改对象的属性和添加新属性");
  682.    
  683.     // const car2 = {type:"Volvo"};  // 错误!不能重新赋值整个对象
  684.     printl("  car={type:'Volvo'}; → 报错(不能重新赋值)");
  685.    
  686.     // 数组示例
  687.     const cars = ["Saab", "Volvo", "BMW"];
  688.     printl("  const cars = " + JSON.stringify(cars));
  689.     cars[0] = "Toyota";     // 可以修改元素
  690.     cars.push("Audi");      // 可以添加元素
  691.     printl("  修改后: " + JSON.stringify(cars));
  692.     printl("  说明:可以修改数组元素和添加新元素");
  693.    
  694.     // const cars2 = ["Toyota", "Volvo"];  // 错误!不能重新赋值整个数组
  695.     printl("  cars=['Toyota','Volvo']; → 报错(不能重新赋值)");
  696.    
  697.     // 5. const 的重置规则(文档第189-214行)
  698.     printl("【const 重置规则总结】");
  699.     const r = 2;
  700.     printl("  const r=2; (合法)");
  701.     // const r = 3;  // 不合法
  702.     // r = 3;        // 不合法
  703.     // var r = 3;    // 不合法
  704.     // let r = 3;    // 不合法
  705.     printl("  之后不能再声明或赋值 r (所有方式都不合法)");
  706.    
  707.     printl("  Rhino引擎说明:");
  708.     printl("  在AIWROK的Rhino引擎中,const在函数作用域内不能重复声明");
  709.     printl("  即使在不同块中也会报错,这与标准ES6行为不同");
  710.     printl("  建议:在Rhino中避免在同一函数内多次使用同名const");
  711. }

  712. /**
  713. * 变量提升示例(Hoisting)(文档第149-153行)
  714. */
  715. function hoistingExample() {
  716.     printl("========================================");
  717.     printl("    变量提升示例 (Hoisting)");
  718.     printl("========================================");
  719.    
  720.     // 1. var 变量提升(文档第150-151行)
  721.     printl("【var 变量提升】");
  722.     printl("  在声明前使用 carName: " + carName);
  723.     var carName;  // 变量会被提升到作用域顶部
  724.     carName = "Volvo";
  725.     printl("  声明并赋值后: " + carName);
  726.     printl("  说明:var 声明的变量会被提升,但赋值为 undefined");
  727.    
  728.     // 2. let 变量不提升(文档第152-153行)
  729.     printl("【let 变量不提升】");
  730.     // printl("  在声明前使用 letCar: " + letCar);  // 报错!
  731.     let letCar = "BMW";
  732.     printl("  声明后使用 letCar: " + letCar);
  733.     printl("  说明:let 不会被提升,声明前使用会报错(暂时性死区)");
  734.    
  735.     // 3. 实际演示
  736.     printl("【实际对比】");
  737.    
  738.     function testHoisting() {
  739.         printl("  var 测试:");
  740.         printl("    声明前: x=" + x);  // undefined
  741.         var x = 5;
  742.         printl("    声明后: x=" + x);  // 5
  743.         
  744.         printl("  let 测试:");
  745.         // printl("    声明前: y=" + y);  // 报错!
  746.         let y = 10;
  747.         printl("    声明后: y=" + y);  // 10
  748.     }
  749.    
  750.     testHoisting();
  751. }

  752. /**
  753. * 实际应用示例 - 综合使用各种变量类型
  754. */
  755. function practicalVariableUsage() {
  756.     printl("========================================");
  757.     printl("    实际应用 - 综合示例");
  758.     printl("========================================");
  759.    
  760.     // 使用 const 定义配置常量
  761.     const CONFIG = {
  762.         appName: "AIWROK",
  763.         version: "1.0.0",
  764.         maxRetries: 3
  765.     };
  766.     printl("【应用配置】");
  767.     printl("  应用名: " + CONFIG.appName);
  768.     printl("  版本: " + CONFIG.version);
  769.     printl("  最大重试: " + CONFIG.maxRetries);
  770.    
  771.     // 使用 let 定义可变状态
  772.     let retryCount = 0;
  773.     let isConnected = false;
  774.     printl("【运行时状态】");
  775.     printl("  重试次数: " + retryCount);
  776.     printl("  连接状态: " + isConnected);
  777.    
  778.     // 模拟状态变化
  779.     isConnected = true;
  780.     retryCount = 1;
  781.     printl("  状态更新后:");
  782.     printl("  重试次数: " + retryCount);
  783.     printl("  连接状态: " + isConnected);
  784.    
  785.     // 使用 var 定义临时变量
  786.     var tempResult = 10 + 20;
  787.     printl("【临时计算】");
  788.     printl("  10 + 20 = " + tempResult);
  789.    
  790.     // 实际应用场景:卡密管理系统中的变量使用
  791.     printl("【卡密系统示例】");
  792.     const CARD_RULES = {
  793.         minLength: 5,
  794.         mustStartWithLetter: true,
  795.         validTypes: ["day", "month", "quarter", "halfYear", "year"]
  796.     };
  797.    
  798.     var cardCode = "t2026040001";
  799.     var cardType = "month";
  800.     var devices = 2;
  801.    
  802.     printl("  卡密: " + cardCode);
  803.     printl("  类型: " + cardType);
  804.     printl("  设备数: " + devices);
  805.     printl("  规则: 最小长度" + CARD_RULES.minLength + "位,必须字母开头");
  806. }



  807. /**
  808. * 高级变量模式 - 闭包和数据封装
  809. */
  810. function advancedVariablePatterns() {
  811.     printl("========================================");
  812.     printl("    高级变量模式 - 闭包");
  813.     printl("========================================");
  814.    
  815.     // 使用闭包创建私有变量
  816.     printl("【计数器模块 - 使用闭包】");
  817.     var counter = (function() {
  818.         var privateCount = 0;  // 私有变量,外部无法直接访问
  819.         
  820.         return {
  821.             increment: function() {
  822.                 privateCount++;
  823.                 return privateCount;
  824.             },
  825.             decrement: function() {
  826.                 privateCount--;
  827.                 return privateCount;
  828.             },
  829.             getCount: function() {
  830.                 return privateCount;
  831.             }
  832.         };
  833.     })();
  834.    
  835.     printl("  初始值: " + counter.getCount());
  836.     printl("  递增后: " + counter.increment());
  837.     printl("  再递增: " + counter.increment());
  838.     printl("  递减后: " + counter.decrement());
  839.     printl("  说明:privateCount 是私有变量,只能通过方法访问");
  840.    
  841.     // 工厂函数模式
  842.     printl("【工厂函数 - 创建用户对象】");
  843.     function createUser(name, age) {
  844.         var privateAge = age;  // 私有变量
  845.         
  846.         return {
  847.             getName: function() {
  848.                 return name;
  849.             },
  850.             getAge: function() {
  851.                 return privateAge;
  852.             },
  853.             celebrateBirthday: function() {
  854.                 privateAge++;
  855.                 printl("    " + name + " 过生日了!现在 " + privateAge + " 岁");
  856.             }
  857.         };
  858.     }
  859.    
  860.     var user1 = createUser("Alice", 25);
  861.     var user2 = createUser("Bob", 30);
  862.    
  863.     printl("  " + user1.getName() + " 的年龄: " + user1.getAge());
  864.     printl("  " + user2.getName() + " 的年龄: " + user2.getAge());
  865.    
  866.     user1.celebrateBirthday();
  867.     printl("  " + user1.getName() + " 的新年龄: " + user1.getAge());
  868.     printl("  说明:每个用户实例都有独立的私有变量");
  869.    
  870.     // 模块模式
  871.     printl("【模块模式 - 组织代码】");
  872.     var MathHelper = (function() {
  873.         const PI = 3.141592653589793;  // 常量
  874.         
  875.         return {
  876.             add: function(a, b) {
  877.                 return a + b;
  878.             },
  879.             multiply: function(a, b) {
  880.                 return a * b;
  881.             },
  882.             circleArea: function(radius) {
  883.                 return PI * radius * radius;
  884.             }
  885.         };
  886.     })();
  887.    
  888.     printl("  加法: 5 + 3 = " + MathHelper.add(5, 3));
  889.     printl("  乘法: 4 × 6 = " + MathHelper.multiply(4, 6));
  890.     printl("  圆面积(r=5): " + MathHelper.circleArea(5).toFixed(2));
  891.     printl("  说明:PI 是模块内部的常量,外部无法修改");
  892. }

  893. /**
  894. * 运行所有变量示例
  895. */
  896. function runAllVariableExamples() {
  897.     printl("########################################");
  898.     printl("#   JavaScript 变量综合示例大全       #");
  899.     printl("########################################");
  900.    
  901.     // 依次运行各个示例函数,每个示例之间间隔2秒
  902.     variableBasicsExample();
  903.     sleep.second(2);  // 暂停2秒
  904.    
  905.     variableScopeExample();
  906.     sleep.second(2);  // 暂停2秒
  907.    
  908.     blockScopeExample();
  909.     sleep.second(2);  // 暂停2秒
  910.    
  911.     variableRedeclarationExample();
  912.     sleep.second(2);  // 暂停2秒
  913.    
  914.     constKeywordExample();
  915.     sleep.second(2);  // 暂停2秒
  916.    
  917.     hoistingExample();
  918.     sleep.second(2);  // 暂停2秒
  919.    
  920.     practicalVariableUsage();
  921.     sleep.second(2);  // 暂停2秒
  922.    
  923.     advancedVariablePatterns();
  924.    
  925.     printl("########################################");
  926.     printl("#   所有变量示例运行完成              #");
  927.     printl("########################################");
  928. }

  929. // =============================================================================
  930. // 11. 主程序入口(包含变量示例)
  931. // =============================================================================

  932. // 运行完整工作流程演示
  933. mainWorkflow();

  934. // 运行 JavaScript 变量综合示例
  935. runAllVariableExamples();

  936. // 示例:批量创建卡密(取消注释以使用)
  937. /*
  938. var token = getToken();
  939. if (token) {
  940.     batchCreateCards(token, "t2026", 5, "day", 1);
  941. }
  942. */

  943. // 示例:单独调用某个功能
  944. /*
  945. // 获取当前设备 IMEI
  946. var imei = device.getIMEI();
  947. printl("当前设备 IMEI: " + imei);

  948. // 换机激活
  949. activateNewDevice("t2026040001", imei);
  950. */

  951. printl("程序执行完毕!");
复制代码


















欢迎光临 B2B网络软件 (http://bbs.niubt.cn/) Powered by Discuz! X3.2