import express from "express"; import u from "@/utils"; import { z } from "zod"; import { v4 as uuidv4 } from "uuid"; import { success } from "@/lib/responseFormat"; import { validateFields } from "@/middleware/middleware"; const router = express.Router(); // 保存资产图片 export default router.post( "/", validateFields({ id: z.number(), projectId: z.number(), base64: z.string().optional().nullable(), filePath: z.string().optional().nullable(), prompt: z.string().optional().nullable(), }), async (req, res) => { const { id, base64, filePath, prompt, projectId } = req.body; let savePath: string | undefined; let imageUrl: string | undefined; if (base64) { // base64图片上传逻辑 const matches = base64.match(/^data:image\/\w+;base64,(.+)$/); const realBase64 = matches ? matches[1] : base64; // 生成新的图片路径 savePath = `/${projectId}/assets/${uuidv4()}.png`; // 写入文件 await u.oss.writeFile(savePath, Buffer.from(realBase64, "base64")); // 插入图片表 await u.db("t_image").insert({ assetsId: id, filePath: savePath, type: "image/png", }); imageUrl = savePath; // 新图片路径 } else if (filePath) { // 前端传入已存在图片路径 try { savePath = new URL(filePath).pathname; } catch { savePath = filePath; } // 检查图片表里是否有这条图片 const selectedImage = await u.db("t_image").where("filePath", savePath).first(); if (!selectedImage) { return res.status(404).send({ success: false, message: "所选图片不存在,请重新生成或选定图片" }); } imageUrl = savePath; } // 查旧资产图片 const oldAsset = await u.db("t_assets").where("id", id).select("filePath", "type").first(); // 保存新旧图片差异和插临时表逻辑 if (imageUrl && ((oldAsset?.filePath && oldAsset.filePath !== imageUrl) || (!oldAsset?.filePath && imageUrl))) { // 新图片保存,移除 t_image 表 await u.db("t_image").where("filePath", imageUrl).delete(); // 原图片如果存在、且不在 t_image 表,插入临时表 if (oldAsset?.filePath) { const oldInTemp = await u.db("t_image").where("filePath", oldAsset.filePath).first(); if (!oldInTemp) { await u.db("t_image").insert({ assetsId: id, filePath: oldAsset.filePath, type: oldAsset.type, }); } } // 更新资产表图片为新图片 await u.db("t_assets").where("id", id).update({ filePath: imageUrl }); } // 更新提示信息 if (prompt !== undefined && prompt !== null) { await u.db("t_assets").where("id", id).update({ prompt }); } res.status(200).send(success({ message: "保存资产图片成功" })); }, );