├── .gitattributes ├── .gitignore ├── README.md ├── mybbs.sql ├── pom.xml └── src └── main ├── java └── com │ └── ljc │ ├── config │ └── Config.java │ ├── controller │ ├── ArticleController.java │ ├── CommentController.java │ ├── FileUpLoadController.java │ └── UserController.java │ ├── dao │ ├── ArticleDao.java │ ├── CommentDao.java │ └── UserDao.java │ ├── entity │ ├── Article.java │ ├── Comment.java │ ├── Floor.java │ ├── PageBean.java │ └── User.java │ ├── service │ ├── ArticleService.java │ ├── CommentService.java │ ├── UserService.java │ └── impl │ │ ├── ArticleServiceImpl.java │ │ ├── CommentServiceImpl.java │ │ └── UserServiceImpl.java │ └── util │ ├── LogUtils.java │ ├── QiNiuUtils.java │ ├── ResponseUtils.java │ └── StringUtils.java ├── resources ├── applicationContext.xml ├── jdbc.properties ├── log4j.properties ├── mappers │ ├── Article.xml │ ├── Comment.xml │ └── User.xml ├── mybatis-config.xml └── spring-mvc.xml └── webapp ├── WEB-INF ├── jsp │ ├── article │ │ ├── articleContent.jsp │ │ └── articleList.jsp │ ├── common │ │ ├── articleData.jsp │ │ ├── editor.jsp │ │ ├── foot.jsp │ │ ├── head.jsp │ │ ├── import.jsp │ │ └── login.jsp │ ├── search.jsp │ └── user │ │ ├── userInfo.jsp │ │ └── userManager.jsp └── web.xml ├── index.jsp └── resources ├── bootstrap ├── css │ ├── bootstrap-theme.css │ ├── bootstrap-theme.css.map │ ├── bootstrap-theme.min.css │ ├── bootstrap.css │ ├── bootstrap.css.map │ └── bootstrap.min.css ├── fonts │ ├── glyphicons-halflings-regular.eot │ ├── glyphicons-halflings-regular.svg │ ├── glyphicons-halflings-regular.ttf │ └── glyphicons-halflings-regular.woff └── js │ ├── bootstrap.js │ ├── bootstrap.min.js │ ├── jquery.min.js │ └── npm.js ├── css ├── mycss.css └── wangEditor.css ├── fonts ├── icomoon.eot ├── icomoon.svg ├── icomoon.ttf └── icomoon.woff ├── imgs ├── head.png └── logo.png └── js ├── jquery-1.9.0.min.js ├── jquery.nivo.slider.js └── wangEditor.js /.gitattributes: -------------------------------------------------------------------------------- 1 | *.js linguist-language=Java 2 | *.css linguist-language=Java 3 | *.html linguist-language=Java -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Maven # 2 | target/ 3 | 4 | # IDEA # 5 | .idea/ 6 | *.iml 7 | 8 | # Eclipse # 9 | .settings/ 10 | .classpath 11 | .project 12 | bin/ 13 | 14 | # logs file # 15 | logs/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | >基于Spring/Spring MVC/MyBatis、类似于贴吧的的个人论坛 2 | 3 | #### 开发环境及技术选型 4 | - Jdk 1.8 5 | - Spring 4.1.7 6 | - Mybatis 3.3.0 7 | - Mysql 5.7 8 | - Tomcat 7 9 | - Maven 3.3 10 | - Bootstrap 3 11 | - CentOS 7 12 | - 七牛云存储 13 | 14 | #### 演示站点:http://123.206.218.51/MyForum 或访问:http://123.206.218.51/AhuLjc 论坛模块 15 | -------------------------------------------------------------------------------- /mybbs.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Navicat MySQL Data Transfer 3 | 4 | Source Server : localhost_3306 5 | Source Server Version : 50716 6 | Source Host : localhost:3306 7 | Source Database : mybbs 8 | 9 | Target Server Type : MYSQL 10 | Target Server Version : 50716 11 | File Encoding : 65001 12 | 13 | Date: 2017-03-15 14:14:05 14 | */ 15 | 16 | SET FOREIGN_KEY_CHECKS=0; 17 | 18 | -- ---------------------------- 19 | -- Table structure for article 20 | -- ---------------------------- 21 | DROP TABLE IF EXISTS `article`; 22 | CREATE TABLE `article` ( 23 | `aid` int(11) NOT NULL AUTO_INCREMENT, 24 | `title` varchar(100) DEFAULT NULL, 25 | `content` text, 26 | `date` datetime DEFAULT NULL, 27 | `uid` int(11) NOT NULL, 28 | `lable` varchar(100) DEFAULT NULL, 29 | `status` int(10) unsigned zerofill DEFAULT NULL, 30 | PRIMARY KEY (`aid`), 31 | KEY `uid` (`uid`), 32 | CONSTRAINT `uid` FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE 33 | ) ENGINE=InnoDB AUTO_INCREMENT=75 DEFAULT CHARSET=utf8; 34 | 35 | -- ---------------------------- 36 | -- Table structure for comment 37 | -- ---------------------------- 38 | DROP TABLE IF EXISTS `comment`; 39 | CREATE TABLE `comment` ( 40 | `cid` int(11) NOT NULL AUTO_INCREMENT, 41 | `content` text, 42 | `aid` int(11) NOT NULL, 43 | `uid` int(11) NOT NULL, 44 | `date` datetime DEFAULT NULL, 45 | PRIMARY KEY (`cid`), 46 | KEY `aid` (`aid`), 47 | KEY `uid` (`uid`), 48 | CONSTRAINT `aid` FOREIGN KEY (`aid`) REFERENCES `article` (`aid`) ON DELETE CASCADE ON UPDATE CASCADE, 49 | CONSTRAINT `comment_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE 50 | ) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8; 51 | 52 | -- ---------------------------- 53 | -- Table structure for floor 54 | -- ---------------------------- 55 | DROP TABLE IF EXISTS `floor`; 56 | CREATE TABLE `floor` ( 57 | `fid` int(11) NOT NULL AUTO_INCREMENT, 58 | `aid` int(11) NOT NULL, 59 | `cid` int(11) NOT NULL, 60 | `uid` int(11) NOT NULL, 61 | `content` varchar(255) DEFAULT NULL, 62 | PRIMARY KEY (`fid`), 63 | KEY `cid` (`cid`), 64 | CONSTRAINT `cid` FOREIGN KEY (`cid`) REFERENCES `comment` (`cid`) ON DELETE CASCADE ON UPDATE CASCADE 65 | ) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8; 66 | 67 | -- ---------------------------- 68 | -- Table structure for user 69 | -- ---------------------------- 70 | DROP TABLE IF EXISTS `user`; 71 | CREATE TABLE `user` ( 72 | `uid` int(11) NOT NULL AUTO_INCREMENT, 73 | `username` varchar(255) DEFAULT NULL, 74 | `password` varchar(255) DEFAULT NULL, 75 | `headimg` varchar(255) DEFAULT NULL, 76 | PRIMARY KEY (`uid`), 77 | KEY `username` (`username`) 78 | ) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8; 79 | SET FOREIGN_KEY_CHECKS=1; 80 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4.0.0 4 | com.ljc 5 | MyForum 6 | war 7 | 0.0.1-SNAPSHOT 8 | MyForum Maven Webapp 9 | http://maven.apache.org 10 | 11 | 12 | 4.1.7.RELEASE 13 | 14 | 15 | 16 | 17 | junit 18 | junit 19 | 3.8.1 20 | test 21 | 22 | 23 | 24 | javax.servlet 25 | javax.servlet-api 26 | 3.1.0 27 | 28 | 29 | 30 | javax.servlet.jsp 31 | javax.servlet.jsp-api 32 | 2.3.1 33 | 34 | 35 | 36 | javax.servlet 37 | jstl 38 | 1.2 39 | 40 | 41 | 42 | org.springframework 43 | spring-core 44 | ${spring.version} 45 | 46 | 47 | org.springframework 48 | spring-beans 49 | ${spring.version} 50 | 51 | 52 | org.springframework 53 | spring-tx 54 | ${spring.version} 55 | 56 | 57 | org.springframework 58 | spring-context 59 | ${spring.version} 60 | 61 | 62 | org.springframework 63 | spring-context-support 64 | ${spring.version} 65 | 66 | 67 | 68 | org.springframework 69 | spring-web 70 | ${spring.version} 71 | 72 | 73 | 74 | org.springframework 75 | spring-webmvc 76 | ${spring.version} 77 | 78 | 79 | 80 | org.springframework 81 | spring-aop 82 | ${spring.version} 83 | 84 | 85 | 86 | 87 | org.springframework 88 | spring-aspects 89 | ${spring.version} 90 | 91 | 92 | 93 | org.springframework 94 | spring-jdbc 95 | ${spring.version} 96 | 97 | 98 | 99 | org.mybatis 100 | mybatis-spring 101 | 1.2.3 102 | 103 | 104 | 105 | 106 | log4j 107 | log4j 108 | 1.2.17 109 | 110 | 111 | 112 | org.slf4j 113 | slf4j-log4j12 114 | 1.7.12 115 | 116 | 117 | 118 | org.mybatis 119 | mybatis 120 | 3.3.0 121 | 122 | 123 | 124 | mysql 125 | mysql-connector-java 126 | 5.1.37 127 | 128 | 129 | 130 | commons-lang 131 | commons-lang 132 | 2.5 133 | 134 | 135 | 136 | commons-fileupload 137 | commons-fileupload 138 | 1.2.1 139 | 140 | 141 | 142 | commons-io 143 | commons-io 144 | 1.3.2 145 | 146 | 147 | 148 | commons-logging 149 | commons-logging 150 | 1.1.1 151 | 152 | 153 | 154 | com.alibaba 155 | druid 156 | 1.0.16 157 | 158 | 159 | 160 | 161 | com.fasterxml.jackson.core 162 | jackson-annotations 163 | 2.8.6 164 | 165 | 166 | 167 | com.fasterxml.jackson.core 168 | jackson-core 169 | 2.8.6 170 | 171 | 172 | 173 | com.fasterxml.jackson.core 174 | jackson-databind 175 | 2.8.6 176 | 177 | 178 | 179 | 180 | com.qiniu 181 | qiniu-java-sdk 182 | [7.2.0, 7.2.99] 183 | 184 | 185 | 186 | 187 | MyForum 188 | 189 | 190 | -------------------------------------------------------------------------------- /src/main/java/com/ljc/config/Config.java: -------------------------------------------------------------------------------- 1 | package com.ljc.config; 2 | 3 | /** 4 | * @author LJC 5 | * 存储静态数据 6 | */ 7 | public class Config { 8 | 9 | /** 10 | * 默认头像地址 11 | */ 12 | public static final String DEFAULT_HEADIMG_ADDRESS = "/resources/imgs/head.png"; 13 | 14 | /** 15 | * 默认文件上传地址 16 | */ 17 | public static final String DEFAULT_UPLOAD_ADDRESS = "/resources/upload"; 18 | 19 | /** 20 | * 默认分页大小 21 | */ 22 | public static final int DEFAULT_PAGESIZE = 10; 23 | 24 | /** 25 | * 置顶帖status 26 | */ 27 | public static final int STATUS_TOP = 1; 28 | 29 | /** 30 | * 精品帖status 31 | */ 32 | public static final int STATUS_HOT = 2; 33 | 34 | /** 35 | * 置顶且加精品status 36 | */ 37 | public static final int STATUS_TOP_HOT = 3; 38 | 39 | /** 40 | * 七牛云 AccessKey 41 | */ 42 | public static final String QINIU_ACCESS_KEY = "tqzVOKV-LjEy2gQG5hbBe2iv8XzZAXAHB11mOwZ8"; 43 | /** 44 | * 七牛云 SecretKey 45 | */ 46 | public static final String QINIU_SECRET_KEY = "YPhQja32sQ_aifoS8tXzPkSY-FMa_49yu8wedNuO"; 47 | /** 48 | * 七牛云头像存储Bucket 49 | */ 50 | public static final String QINIU_BUCKET_HEADIMG = "headimg"; 51 | 52 | /** 53 | * 七牛云图片存储测试地址 54 | */ 55 | public static final String QINIU_IMG_URL = "http://odudqy2qz.bkt.clouddn.com/"; 56 | 57 | } 58 | -------------------------------------------------------------------------------- /src/main/java/com/ljc/controller/ArticleController.java: -------------------------------------------------------------------------------- 1 | package com.ljc.controller; 2 | 3 | import java.sql.Timestamp; 4 | import java.util.ArrayList; 5 | import java.util.Date; 6 | import java.util.HashMap; 7 | import java.util.List; 8 | import java.util.Map; 9 | 10 | import javax.servlet.http.HttpSession; 11 | 12 | import org.springframework.beans.factory.annotation.Autowired; 13 | import org.springframework.stereotype.Controller; 14 | import org.springframework.web.bind.annotation.PathVariable; 15 | import org.springframework.web.bind.annotation.RequestMapping; 16 | import org.springframework.web.bind.annotation.RequestMethod; 17 | import org.springframework.web.bind.annotation.RequestParam; 18 | import org.springframework.web.bind.annotation.ResponseBody; 19 | import org.springframework.web.servlet.ModelAndView; 20 | 21 | import com.ljc.config.Config; 22 | import com.ljc.entity.Article; 23 | import com.ljc.entity.Comment; 24 | import com.ljc.entity.Floor; 25 | import com.ljc.entity.User; 26 | import com.ljc.service.ArticleService; 27 | import com.ljc.service.CommentService; 28 | import com.ljc.service.UserService; 29 | import com.ljc.util.LogUtils; 30 | import com.ljc.util.StringUtils; 31 | 32 | /** 33 | * @author LJC 34 | * 帖子列表Controller 35 | */ 36 | @Controller 37 | @RequestMapping("article") 38 | public class ArticleController { 39 | 40 | @Autowired 41 | private ArticleService articleService; 42 | 43 | @Autowired 44 | private UserService userService; 45 | 46 | @Autowired 47 | private CommentService commentService; 48 | 49 | 50 | /** 51 | * 获取帖子分页数据 52 | * @return 53 | */ 54 | @RequestMapping("/list/{currentPage}") 55 | public ModelAndView getArticlePageList(HttpSession session, 56 | @PathVariable("currentPage") int currentPage){ 57 | ModelAndView mav = new ModelAndView(); 58 | int pageSize = Config.DEFAULT_PAGESIZE;// 每页记录数 59 | mav.addObject("articlePageBean", articleService.getArticlePageList(currentPage,pageSize)); 60 | 61 | List statusList = new ArrayList<>(); 62 | statusList.add(Config.STATUS_TOP); //置顶帖 63 | statusList.add(Config.STATUS_TOP_HOT); //置顶且加精帖 64 | mav.addObject("topArticle", articleService.getArticleListByStatus(statusList)); 65 | 66 | //刷新session 67 | if(session.getAttribute("user") != null){ 68 | User user = (User) session.getAttribute("user"); 69 | session.setAttribute("user", userService.getUserByID(user.getUid())); 70 | } 71 | mav.setViewName("article/articleList"); 72 | return mav; 73 | } 74 | 75 | /** 76 | * 根据id获取帖子数据 77 | * @param aid 78 | * @return 79 | */ 80 | @RequestMapping("/details/{aid}") 81 | public ModelAndView getArticleByID(@PathVariable("aid") Integer aid){ 82 | ModelAndView mav = new ModelAndView(); 83 | //帖子数据 84 | Article article = articleService.getArticleByID(aid); 85 | //评论数据 86 | List commentList = commentService.findComment(aid, null); 87 | //楼中楼评论数据 88 | List floorCommentList = commentService.findFloorComment(aid, null); 89 | //数据存放至Model 90 | mav.addObject(article); 91 | mav.addObject(commentList); 92 | mav.addObject("Floor", floorCommentList); 93 | //设置视图 94 | mav.setViewName("article/articleContent"); 95 | return mav; 96 | } 97 | 98 | /** 99 | * 添加楼中楼评论 100 | * @param aid 101 | * @param cid 102 | * @param uid 103 | * @param content 104 | * @return 105 | */ 106 | @ResponseBody 107 | @RequestMapping(value = "/floor/add", method = RequestMethod.POST) 108 | public Map findFloorComment(HttpSession session, 109 | @RequestParam("aid") Integer aid, 110 | @RequestParam("cid") Integer cid, 111 | @RequestParam("uid") Integer uid, 112 | @RequestParam("content") String content){ 113 | Map map = new HashMap(); 114 | //身份检测 115 | User user = (User) session.getAttribute("user"); //当前登录用户 116 | if(user.getUid() != uid){ 117 | map.put("data", "回复失败!"); 118 | return map; 119 | } 120 | //楼中楼评论数据 121 | int result = commentService.addFloorComment(aid,cid,uid,content); 122 | if(result>0){ 123 | LogUtils.info("楼中楼评论成功!内容=>"+content); 124 | // map.put("data", "回复成功!"); 125 | }else{ 126 | LogUtils.info("楼中楼评论失败!"); 127 | // map.put("data", "回复失败!"); 128 | } 129 | return map; 130 | } 131 | 132 | /** 133 | * 根据id删除帖子数据 134 | * @param aid 135 | * @return 136 | */ 137 | @RequestMapping("/delete/{aid}") 138 | @ResponseBody 139 | public Map deleteArticleByID(HttpSession session,@PathVariable("aid") Integer aid){ 140 | Map map = new HashMap<>(); 141 | //身份检测 142 | User user = (User) session.getAttribute("user"); //当前登录用户 143 | // Integer uid = articleService.getArticleByID(aid).getUid(); //帖子作者 144 | Integer uid = articleService.getArticleByID(aid).getAuthor().getUid(); //帖子作者 145 | if(user.getUid() != uid){ 146 | map.put("data", "只能删除自己的帖子!"); 147 | return map; 148 | } 149 | int result = articleService.deleteArticleByID(aid); 150 | if(result>0){ 151 | LogUtils.info("成功删除id为{}的帖子!",aid); 152 | map.put("data", "删除成功!"); 153 | }else{ 154 | LogUtils.info("删除失败id为{}的帖子!",aid); 155 | map.put("data", "删除失败!"); 156 | } 157 | return map; 158 | } 159 | 160 | /** 161 | * 发表新帖 162 | * @param title 163 | * @param content 164 | * @return 165 | */ 166 | @RequestMapping(value = "/add", method = RequestMethod.POST) 167 | @ResponseBody 168 | public Map addArticle(HttpSession session, 169 | @RequestParam(value = "title") String title, 170 | @RequestParam(value = "content") String content, 171 | @RequestParam(value = "uid") Integer uid, 172 | @RequestParam(value = "lable") String lable){ 173 | Map map = new HashMap<>(); 174 | //身份检测 175 | User user = (User) session.getAttribute("user"); 176 | if(user == null){ 177 | map.put("data", "请登录后在发帖!"); 178 | return map; 179 | } 180 | if(StringUtils.isEmpty(title) || StringUtils.isBlank(title)){ 181 | map.put("data", "标题不能为空!"); 182 | return map; 183 | } 184 | int result = articleService.addArticle(title,content,new Timestamp(new Date().getTime()),uid,lable); 185 | if(result>0){ 186 | LogUtils.info("发帖成功,标题:{},内容长度:{}",title,content.length()); 187 | map.put("data", "发帖成功!"); 188 | }else{ 189 | LogUtils.info("发帖失败!"); 190 | } 191 | return map; 192 | } 193 | 194 | /** 195 | * 关键字查询帖子标题 196 | * @param key 197 | * @return 198 | */ 199 | @RequestMapping("/search") 200 | public ModelAndView SearchArticle(@RequestParam("key")String key){ 201 | ModelAndView mav = new ModelAndView(); 202 | List
list = articleService.searchArticleByKey(key); 203 | LogUtils.info("查询关键字:{},共查询到{}条记录",key,list.size()); 204 | mav.addObject("key",key); 205 | mav.addObject("resultList",list); 206 | mav.setViewName("search"); 207 | return mav; 208 | } 209 | 210 | } 211 | -------------------------------------------------------------------------------- /src/main/java/com/ljc/controller/CommentController.java: -------------------------------------------------------------------------------- 1 | package com.ljc.controller; 2 | 3 | import java.sql.Timestamp; 4 | import java.util.Date; 5 | import java.util.HashMap; 6 | import java.util.Map; 7 | 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Controller; 10 | import org.springframework.web.bind.annotation.RequestMapping; 11 | import org.springframework.web.bind.annotation.RequestMethod; 12 | import org.springframework.web.bind.annotation.RequestParam; 13 | import org.springframework.web.bind.annotation.ResponseBody; 14 | 15 | import com.ljc.service.CommentService; 16 | import com.ljc.service.UserService; 17 | import com.ljc.util.LogUtils; 18 | 19 | /** 20 | * @author LJC 21 | * 帖子评论Controller 22 | */ 23 | @Controller 24 | @RequestMapping("/comment") 25 | public class CommentController { 26 | 27 | @Autowired 28 | private CommentService commentService; 29 | 30 | @Autowired 31 | private UserService userService; 32 | 33 | /** 34 | * 发表评论 35 | * @param content 36 | * @param aid 37 | * @param uid 38 | * @return 39 | */ 40 | @RequestMapping(value = "/add", method = RequestMethod.POST) 41 | @ResponseBody 42 | public Map addComment( 43 | @RequestParam(value = "content", required = false) String content, 44 | @RequestParam(value = "aid") Integer aid, 45 | @RequestParam(value = "uid") Integer uid){ 46 | Map map = new HashMap<>(); 47 | //插入评论 48 | int result = commentService.addComment(content,aid,uid,new Timestamp(new Date().getTime())); 49 | if(result>0){ 50 | LogUtils.info("回复成功!内容为:"+content); 51 | map.put("data", "回复成功!"); 52 | }else{ 53 | LogUtils.info("回复失败!"); 54 | map.put("data", "回复失败!"); 55 | } 56 | return map; 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/main/java/com/ljc/controller/FileUpLoadController.java: -------------------------------------------------------------------------------- 1 | package com.ljc.controller; 2 | 3 | import java.io.File; 4 | 5 | import javax.servlet.http.HttpServletRequest; 6 | import javax.servlet.http.HttpServletResponse; 7 | 8 | import org.springframework.stereotype.Controller; 9 | import org.springframework.web.bind.annotation.RequestMapping; 10 | import org.springframework.web.bind.annotation.RequestParam; 11 | import org.springframework.web.multipart.MultipartFile; 12 | 13 | import com.ljc.config.Config; 14 | import com.ljc.util.LogUtils; 15 | import com.ljc.util.ResponseUtils; 16 | 17 | /** 18 | * @author LJC 19 | * 文件上传 20 | */ 21 | @Controller 22 | public class FileUpLoadController { 23 | 24 | /** 25 | * 文件上传 26 | * @param file 27 | * @param request 28 | * @param response 29 | * @return 30 | */ 31 | @RequestMapping("/upload") 32 | public String upload(@RequestParam("file") MultipartFile file, 33 | HttpServletRequest request, HttpServletResponse response) { 34 | 35 | // 文件名及文件存储位置,保存到 ../resources/upload/ 目录下 36 | String fileName = file.getOriginalFilename(); 37 | String filePath = request.getServletContext().getRealPath(Config.DEFAULT_UPLOAD_ADDRESS); 38 | 39 | LogUtils.info("文件名:{},文件存储路径:{}", fileName, filePath); 40 | 41 | // 上传文件到服务器 42 | try { 43 | file.transferTo(new File(filePath + File.separator + fileName)); 44 | } catch (Exception e) { 45 | LogUtils.info("文件上传失败!" + e); 46 | e.printStackTrace(); 47 | } 48 | 49 | // 向前台返回文件地址 50 | ResponseUtils.write(response, request.getContextPath() 51 | + Config.DEFAULT_UPLOAD_ADDRESS + fileName); 52 | 53 | return null; 54 | } 55 | 56 | } 57 | -------------------------------------------------------------------------------- /src/main/java/com/ljc/controller/UserController.java: -------------------------------------------------------------------------------- 1 | package com.ljc.controller; 2 | 3 | import java.util.HashMap; 4 | import java.util.List; 5 | import java.util.Map; 6 | 7 | import javax.servlet.http.HttpServletRequest; 8 | import javax.servlet.http.HttpSession; 9 | 10 | import org.springframework.beans.factory.annotation.Autowired; 11 | import org.springframework.stereotype.Controller; 12 | import org.springframework.web.bind.annotation.PathVariable; 13 | import org.springframework.web.bind.annotation.RequestMapping; 14 | import org.springframework.web.bind.annotation.RequestMethod; 15 | import org.springframework.web.bind.annotation.RequestParam; 16 | import org.springframework.web.bind.annotation.ResponseBody; 17 | import org.springframework.web.multipart.MultipartFile; 18 | import org.springframework.web.servlet.ModelAndView; 19 | 20 | import com.ljc.config.Config; 21 | import com.ljc.entity.Article; 22 | import com.ljc.entity.User; 23 | import com.ljc.service.ArticleService; 24 | import com.ljc.service.CommentService; 25 | import com.ljc.service.UserService; 26 | import com.ljc.util.LogUtils; 27 | import com.ljc.util.QiNiuUtils; 28 | import com.ljc.util.StringUtils; 29 | import com.qiniu.storage.model.DefaultPutRet; 30 | 31 | /** 32 | * @author LJC 33 | * 用户登录注册Controller 34 | */ 35 | @Controller 36 | @RequestMapping("user") 37 | public class UserController { 38 | 39 | @Autowired 40 | private UserService userService; 41 | 42 | @Autowired 43 | private ArticleService articleService; 44 | 45 | @Autowired 46 | private CommentService commentService; 47 | 48 | 49 | /** 50 | * 注册用户 51 | * @param username 52 | * @param password 53 | * @return 54 | */ 55 | @RequestMapping(value = "/regist", method = RequestMethod.POST) 56 | @ResponseBody 57 | public Map regist( 58 | @RequestParam("username") String username, 59 | @RequestParam("password") String password) { 60 | 61 | Map map = new HashMap(); 62 | //保证用户名唯一 63 | if(userService.findUser(username,null) != null){ 64 | map.put("data", "用户名已存在!"); 65 | return map; 66 | } 67 | //默认头像 68 | String headimg = Config.DEFAULT_HEADIMG_ADDRESS; 69 | int result = userService.addUser(username, StringUtils.MD5(password), headimg); 70 | if (result > 0) { 71 | LogUtils.info("注册成功!用户名:{},密码:{}", username, password); 72 | map.put("data", "注册成功,请重新登录!"); 73 | } else { 74 | LogUtils.info("注册失败!"); 75 | map.put("data", "注册失败!"); 76 | } 77 | return map; 78 | } 79 | 80 | /** 81 | * 登录 82 | * @param session 83 | * @param username 84 | * @param password 85 | * @return 86 | */ 87 | @RequestMapping(value="/login", method = RequestMethod.POST) 88 | @ResponseBody 89 | public Map login(HttpSession session, 90 | @RequestParam("username") String username, 91 | @RequestParam("password") String password) { 92 | User user = userService.findUser(username, StringUtils.MD5(password)); 93 | Map map = new HashMap(); 94 | if (user!=null) { 95 | LogUtils.info("登录成功!用户名:{},密码:{}", username, password); 96 | map.put("data", "登录成功!"); 97 | session.setAttribute("user", user); 98 | } else { 99 | LogUtils.info("登录失败!"); 100 | map.put("data", "登录失败!"); 101 | } 102 | return map; 103 | } 104 | 105 | /** 106 | * 根据id获得用户信息及发表过的帖子 107 | * @return 108 | */ 109 | @RequestMapping("/manager/{uid}") 110 | public ModelAndView getUserManager(@PathVariable("uid") Integer uid){ 111 | ModelAndView mav = new ModelAndView(); 112 | //用户信息 113 | User user = userService.getUserByID(uid); 114 | //用户帖子数据 115 | List
articleList = articleService.getArticleByUID(uid); 116 | mav.addObject("u",user); 117 | mav.addObject("userArticle",articleList); 118 | mav.setViewName("user/userManager"); 119 | return mav; 120 | } 121 | 122 | /** 123 | * 根据id获得用户信息 124 | * @return 125 | */ 126 | @RequestMapping("/info/{uid}") 127 | public ModelAndView getUserInfo(@PathVariable("uid") Integer uid){ 128 | ModelAndView mav = new ModelAndView(); 129 | //用户信息 130 | User user = userService.getUserByID(uid); 131 | mav.addObject("uInfo",user); 132 | mav.setViewName("user/userInfo"); 133 | return mav; 134 | } 135 | 136 | /** 137 | * 更新头像 138 | * @param request 139 | * @param file 140 | * @param uid 141 | * @return 142 | */ 143 | @RequestMapping(value = "/headimg/{uid}", method = RequestMethod.POST) 144 | public String updateHeadImg(HttpServletRequest request, 145 | @RequestParam("file") MultipartFile file, 146 | @PathVariable("uid") Integer uid){ 147 | //防止空白头像的情况 148 | if(file.isEmpty()) return null; 149 | //进行上传操作 150 | DefaultPutRet putRet = QiNiuUtils.upLoad(file, Config.QINIU_BUCKET_HEADIMG); 151 | //头像地址并更根据uid插入对应数据库 152 | int result = userService.updateHeadImg(Config.QINIU_IMG_URL + putRet.key,uid); 153 | if(result > 0){ 154 | LogUtils.info("成功更新uid为{}的用户头像,文件名{}",uid,putRet.key); 155 | } else { 156 | LogUtils.info("更新头像失败!"); 157 | } 158 | //刷新session 159 | request.getSession().setAttribute("user",userService.getUserByID(uid)); 160 | return "redirect:/index.jsp"; 161 | } 162 | 163 | /** 164 | * 根据uid更新用户密码 165 | * @param session 166 | * @param uid 167 | * @param username 168 | * @param password 169 | * @return 170 | */ 171 | @RequestMapping(value = "/update/{uid}", method = RequestMethod.POST) 172 | @ResponseBody 173 | public Map updateUserInfo(HttpSession session, 174 | @PathVariable("uid") Integer uid, 175 | @RequestParam("password") String password) { 176 | Map map = new HashMap<>(); 177 | //身份检测 178 | User user = (User) session.getAttribute("user"); //当前登录用户 179 | if(user.getUid() != uid){ 180 | map.put("data", "只能修改自己的信息!"); 181 | return map; 182 | } 183 | //更新用户信息 184 | int result = userService.updateUserInfo(uid,StringUtils.MD5(password)); 185 | if(result>0){ 186 | LogUtils.info("成功更新id为{}的用户信息!新密码:{}",uid,password); 187 | map.put("data", "信息修改成功!"); 188 | }else{ 189 | map.put("data", "信息修改失败!"); 190 | } 191 | return map; 192 | } 193 | 194 | /** 195 | * 安全退出 196 | * @param request 197 | * @return 198 | */ 199 | @RequestMapping("/exit") 200 | public String exit(HttpSession session) { 201 | //销毁session 202 | session.invalidate(); 203 | return "redirect:/index.jsp"; 204 | } 205 | 206 | } 207 | -------------------------------------------------------------------------------- /src/main/java/com/ljc/dao/ArticleDao.java: -------------------------------------------------------------------------------- 1 | package com.ljc.dao; 2 | 3 | import java.sql.Timestamp; 4 | import java.util.List; 5 | 6 | import org.apache.ibatis.annotations.Param; 7 | 8 | import com.ljc.entity.Article; 9 | 10 | public interface ArticleDao { 11 | 12 | public List
getArticleList(); 13 | 14 | public Article getArticleByID(@Param("aid")Integer aid); 15 | 16 | public int addArticle(@Param("title") String title, 17 | @Param("content") String content, 18 | @Param("date") Timestamp timestamp, 19 | @Param("uid") Integer uid, 20 | @Param("lable") String lable); 21 | 22 | public List
getArticleByUID(@Param("uid")Integer uid); 23 | 24 | public int deleteArticleByID(@Param("aid")Integer aid); 25 | 26 | public List
getArticlePageList(@Param("currentPage") int currentPage,@Param("pageSize") int pageSize); 27 | 28 | public List
searchArticleByKey(@Param("key")String key); 29 | 30 | public List
getArticleListByStatus(List statusList); 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/ljc/dao/CommentDao.java: -------------------------------------------------------------------------------- 1 | package com.ljc.dao; 2 | 3 | import java.sql.Timestamp; 4 | import java.util.List; 5 | 6 | import org.apache.ibatis.annotations.Param; 7 | 8 | import com.ljc.entity.Comment; 9 | import com.ljc.entity.Floor; 10 | 11 | public interface CommentDao { 12 | 13 | public int addComment(@Param("content")String content, 14 | @Param("aid")Integer aid, 15 | @Param("uid")Integer uid, 16 | @Param("date")Timestamp timestamp); 17 | 18 | public List findComment(@Param("aid")Integer aid, @Param("uid")Integer uid); 19 | 20 | public int getCommentCount(@Param("aid")Integer aid); 21 | 22 | public List findFloorComment(@Param("aid")Integer aid, @Param("cid")Integer cid); 23 | 24 | public int addFloorComment(@Param("aid")Integer aid, @Param("cid")Integer cid, 25 | @Param("uid")Integer uid, @Param("content")String content); 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/ljc/dao/UserDao.java: -------------------------------------------------------------------------------- 1 | package com.ljc.dao; 2 | 3 | import org.apache.ibatis.annotations.Param; 4 | 5 | import com.ljc.entity.User; 6 | 7 | public interface UserDao { 8 | 9 | public int addUser(@Param("username") String username, 10 | @Param("password") String password, @Param("headimg") String headimg); 11 | 12 | public User findUser(@Param("username") String username, 13 | @Param("password") String password); 14 | 15 | public User getUserByID(@Param("uid") Integer uid); 16 | 17 | public int updateHeadImg(@Param("headimg") String headImgName, 18 | @Param("uid") Integer uid); 19 | 20 | public int updateUserInfo(@Param("uid") Integer uid, 21 | @Param("password") String password); 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/ljc/entity/Article.java: -------------------------------------------------------------------------------- 1 | package com.ljc.entity; 2 | 3 | import java.io.Serializable; 4 | import java.util.Date; 5 | 6 | /** 7 | * @author LJC 帖子列表实体 8 | */ 9 | 10 | public class Article implements Serializable { 11 | 12 | private static final long serialVersionUID = 1L; 13 | 14 | private Integer aid; 15 | private String title; 16 | private String content; 17 | private Date date; 18 | private Integer uid; 19 | private String lable; // 帖子标签 20 | private Integer status; // 置顶:1、加精:2、加精且置顶:3 21 | private User author; 22 | 23 | public Integer getAid() { 24 | return aid; 25 | } 26 | 27 | public void setAid(Integer aid) { 28 | this.aid = aid; 29 | } 30 | 31 | public String getTitle() { 32 | return title; 33 | } 34 | 35 | public void setTitle(String title) { 36 | this.title = title; 37 | } 38 | 39 | public String getContent() { 40 | return content; 41 | } 42 | 43 | public void setContent(String content) { 44 | this.content = content; 45 | } 46 | 47 | public Date getDate() { 48 | return date; 49 | } 50 | 51 | public void setDate(Date date) { 52 | this.date = date; 53 | } 54 | 55 | public Integer getUid() { 56 | return uid; 57 | } 58 | 59 | public void setUid(Integer uid) { 60 | this.uid = uid; 61 | } 62 | 63 | public User getAuthor() { 64 | return author; 65 | } 66 | 67 | public void setAuthor(User author) { 68 | this.author = author; 69 | } 70 | 71 | public String getLable() { 72 | return lable; 73 | } 74 | 75 | public void setLable(String lable) { 76 | this.lable = lable; 77 | } 78 | 79 | public Integer getStatus() { 80 | return status; 81 | } 82 | 83 | public void setStatus(Integer status) { 84 | this.status = status; 85 | } 86 | 87 | } 88 | -------------------------------------------------------------------------------- /src/main/java/com/ljc/entity/Comment.java: -------------------------------------------------------------------------------- 1 | package com.ljc.entity; 2 | 3 | import java.io.Serializable; 4 | import java.util.Date; 5 | 6 | /** 7 | * @author LJC 评论内容实体 8 | */ 9 | public class Comment implements Serializable { 10 | 11 | private static final long serialVersionUID = 1L; 12 | 13 | private Integer cid; 14 | private String content; 15 | private Integer aid; 16 | private Integer uid; 17 | private Date date; 18 | private User replyer; 19 | 20 | public Integer getCid() { 21 | return cid; 22 | } 23 | 24 | public void setCid(Integer cid) { 25 | this.cid = cid; 26 | } 27 | 28 | public String getContent() { 29 | return content; 30 | } 31 | 32 | public void setContent(String content) { 33 | this.content = content; 34 | } 35 | 36 | public Integer getAid() { 37 | return aid; 38 | } 39 | 40 | public void setAid(Integer aid) { 41 | this.aid = aid; 42 | } 43 | 44 | public Integer getUid() { 45 | return uid; 46 | } 47 | 48 | public void setUid(Integer uid) { 49 | this.uid = uid; 50 | } 51 | 52 | public Date getDate() { 53 | return date; 54 | } 55 | 56 | public void setDate(Date date) { 57 | this.date = date; 58 | } 59 | 60 | public User getReplyer() { 61 | return replyer; 62 | } 63 | 64 | public void setReplyer(User replyer) { 65 | this.replyer = replyer; 66 | } 67 | 68 | } 69 | -------------------------------------------------------------------------------- /src/main/java/com/ljc/entity/Floor.java: -------------------------------------------------------------------------------- 1 | package com.ljc.entity; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * @author LJC 楼中楼评论 7 | */ 8 | public class Floor implements Serializable { 9 | 10 | private static final long serialVersionUID = 1L; 11 | 12 | private Integer fid; 13 | private Integer cid; 14 | private Integer uid; 15 | private String content; 16 | private User floorReplyer; 17 | 18 | public Integer getFid() { 19 | return fid; 20 | } 21 | 22 | public void setFid(Integer fid) { 23 | this.fid = fid; 24 | } 25 | 26 | public Integer getCid() { 27 | return cid; 28 | } 29 | 30 | public void setCid(Integer cid) { 31 | this.cid = cid; 32 | } 33 | 34 | public Integer getUid() { 35 | return uid; 36 | } 37 | 38 | public void setUid(Integer uid) { 39 | this.uid = uid; 40 | } 41 | 42 | public String getContent() { 43 | return content; 44 | } 45 | 46 | public void setContent(String content) { 47 | this.content = content; 48 | } 49 | 50 | public User getFloorReplyer() { 51 | return floorReplyer; 52 | } 53 | 54 | public void setFloorReplyer(User floorReplyer) { 55 | this.floorReplyer = floorReplyer; 56 | } 57 | 58 | } 59 | -------------------------------------------------------------------------------- /src/main/java/com/ljc/entity/PageBean.java: -------------------------------------------------------------------------------- 1 | package com.ljc.entity; 2 | 3 | import java.io.Serializable; 4 | import java.util.List; 5 | 6 | /** 7 | * @author LJC 8 | * 数据分页Bean 9 | */ 10 | public class PageBean implements Serializable { 11 | 12 | private static final long serialVersionUID = 1L; 13 | 14 | private int currentPage;// 当前页 15 | private int pageSize;// 每页大小 16 | private int count;// 数据总数 17 | private int totalPage;// 总页数 18 | private List list;// 数据list 19 | 20 | public PageBean(int currentPage, int pageSize, int count, int totalPage, 21 | List list) { 22 | this.currentPage = currentPage; 23 | this.pageSize = pageSize; 24 | this.count = count; 25 | this.totalPage = totalPage; 26 | this.list = list; 27 | } 28 | 29 | public int getCurrentPage() { 30 | return currentPage; 31 | } 32 | 33 | public void setCurrentPage(int currentPage) { 34 | this.currentPage = currentPage; 35 | } 36 | 37 | public int getPageSize() { 38 | return pageSize; 39 | } 40 | 41 | public void setPageSize(int pageSize) { 42 | this.pageSize = pageSize; 43 | } 44 | 45 | public int getCount() { 46 | return count; 47 | } 48 | 49 | public void setCount(int count) { 50 | this.count = count; 51 | } 52 | 53 | public int getTotalPage() { 54 | return totalPage; 55 | } 56 | 57 | public void setTotalPage(int totalPage) { 58 | this.totalPage = totalPage; 59 | } 60 | 61 | public List getList() { 62 | return list; 63 | } 64 | 65 | public void setList(List list) { 66 | this.list = list; 67 | } 68 | 69 | } 70 | -------------------------------------------------------------------------------- /src/main/java/com/ljc/entity/User.java: -------------------------------------------------------------------------------- 1 | package com.ljc.entity; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * @author LJC 7 | * 用户实体 8 | */ 9 | public class User implements Serializable { 10 | 11 | private static final long serialVersionUID = 1L; 12 | 13 | private Integer uid; 14 | private String username; 15 | private String password; 16 | private String headimg; // 用户头像 17 | 18 | public Integer getUid() { 19 | return uid; 20 | } 21 | 22 | public void setUid(Integer uid) { 23 | this.uid = uid; 24 | } 25 | 26 | public String getUsername() { 27 | return username; 28 | } 29 | 30 | public void setUsername(String username) { 31 | this.username = username; 32 | } 33 | 34 | public String getPassword() { 35 | return password; 36 | } 37 | 38 | public void setPassword(String password) { 39 | this.password = password; 40 | } 41 | 42 | public String getHeadimg() { 43 | return headimg; 44 | } 45 | 46 | public void setHeadimg(String headimg) { 47 | this.headimg = headimg; 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/com/ljc/service/ArticleService.java: -------------------------------------------------------------------------------- 1 | package com.ljc.service; 2 | 3 | import java.sql.Timestamp; 4 | import java.util.List; 5 | 6 | import com.ljc.entity.Article; 7 | import com.ljc.entity.PageBean; 8 | 9 | public interface ArticleService { 10 | 11 | /** 12 | * 获取帖子所有数据 13 | * @return 14 | */ 15 | public List
getArticleList(); 16 | 17 | /** 18 | * 根据id获取帖子数据 19 | * @param aid 帖子id 20 | * @return 21 | */ 22 | public Article getArticleByID(Integer aid); 23 | 24 | /** 25 | * 发表新帖 26 | * @param title 27 | * @param content 28 | * @param timestamp 29 | * @param uid 30 | * @param lable 31 | * @return 32 | */ 33 | public int addArticle(String title, String content,Timestamp timestamp,Integer uid, String lable); 34 | 35 | /** 36 | * 根据uid获得用户的帖子数据 37 | * @param uid 38 | * @return 39 | */ 40 | public List
getArticleByUID(Integer uid); 41 | 42 | /** 43 | * 根据id删除帖子数据 44 | * @param aid 45 | * @return 46 | */ 47 | public int deleteArticleByID(Integer aid); 48 | 49 | /** 50 | * 分页查询帖子数据 51 | * @param currentPage 52 | * @param pageSize 53 | * @return 54 | */ 55 | public PageBean getArticlePageList(int currentPage, int pageSize); 56 | 57 | /** 58 | * 关键字搜索 59 | * @param key 60 | * @return 61 | */ 62 | public List
searchArticleByKey(String key); 63 | 64 | /** 65 | * 通过staus关键字查询帖子 66 | * @param statusList 67 | * @return 68 | */ 69 | public List
getArticleListByStatus(List statusList); 70 | 71 | } 72 | -------------------------------------------------------------------------------- /src/main/java/com/ljc/service/CommentService.java: -------------------------------------------------------------------------------- 1 | package com.ljc.service; 2 | 3 | import java.sql.Timestamp; 4 | import java.util.List; 5 | 6 | import com.ljc.entity.Comment; 7 | import com.ljc.entity.Floor; 8 | 9 | 10 | public interface CommentService { 11 | 12 | /** 13 | * 发表评论 14 | * @param content 15 | * @param aid 16 | * @param uid 17 | * @param timestamp 18 | * @return 19 | */ 20 | public int addComment(String content, Integer aid, Integer uid ,Timestamp timestamp); 21 | 22 | /** 23 | * 通过id获得评论数据 24 | * @param aid 25 | * @param uid 26 | * @return 27 | */ 28 | public List findComment(Integer aid, Integer uid); 29 | 30 | /** 31 | * 通过aid获得该帖子回复数量 32 | * @param aid 33 | * @return 34 | */ 35 | public int getCommentCount(Integer aid); 36 | 37 | /** 38 | * 根据cid获取楼中楼评论数据 39 | * @param aid 40 | * @param cid 41 | * @return 42 | */ 43 | public List findFloorComment(Integer aid, Integer cid); 44 | 45 | /** 46 | * 添加楼中楼评论 47 | * @param aid 48 | * @param cid 49 | * @param uid 50 | * @param content 51 | * @return 52 | */ 53 | public int addFloorComment(Integer aid, Integer cid, Integer uid, 54 | String content); 55 | 56 | } 57 | -------------------------------------------------------------------------------- /src/main/java/com/ljc/service/UserService.java: -------------------------------------------------------------------------------- 1 | package com.ljc.service; 2 | 3 | import com.ljc.entity.User; 4 | 5 | public interface UserService { 6 | 7 | /** 8 | * 注册用户 9 | * @param username 10 | * @param password 11 | * @param headimg 12 | * @return 13 | */ 14 | public int addUser(String username, String password, String headimg); 15 | 16 | /** 17 | * 用户登录 18 | * @param username 19 | * @param password 20 | * @return 21 | */ 22 | public User findUser(String username, String password); 23 | 24 | /** 25 | * 根据id查询用户 26 | * @param uid 27 | * @return 28 | */ 29 | public User getUserByID(Integer uid); 30 | 31 | /** 32 | * 更新头像 33 | * @param headImgName 34 | * @param uid 35 | * @return 36 | */ 37 | public int updateHeadImg(String headImgName, Integer uid); 38 | 39 | /** 40 | * 根据uid更新对应用户信息 41 | * @param uid 42 | * @param password 43 | * @return 44 | */ 45 | public int updateUserInfo(Integer uid, String password); 46 | 47 | 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/com/ljc/service/impl/ArticleServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.ljc.service.impl; 2 | 3 | import java.sql.Timestamp; 4 | import java.util.List; 5 | 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.stereotype.Service; 8 | 9 | import com.ljc.dao.ArticleDao; 10 | import com.ljc.entity.Article; 11 | import com.ljc.entity.PageBean; 12 | import com.ljc.service.ArticleService; 13 | 14 | @Service("articleService") 15 | public class ArticleServiceImpl implements ArticleService { 16 | 17 | @Autowired 18 | private ArticleDao articleDao; 19 | 20 | @Override 21 | public List
getArticleList() { 22 | return articleDao.getArticleList(); 23 | } 24 | 25 | @Override 26 | public Article getArticleByID(Integer aid) { 27 | return articleDao.getArticleByID(aid); 28 | } 29 | 30 | @Override 31 | public int addArticle(String title, String content, Timestamp timestamp, 32 | Integer uid, String lable) { 33 | return articleDao.addArticle(title, content, timestamp, uid, lable); 34 | } 35 | 36 | @Override 37 | public List
getArticleByUID(Integer uid) { 38 | return articleDao.getArticleByUID(uid); 39 | } 40 | 41 | @Override 42 | public int deleteArticleByID(Integer aid) { 43 | return articleDao.deleteArticleByID(aid); 44 | } 45 | 46 | @Override 47 | public PageBean getArticlePageList(int currentPage, int pageSize) { 48 | int count = articleDao.getArticleList().size(); 49 | int totalPage = (int) Math.ceil(count * 1.0 / pageSize);// 总页数 50 | List
articleList = articleDao.getArticlePageList( 51 | (currentPage - 1) * pageSize, pageSize); 52 | PageBean pageBean = new PageBean(currentPage, pageSize, count, 53 | totalPage, articleList); 54 | return pageBean; 55 | } 56 | 57 | @Override 58 | public List
searchArticleByKey(String key) { 59 | return articleDao.searchArticleByKey(key); 60 | } 61 | 62 | @Override 63 | public List
getArticleListByStatus(List statusList) { 64 | return articleDao.getArticleListByStatus(statusList); 65 | } 66 | 67 | 68 | } 69 | -------------------------------------------------------------------------------- /src/main/java/com/ljc/service/impl/CommentServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.ljc.service.impl; 2 | 3 | import java.sql.Timestamp; 4 | import java.util.List; 5 | 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.stereotype.Service; 8 | 9 | import com.ljc.dao.CommentDao; 10 | import com.ljc.entity.Comment; 11 | import com.ljc.entity.Floor; 12 | import com.ljc.service.CommentService; 13 | 14 | @Service("commentService") 15 | public class CommentServiceImpl implements CommentService { 16 | 17 | @Autowired 18 | private CommentDao commentDao; 19 | 20 | @Override 21 | public int addComment(String content, Integer aid, Integer uid,Timestamp timestamp) { 22 | return commentDao.addComment(content, aid, uid, timestamp); 23 | } 24 | 25 | @Override 26 | public List findComment(Integer aid, Integer uid) { 27 | return commentDao.findComment(aid, uid); 28 | } 29 | 30 | @Override 31 | public int getCommentCount(Integer aid) { 32 | return commentDao.getCommentCount(aid); 33 | } 34 | 35 | @Override 36 | public List findFloorComment(Integer aid, Integer cid) { 37 | return commentDao.findFloorComment(aid, cid); 38 | } 39 | 40 | @Override 41 | public int addFloorComment(Integer aid, Integer cid, Integer uid, 42 | String content) { 43 | return commentDao.addFloorComment(aid,cid,uid,content); 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/com/ljc/service/impl/UserServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.ljc.service.impl; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.stereotype.Service; 5 | 6 | import com.ljc.dao.UserDao; 7 | import com.ljc.entity.User; 8 | import com.ljc.service.UserService; 9 | 10 | @Service("userService") 11 | public class UserServiceImpl implements UserService { 12 | 13 | @Autowired 14 | private UserDao userDao; 15 | 16 | @Override 17 | public int addUser(String username, String password, String headimg) { 18 | return userDao.addUser(username, password, headimg); 19 | } 20 | 21 | @Override 22 | public User findUser(String username, String password) { 23 | return userDao.findUser(username, password); 24 | } 25 | 26 | @Override 27 | public User getUserByID(Integer uid) { 28 | return userDao.getUserByID(uid); 29 | } 30 | 31 | @Override 32 | public int updateHeadImg(String headImgName, Integer uid) { 33 | return userDao.updateHeadImg(headImgName, uid); 34 | } 35 | 36 | @Override 37 | public int updateUserInfo(Integer uid, String password) { 38 | return userDao.updateUserInfo(uid, password); 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/com/ljc/util/LogUtils.java: -------------------------------------------------------------------------------- 1 | package com.ljc.util; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | 6 | /** 7 | * @author LJC 8 | * 日志工具类 9 | */ 10 | public class LogUtils { 11 | 12 | //标记是否输出日志 13 | private static boolean FLAG = true; 14 | 15 | static Logger logger = LoggerFactory.getLogger(LogUtils.class); 16 | 17 | /** 18 | * 输出info日志 19 | * @param msg 20 | */ 21 | public static void info(String msg){ 22 | if(FLAG){ 23 | logger.info(msg); 24 | } 25 | } 26 | /** 27 | * 输出info日志 28 | * @param format 29 | * @param arguments 30 | */ 31 | public static void info(String format, Object... arguments){ 32 | if(FLAG){ 33 | logger.info(format, arguments); 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/ljc/util/QiNiuUtils.java: -------------------------------------------------------------------------------- 1 | package com.ljc.util; 2 | 3 | import java.io.ByteArrayOutputStream; 4 | import java.io.IOException; 5 | import java.io.InputStream; 6 | 7 | import org.springframework.web.multipart.MultipartFile; 8 | 9 | import com.google.gson.Gson; 10 | import com.ljc.config.Config; 11 | import com.qiniu.common.QiniuException; 12 | import com.qiniu.common.Zone; 13 | import com.qiniu.http.Response; 14 | import com.qiniu.storage.Configuration; 15 | import com.qiniu.storage.UploadManager; 16 | import com.qiniu.storage.model.DefaultPutRet; 17 | import com.qiniu.util.Auth; 18 | 19 | /** 20 | * @author LJC 21 | * 七牛云操作工具类 22 | */ 23 | public class QiNiuUtils { 24 | 25 | public static DefaultPutRet upLoad(MultipartFile file, String bucket) { 26 | 27 | // 构造一个带指定Zone对象的配置类 (华东) 28 | Configuration cfg = new Configuration(Zone.zone0()); 29 | 30 | // 文件上传Manager 31 | UploadManager uploadManager = new UploadManager(cfg); 32 | 33 | // 得到上传文件的文件名,并赋值给key作为七牛存储的文件名 34 | String key = System.currentTimeMillis() + "." + 35 | file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1); 36 | 37 | // 把文件转化为字节数组 38 | byte[] uploadBytes = null; 39 | try(InputStream is = file.getInputStream(); 40 | ByteArrayOutputStream bos = new ByteArrayOutputStream()) { 41 | 42 | byte[] b = new byte[1024]; 43 | int len = -1; 44 | while ((len = is.read(b)) != -1) { 45 | bos.write(b, 0, len); 46 | } 47 | uploadBytes = bos.toByteArray(); 48 | } catch (IOException e) { 49 | e.printStackTrace(); 50 | } 51 | 52 | // 七牛云授权 53 | Auth auth = Auth.create(Config.QINIU_ACCESS_KEY,Config.QINIU_SECRET_KEY); 54 | 55 | String upToken = auth.uploadToken(bucket); 56 | // 默认上传接口回复对象 57 | DefaultPutRet putRet = null; 58 | // 进行上传操作 59 | Response response = null; 60 | try { 61 | //上传文件 62 | response = uploadManager.put(uploadBytes, key, upToken); 63 | //返回json 64 | putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class); 65 | } catch (QiniuException e) { 66 | e.printStackTrace(); 67 | } 68 | 69 | return putRet; 70 | } 71 | 72 | } 73 | -------------------------------------------------------------------------------- /src/main/java/com/ljc/util/ResponseUtils.java: -------------------------------------------------------------------------------- 1 | package com.ljc.util; 2 | 3 | import java.io.IOException; 4 | import java.io.PrintWriter; 5 | 6 | import javax.servlet.http.HttpServletResponse; 7 | 8 | /** 9 | * @author LJC 10 | * response输出工具类 11 | */ 12 | public class ResponseUtils { 13 | 14 | /** 15 | * 输出Object对象 16 | * @param response 17 | * @param o 18 | */ 19 | public static void write(HttpServletResponse response, Object o) { 20 | response.setContentType("text/html;charset=utf-8"); 21 | PrintWriter out = null; 22 | try { 23 | out = response.getWriter(); 24 | } catch (IOException e) { 25 | e.printStackTrace(); 26 | } finally { 27 | if (out != null) { 28 | out.println(o.toString()); 29 | out.flush(); 30 | out.close(); 31 | } 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /src/main/java/com/ljc/util/StringUtils.java: -------------------------------------------------------------------------------- 1 | package com.ljc.util; 2 | 3 | import java.math.BigInteger; 4 | import java.security.MessageDigest; 5 | import java.util.regex.Matcher; 6 | import java.util.regex.Pattern; 7 | 8 | /** 9 | * @author LJC 10 | * 字符串工具类 11 | */ 12 | public class StringUtils { 13 | 14 | /** 15 | * 空字符串 16 | */ 17 | public static final String EMPTY_STRING = ""; 18 | 19 | /** 20 | * 判断字符串是否为空 21 | * @param str 22 | * @return 23 | */ 24 | public static boolean isEmpty(String str) { 25 | return str == null || str.length() == 0; 26 | } 27 | 28 | /** 29 | * 判断是否为空白字符串 30 | * @param str 31 | * @return 32 | */ 33 | public static boolean isBlank(String str) { 34 | int strLen; 35 | if (str == null || (strLen = str.length()) == 0) { 36 | return true; 37 | } 38 | for (int i = 0; i < strLen; i++) { 39 | if ((Character.isWhitespace(str.charAt(i)) == false)) { 40 | return false; 41 | } 42 | } 43 | return true; 44 | } 45 | 46 | /** 47 | * 去除字符串中的html标签 48 | * @param html 49 | * @return 50 | */ 51 | public static String replaceHtml(String html) { 52 | if (StringUtils.isBlank(html)) { 53 | return StringUtils.EMPTY_STRING; 54 | } 55 | String regEx = "<.+?>"; 56 | Pattern p = Pattern.compile(regEx); 57 | Matcher m = p.matcher(html); 58 | String s = m.replaceAll(StringUtils.EMPTY_STRING); 59 | return s; 60 | } 61 | 62 | /** 63 | * 字符串MD5加密 64 | * @param s 65 | * @return 66 | */ 67 | public final static String MD5(String str) { 68 | try { 69 | if (!StringUtils.isEmpty(str)) { 70 | MessageDigest messageDigest = MessageDigest.getInstance("MD5"); 71 | byte[] digest = messageDigest.digest(str.getBytes("utf-8")); 72 | return new BigInteger(digest).toString(16); 73 | } else { 74 | return ""; 75 | } 76 | } catch (Exception e) { 77 | throw new RuntimeException("字符串加密失败!" + e); 78 | } 79 | } 80 | 81 | // public static void main(String[] args) { 82 | // System.out.println(MD5("123")); 83 | // } 84 | 85 | } -------------------------------------------------------------------------------- /src/main/resources/applicationContext.xml: -------------------------------------------------------------------------------- 1 | 2 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /src/main/resources/jdbc.properties: -------------------------------------------------------------------------------- 1 | driverClass=com.mysql.jdbc.Driver 2 | url=jdbc:mysql://123.206.218.51:3306/mybbs?useUnicode=true&characterEncoding=UTF-8 3 | username=root 4 | password=123456 -------------------------------------------------------------------------------- /src/main/resources/log4j.properties: -------------------------------------------------------------------------------- 1 | log4j.rootLogger=INFO, Console 2 | 3 | #Console 4 | log4j.appender.Console=org.apache.log4j.ConsoleAppender 5 | log4j.appender.Console.layout=org.apache.log4j.PatternLayout 6 | log4j.appender.Console.layout.ConversionPattern=[%d{MM-dd HH\:mm\:ss}] [%c] %m%n 7 | 8 | log4j.logger.java.sql.ResultSet=INFO 9 | log4j.logger.org.apache=INFO 10 | log4j.logger.java.sql.Connection=DEBUG 11 | log4j.logger.java.sql.Statement=DEBUG 12 | log4j.logger.java.sql.PreparedStatement=DEBUG -------------------------------------------------------------------------------- /src/main/resources/mappers/Article.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 20 | 21 | 28 | 29 | 37 | 38 | 44 | 45 | 46 | insert into article(title,content,date,uid,lable) values(#{title},#{content},#{date},#{uid},#{lable}) 47 | 48 | 49 | 52 | 53 | 54 | delete from article where aid=#{aid} 55 | 56 | 57 | 60 | 61 | -------------------------------------------------------------------------------- /src/main/resources/mappers/Comment.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | insert into comment(content,aid,uid,date) values(#{content},#{aid},#{uid},#{date}) 26 | 27 | 28 | 40 | 41 | 44 | 45 | 57 | 58 | 59 | insert into floor(aid,cid,uid,content) values(#{aid},#{cid},#{uid},#{content}) 60 | 61 | 62 | -------------------------------------------------------------------------------- /src/main/resources/mappers/User.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | insert into user(username,password,headimg) values(#{username},#{password},#{headimg}) 16 | 17 | 18 | 24 | 25 | 28 | 29 | 30 | update user set headimg=#{headimg} where uid=#{uid} 31 | 32 | 33 | 34 | update user set password=#{password} where uid=#{uid} 35 | 36 | 37 | -------------------------------------------------------------------------------- /src/main/resources/mybatis-config.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/main/resources/spring-mvc.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 27 | 28 | 29 | 30 | 31 | 32 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/jsp/article/articleContent.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 | 3 | 4 | 5 | 6 | 7 | 8 | 帖子内容 9 | <%@include file="../common/import.jsp"%> 10 | 11 | 12 |
13 | <%@include file="../common/head.jsp"%> 14 | 17 |
18 |
19 |
20 | 27 |
28 | 29 |
30 |
31 |
32 | 发布时间: 33 |   35 |
36 |
37 |
38 | 39 |
共${fn:length(commentList) }条评论
40 | 41 | <%-- 评论列表 --%> 42 | 43 |
44 |
45 |
46 |
47 |
48 | 49 | headimg" class="img-thumbnail"> 50 | 51 |

52 | 楼主: 53 | ${c.replyer.username } 54 |
55 |
56 |
57 | 58 |


59 | <%-- 楼中楼评论数据 --%> 60 |
61 | 62 | 63 | 64 |
65 | 66 | "> 67 | 68 |
69 | 70 | 75 |
76 |
77 |
78 | 79 |
80 |
81 |
82 |
83 |
84 | <%-- ${fn:length(commentList)-st.index }楼 --%> 85 | ${st.index+1 }楼 86 | 88 |  回复  89 |
90 |
91 |
92 | 93 | 94 | <%-- 楼中楼评论框 --%> 95 |
96 | 100 |
101 |
102 | 103 | <%-- 评论框 --%> 104 | 105 | 106 |
107 |
108 |
109 | 111 |
112 |
113 | 114 |
115 |

登陆后才可进行回帖!

116 |
117 |
118 |
119 | <%@include file="../common/foot.jsp"%> 120 | <%@include file="../common/editor.jsp"%> 121 |
122 | 180 | 181 | 182 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/jsp/article/articleList.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 | 3 | 4 | 5 | 6 | 7 | 8 | 主页 9 | <%@include file="../common/import.jsp"%> 10 | 11 | 12 |
13 | <%@include file="../common/head.jsp"%> 14 |
15 |
16 | <%-- 置顶的帖子 --%> 17 | 18 | 26 | 27 | <%-- 未置顶的帖子 --%> 28 | 29 | 30 | 37 | 38 | 39 | <%-- 分页 --%> 40 |
41 | 42 | 上一页 43 | 44 | 第${articlePageBean.currentPage }页/共${articlePageBean.totalPage }页 45 | 46 | 下一页 47 | 48 |
49 | <%-- 发帖框 --%> 50 | 51 | 52 |
53 |
54 |

55 | 57 | 58 |
59 |
60 | 61 |
62 |

登陆后才可进行发帖!

63 |
64 |
65 |
66 | <%@include file="../common/foot.jsp"%> 67 |
68 |
69 | <%-- 用户头像昵称 --%> 70 |
71 |
72 | 73 | 74 | " class="img-circle" data-toggle="modal" data-target="#myModal"> 75 |

用户名: 76 | 未登录 77 |
78 | 79 | 80 | ${user.username }" class="img-circle" style="width: 224px;height: 224px;"> 81 | 82 |

用户名: 83 | ${user.username } 84 |
">安全退出 85 |
86 |
87 |
88 |
89 | 90 | <%@include file="../common/login.jsp" %> 91 |
92 |
93 |
94 | 96 | 147 | 148 | <%@include file="../common/editor.jsp"%> 149 | 150 | 151 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/jsp/common/articleData.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 | 3 | 4 | 5 |
6 | 7 | ${t.author.username } 8 |
9 |
10 | 11 | 12 | #${t.lable }# 13 | 14 |

15 | 16 |

17 |
-------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/jsp/common/editor.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 | "> 3 | 4 | 5 | 6 | 40 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/jsp/common/foot.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 |
3 |
Copyright © 个人论坛 by Ljc
4 |
5 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/jsp/common/head.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 | 3 | 安徽大学 4 | 5 | 13 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/jsp/common/import.jsp: -------------------------------------------------------------------------------- 1 | <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 2 | <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%> 3 | <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> 4 | "> 6 | "> 8 | 10 | 12 | 14 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/jsp/common/login.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 | 3 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/jsp/search.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 | 3 | 4 | 5 | 6 | 7 | 8 | 搜索结果 9 | <%@include file="common/import.jsp"%> 10 | 11 | 12 |
13 | <%@include file="common/head.jsp"%>
14 |

查询关键字:"${key }",共查到${fn:length(resultList) }篇帖子!

15 | 16 | 17 | 18 | 27 | 28 | 29 |
19 | 20 | 21 | 22 | 23 |
24 | / 25 |
26 |
30 | <%@include file="common/foot.jsp"%> 31 |
32 | 33 | 34 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/jsp/user/userInfo.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 | 3 | 4 | 5 | 6 | 7 | 8 | TA的信息 9 | <%@include file="../common/import.jsp"%> 10 | 11 | 12 |
13 | 14 | 安徽大学 15 |
16 |
17 |
18 |
19 | headimg" class="img-thumbnail"> 20 |
21 |
22 |
23 |

ID:${uInfo.uid }
昵称:${uInfo.username } 24 |

25 |
26 | <%@include file="../common/foot.jsp"%> 27 |
28 | 29 | 30 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/jsp/user/userManager.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 | 3 | 4 | 5 | 6 | 7 | 8 | 个人信息 9 | <%@include file="../common/import.jsp"%> 10 | 11 | 12 |
13 | 14 | 安徽大学 15 |
16 | 17 | 18 |
19 |
20 |
21 | headimg" class="img-thumbnail"> 22 |

ID:${u.uid }

23 |
24 |
25 |
26 |

27 | 昵称:${u.username }

28 | 29 | 30 |

31 |
32 |
34 |
35 | 36 |
37 |
38 |
39 |
40 | 41 |
42 | 43 | 44 |

未发表过任何帖子!


45 |
46 | 47 |

发表过的帖子

48 | 49 | 50 | 51 | 61 | 62 | 63 |
52 | 53 | 54 | 55 | 56 |
57 | 58 | 59 |
60 |
64 |
65 |
66 |
67 |
68 | 69 |
70 |

请登录后在查询!




71 |
72 |
73 | 74 |
75 |

仅能修改个人信息!




76 |
77 |
78 |
79 |
80 | <%@include file="../common/foot.jsp"%> 81 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/web.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | MyForum 10 | 11 | index.jsp 12 | 13 | 14 | * 15 | /index.jsp 16 | 17 | 18 | 19 | 20 | contextConfigLocation 21 | classpath:applicationContext.xml 22 | 23 | 24 | 25 | encodingFilter 26 | org.springframework.web.filter.CharacterEncodingFilter 27 | true 28 | 29 | encoding 30 | UTF-8 31 | 32 | 33 | 34 | encodingFilter 35 | /* 36 | 37 | 38 | 39 | 40 | org.springframework.web.context.ContextLoaderListener 41 | 42 | 43 | 44 | 45 | springMVC 46 | org.springframework.web.servlet.DispatcherServlet 47 | 48 | contextConfigLocation 49 | classpath:spring-mvc.xml 50 | 51 | 1 52 | true 53 | 54 | 55 | 56 | springMVC 57 | / 58 | 59 | 60 | -------------------------------------------------------------------------------- /src/main/webapp/index.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 | -------------------------------------------------------------------------------- /src/main/webapp/resources/bootstrap/css/bootstrap-theme.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.0 (http://getbootstrap.com) 3 | * Copyright 2011-2014 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | 7 | .btn-default, 8 | .btn-primary, 9 | .btn-success, 10 | .btn-info, 11 | .btn-warning, 12 | .btn-danger { 13 | text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); 14 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); 15 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); 16 | } 17 | .btn-default:active, 18 | .btn-primary:active, 19 | .btn-success:active, 20 | .btn-info:active, 21 | .btn-warning:active, 22 | .btn-danger:active, 23 | .btn-default.active, 24 | .btn-primary.active, 25 | .btn-success.active, 26 | .btn-info.active, 27 | .btn-warning.active, 28 | .btn-danger.active { 29 | -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); 30 | box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); 31 | } 32 | .btn-default .badge, 33 | .btn-primary .badge, 34 | .btn-success .badge, 35 | .btn-info .badge, 36 | .btn-warning .badge, 37 | .btn-danger .badge { 38 | text-shadow: none; 39 | } 40 | .btn:active, 41 | .btn.active { 42 | background-image: none; 43 | } 44 | .btn-default { 45 | text-shadow: 0 1px 0 #fff; 46 | background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); 47 | background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); 48 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); 49 | background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); 50 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); 51 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 52 | background-repeat: repeat-x; 53 | border-color: #dbdbdb; 54 | border-color: #ccc; 55 | } 56 | .btn-default:hover, 57 | .btn-default:focus { 58 | background-color: #e0e0e0; 59 | background-position: 0 -15px; 60 | } 61 | .btn-default:active, 62 | .btn-default.active { 63 | background-color: #e0e0e0; 64 | border-color: #dbdbdb; 65 | } 66 | .btn-default:disabled, 67 | .btn-default[disabled] { 68 | background-color: #e0e0e0; 69 | background-image: none; 70 | } 71 | .btn-primary { 72 | background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%); 73 | background-image: -o-linear-gradient(top, #428bca 0%, #2d6ca2 100%); 74 | background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#2d6ca2)); 75 | background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%); 76 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0); 77 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 78 | background-repeat: repeat-x; 79 | border-color: #2b669a; 80 | } 81 | .btn-primary:hover, 82 | .btn-primary:focus { 83 | background-color: #2d6ca2; 84 | background-position: 0 -15px; 85 | } 86 | .btn-primary:active, 87 | .btn-primary.active { 88 | background-color: #2d6ca2; 89 | border-color: #2b669a; 90 | } 91 | .btn-primary:disabled, 92 | .btn-primary[disabled] { 93 | background-color: #2d6ca2; 94 | background-image: none; 95 | } 96 | .btn-success { 97 | background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); 98 | background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); 99 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); 100 | background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); 101 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); 102 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 103 | background-repeat: repeat-x; 104 | border-color: #3e8f3e; 105 | } 106 | .btn-success:hover, 107 | .btn-success:focus { 108 | background-color: #419641; 109 | background-position: 0 -15px; 110 | } 111 | .btn-success:active, 112 | .btn-success.active { 113 | background-color: #419641; 114 | border-color: #3e8f3e; 115 | } 116 | .btn-success:disabled, 117 | .btn-success[disabled] { 118 | background-color: #419641; 119 | background-image: none; 120 | } 121 | .btn-info { 122 | background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); 123 | background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); 124 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); 125 | background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); 126 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); 127 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 128 | background-repeat: repeat-x; 129 | border-color: #28a4c9; 130 | } 131 | .btn-info:hover, 132 | .btn-info:focus { 133 | background-color: #2aabd2; 134 | background-position: 0 -15px; 135 | } 136 | .btn-info:active, 137 | .btn-info.active { 138 | background-color: #2aabd2; 139 | border-color: #28a4c9; 140 | } 141 | .btn-info:disabled, 142 | .btn-info[disabled] { 143 | background-color: #2aabd2; 144 | background-image: none; 145 | } 146 | .btn-warning { 147 | background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); 148 | background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); 149 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); 150 | background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); 151 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); 152 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 153 | background-repeat: repeat-x; 154 | border-color: #e38d13; 155 | } 156 | .btn-warning:hover, 157 | .btn-warning:focus { 158 | background-color: #eb9316; 159 | background-position: 0 -15px; 160 | } 161 | .btn-warning:active, 162 | .btn-warning.active { 163 | background-color: #eb9316; 164 | border-color: #e38d13; 165 | } 166 | .btn-warning:disabled, 167 | .btn-warning[disabled] { 168 | background-color: #eb9316; 169 | background-image: none; 170 | } 171 | .btn-danger { 172 | background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); 173 | background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); 174 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); 175 | background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); 176 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); 177 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 178 | background-repeat: repeat-x; 179 | border-color: #b92c28; 180 | } 181 | .btn-danger:hover, 182 | .btn-danger:focus { 183 | background-color: #c12e2a; 184 | background-position: 0 -15px; 185 | } 186 | .btn-danger:active, 187 | .btn-danger.active { 188 | background-color: #c12e2a; 189 | border-color: #b92c28; 190 | } 191 | .btn-danger:disabled, 192 | .btn-danger[disabled] { 193 | background-color: #c12e2a; 194 | background-image: none; 195 | } 196 | .thumbnail, 197 | .img-thumbnail { 198 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 199 | box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 200 | } 201 | .dropdown-menu > li > a:hover, 202 | .dropdown-menu > li > a:focus { 203 | background-color: #e8e8e8; 204 | background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 205 | background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 206 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); 207 | background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); 208 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); 209 | background-repeat: repeat-x; 210 | } 211 | .dropdown-menu > .active > a, 212 | .dropdown-menu > .active > a:hover, 213 | .dropdown-menu > .active > a:focus { 214 | background-color: #357ebd; 215 | background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); 216 | background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%); 217 | background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd)); 218 | background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); 219 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); 220 | background-repeat: repeat-x; 221 | } 222 | .navbar-default { 223 | background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); 224 | background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%); 225 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8)); 226 | background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); 227 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); 228 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 229 | background-repeat: repeat-x; 230 | border-radius: 4px; 231 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); 232 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); 233 | } 234 | .navbar-default .navbar-nav > .open > a, 235 | .navbar-default .navbar-nav > .active > a { 236 | background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); 237 | background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); 238 | background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2)); 239 | background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%); 240 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); 241 | background-repeat: repeat-x; 242 | -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); 243 | box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); 244 | } 245 | .navbar-brand, 246 | .navbar-nav > li > a { 247 | text-shadow: 0 1px 0 rgba(255, 255, 255, .25); 248 | } 249 | .navbar-inverse { 250 | background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); 251 | background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); 252 | background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); 253 | background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); 254 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); 255 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 256 | background-repeat: repeat-x; 257 | } 258 | .navbar-inverse .navbar-nav > .open > a, 259 | .navbar-inverse .navbar-nav > .active > a { 260 | background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%); 261 | background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%); 262 | background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f)); 263 | background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); 264 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); 265 | background-repeat: repeat-x; 266 | -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); 267 | box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); 268 | } 269 | .navbar-inverse .navbar-brand, 270 | .navbar-inverse .navbar-nav > li > a { 271 | text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); 272 | } 273 | .navbar-static-top, 274 | .navbar-fixed-top, 275 | .navbar-fixed-bottom { 276 | border-radius: 0; 277 | } 278 | .alert { 279 | text-shadow: 0 1px 0 rgba(255, 255, 255, .2); 280 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); 281 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); 282 | } 283 | .alert-success { 284 | background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); 285 | background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); 286 | background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); 287 | background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); 288 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); 289 | background-repeat: repeat-x; 290 | border-color: #b2dba1; 291 | } 292 | .alert-info { 293 | background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); 294 | background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); 295 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); 296 | background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); 297 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); 298 | background-repeat: repeat-x; 299 | border-color: #9acfea; 300 | } 301 | .alert-warning { 302 | background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); 303 | background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); 304 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); 305 | background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); 306 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); 307 | background-repeat: repeat-x; 308 | border-color: #f5e79e; 309 | } 310 | .alert-danger { 311 | background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); 312 | background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); 313 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); 314 | background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); 315 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); 316 | background-repeat: repeat-x; 317 | border-color: #dca7a7; 318 | } 319 | .progress { 320 | background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); 321 | background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); 322 | background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); 323 | background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); 324 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); 325 | background-repeat: repeat-x; 326 | } 327 | .progress-bar { 328 | background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%); 329 | background-image: -o-linear-gradient(top, #428bca 0%, #3071a9 100%); 330 | background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3071a9)); 331 | background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); 332 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); 333 | background-repeat: repeat-x; 334 | } 335 | .progress-bar-success { 336 | background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); 337 | background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); 338 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); 339 | background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); 340 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); 341 | background-repeat: repeat-x; 342 | } 343 | .progress-bar-info { 344 | background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); 345 | background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); 346 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); 347 | background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); 348 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); 349 | background-repeat: repeat-x; 350 | } 351 | .progress-bar-warning { 352 | background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); 353 | background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); 354 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); 355 | background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); 356 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); 357 | background-repeat: repeat-x; 358 | } 359 | .progress-bar-danger { 360 | background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); 361 | background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); 362 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); 363 | background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); 364 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); 365 | background-repeat: repeat-x; 366 | } 367 | .progress-bar-striped { 368 | background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); 369 | background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); 370 | background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); 371 | } 372 | .list-group { 373 | border-radius: 4px; 374 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 375 | box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 376 | } 377 | .list-group-item.active, 378 | .list-group-item.active:hover, 379 | .list-group-item.active:focus { 380 | text-shadow: 0 -1px 0 #3071a9; 381 | background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%); 382 | background-image: -o-linear-gradient(top, #428bca 0%, #3278b3 100%); 383 | background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3278b3)); 384 | background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%); 385 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0); 386 | background-repeat: repeat-x; 387 | border-color: #3278b3; 388 | } 389 | .list-group-item.active .badge, 390 | .list-group-item.active:hover .badge, 391 | .list-group-item.active:focus .badge { 392 | text-shadow: none; 393 | } 394 | .panel { 395 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); 396 | box-shadow: 0 1px 2px rgba(0, 0, 0, .05); 397 | } 398 | .panel-default > .panel-heading { 399 | background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 400 | background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 401 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); 402 | background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); 403 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); 404 | background-repeat: repeat-x; 405 | } 406 | .panel-primary > .panel-heading { 407 | background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); 408 | background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%); 409 | background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd)); 410 | background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); 411 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); 412 | background-repeat: repeat-x; 413 | } 414 | .panel-success > .panel-heading { 415 | background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); 416 | background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); 417 | background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); 418 | background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); 419 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); 420 | background-repeat: repeat-x; 421 | } 422 | .panel-info > .panel-heading { 423 | background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); 424 | background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); 425 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); 426 | background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); 427 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); 428 | background-repeat: repeat-x; 429 | } 430 | .panel-warning > .panel-heading { 431 | background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); 432 | background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); 433 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); 434 | background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); 435 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); 436 | background-repeat: repeat-x; 437 | } 438 | .panel-danger > .panel-heading { 439 | background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); 440 | background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); 441 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); 442 | background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); 443 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); 444 | background-repeat: repeat-x; 445 | } 446 | .well { 447 | background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); 448 | background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); 449 | background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); 450 | background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); 451 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); 452 | background-repeat: repeat-x; 453 | border-color: #dcdcdc; 454 | -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); 455 | box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); 456 | } 457 | /*# sourceMappingURL=bootstrap-theme.css.map */ 458 | -------------------------------------------------------------------------------- /src/main/webapp/resources/bootstrap/css/bootstrap-theme.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.0 (http://getbootstrap.com) 3 | * Copyright 2011-2014 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-default .badge,.btn-primary .badge,.btn-success .badge,.btn-info .badge,.btn-warning .badge,.btn-danger .badge{text-shadow:none}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default:disabled,.btn-default[disabled]{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:-o-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#2d6ca2));background-image:linear-gradient(to bottom,#428bca 0,#2d6ca2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#2b669a}.btn-primary:hover,.btn-primary:focus{background-color:#2d6ca2;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2d6ca2;border-color:#2b669a}.btn-primary:disabled,.btn-primary[disabled]{background-color:#2d6ca2;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-success:disabled,.btn-success[disabled]{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.btn-info:disabled,.btn-info[disabled]{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-warning:disabled,.btn-warning[disabled]{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-danger:disabled,.btn-danger[disabled]{background-color:#c12e2a;background-image:none}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-o-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#357ebd));background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:-o-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#3071a9));background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:-o-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#3278b3));background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);background-repeat:repeat-x;border-color:#3278b3}.list-group-item.active .badge,.list-group-item.active:hover .badge,.list-group-item.active:focus .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-o-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#357ebd));background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} -------------------------------------------------------------------------------- /src/main/webapp/resources/bootstrap/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Lutils/MyForum/d6bde66b9cf32640e5cb124db12dea672bb9c17f/src/main/webapp/resources/bootstrap/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /src/main/webapp/resources/bootstrap/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Lutils/MyForum/d6bde66b9cf32640e5cb124db12dea672bb9c17f/src/main/webapp/resources/bootstrap/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /src/main/webapp/resources/bootstrap/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Lutils/MyForum/d6bde66b9cf32640e5cb124db12dea672bb9c17f/src/main/webapp/resources/bootstrap/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /src/main/webapp/resources/bootstrap/js/bootstrap.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.0 (http://getbootstrap.com) 3 | * Copyright 2011-2014 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.0",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.0",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus","focus"==b.type)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.0",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c="prev"==a?-1:1,d=this.getItemIndex(b),e=(d+c)%this.$items.length;return this.$items.eq(e)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i="next"==b?"first":"last",j=this;if(!f.length){if(!this.options.wrap)return;f=this.$element.find(".item")[i]()}if(f.hasClass("active"))return this.sliding=!1;var k=f[0],l=a.Event("slide.bs.carousel",{relatedTarget:k,direction:h});if(this.$element.trigger(l),!l.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var m=a(this.$indicators.children()[this.getItemIndex(f)]);m&&m.addClass("active")}var n=a.Event("slid.bs.carousel",{relatedTarget:k,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),j.sliding=!1,setTimeout(function(){j.$element.trigger(n)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(n)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&"show"==b&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a(this.options.trigger).filter('[href="#'+b.id+'"], [data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.0",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0,trigger:'[data-toggle="collapse"]'},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.find("> .panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":a.extend({},e.data(),{trigger:this});c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=c(d),f={relatedTarget:this};e.hasClass("open")&&(e.trigger(b=a.Event("hide.bs.dropdown",f)),b.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f)))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.0",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('