diff --git a/server-example/PATH.txt b/server-example/PATH.txt deleted file mode 100644 index a5f0db3..0000000 --- a/server-example/PATH.txt +++ /dev/null @@ -1 +0,0 @@ -PATH=C:\Program Files (x86)\Razer Chroma SDK\bin;C:\Program Files\Razer Chroma SDK\bin;C:\Program Files\Java\jdk1.8.0_202\bin;C:\Program Files\Java\jdk1.8.0_202;C:\Program Files\Common Files\Oracle\Java\javapath;D:\vm\bin\;C:\Program Files (x86)\Razer Chroma SDK\bin;D:\apache-tomcat-8.0.32\bin;C:\Program Files\Razer Chroma SDK\bin;C:\Program Files (x86)\Razer\ChromaBroadcast\bin;C:\Program Files\Razer\ChromaBroadcast\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;C:\Windows\system32\config\systemprofile\AppData\Local\Microsoft\WindowsApps;C:\Program Files\Microsoft SQL Server\150\Tools\Binn\;C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;D:\ruanjian\Git\cmd;C:\Program Files (x86)\Microsoft SQL Server\160\DTS\Binn\;C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit\;C:\Users\18477\AppData\Local\nvm;C:\nvm4w\nodejs;C:\Users\18477\AppData\Roaming\MySQL;C:\Program Files\MySQL\MySQL Server 8.0\bin;C:\WINDOWS\system32\config\systemprofile\AppData\Local\Microsoft\WindowsApps;C:\Program Files\dotnet\;C:\Program Files\MySQL\MySQL Shell 8.0\bin\;C:\Program Files\Java\jdk1.8.0_202\bin;D:\python\Scripts\;D:\python\;C:\Users\18477\AppData\Local\Microsoft\WindowsApps;C:\Users\18477\.dotnet\tools;D:\pycharm\PyCharm 2024.3.2\bin;;D:\VS Code\bin;C:\Program Files\JetBrains\IntelliJ IDEA 2025.2.3\bin;C:\Users\18477\AppData\Local\nvm;C:\nvm4w\nodejs; diff --git a/server-example/add-department-column.js b/server-example/add-department-column.js deleted file mode 100644 index 518db97..0000000 --- a/server-example/add-department-column.js +++ /dev/null @@ -1,41 +0,0 @@ -const { Sequelize } = require('sequelize'); -require('dotenv').config(); - -// 创建数据库连接 -const sequelize = new Sequelize( - process.env.DB_DATABASE || 'wechat_app', - process.env.DB_USER || 'root', - process.env.DB_PASSWORD === undefined ? null : process.env.DB_PASSWORD, - { - host: process.env.DB_HOST || 'localhost', - port: process.env.DB_PORT || 3306, - dialect: 'mysql', - timezone: '+08:00' - } -); - -// 添加department字段到usermanagements表 -async function addDepartmentColumn() { - try { - // 连接数据库 - await sequelize.authenticate(); - console.log('✅ 数据库连接成功'); - - // 使用queryInterface添加字段 - await sequelize.getQueryInterface().addColumn('usermanagements', 'department', { - type: Sequelize.STRING(255), - defaultValue: null, - comment: '部门信息' - }); - - console.log('✅ 成功添加department字段到usermanagements表'); - } catch (error) { - console.error('❌ 添加字段失败:', error.message); - } finally { - // 关闭数据库连接 - await sequelize.close(); - } -} - -// 执行函数 -addDepartmentColumn(); \ No newline at end of file diff --git a/server-example/check-online-status.js b/server-example/check-online-status.js deleted file mode 100644 index 00f5538..0000000 --- a/server-example/check-online-status.js +++ /dev/null @@ -1,70 +0,0 @@ -// 检查chat_online_status表的当前状态 -const { Sequelize } = require('sequelize'); - -// 数据库配置 - 与server-mysql.js保持一致 -const sequelize = new Sequelize('chat', 'root', '', { - host: 'localhost', - port: 3306, - dialect: 'mysql', - pool: { - max: 10, - min: 0, - acquire: 30000, - idle: 10000 - }, - define: { - freezeTableName: true, - timestamps: false - }, - logging: console.log -}); - -async function checkOnlineStatus() { - try { - console.log('正在连接数据库...'); - await sequelize.authenticate(); - console.log('数据库连接成功'); - - // 查询所有客服的在线状态 - console.log('\n查询chat_online_status表中所有客服(type=2)的记录:'); - const [managerStatuses] = await sequelize.query( - 'SELECT * FROM chat_online_status WHERE type = 2 ORDER BY userId, type', - { type: Sequelize.QueryTypes.SELECT } - ); - - if (managerStatuses.length === 0) { - console.log('没有找到客服的在线状态记录'); - } else { - console.log(`找到 ${managerStatuses.length} 条客服在线状态记录:`); - managerStatuses.forEach(record => { - console.log(`- userId: ${record.userId || 'NULL'}, type: ${record.type}, is_online: ${record.is_online}, connection_id: ${record.connection_id}, last_heartbeat: ${record.last_heartbeat}, updated_at: ${record.updated_at}`); - }); - } - - // 查询表中所有记录(包括用户和客服)以了解整体情况 - console.log('\n查询chat_online_status表中所有记录:'); - const [allStatuses] = await sequelize.query( - 'SELECT * FROM chat_online_status ORDER BY type, userId', - { type: Sequelize.QueryTypes.SELECT } - ); - - console.log(`总共 ${allStatuses.length} 条记录`); - - // 检查是否存在userId为NULL的记录 - const nullUserIdRecords = allStatuses.filter(record => record.userId === null); - if (nullUserIdRecords.length > 0) { - console.log(`\n发现 ${nullUserIdRecords.length} 条userId为NULL的记录:`); - nullUserIdRecords.forEach(record => { - console.log(`- userId: NULL, type: ${record.type}, is_online: ${record.is_online}`); - }); - } - - } catch (error) { - console.error('检查在线状态时出错:', error); - } finally { - await sequelize.close(); - } -} - -// 执行检查 -checkOnlineStatus(); diff --git a/server-example/check-settlement-data.js b/server-example/check-settlement-data.js deleted file mode 100644 index b9c9be5..0000000 --- a/server-example/check-settlement-data.js +++ /dev/null @@ -1,133 +0,0 @@ -// 查询用户入驻相关数据 -require('dotenv').config(); -const { Sequelize } = require('sequelize'); - -// 创建数据库连接 -const sequelize = new Sequelize( - process.env.DB_DATABASE || 'wechat_app', - process.env.DB_USER || 'root', - process.env.DB_PASSWORD === undefined ? null : process.env.DB_PASSWORD, - { - host: process.env.DB_HOST || 'localhost', - port: process.env.DB_PORT || 3306, - dialect: 'mysql', - timezone: '+08:00' - } -); - -async function checkSettlementData() { - try { - await sequelize.authenticate(); - console.log('✅ 数据库连接成功\n'); - - // 1. 查询所有用户的基本信息和入驻状态 - console.log('=== 用户入驻状态检查 ===\n'); - - const users = await sequelize.query(` - SELECT - id, userId, openid, name, phoneNumber, type, - collaborationid, cooperation, company, - province, city, district, detailedaddress, - businesslicenseurl, proofurl, brandurl, - partnerstatus, reasonforfailure, - created_at, updated_at - FROM users - ORDER BY updated_at DESC - LIMIT 50 - `, { type: Sequelize.QueryTypes.SELECT }); - - console.log(`找到 ${users.length} 个用户记录\n`); - - // 2. 按入驻状态分组统计 - const statusCount = {}; - users.forEach(u => { - const status = u.partnerstatus || '未申请'; - statusCount[status] = (statusCount[status] || 0) + 1; - }); - - console.log('📊 入驻状态统计:'); - Object.entries(statusCount).forEach(([status, count]) => { - console.log(` ${status}: ${count} 人`); - }); - console.log(); - - // 3. 显示每个用户的详细信息 - console.log('👥 用户详细信息:'); - console.log('='.repeat(100)); - - users.forEach((user, index) => { - console.log(`\n【用户 ${index + 1}】`); - console.log(` ID: ${user.id}`); - console.log(` userId: ${user.userId}`); - console.log(` openid: ${user.openid ? user.openid.substring(0, 20) + '...' : '空'}`); - console.log(` 姓名: ${user.name || '空'}`); - console.log(` 手机号: ${user.phoneNumber || '空'}`); - console.log(` 用户类型: ${user.type || '空'}`); - console.log(` ───── 入驻信息 ─────`); - console.log(` 合作商身份(collaborationid): ${user.collaborationid || '空'}`); - console.log(` 合作模式(cooperation): ${user.cooperation || '空'}`); - console.log(` 公司名称(company): ${user.company || '空'}`); - console.log(` 省份: ${user.province || '空'}`); - console.log(` 城市: ${user.city || '空'}`); - console.log(` 区县: ${user.district || '空'}`); - console.log(` 详细地址: ${user.detailedaddress || '空'}`); - console.log(` 营业执照: ${user.businesslicenseurl ? '已上传' : '空'}`); - console.log(` 证明材料: ${user.proofurl ? '已上传' : '空'}`); - console.log(` 品牌授权: ${user.brandurl ? '已上传' : '空'}`); - console.log(` ───── 审核状态 ─────`); - console.log(` 入驻状态(partnerstatus): ${user.partnerstatus || '空'}`); - console.log(` 失败原因: ${user.reasonforfailure || '空'}`); - console.log(` 创建时间: ${user.created_at}`); - console.log(` 更新时间: ${user.updated_at}`); - }); - - // 4. 特别检查有openid但partnerstatus为空的记录 - console.log('\n\n=== 重点检查:已登录但未提交入驻的用户 ===\n'); - - const notApplied = users.filter(u => u.openid && !u.partnerstatus); - console.log(`有 ${notApplied.length} 个用户已登录但未提交入驻申请`); - - if (notApplied.length > 0) { - console.log('\n这些用户的openid:'); - notApplied.forEach(u => { - console.log(` - userId: ${u.userId}, openid: ${u.openid.substring(0, 30)}...`); - }); - } - - // 5. 检查是否有审核中的用户 - console.log('\n\n=== 审核中的用户 ===\n'); - const underReview = users.filter(u => u.partnerstatus === 'underreview'); - console.log(`有 ${underReview.length} 个用户正在审核中`); - - if (underReview.length > 0) { - underReview.forEach(u => { - console.log(` - userId: ${u.userId}, 公司: ${u.company || '空'}, 身份: ${u.collaborationid || '空'}`); - }); - } - - // 6. 检查users表的字段结构 - console.log('\n\n=== users表字段结构 ===\n'); - const tableStructure = await sequelize.query('DESCRIBE users', { type: Sequelize.QueryTypes.SELECT }); - const settlementFields = [ - 'collaborationid', 'cooperation', 'company', 'province', 'city', 'district', - 'detailedaddress', 'businesslicenseurl', 'proofurl', 'brandurl', - 'partnerstatus', 'reasonforfailure' - ]; - - console.log('入驻相关字段:'); - tableStructure.forEach(field => { - if (settlementFields.includes(field.Field)) { - console.log(` ${field.Field}: ${field.Type} ${field.Null === 'NO' ? 'NOT NULL' : ''} Default: ${field.Default || '无'}`); - } - }); - - } catch (error) { - console.error('❌ 查询失败:', error.message); - console.error(error.stack); - } finally { - await sequelize.close(); - console.log('\n✅ 查询完成'); - } -} - -checkSettlementData(); diff --git a/server-example/cleanup_temp_user_ids.js b/server-example/cleanup_temp_user_ids.js deleted file mode 100644 index 16b77ba..0000000 --- a/server-example/cleanup_temp_user_ids.js +++ /dev/null @@ -1,107 +0,0 @@ -// 清理临时userId数据脚本 -// 此脚本用于删除chat_conversations和chat_messages表中所有临时userId的数据 -// 临时userId格式:temp_1765852836234 - -const mysql = require('mysql2/promise'); - -async function cleanupTempUserIds() { - let connection; - - try { - // 创建数据库连接 - connection = await mysql.createConnection({ - host: '1.95.162.61', - port: 3306, - user: 'root', - password: 'schl@2025', - database: 'wechat_app' - }); - - console.log('✓ 数据库连接成功'); - - // ============== 清理chat_conversations表中的临时userId数据 ============== - console.log('\n=== 清理chat_conversations表中的临时userId数据 ==='); - - // 1. 统计需要删除的临时userId会话记录 - const [convTempCount] = await connection.execute( - 'SELECT COUNT(*) as count FROM chat_conversations WHERE userId LIKE ? OR managerId LIKE ?', - ['temp_%', 'temp_%'] - ); - console.log(`找到 ${convTempCount[0].count} 条临时userId的会话记录`); - - // 2. 删除临时userId的会话记录 - if (convTempCount[0].count > 0) { - const [convResult] = await connection.execute( - 'DELETE FROM chat_conversations WHERE userId LIKE ? OR managerId LIKE ?', - ['temp_%', 'temp_%'] - ); - console.log(`成功删除chat_conversations表中的 ${convResult.affectedRows} 条临时userId记录`); - } - - // ============== 清理chat_messages表中的临时userId数据 ============== - console.log('\n=== 清理chat_messages表中的临时userId数据 ==='); - - // 1. 统计需要删除的临时userId消息记录 - const [msgTempCount] = await connection.execute( - 'SELECT COUNT(*) as count FROM chat_messages WHERE sender_id LIKE ? OR receiver_id LIKE ?', - ['temp_%', 'temp_%'] - ); - console.log(`找到 ${msgTempCount[0].count} 条临时userId的消息记录`); - - // 2. 删除临时userId的消息记录 - if (msgTempCount[0].count > 0) { - const [msgResult] = await connection.execute( - 'DELETE FROM chat_messages WHERE sender_id LIKE ? OR receiver_id LIKE ?', - ['temp_%', 'temp_%'] - ); - console.log(`成功删除chat_messages表中的 ${msgResult.affectedRows} 条临时userId记录`); - } - - // ============== 验证清理结果 ============== - console.log('\n=== 验证清理结果 ==='); - - // 再次检查chat_conversations表中是否还有临时userId记录 - const [convVerify] = await connection.execute( - 'SELECT COUNT(*) as count FROM chat_conversations WHERE userId LIKE ? OR managerId LIKE ?', - ['temp_%', 'temp_%'] - ); - console.log(`chat_conversations表中剩余临时userId记录数: ${convVerify[0].count}`); - - // 再次检查chat_messages表中是否还有临时userId记录 - const [msgVerify] = await connection.execute( - 'SELECT COUNT(*) as count FROM chat_messages WHERE sender_id LIKE ? OR receiver_id LIKE ?', - ['temp_%', 'temp_%'] - ); - console.log(`chat_messages表中剩余临时userId记录数: ${msgVerify[0].count}`); - - // ============== 检查剩余的有效数据 ============== - console.log('\n=== 检查剩余的有效数据 ==='); - - // 检查chat_conversations表中的有效记录数 - const [convValid] = await connection.execute( - 'SELECT COUNT(*) as count FROM chat_conversations' - ); - console.log(`chat_conversations表中有效会话记录数: ${convValid[0].count}`); - - // 检查chat_messages表中的有效记录数 - const [msgValid] = await connection.execute( - 'SELECT COUNT(*) as count FROM chat_messages' - ); - console.log(`chat_messages表中有效消息记录数: ${msgValid[0].count}`); - - console.log('\n✅ 清理完成!所有临时userId数据已被删除。'); - console.log('✅ 现在数据库中只保留了真实userId的数据。'); - - } catch (error) { - console.error('❌ 清理过程中发生错误:', error); - } finally { - if (connection) { - await connection.end(); - console.log('✅ 数据库连接已关闭'); - } - } -} - -// 执行清理操作 -console.log('========== 开始清理临时userId数据 =========='); -cleanupTempUserIds().catch(console.error); diff --git a/server-example/cleanup_test_data.js b/server-example/cleanup_test_data.js deleted file mode 100644 index 3f7730d..0000000 --- a/server-example/cleanup_test_data.js +++ /dev/null @@ -1,29 +0,0 @@ -const { Sequelize } = require('sequelize'); -const sequelize = new Sequelize('wechat_app', 'root', 'schl@2025', { - host: '1.95.162.61', - port: 3306, - dialect: 'mysql', - logging: false -}); - -async function cleanup() { - try { - // 删除测试会话相关的消息 - await sequelize.query('DELETE FROM chat_messages WHERE conversation_id = ?', { - replacements: ['conv_1765767582602'] - }); - - // 删除测试会话 - await sequelize.query('DELETE FROM chat_conversations WHERE conversation_id = ?', { - replacements: ['conv_1765767582602'] - }); - - console.log('测试会话记录已删除'); - } catch (e) { - console.error('删除错误:', e.message); - } finally { - await sequelize.close(); - } -} - -cleanup(); \ No newline at end of file diff --git a/server-example/complete-gross-weight-fix.js b/server-example/complete-gross-weight-fix.js deleted file mode 100644 index a6bc44d..0000000 --- a/server-example/complete-gross-weight-fix.js +++ /dev/null @@ -1,143 +0,0 @@ -// 毛重字段(grossWeight)处理逻辑完整修复脚本 -// 此脚本用于统一所有API接口对grossWeight字段的处理逻辑 - -const fs = require('fs'); -const path = require('path'); - -// 定义配置 -const config = { - serverFilePath: path.join(__dirname, 'server-mysql.js'), - backupFilePath: path.join(__dirname, 'server-mysql.js.bak.final-fix-' + Date.now()), - logFilePath: path.join(__dirname, 'final-fix-gross-weight-log.txt') -}; - -// 日志函数 -function log(message) { - const timestamp = new Date().toISOString(); - const logMessage = '[' + timestamp + '] ' + message; - console.log(logMessage); - try { - fs.appendFileSync(config.logFilePath, logMessage + '\n'); - } catch (e) { - console.error('写入日志文件失败:', e.message); - } -} - -// 读取文件内容 -function readFile(filePath) { - try { - return fs.readFileSync(filePath, 'utf8'); - } catch (error) { - log('读取文件失败: ' + error.message); - throw error; - } -} - -// 写入文件内容 -function writeFile(filePath, content) { - try { - fs.writeFileSync(filePath, content, 'utf8'); - log('文件已成功写入: ' + filePath); - } catch (error) { - log('写入文件失败: ' + error.message); - throw error; - } -} - -// 创建备份文件 -function createBackup() { - try { - const content = readFile(config.serverFilePath); - writeFile(config.backupFilePath, content); - log('已创建备份文件: ' + config.backupFilePath); - } catch (error) { - log('创建备份文件失败: ' + error.message); - throw error; - } -} - -// 主函数 -function main() { - log('===== 开始执行毛重字段处理逻辑完整修复 ====='); - - try { - // 创建备份 - createBackup(); - - // 读取文件内容 - let content = readFile(config.serverFilePath); - - // 修复1: 统一中间件中的毛重处理逻辑,确保所有空值都设为5 - const searchPatterns = [ - 'product.grossWeight = 0;', - 'product.grossWeight = 0; // 空值设置为0' - ]; - - let fixesApplied = 0; - searchPatterns.forEach(pattern => { - if (content.includes(pattern)) { - const originalCount = (content.match(new RegExp(pattern, 'g')) || []).length; - content = content.replace(new RegExp(pattern, 'g'), 'product.grossWeight = 5; // 空值设置为5'); - const fixedCount = (content.match(/product\.grossWeight = 5;/g) || []).length - originalCount; - fixesApplied += fixedCount; - log('修复中间件中的毛重默认值: 替换了' + fixedCount + '处'); - } - }); - - if (fixesApplied > 0) { - log('修复1完成: 已统一所有中间件中的毛重默认值为5'); - } else { - log('修复1跳过: 所有中间件中的毛重默认值已经是5'); - } - - // 修复2: 在商品上传接口添加毛重处理逻辑 - const uploadApiSearch = 'app.post(\'/api/products/upload\', async (req, res) => {'; - if (content.includes(uploadApiSearch)) { - // 查找上传接口的位置 - const uploadApiStart = content.indexOf(uploadApiSearch); - const uploadApiEnd = content.indexOf('});', uploadApiStart) + 3; - const uploadApiContent = content.substring(uploadApiStart, uploadApiEnd); - - // 检查是否已经包含毛重处理逻辑 - if (uploadApiContent.includes('grossWeight') && uploadApiContent.includes('parseFloat')) { - log('修复2跳过: 商品上传接口已经包含毛重处理逻辑'); - } else { - // 查找商品数据处理的位置(在try块内) - const tryBlockStart = uploadApiContent.indexOf('try {'); - const tryBlockEnd = uploadApiContent.lastIndexOf('} catch'); - - if (tryBlockStart !== -1 && tryBlockEnd !== -1) { - // 在try块开始处添加毛重处理逻辑 - const tryBlockContent = uploadApiContent.substring(tryBlockStart, tryBlockEnd); - const weightHandlingCode = `try {\n // 修复毛重字段处理逻辑\n if (req.body && req.body.productData) {\n let processedGrossWeight = 5; // 默认值为5\n if (req.body.productData.grossWeight !== null && req.body.productData.grossWeight !== undefined && req.body.productData.grossWeight !== \'\') {\n const numValue = parseFloat(req.body.productData.grossWeight);\n if (!isNaN(numValue) && isFinite(numValue)) {\n processedGrossWeight = numValue;\n }\n }\n req.body.productData.grossWeight = processedGrossWeight;\n console.log(\'修复后 - 毛重值处理: 原始值=\' + (req.body.productData.grossWeight || \'undefined\') + ', 处理后=\' + processedGrossWeight);\n }`; - - // 替换原代码 - const fixedUploadApiContent = uploadApiContent.replace(tryBlockContent, weightHandlingCode); - content = content.replace(uploadApiContent, fixedUploadApiContent); - log('修复2完成: 在商品上传接口添加了毛重处理逻辑'); - } else { - log('修复2失败: 无法在商品上传接口中找到try-catch块'); - } - } - } else { - log('修复2跳过: 未找到商品上传接口'); - } - - // 写入修复后的内容 - writeFile(config.serverFilePath, content); - - log('===== 毛重字段处理逻辑完整修复完成 ====='); - log('修复内容总结:'); - log('1. 统一了所有中间件中的毛重默认值为5'); - log('2. 在商品上传接口中添加了毛重处理逻辑,将空值设为5,有效数字转换为float类型'); - log('3. 创建了备份文件,以便需要时恢复'); - - } catch (error) { - log('修复过程中发生错误: ' + error.message); - log('===== 毛重字段处理逻辑完整修复失败 ====='); - process.exit(1); - } -} - -// 执行主函数 -main(); \ No newline at end of file diff --git a/server-example/complete-gross-weight-verification.js b/server-example/complete-gross-weight-verification.js deleted file mode 100644 index 849c58d..0000000 --- a/server-example/complete-gross-weight-verification.js +++ /dev/null @@ -1,123 +0,0 @@ -const fs = require('fs'); -const path = require('path'); - -// 读取server-mysql.js文件内容 -function readServerFile() { - return fs.readFileSync(path.join(__dirname, 'server-mysql.js'), 'utf8'); -} - -// 验证毛重字段处理逻辑 -function verifyGrossWeightHandling() { - try { - const fileContent = readServerFile(); - - // 初始化验证结果 - const verificationResult = { - totalIssues: 0, - successPoints: 0, - issues: [], - successDetails: [] - }; - - // 检查响应中间件中的/products/list接口 - const listMiddlewarePattern = /data\.products\s*=\s*data\.products\.map\(product\s*=>\s*\{[\s\S]*?product\.grossWeight\s*=\s*([^;]+);/; - const listMiddlewareMatch = fileContent.match(listMiddlewarePattern); - - if (listMiddlewareMatch && listMiddlewareMatch[1].includes('0')) { - verificationResult.successPoints++; - verificationResult.successDetails.push('✓ 响应中间件(/products/list)已正确设置空毛重默认值为0'); - } else { - verificationResult.totalIssues++; - verificationResult.issues.push('✗ 响应中间件(/products/list)未正确设置空毛重默认值'); - } - - // 检查响应中间件中的/data接口 - const dataMiddlewarePattern = /data\.data\.products\s*=\s*data\.data\.products\.map\(product\s*=>\s*\{[\s\S]*?product\.grossWeight\s*=\s*([^;]+);/; - const dataMiddlewareMatch = fileContent.match(dataMiddlewarePattern); - - if (dataMiddlewareMatch && dataMiddlewareMatch[1].includes('0')) { - verificationResult.successPoints++; - verificationResult.successDetails.push('✓ 响应中间件(/data)已正确设置空毛重默认值为0'); - } else { - verificationResult.totalIssues++; - verificationResult.issues.push('✗ 响应中间件(/data)未正确设置空毛重默认值'); - } - - // 检查商品上传接口 - const uploadApiPattern = /app\.post\('\/api\/products\/upload',[\s\S]*?let\s+processedGrossWeight\s*=\s*(\d+)/; - const uploadApiMatch = fileContent.match(uploadApiPattern); - - if (uploadApiMatch && uploadApiMatch[1] === '0') { - verificationResult.successPoints++; - verificationResult.successDetails.push('✓ 商品上传接口已正确设置空毛重默认值为0'); - } else { - verificationResult.totalIssues++; - verificationResult.issues.push('✗ 商品上传接口未正确设置空毛重默认值'); - } - - // 检查编辑商品API - const editApiPattern = /parsedValue:\s*product\.grossWeight\s*===\s*''\s*\|\|\s*product\.grossWeight\s*===\s*null\s*\|\|\s*product\.grossWeight\s*===\s*undefined\s*\?\s*(\d+)/; - const editApiMatch = fileContent.match(editApiPattern); - - if (editApiMatch && editApiMatch[1] === '0') { - verificationResult.successPoints++; - verificationResult.successDetails.push('✓ 编辑商品API已正确设置空毛重默认值为0'); - } else { - verificationResult.totalIssues++; - verificationResult.issues.push('✗ 编辑商品API未正确设置空毛重默认值'); - } - - // 检查是否还有设置为5的地方 - const remaining5Pattern = /grossWeight\s*=\s*5/g; - const remaining5Matches = fileContent.match(remaining5Pattern); - - if (remaining5Matches && remaining5Matches.length > 0) { - verificationResult.totalIssues += remaining5Matches.length; - verificationResult.issues.push(`✗ 发现${remaining5Matches.length}处仍将毛重设置为5的地方`); - } else { - verificationResult.successPoints++; - verificationResult.successDetails.push('✓ 未发现仍将毛重设置为5的残留代码'); - } - - // 检查是否正确实现了空值返回0的逻辑 - const emptyValueHandlingPattern = /product\.grossWeight\s*===\s*null\s*\|\|\s*product\.grossWeight\s*===\s*undefined\s*\|\|\s*product\.grossWeight\s*===\s*''\s*\?\s*0/g; - const emptyValueMatches = fileContent.match(emptyValueHandlingPattern); - - if (emptyValueMatches && emptyValueMatches.length > 0) { - verificationResult.successPoints++; - verificationResult.successDetails.push(`✓ 发现${emptyValueMatches.length}处正确实现了空值返回0的逻辑`); - } - - // 输出验证结果 - console.log('\n======== 毛重字段处理逻辑全面验证结果 ========'); - console.log('\n成功项:'); - verificationResult.successDetails.forEach(detail => console.log(detail)); - - console.log('\n问题项:'); - if (verificationResult.issues.length === 0) { - console.log('✓ 未发现任何问题'); - } else { - verificationResult.issues.forEach(issue => console.log(issue)); - } - - console.log('\n总体评估:'); - if (verificationResult.totalIssues === 0) { - console.log('✅ 验证成功: 所有毛重字段处理逻辑已正确实现'); - console.log(' 已满足要求: 空值时小程序和数据库均返回0,非空值返回实际值'); - } else { - console.log(`❌ 验证失败: 发现${verificationResult.totalIssues}个问题需要修复`); - } - - console.log('=============================================='); - - // 设置退出码 - process.exit(verificationResult.totalIssues > 0 ? 1 : 0); - - } catch (error) { - console.error('验证过程中发生错误:', error); - process.exit(1); - } -} - -// 执行验证 -verifyGrossWeightHandling(); \ No newline at end of file diff --git a/server-example/create-missing-associations.js b/server-example/create-missing-associations.js deleted file mode 100644 index 7389ec7..0000000 --- a/server-example/create-missing-associations.js +++ /dev/null @@ -1,155 +0,0 @@ -const { Sequelize } = require('sequelize'); -const fs = require('fs'); -const path = require('path'); - -// 读取环境变量 -const envPath = path.join(__dirname, '.env'); -if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf8'); - const envVars = envContent.split('\n').filter(line => line.trim() && !line.startsWith('#')); - envVars.forEach(line => { - const [key, value] = line.split('=').map(part => part.trim()); - process.env[key] = value; - }); -} - -// 数据库连接配置 -const sequelize = new Sequelize( - process.env.DB_NAME || 'wechat_app', - process.env.DB_USER || 'root', - process.env.DB_PASSWORD || '', - { - host: process.env.DB_HOST || 'localhost', - port: process.env.DB_PORT || 3306, - dialect: 'mysql', - logging: false, - timezone: '+08:00' // 设置时区为UTC+8 - } -); - -// 定义模型 - 简化版 -const User = sequelize.define('User', { - userId: { - type: sequelize.Sequelize.STRING(100), - primaryKey: true, - allowNull: false - }, - nickName: sequelize.Sequelize.STRING(100), - phoneNumber: sequelize.Sequelize.STRING(20) -}, { - tableName: 'users', - timestamps: false -}); - -const Contact = sequelize.define('Contact', { - id: { - type: sequelize.Sequelize.INTEGER, - autoIncrement: true, - primaryKey: true - }, - userId: { - type: sequelize.Sequelize.STRING(100), - allowNull: false - }, - nickName: sequelize.Sequelize.STRING(100), - phoneNumber: sequelize.Sequelize.STRING(20) -}, { - tableName: 'contacts', - timestamps: false -}); - -const UserManagement = sequelize.define('UserManagement', { - id: { - type: sequelize.Sequelize.INTEGER, - autoIncrement: true, - primaryKey: true - }, - userId: { - type: sequelize.Sequelize.STRING(100), - allowNull: false - } -}, { - tableName: 'usermanagements', - timestamps: false -}); - -// 修复函数 -async function fixMissingAssociations() { - try { - console.log('========================================'); - console.log('开始修复用户关联表记录'); - console.log('========================================'); - - // 连接数据库 - await sequelize.authenticate(); - console.log('✅ 数据库连接成功'); - - // 获取所有用户 - const users = await User.findAll(); - console.log(`📊 共找到 ${users.length} 个用户记录`); - - let contactsCreated = 0; - let managementsCreated = 0; - - // 为每个用户检查并创建关联记录 - for (let i = 0; i < users.length; i++) { - const user = users[i]; - console.log(`\n🔄 处理用户 ${i + 1}/${users.length}: ${user.userId}`); - - // 检查并创建联系人记录 - try { - const existingContact = await Contact.findOne({ - where: { userId: user.userId } - }); - - if (!existingContact) { - await Contact.create({ - userId: user.userId, - nickName: user.nickName || '默认联系人', - phoneNumber: user.phoneNumber || '' - }); - console.log('✅ 创建了联系人记录'); - contactsCreated++; - } else { - console.log('✅ 联系人记录已存在'); - } - } catch (error) { - console.error('❌ 创建联系人记录失败:', error.message); - } - - // 检查并创建用户管理记录 - try { - const existingManagement = await UserManagement.findOne({ - where: { userId: user.userId } - }); - - if (!existingManagement) { - await UserManagement.create({ - userId: user.userId - }); - console.log('✅ 创建了用户管理记录'); - managementsCreated++; - } else { - console.log('✅ 用户管理记录已存在'); - } - } catch (error) { - console.error('❌ 创建用户管理记录失败:', error.message); - } - } - - console.log('\n========================================'); - console.log('修复完成!'); - console.log(`📈 共创建了 ${contactsCreated} 条联系人记录`); - console.log(`📈 共创建了 ${managementsCreated} 条用户管理记录`); - console.log('========================================'); - - } catch (error) { - console.error('❌ 修复过程中发生错误:', error); - } finally { - // 关闭数据库连接 - await sequelize.close(); - } -} - -// 运行修复 -fixMissingAssociations(); \ No newline at end of file diff --git a/server-example/database-extension.js b/server-example/database-extension.js deleted file mode 100644 index 3cd70ff..0000000 --- a/server-example/database-extension.js +++ /dev/null @@ -1,356 +0,0 @@ -// 注意:此文件是MongoDB版本的扩展实现,已被禁用 -// 数据库扩展 - 用于连接userlogin数据库并关联表 -const { Sequelize, DataTypes, Model } = require('sequelize'); -const path = require('path'); -require('dotenv').config({ path: path.resolve(__dirname, '.env') }); - -// 注意:不再直接导入User模型以避免循环依赖 -// User模型将通过setupAssociations函数的参数传入 -let User = null; - -// 创建到userlogin数据库的连接 -const sequelizeUserLogin = new Sequelize( - process.env.DB_DATABASE_USERLOGIN || 'userlogin', - process.env.DB_USER || 'root', - process.env.DB_PASSWORD, - { - host: process.env.DB_HOST || 'localhost', - port: process.env.DB_PORT || 3306, - dialect: 'mysql', - pool: { - max: 10, - min: 0, - acquire: 30000, - idle: 10000 - }, - timezone: '+08:00' // 设置时区为UTC+8 - } -); - -// 测试userlogin数据库连接 -async function testUserLoginDbConnection() { - try { - await sequelizeUserLogin.authenticate(); - console.log('userlogin数据库连接成功'); - } catch (error) { - console.error('userlogin数据库连接失败:', error); - console.error('请注意:如果不需要使用userlogin数据库,可以忽略此错误'); - } -} - -// 定义userlogin数据库中的表模型 - -// contact表模型 -class Contact extends Model { } -Contact.init({ - id: { - type: DataTypes.INTEGER, - autoIncrement: true, - primaryKey: true - }, - userId: { - type: DataTypes.STRING(100), - allowNull: false - }, - name: { - type: DataTypes.STRING(100), - allowNull: false - }, - phone: { - type: DataTypes.STRING(20), - allowNull: false - }, - email: { - type: DataTypes.STRING(100) - }, - address: { - type: DataTypes.TEXT - }, - created_at: { - type: DataTypes.DATE, - defaultValue: Sequelize.NOW - } -}, { - sequelize: sequelizeUserLogin, - modelName: 'Contact', - tableName: 'contact', - timestamps: false -}); - -// enterprise表模型 -class Enterprise extends Model { } -Enterprise.init({ - id: { - type: DataTypes.INTEGER, - autoIncrement: true, - primaryKey: true - }, - userId: { - type: DataTypes.STRING(100), - allowNull: false - }, - enterpriseName: { - type: DataTypes.STRING(255), - allowNull: false - }, - businessLicense: { - type: DataTypes.STRING(255) - }, - address: { - type: DataTypes.TEXT - }, - contactPerson: { - type: DataTypes.STRING(100) - }, - contactPhone: { - type: DataTypes.STRING(20) - }, - created_at: { - type: DataTypes.DATE, - defaultValue: Sequelize.NOW - } -}, { - sequelize: sequelizeUserLogin, - modelName: 'Enterprise', - tableName: 'enterprise', - timestamps: false -}); - -// managers表模型 -class Manager extends Model { } -Manager.init({ - id: { - type: DataTypes.INTEGER, - autoIncrement: true, - primaryKey: true - }, - userId: { - type: DataTypes.STRING(100), - allowNull: false - }, - managerName: { - type: DataTypes.STRING(100), - allowNull: false - }, - managerPhone: { - type: DataTypes.STRING(20), - allowNull: false - }, - role: { - type: DataTypes.STRING(50), - allowNull: false - }, - created_at: { - type: DataTypes.DATE, - defaultValue: Sequelize.NOW - } -}, { - sequelize: sequelizeUserLogin, - modelName: 'Manager', - tableName: 'managers', - timestamps: false -}); - -// publicseademand表模型 -class PublicSeaDemand extends Model { } -PublicSeaDemand.init({ - id: { - type: DataTypes.INTEGER, - autoIncrement: true, - primaryKey: true - }, - userId: { - type: DataTypes.STRING(100), - allowNull: false - }, - demandType: { - type: DataTypes.STRING(100), - allowNull: false - }, - description: { - type: DataTypes.TEXT - }, - status: { - type: DataTypes.STRING(50), - defaultValue: 'pending' - }, - created_at: { - type: DataTypes.DATE, - defaultValue: Sequelize.NOW - } -}, { - sequelize: sequelizeUserLogin, - modelName: 'PublicSeaDemand', - tableName: 'publicseademand', - timestamps: false -}); - -// rootdb表模型 -class RootDb extends Model { } -RootDb.init({ - id: { - type: DataTypes.INTEGER, - autoIncrement: true, - primaryKey: true - }, - userId: { - type: DataTypes.STRING(100), - allowNull: false - }, - dataKey: { - type: DataTypes.STRING(100), - allowNull: false - }, - dataValue: { - type: DataTypes.TEXT - }, - created_at: { - type: DataTypes.DATE, - defaultValue: Sequelize.NOW - } -}, { - sequelize: sequelizeUserLogin, - modelName: 'RootDb', - tableName: 'rootdb', - timestamps: false -}); - -// login表模型 -class Login extends Model { } -Login.init({ - id: { - type: DataTypes.INTEGER, - autoIncrement: true, - primaryKey: true - }, - userId: { - type: DataTypes.STRING(100), - allowNull: false - }, - loginTime: { - type: DataTypes.DATE, - defaultValue: Sequelize.NOW - }, - loginIp: { - type: DataTypes.STRING(50) - }, - deviceInfo: { - type: DataTypes.TEXT - }, - status: { - type: DataTypes.STRING(20), - defaultValue: 'success' - } -}, { - sequelize: sequelizeUserLogin, - modelName: 'Login', - tableName: 'login', - timestamps: false -}); - -// 设置模型关联关系 -function setupAssociations(mainUserModel) { - // 确保使用传入的User模型,不再依赖默认的User变量 - if (!mainUserModel) { - console.error('User模型未提供,无法设置关联关系'); - return; - } - - try { - // 关联User与Contact(一对多) - // 使用唯一的别名userContacts以避免可能的冲突 - mainUserModel.hasMany(Contact, { - foreignKey: 'userId', - sourceKey: 'userId', - as: 'userContacts' - }); - - // 反向关联Contact与User - Contact.belongsTo(mainUserModel, { - foreignKey: 'userId', - targetKey: 'userId', - as: 'user' - }); - - // 关联User与Enterprise(一对多) - mainUserModel.hasMany(Enterprise, { - foreignKey: 'userId', - sourceKey: 'userId', - as: 'userEnterprises' - }); - - // 反向关联Enterprise与User - Enterprise.belongsTo(mainUserModel, { - foreignKey: 'userId', - targetKey: 'userId', - as: 'user' - }); - - // 关联User与Manager(一对多) - mainUserModel.hasMany(Manager, { - foreignKey: 'userId', - sourceKey: 'userId', - as: 'userManagers' - }); - - // 反向关联Manager与User - Manager.belongsTo(mainUserModel, { - foreignKey: 'userId', - targetKey: 'userId', - as: 'user' - }); - - // 关联User与PublicSeaDemand(一对多) - mainUserModel.hasMany(PublicSeaDemand, { - foreignKey: 'userId', - sourceKey: 'userId', - as: 'userPublicSeaDemands' - }); - - // 反向关联PublicSeaDemand与User - PublicSeaDemand.belongsTo(mainUserModel, { - foreignKey: 'userId', - targetKey: 'userId', - as: 'user' - }); - - // 关联User与RootDb(一对多) - mainUserModel.hasMany(RootDb, { - foreignKey: 'userId', - sourceKey: 'userId', - as: 'userRootDbs' - }); - - // 反向关联RootDb与User - RootDb.belongsTo(mainUserModel, { - foreignKey: 'userId', - targetKey: 'userId', - as: 'user' - }); - - // 关联User与Login(一对多) - mainUserModel.hasMany(Login, { - foreignKey: 'userId', - sourceKey: 'userId', - as: 'userLoginRecords' - }); - - console.log('已设置wechat_app数据库的User模型与userlogin数据库表的关联关系'); - } catch (error) { - console.error('设置模型关联关系时出错:', error); - } -} - -// 导出所有模型和连接 -module.exports = { - sequelizeUserLogin, - testUserLoginDbConnection, - Contact, - Enterprise, - Manager, - PublicSeaDemand, - RootDb, - Login, - setupAssociations, - User // 导出User模型(可能是实际的模型或临时模型) -}; \ No newline at end of file diff --git a/server-example/debug-websocket.js b/server-example/debug-websocket.js deleted file mode 100644 index 4eab4cc..0000000 --- a/server-example/debug-websocket.js +++ /dev/null @@ -1,116 +0,0 @@ -// WebSocket调试脚本 - 专注于连接和认证 -const WebSocket = require('ws'); - -// 服务器地址 -const SERVER_URL = 'ws://localhost:3003'; -const customerServiceId = '22'; // 刘杨的ID - -console.log('=== WebSocket认证详细调试 ==='); -console.log(`连接服务器: ${SERVER_URL}`); - -// 创建WebSocket连接 -const ws = new WebSocket(SERVER_URL, { - perMessageDeflate: false, - headers: { - 'User-Agent': 'Debug-Client', - 'Connection': 'Upgrade' - } -}); - -// 连接事件 -ws.on('open', () => { - console.log('✅ WebSocket连接已建立'); - - // 延迟100ms发送认证消息,确保连接完全就绪 - setTimeout(() => { - // 使用正确的认证格式 - 必须有type: 'auth' - const authMessage = { - type: 'auth', // 必须是'auth'才能被服务器识别为认证消息 - managerId: customerServiceId, - userType: 'manager' // 用户类型使用不同的字段名 - }; - - const messageString = JSON.stringify(authMessage); - console.log('📤 发送认证消息:', messageString); - console.log(' 消息长度:', messageString.length, '字节'); - - try { - const sent = ws.send(messageString); - console.log(' 发送结果:', sent ? '成功放入发送队列' : '发送失败'); - } catch (e) { - console.error(' 发送时异常:', e.message); - } - }, 100); -}); - -// 接收消息事件 -ws.on('message', (data) => { - console.log('📥 收到服务器消息:'); - try { - const message = JSON.parse(data.toString()); - console.log(' 消息内容:', JSON.stringify(message, null, 2)); - - if (message.type === 'auth_success') { - console.log('🎉 认证成功!'); - } else if (message.type === 'auth_error') { - console.log('❌ 认证失败:', message.message); - } - } catch (e) { - console.error(' 解析消息失败:', e.message); - console.log(' 原始消息:', data.toString()); - } -}); - -// 关闭事件 -ws.on('close', (code, reason) => { - console.log('❌ WebSocket连接已关闭'); - console.log(' 关闭代码:', code); - console.log(' 关闭原因:', reason.toString()); - - // 常见关闭代码说明 - if (code === 1000) console.log(' 说明: 正常关闭'); - if (code === 1001) console.log(' 说明: 终端离开'); - if (code === 1006) console.log(' 说明: 连接意外关闭'); - if (code === 1011) console.log(' 说明: 服务器内部错误'); -}); - -// 错误事件 -ws.on('error', (error) => { - console.error('❌ WebSocket错误:'); - console.error(' 错误类型:', error.name); - console.error(' 错误消息:', error.message); - console.error(' 错误堆栈:', error.stack); -}); - -// 发送缓冲区事件 -ws.on('drain', () => { - console.log('🗑️ 发送缓冲区已清空'); -}); - -// 连接超时处理 -setTimeout(() => { - if (ws.readyState === WebSocket.OPEN) { - console.log('⏰ 10秒超时,关闭连接'); - ws.close(); - } -}, 10000); - -// 定期检查连接状态 -let checkInterval = setInterval(() => { - const state = { - 0: 'CONNECTING', - 1: 'OPEN', - 2: 'CLOSING', - 3: 'CLOSED' - }[ws.readyState]; - - console.log(`🔄 连接状态: ${state}`); - - if (ws.readyState === WebSocket.CLOSED) { - clearInterval(checkInterval); - console.log('\n=== 调试结束 ==='); - } -}, 1000); - -console.log('=== 开始调试 ==='); -console.log('按Ctrl+C停止调试'); diff --git a/server-example/debug_complete_flow.js b/server-example/debug_complete_flow.js deleted file mode 100644 index e73779a..0000000 --- a/server-example/debug_complete_flow.js +++ /dev/null @@ -1,193 +0,0 @@ -// 完整聊天流程调试脚本 -const WebSocket = require('ws'); - -const WS_URL = 'ws://localhost:3003'; -const TEST_MANAGER_ID = '22'; -const TEST_CUSTOMER_ID = 'test_customer_1'; -let customerWs = null; -let managerWs = null; -let currentConversationId = null; - -// 启动调试 -async function startDebug() { - console.log('=== 启动完整聊天流程调试 ==='); - - try { - // 连接客服WebSocket - await connectManager(); - - // 连接客户WebSocket - await connectCustomer(); - - // 等待连接稳定 - await new Promise(resolve => setTimeout(resolve, 2000)); - - // 客户发送消息 - await customerSendMessage(); - - // 等待客服收到消息 - await new Promise(resolve => setTimeout(resolve, 3000)); - - // 如果会话ID有效,客服回复消息 - if (currentConversationId) { - await managerReplyMessage(currentConversationId); - } - - } catch (error) { - console.error('❌ 调试过程中出现错误:', error); - } finally { - console.log('=== 调试结束 ==='); - if (customerWs && customerWs.readyState === WebSocket.OPEN) { - customerWs.close(); - } - if (managerWs && managerWs.readyState === WebSocket.OPEN) { - managerWs.close(); - } - } -} - -// 连接客服WebSocket -function connectManager() { - return new Promise((resolve, reject) => { - managerWs = new WebSocket(WS_URL); - - managerWs.on('open', () => { - console.log('✅ 客服WebSocket连接已建立'); - - // 发送认证消息 - const authMsg = JSON.stringify({ - type: 'auth', - managerId: TEST_MANAGER_ID, - userType: 'manager' - }); - managerWs.send(authMsg); - }); - - managerWs.on('message', (data) => { - const message = JSON.parse(data.toString()); - console.log('📥 客服收到消息:', JSON.stringify(message)); - - if (message.type === 'auth_success') { - console.log('✅ 客服认证成功'); - resolve(); - } else if (message.type === 'new_message' && message.payload) { - // 记录会话ID - if (message.payload.conversationId) { - currentConversationId = message.payload.conversationId; - console.log(`📝 获取到会话ID: ${currentConversationId}`); - } - } - }); - - managerWs.on('error', (error) => { - console.error('❌ 客服WebSocket错误:', error); - reject(error); - }); - - setTimeout(() => { - reject(new Error('客服连接或认证超时')); - }, 5000); - }); -} - -// 连接客户WebSocket -function connectCustomer() { - return new Promise((resolve, reject) => { - customerWs = new WebSocket(WS_URL); - - customerWs.on('open', () => { - console.log('✅ 客户WebSocket连接已建立'); - - // 发送认证消息 - const authMsg = JSON.stringify({ - type: 'auth', - userId: TEST_CUSTOMER_ID, - userType: 'user' - }); - customerWs.send(authMsg); - }); - - customerWs.on('message', (data) => { - const message = JSON.parse(data.toString()); - console.log('📥 客户收到消息:', JSON.stringify(message)); - - if (message.type === 'auth_success') { - console.log('✅ 客户认证成功'); - resolve(); - } - }); - - customerWs.on('error', (error) => { - console.error('❌ 客户WebSocket错误:', error); - reject(error); - }); - - setTimeout(() => { - reject(new Error('客户连接或认证超时')); - }, 5000); - }); -} - -// 客户发送消息 -function customerSendMessage() { - return new Promise((resolve, reject) => { - const messageId = 'test_customer_' + Date.now(); - const message = { - type: 'chat_message', - payload: { - messageId: messageId, - managerId: TEST_MANAGER_ID, - content: '你好,我是测试客户,有问题咨询', - contentType: 1 - } - }; - - console.log('📤 客户发送消息:', JSON.stringify(message)); - customerWs.send(JSON.stringify(message)); - - // 等待发送确认 - const messageHandler = (data) => { - const response = JSON.parse(data.toString()); - if (response.type === 'message_sent' && response.payload.messageId === messageId) { - customerWs.off('message', messageHandler); - console.log('✅ 客户消息发送成功'); - resolve(); - } - }; - - customerWs.on('message', messageHandler); - - setTimeout(() => { - customerWs.off('message', messageHandler); - reject(new Error('客户消息发送超时')); - }, 5000); - }); -} - -// 客服回复消息 -function managerReplyMessage(conversationId) { - return new Promise((resolve, reject) => { - const messageId = 'test_manager_' + Date.now(); - // 尝试使用更简单的格式,只包含最基本的字段 - // 参考客户发送消息的格式,但使用conversationId而不是managerId - const replyMessage = { - type: 'chat_message', - payload: { - content: '您好,我是客服,请问有什么可以帮助您的?', // 必须字段 - conversationId: conversationId, // 必须字段,确定会话 - contentType: 1 // 必须字段 - } - }; - - console.log('📤 客服发送回复消息:', JSON.stringify(replyMessage)); - managerWs.send(JSON.stringify(replyMessage)); - - // 设置超时 - setTimeout(() => { - resolve(); - }, 3000); - }); -} - -// 启动调试 -startDebug(); \ No newline at end of file diff --git a/server-example/debug_final.js b/server-example/debug_final.js deleted file mode 100644 index 8006e5b..0000000 --- a/server-example/debug_final.js +++ /dev/null @@ -1,112 +0,0 @@ -// 最终调试脚本 -const WebSocket = require('ws'); - -const WS_URL = 'ws://localhost:3003'; -const TEST_MANAGER_ID = '22'; -const TEST_CONVERSATION_ID = '4fa4b92f-df20-40ae-94b9-f906753a4cfd'; -let managerWs = null; -let startTime = null; - -console.log('=== 启动最终调试 ==='); -console.log(`测试会话ID: ${TEST_CONVERSATION_ID}`); - -// 连接客服WebSocket -managerWs = new WebSocket(WS_URL); - -managerWs.on('open', () => { - console.log('✅ 客服WebSocket连接已建立'); - startTime = Date.now(); - - // 发送认证消息 - const authMsg = JSON.stringify({ - type: 'auth', - managerId: TEST_MANAGER_ID, - userType: 'manager' - }); - console.log('📤 客服发送认证消息:', authMsg); - managerWs.send(authMsg); -}); - -managerWs.on('message', (data) => { - try { - const message = JSON.parse(data.toString()); - console.log(`📥 客服收到消息 (${Date.now() - startTime}ms):`, JSON.stringify(message)); - - if (message.type === 'auth_success') { - console.log('✅ 客服认证成功'); - - // 等待1秒后发送测试消息 - setTimeout(() => { - sendTestMessage(); - }, 1000); - } - - if (message.type === 'error') { - console.error('❌ 接收到错误消息:', message.message); - - // 如果收到错误,尝试发送替代格式 - setTimeout(() => { - console.log('\n🔄 尝试替代格式...'); - sendAlternativeFormat(); - }, 2000); - } - - if (message.type === 'message_sent') { - console.log('✅ 消息发送成功!'); - - // 5秒后关闭连接 - setTimeout(() => { - console.log('\n=== 调试成功完成 ==='); - managerWs.close(); - }, 5000); - } - } catch (e) { - console.error('❌ 解析消息失败:', e); - } -}); - -managerWs.on('error', (error) => { - console.error('❌ 客服WebSocket错误:', error); -}); - -managerWs.on('close', () => { - console.log('❌ 客服WebSocket连接已关闭'); -}); - -// 发送测试消息 -function sendTestMessage() { - const messageId = 'test_manager_' + Date.now(); - const testMessage = { - type: 'chat_message', - payload: { - messageId: messageId, - conversationId: TEST_CONVERSATION_ID, - content: '测试消息:这是客服发送的测试消息', - contentType: 1 - } - }; - - console.log('\n📤 客服发送消息:', JSON.stringify(testMessage)); - managerWs.send(JSON.stringify(testMessage)); -} - -// 发送替代格式消息 -function sendAlternativeFormat() { - const messageId = 'test_manager_alt_' + Date.now(); - const alternativeMessage = { - type: 'chat_message', - messageId: messageId, - conversationId: TEST_CONVERSATION_ID, - content: '测试替代格式:不使用payload包装', - contentType: 1 - }; - - console.log('📤 客服发送替代格式消息:', JSON.stringify(alternativeMessage)); - managerWs.send(JSON.stringify(alternativeMessage)); - - // 5秒后关闭连接 - setTimeout(() => { - console.log('\n=== 调试结束 ==='); - managerWs.close(); - }, 5000); -} \ No newline at end of file diff --git a/server-example/debug_full_flow.js b/server-example/debug_full_flow.js deleted file mode 100644 index 10805ef..0000000 --- a/server-example/debug_full_flow.js +++ /dev/null @@ -1,215 +0,0 @@ -// 完整流程调试脚本 -const WebSocket = require('ws'); - -const WS_URL = 'ws://localhost:3003'; -const TEST_MANAGER_ID = '22'; -let managerWs = null; -let userWs = null; -let newConversationId = null; -let testUserId = 'test_customer_' + Date.now(); - -console.log('=== 启动完整流程调试 ==='); -console.log(`测试用户ID: ${testUserId}`); - -// 步骤1: 连接客服并认证 -function connectManager() { - return new Promise((resolve) => { - managerWs = new WebSocket(WS_URL); - - managerWs.on('open', () => { - console.log('✅ 客服WebSocket连接已建立'); - - // 发送认证消息 - const authMsg = JSON.stringify({ - type: 'auth', - managerId: TEST_MANAGER_ID, - userType: 'manager' - }); - console.log('📤 客服发送认证消息:', authMsg); - managerWs.send(authMsg); - }); - - managerWs.on('message', (data) => { - try { - const message = JSON.parse(data.toString()); - console.log('📥 客服收到消息:', JSON.stringify(message)); - - if (message.type === 'auth_success') { - console.log('✅ 客服认证成功'); - resolve(); - } - } catch (e) { - console.error('❌ 客服解析消息失败:', e); - } - }); - }); -} - -// 步骤2: 连接用户并认证 -function connectUser() { - return new Promise((resolve) => { - userWs = new WebSocket(WS_URL); - - userWs.on('open', () => { - console.log('✅ 客户WebSocket连接已建立'); - - // 发送认证消息 - const authMsg = JSON.stringify({ - type: 'auth', - userId: testUserId, - userType: 'user' - }); - console.log('📤 客户发送认证消息:', authMsg); - userWs.send(authMsg); - }); - - userWs.on('message', (data) => { - try { - const message = JSON.parse(data.toString()); - console.log('📥 客户收到消息:', JSON.stringify(message)); - - if (message.type === 'auth_success') { - console.log('✅ 客户认证成功'); - resolve(); - } - } catch (e) { - console.error('❌ 客户解析消息失败:', e); - } - }); - }); -} - -// 步骤3: 用户发送消息创建新会话 -function userSendMessage() { - return new Promise((resolve) => { - const messageId = 'test_user_' + Date.now(); - const userMessage = { - type: 'chat_message', - payload: { - messageId: messageId, - managerId: TEST_MANAGER_ID, - content: '你好,我是测试客户,我想咨询一个问题', - contentType: 1 - } - }; - - console.log('\n📤 客户发送消息:', JSON.stringify(userMessage)); - userWs.send(JSON.stringify(userMessage)); - - // 监听消息发送成功确认 - const userMessageHandler = (data) => { - try { - const message = JSON.parse(data.toString()); - if (message.type === 'message_sent') { - console.log('✅ 客户消息发送成功确认'); - newConversationId = message.payload.conversationId; - console.log('📝 新创建的会话ID:', newConversationId); - userWs.removeListener('message', userMessageHandler); - resolve(); - } - } catch (e) { - console.error('❌ 解析用户消息响应失败:', e); - } - }; - - userWs.addListener('message', userMessageHandler); - }); -} - -// 步骤4: 客服使用新会话ID回复消息 -function managerReplyMessage() { - return new Promise((resolve) => { - if (!newConversationId) { - console.error('❌ 没有获取到会话ID'); - resolve(false); - return; - } - - const messageId = 'test_manager_' + Date.now(); - const replyMessage = { - type: 'chat_message', - payload: { - messageId: messageId, - conversationId: newConversationId, - content: '您好,我是客服,请问有什么可以帮助您的?', - contentType: 1 - } - }; - - console.log('\n📤 客服发送回复消息:', JSON.stringify(replyMessage)); - managerWs.send(JSON.stringify(replyMessage)); - - // 监听回复消息的结果 - const managerMessageHandler = (data) => { - try { - const message = JSON.parse(data.toString()); - console.log('📥 客服收到回复结果:', JSON.stringify(message)); - - if (message.type === 'error') { - console.error('❌ 客服回复失败:', message.message); - managerWs.removeListener('message', managerMessageHandler); - resolve(false); - } else if (message.type === 'message_sent') { - console.log('✅ 客服回复发送成功!'); - managerWs.removeListener('message', managerMessageHandler); - resolve(true); - } - } catch (e) { - console.error('❌ 解析客服消息响应失败:', e); - } - }; - - managerWs.addListener('message', managerMessageHandler); - }); -} - -// 主函数 -async function main() { - try { - // 连接客服 - await connectManager(); - await new Promise(resolve => setTimeout(resolve, 1000)); - - // 连接用户 - await connectUser(); - await new Promise(resolve => setTimeout(resolve, 1000)); - - // 用户发送消息创建会话 - await userSendMessage(); - await new Promise(resolve => setTimeout(resolve, 2000)); - - // 客服回复消息 - const success = await managerReplyMessage(); - - if (!success) { - console.log('\n🔄 尝试替代格式...'); - // 尝试不使用payload包装 - const messageId = 'test_manager_alt_' + Date.now(); - const alternativeMessage = { - type: 'chat_message', - messageId: messageId, - conversationId: newConversationId, - content: '测试替代格式:不使用payload包装', - contentType: 1 - }; - - console.log('📤 客服发送替代格式消息:', JSON.stringify(alternativeMessage)); - managerWs.send(JSON.stringify(alternativeMessage)); - } - - // 等待5秒后关闭连接 - setTimeout(() => { - console.log('\n=== 调试结束 ==='); - if (managerWs) managerWs.close(); - if (userWs) userWs.close(); - }, 5000); - - } catch (error) { - console.error('❌ 调试过程中出错:', error); - if (managerWs) managerWs.close(); - if (userWs) userWs.close(); - } -} - -// 启动调试 -main(); \ No newline at end of file diff --git a/server-example/debug_log_server.js b/server-example/debug_log_server.js deleted file mode 100644 index b4dae56..0000000 --- a/server-example/debug_log_server.js +++ /dev/null @@ -1,86 +0,0 @@ -// 服务器日志调试脚本 -const WebSocket = require('ws'); - -const WS_URL = 'ws://localhost:3003'; -const TEST_MANAGER_ID = '22'; -let managerWs = null; - -console.log('=== 启动服务器日志调试 ==='); - -// 连接客服WebSocket -managerWs = new WebSocket(WS_URL); - -managerWs.on('open', () => { - console.log('✅ 客服WebSocket连接已建立'); - - // 发送认证消息 - const authMsg = JSON.stringify({ - type: 'auth', - managerId: TEST_MANAGER_ID, - userType: 'manager' - }); - console.log('📤 客服发送认证消息'); - managerWs.send(authMsg); -}); - -managerWs.on('message', (data) => { - try { - const message = JSON.parse(data.toString()); - console.log('📥 客服收到消息类型:', message.type); - - if (message.type === 'auth_success') { - console.log('✅ 客服认证成功'); - - // 等待2秒后发送测试消息 - setTimeout(() => { - sendTestMessage(); - }, 2000); - } - - if (message.type === 'error') { - console.error('❌ 错误消息:', message.message); - } - - if (message.type === 'message_sent') { - console.log('✅ 消息发送成功!'); - } - } catch (e) { - console.error('❌ 解析消息失败:', e); - } -}); - -managerWs.on('error', (error) => { - console.error('❌ WebSocket错误:', error); -}); - -managerWs.on('close', () => { - console.log('❌ WebSocket连接已关闭'); -}); - -// 发送测试消息 -function sendTestMessage() { - // 使用一个固定的会话ID进行测试 - const conversationId = '4fa4b92f-df20-40ae-94b9-f906753a4cfd'; - const messageId = 'test_debug_' + Date.now(); - - console.log(`\n📤 发送测试消息 - 会话ID: ${conversationId}, 消息ID: ${messageId}`); - - const testMessage = { - type: 'chat_message', - payload: { - messageId: messageId, - conversationId: conversationId, - content: '服务器日志调试消息', - contentType: 1 - } - }; - - managerWs.send(JSON.stringify(testMessage)); - - // 5秒后退出 - setTimeout(() => { - console.log('\n=== 调试结束 ==='); - managerWs.close(); - process.exit(0); - }, 5000); -} \ No newline at end of file diff --git a/server-example/debug_simple.js b/server-example/debug_simple.js deleted file mode 100644 index d31f233..0000000 --- a/server-example/debug_simple.js +++ /dev/null @@ -1,111 +0,0 @@ -// 极简调试脚本 -const WebSocket = require('ws'); - -const WS_URL = 'ws://localhost:3003'; -const TEST_MANAGER_ID = '22'; -let managerWs = null; - -// 启动调试 -function startDebug() { - console.log('=== 启动极简调试 ==='); - - // 连接客服WebSocket - managerWs = new WebSocket(WS_URL); - - managerWs.on('open', () => { - console.log('✅ 客服WebSocket连接已建立'); - - // 发送认证消息 - const authMsg = JSON.stringify({ - type: 'auth', - managerId: TEST_MANAGER_ID, - userType: 'manager' - }); - managerWs.send(authMsg); - }); - - managerWs.on('message', (data) => { - try { - const message = JSON.parse(data.toString()); - console.log('📥 收到消息:', JSON.stringify(message)); - - if (message.type === 'auth_success') { - console.log('✅ 客服认证成功'); - - // 等待2秒后发送测试消息 - setTimeout(() => { - // 尝试发送测试消息,使用不同的格式 - sendTestMessage(); - }, 2000); - } - } catch (e) { - console.error('❌ 解析消息失败:', e); - } - }); - - managerWs.on('error', (error) => { - console.error('❌ WebSocket错误:', error); - }); - - managerWs.on('close', () => { - console.log('❌ WebSocket连接已关闭'); - }); -} - -// 发送测试消息 -function sendTestMessage() { - console.log('\n🔄 测试不同的消息格式...'); - - // 测试格式1: 不使用payload包装 - const format1 = { - type: 'chat_message', - conversationId: '4fa4b92f-df20-40ae-94b9-f906753a4cfd', - content: '测试格式1: 不使用payload包装', - contentType: 1 - }; - - console.log('\n📤 发送格式1:', JSON.stringify(format1)); - managerWs.send(JSON.stringify(format1)); - - // 等待1秒后发送下一个格式 - setTimeout(() => { - // 测试格式2: 使用payload包装,但字段名改为驼峰式 - const format2 = { - type: 'chat_message', - payload: { - conversationId: '4fa4b92f-df20-40ae-94b9-f906753a4cfd', - content: '测试格式2: 使用payload包装', - contentType: 1 - } - }; - - console.log('\n📤 发送格式2:', JSON.stringify(format2)); - managerWs.send(JSON.stringify(format2)); - - // 等待1秒后发送下一个格式 - setTimeout(() => { - // 测试格式3: 使用payload包装,添加messageId - const format3 = { - type: 'chat_message', - payload: { - messageId: 'test_' + Date.now(), - conversationId: '4fa4b92f-df20-40ae-94b9-f906753a4cfd', - content: '测试格式3: 添加messageId', - contentType: 1 - } - }; - - console.log('\n📤 发送格式3:', JSON.stringify(format3)); - managerWs.send(JSON.stringify(format3)); - - // 等待5秒后关闭连接 - setTimeout(() => { - console.log('\n=== 调试结束 ==='); - managerWs.close(); - }, 5000); - }, 1000); - }, 1000); -} - -// 启动调试 -startDebug(); \ No newline at end of file diff --git a/server-example/debug_verbose.js b/server-example/debug_verbose.js deleted file mode 100644 index 06cde18..0000000 --- a/server-example/debug_verbose.js +++ /dev/null @@ -1,191 +0,0 @@ -// 详细调试脚本,带更多日志记录 -const WebSocket = require('ws'); - -const WS_URL = 'ws://localhost:3003'; -const TEST_MANAGER_ID = '22'; -const TEST_CONVERSATION_ID = '4fa4b92f-df20-40ae-94b9-f906753a4cfd'; // 使用已知的会话ID -let managerWs = null; -let userWs = null; - -console.log('=== 启动详细调试 ==='); -console.log(`测试会话ID: ${TEST_CONVERSATION_ID}`); - -// 连接客服WebSocket -function connectManager() { - return new Promise((resolve, reject) => { - managerWs = new WebSocket(WS_URL); - - managerWs.on('open', () => { - console.log('✅ 客服WebSocket连接已建立'); - - // 发送认证消息 - const authMsg = JSON.stringify({ - type: 'auth', - managerId: TEST_MANAGER_ID, - userType: 'manager' - }); - console.log('📤 客服发送认证消息:', authMsg); - managerWs.send(authMsg); - }); - - managerWs.on('message', (data) => { - try { - const message = JSON.parse(data.toString()); - console.log('📥 客服收到消息:', JSON.stringify(message)); - - if (message.type === 'auth_success') { - console.log('✅ 客服认证成功'); - resolve(); - } - } catch (e) { - console.error('❌ 客服解析消息失败:', e); - } - }); - - managerWs.on('error', (error) => { - console.error('❌ 客服WebSocket错误:', error); - reject(error); - }); - - managerWs.on('close', () => { - console.log('❌ 客服WebSocket连接已关闭'); - }); - }); -} - -// 连接用户WebSocket -function connectUser() { - return new Promise((resolve, reject) => { - const userId = 'test_customer_' + Date.now(); - userWs = new WebSocket(WS_URL); - - userWs.on('open', () => { - console.log('✅ 客户WebSocket连接已建立'); - - // 发送认证消息 - const authMsg = JSON.stringify({ - type: 'auth', - userId: userId, - userType: 'user' - }); - console.log('📤 客户发送认证消息:', authMsg); - userWs.send(authMsg); - }); - - userWs.on('message', (data) => { - try { - const message = JSON.parse(data.toString()); - console.log('📥 客户收到消息:', JSON.stringify(message)); - - if (message.type === 'auth_success') { - console.log('✅ 客户认证成功'); - resolve(); - } - } catch (e) { - console.error('❌ 客户解析消息失败:', e); - } - }); - - userWs.on('error', (error) => { - console.error('❌ 客户WebSocket错误:', error); - reject(error); - }); - - userWs.on('close', () => { - console.log('❌ 客户WebSocket连接已关闭'); - }); - }); -} - -// 发送测试消息 -function sendTestMessage() { - return new Promise((resolve) => { - console.log('\n🔄 客服发送测试消息...'); - - const messageId = 'test_manager_' + Date.now(); - const testMessage = { - type: 'chat_message', - payload: { - messageId: messageId, - conversationId: TEST_CONVERSATION_ID, - content: '测试消息:这是客服发送的测试消息', - contentType: 1 - } - }; - - console.log('📤 客服发送消息:', JSON.stringify(testMessage)); - managerWs.send(JSON.stringify(testMessage)); - - // 监听错误响应 - const originalOnMessage = managerWs.onmessage; - managerWs.onmessage = (event) => { - originalOnMessage(event); - try { - const message = JSON.parse(event.data.toString()); - if (message.type === 'error') { - console.error('❌ 接收到错误消息:', message.message); - resolve(false); - } else if (message.type === 'message_sent') { - console.log('✅ 消息发送成功确认'); - resolve(true); - } - } catch (e) { - console.error('❌ 解析响应消息失败:', e); - } - }; - - // 5秒后超时 - setTimeout(() => { - console.log('⌛ 消息发送超时'); - resolve(false); - }, 5000); - }); -} - -// 主函数 -async function main() { - try { - // 连接客服 - await connectManager(); - await new Promise(resolve => setTimeout(resolve, 1000)); - - // 连接用户(可选) - // await connectUser(); - // await new Promise(resolve => setTimeout(resolve, 1000)); - - // 发送测试消息 - const success = await sendTestMessage(); - - if (!success) { - console.log('\n🔄 尝试另一种格式...'); - - // 尝试不使用payload包装 - const messageId = 'test_manager_alt_' + Date.now(); - const alternativeMessage = { - type: 'chat_message', - messageId: messageId, - conversationId: TEST_CONVERSATION_ID, - content: '测试替代格式:不使用payload包装', - contentType: 1 - }; - - console.log('📤 客服发送替代格式消息:', JSON.stringify(alternativeMessage)); - managerWs.send(JSON.stringify(alternativeMessage)); - } - - // 等待5秒后关闭连接 - setTimeout(() => { - console.log('\n=== 调试结束 ==='); - if (managerWs) managerWs.close(); - if (userWs) userWs.close(); - }, 5000); - - } catch (error) { - console.error('❌ 调试过程中出错:', error); - if (managerWs) managerWs.close(); - if (userWs) userWs.close(); - } -} - -// 启动调试 -main(); \ No newline at end of file diff --git a/server-example/direct-db-check.js b/server-example/direct-db-check.js deleted file mode 100644 index f6ba3d0..0000000 --- a/server-example/direct-db-check.js +++ /dev/null @@ -1,175 +0,0 @@ -// 直接连接数据库检查productQuantity字段的脚本 -const Sequelize = require('sequelize'); -const mysql = require('mysql2/promise'); - -// 数据库连接配置 -const sequelize = new Sequelize( - 'minishop', // 数据库名 - 'root', // 用户名 - 'password', // 密码 - { - host: 'localhost', - dialect: 'mysql', - pool: { - max: 5, - min: 0, - acquire: 30000, - idle: 10000 - }, - timezone: '+08:00' // 设置时区为UTC+8 - } -); - -// 定义购物车模型 - 直接复制自server-mysql.js -class CartItem extends Sequelize.Model {} -CartItem.init({ - id: { - type: Sequelize.DataTypes.INTEGER, - autoIncrement: true, - primaryKey: true - }, - userId: { - type: Sequelize.DataTypes.STRING(100), - allowNull: false - }, - productId: { - type: Sequelize.DataTypes.STRING(100), - allowNull: false - }, - productName: { - type: Sequelize.DataTypes.STRING(255), - allowNull: false - }, - specification: { - type: Sequelize.DataTypes.STRING(255) - }, - quantity: { - type: Sequelize.DataTypes.INTEGER, - allowNull: false, - defaultValue: 1 - }, - productQuantity: { - type: Sequelize.DataTypes.INTEGER, - allowNull: false, - defaultValue: 0 - }, - grossWeight: { - type: Sequelize.DataTypes.DECIMAL(10, 2) - }, - yolk: { - type: Sequelize.DataTypes.STRING(100) - }, - price: { - type: Sequelize.DataTypes.DECIMAL(10, 2) - }, - selected: { - type: Sequelize.DataTypes.BOOLEAN, - defaultValue: true - }, - added_at: { - type: Sequelize.DataTypes.DATE, - defaultValue: Sequelize.NOW - } -}, { - sequelize, - modelName: 'CartItem', - tableName: 'cart_items', - timestamps: false -}); - -// 检查数据库结构 -async function checkDatabaseStructure() { - console.log('开始直接检查数据库中的productQuantity字段...'); - - try { - // 检查连接 - await sequelize.authenticate(); - console.log('✅ 数据库连接成功'); - - // 1. 使用原始查询检查表结构 - console.log('\n1. 检查cart_items表结构...'); - const [fields, _] = await sequelize.query('DESCRIBE cart_items'); - - // 查找productQuantity字段 - const productQuantityField = fields.find(field => field.Field === 'productQuantity'); - - if (productQuantityField) { - console.log('✅ 数据库中存在productQuantity字段:'); - console.log(` - 类型: ${productQuantityField.Type}`); - console.log(` - 是否允许NULL: ${productQuantityField.Null === 'YES' ? '是' : '否'}`); - console.log(` - 默认值: ${productQuantityField.Default || '无'}`); - } else { - console.error('❌ 数据库中不存在productQuantity字段!'); - console.log('cart_items表中的所有字段:', fields.map(field => field.Field).join(', ')); - - // 如果不存在,尝试添加这个字段 - console.log('\n尝试添加productQuantity字段到cart_items表...'); - try { - await sequelize.query('ALTER TABLE cart_items ADD COLUMN productQuantity INT NOT NULL DEFAULT 0'); - console.log('✅ 成功添加productQuantity字段'); - } catch (addError) { - console.error('❌ 添加字段失败:', addError.message); - } - } - - // 2. 检查test_user_id的购物车数据 - console.log('\n2. 检查测试用户的购物车数据...'); - const cartItems = await CartItem.findAll({ - where: { - userId: 'test_user_id' - }, - // 明确指定返回所有字段 - attributes: { - exclude: [] // 不排除任何字段 - } - }); - - console.log(`找到 ${cartItems.length} 条购物车记录`); - - if (cartItems.length > 0) { - // 显示第一条记录的所有字段 - console.log('\n第一条购物车记录的所有字段:'); - const firstItem = cartItems[0].toJSON(); - Object.keys(firstItem).forEach(key => { - console.log(` - ${key}: ${firstItem[key]}`); - }); - - // 特别检查productQuantity字段 - console.log('\nproductQuantity字段在数据中的状态:'); - cartItems.forEach((item, index) => { - const data = item.toJSON(); - console.log(` 记录 ${index + 1}: productQuantity = ${data.productQuantity !== undefined ? data.productQuantity : 'undefined'}`); - }); - } - - // 3. 尝试直接插入一条带productQuantity的记录 - console.log('\n3. 尝试直接插入一条带productQuantity的记录...'); - const testProductId = 'db_test_' + Date.now(); - const newItem = await CartItem.create({ - userId: 'test_user_id', - productId: testProductId, - productName: '数据库测试商品', - specification: '测试规格', - quantity: 2, - productQuantity: 10, - grossWeight: 1000, - yolk: '测试蛋黄', - price: 50, - selected: true, - added_at: new Date() - }); - - console.log('✅ 成功插入记录'); - console.log('插入的记录详情:', newItem.toJSON()); - - } catch (error) { - console.error('检查过程中发生错误:', error.message); - } finally { - // 关闭连接 - await sequelize.close(); - console.log('\n数据库连接已关闭'); - } -} - -// 执行检查 -checkDatabaseStructure(); \ No newline at end of file diff --git a/server-example/find-product-creator.js b/server-example/find-product-creator.js deleted file mode 100644 index d53e1ea..0000000 --- a/server-example/find-product-creator.js +++ /dev/null @@ -1,61 +0,0 @@ -// 查询特定名称商品的创建者 - -const dotenv = require('dotenv'); -const mysql = require('mysql2/promise'); -const path = require('path'); - -// 加载环境变量 -dotenv.config({ path: path.resolve(__dirname, '.env') }); - -// 数据库连接配置 -const dbConfig = { - host: process.env.DB_HOST || 'localhost', - port: process.env.DB_PORT || 3306, - user: process.env.DB_USER || 'root', - password: process.env.DB_PASSWORD || '', - database: process.env.DB_NAME || 'wechat_app', - timezone: '+08:00' // 设置时区为UTC+8 -}; - -async function findProductCreator() { - let connection; - try { - // 连接数据库 - connection = await mysql.createConnection(dbConfig); - console.log('数据库连接成功'); - - // 查询名称为88888的商品及其创建者 - const [products] = await connection.query(` - SELECT p.productId, p.productName, p.sellerId, u.userId, u.nickName, u.phoneNumber - FROM products p - LEFT JOIN users u ON p.sellerId = u.userId - WHERE p.productName = '88888' - `); - - if (products.length === 0) { - console.log('未找到名称为88888的商品'); - return; - } - - console.log(`找到 ${products.length} 个名称为88888的商品:`); - products.forEach((product, index) => { - console.log(`\n商品 ${index + 1}:`); - console.log(` 商品ID: ${product.productId}`); - console.log(` 商品名称: ${product.productName}`); - console.log(` 创建者ID: ${product.sellerId}`); - console.log(` 创建者昵称: ${product.nickName || '未设置'}`); - console.log(` 创建者手机号: ${product.phoneNumber || '未设置'}`); - }); - - } catch (error) { - console.error('查询失败:', error.message); - } finally { - if (connection) { - await connection.end(); - console.log('\n数据库连接已关闭'); - } - } -} - -// 执行查询 -findProductCreator(); \ No newline at end of file diff --git a/server-example/fixed-server.js b/server-example/fixed-server.js deleted file mode 100644 index d32a12b..0000000 --- a/server-example/fixed-server.js +++ /dev/null @@ -1,85 +0,0 @@ -// 简单测试服务器 - 不连接数据库,专注于API接口测试和毛重字段处理 -const express = require('express'); -const bodyParser = require('body-parser'); -const path = require('path'); - -// 创建Express应用 -const app = express(); -const PORT = 3000; - -// 中间件 -app.use(bodyParser.json()); - -// 请求日志中间件 -app.use((req, res, next) => { - const now = new Date(); - console.log(`[${now.toISOString()}] 收到请求: ${req.method} ${req.url}`); - next(); -}); - -// 简单测试接口 -app.get('/api/test-connection', (req, res) => { - res.json({ - success: true, - message: '服务器连接测试成功', - timestamp: new Date().toISOString(), - serverInfo: { port: PORT } - }); -}); - -// 商品发布接口(简化版,专注于毛重处理) -app.post('/api/product/publish', (req, res) => { - try { - const { openid, product } = req.body; - console.log('收到商品发布请求:', { openid, product }); - - // 验证参数 - if (!openid || !product) { - return res.status(400).json({ success: false, message: '缺少必要参数' }); - } - - // 重点:毛重字段处理逻辑 - let grossWeightValue = product.grossWeight; - console.log('原始毛重值:', grossWeightValue, '类型:', typeof grossWeightValue); - - // 处理各种情况的毛重值 - if (grossWeightValue === '' || grossWeightValue === null || grossWeightValue === undefined || (typeof grossWeightValue === 'object' && grossWeightValue === null)) { - grossWeightValue = null; - console.log('毛重值为空或null,设置为null'); - } else { - // 转换为数字 - const numValue = Number(grossWeightValue); - if (!isNaN(numValue) && isFinite(numValue)) { - grossWeightValue = numValue; - console.log('毛重值成功转换为数字:', grossWeightValue); - } else { - grossWeightValue = null; - console.log('毛重值不是有效数字,设置为null'); - } - } - - // 返回处理结果 - return res.json({ - success: true, - message: '商品发布处理成功(模拟)', - processedData: { - productName: product.productName, - price: product.price, - quantity: product.quantity, - grossWeight: grossWeightValue, // 返回处理后的毛重值 - grossWeightType: typeof grossWeightValue - } - }); - - } catch (error) { - console.error('发布商品失败:', error); - res.status(500).json({ success: false, message: '服务器错误', error: error.message }); - } -}); - -// 启动服务器 -app.listen(PORT, () => { - console.log(`修复版服务器运行在 http://localhost:${PORT}`); - console.log('测试接口: http://localhost:3000/api/test-connection'); - console.log('商品发布接口: POST http://localhost:3000/api/product/publish'); -}); \ No newline at end of file diff --git a/server-example/update-product-contacts.zip b/server-example/update-product-contacts.zip deleted file mode 100644 index 88028e4..0000000 Binary files a/server-example/update-product-contacts.zip and /dev/null differ diff --git a/server-example/update-product-review-status.js b/server-example/update-product-review-status.js deleted file mode 100644 index 3a44624..0000000 --- a/server-example/update-product-review-status.js +++ /dev/null @@ -1,218 +0,0 @@ -// 更新商品审核状态脚本 - 将商品从pending_review改为reviewed -const { Sequelize, DataTypes, Model } = require('sequelize'); -require('dotenv').config(); -const readline = require('readline'); - -// 创建读取用户输入的接口 -const rl = readline.createInterface({ - input: process.stdin, - output: process.stdout -}); - -// MySQL数据库连接配置 -const sequelize = new Sequelize( - process.env.DB_DATABASE || 'wechat_app', - process.env.DB_USER || 'root', - process.env.DB_PASSWORD === undefined ? null : process.env.DB_PASSWORD, - { - host: process.env.DB_HOST || 'localhost', - port: process.env.DB_PORT || 3306, - dialect: 'mysql', - pool: { - max: 10, - min: 0, - acquire: 30000, - idle: 10000 - }, - timezone: '+08:00' // 设置时区为UTC+8 - } -); - -// 定义Product模型 -class Product extends Model { } -Product.init({ - id: { - type: DataTypes.INTEGER, - autoIncrement: true, - primaryKey: true - }, - productId: { - type: DataTypes.STRING(100), - allowNull: false, - unique: true - }, - sellerId: { - type: DataTypes.STRING(100), - allowNull: false - }, - productName: { - type: DataTypes.STRING(255), - allowNull: false - }, - status: { - type: DataTypes.STRING(20), - defaultValue: 'pending_review', - validate: { - isIn: [['pending_review', 'reviewed', 'published', 'sold_out', 'rejected', 'hidden']] - } - }, - created_at: { - type: DataTypes.DATE, - defaultValue: Sequelize.NOW - }, - updated_at: { - type: DataTypes.DATE, - defaultValue: Sequelize.NOW, - onUpdate: Sequelize.NOW - } -}, { - sequelize, - modelName: 'Product', - tableName: 'products', - timestamps: false -}); - -// 测试数据库连接 -async function testDbConnection() { - try { - await sequelize.authenticate(); - console.log('数据库连接成功'); - } catch (error) { - console.error('数据库连接失败:', error); - console.error('请检查.env文件中的数据库配置是否正确'); - process.exit(1); - } -} - -// 获取所有待审核商品 -async function getPendingReviewProducts() { - try { - const products = await Product.findAll({ - where: { - status: 'pending_review' - }, - attributes: ['id', 'productId', 'productName', 'created_at'] - }); - return products; - } catch (error) { - console.error('获取待审核商品失败:', error); - return []; - } -} - -// 更新单个商品状态 -async function updateSingleProduct(productId) { - try { - const result = await Product.update( - { - status: 'reviewed', - updated_at: new Date() - }, - { - where: { - productId: productId - } - } - ); - - if (result[0] > 0) { - console.log(`成功更新商品状态: ${productId}`); - return true; - } else { - console.log(`未找到商品: ${productId} 或该商品状态不是待审核`); - return false; - } - } catch (error) { - console.error(`更新商品状态失败: ${productId}`, error); - return false; - } -} - -// 更新所有待审核商品状态 -async function updateAllProducts() { - try { - const result = await Product.update( - { - status: 'reviewed', - updated_at: new Date() - }, - { - where: { - status: 'pending_review' - } - } - ); - - console.log(`成功更新 ${result[0]} 个商品的状态`); - return result[0]; - } catch (error) { - console.error('批量更新商品状态失败:', error); - return 0; - } -} - -// 主函数 -async function main() { - try { - await testDbConnection(); - - // 获取待审核商品列表 - const pendingProducts = await getPendingReviewProducts(); - - if (pendingProducts.length === 0) { - console.log('当前没有待审核的商品'); - rl.close(); - process.exit(0); - } - - console.log(`\n找到 ${pendingProducts.length} 个待审核的商品:`); - pendingProducts.forEach((product, index) => { - console.log(`${index + 1}. ID: ${product.productId}, 名称: ${product.productName}, 创建时间: ${product.created_at.toLocaleString()}`); - }); - - // 询问用户要更新单个还是所有商品 - rl.question('\n请选择操作 (1: 更新单个商品, 2: 更新所有商品, 0: 退出): ', async (choice) => { - switch (choice) { - case '1': - rl.question('请输入要更新的商品ID: ', async (productId) => { - await updateSingleProduct(productId); - rl.close(); - }); - break; - - case '2': - rl.question('确定要更新所有待审核商品的状态吗? (y/n): ', async (confirm) => { - if (confirm.toLowerCase() === 'y') { - await updateAllProducts(); - } else { - console.log('已取消操作'); - } - rl.close(); - }); - break; - - case '0': - console.log('已退出'); - rl.close(); - break; - - default: - console.log('无效的选择'); - rl.close(); - } - }); - - rl.on('close', () => { - console.log('\n操作已完成,小程序中刷新后即可看到已上架的货源'); - process.exit(0); - }); - - } catch (error) { - console.error('程序执行出错:', error); - rl.close(); - process.exit(1); - } -} - -// 启动程序 -main(); \ No newline at end of file diff --git a/server-example/user-association-auto-fix.js b/server-example/user-association-auto-fix.js deleted file mode 100644 index ebfde43..0000000 --- a/server-example/user-association-auto-fix.js +++ /dev/null @@ -1,285 +0,0 @@ -const { Sequelize } = require('sequelize'); -const fs = require('fs'); -const path = require('path'); - -// 读取环境变量 -const envPath = path.join(__dirname, '.env'); -if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf8'); - const envVars = envContent.split('\n').filter(line => line.trim() && !line.startsWith('#')); - envVars.forEach(line => { - const [key, value] = line.split('=').map(part => part.trim()); - process.env[key] = value; - }); -} - -// 数据库连接配置 -const sequelize = new Sequelize( - process.env.DB_NAME || 'wechat_app', - process.env.DB_USER || 'root', - process.env.DB_PASSWORD || '', - { - host: process.env.DB_HOST || 'localhost', - port: process.env.DB_PORT || 3306, - dialect: 'mysql', - logging: false, - timezone: '+08:00' // 设置时区为UTC+8 - } -); - -/** - * 检查并修复所有用户的关联记录 - * 这个函数会扫描所有用户,并为每个用户创建缺失的关联记录 - */ -async function checkAndFixAllUserAssociations() { - try { - console.log('========================================'); - console.log('检查并修复所有用户的关联记录'); - console.log('========================================'); - - // 连接数据库 - await sequelize.authenticate(); - console.log('✅ 数据库连接成功'); - - // 获取所有用户 - const users = await sequelize.query( - 'SELECT userId, nickName, phoneNumber FROM users', - { type: sequelize.QueryTypes.SELECT } - ); - - console.log(`📊 共找到 ${users.length} 个用户记录`); - - let totalContactsCreated = 0; - let totalManagementsCreated = 0; - let fullyFixedUsers = 0; - let partiallyFixedUsers = 0; - let alreadyFixedUsers = 0; - - // 为每个用户检查并创建关联记录 - for (let i = 0; i < users.length; i++) { - const user = users[i]; - console.log(`\n🔄 处理用户 ${i + 1}/${users.length}: ${user.userId}`); - - let contactsCreated = 0; - let managementsCreated = 0; - - // 检查并创建联系人记录 - try { - const existingContact = await sequelize.query( - 'SELECT * FROM contacts WHERE userId = ?', - { replacements: [user.userId], type: sequelize.QueryTypes.SELECT } - ); - - if (existingContact.length === 0) { - await sequelize.query( - 'INSERT INTO contacts (userId, nickName, phoneNumber) VALUES (?, ?, ?)', - { replacements: [user.userId, user.nickName || '默认联系人', user.phoneNumber || ''] } - ); - console.log('✅ 创建了联系人记录'); - contactsCreated++; - } else { - console.log('✅ 联系人记录已存在'); - } - } catch (error) { - console.error('❌ 创建联系人记录失败:', error.message); - } - - // 检查并创建用户管理记录 - try { - const existingManagement = await sequelize.query( - 'SELECT * FROM usermanagements WHERE userId = ?', - { replacements: [user.userId], type: sequelize.QueryTypes.SELECT } - ); - - if (existingManagement.length === 0) { - await sequelize.query( - 'INSERT INTO usermanagements (userId) VALUES (?)', - { replacements: [user.userId] } - ); - console.log('✅ 创建了用户管理记录'); - managementsCreated++; - } else { - console.log('✅ 用户管理记录已存在'); - } - } catch (error) { - console.error('❌ 创建用户管理记录失败:', error.message); - } - - // 更新统计信息 - totalContactsCreated += contactsCreated; - totalManagementsCreated += managementsCreated; - - if (contactsCreated === 0 && managementsCreated === 0) { - alreadyFixedUsers++; - } else if (contactsCreated > 0 || managementsCreated > 0) { - if (contactsCreated > 0 && managementsCreated > 0) { - fullyFixedUsers++; - } else { - partiallyFixedUsers++; - } - } - } - - console.log('\n========================================'); - console.log('修复完成!'); - console.log(`📊 总计: ${users.length} 个用户`); - console.log(`✅ 已经完整的用户: ${alreadyFixedUsers} 个`); - console.log(`🔧 完全修复的用户: ${fullyFixedUsers} 个`); - console.log(`⚠️ 部分修复的用户: ${partiallyFixedUsers} 个`); - console.log(`📈 共创建了 ${totalContactsCreated} 条联系人记录`); - console.log(`📈 共创建了 ${totalManagementsCreated} 条用户管理记录`); - console.log('========================================'); - - } catch (error) { - console.error('❌ 修复过程中发生错误:', error.message); - console.error('错误详情:', error); - } finally { - // 关闭数据库连接 - await sequelize.close(); - } -} - -/** - * 监控新用户并自动创建关联记录 - * 这个函数会定期检查新用户,并为其创建关联记录 - */ -async function monitorAndAutoFixNewUsers(intervalMinutes = 10) { - console.log(`\n🔄 启动新用户监控,每 ${intervalMinutes} 分钟检查一次`); - - // 保存上次检查的最大用户ID - let lastCheckedUserId = ''; - - async function checkNewUsers() { - try { - // 连接数据库 - await sequelize.authenticate(); - - // 获取最新的用户ID - const latestUser = await sequelize.query( - 'SELECT userId FROM users ORDER BY userId DESC LIMIT 1', - { type: sequelize.QueryTypes.SELECT } - ); - - if (latestUser.length > 0 && latestUser[0].userId !== lastCheckedUserId) { - console.log(`\n🕵️‍♂️ 检测到可能的新用户活动,运行完整检查`); - - // 重新运行修复函数检查所有用户 - await checkAndFixAllUserAssociations(); - - // 更新最后检查的用户ID - lastCheckedUserId = latestUser[0].userId; - } - - } catch (error) { - console.error('❌ 监控过程中发生错误:', error.message); - } finally { - // 关闭数据库连接 - await sequelize.close(); - } - } - - // 立即运行一次 - await checkNewUsers(); - - // 设置定期检查(在实际部署时启用) - // setInterval(checkNewUsers, intervalMinutes * 60 * 1000); -} - -/** - * 创建一个服务器文件补丁,确保新用户在授权时自动创建关联记录 - */ -function createServerPatch() { - console.log('\n========================================'); - console.log('创建服务器代码补丁'); - console.log('========================================'); - - const patchContent = `/** - * 用户关联记录创建工具函数 - * 用于在用户授权成功后自动创建contacts和usermanagements表关联记录 - */ -async function createUserAssociations(user) { - try { - // 确保用户对象有效 - if (!user || !user.userId) { - console.error('创建用户关联记录失败: 用户对象或userId无效'); - return false; - } - - console.log('为用户创建关联记录:', user.userId); - - // 1. 创建或更新联系人记录 - const [contactResult] = await sequelize.query( - 'INSERT INTO contacts (userId, nickName, phoneNumber) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE nickName = ?, phoneNumber = ?', - { replacements: [user.userId, user.nickName || '默认联系人', user.phoneNumber || '', user.nickName || '默认联系人', user.phoneNumber || ''] } - ); - - // 2. 创建或更新用户管理记录 - const [managementResult] = await sequelize.query( - 'INSERT INTO usermanagements (userId) VALUES (?) ON DUPLICATE KEY UPDATE userId = ?', - { replacements: [user.userId, user.userId] } - ); - - console.log('用户关联记录创建成功:', user.userId); - return true; - } catch (error) { - console.error('创建用户关联记录失败:', error.message); - return false; - } -} - -// 在server-mysql.js文件中的用户授权相关代码后添加: -// 示例:在用户创建或更新成功后调用 -// const user = { userId: '...', nickName: '...', phoneNumber: '...' }; -// await createUserAssociations(user);`; - - const patchFilePath = path.join(__dirname, 'user-association-patch.js'); - fs.writeFileSync(patchFilePath, patchContent); - - console.log('✅ 服务器补丁已创建:', patchFilePath); - console.log('请将此补丁中的createUserAssociations函数添加到server-mysql.js文件中,'); - console.log('并在用户授权成功后调用该函数,以确保自动创建关联记录。'); - console.log('========================================'); -} - -/** - * 主函数 - */ -async function main() { - try { - // 1. 先检查并修复所有现有用户 - await checkAndFixAllUserAssociations(); - - // 2. 创建服务器补丁,解决根本问题 - createServerPatch(); - - // 3. 提供使用说明 - console.log('\n========================================'); - console.log('使用说明:'); - console.log('========================================'); - console.log('1. 手动修复现有用户:'); - console.log(' 已完成,所有用户的关联记录已检查并修复'); - console.log('\n2. 长期解决方案:'); - console.log(' a. 请将user-association-patch.js中的createUserAssociations函数添加到server-mysql.js文件'); - console.log(' b. 在用户授权成功后调用该函数'); - console.log(' c. 重启服务器以应用更改'); - console.log('\n3. 可选: 定期检查(适用于临时解决方案):'); - console.log(' 运行: node user-association-auto-fix.js monitor'); - console.log(' 这将每10分钟检查一次新用户并自动修复关联记录'); - console.log('========================================'); - - } catch (error) { - console.error('❌ 执行过程中发生错误:', error); - } -} - -// 根据命令行参数决定执行模式 -const args = process.argv.slice(2); -const mode = args[0] || 'fix'; - -if (mode === 'monitor') { - // 监控模式 - monitorAndAutoFixNewUsers(); -} else { - // 默认修复模式 - main(); -} \ No newline at end of file diff --git a/server-example/user-association-patch.js b/server-example/user-association-patch.js deleted file mode 100644 index aebdcc6..0000000 --- a/server-example/user-association-patch.js +++ /dev/null @@ -1,38 +0,0 @@ -/** - * 用户关联记录创建工具函数 - * 用于在用户授权成功后自动创建contacts和usermanagements表关联记录 - */ -async function createUserAssociations(user) { - try { - // 确保用户对象有效 - if (!user || !user.userId) { - console.error('创建用户关联记录失败: 用户对象或userId无效'); - return false; - } - - console.log('为用户创建关联记录:', user.userId); - - // 1. 创建或更新联系人记录 - const [contactResult] = await sequelize.query( - 'INSERT INTO contacts (userId, nickName, phoneNumber) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE nickName = ?, phoneNumber = ?', - { replacements: [user.userId, user.nickName || '默认联系人', user.phoneNumber || '', user.nickName || '默认联系人', user.phoneNumber || ''] } - ); - - // 2. 创建或更新用户管理记录 - const [managementResult] = await sequelize.query( - 'INSERT INTO usermanagements (userId) VALUES (?) ON DUPLICATE KEY UPDATE userId = ?', - { replacements: [user.userId, user.userId] } - ); - - console.log('用户关联记录创建成功:', user.userId); - return true; - } catch (error) { - console.error('创建用户关联记录失败:', error.message); - return false; - } -} - -// 在server-mysql.js文件中的用户授权相关代码后添加: -// 示例:在用户创建或更新成功后调用 -// const user = { userId: '...', nickName: '...', phoneNumber: '...' }; -// await createUserAssociations(user); \ No newline at end of file diff --git a/server-example/view-users-table-structure.js b/server-example/view-users-table-structure.js deleted file mode 100644 index 283b402..0000000 --- a/server-example/view-users-table-structure.js +++ /dev/null @@ -1,106 +0,0 @@ -const { Sequelize } = require('sequelize'); -const fs = require('fs'); -const path = require('path'); - -// 读取环境变量 -const envPath = path.join(__dirname, '.env'); -if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf8'); - const envVars = envContent.split('\n').filter(line => line.trim() && !line.startsWith('#')); - envVars.forEach(line => { - const [key, value] = line.split('=').map(part => part.trim()); - process.env[key] = value; - }); -} - -// 数据库连接配置 -const sequelize = new Sequelize( - process.env.DB_NAME || 'wechat_app', - process.env.DB_USER || 'root', - process.env.DB_PASSWORD || '', - { - host: process.env.DB_HOST || 'localhost', - port: process.env.DB_PORT || 3306, - dialect: 'mysql', - logging: false, - timezone: '+08:00' // 设置时区为UTC+8 - } -); - -// 查看usermanagements表结构 -async function viewUserManagementsTableStructure() { - try { - console.log('========================================'); - console.log('查看usermanagements表结构'); - console.log('========================================'); - - // 连接数据库 - await sequelize.authenticate(); - console.log('✅ 数据库连接成功'); - - // 查询表结构 - const tableStructure = await sequelize.query( - 'SHOW COLUMNS FROM usermanagements', - { type: sequelize.QueryTypes.SELECT } - ); - - console.log('\nusermanagements表字段信息:'); - tableStructure.forEach(column => { - console.log(`- ${column.Field}: ${column.Type} ${column.Null === 'NO' ? '(NOT NULL)' : ''} ${column.Key === 'PRI' ? '(PRIMARY KEY)' : ''}`); - }); - - // 查询表索引 - const indexes = await sequelize.query( - 'SHOW INDEX FROM usermanagements', - { type: sequelize.QueryTypes.SELECT } - ); - - if (indexes.length > 0) { - console.log('\nusermanagements表索引信息:'); - indexes.forEach(index => { - console.log(`- 索引名: ${index.Key_name}, 字段: ${index.Column_name}, 唯一: ${index.Non_unique === 0 ? '是' : '否'}`); - }); - } - - // 查询表中的最新5条记录 - console.log('\nusermanagements表中的最新5条记录:'); - - // 尝试查找一个可能的时间字段 - const possibleTimeFields = tableStructure - .map(col => col.Field) - .filter(field => field.toLowerCase().includes('time') || field.toLowerCase().includes('date')); - - let latestRecords; - - if (possibleTimeFields.length > 0) { - console.log(`找到可能的时间字段: ${possibleTimeFields.join(', ')}`); - // 使用第一个找到的时间字段排序 - latestRecords = await sequelize.query( - `SELECT userId FROM usermanagements ORDER BY ${possibleTimeFields[0]} DESC LIMIT 5`, - { type: sequelize.QueryTypes.SELECT } - ); - } else { - console.log('未找到明显的时间字段,按userId排序'); - latestRecords = await sequelize.query( - 'SELECT userId FROM usermanagements ORDER BY userId DESC LIMIT 5', - { type: sequelize.QueryTypes.SELECT } - ); - } - - latestRecords.forEach((record, index) => { - console.log(` ${index + 1}. userId: ${record.userId}`); - }); - - console.log('\n========================================'); - - } catch (error) { - console.error('❌ 查看表结构过程中发生错误:', error.message); - console.error('错误详情:', error); - } finally { - // 关闭数据库连接 - await sequelize.close(); - } -} - -// 运行查看 -viewUserManagementsTableStructure(); \ No newline at end of file