Browse Source

清理server-example目录:移除调试脚本和临时文件,保留核心Docker配置

pull/2/head
徐飞洋 2 months ago
parent
commit
509d555ff3
  1. 1
      server-example/PATH.txt
  2. 41
      server-example/add-department-column.js
  3. 70
      server-example/check-online-status.js
  4. 133
      server-example/check-settlement-data.js
  5. 107
      server-example/cleanup_temp_user_ids.js
  6. 29
      server-example/cleanup_test_data.js
  7. 143
      server-example/complete-gross-weight-fix.js
  8. 123
      server-example/complete-gross-weight-verification.js
  9. 155
      server-example/create-missing-associations.js
  10. 356
      server-example/database-extension.js
  11. 116
      server-example/debug-websocket.js
  12. 193
      server-example/debug_complete_flow.js
  13. 112
      server-example/debug_final.js
  14. 215
      server-example/debug_full_flow.js
  15. 86
      server-example/debug_log_server.js
  16. 111
      server-example/debug_simple.js
  17. 191
      server-example/debug_verbose.js
  18. 175
      server-example/direct-db-check.js
  19. 61
      server-example/find-product-creator.js
  20. 85
      server-example/fixed-server.js
  21. BIN
      server-example/update-product-contacts.zip
  22. 218
      server-example/update-product-review-status.js
  23. 285
      server-example/user-association-auto-fix.js
  24. 38
      server-example/user-association-patch.js
  25. 106
      server-example/view-users-table-structure.js

1
server-example/PATH.txt

@ -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;

41
server-example/add-department-column.js

@ -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();

70
server-example/check-online-status.js

@ -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();

133
server-example/check-settlement-data.js

@ -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();

107
server-example/cleanup_temp_user_ids.js

@ -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);

29
server-example/cleanup_test_data.js

@ -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();

143
server-example/complete-gross-weight-fix.js

@ -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();

123
server-example/complete-gross-weight-verification.js

@ -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();

155
server-example/create-missing-associations.js

@ -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();

356
server-example/database-extension.js

@ -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模型(可能是实际的模型或临时模型)
};

116
server-example/debug-websocket.js

@ -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停止调试');

193
server-example/debug_complete_flow.js

@ -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();

112
server-example/debug_final.js

@ -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);
}

215
server-example/debug_full_flow.js

@ -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();

86
server-example/debug_log_server.js

@ -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);
}

111
server-example/debug_simple.js

@ -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();

191
server-example/debug_verbose.js

@ -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();

175
server-example/direct-db-check.js

@ -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();

61
server-example/find-product-creator.js

@ -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();

85
server-example/fixed-server.js

@ -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');
});

BIN
server-example/update-product-contacts.zip

Binary file not shown.

218
server-example/update-product-review-status.js

@ -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();

285
server-example/user-association-auto-fix.js

@ -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();
}

38
server-example/user-association-patch.js

@ -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);

106
server-example/view-users-table-structure.js

@ -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();
Loading…
Cancel
Save