百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

推荐一个 Spring Boot 3 + Vue 3 的学习型开源项目,配备保姆级项目教程

csdh11 2025-02-26 11:42 6 浏览

项目简介

原文链接:
https://www.52pojie.cn/forum.php?mod=viewthread&tid=1640957&extra=
page%3D1%26filter%3Dtypeid%26typeid%3D192

novel 是一套基于时下最新 Java 技术栈 Spring Boot 3 + Vue 3 开发的前后端分离学习型小说项目,配备保姆级项目开发教程手把手教你从零开始开发上线一个生产级别的 Java 系统。由小说门户系统、作家后台管理系统、平台后台管理系统等多个子系统构成。包括小说推荐、作品检索、小说排行榜、小说阅读、小说评论、会员中心、作家专区、充值订阅、新闻发布等功能。

项目地址

  • 后端项目(更新中):GitHub | 码云
  • 后端微服务版本项目(待更新):GitHub | 码云
  • 前端项目(更新中):GitHub | 码云
  • 线上应用版:GitHub | 码云 |演示地址

开发环境

  • MySQL 8.0
  • Redis 7.0
  • Elasticsearch 8.2.0(可选)
  • RabbitMQ 3.10.2(可选)
  • JDK 17
  • Maven 3.8
  • IntelliJ IDEA 2021.3(可选)
  • Node 16.14

后端技术选型

技术

版本

说明


Spring Boot

3.0.0-SNAPSHOT

容器 + MVC 框架


Mybatis

3.5.9

ORM 框架


MyBatis-Plus

3.5.1

Mybatis 增强工具


JJWT

0.11.5

JWT 登录支持


Lombok

1.18.24

简化对象封装工具


Caffeine

3.1.0

本地缓存支持


Redis

7.0

分布式缓存支持


MySQL

8.0

数据库服务


Elasticsearch

8.2.0

搜索引擎服务


RabbitMQ

3.10.2

开源消息中间件


Undertow

2.2.17.Final

Java 开发的高性能 Web 服务器


Docker

-

应用容器引擎


Jenkins

-

自动化部署工具


Sonarqube

-

代码质量控制


注:更多热门新技术待集成。

前端技术选型

技术

版本

说明

Vue.js

3.2.13

渐进式 JavaScript 框架

Vue Router

4.0.15

Vue.js 的官方路由

axios

0.27.2

基于 promise 的网络请求库

element-plus

2.2.0

基于 Vue 3,面向设计师和开发者的组件库

示例代码

代码严格遵守阿里编码规约。

/**
 * 小说搜索
 */
@Override
public RestResp> searchBooks(BookSearchReqDto condition) {

    SearchResponse response = esClient.search(s -> {

                SearchRequest.Builder searchBuilder = s.index(EsConsts.BookIndex.INDEX_NAME);
                // 构建搜索条件
                buildSearchCondition(condition, searchBuilder);
                // 排序
                if (!StringUtils.isBlank(condition.getSort())) {
                    searchBuilder.sort(o ->
                            o.field(f -> f.field(condition.getSort()).order(SortOrder.Desc))
                    );
                }
                // 分页
                searchBuilder.from((condition.getPageNum() - 1) * condition.getPageSize())
                        .size(condition.getPageSize());

                return searchBuilder;
            },
            EsBookDto.class
    );

    TotalHits total = response.hits().total();

    List list = new ArrayList<>();
    List> hits = response.hits().hits();
    for (Hit hit : hits) {
        EsBookDto book = hit.source();
        list.add(BookInfoRespDto.builder()
                .id(book.getId())
                .bookName(book.getBookName())
                .categoryId(book.getCategoryId())
                .categoryName(book.getCategoryName())
                .authorId(book.getAuthorId())
                .authorName(book.getAuthorName())
                .wordCount(book.getWordCount())
                .lastChapterName(book.getLastChapterName())
                .build());
    }
    return RestResp.ok(PageRespDto.of(condition.getPageNum(), condition.getPageSize(), total.value(), list));

}

/**
 * 构建搜索条件
 */
private void buildSearchCondition(BookSearchReqDto condition, SearchRequest.Builder searchBuilder) {

    BoolQuery boolQuery = BoolQuery.of(b -> {

        if (!StringUtils.isBlank(condition.getKeyword())) {
            // 关键词匹配
            b.must((q -> q.multiMatch(t -> t
                    .fields(EsConsts.BookIndex.FIELD_BOOK_NAME + "^2"
                            , EsConsts.BookIndex.FIELD_AUTHOR_NAME + "^1.8"
                            , EsConsts.BookIndex.FIELD_BOOK_DESC + "^0.1")
                    .query(condition.getKeyword())
            )
            ));
        }

        // 精确查询
        if (Objects.nonNull(condition.getWorkDirection())) {
            b.must(TermQuery.of(m -> m
                    .field(EsConsts.BookIndex.FIELD_WORK_DIRECTION)
                    .value(condition.getWorkDirection())
            )._toQuery());
        }

        if (Objects.nonNull(condition.getCategoryId())) {
            b.must(TermQuery.of(m -> m
                    .field(EsConsts.BookIndex.FIELD_CATEGORY_ID)
                    .value(condition.getCategoryId())
            )._toQuery());
        }

        // 范围查询
        if (Objects.nonNull(condition.getWordCountMin())) {
            b.must(RangeQuery.of(m -> m
                    .field(EsConsts.BookIndex.FIELD_WORD_COUNT)
                    .gte(JsonData.of(condition.getWordCountMin()))
            )._toQuery());
        }

        if (Objects.nonNull(condition.getWordCountMax())) {
            b.must(RangeQuery.of(m -> m
                    .field(EsConsts.BookIndex.FIELD_WORD_COUNT)
                    .lt(JsonData.of(condition.getWordCountMax()))
            )._toQuery());
        }

        if (Objects.nonNull(condition.getUpdateTimeMin())) {
            b.must(RangeQuery.of(m -> m
                    .field(EsConsts.BookIndex.FIELD_LAST_CHAPTER_UPDATE_TIME)
                    .gte(JsonData.of(condition.getUpdateTimeMin().getTime()))
            )._toQuery());
        }

        return b;

    });

    searchBuilder.query(q -> q.bool(boolQuery));

}

部分截图

  • 首页
  • 分类索引页
  • 搜索页
  • 排行榜
  • 详情页
  • 阅读页

相关推荐

法拍房「捡漏」陷阱中,都是刚需们的血泪

文|镜相工作室,作者|李丹,编辑丨卢枕买法拍房的人越来越多了。2024年全国住宅类法拍房挂拍31.9万套,成交11.7万套。而在两年前,挂拍数相差无几,成交还只有8.1万套。当阿里法拍房五年激...

睡后收入新神话:90后程序员靠DEEPSEEK躺赚百万?

凌晨四点的杭州未来科技城,27岁程序员陈墨的支付宝响起提示音——这是他开发的AI情感咨询机器人自动完成第89单服务,当日收益突破1.2万元。这个基于DEEPSEEK模型打造的"赛博月老",正在批量制造...

当00后也变成打工人,还会认真谈恋爱吗?

当代年轻人的爱情里,总是会有以下这些场景:在家里被催婚,在约会app上左滑右滑地徘徊,又或者在陌生的环境里等待不期而遇。似乎比真爱更令人失落的,是一种现代人孤岛式的伤感。在专题“预制爱情”中,《新周刊...

我在冬天的上海,被汉王的办公本救了一命?

这老祖宗啊,说得还真没错。人到年末,工作上的破事就一箩筐,事情一多,感觉连血条都短了一大截。你敢相信,今天早上起床的时候,我看着镜子里那张有点认不出来人形的脸,那副垂头丧气的样子,属于是整个人从上到下...

老司机程序员用到的各种优秀资料、神器及框架整理

作者:欧巴冰冰链接:https://www.jianshu.com/p/d74934b49ba3目录资料篇技术站点...

聪明人都在教你用Deep Seek赚钱?不!他们只想“割韭菜”。

当“聪明人”开始用DeepSeek教你赚钱时,请先捂住钱包——因为他们的“聪明”,不过是把镰刀磨得更快,韭菜割得更响。第一步:制造焦虑,贩卖“时代抛弃论”。“不懂AI的人,正在被淘汰!”“某大厂裁员5...

我有一种紧迫感,去呈现社会转型中的思考|专访李睿珺

李睿珺可能是当代最受关注的青年导演之一。对乡村生活的关注是李睿珺创作的一大主题。《老驴头》《告诉他们,我乘白鹤去了》《家在水草丰茂的地方》对这一主题都有不同程度的体现。身为创作者,李睿珺的思考一直在持...

阿里云云效 vs 腾讯云CODING,DevOps孰强孰弱?

编辑导语:DevOps这个话题在IT、开发等领域是相对热门的,它意味着开发运维一体化,是推动业务发展与自动化交付的有效方式。国内便有不少DevOps平台可供企业使用。那么这些DevOps平台目前的发展...

所有小人书目录,以及手机观看截图

单双本连环画1-500连环画_B型美猴王(24册)连环画_一千零一日的故事(10册)连环画_一颗铜纽扣(3册)连环画_丁丁历险记(1-12册)...

瞧,布鲁范德又在一本正经地胡说八道

作者:孙欣祺1996年4月,在那个互联网尚不发达的年代,有一则网络流言引起不少美国人的关注:犹他大学的布鲁范德教授是不是去世了?刚刚办完退休手续的扬·哈罗德·布鲁范德亲自回复:“报道属实。本条信息发送...

“种草经济”种出了什么?

每天,有近400万篇笔记,在小红书上种草“诗与远方”。每小时,有超过1875万人在小红书搜索,求解“柴米油盐”。“种草”一词,源自社交媒体上看到他人分享,产生好感和想要亲自尝试的想法。一件心仪好物,一...

对Http Rest API接口设计和API治理管控的思考

作者:人月神话,新浪博客同名简介:多年SOA规划建设,私有云PaaS平台架构设计经验,长期从事一线项目实践在前面关于微服务方面的文章里面提到,对于多个微服务模块间往往都是以轻量的HttpRestA...

一部汇辑有关吕洞宾之事迹、神话传说及著作《吕祖全书》

0957-吕祖全书(古本)...

塞林格遗稿出版谜案:他并非完全拒斥出版

今年是J·D·塞林格诞辰一百周年,塞林格之子、塞林格基金会负责人马特·塞林格(MattSalinger)首次访华,进行了一系列讲座和对谈活动。在他的指导修订下,译林出版社于2018年末推出了塞林格作...

程序员十大层次,你在第几层

大家好,我是柠檬哥,专注编程知识分享。欢迎关注@程序员柠檬橙,编程路上不迷路,私信发送以下关键字获取编程资源:...