diff --git a/.codebuddy/skills/image-tools/scripts/remove-background.py b/.codebuddy/skills/image-tools/scripts/remove-background.py new file mode 100644 index 0000000..66d0d33 --- /dev/null +++ b/.codebuddy/skills/image-tools/scripts/remove-background.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +""" +产品图片抠图工具 +使用rembg库自动去除图片背景 +""" +import os +import sys + +try: + from rembg import remove + from PIL import Image +except ImportError: + print("Missing dependencies, installing...") + os.system("pip install rembg pillow") + from rembg import remove + from PIL import Image + +def remove_background(input_path, output_path): + """ + 去除图片背景 + """ + try: + print(f"Processing: {input_path}") + + # 打开原始图片 + with open(input_path, 'rb') as input_file: + input_data = input_file.read() + + # 去除背景 + output_data = remove(input_data) + + # 保存结果 + with open(output_path, 'wb') as output_file: + output_file.write(output_data) + + print(f"Saved: {output_path}") + return True + except Exception as e: + print(f"Error: {e}") + return False + +if __name__ == "__main__": + # 产品图片路径 + image_dir = r"g:\stonelan-workspace\membank\产品\飞牛 NAS\fyd-亚克力机箱 - 单\image" + + # 要处理的图片 + input_image = os.path.join(image_dir, "正面.jpg") + output_image = os.path.join(image_dir, "正面_抠图.png") + + # 检查文件是否存在 + if not os.path.exists(input_image): + print(f"File not found: {input_image}") + sys.exit(1) + + # 执行抠图 + success = remove_background(input_image, output_image) + + if success: + print(f"\nBackground removal completed!") + print(f"Original: {input_image}") + print(f"Result: {output_image}") + else: + print("\nBackground removal failed!") + sys.exit(1) \ No newline at end of file diff --git a/.codebuddy/skills/image-tools/scripts/render-main-image.js b/.codebuddy/skills/image-tools/scripts/render-main-image.js new file mode 100644 index 0000000..7043ec2 --- /dev/null +++ b/.codebuddy/skills/image-tools/scripts/render-main-image.js @@ -0,0 +1,58 @@ +const puppeteer = require('puppeteer'); +const path = require('path'); +const fs = require('fs'); + +async function convertMainImageToPng() { + console.log('🎨 启动主图渲染工具...\n'); + + const browser = await puppeteer.launch({ + headless: 'new', + args: ['--no-sandbox', '--disable-setuid-sandbox'] + }); + + const page = await browser.newPage(); + + await page.setViewport({ width: 800, height: 800 }); + + const mainImageDir = 'G:\\stonelan-workspace\\membank\\产品\\飞牛 NAS\\fyd-亚克力机箱 - 单\\主图'; + + const htmlFiles = fs.readdirSync(mainImageDir) + .filter(file => file.endsWith('.html')); + + console.log(`📁 找到 ${htmlFiles.length} 个主图HTML文件需要渲染\n`); + + for (const htmlFile of htmlFiles) { + try { + const htmlPath = path.join(mainImageDir, htmlFile); + const pngFile = htmlFile.replace('.html', '.png'); + const pngPath = path.join(mainImageDir, pngFile); + + console.log(`📄 正在渲染: ${htmlFile}`); + + const fileUrl = `file:///${htmlPath.replace(/\\/g, '/')}`; + await page.goto(fileUrl, { + waitUntil: 'networkidle0', + timeout: 10000 + }); + + await page.screenshot({ + path: pngPath, + fullPage: true, + type: 'png' + }); + + console.log(`✅ 已生成: ${pngFile}\n`); + } catch (error) { + console.error(`❌ 渲染失败 ${htmlFile}: ${error.message}\n`); + } + } + + await browser.close(); + + console.log('✨ 所有主图渲染完成!'); +} + +convertMainImageToPng().catch(error => { + console.error('💥 渲染过程出错:', error); + process.exit(1); +}); \ No newline at end of file diff --git a/.codebuddy/skills/product-detail-designer/SKILL.md b/.codebuddy/skills/product-detail-designer/SKILL.md index 199f773..ed438fe 100644 --- a/.codebuddy/skills/product-detail-designer/SKILL.md +++ b/.codebuddy/skills/product-detail-designer/SKILL.md @@ -25,21 +25,44 @@ description: 设计电商产品的详情页。当用户需要为产品生成详 ### 步骤 2: 生成 HTML 文件 #### 详情页组成部分 -- 购买须知 +- 购买须知 (不需要二级标题) - 亚克力机箱需要自己组装,店铺会提供安装视频 - 受成本限制,产品无法做到十全十美,完美主义者慎拍 - 配置清单 -- 功能描述 + 1. 以表格的形式展示 + 2. cpu 内存 系统盘,网口, + 3. 内存体现容量和ddr3,内存插槽数量 + 4. 支持硬盘数量,尺寸, 容量 +- 使用场景 + 1. 手机扩容 + 照片视频备份,自动同步,远程同步 + 2. 小型办公/团队协作 + 远程文件访问,多人协作,权限分级,文件共享,文件归档,在线编辑 + 3. 监控视频存储 + 小米摄像头存储,onvif协议支持 + 4. 家庭影院打造 + 流畅播放4k视频,硬解4k + 5. 微信聊天记录备份 + 支持微信聊天记录备份 + 6. 远程访问 + 远程访问照片,视频,文件等内容 +- 产品特点 + 1. 体积小,容量大,功能强 + 2. 低耗静音 + 3. 支持远程访问 + 4. 支持wifi联网 + 5. 来电自启 + 6. 远程开关机 - 产品实拍图 +- 飞牛系统截图 - 配件清单 - 包装展示 - 常见问题 - 1. 产品是否支持双CPU? - 2. 产品是否支持双内存条 + - 严格按照详情页组成生成详情页,多余的删除掉 - 需要用的产品图片,都放在对应产品目录的image目录下 -- html 按照宽750的分辨率生成 +- html 按照宽1500的分辨率生成 - 一个产品有多个sku,但一个产品只需要一个详情页,不需要为每个sku生成详情页 - 详情页放到每个产品对应的`详情`目录下 - 配色采用绿色清晰的风格 diff --git a/.codebuddy/skills/product-main-image/SKILL.md b/.codebuddy/skills/product-main-image/SKILL.md index 78d5441..6f88546 100644 --- a/.codebuddy/skills/product-main-image/SKILL.md +++ b/.codebuddy/skills/product-main-image/SKILL.md @@ -23,7 +23,7 @@ description: 设计电商产品的主图。当用户需要为产品生成主图 ### 步骤 2: 设计主图html -- 主图尺寸:800*800 +- 主图尺寸:1000*1000 - 一个主图一个html diff --git a/.codebuddy/skills/sku-designer/SKILL.md b/.codebuddy/skills/sku-designer/SKILL.md index 5df811c..ac4ecc5 100644 --- a/.codebuddy/skills/sku-designer/SKILL.md +++ b/.codebuddy/skills/sku-designer/SKILL.md @@ -25,9 +25,12 @@ description: 设计电商产品的 SKU 配置。当用户需要为产品生成 S ### 步骤2 计算与核对产品价格 - 根据配件清单,计算产品价格 -- 更新产品价格到产品价格汇总表 - 计算价格必须使用计算工具计算 +### 步骤3 更新产品信息 + +- 更新产品信息到产品信息汇总表 + ## 飞牛 NAS产设计原则 ### 3.5金属大配置原则 @@ -42,6 +45,10 @@ description: 设计电商产品的 SKU 配置。当用户需要为产品生成 S - 可安装单SATA口主板 - 可用CPU:N2840,N2930,AMD-A4,J1900,J3160 - 可用内存:2G-16G,2G-32G,4G-64G,4G-128G +#### +推荐价格: +- 配2G内存的成本加20作为推荐售价 +- 配4G内存的成本加30作为推荐售价 ### 亚克力机箱-双 配置原则 - 可安装双SATA口主板 diff --git a/.trae/skills/html2image/SKILL.md b/.trae/skills/html2image/SKILL.md deleted file mode 100644 index 4395c4b..0000000 --- a/.trae/skills/html2image/SKILL.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -name: 商品详情设计 -description: "你是一个电商平台的商品详情设计师,负责设计商品的详情页,包括配置清单、商品实拍图、商品卖点、功能描述等。 ---- -### 工作职责: - 1. 生成对应商品的html详情页,每一项内容,独立的成1000*1000的页面 - 2. 使用 npx playwright screenshot,完成html转图片 - 3. 内容不要包含价格 -4. 一个商品一个详情页 -5. 配置清单部分,超出一个张图片,可以用多张 ,然后用-1 -2 这样的后缀标识 -### 详情页包含内容: - 1. 配置清单 - 3. 商品实拍图 - 4. 商品卖点 - 5. 功能描述 \ No newline at end of file diff --git a/.trae/skills/image-tools/SKILL.md b/.trae/skills/image-tools/SKILL.md new file mode 100644 index 0000000..2204e5b --- /dev/null +++ b/.trae/skills/image-tools/SKILL.md @@ -0,0 +1,71 @@ +--- +name: image-tools +description: 图片处理工具集,用于检查图片信息、HTML转PNG、裁剪水印等操作。当用户需要处理产品图片、转换HTML为图片、或去除图片水印时使用此技能。 +--- + +# Image Tools + +## Overview + +提供产品图片处理相关功能,包括检查图片元信息、HTML页面截图、裁剪水印等操作。适用于产品文档和图片批量处理场景。 + +## Quick Start + +使用前需安装依赖: + +```bash +cd tools/image-tools/scripts +npm install +``` + +## Tasks + +### 检查图片信息 + +查看图片的宽度、高度、格式等元信息: + +```bash +cd tools/image-tools/scripts +node check-image-info.js +``` + +**用途**:批量检查产品图片尺寸,确保符合规格要求。 + +### HTML 转 PNG + +将HTML文件转换为PNG图片截图: + +```bash +cd tools/image-tools/scripts +node convert-html-to-png.js +``` + +**用途**:将产品配置清单HTML转换为PNG图片,用于产品展示。 + +### 裁剪水印 + +裁剪图片底部水印区域(默认裁剪底部300px): + +```bash +cd tools/image-tools/scripts +node remove-watermark.js +``` + +**用途**:批量处理产品图片,去除底部水印。 + +## Configuration + +脚本默认处理路径为 `产品/飞牛 NAS/fyd-亚克力机箱 - 单/详情` 目录。如需修改: + +- **check-image-info.js**: 修改 `imageDir` 变量 +- **convert-html-to-png.js**: 修改 `detailDir` 变量及文件过滤条件 +- **remove-watermark.js**: 修改 `imageDir` 和 `CROP_BOTTOM_HEIGHT` 常量 + +## Resources + +### scripts/ + +- `check-image-info.js` - 图片信息检查脚本 +- `convert-html-to-png.js` - HTML转PNG截图脚本 +- `remove-watermark.js` - 水印裁剪脚本 +- `package.json` - Node.js 依赖配置 diff --git a/.trae/skills/image-tools/scripts/check-image-info.js b/.trae/skills/image-tools/scripts/check-image-info.js new file mode 100644 index 0000000..24f70e9 --- /dev/null +++ b/.trae/skills/image-tools/scripts/check-image-info.js @@ -0,0 +1,27 @@ +const sharp = require('sharp'); +const path = require('path'); +const fs = require('fs'); + +async function checkImageInfo() { + const imageDir = path.join(__dirname, '产品', '飞牛 NAS', 'fyd-亚克力机箱 - 单', '详情', 'image'); + + const imageFiles = fs.readdirSync(imageDir).filter(file => file.endsWith('.jpg')); + + console.log('📸 图片信息检查\n'); + + for (const imageFile of imageFiles) { + const imagePath = path.join(imageDir, imageFile); + const metadata = await sharp(imagePath).metadata(); + + console.log(`${imageFile}:`); + console.log(` 宽度: ${metadata.width}px`); + console.log(` 高度: ${metadata.height}px`); + console.log(` 格式: ${metadata.format}`); + console.log(''); + } +} + +checkImageInfo().catch(error => { + console.error('💥 检查过程出错:', error); + process.exit(1); +}); diff --git a/.trae/skills/image-tools/scripts/convert-html-to-png.js b/.trae/skills/image-tools/scripts/convert-html-to-png.js new file mode 100644 index 0000000..1b02e3a --- /dev/null +++ b/.trae/skills/image-tools/scripts/convert-html-to-png.js @@ -0,0 +1,58 @@ +const puppeteer = require('puppeteer'); +const path = require('path'); +const fs = require('fs'); + +async function convertHtmlToPng() { + console.log('🚀 启动 HTML 转 PNG 转换工具...\n'); + + const browser = await puppeteer.launch({ + headless: 'new', + args: ['--no-sandbox', '--disable-setuid-sandbox'] + }); + + const page = await browser.newPage(); + + await page.setViewport({ width: 1000, height: 1000 }); + + const detailDir = 'G:\\stonelan-workspace\\membank\\产品\\飞牛 NAS\\fyd-亚克力机箱 - 单\\主图'; + + const htmlFiles = fs.readdirSync(detailDir) + .filter(file => file.endsWith('.html')); + + console.log(`📁 找到 ${htmlFiles.length} 个 HTML 文件需要转换\n`); + + for (const htmlFile of htmlFiles) { + try { + const htmlPath = path.join(detailDir, htmlFile); + const pngFile = htmlFile.replace('.html', '.png'); + const pngPath = path.join(detailDir, pngFile); + + console.log(`📄 正在转换: ${htmlFile}`); + + const fileUrl = `file:///${htmlPath.replace(/\\/g, '/')}`; + await page.goto(fileUrl, { + waitUntil: 'networkidle0', + timeout: 10000 + }); + + await page.screenshot({ + path: pngPath, + fullPage: true, + type: 'png' + }); + + console.log(`✅ 已生成: ${pngFile}\n`); + } catch (error) { + console.error(`❌ 转换失败 ${htmlFile}: ${error.message}\n`); + } + } + + await browser.close(); + + console.log('✨ 所有转换任务已完成!'); +} + +convertHtmlToPng().catch(error => { + console.error('💥 转换过程出错:', error); + process.exit(1); +}); diff --git a/.trae/skills/image-tools/scripts/convert-main-image-to-png.js b/.trae/skills/image-tools/scripts/convert-main-image-to-png.js new file mode 100644 index 0000000..74a3def --- /dev/null +++ b/.trae/skills/image-tools/scripts/convert-main-image-to-png.js @@ -0,0 +1,60 @@ +const puppeteer = require('puppeteer'); +const path = require('path'); +const fs = require('fs'); + +async function convertHtmlToPng() { + console.log('🚀 启动主图 HTML 转 PNG 转换工具...\n'); + + const browser = await puppeteer.launch({ + headless: 'new', + args: ['--no-sandbox', '--disable-setuid-sandbox'] + }); + + const page = await browser.newPage(); + + // 主图尺寸 800x800 + await page.setViewport({ width: 1000, height: 1000 }); + + const mainImageDir = 'G:\\stonelan-workspace\\membank\\产品\\飞牛 NAS\\fyd-亚克力机箱 - 单\\主图'; + + const htmlFiles = fs.readdirSync(mainImageDir) + .filter(file => file.endsWith('.html') && file.includes('主图')); + + console.log(`📁 找到 ${htmlFiles.length} 个主图 HTML 文件需要转换\n`); + + for (const htmlFile of htmlFiles) { + try { + const htmlPath = path.join(mainImageDir, htmlFile); + const pngFile = htmlFile.replace('.html', '.png'); + const pngPath = path.join(mainImageDir, pngFile); + + console.log(`📄 正在转换: ${htmlFile}`); + + const fileUrl = `file:///${htmlPath.replace(/\\/g, '/')}`; + await page.goto(fileUrl, { + waitUntil: 'networkidle0', + timeout: 10000 + }); + + await page.screenshot({ + path: pngPath, + fullPage: false, + type: 'png', + clip: { x: 0, y: 0, width: 1000, height: 1000 } + }); + + console.log(`✅ 已生成: ${pngFile}\n`); + } catch (error) { + console.error(`❌ 转换失败 ${htmlFile}: ${error.message}\n`); + } + } + + await browser.close(); + + console.log('✨ 所有主图转换任务已完成!'); +} + +convertHtmlToPng().catch(error => { + console.error('💥 转换过程出错:', error); + process.exit(1); +}); diff --git a/.trae/skills/image-tools/scripts/package-lock.json b/.trae/skills/image-tools/scripts/package-lock.json new file mode 100644 index 0000000..aeb08d3 --- /dev/null +++ b/.trae/skills/image-tools/scripts/package-lock.json @@ -0,0 +1,1666 @@ +{ + "name": "membank", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "membank", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "puppeteer": "^24.40.0", + "sharp": "^0.34.5" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz", + "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@puppeteer/browsers": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.13.0.tgz", + "integrity": "sha512-46BZJYJjc/WwmKjsvDFykHtXrtomsCIrwYQPOP7VfMJoZY2bsDF9oROBABR3paDjDcmkUye1Pb1BqdcdiipaWA==", + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.4.3", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.5.0", + "semver": "^7.7.4", + "tar-fs": "^3.1.1", + "yargs": "^17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", + "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", + "license": "MIT", + "optional": true, + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/b4a": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz", + "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==", + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, + "node_modules/bare-events": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", + "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", + "license": "Apache-2.0", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, + "node_modules/bare-fs": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.6.0.tgz", + "integrity": "sha512-2YkS7NuiJceSEbyEOdSNLE9tsGd+f4+f7C+Nik/MCk27SYdwIMPT/yRKvg++FZhQXgk0KWJKJyXX9RhVV0RGqA==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-os": { + "version": "3.8.7", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.8.7.tgz", + "integrity": "sha512-G4Gr1UsGeEy2qtDTZwL7JFLo2wapUarz7iTMcYcMFdS89AIQuBoyjgXZz0Utv7uHs3xA9LckhVbeBi8lEQrC+w==", + "license": "Apache-2.0", + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "license": "Apache-2.0", + "dependencies": { + "bare-os": "^3.0.1" + } + }, + "node_modules/bare-stream": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.12.0.tgz", + "integrity": "sha512-w28i8lkBgREV3rPXGbgK+BO66q+ZpKqRWrZLiCdmmUlLPrQ45CzkvRhN+7lnv00Gpi2zy5naRxnUFAxCECDm9g==", + "license": "Apache-2.0", + "dependencies": { + "streamx": "^2.25.0", + "teex": "^1.0.1" + }, + "peerDependencies": { + "bare-abort-controller": "*", + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + }, + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/bare-url": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.0.tgz", + "integrity": "sha512-NSTU5WN+fy/L0DDenfE8SXQna4voXuW0FHM7wH8i3/q9khUSchfPbPezO4zSFMnDGIf9YE+mt/RWhZgNRKRIXA==", + "license": "Apache-2.0", + "dependencies": { + "bare-path": "^3.0.0" + } + }, + "node_modules/basic-ftp": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.2.0.tgz", + "integrity": "sha512-VoMINM2rqJwJgfdHq6RiUudKt2BV+FY5ZFezP/ypmwayk68+NzzAQy4XXLlqsGD4MCzq3DrmNFD/uUmBJuGoXw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chromium-bidi": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-14.0.0.tgz", + "integrity": "sha512-9gYlLtS6tStdRWzrtXaTMnqcM4dudNegMXJxkR0I/CXObHalYeYcAMPrL19eroNZHtJ8DQmu1E+ZNOYu/IXMXw==", + "license": "Apache-2.0", + "dependencies": { + "mitt": "^3.0.1", + "zod": "^3.24.1" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz", + "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "license": "MIT", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/devtools-protocol": { + "version": "0.0.1581282", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1581282.tgz", + "integrity": "sha512-nv7iKtNZQshSW2hKzYNr46nM/Cfh5SEvE2oV0/SEGgc9XupIY5ggf84Cz8eJIkBce7S3bmTAauFD6aysMpnqsQ==", + "license": "BSD-3-Clause" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "license": "MIT" + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-uri": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", + "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", + "license": "MIT", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "license": "MIT", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "license": "MIT", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proxy-agent": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.1.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/puppeteer": { + "version": "24.40.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.40.0.tgz", + "integrity": "sha512-IxQbDq93XHVVLWHrAkFP7F7iHvb9o0mgfsSIMlhHb+JM+JjM1V4v4MNSQfcRWJopx9dsNOr9adYv0U5fm9BJBQ==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.13.0", + "chromium-bidi": "14.0.0", + "cosmiconfig": "^9.0.0", + "devtools-protocol": "0.0.1581282", + "puppeteer-core": "24.40.0", + "typed-query-selector": "^2.12.1" + }, + "bin": { + "puppeteer": "lib/cjs/puppeteer/node/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core": { + "version": "24.40.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.40.0.tgz", + "integrity": "sha512-MWL3XbUCfVgGR0gRsidzT6oKJT2QydPLhMITU6HoVWiiv4gkb6gJi3pcdAa8q4HwjBTbqISOWVP4aJiiyUJvag==", + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.13.0", + "chromium-bidi": "14.0.0", + "debug": "^4.4.3", + "devtools-protocol": "0.0.1581282", + "typed-query-selector": "^2.12.1", + "webdriver-bidi-protocol": "0.4.1", + "ws": "^8.19.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "license": "MIT", + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/streamx": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.25.0.tgz", + "integrity": "sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==", + "license": "MIT", + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar-fs": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.2.tgz", + "integrity": "sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.8.tgz", + "integrity": "sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==", + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "bare-fs": "^4.5.5", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/teex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "license": "MIT", + "dependencies": { + "streamx": "^2.12.5" + } + }, + "node_modules/text-decoder": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", + "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/typed-query-selector": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.1.tgz", + "integrity": "sha512-uzR+FzI8qrUEIu96oaeBJmd9E7CFEiQ3goA5qCVgc4s5llSubcfGHq9yUstZx/k4s9dXHVKsE35YWoFyvEqEHA==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "license": "MIT", + "optional": true + }, + "node_modules/webdriver-bidi-protocol": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.4.1.tgz", + "integrity": "sha512-ARrjNjtWRRs2w4Tk7nqrf2gBI0QXWuOmMCx2hU+1jUt6d00MjMxURrhxhGbrsoiZKJrhTSTzbIrc554iKI10qw==", + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", + "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/.trae/skills/image-tools/scripts/package.json b/.trae/skills/image-tools/scripts/package.json new file mode 100644 index 0000000..19e797c --- /dev/null +++ b/.trae/skills/image-tools/scripts/package.json @@ -0,0 +1,20 @@ +{ + "name": "membank", + "version": "1.0.0", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git@gitee.com:xiongmaojames/membank.git" + }, + "keywords": [], + "author": "", + "license": "ISC", + "description": "", + "dependencies": { + "puppeteer": "^24.40.0", + "sharp": "^0.34.5" + } +} diff --git a/.trae/skills/image-tools/scripts/remove-background.py b/.trae/skills/image-tools/scripts/remove-background.py new file mode 100644 index 0000000..66d0d33 --- /dev/null +++ b/.trae/skills/image-tools/scripts/remove-background.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +""" +产品图片抠图工具 +使用rembg库自动去除图片背景 +""" +import os +import sys + +try: + from rembg import remove + from PIL import Image +except ImportError: + print("Missing dependencies, installing...") + os.system("pip install rembg pillow") + from rembg import remove + from PIL import Image + +def remove_background(input_path, output_path): + """ + 去除图片背景 + """ + try: + print(f"Processing: {input_path}") + + # 打开原始图片 + with open(input_path, 'rb') as input_file: + input_data = input_file.read() + + # 去除背景 + output_data = remove(input_data) + + # 保存结果 + with open(output_path, 'wb') as output_file: + output_file.write(output_data) + + print(f"Saved: {output_path}") + return True + except Exception as e: + print(f"Error: {e}") + return False + +if __name__ == "__main__": + # 产品图片路径 + image_dir = r"g:\stonelan-workspace\membank\产品\飞牛 NAS\fyd-亚克力机箱 - 单\image" + + # 要处理的图片 + input_image = os.path.join(image_dir, "正面.jpg") + output_image = os.path.join(image_dir, "正面_抠图.png") + + # 检查文件是否存在 + if not os.path.exists(input_image): + print(f"File not found: {input_image}") + sys.exit(1) + + # 执行抠图 + success = remove_background(input_image, output_image) + + if success: + print(f"\nBackground removal completed!") + print(f"Original: {input_image}") + print(f"Result: {output_image}") + else: + print("\nBackground removal failed!") + sys.exit(1) \ No newline at end of file diff --git a/.trae/skills/image-tools/scripts/remove-watermark.js b/.trae/skills/image-tools/scripts/remove-watermark.js new file mode 100644 index 0000000..145d160 --- /dev/null +++ b/.trae/skills/image-tools/scripts/remove-watermark.js @@ -0,0 +1,51 @@ +const sharp = require('sharp'); +const path = require('path'); +const fs = require('fs'); + +const CROP_BOTTOM_HEIGHT = 300; + +async function removeWatermark() { + console.log('🖼️ 开始裁剪图片水印...\n'); + + const imageDir = path.join(__dirname, '产品', '飞牛 NAS', 'fyd-亚克力机箱 - 单', '详情', 'image'); + + const backupDir = path.join(imageDir, 'backup'); + + const imageFiles = fs.readdirSync(backupDir).filter(file => file.endsWith('.jpg')); + + console.log(`📸 找到 ${imageFiles.length} 张图片需要处理\n`); + console.log(`✂️ 裁剪设置: 从底部裁剪 ${CROP_BOTTOM_HEIGHT}px\n`); + + for (const imageFile of imageFiles) { + try { + const backupPath = path.join(backupDir, imageFile); + const imagePath = path.join(imageDir, imageFile); + + console.log(`📄 正在处理: ${imageFile}`); + + const metadata = await sharp(backupPath).metadata(); + + const newHeight = metadata.height - CROP_BOTTOM_HEIGHT; + + await sharp(backupPath) + .extract({ + left: 0, + top: 0, + width: metadata.width, + height: newHeight + }) + .toFile(imagePath); + + console.log(` ✅ 已裁剪: ${metadata.width}x${metadata.height} -> ${metadata.width}x${newHeight}\n`); + } catch (error) { + console.error(` ❌ 处理失败 ${imageFile}: ${error.message}\n`); + } + } + + console.log('✨ 所有图片处理完成!'); +} + +removeWatermark().catch(error => { + console.error('💥 处理过程出错:', error); + process.exit(1); +}); diff --git a/.trae/skills/image-tools/scripts/render-main-image.js b/.trae/skills/image-tools/scripts/render-main-image.js new file mode 100644 index 0000000..7043ec2 --- /dev/null +++ b/.trae/skills/image-tools/scripts/render-main-image.js @@ -0,0 +1,58 @@ +const puppeteer = require('puppeteer'); +const path = require('path'); +const fs = require('fs'); + +async function convertMainImageToPng() { + console.log('🎨 启动主图渲染工具...\n'); + + const browser = await puppeteer.launch({ + headless: 'new', + args: ['--no-sandbox', '--disable-setuid-sandbox'] + }); + + const page = await browser.newPage(); + + await page.setViewport({ width: 800, height: 800 }); + + const mainImageDir = 'G:\\stonelan-workspace\\membank\\产品\\飞牛 NAS\\fyd-亚克力机箱 - 单\\主图'; + + const htmlFiles = fs.readdirSync(mainImageDir) + .filter(file => file.endsWith('.html')); + + console.log(`📁 找到 ${htmlFiles.length} 个主图HTML文件需要渲染\n`); + + for (const htmlFile of htmlFiles) { + try { + const htmlPath = path.join(mainImageDir, htmlFile); + const pngFile = htmlFile.replace('.html', '.png'); + const pngPath = path.join(mainImageDir, pngFile); + + console.log(`📄 正在渲染: ${htmlFile}`); + + const fileUrl = `file:///${htmlPath.replace(/\\/g, '/')}`; + await page.goto(fileUrl, { + waitUntil: 'networkidle0', + timeout: 10000 + }); + + await page.screenshot({ + path: pngPath, + fullPage: true, + type: 'png' + }); + + console.log(`✅ 已生成: ${pngFile}\n`); + } catch (error) { + console.error(`❌ 渲染失败 ${htmlFile}: ${error.message}\n`); + } + } + + await browser.close(); + + console.log('✨ 所有主图渲染完成!'); +} + +convertMainImageToPng().catch(error => { + console.error('💥 渲染过程出错:', error); + process.exit(1); +}); \ No newline at end of file diff --git a/.trae/skills/product-detail-designer/SKILL.md b/.trae/skills/product-detail-designer/SKILL.md new file mode 100644 index 0000000..ed438fe --- /dev/null +++ b/.trae/skills/product-detail-designer/SKILL.md @@ -0,0 +1,88 @@ +--- +name: product-detail-designer +description: 设计电商产品的详情页。当用户需要为产品生成详情页HTML、批量渲染SKU页面、或处理产品图片时使用此技能。 +--- + +# Product Detail Designer + +## 概述 + +根据产品的 SKU 和配置规范,生成对应的产品详情页 HTML,并转换为 PNG 图片。自动化处理从配置数据到最终展示页面的完整流程。 + +## 使用场景 + +- 有产品种类或 SKU 变化,需要重新生成详情页 +- 有产品图片变化,需要更新详情页 +- 需要批量为多个 SKU 生成对应的详情页 + +## 工作流程 + +### 步骤 1: 读取 SKU 配置 + +从 `产品` 目录下找到对应的产品目录 + + +### 步骤 2: 生成 HTML 文件 + +#### 详情页组成部分 +- 购买须知 (不需要二级标题) + - 亚克力机箱需要自己组装,店铺会提供安装视频 + - 受成本限制,产品无法做到十全十美,完美主义者慎拍 +- 配置清单 + 1. 以表格的形式展示 + 2. cpu 内存 系统盘,网口, + 3. 内存体现容量和ddr3,内存插槽数量 + 4. 支持硬盘数量,尺寸, 容量 +- 使用场景 + 1. 手机扩容 + 照片视频备份,自动同步,远程同步 + 2. 小型办公/团队协作 + 远程文件访问,多人协作,权限分级,文件共享,文件归档,在线编辑 + 3. 监控视频存储 + 小米摄像头存储,onvif协议支持 + 4. 家庭影院打造 + 流畅播放4k视频,硬解4k + 5. 微信聊天记录备份 + 支持微信聊天记录备份 + 6. 远程访问 + 远程访问照片,视频,文件等内容 +- 产品特点 + 1. 体积小,容量大,功能强 + 2. 低耗静音 + 3. 支持远程访问 + 4. 支持wifi联网 + 5. 来电自启 + 6. 远程开关机 +- 产品实拍图 +- 飞牛系统截图 +- 配件清单 +- 包装展示 +- 常见问题 + + +- 严格按照详情页组成生成详情页,多余的删除掉 +- 需要用的产品图片,都放在对应产品目录的image目录下 +- html 按照宽1500的分辨率生成 +- 一个产品有多个sku,但一个产品只需要一个详情页,不需要为每个sku生成详情页 +- 详情页放到每个产品对应的`详情`目录下 +- 配色采用绿色清晰的风格 + + + + +### 步骤 3: HTML 转 PNG 图片 + +使用 `image-tools` 技能的 `convert-html-to-png.js` 脚本: + +```bash +cd ../image-tools/scripts +node convert-html-to-png.js +``` + +### 步骤 4: 裁剪图片水印 + +使用 `image-tools` 技能的 `remove-watermark.js` 脚本: + +```bash +node remove-watermark.js +``` diff --git a/.trae/skills/product-detail-designer/scripts/render.js b/.trae/skills/product-detail-designer/scripts/render.js new file mode 100644 index 0000000..d269ed0 --- /dev/null +++ b/.trae/skills/product-detail-designer/scripts/render.js @@ -0,0 +1,133 @@ +const fs = require('fs'); +const path = require('path'); + +// SKU 字段映射表 +const FIELD_MAP = { + '{{PRODUCT_NAME}}': 'productName', + '{{PRODUCT_SUBTITLE}}': 'productSubtitle', + '{{SKU_CODE}}': 'skuCode', + '{{CPU}}': 'cpu', + '{{MEMORY}}': 'memory', + '{{STORAGE}}': 'storage', + '{{CASE}}': 'case', + '{{POWER}}': 'power', + '{{CABLE}}': 'cable', + '{{BATTERY}}': 'battery', + '{{ETHERNET_CABLE}}': 'ethernetCable', + '{{SHIPPING_FEE}}': 'shippingFee', + '{{PACKAGING_FEE}}': 'packagingFee', + '{{ASSEMBLY_FEE}}': 'assemblyFee', + '{{TOTAL_COST}}': 'totalCost', + '{{RETAIL_PRICE}}': 'retailPrice', + '{{NOTE}}': 'note' +}; + +// 从 SKU markdown 文件解析字段 +function parseSkuFile(skuPath) { + const content = fs.readFileSync(skuPath, 'utf-8'); + const data = {}; + + content.split('\n').forEach(line => { + // 匹配格式: | **字段名** | 值 | 价格 | + const match = line.match(/\|\s*\*\*(.+?)\*\*\s*\|\s*(.+?)\s*\|/); + if (match) { + const [, fieldName, value] = match; + data[fieldName.trim()] = value.trim(); + } + }); + + return data; +} + +// 将 SKU 数据映射为模板变量 +function mapSkuToVariables(skuData) { + const cpu = skuData['CPU'] || ''; + const memory = skuData['内存'] || ''; + const storage = skuData['系统盘'] || ''; + const caseType = skuData['机箱'] || ''; + + return { + '{{PRODUCT_NAME}}': `飞牛NAS ${caseType}`, + '{{PRODUCT_SUBTITLE}}': '亚克力机箱 透明系列', + '{{SKU_CODE}}': skuData['产品型号'] || '', + '{{CPU}}': cpu, + '{{MEMORY}}': memory, + '{{STORAGE}}': storage, + '{{CASE}}': caseType, + '{{POWER}}': skuData['电源'] || '电源-60W', + '{{CABLE}}': skuData['硬盘线'] || '硬盘线-单', + '{{BATTERY}}': skuData['电池'] || '电池', + '{{ETHERNET_CABLE}}': skuData['网线'] || '网线', + '{{SHIPPING_FEE}}': skuData['运费']?.replace('¥', '') || '10', + '{{PACKAGING_FEE}}': skuData['包装费']?.replace('¥', '') || '5', + '{{ASSEMBLY_FEE}}': skuData['装机费']?.replace('¥', '') || '10', + '{{TOTAL_COST}}': skuData['总成本']?.replace('¥', '') || '0', + '{{RETAIL_PRICE}}': skuData['建议零售价']?.replace('¥', '') || '0', + '{{NOTE}}': skuData['备注'] || '' + }; +} + +// 渲染 HTML 模板 +function renderTemplate(templatePath, variables) { + let html = fs.readFileSync(templatePath, 'utf-8'); + + Object.entries(variables).forEach(([placeholder, value]) => { + html = html.split(placeholder).join(value); + }); + + return html; +} + +// 主函数:生成亚克力单详情页 +function generateDetailPages(skuFilePath, outputDir) { + const skuData = parseSkuFile(skuFilePath); + const variables = mapSkuToVariables(skuData); + + const skuCode = variables['{{SKU_CODE}}']; + const productType = '亚克力单'; + const templateDir = path.join(__dirname, '..', 'assets', 'templates', productType); + + // 创建输出目录 + const productOutputDir = path.join(outputDir, skuCode); + if (!fs.existsSync(productOutputDir)) { + fs.mkdirSync(productOutputDir, { recursive: true }); + } + + // 模板列表 + const templates = [ + '配置清单-1.html', + '配置清单-2.html', + '商品卖点.html', + '功能描述.html', + '使用场景.html', + '配件清单.html', + '包装展示.html' + ]; + + templates.forEach(template => { + const templatePath = path.join(templateDir, template); + if (!fs.existsSync(templatePath)) { + console.log(`跳过(模板不存在): ${template}`); + return; + } + + const html = renderTemplate(templatePath, variables); + const outputPath = path.join(productOutputDir, template); + fs.writeFileSync(outputPath, html, 'utf-8'); + console.log(`已生成: ${outputPath}`); + }); + + console.log(`\n完成!共生成 ${templates.length} 个 HTML 文件到: ${productOutputDir}`); +} + +// 使用示例 +const skuFile = process.argv[2]; +const outputDir = process.argv[3] || path.join(__dirname, '..', '..', '..', '产品', '飞牛 NAS', 'fyd-亚克力机箱 - 单', '详情'); + +if (!skuFile) { + console.log('用法: node render.js [输出目录]'); + console.log('示例: node render.js ../产品/飞牛NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-AMD-A4-2G-16G.md'); + process.exit(1); +} + +generateDetailPages(skuFile, outputDir); diff --git a/.trae/skills/product-main-image/SKILL.md b/.trae/skills/product-main-image/SKILL.md new file mode 100644 index 0000000..6f88546 --- /dev/null +++ b/.trae/skills/product-main-image/SKILL.md @@ -0,0 +1,49 @@ +--- +name: product-main-image +description: 设计电商产品的主图。当用户需要为产品生成主图图片或海报时使用此技能。 +--- + +# 商品主图设计 + +## 概述 + +-为每个产品生成主图图片 +-主图图片放到每个产品对应的`主图`目录下 +## 使用场景 + +- 有产品主图需要更新 + +## 工作流程 + +### 步骤 1: 准备素材 +- 根据产品详情页,归纳出主图要展示的信息 + +- 可以使用产品目录下`image`目录中的图片作为素材 + + + +### 步骤 2: 设计主图html +- 主图尺寸:1000*1000 +- 一个主图一个html + + +### 步骤 3: 导出图片 + +使用 `image-tools` 技能的 `convert-html-to-png.js` 脚本: + +## 主图规范 + + + +## 配色参考 + + + +## 字体规范 + + + +## 示例模板 + + + diff --git a/.trae/skills/sku-designer/SKILL.md b/.trae/skills/sku-designer/SKILL.md new file mode 100644 index 0000000..ac4ecc5 --- /dev/null +++ b/.trae/skills/sku-designer/SKILL.md @@ -0,0 +1,81 @@ +--- +name: sku-designer +description: 设计电商产品的 SKU 配置。当用户需要为产品生成 SKU 配置时使用此技能。 +--- + +# SKU 设计 + +## Overview + +- 为每个产品生成 SKU 配置 +- 将 SKU 配置放到每个产品对应的 `SKU` 目录下 + +## SKU 编码规则 + +- 按照 [系统]-[机箱]-[盘位]-[wifi/有]-[cpu]-[内存]-[硬盘] 规则生成sku名称 +- 每个字段之间用短横线连接,字段用简称,如:win-3.5-4-w-i3-8g-128g + + +## 设计流程 + +### 步骤1. 更新对应产品的sku,根据设计原则添加或者删除sku +- 根据对应机箱设计原则,选择cpu,内存,硬盘 +- 按照SKU编码规则生成SKU名称 +- 将SKU配置保存到对应产品目录下的`SKU`文件夹 + +### 步骤2 计算与核对产品价格 +- 根据配件清单,计算产品价格 +- 计算价格必须使用计算工具计算 + +### 步骤3 更新产品信息 + +- 更新产品信息到产品信息汇总表 + + +## 飞牛 NAS产设计原则 +### 3.5金属大配置原则 +- 3.5金属大,用于3盘位和4盘位,通过双sata转化器,主板单sata口就是3盘位,主板双sata口就是4盘位 +- 3.5金属大可安装cpu:j1900,j3160,i3-3217u,i3-5005u,3855u,1037u +- 3.5金属大可安装内存和系统盘: 4G-32G,4G-64G,8G-64G,8G-128G +### 3.5金属小配置原则 +- 3.5金属小可安装cpu:j1900,j3160,i3-3217u,i3-5005u,3855u,1037u +- 3.5金属小,可安装一个2.5和一个3.5,配单sata口主板就是单3.5 ,双sata口主板就是 3.5+2.5 +- 3.5金属小可安装内存和系统盘: 4G-32G,4G-64G,8G-64G,8G-128G +### 亚克力机箱-单 配置原则 +- 可安装单SATA口主板 +- 可用CPU:N2840,N2930,AMD-A4,J1900,J3160 +- 可用内存:2G-16G,2G-32G,4G-64G,4G-128G +#### +推荐价格: +- 配2G内存的成本加20作为推荐售价 +- 配4G内存的成本加30作为推荐售价 + +### 亚克力机箱-双 配置原则 +- 可安装双SATA口主板 +- 可用CPU:1037U,i3-3217U,i3-5005U +- 可用内存:2G-16G,2G-32G,4G-64G,4G-128G,8G-128G +## win 小主机产设计原则 +- win小主机全部使用2.5存机箱 +### 龙虾盒子 +- cpu 可使用:i3-5005u,3855u +- 内存硬盘可使用:4G-64G,4G-128G,8G-128G +- 标配无线网卡 +- 可以选装hd500G硬盘 +### win10 小主机 +- cpu 可使用:1037u,i3-3217u,i3-5005u,3855u +- 内存硬盘可使用:4G-64G,4G-128G,8G-128G +- 可选无线网卡 +- 可以选装hd500G硬盘 +### 挂机宝 +- 分为一拖一,和一拖三两种 +#### 一拖一 +- 可选cpu:1037u,i3-3217u,i3-5005u,3855u +- 可选内存-系统盘:4G-64G,4G-128G,8G-128G +- 可选硬盘:hd500G +- 使用2.5 金属机箱 +- 可选无线网卡 +#### 一拖三 +- 可选cpu:1037u,i3-3217u,i3-5005u,3855u +- 可选内存-系统盘:4G-64G,4G-128G,8G-128G +- 使用一拖三亚克力机箱 +- 可选无线网卡 diff --git a/.trae/skills/sku-designer/scripts/batch-update-sku.js b/.trae/skills/sku-designer/scripts/batch-update-sku.js new file mode 100644 index 0000000..7c72df3 --- /dev/null +++ b/.trae/skills/sku-designer/scripts/batch-update-sku.js @@ -0,0 +1,56 @@ +const fs = require('fs'); +const path = require('path'); + +const skuDir = path.join(__dirname, '../../产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku'); + +const FIXED_COST = 42 + 12 + 4 + 1 + 1 + 10 + 5 + 10; + +const CPU_PRICES = { 'N2840': 45, 'N2930': 50, 'AMD-A4': 45, 'J1900': 80, 'J3160': 90 }; +const MEMORY_COST = { + '2G-16G': { ram: 13, disk: 15 }, + '2G-32G': { ram: 13, disk: 20 }, + '4G-64G': { ram: 25, disk: 40 }, + '4G-128G': { ram: 25, disk: 68 } +}; + +const files = fs.readdirSync(skuDir).filter(f => f.endsWith('.md')); + +files.forEach(file => { + const filePath = path.join(skuDir, file); + let content = fs.readFileSync(filePath, 'utf-8'); + + // 解析: 亚克力-单-{CPU}-{MEM}.md + // CPU可能是AMD-A4这样的组合 + const match = file.match(/亚克力-单-([A-Z0-9-]+)-(\d+G)-(\d+G)\.md/); + if (!match) { + console.log(`Skipped: ${file} (no match)`); + return; + } + + const cpu = match[1]; + const mem = match[2] + '-' + match[3]; + + console.log(`Processing: ${file} - CPU: ${cpu}, Mem: ${mem}`); + + const cpuCost = CPU_PRICES[cpu]; + const ramCost = MEMORY_COST[mem].ram; + const diskCost = MEMORY_COST[mem].disk; + const totalCost = FIXED_COST + cpuCost + ramCost + diskCost; + const price = Math.round(totalCost * 1.3); + + const skuName = `亚克力-单-${cpu}-${mem}`; + content = content.replace(/\| \*\*产品型号\*\* \| [^|]+ \|/, `| **产品型号** | ${skuName} |`); + content = content.replace(/\| \*\*CPU\*\* \| [^|]+ \| ¥\d+ \|/, `| **CPU** | ${cpu} | ¥${cpuCost} |`); + + const ramName = mem.includes('4G') ? 'D3-4G' : 'D3-2G'; + const diskName = mem.includes('128G') ? 'mSATA-128G' : (mem.includes('32G') ? 'mSATA-32G' : 'mSATA-16G'); + content = content.replace(/\| \*\*内存\*\* \| D3-\dG \| ¥\d+ \|/, `| **内存** | ${ramName} | ¥${ramCost} |`); + content = content.replace(/\| \*\*系统盘\*\* \| mSATA-\d+G \| ¥\d+ \|/, `| **系统盘** | ${diskName} | ¥${diskCost} |`); + content = content.replace(/\| \*\*总成本\*\* \| - \| ¥\d+ \|/, `| **总成本** | - | ¥${totalCost} |`); + content = content.replace(/\| \*\*建议零售价\*\* \| - \| ¥\d+ \|/, `| **建议零售价** | - | ¥${price} |`); + + fs.writeFileSync(filePath, content, 'utf-8'); + console.log(` -> 成本: ¥${totalCost}, 售价: ¥${price}`); +}); + +console.log(`\n完成! 共处理 ${files.length} 个文件`); diff --git a/.trae/skills/sku-designer/scripts/sku-results.json b/.trae/skills/sku-designer/scripts/sku-results.json new file mode 100644 index 0000000..6038844 --- /dev/null +++ b/.trae/skills/sku-designer/scripts/sku-results.json @@ -0,0 +1,142 @@ +[ + { + "index": 1, + "sku": "亚克力 - 单-N2840-2G-16G", + "cost": 158, + "price": 205, + "profit": 47 + }, + { + "index": 2, + "sku": "亚克力 - 单-N2840-2G-32G", + "cost": 163, + "price": 212, + "profit": 49 + }, + { + "index": 3, + "sku": "亚克力 - 单-N2840-4G-64G", + "cost": 195, + "price": 254, + "profit": 59 + }, + { + "index": 4, + "sku": "亚克力 - 单-N2840-4G-128G", + "cost": 223, + "price": 290, + "profit": 67 + }, + { + "index": 5, + "sku": "亚克力 - 单-N2930-2G-16G", + "cost": 163, + "price": 212, + "profit": 49 + }, + { + "index": 6, + "sku": "亚克力 - 单-N2930-2G-32G", + "cost": 168, + "price": 218, + "profit": 50 + }, + { + "index": 7, + "sku": "亚克力 - 单-N2930-4G-64G", + "cost": 200, + "price": 260, + "profit": 60 + }, + { + "index": 8, + "sku": "亚克力 - 单-N2930-4G-128G", + "cost": 228, + "price": 296, + "profit": 68 + }, + { + "index": 9, + "sku": "亚克力 - 单-AMD-A4-2G-16G", + "cost": 158, + "price": 205, + "profit": 47 + }, + { + "index": 10, + "sku": "亚克力 - 单-AMD-A4-2G-32G", + "cost": 163, + "price": 212, + "profit": 49 + }, + { + "index": 11, + "sku": "亚克力 - 单-AMD-A4-4G-64G", + "cost": 195, + "price": 254, + "profit": 59 + }, + { + "index": 12, + "sku": "亚克力 - 单-AMD-A4-4G-128G", + "cost": 223, + "price": 290, + "profit": 67 + }, + { + "index": 13, + "sku": "亚克力 - 单-J1900-2G-16G", + "cost": 193, + "price": 251, + "profit": 58 + }, + { + "index": 14, + "sku": "亚克力 - 单-J1900-2G-32G", + "cost": 198, + "price": 257, + "profit": 59 + }, + { + "index": 15, + "sku": "亚克力 - 单-J1900-4G-64G", + "cost": 230, + "price": 299, + "profit": 69 + }, + { + "index": 16, + "sku": "亚克力 - 单-J1900-4G-128G", + "cost": 258, + "price": 335, + "profit": 77 + }, + { + "index": 17, + "sku": "亚克力 - 单-J3160-2G-16G", + "cost": 203, + "price": 264, + "profit": 61 + }, + { + "index": 18, + "sku": "亚克力 - 单-J3160-2G-32G", + "cost": 208, + "price": 270, + "profit": 62 + }, + { + "index": 19, + "sku": "亚克力 - 单-J3160-4G-64G", + "cost": 240, + "price": 312, + "profit": 72 + }, + { + "index": 20, + "sku": "亚克力 - 单-J3160-4G-128G", + "cost": 268, + "price": 348, + "profit": 80 + } +] \ No newline at end of file diff --git a/.trae/skills/sku-designer/scripts/update-sku-prices.js b/.trae/skills/sku-designer/scripts/update-sku-prices.js new file mode 100644 index 0000000..39ffa1f --- /dev/null +++ b/.trae/skills/sku-designer/scripts/update-sku-prices.js @@ -0,0 +1,58 @@ +// SKU价格计算工具 +// 亚克力-单 固定配件成本 +const FIXED_COST = 42 + 12 + 4 + 1 + 1 + 10 + 5 + 10; // 机箱+电源+硬盘线+电池+网线+运费+包装+装机 = 85 + +// 配件价格(来自配件清单) +const CPU_PRICES = { + 'N2840': 45, + 'N2930': 50, + 'AMD-A4': 45, + 'J1900': 80, + 'J3160': 90 +}; + +const MEMORY_PRICES = { + '2G-16G': { ram: 13, disk: 15 }, // D3-2G + mSATA-16G + '2G-32G': { ram: 13, disk: 20 }, // D3-2G + mSATA-32G + '4G-64G': { ram: 25, disk: 40 }, // D3-4G + mSATA-64G + '4G-128G': { ram: 25, disk: 68 } // D3-4G + mSATA-128G +}; + +const CPUS = ['N2840', 'N2930', 'AMD-A4', 'J1900', 'J3160']; +const MEMORIES = ['2G-16G', '2G-32G', '4G-64G', '4G-128G']; + +console.log('=== 亚克力-单 SKU 价格计算 ===\n'); + +let results = []; +let index = 1; + +CPUS.forEach(cpu => { + MEMORIES.forEach(mem => { + const cpuCost = CPU_PRICES[cpu]; + const ramCost = MEMORY_PRICES[mem].ram; + const diskCost = MEMORY_PRICES[mem].disk; + const totalCost = FIXED_COST + cpuCost + ramCost + diskCost; + const price = Math.round(totalCost * 1.3); + const profit = price - totalCost; + + const sku = `亚克力 - 单-${cpu}-${mem}`; + results.push({ index, sku, cost: totalCost, price, profit }); + + console.log(`${index}. ${sku}`); + console.log(` CPU(${cpu}): ¥${cpuCost} + 内存: ¥${ramCost} + 系统盘: ¥${diskCost} + 固定: ¥${FIXED_COST}`); + console.log(` 成本: ¥${totalCost} | 售价: ¥${price} | 利润: ¥${profit}\n`); + + index++; + }); +}); + +// 输出汇总表格式的数据 +console.log('\n=== 汇总表更新数据 ==='); +results.forEach(r => { + console.log(`| ${r.index} | ${r.sku} | ¥${r.cost} | ¥${r.price} | ¥${r.profit} | 30% |`); +}); + +// 导出JSON供后续使用 +const fs = require('fs'); +fs.writeFileSync('./sku-results.json', JSON.stringify(results, null, 2)); +console.log('\n已导出计算结果到 sku-results.json'); diff --git a/产品/产品价格汇总表.md b/产品/产品价格汇总表.md index e9e1b34..2616fdb 100644 --- a/产品/产品价格汇总表.md +++ b/产品/产品价格汇总表.md @@ -1,7 +1,7 @@ # 全部产品成本与售价汇总表 -> 更新日期:2026-03-22 -> 定价策略:成本 × 130% = 建议零售价(30% 利润率) +> 更新日期:2026-04-04 +> 定价策略:亚克力单:2G内存成本+20元,4G内存成本+30元;其他产品:成本 × 130% = 建议零售价(30% 利润率) --- @@ -87,26 +87,26 @@ | 序号 | 产品型号 | 成本 | 售价 | 利润 | 利润率 | |:---:|---------|:----:|:----:|:----:|:------:| -| 1 | 亚克力 - 单-N2840-2G-16G | ¥158 | ¥205 | ¥47 | 30% | -| 2 | 亚克力 - 单-N2840-2G-32G | ¥163 | ¥212 | ¥49 | 30% | -| 3 | 亚克力 - 单-N2840-4G-64G | ¥195 | ¥254 | ¥59 | 30% | -| 4 | 亚克力 - 单-N2840-4G-128G | ¥223 | ¥290 | ¥67 | 30% | -| 5 | 亚克力 - 单-N2930-2G-16G | ¥163 | ¥212 | ¥49 | 30% | -| 6 | 亚克力 - 单-N2930-2G-32G | ¥168 | ¥218 | ¥50 | 30% | -| 7 | 亚克力 - 单-N2930-4G-64G | ¥200 | ¥260 | ¥60 | 30% | -| 8 | 亚克力 - 单-N2930-4G-128G | ¥228 | ¥296 | ¥68 | 30% | -| 9 | 亚克力 - 单-AMD-A4-2G-16G | ¥158 | ¥205 | ¥47 | 30% | -| 10 | 亚克力 - 单-AMD-A4-2G-32G | ¥163 | ¥212 | ¥49 | 30% | -| 11 | 亚克力 - 单-AMD-A4-4G-64G | ¥195 | ¥254 | ¥59 | 30% | -| 12 | 亚克力 - 单-AMD-A4-4G-128G | ¥223 | ¥290 | ¥67 | 30% | -| 13 | 亚克力 - 单-J1900-2G-16G | ¥193 | ¥251 | ¥58 | 30% | -| 14 | 亚克力 - 单-J1900-2G-32G | ¥198 | ¥257 | ¥59 | 30% | -| 15 | 亚克力 - 单-J1900-4G-64G | ¥230 | ¥299 | ¥69 | 30% | -| 16 | 亚克力 - 单-J1900-4G-128G | ¥258 | ¥335 | ¥77 | 30% | -| 17 | 亚克力 - 单-J3160-2G-16G | ¥203 | ¥264 | ¥61 | 30% | -| 18 | 亚克力 - 单-J3160-2G-32G | ¥208 | ¥270 | ¥62 | 30% | -| 19 | 亚克力 - 单-J3160-4G-64G | ¥240 | ¥312 | ¥72 | 30% | -| 20 | 亚克力 - 单-J3160-4G-128G | ¥268 | ¥348 | ¥80 | 30% | +| 1 | 亚克力 - 单-N2840-2G-16G | ¥136 | ¥156 | ¥20 | 15% | +| 2 | 亚克力 - 单-N2840-2G-32G | ¥141 | ¥161 | ¥20 | 14% | +| 3 | 亚克力 - 单-N2840-4G-64G | ¥198 | ¥228 | ¥30 | 15% | +| 4 | 亚克力 - 单-N2840-4G-128G | ¥201 | ¥231 | ¥30 | 15% | +| 5 | 亚克力 - 单-N2930-2G-16G | ¥141 | ¥161 | ¥20 | 14% | +| 6 | 亚克力 - 单-N2930-2G-32G | ¥146 | ¥166 | ¥20 | 14% | +| 7 | 亚克力 - 单-N2930-4G-64G | ¥203 | ¥233 | ¥30 | 15% | +| 8 | 亚克力 - 单-N2930-4G-128G | ¥206 | ¥236 | ¥30 | 15% | +| 9 | 亚克力 - 单-AMD-A4-2G-16G | ¥136 | ¥156 | ¥20 | 15% | +| 10 | 亚克力 - 单-AMD-A4-2G-32G | ¥141 | ¥161 | ¥20 | 14% | +| 11 | 亚克力 - 单-AMD-A4-4G-64G | ¥198 | ¥228 | ¥30 | 15% | +| 12 | 亚克力 - 单-AMD-A4-4G-128G | ¥201 | ¥231 | ¥30 | 15% | +| 13 | 亚克力 - 单-J1900-2G-16G | ¥171 | ¥191 | ¥20 | 12% | +| 14 | 亚克力 - 单-J1900-2G-32G | ¥176 | ¥196 | ¥20 | 11% | +| 15 | 亚克力 - 单-J1900-4G-64G | ¥233 | ¥263 | ¥30 | 13% | +| 16 | 亚克力 - 单-J1900-4G-128G | ¥236 | ¥266 | ¥30 | 13% | +| 17 | 亚克力 - 单-J3160-2G-16G | ¥181 | ¥201 | ¥20 | 11% | +| 18 | 亚克力 - 单-J3160-2G-32G | ¥186 | ¥206 | ¥20 | 11% | +| 19 | 亚克力 - 单-J3160-4G-64G | ¥243 | ¥273 | ¥30 | 12% | +| 20 | 亚克力 - 单-J3160-4G-128G | ¥246 | ¥276 | ¥30 | 12% | ### 3.2 亚克力 - 双产品(12 款) @@ -222,54 +222,7 @@ |---------|:--------:|:--------:|:--------:|:--------:|:--------:| | 飞牛NAS-金属机箱大 | 24 款 | ¥230 | ¥418 | ¥299 | ¥543 | | 飞牛NAS-金属机箱小 | 24 款 | ¥246 | ¥382 | ¥320 | ¥497 | -| 飞牛NAS-亚克力机箱 | 32 款 | ¥158 | ¥268 | ¥205 | ¥348 | +| 飞牛NAS-亚克力机箱 | 32 款 | ¥136 | ¥246 | ¥156 | ¥276 | | win小主机-龙虾盒子 | 6 款 | ¥259 | ¥364 | ¥337 | ¥473 | | win小主机-win10小主机 | 24 款 | ¥214 | ¥364 | ¥278 | ¥473 | | win小主机-挂机宝 | 24 款 | ¥214 | ¥366 | ¥278 | ¥476 | - ---- - -## 📊 汇总统计 - -- **产品总数**:134 款 -- **统一定价策略**:成本 × 130% = 建议零售价 -- **统一利润率**:30% - ---- - -## 📝 配件价格参考 - -| 配件类型 | 配件名称 | 进价 | 备注 | -|---------|---------|------|------| -| CPU | N2840 | ¥45 | 单 SATA 口 | -| CPU | N2930 | ¥50 | 单 SATA 口 | -| CPU | AMD-A4 | ¥45 | 单 SATA 口 | -| CPU | J1900 | ¥80 | 单 SATA 口 | -| CPU | J3160 | ¥90 | 单 SATA 口 | -| CPU | 1037U | ¥55 | 双 SATA 口 | -| CPU | 3217U | ¥65 | 双 SATA 口 | -| CPU | 5005U | ¥80 | 双 SATA 口 | -| CPU | 3855U | ¥80 | 单 SATA 口 | -| 内存 | D3-2G | ¥13 | - | -| 内存 | D3-4G | ¥25 | - | -| 内存 | D3-8G | ¥120 | - | -| 系统盘 | mSATA-16G | ¥15 | - | -| 系统盘 | mSATA-32G | ¥20 | - | -| 系统盘 | mSATA-64G | ¥40 | - | -| 系统盘 | mSATA-128G | ¥68 | - | -| 机箱 | 亚-单 | ¥42 | - | -| 机箱 | 亚-双 | ¥46 | - | -| 机箱 | 亚-一拖三 | ¥55 | - | -| 机箱 | 金属机箱3.5寸小 | ¥60 | - | -| 机箱 | 金属机箱3.5寸大 | ¥68 | - | -| 机箱 | 金属机箱2.5寸 | ¥33 | - | -| 其他 | 电源-60W | ¥12 | - | -| 其他 | 硬盘线-双 | ¥5 | - | -| 其他 | 硬盘线-单 | ¥4 | - | -| 其他 | 双SATA转换器 | ¥28 | - | -| 其他 | 电池 | ¥1 | - | -| 其他 | 网线 | ¥1 | - | -| 其他 | 运费 | ¥10 | - | -| 其他 | 包装费 | ¥5 | - | -| 其他 | 装机费 | ¥10 | - | -| 其他 | 无线网卡 | ¥20 | - | diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/image/侧面_抠图.png b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/image/侧面_抠图.png new file mode 100644 index 0000000..85557cf Binary files /dev/null and b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/image/侧面_抠图.png differ diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/image/俯视图_抠图.png b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/image/俯视图_抠图.png new file mode 100644 index 0000000..8cff942 Binary files /dev/null and b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/image/俯视图_抠图.png differ diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/image/包装1_抠图.png b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/image/包装1_抠图.png new file mode 100644 index 0000000..9870e46 Binary files /dev/null and b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/image/包装1_抠图.png differ diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/image/包装2_抠图.png b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/image/包装2_抠图.png new file mode 100644 index 0000000..ee3db00 Binary files /dev/null and b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/image/包装2_抠图.png differ diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/image/底面_抠图.png b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/image/底面_抠图.png new file mode 100644 index 0000000..55c6ccc Binary files /dev/null and b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/image/底面_抠图.png differ diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/image/接口_抠图.png b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/image/接口_抠图.png new file mode 100644 index 0000000..41939db Binary files /dev/null and b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/image/接口_抠图.png differ diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/image/正面_抠图.png b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/image/正面_抠图.png new file mode 100644 index 0000000..610fadd Binary files /dev/null and b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/image/正面_抠图.png differ diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/image/配件清单_抠图.png b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/image/配件清单_抠图.png new file mode 100644 index 0000000..c9b444a Binary files /dev/null and b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/image/配件清单_抠图.png differ diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-AMD-A4-2G-16G.md b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-AMD-A4-2G-16G.md index b819bd8..284a3c0 100644 --- a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-AMD-A4-2G-16G.md +++ b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-AMD-A4-2G-16G.md @@ -9,7 +9,7 @@ | **CPU** | AMD-A4 | ¥45 | | **内存** | D3-2G | ¥13 | | **系统盘** | mSATA-16G | ¥15 | -| **机箱** | 亚-单 | ¥42 | +| **机箱** | 亚-单 | ¥20 | | **电源** | 电源-60W | ¥12 | | **硬盘线** | 硬盘线-单 | ¥4 | | **电池** | 电池 | ¥1 | @@ -17,6 +17,6 @@ | **运费** | 运费 | ¥10 | | **包装费** | 包装费 | ¥5 | | **装机费** | 装机费 | ¥10 | -| **总成本** | - | ¥158 | -| **建议零售价** | - | ¥205 | +| **总成本** | - | ¥136 | +| **建议零售价** | - | ¥156 | | **备注** | 亚克力机箱,单SATA口,入门级配置 | - | diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-AMD-A4-2G-32G.md b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-AMD-A4-2G-32G.md index 0ce78ba..eff6891 100644 --- a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-AMD-A4-2G-32G.md +++ b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-AMD-A4-2G-32G.md @@ -9,7 +9,7 @@ | **CPU** | AMD-A4 | ¥45 | | **内存** | D3-2G | ¥13 | | **系统盘** | mSATA-32G | ¥20 | -| **机箱** | 亚-单 | ¥42 | +| **机箱** | 亚-单 | ¥20 | | **电源** | 电源-60W | ¥12 | | **硬盘线** | 硬盘线-单 | ¥4 | | **电池** | 电池 | ¥1 | @@ -17,6 +17,6 @@ | **运费** | 运费 | ¥10 | | **包装费** | 包装费 | ¥5 | | **装机费** | 装机费 | ¥10 | -| **总成本** | - | ¥163 | -| **建议零售价** | - | ¥212 | +| **总成本** | - | ¥141 | +| **建议零售价** | - | ¥161 | | **备注** | 亚克力机箱,单SATA口,入门级配置 | - | diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-AMD-A4-4G-128G.md b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-AMD-A4-4G-128G.md index e1b5421..d1c935c 100644 --- a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-AMD-A4-4G-128G.md +++ b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-AMD-A4-4G-128G.md @@ -9,7 +9,7 @@ | **CPU** | AMD-A4 | ¥45 | | **内存** | D3-4G | ¥25 | | **系统盘** | mSATA-128G | ¥68 | -| **机箱** | 亚-单 | ¥42 | +| **机箱** | 亚-单 | ¥20 | | **电源** | 电源-60W | ¥12 | | **硬盘线** | 硬盘线-单 | ¥4 | | **电池** | 电池 | ¥1 | @@ -17,6 +17,6 @@ | **运费** | 运费 | ¥10 | | **包装费** | 包装费 | ¥5 | | **装机费** | 装机费 | ¥10 | -| **总成本** | - | ¥223 | -| **建议零售价** | - | ¥290 | +| **总成本** | - | ¥201 | +| **建议零售价** | - | ¥231 | | **备注** | 亚克力机箱,单SATA口 | - | diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-AMD-A4-4G-64G.md b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-AMD-A4-4G-64G.md index 5d2b12c..9adcc91 100644 --- a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-AMD-A4-4G-64G.md +++ b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-AMD-A4-4G-64G.md @@ -8,8 +8,8 @@ | **用途分类** | NAS/迷你主机 | - | | **CPU** | AMD-A4 | ¥45 | | **内存** | D3-4G | ¥25 | -| **系统盘** | mSATA-16G | ¥40 | -| **机箱** | 亚-单 | ¥42 | +| **系统盘** | mSATA-64G | ¥40 | +| **机箱** | 亚-单 | ¥20 | | **电源** | 电源-60W | ¥12 | | **硬盘线** | 硬盘线-单 | ¥4 | | **电池** | 电池 | ¥1 | @@ -17,6 +17,6 @@ | **运费** | 运费 | ¥10 | | **包装费** | 包装费 | ¥5 | | **装机费** | 装机费 | ¥10 | -| **总成本** | - | ¥195 | -| **建议零售价** | - | ¥254 | +| **总成本** | - | ¥198 | +| **建议零售价** | - | ¥228 | | **备注** | 亚克力机箱,单SATA口 | - | diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-J1900-2G-16G.md b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-J1900-2G-16G.md index cce27f3..51bc539 100644 --- a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-J1900-2G-16G.md +++ b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-J1900-2G-16G.md @@ -9,7 +9,7 @@ | **CPU** | J1900 | ¥80 | | **内存** | D3-2G | ¥13 | | **系统盘** | mSATA-16G | ¥15 | -| **机箱** | 亚-单 | ¥42 | +| **机箱** | 亚-单 | ¥20 | | **电源** | 电源-60W | ¥12 | | **硬盘线** | 硬盘线-单 | ¥4 | | **电池** | 电池 | ¥1 | @@ -17,6 +17,6 @@ | **运费** | 运费 | ¥10 | | **包装费** | 包装费 | ¥5 | | **装机费** | 装机费 | ¥10 | -| **总成本** | - | ¥193 | -| **建议零售价** | - | ¥251 | +| **总成本** | - | ¥171 | +| **建议零售价** | - | ¥191 | | **备注** | 亚克力机箱,单SATA口,入门级配置 | - | diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-J1900-2G-32G.md b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-J1900-2G-32G.md index 2b66a52..f8055bb 100644 --- a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-J1900-2G-32G.md +++ b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-J1900-2G-32G.md @@ -9,7 +9,7 @@ | **CPU** | J1900 | ¥80 | | **内存** | D3-2G | ¥13 | | **系统盘** | mSATA-32G | ¥20 | -| **机箱** | 亚-单 | ¥42 | +| **机箱** | 亚-单 | ¥20 | | **电源** | 电源-60W | ¥12 | | **硬盘线** | 硬盘线-单 | ¥4 | | **电池** | 电池 | ¥1 | @@ -17,6 +17,6 @@ | **运费** | 运费 | ¥10 | | **包装费** | 包装费 | ¥5 | | **装机费** | 装机费 | ¥10 | -| **总成本** | - | ¥198 | -| **建议零售价** | - | ¥257 | +| **总成本** | - | ¥176 | +| **建议零售价** | - | ¥196 | | **备注** | 亚克力机箱,单SATA口,入门级配置 | - | diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-J1900-4G-128G.md b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-J1900-4G-128G.md index 03af3f2..3949c00 100644 --- a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-J1900-4G-128G.md +++ b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-J1900-4G-128G.md @@ -9,7 +9,7 @@ | **CPU** | J1900 | ¥80 | | **内存** | D3-4G | ¥25 | | **系统盘** | mSATA-128G | ¥68 | -| **机箱** | 亚-单 | ¥42 | +| **机箱** | 亚-单 | ¥20 | | **电源** | 电源-60W | ¥12 | | **硬盘线** | 硬盘线-单 | ¥4 | | **电池** | 电池 | ¥1 | @@ -17,6 +17,6 @@ | **运费** | 运费 | ¥10 | | **包装费** | 包装费 | ¥5 | | **装机费** | 装机费 | ¥10 | -| **总成本** | - | ¥258 | -| **建议零售价** | - | ¥335 | +| **总成本** | - | ¥236 | +| **建议零售价** | - | ¥266 | | **备注** | 亚克力机箱,单SATA口 | - | diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-J1900-4G-64G.md b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-J1900-4G-64G.md index ae23c33..ca11570 100644 --- a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-J1900-4G-64G.md +++ b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-J1900-4G-64G.md @@ -8,8 +8,8 @@ | **用途分类** | NAS/迷你主机 | - | | **CPU** | J1900 | ¥80 | | **内存** | D3-4G | ¥25 | -| **系统盘** | mSATA-16G | ¥40 | -| **机箱** | 亚-单 | ¥42 | +| **系统盘** | mSATA-64G | ¥40 | +| **机箱** | 亚-单 | ¥20 | | **电源** | 电源-60W | ¥12 | | **硬盘线** | 硬盘线-单 | ¥4 | | **电池** | 电池 | ¥1 | @@ -17,6 +17,6 @@ | **运费** | 运费 | ¥10 | | **包装费** | 包装费 | ¥5 | | **装机费** | 装机费 | ¥10 | -| **总成本** | - | ¥230 | -| **建议零售价** | - | ¥299 | +| **总成本** | - | ¥233 | +| **建议零售价** | - | ¥263 | | **备注** | 亚克力机箱,单SATA口 | - | diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-J3160-2G-16G.md b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-J3160-2G-16G.md index 0856003..b280b99 100644 --- a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-J3160-2G-16G.md +++ b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-J3160-2G-16G.md @@ -9,7 +9,7 @@ | **CPU** | J3160 | ¥90 | | **内存** | D3-2G | ¥13 | | **系统盘** | mSATA-16G | ¥15 | -| **机箱** | 亚-单 | ¥42 | +| **机箱** | 亚-单 | ¥20 | | **电源** | 电源-60W | ¥12 | | **硬盘线** | 硬盘线-单 | ¥4 | | **电池** | 电池 | ¥1 | @@ -17,6 +17,6 @@ | **运费** | 运费 | ¥10 | | **包装费** | 包装费 | ¥5 | | **装机费** | 装机费 | ¥10 | -| **总成本** | - | ¥203 | -| **建议零售价** | - | ¥264 | +| **总成本** | - | ¥181 | +| **建议零售价** | - | ¥201 | | **备注** | 亚克力机箱,单SATA口,入门级配置 | - | diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-J3160-2G-32G.md b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-J3160-2G-32G.md index a450eb6..9070b01 100644 --- a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-J3160-2G-32G.md +++ b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-J3160-2G-32G.md @@ -9,7 +9,7 @@ | **CPU** | J3160 | ¥90 | | **内存** | D3-2G | ¥13 | | **系统盘** | mSATA-32G | ¥20 | -| **机箱** | 亚-单 | ¥42 | +| **机箱** | 亚-单 | ¥20 | | **电源** | 电源-60W | ¥12 | | **硬盘线** | 硬盘线-单 | ¥4 | | **电池** | 电池 | ¥1 | @@ -17,6 +17,6 @@ | **运费** | 运费 | ¥10 | | **包装费** | 包装费 | ¥5 | | **装机费** | 装机费 | ¥10 | -| **总成本** | - | ¥208 | -| **建议零售价** | - | ¥270 | +| **总成本** | - | ¥186 | +| **建议零售价** | - | ¥206 | | **备注** | 亚克力机箱,单SATA口,入门级配置 | - | diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-J3160-4G-128G.md b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-J3160-4G-128G.md index b5c0e5d..64a075d 100644 --- a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-J3160-4G-128G.md +++ b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-J3160-4G-128G.md @@ -9,7 +9,7 @@ | **CPU** | J3160 | ¥90 | | **内存** | D3-4G | ¥25 | | **系统盘** | mSATA-128G | ¥68 | -| **机箱** | 亚-单 | ¥42 | +| **机箱** | 亚-单 | ¥20 | | **电源** | 电源-60W | ¥12 | | **硬盘线** | 硬盘线-单 | ¥4 | | **电池** | 电池 | ¥1 | @@ -17,6 +17,6 @@ | **运费** | 运费 | ¥10 | | **包装费** | 包装费 | ¥5 | | **装机费** | 装机费 | ¥10 | -| **总成本** | - | ¥268 | -| **建议零售价** | - | ¥348 | +| **总成本** | - | ¥246 | +| **建议零售价** | - | ¥276 | | **备注** | 亚克力机箱,单SATA口 | - | diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-J3160-4G-64G.md b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-J3160-4G-64G.md index b5fc8bd..f3bb722 100644 --- a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-J3160-4G-64G.md +++ b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-J3160-4G-64G.md @@ -8,8 +8,8 @@ | **用途分类** | NAS/迷你主机 | - | | **CPU** | J3160 | ¥90 | | **内存** | D3-4G | ¥25 | -| **系统盘** | mSATA-16G | ¥40 | -| **机箱** | 亚-单 | ¥42 | +| **系统盘** | mSATA-64G | ¥40 | +| **机箱** | 亚-单 | ¥20 | | **电源** | 电源-60W | ¥12 | | **硬盘线** | 硬盘线-单 | ¥4 | | **电池** | 电池 | ¥1 | @@ -17,6 +17,6 @@ | **运费** | 运费 | ¥10 | | **包装费** | 包装费 | ¥5 | | **装机费** | 装机费 | ¥10 | -| **总成本** | - | ¥240 | -| **建议零售价** | - | ¥312 | +| **总成本** | - | ¥243 | +| **建议零售价** | - | ¥273 | | **备注** | 亚克力机箱,单SATA口 | - | diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-N2840-2G-16G.md b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-N2840-2G-16G.md index a44796e..0e1cf69 100644 --- a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-N2840-2G-16G.md +++ b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-N2840-2G-16G.md @@ -9,7 +9,7 @@ | **CPU** | N2840 | ¥45 | | **内存** | D3-2G | ¥13 | | **系统盘** | mSATA-16G | ¥15 | -| **机箱** | 亚-单 | ¥42 | +| **机箱** | 亚-单 | ¥20 | | **电源** | 电源-60W | ¥12 | | **硬盘线** | 硬盘线-单 | ¥4 | | **电池** | 电池 | ¥1 | @@ -17,6 +17,6 @@ | **运费** | 运费 | ¥10 | | **包装费** | 包装费 | ¥5 | | **装机费** | 装机费 | ¥10 | -| **总成本** | - | ¥158 | -| **建议零售价** | - | ¥205 | +| **总成本** | - | ¥136 | +| **建议零售价** | - | ¥156 | | **备注** | 亚克力机箱,单SATA口,入门级配置 | - | diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-N2840-2G-32G.md b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-N2840-2G-32G.md index 242fdba..b6a3a88 100644 --- a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-N2840-2G-32G.md +++ b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-N2840-2G-32G.md @@ -9,7 +9,7 @@ | **CPU** | N2840 | ¥45 | | **内存** | D3-2G | ¥13 | | **系统盘** | mSATA-32G | ¥20 | -| **机箱** | 亚-单 | ¥42 | +| **机箱** | 亚-单 | ¥20 | | **电源** | 电源-60W | ¥12 | | **硬盘线** | 硬盘线-单 | ¥4 | | **电池** | 电池 | ¥1 | @@ -17,6 +17,6 @@ | **运费** | 运费 | ¥10 | | **包装费** | 包装费 | ¥5 | | **装机费** | 装机费 | ¥10 | -| **总成本** | - | ¥163 | -| **建议零售价** | - | ¥212 | +| **总成本** | - | ¥141 | +| **建议零售价** | - | ¥161 | | **备注** | 亚克力机箱,单SATA口,入门级配置 | - | diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-N2840-4G-128G.md b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-N2840-4G-128G.md index 05c5bfa..37028d7 100644 --- a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-N2840-4G-128G.md +++ b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-N2840-4G-128G.md @@ -9,7 +9,7 @@ | **CPU** | N2840 | ¥45 | | **内存** | D3-4G | ¥25 | | **系统盘** | mSATA-128G | ¥68 | -| **机箱** | 亚-单 | ¥42 | +| **机箱** | 亚-单 | ¥20 | | **电源** | 电源-60W | ¥12 | | **硬盘线** | 硬盘线-单 | ¥4 | | **电池** | 电池 | ¥1 | @@ -17,6 +17,6 @@ | **运费** | 运费 | ¥10 | | **包装费** | 包装费 | ¥5 | | **装机费** | 装机费 | ¥10 | -| **总成本** | - | ¥223 | -| **建议零售价** | - | ¥290 | +| **总成本** | - | ¥201 | +| **建议零售价** | - | ¥231 | | **备注** | 亚克力机箱,单SATA口 | - | diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-N2840-4G-64G.md b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-N2840-4G-64G.md index 19e98f4..e8990a6 100644 --- a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-N2840-4G-64G.md +++ b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-N2840-4G-64G.md @@ -8,8 +8,8 @@ | **用途分类** | NAS/迷你主机 | - | | **CPU** | N2840 | ¥45 | | **内存** | D3-4G | ¥25 | -| **系统盘** | mSATA-16G | ¥40 | -| **机箱** | 亚-单 | ¥42 | +| **系统盘** | mSATA-64G | ¥40 | +| **机箱** | 亚-单 | ¥20 | | **电源** | 电源-60W | ¥12 | | **硬盘线** | 硬盘线-单 | ¥4 | | **电池** | 电池 | ¥1 | @@ -17,6 +17,6 @@ | **运费** | 运费 | ¥10 | | **包装费** | 包装费 | ¥5 | | **装机费** | 装机费 | ¥10 | -| **总成本** | - | ¥195 | -| **建议零售价** | - | ¥254 | +| **总成本** | - | ¥198 | +| **建议零售价** | - | ¥228 | | **备注** | 亚克力机箱,单SATA口 | - | diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-N2930-2G-16G.md b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-N2930-2G-16G.md index 2cbb88b..ae87cde 100644 --- a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-N2930-2G-16G.md +++ b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-N2930-2G-16G.md @@ -9,7 +9,7 @@ | **CPU** | N2930 | ¥50 | | **内存** | D3-2G | ¥13 | | **系统盘** | mSATA-16G | ¥15 | -| **机箱** | 亚-单 | ¥42 | +| **机箱** | 亚-单 | ¥20 | | **电源** | 电源-60W | ¥12 | | **硬盘线** | 硬盘线-单 | ¥4 | | **电池** | 电池 | ¥1 | @@ -17,6 +17,6 @@ | **运费** | 运费 | ¥10 | | **包装费** | 包装费 | ¥5 | | **装机费** | 装机费 | ¥10 | -| **总成本** | - | ¥163 | -| **建议零售价** | - | ¥212 | +| **总成本** | - | ¥141 | +| **建议零售价** | - | ¥161 | | **备注** | 亚克力机箱,单SATA口,入门级配置 | - | diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-N2930-2G-32G.md b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-N2930-2G-32G.md index 0a46baa..763f0f4 100644 --- a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-N2930-2G-32G.md +++ b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-N2930-2G-32G.md @@ -9,7 +9,7 @@ | **CPU** | N2930 | ¥50 | | **内存** | D3-2G | ¥13 | | **系统盘** | mSATA-32G | ¥20 | -| **机箱** | 亚-单 | ¥42 | +| **机箱** | 亚-单 | ¥20 | | **电源** | 电源-60W | ¥12 | | **硬盘线** | 硬盘线-单 | ¥4 | | **电池** | 电池 | ¥1 | @@ -17,6 +17,6 @@ | **运费** | 运费 | ¥10 | | **包装费** | 包装费 | ¥5 | | **装机费** | 装机费 | ¥10 | -| **总成本** | - | ¥168 | -| **建议零售价** | - | ¥218 | +| **总成本** | - | ¥146 | +| **建议零售价** | - | ¥166 | | **备注** | 亚克力机箱,单SATA口,入门级配置 | - | diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-N2930-4G-128G.md b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-N2930-4G-128G.md index fd6f26f..79c048b 100644 --- a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-N2930-4G-128G.md +++ b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-N2930-4G-128G.md @@ -9,7 +9,7 @@ | **CPU** | N2930 | ¥50 | | **内存** | D3-4G | ¥25 | | **系统盘** | mSATA-128G | ¥68 | -| **机箱** | 亚-单 | ¥42 | +| **机箱** | 亚-单 | ¥20 | | **电源** | 电源-60W | ¥12 | | **硬盘线** | 硬盘线-单 | ¥4 | | **电池** | 电池 | ¥1 | @@ -17,6 +17,6 @@ | **运费** | 运费 | ¥10 | | **包装费** | 包装费 | ¥5 | | **装机费** | 装机费 | ¥10 | -| **总成本** | - | ¥228 | -| **建议零售价** | - | ¥296 | +| **总成本** | - | ¥206 | +| **建议零售价** | - | ¥236 | | **备注** | 亚克力机箱,单SATA口 | - | diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-N2930-4G-64G.md b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-N2930-4G-64G.md index 5b58fa5..8e5a53b 100644 --- a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-N2930-4G-64G.md +++ b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/sku/亚克力-单-N2930-4G-64G.md @@ -8,8 +8,8 @@ | **用途分类** | NAS/迷你主机 | - | | **CPU** | N2930 | ¥50 | | **内存** | D3-4G | ¥25 | -| **系统盘** | mSATA-16G | ¥40 | -| **机箱** | 亚-单 | ¥42 | +| **系统盘** | mSATA-64G | ¥40 | +| **机箱** | 亚-单 | ¥20 | | **电源** | 电源-60W | ¥12 | | **硬盘线** | 硬盘线-单 | ¥4 | | **电池** | 电池 | ¥1 | @@ -17,6 +17,6 @@ | **运费** | 运费 | ¥10 | | **包装费** | 包装费 | ¥5 | | **装机费** | 装机费 | ¥10 | -| **总成本** | - | ¥200 | -| **建议零售价** | - | ¥260 | +| **总成本** | - | ¥203 | +| **建议零售价** | - | ¥233 | | **备注** | 亚克力机箱,单SATA口 | - | diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/主图/主图1-正面展示.html b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/主图/主图1-正面展示.html index 45e43dc..16fe5a6 100644 --- a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/主图/主图1-正面展示.html +++ b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/主图/主图1-正面展示.html @@ -3,7 +3,7 @@ - 亚克力机箱-单 - 正面展示 + 亚克力机箱-单 - 主图
- -
+
+
- -
-
+
+
+
+
-
-
飞牛 NAS 亚克力机箱
-
单盘位 · 迷你静音 · DIY组装
+
飞牛 NAS
+
亚克力机箱 · 单盘位
+
迷你静音 · DIY组装 · 低功耗运行
-
-
- 亚克力机箱正面 - -
+
+
+ 亚克力机箱正面 +
-
-
亚克力透明
-
迷你便携
+
单盘位
+
WiFi联网
静音散热
+
来电自启
- - - \ No newline at end of file + diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/主图/主图1-正面展示.png b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/主图/主图1-正面展示.png index 31f3fe7..5df3077 100644 Binary files a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/主图/主图1-正面展示.png and b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/主图/主图1-正面展示.png differ diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/主图/主图2-配置展示.html b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/主图/主图2-配置展示.html deleted file mode 100644 index 5fc1262..0000000 --- a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/主图/主图2-配置展示.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - 亚克力机箱-单 - 配置展示 - - - -
-
- -
-
亚克力机箱-单
-
灵活配置 · 满足多样需求
-
- - -
-
-
可选 CPU
-
- N2840 - N2930 - AMD A4 - 1037U - J1900 - J3160 - i3 -
-
-
-
可选内存硬盘
-
- 2G-16G - 2G-32G - 4G-64G - 4G-128G -
-
-
- - - -
- - \ No newline at end of file diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/主图/主图2-配置展示.png b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/主图/主图2-配置展示.png deleted file mode 100644 index 7770dee..0000000 Binary files a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/主图/主图2-配置展示.png and /dev/null differ diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/主图/主图3-细节展示.html b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/主图/主图3-细节展示.html deleted file mode 100644 index 4568b5e..0000000 --- a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/主图/主图3-细节展示.html +++ /dev/null @@ -1,215 +0,0 @@ - - - - - - 亚克力机箱-单 - 细节展示 - - - -
- -
-
精工细作 · 品质看得见
-
- - -
- -
-
- 侧面展示 -
-
-
- 俯视图 -
-
- 底面 -
-
- 接口 -
-
-
- - -
-
-
1
-
透明亚克力材质
-
高透光率,内部硬件一目了然,科技感十足
-
-
-
2
-
精密开孔设计
-
接口布局合理,散热孔位科学,使用更便捷
-
-
-
3
-
DIY组装乐趣
-
附赠安装视频,轻松组装,享受动手乐趣
-
-
-
- - -
-
飞牛 NAS · 专业品质保障
-
-
- - \ No newline at end of file diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/主图/主图3-细节展示.png b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/主图/主图3-细节展示.png deleted file mode 100644 index fa33250..0000000 Binary files a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/主图/主图3-细节展示.png and /dev/null differ diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/主图/主图4-包装展示.html b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/主图/主图4-包装展示.html deleted file mode 100644 index 3b61350..0000000 --- a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/主图/主图4-包装展示.html +++ /dev/null @@ -1,227 +0,0 @@ - - - - - - 亚克力机箱-单 - 包装展示 - - - -
- -
-
专业包装 · 安全送达
-
配件齐全 · 安装无忧
-
- - -
- -
-
- 产品包装 -
-
精美包装
-
- - -
-
包装清单
-
-
-
- 亚克力机箱主体 -
-
-
- 安装螺丝包 -
-
-
- 硬盘电源线、数据线 -
-
-
- 电源适配器(标配) -
-
-
- 安装说明书 -
-
-
- 详细教程 -
-
-
-
- - -
-
-
🚚
-
包邮
-
-
-
🛡️
-
破损包赔
-
-
-
📖
-
详细教程
-
-
-
↩️
-
7天退换
-
-
-
- - \ No newline at end of file diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/主图/主图4-包装展示.png b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/主图/主图4-包装展示.png deleted file mode 100644 index cda330d..0000000 Binary files a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/主图/主图4-包装展示.png and /dev/null differ diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/主图/主图5-场景展示.html b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/主图/主图5-场景展示.html deleted file mode 100644 index 3428002..0000000 --- a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/主图/主图5-场景展示.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - 亚克力机箱-单 - 场景展示 - - - -
-
- -
-
多场景应用
-
满足您的各种存储需求
-
- - -
-
-
🏠
-
家庭NAS
-
家庭影音中心
照片备份存储
文件共享管理
-
-
-
💼
-
办公存储
-
文档集中管理
团队协作共享
数据安全备份
-
-
-
🔧
-
开发测试
-
开发环境搭建
服务器测试
学习实验平台
-
-
-
🎮
-
个人工作室
-
小型工作室存储
自媒体素材库
轻量级服务器
-
-
- - -
-
开启您的私有云存储之旅
-
立即选购
-
-
- - \ No newline at end of file diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/主图/主图5-场景展示.png b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/主图/主图5-场景展示.png deleted file mode 100644 index 8842b47..0000000 Binary files a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/主图/主图5-场景展示.png and /dev/null differ diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/详情/亚克力机箱-单_详情页.html b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/详情/亚克力机箱-单_详情页.html index ef51927..14fc45b 100644 --- a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/详情/亚克力机箱-单_详情页.html +++ b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/详情/亚克力机箱-单_详情页.html @@ -2,12 +2,12 @@ - + 飞牛NAS 亚克力机箱-单 详情页 @@ -200,19 +229,9 @@
购买须知
-
- 📦 关于亚克力机箱 -
- 亚克力机箱需要自己组装,店铺会提供安装视频 -
-
-
-
- 💰 关于产品 -
-
- 受成本限制,产品无法做到十全十美,完美主义者慎拍 + • 亚克力机箱需要自己组装,店铺会提供安装视频
+ • 受成本限制,产品无法做到十全十美,完美主义者慎拍
@@ -220,121 +239,113 @@
配置清单
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
配置项规格
CPUN2840/N2930/AMD A4/J1900/J3160
内存2G DDR3 / 4G DDR3(1个插槽)
系统盘16G / 32G / 64G / 128G
网口千兆网口 × 1
适配硬盘3.5/2.5寸,最大24T(需自备硬盘)
+
-
📦 产品标配清单
-
-
- 亚克力机箱-单 - 透明设计 + +
+
使用场景
+
+
+
📱
+
手机扩容
+
照片视频自动备份
远程同步释放空间
-
- 内存条 - 2G/4G +
+
💼
+
团队协作
+
多人协作权限分级
文件共享在线编辑
-
- 系统盘 - 16G/32G/64G +
+
📹
+
监控存储
+
小米摄像头支持
onvif协议兼容
-
- 电源适配器 - 12V 5A +
+
🎬
+
家庭影院
+
流畅播放4K视频
硬解码高清画质
-
- 硬盘线 - SATA套装 +
+
💬
+
微信备份
+
聊天记录自动备份
重要信息永久保存
-
- 网线 - 千兆网线 -
-
- -
💾 可选CPU配置
-
-
- Intel N2840 - 双核 2.16GHz -
-
- Intel N2930 - 四核 1.83GHz -
-
- AMD A4 - 双核 2.0GHz -
-
- Intel 1037U - 双核 1.8GHz -
-
- Intel J1900 - 四核 2.0GHz -
-
- Intel J3160 - 四核 1.6GHz -
-
- -
💾 数据盘支持
-
-
- 硬盘接口 - 单SATA口 -
-
- 支持硬盘 - 3.5/2.5机械盘 +
+
🌐
+
远程访问
+
随时随地访问
照片视频文件
- +
-
功能描述
+
产品特点
-
💾
+
📦
-

飞牛NAS网络存储

-

预装最新版本飞牛NAS系统,打造家庭私有云,数据安全可控

-
-
-
-
🌐
-
-

千兆网络

-

配备千兆网口,传输速度快,满足日常文件共享需求

+

体积小,容量大,功能强

+

尺寸仅18×19×7cm,紧凑设计,支持大容量存储,功能全面

-

低功耗静音

+

低耗静音

待机功耗10W,100个小时1度电,适合7*24小时运行

-
-
🎨
-
-

透明亚克力

-

高透光亚克力机箱,清晰展示内部结构,科技感十足

-
-
-
-
📱
-
-

远程访问

-

支持手机、电脑远程访问,随时随地查看和管理文件

-
-
📶
-

WiFi连接

+

支持WiFi联网

支持WiFi无线网络连接,无需网线即可联网使用

+
+
🔌
+
+

来电自启

+

断电后重新来电自动开机,无需手动操作

+
+
+
+
🔘
+
+

远程开关机

+

支持远程控制开关机,使用更便捷

+
+
@@ -371,15 +382,7 @@
💻 - CPU主板套装 -
-
- 🔋 - 内存条 -
-
- 💾 - mSATA系统盘 + CPU主板套装(预装飞牛系统)
🔌 @@ -390,8 +393,8 @@ SATA数据线
- 🔋 - CR2032电池 + 🔌 + SATA电源线
🌐 diff --git a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/详情/亚克力机箱-单_详情页.png b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/详情/亚克力机箱-单_详情页.png index 77ada6e..92a33fc 100644 Binary files a/产品/飞牛 NAS/fyd-亚克力机箱 - 单/详情/亚克力机箱-单_详情页.png and b/产品/飞牛 NAS/fyd-亚克力机箱 - 单/详情/亚克力机箱-单_详情页.png differ diff --git a/配件/配件清单.md b/配件/配件清单.md index ca6e221..5da38bf 100644 --- a/配件/配件清单.md +++ b/配件/配件清单.md @@ -22,7 +22,7 @@ | 电源 -60W | 电源 | 12 | | 硬盘线 - 双 | 硬盘线 | 5 | | 硬盘线 - 单 | 硬盘线 | 4 | -| 亚 - 单 | 机箱 | 42 | +| 亚 - 单 | 机箱 | 20 | | 亚 - 双 | 机箱 | 46 | | 亚-一拖三 | 机箱 | 55 | | 金属机箱3.5寸小| 机箱 | 60 |