220 lines
6.4 KiB
JavaScript
220 lines
6.4 KiB
JavaScript
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 终止`);
|
|
});
|