N-133基于springboot,vue小说网站

开发工具:IDEA

服务器:Tomcat9.0, jdk1.8

项目构建:maven

数据库:mysql5.7

系统分前后台,项目采用前后端分离

前端技术:vue+elementUI

服务端技术:springboot+mybatis-plus

本项目分为管理员与普通用户两种角色

一、用户功能:

1.登录、注册、退出登录

2.首页、搜索、阅读小说,添加书签、添加收藏、取消收藏

3.我的书架:新建文件夹、下载全部、我要上传、搜素小说

4.我的上传:查看、编辑、删除、下载、发布小说

5.我的书签:查询、编辑、删除

6.阅读历史:查询、删除

7.个人信息:修改个人信息

8.个人动态:显示所有个人发布的动态信息

9.安全管理:修改邮箱和修改密码

二、管理员功能:

1.用户管理:查询、删除、详情、禁用

2.动态管理:查询、删除

3.小说管理:上传小说、查看详情、下载小说、编辑、删除

4.小说审核:通过、驳回、禁用

5.书签管理:查询、按进度查看,编辑、删除

6.收藏管理:查询、删除

7.管理员设置:修改密码,添加管理员

8.公告管理:发布公告、编辑、查询、删除

用户截图:

 

 

 

管理员截图:

 

 

package com.wpy.controller;


import com.wpy.annotation.SysLogs;
import com.wpy.dto.DownloadDto;
import com.wpy.dto.NovelDto;
import com.wpy.dto.NovelUploadDto;
import com.wpy.entity.Novel;
import com.wpy.entity.SysUser;
import com.wpy.enums.CodeMsgEnums;
import com.wpy.exception.RequestException;
import com.wpy.service.NovelService;
import com.wpy.utils.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.List;

/**
 * <p>
 * 小说数据表 前端控制器
 * </p>
 */
@RestController
@RequestMapping("/novel")
@Slf4j
public class NovelController {

    @Autowired
    private NovelService novelService;

    @PostMapping("/upload")
    @SysLogs("小说上传")
    public ResponseResult uploadNovel(HttpServletRequest request,NovelUploadDto novelUploadDto){
        try{
            if(novelUploadDto.getNovelFiles().length==0){
                throw RequestException.fail("文件不能为空");
            }
            SysUser sysUser = ShiroUtils.getSysUser(request);
            novelService.uploadNovel(sysUser,novelUploadDto);
            return ResponseResult.success();
        }catch (Exception e){
            log.error(e.getMessage(),e);
            return ResponseResult.error();
        }
    }

    @PostMapping("/updateNovel")
    @SysLogs("小说修改")
    public ResponseResult updateNovel(HttpServletRequest request,NovelUploadDto novelUploadDto){
        if(StringUtils.isEmpty(novelUploadDto.getId())){
            throw RequestException.fail(CodeMsgEnums.ID_IS_EMPTY.getMsg());
        }
        try{
            SysUser sysUser = ShiroUtils.getSysUser(request);
            novelService.updateNovel(sysUser,novelUploadDto);
            return ResponseResult.success();
        }catch (Exception e){
            log.error(e.getMessage(),e);
            return ResponseResult.error();
        }
    }

    @GetMapping("/list")
    @SysLogs("小说列表")
    public ResponseResult getNovelList(HttpServletRequest request,NovelDto novelDto){
        SysUser sysUser = RequestUtils.getSysUser(request);
        return ResponseResult.success(novelService.getNovelList(sysUser,novelDto));
    }

    @GetMapping("/novelInfo")
    @SysLogs("获取小说信息")
    public ResponseResult getNovelInfo(HttpServletRequest request,@RequestParam("id")String id,@RequestParam("isClick")Boolean isClick){
        if(StringUtils.isEmpty(id)){
            throw RequestException.fail(CodeMsgEnums.ID_IS_EMPTY.getMsg());
        }
        SysUser sysUser = RequestUtils.getSysUser(request);
        return ResponseResult.success(novelService.getNovelInfo(sysUser,id,isClick));
    }

    @DeleteMapping("/deleteNovel")
    @SysLogs("删除小说")
    public ResponseResult deleteNovel(@RequestParam("ids")List<String> ids){
        if(CollectionUtils.isEmpty(ids)){
            throw RequestException.fail(CodeMsgEnums.ID_IS_EMPTY.getMsg());
        }
        novelService.deleteNovel(ids);
        return ResponseResult.success();
    }

    @GetMapping("/download")
    @SysLogs("下载小说")
    public void downloadNovel(HttpServletRequest request, HttpServletResponse response, @RequestParam("params") String params){
        try {
            SysUser sysUser = ShiroUtils.getSysUser(request);
            String param = URLDecoder.decode(params, "UTF-8");
            DownloadDto downloadDto = JsonUtils.jsonStrToObject(param, DownloadDto.class);
            this.novelService.downloadNovel(request,response,downloadDto,sysUser);
        } catch (UnsupportedEncodingException e) {
            throw RequestException.fail("参数错误");
        }
    }

    @PostMapping("/public")
    @SysLogs("发布小说")
    public ResponseResult publicNovel(HttpServletRequest request,@RequestBody NovelDto novelDto){
        if(StringUtils.isEmpty(novelDto.getId())&&CollectionUtils.isEmpty(novelDto.getIds())){
            throw RequestException.fail(CodeMsgEnums.ID_IS_EMPTY.getMsg());
        }
        SysUser sysUser = ShiroUtils.getSysUser(request);
        this.novelService.publicNovel(sysUser,novelDto);
        return ResponseResult.success();
    }

    @PostMapping("/cancelPublic")
    @SysLogs("取消发布")
    public ResponseResult cancelPublic(HttpServletRequest request,@RequestBody NovelDto novelDto){
        if(StringUtils.isEmpty(novelDto.getId())&&CollectionUtils.isEmpty(novelDto.getIds())){
            throw RequestException.fail(CodeMsgEnums.ID_IS_EMPTY.getMsg());
        }
        SysUser sysUser = ShiroUtils.getSysUser(request);
        this.novelService.cancelPublic(sysUser,novelDto);
        return ResponseResult.success();
    }

    @PostMapping("/audit")
    @SysLogs("审核小说")
    public ResponseResult auditNovel(HttpServletRequest request,@RequestBody NovelDto novelDto){
        if(StringUtils.isEmpty(novelDto.getId())&&CollectionUtils.isEmpty(novelDto.getIds())){
            throw RequestException.fail(CodeMsgEnums.ID_IS_EMPTY.getMsg());
        }
        SysUser sysUser = ShiroUtils.getSysUser(request);
        this.novelService.auditNovel(sysUser,novelDto);
        return ResponseResult.success();
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

141.环形链表(LeetCode)

想法一 快慢指针&#xff0c;设置slow和fast指针&#xff0c;slow一次走一步&#xff0c;fast一次走两步&#xff0c;如果链表有环&#xff0c;它们最终会相遇&#xff0c;相遇时返回true&#xff1b;如果链表无环&#xff0c;它们最终走到空&#xff0c;跳出循环&#xff0c;…

企业邮箱本地私有化部署解决方案

随着互联网化进程不断深入&#xff0c;加快推进企业信息化系统建设&#xff0c;已经成为提高企业核心竞争力的重要途径。企业对企业邮箱系统的需求越来越大&#xff0c;企业邮箱系统作为企业级通讯工具中的利器&#xff0c;在协同办公和内外业务交流上发挥着无可替代的巨大作用…

国际阿里云:Windows系统ECS实例中CPU使用率较高问题的排查及解决方案!!

问题现象 Windows系统ECS实例中CPU使用率较高&#xff0c;即CPU使用率≥80%。 问题原因 CPU使用率较高可能有以下原因。 ECS实例遭到病毒木马入侵。 ECS实例中第三方杀毒软件运行。 ECS实例中应用程序异常、驱动异常、高I/O使用率或高中断处理的应用程序。 解决方案 步骤…

[工业自动化-13]:西门子S7-15xxx编程 - 分布式从站 - 硬件配置

目录 前言&#xff1a; 一、通过博图软件完成对ET200 SP分布式从站的硬件配置 二、从站组态配置的常见问题与解决 三、分布式从站与CPU的profiNet连接 3.1 概述 3.2 配置主站与从站的profinet连接 四、Profinet和普通以太网区别 4.1 概述 4.2 协议栈 五、主站与从站连…

将复数中的虚部取反 即对复数求共轭 numpy.conjugate()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 将复数中的虚部取反 即对复数求共轭 numpy.conjugate() [太阳]选择题 请问以下代码中执行语句输出结果是&#xff1f; import numpy as np a np.array([1 2j, 3 - 4j]) print("【显示…

图论13-最小生成树-Kruskal算法+Prim算法

文章目录 1 最小生成树2 最小生成树Kruskal算法的实现2.1 算法思想2.2 算法实现2.2.1 如果图不联通&#xff0c;直接返回空&#xff0c;该图没有mst2.2.2 获得图中的所有边&#xff0c;并且进行排序2.2.2.1 Edge类要实现Comparable接口&#xff0c;并重写compareTo方法 2.2.3 取…

SAM + YOLO 智能抠图

在计算机视觉领域&#xff0c;对象检测和实例分割是使机器能够理解视觉数据并与之交互的关键任务。 准确识别和隔离图像中的物体的能力具有许多实际应用&#xff0c;从自动驾驶车辆到医学成像。 在这篇博文中&#xff0c;我们将探索如何在 Roboflow 和 Ultralytics YOLOv8 的帮…

服务器安全组端口规则配置手册

具体操作如下&#xff1a; 1、配置规则 进入服务器实例列表&#xff0c;服务器&#xff0c;选择安全组&#xff0c;点击右侧配置规则 2、添加安全组规则 点击右上方添加安全组规则 3、添加端口 添加6个端口&#xff1a;80,21,8888,888,443,3306&#xff0c;授权对象&#x…

openEuler编译安装nmon性能监控工具及可视化分析工具

ln 介绍 nmon&#xff08;short for Nigel’s Monitor&#xff09;是一个性能分析工具&#xff0c;由蓝色巨人IBM开发&#xff0c;最早用于自家操作系统UNIX&#xff0c;AIX &#xff08;Advanced Interactive eXecutive&#xff09;。现在也能用在Linux上。它可以显示系统的…

跨域:利用JSONP、WebSocket实现跨域访问

跨域基础知识点&#xff1a;跨域知识点 iframe实现跨域的四种方式&#xff1a;http://t.csdnimg.cn/emgFr 注&#xff1a;本篇中使用到的虚拟主机也是上面iframe中配置的 目录 JSONP跨域 JSONP介绍 跨域实验&#xff1a; WebSocket跨域 websocket介绍 跨域实验 JSONP跨域…

Javaweb之javascript的DOM对象的详细解析

1.5.3 DOM对象 1.5.3.1 DOM介绍 DOM&#xff1a;Document Object Model 文档对象模型。也就是 JavaScript 将 HTML 文档的各个组成部分封装为对象。 DOM 其实我们并不陌生&#xff0c;之前在学习 XML 就接触过&#xff0c;只不过 XML 文档中的标签需要我们写代码解析&#x…

前端如何结合mock模拟假数据

由于某人不想写后端接口&#xff0c;不想用真数据对接vue-element-admin框架&#xff0c;用以前的接口&#xff0c;改token有点点麻烦&#xff0c;所以咱试试mock.js

基于GPTs个性化定制SCI论文专业翻译器

1. 什么是GPTs GPTs是OpenAI在2023年11月6日开发者大会上发布的重要功能更新&#xff0c;允许用户根据特定需求定制自己的ChatGPT模型。 Introducing GPTs 官方介绍页面https://openai.com/blog/introducing-gpts 在原有自定义ChatGPT的流程中&#xff0c;首先需要自己编制p…

Linux学习教程(第二章 Linux系统安装)1

第二章 Linux系统安装 学习 Linux&#xff0c;首先要学会搭建 Linux 系统环境&#xff0c;也就是学会在你的电脑上安装 Linux 系统。 很多初学者对 Linux 望而生畏&#xff0c;多数是因为对 Linux 系统安装的恐惧&#xff0c;害怕破坏电脑本身的系统&#xff0c;害怕硬盘数据…

计算机网络——物理层-传输方式(串行传输、并行传输,同步传输、异步传输,单工、半双工和全双工通信)

目录 串行传输和并行传输 同步传输和异步传输 单工、半双工和全双工通信 串行传输和并行传输 串行传输是指数据是一个比特一个比特依次发送的。因此在发送端和接收端之间&#xff0c;只需要一条数据传输线路即可。 并行传输是指一次发送n个比特&#xff0c;而不是一个比特&…

C/C++(a/b)*c的值 2021年6月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C(a/b)*c的值 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C(a/b)*c的值 2021年6月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 给定整数a、b、c&#xff0c;计算(a / b)*c的值&…

C#,数值计算——函数计算,Eulsum的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class Eulsum { private double[] wksp { get; set; } private int n { get; set; } private int ncv { get; set; } public bool cnvgd { get; set; } pri…

2023数据安全战场回顾:迅软科技助您稳固阵线

随着各行业的数字化转型不断深入&#xff0c;数据安全逐步进入法制化的强监管时代。然而&#xff0c;由于人为攻击、技术漏洞和监管缺位等原因&#xff0c;各种数据泄露事件频繁发生&#xff0c;企业数据安全威胁日益严峻。 以下是我对2023年第三季度安全事件的总结&#xff0c…

Maven Profile组设置

application.properties中xxxx

JS实现数据结构与算法

队列 1、普通队列 利用数组push和shif 就可以简单实现 2、利用链表的方式实现队列 class MyQueue {constructor(){this.head nullthis.tail nullthis.length 0}add(value){let node {value}if(this.length 0){this.head nodethis.tail node}else{this.tail.next no…