springboot在线小说阅读网站的设计与实现

news2025/2/28 4:20:57

网站首页:

  1. 用户登录/注册:用户注册时进行用户名及笔名存在的限制
  2. 热门小说推荐:显示小说名及作者名,点击进入对应小说
  3. 小说类别:玄幻,武侠,言情,历史等,点击对用分类到分类下所有小说
  4. 最新小说:显示新更新的小说名称,点击进入对应小说
  5. 查询:根据小说名/笔名进行查询

登录注册:

  1. 注册:用户注册时进行用户名及笔名存在的限制,存在则不能注册成功显示已存在
  2. 登录:登录有用户名密码及图片验证的校验

用户:

  1. 网站首页
  2. 个人信息管理:邮箱,用户名,笔名
  3. 对小说进行评价
  4. 在线阅读小说(收费作品需要充值才能浏览):章节目录,添加到书架,下一章的点击按钮
  5. 购买VIP:每本付费小说下都能跳转到充值界面,未充值的用户浏览收费小说自动跳转到充值界面,充值后显示VIP剩余日期
  6. 我的全部作品:添加小说(小说名,小说封面,收费/免费,小说分类,小说简介),删除小说,章节管理(更新章节,删除章节),更改小说完结状态
  7. 我的书架:可以进行查看及删除
  8. 阅读记录:可以进行查看及删除

后台管理:

  1. 用户管理:有删除用户的权限
  2. 订单管理:所有购买VIP的订单的删除及查询
  3. 书评管理:书评敏感词审查及删除
  4. 分类管理:添加删除分类,所管理的分类在用户添加小说时给一个下拉框进行选择

 

 

 

 

package com.novel.controller;


import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.novel.entity.Order;
import com.novel.entity.User;
import com.novel.service.OrderService;
import com.novel.util.AlipayConfig;
import com.novel.util.DateUtil;
import com.novel.util.Msg;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
/**
 * @Author: 
 * @Date: 2024/3/11 14:29
 * @Description: 订单管理
 */
@Controller
@RequestMapping("/order")
public class OrderController {
    @Autowired
    private OrderService orderService;

    /**
     * 跳转到后台订单管理
     * @return
     */
    @RequestMapping("show")
    public String show(){

        return "orderManage";
    }

    /**
     * 订单列表
     * @param pn
     * @return
     */
    @RequestMapping("/showjson")
    @ResponseBody
    public Msg getAllGoods(@RequestParam(value = "page",defaultValue = "1") Integer pn, HttpServletResponse response, Model model) {
        //一页显示几个数据
        PageHelper.startPage(pn, 10);
        List<Order> orderList = orderService.selectOrderList();
        orderList.forEach(order -> {
            order.setCreatetime1(DateUtil.getStringDate(order.getCreatetime()));
            order.setStarttime1(DateUtil.getStringDate(order.getStarttime()));
            order.setEndtime1(DateUtil.getStringDate(order.getEndtime()));
        });
        //显示几个页号
        PageInfo page = new PageInfo(orderList,5);
        return Msg.success("查询成功!").add("pageInfo", page);
    }

    /**
     * 删除
     * @param id
     * @return
     */
    @RequestMapping(value = "/delete/{id}", method = RequestMethod.DELETE)
    @ResponseBody
    public Msg deleteUser(@PathVariable("id")Integer id) {
        orderService.deleteByPrimaryKey(id);
        return Msg.success("删除成功!");
    }

    /**
     * 跳转到充值页面
     */
    @RequestMapping("toPayPage")
    public String toPayPage(HttpSession session, Model model){
        User user = (User) session.getAttribute("user");
        if(user==null){
            return "login";
        }
        Order order = orderService.selectOneOrder(user.getUserid());
        if(order!=null){
            int i = new Date().compareTo(order.getEndtime());
            if(i<0 || DateUtil.getStringDate(new Date()).equals(DateUtil.getStringDate(order.getEndtime()))){
                model.addAttribute("endtime",DateUtil.getStringDate(order.getEndtime()));
            }else{
                model.addAttribute("endtime","已过期,上次到期日:"+DateUtil.getStringDate(order.getEndtime()));
            }
        }else{
            model.addAttribute("endtime","无充值记录");
        }
        return "pay";
    }

    /**
     * 用户充值支付
     */
    @RequestMapping("userPay")
    public void pay(Integer month,HttpServletResponse rep, Model model,HttpSession session){
        User user = (User) session.getAttribute("user");
        session.setAttribute("month",month);
        //接入支付宝沙箱支付
//获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
        //设置请求参数
        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        alipayRequest.setReturnUrl(AlipayConfig.return_url);
        //alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
        try{
        //商户订单号,商户网站订单系统中唯一订单号,必填
        String out_trade_no = UUID.randomUUID().toString();
        //付款金额,必填
        int total = month*10;
        String total_amount =String.valueOf(total);
        //订单名称,必填
        String subject   ="用户"+user.getUsername()+"订单";
        //商品描述,可空
        String body = "";

        alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
                + "\"total_amount\":\""+ total_amount +"\","
                + "\"subject\":\""+ subject +"\","
                + "\"body\":\""+ body +"\","
                + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

        //请求
        String result = alipayClient.pageExecute(alipayRequest).getBody();

        rep.setContentType("text/html;charset=" + AlipayConfig.charset);
        //直接将完整的表单html输出到页面
        rep.getWriter().write(result);
        rep.getWriter().flush();
        rep.getWriter().close();
        }catch (Exception e){
           e.printStackTrace();
        }
     }

    /**
     * 支付成功以后回调
     * @return
     */
    @RequestMapping("payreturn")
     public String payreturn(HttpSession session,Model model){
        User user = (User) session.getAttribute("user");
        int month = (int) session.getAttribute("month");
        Order order = orderService.selectOneOrder(user.getUserid());
        int num=0;
        if(order!=null){
            int i = new Date().compareTo(order.getEndtime());
            if(i<0 || DateUtil.getStringDate(new Date()).equals(DateUtil.getStringDate(order.getEndtime()))){
                //更新
                order.setEndtime(DateUtil.subMonth(order.getEndtime(),month));
                order.setMonth(order.getMonth()+month);
                order.setTotalmoney(order.getTotalmoney()+(month*10));
                orderService.updateByPrimaryKey(order);
            }else{
                num++;
            }
        }else{
            num++;
        }

        if(num>0){
            order = new Order();
            order.setUserid(user.getUserid());
            order.setUsername(user.getUsername());
            order.setCreatetime(new Date());
            order.setStarttime(new Date());
            order.setEndtime(DateUtil.subMonth(new Date(),month));
            order.setMonth(month);
            order.setTotalmoney(month*10);
            orderService.insert(order);
        }
        session.setAttribute("uservip",1);
        return "redirect:/order/toPayPage";
     }

}

 

package com.novel.controller;

import com.novel.entity.Category;
import com.novel.entity.Novel;
import com.novel.entity.NovelDetails;
import com.novel.entity.User;
import com.novel.service.CategoryService;
import com.novel.service.NovelDetailsService;
import com.novel.service.NovelService;
import com.novel.util.DateUtil;
import com.novel.util.Msg;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.UUID;

@Controller
@RequestMapping("usernovel")
public class NovelController {
    @Autowired
    private NovelService novelService;
    @Autowired
    private NovelDetailsService novelDetailsService;
    @Autowired
    private CategoryService categoryService;


    @RequestMapping("queryNovel")
    public String queryNovel(Model model,Novel record){
        if(record==null){
            model.addAttribute("novelList",null);
        }else{
            List<Novel> novelList =  novelService.selectAllNovel(record);
            model.addAttribute("novelList",novelList);
        }

        return "serch";
    }

    @RequestMapping("addNovel")
    public String insert( Novel novel, @RequestParam MultipartFile fileToUpload, HttpServletRequest request, HttpServletResponse response, HttpSession session){
        User user = (User) session.getAttribute("user");
        novel.setUserid(user.getUserid());
        novel.setPenname(user.getPenname());
        novel.setCreatetime(DateUtil.getStringDate(new Date()));
        novel.setUpdatetime(DateUtil.getStringDate());
        novel.setEndfinsh(0);

        //上传图片
        String name = UUID.randomUUID().toString();
        String newFileName = name + ".jpg";
        File newFile = new File(request.getServletContext().getRealPath("/image"), newFileName);
        newFile.getParentFile().mkdirs();
        try {
            fileToUpload.transferTo(newFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
        novel.setImgpath("image/"+newFileName);
        Category category = categoryService.selectByPrimaryKey(novel.getCategoryId());
        novel.setCategoryName(category.getCategoryname());
        novelService.insert(novel);
        return "redirect:/usernovel/novelList";
    }

    /**
     * 我的所有小说
     * @param session
     * @param model
     * @return
     */
    @RequestMapping("novelList")
    public String novelList( HttpSession session,Model model){
        User user = (User) session.getAttribute("user");
        Novel novel123 = new Novel();
        novel123.setUserid(user.getUserid());
        List<Novel> novelList =  novelService.selectAllNovel(novel123);
        model.addAttribute("novelList",novelList);
        List<Category> categoryList = categoryService.selectByCategory();
        model.addAttribute("categoryList",categoryList);
        return "user_novel";
    }

    /**
     * 删除小说
     * @param novel
     * @return
     */
    @RequestMapping("/deleteNovel")
    @ResponseBody
    public Msg deleteAddr(Novel novel) {
        novelService.deleteByPrimaryKey(novel.getNovelid());
        return Msg.success("删除成功");
    }

    /**
     * 修改小说
     * @return
     */
    @RequestMapping("editNovel")
    public String editNovel(Novel novel,HttpSession session,Model model){
        novelService.updateByPrimaryKeySelective(novel);
        return "redirect:/usernovel/novelList";
    }

    /**
     * 完结小说
     * @return
     */
    @RequestMapping("endNovel")
    public String endNovel(Novel novel){
        novel.setEndfinsh(1);
        novelService.updateByPrimaryKeySelective(novel);
        return "redirect:/usernovel/novelList";
    }

    /**
     * 查询某个小说下所有章节
     */

    @RequestMapping("queryNovelByNovelId")
    public String queryNovelByNovelId(Integer novelId,Model model){
        Novel novel = novelService.selectByPrimaryKey(novelId);
        List<NovelDetails> novelDetailsList = novelDetailsService.selectAllNovelIdASC(novelId);
        model.addAttribute("novelDetailsList",novelDetailsList);
        model.addAttribute("novel",novel);
        return "user_novel_detail";
    }

    /**
     * 跳转到添加章节页面
     * @return
     */
     @RequestMapping("toAddUserNovelDetail")
    public String toAddUserNovelDetail(Model model,Integer novelId){
         Novel novel = novelService.selectByPrimaryKey(novelId);
         model.addAttribute("novel",novel);
         return "user_addnoveldetail";
    }

    /**
     * 添加小说章节
     * @param novelDetails
     * @return
     */
    @RequestMapping("addNovelDetail")
    public String addNovelDetail(NovelDetails novelDetails){
         String dateTime = DateUtil.getStringDate();
         novelDetails.setCreatetime(dateTime);
         novelDetailsService.insert(novelDetails);
        Novel novel = novelService.selectByPrimaryKey(novelDetails.getNovelid());
        novel.setUpdatetime(dateTime);
        novelService.updateByPrimaryKey(novel);
        return "redirect:/usernovel/queryNovelByNovelId?novelId="+novelDetails.getNovelid();
    }

    /**
     * 删除小说章节
     * @return
     */
    @RequestMapping("deleteNovekDetail")
    public String deleteNovekDetail(Integer detailsid,Integer novelId){
        NovelDetails novelDetails =  novelDetailsService.selectByPrimaryKey(detailsid);
        novelDetailsService.deleteByPrimaryKey(detailsid);
        return "redirect:/usernovel/queryNovelByNovelId?novelId="+novelDetails.getNovelid();
    }

}

 

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

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

相关文章

那些年的Java开发经验记录

Java同步锁(浅显易懂&#xff0c;精简讲解) 详细讲解可以看这篇文章Java对象锁和类锁全面解析&#xff08;多线程synchronized关键字&#xff09; 精简如下&#xff1a; 1.不管什么锁&#xff0c;都是属于对象锁(类也是一种对象) 2.一个对象只有一个锁 3.锁最大可以锁整个…

AcrelEMS-BP生物制药能效管理系统解决方案

安科瑞 崔丽洁 平台概述 AcrelEMS-BP生物制药能效管理系统集变电站综合自动化、电力监控、电能质量分析及治理、电气安全、能耗分析、照明控制、设备运维于一体。平台采用自动化、信息化技术和集中管理模式&#xff0c;对企业的生产、输配和消耗环节实行集中扁平化的动态监控和…

LTE鉴权失败原因分析

背景介绍&#xff1a;网络发鉴权加密申请后&#xff0c;收到用户响应后&#xff0c;同时又收到reject&#xff0c;reject code 是0x14&#xff0c;还不能确认是否鉴权参数设置问题引起的&#xff0c;欢迎各位专家来讨论及给建议。 reject code如下&#xff1a; 1、通过log&am…

赛码网-回文串 100%AC代码(C)

———————————————————————————————————— ⏩ 大家好哇&#xff01;我是小光&#xff0c;嵌入式爱好者&#xff0c;一个想要成为系统架构师的大三学生。 ⏩最近在准备秋招&#xff0c;一直在练习编程。 ⏩本篇文章对赛码网的回文串 题目做一个…

智慧家庭如何落地?三翼鸟把答案写在用户家里

近年来&#xff0c;学术界流行一句话&#xff0c;“把论文写在中国大地上”。 一项新技术从实验室到千万家&#xff0c;落地难、转化低&#xff0c;是技术创新经常碰到的问题。所以&#xff0c;如何让新技术扎根大地、扎根真实需求&#xff0c;普惠人间&#xff0c;是中国产学研…

Java并发编程第4讲——Java中的锁(知识扫盲)

目录 一、锁的相关概念 1.1 什么是锁 1.2 为什么需要锁 1.3 Java中锁的分类 二、synchronized关键字 2.1 三个特点 2.2 三种表现形式&#xff08;&#x1f64b;‍♂️&#xff09; 2.3 sychronized是怎么实现的&#xff08;&#x1f64b;‍♂️&#xff09; 2.4 JDK1.…

opencv基础52-图像轮廓学习05-凸包获取-cv2.convexHull()

逼近多边形是轮廓的高度近似&#xff0c;但是有时候&#xff0c;我们希望使用一个多边形的凸包来简化它。 凸包跟逼近多边形很像&#xff0c;只不过它是物体最外层的“凸”多边形。凸包指的是完全包含原有轮 廓&#xff0c;并且仅由轮廓上的点所构成的多边形。凸包的每一处都是…

SpringBoot3分库分表

标签&#xff1a;ShardingSphere5.分库.分表&#xff1b; 一、简介 分库分表的设计和实现方式&#xff0c;在之前的内容中总结过很多&#xff0c;本文基于SpringBoot3和ShardingSphere5框架实现数据分库分表的能力&#xff1b; 不得不提ShardingSphere5文档中描述的两个基本概…

伪类和伪元素有何区别?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 伪类&#xff08;Pseudo-class&#xff09;⭐ 伪元素&#xff08;Pseudo-element&#xff09;⭐ 区别总结⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前…

.NET Core反射获取带有自定义特性的类,通过依赖注入根据Attribute元数据信息调用对应的方法

前言 前段时间有朋友问道一个这样的问题&#xff0c;.NET Core中如何通过Attribute的元数据信息来调用标记的对应方法。我第一时间想到的就是通过C#反射获取带有Custom Attribute标记的类&#xff0c;然后通过依赖注入&#xff08;DI&#xff09;的方式获取对应服务的方法并通过…

应用在智能仓储温湿度监测系统中的温度传感芯片

近年来各行各业越来越重视产品的仓库、冷库存储环境&#xff0c;食品、药品、化工产品的保存都离不开冷库。温湿度是影响冷库环境的主要因素&#xff0c;建立实时的温湿度监控系统&#xff0c;保存查看完整的历史温湿度数据十分必要。 物资的保存对存储环境的质量要求较为严格…

Spring IoC 详解

目录 一、引言二、Spring Bean三、将一个类声明为 Bean 所涉及的注解四、Component 和 Bean 的区别五、注入 Bean 的注解六、Autowired 和 Resource 的区别七、Bean7.1 作用域7.2 线程安全7.3 生命周期 一、引言 IoC&#xff08;Inversion of Control:控制反转&#xff09; 是…

JUC线程池的实战问题引出的一系列原理问题

1 我们为什么需要使用线程池 线程过多会带来额外的开销&#xff0c;其中包括创建销毁线程的开销、调度线程的开销等等&#xff0c;同时也降低了计算机的整体性能。线程池维护多个线程&#xff0c;等待、监督、管理、分配可并发执行的任务。这种做法&#xff0c;一方面避免了处…

分享3款屏幕录制软件,一定要来看!

在数字化时代&#xff0c;屏幕录制软件成为了一个必不可少的工具。它可以帮助用户捕捉并记录计算机屏幕上的活动&#xff0c;因此选择一款功能强大、易于使用的屏幕录制软件至关重要。本文将介绍3款备受好评的屏幕录制软件&#xff0c;通过本文的阅读&#xff0c;您将了解到它们…

Android图形-刷新与显示

目录 屏幕显示原理&#xff1a; 显示刷新的过程 VSYNC机制具体实现 小结&#xff1a; 屏幕显示原理&#xff1a; 过程描述&#xff1a; 应用向系统服务申请buffer 系统服务返回一个buffer给应用 应用开始绘制&#xff0c;绘制完成就提交buffer&#xff0c;系统服务把buffer数据…

两年了^

我也想不到是到了现在 记得刚来腾讯工作半年时候&#xff0c;我写了一篇文章 在腾讯的这半年 之后&#xff0c;又经过了半年时间&#xff0c;我又写了一篇总结文章 一年了 现在又过了一年多&#xff0c;本想把两年的入职截图留下&#xff0c;之前因为微信存储太大把微信卸载后重…

实现功能:ChatGPT 微信助手可以自动搜索网络信息回答问题

“ ChatGPT微信助手升级内测功能上线&#xff01;原先只能回答通用问题,现在遇到需要查询具体信息的问题也不愁啦。” 01 — 最近&#xff0c;上线了ChatGPT微信助手的体验群&#xff1a;《ChatGPT 微信助手上线&#xff01;问答更便捷&#xff0c;功能持续升级中。》&#xff…

Android高手进阶教程(一)-------Android常用名令集锦(图文并茂)!

大家好&#xff0c;今天我们要讲的是android开发中&#xff0c;比较常用的名令集锦&#xff0c; 在我们开发中难免用到Android命令&#xff0c;有些确实命令确实很有用处。 特别对于一些初学者来说&#xff0c;命令根本没有想过用也不会用&#xff0c;比如他们想安装一个.apk文…

以太网网络安全协议(十三)

一、IPsec协议 IPsec。它是指在IP首部的后面追加“封装安全有效载荷”&#xff08;ESP&#xff09;和“认证首部”&#xff08;AH&#xff09; &#xff0c;从而对此后的数据进行加密&#xff0c;不被盗取者轻易解读。 二、TLS/SLL协议 SSL最早由网景公司提出&#xff0c;标准化…

架构设计第42讲:美团 - 可视化全链路日志追踪

架构设计第42讲&#xff1a;美团 - 可视化全链路日志追踪 目前在分布式场景下&#xff0c;业务追踪的主流实现方式包括两类&#xff0c;一类是基于日志的ELK方案&#xff0c;一类是基于单次请求调用的会话跟踪方案。然而随着业务逻辑的日益复杂&#xff0c;上述方案越来越不适用…