You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

283 lines
185 KiB

/*
Date: 2017-12-26 18:36:12
*/
CREATE DATABASE `vueblog2` DEFAULT CHARACTER SET utf8;
USE `vueblog2`;
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for article
-- ----------------------------
DROP TABLE IF EXISTS `article`;
CREATE TABLE `article` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) DEFAULT NULL,
`mdContent` text COMMENT 'md',
`htmlContent` text COMMENT 'html',
`summary` text,
`cid` int(11) DEFAULT NULL,
`uid` int(11) DEFAULT NULL,
`publishDate` datetime DEFAULT NULL,
`editTime` datetime DEFAULT NULL,
`state` int(11) DEFAULT NULL COMMENT '0稿12',
`pageView` int(11) DEFAULT '0',
PRIMARY KEY (`id`),
KEY `cid` (`cid`),
KEY `uid` (`uid`),
CONSTRAINT `article_ibfk_1` FOREIGN KEY (`cid`) REFERENCES `category` (`id`),
CONSTRAINT `article_ibfk_2` FOREIGN KEY (`uid`) REFERENCES `user` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=122 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of article
-- ----------------------------
INSERT INTO `article` VALUES ('108', 'Linuxzookeeper', 'Dubbo使\n\n---\n广Spring Could使DubboOKDubboDubboDubbo使DubboOKLinuxzookeeper\n\n---\n\nDubboDubbo使zookeeperzookeeperHadoopApacheZookeeperHadoop()Hive(/)ApacheZookeeperLinuxWindowsLinuxLinuxZookeeperWindowsZookeeperTomcat\n\nOKzookeeper\n\n---\n\n>1.VMware® Workstation 12 Pro \n>2.CentOS7 \n>3.zookeeper-3.4.10() \n\n---\n# \n1.zookeeper\n\nzookeeperzookeeper使zookeeper\n\n>1.[http://mirrors.hust.edu.cn/apache/zookeeper/](http://mirrors.hust.edu.cn/apache/zookeeper/) \n\n>2.[http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz](http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz)\n\n\n\n2.将下载好的zookeeper上传到Linux服务器上\n\n上传方式多种多样我这里采用了xftp小伙伴们也可以直接使用putty上传上传结果如下\n![这里写图片描述](http://img.blog.csdn.net/20170825114622362?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjcwMjU0Nw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)\n\n3.将文件解压到/opt目录下 \n\n![这里写图片描述](http://img.blog.csdn.net/20170825115122378?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjcwMjU0Nw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)\n\n4.进入到刚刚解压好的目录中创建两个文件夹分别是data和logs如下\n\n![这里写图片描述](http://img.blog.csdn.net/20170825115324970?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjcwMjU0Nw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)\n\n5.将解压后zookeeper-3.4.10文件夹下的zoo_sample.cfg文件拷贝一份命名为zoo.cfg如下\n\n![这里写图片描述](http://img.blog.csdn.net/20170825115426251?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjcwMjU0Nw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)\n\n6.修改zoo.cfg文件添加data和log目录如下\n\n![这里写图片描述](http://img.blog.csdn.net/20170825115527367?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjcwMjU0Nw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)\n\n>1.2888 端口号是zookeeper服务之间通信的端口 \n>2.3888 是zookeeper 与其他应用程序通信的端口 \n>3.initLimit这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper服务器的客户端而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 10 个心跳的时间(也就是 tickTime长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒。 \n>4.syncLimit这个配<E4B8AA>
INSERT INTO `article` VALUES ('109', 'Ajax', 'easyUI使easyUIAjaxAjax\n\n---\n# \n\n## \nHTML5FileReaderFileReader[HTML5FileReader](http://blog.csdn.net/zk437092645/article/details/8745647/)。我们来看看实现方式:\n```\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <title>Ajax上传文件</title>\n <script src=\"jquery-3.2.1.js\"></script>\n</head>\n<body>\n用户名<input id=\"username\" type=\"text\"><br>\n用户图像<input id=\"userface\" type=\"file\" onchange=\"preview(this)\"><br>\n<div id=\"preview\"></div>\n<input type=\"button\" id=\"btnClick\" value=\"上传\">\n<script>\n $(\"#btnClick\").click(function () {\n var formData = new FormData();\n formData.append(\"username\", $(\"#username\").val());\n formData.append(\"file\", $(\"#userface\")[0].files[0]);\n $.ajax({\n url: \'/fileupload\',\n type: \'post\',\n data: formData,\n processData: false,\n contentType: false,\n success: function (msg) {\n alert(msg);\n }\n });\n });\n function preview(file) {\n var prevDiv = document.getElementById(\'preview\');\n if (file.files && file.files[0]) {\n var reader = new FileReader();\n reader.onload = function (evt) {\n prevDiv.innerHTML = \'<img src=\"\' + evt.target.result + \'\" />\';\n }\n reader.readAsDataURL(file.files[0]);\n } else {\n prevDiv.innerHTML = \'<div class=\"img\" style=\"filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale,src=\\\'\' + file.value + \'\\\'\"></div>\';\n }\n }\n</script>\n</body>\n</html>\n```\n\n这里对于支持FileReader的浏览器直接使用FileReader来实现不支持FileReader的浏览器则采用微软的滤镜来实现注意给图片上传的input标签设置onchange函数。\n实现效果如下\n![这里写图片描述](http://img.blog.csdn.net/20170825184056537?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjcwMjU0Nw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)\n\n\n## 方式二\n\n除了这种方式之外我们也可以采用网上现成的一个jQuery实现的方式。这里主要参考了[这里](http://keleyi.com/keleyi/phtml/image/16.htm)。\n不过由于原文年代久远里边使用的```$.browser.msie```从jQuery1.9就被移除掉了所以如果我们想使用这个得做一点额外的处理我修改后的uploadPreview.js文件内容如下\n```\njQuery.browser={};(function(){jQuery.browser.msie=false; jQuery.browser.version=0;if(navigator.userAgent.match(/MSIE ([0-9]+)./)){ jQuery.browser.msie=true;jQuery.browser.version=RegExp.$1;}})();\njQuery.fn.extend({\n uploadPreview: function (opts) {\n var _self = this,\n _this = $(this);\n opts = jQuery.extend({\n Img: \"ImgPr\",\n Width: 100,\n Height: 100,\n ImgType: [\"gif\", \"jpeg\", \"jpg\", \"bmp\", \"png\"],\n Callback: function () {}\n }, opts || {});\n _self.getObjectURL = function (file) {\n var url = null;\n if (window.createObjectURL != undefined) {\n url = window.createObjectURL(file)\n } else if (window.URL != undefined) {\n url = window.URL.createObjectURL(file)\n } else if (window.webkitURL != undefined) {\n url = window.web
INSERT INTO `article` VALUES ('110', 'Dubbo666', 'dubboRPCdubbo**[dubbo.io](http://dubbo.io/)**。由于官网的介绍比较简洁我这里打算通过Maven多模块工程再给小伙伴们演示一下用法。\n\n\n![Image 003.png](http://localhost:80/blogimg/20171224/f301f919-f191-4e12-9a19-bce8f82a00f0_Image003.png)\n\n---\n环境IntelliJ IDEA2017.1\n\n---\n关于如何在IntelliJ IDEA中创建Maven多模块项目小伙伴们可以参考之前的博客[ IntelliJ IDEA中创建Web聚合项目(Maven多模块项目) ](http://blog.csdn.net/u012702547/article/details/77431765),这里我就不再赘述。\n这里我还是以dubbo官方文档中的例子作为基准我们来详细的看看运行过程。\n# 创建一个Maven工程\nIntelliJ中创建Maven工程的方式我这里就不再多说了这里只说一点工程创建成功之后将src目录删除因为我们不需要在这个工程下面写代码我们将以这个工程为父工程然后给它创建多个模块。\n# 向创建好的工程中添加模块\n当我们第一步成功创建了要给Maven工程之后第二步我们就向这个Maven工程中添加三个模块分别是commonprovider和consumer三个模块添加完成之后效果如下\n![这里写图片描述](http://img.blog.csdn.net/20170826153752910?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjcwMjU0Nw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)\n\nprovider将作为我们的服务提供者consumer将作为服务消费者这两个好理解除了这两个之外我们还需要要给common模块common模块主要是提供公共接口供服务提供者和服务消费者使用。\n\n# 向common模块中添加接口\n\n在common模块中添加一个SayHello接口如下\n\n![这里写图片描述](http://img.blog.csdn.net/20170826154808445?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjcwMjU0Nw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)\n\n# provider模块依赖common并提供服务\n\n1.首先打开provider的pom.xml文件在其中添加依赖要添加的依赖有如下四个小类\n>1.添加对common模块的依赖\n>2.添加对spring的依赖\n>3.添加对dubbo的依赖\n>4.添加对zookeeper的依赖\n\n如下\n\n```\n<dependencies>\n <dependency>\n <groupId>org.sang</groupId>\n <artifactId>common</artifactId>\n <version>1.0-SNAPSHOT</version>\n </dependency>\n <dependency>\n <groupId>org.springframework</groupId>\n <artifactId>spring-web</artifactId>\n <version>4.3.10.RELEASE</version>\n </dependency>\n <dependency>\n <groupId>com.alibaba</groupId>\n <artifactId>dubbo</artifactId>\n <version>2.5.3</version>\n <exclusions>\n <exclusion>\n <groupId>org.springframework</groupId>\n <artifactId>spring</artifactId>\n </exclusion>\n <exclusion>\n <artifactId>netty</artifactId>\n <groupId>org.jboss.netty</groupId>\n </exclusion>\n </exclusions>\n </dependency>\n <dependency>\n <groupId>org.apache.zookeeper</groupId>\n <artifactId>zookeeper</artifactId>\n <version>3.4.10</version>\n </dependency>\n <dependency>\n <groupId>com.101tec</groupId>\n <artifactId>zkclient</artifactId>\n <version>0.10</version>\n </dependency>\n </dependencies>\n```\n然后在provider中实现common模块的接口如下\n```\npublic class SayHelloImpl implements SayHello {\n public String sayHello(String name) {
INSERT INTO `article` VALUES ('111', 'WebSocket()', 'Spring Boot使WebSocket[Spring Boot使WebSocket](http://blog.csdn.net/u012702547/article/details/53816326)】【[在Spring Boot框架下使用WebSocket实现聊天功能](http://blog.csdn.net/u012702547/article/details/53835453)】最近看到很多小伙伴对WebSocket的讨论还比较火热so打算写几篇文章来系统的介绍下websocket。OK废话不多说下面开始我们的正文。\n\n---\n# 为什么要有WebSocket这个技术\n\n大家都知道HTML页面在刚刚开始出现的时候是静态的不能够进行交互后来有了JavaScript在一定程度上解决了这个问题但是JavaScript刚出现的时候并不能和服务端进行交互直到Ajax的出现。Ajax有效的解决了页面和服务端进行交互的问题不过Ajax有一个问题就是所有的请求都必须由客户端发起服务端进行响应如果服务端有最新的消息难以即时的发送到客户端去在WebSocket技术出现之前为了让客户端能够即时的获取服务端的数据一般采用如下三种方案\n## 轮询\n这是最简单的一种解决方案 就是客户端在固定的时间间隔下一般是1秒不停的向服务器端发送请求查看服务端是否有最新的数据服务端如果有最新的数据则返回给客户端服务端如果没有则返回一个空的json或者xml文档这种方式的实现起来简单但是弊端也很明显就是会有大量的无效请求服务端的资源被大大的浪费了。\n## 长连接\n长连接有点类似于轮询不同的是服务端不是每次都会响应客户端的请求只有在服务端有最新数据的时候才会响应客户端的请求这种方式很明显会节省网络资源和服务端资源但是也存在一些问题比如\n>1.如果浏览器在服务器响应之前有新数据要发送就只能创建一个新的并发请求,或者先尝试断掉当前请求然后再创建新的请求。 \n>2.TCP和HTTP规范中都有连接超时一说所以所谓的长连接并不能一直持续服务端和客户端的连接需要定期的连接和关闭再连接当然也有一些技术能够延长每次连接的时间这是题外话。 \n\n## Applet和Flash\nApplet和Flash都已经是明日黄花了不过这两个技术在当年除了可以让我们的HTML页面更加绚丽之外还可以解决消息推送问题。在Ajax这种技术去实现全双工通信已经陷入困境的时候开发者试图用Applet和Flash来模拟全双工通信开发者可以创建一个只有1个像素点大小的普通透明的Applet或者Flash然后将之内嵌在页面中 然后这个Applet或者Flash中的代码创建出一个Socket连接这种连接方式消除了HTTP协议中的各种限制当服务器有消息发送到客户端的时候开发者可以在Applet或者Flash中调用JavaScript函数并将服务器传来的消息传递给JavaScript函数然后更新页面当浏览器有数据要发送给服务器的时候也一样通过Applet或者Flash来传递。这种方式真正的实现了全双工通信不过也有问题如下\n>1.浏览器必须能够运行Java或者Flash \n>2.无论是Applet还是Flash都存在安全问题 \n>3.随着HTML5在标准在浏览器中广泛支持Flash下架已经被提上日程([\n终于要放弃Adobe宣布2020年正式停止支持Flash](http://tech.163.com/17/0726/07/CQ8M4HT200097U7T.html)) \n\n# WebSocket有哪些特点\n\n既然上面这些技术都不行那么谁行当然是我WebSocket了\n\n## HTTP/1.1的升级特性\n要说WebSocket协议我们得先来说说HTTP协议的一个请求头事实上所有的HTTP客户端浏览器、移动端等都可以在请求头中包含Connection:Upgrade这个表示客户端希望升级请求协议那么希望升级成什
INSERT INTO `article` VALUES ('112', 'WebSocket()', '[WebSocket()](http://blog.csdn.net/u012702547/article/details/77621195)】中我们对WebSocket的一些基本理论进行了介绍但是并没有过多的涉及到一些实战的内容今天我希望能够用几个简单的案例来向小伙伴们展示下WebSocket的一些具体用法。\n# WebSocket API有哪些\n首先有一点小伙伴们需要明确那就是WebSocket并不总是用在浏览器和服务器的通信中只要任意两个使用框架编写支持WebSocket的应用程序都可以创建WebSocket连接进行通信基于此许多WebSocket实现在客户端或者服务器终端工具中都是可用的比如Java或者***.***NET等。我们这里主要是介绍Java WebSocket和javascript中的websocket的使用js中websocket的使用这个好理解就是扮演一个客户端的角色Java中的WebSocket分两种角色一种是Java客户端终端的WebSocket作用类似于JavaScript中的WebSocket还有一种角色是Java服务器终端。本文主要介绍javascript中websocket的使用以及java服务器终端中websocket的使用java客户端使用websocket这种情形并不多见不在本文讨论的范围之内。\n# JavaScript中WebSocket的使用\n目前基本上只要的浏览器不是古董级的基本上都支持WebSocket了w3c目前已经统一了浏览器中websocket通信的标准和接口所有的浏览器都通过WebSocket接口的实现提供WebSocket通信。举几个简单的API我们来看看 \n\n## 1.创建一个WebSocket对象 \n```\nvar webSocket = new WebSocket(\"ws://localhost/myws\");\n``` \n## 2.WebSocket中几个常见属性 \nreadyState表示当前WebSocket的连接状态有四种不同的取值,分别是CONNECTING(0),OPEN(1),CLOSING(2)和CLOSED(3) \n```if(webSocket.readyState==WebSocket.OPEN){/*do something*/}``` \n\n\n## 3.几个常见方法 \n\n``` \n \n webSocket.onopen=function (event) {\n //连接成功时触发 \n }\n webSocket.onclose=function (event) {\n //连接关闭时触发 \n }\n webSocket.onerror=function (event) {\n //连接出错时触发 \n }\n webSocket.onmessage=function (event) {\n //收到消息时触发 \n }\n\n\n```\n\n# Java服务端中WebSocket的使用\n\nJava服务端中WebSocket 的使用有几个点需要注意下首先Java服务端的WebSocket想要使用你的Tomcat必须得是Tomcat7以上的版本Tomcat7才开始了对WebSocket的支持不过这个条件想必小伙伴们都能满足吧Java服务端WebSocket的使用主要是有几个注解需要我们了解下用法。如下 \n\n```\n\n @ServerEndpoint(\"/myws\")\n public class WebSocketServer {\n @OnMessage\n public void onMessage(String message, Session session) throws IOException {\n System.out.println(\"收到了客户端发来的消息:\" + message);\n session.getBasicRemote().sendText(\"服务端返回:\" + message);\n }\n \n @OnOpen\n public void onOpen(Session session) throws IOException {\n System.out.println(\"客户端连接成功\");\n }\n \n @OnClose\n public void onClose(Session session) throws IOException {\n session.getBasicRemote().sendText(\"连接关闭\");\n System.out.println(\"连接关闭\");\n }\n }\n\n```\n\n关于这个类我说如下几点\n>1.@ServerEndPoint注解表示将该类升级为一个WebSocket服务端点 \n>2.@OnMessage注解表示收到客户端发来的消息时触发 \n>3.@OnOpen注解表示当客户端连接上服务端时触发 \n>4.@OnClose注解表示当连接关闭时触发 \n\n---\nOK经过上面的介绍我们对WebSocket的API已经有了一个大概的了解那么接下来我们就来通过一个简单的案例来看看WebSocket的使用。\n\n# 一个简单的互发消息的案例\n## 创建工程\n首先创建一个普通的Java Web工程正常情况下我们创建一个Java Web工程这个工程如下
INSERT INTO `article` VALUES ('113', 'WebSocket()', '[WebSocket() ](http://blog.csdn.net/u012702547/article/details/77621195)】【[WebSocket刨根问底(二) ](http://blog.csdn.net/u012702547/article/details/77655826)】我们介绍了WebSocket的一些基本理论以及一个简单的案例那么今天继续我们来看一个简单的群聊的案例来进一步了解WebSocket这个东东。 \n\nOK开始之前我们先来看看我们今天要实现的效果 \n\n![这里写图片描述](http://img.blog.csdn.net/20170829152915575?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjcwMjU0Nw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) \n\n好了废话不多说我们进来看看这个东西要怎么样实现吧\n\n# 创建Web项目\n这里和上文[WebSocket刨根问底(二) ](http://blog.csdn.net/u012702547/article/details/77655826)一样web项目创建成功之后还是要我们先手动添加websocket的jar包进来添加方式如果小伙伴不懂的话可以参考我们上篇文章这里我就不再赘述。\n\n# 创建HTML页面\n\n页面的效果效果小伙伴们刚才都看到了我这里就直接上代码 \n```\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <title>ws页面</title>\n <script src=\"jquery-3.2.1.js\"></script>\n</head>\n<body>\n<input type=\"text\" placeholder=\"请输入您的昵称\" id=\"nickname\"><input type=\"button\" value=\"连接\" id=\"btnClick1\">\n</div>\n<div id=\"resultDiv\"></div>\n<div><input type=\"text\" id=\"msg\"><input type=\"button\" value=\"发送\" id=\"btnClick2\" disabled=\"disabled\"></div>\n<script>\n var webSocket;\n $(\"#btnClick2\").click(function () {\n var msg = $(\"#msg\").val();\n $(\"#msg\").val(\'\');\n webSocket.send(msg)\n });\n $(\"#btnClick1\").click(function () {\n var nickname = $(\"#nickname\").val();\n if(nickname==null||nickname==\'\') {\n alert(\"必须输入昵称\");\n return;\n }\n $(\"#btnClick2\").removeAttr(\"disabled\");\n $(this).attr(\"disabled\", \"disabled\");\n $(\"#resultDiv\").append(\"<p>开始连接服务端!</p>\");\n webSocket = new WebSocket(\"ws://localhost/myws2/\"+nickname);\n webSocket.onerror = function (event) {\n $(\"#resultDiv\").append(\"<p>onerror:\" + event.data + \"</p>\");\n }\n webSocket.onopen = function (event) {\n $(\"#resultDiv\").append(\"<p>连接成功!</p>\");\n }\n webSocket.onmessage = function (event) {\n $(\"#resultDiv\").append(\"<p>\" + event.data + \"</p>\");\n }\n });\n</script>\n</body>\n</html>\n```\n\n关于这段HTML代码我说如下几点\n>1.一开始发送按钮处于不可用状态,必须先连接 \n>2.连接时必须先输入昵称,如果不输入昵称则弹出提示 \n>3.连接成功之后连接按钮处于不可点击状态而发送按钮处于可点击状态 \n>4.在连接按钮的点击事件中初始化WebSocket对象以及WebSocket中涉及到的一些方法的初始化 \n>5.所有的信息连接成功连接出错以及接收到消息最后都显示在resultDiv中 \n>6.连接地址是动态变化的,最后的字符是连接的用户名 \n\nOK这里的代码都很简单我就不一一解释了。\n\n# 创建WebSocket服务端\n\n由于我们这里要做的是群聊所以服务端的主要功能就是接收客户端传来的消息并将之广播给所有的客户端。服务端代码如下 \n```\n@ServerEndpoint(\"/myws2/{nickname}\")\npublic class WebSocketServer2 {\n private String nickname;\n private Session session;\n private static final Set<WebSocketServer2> WEB_SOCKET_SERVER_2_SET = new CopyOnWriteArraySet<WebSocketServer2>();\n\n @OnMessage\n public void onMessage(String message, @PathParam(value = \"nickname\") String nickname) throws IOException {\n System.out
INSERT INTO `article` VALUES ('114', 'Github', '## \nGitHubJavaEE \n\n## \n\n### CoolMeeting\n\n[](http://mp.weixin.qq.com/s/JMGuiftZcEG-0yed2jkDQA) \n项目地址https://github.com/lenve/CoolMeeting \n项目二维码长按二维码进入项目主页 \n![](https://mmbiz.qpic.cn/mmbiz_png/GvtDGKK4uYn9lpXK5EuBzEbK8b7qCE7eCyDJbibdel15VKxacxVZGwdWBibmMUI8n7H9NeX2yWmfrPpHuVHGt42w/0?wx_fmt=png) \n\n### 个人博客系统\n\n项目简介[一个JavaWeb搭建的开源Blog系统整合SSM框架](http://mp.weixin.qq.com/s/m85v_EPdGnOILGJMv5Cz3g) \n项目地址https://github.com/lenve/JavaEETest/tree/master/MyBlog \n项目二维码长按二维码进入项目主页 \n\n![](https://mmbiz.qpic.cn/mmbiz_png/GvtDGKK4uYn9lpXK5EuBzEbK8b7qCE7e8icuibRHFAaiaDr24lkBAwGOeFbYswWcJ8NOY4s23eTCk4xrBibiadWtLuQ/0?wx_fmt=png) \n\n\n### 五子棋大比武\n\n项目简介[一个开源的五子棋大战送给各位小伙伴!](http://mp.weixin.qq.com/s/8FjP2LgzadHeGA27HfWCHw) \n项目地址https://github.com/lenve/GobangGame \n项目二维码长按二维码进入项目主页 \n\n![](https://mmbiz.qpic.cn/mmbiz_png/GvtDGKK4uYn9lpXK5EuBzEbK8b7qCE7e9czbiad3AWdxblRuABabpe0nIATLe4ppLZjib2Xfbm7kBgn69yzWrcbA/0?wx_fmt=png)\n\n\n## 框架案例\n\n框架案例主要包括了Spring案例、SpringMVC案例、MyBatis案例以及Spring Boot案例。 \n项目地址https://github.com/lenve/JavaEETest \n项目二维码长按二维码进入项目主页 \n\n![](https://mmbiz.qpic.cn/mmbiz_png/GvtDGKK4uYn9lpXK5EuBzEbK8b7qCE7e8aBAeeHCTHDNe4p5hWKKXTDLa3llbJxWQibPd1zlOPoH5aDicDcUNlJg/0?wx_fmt=png) \n\n\n这些资料和开源项目都会不定期更新我手头上还有一个ERP项目整理好了之后也会开源给小伙伴们学习。 \n\n关注公众号可以接收到最新通知。 \n\n希望上面这些资料能够给大家的学习带来帮助有问题欢迎留言交流。', '<h2>缘起</h2>\n<p>从年初到现在在GitHub上也积累了几个开源项目从我个人的角度来看我觉得这些开源项目对于JavaEE初学者是有很大的参考价值的因此我将这些项目和案例分享出来希望能够给初学者一些帮助。</p>\n<h2>三个完整的开源项目</h2>\n<h3>CoolMeeting会议管理系统</h3>\n<p>项目简介:<a href=\"http://mp.weixin.qq.com/s/JMGuiftZcEG-0yed2jkDQA\" target=\"_blank\">一个开源的会议管理系统献给给位小伙伴!</a><br />\n项目地址https://github.com/lenve/CoolMeeting<br />\n项目二维码长按二维码进入项目主页<br />\n<img src=\"https://mmbiz.qpic.cn/mmbiz_png/GvtDGKK4uYn9lpXK5EuBzEbK8b7qCE7eCyDJbibdel15VKxacxVZGwdWBibmMUI8n7H9NeX2yWmfrPpHuVHGt42w/0?wx_fmt=png\" alt=\"\" /></p>\n<h3>个人博客系统</h3>\n<p>项目简介:<a href=\"http://mp.weixin.qq.com/s/m85v_EPdGnOILGJMv5Cz3g\" target=\"_blank\">一个JavaWeb搭建的开源Blog系统整合SSM框架</a><br />\n项目地址https://github.com/lenve/JavaEETest/tree/master/MyBlog<br />\n项目二维码长按二维码进入项目主页</p>\n<p><img src=\"https://mmbiz.qpic.cn/mmbiz_png/GvtDGKK4uYn9lpXK5EuBzEbK8b7qCE7e8icuibRHFAaiaDr24lkBAwGOeFbYswWcJ8NOY4s23eTCk4xrBibiadWtLuQ/0?wx_fmt=png\" alt=\"\" /></p>\n<h3>五子棋大比武</h3>\n<p>项目简介:<a href=\"http://mp.weixin.qq.com/s/8FjP2LgzadHeGA27HfWCHw\" target=\"_blank\">一个开源的五子棋大战送给各位小伙伴!</a><br />\n项目地址https://github.com/lenve/GobangGame<br />\n项目二维码长按二维码进入项目主页</p>\n<p><img src=\"https://mmbiz.qpic.cn/mmbiz_png/GvtDGKK4uYn9lpXK5EuBzEbK8b7qCE7e9czbiad3AWdxblRuABabpe0nIATLe4ppLZj
INSERT INTO `article` VALUES ('115', '稿', 'JavaEE稿 \n\n---\n\n### \n \n>1.稿稿 \n>2.稿 \n>3.稿 \n\n \n\n### 稿\n\n>1. \n>2. \n>3. \n\n### 稿\n\n稿pine-tree@foxmail.com\n\n', '<p>JavaEE稿</p>\n<hr />\n<h3></h3>\n<p></p>\n<blockquote>\n<p>1.稿稿<br />\n2.稿<br />\n3.稿</p>\n</blockquote>\n<p></p>\n<h3>稿</h3>\n<blockquote>\n<p>1.<br />\n2.<br />\n3.</p>\n</blockquote>\n<h3>稿</h3>\n<p>稿pine-tree@foxmail.com</p>\n<p></p>\n', 'JavaEE', '60', '6', '2017-12-21 22:40:16', '2017-12-21 22:40:16', '2', '99');
INSERT INTO `article` VALUES ('116', 'SpringBoot+SpringSecurityAjax', 'Vue使vue-resource使使JSON使Spring Boot使Spring SecuritySpring SecurityAjaxAjax \n\n### \n\nSpring BootWebSpring SecurityMySQLMyBatis(使MyBatis) \n\n```\n<dependency>\n <groupId>org.mybatis.spring.boot</groupId>\n <artifactId>mybatis-spring-boot-starter</artifactId>\n <version>1.3.1</version>\n</dependency>\n<dependency>\n <groupId>org.springframework.boot</groupId>\n <artifactId>spring-boot-starter-security</artifactId>\n</dependency>\n<dependency>\n <groupId>org.springframework.boot</groupId>\n <artifactId>spring-boot-starter-web</artifactId>\n</dependency>\n<dependency>\n <groupId>mysql</groupId>\n <artifactId>mysql-connector-java</artifactId>\n <scope>runtime</scope>\n</dependency>\n<dependency>\n <groupId>commons-codec</groupId>\n <artifactId>commons-codec</artifactId>\n <version>1.11</version>\n</dependency>\n``` \n\n**commons-codec**ApacheMD5 \n\n### \n\n \n\n![p271]() \n\napplication.properties \n\n```\nspring.datasource.url=jdbc:mysql:///vueblog\nspring.datasource.username=root\nspring.datasource.password=123\n``` \n\n### 构造实体类\n\n这里主要是指构造用户类这里的用户类比较特殊必须实现UserDetails接口如下 \n\n```\npublic class User implements UserDetails {\n private Long id;\n private String username;\n private String password;\n private String nickname;\n private boolean enabled;\n private List<Role> roles;\n\n @Override\n public boolean isAccountNonExpired() {\n return true;\n }\n\n @Override\n public boolean isAccountNonLocked() {\n return true;\n }\n\n @Override\n public boolean isCredentialsNonExpired() {\n return true;\n }\n\n @Override\n public boolean isEnabled() {\n return enabled;\n }\n\n @Override\n public List<GrantedAuthority> getAuthorities() {\n List<GrantedAuthority> authorities = new ArrayList<>();\n for (Role role : roles) {\n authorities.add(new SimpleGrantedAuthority(\"ROLE_\" + role.getName()));\n }\n return authorities;\n }\n //getter/setter省略...\n}\n``` \n\n实现了UserDetails接口之后该接口中有几个方法需要我们实现四个返回Boolean的方法都是见名知意enabled表示档期账户是否启用这个我数据库中确实有该字段因此根据查询结果返回其他的为了简单期间都直接返回truegetAuthorities方法返回当前用户的角色信息用户的角色其实就是roles中的数据将roles中的数据转换为List<GrantedAuthority>之后返回即可,**这里有一个要注意的地方,由于我在数据库中存储的角色名都是诸如‘超级管理员’、‘普通用户’之类的,并不是以```ROLE_```这样的字符开始的,因此需要在这里手动加上```ROLE_```,切记**。 \n\n另外还有一个Role实体类比较简单按照数据库的字段创建即可这里不再赘述。 \n\n### 创建UserServi
INSERT INTO `article` VALUES ('117', '', '', '<p></p>\n', '', '58', '7', null, '2017-12-22 10:22:33', '2', '0');
INSERT INTO `article` VALUES ('118', 'MongoDB', 'NoSQLMongoDB \n\nMongoDB \n\n\n![Image 083.png](http://localhost:80/blogimg/20171223/b13e845a-29f7-402c-a2d4-cc7830fd767e_Image083.png)\n---\n1.[Linux上安装MongoDB](http://mp.weixin.qq.com/s/R4HpFO60BQ0-dnTMVQOvhw) \n2.[MongoDB基本操作](http://mp.weixin.qq.com/s/qhCrjbEgH4FpDv-2sjFEAQ) \n3.[MongoDB数据类型](http://mp.weixin.qq.com/s/tVC2Uq30qWx4o3eB2aXlmQ) \n4.[MongoDB文档更新操作](http://mp.weixin.qq.com/s/wM-xmd4Al0zk4hGTEfr8LQ) \n5.[MongoDB文档查询操作(一)](http://mp.weixin.qq.com/s/VfdZ5QX5I4blMTsMl-IEbg) \n6.[MongoDB文档查询操作(二)](http://mp.weixin.qq.com/s/_JWWvBzdDUCtzdjcIMfcQQ) \n7.[MongoDB文档查询操作(三)](http://mp.weixin.qq.com/s/hkSP-i-_vzLy1-hkdq3o4w) \n8.[MongoDB查看执行计划](http://mp.weixin.qq.com/s/sH3eN7IF6zMedDeC_Vpcww) \n\n--- \n\n## 索引创建\n\n默认情况下集合中的```_id```字段就是索引我们可以通过getIndexes()方法来查看一个集合中的索引: \n\n```\ndb.sang_collect.getIndexes()\n``` \n\n结果如下 \n\n```\n[\n {\n \"v\" : 2,\n \"key\" : {\n \"_id\" : 1\n },\n \"name\" : \"_id_\",\n \"ns\" : \"sang.sang_collect\"\n }\n]\n``` \n\n我们看到这里只有一个索引就是```_id```。 \n\n现在我的集合中有10000个文档我想要查询x为1的文档我的查询操作如下 \n\n```\ndb.sang_collect.find({x:1})\n``` \n\n这种查询默认情况下会做全表扫描我们可以用上篇文章介绍的explain()来查看一下查询计划,如下: \n\n```\ndb.sang_collect.find({x:1}).explain(\"executionStats\")\n``` \n\n结果如下 \n\n```\n{\n \"queryPlanner\" : {\n },\n \"executionStats\" : {\n \"executionSuccess\" : true,\n \"nReturned\" : 1,\n \"executionTimeMillis\" : 15,\n \"totalKeysExamined\" : 0,\n \"totalDocsExamined\" : 10000,\n \"executionStages\" : {\n \"stage\" : \"COLLSCAN\",\n \"filter\" : {\n \"x\" : {\n \"$eq\" : 1.0\n }\n },\n \"nReturned\" : 1,\n \"executionTimeMillisEstimate\" : 29,\n \"works\" : 10002,\n \"advanced\" : 1,\n \"needTime\" : 10000,\n \"needYield\" : 0,\n \"saveState\" : 78,\n \"restoreState\" : 78,\n \"isEOF\" : 1,\n \"invalidates\" : 0,\n \"direction\" : \"forward\",\n \"docsExamined\" : 10000\n }\n },\n \"serverInfo\" : {\n },\n \"ok\" : 1.0\n}\n``` \n\n结果比较长我摘取了关键的一部分。我们可以看到查询方式是全表扫描一共扫描了10000个文档才查出来我要的结果。实际上我要的文档就排第二个但是系统不知道这个集合中一共有多少个x为1的文档所以会把全表扫描完这种方式当然很低效但是如果我加上limit如下 \n\n```\ndb.sang_collect.find({x:1}).limit(1)\n``` \n\n此时再看查询计划发现只扫描了两个文档就有结果了但是如果我要查询x为9999的记录那还是得把全表扫描一遍此时我们就可以给该字段建立索引索引建立方式如下 \n\n```\ndb.sang_collect.ensureIndex({x:1})\n``` \n\n1表示升序-1表示降序。当我们给x字段建立索引之后再根据x字段去查询速度就非常快了我们看下面这个查询操作的执行计划 \n\n```\ndb.sang_collect.find({x:9999}).explain(\"executionStats\")\n``` \n\n这个查询计划过长我就不贴出来了我们可以重点关注查询要耗费的时间大幅度下降。 \n\n此时调用getIndexes()方法可以看到我
INSERT INTO `article` VALUES ('119', 'Git', 'GitGit90%10%GitGit \n\n\n![Image 012.png](http://localhost:80/blogimg/20171224/9f628a1d-2acd-412f-b9a6-b52acf779138_Image012.png)\n\n## 书\n\n推荐两本个人觉得很不错的书 \n\n1.《GitHub入门与实践》 \n2.《Pro Git》 \n\n《GitHub入门与实践》秉承了日系技术书刊一贯的“手把手教学”风格作者用亲切的语言简明扼要的介绍配以生动详实的示例一步步讲解GitHub和Git的使用方法。《Pro Git》作为Git官方推荐书籍《Pro Git》值得Git初学者和爱好者认真阅读一遍。 \n\n## 网站\n\n1.https://learngitbranching.js.org \n\n链接是一个git学习网站我们可以直接在上面练习git命令。 \n\n## 博客\n\n推荐本公号前面的几篇教程: \n\n---\n1.[Git概述](https://mp.weixin.qq.com/s/3RheAJ9LYKK5BnVr331h5A) \n2.[Git基本操作](https://mp.weixin.qq.com/s/S1T4wy3srmLvXgIjvpVEwg) \n3.[Git中的各种后悔药](https://mp.weixin.qq.com/s/WiLnRQfDVITHMYzGl9pAzQ) \n4.[Git分支管理](https://mp.weixin.qq.com/s/9OZY7x9DSyRO7T56TyDJ8Q) \n5.[Git关联远程仓库](https://mp.weixin.qq.com/s/x5bRe4QBMoVFKv5jNl9iRw) \n6.[Git工作区储藏兼谈分支管理中的一个小问题](https://mp.weixin.qq.com/s/S5rrBQoWwof7n3ZRTrZGWQ) \n7.[Git标签管理](https://mp.weixin.qq.com/s/Jwr4fjCw7MBUD-CalVXhZQ) \n\n--- \n\n更多JavaEE和Git资料请关注公众号 \n\n![公众号二维码](https://mmbiz.qpic.cn/mmbiz_jpg/GvtDGKK4uYkO6VEW6XfkovAic6oA5LegzZKeRj0OwOZZQ8ic1tEoBOVBBOreAB9Dz32CN9MU19slrjn5qvxbR7pQ/0?wx_fmt=jpeg) ', '<p>关于Git的用法我们已经写七篇文章介绍了Git的不少用法这些足以应付工作中90%的需求了剩下的10%就需要小伙伴们在工作中自己慢慢总结了我这里再给小伙伴们推荐一点Git学习资料为我们的Git系列画上一个句号。</p>\n<p><img src=\"http://localhost:80/blogimg/20171224/9f628a1d-2acd-412f-b9a6-b52acf779138_Image012.png\" alt=\"Image 012.png\" /></p>\n<h2>书</h2>\n<p>推荐两本个人觉得很不错的书:</p>\n<p>1.《GitHub入门与实践》<br />\n2.《Pro Git》</p>\n<p>《GitHub入门与实践》秉承了日系技术书刊一贯的“手把手教学”风格作者用亲切的语言简明扼要的介绍配以生动详实的示例一步步讲解GitHub和Git的使用方法。《Pro Git》作为Git官方推荐书籍《Pro Git》值得Git初学者和爱好者认真阅读一遍。</p>\n<h2>网站</h2>\n<p>1.https://learngitbranching.js.org</p>\n<p>链接是一个git学习网站我们可以直接在上面练习git命令。</p>\n<h2>博客</h2>\n<p>推荐本公号前面的几篇教程:</p>\n<hr />\n<p>1.<a href=\"https://mp.weixin.qq.com/s/3RheAJ9LYKK5BnVr331h5A\" target=\"_blank\">Git概述</a><br />\n2.<a href=\"https://mp.weixin.qq.com/s/S1T4wy3srmLvXgIjvpVEwg\" target=\"_blank\">Git基本操作</a><br />\n3.<a href=\"https://mp.weixin.qq.com/s/WiLnRQfDVITHMYzGl9pAzQ\" target=\"_blank\">Git中的各种后悔药</a><br />\n4.<a href=\"https://mp.weixin.qq.com/s/9OZY7x9DSyRO7T56TyDJ8Q\" target=\"_blank\">Git分支管理</a><br />\n5.<a href=\"https://mp.weixin.qq.com/s/x5bRe4QBMoVFKv5jNl9iRw\" target=\"_blank\">Git关联远程仓库</a><br />\n6.<a href=\"https://mp.weixin.qq.com/s/S5rrBQoWwof7n3ZRTrZGWQ\" target=\"_blank\">Git工作区储藏兼谈分支管理中的一个小问题</a><br />\n7.<a href=\"https://mp.weixin.qq.com/s/Jwr4fjCw7MBUD-CalVXhZQ\" target=\"_blank\">Git标签管理</a></p>\n<hr />\n<p>更多JavaEE和Git资料请关注公众号</p>\n<p><img src=\"https://mmbiz.qpic.cn/mmbiz_jpg/GvtDGKK4uYkO6VEW6XfkovAic6oA5LegzZKeRj0OwOZZQ8ic1tEoBOVBBOreAB9Dz32CN9MU19slrjn5qvxbR7pQ/0?wx_fmt=jpeg\" alt=\"公众号二维码\" /></p>\n', '关于Git的用法<E794A8><E6B395>
INSERT INTO `article` VALUES ('120', '2222666666666', '222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222', '<p>222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222</p>\n', '2222222222', '58', '6', '2017-12-24 10:10:33', '2017-12-24 10:10:33', '1', '5');
INSERT INTO `article` VALUES ('121', '', '', '<p></p>\n', '', '58', '7', '2017-12-24 22:32:20', '2017-12-24 22:32:20', '1', '3');
-- ----------------------------
-- Table structure for article_tags
-- ----------------------------
DROP TABLE IF EXISTS `article_tags`;
CREATE TABLE `article_tags` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`aid` int(11) DEFAULT NULL,
`tid` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `tid` (`tid`),
KEY `article_tags_ibfk_1` (`aid`),
CONSTRAINT `article_tags_ibfk_1` FOREIGN KEY (`aid`) REFERENCES `article` (`id`) ON DELETE CASCADE,
CONSTRAINT `article_tags_ibfk_2` FOREIGN KEY (`tid`) REFERENCES `tags` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=52 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of article_tags
-- ----------------------------
INSERT INTO `article_tags` VALUES ('26', '116', '42');
INSERT INTO `article_tags` VALUES ('27', '116', '44');
INSERT INTO `article_tags` VALUES ('28', '116', '35');
INSERT INTO `article_tags` VALUES ('29', '118', '45');
INSERT INTO `article_tags` VALUES ('32', '119', '40');
INSERT INTO `article_tags` VALUES ('33', '119', '41');
INSERT INTO `article_tags` VALUES ('36', '109', '35');
INSERT INTO `article_tags` VALUES ('37', '109', '50');
INSERT INTO `article_tags` VALUES ('38', '109', '51');
INSERT INTO `article_tags` VALUES ('39', '110', '36');
INSERT INTO `article_tags` VALUES ('48', '108', '33');
INSERT INTO `article_tags` VALUES ('49', '108', '34');
INSERT INTO `article_tags` VALUES ('50', '120', '66');
INSERT INTO `article_tags` VALUES ('51', '120', '65');
-- ----------------------------
-- Table structure for category
-- ----------------------------
DROP TABLE IF EXISTS `category`;
CREATE TABLE `category` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`cateName` varchar(64) DEFAULT NULL,
`date` date DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=65 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of category
-- ----------------------------
INSERT INTO `category` VALUES ('56', 'Vue22', '2017-12-21');
INSERT INTO `category` VALUES ('58', '', '2017-12-21');
INSERT INTO `category` VALUES ('60', 'JavaEE', '2017-12-21');
INSERT INTO `category` VALUES ('61', 'Git', '2017-12-21');
INSERT INTO `category` VALUES ('62', 'Linux', '2017-12-21');
INSERT INTO `category` VALUES ('64', 'MongoDB', '2017-12-23');
-- ----------------------------
-- Table structure for comments
-- ----------------------------
DROP TABLE IF EXISTS `comments`;
CREATE TABLE `comments` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`aid` int(11) DEFAULT NULL,
`content` text,
`publishDate` datetime DEFAULT NULL,
`parentId` int(11) DEFAULT NULL COMMENT '-1',
`uid` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `aid` (`aid`),
KEY `uid` (`uid`),
KEY `parentId` (`parentId`),
CONSTRAINT `comments_ibfk_1` FOREIGN KEY (`aid`) REFERENCES `article` (`id`),
CONSTRAINT `comments_ibfk_2` FOREIGN KEY (`uid`) REFERENCES `user` (`id`),
CONSTRAINT `comments_ibfk_3` FOREIGN KEY (`parentId`) REFERENCES `comments` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of comments
-- ----------------------------
-- ----------------------------
-- Table structure for pv
-- ----------------------------
DROP TABLE IF EXISTS `pv`;
CREATE TABLE `pv` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`countDate` date DEFAULT NULL,
`pv` int(11) DEFAULT NULL,
`uid` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `pv_ibfk_1` (`uid`),
CONSTRAINT `pv_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `user` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of pv
-- ----------------------------
INSERT INTO `pv` VALUES ('1', '2017-12-24', '20', '6');
INSERT INTO `pv` VALUES ('2', '2017-12-24', '14', '7');
INSERT INTO `pv` VALUES ('4', '2017-12-25', '40', '6');
INSERT INTO `pv` VALUES ('5', '2017-12-25', '23', '7');
INSERT INTO `pv` VALUES ('6', '2017-12-26', '11', '6');
INSERT INTO `pv` VALUES ('7', '2017-12-26', '32', '7');
INSERT INTO `pv` VALUES ('26', '2017-12-23', '2', '6');
INSERT INTO `pv` VALUES ('27', '2017-12-23', '77', '7');
-- ----------------------------
-- Table structure for roles
-- ----------------------------
DROP TABLE IF EXISTS `roles`;
CREATE TABLE `roles` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of roles
-- ----------------------------
INSERT INTO `roles` VALUES ('1', '');
INSERT INTO `roles` VALUES ('2', '');
INSERT INTO `roles` VALUES ('3', '1');
INSERT INTO `roles` VALUES ('4', '2');
INSERT INTO `roles` VALUES ('5', '3');
-- ----------------------------
-- Table structure for roles_user
-- ----------------------------
DROP TABLE IF EXISTS `roles_user`;
CREATE TABLE `roles_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`rid` int(11) DEFAULT '2',
`uid` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `rid` (`rid`),
KEY `roles_user_ibfk_2` (`uid`),
CONSTRAINT `roles_user_ibfk_1` FOREIGN KEY (`rid`) REFERENCES `roles` (`id`),
CONSTRAINT `roles_user_ibfk_2` FOREIGN KEY (`uid`) REFERENCES `user` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=131 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of roles_user
-- ----------------------------
INSERT INTO `roles_user` VALUES ('8', '2', '7');
INSERT INTO `roles_user` VALUES ('9', '1', '7');
INSERT INTO `roles_user` VALUES ('17', '5', '7');
INSERT INTO `roles_user` VALUES ('106', '2', '14');
INSERT INTO `roles_user` VALUES ('108', '2', '16');
INSERT INTO `roles_user` VALUES ('109', '2', '17');
INSERT INTO `roles_user` VALUES ('110', '2', '18');
INSERT INTO `roles_user` VALUES ('111', '2', '19');
INSERT INTO `roles_user` VALUES ('112', '2', '20');
INSERT INTO `roles_user` VALUES ('119', '2', '15');
INSERT INTO `roles_user` VALUES ('120', '5', '15');
INSERT INTO `roles_user` VALUES ('121', '2', '6');
INSERT INTO `roles_user` VALUES ('123', '2', '13');
INSERT INTO `roles_user` VALUES ('124', '3', '13');
INSERT INTO `roles_user` VALUES ('128', '2', '10');
INSERT INTO `roles_user` VALUES ('129', '5', '10');
INSERT INTO `roles_user` VALUES ('130', '1', '6');
-- ----------------------------
-- Table structure for tags
-- ----------------------------
DROP TABLE IF EXISTS `tags`;
CREATE TABLE `tags` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`tagName` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `tagName` (`tagName`)
) ENGINE=InnoDB AUTO_INCREMENT=67 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of tags
-- ----------------------------
INSERT INTO `tags` VALUES ('66', '666');
INSERT INTO `tags` VALUES ('35', 'Ajax');
INSERT INTO `tags` VALUES ('36', 'Dubbo');
INSERT INTO `tags` VALUES ('40', 'git');
INSERT INTO `tags` VALUES ('33', 'Linux');
INSERT INTO `tags` VALUES ('45', 'mongodb');
INSERT INTO `tags` VALUES ('42', 'spring');
INSERT INTO `tags` VALUES ('44', 'SpringSecurity');
INSERT INTO `tags` VALUES ('37', 'websocket');
INSERT INTO `tags` VALUES ('34', 'Zookeeper');
INSERT INTO `tags` VALUES ('50', '');
INSERT INTO `tags` VALUES ('51', '');
INSERT INTO `tags` VALUES ('41', '');
INSERT INTO `tags` VALUES ('65', '');
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(64) DEFAULT NULL,
`nickname` varchar(64) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`enabled` tinyint(1) DEFAULT '1',
`email` varchar(64) DEFAULT NULL,
`userface` varchar(255) DEFAULT NULL,
`regTime` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('6', 'linghu', '', '202cb962ac59075b964b07152d234b70', '1', 'linghu@qq.com', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1514093920326&di=44a6fa6b597d86f475c2b15fa93008dd&imgtype=0&src=http%3A%2F%2Fwww.qqzhi.com%2Fuploadpic%2F2015-01-12%2F023019564.jpg', '2017-12-08 09:30:22');
INSERT INTO `user` VALUES ('7', 'sang', '', '202cb962ac59075b964b07152d234b70', '1', 'sang123@qq.com', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1514093920321&di=913e88c23f382933ef430024afd9128a&imgtype=0&src=http%3A%2F%2Fp.3761.com%2Fpic%2F9771429316733.jpg', '2017-12-21 13:30:29');
INSERT INTO `user` VALUES ('10', 'qiaofeng', '', '202cb962ac59075b964b07152d234b70', '1', 'qiaofeng@qq.com', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1514093920321&di=913e88c23f382933ef430024afd9128a&imgtype=0&src=http%3A%2F%2Fp.3761.com%2Fpic%2F9771429316733.jpg', '2017-12-24 06:30:46');
INSERT INTO `user` VALUES ('13', 'duanzhengchun', '', '202cb962ac59075b964b07152d234b70', '0', 'duanzhengchun@qq.com', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1514093920321&di=913e88c23f382933ef430024afd9128a&imgtype=0&src=http%3A%2F%2Fp.3761.com%2Fpic%2F9771429316733.jpg', '2017-12-24 06:30:46');
INSERT INTO `user` VALUES ('14', 'chenjialuo', '', '202cb962ac59075b964b07152d234b70', '0', 'chenjialuo@qq.com', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1514093920321&di=913e88c23f382933ef430024afd9128a&imgtype=0&src=http%3A%2F%2Fp.3761.com%2Fpic%2F9771429316733.jpg', '2017-12-24 06:30:46');
INSERT INTO `user` VALUES ('15', 'yuanchengzhi', '', '202cb962ac59075b964b07152d234b70', '1', 'yuanchengzhi@qq.com', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1514093920321&di=913e88c23f382933ef430024afd9128a&imgtype=0&src=http%3A%2F%2Fp.3761.com%2Fpic%2F9771429316733.jpg', '2017-12-24 06:30:46');
INSERT INTO `user` VALUES ('16', 'chuliuxiang', '', '202cb962ac59075b964b07152d234b70', '1', 'chuliuxiang@qq.com', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1514093920321&di=913e88c23f382933ef430024afd9128a&imgtype=0&src=http%3A%2F%2Fp.3761.com%2Fpic%2F9771429316733.jpg', '2017-12-24 06:30:46');
INSERT INTO `user` VALUES ('17', 'baizhantang', '', '202cb962ac59075b964b07152d234b70', '0', 'baizhantang@qq.com', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1514093920321&di=913e88c23f382933ef430024afd9128a&imgtype=0&src=http%3A%2F%2Fp.3761.com%2Fpic%2F9771429316733.jpg', '2017-12-24 06:30:46');
INSERT INTO `user` VALUES ('18', 'renwoxing', '', '202cb962ac59075b964b07152d234b70', '1', 'renwoxing@qq.com', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1514093920321&di=913e88c23f382933ef430024afd9128a&imgtype=0&src=http%3A%2F%2Fp.3761.com%2Fpic%2F9771429316733.jpg', '2017-12-24 06:30:46');
INSERT INTO `user` VALUES ('19', 'zuolengchan', '', '202cb962ac59075b964b07152d234b70', '1', 'zuolengchan@qq.com', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1514093920321&di=913e88c23f382933ef430024afd9128a&imgtype=0&src=http%3A%2F%2Fp.3761.com%2Fpic%2F9771429316733.jpg', '2017-12-24 06:30:46');
INSERT INTO `user` VALUES ('20', 'fengqingyang', '', '202cb962ac59075b964b07152d234b70', '1', 'fengqingyang@qq.com', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1514093920321&di=913e88c23f382933ef430024afd9128a&imgtype=0&src=http%3A%2F%2Fp.3761.com%2Fpic%2F9771429316733.jpg', '2017-12-24 06:30:46');
-- ----------------------------
-- View structure for pvview
-- ----------------------------
DROP VIEW IF EXISTS `pvview`;
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` VIEW `pvview` AS select sum(pv) as pv,uid from pv group by uid ;
-- ----------------------------
-- View structure for totalpvview
-- ----------------------------
DROP VIEW IF EXISTS `totalpvview`;
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` VIEW `totalpvview` AS select sum(pageView) as totalPv,uid from article a group by uid ;
SET FOREIGN_KEY_CHECKS=1;