news 2026/9/26 2:21:21

Spring Boot个人博客系统设计与实现:从零搭建到答辩指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring Boot个人博客系统设计与实现:从零搭建到答辩指南

1. 选题价值与整体设计思路

1.1 这个题目到底在考察什么

如果你的毕设题目是“个人博客系统设计与实现”,或者你正在Spring Boot相关的选题清单里反复犹豫,那这篇文章值得你花十分钟看完。我前几年带过的几个学生都选了类似方向,自己也完整从零做过一版,所以这里面的坑、捷径和评分点,我基本都摸得比较透。

先说结论:个人博客系统是一个非常典型的“什么都沾一点”的题目。它不像商城系统那么臃肿,也不像图书管理系统那样略显单薄,它天然包含用户登录、权限区分、文章增删改查、分类标签、评论交互、前台展示、后台管理这些环节,基本覆盖了一个企业级Web应用最常见的骨架。对毕业设计而言,这套骨架既能体现你的工程能力,又不会把工作量堆到无法收场。

很多同学担心这个题目太老。其实评阅老师看重的从来不是题目新不新,而是你有没有把题目做扎实。同一套博客系统,有人只做了文章发布和列表展示,有人做了Markdown编辑、标签归档、定时发布、阅读统计、评论楼中楼、全文检索,这两者的答辩效果完全是两个层次。所以关键不是题目本身,而是你在设计里放了多少思考。

1.2 怎么把“老题目”做出差异化

我个人建议,在开题报告阶段就把功能边界想清楚。基础功能谁都做,但你有三个方向可以做出彩:

第一块是内容编辑体验。不要用Textarea直接存HTML,那是十年前的做法。用Markdown编辑器,前端实时预览,后端同时保存原始Markdown和渲染后的HTML,编辑时回显原稿,展示时输出HTML,这一步就能明显拉开和其他同学的差距。

第二块是阅读交互数据。文章浏览量统计、热门文章排行、按月份归档的时间线、标签云,这些功能看似不大,但每一个都能引出值得写的技术点。比如浏览量你用Redis自增而不是每次都update数据库,这就是答辩时能讲的性能优化点。

第三块是运维与工程质量。统一返回结构、全局异常处理、参数校验、登录拦截器、操作日志切面,这些“非业务”的东西反而最能体现专业度。论文里写“系统设计了统一的异常处理机制与响应格式”,要比写“系统实现了文章的增删改查”更有说服力。

功能范围的取舍也很重要。我当时列了一个需求清单,按优先级分三类:必须做(文章管理、用户登录、分类标签、评论)、加分做(Markdown、浏览量统计、归档时间线)、有余力再做(友链管理、个人简历页、站点公告)。如果你现在还没有需求清单,建议先列出来,别上来就写代码。

1.3 系统角色与整体流程设计

个人博客系统通常只涉及两类角色:管理员和游客。管理员负责发文、删评、管理分类标签,游客只能看文章、发表评论。这一层权限边界要在设计阶段明确,它直接影响你数据库表字段和拦截器规则的设计。

整体流程可以描述成这样:游客访问前台首页,按分类或标签筛选文章,进入详情页查看内容并发表评论;管理员进入后台,先登录认证,再对文章、分类、评论进行管理。前后台共用一套Spring Boot后端接口,只是通过拦截器和角色字段区分访问权限。

这样设计的好处是逻辑清晰,论文里画用例图、时序图都方便,代码里Model、Mapper、Service的分层也自然。千万不要把后台管理做成一个独立系统,工作量翻倍不说,答辩时还容易把自己绕晕。

2. 技术选型:不追新,但要能说清楚为什么

2.1 Spring Boot版本与JDK版本的选择

技术选型是答辩时必问的环节,所以每一个选择你都最好能回答“为什么不用另一个”。Spring Boot版本我建议选2.7.x,配JDK 8,而不是直接上Spring Boot 3.x。原因有三:第一,Spring Boot 3强制要求JDK 17,咱们学校机房和老师电脑上不一定有对应环境;第二,网上绝大多数资料、博客、踩坑帖都是基于2.x写的,出问题了你能查到答案;第三,2.7.x是一个长期维护的成熟版本,毕业设计这个体量完全够用。

如果你选3.x,也不是不行,但你要做好两个心理准备:有些第三方依赖还没完全适配,启动报错时查到的解决方案可能不适用;老师如果对Spring Boot 3了解不多,你反而要多费口舌解释。毕设求稳,2.7.x是主流选择。

2.2 ORM与数据库方案

数据库方面不用犹豫,MySQL就够了。版本选5.7或8.0都行,建议8.0,因为默认字符集utf8mb4对表情符号支持更好,博客评论里出现Emoji时不会乱码。ORM框架我推荐MyBatis Plus,而不是原生MyBatis或Spring Data JPA。

原因很实际:MyBatis Plus内置了单表CRUD方法,你写文章、分类、评论这些表的增删改查时不需要自己写大量XML;分页插件好用,QueryWrapper构造查询条件也很直观。对毕业设计来说,这能帮你节省大量时间,而且它有官方文档和活跃社区,答辩时提到“基于MyBatis Plus简化数据访问层开发”完全拿得出手。

JPA虽然也很强大,但如果班里的同学多数用MyBatis系,你遇到问题请教别人反而费劲。技术栈建议跟着大部队走,新潮留到工作中再去追。

2.3 前端方案的取舍

这是很多同学纠结最久的地方。我分两种情况给建议。如果你已经会一点Vue,时间还有两三个月,推荐前后端分离:后端纯Spring Boot提供JSON接口,前端用Vue 3加Element Plus,构建工具用Vite。这种方案的优点是页面效果现代、交互流畅,答辩演示时观感好,论文里也可以写“前后端分离架构,前端通过RESTful API与后端交互”。

如果你前端基础薄弱,或者时间只剩一个月,不要硬撑前后端分离,用Spring Boot模板引擎Thymeleaf更稳。Thymeleaf的好处是不需要处理跨域,不需要单独部署前端项目,后端Controller返回ModelAndView直接渲染页面,一切都在同一个工程里,部署时一个jar包搞定。虽然页面观感比Vue做的差一点,但胜在不容易卡壳。

两个方案我做个对比,你根据自己的情况对号入座:

对比维度前后端分离(Vue + Element Plus)服务端渲染(Thymeleaf)
开发门槛需要熟悉Vue语法和构建工具只要会HTML和Spring MVC即可
页面效果现代美观,交互丰富相对朴素,但可通过CSS模板弥补
部署方式前端打包后与后端分开或合并部署单个Jar包,部署最简单
答辩亮点可讲跨域、鉴权、前后端分离架构可讲模板引擎渲染、Session管理
踩坑概率中等(跨域、build路径配置)较低
适合人群有前端基础、时间充裕前端薄弱、时间紧张

表格看完你应该心里有数了。多数人适合走前后端分离,因为现在学校里Vue几乎是默认技能,学一下并不亏。但如果你对Vue完全没概念且只剩三周,直接Thymeleaf,别犹豫。

2.4 其他常用依赖怎么挑

除了核心框架,还有几个常用组件值得提前加进工程。Lombok要加,能省掉实体类的getter/setter;Hutool要加,里面有很多工具方法(比如验证码生成、MD5加密、日期处理)拿来即用;Redis看情况加,如果你做了浏览量统计和缓存,就需要引入spring-boot-starter-data-redis。

权限方面如果你不想引入Spring Security这个大块头,可以用拦截器加JWT来实现登录验证,毕设场景完全够。文件存储方面,如果头像和文章封面需要上传,直接用本地磁盘存储,加一个虚拟路径映射就可以,不需要因为一个图片上传就去学OSS,那会把简单问题复杂化。OSS不是不能写,但对毕设而言,本地存储再把路径存数据库已经足够展示你的水平了。

3. 核心功能拆解与实现要点

3.1 用户登录与权限控制

用户模块最忌讳一上来就引Spring Security一顿配置,配完Filter链路、UserDetailService、密码加密器,你可能会花掉两三天还未必跑通,而且Spring Security的默认登录页和前后端分离的JSON接口模式也略水土不服。

我的做法很简单:用JWT令牌加一个拦截器,自己写登录逻辑。登录接口接收用户名和密码,校验通过后用userId和username生成一个Token返回给前端,前端后续请求在Header里带上Token,拦截器统一解析校验,并在请求域里存好当前用户信息。管理员接口额外检查用户的role字段是否为ADMIN,不是就返回403。完全够用,逻辑清楚,答辩时你自己也能讲明白每一行代码的作用。

这里务必注意几个细节。第一,密码不要明文存储,用BCrypt加密,Spring Security的crypto包里有BCryptPasswordEncoder可以单独拿来用;第二,Token要设置过期时间,一般两小时比较合理,用户操作时前端可以在拿到过期响应后自动跳转到登录页;第三,头像和昵称在用户注册时要给默认值,不然页面样式会很难看。

3.2 文章发布:Markdown编辑与XSS过滤

文章模块是个人博客系统的核心。我强烈建议存储两套内容:markdownContent存用户编辑的原始Markdown,content存储渲染后的HTML。前端提交时把Markdown和渲染后的HTML一起传过来,后端校验HTML时做白名单过滤。编辑时后端把markdownContent返回给编辑器,展示时取content字段。

为什么不能只存HTML?因为在编辑器里回显时,HTML还原成Markdown非常痛苦,格式会乱套。保留原稿一劳永逸,这是很简单的设计决策,却能省下很多维护成本。

Markdown渲染在后端用flexmark或commonmark-java库都行,我建议用flexmark,扩展性好,以后要支持上标、脚注、任务列表都有现成扩展模块。这里要特别提醒XSS的问题:Markdown语法本身允许嵌入原始HTML,比如你写<script>alert('xss')</script>,渲染后这段脚本会被直接输出到页面上。所以必须对渲染后的HTML再做一层过滤,把你允许的标签和属性列进白名单,其他一律剥离。

我在项目里封装了一个HtmlUtils,核心逻辑就是调用flexmark渲染后用jsoup的Safelist进行清理,两行核心代码就能规避大部分XSS攻击。网上有些教程教人用替换<script>标签去过滤,这种黑名单思路是堵不住的,一定要用白名单方式。毕业论文里这个点值得单独写一段,属于安全设计亮点。

3.3 评论、浏览量统计与站内搜索

评论功能要注意两个问题:一个是数据模型要支持楼中楼,最简单的做法是在评论表里加一个parentId字段,顶级评论parentId为0,回复评论时填上级评论的id;另一个是评论区不能让用户随便填一个HTML就往库里写,必须做和文章同样的过滤处理。

浏览量统计建议用Redis来实现。用户访问文章详情接口时,先用Redis的increment操作累加文章的浏览量,然后异步或定量地同步到MySQL。比如每满10次或者每天定时把内存中的计数写入数据库,避免每次访问都去update数据库,把压力扛到数据库上。答辩时这个设计可以从两个角度去讲:缓解数据库压力、支撑高并发读取。虽然毕设流量不大,但“设计思想”比“实际压力测试”更容易拿分。

站内搜索如果文章量不大,直接MySQL的LIKE查询就够。但需要注意,千万不要用LIKE '%关键字%'去搜长文本内容字段,数据多了会非常慢。一个折中建议是给文章表加一个全文索引,用MATCH...AGAINST来做全文检索。如果还想进一步展示水平,可以引入一个轻量的倒排索引思路,或者对接Elasticsearch——但我不建议把ES纳入毕设范围,部署成本高、内存占用大,很容易让项目无法在老师电脑上跑起来。

3.4 统一响应与异常处理的最佳实践

这个点偏工程化,但属于写了就加分的内容。我建议你定义一个统一的返回体Result,包含code、message、data三个字段,所有接口返回都走这个结构。例如Result.success(data)和Result.error(msg),后续调用方只需要根据code判断业务是否成功即可。写起来很简单,但答辩效果非常好,因为它体现了你对接口规范的认识。

全局异常处理用@RestControllerAdvice加@ExceptionHandler,把业务异常、参数校验异常、未知异常分别处理成标准错误响应。不要小看这个环节,很多同学在答辩演示时,遇到参数为空就直接在浏览器里看到一堆英文异常堆栈,非常减分。而如果你做了全局异常处理,页面上提示的是“参数校验失败:用户名不能为空”,老师会觉得你的系统完成度很高。

4. 从零搭建的开发流程实录

4.1 项目初始化与目录结构

项目初始化有两个办法:用IDEA的Spring Initializr新建,或者去start.spring.io网站勾选依赖后下载解压导入。在IDEA里操作会更顺手,注意勾选依赖时只需要Spring Web、MySQL Driver、Validation这几个,MyBatis Plus和Lombok这些需要手动加到pom.xml,因为默认勾选列表里没有。

创建完项目后,第一件事是调整目录结构。我习惯的包结构是:

  • controller:接收请求,做简单的参数绑定
  • service:业务逻辑实现
  • mapper:数据访问层
  • entity:数据库实体映射
  • dto:接收前端参数的传输对象
  • config:配置类,如跨域、拦截器注册
  • common:统一返回体、常量、全局异常处理
  • util:工具类

为什么要把entity和dto分开?因为前端传来的结构和数据库表结构不一定相同。比如用户注册接口传的是username、password、nickname,而用户表还有createTime、role这些字段,直接用entity接收会暴露多余字段。这个细节在论文中也可以写。

4.2 数据库表设计参考

数据库建议建五张表加一张关联表:用户表、文章表、分类表、标签表、评论表、文章标签关联表。具体字段按我下面的设计来建就行,这个设计基本满足所有博客功能需要。

用户表t_user包含:id主键、username唯一登录名、password加密后的密码、nickname昵称、avatar头像路径、email邮箱、role角色(ADMIN/USER)、createTime创建时间。

文章表t_article包含:id、title标题、summary摘要、markdownContent原始内容、content渲染后的HTML、cover封面图路径、categoryId分类ID、isTop是否置顶、isPublish是否发布、views浏览量、createTime发布时间、updateTime更新时间。

分类表t_category:id、name分类名。标签表t_tag:id、name标签名。文章标签关联表t_article_tag:id、articleId、tagId。评论表t_comment:id、articleId、userId、nickname、email、content评论内容、parentId父评论ID、status状态、createTime评论时间。

建表SQL我给出核心的两张表,其余参考类似写法:

CREATE TABLE `t_user` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `username` VARCHAR(64) NOT NULL COMMENT '登录名', `password` VARCHAR(128) NOT NULL COMMENT 'BCrypt加密密码', `nickname` VARCHAR(64) NOT NULL COMMENT '昵称', `avatar` VARCHAR(255) DEFAULT NULL COMMENT '头像地址', `email` VARCHAR(128) DEFAULT NULL, `role` VARCHAR(16) NOT NULL DEFAULT 'USER', `create_time` DATETIME NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uniq_username` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
CREATE TABLE `t_article` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `title` VARCHAR(128) NOT NULL COMMENT '标题', `summary` VARCHAR(255) DEFAULT NULL COMMENT '摘要', `markdown_content` LONGTEXT NOT NULL COMMENT 'Markdown原文', `content` LONGTEXT NOT NULL COMMENT '渲染后HTML', `cover` VARCHAR(255) DEFAULT NULL COMMENT '封面图', `category_id` BIGINT DEFAULT NULL COMMENT '分类ID', `is_top` TINYINT(1) DEFAULT 0 COMMENT '是否置顶', `is_publish` TINYINT(1) DEFAULT 1 COMMENT '是否发布', `views` INT DEFAULT 0 COMMENT '浏览量', `create_time` DATETIME NOT NULL, `update_time` DATETIME DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_category` (`category_id`), FOREIGN KEY (`category_id`) REFERENCES `t_category` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文章表';

注意外键约束不是必须的。有些同学建表时把所有关联字段都加外键,插入数据时频繁踩坑。我建议逻辑外键就好,在Service层保证关联数据的存在,只在索引层面建普通KEY。

4.3 推荐开发顺序与提升效率的技巧

很多同学拿到项目后先写文章模块,这其实是错的。我的建议是按依赖关系从底层往上层推:先搭框架(统一返回、全局异常、跨域配置),再做用户模块(因为文章和评论都依赖当前登录用户),再做分类和标签这类基础数据模块,然后是文章模块,最后是评论模块和前台的展示页面。顺序反过来,你会在写文章时发现需要用户的ID、需要分类的数据,又回头补,来回折腾非常消耗耐心。

统一返回类代码很简单,贴出来给各位参考:

@Data public class Result<T> { private Integer code; private String message; private T data; public static <T> Result<T> success(T data) { Result<T> result = new Result<>(); result.setCode(200); result.setMessage("操作成功"); result.setData(data); return result; } public static <T> Result<T> error(String message) { Result<T> result = new Result<>(); result.setCode(500); result.setMessage(message); return result; } }

开发效率方面,如果使用MyBatis Plus,建议在Service里直接继承IService,实体Mapper继承BaseMapper,这样单表的CRUD方法就全都有了。分页查询统一用MyBatis Plus的分页插件,配置一个MybatisPlusInterceptor拦截器即可。

接口设计走RESTful风格,比如获取文章列表是GET /api/article/page,发布文章是POST /api/article,浏览量统计是PUT /api/article/{id}/view。方法用的语义清晰,前后端对接文档也好写。

4.4 前台页面与后台管理的联动

页面这块容易被低估,但实际它是毕业答辩时老师看得最多的地方。前后端分离的方案里,前台建议包含这么几个页面:首页(文章列表加侧边栏热门文章)、文章详情页(Markdown渲染加评论区)、分类页、标签页、归档页、登录注册页。后台则做文章管理、分类管理、评论管理三个页面。

前后台联动最容易出问题的点是前端调用接口时Token的处理。我建议在axios请求拦截器里统一加Header,并从响应里统一判断code是否为200,不是就弹出后端返回的message信息。这样你不需要在每个页面都写一遍Token逻辑。

另外,部署时要记得前端打包后的静态文件要么放在nginx里代理指向后端接口,要么直接把dist目录上传到服务器上。如果只在本机演示,用IDEA分别启动前端和后端就行,跨域配置只需在Spring Boot的配置类里加上允许跨域即可。

5. 毕设开发中的典型问题排查

5.1 高频运行问题速查表

我整理了个人博客系统开发中最高频的几个问题,直接列成一个速查表,方便你在卡壳时快速对照:

问题现象直接原因解决办法
启动时端口被占用之前运行的程序没退出在application.yml改server.port,或用命令杀掉占用进程
数据库连接失败连接地址、账号密码写错或服务未启动检查yml配置,确认MySQL服务已启动,用Navicat测试连通
Mapper方法报找不到Mapper接口没加@Mapper注解在启动类加@MapperScan或者在每个Mapper上标@Mapper
前后端联调时接口能通但页面没数据跨域导致浏览器拦截配置CorsFilter或@CrossOrigin,注意同时处理预检请求OPTIONS
返回体里时间显示为8小时偏差时区未设置JDBC连接串加serverTimezone=Asia/Shanghai
上传图片后页面无法访问静态资源映射没配配置WebMvcConfigurer把磁盘目录映射到/upload/**
分页查询返回total为0分页插件未生效检查MybatisPlusInterceptor是否注册成功,旧版本要确认版本兼容

这张表基本覆盖了我带学生过程中遇到的80%问题。你会发现大部分坑都集中在配置层面而不是代码本身,所以遇到问题别急着改代码,先检查配置文件。

5.2 容易被忽视的细节陷阱

有几个细节是我个人反复踩过坑后才注意到的,单独拿出来多说几句。

第一是统一放行白名单。拦截器要放行登录接口、文章列表接口、文章详情接口和静态资源,但要拦截后台管理接口。放行规则写错会导致前端页面一片空白还不知道原因。建议把所有放行的URL路径用常量集中管理,方便排查。

第二是文件上传大小限制。Spring Boot默认最大上传文件大小是1MB,如果你要上传文章封面图,超过1MB就会报错。记得在配置文件中设置spring.servlet.multipart.max-file-size和max-request-size,一般设置成10MB足够。

第三是实体类里不要用基本类型int、long接收可能为null的数据库字段,否则MyBatis在set值时会发生NPE。这种情况一般发生在文章表的categoryId或评论表的parentId上,建议用包装类型Long或Integer。

第四是开发过程中做好备份,特别是改数据库结构前先导出SQL。我见过不少同学改表结构改到一半发现数据丢了的。毕业设计周期短,代码量不大,建议每次完成一个模块就打个压缩包或者提交到Git仓库,容错率会高很多。如果你已经改了乱七八糟的快崩溃了,也不要去想什么反编译之类的骚操作恢复代码,那是给别人擦屁股才用的招,正途是Git。

5.3 论文与答辩的加分经验

论文部分最容易扣分的地方是“只写功能不写设计思路”。评阅老师比较希望看到你的系统有明确的设计原则和取舍过程。我在摘要里写“系统基于Spring Boot与Vue构建,采用前后端分离架构,前端通过RESTful API与后端交互,后端采用分层架构设计,通过JWT实现无状态鉴权,使用Redis优化热门数据的访问性能”,这样一段话就基本概括了你的所有技术亮点。

答辩演示的流程我建议按这个顺序走:先用两三分钟介绍系统的三个核心功能,然后演示前台页面,展示文章列表、文章详情和评论交互;再切到后台管理,操作一下文章发布和删除;最后如果有时间,可以打开日志或者数据库,展示一下数据落盘的情况。不要一上来就讲解代码,老师对这个不感兴趣。时间控制上,总演示控制在10分钟以内,语速放慢,重点讲你自己深度做过的那几个技术点。

碰到老师问“你这个系统有什么不足”也不用慌,坦诚说目前搜索功能用的是数据库模糊查询,如果数据量更大可以考虑引入Elasticsearch做全文检索;浏览量的统计用了Redis,但目前是单机部署,后续可以扩展为集群模式。这个回答听起来既务实又有深度,反而是加分项。

我个人在实际操作中的体会是,毕业设计最大的坑不是技术难度,而是节奏失控。你只需要把一个功能做透,比堆十个没打磨的功能有效得多。这套个人博客系统从设计到实现,实际编码时间大概需要三四周,每天推进一个小功能,遇到问题先看日志再看代码,最后你会发现自己不仅完成了毕设,还对Spring Boot这套生态有了真正完整的认知。希望这篇东西能帮你少走几步弯路,也祝各位的论文和答辩都顺顺利利。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/26 2:20:54

甘蔗病害图像分类实战:19,000张标注数据从训练到评估的避坑指南

简介&#xff1a;甘蔗植物病害图像分类数据集提供约19,000张已标注图片&#xff0c;面向深度学习图像分类方向的开发者、研究人员及农业AI学习者&#xff0c;可解决甘蔗红腐病、锈病、枯萎病及健康叶片等6类病害分类模型的训练与验证需求。数据已按训练集、测试集划分&#xff…

作者头像 李华
网站建设 2026/9/26 2:18:46

如何自建免费 Open-Meteo 天气 API:新手三步部署完整指南

如何自建免费 Open-Meteo 天气 API&#xff1a;新手三步部署完整指南 【免费下载链接】open-meteo Free Weather Forecast API for non-commercial use 项目地址: https://gitcode.com/GitHub_Trending/op/open-meteo Open-Meteo 是一个免费开源的气象数据平台&#xff…

作者头像 李华
网站建设 2026/9/26 2:17:29

雷达弱目标检测前跟踪TBD MATLAB实战:多帧积累与航迹回溯

简介&#xff1a;这份MATLAB检测前跟踪&#xff08;TBD&#xff09;资源面向雷达信号处理方向的学习者与研究人员&#xff0c;聚焦微弱目标检测与跟踪这一难点问题。其核心思路是在正式检测前对多帧回波数据进行积累与联合处理&#xff0c;以提升信噪比&#xff0c;并借助卡尔曼…

作者头像 李华
网站建设 2026/9/26 2:15:11

本地部署 AI 小说生成器:3 步跑通多章节长篇小说自动写作

本地部署 AI 小说生成器:3 步跑通多章节长篇小说自动写作 【免费下载链接】AI_NovelGenerator 使用ai生成多章节的长篇小说&#xff0c;自动衔接上下文、伏笔 项目地址: https://gitcode.com/GitHub_Trending/ai/AI_NovelGenerator AI_NovelGenerator 用大模型生成多章节…

作者头像 李华