CatOi · 企业级系统部署与业务适配 × AI 工程化落地
🍻 感谢你的光临~ 🎉
我是 CatOi,后端开发 × AI 工程化,坐标深圳。白天在政务项目现场解决问题,晚上给自己的奇思妙想写代码——这个小站记录的,是工作与热爱之间的那部分生活。
一年微服务开发、三年政务驻点:既能在遗留系统上独立排错修复,也主导过团队级 AI 开发流水线(100+ 业务场景 Skill、MCP 设计稿高还原路由),并把 8 个跨技术栈的个人产品从需求做到发布。擅长把复杂业务流程做成能上线、能维护的产品。
8 个跨技术栈、从需求做到发布的个人产品。
MeowPlan · 置顶 / 钉桌面待办工具
C++17 Qt5 + QWebView Vite/TS SQLiteCpp CMake
可置顶悬浮或嵌入桌面壁纸层(WorkerW)的待办工具,含 JS-Bridge 桥接、全局热键、单实例等 Windows 底层能力。
TallyBook / TallyBook PC · Serverless 记账及 Windows 本地化
Vue3 + TS Cloudflare Workers + D1 + JWT Electron + Hono + sql.js
Serverless 全栈记账应用及其 Windows 本地化版本,通过适配层将 D1 无缝替换为 SQLite WASM,前端代码零改动复用。
LunchPeek · 食堂菜单 OCR 工具
Python RapidOCR Cloudflare Pages
基于坐标聚类解析表格结构,一键生成静态页面并部署上线——AI 能力落地的实用工具。
MeowMirror · 电子衣柜 / 梳妆台 / 健身管理
Electron Vue3 Pinia
8 类彩妆 + 10 类护肤管理、Routine 周历、打卡热力图、保质期提醒、多用户隔离、离线运行。
橘猫碎碎念 · 本地桌面「微博」
Electron SQLite Markdown
Markdown 渲染 + 14 语言代码高亮、媒体九宫格、组合筛选 / 全文搜索、主题系统、密码保护。
AppLauncher · 应用启动器
C# + WPF (.NET 8) Material Design SQLite MVVM
UAC 智能提权、批量启动工作流、使用统计。
SteamLogin · Steam 多账号管理器
C# + WPF MVVM
进程自动化(关 Steam → 重登 / 填入)、托盘常驻、单实例、数据导入导出。
Echo 论坛 · 校内交流论坛 · 个人学习项目
SpringBoot MySQL Redis Kafka Elasticsearch Spring Security Quartz Caffeine
注册登录、发帖、点赞、系统通知、热度排序与搜索;Spring Security 多角色 URL 级权限、Quartz 定时计算热度、Redis + Caffeine 两级缓存、Kafka 系统通知、字典树 + 双指针敏感词过滤、Elasticsearch 搜索高亮。
为什么写博客? 最初是想记录成长:大学时在博客平台写算法题解、记读书笔记。现在它更像我的「第二大脑」——工作里踩的坑、折腾工具的收获、生活的碎碎念都放在这里。也慢慢相信「再小的个体,也有自己的品牌」,开始认真打磨这个微小品牌。
为什么做这么多小工具? 坦白说是因为懒(笑)。工作里重复的操作就想自动化,生活里缺的工具就自己造——AppLauncher、MeowPlan、SteamLogin 都是这么来的。写着写着发现跨了好几个技术栈:Java、Vue、Electron、Qt、WPF……每个新栈都是一次”用真实需求学新技术”的机会,比看教程记得牢。
| 主 页 | https://catoi.cn |
|---|---|
| Liber TV | https://tv.catoi.cn |
| Perler Beads | https://bean.catoi.cn |
| 监测站点 | https://site.catoi.cn |
| 橘子 图床 | https://imgs.catoi.cn |
| 网络分析跟踪器 | https://analytics.catoi.cn |
| 自建docker镜像 | https://docker.catoi.cn |
const Deng = class {
constructor() {
const Hello = [123, 34, 110, 97, 109, 101, 34, 58, 34, 99, 97, 116, 111, 105, 34, 44, 34, 101, 109, 97, 105, 108, 34, 58, 34];
const EveryOne = [50, 55, 55, 49, 54, 48, 52, 54, 49, 64, 113, 113, 46, 99, 111, 109, 34, 44, 34, 81, 81, 34, 58];
const WelcomeTo = [50, 55, 55, 49, 54, 48, 52, 54, 49, 44, 34, 119, 101, 99, 104, 97, 116, 34, 58, 34, 100, 105, 49, 49, 49, 51, 51, 51, 50, 50, 50, 34];
const MineBlog = [44, 34, 98, 105, 114, 116, 104, 34, 58, 50, 48, 48, 50, 44, 34, 115, 101, 120, 34, 58, 34, 30007, 34, 44, 34, 97, 103, 101, 34, 58, 50, 51, 125];
const AboutMe = JSON.parse(String.fromCharCode.apply(null, [...Hello, ...EveryOne, ...WelcomeTo, ...MineBlog]));
AboutMe.age = new Date().getFullYear() - AboutMe.birth;
console.log(AboutMe);
}
};
new Deng();