基于javaweb的SpringBoot小说阅读系统(java+springboot+vue+maven+mysql)

运行环境

Java≥8、MySQL≥5.7、Node.js≥14

开发工具

后端:eclipse/idea/myeclipse/sts等均可配置运行
前端:WebStorm/VSCode/HBuilderX等均可

❗没学过node.js的不要搞前后端分离项目

适用

课程设计,大作业,毕业设计,项目练习,学习演示等

功能说明

000923541103

550923531103

560923531103

570923531103

580923531103

590923531103

032024393108

基于javaweb的SpringBoot小说阅读系统(java+springboot+vue+maven+mysql)

1
2
3
4
5

管理员功能:用户管理、小说管理、小说审核、公告等

用户功能:阅读小说、收藏小说、上传小说等

环境配置:

Jdk1.8 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。

项目技术:

Spring + SpringBoot+ mybatis + Maven + Vue 等等组成,B/S模式 + Maven管理等等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
    EpubInfoPojo epubInfoPojo = novelChapterService.analysisEpubFile(sysUser, novelFile, file, novel);
Novel saveNovel = epubInfoPojo.getNovel();
if(StringUtils.isEmpty(saveNovel.getNovelTitle())){
saveNovel.setNovelTitle(StringUtils.getFileName(file.getFileName()));
}
//2、解析epub文件。并存放到章节表中
return saveNovel;
}

/**
* 设置小说参数
*
* @param sysUser
* @param file
* @param novelUploadDto
* @return com.wpy.entity.Novel
*/
private Novel setNovelParam(SysUser sysUser, ReadFile file, NovelUploadDto novelUploadDto) {
//1、设置通用参数
Novel novel = this.getBaseParam(sysUser,file.getId());
novel.setNovelAuthor(novelUploadDto.getNovelAuthor());
novel.setNovelIntroduce(novelUploadDto.getNovelIntroduce());
novel.setNovelPublicDate(novelUploadDto.getNovelPublicDate());
novel.setNovelTitle(novelUploadDto.getNovelTitle());
novel.setUploadUserId(sysUser.getId());
novel.setNovelType(StringUtils.listToCommaStr(novelUploadDto.getNovelTypes()));
//3、上传小说图片
if(novelUploadDto.getImgFile()!=null){
novel.setNovelImg(fileService.saveNovelImgToDisk(novelUploadDto.getImgFile(), sysUser, novel));
}
return novel;
}

@Override
public Page<Novel> getNovelList(SysUser sysUser, NovelDto novelDto) {
//判断搜索条件
boolean isAdmin=false;
if(TypeEnums.PERSON_PAGE_TYPE.getCode().equals(novelDto.getPageType())
&&StringUtils.isNotEmpty(sysUser.getId())){
//个人类型,只根据当前用户id来查
novelDto.setUploadUserId(sysUser.getId());
}else if(TypeEnums.ADMIN_PAGE_TYPE.getCode().equals(novelDto.getPageType())
&&TypeEnums.ADMIN_ROLE.getCode().equals(sysUser.getRoleType())){
//管理员页面,判断是不是管理员,是管理员就不需要查管理员有没有收藏了
isAdmin=true;
}
if(StringUtils.isNotEmpty(novelDto.getNovelType())){
List<String> list=novelDto.getNovelTypes();
if(CollectionUtils.isEmpty(list)){
list=Lists.newArrayList();
}
list.add(novelDto.getNovelType());
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
        if(TypeEnums.ADMIN_ROLE.getCode().equals(sysUser.getRoleType())){
//管理员上传直接设为公开
novel.setNovelUploadType(TypeEnums.PUBLIC_NOVEL.getCode());
novel.setNovelStatus(TypeEnums.SUCCESS_AUDIT.getCode());
}else{
//用户上传则先设为私有,再看需不需要发布审核
novel.setNovelUploadType(TypeEnums.PRIVATE_NOVEL.getCode());
if(novelUploadDto.getIsPublic()!=null&&novelUploadDto.getIsPublic()){
novel.setNovelStatus(TypeEnums.WAIT_AUDIT.getCode());
}else{
novel.setNovelStatus(TypeEnums.NOT_AUDIT.getCode());
}
}
this.save(novel);
uploadNovels.add(novel);
}

//结束后加入动态
dynamicService.addUploadDynamic(sysUser,uploadNovels);

}

@Override
public Novel saveTxtNovel(SysUser sysUser, NovelUploadDto novelUploadDto, ReadFile file, MultipartFile novelFile) {
//1、设置基本属性
Novel novel = this.setNovelParam(sysUser,file,novelUploadDto);
//3、解析文件生成小说章节数
FileInfoPojo fileInfoPojo = novelChapterService.analysisTxtFile(sysUser, novelFile, file, novel);
novel.setNovelTotal(fileInfoPojo.getTotal());
novel.setNovelWordNum(fileInfoPojo.getWordNum());
if(StringUtils.isEmpty(novel.getNovelTitle())){
novel.setNovelTitle(StringUtils.getFileName(file.getFileName()));
}
return novel;
}

@Override
public Novel saveEpubNovel(SysUser sysUser, NovelUploadDto novelUploadDto, ReadFile file, MultipartFile novelFile) {
//1、设置基本
Novel novel = this.setNovelParam(sysUser,file,novelUploadDto);
//3、解析文件生成小说章节数
EpubInfoPojo epubInfoPojo = novelChapterService.analysisEpubFile(sysUser, novelFile, file, novel);
Novel saveNovel = epubInfoPojo.getNovel();
if(StringUtils.isEmpty(saveNovel.getNovelTitle())){
saveNovel.setNovelTitle(StringUtils.getFileName(file.getFileName()));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
@Autowired
SysUserCacheService sysUserCacheService;

@GetMapping("/list")
@SysLogs("获取收藏列表")
public ResponseResult list(HttpServletRequest request, CollectionDto collectionDto){
SysUser sysUser = ShiroUtils.getSysUser(request);
return ResponseResult.success(userCollectionService.queryPersonCollect(sysUser,collectionDto));
}

@GetMapping("/treeList")
@SysLogs("获得带文件的列表")
public ResponseResult treeList(HttpServletRequest request, NovelTreePojo novelTreePojo){
SysUser sysUser=ShiroUtils.getSysUser(request);
if(TypeEnums.ADMIN_ROLE.getCode().equals(sysUser.getRoleType())&&StringUtils.isNotEmpty(novelTreePojo.getUserId())){
sysUser = sysUserCacheService.getSysUser(novelTreePojo.getUserId());
}
return ResponseResult.success(userCollectionService.queryPersonTreeCollect(sysUser,novelTreePojo));
}

@PutMapping("/collection")
@SysLogs("收藏小说")
public ResponseResult addCollection(HttpServletRequest request,@RequestBody CollectionDto collectionDto){
if(StringUtils.isEmpty(collectionDto.getNovelId())){
throw RequestException.fail(CodeMsgEnums.ID_IS_EMPTY.getMsg());
}
SysUser sysUser = ShiroUtils.getSysUser(request);
return ResponseResult.success(userCollectionService.addCollection(sysUser,collectionDto.getNovelId()));
}

@DeleteMapping("/collection")
@SysLogs("取消收藏小说")
public ResponseResult cancelCollection(HttpServletRequest request,CollectionDto collectionDto){
SysUser sysUser = ShiroUtils.getSysUser(request);
if(StringUtils.isNotEmpty(collectionDto.getNovelId())){
userCollectionService.cancelCollection(sysUser,collectionDto.getNovelId());
}else if(StringUtils.isNotEmpty(collectionDto.getId())){
userCollectionService.removeById(collectionDto.getId());
}else if(!CollectionUtils.isEmpty(collectionDto.getIds())){
userCollectionService.removeByIds(collectionDto.getIds());
}else{
return ResponseResult.error(CodeMsgEnums.ID_IS_EMPTY.getMsg());
}
return ResponseResult.success();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
        log.error(e.getMessage(), e);
}
try (
InputStream inputStream=new FileInputStream(file);
OutputStream out=response.getOutputStream();
){
int b = 0;
byte[] buffer = new byte[1024];
while ((b = inputStream.read(buffer)) != -1) {
out.write(buffer, 0, b);
}
out.flush();
}catch (Exception e){
log.error(e.getMessage());
}
}

/**
* 更新epub小说
* @param sysUser
* @param novel
* @param file
* @param novelFile
* @return
*/
private Novel saveEpubNovelUpdate(SysUser sysUser, Novel novel, ReadFile file, MultipartFile novelFile) {
//解析文件生成小说章节数
EpubInfoPojo epubInfoPojo = novelChapterService.analysisEpubFile(sysUser, novelFile, file, novel);
Novel saveNovel = epubInfoPojo.getNovel();
if(StringUtils.isEmpty(saveNovel.getNovelTitle())){
saveNovel.setNovelTitle(StringUtils.getFileName(file.getFileName()));
}
return saveNovel;
}

/**
* 更新txt小说
* @param sysUser
* @param novel
* @param file
* @param novelFile
* @return
*/
private Novel saveTxtNovelUpdate(SysUser sysUser, Novel novel, ReadFile file, MultipartFile novelFile) {
//1、设置基本属性
//3、解析文件生成小说章节数
FileInfoPojo fileInfoPojo = novelChapterService.analysisTxtFile(sysUser, novelFile, file, novel);
//如果更新完没有名字,则把新文件的名字给他
if(StringUtils.isEmpty(novel.getNovelTitle())){
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
            for (String key : list) {
SysDict sysDict = sysDictMap.get(key);
typeList.add(sysDict);
}
List<String> values = list.stream().map(x -> sysDictMap.get(x).getDictValue()).collect(Collectors.toList());
record.setNovelType(StringUtils.listToCommaStr(values));
record.setNovelTypeDict(sysDicts);
record.setNovelTypes(typeList);
}
}

return page.setRecords(novelList);
}

@Override
public Novel getNovelInfo(SysUser sysUser, String id, Boolean isClick) {
Novel novel = this.getById(id);

this.checkNovelStatus(novel,sysUser);

String novelType = novel.getNovelType();
if(StringUtils.isNotEmpty(novelType)){
//查询小说类型
List<SysDict> sysDicts = sysDictMapper.selectList(new QueryWrapper<SysDict>()
.eq(SqlConstant.DICT_CLASS, DictEnums.NOVEL_TYPE.getKey())
.in(SqlConstant.DICT_KEY, StringUtils.commaStrToList(novelType)));
List<String> collect = sysDicts.stream().map(SysDict::getDictValue).collect(Collectors.toList());
novel.setNovelType(StringUtils.listToCommaStr(collect));
novel.setNovelTypeDict(sysDicts);
}
//如果是用户点进来的话,立马更新点击数和热度
if(isClick){
this.updateNovelHot(novel.getId());
}

List<NovelChapter> novelChapter = this.novelChapterService.getNovelChapter(sysUser, id);
novel.setChapterList(novelChapter);
return novel;
}

@Override
public void deleteNovel(List<String> ids) {
//1、删除小说表中的数据
this.removeByIds(ids);
//2、删除章节表中的数据
novelChapterService.remove(new QueryWrapper<NovelChapter>().in(SqlConstant.NOVEL_ID,ids));
}


项目链接:
https://javayms.github.io?id=351023491103200yl
https://javayms.pages.dev?id=351023491103200yl