☰
前后端分离笔记分享系统:SpringBoot+Vue+MySQL源码解析与部署
2026/10/16 4:58:49 网站建设 项目流程

先说点实在的。一个笔记记录分享网站,网上能找到的源码很多,但大部分不是缺胳膊少腿就是环境对不上,真正能拉下来、改改配置、本地跑起来看到登录页面的,其实不多。这篇博文讲的是一套基于SpringBoot后端、Vue前端、MySQL数据库的笔记记录分享网站信息管理系统源码,功能上是完整的,数据库脚本、前后端联调配置都处理过,不是那种半成品Demo。适合正在做毕设、想快速搭一个前后端分离项目练手,或者公司内部想搞个轻量级知识库的人参考。

我拿到这套源码的第一反应是把整个链路过一遍:表结构、接口、前端路由、代理配置、启动顺序。很多东西在文档里看不出来,得实际跑一遍才知道坑在哪。这篇就按我实际的拆解顺序来写,从需求边界到部署运行,把关键步骤和踩过的坑一起交代清楚。

1. 笔记分享系统的需求边界:先弄清楚这东西到底要做什么

很多人在拿到一个项目源码后第一件事就是急着启动,结果启动完发现功能跟自己想的不一样,又回头改需求。我建议先花20分钟把这个系统的功能边界吃透,后面改起来才顺手。

这套笔记分享系统本质上解决两个问题:一是笔记的私有管理,二是笔记的公开分享。围绕这两个核心,功能模块分得很清晰。

用户侧的功能有这些:

  • 账号注册与登录,退出登录
  • 个人中心:查看自己发布的全部笔记、编辑个人信息
  • 笔记管理:新增笔记、编辑已有笔记、删除笔记、设置笔记为公开或私密
  • 笔记浏览:首页按时间线展示公开笔记、根据分类筛选、按关键字搜索
  • 互动功能:对公开笔记点赞、发表评论

后台管理侧的功能:

  • 用户管理:查看注册用户列表、启用或禁用账号
  • 笔记管理:查看全站笔记、删除违规笔记
  • 评论管理:删除不当评论

这个功能设计没有什么炫技的地方,就是一个典型的业务系统该有的样子。角色就两个,普通用户和管理员,权限也是通过简单的角色字段控制的,没有扯复杂的RBAC权限模型。对于毕设或者内部知识库来说,这个复杂度刚刚好——功能完整,又不至于被权限设计拖垮进度。

值得注意的一个点:分享功能是通过笔记的status字段实现的,不是单独搞一张分享表。笔记有公开、私密、草稿三种状态,状态是公开的才会出现在首页列表里。这种设计的改动成本最低,查询逻辑也直观。

系统采用的前后端分离架构,SpringBoot后端负责提供接口,Vue前端负责页面渲染和数据交互,MySQL负责数据持久化。前端通过Axios调用后端接口,用JWT做身份认证。这种架构的好处是前后端可以独立开发、独立部署,也是当前比较主流的企业级项目组织方式。

2. 数据库设计与后端分层:这套代码的核心结构拆解

这套系统的数据库设计算得上规整。核心是用户表、分类表、笔记表和评论表,外加一个点赞记录表。我整理了一下主要表的用途和关键字段,方便查数的时候对照。

用户表(sys_user)的关键字段:id(主键)、username(用户名,唯一索引)、password(BCrypt加密后的密码)、nickname(昵称)、avatar(头像路径)、role(角色:admin_user / normal_user)、status(账号状态:启用/禁用)、create_time(创建时间)。

笔记表(t_note)的关键字段:id、user_id(外键关联用户)、category_id(关联分类)、title(标题)、content(正文内容,我这里设置的是TEXT类型,支持长文本)、status(笔记状态:0草稿、1公开、2私密)、like_count(点赞数冗余字段)、view_count(浏览量冗余字段)、create_time、update_time。

点赞记录表(t_note_like)的关键字段:id、note_id、user_id、create_time。这张表加了唯一索引(note_id + user_id),保证一个用户对同一篇笔记只能点赞一次,这是防止重复点赞的关键手段。

评论表(t_comment)的关键字段:id、note_id、user_id、content(评论内容)、create_time。

值得留意的是点赞数和浏览数这两个冗余字段。实时统计每个笔记的点赞数和浏览数,每次查询都去做count聚合,数据量小还好说,数据量大了一定会拖慢接口响应。用冗余字段的代价是每次点赞、浏览时要多一次更新操作。对于笔记分享这种读多写少的场景,这个取舍是高性价比的。

后端代码的分层也比较主流,controller层、service层、mapper层、entity层,每层的职责很清晰。Controller层负责接收前端请求和参数校验,不写业务逻辑;Service层处理具体的业务流程;Mapper层用MyBatis-Plus的BaseMapper接口,继承了内置的增删改查方法,大部分简单查询不需要手写SQL。像分页查询这类使用频率比较高的操作,直接用MyBatis-Plus的Page对象就能搞定。

技术栈里还必须重点说下安全认证这一块。这套系统用的是JWT(JSON Web Token)做身份验证,不是传统的Session。接口会对携带Token的请求进行拦截校验,校验通过后从Token中解析出用户ID和角色,再放行对应的接口。相比Session机制,JWT的好处是无状态,后端不需要保存会话信息,天然适合前后端分离部署的场景。管理员的权限控制也是靠Token里的角色字段实现的,后端接口里会在需要管理员权限的方法上做角色判断。

后端的核心依赖和版本我列一下,照着这个环境来基本不会出问题。SpringBoot用的2.7.x版本,持久层框架是MyBatis-Plus 3.5.x,数据库驱动MySQL Connector/J 8.x,安全框架用的Spring Security结合JWT工具库jjwt,参数校验用的validation包。这些依赖在pom.xml里都有,不需要额外手动导包,但版本号最好固定住,不要随便升,否则容易出现兼容性报错。

3. 核心接口的请求链路:从注册登录到发布一条笔记要经过哪几层

功能看着简单,但接口层面值得把链路捋一遍。我以最核心的几个操作来说,注册登录、发布笔记、首页列表这三个场景打通了,整个系统的请求路径也就理解了。

3.1 注册登录:密码不落明文,Token全局带

注册的逻辑:前端提交用户名和密码,后端收到请求后,先校验用户名是否已被占用。Service层的注册方法里,用户密码会用BCrypt算法做哈希加密,然后才落库。这里不用MD5的原因是BCrypt每次生成的哈希值都不同,而且自带盐,暴力破解的难度比MD5大得多。登录接口的逻辑是对比密码:调用BCrypt的matches方法,把用户输入的明文密码和数据库里的哈希值比对,匹配成功就生成JWT Token返回给前端。

前端拿到Token后,会存储在localStorage里,后续每个请求都会在header里带上Authorization字段。后端有一个拦截器会统一从header里读取Token、校验有效期、解析出用户信息,再set到请求上下文里。有个细节值得留意:拦截器只拦截需要鉴权的接口,像首页列表、笔记详情、评论列表这类公开查询接口,是不拦截的,游客也能看——这个设计符合笔记分享的本质。

3.2 发布笔记:状态字段设计很巧妙

发布笔记的请求流程相对直接。前端把标题、正文、分类ID、状态四个字段组装成JSON,POST到后端的笔记保存接口。后端收到请求后从Token解析用户ID,把笔记的user_id字段补上,然后落库。

这里有一个容易被忽略的问题:状态字段。有些同学写博客系统,发布功能就是直接把文章设置为公开,完全不考虑草稿和私密场景。这套系统把笔记状态设计成三种,并且在前端发布页面提供了单选按钮让用户选择。这个设计的实用价值很高,做个人知识库时很多笔记不需要公开,只想自己看,设置成私密就解决了。草稿状态则适配那些写一半的笔记,下次打开编辑器还能继续编辑。

编辑和删除的接口逻辑相信大家都能想明白。说一下编辑接口的一个细节:编辑只能改自己笔记,这是在后端做了归属校验的,如果不能校验,任何知道接口路径的人都能随便改别人的笔记。这也是前后端分离项目里容易踩的安全坑:前端隐藏按钮只是提高操作门槛,真正的权限控制必须落在后端。

3.3 首页笔记列表:分页、分类筛选、关键字搜索的组装

首页的笔记列表接口是整个系统里查询逻辑最复杂的一个。它的参数设计是:当前页码(page)、每页条数(size)、分类ID(categoryId,可选)、关键字(keyword,可选)。

后端对应的逻辑是:用MyBatis-Plus的LambdaQueryWrapper构建查询条件——status字段等于公开;categoryId不为空时加上分类条件;keyword不为空时,在标题和正文做模糊匹配。组装好条件后调用分页方法,返回的是包含总条数、当前页数据列表的分页对象。

关于浏览量的统计,实现是简单粗暴的:打开笔记详情页时,前端调用一次浏览+1的接口。这里不追求那种复杂的高并发计数方案,对项目场景来说完全够用。这类非关键数据的精确性,在中小型系统里可以适当放宽。

3.4 点赞与评论:唯一索引和数据一致性

点赞接口的实现逻辑是:先查询点赞记录表里是否已有当前用户和当前笔记的记录,如果没有就插入一条,并把笔记表的点赞数字段加1;如果已存在,就删除记录,点赞数减1。这个"反向操作"的设计很常见,相当于一个开关切换。

这里有个并发场景值得思考:如果两个请求同时进来,都发现没有点赞记录,然后同时插入,那就可能出现重复点赞。解决方法是给点赞记录表加上唯一索引,数据库层面拦截重复插入。这个方案最可靠,比代码里的双重检查锁实现简单得多。如果项目后期要应对高并发,可以考虑单独把点赞数剥离出去用Redis维护,但现阶段用唯一索引加冗余字段的方式,在数据一致性上已经是绰绰有余的。

评论接口就更直接了,把评论内容和笔记ID、用户ID塞进表里就完事。值得留意的是,评论列表是公开查询接口,不需要登录就能看,但发表评论的接口必须登录,这样设计符合实际业务逻辑。

4. Vue前端的组织方式:路由、状态管理与接口调用的联动逻辑

前端部分用的是Vue框架配合Element UI组件库,工程化做得比较完整。我从目录结构、路由守卫、Axios封装和页面交互四个维度来说明这套代码的组织方式。

4.1 页面结构与路由设计

src目录下的结构很清晰,按模块拆分了api、router、store、views、components几个目录。views目录下按业务划分页面,包括首页(笔记列表)、笔记详情、发布笔记、个人中心、登录注册、后台管理等。路由的配置需要注意的就是这几个关键路径:/对应首页,/note/detail/:id对应笔记详情页,/note/edit/:id对应编辑页,/user对应个人中心,/admin对应后台管理。

路由有一个全局前置守卫。判断逻辑很直接:如果访问的是需要登录的路由,而且没有登录态,就跳转到登录页。前端路由守卫的作用是提升用户体验,真正接口层面的权限校验还是在后端实现的,这个认识必须清楚。

4.2 Axios封装:统一处理请求地址、Token与错误状态

前端api目录下统一封装了请求模块,主要做了三件事。第一件是设置请求基础路径,所有接口请求都以/api为前缀,开发环境下由Vue的代理配置把这个前缀转发到后端的实际地址。第二件是从localStorage读取Token,统一在请求头带上Authorization字段。第三件是设置响应拦截器,当后端返回401状态码时,自动清除本地登录态并跳转到登录页。

这个封装的价值在于,后面的业务代码里不需要反复配置请求头,也不需要每个请求都手动处理异常跳转,所有通用的逻辑都收敛到一个文件里。实际开发中也正是这么实践的。

4.3 核心页面的交互逻辑

首页的加载逻辑是进入页面后,created生命周期里调用笔记列表接口,把返回的数组渲染成卡片列表。用户输入搜索关键词、选择分类时,会重新触发列表查询并把页码重置为第一页。分页器组件绑定页码和总条数,切换页码时更新列表。

发布页则是表单提交逻辑。使用表单校验规则,标题必填且字数限制20字以内,正文必填且字数限制5000字。提交前把表单内容组装成对象,调用保存接口。如果是从编辑页跳转过来的,会先把当前笔记的标题、正文、分类、状态渲染到表单里,提交时携带笔记ID走更新接口。

细节页的交互会多一些。进入页面时分别调用笔记详情接口、评论列表接口,判断当前用户是否已点赞。页面里会把详情数据和评论数据渲染出来,用户可以进行点赞或者发表评论操作。评论发表成功后,调用评论列表接口刷新数据,不用重新加载整个页面。

5. 本地启动全流程:从环境准备到浏览器看到项目运行成功

这套源码标注"可直接运行",不是空洞的宣传,它确实做到了开箱即用,只是过程里有一些顺序和细节问题需要注意如果操作不当,会卡住很久。下面按我实际操作的顺序来走一遍。

5.1 环境准备

环境要求明确列出,逐个确认:

  • JDK版本要求是8或11。我强烈建议装JDK 8,兼容性最好,因为这套代码里没有用到JDK 11的新特性,装11完全没必要冒险。
  • Maven版本要求是3.6及以上,用于项目构建和依赖下载。
  • Node.js版本要求是14或16,Vue CLI项目对这两个版本支持最好。Node 18以上有些老依赖会报错,所以不要装太新的版本。
  • MySQL版本要求是5.7或8.x,两个都行。
  • IDE建议使用IDEA,打开项目后能直接识别Maven工程,自动导入依赖,省去一堆手工配置。

5.2 初始化数据库

数据库初始化是整个流程里最不能出错的一环。下载源码压缩包后,解压出来的目录里会有一个db文件夹,里面放着建库建表的脚本文件。用可视化工具连接本地MySQL后,执行这个脚本,会自动创建数据库和相关表,同时插入一条默认的管理员账号数据。

我在实际操作时遇到的一个常见问题是MySQL 8默认的认证插件跟旧版驱动不兼容。解决方案是在数据库连接URL上加上参数useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf-8,还有allowPublicKeyRetrieval=true这个参数。这几个参数必须写在项目配置文件的数据库连接地址里,否则会出现连接被拒绝或者无法建立连接的错误。

配置文件的路径在后端的src/main/resources/application.yml里,需要改的内容就两个地方:一是数据库账号密码,改成自己本地的账号和密码;二是配置文件的端口,默认是8080,如果端口被占用要改掉,前端代理也需要同步改对应端口。

5.3 启动后端服务

依赖导入成功后,启动SpringBoot的入口类,IDEA的控制台会出现SpringBoot的启动日志。看到类似"Started Application in x.xx seconds"的日志,说明启动成功。这时候可以直接打开浏览器访问后端的接口地址,Swagger接口文档或者一个自定义的接口测试页是否可用取决于代码里是否有集成Swagger,但至少可以访问/api/category/list之类的测试路径来验证后端是否正常。确认后端返回JSON数据后,再进行前端启动。

说到依赖下载慢的问题补充一句:Maven在下载依赖时默认连接中央仓库,国内网络下载会比较吃力。建议在Maven的settings.xml里配置一个镜像源,用阿里云的Maven镜像仓库替代。这个操作能节省非常多的等待时间,第一次导入的时候我试过,单独下载某些依赖包就要花十几分钟。

5.4 启动前端服务

前端目录在源码压缩包的web或frontend文件夹下。首次启动前端前,需要先安装依赖包。在终端中进入前端目录,执行npm install命令,等待依赖安装完成。国内环境建议先把npm的镜像源切换成国内源,执行命令npm config set registry https://registry.npmmirror.com,能明显提升安装速度。

依赖装好后,执行npm run serve启动开发服务器。默认端口是8080,注意这个端口和刚才后端的8080端口冲突了。前端的配置里一般会指定一个独立的端口,比如3000或8081。启动后终端会显示访问地址,打开浏览器访问该地址,看到首页就成功了。

关于前后端联调的跨域问题要说几句。前端开发服务器和后端服务器不在同一个端口,浏览器默认会同源策略拦截跨域请求。Vue项目在vue.config.js里配置了代理,把/api前缀的请求统一转发到后端的8080端口。所以前端发请求时一定要用/api开头,不要写完整的带端口的地址,否则代理规则不生效会直接被浏览器的跨域规则拦下来。

5.5 功能验证

整个系统跑起来后,从头走一遍:注册一个新用户,退出,重新登录,在发布页写一篇笔记设置为公开,回首页看这篇笔记是否出现。再发布另外一篇笔记设置为私密,回首页确认不显示。用管理员账号进入后台,看用户列表和笔记列表是否能查询到数据。然后测试评论和点赞功能。这一条链路走完,系统基本就没有大问题了。

6. 实际运行中遇到的三个典型报错与排查链路

直接说结论前,我先把查找问题的完整过程摆出来。这类报错大多发生在刚刚配好环境启动项目的时候,几乎每个人都会遇到其中一类,提前有个心理预期能省不少事。

6.1 MySQL连接失败:时区和认证插件

报错内容通常是Access denied for user 'root'@'localhost' (using password: YES)或者The server time zone value'XXXX' is unrecognized。

我排查的第一个问题是账号密码看是否和配置一致,确认无误后又检查MySQL服务是否正常启动,最后才发现是MySQL 8的默认认证插件是caching_sha2_password,而项目驱动使用的是mysql-connector-java8.x版本时默认认证插件不完全兼容。另外时区参数也是必须配置的,MySQL 8对时区要求比较严格,不配时区会出现时间相关字段插入异常或者查询异常。解决方法是修改后端的数据库连接URL,把它补齐成完整的连接串,重启后端。

6.2 前端请求404且代理无效

表现是页面能打开,但列表是空的,打开浏览器开发者工具看到接口请求返回404。

排查过程是这样的:我先是查看了前端代理配置是否已经生效,确认vue.config.js里配置了代理且使用的是/api前缀。又检查了后端接口的路径前缀是否统一,也就是Controller的RequestMapping里是否带了/api。这个项目里有统一的前缀设计,但有的同学拿到源码后自己改了Controller路径,或者新增了接口忘了加前缀,就会导致代理匹配不上,直接404。

如果遇到了404且代理配置没问题,还要检查后端接口的请求方式是否匹配,比如POST请求是否被前端写成了GET。这类问题排查起来不难,但定位过程往往是先排除配置再检查代码。

6.3 依赖安装过程中的Node版本冲突

表现是前端npm install时报出一堆ERESOLVE错误,或者脚手架升级后ESLint报错并退出。

我一开始以为问题出在依赖包版本冲突上,于是删掉了package-lock.json和node_modules目录重新安装,折腾了几次没能解决。后来检查Node版本,发现版本太高(Node 18),Vue CLI 4.x项目的某些生态依赖和Node 18存在兼容性问题,还有OpenSSL的哈希算法改用例导致的问题。解决办法是切换本地Node版本到16,或者遵循生态常见做法,在package.json中调整构建脚本里的指令参数。最简单可靠的办法还是直接装一个Node版本管理工具,切到Node 16或者Node LTS版本再重新npm install,就不会再有这个问题了。

7. 一些落地建议、资料分析与后续扩展思路

如果这是你第一次跑一个前后端分离的项目,我的建议是把资料文件里的接口明细和前端源码对照着看,先不要急着改功能。这个系统本身的代码组织属于比较标准的教育型项目风格,每层的类名和业务方法一眼就能看出作用。先完整地跑通一次、看清楚请求数据是怎么流动的,再考虑扩展,这种方式理解效率最高。

常见的第二次层扩展方向按性价比排序如下。

第一个是引入Markdown编辑器。现在的编辑框是普通多行文本,对于笔记分享场景,Markdown的体验会是质的提升。前端可以选用轻量级的Markdown编辑器组件,后端存储Markdown源码,前端渲染时调用Markdown到HTML的转换库,再做一次样式适配。

第二个是增加标签系统。目前的分类是单层结构,笔记只能归属一个分类。加一个标签表,笔记和标签做成多对多关联,列表页增加标签云筛选。这个功能不会动现有表结构的主干,改动量可控。

第三个是笔记搜索的优化。现在的关键字查询是数据库的模糊匹配,数据量大了存在性能瓶颈。可以考虑引入全文索引,或者将搜索能力抽离到Elasticsearch里。但这一步要先把数据同步机制设计好,不适合在练手项目初期就引入重方案。

第四个是部署上线。本地跑通后,可以考虑把后端的jar包部署到云服务器,前端npm run build打包出静态文件并交给Web服务托管,数据库交给云端。这条链路走完,算是完成了一个完整的全栈项目交付。

回到项目本身说点体会。这套源码最大的价值不是功能多炫,而是完整地展示了一个前后端分离项目的标准组织方式,从数据库设计到接口分层再到前端联调,每个环节都是可以直接复制到后续项目里的经验。尤其是在当前很多学习项目只讲前端或者只讲后端的背景下,这套源码能帮你把前后端之间的数据流转关系彻底打通。

如果你就是想尽快跑起来,跟着第五章的启动顺序走,每一步的花费时间应该在可控范围内。如果启动过程中卡在了哪个环境问题上,读一遍第六章有没有对应报错,大概率能找到解决路径。我自己踩过MySQL连接的坑,也在Node版本上吃过亏,把这两道坎迈过去,剩下的基本都是顺水推舟。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询