当前位置:   article > 正文

小说网站|基于Springboot+Vue实现在线小说阅读网站_小说平台代码

小说平台代码

作者主页:编程千纸鹤

作者简介:Java、前端、Python开发多年,做过高程,项目经理,架构师

主要内容:Java项目开发、Python项目开发、大学数据和AI项目开发、单片机项目设计、面试技术整理、最新技术分享

收藏点赞不迷路  关注作者有好处

文末获得源码

项目编号:BS-PT-116

一,环境介绍

语言环境:Java:  jdk1.8

数据库:Mysql: mysql5.7

应用服务器:Tomcat:  tomcat8.5.31

开发工具:IDEA或eclipse

开发技术:Springboot+Vue

二,项目简介

本项目基于Springboot+Vue开发实现了一个在线小说阅读网站平台。系统设计用户主要有三类:读者、作者、管理员。用户注册时以读者身分进入平台,可以自己修改身分为作者。读者登录系统可以查看并在线阅读发布的小说章节内容,并在线评论、点赞和举报处理,同时可以查看平台发布的小说新闻和平台公告新闻。。作者登录平台除了可以查看小说外,还可以在线发布小说和内容,进行在线创作。所有的信息由平台管理员进行管理操作,包含人员管理、小说管理、章节管理、类型管理、举报管理、评论管理、新闻管理、系统管理(轮播图管理、超链接管理)等。

三,系统展示

系统首页

小说列表

小说阅读-点赞-举报

资讯信息查看

个人中心

草稿箱

个人评论管理

个人资料管理

管理员登录系统

作者管理

小说分类管理

小说管理

评论-举报-点赞管理

平台新闻管理和分类管理

系统管理

四,核心代码展示

  1. package com.spring.controller;
  2. import com.spring.util.DESUtil;
  3. import java.awt.*;
  4. import java.awt.image.BufferedImage;
  5. import java.io.IOException;
  6. import java.io.OutputStream;
  7. import java.util.Random;
  8. import javax.imageio.ImageIO;
  9. import javax.servlet.ServletOutputStream;
  10. import javax.servlet.http.HttpSession;
  11. import org.springframework.stereotype.Controller;
  12. import org.springframework.web.bind.annotation.RequestMapping;
  13. /**
  14. * 验证码控制器
  15. */
  16. @Controller
  17. public class CaptchaController extends BaseController {
  18. /**
  19. * 输出验证码图片,并记录session “random” 里等待登录时写入
  20. */
  21. @RequestMapping("/captcha")
  22. public String Index() {
  23. // 把验证码字符串写入session 中,保存待下次验证时使用
  24. String sRand = createRandomString(4);
  25. try {
  26. // 输出渲染好的内容到前端浏览器
  27. if (isAjax()) {
  28. String result = null;
  29. do {
  30. try {
  31. result = DESUtil.encrypt("CaptchControllerPassword", sRand);
  32. } catch (Exception e) {
  33. result = null;
  34. }
  35. if (result != null) {
  36. if (!sRand.equals(DESUtil.decrypt("CaptchControllerPassword", result))) {
  37. result = null; // 解不出来所以出错
  38. }
  39. }
  40. } while (result == null);
  41. assign("url", "/randtocaptch?captchToken=" + urlencode(result));
  42. assign("token", result);
  43. return json();
  44. } else {
  45. //byte[] img = xxx;
  46. response.setContentType("image/jpeg"); // 定义输出类型为 图片
  47. response.setHeader("Pragma", "No-cache"); // 设置为无缓存
  48. response.setHeader("Cache-Control", "no-cache"); // 设置为无缓存
  49. response.setDateHeader("Expires", 0); // 设置缓存时间为0秒后过期
  50. request.getSession().setAttribute("random", sRand);
  51. ServletOutputStream stream = response.getOutputStream();
  52. createCaptch(sRand, stream);
  53. stream.flush();
  54. stream.close();
  55. }
  56. } catch (Exception e) {
  57. e.printStackTrace();
  58. }
  59. return "success";
  60. }
  61. /**
  62. * url 编码,中文要进行编码输出
  63. * @param str
  64. * @return
  65. */
  66. public static String urlencode(Object str) {
  67. try {
  68. return java.net.URLEncoder.encode(String.valueOf(str), "UTF-8");
  69. } catch (Exception e) {
  70. e.printStackTrace();
  71. }
  72. return str.toString();
  73. }
  74. /**
  75. * 使用上面的加密字符串生成验证码
  76. * @return
  77. */
  78. @RequestMapping("/randtocaptch")
  79. public String getCaptch() throws IOException {
  80. String captchToken = request.getParameter("captchToken");
  81. String sRand = DESUtil.decrypt("CaptchControllerPassword", captchToken);
  82. HttpSession session = request.getSession();
  83. {
  84. //byte[] img = xxx;
  85. response.setContentType("image/jpeg"); // 定义输出类型为 图片
  86. response.setHeader("Pragma", "No-cache"); // 设置为无缓存
  87. response.setHeader("Cache-Control", "no-cache"); // 设置为无缓存
  88. response.setDateHeader("Expires", 0); // 设置缓存时间为0秒后过期
  89. ServletOutputStream stream = response.getOutputStream();
  90. createCaptch(sRand, stream);
  91. stream.flush();
  92. stream.close();
  93. }
  94. return "success";
  95. }
  96. private String createRandomString(int len) {
  97. // 生成随机数类
  98. Random random = new Random();
  99. String result = "";
  100. for (int i = 0; i < len; i++) {
  101. String rand = String.valueOf(random.nextInt(10));
  102. result += rand;
  103. }
  104. return result;
  105. }
  106. private void createCaptch(String randomstr, OutputStream stream) {
  107. int width = 60, height = 20; // 定义图片宽为 60 高度为 20
  108. // 创建图片缓冲区
  109. BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  110. // 获取渲染画板
  111. Graphics g = image.getGraphics();
  112. // 生成随机数类
  113. Random random = new Random();
  114. // 设置颜色
  115. g.setColor(getRandColor(200, 250));
  116. // 绘制矩形
  117. g.fillRect(0, 0, width, height);
  118. // 设置字体信息
  119. g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
  120. // 设置颜色信息
  121. g.setColor(getRandColor(160, 200));
  122. // 写入干扰线
  123. for (int i = 0; i < 155; i++) {
  124. int x = random.nextInt(width);
  125. int y = random.nextInt(height);
  126. int xl = random.nextInt(12);
  127. int yl = random.nextInt(12);
  128. g.drawLine(x, y, x + xl, y + yl);
  129. }
  130. // 写入验证码字符串
  131. for (int i = 0; i < randomstr.length(); i++) {
  132. String rand = randomstr.substring(i, i + 1); //String.valueOf(random.nextInt(10));
  133. g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));
  134. g.drawString(rand, 13 * i + 6, 16);
  135. }
  136. g.dispose(); // 释放画板
  137. try {
  138. // 输出渲染好的内容到前端浏览器
  139. ImageIO.write(image, "JPEG", stream);
  140. stream.flush();
  141. stream.close();
  142. } catch (Exception e) {
  143. e.printStackTrace();
  144. }
  145. }
  146. /**
  147. * 获取随机颜色
  148. * @param fc
  149. * @param bc
  150. * @return
  151. */
  152. protected Color getRandColor(int fc, int bc) {
  153. Random random = new Random();
  154. if (fc > 255) fc = 255;
  155. if (bc > 255) bc = 255;
  156. int r = fc + random.nextInt(bc - fc);
  157. int g = fc + random.nextInt(bc - fc);
  158. int b = fc + random.nextInt(bc - fc);
  159. return new Color(r, g, b);
  160. }
  161. }
  1. package com.spring.controller;
  2. import com.jntoo.db.*;
  3. import com.jntoo.db.utils.*;
  4. import com.spring.dao.*;
  5. import com.spring.entity.*;
  6. import com.spring.service.*;
  7. import com.spring.util.*;
  8. import com.spring.util.Info;
  9. import java.util.*;
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.stereotype.Controller;
  12. import org.springframework.web.bind.annotation.RequestMapping;
  13. import tk.mybatis.mapper.entity.Example;
  14. /**
  15. * 点赞 */
  16. @Controller
  17. public class DianzanController extends BaseController {
  18. @Autowired
  19. private DianzanMapper dao;
  20. @Autowired
  21. private DianzanService service;
  22. @Autowired
  23. private PinglunService serviceRead;
  24. /**
  25. * 后台列表页
  26. *
  27. */
  28. @RequestMapping("/dianzan_list")
  29. public String list() {
  30. // 检测是否有登录,没登录则跳转到登录页面
  31. if (!checkLogin()) {
  32. return showError("尚未登录", "./login.do");
  33. }
  34. String order = Request.get("order", "id"); // 获取前台提交的URL参数 order 如果没有则设置为id
  35. String sort = Request.get("sort", "desc"); // 获取前台提交的URL参数 sort 如果没有则设置为desc
  36. int pagesize = Request.getInt("pagesize", 12); // 获取前台一页多少行数据
  37. Example example = new Example(Dianzan.class); // 创建一个扩展搜索类
  38. Example.Criteria criteria = example.createCriteria(); // 创建一个扩展搜索条件类
  39. String where = " 1=1 "; // 创建初始条件为:1=1
  40. where += getWhere(); // 从方法中获取url 上的参数,并写成 sql条件语句
  41. criteria.andCondition(where); // 将条件写进上面的扩展条件类中
  42. if (sort.equals("desc")) { // 判断前台提交的sort 参数是否等于 desc倒序 是则使用倒序,否则使用正序
  43. example.orderBy(order).desc(); // 把sql 语句设置成倒序
  44. } else {
  45. example.orderBy(order).asc(); // 把 sql 设置成正序
  46. }
  47. int page = request.getParameter("page") == null ? 1 : Integer.valueOf(request.getParameter("page")); // 获取前台提交的URL参数 page 如果没有则设置为1
  48. page = Math.max(1, page); // 取两个数的最大值,防止page 小于1
  49. List<Dianzan> list = service.selectPageExample(example, page, pagesize); // 获取当前页的行数
  50. // 将列表写给界面使用
  51. assign("totalCount", request.getAttribute("totalCount"));
  52. assign("list", list);
  53. assign("orderby", order); // 把当前排序结果写进前台
  54. assign("sort", sort); // 把当前排序结果写进前台
  55. return json(); // 将数据写给前端
  56. }
  57. public String getWhere() {
  58. _var = new LinkedHashMap(); // 重置数据
  59. String where = " ";
  60. // 判断URL 参数pinglunid是否大于0
  61. if (Request.getInt("pinglunid") > 0) {
  62. // 大于0 则写入条件
  63. where += " AND pinglunid='" + Request.getInt("pinglunid") + "' ";
  64. }
  65. // 以下也是一样的操作,判断是否符合条件,符合则写入sql 语句
  66. if (!Request.get("dianzanren").equals("")) {
  67. where += " AND dianzanren LIKE '%" + Request.get("dianzanren") + "%' ";
  68. }
  69. return where;
  70. }
  71. /**
  72. * 评论人列表
  73. */
  74. @RequestMapping("/dianzan_list_pinglunren")
  75. public String listpinglunren() {
  76. // 检测是否有登录,没登录则跳转到登录页面
  77. if (!checkLogin()) {
  78. return showError("尚未登录", "./login.do");
  79. }
  80. String order = Request.get("order", "id"); // 获取前台提交的URL参数 order 如果没有则设置为id
  81. String sort = Request.get("sort", "desc"); // 获取前台提交的URL参数 sort 如果没有则设置为desc
  82. int pagesize = Request.getInt("pagesize", 12); // 获取前台一页多少行数据
  83. Example example = new Example(Dianzan.class); // 创建一个扩展搜索类
  84. Example.Criteria criteria = example.createCriteria(); // 创建一个扩展搜索条件类
  85. // 初始化一个条件,条件为:评论人=当前登录用户
  86. String where = " pinglunren='" + request.getSession().getAttribute("username") + "' ";
  87. where += getWhere();
  88. criteria.andCondition(where); // 将条件写入
  89. if (sort.equals("desc")) { // 注释同list
  90. example.orderBy(order).desc(); // 注释同list
  91. } else {
  92. example.orderBy(order).asc(); // 注释同list
  93. }
  94. int page = request.getParameter("page") == null ? 1 : Integer.valueOf(request.getParameter("page")); // 注释同list
  95. page = Math.max(1, page); // 注释同list
  96. List<Dianzan> list = service.selectPageExample(example, page, pagesize);
  97. assign("totalCount", request.getAttribute("totalCount"));
  98. assign("list", list);
  99. assign("orderby", order);
  100. assign("sort", sort);
  101. return json(); // 将数据写给前端
  102. }
  103. /**
  104. * 点赞人列表
  105. */
  106. @RequestMapping("/dianzan_list_dianzanren")
  107. public String listdianzanren() {
  108. // 检测是否有登录,没登录则跳转到登录页面
  109. if (!checkLogin()) {
  110. return showError("尚未登录", "./login.do");
  111. }
  112. String order = Request.get("order", "id"); // 获取前台提交的URL参数 order 如果没有则设置为id
  113. String sort = Request.get("sort", "desc"); // 获取前台提交的URL参数 sort 如果没有则设置为desc
  114. int pagesize = Request.getInt("pagesize", 12); // 获取前台一页多少行数据
  115. Example example = new Example(Dianzan.class); // 创建一个扩展搜索类
  116. Example.Criteria criteria = example.createCriteria(); // 创建一个扩展搜索条件类
  117. // 初始化一个条件,条件为:点赞人=当前登录用户
  118. String where = " dianzanren='" + request.getSession().getAttribute("username") + "' ";
  119. where += getWhere();
  120. criteria.andCondition(where); // 将条件写入
  121. if (sort.equals("desc")) { // 注释同list
  122. example.orderBy(order).desc(); // 注释同list
  123. } else {
  124. example.orderBy(order).asc(); // 注释同list
  125. }
  126. int page = request.getParameter("page") == null ? 1 : Integer.valueOf(request.getParameter("page")); // 注释同list
  127. page = Math.max(1, page); // 注释同list
  128. List<Dianzan> list = service.selectPageExample(example, page, pagesize);
  129. assign("totalCount", request.getAttribute("totalCount"));
  130. assign("list", list);
  131. assign("orderby", order);
  132. assign("sort", sort);
  133. return json(); // 将数据写给前端
  134. }
  135. @RequestMapping("/dianzan_add")
  136. public String add() {
  137. _var = new LinkedHashMap(); // 重置数据
  138. int id = Request.getInt("id"); // 根据id 获取 评论模块中的数据
  139. Pinglun readMap = serviceRead.find(id);
  140. // 将数据行写入给前台jsp页面
  141. assign("readMap", readMap);
  142. return json(); // 将数据写给前端
  143. }
  144. @RequestMapping("/dianzan_updt")
  145. public String updt() {
  146. _var = new LinkedHashMap(); // 重置数据
  147. int id = Request.getInt("id");
  148. // 获取行数据,并赋值给前台jsp页面
  149. Dianzan mmm = service.find(id);
  150. assign("mmm", mmm);
  151. assign("updtself", 0);
  152. return json(); // 将数据写给前端
  153. }
  154. /**
  155. * 添加内容
  156. * @return
  157. */
  158. @RequestMapping("/dianzaninsert")
  159. public String insert() {
  160. _var = new LinkedHashMap(); // 重置数据
  161. String tmp = "";
  162. Dianzan post = new Dianzan(); // 创建实体类
  163. // 设置前台提交上来的数据到实体类中
  164. post.setPinglunid(Request.getInt("pinglunid"));
  165. post.setBiao(Request.get("biao"));
  166. post.setBiaoid(Request.getInt("biaoid"));
  167. post.setBiaoti(Request.get("biaoti"));
  168. post.setPingfen(Request.get("pingfen"));
  169. post.setPinglunneirong(Request.get("pinglunneirong"));
  170. post.setPinglunren(Request.get("pinglunren"));
  171. post.setDianzanren(Request.get("dianzanren"));
  172. post.setPinglunid(Request.getInt("pinglunid"));
  173. Dianzan dz = DB.name(Dianzan.class).where("pinglunid" , post.getPinglunid()).where("dianzanren" , post.getDianzanren()).find();
  174. if(dz!= null){
  175. DB.name(Dianzan.class).delete(dz.getId());
  176. return jsonResult(-1);
  177. }
  178. service.insert(post); // 插入数据
  179. int charuid = post.getId().intValue();
  180. Query.execute("update pinglun set dianzanshu=dianzanshu+1 where id='" + request.getParameter("pinglunid") + "'");
  181. if (isAjax()) {
  182. return jsonResult(post);
  183. }
  184. return showSuccess("保存成功", Request.get("referer").equals("") ? request.getHeader("referer") : Request.get("referer"));
  185. }
  186. /**
  187. * 更新内容
  188. * @return
  189. */
  190. @RequestMapping("/dianzanupdate")
  191. public String update() {
  192. _var = new LinkedHashMap(); // 重置数据
  193. // 创建实体类
  194. Dianzan post = new Dianzan();
  195. // 将前台表单数据填充到实体类
  196. if (!Request.get("pinglunid").equals("")) post.setPinglunid(Request.getInt("pinglunid"));
  197. if (!Request.get("biao").equals("")) post.setBiao(Request.get("biao"));
  198. if (!Request.get("biaoid").equals("")) post.setBiaoid(Request.getInt("biaoid"));
  199. if (!Request.get("biaoti").equals("")) post.setBiaoti(Request.get("biaoti"));
  200. if (!Request.get("pingfen").equals("")) post.setPingfen(Request.get("pingfen"));
  201. if (!Request.get("pinglunneirong").equals("")) post.setPinglunneirong(Request.get("pinglunneirong"));
  202. if (!Request.get("pinglunren").equals("")) post.setPinglunren(Request.get("pinglunren"));
  203. if (!Request.get("dianzanren").equals("")) post.setDianzanren(Request.get("dianzanren"));
  204. post.setId(Request.getInt("id"));
  205. service.update(post); // 更新数据
  206. int charuid = post.getId().intValue();
  207. if (isAjax()) {
  208. return jsonResult(post);
  209. }
  210. return showSuccess("保存成功", Request.get("referer")); // 弹出保存成功,并跳转到前台提交的 referer 页面
  211. }
  212. /**
  213. * 删除
  214. */
  215. @RequestMapping("/dianzan_delete")
  216. public String delete() {
  217. _var = new LinkedHashMap(); // 重置数据
  218. if (!checkLogin()) {
  219. return showError("尚未登录");
  220. }
  221. int id = Request.getInt("id"); // 根据id 删除某行数据
  222. Map map = Query.make("dianzan").find(id);
  223. service.delete(id); // 根据id 删除某行数据
  224. Query.execute("update pinglun set dianzanshu=dianzanshu-1 where id='" + map.get("pinglunid") + "'");
  225. return showSuccess("删除成功", request.getHeader("referer")); //弹出删除成功,并跳回上一页
  226. }
  227. }

五,相关作品展示

基于Java开发、Python开发、PHP开发、C#开发等相关语言开发的实战项目

基于Nodejs、Vue等前端技术开发的前端实战项目

基于微信小程序和安卓APP应用开发的相关作品

基于51单片机等嵌入式物联网开发应用

基于各类算法实现的AI智能应用

基于大数据实现的各类数据管理和推荐系统

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/792313
推荐阅读
相关标签
  

闽ICP备14008679号