|
|
|
|
/*
|
|
|
|
|
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表示草稿箱,1表示已发表,2表示已删除',
|
|
|
|
|
`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', 'Linux中安装zookeeper', '最近打算出一个系列,介绍Dubbo的使用。\n\n---\n分布式应用现在已经越来越广泛,Spring Could也是一个不错的一站式解决方案,不过据我了解国内目前貌似使用阿里Dubbo的公司比较多,一方面这个框架也确实很OK,另一方面可能也是因为Dubbo的中文文档比较全的缘故,据Dubbo官网上的消息,阿里已经重新开始了对Dubbo的维护,这也算是使用Dubbo的互联网公司的福音了吧。OK,废话不多说,今天我们就先来看看如何在Linux上安装zookeeper。\n\n---\n\n了解过Dubbo的小伙伴都知道,Dubbo官方建议我们使用的注册中心就是zookeeper,zookeeper本来是Hadoop的一个子项目,现在发展成了Apache的顶级项目,看名字就知道Zookeeper就是动物园管理员,管理Hadoop(大象)、Hive(蜂房/蜜蜂)等动物。Apache上的Zookeeper分Linux版和Windows版,但是考虑到实际生产环境都是Linux,所以我们这里主要介绍Linux上Zookeeper的安装,Windows上Zookeeper的安装则比较简单,下载解压即可,和Tomcat差不多。\n\nOK,废话不多说,接下来我们就来看看zookeeper的安装步骤。\n\n---\n环境:\n>1.VMware® Workstation 12 Pro \n>2.CentOS7 \n>3.zookeeper-3.4.10(本文写作时的最新稳定版) \n\n---\n# 安装步骤\n1.下载zookeeper\n\nzookeeper下载地址如下,小伙伴们可以在第一个地址中选择适合自己的zookeeper版本,也可以直接点击第二个地址下载我们本文使用的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,一开始决定使用easyUI就注定了项目整体上前后端分离,基本上所有的请求都采用Ajax来完成。在文件上传的时候用到了Ajax上传文件,以及图片在上传之前的预览效果,解决了这两个小问题,和小伙伴们分享下。\n\n---\n# 上传之前的预览\n\n## 方式一\n先来说说图片上传之前的预览问题。这里主要采用了HTML5中的FileReader对象来实现,关于FileReader对象,如果小伙伴们不了解,可以查看这篇博客[HTML5学习之FileReader接口](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', '一个简单的案例带你入门Dubbo分布式框架666', '相信有很多小伙伴都知道,dubbo是一个分布式、高性能、透明化的RPC服务框架,提供服务自动注册、自动发现等高效服务治理方案,dubbo的中文文档也是非常全的,中文文档可以参考这里**[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工程中添加三个模块,分别是common,provider和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上的学习资料', '## 缘起\n从年初到现在,在GitHub上也积累了几个开源项目,从我个人的角度来看,我觉得这些开源项目对于JavaEE初学者是有很大的参考价值的,因此我将这些项目和案例分享出来,希望能够给初学者一些帮助。 \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+SpringSecurity处理Ajax登录请求', '最近在项目中遇到了这样一个问题:前后端分离,前端用Vue来做,所有的数据请求都使用vue-resource,没有使用表单,因此数据交互都是使用JSON,后台使用Spring Boot,权限验证使用了Spring Security,因为之前用Spring Security都是处理页面的,这次单纯处理Ajax请求,因此记录下遇到的一些问题。这里的解决方案不仅适用于Ajax请求,也可以解决移动端请求验证。 \n\n### 创建工程\n\n首先我们需要创建一个Spring Boot工程,创建时需要引入Web、Spring Security、MySQL和MyBatis(数据库框架其实随意,我这里使用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**依赖是我手动加入进来的,这是一个Apache的开源项目,可以用来生成MD5消息摘要,我在后文中将对密码进行简单的处理。 \n\n### 创建数据库并配置\n\n为了简化逻辑,我这里创建了三个表,分别是用户表、角色表、用户角色关联表,如下: \n\n![p271]() \n\n接下来我们需要在application.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表示档期账户是否启用,这个我数据库中确实有该字段,因此根据查询结果返回,其他的为了简单期间都直接返回true,getAuthorities方法返回当前用户的角色信息,用户的角色其实就是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中的索引', '索引就像图书的目录一样,可以让我们快速定位到需要的内容,关系型数据库中有索引,NoSQL中当然也有,本文我们就先来简单介绍下MongoDB中的索引。 \n\n本文是MongoDB系列的第九篇文章,了解前面的文章有助于更好的理解本文: \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学习资料', '关于Git的用法我们已经写七篇文章,介绍了Git的不少用法,这些足以应付工作中90%的需求了,剩下的10%就需要小伙伴们在工作中自己慢慢总结了,我这里再给小伙伴们推荐一点Git学习资料,为我们的Git系列画上一个句号。 \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', '人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2', '<p>人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2</p>\n', '人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2人生感悟2', '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;
|