initial commit
This commit is contained in:
25
backend/package.json
Normal file
25
backend/package.json
Normal file
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"name": "leye-service",
|
||||
"version": "1.0.0",
|
||||
"type": "module",
|
||||
"bin": "index.js",
|
||||
"pkg": {
|
||||
"assets": [
|
||||
"favicon.ico",
|
||||
"node_modules/sqlite3/**/*"
|
||||
],
|
||||
"targets": [
|
||||
"node18-win-x64"
|
||||
],
|
||||
"outputPath": "dist",
|
||||
"options": [
|
||||
"no-warnings"
|
||||
]
|
||||
},
|
||||
"dependencies": {
|
||||
"express": "^4.18.2",
|
||||
"cors": "^2.8.5",
|
||||
"sqlite3": "^5.1.6",
|
||||
"sqlite": "^5.0.1"
|
||||
}
|
||||
}
|
||||
219
backend/server.js
Normal file
219
backend/server.js
Normal file
@@ -0,0 +1,219 @@
|
||||
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 终止`);
|
||||
});
|
||||
Reference in New Issue
Block a user