-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathblog.sql
More file actions
198 lines (177 loc) · 54.5 KB
/
Copy pathblog.sql
File metadata and controls
198 lines (177 loc) · 54.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
/*
Navicat Premium Data Transfer
Source Server : localhost_3306
Source Server Type : MySQL
Source Server Version : 50725
Source Host : localhost:3306
Source Schema : blog
Target Server Type : MySQL
Target Server Version : 50725
File Encoding : 65001
Date: 24/05/2019 20:34:40
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for tb_article
-- ----------------------------
DROP TABLE IF EXISTS `tb_article`;
CREATE TABLE `tb_article` (
`id` int(20) NOT NULL AUTO_INCREMENT COMMENT '编号',
`title` varchar(400) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标题',
`cover` varchar(400) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '封面图片',
`author` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '作者',
`content` mediumtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '内容',
`content_md` mediumtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '内容-Markdown',
`category` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '分类',
`tags` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标签',
`state` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '状态',
`views` int(20) NULL DEFAULT 0 COMMENT '浏览数',
`publish_time` datetime(0) NULL DEFAULT NULL COMMENT '发布时间',
`edit_time` datetime(0) NOT NULL COMMENT '上次修改时间',
`create_time` datetime(0) NOT NULL COMMENT '创建时间',
`type` int(1) NULL DEFAULT 0 COMMENT '类型, 0原创 1转载',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '文章表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of tb_article
-- ----------------------------
INSERT INTO `tb_article` VALUES (6, 'SpringBoot整合Mybatis实现CRUD', '/site/images/thumbs/11.jpg', 'Cing', '<p>这次我们整合SpringBoot-Mybatis实现简单的CRUD业务。</p>\n<p>需求:</p>\n<ul>\n<li>详解SpringBoot工程的构建、与SSM项目在工程搭建上的不同。</li><li>实现SpringBoot-Mybatis整合征服数据库。</li><li>解决页面跳转,详解与SSM阶段的不同。</li><li>实现分页查询,使用PaheHelper插件和ElementUI分页控件。</li><li>实现文件上传。</li><li>使用Spring AOP切面编程实现简易的实现登录拦截工程。</li></ul>\n<p><strong>如果觉得不错就点击右上角star鼓励一下笔者吧(#^.^#)</strong></p>\n<h1 id=\"h1--spring-boot-\"><a name=\"教你优雅的入门Spring Boot框架\" class=\"reference-link\"></a><span class=\"header-link octicon octicon-link\"></span>教你优雅的入门Spring Boot框架</h1><p><strong>技术栈</strong></p>\n<ul>\n<li>后端: SpringBoot + Mybatis</li><li>前端: Vue.JS + ElementUI</li></ul>\n<p><strong>测试环境</strong></p>\n<ul>\n<li>IDEA + SpringBoot-2.0.5</li></ul>\n<p><strong>项目设计</strong></p>\n<pre><code>.\n├── db -- sql文件\n├── mvnw \n├── mvnw.cmd\n├── pom.xml -- 项目依赖\n└── src\n ├── main\n │ ├── java\n │ │ └── cn\n │ │ └── tycoding\n │ │ ├── SpringbootApplication.java -- Spring Boot启动类\n │ │ ├── controller -- MVC-WEB层\n │ │ ├── entity -- 实体类\n │ │ ├── interceptor -- 自定义拦截器\n │ │ ├── mapper -- mybatis-Mapper层接口\n │ │ └── service -- service业务层\n │ └── resources -- Spring Boot资源文件 \n │ ├── application.yml -- Spring Boot核心配置文件\n │ ├── mapper -- Mybatis Mapper层配置文件\n │ ├── static -- 前端静态文件\n │ └── templates -- Thymeleaf模板引擎识别的HTML页面目录\n └── test -- 测试文件\n</code></pre><h1 id=\"h1-u51C6u5907\"><a name=\"准备\" class=\"reference-link\"></a><span class=\"header-link octicon octicon-link\"></span>准备</h1><p>开始实战Spring Boot项目,首先,你需要将Spring Boot工程搭建出来。</p>\n<h2 id=\"h2-spring-boot-\"><a name=\"Spring Boot应用启动器\" class=\"reference-link\"></a><span class=\"header-link octicon octicon-link\"></span>Spring Boot应用启动器</h2><p>Spring Boot提供了很多应用启动器,分别用来支持不同的功能,说白了就是<code>pom.xml</code>中的依赖配置,因为Spring Boot的自动化配置特性,我们并不需再考虑项目依赖版本问题,使用Spring Boot的应用启动器,它能自动帮我们将相关的依赖全部导入到项目中。</p>\n<p>我们这里介绍几个常见的应用启动器:</p>\n<ul>\n<li><code>spring-boot-starter</code>: Spring Boot的核心启动器,包含了自动配置、日志和YAML</li><li><code>spring-boot-starter-aop</code>: 支持AOP面向切面编程的功能,包括spring-aop和AspecJ</li><li><code>spring-boot-starter-cache</code>: 支持Spring的Cache抽象</li><li><code>spring-boot-starter-artermis</code>: 通过Apache Artemis支持JMS(Java Message Service)的API</li><li><code>spring-boot-starter-data-jpa</code>: 支持JPA</li><li><code>spring-boot-starter-data-solr</code>: 支持Apache Solr搜索平台,包括spring-data-solr</li><li><code>spring-boot-starter-freemarker</code>: 支持FreeMarker模板引擎</li><li><code>spring-boot-starter-jdbc</code>: 支持JDBC数据库</li><li><code>spring-boot-starter-Redis</code>: 支持Redis键值储存数据库,包括spring-redis</li><li><code>spring-boot-starter-security</code>: 支持spring-security</li><li><code>spring-boot-starter-thymeleaf</code>: 支持Thymeleaf模板引擎,包括与Spring的集成</li><li><code>spring-boot-starter-web</code>: 支持全栈式web开发,包括tomcat和Spring-WebMVC</li><li><code>spring-boot-starter-log4j</code>: 支持Log4J日志框架</li><li><code>spring-boot-starter-logging</code>: 引入Spring Boot默认的日志框架Logback</li></ul>\n<h2 id=\"h2-spring-boot-\"><a name=\"Spring Boot项目结构设计\" class=\"reference-link\"></a><span class=\"header-link octicon octicon-link\"></span>Spring Boot项目结构设计</h2><p>Spring Boot项目(即Maven项目),当然拥有最基础的Maven项目结构。除此之外:</p>\n<ol>\n<li>Spring Boot项目中不包含webapp(webroot)目录。</li><li>Spring Boot默认提供的静态资源目录需要置于classpath下,且其下的目录名称要符合一定规定。</li><li>Spring Boot默认不提倡用XML配置文件,主张使用YML作为配置文件格式,YML有更简洁的语法。当然也可以使用.properties作为配置文件格式。</li><li>Spring Boot官方推荐使用Thymeleaf作为前端模板引擎,并且Thymeleaf默认将templates作为静态页面的存放目录(由配置文件指定)。</li><li><p>Spring Boot默认将<code>resources</code>作为静态资源的存放目录,存放前端静态文件、项目配置文件。</p>\n</li><li><p>Spring Boot规定<code>resources</code>下的子级目录名要符合一定规则,一般我们设置<code>resources/static</code>为前端静态(JS,CSS)的存放目录;设置<code>resources/templates</code>作为HTML页面的存放目录。</p>\n</li><li><p>Spring Boot指定的Thymeleaf模板引擎文件目录<code>/resources/templates</code>是受保护的目录,想当与之前的WEB-INF文件夹,里面的静态资源不能直接访问,一般我们通过Controller映射访问。</p>\n</li><li><p>建议将Mybatis-Mapper的XML映射文件放于<code>resources/</code>目录下,我这里设为<code>resources/mapper</code>目录,且<code>src/main/java/Mapper</code>下的Mapper层接口要使用<code><a href=\"https://github.com/Mapper\" title=\"@Mapper\" class=\"at-link\"><a href=\"https://github.com/Mapper\" title=\"@Mapper\" class=\"at-link\">@Mapper</a></a></code>注解标识,不然mybatis找不到接口对应的XML映射文件。</p>\n</li><li><p><code>SpringBootApplication.java</code>为项目的启动器类,项目不需要部署到Tomcat上,由SpringBoot提供的服务器部署项目(运行启动器类即可);且SpringBoot会自动扫描该启动器同级和子级下用注解标识的Bean。</p>\n</li><li><p>Spring Boot不建议使用JSP页面,如果想使用,请自行百度解决办法。</p>\n</li><li><p>上面说了Spring Boot提供的存放HTML静态页面的目录<code>resources/templates</code>是受保护的目录,访问其中的HTML页面要通过Controller映射,这就间接规定了你需要配置Spring的视图解析器,且Controller类不能使用<code><a href=\"https://github.com/RestController\" title=\"@RestController\" class=\"at-link\"><a href=\"https://github.com/RestController\" title=\"@RestController\" class=\"at-link\">@RestController</a></a></code>标识。</p>\n</li></ol>\n<h1 id=\"h1-u8D77u6B65\"><a name=\"起步\" class=\"reference-link\"></a><span class=\"header-link octicon octicon-link\"></span>起步</h1><p><em>首先:</em> <strong>我想特殊强调的是:SpringBoot不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式</strong>。一定要切记这一点。</p>\n<p>学习SpringBoot框架,只是为了更简便的使用Spring框架,我们在SSM阶段学习的知识现在放在Spring Boot框架上开发是完全适用的,我们学习的大多数是SpringBoot的自动化配置方式。</p>\n<p>因为Spring Boot框架的一大优势就是自动化配置,从pom.xml的配置中就能明显感受到。</p>\n<h2 id=\"h2-springboot-mybatis\"><a name=\"SpringBoot整合Mybatis\" class=\"reference-link\"></a><span class=\"header-link octicon octicon-link\"></span>SpringBoot整合Mybatis</h2><p>之前已经说过:<strong>SpringBoot框架不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式</strong></p>\n<p>所以说,SpringBoot整合Mybatis的思想和Spring整合Mybatis的思想基本相同,不同之处有两点:</p>\n<ul>\n<li><p>1.Mapper接口的XML配置文件变化。之前我们使用Mybatis接口代理开发,规定Mapper映射文件要和接口在一个目录下;而这里Mapper映射文件置于<code>resources/mapper/</code>下,且置于<code>src/main/java/</code>下的Mapper接口需要用<code><a href=\"https://github.com/Mapper\" title=\"@Mapper\" class=\"at-link\"><a href=\"https://github.com/Mapper\" title=\"@Mapper\" class=\"at-link\">@Mapper</a></a></code>注解标识,不然映射文件与接口无法匹配。</p>\n</li><li><p>2.SpringBoot建议使用YAML作为配置文件,它有更简便的配置方式。所以整合Mybatis在配置文件上有一定的区别,但最终都是那几个参数的配置。</p>\n</li></ul>\n<p>关于YAML的语法请自行百度,我这里也仅仅是满足基本的配置需求,不涉及那种不易理解的语法。</p>\n<h3 id=\"h3-u6574u5408u914Du7F6Eu6587u4EF6\"><a name=\"整合配置文件\" class=\"reference-link\"></a><span class=\"header-link octicon octicon-link\"></span>整合配置文件</h3><p>在Spring阶段用XML配置mybatis无非就是配置:1.连接池;2.数据库url连接;3.mysql驱动;4.其他初始化配置</p>\n<pre><code class=\"lang-YAML\">spring:\n datasource:\n name: springboot\n type: com.alibaba.druid.pool.DruidDataSource\n #druid相关配置\n druid:\n #监控统计拦截的filters\n filter: stat\n #mysql驱动\n driver-class-name: com.mysql.jdbc.Driver\n #基本属性\n url: jdbc:mysql://127.0.0.1:3306/springboot?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true\n username: root\n password: root\n #配置初始化大小/最小/最大\n initial-size: 1\n min-idle: 1\n max-active: 20\n #获取连接等待超时时间\n max-wait: 60000\n #间隔多久进行一次检测,检测需要关闭的空闲连接\n time-between-eviction-runs-millis: 60000\n\n #mybatis配置\n mybatis:\n mapper-locations: classpath:mapper/*.xml\n type-aliases-package: cn.tycoding.entity\n</code></pre>\n<p><strong>注意:空格代表节点层次;注释部分用<code>#</code>标记</strong></p>\n<p><strong>解释</strong></p>\n<ol>\n<li><p>我们实现的是spring-mybatis的整合,包含mybatis的配置以及datasource数据源的配置当然属于spring配置中的一部分,所以需要在<code>spring:</code>下。</p>\n</li><li><p><code>mapper-locations</code>相当于XML中的<code><property name="mapperLocations"></code>用来扫描Mapper层的配置文件,由于我们的配置文件在<code>resources</code>下,所以需要指定<code>classpath:</code>。</p>\n</li><li><p><code>type-aliases-package</code>相当与XML中<code><property name="typeAliasesPackase"></code>别名配置,一般取其下实体类类名作为别名。</p>\n</li><li><p><code>datasource</code>数据源的配置,<code>name</code>表示当前数据源的名称,类似于之前的<code><bean id="dataSource"></code>id属性,这里可以任意指定,因为我们无需关注Spring是怎么注入这个Bean对象的。</p>\n</li><li><p><code>druid</code>代表本项目中使用了阿里的druid连接池,<code>driver-class-name:</code>相当于XML中的<code><property name="driverClassName"></code>;<code>url</code>代表XML中的<code><property name="url"></code>;<code>username</code>代表XML中的<code><property name="username"></code>;<code>password</code>代表XML中的<code><property name="password"></code>;其他druid的私有属性配置不再解释。这里注意druid连接池和c3p0连接池在XML的<property>的name中就不同,在此处SpringBoot的配置中当然名称也不同。</p>\n</li></ol>\n<p>如果Spring整合Mybtis的配置你已经很熟悉了,那么这个配置你肯定也很眼熟,从英文名称上就很容易区分出来。这里需要注意的就是YAML语法规定不同行空格代表了不同的层级结构。</p>\n<p>既然完成了SpringBoot-Mybatis基本配置下面我们实战讲解如何实现基本的CRUD。</p>\n<h3 id=\"h3-u5B9Eu73B0u67E5u8BE2\"><a name=\"实现查询\" class=\"reference-link\"></a><span class=\"header-link octicon octicon-link\"></span>实现查询</h3><blockquote>\n<p>1.在<code>src/main/java/cn/tycoding/entity/</code>下新建<code>User.java</code>实体类</p>\n</blockquote>\n<pre><code class=\"lang-java\">public class User implements Serializable {\n private Long id; //编号\n private String username; //用户名\n private String password; //密码\n //getter/setter\n}\n</code></pre>\n<blockquote>\n<p>2.在<code>src/main/java/cn/tycoding/service/</code>下创建<code>BaseService.java</code>通用接口,目的是简化service层接口基本CRUD方法的编写。</p>\n</blockquote>\n<pre><code class=\"lang-java\">public interface BaseService<T> {\n\n // 查询所有\n List<T> findAll();\n\n //根据ID查询\n List<T> findById(Long id);\n\n //添加\n void create(T t);\n\n //删除(批量)\n void delete(Long... ids);\n\n //修改\n void update(T t);\n}\n</code></pre>\n<p>以上就是我对Service层基本CRUD接口的简易封装,使用了泛型类,其继承接口指定了什么泛型,T就代表什么类。</p>\n<blockquote>\n<p>3.在<code>src/main/java/cn/tycoding/service/</code>下创建<code>UserService.java</code>接口:</p>\n</blockquote>\n<pre><code class=\"lang-java\">public interface UserService extends BaseService<User> {}\n</code></pre>\n<blockquote>\n<p>4.在<code>src/main/java/cn/tycoding/service/impl/</code>下创建<code>UserServiceImpl.java</code>实现类:</p>\n</blockquote>\n<pre><code class=\"lang-java\">@Service\npublic class UserServiceImpl implements UserService {\n\n @Autowired\n private UserMapper userMapper;\n\n @Override\n public List<User> findAll() {\n return userMapper.findAll();\n }\n\n //其他方法省略\n}\n</code></pre>\n<blockquote>\n<p>5.在<code>src/main/java/cn/tycoding/mapper/</code>下创建<code>UserMapper.java</code>Mapper接口类:</p>\n</blockquote>\n<pre><code class=\"lang-java\">@Mapper\npublic interface UserMapper {\n List<User> findAll();\n}\n</code></pre>\n<p>如上,我们一定要使用<code><a href=\"https://github.com/Mapper\" title=\"@Mapper\" class=\"at-link\">@Mapper</a></code>接口标识这个接口,不然Mybatis找不到其对应的XML映射文件。</p>\n<blockquote>\n<p>6.在<code>src/main/resources/mapper/</code>下创建<code>UserMapper.xml</code>映射文件:</p>\n</blockquote>\n<pre><code class=\"lang-xml\"><?xml version="1.0" encoding="UTF-8" ?>\n<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >\n<mapper namespace="cn.tycoding.mapper.UserMapper">\n\n <!-- 查询所有 -->\n <select id="findAll" resultType="cn.tycoding.entity.User">\n SELECT * FROM tb_user\n </select>\n</mapper>\n</code></pre>\n<blockquote>\n<p>7.在<code>src/main/java/cn/tycoding/controller/admin/</code>下创建<code>UserController.java</code></p>\n</blockquote>\n<pre><code class=\"lang-java\">@RestController\npublic class UserController {\n @Autowired\n private UserService userService;\n\n @RequestMapping("/findAll")\n public List<User> findAll() {\n return userService.findAll();\n }\n}\n</code></pre>\n<blockquote>\n<p>8.运行<code>src/main/java/cn/tycoding/SpringbootApplication.java</code>的main方法,启动springboot</p>\n</blockquote>\n<p>在浏览器上访问<code>localhost:8080/findAll</code>即可得到一串JSON数据。</p>\n<h3 id=\"h3-u601Du8003\"><a name=\"思考\" class=\"reference-link\"></a><span class=\"header-link octicon octicon-link\"></span>思考</h3><p>看了上面一步步的讲解。你应该明白了,其实和SSM阶段的CRUD基本相同,这里我就不再举例其他方法。</p>\n<p>下面我们讲解一下不同的地方:</p>\n<h2 id=\"h2-u5B9Eu73B0u9875u9762u8DF3u8F6C\"><a name=\"实现页面跳转\" class=\"reference-link\"></a><span class=\"header-link octicon octicon-link\"></span>实现页面跳转</h2><p>因为Thymeleaf指定的目录<code>src/main/resources/templates/</code>是受保护的目录,其下的资源不能直接通过浏览器访问,可以使用Controller映射的方式访问,怎么映射呢?</p>\n<blockquote>\n<p>1.在application.yml中添加配置</p>\n</blockquote>\n<pre><code class=\"lang-yaml\">spring:\n thymeleaf:\n prefix: classpath:/templates/\n check-template-location: true\n suffix: .html\n encoding: UTF-8\n mode: LEGACYHTML5\n cache: false\n</code></pre>\n<p>指定Thymeleaf模板引擎扫描<code>resources</code>下的<code>templates</code>文件夹中已<code>.html</code>结尾的文件。这样就实现了MVC中关于视图解析器的配置:</p>\n<pre><code class=\"lang-xml\"> <!-- 配置视图解析器 -->\n <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">\n <property name="prefix" value="/"/>\n <property name="suffix" value=".jsp"/>\n </bean>\n</code></pre>\n<p>是不是感觉方便很多呢?但这里需要注意的是:<code>classpath:</code>后的目录地址一定要先加<code>/</code>,比如目前的<code>classpath:/templates/</code>。</p>\n<blockquote>\n<p>2.在Controller添加映射方法</p>\n</blockquote>\n<pre><code class=\"lang-java\"> @GetMapping(value = {"/", "/index"})\n public String index() {\n return "home/index";\n }\n</code></pre>\n<p>这样,访问<code>localhost:8080/index</code>将直接跳转到<code>resources/templates/home/index.html</code>页面。</p>\n<h2 id=\"h2-u5B9Eu73B0u5206u9875u67E5u8BE2\"><a name=\"实现分页查询\" class=\"reference-link\"></a><span class=\"header-link octicon octicon-link\"></span>实现分页查询</h2><p>首先我们需要在application.yml中配置pageHelper插件</p>\n<pre><code class=\"lang-yaml\">pagehelper:\n pagehelperDialect: mysql\n reasonable: true\n support-methods-arguments: true\n</code></pre>\n<p>我这里使用了Mybatis的PageHelper分页插件,前端使用了ElementUI自带的分页插件:具体的教程请查看我的博客:<a href=\"http://tycoding.cn/2018/07/30/vue-6/\">SpringMVC+ElementUI实现分页查询</a></p>\n<p><strong>核心配置:</strong></p>\n<p><code>UserServiceImp.java</code></p>\n<pre><code class=\"lang-java\"> public PageBean findByPage(Goods goods, int pageCode, int pageSize) {\n //使用Mybatis分页插件\n PageHelper.startPage(pageCode, pageSize);\n\n //调用分页查询方法,其实就是查询所有数据,mybatis自动帮我们进行分页计算\n Page<Goods> page = goodsMapper.findByPage(goods);\n\n return new PageBean(page.getTotal(), page.getResult());\n }\n</code></pre>\n<h2 id=\"h2-u5B9Eu73B0u6587u4EF6u4E0Au4F20\"><a name=\"实现文件上传\" class=\"reference-link\"></a><span class=\"header-link octicon octicon-link\"></span>实现文件上传</h2><p>这里涉及的无非就是SpringMVC的文件上传,详细的教程请参看我的博客:<a href=\"http://tycoding.cn/2018/05/31/Spring-6/\">SpringMVC实现文件上传和下载</a></p>\n<p>因为本项目中前端使用了ElementUI+Vue.JS技术,所以前端的文件上传和回显教程请看我的博客:<a href=\"http://tycoding.cn/2018/08/05/vue-7/\">SpringMVC+ElementUI实现图片上传和回显</a></p>\n<p>除了代码的编写,这里还要在application.yml中进行配置:</p>\n<pre><code class=\"lang-yaml\">spring:\n servlet:\n multipart:\n max-file-size: 10Mb\n max-request-size: 100Mb\n</code></pre>\n<p>这就相当于SpringMVC的XML配置:</p>\n<pre><code class=\"lang-xml\"><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">\n <property name="maxUploadSize" value="500000"/>\n</bean>\n</code></pre>\n<h2 id=\"h2--spring-aop-\"><a name=\"使用Spring AOP切面编程实现简单的登录拦截器\" class=\"reference-link\"></a><span class=\"header-link octicon octicon-link\"></span>使用Spring AOP切面编程实现简单的登录拦截器</h2><p>本项目,我们先不整合Shiro和Spring Security这些安全框架,使用Spring AOP切面编程思想实现简单的登录拦截:</p>\n<pre><code class=\"lang-java\">@Component\n@Aspect\npublic class MyInterceptor {\n\n @Pointcut("within (cn.tycoding.controller..*) && !within(cn.tycoding.controller.admin.LoginController)")\n public void pointCut() {\n }\n @Around("pointCut()")\n public Object trackInfo(ProceedingJoinPoint joinPoint) throws Throwable {\n ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();\n HttpServletRequest request = attributes.getRequest();\n User user = (User) request.getSession().getAttribute("user");\n if (user == null) {\n attributes.getResponse().sendRedirect("/login"); //手动转发到/login映射路径\n }\n return joinPoint.proceed();\n }\n}\n</code></pre>\n<p><strong>解释</strong></p>\n<p>关于Spring AOP的切面编程请自行百度,或者你也可以看我的博客:<a href=\"http://tycoding.cn/2018/05/25/Spring-3/\">Spring AOP思想</a>。我们需要注意以下几点</p>\n<ol>\n<li><p>一定要熟悉AspectJ的切点表达式,在这里:<code>..*</code>表示其目录下的所有方法和子目录方法。</p>\n</li><li><p>如果进行了登录拦截,即在session中没有获取到用户的登录信息,我们可能需要手动转发到<code>login</code>页面,这里访问的是<code>login</code>映射。</p>\n</li><li><p>基于2,一定要指定Object返回值,若AOP拦截的Controller return了一个视图地址,那么本来Controller应该跳转到这个视图地址的,但是被AOP拦截了,那么原来Controller仍会执行return,但是视图地址却找不到404了。</p>\n</li><li><p>切记一定要调用proceed()方法,proceed():执行被通知的方法,如不调用将会阻止被通知的方法的调用,也就导致Controller中的return会404。</p>\n</li></ol>\n<h1 id=\"h1-preview\"><a name=\"Preview\" class=\"reference-link\"></a><span class=\"header-link octicon octicon-link\"></span>Preview</h1><p><img src=\"http://upload-images.jianshu.io/upload_images/12613204-5ee5d4142c7df1c2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240\" alt=\"image\"></p>\n<p><img src=\"http://upload-images.jianshu.io/upload_images/12613204-ed364d2f838465c1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240\" alt=\"image\"></p>\n<p><img src=\"http://upload-images.jianshu.io/upload_images/12613204-98635201a03eb4a2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240\" alt=\"image\"></p>\n<p><img src=\"http://upload-images.jianshu.io/upload_images/12613204-0ca3c4c60e3abc54.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240\" alt=\"image\"></p>\n', '这次我们整合SpringBoot-Mybatis实现简单的CRUD业务。\n\n需求:\n\n* 详解SpringBoot工程的构建、与SSM项目在工程搭建上的不同。\n* 实现SpringBoot-Mybatis整合征服数据库。\n* 解决页面跳转,详解与SSM阶段的不同。\n* 实现分页查询,使用PaheHelper插件和ElementUI分页控件。\n* 实现文件上传。\n* 使用Spring AOP切面编程实现简易的实现登录拦截工程。\n\n**如果觉得不错就点击右上角star鼓励一下笔者吧(#^.^#)**\n\n\n# 教你优雅的入门Spring Boot框架\n\n**技术栈**\n\n* 后端: SpringBoot + Mybatis\n* 前端: Vue.JS + ElementUI\n\n**测试环境**\n\n* IDEA + SpringBoot-2.0.5\n\n**项目设计**\n\n```\n.\n├── db -- sql文件\n├── mvnw \n├── mvnw.cmd\n├── pom.xml -- 项目依赖\n└── src\n ├── main\n │ ├── java\n │ │ └── cn\n │ │ └── tycoding\n │ │ ├── SpringbootApplication.java -- Spring Boot启动类\n │ │ ├── controller -- MVC-WEB层\n │ │ ├── entity -- 实体类\n │ │ ├── interceptor -- 自定义拦截器\n │ │ ├── mapper -- mybatis-Mapper层接口\n │ │ └── service -- service业务层\n │ └── resources -- Spring Boot资源文件 \n │ ├── application.yml -- Spring Boot核心配置文件\n │ ├── mapper -- Mybatis Mapper层配置文件\n │ ├── static -- 前端静态文件\n │ └── templates -- Thymeleaf模板引擎识别的HTML页面目录\n └── test -- 测试文件\n```\n\n# 准备\n\n开始实战Spring Boot项目,首先,你需要将Spring Boot工程搭建出来。\n\n## Spring Boot应用启动器\n\nSpring Boot提供了很多应用启动器,分别用来支持不同的功能,说白了就是`pom.xml`中的依赖配置,因为Spring Boot的自动化配置特性,我们并不需再考虑项目依赖版本问题,使用Spring Boot的应用启动器,它能自动帮我们将相关的依赖全部导入到项目中。\n\n我们这里介绍几个常见的应用启动器:\n\n* `spring-boot-starter`: Spring Boot的核心启动器,包含了自动配置、日志和YAML\n* `spring-boot-starter-aop`: 支持AOP面向切面编程的功能,包括spring-aop和AspecJ\n* `spring-boot-starter-cache`: 支持Spring的Cache抽象\n* `spring-boot-starter-artermis`: 通过Apache Artemis支持JMS(Java Message Service)的API\n* `spring-boot-starter-data-jpa`: 支持JPA\n* `spring-boot-starter-data-solr`: 支持Apache Solr搜索平台,包括spring-data-solr\n* `spring-boot-starter-freemarker`: 支持FreeMarker模板引擎\n* `spring-boot-starter-jdbc`: 支持JDBC数据库\n* `spring-boot-starter-Redis`: 支持Redis键值储存数据库,包括spring-redis\n* `spring-boot-starter-security`: 支持spring-security\n* `spring-boot-starter-thymeleaf`: 支持Thymeleaf模板引擎,包括与Spring的集成\n* `spring-boot-starter-web`: 支持全栈式web开发,包括tomcat和Spring-WebMVC\n* `spring-boot-starter-log4j`: 支持Log4J日志框架\n* `spring-boot-starter-logging`: 引入Spring Boot默认的日志框架Logback\n\n## Spring Boot项目结构设计\n\nSpring Boot项目(即Maven项目),当然拥有最基础的Maven项目结构。除此之外:\n\n1. Spring Boot项目中不包含webapp(webroot)目录。\n2. Spring Boot默认提供的静态资源目录需要置于classpath下,且其下的目录名称要符合一定规定。\n3. Spring Boot默认不提倡用XML配置文件,主张使用YML作为配置文件格式,YML有更简洁的语法。当然也可以使用.properties作为配置文件格式。\n4. Spring Boot官方推荐使用Thymeleaf作为前端模板引擎,并且Thymeleaf默认将templates作为静态页面的存放目录(由配置文件指定)。\n5. Spring Boot默认将`resources`作为静态资源的存放目录,存放前端静态文件、项目配置文件。\n\n6. Spring Boot规定`resources`下的子级目录名要符合一定规则,一般我们设置`resources/static`为前端静态(JS,CSS)的存放目录;设置`resources/templates`作为HTML页面的存放目录。\n\n7. Spring Boot指定的Thymeleaf模板引擎文件目录`/resources/templates`是受保护的目录,想当与之前的WEB-INF文件夹,里面的静态资源不能直接访问,一般我们通过Controller映射访问。\n\n8. 建议将Mybatis-Mapper的XML映射文件放于`resources/`目录下,我这里设为`resources/mapper`目录,且`src/main/java/Mapper`下的Mapper层接口要使用`@Mapper`注解标识,不然mybatis找不到接口对应的XML映射文件。\n\n9. `SpringBootApplication.java`为项目的启动器类,项目不需要部署到Tomcat上,由SpringBoot提供的服务器部署项目(运行启动器类即可);且SpringBoot会自动扫描该启动器同级和子级下用注解标识的Bean。\n\n10. Spring Boot不建议使用JSP页面,如果想使用,请自行百度解决办法。\n\n11. 上面说了Spring Boot提供的存放HTML静态页面的目录`resources/templates`是受保护的目录,访问其中的HTML页面要通过Controller映射,这就间接规定了你需要配置Spring的视图解析器,且Controller类不能使用`@RestController`标识。\n\n\n# 起步\n\n*首先:* **我想特殊强调的是:SpringBoot不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式**。一定要切记这一点。\n\n学习SpringBoot框架,只是为了更简便的使用Spring框架,我们在SSM阶段学习的知识现在放在Spring Boot框架上开发是完全适用的,我们学习的大多数是SpringBoot的自动化配置方式。\n\n因为Spring Boot框架的一大优势就是自动化配置,从pom.xml的配置中就能明显感受到。\n\n## SpringBoot整合Mybatis\n\n之前已经说过:**SpringBoot框架不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式**\n\n所以说,SpringBoot整合Mybatis的思想和Spring整合Mybatis的思想基本相同,不同之处有两点:\n\n* 1.Mapper接口的XML配置文件变化。之前我们使用Mybatis接口代理开发,规定Mapper映射文件要和接口在一个目录下;而这里Mapper映射文件置于`resources/mapper/`下,且置于`src/main/java/`下的Mapper接口需要用`@Mapper`注解标识,不然映射文件与接口无法匹配。\n\n* 2.SpringBoot建议使用YAML作为配置文件,它有更简便的配置方式。所以整合Mybatis在配置文件上有一定的区别,但最终都是那几个参数的配置。\n\n关于YAML的语法请自行百度,我这里也仅仅是满足基本的配置需求,不涉及那种不易理解的语法。\n\n### 整合配置文件\n在Spring阶段用XML配置mybatis无非就是配置:1.连接池;2.数据库url连接;3.mysql驱动;4.其他初始化配置\n\n```YAML\nspring:\n datasource:\n name: springboot\n type: com.alibaba.druid.pool.DruidDataSource\n #druid相关配置\n druid:\n #监控统计拦截的filters\n filter: stat\n #mysql驱动\n driver-class-name: com.mysql.jdbc.Driver\n #基本属性\n url: jdbc:mysql://127.0.0.1:3306/springboot?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true\n username: root\n password: root\n #配置初始化大小/最小/最大\n initial-size: 1\n min-idle: 1\n max-active: 20\n #获取连接等待超时时间\n max-wait: 60000\n #间隔多久进行一次检测,检测需要关闭的空闲连接\n time-between-eviction-runs-millis: 60000\n\n #mybatis配置\n mybatis:\n mapper-locations: classpath:mapper/*.xml\n type-aliases-package: cn.tycoding.entity\n```\n\n**注意:空格代表节点层次;注释部分用`#`标记**\n\n**解释**\n\n1. 我们实现的是spring-mybatis的整合,包含mybatis的配置以及datasource数据源的配置当然属于spring配置中的一部分,所以需要在`spring:`下。\n\n2. `mapper-locations`相当于XML中的`<property name=\"mapperLocations\">`用来扫描Mapper层的配置文件,由于我们的配置文件在`resources`下,所以需要指定`classpath:`。\n\n3. `type-aliases-package`相当与XML中`<property name=\"typeAliasesPackase\">`别名配置,一般取其下实体类类名作为别名。\n\n4. `datasource`数据源的配置,`name`表示当前数据源的名称,类似于之前的`<bean id=\"dataSource\">`id属性,这里可以任意指定,因为我们无需关注Spring是怎么注入这个Bean对象的。\n\n5. `druid`代表本项目中使用了阿里的druid连接池,`driver-class-name:`相当于XML中的`<property name=\"driverClassName\">`;`url`代表XML中的`<property name=\"url\">`;`username`代表XML中的`<property name=\"username\">`;`password`代表XML中的`<property name=\"password\">`;其他druid的私有属性配置不再解释。这里注意druid连接池和c3p0连接池在XML的<property>的name中就不同,在此处SpringBoot的配置中当然名称也不同。\n\n\n如果Spring整合Mybtis的配置你已经很熟悉了,那么这个配置你肯定也很眼熟,从英文名称上就很容易区分出来。这里需要注意的就是YAML语法规定不同行空格代表了不同的层级结构。\n\n既然完成了SpringBoot-Mybatis基本配置下面我们实战讲解如何实现基本的CRUD。\n\n### 实现查询\n\n> 1.在`src/main/java/cn/tycoding/entity/`下新建`User.java`实体类\n\n```java\npublic class User implements Serializable {\n private Long id; //编号\n private String username; //用户名\n private String password; //密码\n //getter/setter\n}\n```\n\n> 2.在`src/main/java/cn/tycoding/service/`下创建`BaseService.java`通用接口,目的是简化service层接口基本CRUD方法的编写。\n\n```java\npublic interface BaseService<T> {\n\n // 查询所有\n List<T> findAll();\n\n //根据ID查询\n List<T> findById(Long id);\n\n //添加\n void create(T t);\n\n //删除(批量)\n void delete(Long... ids);\n\n //修改\n void update(T t);\n}\n```\n\n以上就是我对Service层基本CRUD接口的简易封装,使用了泛型类,其继承接口指定了什么泛型,T就代表什么类。\n\n> 3.在`src/main/java/cn/tycoding/service/`下创建`UserService.java`接口:\n\n```java\npublic interface UserService extends BaseService<User> {}\n```\n\n> 4.在`src/main/java/cn/tycoding/service/impl/`下创建`UserServiceImpl.java`实现类:\n\n```java\n@Service\npublic class UserServiceImpl implements UserService {\n\n @Autowired\n private UserMapper userMapper;\n\n @Override\n public List<User> findAll() {\n return userMapper.findAll();\n }\n \n //其他方法省略\n}\n```\n\n> 5.在`src/main/java/cn/tycoding/mapper/`下创建`UserMapper.java`Mapper接口类:\n\n```java\n@Mapper\npublic interface UserMapper {\n List<User> findAll();\n}\n```\n\n如上,我们一定要使用`@Mapper`接口标识这个接口,不然Mybatis找不到其对应的XML映射文件。\n\n> 6.在`src/main/resources/mapper/`下创建`UserMapper.xml`映射文件:\n\n```xml\n<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\" >\n<mapper namespace=\"cn.tycoding.mapper.UserMapper\">\n\n <!-- 查询所有 -->\n <select id=\"findAll\" resultType=\"cn.tycoding.entity.User\">\n SELECT * FROM tb_user\n </select>\n</mapper>\n```\n\n> 7.在`src/main/java/cn/tycoding/controller/admin/`下创建`UserController.java`\n\n```java\n@RestController\npublic class UserController {\n @Autowired\n private UserService userService;\n \n @RequestMapping(\"/findAll\")\n public List<User> findAll() {\n return userService.findAll();\n }\n}\n```\n\n> 8.运行`src/main/java/cn/tycoding/SpringbootApplication.java`的main方法,启动springboot\n\n在浏览器上访问`localhost:8080/findAll`即可得到一串JSON数据。\n\n\n### 思考\n\n看了上面一步步的讲解。你应该明白了,其实和SSM阶段的CRUD基本相同,这里我就不再举例其他方法。\n\n下面我们讲解一下不同的地方:\n\n## 实现页面跳转\n\n因为Thymeleaf指定的目录`src/main/resources/templates/`是受保护的目录,其下的资源不能直接通过浏览器访问,可以使用Controller映射的方式访问,怎么映射呢?\n\n> 1.在application.yml中添加配置\n\n```yaml\nspring:\n thymeleaf:\n prefix: classpath:/templates/\n check-template-location: true\n suffix: .html\n encoding: UTF-8\n mode: LEGACYHTML5\n cache: false\n```\n\n指定Thymeleaf模板引擎扫描`resources`下的`templates`文件夹中已`.html`结尾的文件。这样就实现了MVC中关于视图解析器的配置:\n\n```xml\n <!-- 配置视图解析器 -->\n <bean class=\"org.springframework.web.servlet.view.InternalResourceViewResolver\">\n <property name=\"prefix\" value=\"/\"/>\n <property name=\"suffix\" value=\".jsp\"/>\n </bean>\n```\n\n是不是感觉方便很多呢?但这里需要注意的是:`classpath:`后的目录地址一定要先加`/`,比如目前的`classpath:/templates/`。\n\n> 2.在Controller添加映射方法\n\n```java\n @GetMapping(value = {\"/\", \"/index\"})\n public String index() {\n return \"home/index\";\n }\n```\n\n这样,访问`localhost:8080/index`将直接跳转到`resources/templates/home/index.html`页面。\n\n\n## 实现分页查询\n\n首先我们需要在application.yml中配置pageHelper插件\n\n```yaml\npagehelper:\n pagehelperDialect: mysql\n reasonable: true\n support-methods-arguments: true\n```\n\n我这里使用了Mybatis的PageHelper分页插件,前端使用了ElementUI自带的分页插件:具体的教程请查看我的博客:[SpringMVC+ElementUI实现分页查询](http://tycoding.cn/2018/07/30/vue-6/)\n\n**核心配置:**\n\n`UserServiceImp.java`\n\n```java\n public PageBean findByPage(Goods goods, int pageCode, int pageSize) {\n //使用Mybatis分页插件\n PageHelper.startPage(pageCode, pageSize);\n\n //调用分页查询方法,其实就是查询所有数据,mybatis自动帮我们进行分页计算\n Page<Goods> page = goodsMapper.findByPage(goods);\n\n return new PageBean(page.getTotal(), page.getResult());\n }\n```\n\n## 实现文件上传\n\n这里涉及的无非就是SpringMVC的文件上传,详细的教程请参看我的博客:[SpringMVC实现文件上传和下载](http://tycoding.cn/2018/05/31/Spring-6/)\n\n因为本项目中前端使用了ElementUI+Vue.JS技术,所以前端的文件上传和回显教程请看我的博客:[SpringMVC+ElementUI实现图片上传和回显](http://tycoding.cn/2018/08/05/vue-7/)\n\n除了代码的编写,这里还要在application.yml中进行配置:\n\n```yaml\nspring:\n servlet:\n multipart:\n max-file-size: 10Mb\n max-request-size: 100Mb\n```\n\n这就相当于SpringMVC的XML配置:\n\n```xml\n<bean id=\"multipartResolver\" class=\"org.springframework.web.multipart.commons.CommonsMultipartResolver\">\n <property name=\"maxUploadSize\" value=\"500000\"/>\n</bean>\n```\n\n## 使用Spring AOP切面编程实现简单的登录拦截器\n\n本项目,我们先不整合Shiro和Spring Security这些安全框架,使用Spring AOP切面编程思想实现简单的登录拦截:\n\n```java\n@Component\n@Aspect\npublic class MyInterceptor {\n\n @Pointcut(\"within (cn.tycoding.controller..*) && !within(cn.tycoding.controller.admin.LoginController)\")\n public void pointCut() {\n }\n @Around(\"pointCut()\")\n public Object trackInfo(ProceedingJoinPoint joinPoint) throws Throwable {\n ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();\n HttpServletRequest request = attributes.getRequest();\n User user = (User) request.getSession().getAttribute(\"user\");\n if (user == null) {\n attributes.getResponse().sendRedirect(\"/login\"); //手动转发到/login映射路径\n }\n return joinPoint.proceed();\n }\n}\n```\n\n**解释**\n\n关于Spring AOP的切面编程请自行百度,或者你也可以看我的博客:[Spring AOP思想](http://tycoding.cn/2018/05/25/Spring-3/)。我们需要注意以下几点\n\n1. 一定要熟悉AspectJ的切点表达式,在这里:`..*`表示其目录下的所有方法和子目录方法。\n\n2. 如果进行了登录拦截,即在session中没有获取到用户的登录信息,我们可能需要手动转发到`login`页面,这里访问的是`login`映射。\n\n3. 基于2,一定要指定Object返回值,若AOP拦截的Controller return了一个视图地址,那么本来Controller应该跳转到这个视图地址的,但是被AOP拦截了,那么原来Controller仍会执行return,但是视图地址却找不到404了。\n\n4. 切记一定要调用proceed()方法,proceed():执行被通知的方法,如不调用将会阻止被通知的方法的调用,也就导致Controller中的return会404。\n\n\n# Preview\n\n\n\n\n\n\n\n\n', '测试', '[]', '1', 1198, '2018-02-01 00:00:01', '2019-05-02 10:39:35', '2018-11-02 12:45:22', 0);
INSERT INTO `tb_article` VALUES (7, '1', '/site/images/thumbs/12.jpg', '1', '<p>1</p>\n', '1', '测试', '[\"1\",\"2\",\"3\"]', '1', 2, '2019-05-02 07:11:27', '2019-05-02 07:11:40', '2019-05-02 07:11:27', 0);
INSERT INTO `tb_article` VALUES (8, '2', '/site/images/thumbs/15.jpg', '2', '<p>2</p>\n', '2', '测试', '[\"1\"]', '1', 2, '2019-05-02 07:16:13', '2019-05-02 07:16:13', '2019-05-02 07:16:13', 0);
INSERT INTO `tb_article` VALUES (9, '3', '/site/images/thumbs/9.jpg', '3', '<p>3</p>\n', '3', '测试', '[\"1\",\"2\"]', '1', 7, '2019-05-02 07:19:27', '2019-05-02 07:19:27', '2019-05-02 07:19:27', 0);
-- ----------------------------
-- Table structure for tb_category
-- ----------------------------
DROP TABLE IF EXISTS `tb_category`;
CREATE TABLE `tb_category` (
`id` int(20) NOT NULL AUTO_INCREMENT COMMENT '编号',
`name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '分类名称',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '分类表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of tb_category
-- ----------------------------
INSERT INTO `tb_category` VALUES (1, '测试');
INSERT INTO `tb_category` VALUES (2, '随笔');
INSERT INTO `tb_category` VALUES (3, '心情');
INSERT INTO `tb_category` VALUES (5, 'spring boot');
-- ----------------------------
-- Table structure for tb_comments
-- ----------------------------
DROP TABLE IF EXISTS `tb_comments`;
CREATE TABLE `tb_comments` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`article_title` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文章标题',
`article_id` bigint(20) NULL DEFAULT NULL COMMENT '文章ID',
`name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '昵称',
`time` datetime(0) NOT NULL COMMENT '留言时间',
`content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '留言内容',
`email` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邮箱',
`url` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '网址',
`type` bigint(20) NULL DEFAULT 0 COMMENT '分类:0:默认,文章详情页,1:友链页,2:关于页',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 148 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '评论表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of tb_comments
-- ----------------------------
INSERT INTO `tb_comments` VALUES (147, 'SpringBoot整合Mybatis实现CRUD', 6, 'test', '2019-04-24 07:13:39', '12345', '2218999785@qq.com', 'http://www.baidu.com', 0);
-- ----------------------------
-- Table structure for tb_links
-- ----------------------------
DROP TABLE IF EXISTS `tb_links`;
CREATE TABLE `tb_links` (
`id` int(20) NOT NULL AUTO_INCREMENT COMMENT '编号',
`name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '连接名称',
`url` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '连接URL',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '友链表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of tb_links
-- ----------------------------
INSERT INTO `tb_links` VALUES (1, 'AZJ', 'https://www.zzwazj.online/');
INSERT INTO `tb_links` VALUES (3, 'LiNPX', 'https://www.linpx.com/');
-- ----------------------------
-- Table structure for tb_log
-- ----------------------------
DROP TABLE IF EXISTS `tb_log`;
CREATE TABLE `tb_log` (
`id` int(20) NOT NULL AUTO_INCREMENT COMMENT '编号',
`username` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '操作用户',
`operation` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '操作描述',
`time` int(20) NULL DEFAULT NULL COMMENT '耗时(毫秒)',
`method` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '操作方法',
`params` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '操作参数',
`ip` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'IP地址',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '操作时间',
`location` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '操作地点',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 38 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '系统日志表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of tb_log
-- ----------------------------
INSERT INTO `tb_log` VALUES (25, 'tycoding', '删除分类', 50, 'cn.tycoding.admin.controller.CategoryController.delete()', ' ids\"[5]\"', '127.0.0.1', '2019-03-26 21:02:51', '内网IP|0|0|内网IP|内网IP');
INSERT INTO `tb_log` VALUES (26, 'tycoding', '删除分类', 16, 'cn.tycoding.admin.controller.CategoryController.delete()', ' ids\"[6]\"', '127.0.0.1', '2019-03-26 21:02:53', '内网IP|0|0|内网IP|内网IP');
INSERT INTO `tb_log` VALUES (27, 'tycoding', '删除标签', 33, 'cn.tycoding.admin.controller.TagsControllers.delete()', ' ids\"[7]\"', '127.0.0.1', '2019-03-26 21:02:58', '内网IP|0|0|内网IP|内网IP');
INSERT INTO `tb_log` VALUES (28, 'tycoding', '删除标签', 11, 'cn.tycoding.admin.controller.TagsControllers.delete()', ' ids\"[9]\"', '127.0.0.1', '2019-03-26 21:03:00', '内网IP|0|0|内网IP|内网IP');
INSERT INTO `tb_log` VALUES (29, 'tycoding', '删除标签', 16, 'cn.tycoding.admin.controller.TagsControllers.delete()', ' ids\"[10]\"', '127.0.0.1', '2019-03-26 21:03:03', '内网IP|0|0|内网IP|内网IP');
INSERT INTO `tb_log` VALUES (30, 'tycoding', '删除标签', 14, 'cn.tycoding.admin.controller.TagsControllers.delete()', ' ids\"[2]\"', '127.0.0.1', '2019-03-26 21:03:07', '内网IP|0|0|内网IP|内网IP');
INSERT INTO `tb_log` VALUES (31, 'tycoding', '删除标签', 13, 'cn.tycoding.admin.controller.TagsControllers.delete()', ' ids\"[3]\"', '127.0.0.1', '2019-03-26 21:03:10', '内网IP|0|0|内网IP|内网IP');
INSERT INTO `tb_log` VALUES (32, 'tycoding', '更新标签', 5, 'cn.tycoding.admin.controller.TagsControllers.update()', ' tag\"Tags(id=1, name=随笔, count=null)\"', '127.0.0.1', '2019-03-26 21:03:17', '内网IP|0|0|内网IP|内网IP');
INSERT INTO `tb_log` VALUES (33, 'tycoding', '删除文章', 15, 'cn.tycoding.admin.controller.ArticleController.delete()', ' ids\"[10]\"', '127.0.0.1', '2019-03-26 21:03:32', '内网IP|0|0|内网IP|内网IP');
INSERT INTO `tb_log` VALUES (34, 'tycoding', '删除文章', 15, 'cn.tycoding.admin.controller.ArticleController.delete()', ' ids\"[9]\"', '127.0.0.1', '2019-03-26 21:03:35', '内网IP|0|0|内网IP|内网IP');
INSERT INTO `tb_log` VALUES (35, 'tycoding', '删除文章', 16, 'cn.tycoding.admin.controller.ArticleController.delete()', ' ids\"[8]\"', '127.0.0.1', '2019-03-26 21:03:37', '内网IP|0|0|内网IP|内网IP');
INSERT INTO `tb_log` VALUES (36, 'tycoding', '删除文章', 16, 'cn.tycoding.admin.controller.ArticleController.delete()', ' ids\"[14]\"', '127.0.0.1', '2019-03-26 21:03:41', '内网IP|0|0|内网IP|内网IP');
INSERT INTO `tb_log` VALUES (37, 'tycoding', '删除文章', 72, 'cn.tycoding.admin.controller.ArticleController.delete()', ' ids\"[12]\"', '127.0.0.1', '2019-03-26 21:03:43', '内网IP|0|0|内网IP|内网IP');
-- ----------------------------
-- Table structure for tb_setting
-- ----------------------------
DROP TABLE IF EXISTS `tb_setting`;
CREATE TABLE `tb_setting` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`site_name` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '网站名称',
`site_links` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '社交链接,JSON格式',
`site_music` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '音乐ID',
`about` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '关于我,HTML格式',
`about_md` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '关于我,Markdown格式',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of tb_setting
-- ----------------------------
INSERT INTO `tb_setting` VALUES (1, 'Cing\'s blog', '[{\"key\":\"Github\",\"value\":\"https://github.com\"},{\"key\":\"知乎\",\"value\":\"https://www.zhihu.com\"}]', '453843751', '<h2 id=\"h2-u672Cu4EBA\"><a name=\"本人\" class=\"reference-link\"></a><span class=\"header-link octicon octicon-link\"></span>本人</h2><p>2015级学生</p>\n<p>热爱计算机</p>\n<p>热爱新鲜技术</p>\n<h2 id=\"h2-u4EA4u6D41\"><a name=\"交流\" class=\"reference-link\"></a><span class=\"header-link octicon octicon-link\"></span>交流</h2><p>希望和大家共同进步,可以加我QQ:xxxxxxxxx,一起探讨</p>\n<h2 id=\"h2-u8054u7CFB\"><a name=\"联系\" class=\"reference-link\"></a><span class=\"header-link octicon octicon-link\"></span>联系</h2><p>If you have some questions after you see this article, you can contact me or you can find some info by clicking these links.</p>\n<p><a href=\"https://blog.csdn.net/Ciiiiiing\" title=\"Cing的CSDN\">Cing的CSDN</a></p>\n', '\n## 本人\n\n2015级学生\n\n热爱计算机\n\n热爱新鲜技术\n\n\n\n## 交流\n\n希望和大家共同进步,可以加我QQ:xxxxxxxxx,一起探讨\n\n\n\n## 联系\n\nIf you have some questions after you see this article, you can contact me or you can find some info by clicking these links.\n\n[Cing的CSDN](https://blog.csdn.net/Ciiiiiing \"Cing的CSDN\")\n');
-- ----------------------------
-- Table structure for tb_tags
-- ----------------------------
DROP TABLE IF EXISTS `tb_tags`;
CREATE TABLE `tb_tags` (
`id` int(20) NOT NULL AUTO_INCREMENT COMMENT '编号',
`name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标签名称',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 35 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '标签表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of tb_tags
-- ----------------------------
INSERT INTO `tb_tags` VALUES (28, '1');
INSERT INTO `tb_tags` VALUES (29, '2');
INSERT INTO `tb_tags` VALUES (33, '3');
INSERT INTO `tb_tags` VALUES (34, '4');
-- ----------------------------
-- Table structure for tb_user
-- ----------------------------
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user` (
`id` int(20) NOT NULL AUTO_INCREMENT COMMENT '编号',
`username` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名',
`password` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '密码',
`salt` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '盐值',
`avatar` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '头像',
`introduce` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '介绍',
`remark` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of tb_user
-- ----------------------------
INSERT INTO `tb_user` VALUES (1, 'cing', 'a57a3bc5b35409f515e2750bb0b30043', 'bdb5d440af8562bda260c801127014dd', '/img/avatar/default.jpg', '兴趣使然的Coder', '开开心心每一天');
SET FOREIGN_KEY_CHECKS = 1;