(免费分享)基于springboot,vue在线小说系统

news2025/2/22 13:34:12

本系统功能包括: 普通用户端登录注册,小说的分类,日榜,月榜,年榜, 小说的阅读,分章节,小说的评论,收藏,推荐等等,以 及后台小说的维护,上架,编辑等等。

项目技术: Springboot + Maven + Mybatis + Vue + Redis
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package com.homework.web.controller;

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Date;
import java.util.HashMap;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.homework.exception.ControllerException;
import com.homework.web.pojo.Chapter;
import com.homework.web.service.ChapterService;
import com.homework.web.util.ResponseObject;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;

@RestController
@RequestMapping("/api/chapter")
@Api(tags = "共同前缀:/api/chapter", description = "ChapterController")
@Slf4j
public class ChapterController {

	@Autowired
	ChapterService chapterService;

	@PostMapping
	@ApiOperation("新增Chapter")
	@PreAuthorize("isAuthenticated()")
	public ResponseObject post(@RequestBody HashMap<String, String> data) {
		log.info("新增Chapter");
		if (data.get("title") == null || data.get("title").equals("")) {
			throw new ControllerException("volume_id不可为null");
		} else if (data.get("volume_id") == null || data.get("volume_id").equals("")) {
			throw new ControllerException("title不可为null,也不可为空字符串");
		} else if (data.get("chapterContent") == null || data.get("chapterContent").equals("")) {
			throw new ControllerException("chapterContent不可为null,也不可为空字符串");
		} else {
			try {
				// 文件夹
				File directory = new File(ResourceUtils.getURL("src").getPath() + "main/resources/static/txt/");
				if (!directory.exists()) {
					directory.mkdirs();
				}
				// 文件
				String content = new Date().getTime() + ".txt";
				File file2 = new File(directory, content);
				if (!file2.exists()) {
					file2.createNewFile();
				}
				// 往文件内写内容
				FileWriter fileWriter = new FileWriter(file2);
				fileWriter.write(data.get("chapterContent"));
				fileWriter.flush();
				fileWriter.close();
				Chapter chapter = new Chapter();
				chapter.setTitle(data.get("title"));
				chapter.setVolume_id(Integer.parseInt(data.get("volume_id")));
				chapter.setContent(content);
				return new ResponseObject("200", "操作成功", chapterService.insert(chapter));
			} catch (Exception e) {
				throw new ControllerException("操作失败");
			}
		}
	}

	@GetMapping
	@ApiOperation("查询Chapter")
	public ResponseObject get(Integer volume_id) {
		log.info("查询Chapter");
		if (volume_id == null) {
			throw new ControllerException("volume_id不可为null");
		} else {
			return new ResponseObject("200", "操作成功", chapterService.selectByVolume_id(volume_id));
		}
	}

	@GetMapping("/{id:[0-9]+}/last")
	@ApiOperation("查询上一章的Chapter")
	public ResponseObject getLast(@PathVariable Integer id) {
		log.info("查询上一章的Chapter");
		if (id == null) {
			throw new ControllerException("id不可为null");
		} else {
			Chapter chapter = chapterService.selectById(id);
			if (chapter == null) {
				throw new ControllerException("该id无法查找到chapter");
			} else {
				return new ResponseObject("200", "操作成功",
						chapterService.selectLastByVolume_idId(chapter.getVolume_id(), chapter.getId()));
			}
		}
	}

	@GetMapping("/{id:[0-9]+}/next")
	@ApiOperation("查询下一章的Chapter")
	public ResponseObject getNext(@PathVariable Integer id) {
		log.info("查询下一章的Chapter");
		if (id == null) {
			throw new ControllerException("id不可为null");
		} else {
			Chapter chapter = chapterService.selectById(id);
			if (chapter == null) {
				throw new ControllerException("该id无法查找到chapter");
			} else {
				return new ResponseObject("200", "操作成功",
						chapterService.selectNextByVolume_idId(chapter.getVolume_id(), chapter.getId()));
			}
		}
	}

	@GetMapping("/{id:[0-9]+}")
	@ApiOperation("查询Chapter")
	public ResponseObject getById(@PathVariable Integer id) {
		log.info("查询Chapter");
		if (id == null) {
			throw new ControllerException("id不可为null");
		} else {
			return new ResponseObject("200", "操作成功", chapterService.selectById(id));
		}
	}

	@GetMapping("/content")
	@ApiOperation("查询Chapter的content")
	public ResponseObject getContent(String content) {
		log.info("查询Chapter的content");
		if (content == null || content.equals("")) {
			throw new ControllerException("content不可为null,也不可为空字符串");
		} else {
			try {
				StringBuilder stringBuilder = new StringBuilder();
				File file = new File(new File(ResourceUtils.getURL("src").getPath() + "main/resources/static/txt/"),
						content);
				FileReader fileReader = new FileReader(file);
				char[] charArray = new char[1024];
				int length = 0;
				while ((length = fileReader.read(charArray)) != -1) {
					stringBuilder.append(new String(charArray, 0, length));
				}
				fileReader.close();
				return new ResponseObject("200", "操作成功", stringBuilder.toString());
			} catch (Exception e) {
				throw new ControllerException("找不到该章节的内容");
			}
		}
	}

	@PatchMapping("/content")
	@ApiOperation("修改Chapter的content")
	@PreAuthorize("isAuthenticated()")
	public ResponseObject patchContent(String content, @RequestBody HashMap<String, String> data) {
		log.info("修改Chapter的content");
		if (content == null || content.equals("")) {
			throw new ControllerException("content不可为null,也不可为空字符串");
		} else if (data.get("chapterContent") == null || data.get("chapterContent").equals("")) {
			throw new ControllerException("chapterContent不可为null,也不可为空字符串");
		} else {
			try {
				File file = new File(new File(ResourceUtils.getURL("src").getPath() + "main/resources/static/txt/"),
						content);
				FileWriter fileWriter = new FileWriter(file);
				fileWriter.write(data.get("chapterContent"));
				fileWriter.flush();
				fileWriter.close();
				return new ResponseObject("200", "操作成功", data.get("chapterContent"));
			} catch (Exception e) {
				throw new ControllerException("找不到该章节的内容");
			}
		}
	}

}

获取完整源码:
大家点赞、收藏、关注、评论啦 、查看 👇🏻 👇🏻 👇🏻微信公众号获取联系 👇🏻 👇🏻 👇🏻
免费领取下载链接-公众号输入口令:048

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/717507.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux服务器扩容VG时报错 Couldn‘t create temporary archive name

今天扩容磁盘遇到失败报错。 [rootmysql ~]# vgextend rhel /dev/sdc1 Couldnt create temporary archive name. 原因&#xff1a;磁盘使用100%&#xff0c;无法执行挂载&#xff0c;须预留部分空间出来。解决办法&#xff1a;删掉其中无用文件、log日志继续操作即可。释放空间…

SpringBoot+Vue实现文件上传功能

目录 1.后端代码部分&#xff1a; 2.前端代码部分 3.效果展示 1.后端代码部分&#xff1a; RestController RequestMapping("/file") public class FileController {private final String UPLOAD_PATH "D:/OBS/";//这里写上你需要上传的路径&#xff…

对于大连企业而言如何提升网站的曝光率

对于大连企业而言&#xff0c;提升网站的曝光率是非常重要的&#xff0c;可以通过以下几种方式来实现&#xff1a; 1. 优化网站结构和内容&#xff1a;确保网站的结构清晰&#xff0c;布局合理&#xff0c;并且内容丰富、有吸引力。网站的页面加载速度也要快&#xff0c;以提升…

leetcode 110. 平衡二叉树

2023.7.4 平衡二叉树 &#xff0c;经典题目 。需要利用到之前求二叉树高度的思路。 先定义一个求高度的函数&#xff0c;然后使用递归的方式判断左子树和右子树的高度差是否小于等于1&#xff0c;下面上代码&#xff1a; class Solution { public:int get_length(TreeNode* cu…

C语言学习(三十二)---动态内存(一)

在昨天的内容中&#xff0c;我们学习有关结构体和联合体在内存中存储的相关问题&#xff0c;由于粗心&#xff0c;有一个代码重复了&#xff0c;感谢这位朋友的提醒&#xff1a; 现在已经对内容进行了修改&#xff0c;感谢朋友们的支持。 今天我们将学习有关动态内存的相关问…

Android Studio 和 Android Gradle 插件的已知问题

Android Studio 的已知问题 渲染 Compose 预览时出错 从 Android Studio Chipmunk 开始&#xff0c;如果您在问题面板中看到 java.lang.NoSuchFieldError: view_tree_saved_state_registry_owner 或 java.lang.ClassNotFoundException: androidx.savedstate.R$id&#xff0c;…

大势速影:机载激光快速建模测绘装备

实景三维模型高逼真、高真实、高精度的展示地物的几何结构、纹理色彩、空间位置等信息&#xff0c;在当前测绘应急保障、规划等领域具备极大的应用价值。但是&#xff0c;激光雷达和倾斜摄影建模技术均无法较好的满足快速建模应用需求&#xff0c;具体表现在&#xff1a;激光点…

LiDAR SLAM 闭环——BoW3D: Bag of Words for Real-time Loop Closing in 3D LiDAR SLAM

先说总结 现算法已经开源&#xff0c;代码链接&#xff1a; GitHub - YungeCui/BoW3D: [RA-L] BoW3D: Bag of Words for Real-Time Loop Closing in 3D LiDAR SLAM. 背景 SLAM&#xff08;同时定位与地图构建&#xff09;是一种让机器人在构建环境地图的同时&#xff0c;定位…

zk集群启动异常:Error contacting service. It is probably not running.

# ./zkServer.sh status ZooKeeper JMX enabled by default Using config: /opt/aspire/product-kafka3.4/zookeeper/bin/../conf/zoo.cfg Error contacting service. It is probably not running. 查看 是否 iptables 限制了 端口访问&#xff0c; 2181端口&#xff0c; 需要把…

浅谈企业信息化能源管理系统的设计与应用

安科瑞 华楠 摘要: 我国的经济社会不断发展&#xff0c;对环境和资源造成的压力也越来越大。为了促进经济和社会的协调发展&#xff0c;可持续发展的理念被提出&#xff0c;企业信息化能源管理系统应运而生。将上述管理系统应用在企业之中&#xff0c;可以节约能源&#xff0…

Linux下输出带背景颜色和字体颜色的文本

最近在用Go语言开发项目&#xff0c;在跟踪Go底层实现时发现控制台输出的文本有样式&#xff0c;发现linux下在控制台输出可以控制文本样式&#xff0c;在此做个整理。 目录 1.发现 2.命令行输出测试 3.Linux下样式文本 1.发现 以下是我的一段Go代码&#xff1a;test_exec…

2023年07月IDE流行度最新排名

点击查看最新IDE流行度最新排名&#xff08;每月更新&#xff09; 2023年07月IDE流行度最新排名 顶级IDE排名是通过分析在谷歌上搜索IDE下载页面的频率而创建的 一个IDE被搜索的次数越多&#xff0c;这个IDE就被认为越受欢迎。原始数据来自谷歌Trends 如果您相信集体智慧&am…

那些无法避免的弯路

近日&#xff0c;某高校毕业生在校期间窃取学校内网数据&#xff0c;收集全校学生个人隐私信息的新闻引发了人们对互联网生活中个人信息安全问题的再度关注。在大数据时代&#xff0c;算法分发带来了隐私侵犯&#xff0c;在享受消费生活等便捷权利的同时&#xff0c;似乎又有不…

Pyformer: 内嵌局部机理的时序预测模型

待续 代码粗解 在 data_lorder.py文件中&#xff0c;定义了几个用于处理不同数据集的类&#xff0c;这里只关注Dataset_ETT_hour类。Dataset_ETT_hour类用来加载、处理ETTH数据集&#xff0c;主要包含以下4个方法&#xff1a;__read_data__&#xff0c; def __getitem__(sel…

Mybaits-Plus学习5 代码生成器

引入代码生成器依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.1</version> </dependency> <dependency><groupId>org.freemarker</groupId…

旅游卡app软件开发解决方案

旅游业的不断发展&#xff0c;旅游卡作为一种便捷的旅游方式越来越受到人们的青睐。旅游卡可以帮助游客节省旅游开支&#xff0c;同时也能让游客更好地规划自己的旅游行程。针对这种情况&#xff0c;开发一款旅游卡app软件是非常必要的。本文将介绍旅游卡app软件开发的解决方案…

mysql 视图

视图&#xff0c;是虚拟存在的表&#xff0c;视图中的数据在数据库中实际不存在&#xff0c;视图只保存查询SQL的逻辑&#xff0c;不保存查询结果 建表sql DROP TABLE IF EXISTS w_dict; CREATE TABLE w_dict (id int(0) NOT NULL AUTO_INCREMENT,label varchar(255) CHARACT…

rsync+intofy实时同步部署(上行、下行)

目录 一&#xff1a;rsync 远程同步 二&#xff1a;配置rsync源服务器 1、安装rsync 2、建立/etc/rsyncd.conf 配置文件 3、 为备份账户创建数据文件 4、 保证所有用户对源目录/var/www/html 都有读取权限 5、 启动 rsync 服务程序 6、关闭 rsync 服务 三&#xff1a; 发起…

华为OD机试(B卷)

华为OD机试&#xff08;B卷&#xff09; 有幸接到了华为OD的机试邀请&#xff0c;三道算法题。比较幸运的是&#xff0c;最后一题&#xff0c;也相对来说不算太难&#xff0c;没有抽到动态规划&#xff0c;还是花了大约90分钟&#xff0c;三道题都通过了&#xff0c;最终拿到了…

获得多线程的方法几种、callable接口与runnable接口的区别、callable接口使用

1、获得多线程的方法几种&#xff1f; &#xff08;1&#xff09;传统的是继承thread类和实现runnable接口&#xff0c;java5以后又有实现callable接口和java的线程池获得。 &#xff08;2&#xff09;函数式接口&#xff1a; 这是一个函数式接口&#xff0c;因此可以用作l…