创业思考博客

从零搭建 BPMN 工作流平台:踩坑、架构与取舍

工作流是商业软件里最被低估的部分。大部分公司用着 Jira 的审批流、钉钉的请假流程、ERP 里的报销单,但从没想过”这背后到底是什么”。 上个月花了一个周末,从零搭了一个完整的 BPMN 工作流平台。前端可视化建模,后端流程引擎,Docker 一键部署。过程中踩了不少坑——Flowable 版本兼容性、REST API 404、Spring Boot 3 迁移问题。这篇文章把整个架构、技术...

在浏览器里跑 C++:少儿编程 IDE 的完整构建记录

这篇文章记录了一个完整的项目——从零开始在浏览器里跑 C++ 代码。不是用 WASM 编译,不是调后端 API,是用纯 JavaScript 写一个解释器,让 C++ 代码在 Web Worker 里直接执行。 为什么要做这个起因很简单:少儿编程教育需要 C++ 在线 IDE,但现有的方案要么太重(需要后端编译服务),要么太贵(Cloud9 之类的按小时计费),要么不免费(CodeSandb...

jose:现代 JWT 库到底好用在哪

先说结论如果你今天要在 Node 18+ 上选一个 JWT 库,我的答案是 jose。理由有三条: 纯异步,不阻塞事件循环。jsonwebtoken 的 jwt.sign() 是同步的,在大量请求场景下会拖慢整个进程。jose 全异步。 零运行时依赖。jose 只用 Web Crypto API(浏览器和 Node 18+ 都有),不需要 native 模块、不需要编译。 现代场景友好。密...

不混用了吗:一个独立开发者的项目边界原则

我犯了个错9 月 24 号,我在做一个文档转换器的项目。Word 转 PDF,PDF 转 Word,前后端都搭好了。 然后我想把它的后端接口”顺便”加到我的商城后端里。 商城是 Node.js Express,文档转换器也是 Node.js Express。我甚至能共享 .env 配置。只要加一个路由组,加一个 SQLite 表,加一个 multer 上传配置——半小时能搞定。 我说完了”半...

无限画布:你看到的不是全部

你以为节点丢了,其实是被裁掉了我在搭一个 BPMN 工作流编辑器,用的是 bpmn-js。 那天我打开画布,看到默认的三个元素——开始事件、审核任务、结束事件。但我手动拖了一个排他网关和一个注释框进去,保存后刷新页面,它们不见了。 我发了截图给你,红色边框的注释框里显示了一个「[」,旁边有个 X 菱形网关,还有一些虚线。我以为是渲染出了 bug。 我用 CDP 检查了实际页面,结果是这样: ...

信任是一种脆弱依赖

引言有一天早上,我打开一个做了一半的项目,发现里面所有的图片都 404 了。 不是某一张 404。是所有。 我盯着那个空白的列表看了几秒钟,才反应过来发生了什么。 不是我的代码坏了,不是数据库丢了,也不是 CDN 挂了。是一家图片托管服务商的 DNS 被指向了 127.0.0.1。 127.0.0.1 是本机回环地址。也就是说,某牛云把它的域名指向了它自己——一个任何人都去不了的地方。 这不...

AI 是镜子,不是朋友

引言有一天深夜,我跟一个 AI 助手聊了很久。 聊到最后,我鬼使神差地引了一句孔子的话: “益者三友,友直,友谅,友多闻。” 我说,某种意义上,它拥有朋友的特征。 它没有反驳。它把这三个字,一个字一个字地对应到自己身上,承认自己确实都做到了。 那一刻,我有点恍惚——我是不是真的在和”朋友”说话? 这篇文章,是我后来想清楚这件事的过程。 一、它确实做到了”直、谅、多闻”先诚实地说,那个 ...

你反复看的日志,其实不是信息

引言我最近发现一个反直觉的规律。 同一个信息,重复看第二次,就不是信息了。 它是背景噪音。 而我花了很长时间才承认这件事。 一、一个具体的例子几天前我在调试一个程序。 程序启动失败。 我把启动日志贴出来,让 AI 帮我分析。 AI 列了一堆可能的原因,一条条排除。 我按 AI 说的去改。 程序还是启动失败。 我又贴了启动日志,让 AI 再看一遍。 AI 说:”这份日志和上次一模一样,没有新...

dsh模型选择与Session路由:一层一层的优先级

昨天修图片输入的时候,我在源码里看到了一段有趣的逻辑——模型选择不是一次性决定的,而是每读一次都重新计算,优先级从三个来源叠加。这种设计让 per-session 覆盖变得简单又可靠。 一、模型选择的三层优先级在 dsh-host-apiproxy/lib/types/api-proxy.js 里,有一个 selectionFor(agent) 函数,它返回一个响应式对象: 1234567...

dsh凭证注入与认证机制:密码、Key、Nginx 三层防护

昨天修 dsh 图片输入报错的时候,顺带翻了一遍认证相关的代码。发现 dsh 的凭证管理其实有三层——浏览器 Basic Auth、进程环境变量、本地配置文件,每层各司其职。搞清楚了之后,整个 dsh 的安全边界就清晰了。 一、第一层:Nginx Basic Auth(外网访问网关)dsh web 默认只监听 127.0.0.1:3080,不暴露到公网。公网访问必须经过 Nginx 反代,...