当前位置: 首页 > article >正文

保姆级教程:用Python 3.12+和Dify脚手架从零开发你的第一个工具插件

保姆级教程用Python 3.12和Dify脚手架从零开发你的第一个工具插件在当今快速发展的AI应用生态中能够快速构建和部署自定义插件已成为开发者的核心竞争力之一。Dify作为一个新兴的AI开发平台其插件系统为开发者提供了极大的灵活性和扩展能力。本教程将彻底打破你对插件开发的恐惧用最直观的方式带你从零开始一步步完成第一个Dify工具插件的完整开发流程。无论你是刚接触编程的学生还是希望扩展技能栈的开发者这篇教程都将以手把手的方式确保你能在最短时间内掌握核心要点。我们将从最基本的开发环境搭建开始深入到项目初始化、权限配置、本地调试等关键环节并在每个步骤中穿插实际开发中容易遇到的坑和解决方案。1. 开发环境准备构建坚实地基在开始任何开发工作之前确保你的开发环境正确配置是至关重要的第一步。这就像建造房屋前需要打好地基一样一个稳定、兼容的环境能让你后续的开发过程事半功倍。1.1 Python 3.12环境安装与验证Dify插件开发对Python版本有严格要求必须使用3.12或更高版本。这是因为它依赖了一些仅在较新Python版本中可用的特性。以下是详细的安装和验证步骤下载Python 3.12访问Python官方网站选择与你的操作系统匹配的最新稳定版本3.12或更高注意勾选Add Python to PATH选项这能让你在命令行中直接调用Python验证安装 打开终端或命令提示符运行以下命令检查版本python --version如果系统同时安装了多个Python版本你可能需要使用python3 --version常见问题解决如果遇到python不是内部或外部命令错误说明PATH设置有问题Windows用户可以通过重新运行安装程序并确保勾选Add Python to PATH解决Mac/Linux用户可能需要手动将Python路径添加到.bashrc或.zshrc文件中1.2 Dify脚手架工具获取与配置Dify提供了一个专门的脚手架工具来简化插件开发流程。这个工具将帮你处理项目初始化、打包等重复性工作。安装步骤访问Dify插件守护进程的GitHub发布页面根据你的操作系统下载最新版本的二进制文件Windows用户选择.exe后缀的文件Mac用户选择darwin版本Linux用户选择linux版本下载后建议将文件重命名为dify-plugin.exeWindows或dify-pluginMac/Linux以便于使用验证安装是否成功dify-plugin.exe version如果看到版本号输出说明工具已正确安装提示在某些操作系统中你可能需要给下载的文件添加可执行权限。在Mac/Linux上可以使用命令chmod x dify-plugin2. 项目初始化创建你的第一个插件骨架有了坚实的基础环境后我们现在可以开始创建第一个插件项目了。Dify脚手架工具让这个过程变得非常简单但其中仍有一些关键选择需要理解。2.1 使用脚手架初始化项目运行以下命令开始项目初始化dify-plugin.exe plugin init这个命令会启动一个交互式向导引导你完成项目的基本配置。让我们详细看看每个步骤插件名称输入一个简洁明了的名称如FileWriter名称应当反映插件的核心功能避免使用空格和特殊字符作者信息输入你的名字或团队名称这将在插件元数据中显示描述信息用一两句话说明插件的用途例如一个简单的文件写入工具插件Repository URL如果你已经有一个Git仓库地址可以在这里输入对于本地开发可以留空2.2 开发语言与插件类型选择接下来脚手架会询问两个关键问题开发语言选择目前Dify插件仅支持Python使用方向键选择Python然后回车确认插件类型选择Dify支持多种插件类型包括工具(Tool)、应用(App)等对于本教程我们选择Tool类型工具插件是最常见的类型用于扩展Dify的功能2.3 权限配置为插件分配能力权限配置是插件开发中非常关键的一步它决定了你的插件能访问哪些系统资源和功能。Dify采用了最小权限原则你需要明确指定插件需要的权限。在向导中你会看到一个权限选择界面使用方向键上下移动选择使用Tab键选中或取消选中权限对于工具类插件通常需要以下权限Tools允许插件作为工具被调用Apps允许插件与Dify应用交互Storage允许插件访问文件存储Endpoint允许插件提供API端点注意只选择你的插件真正需要的权限。过度授权可能导致安全风险。完成选择后按回车继续脚手架会生成一个标准化的项目结构。你会看到类似以下的输出Initializing plugin project... Created project structure at /path/to/your/plugin Project initialized successfully!3. 项目结构与核心文件解析理解生成的项目结构对于有效开发至关重要。让我们看看脚手架为我们创建了哪些文件和目录以及它们各自的用途。3.1 标准项目目录结构一个初始化的Dify插件项目通常包含以下内容your-plugin-name/ ├── .env.example # 环境变量示例文件 ├── main.py # 插件主入口文件 ├── manifest.json # 插件元数据描述文件 ├── requirements.txt # Python依赖列表 ├── tools/ # 工具定义目录 │ └── example_tool.yaml # 示例工具定义文件 └── tests/ # 测试目录关键文件说明main.py插件的核心执行文件包含插件初始化逻辑和主要功能实现是你编写插件业务逻辑的主要位置manifest.json插件的身份证包含名称、版本、描述等元数据也定义了插件所需的权限和依赖示例内容{ name: FileWriter, version: 0.1.0, description: A simple file writing tool plugin, author: Your Name, permissions: [Tools, Apps, Storage, Endpoint], language: python }tools/目录存放插件提供的各种工具定义每个工具对应一个YAML文件定义了工具的输入参数、输出格式和行为描述3.2 编写你的第一个工具功能让我们以一个简单的文件写入工具为例展示如何实现具体功能。修改工具定义 打开tools/example_tool.yaml文件或创建新文件修改内容如下name: write_file description: Write content to a specified file parameters: - name: file_path description: Path to the file to write type: string required: true - name: content description: Content to write to the file type: string required: true实现功能函数 在main.py中添加对应的处理函数from dify.plugin import Plugin, Tool plugin Plugin() plugin.tool(write_file) def write_file(file_path: str, content: str): 将内容写入指定文件 try: with open(file_path, w) as f: f.write(content) return {status: success, message: File written successfully} except Exception as e: return {status: error, message: str(e)}注册工具 确保在插件初始化时注册你的工具if __name__ __main__: plugin.register_tool(write_file) plugin.run()4. 本地调试与测试确保一切正常开发过程中频繁的测试和调试是保证质量的关键。Dify提供了一套方便的本地调试机制让你能在开发环境中快速验证插件行为。4.1 配置调试环境设置环境变量复制.env.example文件并重命名为.env打开.env文件添加从Dify平台获取的调试URL和KeyDIFY_PLUGIN_KEYyour_debug_key_here DIFY_PLUGIN_ENDPOINThttps://your-dify-instance.com/api/plugins/debug启动调试模式运行你的插件主文件python main.py如果一切正常你会看到类似输出Plugin started in debug mode Listening for requests...4.2 在Dify平台中测试插件访问Dify插件管理页面登录你的Dify实例导航到插件或Plugins部分识别调试插件你应该能看到你刚开发的插件带有DEBUGGING PLUGIN标识这表明插件正在本地运行但可以通过Dify平台调用测试工具功能创建一个新的对话或工作流添加你的插件作为工具尝试调用write_file功能指定文件路径和内容验证文件是否被正确写入常见调试问题解决问题现象可能原因解决方案插件不显示环境变量未正确设置检查.env文件格式和内容连接失败网络问题或URL错误验证DIFY_PLUGIN_ENDPOINT是否正确权限错误插件权限不足检查manifest.json中的权限声明提示调试过程中可以在代码中添加print语句或使用Python的logging模块输出调试信息。这些日志会显示在你运行插件的终端窗口中。5. 插件打包与分发分享你的成果当插件开发完成并通过测试后下一步就是将其打包为可分发的格式这样其他人也可以安装和使用你的插件。5.1 使用脚手架工具打包Dify脚手架提供了一个简单的打包命令dify-plugin.exe plugin package .\your-plugin-directory这个命令会验证插件结构和依赖收集所有必要文件生成一个.difypkg格式的插件包打包完成后你会在当前目录下找到一个类似your-plugin-name.difypkg的文件这就是可以分发的插件包。5.2 解决常见打包问题有时打包过程可能会遇到问题以下是一些常见错误及其解决方法签名验证失败plugin verification has been enabled, and the plugin you want to install has a bad signature这通常发生在尝试安装未正确签名的插件时解决方案确保使用最新版本的脚手架工具检查插件目录结构是否完整如果只是本地使用可以在Dify设置中临时禁用插件验证依赖缺失错误确保所有依赖都正确列在requirements.txt中运行以下命令安装所有依赖pip install -r requirements.txtPython版本不兼容确认打包环境使用Python 3.12可以使用以下命令检查环境python --version5.3 插件分发与安装有几种方式可以分享你的插件直接分发.difypkg文件可以通过邮件、网盘等方式发送给其他用户接收方可以在Dify的插件管理页面直接上传安装发布到插件市场如果Dify平台支持按照平台指南提交你的插件通常需要提供详细的描述、截图和使用说明通过Git仓库共享将完整项目上传到GitHub等平台其他开发者可以克隆仓库并自行打包6. 进阶技巧与最佳实践掌握了基础开发流程后让我们来看一些提升插件质量和开发效率的技巧。6.1 插件开发的最佳实践模块化设计将复杂功能拆分为多个独立模块保持每个工具/功能专注于单一任务示例结构your-plugin/ ├── core/ # 核心功能模块 ├── utils/ # 工具函数 ├── tools/ # 工具定义 └── main.py # 主入口错误处理与日志为所有可能失败的操作添加适当的错误处理使用Python的logging模块记录重要事件示例import logging logging.basicConfig(levellogging.INFO) logger logging.getLogger(__name__) plugin.tool(safe_write) def safe_write(file_path: str, content: str): try: with open(file_path, w) as f: f.write(content) logger.info(fSuccessfully wrote to {file_path}) return {status: success} except IOError as e: logger.error(fFailed to write file: {str(e)}) return {status: error, message: str(e)}性能优化避免在工具函数中执行长时间阻塞操作对于耗时任务考虑异步实现使用缓存机制减少重复计算6.2 测试策略完善的测试能显著提高插件可靠性。考虑实现以下测试类型单元测试测试各个独立函数的功能使用Python的unittest或pytest框架示例import unittest from your_plugin.core import write_helper class TestWriteHelper(unittest.TestCase): def test_write_content(self): result write_helper(test.txt, hello) self.assertEqual(result[status], success) with open(test.txt) as f: self.assertEqual(f.read(), hello)集成测试测试插件与Dify平台的交互模拟完整的工具调用流程端到端测试在实际Dify环境中测试完整功能验证从UI调用到功能执行的整个链条6.3 版本控制与持续集成随着插件复杂度增加采用专业的开发流程变得重要Git版本控制初始化Git仓库git init添加合理的.gitignore文件定期提交编写有意义的提交信息CI/CD流水线设置自动化测试和构建可以使用GitHub Actions等工具示例工作流name: Plugin CI on: [push] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkoutv2 - name: Set up Python 3.12 uses: actions/setup-pythonv2 with: python-version: 3.12 - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt - name: Run tests run: | python -m pytest版本管理遵循语义化版本控制(SemVer)每次重大更新递增主版本号更新manifest.json中的版本信息7. 从简单插件到复杂系统掌握了基础插件开发后你可以开始探索更高级的应用场景将简单工具发展为功能丰富的插件系统。7.1 扩展插件功能多工具集成一个插件可以提供多个相关工具例如文件处理插件可以同时包含文件写入文件读取文件信息查询文件删除状态管理插件可以维护跨请求的状态使用内存缓存或外部存储示例from dify.plugin import Plugin from typing import Dict plugin Plugin() file_cache: Dict[str, str] {} plugin.tool(cache_file) def cache_file(file_path: str): with open(file_path) as f: content f.read() file_cache[file_path] content return {status: success} plugin.tool(get_cached) def get_cached(file_path: str): if file_path in file_cache: return {status: success, content: file_cache[file_path]} return {status: error, message: File not cached}外部服务集成连接数据库、API或其他外部服务示例将文件内容保存到数据库而非本地注意处理认证和敏感信息安全7.2 性能优化技巧当插件被频繁调用时性能优化变得尤为重要连接池管理对于数据库或API连接使用连接池避免为每个请求新建连接异步处理使用Python的asyncio处理并发请求示例import asyncio from dify.async_plugin import AsyncPlugin plugin AsyncPlugin() plugin.tool(async_write) async def async_write(file_path: str, content: str): try: async with aiofiles.open(file_path, w) as f: await f.write(content) return {status: success} except Exception as e: return {status: error, message: str(e)}缓存策略对计算结果或频繁读取的数据实现缓存设置合理的过期时间考虑使用Redis等专业缓存系统7.3 安全考虑插件安全不容忽视特别是处理敏感数据时输入验证验证所有输入参数防范路径遍历等攻击示例import os from pathlib import Path def validate_path(base_dir: str, user_path: str) - bool: 防止路径遍历攻击 try: full_path Path(base_dir) / user_path full_path.resolve().relative_to(Path(base_dir).resolve()) return True except (ValueError, RuntimeError): return False敏感信息处理不要硬编码API密钥等敏感信息使用环境变量或安全配置存储确保.env文件不被提交到版本控制权限最小化只请求插件实际需要的权限在manifest.json中精确声明定期审查权限使用情况8. 真实案例构建一个Markdown转换插件让我们通过一个实际案例将前面学到的知识综合应用起来。我们将开发一个能将Markdown转换为HTML的插件并添加一些额外功能。8.1 项目初始化与基础功能初始化项目dify-plugin.exe plugin init名称MarkdownConverter描述Convert Markdown to HTML with extended features添加依赖 编辑requirements.txt添加markdown2 pygments基础转换工具 创建tools/markdown_convert.yamlname: markdown_to_html description: Convert Markdown text to HTML parameters: - name: markdown_text description: The Markdown content to convert type: string required: true - name: extras description: Comma-separated list of extras (fenced-code-blocks,tables) type: string required: false实现转换函数 在main.py中添加import markdown2 from dify.plugin import Plugin plugin Plugin() plugin.tool(markdown_to_html) def convert_markdown(markdown_text: str, extras: str ): extra_list [e.strip() for e in extras.split(,)] if extras else [] html markdown2.markdown(markdown_text, extrasextra_list) return {html: html, status: success}8.2 添加高级功能代码高亮支持 修改转换函数plugin.tool(markdown_to_html) def convert_markdown(markdown_text: str, extras: str ): extra_list [e.strip() for e in extras.split(,)] if extras else [] if fenced-code-blocks not in extra_list: extra_list.append(fenced-code-blocks) html markdown2.markdown( markdown_text, extrasextra_list, css_classcodehilite ) return { html: fstyle{pygments_css()}/style{html}, status: success } def pygments_css(): from pygments.formatters import HtmlFormatter return HtmlFormatter().get_style_defs(.codehilite)添加文件转换选项 创建新工具tools/file_convert.yamlname: file_markdown_to_html description: Convert Markdown file to HTML parameters: - name: file_path description: Path to the Markdown file type: string required: true - name: output_path description: Path to save HTML output (optional) type: string required: false实现文件处理plugin.tool(file_markdown_to_html) def convert_file(file_path: str, output_path: str None): try: with open(file_path, r) as f: md_content f.read() result convert_markdown(md_content, fenced-code-blocks,tables) if not result[status] success: return result html_content result[html] if output_path: with open(output_path, w) as f: f.write(html_content) return { status: success, html: html_content if not output_path else , message: fConverted {file_path} successfully } except Exception as e: return {status: error, message: str(e)}8.3 测试与优化单元测试import unittest from your_plugin.main import convert_markdown class TestMarkdownConversion(unittest.TestCase): def test_basic_conversion(self): result convert_markdown(# Heading) self.assertIn(h1Heading/h1, result[html]) def test_code_block(self): result convert_markdown(python\nprint(hello)\n) self.assertIn(highlight, result[html])性能测试测试大文件转换速度考虑添加缓存机制实现异步处理版本用户界面优化为Dify工作流添加合适的参数描述提供示例输入输出考虑添加格式选项如是否包含CSS这个Markdown转换插件展示了如何将一个简单想法扩展为功能丰富的工具。你可以继续添加更多功能如支持自定义模板、添加目录生成等使其更加强大和实用。

相关文章:

保姆级教程:用Python 3.12+和Dify脚手架从零开发你的第一个工具插件

保姆级教程:用Python 3.12和Dify脚手架从零开发你的第一个工具插件 在当今快速发展的AI应用生态中,能够快速构建和部署自定义插件已成为开发者的核心竞争力之一。Dify作为一个新兴的AI开发平台,其插件系统为开发者提供了极大的灵活性和扩展能…...

加了领导微信,发现他从不发朋友圈。同事说把你屏蔽了。后来才知道没屏蔽任何人,只是不发!问他为什么,他说发什么都不对!

职场里最高级的“躺平”,是把朋友圈彻底清零。最近刷到一个扎心帖子,瞬间戳中了无数职场人的共鸣:加了领导微信,翻遍他的朋友圈,一条动态都没有。同事说“你被屏蔽了”,结果真相更现实——他只是彻底不发了…...

4.18数组名理解

int main() {int a[5] {5, 4, 3, 2, 1};int *ptr (int *)(&a 1);printf( "%d,%d", *(a 1), *(ptr - 1));return 0; }看这个代码,数组a中存放了五个元素,数组名a是指向数组首元素a[0]的地址,类型为int*,&a代…...

蓝桥杯单片机 | 实战解析【进阶02】定时器中断下的长短按键识别与数码管动态显示

1. 定时器中断与长短按键识别原理 在单片机开发中,按键识别是最基础也最容易出问题的功能之一。我刚开始接触蓝桥杯单片机时,最头疼的就是按键抖动和误触发问题。后来发现,定时器中断是解决这些问题的银弹。 定时器中断就像是你家厨房里的定时…...

2026 多智能体全流程实战:用 Python + API 搭建可观测门店运营助手,附最小可复现代码

2026 多智能体全流程实战:用 Python API 搭建可观测门店运营助手,附最小可复现代码 从 2026-04-16 到 2026-04-18 的 6 条 AI 热点出发,拆到场景定义、关键代码、调试排错与上线建议 导语 先给最终效果:我们要做一个本地就能跑通…...

易语言VNC远程控制模块|虚拟机隔离防检测专用组件

温馨提示:文末有联系方式易语言VNC远程控制模块 一款深度适配易语言生态的轻量级VNC通信组件,封装底层Socket与RFB协议逻辑,提供稳定、低延迟的远程画面传输与交互能力。VNC模块源代码及键鼠操作实战示例 附带可直接编译运行的完整源码包&…...

04月19日AI每日参考:OpenAI豪掷200亿押注Cerebras,ChatGPT用户突破10亿

今日概览 今天AI圈有两条主线值得重点关注。一是算力军备赛再度升温:OpenAI与Cerebras签下超200亿美元芯片采购协议,同时获得股权,这是AI公司绑定算力供应商的最大单笔交易之一。二是国内AI硬件与Agent落地提速:联想、科大讯飞同…...

别再用成品USB麦克风了!手把手教你用STM32F4和CubeMX打造专属录音声卡(附完整代码)

从零打造专属录音声卡:STM32F4与CubeMX实战指南 市面上大多数USB麦克风都是封闭的黑箱系统,无法满足硬件创客和嵌入式开发者对底层控制的渴望。本文将带你用STM32F4开发板和CubeMX工具,打造一款完全可定制的USB录音设备,突破成品声…...

C++ STL 标准模板库 六大核心

文章目录容器(Containers)—— 存放数据算法(Algorithms)—— 操作数据迭代器(Iterators)—— 容器与算法的桥梁仿函数 / 函数对象(Functors)适配器(Adapters&#xff09…...

Bilibili视频下载器:高效下载大会员4K超清内容的专业解决方案

Bilibili视频下载器:高效下载大会员4K超清内容的专业解决方案 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 在当今数字化…...

HFSS实战:手把手教你仿真一个2.1GHz圆极化微带天线阵列(从单贴片到2x2阵)

HFSS实战:从单贴片到2x2阵列的圆极化微带天线仿真全流程 在射频工程领域,微带天线因其结构紧凑、成本低廉和易于集成的特点,成为无线通信系统的热门选择。特别是圆极化微带天线,能够有效减少极化失配带来的信号损失,在…...

【Python基础20讲】第17章:正则表达式

博主智算菩萨,专注于人工智能、Python编程、音视频处理及UI窗体程序设计等方向。致力于以通俗易懂的方式拆解前沿技术,从零基础入门到高阶实战,陪伴开发者共同成长。目前已开设五大技术专栏,累计发布多篇原创技术文章,…...

stable_baseline3 快速入门(二): 训练自定义游戏,构建Gymnasium训练环境

简介Gymnasium 为强化学习提供了一个标准化的API,它定义了 Agent 应该如何观察世界、如何做出动作以及如何获得奖励,不管是游戏,还是工业设备,只需要满足Gymnasium标准都能使用同一套代码进行训练。认识Gymnasium使用stable_basel…...

合并报表系统:多公司财务报表的自动合并

合并报表系统:多公司财务报表的自动合并 在全球化与集团化经营日益普遍的今天,企业往往需要管理多家子公司或分支机构的财务数据。传统的手工合并报表方式不仅耗时耗力,还容易因人为错误导致数据不准确。合并报表系统的出现,为企…...

【Python基础20讲】第01章:Python 环境搭建与第一个程序

博主智算菩萨,专注于人工智能、Python编程、音视频处理及UI窗体程序设计等方向。致力于以通俗易懂的方式拆解前沿技术,从零基础入门到高阶实战,陪伴开发者共同成长。目前已开设五大技术专栏,累计发布多篇原创技术文章,…...

山东大学软件学院2026项目实训个人博客(二)

项目名称:基于AI大模型的智能考研社区撰写日期:2026年4月18日本周我主要完成了项目基础环境的进一步搭建和Redis、RabbitMQ配置的完善,优化当前注册功能、登录功能、错题本CRUD功能,并进行Swagger测试。一、基础环境搭建从git仓获…...

Python 源码解读:核心数据结构与算法实现分析

一、前言Python 源码解读:核心数据结构与算法实现分析。本文深入源码层面,剖析核心设计原理,帮你从"会用"升级到"精通"。二、核心原理深度剖析2.1 数据结构设计# Python 装饰器的原理:闭包 函数作为一等公民…...

HC32F072 IAP实战:从Bootloader编写到APP跳转的完整避坑指南

HC32F072 IAP实战:从Bootloader编写到APP跳转的完整避坑指南 第一次在HC32F072上实现IAP功能时,我盯着那个神秘的__attribute__((section(".ARM.__at_0x2200")))发呆了一整天。为什么Flash操作函数必须放在这个特定地址?为什么跳转…...

技术挑战:模块交互中的条件替换异常分析与解决

技术挑战:模块交互中的条件替换异常分析与解决 【免费下载链接】ComfyUI-Impact-Pack Custom nodes pack for ComfyUI This custom node helps to conveniently enhance images through Detector, Detailer, Upscaler, Pipe, and more. 项目地址: https://gitcode…...

武昌老酒回收电话

随着消费升级与收藏文化的兴起,名贵老酒已成为许多家庭和企业资产的一部分。在武汉武昌区,如何处理手中闲置或珍藏的老酒,实现其价值的安全、高效变现,是不少持有者关心的话题。本文将深入分析武昌老酒回收市场的现状,…...

Go 中嵌入类型字段在派生结构体字面量中的初始化规则详解

Go 语言中,嵌入类型(embedded type)的字段虽可被派生结构体直接访问,但不能作为字段名出现在结构体字面量中;必须通过显式初始化嵌入类型本身,或先创建实例再赋值。 go 语言中,嵌入类型&am…...

第九篇技术笔记:PoDL:一根线,供电上网两不误

写在开篇:最近一位新疆美女导游特别火,说的也听感动:湾湾当归!早日回到祖国的怀抱!不是因为技术做不到,是因为那边有人需要。车载以太网也是这个道理。不是“把电源和数据放一根线上”这个技术有多难&#…...

Hermes_Agent_Windows安装文档

Hermes Agent Windows 安装文档适用系统:Windows 10/11 + WSL2 + Ubuntu 整理自实际安装过程,包含常见报错解决方案前置说明 Hermes Agent 不支持原生 Windows,必须通过 WSL2(Windows Linux 子系统)安装。 WSL2 会在 Windows 里运行一个完整的 Linux 环境,Ubuntu 的数据存…...

Workout.Cool:打造您的终极开源健身教练平台,3大核心功能全面解析

Workout.Cool:打造您的终极开源健身教练平台,3大核心功能全面解析 【免费下载链接】workout-cool 🏋 Modern open-source fitness coaching platform. Create workout plans, track progress, and access a comprehensive exercise database.…...

实战指南:Element-ui Select 选择器深度样式定制(从透明背景到悬停交互)

1. 为什么需要深度定制Select选择器? 最近在做一个深色主题的管理后台项目时,我发现Element-ui默认的Select选择器样式完全不符合设计需求。原生的白色背景在下拉时显得特别突兀,就像在一张黑色画布上突然撕开一道口子。这让我意识到&#xf…...

SOCD Cleaner终极指南:如何用键盘映射提升游戏操作精度

SOCD Cleaner终极指南:如何用键盘映射提升游戏操作精度 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 在竞技游戏中,你是否曾因同时按下相反方向键而导致操作失误?SOCD Clea…...

结合上篇文“怪奇物语物流假设”的对死亡搁浅3的构想

在死亡搁浅中,“送货”从来不是简单的玩法机制,而是一种被具象化的哲学表达。玩家以身体为媒介,在破碎的大地上缓慢前行,将孤立的人类节点重新连接起来。连接,在这里既是行为,也是意义本身。而在死亡搁浅2所…...

实用CLI工具:命令行下的高效选择

命令行界面在开发者日常工作中占据重要位置。很多任务通过它完成时速度更快,也更直接。尤其当处理文件搜索、内容查看或者目录跳转这类重复操作时,合适的CLI工具能节省大量时间。 Homebrew官网: https://brew.sh/ 这些工具大多可以通过简单…...

算法训练营第六天|206. 反转链表

题目链接: https://leetcode.cn/problems/reverse-linked-list/ 视频链接: https://www.bilibili.com/video/BV1nB4y1i7eL题意:反转一个单链表。 示例: 输入: 1->2->3->4…...

用AI修复和复刻老照片

最近,用AI修复了自己不同时期的照片,非常感慨。尤其是小时的场景,我并没有留下多少童年照片,现在,AI根据我的口述,把我放进去了。也算是拼接上了久远的时间轴。包括老的数码、彩照,黑白&#xf…...