Back to home

fan969690

dsh-module-center

🧩 DSH 模块中心:开放框架插件——右侧模块化桌面,宫格排布任意模块,自定义尺寸 1x1~2x6,单击改尺寸/长按拖拽换位,开放模块协议(插件注册即显示),内置 2 个演示模块

Stars
0
Language
JavaScript
Created
Aug 15, 2026
Updated
Aug 15, 2026

Introduction

🧩 DSH 模块中心(dsh-module-center)

把 DeepSeek Harness 的 Web 界面变成一个可自由组合的模块化桌面。 右侧嵌入一块"模块中心",像手机 APP 桌面一样排布卡片——每个卡片是一个独立功能模块,可拖动排序、可自定义大小、可折叠收起。 这是一个开放框架:任何插件注册进 panel.center.modules 槽,就能成为模块中心里的一张卡片。

license dsh modules


✨ 特性

特性说明
🖥 原生嵌列面板真正嵌进 Web 主布局(对话区自动让位),不是悬浮层;可拖拽调宽(280~640px),宽度自动记忆
🗂 宫格排布2 列 × N 行网格,像手机桌面;模块可占 1 或 2 列、1~6 行,任意组合
📐 自定义大小每个模块 1×1 ~ 2×6 共 12 种尺寸预设,一键切换,选择自动记忆
🖐 手势操作单击手柄改尺寸,长按拖动换位置(手机桌面式交互)
🧩 开放模块协议任何插件注册进 panel.center.modules 槽即成模块,无需改框架代码
显示管理内置管理面板:显示/隐藏任意模块,不卸载插件
📌 折叠/展开一键收起整列(对话区全宽),需要时从右缘浮动按钮恢复
♾️ 无上限模块数量不限,右侧列可向下滚动扩展

📸 效果预览

先看整体形态——DeepSeek Harness 右侧嵌入一块「模块中心」,对话区自动让位,像手机桌面一样排布功能卡片:

DSH 模块中心整体形态

🎬 交互演示

单击手柄 → 弹出尺寸选择器:每个模块右上角有个手柄(如 ⠿ 2x1),单击弹出 12 种尺寸预设,点击即应用,大小自动记住:

尺寸选择器演示

长按手柄 → 拖拽换位:像手机桌面一样,长按卡片拖动即可实时换位置,拖动中有高亮边框提示。

⚙ 管理面板:一键显示/隐藏任意模块,不卸载插件,状态自动记忆。

📸 界面实拍

真实运行截图——模块中心的卡片排布、尺寸自适应(1 列宽显示简称,2 列宽显示全名)一目了然:

模块中心界面实拍


🚀 安装

# 1. 安装框架
git clone https://github.com/fan969690/dsh-module-center.git
cd dsh-module-center
dsh plugin --profile web add ./framework

# 2. (可选)安装演示模块,看效果
dsh plugin --profile web add ./demos/demo-clock ./demos/demo-quicklaunch

# 3. (可选)安装模块库小组件(天气/快捷打开/时钟/便签/行情/每日一言)
dsh plugin --profile web add ./library/weather ./library/quicklaunch ./library/clock ./library/notes ./library/coins ./library/quote

装完重启 dsh web,右侧出现"🧩 模块中心"列。

框架本身不依赖任何内置模块——装上即有一个空白的模块中心。 演示模块(demos/)展示了模块协议的标准写法;模块库(library/)是社区共同维护的小组件集合,可作为你开发模块的起点模板。


📦 模块库(社区维护)

library/ 目录是官方小组件集合,由社区共同维护——每个小组件是独立插件,按需安装:

组件功能
☀️ 天气实时天气(Open-Meteo 免费 API),城市可切换
🚀 快捷打开常用链接快捷方式,可自定义
🕐 时钟日历时钟 / 日期 / 当月月历
📝 便签快速便签,localStorage 持久
💰 行情BTC/ETH/SOL/BNB 实时价格与涨跌
📖 每日一言内置语录,点击换一条

想加自己的小组件? 复制 library/quicklaunch/ 改一改即可——详见 library/README.mdCONTRIBUTING.md。欢迎提 PR 共建!


🎯 使用

基本操作

  • 手柄(标题栏左侧,如 ⠿ 2x1):单击弹出尺寸选择器(1×1~2×6),长按拖动换位置
  • 尺寸选择器:12 个预设格,点击即应用;大小会记住,下次打开保持
  • ⚙ 管理:显示/隐藏模块(记忆,不卸载插件)
  • 折叠(标题栏右侧 »):收起整列;需要时点右缘「⬅ 模块」展开
  • 拖动调宽:拖模块列左缘可调整整个面板宽度

尺寸规则

  • 宽度为 1 列时:标题栏只显示图标 + 2 字符简称(悬停看全名)
  • 宽度为 2 列时:显示图标 + 完整名称
  • 模块内容会根据尺寸自适应:窄卡精简,宽卡完整

📐 尺寸与内容推荐

不同大小适合不同类型的内容,做模块时按这个表规划最合适:

尺寸定位适合内容不适合
1×1极简卡片(跳转/状态)快捷入口、跳转按钮、状态指示灯、单一数字(在线数/待办数)、迷你开关列表、图表、表单
1×2纵向卡片(短列表)最近 N 条列表、时间线、消息流、日志摘要、纵向小部件双列数据、宽表格
1×3纵向长卡(滚动列表)完整列表(任务/通知/历史)、聊天记录、feed 流并列对比
1×4+纵向超长卡大数据量列表、日志浏览器、时间线全览
2×1横向宽卡(工具/紧凑列表)工具栏+紧凑列表、搜索+结果、双栏摘要、横向仪表条深内容阅读
2×2🎯 中型·监控首选监控面板(内存/磁盘/CPU 图表)、仪表盘、双列数据卡、状态总览超长列表
2×3中型偏大(监控+详情)监控+明细混合、日历、文件管理器、富内容卡片
2×4+大型工作区完整工具(商店全宽、编辑器、终端)、复杂仪表盘、多视图网格

通用建议:

  • 1 列宽 = 快捷/状态/摘要:信息密度要低,一眼能读
  • 2 列宽 = 工具/监控/内容:可以承载工具栏、列表、图表
  • 高度决定"能放多少行",宽度决定"每行能放什么"

🧩 模块协议(给插件开发者)

完整接口文档见 模块协议.md。快速上手:

在插件 client 端(lib/client.js)的 apply(ctx) 里:

function MyModule(props) { return React.createElement(MyModuleView, props); }
// 模块元数据(挂在组件上)
MyModule.moduleMeta = {
  icon: "📌",          // 标题栏图标
  type: "compact",     // 类型:compact(1x1) | wide(2x1) | tall(1x2) | full(2x2)
  desc: "一句话说明",   // 悬停提示
};

ctx.slots.inject("panel.center.modules", () =>
  ctx.slots.register({
    name: "panel.center.modules", // 固定槽名
    id: "my-module",              // 模块唯一 id
    order: 10,                    // 排序权重(小在前)
    label: () => "我的模块",      // 标题
    locale: NS,                   // 可选:组件会收到 t
    inject: () => ({}),           // 可选:业务 props
  }, MyModule)
);

组件通过 props 收到 moduleType / moduleSize,可据此自适应渲染(1×1 精简、2×1+ 完整)。


🧪 演示模块

仓库的 demos/ 目录有两个可直接安装、作为模板的演示模块:

演示类型展示点
🕐 时钟 demos/demo-clockcompact(1x1)状态型模块:每秒刷新;1x1 只显示时间,2x1 加日期/星期/秒
🚀 快捷跳转 demos/demo-quicklaunchcompact(1x1)跳转型模块:1x1 单个大按钮,2x1+ 网格显示全部入口(默认链接到作者 GitHub 仓库,可改 LINKS 换成你的常用页面)

装一个、改一改,就是你的第一个模块。


🏗 架构

dsh-module-center/
├── framework/         # 框架本体
│   ├── lib/
│   │   ├── index.js   # host 端(无业务,框架本身不需要 host API)
│   │   └── client.js  # client 端:布局控制器 + 宫格 + 手势 + 尺寸选择器 + 槽渲染
│   ├── cordis.patch.yml
│   └── package.json
├── demos/             # 演示模块(也是开发模板)
│   ├── demo-clock/
│   └── demo-quicklaunch/
├── library/           # 📦 模块库(社区共同维护的小组件集合)
│   ├── weather/       # ☀️ 天气
│   ├── quicklaunch/   # 🚀 快捷打开
│   ├── clock/         # 🕐 时钟日历
│   ├── notes/         # 📝 便签
│   ├── coins/         # 💰 行情
│   ├── quote/         # 📖 每日一言
│   └── README.md      # 清单 + 贡献指南
├── docs/              # 文档与截图
├── CONTRIBUTING.md    # 贡献指南
└── 模块协议.md         # 完整接口文档

核心技术

  • 嵌列布局:监听 shell 的 frame grid([data-dsh-frame] 或 sidebarCol 父元素),用 MutationObserver 跟随 shell 每次 grid 写入,在其后追加模块列轨道——永不冲突
  • 开放槽:框架注册 shell.overlay 时用 children 声明 panel.center.modules(list/root),"声明即授权"
  • 逐条渲染:ctx.slots.entries() 枚举 + renderSlot(key, owner, { only: id }) 逐条渲染,宫格自由排布
  • 手势:pointer 事件区分单击(尺寸)与长按拖拽(换位),拖动实时与指针下卡片交换
  • 记忆:尺寸/顺序/宽度/隐藏全部存 localStorage,刷新不丢

🔗 借鉴与致谢


📄 许可

MIT License