eext-leye/backend/server.js

220 lines
6.4 KiB
JavaScript
Raw Permalink Normal View History

2026-02-09 11:40:12 +08:00
import { Database } from "bun:sqlite";
import express from "express";
import cors from "cors";
import * as path from "node:path";
const app = express();
const PORT = 21816;
const EXE_DIR = path.dirname(process.execPath);
const DB_NAME = "leye.db";
const DB_PATH = path.join(EXE_DIR, DB_NAME)
const db = new Database(DB_PATH, { create: true });
db.run(`
CREATE TABLE IF NOT EXISTS leye_list_free (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
type INTEGER,
value TEXT,
footprint INTEGER,
brand INTEGER,
info TEXT,
quantity INTEGER,
description TEXT,
doc TEXT,
lcscId TEXT
)
`);
app.use(cors());
app.use(express.json());
app.get("/api/getVersion", (req, res) => {
res.json({ version: "1.0.0" });
});
app.get("/api/getLeyeList", (req, res) => {
const params = req.query;
let sql = "SELECT * FROM leye_list_free WHERE 1=1";
let args = [];
if (params.id) { sql += " AND id = ?"; args.push(params.id); }
if (params.name) { sql += " AND name LIKE ?"; args.push(`%${params.name}%`); }
if (params.type) { sql += " AND type = ?"; args.push(params.type); }
if (params.value) { sql += " AND value LIKE ?"; args.push(`%${params.value}%`); }
if (params.footprint) { sql += " AND footprint = ?"; args.push(params.footprint); }
if (params.brand) { sql += " AND brand = ?"; args.push(params.brand); }
if (params.quantity) { sql += " AND quantity >= ?"; args.push(params.quantity); }
if (params.lcscId) { sql += " AND lcscId = ?"; args.push(params.lcscId); }
try {
const rows = db.query(sql).all(...args);
res.json({ data: rows, total: rows.length, success: true });
} catch (e) {
res.status(500).json({ success: false, error: e.message });
}
});
app.get("/api/getLcscOrder", async (req, res) => {
const uuid = req.headers['x-uuid'] || req.headers['X-Uuid'];
const cookies = req.headers['x-cookies'] || req.headers['X-Cookies'];
let warehouse;
if (!uuid || !cookies) {
return res.status(400).json({
success: false,
error: "Missing required headers"
});
}
try {
const response = await fetch(`https://order-api.szlcsc.com/member/order/details/latest/process?orderUuid=${uuid}`, {
headers: {
"accept": "application/json",
"accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
"cache-control": "no-cache",
"pragma": "no-cache",
"priority": "u=1, i",
"sec-ch-ua": "\"Not(A:Brand\";v=\"8\", \"Chromium\";v=\"144\", \"Microsoft Edge\";v=\"144\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Windows\"",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-site",
"cookie": cookies,
"Referer": "https://member.szlcsc.com/ "
},
method: "GET"
});
if (!response.ok) {
return res.status(response.status).json({
success: false,
error: `LCSC API returned ${response.status}`
});
}
const data = await response.json();
warehouse = data?.result?.warehouseCode === 'sz' ? 'zh' : 'js';
} catch (error) {
res.status(500).json({
success: false,
error: error.message
});
return;
}
try {
const response = await fetch(`https://order-api.szlcsc.com/member/print/deliverynote/${warehouse === 'zh' ? 'z' : 'j'}?uuid=${encodeURIComponent(uuid)}&deliveryType=${warehouse}`, {
headers: {
"accept": "application/json",
"accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
"cache-control": "no-cache",
"pragma": "no-cache",
"priority": "u=1, i",
"sec-ch-ua": "\"Not(A:Brand\";v=\"8\", \"Chromium\";v=\"144\", \"Microsoft Edge\";v=\"144\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Windows\"",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-site",
"cookie": cookies,
"Referer": "https://member.szlcsc.com/ "
},
method: "GET"
});
if (!response.ok) {
return res.status(response.status).json({
success: false,
error: `LCSC API returned ${response.status}`
});
}
const data = await response.json();
res.json({ success: true, data });
} catch (error) {
res.status(500).json({
success: false,
error: error.message
});
}
});
app.post("/api/addLeyeList", (req, res) => {
const { name, lcscId, quantity } = req.body;
if (!lcscId || !quantity) return res.status(400).send("Missing params");
try {
const existing = db.query("SELECT id, quantity FROM leye_list_free WHERE lcscId = ?").get(lcscId);
if (existing) {
const newQuantity = existing.quantity + quantity;
db.run("UPDATE leye_list_free SET quantity = ? WHERE id = ?", newQuantity, existing.id);
res.json({ success: true, action: "updated", quantity: newQuantity });
} else {
db.run("INSERT INTO leye_list_free (name, lcscId, quantity) VALUES (?, ?, ?)", name, lcscId, quantity);
res.json({ success: true, action: "inserted" });
}
} catch (e) {
res.status(500).json({ success: false, error: e.message });
}
});
app.post("/api/editLeyeList", (req, res) => {
const { id, name, lcscId, quantity } = req.body;
if (!id) return res.status(400).send("Missing params");
try {
const existing = db.query("SELECT id, name, lcscId, quantity FROM leye_list_free WHERE id = ?").get(id);
if (!existing) {
return res.status(404).json({ success: false, error: "Record not found" });
}
const hasChanges =
(name !== undefined && name !== existing.name) ||
(lcscId !== undefined && lcscId !== existing.lcscId) ||
(quantity !== undefined && quantity !== existing.quantity);
if (hasChanges) {
const updates = [];
const params = [];
if (name !== undefined && name !== existing.name) {
updates.push("name = ?");
params.push(name);
}
if (lcscId !== undefined && lcscId !== existing.lcscId) {
updates.push("lcscId = ?");
params.push(lcscId);
}
if (quantity !== undefined && quantity !== existing.quantity) {
updates.push("quantity = ?");
params.push(quantity);
}
if (updates.length > 0) {
params.push(id);
const sql = `UPDATE leye_list_free SET ${updates.join(", ")} WHERE id = ?`;
db.query(sql).run(...params);
}
}
res.json({
success: true,
updated: hasChanges,
message: hasChanges ? "Updated successfully" : "No changes needed"
});
} catch (e) {
res.status(500).json({ success: false, error: e.message });
}
});
app.listen(PORT, "0.0.0.0", () => {
console.log(`LEYE 免费扩展版服务端已启动`);
console.log(`按 Ctrl+C 终止`);
});