全球7000种语言,AI能翻译的不到200种。而全球数百万家公司,几乎每家都在为同一种功能付费:提醒软件许可证什么时候到期。

两年前,我收到一封转发邮件。IT总监把年度报价单塞过来,某"软件资产管理"SaaS工具,每月数百美元。我点开功能清单:SQL表存日期、定时任务发通知、月度汇总邮件。就这些。

打开网易新闻 查看精彩图片

于是我写了LiMa(License Manager)。200行Python,PyQt5桌面应用,SQLite本地文件,零订阅费。这篇文章拆解四个技术模块——不是劝你抵制SaaS,而是证明这类需求,付费近乎懒惰。

模块一:两列数据库,动态计算剩余天数

表结构极简。只有两个字段:软件名称、过期日期。没有第三列。

剩余天数不存储,实时计算。存储会变的数据是自找麻烦——今天写的30天,明天就是29天,后天就是脏数据。代码用datetime做差值,QTimer每分钟刷新一次界面。最初我设了1秒刷新(新手通病,觉得"刷新越频繁越好"),后来改成60秒,CPU占用骤降。

结果:表格是活的。许可证临近过期自动变红,无需手动刷新。

模块二:原生多级通知,零依赖

SaaS厂商管这叫"智能告警"。我的实现:if-else链。

30天、14天、7天、3天、1天、已过期——六个阈值,六档提醒。用plyer库调系统原生通知,Windows弹Windows的,macOS弹macOS的。没有第三方推送服务,没有API密钥,没有月度配额。

模块三:SMTP邮件,keyring存密码

月度汇总邮件走标准SMTP。密码不硬编码,用系统钥匙串(keyring)存取。第一次配置时弹窗输入,之后自动读取。换机器?重新输一次而已。

模块四:单机部署,即拷即用

整个应用打包后一个文件夹。拷到管软件资产那台电脑,双击运行。数据库是单个.sqlite文件,定时备份到共享盘就行。没有Docker,没有K8s,没有"联系我们获取企业版报价"。

技术债坦白

今天重写的话,我会换PyQt6、SQLAlchemy、keyring集成更深。但核心设计不变:两列表格、动态计算、本地优先。这些选择两年后依然成立。

边界在哪

LiMa不联网,所以不支持多人实时协作。如果你的软件资产分散在20个部门、需要权限分级、要对接采购系统审批流——SaaS可能是对的。但如果需求只是"别让我忘了续费",200行代码足够。

很多SaaS的本质,是把通用技术包装成专有方案,再按人头收税。识别这种包装,是工程师的省钱技能。下次看到报价单时,先问:这个功能,我真的买不起一个下午的开发时间吗?