From abc194cd2f7f7639e6c16e2f1c8e6595503dc88e Mon Sep 17 00:00:00 2001 From: Joseph Date: Tue, 24 Mar 2026 14:44:53 +0700 Subject: [PATCH] update keyword --- .gitignore | 2 +- RAM.kw | 165 ++++++++++++++++++++++++++++++++++++++++++++++ db.js | 19 ++++-- public/index.html | 32 ++++++--- scanner.js | 7 +- server.js | 10 +-- ssd.kw | 50 ++++++++++++++ truncate_items.js | 27 ++++++++ 8 files changed, 291 insertions(+), 21 deletions(-) create mode 100644 RAM.kw create mode 100644 ssd.kw create mode 100644 truncate_items.js diff --git a/.gitignore b/.gitignore index 02c607c..3ef0b03 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ node_modules .env -data \ No newline at end of file +*/*.db \ No newline at end of file diff --git a/RAM.kw b/RAM.kw new file mode 100644 index 0000000..47f35ad --- /dev/null +++ b/RAM.kw @@ -0,0 +1,165 @@ +M321R8GA0BB0-CQK | "Samsung" "64GB" "2Rx4" "4800" "RDIMM"| 1425 +HMCG94AGBQA181N | "Hynix" "64GB" "2Rx4" "5600" "RDIMM"| 1425 +MTC40F2046S1RC56BG1 | "Micron" "64GB" "2Rx4" "5600" "RDIMM"| 1325 +HMCG94AGBRA181N | "Hynix" "64GB" "2Rx4" "5600" "RDIMM"| 1425 +M321R8GA0EB2-CCP | "Samsung" "64GB" "2Rx4" "6400" "RDIMM"| 1570 +HMCG84MEBRA17N | "Hynix" "32GB" "1Rx4" "4800" "RDIMM"| 640 +M321R4GA3BB0-CQK | "Samsung" "32GB" "2Rx8" "4800" "RDIMM"| 985 +M321R4GA3BB6-CQK | "Samsung" "32GB" "2Rx8" "4800" "RDIMM"| 640 +MTC20F2085S1RC52BAW | "Micron" "32GB" "2Rx8" "5200" "RDIMM"| 570 +M321R4GA3PB0-CWM | "Samsung" "32GB" "2Rx8" "5600" "RDIMM"| 740 +HMCG88AGBRA191N-BB | "Hynix" "32GB" "2Rx8" "5600" "RDIMM"| 715 +HMCG88AGBRA190N | "Hynix" "32GB" "2Rx8" "5600" "RDIMM"| 715 +M321R4GA0EB2-CCP | "Samsung" "32GB" "1Rx4" "6400" "RDIMM"| 715 +M321R2GA3BB0-CQK | "Samsung" "16GB" "1Rx8" "4800" "RDIMM"| 315 +MTC10F1084S1RC48BA1 | "Micron" "16GB" "1Rx8" "4800" "RDIMM"| 285 +M386AAK40B40-CWD | "Samsung" "128GB" "2S4Rx4" "2666" "LRDIMM"| 530 +M393AAG40M3B-CYF | "Samsung" "128GB" "2S2Rx4" "2933" "LRDIMM"| 580 +HMABAGL7ABR4N-XN | "Hynix" "128GB" "4DRx4" "3200" "LRDIMM"| 470 +M386A8K40BM1-CRC | "Samsung" "64GB" "4DRx4" "2400" "LRDIMM"| 287.36 +M386A8K40BMB-CRC | "Samsung" "64GB" "4DRx4" "2400" "LRDIMM"| 287.36 +HMAA8GL7MMR4N-UH | "Hynix" "64GB" "4DRx4" "2400" "LRDIMM"| 284.9 +MTA72ASS8G72LZ-2G3 | "Micron" "64GB" "4DRx4" "2400" "LRDIMM"| 240 +M386A8K40DM2-CTD | "Samsung" "64GB" "4DRx4" "2666" "LRDIMM"| 428 +M386A8K40BM2-CTD | "Samsung" "64GB" "4DRx4" "2666" "LRDIMM"| 420.5 +M393A8K40B22-CWD | "Samsung" "64GB" "2S2Rx4" "2666" "LRDIMM"| 400 +M386A8K40CM2-CTD | "Samsung" "64GB" "4DRx4" "2666" "LRDIMM"| 428 +HMAA8GL7MMR4N-VK | "Hynix" "64GB" "4DRx4" "2666" "LRDIMM"| 334.3 +HMAA8GL7CPR4N-VK | "Hynix" "64GB" "4DRx4" "2666" "LRDIMM"| 334.3 +M386A8K40DM2-CVF | "Samsung" "64GB" "4DRx4" "2933" "LRDIMM"| 552.33 +HMAA8GL7CPR4N-WM | "Hynix" "64GB" "4DRx4" "2933" "LRDIMM"| 558 +MTA72ASS8G72LZ-2G9 | "Micron" "64GB" "4DRx4" "2933" "LRDIMM"| 539 +M393A8G40AB2-CVF | "Samsung" "64GB" "2Rx4" "2933" "RDIMM"| 605 +M393A8G40MB2-CVF | "Samsung" "64GB" "2Rx4" "2933" "RDIMM"| 512 +HMAA8GR7AJR4N-WM | "Hynix" "64GB" "2Rx4" "2933" "RDIMM"| 750.5 +HMAA8GR7MJR4N-WM | "Hynix" "64GB" "2Rx4" "2933" "RDIMM"| 536 +MTA36ASF8G72PZ-2G9 | "Micron" "64GB" "2Rx4" "2933" "RDIMM"| 595 +M393A8G40AB2-CWE | "Samsung" "64GB" "2Rx4" "3200" "RDIMM"| 872 +M393A8G40MB2-CWE | "Samsung" "64GB" "2Rx4" "3200" "RDIMM"| 760 +M393A8G40CB4-CWE | "Samsung" "64GB" "2Rx4" "3200" "RDIMM"| 740 +HMAA8GR7AJR4N-XN | "Hynix" "64GB" "2Rx4" "3200" "RDIMM"| 600 +HMAA8GR7CJR4N-XN | "Hynix" "64GB" "2Rx4" "3200" "RDIMM"| 836 +M386B4G70DM0-YH9 | "Samsung" "32GB" "4Rx4" "1333" "LRDIMM"| 28.37 +M386B4G70DM0-YK | "Samsung" "32GB" "4DRx4" "1600" "LRDIMM"| 28.37 +HMA84GL7AMR4N-TF | "Hynix" "32GB" "4DRx4" "2133" "LRDIMM"| 123.5 +MTA72ASS4G72LZ-2G1 | "Micron" "32GB" "4DRx4" "2133" "LRDIMM"| 92.59 +M386A4G40DM0-CPB | "Samsung" "32GB" "4DRx4" "2133" "LRDIMM"| 152 +M386A4G40DM1-CRC | "Samsung" "32GB" "4DRx4" "2400" "LRDIMM"| 156.75 +M393A4K40BB0-CPB | "Samsung" "32GB" "2Rx4" "2133" "RDIMM"| 207 +HMA84GR7MFR4N-TF | "Hynix" "32GB" "2Rx4" "2133" "RDIMM"| 174.17 +MTA36ASF4G72PZ-2G1 | "Micron" "32GB" "2Rx4" "2133" "RDIMM"| 133 +M386A4K40BB0-CRC | "Samsung" "32GB" "2Rx4" "2400" "LRDIMM"| 172.56 +M393A4K40BB1-CRC | "Samsung" "32GB" "2Rx4" "2400" "RDIMM"| 251 +M393A4K40CB1-CRC | "Samsung" "32GB" "2Rx4" "2400" "RDIMM"| 251 +HMA84GR7MFR4N-UH | "Hynix" "32GB" "2Rx4" "2400" "RDIMM"| 207 +HMA84GR7AFR4N-UH | "Hynix" "32GB" "2Rx4" "2400" "RDIMM"| 181.16 +HMA84GL7MFR4N-UH | "Hynix" "32GB" "2Rx4" "2400" "RDIMM"| 181.16 +MTA36ASF4G72PZ-2G3 | "Micron" "32GB" "2Rx4" "2400" "RDIMM"| 192.85 +M393A4K40BB2-CTD | "Samsung" "32GB" "2Rx4" "2666" "RDIMM"| 280 +M393A4K40CB2-CTD | "Samsung" "32GB" "2Rx4" "2666" "RDIMM"| 266 +HMA84GR7CJR4N-VK | "Hynix" "32GB" "2Rx4" "2666" "RDIMM"| 248 +HMA84GR7AFR4N-VK | "Hynix" "32GB" "2Rx4" "2666" "RDIMM"| 248 +HMA84GR7JJR4N-VK | "Hynix" "32GB" "2Rx4" "2666" "RDIMM"| 248 +MTA36ASF4G72PZ-2G6 | "Micron" "32GB" "2Rx4" "2666" "RDIMM"| 213 +MTA36ASF4G72LZ-2G6 | "Micron" "32GB" "2Rx4" "2666" "RDIMM"| 213 +M393A4K40DB2-CVF | "Samsung" "32GB" "2Rx4" "2933" "RDIMM"| 228 +M393A4K40CB2-CVF | "Samsung" "32GB" "2Rx4" "2933" "RDIMM"| 380 +HMA84GR7JJR4N-WM | "Hynix" "32GB" "2Rx4" "2933" "RDIMM"| 413 +HMA84GR7DJR4N-WM | "Hynix" "32GB" "2Rx4" "2933" "RDIMM"| 413 +HMA84GR7CJR4N-WM | "Hynix" "32GB" "2Rx4" "2933" "RDIMM"| 413 +MTA36ASF4G72PZ-2G9 | "Micron" "32GB" "2Rx4" "2933" "RDIMM"| 302.82 +M393A4G40BB3-CWE | "Samsung" "32GB" "1Rx4" "3200" "RDIMM"| 436.05 +M393A4K40EB3-CWE | "Samsung" "32GB" "2Rx4" "3200" "RDIMM"| 503 +M393A4K40DB3-CWE | "Samsung" "32GB" "2Rx4" "3200" "RDIMM"| 503 +HMA84GR7CJR4N-XN | "Hynix" "32GB" "2Rx4" "3200" "RDIMM"| 475 +HMA84GR7DJR4N-XN | "Hynix" "32GB" "2Rx4" "3200" "RDIMM"| 475 +MTA36ASF4G72PZ-3G2 | "Micron" "32GB" "2Rx4" "3200" "RDIMM"| 361 +M393A4G43AB3-CWE | "Samsung" "32GB" "2Rx8" "3200" "RDIMM"| 425 +HMAA4GR7CJR8N-XN | "Hynix" "32GB" "2Rx8" "3200" "RDIMM"| 362.32 +HMT42GR7BMR4C-G7 | "Hynix" "16GB" "4Rx4" "1066" "RDIMM"| 21.13 +MT36KSF2G72PZ-1G4 | "Micron" "16GB" "2Rx4" "1333" "RDIMM"| 16.88 +M393B2G70EB0-YK0 | "Samsung" "16GB" "2Rx4" "1600" "RDIMM"| 19.69 +M393B2G70DB0-YK0 | "Samsung" "16GB" "2Rx4" "1600" "RDIMM"| 19.69 +M393B2G70BH0-YK0 | "Samsung" "16GB" "2Rx4" "1600" "RDIMM"| 19.69 +MT36KSF2G72PZ-1G6 | "Micron" "16GB" "2Rx4" "1600" "RDIMM"| 21.4 +HMT42GR7BFR4A-PB | "Hynix" "16GB" "2Rx4" "1600" "RDIMM"| 19.69 +HMT42GR7MFR4C-PB | "Hynix" "16GB" "2Rx4" "1600" "RDIMM"| 18.99 +HMT42GR7AFR4C-RD | "Hynix" "16GB" "2Rx4" "1866" "RDIMM"| 17.02 +M393A2G40EB1-CPB | "Samsung" "16GB" "2Rx4" "2133" "RDIMM"| 110.4 +M393A2G40DB0-CPB | "Samsung" "16GB" "2Rx4" "2133" "RDIMM"| 110.4 +HMA42GR7AFR4N-TF | "Hynix" "16GB" "2Rx4" "2133" "RDIMM"| 97.7 +HMA42GR7MFR4N-TF | "Hynix" "16GB" "2Rx4" "2133" "RDIMM"| 60 +MTA36ASF2G72PZ-2G1 | "Micron" "16GB" "2Rx4" "2133" "RDIMM"| 64.4 +M393A2K40CB1-CRC | "Samsung" "16GB" "1Rx4" "2400" "RDIMM"| 10 +M393A2K40BB1-CRC | "Samsung" "16GB" "1Rx4" "2400" "RDIMM"| 110 +MTA18ASF2G72PZ-2G3 | "Micron" "16GB" "1Rx4" "2400" "RDIMM"| 95 +M393A2G40EB1-CRC | "Samsung" "16GB" "2Rx4" "2400" "RDIMM"| 110.2 +HMA42GR7AFR4N-UH | "Hynix" "16GB" "2Rx4" "2400" "RDIMM"| 108 +HMA42GR7BJR4N-UH | "Hynix" "16GB" "2Rx4" "2400" "RDIMM"| 108 +MTA36ASF2G72PZ-2G3 | "Micron" "16GB" "2Rx4" "2400" "RDIMM"| 85 +HMA82GR7AFR4N-VK | "Hynix" "16GB" "1Rx4" "2666" "RDIMM"| 110 +HMA82GR7CJR4N-VK | "Hynix" "16GB" "1Rx4" "2666" "RDIMM"| 110 +M393A2K43BB1-CTD | "Samsung" "16GB" "2Rx8" "2666" "RDIMM"| 114.29 +HMA82GR7AFR8N-VK | "Hynix" "16GB" "2Rx8" "2666" "RDIMM"| 107 +HMA82GR7CJR8N-VK | "Hynix" "16GB" "2Rx8" "2666" "RDIMM"| 107 +HMA82GR7JJR8N-VK | "Hynix" "16GB" "2Rx8" "2666" "RDIMM"| 107 +MTA18ASF2G72PDZ-2G6 | "Micron" "16GB" "2Rx8" "2666" "RDIMM"| 83.33 +M393A2K40CB2-CVF | "Samsung" "16GB" "1Rx4" "2933" "RDIMM"| 118.75 +M393A2K40DB2-CVF | "Samsung" "16GB" "1Rx4" "2933" "RDIMM"| 118.75 +M393A2K43DB2-CVF | "Samsung" "16GB" "2Rx8" "2933" "RDIMM"| 100.57 +HMA82GR7CJR8N-WM | "Hynix" "16GB" "2Rx8" "2933" "RDIMM"| 78.65 +HMA82GR7JJR8N-WM | "Hynix" "16GB" "2Rx8" "2933" "RDIMM"| 102.56 +M393A2K43DB3-CWE | "Samsung" "16GB" "2Rx8" "3200" "RDIMM"| 171 +HMA82GR7DJR8N-XN | "Hynix" "16GB" "2Rx8" "3200" "RDIMM"| 114.29 +HMA82GR7CJR8N-XN | "Hynix" "16GB" "2Rx8" "3200" "RDIMM"| 114.29 +MTA18ASF2G72PDZ-3G2 | "Micron" "16GB" "2Rx8" "3200" "RDIMM"| 85.47 +M393B1K70DH0-YH9 | "Samsung" "8GB" "2Rx4" "1333" "RDIMM"| 6.05 +M393B1K70CH0-CH9 | "Samsung" "8GB" "2Rx4" "1333" "RDIMM"| 6.05 +MTA18ASF1G72PZ-2G1 | "Micron" "8GB" "1Rx4" "2133" "RDIMM"| 23.98 +HMA41GR7AFR8N-TF | "Hynix" "8GB" "1Rx8" "2133" "RDIMM"| 30.24 +M393A1G40DB0-CPB | "Samsung" "8GB" "1Rx8" "2133" "RDIMM"| 45 +MTA18ASF1G72PZ-2G1 | "Micron" "8GB" "1Rx8" "2133" "RDIMM"| 23.91 +HMA41GR7AFR8N-TF | "Hynix" "8GB" "2Rx8" "2133" "RDIMM"| 28.13 +M393A1G43DB0-CPB | "Samsung" "8GB" "2Rx8" "2133" "RDIMM"| 28.13 +MTA18ASF1G72PZ-2G1 | "Micron" "8GB" "2Rx8" "2133" "RDIMM"| 23.91 +HMA41GR7AFR4N-UH | "Hynix" "8GB" "1Rx4" "2400" "RDIMM"| 28 +HMA81GR7MFR8N-UH | "Hynix" "8GB" "1Rx8" "2400" "RDIMM"| 30.24 +M393A1G40DB1-CRC | "Samsung" "8GB" "1Rx8" "2400" "RDIMM"| 30.24 +MTA9ASF1G72PZ-2G3 | "Micron" "8GB" "1Rx8" "2400" "RDIMM"| 30.24 +HMA41GR7AFR8N-UH | "Hynix" "8GB" "2Rx8" "2400" "RDIMM"| 39.6 +M393A1G40DB1-CRC | "Samsung" "8GB" "2Rx8" "2400" "RDIMM"| 28.13 +M393A1G43DB1-CRC | "Samsung" "8GB" "2Rx8" "2400" "RDIMM"| 39.6 +MTA18ASF1G72PDZ-2G3 | "Micron" "8GB" "2Rx8" "2400" "RDIMM"| 28.13 +HMA81GR7AFR8N-VK | "Hynix" "8GB" "1Rx8" "2666" "RDIMM"| 28.6 +MTA9ASF1G72PZ-2G6 | "Micron" "8GB" "1Rx8" "2666" "RDIMM"| 28.6 +HMA81GR7AFR8N-VK | "Hynix" "8GB" "2Rx8" "2666" "RDIMM"| 28.13 +MTA9ASF1G72PZ-2G6 | "Micron" "8GB" "2Rx8" "2666" "RDIMM"| 28.13 +HMA81GR7CJR8N-WM | "Hynix" "8GB" "1Rx8" "2933" "RDIMM"| 39.33 +HMA81GR7CJR8N-WM | "Hynix" "8GB" "2Rx8" "2933" "RDIMM"| 41.49 +M393A1K43DB1-CVF | "Samsung" "8GB" "2Rx8" "2933" "RDIMM"| 41.49 +MTA9ASF1G72PZ-2G9 | "Micron" "8GB" "2Rx8" "2933" "RDIMM"| 30.24 +HMA81GR7CJR8N-XN | "Hynix" "8GB" "1Rx8" "3200" "RDIMM"| 61.6 +MTA9ASF1G72PZ-3G2 | "Micron" "8GB" "1Rx8" "3200" "RDIMM"| 30.24 +HMA81GR7CJR8N-XN | "Hynix" "8GB" "2Rx8" "3200" "RDIMM"| 41.49 +"" | "Samsung" "32GB" "2Rx8" "2133" "UDIMM"| 127.5 +"" | "Samsung" "32GB" "2Rx8" "2400" "UDIMM"| 140 +M378A4G43MB1-CTD | "Samsung" "32GB" "2Rx8" "2666" "UDIMM"| 164 +M378A4G43AB2-CVF | "Samsung" "32GB" "2Rx8" "2933" "UDIMM"| 137.88 +M378A4G43AB2-CWE | "Samsung" "32GB" "2Rx8" "3200" "UDIMM"| 180 +HMAA4GU6AJR8N-XN | "Hynix" "32GB" "2Rx8" "3200" "UDIMM"| 242.25 +M378A2K43BB1-CPB | "Samsung" "16GB" "2Rx8" "2133" "UDIMM"| 56.5 +M378A2K43CB1-CRC | "Samsung" "16GB" "2Rx8" "2400" "UDIMM"| 110 +MTA18ASF2G72AZ-2G3 | "Micron" "16GB" "2Rx8" "2400" "UDIMM"| 90.25 +HMA82GU6JJR8N-VK | "Hynix" "16GB" "2Rx8" "2666" "UDIMM"| 90 +M378A2K43DB1-CVF | "Samsung" "16GB" "2Rx8" "2933" "UDIMM"| 56.5 +KVR32N22S8/16 | "Kingston" "16GB" "1RX8" "3200" "UDIMM"| 48.5 +M378A1K43BB1-CPB | "Samsung" "8GB" "1RX8" "2133" "UDIMM"| 25 +M378A1K43CB2-CRC | "Samsung" "8GB" "1RX8" "2400" "UDIMM"| 30 +M474A2K43BB1-CRC | "Samsung" "16GB" "2Rx8" "2400" "SODIMM"| 90 +HMAA2GS6CJR8N-XN | "Hynix" "16GB" "1Rx8" "3200" "SODIMM"| 72.67 +M474A2K43EB1-CWE | "Samsung" "16GB" "2Rx8" "3200" "SODIMM"| 80 +M471A4G43MB1-CTD | "Samsung" "32GB" "2Rx8" "2666" "SODIMM"| 125 +M471A4G43BB1-CWE | "Samsung" "32GB" "2Rx8" "3200" "SODIMM"| 139.4 +HMAA4GS6CJR8N | "Hynix" "32GB" "2Rx8" "3200" "SODIMM"| 123.55 +M425R2GA3BB0-CWM | "Samsung" "16GB" "1Rx8" "5600" "SODIMM"| 130.62 +M425R4GA3PB0-CWM | "Samsung" "32GB" "2Rx8" "5600" "SODIMM"| 246.73 \ No newline at end of file diff --git a/db.js b/db.js index 9d84466..e26db05 100644 --- a/db.js +++ b/db.js @@ -17,6 +17,7 @@ function initDb() { id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, price_ratio REAL DEFAULT 0.85, + common_keywords TEXT, last_scan_time DATETIME, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); @@ -67,6 +68,16 @@ function initDb() { // Migration: Add columns if they don't exist try { db.exec("ALTER TABLE profiles ADD COLUMN last_scan_time DATETIME;"); } catch(e){} + try { db.exec("ALTER TABLE profiles ADD COLUMN common_keywords TEXT;"); } catch(e){} + // Migration: rename ignore_keywords to common_keywords if it exists + try { + const tableInfo = db.prepare("PRAGMA table_info(profiles)").all(); + const hasIgnore = tableInfo.some(col => col.name === 'ignore_keywords'); + const hasCommon = tableInfo.some(col => col.name === 'common_keywords'); + if (hasIgnore && !hasCommon) { + db.exec("ALTER TABLE profiles RENAME COLUMN ignore_keywords TO common_keywords"); + } + } catch(e){} try { db.exec("ALTER TABLE items ADD COLUMN profile_id INTEGER;"); } catch(e){} try { db.exec("ALTER TABLE items ADD COLUMN keyword_id INTEGER;"); } catch(e){} } @@ -77,9 +88,9 @@ const stmts = { // Profiles getProfiles: db.prepare('SELECT * FROM profiles ORDER BY name'), getProfile: db.prepare('SELECT * FROM profiles WHERE id = ?'), - insertProfile: db.prepare('INSERT INTO profiles (name, price_ratio) VALUES (?, ?)'), + insertProfile: db.prepare('INSERT INTO profiles (name, price_ratio, common_keywords) VALUES (?, ?, ?)'), deleteProfile: db.prepare('DELETE FROM profiles WHERE id = ?'), - updateProfile: db.prepare('UPDATE profiles SET name = ?, price_ratio = ? WHERE id = ?'), + updateProfile: db.prepare('UPDATE profiles SET name = ?, price_ratio = ?, common_keywords = ? WHERE id = ?'), updateProfileScanTime: db.prepare('UPDATE profiles SET last_scan_time = CURRENT_TIMESTAMP WHERE id = ?'), // Search Keywords @@ -160,9 +171,9 @@ module.exports = { // Profiles getProfiles() { return stmts.getProfiles.all(); }, getProfile(id) { return stmts.getProfile.get(id); }, - addProfile(name, ratio) { return stmts.insertProfile.run(name, ratio); }, + addProfile(name, ratio, commonKeywords) { return stmts.insertProfile.run(name, ratio, commonKeywords); }, deleteProfile(id) { return stmts.deleteProfile.run(id); }, - updateProfile(id, name, ratio) { return stmts.updateProfile.run(name, ratio, id); }, + updateProfile(id, name, ratio, commonKeywords) { return stmts.updateProfile.run(name, ratio, commonKeywords, id); }, updateProfileScanTime(id) { return stmts.updateProfileScanTime.run(id); }, // Keywords diff --git a/public/index.html b/public/index.html index 8b33f25..3f756b1 100644 --- a/public/index.html +++ b/public/index.html @@ -250,7 +250,7 @@

Create New Profile

-
+
@@ -259,6 +259,10 @@
+
+ + +
@@ -334,7 +338,8 @@ let currentProfileId = null; let items = []; let isScanning = false; - const API_URL = "https://logs1.danielvu.com/ebay-price-check" + const API_URL = "http://localhost:4000" + // const API_URL = "https://logs1.danielvu.com/ebay-price-check" const fmat = (v) => new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(v || 0); async function init() { @@ -484,6 +489,7 @@ editingProfileId = null; document.getElementById('new-profile-name').value = ''; document.getElementById('new-profile-ratio').value = '0.85'; + document.getElementById('new-profile-common').value = ''; document.getElementById('btn-save-profile').innerText = 'Add Profile'; document.getElementById('modal-profiles').classList.add('active'); renderProfileList(); @@ -495,24 +501,29 @@
${p.name} (Ratio: ${p.price_ratio})
+ ${p.common_keywords ? `Common: ${p.common_keywords}
` : ''} Last scan: ${lastScan}
- +
`;}).join(''); } - function editProfile(id, name, ratio) { + function editProfile(id) { + const p = profiles.find(x => x.id === id); + if (!p) return; editingProfileId = id; - document.getElementById('new-profile-name').value = name; - document.getElementById('new-profile-ratio').value = ratio; + document.getElementById('new-profile-name').value = p.name; + document.getElementById('new-profile-ratio').value = p.price_ratio; + document.getElementById('new-profile-common').value = p.common_keywords || ''; document.getElementById('btn-save-profile').innerText = 'Update Profile'; } async function saveProfile() { const name = document.getElementById('new-profile-name').value; const ratio = document.getElementById('new-profile-ratio').value; + const common = document.getElementById('new-profile-common').value; if (!name) return; const method = editingProfileId ? 'PUT' : 'POST'; @@ -521,11 +532,16 @@ await fetch(url, { method, headers: {'Content-Type': 'application/json'}, - body: JSON.stringify({ name, price_ratio: parseFloat(ratio) }) + body: JSON.stringify({ + name, + price_ratio: parseFloat(ratio), + common_keywords: common + }) }); editingProfileId = null; document.getElementById('new-profile-name').value = ''; + document.getElementById('new-profile-common').value = ''; document.getElementById('btn-save-profile').innerText = 'Add Profile'; await fetchProfiles(); renderProfileList(); @@ -635,7 +651,7 @@ let keywords = kwPart.split(',').map(s => s.trim()).filter(Boolean); return { - part_number: (parts[0] === 'NONE' || parts[0] === '' || parts[0] === '""') ? '' : parts[0].replace(/"/g, ''), + part_number: (parts[0] === 'NONE' || parts[0] === '' || parts[0] === '""') ? '' : parts[0], keywords, target_price: parseFloat(parts[2].replace(/[$,]/g, '')) }; diff --git a/scanner.js b/scanner.js index 6acfc12..09c878b 100644 --- a/scanner.js +++ b/scanner.js @@ -211,7 +211,7 @@ async function searchEbay(token, keyword, site) { const cap = CFG.maxItemsPerQuery; const exactQuery = keyword.trim().split(/\s+/).map(w => { if (w.startsWith('-')) return w; // Negative keyword - return `"${w}"`; + return `${w}`; }).join(' '); const baseUrl = `https://${BASE_URL}/buy/browse/v1/item_summary/search` @@ -376,8 +376,9 @@ async function processRow(token, row, rowIndex, totalRows, globalResultsMap, pro for (const site of EBAY_SITES) { for (const { label, query } of queries) { - log(` [${rowIndex + 1}] [${site.id}] [${label}] Searching: "${query}"`); - const items = await searchEbay(token, query, site); + const searchQuery = profile.common_keywords ? `${query} ${profile.common_keywords}` : query; + log(` [${rowIndex + 1}] [${site.id}] [${label}] Searching: "${searchQuery}"`); + const items = await searchEbay(token, searchQuery, site); let skipped = 0, cnSkipped = 0, dbSkipped = 0; for (const item of items) { diff --git a/server.js b/server.js index 33bcd70..60a419c 100644 --- a/server.js +++ b/server.js @@ -35,7 +35,7 @@ app.get('/api/profiles', (req, res) => { let profiles = db.getProfiles(); if (profiles.length === 0) { // Create a default profile if none exists - db.addProfile('Default Profile', 0.85); + db.addProfile('Default Profile', 0.85, null); profiles = db.getProfiles(); } res.json(profiles); @@ -46,8 +46,8 @@ app.get('/api/profiles', (req, res) => { app.post('/api/profiles', (req, res) => { try { - const { name, price_ratio } = req.body; - db.addProfile(name, price_ratio || 0.85); + const { name, price_ratio, common_keywords } = req.body; + db.addProfile(name, price_ratio || 0.85, common_keywords); res.json({ success: true }); } catch (err) { res.status(500).json({ error: err.message }); @@ -56,8 +56,8 @@ app.post('/api/profiles', (req, res) => { app.put('/api/profiles/:id', (req, res) => { try { - const { name, price_ratio } = req.body; - db.updateProfile(req.params.id, name, price_ratio); + const { name, price_ratio, common_keywords } = req.body; + db.updateProfile(req.params.id, name, price_ratio, common_keywords); res.json({ success: true }); } catch (err) { res.status(500).json({ error: err.message }); diff --git a/ssd.kw b/ssd.kw new file mode 100644 index 0000000..c426a17 --- /dev/null +++ b/ssd.kw @@ -0,0 +1,50 @@ +"SSDSC2BX200" | "200GB" -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 14.00 +"SSDSC2BA200" | "200GB" -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 14.00 +"SSDSC2KB200G8" | "200GB" -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 14.00 +"MZ7KE256" | "256GB" -200GB -240GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 17.92 +"MZ76P256" | "256GB" -200GB -240GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 17.92 +"MZ7LN256" | "256GB" -200GB -240GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 17.92 +"CT256MX" | "256GB" -200GB -240GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 17.92 +"MZ77E500" | "512GB" -200GB -240GB -256GB -320GB -480GB -500GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 35.84 +"MZ76E500" | "512GB" -200GB -240GB -256GB -320GB -480GB -500GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 35.84 +"SSDSC2KB512G8" | "512GB" -200GB -240GB -256GB -320GB -480GB -500GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 35.84 +"CT500MX500" | "512GB" -200GB -240GB -256GB -320GB -480GB -500GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 35.84 +"SSDSC2BX800" | "800GB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 56.00 +"SSDSC2BA800" | "800GB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 56.00 +"MZ7LM800" | "800GB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 56.00 +"816576-001" | "800GB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 56.00 +"MZ7KH960" | "960GB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 67.20 +"MZ7LM960" | "960GB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 67.20 +"MTFDDAK960" | "960GB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 67.20 +"SSDSC2KB960G8" | "960GB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 67.20 +"MZ77E1T0" | "1TB" -200GB -240GB -250GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 70.00 +"WDS100T2B0A" | "1TB" -200GB -240GB -250GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 70.00 +"CT1000MX500" | "1TB" -200GB -240GB -250GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 70.00 +"SSDSC2KB010T8" | "1TB" -200GB -240GB -250GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 70.00 +"MZ77E2T0" | "2TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 140.00 +"CT2000MX500" | "2TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 140.00 +"WDS200T2B0A" | "2TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 140.00 +"MTFDDAK1T9" | "2TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 140.00 +"MZ77E4T0" | "4TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 280.00 +"WDS400T3B0A" | "4TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 280.00 +"P21514-001" | "4TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 280.00 +"SSDSC2KB038T7" | "4TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 280.00 +"MZ77Q8T0" | "8TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 560.00 +"MTFDDAK7T6TDC" | "8TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 560.00 +"WDS800T2B0A" | "8TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 560.00 +"MZ7KH1T9" | "1.92TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 134.40 +"SSDSC2KB019T8" | "1.92TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 134.40 +"816562-001" | "1.92TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 134.40 +"0MWGK7" | "1.92TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 134.40 +"MZ7KH3T8" | "3.84TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -6.4TB -7.68TB -15.36TB | 268.80 +"SSDSC2KB038T8" | "3.84TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -6.4TB -7.68TB -15.36TB | 268.80 +"MTFDDAK3T8TDT" | "3.84TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -6.4TB -7.68TB -15.36TB | 268.80 +"P19976-B21" | "3.84TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -6.4TB -7.68TB -15.36TB | 268.80 +"MZ7KH7T6" | "7.68TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -15.36TB | 537.60 +"SSDSC2KB076T8" | "7.68TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -15.36TB | 537.60 +"MTFDDAK7T6TDT" | "7.68TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -15.36TB | 537.60 +"P19980-B21" | "7.68TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -15.36TB | 537.60 +"MZILS15T" | "15.36TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB | 1075.20 +"MZILG15T" | "15.36TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB | 1075.20 +"WUS4BB015D7P3E3" | "15.36TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB | 1075.20 +"SSDSC2KB153T8" | "15.36TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB | 1075.20 \ No newline at end of file diff --git a/truncate_items.js b/truncate_items.js new file mode 100644 index 0000000..6b753a9 --- /dev/null +++ b/truncate_items.js @@ -0,0 +1,27 @@ +const Database = require('better-sqlite3'); +const path = require('path'); +const fs = require('fs'); + +const dbPath = path.join(__dirname, 'data', 'ebay_items.db'); + +if (!fs.existsSync(dbPath)) { + console.error(`Database not found at: ${dbPath}`); + process.exit(1); +} + +const db = new Database(dbPath); + +try { + console.log('Truncating items table...'); + const result = db.prepare('DELETE FROM items').run(); + console.log(`Success! Deleted ${result.changes} items.`); + + // Optional: vacuum the database to reclaim space + console.log('Vacuuming database...'); + db.exec('VACUUM'); + console.log('Vacuum complete.'); +} catch (err) { + console.error('Error truncating items table:', err.message); +} finally { + db.close(); +}