边走边聊 Python 3.8:Chapter 12:知识库管理系统(大项目)

张开发
2026/4/20 9:27:35 15 分钟阅读

分享文章

边走边聊 Python 3.8:Chapter 12:知识库管理系统(大项目)
Chapter 12:知识库管理系统(大项目)这是你在本阶段的第一个完整项目:一个可增删改查、可自动归档、可生成统计的个人知识库系统。本章将带你从项目结构、模块拆分、界面设计到数据处理,完整走一遍“从需求到成品”的流程。完成它,你将真正拥有构建系统的能力。“项目是最好的老师,它会逼你把知识变成能力。”大家好!经过前 11 篇从文件操作 → Tkinter → pandas → 定时推送 → Server酱 的完整学习,我们终于来到完结篇。今天我们把所有知识一次性整合,做一个真正能用的本地小软件:《MyKB —— 个人知识库管理系统》最终成果:漂亮的 Tkinter 界面(添加/搜索/浏览/统计)笔记自动保存为 JSON + 文件夹归档pandas 自动生成标签统计、词频报表本地全文搜索(支持标题、内容、标签)一键“发送今日笔记总结”(邮件 + 微信)打包成单个 Win7 可执行 exe(双击即用,无需 Python)全部代码兼容 Python 3.8 + Win7,零外部数据库,纯本地运行。1. 项目文件夹结构(推荐这样组织,方便后续重构)MyKB/ ├── main.py # 主程序入口 ├── config.py # 配置(路径、SendKey 等) ├── note_manager.py # 笔记增删改查 + 自动归档 ├── gui.py # Tkinter 界面 ├── utils.py # 公共函数(搜索、统计、推送) ├── notes/ # 存放所有笔记(程序自动创建) │ ├── archive/ # 自动归档文件夹(30天自动移动) │ └── ...json ├── data/ # pandas 统计报表输出 ├── icon.ico # 程序图标(可选) ├── requirements.txt └── README.mdWin7 操作:在 D 盘新建文件夹D:\MyKB,把下面代码保存进去。2. 核心代码(分模块,清晰易懂)1. config.py(配置)# -*- coding: utf-8 -*-importos BASE_DIR=os.path.dirname(os.path.abspath(__file__))NOTES_DIR=os.path.join(BASE_DIR,"notes")ARCHIVE_DIR=os.path.join(NOTES_DIR,"archive")DATA_DIR=os.path.join(BASE_DIR,"data")os.makedirs(NOTES_DIR,exist_ok=True)os.makedirs(ARCHIVE_DIR,exist_ok=True)os.makedirs(DATA_DIR,exist_ok=True)# 推送配置(复用第11篇)SCKEY="你的Server酱SendKey"MAIL_USER="你的QQ@qq.com"MAIL_PASS="你的授权码"2. note_manager.py(笔记管理 + 自动归档)# -*- coding: utf-8 -*-importjsonimportosfromdatetimeimportdatetime,timedeltaimportshutilfromconfigimportNOTES_DIR,ARCHIVE_DIRclassNoteManager:def__init__(self):self.notes_file=os.path.join(NOTES_DIR,"notes.json")# 主索引self.load_notes()defload_notes(self):ifos.path.exists(self.notes_file):withopen(self.notes_file,"r",encoding="utf-8")asf:self.notes=json.load(f)else:self.notes=[]defsave_notes(self):withopen(self.notes_file,"w",encoding="utf-8")asf:json.dump(self.notes,f,ensure_ascii=False,indent=2)defadd_note(self,title,content,tags):note={"id":len(self.notes)+1,"title":title,"content":content,"tags":tags.split(",")iftagselse[],"date":datetime.now().strftime("%Y-%m-%d %H:%M:%S")}self.notes.append(note)self.save_notes()returnnote["id"]defsearch(self,keyword):keyword=keyword.lower()return[nforninself.notesifkeywordinn["title"].lower()orkeywordinn["content"].lower()orany(keywordint.lower()fortinn["tags"])]defauto_archive

更多文章