夜雨聆风学习资料网

ARTICLE · 1337542

文档不出内网,还能自己做查重:这套开源企业知识库有点东西

文档不出内网,还能自己做查重:这套开源企业知识库有点东西

前段时间帮一个设计院整理资料库。他们的诉求很具体:十几年的标准、图集、工法、评审报告,散在每个人的电脑和几个网盘里,要能搜、能看、能按部门分权限,最好还能对外发出去的稿子先查一遍重。

市面上的方案要么是网盘,权限粗得只有一个“能看不看”;要么是知识管理 SaaS,文档传上去就出了内网,评审报告这种东西根本不敢传。

后来翻到 Gitee 上这个 Castle 知识库,195 个 Star、85 个 Fork,MIT 协议,24 次提交。Java 占 94%,Spring Boot 2.7 打底,MySQL、Redis、Elasticsearch 一套标准配置,Docker 六个容器就能整起来。我把它跑了一遍,也把它仓库里的功能截图逐张看过了。

值得单独说一句的是:它自带一套文档查重,能出带“总文字复制比”“相似文献列表”“原文与来源对照”的报告单。这个功能放在一个开源知识库里,确实少见。

一、打开先看门面

首页是典型的门户结构:顶部导航按业务切(主题知识库、视频课程库、数据库、方案生成、方案学习、100 问、知识问答),中间一条大搜索框,下面挂一排热词,右侧是两个入口——“查重”和“我要发布”。再往下是知识分类和知识标签两栏,点一下就进对应的集合。

图1 首页:搜索入口、热词、查重与发布入口

这套导航其实透露了它的定位:不是一个“文件柜”,而是把文档、课程、方案、问答几类内容放在同一个知识体系里。分类管“这是什么业务”,标签管“涉及哪些主题”,两套维度可以同时用。

列表页的筛选做得比大多数文档系统细:标题、作者、所属分类(可多选)、所属领域、类型、是否发表、发布时间(近一个月到近一年,也能选起止日期),右边还挂着推荐知识和最近浏览。

图2 知识问答列表:多条件筛选、发布状态与浏览量

注意列表里的“浏览量”和“状态”两列——这套系统是带运营视角的,不只是存文件,还关心哪份材料被看了多少次、有没有发布出去。

二、功能拆开看,重点在后三样

(一)预览:能打开是一回事,能看清是另一回事

支持 txt、doc、docx、ppt、pptx、pdf 这些常见格式的在线预览,左侧缩略图导航,右侧正文,带页码、缩放、自动缩放、旋转和目录面板。它的预览不是把文件丢给浏览器硬解,而是走一个独立的 docpreview 服务(默认 8302 端口)转成图片流,所以老式的 .doc 和扫描件也能看。

图3 知识详情:分页缩略图、正文渲染与水印

这张截图里最该看的是那层淡淡的斜向水印,内容是用户名加日期。系统在预览和下载两个环节都打水印,这解决了内部资料最常见的一个漏洞:截图外流之后查不到是谁。

下载环节还能顺手转成 PDF。很多单位对外发文件只要 PDF,这个选项省掉了“先下 Word 再另存”的一步。

(二)查重:这套系统最不像“网盘”的地方

查重有两种模式。一种是单文件查重,你自己传两份文件互相比;另一种是本地库查重,传一份文件,跟整个知识库里的所有文件比。第二种才是真有用——新人交上来的报告是不是从库里某份旧稿改的,一跑就知道。

图4 查重报告单:总文字复制比、章节分布与相似来源对照

生成的报告单照着学术查重的格式做的:报告编号、检测时间、总文字复制比 3.3%、重复字符数 106、单篇最大重复字符数 47、总字符数 3195;往下是按章节铺开的重复比例条,再往下是相似文献列表(文件名、年份、相似比),最后是“原文内容 / 相似内容来源”左右对照,重复的地方直接指出来源文件。

技术上它用的是 HanLP 加 IKAnalyzer 做中文分词,再算文本相似度,报告渲染走 poi-tl 模板,版本差异用 java-diff-utils 算。都是能在内网自洽跑完的东西,不依赖任何外部接口,这一点对保密单位很关键。

它自己标了两条边界,我原样转述:查重暂不支持文件内的表格内容,也暂不支持图片文件。所以合同里的表格、扫描的手写稿,这套查重帮不上忙。

(三)历史版本:一种看全文,一种看差异

知识条目支持多版本留存。点“版本”会弹出一个窗口,左边列历史版本(V1.0、V2.0、V3.0 带时间),右上角切“全文”或“与上个版本的差异”。

图5 历史版本:版本列表与全文查看

差异模式是我更看重的那个。选两份文件做对比,界面会左右并排,改动处绿色高亮,行号对齐,一眼能看出“这版到底动了哪几句”。制度文件、标准汇编这类东西,改一个字都可能影响执行口径,靠人眼对两版 Word 是不现实的。

图6 版本对比:左右并排的差异高亮

(四)自定义知识模型:不同业务用不同字段

这一块容易被略过,但它决定了这套系统能不能“长”成业务系统。后台可以新建属性模板,给某一类知识定义自己的字段:字段标题、表单类型(单行文本、多行文本、日期、附件、下拉框)、是否必填、是否启用、是否支持搜索,逐条开关。

图7 属性模板:为不同知识类型自定义字段与搜索属性

举个例子:制度类要“制度编号、制度名称、制度内容、制定日期、附件”;工法类要“工法编号、适用工序、工艺要点、验收标准”。字段不同,检索入口就不同,这比强行把所有资料塞进同一个表单要合理得多。

(五)权限:五档,不是“能不能看”这么粗

权限是按知识分类配的,成员或组织架构挂到分类上,然后选一档:仅可查看、可下载、可新增、可编辑、可管理。每一档具体能干什么,界面上直接列了清单——可查看只能看;可下载多一个下载;可新增多一个批量添加;可编辑再加新增和改;可管理连删除、删评论都能做。

图8 知识分类权限:五档权限与成员授权

这个设计比“一个角色管全部”要细。实际场景里经常是:标准规范全公司可看,但只有标准化办公室能改;评审报告只有项目组能下载,其他部门看都看不到。分类级授权配合组织架构,正好对上这种需求。

(六)检索、词云、推荐与视频库

全文检索支持关键词高亮,ES 打底,字段级搜索可以按标题、作者、分类、时间组合。详情页右边有一朵词云,是用这篇文档的分词结果画的,点词能继续搜;下面挂推荐知识和最近浏览,走的是浏览行为数据。

视频也是一等公民:视频课程库、视频分类单独管理,在线播放,跟文档共用一套权限。做内部培训的单位不用再另找一个视频平台。

(七)后台与个人中心:运营要看的东西都在这儿

后台左侧是模块菜单(主题知识库、知识分类、知识标签、首页配图、通用模块),二级菜单按业务分(数据库、方案生成、方案学习、100 问、知识问答、视频课程库),顶部还挂着组织权限、应用中心、模板引擎。分类、标签、权重、封面图这些都能在这里改,不用动代码。

图9 后台管理:知识分类维护与多业务模块

个人中心是给普通用户看的:累计上传 22 份、累计下载、评论次数、订阅数四个数字卡片,下面两张统计图(按业务模块的文章数、按月份的趋势),再下面是最近浏览和最近下载。左侧还有我的订阅、我的知识、我的收藏、记录、查重记录。

图10 个人中心:上传统计、月度趋势与浏览下载记录

三、它是怎么搭起来的

这套系统的架构不复杂,但该有的组件一个不少。docker-compose 里一共六个服务,互相用内网网络通信,只有 nginx 对外暴露端口。

表1 Docker 编排中的六个服务

服务

作用

说明

mysql

主数据库

MySQL 8.0.39,库名 knowledge_base_v2,首次启动自动导入初始化脚本

elasticsearch

全文检索

7.17.28 单节点模式,带中文分词插件,堆内存默认 512M

redis

缓存与会话

带密码启动,应用连 1 号库

knowledgebase

后端主应用

Spring Boot 2.7,Java 8 编译,端口 8200,上下文 /zsk

docpreview

文档转图预览

8302 端口,负责把 doc、ppt、pdf 渲染成页面图片

nginx

前端与反向代理

对外只开 23000,映射到容器内 80

后端的技术栈是 Spring Boot 2.7 + MyBatis-Plus + Druid + MySQL,中文分词用 HanLP 和 ikanalyzer,文档转换用 wkhtmltopdf 加 docpreview 服务,模板渲染用 Beetl 和 poi-tl,差异对比用 java-diff-utils。前端是独立的 Vue 工程,用户端在另一个仓库 knowledgebase-member 里。

这套组合不算新,但都是国内企业环境里跑得最稳的那一批。好处是运维熟悉,坏处是组件多,内存开销不小——ES 加 MySQL 加应用,8G 内存是起步线。

四、什么样的单位该考虑它

设计院、施工单位的标准与工法库。截图里那些 T/CEC 102.x 标准、工法实例、方案模板,正是这类单位的日常。按专业分类建库,按部门授下载权,历史版本留着改版痕迹,招标前查一遍重,四个需求一次覆盖。

制造业的工艺与设备文档中心。SOP、作业指导书、设备手册、点检表,版本多、改动频繁。自定义知识模型可以给不同文件类型配不同字段,历史版本加差异对比能追到“哪一版改了参数”。

咨询、律所、会计所的知识资产库。这类机构最怕两件事:报告被抄、资料外流。前者用本地库查重,后者用预览和下载水印,权限细到分类。而且整套跑在内网,客户资料不出门。

高校、职院的课程与成果库。视频课程库放录课,文档库放讲义和论文,学生提交的作业可以直接跑查重,比外挂一个查重网站便宜得多,也不受次数限制。

医院、药企的规范与培训资料。制度、SOP、培训课件、考核记录,按科室授权。这类场景对数据落地位置极其敏感,能私有化部署本身就是硬指标。

内部问答与经验沉淀。导航里有“100 问”和“知识问答”两个模块,本质是把老员工的经验按问题组织起来,新人按问题找答案,而不是按文件夹找文件。

要给客户交付一套“知识管理系统”的集成商。MIT 协议,代码完整,六个容器一键起,改个 logo 和首页配图就能交付。比从零搭一套省几个月。

五、Windows 下怎么部署

两条路线:想最快看到东西走 Docker,想改代码或者机器不支持虚拟化就走源码。

表2 两条部署路线

路线

适合谁

前置条件

耗时

Docker Desktop

只想用、要交付、机器配置够

Windows 10/11 64 位、WSL2、8G 以上内存

30 分钟左右(含等库导入)

源码本地跑

要改配置、改代码、ARM 机器

JDK 8、Maven、MySQL 8、Redis、Elasticsearch 7.17

1.5 到 3 小时

(一)路线 A:Docker Desktop,六个容器一起起

先把 Docker Desktop 装好,安装时勾上 WSL 2 后端,装完重启一次。等右下角鲸鱼图标稳定,在 PowerShell 里执行 docker --version 和 docker compose version,两个都能出版本号再往下走。

项目根目录里有个 docker 文件夹,编排文件就在里面,官方镜像放在阿里云容器镜像服务上,国内拉取速度还行。

git clone https://gitee.com/hcwdc/knowledgebase.git

cd knowledgebase\docker

docker compose up -d

起来之后不要急着访问。MySQL 的初始化脚本体积很大,第一次启动要跑五到十分钟,这期间前端会返回 502,属于正常现象。可以盯一下 MySQL 容器的日志,等它不再刷 INSERT 再打开浏览器。

docker compose ps

docker compose logs -f mysql

确认六个容器都是 Up 之后,访问 http://localhost:23000,用默认账号 admin、密码 admin 登录。

如果页面一直是 502,先重启一次再等两分钟;还是不行就看 mysql 和 knowledgebase 的日志,九成是数据库还没初始化完,或者 ES 没起导致应用启动失败。

docker compose restart

所有数据落在 docker\data 下面,mysql、elasticsearch、redis、nginx 各一个子目录。备份就是停掉容器、拷这个目录,迁移到另一台机器也一样,这点比装在系统里的服务省心。

(二)路线 B:源码部署,环境得自己备齐

这条路要准备的东西多一点,但可控性最好。JDK 必须是 8,Spring Boot 2.7 虽然能跑更高版本,但这个项目的编译目标和依赖都是按 1.8 定的,用 17 大概率在启动阶段就报模块错误。Maven 不用单独装,仓库自带 mvnw.cmd。

第一步,建库导数据。MySQL 8 装好后建一个 utf8mb4 的库,名字建议就用 knowledge_base_v2,然后用 Navicat 或命令行把 doc\db\gitee_knowledge_base.sql 导进去。这个脚本不小,导入过程要耐心等。

CREATE DATABASE knowledge_base_v2 DEFAULT CHARACTER SET utf8mb4;

mysql -uroot -p knowledge_base_v2 < doc\db\gitee_knowledge_base.sql

第二步,改配置。打开 castle-fortress-admin\src\main\resources\application-dev.yml,把数据库、Redis、Elasticsearch 的地址换成本机的,再把几个路径改成 Windows 绝对路径。原文件里留的是作者自己机器上的 D 盘路径,照抄会启动失败。

spring.datasource.url: jdbc:mysql://127.0.0.1:3306/knowledge_base_v2

?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai

spring.redis.host: 127.0.0.1 spring.redis.port: 6379

spring.elasticsearch.rest.uris: 127.0.0.1:9200

castle.cms.templatePath: D:\CastleKB\cmsTemplates\

castle.addons.path: D:\CastleKB\addons\

pdf.html.toll: D:\wkhtmltopdf\bin\wkhtmltopdf.exe

第三步,编译打包。在仓库根目录执行 mvnw.cmd,第一次会把依赖全下一遍,国内网络建议在 Maven 的 settings.xml 里配好阿里云镜像,否则要等很久。

mvnw.cmd clean package -DskipTests

第四步,启动。产物在 castle-fortress-admin\target 下,用 java -jar 起,指定 dev 配置,服务监听 8081。启动日志里如果出现词典路径相关的报错,先看第六条常见问题。

java -jar castle-fortress-admin\target\castle-fortress-admin.jar --spring.profiles.active=dev

第五步,前端。后台管理界面随 admin 模块一起打包,起来就能访问 http://localhost:8081;面向读者的用户端在另一个仓库 knowledgebase-member,需要装 Node 后单独构建,把接口地址指到 8081。想省这一步,就直接走 Docker 路线,nginx 那一层已经把前端带上了。

要跑生产配置就换 --spring.profiles.active=prod,端口变 8200,上下文路径变 /zsk,访问地址相应变成 http://localhost:8200/zsk。正式对外建议前面再挂一层 Nginx,开 HTTPS。

(三)几个必须对的配置项

下面这几项在 application-dev.yml 和 docker-compose 里都能找到,配错一项就起不来或者用不了。

表3 部署时必须核对的配置项

配置项

作用

常见值

server.port

应用端口

dev 为 8081,prod 为 8200

context-path

访问前缀

prod 下为 /zsk

datasource.url

数据库连接

必须带 serverTimezone=Asia/Shanghai 与 characterEncoding=UTF-8

redis.database

Redis 库号

默认 1,不是 0,容易连错

elasticsearch.rest.uris

检索服务地址

单机 127.0.0.1:9200

lexicon 路径

HanLP 中文词典目录

容器里是 /app/lexicon,本机要指到实际目录

pdf.url

docpreview 预览服务

默认 8302

pdf.html.toll

wkhtmltopdf 可执行文件

Windows 下填 exe 的绝对路径

(四)Windows 上最容易卡住的六件事

这些是 issue 区和实际部署里反复出现的,按顺序排查能省不少时间。

表4 Windows 部署常见问题

现象

原因

处理

启动报 lexicon.path 相关错误

词典目录没配或文件缺失

确认 lexicon 目录存在且路径可读;容器里固定 /app/lexicon,本机改成绝对路径

库里时间比实际晚 8 小时

连接串漏了时区参数

url 里补 serverTimezone=Asia/Shanghai

中文乱码、搜索不出中文

库或表不是 utf8mb4

建库时指定 utf8mb4,导入脚本前确认字符集

上传成功但搜不到

ES 没起或索引没建

先访问 9200 确认节点可用,再重启应用让它重建索引

下载 PDF 失败或空白

wkhtmltopdf 未安装、路径错

装上后配绝对路径,路径含空格要用引号包住

Docker 起来一直 502

MySQL 初始化脚本还没跑完

等 5 到 10 分钟,docker compose logs -f mysql 看进度,必要时 restart

另外还有两条环境层面的:官方镜像只提供 x86 版本,ARM 架构的机器(比如部分轻薄本)跑不起来,只能自己拉代码改镜像;镜像从阿里云仓库拉,如果公司网络有限制,先在 Docker Desktop 里配好镜像加速地址。

六、几句实话

更新节奏慢。整个仓库 24 次提交,最后一次在八个月前,issue 里还挂着一个“启动报 lexicon.path 错误”的未结项。功能是齐的,但别指望提个需求两周就合进去。用之前先自己完整跑一遍,别直接上生产。

查重的边界要提前说清。不支持表格内容、不支持图片文件查重,这两条作者写在 README 里。合同、扫描件、带大量表格的技术文件,查重结果会失真,别拿它当知网用。

组件多,机器别太小气。ES、MySQL、应用、预览服务四个吃内存的,8G 是底线,16G 才舒服。挂在 4G 的小主机上,检索会慢到影响体验。

部署门槛不算低。“一键起”指的是六个容器一起编排,前提是你机器上 Docker 已经能用。完全没碰过命令行的同学,会在 WSL2、镜像拉取、502 这几步上耗掉大半天。

在线演示环境目前打不开。README 里给的演示地址访问返回 502,估计是服务器停了。好在仓库 doc/img 里的十张功能截图是完整的,看效果不受影响;想真机体验,还是自己本地起一套更靠谱。

说这些不是劝退。功能覆盖面、查重这个差异点、以及完整的商用级权限模型,放在开源项目里确实不多见。只是它更适合“有人能折腾环境”的团队,而不是点开即用的个人工具。

七、项目地址

后端主仓库在 Gitee,MIT 协议,商用没问题。文档站和语雀手册都比较完整,部署前建议先翻一遍概述那页。

Gitee 主仓库:

https://gitee.com/hcwdc/knowledgebase

用户端仓库:

https://gitee.com/hcwdc/knowledgebase-member

在线文档:https://doc.icuapi.com/knowledge/gaishu

操作手册:https://www.yuque.com/hcwdc/castleknowledge

开源项目,不花一分钱,把“飞书多维表格”搬进自己的服务器

这款开源合同公文管理系统让Word在线编辑、PDF盖章、公文套红一站搞定

开箱即用|唛盟 mdp‑lcode,一套 MIT 完全开源企业级低代码平台(文末附源码地址)

GeekAI:把 ChatGPT、MidJourney、Suno 和即梦塞进一个站点,还能自己部署

写得更少,跑得更好|开源低代码框架 Diboot 实战介绍(文末附源码地址)
开源课堂工具|OurClass学生课堂表现智能积分评价系统
MIT协议免费商用|L-ONE企业一体化管理平台,一套搞定OA/HRM/CRM/ERP/MES
【开源推荐】EduLab|一句话生成 3D 交互式理科虚拟实验课件,老师备课神器
国产开源|AI驱动的智能业务平台REBUILD:零代码搭建企业管理系统
开源神器|SmartCall,大模型驱动的新一代 AI 客服呼叫中心
一款国产免费开源AI+ERP|赤龙ERP完整实测,Windows本地部署教程
免费开源企业级低代码|小菜快开,SpringBoot+Vue3,快速搭建OA、CRM、人事管理系统
零成本搭建能源管理平台|MyEMS开源能源管理系统完整实操指南
开箱即用企业级AI智能体平台|SparkX,搞定RAG、知识图谱、可视化编排
开源智慧教学平台 SmartKBS:全学段全学科 AI 教学系统,支持私有化部署
开源免费MES|苦糖果MES,离散中小企业低成本数字化利器
开源BI可视化FusionView|拖拽即可快速搭建炫酷数据大屏,Windows完整部署指南
开源推荐 | J-IM:一款高性能的Java即时通讯系统,附Windows部署教程,文末附源码地址
开源报工系统|基于RuoYi二次开发,支持企业微信,工时填报+人力成本统计一站式解决方案
开源推荐 | kmatrix-service:Java生态的RAG开源项目,轻松构建企业级AI知识库
JeecgBoot 生态新星 QiaoQiaoYun:零代码搭建你的企业级应用,Windows 部署只需 5 分钟
零成本自建AI聚合平台!ChatMASTER全功能详解+Windows超详细部署教程
告别Excel混乱!这款SpringBoot3+Vue3开源资产管理系统,让每一件资产都有迹可循
开源宝藏|若依Antdv版,集成Flowable+MyBatis‑Plus,开箱即用快速开发平台
全功能免费开源!一站式企业OA、流程、资产管理平台
你的私人 AI 超级智能体!OpenHuman 开源项目全解析
开源免费!中小商贸专用进销存系统(适配小微企业)

回首页,搜索你想要的文档

在首页搜索框输入关键词,快速定位资料

文库首页搜索指引 立即搜索

相关学习资料