123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328 |
- <!DOCTYPE html>
- <html>
- <head>
- <title>业务代码修复测试页面</title>
- <meta charset="utf-8">
- <style>
- body {
- font-family: Arial, sans-serif;
- margin: 20px;
- background-color: #f5f5f5;
- }
- .container {
- max-width: 1200px;
- margin: 0 auto;
- background: white;
- padding: 20px;
- border-radius: 8px;
- box-shadow: 0 2px 10px rgba(0,0,0,0.1);
- }
- .section {
- margin: 20px 0;
- padding: 15px;
- border: 1px solid #ddd;
- border-radius: 5px;
- background: #f9f9f9;
- }
- .test-group {
- display: flex;
- flex-wrap: wrap;
- gap: 10px;
- margin: 10px 0;
- }
- .btn {
- padding: 8px 16px;
- margin: 2px;
- background: #007bff;
- color: white;
- border: none;
- border-radius: 4px;
- cursor: pointer;
- font-size: 12px;
- }
- .btn:hover { background: #0056b3; }
- .btn.success { background: #28a745; }
- .btn.warning { background: #ffc107; color: #000; }
- .btn.danger { background: #dc3545; }
- .result {
- margin-top: 10px;
- padding: 10px;
- background: #fff;
- border-radius: 3px;
- font-family: monospace;
- white-space: pre-wrap;
- max-height: 300px;
- overflow-y: auto;
- font-size: 11px;
- border: 1px solid #ddd;
- }
- .result.success { background: #d4edda; color: #155724; border-color: #c3e6cb; }
- .result.error { background: #f8d7da; color: #721c24; border-color: #f5c6cb; }
- .test-url {
- font-family: monospace;
- font-size: 11px;
- color: #666;
- margin: 5px 0;
- word-break: break-all;
- }
- h1 { color: #333; text-align: center; }
- h2 { color: #555; border-bottom: 2px solid #007bff; padding-bottom: 5px; }
- h3 { color: #666; margin-top: 15px; }
- .status {
- padding: 5px 10px;
- border-radius: 3px;
- font-weight: bold;
- text-align: center;
- margin: 10px 0;
- }
- .status.success { background: #d4edda; color: #155724; }
- .status.error { background: #f8d7da; color: #721c24; }
- </style>
- </head>
- <body>
- <div class="container">
- <h1>🔧 业务代码修复测试页面</h1>
- <div id="serviceStatus" class="status error">服务状态检查中...</div>
- <div class="section">
- <h2>📋 修复说明</h2>
- <p><strong>问题:</strong>当URL格式为 <code>huashi_01101</code> 或 <code>jiangsu_01101</code> 时,业务代码(01101)被错误地当作操作动作处理。</p>
- <p><strong>修复:</strong>添加了 <code>IsBusinessCode()</code> 方法检测5位数字格式,如果是业务代码则自动使用默认的 <code>readcard</code> 操作。</p>
- <p><strong>向后兼容:</strong>不影响现有的正确调用方式,如 <code>huashi_readcard</code>、<code>jiangsu_init</code> 等。</p>
- </div>
- <!-- 华视读卡器测试 -->
- <div class="section">
- <h2>🆔 华视读卡器测试</h2>
-
- <h3>✅ 正常调用(应该保持正常工作)</h3>
- <div class="test-group">
- <button class="btn success" onclick="testCall('huashi_readcard', 'huashiNormalResult')">huashi_readcard</button>
- <button class="btn" onclick="testCall('huashi_init_1001', 'huashiNormalResult')">huashi_init_1001</button>
- <button class="btn" onclick="testCall('huashi_status', 'huashiNormalResult')">huashi_status</button>
- <button class="btn" onclick="testCall('huashi_close', 'huashiNormalResult')">huashi_close</button>
- </div>
- <div class="test-url">正常URL格式:http://localhost:8321/readcard/entry?param=huashi_readcard</div>
- <div id="huashiNormalResult" class="result">等待测试...</div>
- <h3>🔧 业务代码修复测试(之前会报错,现在应该正常)</h3>
- <div class="test-group">
- <button class="btn warning" onclick="testCall('huashi_01101', 'huashiFixResult')">huashi_01101</button>
- <button class="btn warning" onclick="testCall('huashi_01201', 'huashiFixResult')">huashi_01201</button>
- <button class="btn warning" onclick="testCall('huashi_01103', 'huashiFixResult')">huashi_01103</button>
- <button class="btn warning" onclick="testCall('huashi_01203', 'huashiFixResult')">huashi_01203</button>
- <button class="btn warning" onclick="testCall('huashi_01301', 'huashiFixResult')">huashi_01301</button>
- </div>
- <div class="test-url">修复的URL格式:http://localhost:8321/readcard/entry?param=huashi_01101 (01101被识别为业务代码,自动转为readcard操作)</div>
- <div id="huashiFixResult" class="result">等待测试...</div>
- <h3>❌ 错误操作测试(应该报错)</h3>
- <div class="test-group">
- <button class="btn danger" onclick="testCall('huashi_invalid', 'huashiErrorResult')">huashi_invalid</button>
- <button class="btn danger" onclick="testCall('huashi_12345a', 'huashiErrorResult')">huashi_12345a(非纯数字)</button>
- <button class="btn danger" onclick="testCall('huashi_123456', 'huashiErrorResult')">huashi_123456(6位数字)</button>
- </div>
- <div class="test-url">错误URL格式:http://localhost:8321/readcard/entry?param=huashi_invalid</div>
- <div id="huashiErrorResult" class="result">等待测试...</div>
- </div>
- <!-- 江苏医保测试 -->
- <div class="section">
- <h2>🏥 江苏医保测试</h2>
-
- <h3>✅ 正常调用(应该保持正常工作)</h3>
- <div class="test-group">
- <button class="btn success" onclick="testCall('jiangsu_readcard', 'jiangsuNormalResult')">jiangsu_readcard</button>
- <button class="btn" onclick="testCall('jiangsu_init', 'jiangsuNormalResult')">jiangsu_init</button>
- <button class="btn" onclick="testCall('jiangsu_status', 'jiangsuNormalResult')">jiangsu_status</button>
- <button class="btn" onclick="testCall('jiangsu_checkdll', 'jiangsuNormalResult')">jiangsu_checkdll</button>
- </div>
- <div class="test-url">正常URL格式:http://localhost:8321/readcard/entry?param=jiangsu_readcard</div>
- <div id="jiangsuNormalResult" class="result">等待测试...</div>
- <h3>🔧 业务代码修复测试(之前会报错,现在应该正常)</h3>
- <div class="test-group">
- <button class="btn warning" onclick="testCall('jiangsu_01101', 'jiangsuFixResult')">jiangsu_01101</button>
- <button class="btn warning" onclick="testCall('jiangsu_01201', 'jiangsuFixResult')">jiangsu_01201</button>
- <button class="btn warning" onclick="testCall('jiangsu_01103', 'jiangsuFixResult')">jiangsu_01103</button>
- <button class="btn warning" onclick="testCall('jiangsu_01203', 'jiangsuFixResult')">jiangsu_01203</button>
- <button class="btn warning" onclick="testCall('jiangsu_01301', 'jiangsuFixResult')">jiangsu_01301</button>
- </div>
- <div class="test-url">修复的URL格式:http://localhost:8321/readcard/entry?param=jiangsu_01101 (01101被识别为业务代码,自动转为readcard操作)</div>
- <div id="jiangsuFixResult" class="result">等待测试...</div>
- <h3>❌ 错误操作测试(应该报错)</h3>
- <div class="test-group">
- <button class="btn danger" onclick="testCall('jiangsu_invalid', 'jiangsuErrorResult')">jiangsu_invalid</button>
- <button class="btn danger" onclick="testCall('jiangsu_12345a', 'jiangsuErrorResult')">jiangsu_12345a(非纯数字)</button>
- <button class="btn danger" onclick="testCall('jiangsu_123456', 'jiangsuErrorResult')">jiangsu_123456(6位数字)</button>
- </div>
- <div class="test-url">错误URL格式:http://localhost:8321/readcard/entry?param=jiangsu_invalid</div>
- <div id="jiangsuErrorResult" class="result">等待测试...</div>
- </div>
- <!-- 其他功能测试 -->
- <div class="section">
- <h2>🔍 其他功能完整性测试</h2>
- <p>验证修改没有影响现有的其他读卡功能:</p>
-
- <div class="test-group">
- <button class="btn" onclick="testCall('sicard', 'otherResult')">sicard(社保卡)</button>
- <button class="btn" onclick="testCall('idcard', 'otherResult')">idcard(身份证)</button>
- <button class="btn" onclick="testCall('qrcode_01101', 'otherResult')">qrcode_01101(电子凭证)</button>
- <button class="btn" onclick="testCall('idcard2_01101', 'otherResult')">idcard2_01101(身份证+业务码)</button>
- </div>
- <div class="test-url">其他功能URL:http://localhost:8321/readcard/entry?param=sicard</div>
- <div id="otherResult" class="result">等待测试...</div>
- </div>
- <div class="section">
- <h2>📊 测试总结</h2>
- <div id="testSummary" class="result">
- 测试说明:
- 1. ✅ 绿色按钮:正常功能,应该保持原有工作状态
- 2. 🔧 黄色按钮:修复的功能,之前报错现在应该正常
- 3. ❌ 红色按钮:错误测试,应该报错但错误信息要友好
- 4. 🔍 蓝色按钮:其他功能,验证没有被破坏
- 期望结果:
- - huashi_01101 应该等效于 huashi_readcard
- - jiangsu_01101 应该等效于 jiangsu_readcard
- - 5位数字被识别为业务代码,自动转为默认操作
- - 非5位数字或包含字母的仍然作为无效操作处理
- </div>
- </div>
- </div>
- <script>
- const BASE_URL = 'http://localhost:8321';
-
- // 页面加载时检查服务状态
- window.onload = function() {
- checkServiceStatus();
- };
- // 检查服务状态
- async function checkServiceStatus() {
- try {
- const response = await fetch(`${BASE_URL}/readcard/entry?param=sicard`);
- const data = await response.json();
-
- if (response.ok) {
- showStatus('✅ ThCardReader 服务运行正常', 'success');
- } else {
- showStatus('⚠️ 服务响应异常', 'error');
- }
- } catch (error) {
- showStatus('❌ 无法连接到 ThCardReader 服务 (http://localhost:8321)', 'error');
- }
- }
- // 显示状态
- function showStatus(message, type) {
- const statusDiv = document.getElementById('serviceStatus');
- statusDiv.textContent = message;
- statusDiv.className = `status ${type}`;
- }
- // 测试调用
- async function testCall(param, resultElementId) {
- const resultElement = document.getElementById(resultElementId);
- const url = `${BASE_URL}/readcard/entry?param=${param}`;
-
- resultElement.textContent = `🔄 正在测试: ${param}\n请求URL: ${url}\n\n请等待...`;
- resultElement.className = 'result';
-
- try {
- const startTime = Date.now();
- const response = await fetch(url);
- const data = await response.json();
- const endTime = Date.now();
- const duration = endTime - startTime;
-
- let resultText = `✅ 测试完成: ${param}\n`;
- resultText += `⏱️ 请求时间: ${duration}ms\n`;
- resultText += `📡 HTTP状态: ${response.status}\n`;
- resultText += `🔗 请求URL: ${url}\n\n`;
- resultText += `📄 响应数据:\n${JSON.stringify(data, null, 2)}`;
-
- resultElement.textContent = resultText;
-
- // 根据结果设置样式
- if (data.code === 200 || data.success === true) {
- resultElement.className = 'result success';
- } else {
- resultElement.className = 'result error';
- }
-
- // 记录到总结中
- updateTestSummary(param, data, duration);
-
- } catch (error) {
- let errorText = `❌ 测试失败: ${param}\n`;
- errorText += `🔗 请求URL: ${url}\n\n`;
- errorText += `💥 错误信息: ${error.message}`;
-
- resultElement.textContent = errorText;
- resultElement.className = 'result error';
-
- updateTestSummary(param, { error: error.message }, 0);
- }
- }
- // 更新测试总结
- function updateTestSummary(param, result, duration) {
- const summaryElement = document.getElementById('testSummary');
-
- let status;
- if (result.error) {
- status = '❌ 网络错误';
- } else if (result.code === 200 || result.success === true) {
- status = '✅ 成功';
- } else {
- status = '⚠️ 业务错误';
- }
-
- const logEntry = `[${new Date().toLocaleTimeString()}] ${param} - ${status} (${duration}ms)`;
-
- // 添加到现有内容
- const currentText = summaryElement.textContent;
- const lines = currentText.split('\n');
-
- // 找到测试记录的开始位置
- let insertIndex = lines.length;
- for (let i = 0; i < lines.length; i++) {
- if (lines[i].includes('测试记录:')) {
- insertIndex = i + 1;
- break;
- }
- }
-
- // 如果没有找到测试记录标题,添加它
- if (insertIndex === lines.length) {
- lines.push('', '🔍 测试记录:');
- insertIndex = lines.length;
- }
-
- lines.splice(insertIndex, 0, logEntry);
- summaryElement.textContent = lines.join('\n');
- }
- // 批量测试
- async function runAllTests() {
- const tests = [
- { param: 'huashi_readcard', result: 'huashiNormalResult' },
- { param: 'huashi_01101', result: 'huashiFixResult' },
- { param: 'jiangsu_readcard', result: 'jiangsuNormalResult' },
- { param: 'jiangsu_01101', result: 'jiangsuFixResult' },
- { param: 'sicard', result: 'otherResult' }
- ];
-
- for (const test of tests) {
- await testCall(test.param, test.result);
- await new Promise(resolve => setTimeout(resolve, 500)); // 500ms间隔
- }
- }
- </script>
- </body>
- </html>
|