# office-auto **Repository Path**: tonggl/office-auto ## Basic Information - **Project Name**: office-auto - **Description**: 所有自动化办公工具的源代码 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-19 - **Last Updated**: 2026-07-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 办公自动化平台 本地聚合启动器,统一管理多个桌面工具。 > 主界面位于 `main-app/`,子工具位于仓库根目录下的各自子目录(如 `trip-manager/`)。 > 子工具以**独立子进程**方式启动,崩溃互不影响。 ## 安装 平台本身只用 Python 标准库(Tkinter + subprocess),**无需 `pip install`**。 > Tkinter 由 Python 官方安装包自带。如遇 `ModuleNotFoundError: No module named 'tkinter'`,请从 [python.org](https://www.python.org/) 重新安装 Python(勾选 tcl/tk)。 子工具的依赖请分别进入对应子目录安装,例如: ```bash cd trip-manager pip install -r requirements.txt ``` ## 启动 ```bash cd 仓库根目录 python main-app/main.py ``` ## 目录结构 ``` office-auto/ ├── main-app/ # 主界面应用 │ ├── main.py # 系统总入口 │ ├── config/ │ │ └── modules.json # 模块注册表(categories + modules) │ └── core/ # 平台核心代码 │ ├── __init__.py │ ├── paths.py # 应用目录、仓库根与路径解析 │ ├── models.py # ModuleSpec / Category / RunningProc │ ├── module_manager.py # 加载 modules.json + 过滤 │ ├── process_manager.py # 子进程生命周期 + 后台轮询 │ └── ui/ │ ├── main_window.py # 主窗口 │ ├── top_bar.py # 顶部栏(搜索 + 按钮) │ ├── side_nav.py # 左侧分类导航 │ ├── module_grid.py # 中间模块网格 │ ├── module_card.py # 单个模块卡片 │ └── status_bar.py # 底部状态栏 ├── requirements.txt # 平台自身依赖(无需安装) ├── trip-manager/ # 子工具 1:秘书行程管理 └── ...(其他子工具) ``` ## 主要功能 | 模块 | 说明 | |---|---| | 模块卡片网格 | 中间区域以 4 列网格展示所有模块(emoji + 名称 + 描述 + 分类) | | 顶部搜索 | 实时过滤 name / description / id / category / tags,大小写不敏感;`Esc` 清空 | | 左侧分类 | 按 `categories[].id` 过滤;首行「全部」不过滤 | | 一键启动 | 点击卡片 → `subprocess.Popen` 启动对应子进程,卡片右下角圆点变绿 | | 运行中提示 | singleton 模块再次点击 → 弹「已运行 PID=xxx」提示 | | 实时状态 | 后台线程每 2s 轮询 `proc.poll()`,自动刷新圆点 | | 异常退出 | 子进程非 0 退出时状态栏红字 3s 提示 `⚠ {name} 已退出 (code={rc})` | | 优雅关闭 | 关闭主窗口时弹三选项对话框(终止 / 保留 / 取消) | | 优雅降级 | `modules.json` 缺失/损坏不闪退,状态栏黄字提示 | ## 模块注册:`main-app/config/modules.json` ```json { "schema_version": 1, "categories": [ { "id": "office", "name": "日常办公", "order": 1, "icon": "📁" }, { "id": "business", "name": "企业经营", "order": 2, "icon": "🏢" }, { "id": "data", "name": "数据处理", "order": 3, "icon": "📊" }, { "id": "other", "name": "其他", "order": 99, "icon": "📦" } ], "modules": [ { "id": "trip-manager", "name": "秘书行程管理", "description": "本地行程录入、提醒、Excel 导出", "category": "office", "tags": ["行程", "提醒", "导出"], "command": "python", "args": ["main.py"], "cwd": "./trip-manager", "env": {}, "icon": null, "color": "#4CAF50", "singleton": true, "focus_if_running": true, "enabled": true } ] } ``` ### 字段说明 | 字段 | 类型 | 必填 | 默认 | 说明 | |---|---|---|---|---| | `id` | string | 是 | — | kebab-case,唯一标识 | | `name` | string | 是 | — | 卡片标题 | | `description` | string | 否 | `""` | 副标题 / tooltip | | `category` | string | 是 | — | 必须命中 `categories[].id`,否则降级到 `other` | | `tags` | string[] | 否 | `[]` | 搜索匹配池 | | `command` | string | 是 | — | 入口可执行(推荐 `python`) | | `args` | string[] | 否 | `[]` | 参数列表(**不**做 shell 解析) | | `cwd` | string | 否 | `null` | **相对仓库根** | | `env` | object | 否 | `{}` | 追加到子进程环境变量 | | `icon` | string | 否 | `null` | 相对仓库根;MVP 用 emoji 占位 | | `color` | string | 否 | `#607D8B` | 卡片色条/顶边色 | | `singleton` | bool | 否 | `true` | true 时再次点击提示已运行;false 允许多实例 | | `focus_if_running` | bool | 否 | `true` | 仅 singleton=true 时有效 | | `enabled` | bool | 否 | `true` | false 时卡片置灰 | ### 路径约定 主界面配置以及后续的 `assets/`、`logs/` 都位于 `main-app/`。模块的 `cwd` 和 `icon` 一律使用**相对仓库根**的 POSIX 风格相对路径;路径解析不依赖启动命令的当前工作目录,因此整个仓库可拷贝到任意位置。 ## 添加新模块 1. 把子工具放到仓库根的某个子目录(如 `tools/foo/`),入口文件叫 `main.py`。 2. 在 `main-app/config/modules.json` 的 `modules` 数组里追加一项: ```json { "id": "foo", "name": "我的工具", "description": "一句话说明", "category": "office", "command": "python", "args": ["main.py"], "cwd": "./tools/foo" } ``` 3. 点击主界面顶部「⟳ 刷新」即可看到新模块。**不需要改平台代码。** ## MVP 范围 按"先核心、后扩展"思路,当前 MVP 仅覆盖: **已实现** - 模块加载(缺字段降级 + 警告) - 卡片网格(固定 4 列,emoji 占位) - 实时搜索 + 分类切换 - 子进程启动 / 状态轮询 / 优雅终止 - 关闭主窗口时三选项确认 **暂未实现(按需后续添加)** - 真实图标图片加载 - 响应式列数重排 - Win32 找窗置顶(`focus_if_running=true` 当前只 messagebox 提示) - 子进程 stdout/stderr 日志落盘 - 关于页 / 设置页 / 主题切换 - 多语言 - 开机自启 / 系统托盘 - 打包 EXE - 子进程 stdout/stderr 重定向到 `logs/{id}.log` ## 操作说明 | 触发 | 行为 | |---|---| | `Esc`(搜索框) | 清空搜索 | | 单击模块卡片 | 启动对应子进程 | | `⟳ 刷新` | 重新加载 `modules.json` | | `❓ 关于` | 弹出版本信息 | | 关闭主窗口 | 弹三选项对话框处理子进程 |