在线小说网站的设计与实现(附源码)

news/2024/5/10 11:53:57/文章来源:https://blog.csdn.net/weixin_34194359/article/details/90535272

最近在做一个课程设计,在线小说网站的设计,以下是课题要求,需要项目练手的童鞋可以试试身手。

由于最近新学了JavaEE,所以采用了jsp+servlet来写,前端部分用了少量的js和jQuery处理,数据库用了MySQL,开发平台是myeclipse。

发布文章时直接插入数据库会没有分段,这里的解决办法是引入第三方工具wangEditor(wangEditor 是一款基于javascript和css开发的html富文本编辑器,开源免费。产品第一版发布于2014年11月。关于该编辑器:http://www.kancloud.cn/wangfupeng/wangeditor2/113961)


首先数据库的设计结构:

/*
Navicat MySQL Data TransferSource Server         : blog
Source Server Version : 50528
Source Host           : localhost:3306
Source Database       : novelTarget Server Type    : MYSQL
Target Server Version : 50528
File Encoding         : 65001Date: 2016-12-31 16:04:07
*/SET FOREIGN_KEY_CHECKS=0;-- ----------------------------
-- Table structure for admin
-- ----------------------------
DROP TABLE IF EXISTS `admin`;
CREATE TABLE `admin` (`id` int(11) NOT NULL AUTO_INCREMENT,`adminName` varchar(255) NOT NULL,`adminPassword` varchar(255) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;-- ----------------------------
-- Table structure for author
-- ----------------------------
DROP TABLE IF EXISTS `author`;
CREATE TABLE `author` (`id` int(11) NOT NULL AUTO_INCREMENT,`authorName` varchar(255) NOT NULL,`authorPassword` varchar(255) NOT NULL,`authorEmail` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8;-- ----------------------------
-- Table structure for comment
-- ----------------------------
DROP TABLE IF EXISTS `comment`;
CREATE TABLE `comment` (`id` int(11) NOT NULL AUTO_INCREMENT,`context` text,`createdTime` datetime DEFAULT NULL,`readerName` varchar(255) DEFAULT NULL,`novelId` int(11) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=67 DEFAULT CHARSET=utf8;-- ----------------------------
-- Table structure for genre
-- ----------------------------
DROP TABLE IF EXISTS `genre`;
CREATE TABLE `genre` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`sort` int(11) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8;-- ----------------------------
-- Table structure for novel
-- ----------------------------
DROP TABLE IF EXISTS `novel`;
CREATE TABLE `novel` (`id` int(11) NOT NULL AUTO_INCREMENT,`title` varchar(255) NOT NULL,`context` text NOT NULL,`createdTime` datetime DEFAULT NULL,`genreId` int(11) DEFAULT NULL,`voteNumber` int(11) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=160 DEFAULT CHARSET=utf8;-- ----------------------------
-- Table structure for reader
-- ----------------------------
DROP TABLE IF EXISTS `reader`;
CREATE TABLE `reader` (`id` int(11) NOT NULL AUTO_INCREMENT,`readerName` varchar(255) NOT NULL,`readerPassword` varchar(255) NOT NULL,`readerEmail` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8;

项目的大致结构如图:


由于功能有点多,这里先介绍后台的实现,管理后台和前台互不交涉。

登录界面



后台主页:

1,小说管理


2,作者管理:


3,增加分类


后台其他导航页面基本雷同,这里不做一一介绍。

后台管理员登录处理代码:

public class Admin {Conn conn=new Conn();/*** 判断登陆用户是否合法* @param adminName* @param adminPassword* @return* @throws SQLException*/public boolean isExist(String adminName,String adminPassword)throws SQLException{boolean result=false;AdminInfo ainfo=new AdminInfo();String sql="select * from admin a where adminName='"+adminName+"'and adminPassword='"+adminPassword+"'";System.out.println(sql);ResultSet rs=conn.executeQuery(sql);if(rs.next()){ainfo.setAdminName(rs.getString("adminName"));ainfo.setAdminPassword(rs.getString("adminPassword"));result=true;}conn.close();return result;}
}

小说展示,管理,增加,删除,更新的代码处理:

public class Novel {Conn conn=new Conn();/*** 获取小说列表* @param keyword* @return* @throws SQLException*/public List<NovelInfo>getList(String keyword)throws SQLException{List<NovelInfo> list=new ArrayList<NovelInfo>();String sql="select n.*,g.name as genreName from novel n left join genre g on n.genreId=g.id";if(DataValidator.isNullOrEmpty(keyword)){sql=sql+ " order by id desc";}else{sql=sql+" where n.title like '%"+keyword+"%' order by id desc";}ResultSet rs=conn.executeQuery(sql);while(rs.next()){NovelInfo ninfo=new NovelInfo();ninfo.setId(rs.getInt("Id"));ninfo.setTitle(rs.getString("Title"));ninfo.setContext(rs.getString("Context"));ninfo.setCreatedTime(rs.getDate("CreatedTime"));ninfo.setGenreId(rs.getInt("GenreId"));ninfo.setGenreName(rs.getString("genreName"));ninfo.setVoteNumber(rs.getInt("voteNumber"));list.add(ninfo);}conn.close();return list;}/*** 获取某分类下的小说列表* @param classId* @return* @throws SQLException*/public List<NovelInfo> getListBygenreId(int genreId) throws SQLException{List<NovelInfo> list=new ArrayList<NovelInfo>();String sql="select n.*,g.name as genreName from novel n left join genre g on n.genreId=g.id"+ " where n.genreId="+genreId+" order by id desc";ResultSet rs=conn.executeQuery(sql);while(rs.next()){NovelInfo info=new NovelInfo();info.setId(rs.getInt("Id"));info.setTitle(rs.getString("Title"));info.setContext(rs.getString("Context"));info.setCreatedTime(rs.getDate("CreatedTime"));info.setGenreId(rs.getInt("GenreId"));info.setGenreName(rs.getString("genreName"));info.setVoteNumber(rs.getInt("voteNumber"));list.add(info);}conn.close();return list;}/*** 根据ID获取小说* @param id* @return* @throws SQLException*/public NovelInfo getNovelInfo(int id) throws SQLException{NovelInfo info=new NovelInfo();String sql="select n.*,g.name as genreName from novel n left join genre g on n.genreId=g.id where n.id="+id+"";ResultSet rs=conn.executeQuery(sql);while(rs.next()){info.setId(rs.getInt("Id"));info.setTitle(rs.getString("Title"));info.setContext(rs.getString("Context"));info.setCreatedTime(rs.getDate("CreatedTime"));info.setGenreId(rs.getInt("GenreId"));info.setGenreName(rs.getString("genreName"));info.setVoteNumber(rs.getInt("voteNumber"));}conn.close();return info;}/*** 写入新小说* * @param info* @return*/public int insert(NovelInfo info){String sql="insert into novel(title,conText,createdTime,genreId,voteNumber)values";sql=sql+"('"+info.getTitle()+"','"+info.getContext()+"',now(),'"+info.getGenreId()+"',"+info.getVoteNumber()+")";int result=0;System.out.println(sql);result=conn.executeUpdate(sql);conn.close();return result;}/***更新小说* @param info* @return*/public int update(NovelInfo info){String sql="update novel set "+" Title='"+info.getTitle()+"',Context='"+info.getContext()+"',"+ "genreId='"+info.getGenreId()+"'where id="+info.getId()+"";int result=0;System.out.println(sql);result=conn.executeUpdate(sql);conn.close();return result;}/*** 删除小说* @param id* @return*/public int delete(int id){String sql="delete from novel where id="+id+"";int result=0;result=conn.executeUpdate(sql);conn.close();return result;}/*** 增加票数* @return*/public int addVote(int num){return 0;}
}

小说评论展示,管理,增加,删除,更新的代码处理:

public class Comment {Conn conn=new Conn();/*** 获取评论列表* @return* @throws SQLException*/public List<CommentInfo> getList() throws SQLException{List<CommentInfo> list=new ArrayList<CommentInfo>();String sql="select * from comment order by id desc";ResultSet rs=conn.executeQuery(sql);while(rs.next()){CommentInfo info=new CommentInfo();info.setId(rs.getInt("Id"));info.setContext(rs.getString("Context"));info.setNovelId(rs.getInt("NovelId"));info.setCreatedTime(rs.getDate("CreatedTime"));info.setReaderName(rs.getString("ReaderName"));list.add(info);System.out.print(list);}conn.close();return list;}/*** * @param classId* @return* @throws SQLException*/public CommentInfo getCommentInfo(int id)throws SQLException{CommentInfo info=new CommentInfo();String sql="select * from Comment c where id="+id+"";ResultSet rs=conn.executeQuery(sql);while(rs.next()){info.setId(rs.getInt("Id"));info.setContext(rs.getString("Context"));info.setNovelId(rs.getInt("NovelId"));info.setCreatedTime(rs.getDate("CreatedTime"));info.setReaderName(rs.getString("ReaderName"));}conn.close();return info;}/***  获取某小说下的评论* @param id* @return* @throws SQLException*/public List<CommentInfo> getListByNovelId(int novelid) throws SQLException{List<CommentInfo> list=new ArrayList<CommentInfo>();String sql="select * from comment  where novelId="+novelid+" order by id desc";ResultSet rs=conn.executeQuery(sql);while(rs.next()){CommentInfo info=new CommentInfo();info.setId(rs.getInt("Id"));info.setContext(rs.getString("Context"));info.setNovelId(rs.getInt("NovelId"));info.setCreatedTime(rs.getDate("CreatedTime"));info.setReaderName(rs.getString("ReaderName"));list.add(info);}conn.close();return list;}/*** 插入评论* @param info* @return*/public int insert(CommentInfo info){String sql="insert into Comment(Context,CreatedTime,readerName,novelId)values";sql=sql+"('"+info.getContext()+"',now(),'"+info.getReaderName()+"',"+info.getNovelId()+")";int result=0;System.out.println(sql);result=conn.executeUpdate(sql);conn.close();return result;}/*** 更新评论* @param info* @return*/public int update(CommentInfo info){String sql="update Comment set "+" Context='"+info.getContext()+"',novelId='"+info.getNovelId()+"',"+ "CreatedTime='"+info.getCreatedTime()+"',readerName='"+info.getReaderName()+"' where id="+info.getId()+"";int result=0;System.out.println(sql);result=conn.executeUpdate(sql);conn.close();return result;}/*** 删除评论* @param id* @return*/public int delete(int id){String sql="delete from Comment where id="+id+"";int result=0;result=conn.executeUpdate(sql);System.out.println(sql);conn.close();return result;}
}


小说分类展示,更新,增加,删除的代码处理:


public class Genre {Conn conn=new Conn();/*** 获取分类列表* @return* @throws SQLException*/public List<GenreInfo> getList()throws SQLException{List<GenreInfo> list=new ArrayList<GenreInfo>();String sql="select * from genre order by Sort asc";ResultSet rs=conn.executeQuery(sql);while(rs.next()){GenreInfo info=new GenreInfo();info.setId(rs.getInt("Id"));info.setName(rs.getString("Name"));info.setSort(rs.getInt("Sort"));list.add(info);}conn.close();return list;}/*** * @param id* @return* @throws SQLException*/public GenreInfo getGenreInfo(int id)throws SQLException{GenreInfo info=new GenreInfo();String sql="select * from genre g where id="+id+"";ResultSet rs=conn.executeQuery(sql);while(rs.next()){info.setId(rs.getInt("Id"));info.setName(rs.getString("Name"));info.setSort(rs.getInt("Sort"));}conn.close();return info;}/*** 增加分类* @param info* @return*/public int insert(GenreInfo info){String sql="insert into genre(Name,Sort) values";sql=sql+"('"+info.getName()+"','"+info.getSort()+"')";int result=0;result=conn.executeUpdate(sql);conn.close();return result;}/*** 更新分类* * @param info* @return*/public int update(GenreInfo info){String sql="update genre set "+" Name='"+info.getName()+"',Sort= '"+info.getSort()+"' where id="+info.getId()+"";int result=0;result=conn.executeUpdate(sql);return result;}public int delete(int id){String sql="delete from genre where id="+id+"";int result=0;result=conn.executeUpdate(sql);conn.close();return result;}}

前台主要页面展示:(略丑)


作者发布小说界面:


读者评论界面:


为小说投票,投票功能的前端设计代码:

function getElemensByClassName(className){  // 通过class获取var classArr = new Array();var tags = document.getElementsByTagName("*"); //获取所有节点for(var item in tags){ if(tags[item].nodeType == 1){ if(tags[item].getAttribute("class") == className){ classArr.push(tags[item]); //收集class匹配的节点}}
}return classArr;
}function delete_FF(element){  // 在FireFox中删除子节点为空的元素var childs = element.childNodes;for(var i=0;i<childs.length;i++){ var pattern = /\s/; //模式匹配,内容为空if(childs[i].nodeName == "#text" && pattern.test(childs[i].nodeValue)){  //处理//alert(childs[i].nodeName);element.removeChild(childs[i]); //删除FF中获取的空节点}}
}
function $(obj){return document.getElementById(obj);}
window.onload = function(){ onload1();onload2();
};
function onload2(){var persons = getElemensByClassName("person");
//  alert(persons);for(var item in persons){  //遍历所有person,为它们绑定投票事件(function(_item){    //匿名函数传入item, 防止因作用域问题导致item总为最后一个delete_FF(persons[_item]); //出去FF中空行代表的子节点persons[_item].setAttribute("id","person"+(parseInt(_item)+1)); //赋上idvar childs = persons[_item].childNodes;for(var i = 0;i<childs.length;i++){ //alert(childs[i].nodeName);if(childs[i].nodeName == "BUTTON"){  //点击按钮投票var oButton = childs[i];}if(childs[i].nodeName == "P"){  //投票结果更新var oP = childs[i];var oSpan = oP.getElementsByTagName("span")[0];}}if(oButton != null){oButton.onclick = function(){  //事件绑定var num = oSpan.innerHTML; //获取票数oSpan.innerHTML = (++num); //票数更新// 这时一般我们可能就需要把这个票数num传送给服务器保存,更新时也是和服务器中的num同步this.setAttribute("disabled","true"); // 一般只能投票一次的吧alert("投票成功,谢谢您的支持");};}
})(item); // 传入各项person}
}

小说发布的实现细节,引入了wangEditor:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="org.common.*" %>
<%@page import="org.model.*" %>
<%@page import="org.dal.*" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!-- 发布小说 -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><base href="<%=basePath%>"><title>小说编辑发布界面</title><script type="text/javascript" src="js/jquery-1.10.1.js"></script><link rel="stylesheet" type="text/css" href="css/edit.css"><link rel="stylesheet" type="text/css" href="css/wangEditor.min.css"><script type="text/javascript" src="js/wangEditor.min.js"></script></head><body>
<% request.setCharacterEncoding("utf-8");Genre cls=new Genre();List<GenreInfo>list=cls.getList();Novel novel=new Novel();NovelInfo ninfo=new NovelInfo();if("fabu".equals(request.getParameter("action")))
{	ninfo.setTitle(request.getParameter("txtTitle"));ninfo.setContext(request.getParameter("content"));ninfo.setGenreId(DataConverter.toInt(request.getParameter("selClass")));novel.insert(ninfo);out.println("<script>alert('发布成功');</script>");
}
%>	
<div class="header">	<h2>当前位置:小说编辑</h2>
</div><a class="wel">欢迎您:<%=Utilty.readCookie(request, "user")%></a><div class="context" ><form id="form1" name="form1" method="post" action="novel/novel-edit.jsp?action=fabu" οnsubmit="return check(this)"><table><tr><td>小说所属分类:</td><td><select name="selClass" id="selClass" style="width:300px;height:30px;"><%for(GenreInfo cinfo:list){%><option value="<%=cinfo.getId() %>"><%if(cinfo.getId()==ninfo.getId()) %><%=cinfo.getName() %></option><%}%></select></td></tr><tr><td>小  说   标   题:</td><td><input type="text" name="txtTitle" id="txtTitle" style="width:500px;height:30px"/></td></tr><tr><td>小  说   内   容:</td><td style="width:1000px;"><textarea rows="25" name="content" id="content"></textarea> </td></tr><tr><td colspan="2" class="inp"><input class="submit" type="submit" name="button" id="button" value="提交" style="color:#FFFFFF"/><input class="submit" type="reset" name="button2" id="button2" value="重置"style="color:#FFFFFF" /></td></tr></table></form></div></body><script type="text/javascript">var editor = new wangEditor('content');editor.config.menus = ['bold','underline','italic','strikethrough','eraser','forecolor','bgcolor','|','link','unlink','table','emotion','|','img','video','location',];editor.create();</script>
</html>
  好吧,由于代码段较多,这里不能一一介绍,后续直接介绍一下这个项目开发过程中的错误细节,完善之后把源码上传到资源那里,这个项目实现起来较简单,童鞋们可以根据设计要求试试身手哦!

源码地址:https://github.com/guodalin8/novel




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

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

相关文章

jmeter模拟对网站做压力测试

一般的网站&#xff0c;在进入业务功能前先需登录&#xff0c;然后才能访问业务功能。基本框架如下 详细步骤&#xff1a; 1 .用badboy录制登录&#xff0c;访问随意一个网址。 2.用jmeter打开&#xff0c;一会自己写的时候可以参考里面的参数名称或路径什么的。如果对http熟悉…

一、大型网站架构演化

为什么80%的码农都做不了架构师&#xff1f;>>> &#xff08;1&#xff09;大型网站软件系统的特点 高并发&#xff0c;大流量&#xff1b;高可用&#xff1b;海量数据&#xff1b;用户分布广泛&#xff0c;网络情况复杂&#xff1b;安全环境恶劣&#xff1b;需求快…

警方揭秘电信诈骗:黑客攻击政府网站非法获取个人信息

近日&#xff0c;河南省驻马店市平舆县警方成功破获一系列特大电信诈骗案&#xff0c;捣毁了多个诈骗团伙&#xff0c;这些团伙分工明确&#xff0c;一年之内就在全国作案2300多起&#xff0c;涉案资金超过3000万元。 诈骗团队是如何获取公民个人信息的&#xff1f;诈骗链条上各…

asp.net core下的如何给网站做安全设置

首先&#xff0c;我们来看下stack overflow网站的请求头文件&#xff1a; 可以看到一些我们熟悉或是陌生的HTTP头部文件字段。在这里我们在对HTTP输入流的头部文件中&#xff0c;做一些基本的防护。首先要明确&#xff0c;既然我们是对HTTP头部做处理&#xff0c;那么就需要在S…

基于Nginx的负载均衡网站架构

操作环境&#xff1a;VMware Fusion 操作系统&#xff1a;Centos6 实验架构设计图及实现&#xff1a;实验说明&#xff1a;Nginx服务器作为Web前端&#xff0c;当接收到用户的Web访问请求时&#xff0c;将请求转发 给内部真正的WEB服务器。Nginx具有两个网卡&#xff0c;一个网…

psn请验证您不是机器人_机器人模仿人类难?网站验证码是如何区分人类和机器的?...

为了避免注册垃圾用户以及盗取数据(撞库)&#xff0c;大多数网站都会用验证码来阻止机器人登陆&#xff0c;虽然验证码让很多用户感到厌烦&#xff0c;但它成功地阻挡了绝大多数机器人&#xff0c;也在保护我们数据的安全。那么验证码是怎么区分人类和机器人(电脑程序)的呢&…

网站Web业务架构从小到大演变

有一天&#xff0c;我突发奇想创建了一个站点&#xff0c;基于 LNMP 架构&#xff0c;起初只有我自己访问&#xff0c;后来因为我点儿正&#xff0c;访问量越来越大&#xff0c;所以最终导致下面的架构演变。 1、单台机器 单台机器因为只是一个小站&#xff0c;访问量一天也没有…

网站时常出现too many connection的错误

安装了一个程序&#xff0c;大访问量测试的时候发现竟然连接不上数据库了&#xff0c;仔细检查发现MySQL数据库出现1040错误&#xff0c;提示“too many connections”。那么改如何解决这个问题呢&#xff1f;其实MySQL默认的最大连接数为100&#xff0c;可能在大访问量的时候造…

什么是域名?什么网站名?什么是URL?

2019独角兽企业重金招聘Python工程师标准>>> 搬运自:https://jingyan.baidu.com/article/2c8c281df0afd00008252aa7.html 转载于:https://my.oschina.net/tanghaoo/blog/3006600

【SEO技巧】用户需求不等于用户真正需求

大家都知道网站要做得好&#xff0c;首先的前提 是要分析 用户需求&#xff0c;只有用户需求分析正确了才能将网站真正的做起来&#xff0c;俗话说的好知己知彼才能百战不殆。 什么是用户需求分析&#xff1a; 用户需求分析是指在系统设计之前和设计、开发过程中对用户需求所作…

Android 学习论坛博客及网站推荐

出处&#xff1a;http://blog.csdn.net/tangcheng_ok/article/details/6909049 一、博客推荐 1&#xff09;http://blog.csdn.net/android_tutor &#xff08;Android开发入门基础&#xff0c;高级进阶&#xff09; 2&#xff09;http://blog.csdn.net/hellogv &#xff08;入…

大型网站技术架构(六)网站的伸缩性架构

2019独角兽企业重金招聘Python工程师标准>>> 网站系统的伸缩性架构最重要的技术手段就是使用服务器集群功能&#xff0c;通过不断地向集群中添加服务器来增强整个集群的处理能力。“伸”即网站的规模和服务器的规模总是在不断扩大。 1、网站架构的伸缩性设计 网站的…

小公司如何部署实施Linux集群网站

出处&#xff1a;http://andrewyu.blog.51cto.com/1604432/710049 作者&#xff1a;抚琴煮酒 标签&#xff1a;小企业 Linux集群 小公司原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://…

蚂蚁变大象:浅谈常规网站是如何从小变大的(一)

http://zgwangbo.blog.51cto.com/4977613/849529 标签&#xff1a;架构 web原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://zgwangbo.blog.51cto.com/4977613/849529【 前一段时间写了关…

为什么很多网站都去除oracle?

一个字&#xff0c;贵。你可以去Oracle官网看看Oracle的报价&#xff0c;一套Oracle database动辄几十万&#xff0c;或者按年付费&#xff0c;一年大几万&#xff0c;这还是一个CPU的价格。 碰到集群你就等着哭吧。人员培训也是问题。Mysql很多人学数据库的时候多多少少都会用…

大型网站架构演化发展历程

原文&#xff1a;http://www.cnblogs.com/JustOnly/p/4899615.html 前面已经描述了大型网站系统的特点&#xff0c;而对一个大型网站系统&#xff0c;其架构也是重要的一个环节。 大型网站技术主要的挑战来自于庞大的用户、高并发以及海量的数据这三个方面。大型网站的形成就像…

发现了好的网站

今天在查找DNN&#xff0c;以及rainbow的资料时&#xff0c;发现了几个好的网站&#xff0c;并在上边注册&#xff1b;www.dnnskins.com, www.asp.net www.codeproject.com 通过查看&#xff0c;对dnn,rainbow有了新的认识转载于:https://www.cnblogs.com/mengfan/arch…

影响我的网站速度的因素

测试几个主网页总结出影响我的网页速度的几个因素&#xff1a; 一级因素&#xff1a; ①启动压缩 ②浏览器缓存 二级因素&#xff1a; ①提供压缩后的图片 找到原因下面就好办了&#xff0c;对症下药&#xff0c;下面将一个个解决。 解决办法&#xff1a; 开启压缩功能-…

别找了!这5个图片素材网站分享给你,每一个都资源满满!

职场中的工作日常就是找素材&#xff0c;但是需要找到合适的图片素材真的是难上加难。废话就不多说了&#xff0c;今天小编就给大家分享5个图片素材网站&#xff0c;资源真的超级丰富&#xff01;有需要的小伙伴记得收藏&#xff01;Pixabay链接&#xff1a;http://pixabay.com…

大型网站架构系列:分布式消息队列

一、消息队列概述 消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用耦合&#xff0c;异步消息&#xff0c;流量削锋等问题。实现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。 目前在生产环境&#xff0…