From bd77e4cbb65ac0eb888f164d42caa08055e6d5fd Mon Sep 17 00:00:00 2001
From: Hellohao <923453645@qq.com>
Date: Thu, 29 Aug 2019 14:13:25 +0800
Subject: [PATCH] =?UTF-8?q?2019-08-29=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 5 +-
sql/picturebed.sql | 635 ++++++---------
.../hellohao/controller/AdminController.java | 30 +-
.../controller/AdminRootController.java | 39 +-
.../hellohao/controller/ClientController.java | 17 +-
.../controller/ExceptionHandling.java | 2 +
.../controller/UpdateImgController.java | 41 +-
.../hellohao/controller/UserController.java | 159 ++--
src/main/java/cn/hellohao/dao/KeysMapper.java | 3 +
src/main/java/cn/hellohao/dao/UserMapper.java | 1 -
.../java/cn/hellohao/service/KeysService.java | 4 +-
.../hellohao/service/impl/FTPImageupload.java | 4 +-
.../service/impl/InitializationStorage.java | 65 ++
.../service/impl/KeysServiceImpl.java | 7 +
src/main/java/cn/hellohao/test/test1.java | 117 ++-
.../hellohao/utils/AfterServiceStarted.java | 10 +-
.../cn/hellohao/utils/Base64Encryption.java | 50 ++
src/main/resources/application.properties | 4 +-
src/main/resources/banner.txt | 8 +-
src/main/resources/db/test.txt | 1 +
src/main/resources/mapper/KeysMapper.xml | 14 +-
.../resources/static/css/font-awesome.min.css | 2 +-
src/main/resources/static/css/verify.css | 170 ++++
.../resources/static/fonts/FontAwesome.otf | Bin 106260 -> 0 bytes
.../static/fonts/fontawesome-webfont.eot | Bin 68875 -> 0 bytes
.../static/fonts/fontawesome-webfont.svg | 640 ---------------
.../static/fonts/fontawesome-webfont.ttf | Bin 138204 -> 0 bytes
.../static/fonts/fontawesome-webfont.woff | Bin 81284 -> 0 bytes
.../static/fonts/fontawesome-webfont93e3.svg | 640 ---------------
.../5f180dc8c56a4232b3a9cdc5a49cbe61.bmp | Bin 777246 -> 0 bytes
.../resources/static/img/background/2.jpg | Bin 238989 -> 0 bytes
.../resources/static/img/background/3.jpg | Bin 258316 -> 0 bytes
.../resources/static/img/background/4.jpg | Bin 207582 -> 0 bytes
.../resources/static/img/background/5.jpg | Bin 264003 -> 0 bytes
.../static/img/background/sample2.jpg | Bin 301969 -> 0 bytes
.../static/img/background/sample4.jpg | Bin 320642 -> 0 bytes
.../static/img/background/sample5.jpg | Bin 378384 -> 0 bytes
.../static/img/background/sample8.jpg | Bin 212522 -> 0 bytes
src/main/resources/static/js/verify.js | 739 ++++++++++++++++++
src/main/resources/static/js/verify.min.js | 2 +
.../static/static/img/loading-sm.gif | Bin 2670 -> 0 bytes
.../resources/static/static/img/loading.gif | Bin 847 -> 0 bytes
src/main/resources/static/static/img/logo.png | Bin 2789 -> 0 bytes
.../resources/static/static/img/vip/VVip1.png | Bin 797 -> 0 bytes
.../resources/static/static/img/vip/VVip2.png | Bin 951 -> 0 bytes
.../resources/static/static/img/vip/VVip3.png | Bin 936 -> 0 bytes
.../resources/static/static/img/vip/Vip1.png | Bin 1533 -> 0 bytes
.../resources/static/static/img/vip/Vip2.png | Bin 1372 -> 0 bytes
.../resources/static/static/img/vip/Vip3.png | Bin 1438 -> 0 bytes
.../static/xcc/fonts/FontAwesome.otf | Bin 123112 -> 0 bytes
.../static/xcc/fonts/fontawesome-webfont.eot | Bin 75220 -> 0 bytes
.../static/xcc/fonts/fontawesome-webfont.svg | 685 ----------------
.../static/xcc/fonts/fontawesome-webfont.ttf | Bin 150920 -> 0 bytes
.../static/xcc/fonts/fontawesome-webfont.woff | Bin 89076 -> 0 bytes
.../xcc/fonts/fontawesome-webfont.woff2 | Bin 70728 -> 0 bytes
.../templates/admin/storageconfig.html | 12 +-
src/main/resources/templates/admin/table.html | 16 +-
.../resources/templates/admin/webconfig.html | 27 +-
src/main/resources/templates/index.html | 384 ++++++---
59 files changed, 1818 insertions(+), 2715 deletions(-)
create mode 100644 src/main/java/cn/hellohao/service/impl/InitializationStorage.java
create mode 100644 src/main/java/cn/hellohao/utils/Base64Encryption.java
create mode 100644 src/main/resources/db/test.txt
create mode 100644 src/main/resources/static/css/verify.css
delete mode 100644 src/main/resources/static/fonts/FontAwesome.otf
delete mode 100644 src/main/resources/static/fonts/fontawesome-webfont.eot
delete mode 100644 src/main/resources/static/fonts/fontawesome-webfont.svg
delete mode 100644 src/main/resources/static/fonts/fontawesome-webfont.ttf
delete mode 100644 src/main/resources/static/fonts/fontawesome-webfont.woff
delete mode 100644 src/main/resources/static/fonts/fontawesome-webfont93e3.svg
delete mode 100644 src/main/resources/static/images/5f180dc8c56a4232b3a9cdc5a49cbe61.bmp
delete mode 100644 src/main/resources/static/img/background/2.jpg
delete mode 100644 src/main/resources/static/img/background/3.jpg
delete mode 100644 src/main/resources/static/img/background/4.jpg
delete mode 100644 src/main/resources/static/img/background/5.jpg
delete mode 100644 src/main/resources/static/img/background/sample2.jpg
delete mode 100644 src/main/resources/static/img/background/sample4.jpg
delete mode 100644 src/main/resources/static/img/background/sample5.jpg
delete mode 100644 src/main/resources/static/img/background/sample8.jpg
create mode 100644 src/main/resources/static/js/verify.js
create mode 100644 src/main/resources/static/js/verify.min.js
delete mode 100644 src/main/resources/static/static/img/loading-sm.gif
delete mode 100644 src/main/resources/static/static/img/loading.gif
delete mode 100644 src/main/resources/static/static/img/logo.png
delete mode 100644 src/main/resources/static/static/img/vip/VVip1.png
delete mode 100644 src/main/resources/static/static/img/vip/VVip2.png
delete mode 100644 src/main/resources/static/static/img/vip/VVip3.png
delete mode 100644 src/main/resources/static/static/img/vip/Vip1.png
delete mode 100644 src/main/resources/static/static/img/vip/Vip2.png
delete mode 100644 src/main/resources/static/static/img/vip/Vip3.png
delete mode 100644 src/main/resources/static/xcc/fonts/FontAwesome.otf
delete mode 100644 src/main/resources/static/xcc/fonts/fontawesome-webfont.eot
delete mode 100644 src/main/resources/static/xcc/fonts/fontawesome-webfont.svg
delete mode 100644 src/main/resources/static/xcc/fonts/fontawesome-webfont.ttf
delete mode 100644 src/main/resources/static/xcc/fonts/fontawesome-webfont.woff
delete mode 100644 src/main/resources/static/xcc/fonts/fontawesome-webfont.woff2
diff --git a/pom.xml b/pom.xml
index d6f085a..f7fe939 100644
--- a/pom.xml
+++ b/pom.xml
@@ -166,13 +166,14 @@
- compile
org.springframework.boot
spring-boot-maven-plugin
+
+ true
+
-
diff --git a/sql/picturebed.sql b/sql/picturebed.sql
index 4eabf1b..72a4d36 100644
--- a/sql/picturebed.sql
+++ b/sql/picturebed.sql
@@ -1,432 +1,245 @@
--- phpMyAdmin SQL Dump
--- version 4.7.9
--- https://www.phpmyadmin.net/
---
--- Host: localhost
--- Generation Time: 2019-08-25 16:13:11
--- 服务器版本: 5.5.62-log
--- PHP Version: 7.2.18
+/*
+ Navicat Premium Data Transfer
-SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
-SET AUTOCOMMIT = 0;
-START TRANSACTION;
-SET time_zone = "+00:00";
+ Source Server : Hellohao
+ Source Server Type : MySQL
+ Source Server Version : 50562
+ Source Host : 129.28.173.126:3306
+ Source Schema : picturebed
+ Target Server Type : MySQL
+ Target Server Version : 50562
+ File Encoding : 65001
-/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
-/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
-/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
-/*!40101 SET NAMES utf8mb4 */;
+ Date: 29/08/2019 13:50:42
+*/
---
--- Database: `picturebedpro`
---
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
--- --------------------------------------------------------
-
---
--- 表的结构 `code`
---
-
-CREATE TABLE `code` (
- `id` int(255) NOT NULL,
+-- ----------------------------
+-- Table structure for code
+-- ----------------------------
+DROP TABLE IF EXISTS `code`;
+CREATE TABLE `code` (
+ `id` int(255) NOT NULL AUTO_INCREMENT,
`value` int(20) NOT NULL,
- `code` varchar(500) NOT NULL
-) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+ `code` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 100 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
--- --------------------------------------------------------
+-- ----------------------------
+-- Table structure for config
+-- ----------------------------
+DROP TABLE IF EXISTS `config`;
+CREATE TABLE `config` (
+ `id` int(4) NOT NULL AUTO_INCREMENT,
+ `sourcekey` int(4) NULL DEFAULT NULL,
+ `emails` int(4) NULL DEFAULT NULL COMMENT '邮箱配置',
+ `webname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '网站名',
+ `explain` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '首页左下角说明',
+ `video` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '视频地址',
+ `backtype` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '背景类型',
+ `links` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备案号',
+ `notice` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '公告',
+ `baidu` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '百度统计',
+ `domain` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '站点域名',
+ `background1` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '首页背景图',
+ `background2` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '上传页面背景图',
+ `sett` int(2) NOT NULL COMMENT '首页样式',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
---
--- 表的结构 `config`
---
+-- ----------------------------
+-- Records of config
+-- ----------------------------
+INSERT INTO `config` VALUES (1, 1, 1, 'Hellohao', '网站由JAVA语言编写应用SpringBoot框架开发,前端全部组件由BootStrap/Layui框架编写。由作者个人更新维护,后期会加入更全面的功能供大家使用,如有BUG请与我反馈。', 'https://hellohao-cloud.oss-cn-beijing.aliyuncs.com/Pexels.mp4', '1', 'Hellohao©技术支持', '也许...|这将是最好用的图床', 'console.log(\'百度统计JS代码\');', 'http://127.0.0.1:8088', 'https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1565769264&di=74d809d6cfae81bbab83bf9d573d8f9a&src=http://pic17.nipic.com/20110917/7420038_160826355111_2.jpg', 'https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1565769264&di=74d809d6cfae81bbab83bf9d573d8f9a&src=http://pic17.nipic.com/20110917/7420038_160826355111_2.jpg', 1);
-CREATE TABLE `config` (
+-- ----------------------------
+-- Table structure for emailconfig
+-- ----------------------------
+DROP TABLE IF EXISTS `emailconfig`;
+CREATE TABLE `emailconfig` (
+ `id` int(2) NOT NULL AUTO_INCREMENT,
+ `emails` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邮箱',
+ `emailkey` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '授权码',
+ `emailurl` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '服务器',
+ `port` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '端口',
+ `emailname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名',
+ `using` int(4) NULL DEFAULT NULL COMMENT '1为可用,其他为不使用',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
+
+-- ----------------------------
+-- Records of emailconfig
+-- ----------------------------
+INSERT INTO `emailconfig` VALUES (1, '', '', '', '', '', 0);
+
+-- ----------------------------
+-- Table structure for group
+-- ----------------------------
+DROP TABLE IF EXISTS `group`;
+CREATE TABLE `group` (
+ `id` int(255) NOT NULL AUTO_INCREMENT,
+ `groupname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '组名称',
+ `keyid` int(255) NULL DEFAULT NULL,
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 15 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
+
+-- ----------------------------
+-- Records of group
+-- ----------------------------
+INSERT INTO `group` VALUES (1, '默认群组', 5);
+
+-- ----------------------------
+-- Table structure for imgdata
+-- ----------------------------
+DROP TABLE IF EXISTS `imgdata`;
+CREATE TABLE `imgdata` (
+ `id` int(255) NOT NULL AUTO_INCREMENT COMMENT '主键',
+ `imgname` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '图片名',
+ `imgurl` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '图片链接',
+ `userid` int(10) NULL DEFAULT NULL COMMENT '用户名',
+ `updatetime` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '上传时间',
+ `sizes` int(255) NULL DEFAULT NULL COMMENT '文件大小',
+ `abnormal` int(2) NULL DEFAULT NULL COMMENT '异常',
+ `source` int(2) NULL DEFAULT NULL COMMENT '存储源',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 35 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
+
+-- ----------------------------
+-- Table structure for imgreview
+-- ----------------------------
+DROP TABLE IF EXISTS `imgreview`;
+CREATE TABLE `imgreview` (
+ `id` int(4) NOT NULL AUTO_INCREMENT,
+ `app_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
+ `api_key` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
+ `secret_key` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
+ `Using` int(4) NULL DEFAULT NULL,
+ `count` int(255) NULL DEFAULT NULL COMMENT '拦截数量',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
+
+-- ----------------------------
+-- Records of imgreview
+-- ----------------------------
+INSERT INTO `imgreview` VALUES (1, NULL, NULL, NULL, 0, 0);
+
+-- ----------------------------
+-- Table structure for keys
+-- ----------------------------
+DROP TABLE IF EXISTS `keys`;
+CREATE TABLE `keys` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `AccessKey` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
+ `AccessSecret` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
+ `Endpoint` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
+ `Bucketname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
+ `RequestAddress` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
+ `storageType` int(11) NULL DEFAULT NULL,
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
+
+-- ----------------------------
+-- Records of keys
+-- ----------------------------
+INSERT INTO `keys` VALUES (1, '547046ec6495457783f040df098a8ce3', '255b334a4d174e95a3d9e5938f1966ab', 'https://nos-eastchina1.126.net', 'hellohao', 'https://hellohao.nos-eastchina1.126.net', 1);
+INSERT INTO `keys` VALUES (2, '', '', '', '', '', 2);
+INSERT INTO `keys` VALUES (3, '', '', '', '', '', 3);
+INSERT INTO `keys` VALUES (4, '', '', '', '', '', 4);
+INSERT INTO `keys` VALUES (5, '0', '0', '0', '0', '0', 5);
+INSERT INTO `keys` VALUES (6, '', '', '', '', '', 6);
+INSERT INTO `keys` VALUES (7, '', '', '', '', '', 7);
+INSERT INTO `keys` VALUES (8, '', '', '', '', '', 8);
+INSERT INTO `keys` VALUES (9, '', '', '', '', '', 9);
+INSERT INTO `keys` VALUES (10, '0', '', '0', '0', '0', 10);
+
+-- ----------------------------
+-- Table structure for notice
+-- ----------------------------
+DROP TABLE IF EXISTS `notice`;
+CREATE TABLE `notice` (
`id` int(4) NOT NULL,
- `sourcekey` int(4) DEFAULT NULL,
- `emails` int(4) DEFAULT NULL,
- `webname` varchar(255) DEFAULT NULL COMMENT '网站名',
- `explain` varchar(500) DEFAULT NULL COMMENT '首页左下角说明',
- `video` varchar(500) DEFAULT NULL COMMENT '视频地址',
- `backtype` varchar(500) DEFAULT NULL COMMENT '背景类型',
- `links` varchar(255) DEFAULT NULL COMMENT '友链',
- `notice` varchar(500) DEFAULT NULL COMMENT '公告',
- `baidu` varchar(500) DEFAULT NULL COMMENT '百度统计',
- `domain` varchar(255) DEFAULT NULL COMMENT '站点域名',
- `background1` varchar(500) DEFAULT NULL COMMENT '首页背景图',
- `background2` varchar(500) DEFAULT NULL COMMENT '上传页面背景图',
- `sett` int(2) NOT NULL
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
+ `text` varchar(10000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL
+) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
---
--- 转存表中的数据 `config`
---
+-- ----------------------------
+-- Table structure for sysconfig
+-- ----------------------------
+DROP TABLE IF EXISTS `sysconfig`;
+CREATE TABLE `sysconfig` (
+ `id` int(2) NOT NULL AUTO_INCREMENT,
+ `register` int(2) NOT NULL COMMENT '是否可以注册',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-INSERT INTO `config` (`id`, `sourcekey`, `emails`, `webname`, `explain`, `video`, `backtype`, `links`, `notice`, `baidu`, `domain`, `background1`, `background2`, `sett`) VALUES
-(1, 5, 1, 'Hellohao', '网站由JAVA语言编写应用SpringBoot框架开发,前端全部组件由BootStrap/Layui框架编写。由作者个人更新维护,后期会加入更全面的功能供大家使用,如有BUG请与我反馈。', 'https://hellohao-cloud.oss-cn-beijing.aliyuncs.com/Pexels.mp4', '2', '
作者博客高清壁纸json格式化', '也许...|这将是最好用的图床', 'console.log(\'百度统计JS代码\');', 'http://tc.hellohao.cn', 'https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1565769264&di=74d809d6cfae81bbab83bf9d573d8f9a&src=http://pic17.nipic.com/20110917/7420038_160826355111_2.jpg', 'https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1565769264&di=74d809d6cfae81bbab83bf9d573d8f9a&src=http://pic17.nipic.com/20110917/7420038_160826355111_2.jpg', 1);
+-- ----------------------------
+-- Records of sysconfig
+-- ----------------------------
+INSERT INTO `sysconfig` VALUES (1, 1);
--- --------------------------------------------------------
-
---
--- 表的结构 `emailconfig`
---
-
-CREATE TABLE `emailconfig` (
- `id` int(2) NOT NULL,
- `emails` varchar(255) DEFAULT NULL COMMENT '邮箱',
- `emailkey` varchar(255) DEFAULT NULL COMMENT '授权码',
- `emailurl` varchar(255) DEFAULT NULL COMMENT '服务器',
- `port` varchar(255) DEFAULT NULL COMMENT '端口',
- `emailname` varchar(255) DEFAULT NULL COMMENT '用户名',
- `using` int(4) DEFAULT NULL COMMENT '1为可用,其他为不使用'
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
-
---
--- 转存表中的数据 `emailconfig`
---
-
-INSERT INTO `emailconfig` (`id`, `emails`, `emailkey`, `emailurl`, `port`, `emailname`, `using`) VALUES
-(1, '', '', '', '', '', 0);
-
--- --------------------------------------------------------
-
---
--- 表的结构 `group`
---
-
-CREATE TABLE `group` (
- `id` int(255) NOT NULL,
- `groupname` varchar(255) NOT NULL COMMENT '组名称',
- `keyid` int(255) DEFAULT NULL
-) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-
---
--- 转存表中的数据 `group`
---
-
-INSERT INTO `group` (`id`, `groupname`, `keyid`) VALUES
-(1, '默认群组', 5);
-
--- --------------------------------------------------------
-
---
--- 表的结构 `imgdata`
---
-
-CREATE TABLE `imgdata` (
- `id` int(10) NOT NULL COMMENT '主键',
- `imgname` varchar(500) DEFAULT NULL COMMENT '图片名',
- `imgurl` varchar(500) DEFAULT NULL COMMENT '图片链接',
- `userid` int(10) DEFAULT NULL COMMENT '用户名',
- `updatetime` varchar(50) DEFAULT NULL COMMENT '上传时间',
- `sizes` int(255) DEFAULT NULL COMMENT '文件大小',
- `abnormal` int(2) DEFAULT NULL COMMENT '异常',
- `source` int(2) DEFAULT NULL COMMENT '存储源'
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
-
---
--- 转存表中的数据 `imgdata`
---
-
-INSERT INTO `imgdata` (`id`, `imgname`, `imgurl`, `userid`, `updatetime`, `sizes`, `abnormal`, `source`) VALUES
-(28, 'admin/4cc700823104929.png', 'https://hellohao.nos-eastchina1.126.net/admin/4cc700823104929.png', 1, '2019-08-23', 263, NULL, 1),
-(29, 'tourist/9c6560823105311.png', 'https://hellohao.nos-eastchina1.126.net/tourist/9c6560823105311.png', 0, '2019-08-23', 273, NULL, 1);
-
--- --------------------------------------------------------
-
---
--- 表的结构 `imgreview`
---
-
-CREATE TABLE `imgreview` (
- `id` int(4) NOT NULL,
- `app_id` varchar(255) DEFAULT NULL,
- `api_key` varchar(255) DEFAULT NULL,
- `secret_key` varchar(255) DEFAULT NULL,
- `Using` int(4) DEFAULT NULL,
- `count` int(10) DEFAULT NULL COMMENT '拦截数量'
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
-
---
--- 转存表中的数据 `imgreview`
---
-
-INSERT INTO `imgreview` (`id`, `app_id`, `api_key`, `secret_key`, `Using`, `count`) VALUES
-(1, NULL, NULL, NULL, 0, 0);
-
--- --------------------------------------------------------
-
---
--- 表的结构 `keys`
---
-
-CREATE TABLE `keys` (
- `id` int(11) NOT NULL,
- `AccessKey` varchar(255) DEFAULT NULL,
- `AccessSecret` varchar(255) DEFAULT NULL,
- `Endpoint` varchar(255) DEFAULT NULL,
- `Bucketname` varchar(255) DEFAULT NULL,
- `RequestAddress` varchar(255) DEFAULT NULL,
- `storageType` int(11) DEFAULT NULL
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
-
---
--- 转存表中的数据 `keys`
---
-
-INSERT INTO `keys` (`id`, `AccessKey`, `AccessSecret`, `Endpoint`, `Bucketname`, `RequestAddress`, `storageType`) VALUES
-(1, '', '', '', '', 'https://hellohao.nos-eastchina1.126.net', 1),
-(2, '', '', '', '', '', 2),
-(3, '', '', '', '', '', 3),
-(4, '', '', '', '', '', 4),
-(5, '0', '0', '0', '0', '0', 5),
-(6, '', '', '', '', '', 6),
-(7, '', '', '', '', '', 7),
-(8, '', '', '', '', '', 8),
-(9, '', '', '', '', '', 9),
-(10, '0', '', '0', '0', '0', 10);
-
--- --------------------------------------------------------
-
---
--- 表的结构 `notice`
---
-
-CREATE TABLE `notice` (
- `id` int(4) NOT NULL,
- `text` varchar(10000) DEFAULT NULL
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
-
--- --------------------------------------------------------
-
---
--- 表的结构 `sysconfig`
---
-
-CREATE TABLE `sysconfig` (
- `id` int(2) NOT NULL,
- `register` int(2) NOT NULL COMMENT '是否可以注册'
-) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-
---
--- 转存表中的数据 `sysconfig`
---
-
-INSERT INTO `sysconfig` (`id`, `register`) VALUES
-(1, 1);
-
--- --------------------------------------------------------
-
---
--- 表的结构 `uploadconfig`
---
-
-CREATE TABLE `uploadconfig` (
- `id` int(2) NOT NULL,
- `filesizetourists` int(10) DEFAULT NULL COMMENT '游客上传文件最大',
- `filesizeuser` int(10) DEFAULT NULL COMMENT '用户上传文件最大',
- `imgcounttourists` int(10) DEFAULT NULL COMMENT '游客文件总数量, 超出则不允许加入队列',
- `imgcountuser` int(10) DEFAULT NULL COMMENT '用户文件总数量, 超出则不允许加入队列',
- `suffix` varchar(255) DEFAULT NULL COMMENT '支持后缀',
- `urltype` int(2) DEFAULT NULL,
- `isupdate` int(2) DEFAULT NULL COMMENT '禁止游客上传',
+-- ----------------------------
+-- Table structure for uploadconfig
+-- ----------------------------
+DROP TABLE IF EXISTS `uploadconfig`;
+CREATE TABLE `uploadconfig` (
+ `id` int(2) NOT NULL AUTO_INCREMENT,
+ `filesizetourists` int(10) NULL DEFAULT NULL COMMENT '游客上传文件最大',
+ `filesizeuser` int(10) NULL DEFAULT NULL COMMENT '用户上传文件最大',
+ `imgcounttourists` int(10) NULL DEFAULT NULL COMMENT '游客文件总数量, 超出则不允许加入队列',
+ `imgcountuser` int(10) NULL DEFAULT NULL COMMENT '用户文件总数量, 超出则不允许加入队列',
+ `suffix` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '支持后缀',
+ `urltype` int(2) NULL DEFAULT NULL COMMENT 'url类型',
+ `isupdate` int(2) NULL DEFAULT NULL COMMENT '禁止游客上传',
`api` int(2) NOT NULL COMMENT '开启api',
- `visitormemory` int(10) DEFAULT NULL COMMENT '游客限制大小',
- `usermemory` int(10) DEFAULT '0' COMMENT '用户默认大小'
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
+ `visitormemory` int(10) NULL DEFAULT NULL COMMENT '游客限制大小',
+ `usermemory` int(10) NULL DEFAULT 0 COMMENT '用户默认大小',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
---
--- 转存表中的数据 `uploadconfig`
---
+-- ----------------------------
+-- Records of uploadconfig
+-- ----------------------------
+INSERT INTO `uploadconfig` VALUES (1, 3, 5, 1, 5, 'gif,jpg,jpeg,bmp,png', 1, 1, 0, 500, 1024);
-INSERT INTO `uploadconfig` (`id`, `filesizetourists`, `filesizeuser`, `imgcounttourists`, `imgcountuser`, `suffix`, `urltype`, `isupdate`, `api`, `visitormemory`, `usermemory`) VALUES
-(1, 3, 5, 1, 5, 'gif,jpg,jpeg,bmp,png', 1, 1, 0, 500, 1024);
-
--- --------------------------------------------------------
-
---
--- 表的结构 `user`
---
-
-CREATE TABLE `user` (
- `id` int(10) NOT NULL COMMENT '主键',
- `username` varchar(50) NOT NULL COMMENT '用户名',
- `password` varchar(50) NOT NULL COMMENT '密码',
- `email` varchar(20) NOT NULL COMMENT '邮箱',
- `birthder` date DEFAULT NULL COMMENT '注册时间',
- `level` int(10) DEFAULT NULL COMMENT '等级',
- `uid` varchar(50) DEFAULT NULL COMMENT '用户唯一标识',
+-- ----------------------------
+-- Table structure for user
+-- ----------------------------
+DROP TABLE IF EXISTS `user`;
+CREATE TABLE `user` (
+ `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键',
+ `username` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名',
+ `password` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '密码',
+ `email` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '邮箱',
+ `birthder` date NULL DEFAULT NULL COMMENT '注册时间',
+ `level` int(10) NULL DEFAULT NULL COMMENT '等级',
+ `uid` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户唯一标识',
`isok` int(2) NOT NULL,
- `memory` int(10) DEFAULT NULL COMMENT '用户内存大小',
- `groupid` int(255) DEFAULT NULL
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
+ `memory` int(10) NULL DEFAULT NULL COMMENT '用户内存大小',
+ `groupid` int(255) NULL DEFAULT NULL,
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 15 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
---
--- 转存表中的数据 `user`
---
+-- ----------------------------
+-- Records of user
+-- ----------------------------
+INSERT INTO `user` VALUES (1, 'admin', 'YWRtaW4=', 'admin', '2019-06-12', 2, 'admin', 1, 1024, 1);
-INSERT INTO `user` (`id`, `username`, `password`, `email`, `birthder`, `level`, `uid`, `isok`, `memory`, `groupid`) VALUES
-(1, 'admin', 'admin', 'admin', '2019-06-12', 2, 'admin', 1, 1024, 1);
+-- ----------------------------
+-- Table structure for usergroup
+-- ----------------------------
+DROP TABLE IF EXISTS `usergroup`;
+CREATE TABLE `usergroup` (
+ `id` int(255) NOT NULL AUTO_INCREMENT,
+ `userid` int(255) NULL DEFAULT NULL,
+ `groupid` int(255) NULL DEFAULT NULL,
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
--- --------------------------------------------------------
+-- ----------------------------
+-- Records of usergroup
+-- ----------------------------
+INSERT INTO `usergroup` VALUES (1, 1, 1);
---
--- 表的结构 `usergroup`
---
-
-CREATE TABLE `usergroup` (
- `id` int(255) NOT NULL,
- `userid` int(255) DEFAULT NULL,
- `groupid` int(255) DEFAULT NULL
-) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-
---
--- 转存表中的数据 `usergroup`
---
-
-INSERT INTO `usergroup` (`id`, `userid`, `groupid`) VALUES
-(1, 1, 1);
-
---
--- Indexes for dumped tables
---
-
---
--- Indexes for table `code`
---
-ALTER TABLE `code`
- ADD PRIMARY KEY (`id`);
-
---
--- Indexes for table `config`
---
-ALTER TABLE `config`
- ADD PRIMARY KEY (`id`) USING BTREE;
-
---
--- Indexes for table `emailconfig`
---
-ALTER TABLE `emailconfig`
- ADD PRIMARY KEY (`id`) USING BTREE;
-
---
--- Indexes for table `group`
---
-ALTER TABLE `group`
- ADD PRIMARY KEY (`id`);
-
---
--- Indexes for table `imgdata`
---
-ALTER TABLE `imgdata`
- ADD PRIMARY KEY (`id`) USING BTREE;
-
---
--- Indexes for table `imgreview`
---
-ALTER TABLE `imgreview`
- ADD PRIMARY KEY (`id`) USING BTREE;
-
---
--- Indexes for table `keys`
---
-ALTER TABLE `keys`
- ADD PRIMARY KEY (`id`) USING BTREE;
-
---
--- Indexes for table `sysconfig`
---
-ALTER TABLE `sysconfig`
- ADD PRIMARY KEY (`id`);
-
---
--- Indexes for table `uploadconfig`
---
-ALTER TABLE `uploadconfig`
- ADD PRIMARY KEY (`id`) USING BTREE;
-
---
--- Indexes for table `user`
---
-ALTER TABLE `user`
- ADD PRIMARY KEY (`id`) USING BTREE;
-
---
--- Indexes for table `usergroup`
---
-ALTER TABLE `usergroup`
- ADD PRIMARY KEY (`id`);
-
---
--- 在导出的表使用AUTO_INCREMENT
---
-
---
--- 使用表AUTO_INCREMENT `code`
---
-ALTER TABLE `code`
- MODIFY `id` int(255) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=100;
-
---
--- 使用表AUTO_INCREMENT `config`
---
-ALTER TABLE `config`
- MODIFY `id` int(4) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;
-
---
--- 使用表AUTO_INCREMENT `emailconfig`
---
-ALTER TABLE `emailconfig`
- MODIFY `id` int(2) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;
-
---
--- 使用表AUTO_INCREMENT `group`
---
-ALTER TABLE `group`
- MODIFY `id` int(255) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=14;
-
---
--- 使用表AUTO_INCREMENT `imgdata`
---
-ALTER TABLE `imgdata`
- MODIFY `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键', AUTO_INCREMENT=30;
-
---
--- 使用表AUTO_INCREMENT `imgreview`
---
-ALTER TABLE `imgreview`
- MODIFY `id` int(4) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;
-
---
--- 使用表AUTO_INCREMENT `keys`
---
-ALTER TABLE `keys`
- MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=11;
-
---
--- 使用表AUTO_INCREMENT `sysconfig`
---
-ALTER TABLE `sysconfig`
- MODIFY `id` int(2) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;
-
---
--- 使用表AUTO_INCREMENT `uploadconfig`
---
-ALTER TABLE `uploadconfig`
- MODIFY `id` int(2) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;
-
---
--- 使用表AUTO_INCREMENT `user`
---
-ALTER TABLE `user`
- MODIFY `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键', AUTO_INCREMENT=14;
-
---
--- 使用表AUTO_INCREMENT `usergroup`
---
-ALTER TABLE `usergroup`
- MODIFY `id` int(255) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;
-COMMIT;
-
-/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
-/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
-/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
+SET FOREIGN_KEY_CHECKS = 1;
diff --git a/src/main/java/cn/hellohao/controller/AdminController.java b/src/main/java/cn/hellohao/controller/AdminController.java
index b919813..4edd30f 100644
--- a/src/main/java/cn/hellohao/controller/AdminController.java
+++ b/src/main/java/cn/hellohao/controller/AdminController.java
@@ -5,10 +5,7 @@ import cn.hellohao.pojo.vo.PageResultBean;
import cn.hellohao.service.*;
import cn.hellohao.service.impl.ImgServiceImpl;
import cn.hellohao.service.impl.UserServiceImpl;
-import cn.hellohao.utils.GetCurrentSource;
-import cn.hellohao.utils.LocUpdateImg;
-import cn.hellohao.utils.Print;
-import cn.hellohao.utils.StringUtils;
+import cn.hellohao.utils.*;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageHelper;
@@ -19,6 +16,7 @@ import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -202,12 +200,19 @@ public class AdminController {
// 从他的下一条sql开始分页
PageHelper.startPage(page, limit);
List users = null;
+ List users2 = new ArrayList<>();
if (u.getLevel() > 1) { //根据用户等级查询管理员查询所有的信息
User user = new User();
user.setUsername(username);
users = userService.getuserlist(user);// 这是我们的sql
+ for (User user1 : users) {
+ User uu = new User();
+ uu = user1;
+ uu.setPassword(Base64Encryption.decryptBASE64(user1.getPassword()));
+ users2.add(uu);
+ }
// 使用pageInfo包装查询
- PageInfo rolePageInfo = new PageInfo<>(users);//
+ PageInfo rolePageInfo = new PageInfo<>(users2);//
Map map = new HashMap();
map.put("code", 0);
map.put("msg", "");
@@ -335,16 +340,21 @@ public class AdminController {
@ResponseBody
public String change(HttpSession session, User user) {
User u = (User) session.getAttribute("user");
+ User us = new User();
//user.setEmail(u.getEmail());
- user.setUid(u.getUid());
+ us.setEmail(user.getEmail());
+ us.setUsername(user.getUsername());
+ us.setPassword(Base64Encryption.encryptBASE64(user.getPassword().getBytes()));
+ us.setUid(u.getUid());
+ //user.setUid(u.getUid());
JSONArray jsonArray = new JSONArray();
Integer ret =0;
if(u.getLevel()==1){
- user.setUsername(null);
- user.setEmail(null);
- ret = userService.change(user);
+ us.setUsername(null);
+ us.setEmail(null);
+ ret = userService.change(us);
}else{
- ret = userService.change(user);
+ ret = userService.change(us);
}
jsonArray.add(ret);
if (u.getEmail() != null && u.getPassword() != null) {
diff --git a/src/main/java/cn/hellohao/controller/AdminRootController.java b/src/main/java/cn/hellohao/controller/AdminRootController.java
index 3f0e0dc..2ea02ff 100644
--- a/src/main/java/cn/hellohao/controller/AdminRootController.java
+++ b/src/main/java/cn/hellohao/controller/AdminRootController.java
@@ -2,7 +2,9 @@ package cn.hellohao.controller;
import cn.hellohao.pojo.*;
import cn.hellohao.service.*;
+import cn.hellohao.service.impl.*;
import cn.hellohao.utils.GetCurrentSource;
+import cn.hellohao.utils.Print;
import cn.hellohao.utils.StringUtils;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONArray;
@@ -21,7 +23,8 @@ import java.util.HashMap;
@Controller
@RequestMapping("/admin/root")
public class AdminRootController {
-
+ @Autowired
+ private NOSImageupload nOSImageupload;
@Autowired
private ConfigService configService;
@Autowired
@@ -112,12 +115,36 @@ public class AdminRootController {
Config config = new Config();
config.setSourcekey(key.getStorageType());
Integer val = configService.setSourceype(config);
- if (val > 0) {
- Integer ret = keysService.updateKey(key);
- jsonArray.add(ret);
- } else {
- jsonArray.add(0);
+ //if (val > 0) {
+ Integer ret = -2;
+ //修改完初始化
+ if(key.getStorageType()==1){
+ ret =nOSImageupload.Initialize(key);//实例化网易
+ }else if (key.getStorageType()==2){
+ ret = OSSImageupload.Initialize(key);
+ }else if(key.getStorageType()==3){
+ ret = USSImageupload.Initialize(key);
+ }else if(key.getStorageType()==4){
+ ret = KODOImageupload.Initialize(key);
+ }else if(key.getStorageType()==6){
+ ret = COSImageupload.Initialize(key);
+ }else if(key.getStorageType()==7){
+ ret = FTPImageupload.Initialize(key);
}
+ else{
+ Print.Normal("为获取到存储参数,或者使用存储源是本地的。");
+ }
+ if(ret>0){
+ ret = keysService.updateKey(key);
+ }
+
+ //-1 对象存储有参数为空,初始化失败
+ //0,保存失败
+ //1 正确
+ jsonArray.add(ret);
+ //} else {
+ //jsonArray.add(0);
+ // }
return jsonArray.toString();
}
diff --git a/src/main/java/cn/hellohao/controller/ClientController.java b/src/main/java/cn/hellohao/controller/ClientController.java
index 80703b9..4a20c88 100644
--- a/src/main/java/cn/hellohao/controller/ClientController.java
+++ b/src/main/java/cn/hellohao/controller/ClientController.java
@@ -224,6 +224,21 @@ public class ClientController {
return "-1";//-1就是没有公告,客户端不显示
}
-
+ //主端接口
+ @PostMapping("/systemupdate")
+ @ResponseBody
+ public String sysupdate(String dates) {
+ Integer i=dates.compareTo(systemupdate);//小于0则需要更新
+ System.out.println(i);
+ return i.toString();
+ }
+ //主端接口
+ @PostMapping("/getdomain")
+ @ResponseBody
+ public String getdomain(String domain) {
+ Integer count = domainService.getDomain(domain);
+ //System.out.println(i);
+ return count.toString();
+ }
}
diff --git a/src/main/java/cn/hellohao/controller/ExceptionHandling.java b/src/main/java/cn/hellohao/controller/ExceptionHandling.java
index 021164b..1f7c515 100644
--- a/src/main/java/cn/hellohao/controller/ExceptionHandling.java
+++ b/src/main/java/cn/hellohao/controller/ExceptionHandling.java
@@ -35,6 +35,7 @@ public class ExceptionHandling {
public String test4(SocketException e){
ModelAndView modelAndView = new ModelAndView("/index");
Print.Normal("存储源配置不正确,初始化失败"+ e.getMessage());
+ e.printStackTrace();
modelAndView.addObject("error",e.getMessage());
//返回错误信息,并显示给用户
return e.getMessage();
@@ -43,6 +44,7 @@ public class ExceptionHandling {
public String test3(Exception e){
ModelAndView modelAndView = new ModelAndView("/index");
Print.Normal("系统内部错误:"+ e.getMessage());
+ e.printStackTrace();
modelAndView.addObject("error",e.getMessage());
//返回错误信息,并显示给用户
return e.getMessage();
diff --git a/src/main/java/cn/hellohao/controller/UpdateImgController.java b/src/main/java/cn/hellohao/controller/UpdateImgController.java
index 5435242..5b33011 100644
--- a/src/main/java/cn/hellohao/controller/UpdateImgController.java
+++ b/src/main/java/cn/hellohao/controller/UpdateImgController.java
@@ -72,33 +72,7 @@ public class UpdateImgController {
if(uploadConfig.getImgcounttourists()!=null){imgcounttourists = uploadConfig.getImgcounttourists();}
if(uploadConfig.getImgcountuser()!=null){imgcountuser = uploadConfig.getImgcountuser();}
//Boolean b =false;
- Keys key = null;
- Integer Sourcekey = GetCurrentSource.GetSource(u==null?null:u.getId());
- if(Sourcekey!=0 && Sourcekey!=5){
- key= keysService.selectKeys(Sourcekey);//然后根据类型再查询key
- //b = StringUtils.doNull(key);//判断对象是否有空值
- if(key.getStorageType()!=0 && key.getStorageType()!=null){
- int ret =0;
- if(key.getStorageType()==1){
- ret =nOSImageupload.Initialize(key);//实例化网易
- }else if (key.getStorageType()==2){
- ret =OSSImageupload.Initialize(key);
- }else if(key.getStorageType()==3){
- ret = USSImageupload.Initialize(key);
- }else if(key.getStorageType()==4){
- ret = KODOImageupload.Initialize(key);
- }else if(key.getStorageType()==6){
- ret = COSImageupload.Initialize(key);
- }else if(key.getStorageType()==7){
- ret = FTPImageupload.Initialize(key);
- }
- else{
- Print.Normal("为获取到存储参数,或者使用存储源是本地的。");
- }
- if(ret<1){model.addAttribute("error", "当前存储源参数配置不完整,请联系管理员配置存储源。");}
- else{model.addAttribute("error", 1);}
- }
- }
+ //Integer Sourcekey = GetCurrentSource.GetSource(u==null?null:u.getId());//查询当当前用户或者游客使用的数据源
if (email != null) {
//登陆成功
Integer ret = userService.login(u.getEmail(), u.getPassword());
@@ -140,14 +114,12 @@ public class UpdateImgController {
, @RequestParam(value = "file", required = false) MultipartFile[] file) throws Exception {
JSONArray jsonArray = new JSONArray();
JSONObject jsonObject = new JSONObject();
- Config config = configService.getSourceype();//查询当前系统使用的存储源类型。
+ Config config = configService.getSourceype();
UploadConfig uploadConfig = uploadConfigService.getUpdateConfig();
User u = (User) session.getAttribute("user");
Integer usermemory =0;
Integer memory =0;
Integer Sourcekey=0;
- //User tmpuser = userService.getUsers(u.getEmail());
- //GetCurrentSource getCurrentSource = new GetCurrentSource();
if(u==null){
Sourcekey = GetCurrentSource.GetSource(null);
memory = uploadConfig.getVisitormemory();
@@ -526,15 +498,6 @@ public class UpdateImgController {
return jsonObject.toString();
}
- @RequestMapping(value = "/getsentence")
- @ResponseBody
- public String getsentence(HttpSession session) {
- JSONObject jsonObject = new JSONObject();
- String yiyan = Sentence.getURLContent();
-
- return yiyan;
- }
-
@RequestMapping("/err")
public String err() {
diff --git a/src/main/java/cn/hellohao/controller/UserController.java b/src/main/java/cn/hellohao/controller/UserController.java
index ca7b302..669e932 100644
--- a/src/main/java/cn/hellohao/controller/UserController.java
+++ b/src/main/java/cn/hellohao/controller/UserController.java
@@ -3,6 +3,7 @@ package cn.hellohao.controller;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
+import java.util.Random;
import java.util.UUID;
import javax.mail.internet.MimeMessage;
@@ -12,6 +13,8 @@ import javax.validation.Valid;
import cn.hellohao.pojo.*;
import cn.hellohao.service.*;
+import cn.hellohao.utils.Base64Encryption;
+import cn.hellohao.utils.Print;
import cn.hellohao.utils.SendEmail;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@@ -44,86 +47,97 @@ public class UserController {
@RequestMapping("/register")
@ResponseBody
- public String Register(@Valid User user) {
- //取当前时间
- UploadConfig updateConfig = uploadConfigService.getUpdateConfig();
+ public String Register(@Valid User u,Integer zctmp) {
JSONObject jsonObject = new JSONObject();
- EmailConfig emailConfig = emailConfigService.getemail();
- Integer countusername = userService.countusername(user.getUsername());
- Integer countmail = userService.countmail(user.getEmail());
- SysConfig sysConfig = sysConfigService.getstate();
- if(sysConfig.getRegister()==1){
- if (countusername == 0 && countmail == 0) {
- String uid = UUID.randomUUID().toString().replace("-", "").toLowerCase();
- SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");//设置日期格式
- String birthder = df.format(new Date());// new Date()为获取当前系统时间
- user.setLevel(1);
- user.setUid(uid);
- user.setBirthder(birthder);
- user.setMemory(updateConfig.getUsermemory());
- user.setGroupid(1);
- //查询是否启用了邮箱验证。
- Config config = configService.getSourceype();
- System.err.println("是否启用了邮箱激活:"+emailConfig.getUsing());
- Integer type = 0;
- if(emailConfig.getUsing()==1){
- user.setIsok(0);
- //初始化邮箱
- MimeMessage message = SendEmail.Emails(emailConfig);
- //注册完发激活链接
- Thread thread = new Thread() {
- public void run() {
- Integer a = SendEmail.sendEmail(message, user.getUsername(), uid, user.getEmail(),emailConfig,config);
- }
- };
- thread.start();
- type = 1;
- }else{
- //直接注册
- user.setIsok(1);
- type = 2;
- }
- Integer ret = userService.register(user);
- if(ret>0){
+ if((zctmp-number2)==(istmp2-number2)){
+ //取当前时间
+ User user = new User();
+ UploadConfig updateConfig = uploadConfigService.getUpdateConfig();
+ EmailConfig emailConfig = emailConfigService.getemail();
+ Integer countusername = userService.countusername(u.getUsername());
+ Integer countmail = userService.countmail(u.getEmail());
+ SysConfig sysConfig = sysConfigService.getstate();
+ if(sysConfig.getRegister()==1){
+ if (countusername == 0 && countmail == 0) {
+ String uid = UUID.randomUUID().toString().replace("-", "").toLowerCase();
+ SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");//设置日期格式
+ String birthder = df.format(new Date());// new Date()为获取当前系统时间
+ user.setLevel(1);
+ user.setUid(uid);
+ user.setBirthder(birthder);
+ user.setMemory(updateConfig.getUsermemory());
+ user.setGroupid(1);
+ user.setEmail(u.getEmail());
+ user.setUsername(u.getUsername());
+ user.setPassword(Base64Encryption.encryptBASE64(u.getPassword().getBytes()));
+ //查询是否启用了邮箱验证。
+ Config config = configService.getSourceype();
+ System.err.println("是否启用了邮箱激活:"+emailConfig.getUsing());
+ Integer type = 0;
+ if(emailConfig.getUsing()==1){
+ user.setIsok(0);
+ //初始化邮箱
+ MimeMessage message = SendEmail.Emails(emailConfig);
+ //注册完发激活链接
+ Thread thread = new Thread() {
+ public void run() {
+ Integer a = SendEmail.sendEmail(message, user.getUsername(), uid, user.getEmail(),emailConfig,config);
+ }
+ };
+ thread.start();
+ type = 1;
+ }else{
+ //直接注册
+ user.setIsok(1);
+ type = 2;
+ }
+ Integer ret = userService.register(user);
+ if(ret>0){
// UserGroup userGroup = new UserGroup();
// User user1 = userService.getUsersMail(uid);
// userGroup.setUserid(user1.getId());
// userGroup.setGroupid(1);
// userGroupService.addusergroup(userGroup);
+ }
+ jsonObject.put("ret",ret);
+ jsonObject.put("zctype",type);
+ } else {
+ jsonObject.put("ret",-2);
}
- jsonObject.put("ret",ret);
- jsonObject.put("zctype",type);
- } else {
- jsonObject.put("ret",-2);
+ }else{
+ jsonObject.put("ret",-3); //管理员关闭的注册
}
}else{
- jsonObject.put("ret",-3); //管理员关闭的注册
+ jsonObject.put("ret",-4);//非法注册
}
return jsonObject.toString();
}
- @RequestMapping("/login.do")
+ @RequestMapping("/login")
@ResponseBody
- public String login( HttpSession httpSession, String email, String password) {
+ public String login( HttpSession httpSession, String email, String password,Integer logotmp) {
JSONArray jsonArray = new JSONArray();
-
- Integer ret = userService.login(email, password);
- if (ret > 0) {
- User user = userService.getUsers(email);
- if (user.getIsok() == 1) {
- httpSession.setAttribute("user", user);
- httpSession.setAttribute("email", user.getEmail());
- httpSession.setAttribute("pass", user.getPassword());
- jsonArray.add(1);
- } else if(ret==-1){
- jsonArray.add(-1);
- }else {
- jsonArray.add(-2);
+ if((logotmp-number1)==(istmp1-number1)){
+ String basepass = Base64Encryption.encryptBASE64(password.getBytes());
+ Integer ret = userService.login(email, basepass);
+ if (ret > 0) {
+ User user = userService.getUsers(email);
+ if (user.getIsok() == 1) {
+ httpSession.setAttribute("user", user);
+ httpSession.setAttribute("email", user.getEmail());
+ jsonArray.add(1);
+ } else if(ret==-1){
+ jsonArray.add(-1);
+ }else {
+ jsonArray.add(-2);
+ }
+ } else {
+ jsonArray.add(0);
}
- } else {
- jsonArray.add(0);
+ }else{jsonArray.add(-3);//非法登录
}
+
return jsonArray.toString();
}
@@ -166,5 +180,26 @@ public class UserController {
}
}
+ @PostMapping(value = "/verification")
+ @ResponseBody
+ public Integer verification(HttpSession session,Integer tmp,Integer type) {
+ Random random = new Random();
+ if(type==1){
+ number1 = random.nextInt(100);
+ istmp1 = tmp;
+ Print.Normal(tmp-number1);
+ }
+ if(type==2){
+ number2 = random.nextInt(100);
+ istmp2 = tmp;
+ Print.Normal(tmp-number2);
+ }
+ return 1;
+ }
+
+ private Integer number1;
+ private Integer istmp1;
+ private Integer number2;
+ private Integer istmp2;
}
diff --git a/src/main/java/cn/hellohao/dao/KeysMapper.java b/src/main/java/cn/hellohao/dao/KeysMapper.java
index 64df6c6..d1509d1 100644
--- a/src/main/java/cn/hellohao/dao/KeysMapper.java
+++ b/src/main/java/cn/hellohao/dao/KeysMapper.java
@@ -5,11 +5,14 @@ import org.apache.ibatis.annotations.Param;
import cn.hellohao.pojo.Keys;
+import java.util.List;
+
@Mapper
public interface KeysMapper {
//查询密钥
Keys selectKeys(@Param("storageType") Integer storageType);
//修改key
Integer updateKey(Keys key);
+ List getKeys();
}
diff --git a/src/main/java/cn/hellohao/dao/UserMapper.java b/src/main/java/cn/hellohao/dao/UserMapper.java
index e61777f..ed4023e 100644
--- a/src/main/java/cn/hellohao/dao/UserMapper.java
+++ b/src/main/java/cn/hellohao/dao/UserMapper.java
@@ -45,7 +45,6 @@ public interface UserMapper {
User getUsersMail(@Param("uid") String uid);
Integer setisok (User user);
- Integer setisok (User user);
Integer setmemory(User user);
User getUsersid(@Param("id") Integer id);
diff --git a/src/main/java/cn/hellohao/service/KeysService.java b/src/main/java/cn/hellohao/service/KeysService.java
index c73433f..540e390 100644
--- a/src/main/java/cn/hellohao/service/KeysService.java
+++ b/src/main/java/cn/hellohao/service/KeysService.java
@@ -3,11 +3,13 @@ package cn.hellohao.service;
import cn.hellohao.pojo.Keys;
+import java.util.List;
+
public interface KeysService {
//查询密钥
Keys selectKeys(Integer storageType);
//修改key
Integer updateKey(Keys key);
-
+ List getKeys();
}
diff --git a/src/main/java/cn/hellohao/service/impl/FTPImageupload.java b/src/main/java/cn/hellohao/service/impl/FTPImageupload.java
index aae42dc..696f7ae 100644
--- a/src/main/java/cn/hellohao/service/impl/FTPImageupload.java
+++ b/src/main/java/cn/hellohao/service/impl/FTPImageupload.java
@@ -134,10 +134,10 @@ public class FTPImageupload {
}catch (IOException e){
System.out.println(e);
}
- Print.warning("连接失败");
+ //Print.warning("连接失败");
ret = -1;
}
- Print.Normal("链接成功");
+ //Print.Normal("链接成功");
//boolean isUpload = ftp.storeFile("/ftp/upload.jpg", fis);
ftpClient1 = ftp;
key = k;
diff --git a/src/main/java/cn/hellohao/service/impl/InitializationStorage.java b/src/main/java/cn/hellohao/service/impl/InitializationStorage.java
new file mode 100644
index 0000000..99a990f
--- /dev/null
+++ b/src/main/java/cn/hellohao/service/impl/InitializationStorage.java
@@ -0,0 +1,65 @@
+package cn.hellohao.service.impl;
+
+import cn.hellohao.dao.KeysMapper;
+import cn.hellohao.pojo.Keys;
+import cn.hellohao.utils.Print;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @author Hellohao
+ * @version 1.0
+ * @date 2019/8/28 15:33
+ */
+
+@Component
+@Order(2) //通过order值的大小来决定启动的顺序
+public class InitializationStorage implements CommandLineRunner {
+ @Autowired
+ private KeysMapper keysMapper;
+
+ @Override
+ public void run(String... args) throws Exception {
+ intiStorage();
+ sout();
+ }
+ public void intiStorage(){
+ List keylist = keysMapper.getKeys();
+ for (Keys key : keylist) {
+ if(key.getStorageType()!=0 && key.getStorageType()!=null){
+ int ret =0;
+ if(key.getStorageType()==1){
+ ret =NOSImageupload.Initialize(key);//实例化网易
+ }else if (key.getStorageType()==2){
+ ret =OSSImageupload.Initialize(key);
+ }else if(key.getStorageType()==3){
+ ret = USSImageupload.Initialize(key);
+ }else if(key.getStorageType()==4){
+ ret = KODOImageupload.Initialize(key);
+ }else if(key.getStorageType()==6){
+ ret = COSImageupload.Initialize(key);
+ }else if(key.getStorageType()==7){
+ ret = FTPImageupload.Initialize(key);
+ }
+ else{
+ //Print.warning("未获取到存储参数,或者使用存储源是本地的。");
+ }
+// if(ret<1){model.addAttribute("error", "当前存储源参数配置不完整,请联系管理员配置存储源。");}
+// else{model.addAttribute("error", 1);}
+ }
+ }
+Print.Normal("初始化完成");
+ }
+
+ public void sout(){
+ Print.Normal("______________________________________________");
+ Print.Normal(" Hellohao-Pro ");
+ Print.Normal(" Successful startup of the program ");
+ Print.Normal(" is OK! Open http://your ip:port ");
+ Print.Normal("______________________________________________");
+ }
+}
diff --git a/src/main/java/cn/hellohao/service/impl/KeysServiceImpl.java b/src/main/java/cn/hellohao/service/impl/KeysServiceImpl.java
index 2a2ee91..1da5ee7 100644
--- a/src/main/java/cn/hellohao/service/impl/KeysServiceImpl.java
+++ b/src/main/java/cn/hellohao/service/impl/KeysServiceImpl.java
@@ -7,6 +7,8 @@ import cn.hellohao.dao.KeysMapper;
import cn.hellohao.pojo.Keys;
import cn.hellohao.service.KeysService;
+import java.util.List;
+
@Service
public class KeysServiceImpl implements KeysService {
@@ -26,4 +28,9 @@ public class KeysServiceImpl implements KeysService {
return keysMapper.updateKey(key);
}
+ @Override
+ public List getKeys() {
+ return null;
+ }
+
}
diff --git a/src/main/java/cn/hellohao/test/test1.java b/src/main/java/cn/hellohao/test/test1.java
index 63cf554..de3e24c 100644
--- a/src/main/java/cn/hellohao/test/test1.java
+++ b/src/main/java/cn/hellohao/test/test1.java
@@ -6,88 +6,71 @@ import cn.hutool.crypto.SecureUtil;
import org.apache.commons.codec.binary.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.core.io.ClassPathResource;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
+import java.io.*;
import java.security.SecureRandom;
import java.util.Date;
public class test1 {
-
-// private static final String KEY = "myMw6qPt&3AD";
- private static final String KEY = "myMw6qPt&3GHSE";
-
- public static void main(String[] args) throws Exception {
- java.text.DateFormat format1 = new java.text.SimpleDateFormat("MMddhhmmss");
- String times = format1.format(new Date());
- //待加密字段
- String source = times+"201908111340402000";
- //加密
- String result = enCryptAndEncode(source);
- Print.warning(result);
- //解密
- String source_2 = deCryptAndDecode(result);
- Print.warning(source_2);
- System.out.println("判断是否相等:"+source.equals(source_2));
- System.out.println(SecureUtil.md5("200"));
- //System.out.println(SecureUtil.sha256("201908111340402000"));
-
+ public static void main(String[] args) throws Exception {
+ readFile(File.separator + "HellohaoData"+File.separator+"db.db");
+ //charu();
}
-
- public static String enCryptAndEncode(String content) {
+ public static void charu() {
+ String filePath =File.separator + "HellohaoData" ;
+ File file = new File(filePath);
+ File file1 = new File(filePath+File.separator+"db.db");
+ if(!file.exists()){
+ file.mkdirs();
+ }
+ if(!file1.exists()){
+ try {
+ file1.createNewFile();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ FileWriter fw = null;
try {
- byte[] sourceBytes = enCryptAndEncode(content, KEY);
- return Base64.encodeBase64URLSafeString(sourceBytes);
- } catch (Exception e) {
- return content;
+ //如果文件存在,则追加内容;如果文件不存在,则创建文件
+ fw = new FileWriter(file1, true);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ PrintWriter pw = new PrintWriter(fw);
+ pw.println("666666");
+ pw.flush();
+ try {
+ fw.flush();
+ pw.close();
+ fw.close();
+ } catch (IOException e) {
+ e.printStackTrace();
}
}
- /**
- * 加密函数
- *
- * @param content 加密的内容
- * @param strKey 密钥
- * @return 返回二进制字符数组
- * @throws Exception
- */
- public static byte[] enCryptAndEncode(String content, String strKey) throws Exception {
- KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
- keyGenerator.init(128, new SecureRandom(strKey.getBytes()));
-
- SecretKey desKey = keyGenerator.generateKey();
- Cipher cipher = Cipher.getInstance("AES");
- cipher.init(Cipher.ENCRYPT_MODE, desKey);
- return cipher.doFinal(content.getBytes("UTF-8"));
+ // 读取文件内容
+ public static String readFile(String path) {//路径
+ File file = new File(path);
+ StringBuilder result = new StringBuilder();
+ try {
+ BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "GBK"));//构造一个BufferedReader类来读取文件
+ String s = null;
+ while ((s = br.readLine()) != null) {//使用readLine方法,一次读一行
+ result.append(System.lineSeparator() + s);
+ Print.Normal( s);
+ }
+ br.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return result.toString();
}
- public static String deCryptAndDecode(String content) throws Exception {
- byte[] targetBytes = Base64.decodeBase64(content);
- return deCryptAndDecode(targetBytes, KEY);
- }
-
-
- /**
- * 解密函数
- *
- * @param src 加密过的二进制字符数组
- * @param strKey 密钥
- * @return
- * @throws Exception
- */
- public static String deCryptAndDecode(byte[] src, String strKey) throws Exception {
- KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
- keyGenerator.init(128, new SecureRandom(strKey.getBytes()));
-
- SecretKey desKey = keyGenerator.generateKey();
- Cipher cipher = Cipher.getInstance("AES");
- cipher.init(Cipher.DECRYPT_MODE, desKey);
- byte[] cByte = cipher.doFinal(src);
- return new String(cByte, "UTF-8");
- }
-
-
}
diff --git a/src/main/java/cn/hellohao/utils/AfterServiceStarted.java b/src/main/java/cn/hellohao/utils/AfterServiceStarted.java
index 0a8e237..fa6445b 100644
--- a/src/main/java/cn/hellohao/utils/AfterServiceStarted.java
+++ b/src/main/java/cn/hellohao/utils/AfterServiceStarted.java
@@ -14,11 +14,11 @@ public class AfterServiceStarted implements ApplicationRunner {
*/
@Override
public void run(ApplicationArguments args) throws Exception {
- Print.Normal("================================================");
- Print.Normal("|| Hellohao-Pro图床启动成功 ||");
- Print.Normal("|| 作者博客:Http://www.hellohao.cn ||");
- Print.Normal("|| 也许这将是最好用的图床 ||");
- Print.Normal("=================================================");
+// Print.Normal("______________________________________________");
+// Print.Normal(" Hellohao-Pro ");
+// Print.Normal(" Successful startup of the program ");
+// Print.Normal(" is OK! Open http://your ip:port ");
+// Print.Normal("______________________________________________");
//getLinuxLocalIp();
}
diff --git a/src/main/java/cn/hellohao/utils/Base64Encryption.java b/src/main/java/cn/hellohao/utils/Base64Encryption.java
new file mode 100644
index 0000000..11ab955
--- /dev/null
+++ b/src/main/java/cn/hellohao/utils/Base64Encryption.java
@@ -0,0 +1,50 @@
+package cn.hellohao.utils;
+
+import sun.misc.BASE64Decoder;
+import sun.misc.BASE64Encoder;
+
+import java.io.IOException;
+import java.util.Base64;
+
+/**
+ * Created by Hellohao on 2019-08-27.
+ */
+public class Base64Encryption {
+
+ public static void main(String[] args) {
+ toBaseCode("admin");
+ }
+ /**
+ * BASE64加密解密
+ */
+ public static void toBaseCode(String str) {
+ String data = encryptBASE64(str.getBytes());
+ System.out.println("sun.misc.BASE64 加密后:" + data);
+ System.out.println("sun.misc.BASE64 解密后:" + decryptBASE64(data));
+ }
+
+ /**
+ * BASE64解密
+ * @throws Exception
+ */
+ public static String decryptBASE64(String key) {
+ byte[] b =null;
+ try {
+ b = (new BASE64Decoder()).decodeBuffer(key);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return new String(b);
+ }
+
+ /**
+ * BASE64加密
+ */
+ public static String encryptBASE64(byte[] key) {
+
+ String string = "SGVsbG9oYW8K";
+ System.out.println(string.replaceAll("\r|\n",""));
+
+ return (new BASE64Encoder()).encodeBuffer(key).replaceAll("\r|\n", "");
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 297bbdb..b13d1ba 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -1,5 +1,5 @@
#ݿ˺
-spring.datasource.username=picturebed
+spring.datasource.username=root
#ݿtest
spring.datasource.password=root
#ݿӵַ
@@ -24,7 +24,7 @@ multipart.maxFileSize=10240KB
multipart.maxRequestSize=10240KB
spring.thymeleaf.mode = LEGACYHTML5
spring.http.multipart.location=/data/upload_tmp
-systemupdate=2019-08-25
+systemupdate=2019-08-29
diff --git a/src/main/resources/banner.txt b/src/main/resources/banner.txt
index 804bbef..7657e70 100644
--- a/src/main/resources/banner.txt
+++ b/src/main/resources/banner.txt
@@ -4,6 +4,8 @@
/ __ / __/ | | (_) | | | | (_| | (_) |
\/ /_/ \___|_|_|\___/|_| |_|\__,_|\___/
- ————————————————————————————————————
- Hellohao博客:http://www.hellohao.cn
- ————————————————————————————————————
\ No newline at end of file
+__________________________________________
+ HellohaoBlog:http://www.hellohao.cn
+__________________________________________
+
+//
\ No newline at end of file
diff --git a/src/main/resources/db/test.txt b/src/main/resources/db/test.txt
new file mode 100644
index 0000000..d75b77f
--- /dev/null
+++ b/src/main/resources/db/test.txt
@@ -0,0 +1 @@
+66666666666666666
\ No newline at end of file
diff --git a/src/main/resources/mapper/KeysMapper.xml b/src/main/resources/mapper/KeysMapper.xml
index dbaca4e..5419708 100644
--- a/src/main/resources/mapper/KeysMapper.xml
+++ b/src/main/resources/mapper/KeysMapper.xml
@@ -6,11 +6,19 @@
+
+
+
diff --git a/src/main/resources/static/css/font-awesome.min.css b/src/main/resources/static/css/font-awesome.min.css
index 327aaa9..d2a18cf 100644
--- a/src/main/resources/static/css/font-awesome.min.css
+++ b/src/main/resources/static/css/font-awesome.min.css
@@ -1,4 +1,4 @@
/*!
* Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
- */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.4.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.4.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.4.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.4.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.4.0') format('truetype'),url('../fonts/fontawesome-webfont93e3.svg?v=4.4.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}
+ */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.4.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.4.0') format('embedded-opentype'),url('../static/fonts/fontawesome-webfont.woff2?v=4.4.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.4.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.4.0') format('truetype'),url('../fonts/fontawesome-webfont93e3.svg?v=4.4.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}
diff --git a/src/main/resources/static/css/verify.css b/src/main/resources/static/css/verify.css
new file mode 100644
index 0000000..8a81218
--- /dev/null
+++ b/src/main/resources/static/css/verify.css
@@ -0,0 +1,170 @@
+/*常规验证码*/
+.verify-code {
+ font-size: 20px;
+ text-align: center;
+ cursor: pointer;
+ margin-bottom: 5px;
+ border: 1px solid #ddd;
+}
+
+.cerify-code-panel {
+ height:100%;
+ overflow:hidden;
+}
+
+.verify-code-area {
+ float:left;
+}
+
+.verify-input-area {
+ float: left;
+ width: 60%;
+ padding-right: 10px;
+
+}
+
+.verify-change-area {
+ line-height: 30px;
+ float: left;
+}
+
+.varify-input-code {
+ display:inline-block;
+ width: 100%;
+ height: 25px;
+}
+
+.verify-change-code {
+ color: #337AB7;
+ cursor: pointer;
+}
+
+.verify-btn {
+ width: 200px;
+ height: 30px;
+ background-color: #337AB7;
+ color:#FFFFFF;
+ border:none;
+ margin-top: 10px;
+}
+
+
+
+
+
+
+/*滑动验证码*/
+.verify-bar-area {
+ position: relative;
+ background: #FFFFFF;
+ text-align: center;
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ border: 1px solid #ddd;
+ -webkit-border-radius: 4px;
+}
+
+.verify-bar-area .verify-move-block {
+ position: absolute;
+ top: 0px;
+ left: 0;
+ background: #fff;
+ cursor: pointer;
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ box-shadow: 0 0 2px #888888;
+ -webkit-border-radius: 1px;
+}
+
+.verify-bar-area .verify-move-block:hover {
+ background-color: #337ab7;
+ color: #FFFFFF;
+}
+
+.verify-bar-area .verify-left-bar {
+ position: absolute;
+ top: -1px;
+ left: -1px;
+ background: #f0fff0;
+ cursor: pointer;
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ border: 1px solid #ddd;
+}
+
+.verify-img-panel {
+ margin:0;
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ border: 1px solid #ddd;
+ border-radius: 3px;
+ position: relative;
+}
+
+.verify-img-panel .verify-refresh {
+ width: 25px;
+ height: 25px;
+ text-align:center;
+ padding: 5px;
+ cursor: pointer;
+ position: absolute;
+ top: 0;
+ right: 0;
+ z-index: 2;
+}
+
+.verify-img-panel .icon-refresh {
+ font-size: 20px;
+ color: #fff;
+}
+
+.verify-img-panel .verify-gap {
+ background-color: #fff;
+ position: relative;
+ z-index: 2;
+ border:1px solid #fff;
+}
+
+.verify-bar-area .verify-move-block .verify-sub-block {
+ position: absolute;
+ text-align: center;
+ z-index: 3;
+ border: 1px solid #fff;
+}
+
+.verify-bar-area .verify-move-block .verify-icon {
+ font-size: 18px;
+}
+
+.verify-bar-area .verify-msg {
+ z-index : 3;
+}
+
+/*字体图标的css*/
+@font-face {font-family: "iconfont";
+ src: url('../fonts/iconfont.eot?t=1508229193188'); /* IE9*/
+ src: url('../fonts/iconfont.eot?t=1508229193188#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'),
+ url('../fonts/iconfont.ttf?t=1508229193188') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
+ url('../fonts/iconfont.svg?t=1508229193188#iconfont') format('svg'); /* iOS 4.1- */
+}
+
+.iconfont {
+ font-family:"iconfont" !important;
+ font-size:16px;
+ font-style:normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-check:before { content: "\e645"; }
+
+.icon-close:before { content: "\e646"; }
+
+.icon-right:before { content: "\e6a3"; }
+
+.icon-refresh:before { content: "\e6a4"; }
diff --git a/src/main/resources/static/fonts/FontAwesome.otf b/src/main/resources/static/fonts/FontAwesome.otf
deleted file mode 100644
index 681bdd4d4c8dddbaeb4d4f2a1f58c38cad92afe0..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 106260
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