├── .project ├── README.md ├── app.js ├── avatar ├── mr.png └── user │ ├── 2017082910524615913treey.jpg │ ├── 2017090616414913938treey.jpg │ └── 2017090616452811945treey.jpg ├── model ├── db.js ├── file.js ├── fun.js └── md5.js ├── package-lock.json ├── package.json ├── public ├── css │ ├── 404.css │ ├── core │ │ ├── bootstrap-theme.css │ │ ├── bootstrap-theme.css.map │ │ ├── bootstrap-theme.min.css │ │ ├── bootstrap-theme.min.css.map │ │ ├── bootstrap.css │ │ ├── bootstrap.css.map │ │ ├── bootstrap.min.css │ │ ├── bootstrap.min.css.map │ │ ├── jumbotron.css │ │ └── jumbotron.txt │ ├── index.css │ ├── login.css │ ├── menberlist.css │ ├── personal.css │ ├── post.css │ ├── register.css │ └── user.css ├── fonts │ ├── glyphicons-halflings-regular.eot │ ├── glyphicons-halflings-regular.svg │ ├── glyphicons-halflings-regular.ttf │ ├── glyphicons-halflings-regular.woff │ └── glyphicons-halflings-regular.woff2 ├── img │ ├── favicon │ │ └── favicon.ico │ └── super │ │ └── super.jpg └── js │ ├── bootstrap.js │ ├── jquery.js │ ├── lib │ ├── cropper │ │ ├── cropper.css │ │ └── cropper.js │ └── toast │ │ ├── animate.css │ │ ├── toast.css │ │ └── toast.js │ └── views │ ├── index.js │ ├── memberlist.js │ ├── personal.js │ ├── post.js │ └── user.js ├── router └── router.js ├── settings.js └── views ├── 404.ejs ├── index.ejs ├── login.ejs ├── memberlist.ejs ├── personal.ejs ├── post.ejs ├── register.ejs └── user.ejs /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | talk 4 | 5 | 6 | 7 | 8 | 9 | com.aptana.ide.core.unifiedBuilder 10 | 11 | 12 | 13 | 14 | 15 | com.aptana.projects.webnature 16 | 17 | 18 | 19 | 1501061389881 20 | 21 | 26 22 | 23 | org.eclipse.ui.ide.multiFilter 24 | 1.0-name-matches-false-false-node_modules 25 | 26 | 27 | 28 | 1502069247880 29 | 30 | 26 31 | 32 | org.eclipse.ui.ide.multiFilter 33 | 1.0-name-matches-false-false-node_modules 34 | 35 | 36 | 37 | 1504685442414 38 | 39 | 26 40 | 41 | org.eclipse.ui.ide.multiFilter 42 | 1.0-name-matches-false-false-node_modules 43 | 44 | 45 | 46 | 1505175464872 47 | 48 | 26 49 | 50 | org.eclipse.ui.ide.multiFilter 51 | 1.0-name-matches-false-false-node_modules 52 | 53 | 54 | 55 | 1510124368489 56 | 57 | 26 58 | 59 | org.eclipse.ui.ide.multiFilter 60 | 1.0-name-matches-false-false-node_modules 61 | 62 | 63 | 64 | 1510133006232 65 | 66 | 26 67 | 68 | org.eclipse.ui.ide.multiFilter 69 | 1.0-name-matches-false-false-node_modules 70 | 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Tongue(百舌) 2 | 基于Node.js技术开发的一个介于微博和论坛的小项目 3 | 4 | 5 | ## 运行方式 6 | ``` 7 | # open project 8 | cd talk 9 | 10 | # install dependencies 11 | npm install 12 | 13 | 14 | # run 15 | node app.js 16 | 17 | # listening at localhost:8085 18 | 19 | ``` 20 | 21 | 22 | ## 开发计划 23 | 1. 登录注册(已成完) 24 | 2. 个人基本信息(已成完) 25 | 3. 首页显示帖子(已成完) 26 | 4. 发表帖子(已成完) 27 | 5. 分页(已成完) 28 | 6. 用户个人主页(已成完) 29 | 7. 帖子评论(已成完) 30 | 8. 成员列表(已成完) 31 | 10. 细节完善加测试 32 | 9. 待续 33 | 34 | 以上内容只是初步想法,以后根据实际情况修改。 35 | 36 | 37 | ## 相关技术 38 | #### 后端 39 | * `node.js` 40 | * `express ` Node.js 框架 41 | * `ejs` 前端模板 42 | * `express-session` 43 | * `formidable`前端表单数据提交 44 | * `mongodb` 芒果数据库 45 | * `silly-datetime` 时间戳插件 46 | 47 | #### 前端 48 | * `jquery` 49 | * `bootstrap` 50 | * `toast.js` 消息提示框插 51 | * `cropper.js` 图片裁剪插件 52 | 53 | 54 | #### 数据库 55 | * `Mongodb` 56 | 57 | 58 | #### 开发环境 59 | * `Node` 60 | 61 | 62 | #### 数据库表 63 | * `users` 用户表 64 | * `posts` 帖子表 65 | 66 | 67 | ## 功能模块说明 68 | 1. 登录注册 (login.ejs,register.ejs) 69 | >登录注册 比较简单,就是插入数据和查找数据 。在Model文件夹下面db.js中已经好的底层的方法,直接调用就好。这要注意的是在登录后 70 | 生成session。 71 | 72 | 2. 个人信息(personal.ejs) 73 | >个人信息的修改页面比较复杂,前台页面主要是头像的上传和裁剪,我这用到jquery插件cropper.js,这个插件功能差不错方便。 74 | 这个我将数据全部提交到后台(图片是裁剪后 生产数据流 传入后台). 75 | 76 | 3. 主页面(index.ejs) 77 | >主页里面包括了,发帖,显示帖子,分页功能。发帖:必须先登录 ,登录之后才显示发帖的控件。显示页面:一次最多显示16个帖子,一个帖子包括头像 、姓名 78 | 、时间、帖子部分内容等。分页功能:这么没有做 数字分页(太复杂不想做),就直接上一页 和下一页. 79 | 80 | 81 | ## 更新记录 82 | 1. 2017/07/26 开坑 83 | 2. 2017/07/27 创建 首页 84 | 3. 2017/07/27 前台注册页面的完成,验证,和ajax 85 | 4. 2017/07/28 完成注册用户功能 86 | 5. 2017/07/28 注册时 验证用户名是否存在 87 | 6. 2017/07/28 注册时 验证用户名是否存在 88 | 7. 2017/08/01 注册完善 89 | 8. 2017/08/10 登录功能完成 90 | 9. 2017/08/18 个人信息的前台验证和后台数据提交 91 | 10. 2017/08/28 个人信息的头像裁剪和上传并保存数据库中 92 | 11. 2017/09/01 正式改名(百舌),帖子的提交功能 93 | 12. 2017/09/04 首页显示全部帖子,提交帖子优化 94 | 13. 2017/09/19 首页的发帖,分页的完成 95 | 14. 2017/09/25 个人主页的前台页面设计 96 | 15. 2017/10/11 个人主页的数据交换完成 97 | 16. 2017/10/24 帖子评论的显示页面完成,跳转 98 | 16. 2017/10/26 帖子评论的提交,保存 99 | 17. 2017/10/30 帖子评论的功能的完成 100 | 18. 2017/11/02 成员列表功能的完成 101 | 18. 2017/11/07 细节的完善 102 | 103 | > 这个项目是我在公司有空时候做的 , 现在还在学习Node.js,在用这个项目做练习,各位有什么好的建议和意见欢迎提出来 104 | 105 | 106 | ## 历程 107 | #### 1. 2017/07/26 108 | 开坑,动手这个项目,用的是MVC架构。这是第一次用Node.js开发一个项目,也是一次前后台一起写。 109 | 110 | 111 | #### 2. 2017/08/10 112 | 动手做项目快一个月了,现在已完成登录注册,基本的雏形已经有了,有些地方的细节不够完善 113 | 114 | #### 3. 2017/08/18 115 | 个人信息的填写页面 做好久,其中图片上传和裁剪部门有点复杂。这里 我没有将图片上传到后台进行裁剪,而是在前台裁剪后通过数据流的形式 116 | 传入到后台处理。 117 | 118 | #### 4. 2017/08/28 119 | 终于把个人信息页面完成了,这个上传图片并保存在后台搞了我一天的时间。不过挺值的,让对node.js有了更深的了解 120 | 121 | #### 5. 2017/09/01 122 | 今天想的几个小时,暂时把这个项目名称定位:《百舌》 ,百舌之声。前期写做个人信息页面的是时候 ,基本上吧增,删,改做的一遍。先做提交帖子快多了。 123 | 124 | #### 6. 2017/09/04 125 | 现在做功能越来越快了,首页是显示全部帖子难点在于将两张表的数据整合在一起 ,将它传入到前台处理。 126 | 127 | #### 7. 2017/09/19 128 | 终于将一个复杂的功能完成,在这个期间进行了小小的测试,修改了几个bug。分页的逻辑 还是有点复杂,考虑的地方有点多,前台后台都要考虑。 129 | 130 | #### 8. 2017/10/26/ 131 | 这么久了 这个项目快结束了,今天有对芒果数据库有学到新的技术,对于node的简单运用很熟练了。 132 | 133 | #### 9. 2017/10/30/ 134 | 百舌项目 主要的功能 终于完成了 ,接下来就是细节的完成。 135 | 136 | #### 10. 2017/11/02/ 137 | 热烈庆祝百舌项目全部功能完成了。接下的工作就将页面全部串起来,并将里面修改BUG 138 | 139 | #### 11. 2017/11/07/ 140 | 已将所有的页面全部串联起来,接下来就是找人测试系统了。 141 | 142 | 143 | > 路漫漫其修远兮 吾将上下而求索 144 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | var express = require("express"); 2 | var app = express(); 3 | 4 | var router = require("./router/router.js") 5 | 6 | var session = require('express-session') 7 | 8 | //调用session 9 | app.use(session({ 10 | secret: 'keyboard cat', 11 | resave: false, 12 | saveUninitialized: true, 13 | })); 14 | 15 | //模板引擎 16 | app.set("view engine", "ejs"); 17 | 18 | //静态页面 19 | app.use(express.static("./public")); 20 | app.use("/avatar" ,express.static("./avatar")); 21 | 22 | //-----------首页------------- 23 | app.get("/", router.showIndex); 24 | 25 | //提交说说 26 | app.post("/doPublish", router.doPublish); 27 | //显示说说 28 | app.get("/doShowTongue", router.doShowTongue); 29 | //帖子总数 30 | app.post("/doTotal", router.doTotal); 31 | 32 | 33 | //-----------注册------------- 34 | app.get("/register", router.showRegister); 35 | //注册业务 36 | app.post("/doRegister", router.doRegister); 37 | //-----------注册 end------------ 38 | 39 | 40 | 41 | //-----------登录------------- 42 | app.get("/login", router.showlogin); 43 | //登录业务 44 | app.post("/doLogin", router.doLogin); 45 | 46 | //-----------个人信息------------- 47 | app.get("/personal", router.showPersonal); 48 | //修改个人信息 49 | app.post("/doPersonal", router.doPersonal); 50 | 51 | 52 | //-----------个人主页------------- 53 | app.get("/user/:username", router.showUser); 54 | //个人帖子 55 | app.get("/doshowUserTongue", router.doshowUserTongue); 56 | //个人帖子总数 57 | app.get("/doUserTotal", router.doUserTotal); 58 | 59 | //-----------评论------------- 60 | app.get("/post/:postid", router.showPost); 61 | //显示评论 62 | app.post("/showComment", router.showComment); 63 | //提交评论 64 | app.post("/doPostcomment", router.doPostcomment); 65 | 66 | //----------人员列表--------------- 67 | app.get("/Memberlist", router.showMemberlist); 68 | //用户总数 69 | app.post("/doListTotal", router.doListTotal); 70 | //用户信息 71 | app.get("/doShowList", router.doShowList); 72 | 73 | 74 | //-----------404-------------/ 75 | app.use("/404",router.show404); 76 | 77 | 78 | 79 | 80 | app.listen(8085); 81 | 82 | 83 | -------------------------------------------------------------------------------- /avatar/mr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/treey-yao/talk/f0545316f74d8818335e8c58046ab88d5e00071b/avatar/mr.png -------------------------------------------------------------------------------- /avatar/user/2017082910524615913treey.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/treey-yao/talk/f0545316f74d8818335e8c58046ab88d5e00071b/avatar/user/2017082910524615913treey.jpg -------------------------------------------------------------------------------- /avatar/user/2017090616414913938treey.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/treey-yao/talk/f0545316f74d8818335e8c58046ab88d5e00071b/avatar/user/2017090616414913938treey.jpg -------------------------------------------------------------------------------- /avatar/user/2017090616452811945treey.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/treey-yao/talk/f0545316f74d8818335e8c58046ab88d5e00071b/avatar/user/2017090616452811945treey.jpg -------------------------------------------------------------------------------- /model/db.js: -------------------------------------------------------------------------------- 1 | 2 | //这个模块里面封装了所有对数据库的常用操作 3 | var MongoClient = require('mongodb').MongoClient; 4 | //数据库的地址 5 | var settings = require("../settings.js"); 6 | //不管数据库什么操作,都是先连接数据库,所以我们可以把连接数据库 7 | //封装成为内部函数 8 | function _connectDB(callback) { 9 | var url = settings.dburl; //从settings文件中,都数据库地址 10 | //连接数据库 11 | MongoClient.connect(url, function (err, db) { 12 | if (err) { 13 | callback(err, null); 14 | return; 15 | } 16 | callback(err, db); 17 | }); 18 | } 19 | 20 | //插入数据 21 | exports.insertOne = function (collectionName, json, callback) { 22 | _connectDB(function (err, db) { 23 | db.collection(collectionName).insertOne(json, function (err, result) { 24 | callback(err, result); 25 | db.close(); //关闭数据库 26 | }) 27 | }) 28 | }; 29 | 30 | //查找数据,找到所有数据。args是个对象{"pageamount":10,"page":10} 31 | exports.find = function (collectionName, json, C, D) { 32 | var result = []; //结果数组 33 | if (arguments.length == 3) { 34 | //那么参数C就是callback,参数D没有传。 35 | var callback = C; 36 | var skipnumber = 0; 37 | //数目限制 38 | var limit = 0; 39 | } else if (arguments.length == 4) { 40 | var callback = D; 41 | var args = C; 42 | //应该省略的条数 43 | var skipnumber = args.pageamount * args.page || 0; 44 | //数目限制 45 | var limit = args.pageamount || 0; 46 | //排序方式 47 | var sort = args.sort || {}; 48 | } else { 49 | throw new Error("find函数的参数个数,必须是3个,或者4个。"); 50 | return; 51 | } 52 | 53 | //连接数据库,连接之后查找所有 54 | _connectDB(function (err, db) { 55 | var cursor = db.collection(collectionName).find(json).skip(skipnumber).limit(limit).sort(sort); 56 | cursor.each(function (err, doc) { 57 | if (err) { 58 | callback(err, null); 59 | db.close(); //关闭数据库 60 | return; 61 | } 62 | if (doc != null) { 63 | result.push(doc); //放入结果数组 64 | } else { 65 | //遍历结束,没有更多的文档了 66 | callback(null, result); 67 | db.close(); //关闭数据库 68 | } 69 | }); 70 | }); 71 | } 72 | 73 | //删除 74 | exports.deleteMany = function (collectionName, json, callback) { 75 | _connectDB(function (err, db) { 76 | //删除 77 | db.collection(collectionName).deleteMany(json, function (err, results) { 78 | callback(err, results); 79 | db.close(); //关闭数据库 80 | } 81 | ); 82 | }); 83 | } 84 | 85 | //修改 86 | exports.updateMany = function (collectionName, json1, json2, callback) { 87 | _connectDB(function (err, db) { 88 | db.collection(collectionName).updateMany( 89 | json1, 90 | json2, 91 | function (err, results) { 92 | callback(err, results); 93 | db.close(); 94 | }); 95 | }) 96 | } 97 | 98 | 99 | //数据总集合 100 | exports.getAllCount = function (collectionName,callback) { 101 | _connectDB(function (err, db) { 102 | db.collection(collectionName).count({}).then(function(results) { 103 | callback(results); 104 | db.close(); 105 | }); 106 | }) 107 | } 108 | 109 | //数据集合 ---条件 110 | exports.getPartCount = function (collectionName,json,callback) { 111 | _connectDB(function (err, db) { 112 | db.collection(collectionName).count(json).then(function(results) { 113 | callback(results); 114 | db.close(); 115 | }); 116 | }) 117 | } 118 | 119 | 120 | -------------------------------------------------------------------------------- /model/file.js: -------------------------------------------------------------------------------- 1 | var fs = require("fs"); 2 | var path = require("path"); 3 | 4 | //时间戳插件 5 | var sd = require('silly-datetime'); 6 | 7 | //创建临时文件 8 | exports.addFile = function(datafile, callback) { 9 | 10 | if(datafile != "" || null) { 11 | var uploadDir = path.normalize(__dirname + "/../avatar/user/"); 12 | 13 | //文字名字 14 | //当前时间戳 15 | var ttt = sd.format(new Date(), 'YYYYMMDDHHmmss'); 16 | //随机数 17 | var ran = parseInt(Math.random() * 8999 + 10000); 18 | //地址+图片名 19 | var textname = ttt + ran + "treey.jpg"; 20 | 21 | //过滤data:URL 22 | var base64Data = datafile.replace(/^data:image\/\w+;base64,/, ""); 23 | var datafile = new Buffer(base64Data, 'base64'); 24 | 25 | fs.writeFile(uploadDir + textname, datafile, function(err) { 26 | if(err) { 27 | callback(err, null); 28 | return; 29 | } 30 | callback(err, textname); 31 | }); 32 | 33 | } else { 34 | //当前台没有上传图片是的 返回null 35 | callback("", null); 36 | } 37 | 38 | } -------------------------------------------------------------------------------- /model/fun.js: -------------------------------------------------------------------------------- 1 | //方法库 2 | 3 | //获取当前时间,格式YYYY-MM-DD 4 | exports.getNowFormatDate = function() { 5 | var date = new Date(); 6 | var seperator1 = "-"; 7 | var seperator2 = ":"; 8 | var month = date.getMonth() + 1; 9 | var strDate = date.getDate(); 10 | if(month >= 1 && month <= 9) { 11 | month = "0" + month; 12 | } 13 | if(strDate >= 0 && strDate <= 9) { 14 | strDate = "0" + strDate; 15 | } 16 | var currentdate = date.getFullYear() + seperator1 + month + seperator1 + strDate + 17 | " " + date.getHours() + seperator2 + date.getMinutes() + 18 | seperator2 + date.getSeconds(); 19 | return currentdate; 20 | } 21 | 22 | //帖子id, 时间戳加5位的随机数 23 | exports.postids = function() { 24 | //当前时间戳 25 | var timestamp = Date.parse(new Date()); 26 | var maths = (Math.floor(Math.random() * 99999)) + timestamp; 27 | return maths; 28 | } -------------------------------------------------------------------------------- /model/md5.js: -------------------------------------------------------------------------------- 1 | 2 | var crypto = require("crypto"); 3 | 4 | module.exports = function(mingma){ 5 | var md5 = crypto.createHash('md5'); 6 | var password = md5.update(mingma).digest('base64'); 7 | return password; 8 | } -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "talk", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "dependencies": { 6 | "accepts": { 7 | "version": "1.3.3", 8 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", 9 | "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=" 10 | }, 11 | "array-flatten": { 12 | "version": "1.1.1", 13 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 14 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 15 | }, 16 | "array-parallel": { 17 | "version": "0.1.3", 18 | "resolved": "https://registry.npmjs.org/array-parallel/-/array-parallel-0.1.3.tgz", 19 | "integrity": "sha1-j3hTCJJu1apHjEfmTRszS2wMlH0=" 20 | }, 21 | "array-series": { 22 | "version": "0.1.5", 23 | "resolved": "https://registry.npmjs.org/array-series/-/array-series-0.1.5.tgz", 24 | "integrity": "sha1-3103v8XC7wdV4qpPkv6ufUtaly8=" 25 | }, 26 | "bson": { 27 | "version": "1.0.4", 28 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.4.tgz", 29 | "integrity": "sha1-k8ENOeqltYQVy8QFLz5T5WKwtyw=" 30 | }, 31 | "buffer-shims": { 32 | "version": "1.0.0", 33 | "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", 34 | "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" 35 | }, 36 | "content-disposition": { 37 | "version": "0.5.2", 38 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 39 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 40 | }, 41 | "content-type": { 42 | "version": "1.0.2", 43 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz", 44 | "integrity": "sha1-t9ETrueo3Se9IRM8TcJSnfFyHu0=" 45 | }, 46 | "cookie": { 47 | "version": "0.3.1", 48 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 49 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 50 | }, 51 | "cookie-signature": { 52 | "version": "1.0.6", 53 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 54 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 55 | }, 56 | "core-util-is": { 57 | "version": "1.0.2", 58 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 59 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 60 | }, 61 | "crc": { 62 | "version": "3.4.4", 63 | "resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz", 64 | "integrity": "sha1-naHpgOO9RPxck79as9ozeNheRms=" 65 | }, 66 | "cross-spawn": { 67 | "version": "4.0.2", 68 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", 69 | "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=" 70 | }, 71 | "debug": { 72 | "version": "2.6.7", 73 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", 74 | "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=" 75 | }, 76 | "depd": { 77 | "version": "1.1.0", 78 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", 79 | "integrity": "sha1-4b2Cxqq2ztlluXuIsX7T5SjKGMM=" 80 | }, 81 | "destroy": { 82 | "version": "1.0.4", 83 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 84 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 85 | }, 86 | "ee-first": { 87 | "version": "1.1.1", 88 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 89 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 90 | }, 91 | "ejs": { 92 | "version": "2.5.6", 93 | "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.6.tgz", 94 | "integrity": "sha1-R5Y2v6P+Ox3r1SCH8KyyBLTxnIg=" 95 | }, 96 | "encodeurl": { 97 | "version": "1.0.1", 98 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", 99 | "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" 100 | }, 101 | "es6-promise": { 102 | "version": "3.2.1", 103 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz", 104 | "integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q=" 105 | }, 106 | "escape-html": { 107 | "version": "1.0.3", 108 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 109 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 110 | }, 111 | "etag": { 112 | "version": "1.8.0", 113 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.0.tgz", 114 | "integrity": "sha1-b2Ma7zNtbEY2K1F2QETOIWvjwFE=" 115 | }, 116 | "express": { 117 | "version": "4.15.3", 118 | "resolved": "https://registry.npmjs.org/express/-/express-4.15.3.tgz", 119 | "integrity": "sha1-urZdDwOqgMNYQIly/HAPkWlEtmI=" 120 | }, 121 | "express-session": { 122 | "version": "1.15.4", 123 | "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.15.4.tgz", 124 | "integrity": "sha1-Xizc9t7+PB7aTpgPE7mGzFjPuVQ=", 125 | "dependencies": { 126 | "debug": { 127 | "version": "2.6.8", 128 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", 129 | "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=" 130 | } 131 | } 132 | }, 133 | "finalhandler": { 134 | "version": "1.0.3", 135 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.3.tgz", 136 | "integrity": "sha1-70fneVDpmXgOhgIqVg4yF+DQzIk=" 137 | }, 138 | "formidable": { 139 | "version": "1.1.1", 140 | "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz", 141 | "integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak=" 142 | }, 143 | "forwarded": { 144 | "version": "0.1.0", 145 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz", 146 | "integrity": "sha1-Ge+YdMSuHCl7zweP3mOgm2aoQ2M=" 147 | }, 148 | "fresh": { 149 | "version": "0.5.0", 150 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz", 151 | "integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44=" 152 | }, 153 | "gm": { 154 | "version": "1.23.0", 155 | "resolved": "https://registry.npmjs.org/gm/-/gm-1.23.0.tgz", 156 | "integrity": "sha1-gKL+nL8TFRUCSEZERlhGEmn1JmE=", 157 | "dependencies": { 158 | "debug": { 159 | "version": "2.2.0", 160 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", 161 | "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=" 162 | }, 163 | "ms": { 164 | "version": "0.7.1", 165 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", 166 | "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" 167 | } 168 | } 169 | }, 170 | "http-errors": { 171 | "version": "1.6.1", 172 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.1.tgz", 173 | "integrity": "sha1-X4uO2YrKVFZWv1cplzh/kEpyIlc=" 174 | }, 175 | "inherits": { 176 | "version": "2.0.3", 177 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 178 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 179 | }, 180 | "ipaddr.js": { 181 | "version": "1.4.0", 182 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.4.0.tgz", 183 | "integrity": "sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA=" 184 | }, 185 | "isarray": { 186 | "version": "1.0.0", 187 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 188 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 189 | }, 190 | "isexe": { 191 | "version": "2.0.0", 192 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 193 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 194 | }, 195 | "lru-cache": { 196 | "version": "4.1.1", 197 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", 198 | "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==" 199 | }, 200 | "media-typer": { 201 | "version": "0.3.0", 202 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 203 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 204 | }, 205 | "merge-descriptors": { 206 | "version": "1.0.1", 207 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 208 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 209 | }, 210 | "methods": { 211 | "version": "1.1.2", 212 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 213 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 214 | }, 215 | "mime": { 216 | "version": "1.3.4", 217 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", 218 | "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" 219 | }, 220 | "mime-db": { 221 | "version": "1.29.0", 222 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.29.0.tgz", 223 | "integrity": "sha1-SNJtI1WJZRcErFkWygYAGRQmaHg=" 224 | }, 225 | "mime-types": { 226 | "version": "2.1.16", 227 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz", 228 | "integrity": "sha1-K4WKUuXs1RbbiXrCvodIeDBpjiM=" 229 | }, 230 | "mongodb": { 231 | "version": "2.2.30", 232 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.30.tgz", 233 | "integrity": "sha1-jM2AH2dsgXIEDC8rR+lgKg1WNKs=" 234 | }, 235 | "mongodb-core": { 236 | "version": "2.1.14", 237 | "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.14.tgz", 238 | "integrity": "sha1-E8uidkImtb49GJkq8Mljzl6g8P0=" 239 | }, 240 | "ms": { 241 | "version": "2.0.0", 242 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 243 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 244 | }, 245 | "negotiator": { 246 | "version": "0.6.1", 247 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 248 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 249 | }, 250 | "on-finished": { 251 | "version": "2.3.0", 252 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 253 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=" 254 | }, 255 | "on-headers": { 256 | "version": "1.0.1", 257 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", 258 | "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" 259 | }, 260 | "parseurl": { 261 | "version": "1.3.1", 262 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", 263 | "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=" 264 | }, 265 | "path-to-regexp": { 266 | "version": "0.1.7", 267 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 268 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 269 | }, 270 | "process-nextick-args": { 271 | "version": "1.0.7", 272 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 273 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" 274 | }, 275 | "proxy-addr": { 276 | "version": "1.1.5", 277 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.5.tgz", 278 | "integrity": "sha1-ccDuOxAt4/IC87ZPYI0XP8uhqRg=" 279 | }, 280 | "pseudomap": { 281 | "version": "1.0.2", 282 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 283 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" 284 | }, 285 | "qs": { 286 | "version": "6.4.0", 287 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", 288 | "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" 289 | }, 290 | "random-bytes": { 291 | "version": "1.0.0", 292 | "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", 293 | "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" 294 | }, 295 | "range-parser": { 296 | "version": "1.2.0", 297 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 298 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 299 | }, 300 | "readable-stream": { 301 | "version": "2.2.7", 302 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz", 303 | "integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=" 304 | }, 305 | "require_optional": { 306 | "version": "1.0.1", 307 | "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", 308 | "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==" 309 | }, 310 | "resolve-from": { 311 | "version": "2.0.0", 312 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", 313 | "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" 314 | }, 315 | "safe-buffer": { 316 | "version": "5.1.1", 317 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 318 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" 319 | }, 320 | "semver": { 321 | "version": "5.4.1", 322 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", 323 | "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" 324 | }, 325 | "send": { 326 | "version": "0.15.3", 327 | "resolved": "https://registry.npmjs.org/send/-/send-0.15.3.tgz", 328 | "integrity": "sha1-UBP5+ZAj31DRvZiSwZ4979HVMwk=" 329 | }, 330 | "serve-static": { 331 | "version": "1.12.3", 332 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.3.tgz", 333 | "integrity": "sha1-n0uhni8wMMVH+K+ZEHg47DjVseI=" 334 | }, 335 | "setprototypeof": { 336 | "version": "1.0.3", 337 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", 338 | "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" 339 | }, 340 | "silly-datetime": { 341 | "version": "0.1.2", 342 | "resolved": "https://registry.npmjs.org/silly-datetime/-/silly-datetime-0.1.2.tgz", 343 | "integrity": "sha1-IZeOjo2EgWFgY6wRL/FGk/BuuFs=" 344 | }, 345 | "statuses": { 346 | "version": "1.3.1", 347 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", 348 | "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" 349 | }, 350 | "string_decoder": { 351 | "version": "1.0.3", 352 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 353 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==" 354 | }, 355 | "type-is": { 356 | "version": "1.6.15", 357 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", 358 | "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=" 359 | }, 360 | "uid-safe": { 361 | "version": "2.1.4", 362 | "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.4.tgz", 363 | "integrity": "sha1-Otbzg2jG1MjHXsF2I/t5qh0HHYE=" 364 | }, 365 | "unpipe": { 366 | "version": "1.0.0", 367 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 368 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 369 | }, 370 | "util-deprecate": { 371 | "version": "1.0.2", 372 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 373 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 374 | }, 375 | "utils-merge": { 376 | "version": "1.0.0", 377 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", 378 | "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" 379 | }, 380 | "vary": { 381 | "version": "1.1.1", 382 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.1.tgz", 383 | "integrity": "sha1-Z1Neu2lMHVIldFeYRmUyP1h+jTc=" 384 | }, 385 | "which": { 386 | "version": "1.2.14", 387 | "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", 388 | "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=" 389 | }, 390 | "yallist": { 391 | "version": "2.1.2", 392 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 393 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" 394 | } 395 | } 396 | } 397 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "talk", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "app.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "ejs": "^2.5.6", 13 | "express": "^4.15.3", 14 | "express-session": "^1.15.4", 15 | "formidable": "^1.1.1", 16 | "gm": "^1.23.0", 17 | "mongodb": "^2.2.30", 18 | "silly-datetime": "^0.1.2" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /public/css/404.css: -------------------------------------------------------------------------------- 1 | * { 2 | margin: 0 ; 3 | padding: 0; 4 | 5 | } 6 | 7 | html { 8 | height: 100%; 9 | overflow: hidden ; 10 | } 11 | 12 | canvas { 13 | z-index: 1; 14 | position: absolute; 15 | left: 0; 16 | top: 0; 17 | width: 100%; 18 | height: 100%; 19 | } 20 | 21 | .caps { 22 | z-index: 2; 23 | position: absolute; 24 | left: 0; 25 | top: 0; 26 | width: 100%; 27 | height: 100%; 28 | opacity: 0; 29 | animation: as 8s linear infinite; 30 | } 31 | 32 | .caps img { 33 | display: block; 34 | width: 100%; 35 | height: 100%; 36 | } 37 | 38 | @keyframes as { 39 | 0% { 40 | opacity: 0; 41 | } 42 | 10% { 43 | opacity: .3; 44 | } 45 | 20% { 46 | opacity: .1; 47 | } 48 | 30% { 49 | opacity: .5; 50 | } 51 | 40% { 52 | opacity: 0; 53 | } 54 | 50% { 55 | opacity: .8; 56 | } 57 | 55% { 58 | opacity: 0; 59 | } 60 | 55% { 61 | opacity: 0; 62 | } 63 | } 64 | 65 | .frame { 66 | z-index: 3; 67 | position: absolute; 68 | left: 0; 69 | top: 0; 70 | width: 100%; 71 | height: 100%; 72 | background: -moz-radial-gradient(center, ellipse cover, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0) 19%, rgba(0, 0, 0, 0.9) 100%); 73 | /* FF3.6+ */ 74 | background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, rgba(0, 0, 0, 0)), color-stop(19%, rgba(0, 0, 0, 0)), color-stop(100%, rgba(0, 0, 0, 0.9))); 75 | /* Chrome,Safari4+ */ 76 | background: -webkit-radial-gradient(center, ellipse cover, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0) 19%, rgba(0, 0, 0, 0.9) 100%); 77 | /* Chrome10+,Safari5.1+ */ 78 | background: -o-radial-gradient(center, ellipse cover, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0) 19%, rgba(0, 0, 0, 0.9) 100%); 79 | /* Opera 12+ */ 80 | background: -ms-radial-gradient(center, ellipse cover, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0) 19%, rgba(0, 0, 0, 0.9) 100%); 81 | /* IE10+ */ 82 | background: radial-gradient(ellipse at center, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0) 19%, rgba(0, 0, 0, 0.9) 100%); 83 | /* W3C */ 84 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#e6000000', GradientType=1); 85 | /* IE6-9 fallback on horizontal gradient */ 86 | } 87 | 88 | .frame div { 89 | position: absolute; 90 | left: 0; 91 | top: -20%; 92 | width: 100%; 93 | height: 20%; 94 | background-color: rgba(0, 0, 0, .12); 95 | box-shadow: 0 0 10px rgba(0, 0, 0, .3); 96 | animation: asd 12s linear infinite; 97 | } 98 | 99 | .frame div:nth-child(1) { 100 | animation-delay: 0; 101 | } 102 | 103 | .frame div:nth-child(2) { 104 | animation-delay: 4s; 105 | } 106 | 107 | .frame div:nth-child(3) { 108 | animation-delay: 8s; 109 | } 110 | 111 | @keyframes asd { 112 | 0% { 113 | top: -20%; 114 | } 115 | 100% { 116 | top: 100%; 117 | } 118 | } 119 | 120 | h1 { 121 | z-index: 3; 122 | position: absolute; 123 | font: bold 9em/200px Arial, sans-serif; 124 | left: 50%; 125 | top: 50%; 126 | margin-top: -100px; 127 | width: 100%; 128 | margin-left: -50%; 129 | height: 200px; 130 | text-align: center; 131 | color: transparent; 132 | text-shadow: 0 0 30px rgba(0, 0, 0, .5); 133 | animation: asdd 2s linear infinite; 134 | } 135 | 136 | @keyframes asdd { 137 | 0% { 138 | text-shadow: 0 0 30px rgba(0, 0, 0, .5); 139 | } 140 | 33% { 141 | text-shadow: 0 0 10px rgba(0, 0, 0, .4); 142 | } 143 | 66% { 144 | text-shadow: 0 0 20px rgba(0, 0, 0, .2); 145 | } 146 | 100% { 147 | text-shadow: 0 0 40px rgba(0, 0, 0, .8); 148 | } 149 | } -------------------------------------------------------------------------------- /public/css/core/bootstrap-theme.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.7 (http://getbootstrap.com) 3 | * Copyright 2011-2016 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | .btn-default, 7 | .btn-primary, 8 | .btn-success, 9 | .btn-info, 10 | .btn-warning, 11 | .btn-danger { 12 | text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); 13 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); 14 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); 15 | } 16 | .btn-default:active, 17 | .btn-primary:active, 18 | .btn-success:active, 19 | .btn-info:active, 20 | .btn-warning:active, 21 | .btn-danger:active, 22 | .btn-default.active, 23 | .btn-primary.active, 24 | .btn-success.active, 25 | .btn-info.active, 26 | .btn-warning.active, 27 | .btn-danger.active { 28 | -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); 29 | box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); 30 | } 31 | .btn-default.disabled, 32 | .btn-primary.disabled, 33 | .btn-success.disabled, 34 | .btn-info.disabled, 35 | .btn-warning.disabled, 36 | .btn-danger.disabled, 37 | .btn-default[disabled], 38 | .btn-primary[disabled], 39 | .btn-success[disabled], 40 | .btn-info[disabled], 41 | .btn-warning[disabled], 42 | .btn-danger[disabled], 43 | fieldset[disabled] .btn-default, 44 | fieldset[disabled] .btn-primary, 45 | fieldset[disabled] .btn-success, 46 | fieldset[disabled] .btn-info, 47 | fieldset[disabled] .btn-warning, 48 | fieldset[disabled] .btn-danger { 49 | -webkit-box-shadow: none; 50 | box-shadow: none; 51 | } 52 | .btn-default .badge, 53 | .btn-primary .badge, 54 | .btn-success .badge, 55 | .btn-info .badge, 56 | .btn-warning .badge, 57 | .btn-danger .badge { 58 | text-shadow: none; 59 | } 60 | .btn:active, 61 | .btn.active { 62 | background-image: none; 63 | } 64 | .btn-default { 65 | text-shadow: 0 1px 0 #fff; 66 | background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); 67 | background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); 68 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); 69 | background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); 70 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); 71 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 72 | background-repeat: repeat-x; 73 | border-color: #dbdbdb; 74 | border-color: #ccc; 75 | } 76 | .btn-default:hover, 77 | .btn-default:focus { 78 | background-color: #e0e0e0; 79 | background-position: 0 -15px; 80 | } 81 | .btn-default:active, 82 | .btn-default.active { 83 | background-color: #e0e0e0; 84 | border-color: #dbdbdb; 85 | } 86 | .btn-default.disabled, 87 | .btn-default[disabled], 88 | fieldset[disabled] .btn-default, 89 | .btn-default.disabled:hover, 90 | .btn-default[disabled]:hover, 91 | fieldset[disabled] .btn-default:hover, 92 | .btn-default.disabled:focus, 93 | .btn-default[disabled]:focus, 94 | fieldset[disabled] .btn-default:focus, 95 | .btn-default.disabled.focus, 96 | .btn-default[disabled].focus, 97 | fieldset[disabled] .btn-default.focus, 98 | .btn-default.disabled:active, 99 | .btn-default[disabled]:active, 100 | fieldset[disabled] .btn-default:active, 101 | .btn-default.disabled.active, 102 | .btn-default[disabled].active, 103 | fieldset[disabled] .btn-default.active { 104 | background-color: #e0e0e0; 105 | background-image: none; 106 | } 107 | .btn-primary { 108 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%); 109 | background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%); 110 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88)); 111 | background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%); 112 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0); 113 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 114 | background-repeat: repeat-x; 115 | border-color: #245580; 116 | } 117 | .btn-primary:hover, 118 | .btn-primary:focus { 119 | background-color: #265a88; 120 | background-position: 0 -15px; 121 | } 122 | .btn-primary:active, 123 | .btn-primary.active { 124 | background-color: #265a88; 125 | border-color: #245580; 126 | } 127 | .btn-primary.disabled, 128 | .btn-primary[disabled], 129 | fieldset[disabled] .btn-primary, 130 | .btn-primary.disabled:hover, 131 | .btn-primary[disabled]:hover, 132 | fieldset[disabled] .btn-primary:hover, 133 | .btn-primary.disabled:focus, 134 | .btn-primary[disabled]:focus, 135 | fieldset[disabled] .btn-primary:focus, 136 | .btn-primary.disabled.focus, 137 | .btn-primary[disabled].focus, 138 | fieldset[disabled] .btn-primary.focus, 139 | .btn-primary.disabled:active, 140 | .btn-primary[disabled]:active, 141 | fieldset[disabled] .btn-primary:active, 142 | .btn-primary.disabled.active, 143 | .btn-primary[disabled].active, 144 | fieldset[disabled] .btn-primary.active { 145 | background-color: #265a88; 146 | background-image: none; 147 | } 148 | .btn-success { 149 | background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); 150 | background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); 151 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); 152 | background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); 153 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); 154 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 155 | background-repeat: repeat-x; 156 | border-color: #3e8f3e; 157 | } 158 | .btn-success:hover, 159 | .btn-success:focus { 160 | background-color: #419641; 161 | background-position: 0 -15px; 162 | } 163 | .btn-success:active, 164 | .btn-success.active { 165 | background-color: #419641; 166 | border-color: #3e8f3e; 167 | } 168 | .btn-success.disabled, 169 | .btn-success[disabled], 170 | fieldset[disabled] .btn-success, 171 | .btn-success.disabled:hover, 172 | .btn-success[disabled]:hover, 173 | fieldset[disabled] .btn-success:hover, 174 | .btn-success.disabled:focus, 175 | .btn-success[disabled]:focus, 176 | fieldset[disabled] .btn-success:focus, 177 | .btn-success.disabled.focus, 178 | .btn-success[disabled].focus, 179 | fieldset[disabled] .btn-success.focus, 180 | .btn-success.disabled:active, 181 | .btn-success[disabled]:active, 182 | fieldset[disabled] .btn-success:active, 183 | .btn-success.disabled.active, 184 | .btn-success[disabled].active, 185 | fieldset[disabled] .btn-success.active { 186 | background-color: #419641; 187 | background-image: none; 188 | } 189 | .btn-info { 190 | background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); 191 | background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); 192 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); 193 | background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); 194 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); 195 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 196 | background-repeat: repeat-x; 197 | border-color: #28a4c9; 198 | } 199 | .btn-info:hover, 200 | .btn-info:focus { 201 | background-color: #2aabd2; 202 | background-position: 0 -15px; 203 | } 204 | .btn-info:active, 205 | .btn-info.active { 206 | background-color: #2aabd2; 207 | border-color: #28a4c9; 208 | } 209 | .btn-info.disabled, 210 | .btn-info[disabled], 211 | fieldset[disabled] .btn-info, 212 | .btn-info.disabled:hover, 213 | .btn-info[disabled]:hover, 214 | fieldset[disabled] .btn-info:hover, 215 | .btn-info.disabled:focus, 216 | .btn-info[disabled]:focus, 217 | fieldset[disabled] .btn-info:focus, 218 | .btn-info.disabled.focus, 219 | .btn-info[disabled].focus, 220 | fieldset[disabled] .btn-info.focus, 221 | .btn-info.disabled:active, 222 | .btn-info[disabled]:active, 223 | fieldset[disabled] .btn-info:active, 224 | .btn-info.disabled.active, 225 | .btn-info[disabled].active, 226 | fieldset[disabled] .btn-info.active { 227 | background-color: #2aabd2; 228 | background-image: none; 229 | } 230 | .btn-warning { 231 | background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); 232 | background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); 233 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); 234 | background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); 235 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); 236 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 237 | background-repeat: repeat-x; 238 | border-color: #e38d13; 239 | } 240 | .btn-warning:hover, 241 | .btn-warning:focus { 242 | background-color: #eb9316; 243 | background-position: 0 -15px; 244 | } 245 | .btn-warning:active, 246 | .btn-warning.active { 247 | background-color: #eb9316; 248 | border-color: #e38d13; 249 | } 250 | .btn-warning.disabled, 251 | .btn-warning[disabled], 252 | fieldset[disabled] .btn-warning, 253 | .btn-warning.disabled:hover, 254 | .btn-warning[disabled]:hover, 255 | fieldset[disabled] .btn-warning:hover, 256 | .btn-warning.disabled:focus, 257 | .btn-warning[disabled]:focus, 258 | fieldset[disabled] .btn-warning:focus, 259 | .btn-warning.disabled.focus, 260 | .btn-warning[disabled].focus, 261 | fieldset[disabled] .btn-warning.focus, 262 | .btn-warning.disabled:active, 263 | .btn-warning[disabled]:active, 264 | fieldset[disabled] .btn-warning:active, 265 | .btn-warning.disabled.active, 266 | .btn-warning[disabled].active, 267 | fieldset[disabled] .btn-warning.active { 268 | background-color: #eb9316; 269 | background-image: none; 270 | } 271 | .btn-danger { 272 | background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); 273 | background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); 274 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); 275 | background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); 276 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); 277 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 278 | background-repeat: repeat-x; 279 | border-color: #b92c28; 280 | } 281 | .btn-danger:hover, 282 | .btn-danger:focus { 283 | background-color: #c12e2a; 284 | background-position: 0 -15px; 285 | } 286 | .btn-danger:active, 287 | .btn-danger.active { 288 | background-color: #c12e2a; 289 | border-color: #b92c28; 290 | } 291 | .btn-danger.disabled, 292 | .btn-danger[disabled], 293 | fieldset[disabled] .btn-danger, 294 | .btn-danger.disabled:hover, 295 | .btn-danger[disabled]:hover, 296 | fieldset[disabled] .btn-danger:hover, 297 | .btn-danger.disabled:focus, 298 | .btn-danger[disabled]:focus, 299 | fieldset[disabled] .btn-danger:focus, 300 | .btn-danger.disabled.focus, 301 | .btn-danger[disabled].focus, 302 | fieldset[disabled] .btn-danger.focus, 303 | .btn-danger.disabled:active, 304 | .btn-danger[disabled]:active, 305 | fieldset[disabled] .btn-danger:active, 306 | .btn-danger.disabled.active, 307 | .btn-danger[disabled].active, 308 | fieldset[disabled] .btn-danger.active { 309 | background-color: #c12e2a; 310 | background-image: none; 311 | } 312 | .thumbnail, 313 | .img-thumbnail { 314 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 315 | box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 316 | } 317 | .dropdown-menu > li > a:hover, 318 | .dropdown-menu > li > a:focus { 319 | background-color: #e8e8e8; 320 | background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 321 | background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 322 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); 323 | background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); 324 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); 325 | background-repeat: repeat-x; 326 | } 327 | .dropdown-menu > .active > a, 328 | .dropdown-menu > .active > a:hover, 329 | .dropdown-menu > .active > a:focus { 330 | background-color: #2e6da4; 331 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 332 | background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 333 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); 334 | background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); 335 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); 336 | background-repeat: repeat-x; 337 | } 338 | .navbar-default { 339 | background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); 340 | background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%); 341 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8)); 342 | background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); 343 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); 344 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 345 | background-repeat: repeat-x; 346 | border-radius: 4px; 347 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); 348 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); 349 | } 350 | .navbar-default .navbar-nav > .open > a, 351 | .navbar-default .navbar-nav > .active > a { 352 | background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); 353 | background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); 354 | background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2)); 355 | background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%); 356 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); 357 | background-repeat: repeat-x; 358 | -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); 359 | box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); 360 | } 361 | .navbar-brand, 362 | .navbar-nav > li > a { 363 | text-shadow: 0 1px 0 rgba(255, 255, 255, .25); 364 | } 365 | .navbar-inverse { 366 | background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); 367 | background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); 368 | background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); 369 | background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); 370 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); 371 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 372 | background-repeat: repeat-x; 373 | border-radius: 4px; 374 | } 375 | .navbar-inverse .navbar-nav > .open > a, 376 | .navbar-inverse .navbar-nav > .active > a { 377 | background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%); 378 | background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%); 379 | background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f)); 380 | background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); 381 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); 382 | background-repeat: repeat-x; 383 | -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); 384 | box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); 385 | } 386 | .navbar-inverse .navbar-brand, 387 | .navbar-inverse .navbar-nav > li > a { 388 | text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); 389 | } 390 | .navbar-static-top, 391 | .navbar-fixed-top, 392 | .navbar-fixed-bottom { 393 | border-radius: 0; 394 | } 395 | @media (max-width: 767px) { 396 | .navbar .navbar-nav .open .dropdown-menu > .active > a, 397 | .navbar .navbar-nav .open .dropdown-menu > .active > a:hover, 398 | .navbar .navbar-nav .open .dropdown-menu > .active > a:focus { 399 | color: #fff; 400 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 401 | background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 402 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); 403 | background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); 404 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); 405 | background-repeat: repeat-x; 406 | } 407 | } 408 | .alert { 409 | text-shadow: 0 1px 0 rgba(255, 255, 255, .2); 410 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); 411 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); 412 | } 413 | .alert-success { 414 | background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); 415 | background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); 416 | background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); 417 | background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); 418 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); 419 | background-repeat: repeat-x; 420 | border-color: #b2dba1; 421 | } 422 | .alert-info { 423 | background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); 424 | background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); 425 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); 426 | background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); 427 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); 428 | background-repeat: repeat-x; 429 | border-color: #9acfea; 430 | } 431 | .alert-warning { 432 | background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); 433 | background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); 434 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); 435 | background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); 436 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); 437 | background-repeat: repeat-x; 438 | border-color: #f5e79e; 439 | } 440 | .alert-danger { 441 | background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); 442 | background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); 443 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); 444 | background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); 445 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); 446 | background-repeat: repeat-x; 447 | border-color: #dca7a7; 448 | } 449 | .progress { 450 | background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); 451 | background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); 452 | background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); 453 | background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); 454 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); 455 | background-repeat: repeat-x; 456 | } 457 | .progress-bar { 458 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%); 459 | background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%); 460 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090)); 461 | background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%); 462 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0); 463 | background-repeat: repeat-x; 464 | } 465 | .progress-bar-success { 466 | background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); 467 | background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); 468 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); 469 | background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); 470 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); 471 | background-repeat: repeat-x; 472 | } 473 | .progress-bar-info { 474 | background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); 475 | background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); 476 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); 477 | background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); 478 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); 479 | background-repeat: repeat-x; 480 | } 481 | .progress-bar-warning { 482 | background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); 483 | background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); 484 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); 485 | background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); 486 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); 487 | background-repeat: repeat-x; 488 | } 489 | .progress-bar-danger { 490 | background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); 491 | background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); 492 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); 493 | background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); 494 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); 495 | background-repeat: repeat-x; 496 | } 497 | .progress-bar-striped { 498 | 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); 499 | 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); 500 | 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); 501 | } 502 | .list-group { 503 | border-radius: 4px; 504 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 505 | box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 506 | } 507 | .list-group-item.active, 508 | .list-group-item.active:hover, 509 | .list-group-item.active:focus { 510 | text-shadow: 0 -1px 0 #286090; 511 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%); 512 | background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%); 513 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a)); 514 | background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%); 515 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0); 516 | background-repeat: repeat-x; 517 | border-color: #2b669a; 518 | } 519 | .list-group-item.active .badge, 520 | .list-group-item.active:hover .badge, 521 | .list-group-item.active:focus .badge { 522 | text-shadow: none; 523 | } 524 | .panel { 525 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); 526 | box-shadow: 0 1px 2px rgba(0, 0, 0, .05); 527 | } 528 | .panel-default > .panel-heading { 529 | background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 530 | background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 531 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); 532 | background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); 533 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); 534 | background-repeat: repeat-x; 535 | } 536 | .panel-primary > .panel-heading { 537 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 538 | background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 539 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); 540 | background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); 541 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); 542 | background-repeat: repeat-x; 543 | } 544 | .panel-success > .panel-heading { 545 | background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); 546 | background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); 547 | background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); 548 | background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); 549 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); 550 | background-repeat: repeat-x; 551 | } 552 | .panel-info > .panel-heading { 553 | background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); 554 | background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); 555 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); 556 | background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); 557 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); 558 | background-repeat: repeat-x; 559 | } 560 | .panel-warning > .panel-heading { 561 | background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); 562 | background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); 563 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); 564 | background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); 565 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); 566 | background-repeat: repeat-x; 567 | } 568 | .panel-danger > .panel-heading { 569 | background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); 570 | background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); 571 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); 572 | background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); 573 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); 574 | background-repeat: repeat-x; 575 | } 576 | .well { 577 | background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); 578 | background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); 579 | background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); 580 | background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); 581 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); 582 | background-repeat: repeat-x; 583 | border-color: #dcdcdc; 584 | -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); 585 | box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); 586 | } 587 | /*# sourceMappingURL=bootstrap-theme.css.map */ 588 | -------------------------------------------------------------------------------- /public/css/core/bootstrap-theme.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.7 (http://getbootstrap.com) 3 | * Copyright 2011-2016 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{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-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning: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-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .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:focus,.btn-default:hover{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.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;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:focus,.btn-success:hover{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.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{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:focus,.btn-info:hover{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.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{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:focus,.btn-warning:hover{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.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{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:focus,.btn-danger:hover{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.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.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:focus,.dropdown-menu>li>a:hover{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:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', 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>.active>a,.navbar-default .navbar-nav>.open>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;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>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-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.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,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', 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:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .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,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', 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)} 6 | /*# sourceMappingURL=bootstrap-theme.min.css.map */ -------------------------------------------------------------------------------- /public/css/core/bootstrap-theme.min.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":";;;;AAmBA,YAAA,aAAA,UAAA,aAAA,aAAA,aAME,YAAA,EAAA,KAAA,EAAA,eC2CA,mBAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBDvCR,mBAAA,mBAAA,oBAAA,oBAAA,iBAAA,iBAAA,oBAAA,oBAAA,oBAAA,oBAAA,oBAAA,oBCsCA,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBDlCR,qBAAA,sBAAA,sBAAA,uBAAA,mBAAA,oBAAA,sBAAA,uBAAA,sBAAA,uBAAA,sBAAA,uBAAA,+BAAA,gCAAA,6BAAA,gCAAA,gCAAA,gCCiCA,mBAAA,KACQ,WAAA,KDlDV,mBAAA,oBAAA,iBAAA,oBAAA,oBAAA,oBAuBI,YAAA,KAyCF,YAAA,YAEE,iBAAA,KAKJ,aErEI,YAAA,EAAA,IAAA,EAAA,KACA,iBAAA,iDACA,iBAAA,4CAAA,iBAAA,qEAEA,iBAAA,+CCnBF,OAAA,+GH4CA,OAAA,0DACA,kBAAA,SAuC2C,aAAA,QAA2B,aAAA,KArCtE,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAgBN,aEtEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAiBN,aEvEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAkBN,UExEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,gBAAA,gBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,iBAAA,iBAEE,iBAAA,QACA,aAAA,QAMA,mBAAA,0BAAA,yBAAA,0BAAA,yBAAA,yBAAA,oBAAA,2BAAA,0BAAA,2BAAA,0BAAA,0BAAA,6BAAA,oCAAA,mCAAA,oCAAA,mCAAA,mCAME,iBAAA,QACA,iBAAA,KAmBN,aEzEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAoBN,YE1EI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,kBAAA,kBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,mBAAA,mBAEE,iBAAA,QACA,aAAA,QAMA,qBAAA,4BAAA,2BAAA,4BAAA,2BAAA,2BAAA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,+BAAA,sCAAA,qCAAA,sCAAA,qCAAA,qCAME,iBAAA,QACA,iBAAA,KA2BN,eAAA,WClCE,mBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,EAAA,IAAA,IAAA,iBD2CV,0BAAA,0BE3FI,iBAAA,QACA,iBAAA,oDACA,iBAAA,+CAAA,iBAAA,wEACA,iBAAA,kDACA,OAAA,+GF0FF,kBAAA,SAEF,yBAAA,+BAAA,+BEhGI,iBAAA,QACA,iBAAA,oDACA,iBAAA,+CAAA,iBAAA,wEACA,iBAAA,kDACA,OAAA,+GFgGF,kBAAA,SASF,gBE7GI,iBAAA,iDACA,iBAAA,4CACA,iBAAA,qEAAA,iBAAA,+CACA,OAAA,+GACA,OAAA,0DCnBF,kBAAA,SH+HA,cAAA,ICjEA,mBAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBD6DV,sCAAA,oCE7GI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SD2CF,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBD0EV,cAAA,iBAEE,YAAA,EAAA,IAAA,EAAA,sBAIF,gBEhII,iBAAA,iDACA,iBAAA,4CACA,iBAAA,qEAAA,iBAAA,+CACA,OAAA,+GACA,OAAA,0DCnBF,kBAAA,SHkJA,cAAA,IAHF,sCAAA,oCEhII,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SD2CF,mBAAA,MAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,gBDgFV,8BAAA,iCAYI,YAAA,EAAA,KAAA,EAAA,gBAKJ,qBAAA,kBAAA,mBAGE,cAAA,EAqBF,yBAfI,mDAAA,yDAAA,yDAGE,MAAA,KE7JF,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,UFqKJ,OACE,YAAA,EAAA,IAAA,EAAA,qBC3HA,mBAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,gBDsIV,eEtLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAKF,YEvLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAMF,eExLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAOF,cEzLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAeF,UEjMI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFuMJ,cE3MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFwMJ,sBE5MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFyMJ,mBE7MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF0MJ,sBE9MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF2MJ,qBE/MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF+MJ,sBElLI,iBAAA,yKACA,iBAAA,oKACA,iBAAA,iKFyLJ,YACE,cAAA,IC9KA,mBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,EAAA,IAAA,IAAA,iBDgLV,wBAAA,8BAAA,8BAGE,YAAA,EAAA,KAAA,EAAA,QEnOE,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFiOF,aAAA,QALF,+BAAA,qCAAA,qCAQI,YAAA,KAUJ,OCnME,mBAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,EAAA,IAAA,IAAA,gBD4MV,8BE5PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFyPJ,8BE7PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF0PJ,8BE9PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF2PJ,2BE/PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF4PJ,8BEhQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF6PJ,6BEjQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFoQJ,MExQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFsQF,aAAA,QC3NA,mBAAA,MAAA,EAAA,IAAA,IAAA,gBAAA,EAAA,IAAA,EAAA,qBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,gBAAA,EAAA,IAAA,EAAA","sourcesContent":["/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} -------------------------------------------------------------------------------- /public/css/core/jumbotron.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * IE10 viewport hack for Surface/desktop Windows 8 bug 3 | * Copyright 2014-2015 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | 7 | /* 8 | * See the Getting Started docs for more information: 9 | * http://getbootstrap.com/getting-started/#support-ie10-width 10 | */ 11 | @-ms-viewport { width: device-width; } 12 | @-o-viewport { width: device-width; } 13 | @viewport { width: device-width; } 14 | 15 | 16 | 17 | 18 | 19 | /* Move down content because we have a fixed navbar that is 50px tall */ 20 | body { 21 | padding-top: 50px; 22 | padding-bottom: 20px; 23 | } -------------------------------------------------------------------------------- /public/css/core/jumbotron.txt: -------------------------------------------------------------------------------- 1 | /*! 2 | * IE10 viewport hack for Surface/desktop Windows 8 bug 3 | * Copyright 2014-2015 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | 7 | /* 8 | * See the Getting Started docs for more information: 9 | * http://getbootstrap.com/getting-started/#support-ie10-width 10 | */ 11 | @-ms-viewport { width: device-width; } 12 | @-o-viewport { width: device-width; } 13 | @viewport { width: device-width; } 14 | 15 | 16 | 17 | 18 | 19 | /* Move down content because we have a fixed navbar that is 50px tall */ 20 | body { 21 | padding-top: 50px; 22 | padding-bottom: 20px; 23 | } -------------------------------------------------------------------------------- /public/css/index.css: -------------------------------------------------------------------------------- 1 | .headimg img { 2 | width: 100%; 3 | min-height: 160px; 4 | max-height: 200px; 5 | } 6 | 7 | .name-text { 8 | display: block; 9 | text-align: center; 10 | height: 30px; 11 | line-height: 30px; 12 | font-size: 16px; 13 | color: #333; 14 | } 15 | 16 | .name-text:active, 17 | .name-text:hover { 18 | text-decoration: none; 19 | cursor: pointer; 20 | } 21 | 22 | .y-detail { 23 | display: block; 24 | margin-bottom: 20px; 25 | } 26 | 27 | .y-detail-box { 28 | display: block; 29 | position: relative; 30 | height: 50px; 31 | overflow: hidden; 32 | } 33 | 34 | .y-detail-img { 35 | display: block; 36 | width: 50px; 37 | height: 50px; 38 | position: absolute; 39 | top: 0px; 40 | left: 0px; 41 | } 42 | 43 | .y-detail-img img { 44 | width: 100%; 45 | height: 100%; 46 | } 47 | 48 | .y-detail-text { 49 | display: block; 50 | height: 50px; 51 | margin-left: 60px; 52 | } 53 | 54 | .y-detail-name { 55 | display: block; 56 | margin-bottom: 7px; 57 | padding: 5px 0 0; 58 | color: #333; 59 | text-decoration: none; 60 | font-size: 14px; 61 | font-weight: 700; 62 | overflow: hidden; 63 | text-overflow: ellipsis; 64 | white-space: nowrap; 65 | width: 70%; 66 | } 67 | 68 | .y-detail-time { 69 | margin-bottom: 2px; 70 | color: #808080; 71 | text-decoration: none; 72 | } 73 | 74 | .y-detail-content { 75 | line-height: 20px; 76 | overflow: hidden; 77 | overflow-wrap: break-word; 78 | padding: 1px 0 3px; 79 | font-size: 14px; 80 | color: #333; 81 | margin-bottom: 5px; 82 | height: 60px; 83 | display: -webkit-box; 84 | -webkit-box-orient: vertical; 85 | -webkit-line-clamp: 3; 86 | overflow: hidden; 87 | } 88 | 89 | .disabled a{ 90 | pointer-events: none; 91 | color: #afafaf; 92 | cursor: default 93 | } -------------------------------------------------------------------------------- /public/css/login.css: -------------------------------------------------------------------------------- 1 | html, 2 | body { 3 | width: 100%; 4 | height: 100%; 5 | margin: 0px; 6 | padding: 0px; 7 | position: relative; 8 | } 9 | 10 | .blur { 11 | width: 100%; 12 | height: 100%; 13 | position: absolute; 14 | top: 0px; 15 | left: 0px; 16 | bottom: 0px; 17 | width: 100%; 18 | z-index: 10; 19 | background: url(../img/super/super.jpg); 20 | background-repeat: no-repeat; 21 | background-attachment: fixed; 22 | background-size: cover; 23 | background-position: top center; 24 | -webkit-filter: blur(4px); 25 | /* Chrome, Opera */ 26 | -moz-filter: blur(4px); 27 | -ms-filter: blur(4px); 28 | filter: blur(4px); 29 | filter: progid:DXImageTransform.Microsoft.Blur(PixelRadius=4, MakeShadow=false); 30 | } 31 | 32 | .logon-content-box { 33 | display: block; 34 | width: 100%; 35 | height: 100%; 36 | position: absolute; 37 | top: 0px; 38 | left: 0px; 39 | bottom: 0px; 40 | width: 100%; 41 | z-index: 20; 42 | } 43 | 44 | .sign-box { 45 | display: block; 46 | width: 100%; 47 | position: absolute; 48 | top: 25%; 49 | left: 0px; 50 | } 51 | 52 | .wall-box { 53 | display: block; 54 | margin: 0px auto; 55 | } 56 | 57 | @media (min-width: 320px) { 58 | .wall-box { 59 | width: 200px; 60 | } 61 | } 62 | 63 | @media (min-width: 768px) { 64 | .wall-box { 65 | width: 300px; 66 | } 67 | } 68 | 69 | .login-tilte { 70 | display: block; 71 | height: 25px; 72 | line-height: 25px; 73 | text-align: center; 74 | font-size: 20px; 75 | color: #fff; 76 | font-weight: 600; 77 | letter-spacing: 5px; 78 | margin-bottom: 20px; 79 | } 80 | 81 | .log-line { 82 | display: block; 83 | margin-bottom: 20px; 84 | } 85 | 86 | .log-input { 87 | display: block; 88 | height: 30px; 89 | line-height: 30px; 90 | } 91 | 92 | .log-input input:focus { 93 | outline: none 94 | } 95 | 96 | .log-input input { 97 | display: block; 98 | margin: 0px; 99 | padding: 0px; 100 | width: 100%; 101 | height: 30px; 102 | line-height: 30px; 103 | border-radius: 5px; 104 | overflow: hidden; 105 | border: none; 106 | box-shadow: none; 107 | background: #143870; 108 | opacity: 0.8; 109 | color: #fff; 110 | text-align: center; 111 | } 112 | 113 | .log-btn{ 114 | display: block; 115 | width: 100%; 116 | 117 | } 118 | 119 | .log-btn a{ 120 | display: block; 121 | color: #0F2E6A; 122 | cursor: pointer; 123 | font-size: 18px; 124 | height: 30px; 125 | line-height: 30px; 126 | text-align: center; 127 | background: #D4F5F5; 128 | border-radius: 5px; 129 | text-decoration:none ; 130 | } 131 | -------------------------------------------------------------------------------- /public/css/menberlist.css: -------------------------------------------------------------------------------- 1 | .content-box{ 2 | display:block; 3 | padding-top:20px; 4 | } 5 | 6 | .y-detail { 7 | display: block; 8 | margin-bottom: 20px; 9 | } 10 | 11 | .y-detail-box { 12 | display: block; 13 | position: relative; 14 | height: 50px; 15 | overflow: hidden; 16 | } 17 | 18 | .y-detail-img { 19 | display: block; 20 | width: 50px; 21 | height: 50px; 22 | position: absolute; 23 | top: 0px; 24 | left: 0px; 25 | } 26 | 27 | .y-detail-img img { 28 | width: 100%; 29 | height: 100%; 30 | } 31 | 32 | .y-detail-text { 33 | display: block; 34 | height: 50px; 35 | margin-left: 60px; 36 | } 37 | 38 | .y-detail-name { 39 | display: block; 40 | margin-bottom: 7px; 41 | padding: 5px 0 0; 42 | color: #333; 43 | text-decoration: none; 44 | font-size: 14px; 45 | font-weight: 700; 46 | overflow: hidden; 47 | text-overflow: ellipsis; 48 | white-space: nowrap; 49 | width: 70%; 50 | } 51 | 52 | .y-detail-time { 53 | margin-bottom: 2px; 54 | color: #808080; 55 | text-decoration: none; 56 | } 57 | 58 | .y-detail-content { 59 | line-height: 20px; 60 | overflow: hidden; 61 | overflow-wrap: break-word; 62 | padding: 1px 0 3px; 63 | font-size: 14px; 64 | color: #333; 65 | margin-bottom: 5px; 66 | height: 60px; 67 | display: -webkit-box; 68 | -webkit-box-orient: vertical; 69 | -webkit-line-clamp: 3; 70 | overflow: hidden; 71 | } 72 | 73 | .disabled a{ 74 | pointer-events: none; 75 | color: #afafaf; 76 | cursor: default 77 | } -------------------------------------------------------------------------------- /public/css/personal.css: -------------------------------------------------------------------------------- 1 | body{ 2 | padding-bottom: 0px; 3 | } 4 | 5 | .preview-box-big{ 6 | display: block; 7 | width: 100%; 8 | max-width: 200px; 9 | margin: 10px auto; 10 | position: relative; 11 | } 12 | .preview-box-big img{ 13 | width: 200px; 14 | } 15 | 16 | .file-box{ 17 | display: block; 18 | width: 30%; 19 | height: 30px; 20 | text-align: center; 21 | font-size: 14px; 22 | margin: 0px auto; 23 | position: relative; 24 | } 25 | 26 | .h-file{ 27 | display: block; 28 | position: absolute; 29 | top: 0px; 30 | left: 0px; 31 | 32 | width: 100%; 33 | height: 30px; 34 | opacity: 0; 35 | } 36 | 37 | .cropper-container{ 38 | left: 0px !important; 39 | } 40 | 41 | .update-box{ 42 | margin-top: 30px; 43 | 44 | } 45 | .update-btn{ 46 | display: block; 47 | width: 50%; 48 | margin: 0px auto; 49 | } 50 | -------------------------------------------------------------------------------- /public/css/post.css: -------------------------------------------------------------------------------- 1 | .headimg img { 2 | width: 100%; 3 | min-height: 160px; 4 | max-height: 200px; 5 | } 6 | 7 | .name-text { 8 | display: block; 9 | text-align: center; 10 | height: 30px; 11 | line-height: 30px; 12 | font-size: 16px; 13 | color: #333; 14 | } 15 | 16 | .name-text:active, 17 | .name-text:hover { 18 | text-decoration: none; 19 | cursor: pointer; 20 | } 21 | 22 | 23 | .y-detail { 24 | display: block; 25 | margin-bottom: 20px; 26 | border-bottom: 1px solid #EEEEEE; 27 | } 28 | 29 | .y-detail-box { 30 | display: block; 31 | position: relative; 32 | height: 50px; 33 | overflow: hidden; 34 | } 35 | 36 | .y-detail-img { 37 | display: block; 38 | width: 50px; 39 | height: 50px; 40 | position: absolute; 41 | top: 0px; 42 | left: 0px; 43 | } 44 | 45 | .y-detail-img img { 46 | width: 100%; 47 | height: 100%; 48 | } 49 | 50 | .y-detail-text { 51 | display: block; 52 | height: 50px; 53 | margin-left: 60px; 54 | } 55 | 56 | .y-detail-name { 57 | display: block; 58 | margin-bottom: 7px; 59 | padding: 5px 0 0; 60 | color: #333; 61 | text-decoration: none; 62 | font-size: 14px; 63 | font-weight: 700; 64 | overflow: hidden; 65 | text-overflow: ellipsis; 66 | white-space: nowrap; 67 | width: 70%; 68 | } 69 | 70 | .y-detail-time { 71 | margin-bottom: 2px; 72 | color: #808080; 73 | text-decoration: none; 74 | } 75 | 76 | .y-detail-content { 77 | line-height: 20px; 78 | overflow: hidden; 79 | overflow-wrap: break-word; 80 | padding: 1px 0 3px; 81 | font-size: 14px; 82 | color: #333; 83 | margin-bottom: 5px; 84 | min-height: 60px; 85 | display: -webkit-box; 86 | -webkit-box-orient: vertical; 87 | -webkit-line-clamp: 3; 88 | overflow: hidden; 89 | } 90 | 91 | 92 | 93 | 94 | 95 | .name-text { 96 | display: block; 97 | text-align: center; 98 | height: 30px; 99 | line-height: 30px; 100 | font-size: 16px; 101 | color: #333; 102 | } 103 | 104 | .name-text:active, 105 | .name-text:hover { 106 | text-decoration: none; 107 | cursor: pointer; 108 | } 109 | 110 | 111 | 112 | .disabled a{ 113 | pointer-events: none; 114 | color: #afafaf; 115 | cursor: default 116 | } 117 | 118 | .submit-btn{ 119 | display: block; 120 | margin-top: 10px; 121 | margin-bottom: 0px; 122 | } 123 | -------------------------------------------------------------------------------- /public/css/register.css: -------------------------------------------------------------------------------- 1 | .s-content{ 2 | /*margin-top:20px ;*/ 3 | } 4 | .form-box{ 5 | /*margin-top:50px ;*/ 6 | } 7 | 8 | .s-prompt-box{ 9 | display: block; 10 | padding: 5px 0px; 11 | font-size: 12px; 12 | font-weight: 500; 13 | color: #666; 14 | } 15 | 16 | 17 | .alert-danger{ 18 | display: none; 19 | } 20 | .alert-success{ 21 | display: none; 22 | } 23 | -------------------------------------------------------------------------------- /public/css/user.css: -------------------------------------------------------------------------------- 1 | 2 | .name-title{ 3 | color: inherit; 4 | font-family: inherit; 5 | font-weight: 700; 6 | line-height: 40px; 7 | margin: 10px 0; 8 | font-size: 36px; 9 | text-rendering: optimizelegibility; 10 | } 11 | 12 | .user-name{ 13 | color: #DE5347; 14 | } 15 | .headimg img { 16 | width: 100%; 17 | min-height: 160px; 18 | max-height: 200px; 19 | } 20 | 21 | 22 | 23 | .y-detail { 24 | display: block; 25 | margin-bottom: 20px; 26 | border-bottom: 1px solid #EEEEEE; 27 | } 28 | 29 | .y-detail-box { 30 | display: block; 31 | position: relative; 32 | height: 50px; 33 | overflow: hidden; 34 | } 35 | 36 | .y-detail-img { 37 | display: block; 38 | width: 50px; 39 | height: 50px; 40 | position: absolute; 41 | top: 0px; 42 | left: 0px; 43 | } 44 | 45 | .y-detail-img img { 46 | width: 100%; 47 | height: 100%; 48 | } 49 | 50 | .y-detail-text { 51 | display: block; 52 | height: 50px; 53 | margin-left: 60px; 54 | } 55 | 56 | .y-detail-name { 57 | display: block; 58 | margin-bottom: 7px; 59 | padding: 5px 0 0; 60 | color: #333; 61 | text-decoration: none; 62 | font-size: 14px; 63 | font-weight: 700; 64 | overflow: hidden; 65 | text-overflow: ellipsis; 66 | white-space: nowrap; 67 | width: 70%; 68 | } 69 | 70 | .y-detail-time { 71 | margin-bottom: 2px; 72 | color: #808080; 73 | text-decoration: none; 74 | } 75 | 76 | .y-detail-content { 77 | line-height: 20px; 78 | overflow: hidden; 79 | overflow-wrap: break-word; 80 | padding: 1px 0 3px; 81 | font-size: 14px; 82 | color: #333; 83 | margin-bottom: 5px; 84 | height: 60px; 85 | display: -webkit-box; 86 | -webkit-box-orient: vertical; 87 | -webkit-line-clamp: 3; 88 | overflow: hidden; 89 | } 90 | 91 | 92 | 93 | 94 | 95 | .name-text { 96 | display: block; 97 | text-align: center; 98 | height: 30px; 99 | line-height: 30px; 100 | font-size: 16px; 101 | color: #333; 102 | } 103 | 104 | .name-text:active, 105 | .name-text:hover { 106 | text-decoration: none; 107 | cursor: pointer; 108 | } 109 | 110 | 111 | 112 | .disabled a{ 113 | pointer-events: none; 114 | color: #afafaf; 115 | cursor: default 116 | } -------------------------------------------------------------------------------- /public/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/treey-yao/talk/f0545316f74d8818335e8c58046ab88d5e00071b/public/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /public/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/treey-yao/talk/f0545316f74d8818335e8c58046ab88d5e00071b/public/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /public/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/treey-yao/talk/f0545316f74d8818335e8c58046ab88d5e00071b/public/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /public/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/treey-yao/talk/f0545316f74d8818335e8c58046ab88d5e00071b/public/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /public/img/favicon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/treey-yao/talk/f0545316f74d8818335e8c58046ab88d5e00071b/public/img/favicon/favicon.ico -------------------------------------------------------------------------------- /public/img/super/super.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/treey-yao/talk/f0545316f74d8818335e8c58046ab88d5e00071b/public/img/super/super.jpg -------------------------------------------------------------------------------- /public/js/lib/cropper/cropper.css: -------------------------------------------------------------------------------- 1 | .cropper-container { 2 | position: relative; 3 | overflow: hidden; 4 | 5 | -webkit-user-select: none; 6 | -moz-user-select: none; 7 | -ms-user-select: none; 8 | user-select: none; 9 | 10 | -webkit-tap-highlight-color: transparent; 11 | -webkit-touch-callout: none; 12 | } 13 | 14 | .cropper-container img { 15 | width: 100%; 16 | height: 100%; 17 | min-width: 0 !important; 18 | min-height: 0 !important; 19 | max-width: none !important; 20 | max-height: none !important; 21 | } 22 | 23 | .cropper-modal, 24 | .cropper-canvas { 25 | position: absolute; 26 | top: 0; 27 | right: 0; 28 | bottom: 0; 29 | left: 0; 30 | } 31 | 32 | .cropper-canvas { 33 | background-color: #fff; 34 | opacity: 0; 35 | filter: alpha(opacity=0); 36 | } 37 | 38 | .cropper-modal { 39 | background-color: #000; 40 | opacity: .5; 41 | filter: alpha(opacity=50); 42 | } 43 | 44 | .cropper-dragger { 45 | position: absolute; 46 | top: 10%; 47 | left: 10%; 48 | width: 80%; 49 | height: 80%; 50 | } 51 | 52 | .cropper-viewer { 53 | display: block; 54 | width: 100%; 55 | height: 100%; 56 | overflow: hidden; 57 | outline-width: 1px; 58 | outline-style: solid; 59 | outline-color: #69f; 60 | outline-color: rgba(51, 102, 255, .75); 61 | } 62 | 63 | .cropper-dashed { 64 | position: absolute; 65 | display: block; 66 | border: 0 dashed #fff; 67 | opacity: .5; 68 | filter: alpha(opacity=50); 69 | } 70 | 71 | .cropper-dashed.dashed-h { 72 | top: 33.3%; 73 | left: 0; 74 | width: 100%; 75 | height: 33.3%; 76 | border-top-width: 1px; 77 | border-bottom-width: 1px; 78 | } 79 | 80 | .cropper-dashed.dashed-v { 81 | top: 0; 82 | left: 33.3%; 83 | width: 33.3%; 84 | height: 100%; 85 | border-right-width: 1px; 86 | border-left-width: 1px; 87 | } 88 | 89 | .cropper-face, 90 | .cropper-line, 91 | .cropper-point { 92 | position: absolute; 93 | display: block; 94 | width: 100%; 95 | height: 100%; 96 | opacity: .1; 97 | filter: alpha(opacity=10); 98 | } 99 | 100 | .cropper-face { 101 | top: 0; 102 | left: 0; 103 | cursor: move; 104 | background-color: #fff; 105 | } 106 | 107 | .cropper-line { 108 | background-color: #69f; 109 | } 110 | 111 | .cropper-line.line-e { 112 | top: 0; 113 | right: -3px; 114 | width: 5px; 115 | cursor: e-resize; 116 | } 117 | 118 | .cropper-line.line-n { 119 | top: -3px; 120 | left: 0; 121 | height: 5px; 122 | cursor: n-resize; 123 | } 124 | 125 | .cropper-line.line-w { 126 | top: 0; 127 | left: -3px; 128 | width: 5px; 129 | cursor: w-resize; 130 | } 131 | 132 | .cropper-line.line-s { 133 | bottom: -3px; 134 | left: 0; 135 | height: 5px; 136 | cursor: s-resize; 137 | } 138 | 139 | .cropper-point { 140 | width: 5px; 141 | height: 5px; 142 | background-color: #69f; 143 | opacity: .75; 144 | filter: alpha(opacity=75); 145 | } 146 | 147 | .cropper-point.point-e { 148 | top: 50%; 149 | right: -3px; 150 | margin-top: -3px; 151 | cursor: e-resize; 152 | } 153 | 154 | .cropper-point.point-n { 155 | top: -3px; 156 | left: 50%; 157 | margin-left: -3px; 158 | cursor: n-resize; 159 | } 160 | 161 | .cropper-point.point-w { 162 | top: 50%; 163 | left: -3px; 164 | margin-top: -3px; 165 | cursor: w-resize; 166 | } 167 | 168 | .cropper-point.point-s { 169 | bottom: -3px; 170 | left: 50%; 171 | margin-left: -3px; 172 | cursor: s-resize; 173 | } 174 | 175 | .cropper-point.point-ne { 176 | top: -3px; 177 | right: -3px; 178 | cursor: ne-resize; 179 | } 180 | 181 | .cropper-point.point-nw { 182 | top: -3px; 183 | left: -3px; 184 | cursor: nw-resize; 185 | } 186 | 187 | .cropper-point.point-sw { 188 | bottom: -3px; 189 | left: -3px; 190 | cursor: sw-resize; 191 | } 192 | 193 | .cropper-point.point-se { 194 | right: -3px; 195 | bottom: -3px; 196 | width: 20px; 197 | height: 20px; 198 | cursor: se-resize; 199 | opacity: 1; 200 | filter: alpha(opacity=100); 201 | } 202 | 203 | .cropper-point.point-se:before { 204 | position: absolute; 205 | right: -50%; 206 | bottom: -50%; 207 | display: block; 208 | width: 200%; 209 | height: 200%; 210 | content: " "; 211 | background-color: #69f; 212 | opacity: 0; 213 | filter: alpha(opacity=0); 214 | } 215 | 216 | @media (min-width: 768px) { 217 | .cropper-point.point-se { 218 | width: 15px; 219 | height: 15px; 220 | } 221 | } 222 | 223 | @media (min-width: 992px) { 224 | .cropper-point.point-se { 225 | width: 10px; 226 | height: 10px; 227 | } 228 | } 229 | 230 | @media (min-width: 1200px) { 231 | .cropper-point.point-se { 232 | width: 5px; 233 | height: 5px; 234 | opacity: .75; 235 | filter: alpha(opacity=75); 236 | } 237 | } 238 | 239 | /* Helper classes for JavaScript */ 240 | 241 | .cropper-hidden { 242 | display: none !important; 243 | } 244 | 245 | .cropper-invisible { 246 | position: fixed; 247 | top: 0; 248 | left: 0; 249 | z-index: -1; 250 | width: auto !important; 251 | max-width: none !important; 252 | height: auto !important; 253 | max-height: none !important; 254 | opacity: 0; 255 | filter: alpha(opacity=0); 256 | } 257 | 258 | .cropper-move { 259 | cursor: move; 260 | } 261 | 262 | .cropper-crop { 263 | cursor: crosshair; 264 | } 265 | 266 | .cropper-disabled .cropper-canvas, 267 | .cropper-disabled .cropper-face, 268 | .cropper-disabled .cropper-line, 269 | .cropper-disabled .cropper-point { 270 | cursor: not-allowed; 271 | } 272 | -------------------------------------------------------------------------------- /public/js/lib/toast/toast.css: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | 3 | 4 | /* line 116, C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ 5 | article, aside, details, figcaption, figure, footer, header, hgroup, main, menu, nav, section, summary { 6 | display: block; 7 | } 8 | 9 | /* line 13, ../sass/toast.scss */ 10 | .cpt-toast { 11 | position: fixed; 12 | left: 50%; 13 | top: 50%; 14 | text-align: center; 15 | animation-duration: 0.3s; 16 | max-width: 300px; 17 | line-height: 20px; 18 | display: inline-block; 19 | vertical-align: middle; 20 | *vertical-align: auto; 21 | *zoom: 1; 22 | *display: inline; 23 | -moz-transition: all 0.3s ease; 24 | -o-transition: all 0.3s ease; 25 | -webkit-transition: all 0.3s ease; 26 | transition: all 0.3s ease; 27 | transform: translate(-50%, -50%); 28 | transform: translate3d(-50%, -50%, 0); 29 | font-family: '微软雅黑','Microsoft Yahei'; 30 | -moz-user-select: -moz-none; 31 | -ms-user-select: none; 32 | -webkit-user-select: none; 33 | user-select: none; 34 | word-wrap: break-word; 35 | } 36 | -------------------------------------------------------------------------------- /public/js/lib/toast/toast.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | (function($,window){ 3 | //动态加载animate 4 | var loadStyles = function(url) { 5 | var hasSameStyle = false; 6 | var links = $('link'); 7 | for(var i = 0;i").css({ 76 | "position":opt.position, 77 | "padding":opt.padding, 78 | "background":opt.background, 79 | "font-size":opt.fontSize, 80 | "-webkit-border-radius":opt.borderRadius, 81 | "-moz-border-radius":opt.borderRadius, 82 | "border-radius":opt.borderRadius, 83 | "color":opt.color, 84 | "top":top, 85 | "z-index":opt.zIndex, 86 | "-webkit-transform":'translate3d(-50%,-50%,0)', 87 | "-moz-transform":'translate3d(-50%,-50%,0)', 88 | "transform":'translate3d(-50%,-50%,0)', 89 | '-webkit-animation-duration':opt.animateDuration/1000+'s', 90 | '-moz-animation-duration':opt.animateDuration/1000+'s', 91 | 'animation-duration':opt.animateDuration/1000+'s', 92 | }).html(opt.content).appendTo($this); 93 | defaults.colseMessage(); 94 | } 95 | 96 | defaults.colseMessage = function(){ 97 | var isLowerIe9 = defaults.isLowerIe9(); 98 | if(!isLowerIe9){ 99 | t = setTimeout(function(){ 100 | box.removeClass(opt.animateIn).addClass(opt.animateOut).on('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend',function(){ 101 | box.remove(); 102 | }); 103 | },opt.duration); 104 | }else{ 105 | t = setTimeout(function(){ 106 | box.remove(); 107 | },opt.duration); 108 | } 109 | } 110 | 111 | defaults.createMessage(); 112 | }) 113 | }; 114 | })(jQuery,window); 115 | 116 | 117 | var showMessage = function(content,duration,isCenter,animateIn,animateOut){ 118 | var animateIn = animateIn || 'fadeIn'; 119 | var animateOut = animateOut || 'fadeOut'; 120 | var content = content || '这是一个提示信息'; 121 | var duration = duration || '3000'; 122 | var isCenter = isCenter || false; 123 | $('body').toast({ 124 | position:'fixed', 125 | animateIn:animateIn, 126 | animateOut:animateOut, 127 | content:content, 128 | duration:duration, 129 | isCenter:isCenter, 130 | }); 131 | } -------------------------------------------------------------------------------- /public/js/views/index.js: -------------------------------------------------------------------------------- 1 | // import { connect } from "net"; 2 | 3 | $(function() { 4 | // var $titletext = $("#yj-title-text"); 5 | var $contenttext = $("#yj-content-text"); 6 | var $publishbtn = $("#yj-publish-btn"); 7 | var $yjcontent = $("#yj-content"); 8 | 9 | //当前页数 10 | var queryname = 0; 11 | 12 | // 帖子总数 13 | var total = doTotal(); 14 | 15 | //显示说说 16 | var showInde = showTongueAjax(queryname); 17 | 18 | //上一页按钮 19 | var $yjpreviousbox = $("#yj-previous-box"); 20 | //下一页按钮 21 | var $yjnextbox = $("#yj-next-box"); 22 | 23 | //页面第一加载时 显示帖子 24 | showPost(showInde); 25 | 26 | //分页的显示 27 | showPaging(); 28 | 29 | //发表 30 | $publishbtn.click(function() { 31 | var titletext = "1"; 32 | var contenttext = $contenttext.val(); 33 | 34 | if(titletext == "" || null) { 35 | showMessage("嘿!你的标题呢!"); 36 | } else if(contenttext == "" || null) { 37 | showMessage("嘿!你的内容呢!"); 38 | } else { 39 | var returntext = addajax(titletext, contenttext); 40 | 41 | if(returntext == 110) { 42 | showMessage("嘿!系统错误!"); 43 | } else if(returntext == 104) { 44 | showMessage("嘿!提交错误了!"); 45 | 46 | } else if(returntext == 201) { 47 | showMessage("嘿!你成功提交了!"); 48 | //清空文本框 49 | //$titletext.val(""); 50 | $contenttext.val(""); 51 | 52 | //显示说说 53 | var showIndes = showTongueAjax(0); 54 | showPost(showIndes); 55 | } 56 | } 57 | 58 | }); 59 | 60 | //上一页 61 | $yjpreviousbox.click(function() { 62 | var pag = $(this).attr("name") 63 | queryname = pag; 64 | showInde = showTongueAjax(pag); 65 | showPost(showInde); 66 | showPaging(); 67 | 68 | }); 69 | 70 | //下一页 71 | $yjnextbox.click(function() { 72 | var pag = $(this).attr("name"); 73 | queryname = pag; 74 | console.log(queryname) 75 | showInde = showTongueAjax(pag); 76 | showPost(showInde); 77 | showPaging(); 78 | }); 79 | 80 | //--------------方法------------- 81 | 82 | //头像 83 | //如果后台头像数据为空 设置默认头像 84 | function headimg(imgsrc) { 85 | if(imgsrc == null) { 86 | var img = "/avatar/mr.png"; 87 | return img; 88 | } else { 89 | return imgsrc; 90 | } 91 | } 92 | 93 | //类似微信微博时间显示 94 | //dateStr=2017-05-10 15:00:00 95 | function getDateDiff(dateStr) { 96 | var publishTime = getDateTimeStamp(dateStr) / 1000, 97 | d_seconds, 98 | d_minutes, 99 | d_hours, 100 | d_days, 101 | timeNow = parseInt(new Date().getTime() / 1000), 102 | d, 103 | 104 | date = new Date(publishTime * 1000), 105 | Y = date.getFullYear(), 106 | M = date.getMonth() + 1, 107 | D = date.getDate(), 108 | H = date.getHours(), 109 | m = date.getMinutes(), 110 | s = date.getSeconds(); 111 | //小于10的在前面补0 112 | if(M < 10) { 113 | M = '0' + M; 114 | } 115 | if(D < 10) { 116 | D = '0' + D; 117 | } 118 | if(H < 10) { 119 | H = '0' + H; 120 | } 121 | if(m < 10) { 122 | m = '0' + m; 123 | } 124 | if(s < 10) { 125 | s = '0' + s; 126 | } 127 | 128 | d = timeNow - publishTime; 129 | d_days = parseInt(d / 86400); 130 | d_hours = parseInt(d / 3600); 131 | d_minutes = parseInt(d / 60); 132 | d_seconds = parseInt(d); 133 | 134 | if(d_days > 0 && d_days < 3) { 135 | return d_days + '天前'; 136 | } else if(d_days <= 0 && d_hours > 0) { 137 | return d_hours + '小时前'; 138 | } else if(d_hours <= 0 && d_minutes > 0) { 139 | return d_minutes + '分钟前'; 140 | } else if(d_seconds < 60) { 141 | if(d_seconds <= 0) { 142 | return '刚刚'; 143 | } else { 144 | return d_seconds + '秒前'; 145 | } 146 | } else if(d_days >= 3 && d_days < 30) { 147 | return M + '-' + D + ' ' + H + ':' + m; 148 | } else if(d_days >= 30) { 149 | return Y + '-' + M + '-' + D + ' ' + H + ':' + m; 150 | } 151 | } 152 | 153 | 154 | function getDateTimeStamp(dateStr) { 155 | return Date.parse(dateStr.replace(/-/gi, "/")); 156 | } 157 | 158 | 159 | 160 | //显示帖子 161 | function showPost(showinfo) { 162 | console.log(222222) 163 | if(showinfo == 110) { 164 | showMessage("嘿!系统错误!"); 165 | } else if(showinfo == 201) { 166 | showMessage("嘿!没有人百舌!"); 167 | } else { 168 | $yjcontent.html(""); 169 | var htmls = ""; 170 | if(!(showinfo == "" || null)) { 171 | for(var i = 0; i < showinfo.length; i++) { 172 | htmls = htmls + '
' + 173 | '
' + 174 | '' + 175 | '' + 176 | '' + 177 | '' + 178 | '' + showinfo[i].name + '' + 179 | '' + getDateDiff(showinfo[i].time) + '' + 180 | '' + 181 | '
' + 182 | '

' + showinfo[i].content + '

' + 183 | '

' + 184 | '详情 »' + 185 | '

' + 186 | '
' 187 | } 188 | $yjcontent.append(htmls) 189 | } 190 | 191 | } 192 | } 193 | 194 | //分页显示 195 | function showPaging() { 196 | 197 | //总页数 198 | var allpage = Math.ceil(parseInt(total) / 16); 199 | if(queryname == 0) { 200 | $yjpreviousbox.addClass("disabled"); 201 | $yjnextbox.removeClass("disabled"); 202 | 203 | } else if(queryname == allpage) { 204 | $yjpreviousbox.removeClass("disabled"); 205 | $yjnextbox.addClass("disabled"); 206 | } else { 207 | $yjpreviousbox.removeClass("disabled"); 208 | $yjnextbox.removeClass("disabled") 209 | } 210 | 211 | $yjpreviousbox.attr("name", parseInt(queryname) - 1); 212 | $yjnextbox.attr("name", parseInt(queryname) + 1); 213 | 214 | } 215 | 216 | //-------------ajax------------- 217 | //提交帖子 218 | function addajax(titletext, contenttext) { 219 | var i = ""; 220 | $.ajax({ 221 | type: "post", 222 | url: "/doPublish", 223 | async: false, 224 | data: { 225 | title: titletext, 226 | content: contenttext 227 | }, 228 | dataType: "json", 229 | success: function(result) { 230 | i = result; 231 | } 232 | }); 233 | return i; 234 | } 235 | //显示帖子 236 | function showTongueAjax(page) { 237 | var i = ""; 238 | $.ajax({ 239 | type: "get", 240 | url: "/doShowTongue", 241 | data: "page=" + page, 242 | async: false, 243 | dataType: "json", 244 | success: function(result) { 245 | i = result; 246 | } 247 | }); 248 | return i; 249 | } 250 | 251 | //显示帖子总数 252 | function doTotal() { 253 | var i = ""; 254 | $.ajax({ 255 | type: "post", 256 | url: "/doTotal", 257 | async: false, 258 | dataType: "json", 259 | success: function(result) { 260 | i = result; 261 | } 262 | }); 263 | return i; 264 | } 265 | 266 | }); -------------------------------------------------------------------------------- /public/js/views/memberlist.js: -------------------------------------------------------------------------------- 1 | $(function() { 2 | // var $titletext = $("#yj-title-text"); 3 | var $contenttext = $("#yj-content-text"); 4 | var $publishbtn = $("#yj-publish-btn"); 5 | var $yjcontent = $("#yj-content"); 6 | 7 | //当前页数 8 | var queryname = 0; 9 | 10 | // 帖子总数 11 | var total = doListTotal(); 12 | 13 | //显示说说 14 | var showInde = showTongueAjax(queryname); 15 | 16 | //上一页按钮 17 | var $yjpreviousbox = $("#yj-previous-box"); 18 | //下一页按钮 19 | var $yjnextbox = $("#yj-next-box"); 20 | 21 | //页面第一加载时 显示用户 22 | showPost(showInde); 23 | 24 | //分页的显示 25 | showPaging(); 26 | 27 | //上一页 28 | $yjpreviousbox.click(function() { 29 | var pag = $(this).attr("name") 30 | queryname = pag; 31 | showInde = showTongueAjax(pag); 32 | showPost(showInde); 33 | showPaging(); 34 | 35 | }); 36 | 37 | //下一页 38 | $yjnextbox.click(function() { 39 | var pag = $(this).attr("name"); 40 | queryname = pag; 41 | console.log(queryname) 42 | showInde = showTongueAjax(pag); 43 | showPost(showInde); 44 | showPaging(); 45 | }); 46 | 47 | //--------------方法------------- 48 | 49 | //头像 50 | //如果后台头像数据为空 设置默认头像 51 | function headimg(imgsrc) { 52 | if(imgsrc == null) { 53 | var img = "/avatar/mr.png"; 54 | return img; 55 | } else { 56 | return imgsrc; 57 | } 58 | } 59 | 60 | 61 | //显示用户 62 | function showPost(showinfo) { 63 | if(showinfo == 110) { 64 | showMessage("嘿!系统错误!"); 65 | } else if(showinfo == 201) { 66 | showMessage("嘿!没有注册百舌了!"); 67 | } else { 68 | $yjcontent.html(""); 69 | var htmls = ""; 70 | if(!(showinfo == "" || null)) { 71 | for(var i = 0; i < showinfo.length; i++) { 72 | htmls = htmls + '
' + 73 | '
' + 74 | '' + 75 | '' + 76 | '' + 77 | '' + 78 | '' + showinfo[i].username + '' + 79 | '' + 80 | '
' + 81 | '
' 82 | } 83 | $yjcontent.append(htmls) 84 | } 85 | } 86 | } 87 | 88 | //分页显示 89 | function showPaging() { 90 | 91 | //总页数 92 | var allpage = Math.ceil(parseInt(total) / 16); 93 | if(queryname == 0) { 94 | $yjpreviousbox.addClass("disabled"); 95 | $yjnextbox.removeClass("disabled"); 96 | 97 | } else if(queryname == allpage) { 98 | $yjpreviousbox.removeClass("disabled"); 99 | $yjnextbox.addClass("disabled"); 100 | } else { 101 | $yjpreviousbox.removeClass("disabled"); 102 | $yjnextbox.removeClass("disabled") 103 | } 104 | 105 | $yjpreviousbox.attr("name", parseInt(queryname) - 1); 106 | $yjnextbox.attr("name", parseInt(queryname) + 1); 107 | 108 | } 109 | 110 | //-------------ajax------------- 111 | 112 | //显示用户 113 | function showTongueAjax(page) { 114 | var i = ""; 115 | $.ajax({ 116 | type: "get", 117 | url: "/doShowList", 118 | data: "page=" + page, 119 | async: false, 120 | dataType: "json", 121 | success: function(result) { 122 | i = result; 123 | } 124 | }); 125 | return i; 126 | } 127 | 128 | //显示用户总数 129 | function doListTotal() { 130 | var i = ""; 131 | $.ajax({ 132 | type: "post", 133 | url: "/doListTotal", 134 | async: false, 135 | dataType: "json", 136 | success: function(result) { 137 | i = result; 138 | } 139 | }); 140 | return i; 141 | } 142 | 143 | }); -------------------------------------------------------------------------------- /public/js/views/personal.js: -------------------------------------------------------------------------------- 1 | $(function() { 2 | //**********图片裁剪************* 3 | //-------全局变量----- 4 | var $image = $(".cropper"), 5 | $sjupdatebtn = $("#sj-update-btn"), 6 | dataURL = "", 7 | console = window.console || { 8 | log: $.noop 9 | }, 10 | cropper; 11 | //上传图片 12 | $('#file').change(function() { 13 | // 获取上传文件名 14 | var path = $('#file').val(); 15 | 16 | var start = path.lastIndexOf('.'); 17 | var fileName = path.substring(start, path.length).toLowerCase(); 18 | 19 | // 判断是否是图片 20 | if(fileName != '.png' && fileName != '.jpg' && fileName != '.jpeg' && fileName != '.bmp' && fileName != '.gif') { 21 | showMessage("该文件不是图片!"); 22 | } else { 23 | 24 | var upload = document.getElementById('file'); 25 | var file = upload.files[0]; 26 | var reader = new FileReader(); 27 | 28 | //将文件以Data URL形式读入页面 29 | reader.readAsDataURL(file); 30 | 31 | 32 | reader.onload = function() { 33 | var url = this.result; 34 | $image.attr("src", url); 35 | //图片裁剪 36 | cropper(); 37 | } 38 | } 39 | }) 40 | 41 | //点击修改 42 | $sjupdatebtn.click(function() { 43 | 44 | var $qqname = $("#qqname").val() ; 45 | var $phone = $("#phone").val(); 46 | var $email = $("#email").val(); 47 | var $sex = $("#sex").val(); 48 | var $file = $('#file').val()|| 1; 49 | 50 | //验证QQ号 51 | 52 | if(!/^[1-9][0-9]{4,}/i.test($qqname)) { 53 | showMessage("请输入正确的QQ号!"); 54 | } 55 | //验证手机号 56 | else if(!/^(13[0-9]|14[0-9]|15[0-9]|16[0-9]|17[0-9]|18[0-9]|19[0-9])\d{8}$/i.test($phone)) { 57 | showMessage("请输入正确的手机号!"); 58 | } 59 | 60 | //验证邮箱 61 | else if(!/^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/i.test($email)) { 62 | showMessage("请输入正确的邮箱"); 63 | 64 | } else { 65 | 66 | if($file != 1) { 67 | 68 | dataURL = $image.cropper("getDataURL", { 69 | width: 50, 70 | height: 50 71 | }); 72 | } 73 | 74 | var returntext = updateajax($qqname, $phone, $email, $sex ,dataURL) 75 | 76 | 77 | if(returntext == 110) { 78 | showMessage("系统错误!"); 79 | } else if(returntext == 101) { 80 | showMessage("提交失败!"); 81 | } else if(returntext == 201) { 82 | showMessage("修改成功!三秒后将跳回到首页"); 83 | setTimeout(function() { 84 | window.location = "/"; 85 | }, 3000); 86 | } 87 | } 88 | 89 | 90 | }); 91 | 92 | //------------方法------------------- 93 | //加载 图片裁剪 94 | function cropper() { 95 | $image.cropper({ 96 | aspectRatio: 1 / 1, 97 | data: { 98 | x: 100, 99 | y: 100, 100 | width: 200, 101 | height: 200 102 | }, 103 | preview: ".preview", 104 | build: function(e) { 105 | console.log(e.type); 106 | }, 107 | 108 | built: function(e) { 109 | console.log(e.type); 110 | }, 111 | 112 | dragstart: function(e) { 113 | console.log(e.type); 114 | }, 115 | 116 | dragmove: function(e) { 117 | console.log(e.type); 118 | }, 119 | dragend: function(e) { 120 | console.log(e.type); 121 | } 122 | }); 123 | } 124 | 125 | //-------------------ajax------------- 126 | function updateajax(qqname, phone, email,sex, dataURL) { 127 | var i = ""; 128 | $.ajax({ 129 | type: "post", 130 | url: "/doPersonal", 131 | async: false, 132 | data: { 133 | qqname: qqname, 134 | phone: phone, 135 | email:email, 136 | sex:sex, 137 | dataURL:dataURL 138 | }, 139 | dataType: "json", 140 | success: function(result) { 141 | // console.log(result) 142 | i = result; 143 | } 144 | }); 145 | return i; 146 | } 147 | }); -------------------------------------------------------------------------------- /public/js/views/post.js: -------------------------------------------------------------------------------- 1 | $(function() { 2 | 3 | var $yjpostbtn = $("#yj-post-btn"); 4 | var $yjpostcomment = $("#yj-post-comment"); 5 | 6 | var $yjcontent = $("#yj-content"); 7 | 8 | //帖子 id 9 | var ids = $yjpostcomment.attr("name"); 10 | 11 | //评论 数据 12 | var showComment = showCommentajax(ids); 13 | //显示 评论 14 | showC(showComment); 15 | 16 | //提交评论 17 | $yjpostbtn.click(function() { 18 | var yjpostcomment = $yjpostcomment.val(); 19 | 20 | if(yjpostcomment == "") { 21 | showMessage("嘿!你的评论呢!"); 22 | } else { 23 | console.log(yjpostcomment) 24 | var commenttext = commentajax(yjpostcomment, ids); 25 | 26 | if(commenttext == 110) { 27 | showMessage("你的评论失败了!"); 28 | } else if(commenttext == 101) { 29 | showMessage("你的评论被系统吞噬了!"); 30 | } else if(commenttext == 200) { 31 | //评论 数据 32 | var showComment = showCommentajax(ids); 33 | //显示 评论 34 | showC(showComment); 35 | /* 清空评论 */ 36 | $yjpostcomment.val(""); 37 | showMessage("你的评论被系统认同!"); 38 | } 39 | } 40 | }); 41 | 42 | //----------方法---------- 43 | 44 | function showC(showinfo) { 45 | if(showinfo == 110) { 46 | showMessage("嘿!系统错误!"); 47 | } else { 48 | $yjcontent.html(""); 49 | var htmls = ""; 50 | if(!(showinfo == "" || null)) { 51 | for(var i = 0; i < showinfo.length; i++) { 52 | htmls = htmls + '
' + 53 | '
' + 54 | '' + 55 | '' + 56 | '' + 57 | '' + 58 | '' + showinfo[i].postname + '' + 59 | '' + getDateDiff(showinfo[i].posttime) + '' + 60 | '' + 61 | '
' + 62 | '

' + showinfo[i].postcontents + '

' + 63 | '
' 64 | } 65 | $yjcontent.append(htmls) 66 | } 67 | } 68 | } 69 | 70 | //头像 71 | //如果后台头像数据为空 设置默认头像 72 | function headimg(imgsrc) { 73 | if(imgsrc == null) { 74 | var img = "/avatar/mr.png"; 75 | return img; 76 | } else { 77 | return imgsrc; 78 | } 79 | } 80 | 81 | //类似微信微博时间显示 82 | //dateStr=2017-05-10 15:00:00 83 | function getDateDiff(dateStr) { 84 | var publishTime = getDateTimeStamp(dateStr) / 1000, 85 | d_seconds, 86 | d_minutes, 87 | d_hours, 88 | d_days, 89 | timeNow = parseInt(new Date().getTime() / 1000), 90 | d, 91 | 92 | date = new Date(publishTime * 1000), 93 | Y = date.getFullYear(), 94 | M = date.getMonth() + 1, 95 | D = date.getDate(), 96 | H = date.getHours(), 97 | m = date.getMinutes(), 98 | s = date.getSeconds(); 99 | //小于10的在前面补0 100 | if(M < 10) { 101 | M = '0' + M; 102 | } 103 | if(D < 10) { 104 | D = '0' + D; 105 | } 106 | if(H < 10) { 107 | H = '0' + H; 108 | } 109 | if(m < 10) { 110 | m = '0' + m; 111 | } 112 | if(s < 10) { 113 | s = '0' + s; 114 | } 115 | 116 | d = timeNow - publishTime; 117 | d_days = parseInt(d / 86400); 118 | d_hours = parseInt(d / 3600); 119 | d_minutes = parseInt(d / 60); 120 | d_seconds = parseInt(d); 121 | 122 | if(d_days > 0 && d_days < 3) { 123 | return d_days + '天前'; 124 | } else if(d_days <= 0 && d_hours > 0) { 125 | return d_hours + '小时前'; 126 | } else if(d_hours <= 0 && d_minutes > 0) { 127 | return d_minutes + '分钟前'; 128 | } else if(d_seconds < 60) { 129 | if(d_seconds <= 0) { 130 | return '刚刚'; 131 | } else { 132 | return d_seconds + '秒前'; 133 | } 134 | } else if(d_days >= 3 && d_days < 30) { 135 | return M + '-' + D + ' ' + H + ':' + m; 136 | } else if(d_days >= 30) { 137 | return Y + '-' + M + '-' + D + ' ' + H + ':' + m; 138 | } 139 | } 140 | 141 | function getDateTimeStamp(dateStr) { 142 | return Date.parse(dateStr.replace(/-/gi, "/")); 143 | } 144 | 145 | //---------------ajax------------ 146 | 147 | function showCommentajax(ids) { 148 | var i = ""; 149 | $.ajax({ 150 | type: "post", 151 | url: "/showComment", 152 | async: false, 153 | data: { 154 | ids: ids 155 | }, 156 | dataType: "json", 157 | success: function(result) { 158 | i = result; 159 | } 160 | }); 161 | return i; 162 | } 163 | 164 | //提交评论 165 | function commentajax(postcomment, ids) { 166 | var i = ""; 167 | $.ajax({ 168 | type: "post", 169 | url: "/doPostcomment", 170 | async: false, 171 | data: { 172 | content: postcomment, 173 | ids: ids 174 | }, 175 | dataType: "json", 176 | success: function(result) { 177 | i = result; 178 | } 179 | }); 180 | return i; 181 | } 182 | 183 | }) -------------------------------------------------------------------------------- /public/js/views/user.js: -------------------------------------------------------------------------------- 1 | $(function() { 2 | 3 | var $yjcontent = $("#yj-content"); 4 | var $yjusername = $("#yj-user-name"); 5 | var $yjimgname = $("#yj-imgname"); 6 | 7 | 8 | 9 | //当前页数 10 | var queryname = 0; 11 | 12 | //当前用户名 13 | var yjusername =$yjusername.text(); 14 | var yjimgname =$yjimgname.attr("src"); 15 | 16 | // 帖子总数 17 | var total = doTotal(yjusername); 18 | 19 | //上一页按钮 20 | var $yjpreviousbox = $("#yj-previous-box"); 21 | //下一页按钮 22 | var $yjnextbox = $("#yj-next-box"); 23 | 24 | 25 | //个人帖子数据 26 | var showInde = showUserTongue(queryname,yjusername); 27 | //显示帖子 28 | showPost(showInde); 29 | //分页的显示 30 | showPaging(); 31 | 32 | //上一页 33 | $yjpreviousbox.click(function() { 34 | var pag = $(this).attr("name") 35 | queryname = pag; 36 | //个人帖子数据 37 | showInde = showUserTongue(queryname,yjusername); 38 | showPost(showInde); 39 | showPaging(); 40 | }); 41 | 42 | 43 | //下一页 44 | $yjnextbox.click(function() { 45 | var pag = $(this).attr("name"); 46 | queryname = pag; 47 | showInde = showUserTongue(queryname,yjusername); 48 | showPost(showInde); 49 | showPaging(); 50 | }); 51 | 52 | 53 | 54 | 55 | 56 | //----------------方法------------ 57 | //显示帖子 58 | function showPost(showinfo) { 59 | if(showinfo == 110) { 60 | showMessage("嘿!系统错误!"); 61 | } else if(showinfo == 201) { 62 | showMessage("嘿!没有人百舌!"); 63 | } else { 64 | $yjcontent.html(""); 65 | var htmls = ""; 66 | if(!(showinfo == "" || null)) { 67 | for(var i = 0; i < showinfo.length; i++) { 68 | 69 | htmls = htmls + '
' + 70 | '
' + 71 | '' + 72 | '' + 73 | '' + 74 | '' + 75 | '' + yjusername + '' + 76 | '' + getDateDiff(showinfo[i].time) + '' + 77 | '' + 78 | '
' + 79 | '

' + showinfo[i].content + '

' + 80 | '

' + 81 | ' 详情 »' + 82 | '

' + 83 | '
' 84 | } 85 | $yjcontent.append(htmls) 86 | } 87 | } 88 | } 89 | 90 | //类似微信微博时间显示 91 | //dateStr=2017-05-10 15:00:00 92 | function getDateDiff(dateStr) { 93 | var publishTime = getDateTimeStamp(dateStr) / 1000, 94 | d_seconds, 95 | d_minutes, 96 | d_hours, 97 | d_days, 98 | timeNow = parseInt(new Date().getTime() / 1000), 99 | d, 100 | 101 | date = new Date(publishTime * 1000), 102 | Y = date.getFullYear(), 103 | M = date.getMonth() + 1, 104 | D = date.getDate(), 105 | H = date.getHours(), 106 | m = date.getMinutes(), 107 | s = date.getSeconds(); 108 | //小于10的在前面补0 109 | if(M < 10) { 110 | M = '0' + M; 111 | } 112 | if(D < 10) { 113 | D = '0' + D; 114 | } 115 | if(H < 10) { 116 | H = '0' + H; 117 | } 118 | if(m < 10) { 119 | m = '0' + m; 120 | } 121 | if(s < 10) { 122 | s = '0' + s; 123 | } 124 | 125 | d = timeNow - publishTime; 126 | d_days = parseInt(d / 86400); 127 | d_hours = parseInt(d / 3600); 128 | d_minutes = parseInt(d / 60); 129 | d_seconds = parseInt(d); 130 | 131 | if(d_days > 0 && d_days < 3) { 132 | return d_days + '天前'; 133 | } else if(d_days <= 0 && d_hours > 0) { 134 | return d_hours + '小时前'; 135 | } else if(d_hours <= 0 && d_minutes > 0) { 136 | return d_minutes + '分钟前'; 137 | } else if(d_seconds < 60) { 138 | if(d_seconds <= 0) { 139 | return '刚刚'; 140 | } else { 141 | return d_seconds + '秒前'; 142 | } 143 | } else if(d_days >= 3 && d_days < 30) { 144 | return M + '-' + D + ' ' + H + ':' + m; 145 | } else if(d_days >= 30) { 146 | return Y + '-' + M + '-' + D + ' ' + H + ':' + m; 147 | } 148 | } 149 | 150 | function getDateTimeStamp(dateStr) { 151 | return Date.parse(dateStr.replace(/-/gi, "/")); 152 | } 153 | 154 | 155 | //分页显示 156 | function showPaging() { 157 | 158 | //总页数 159 | var allpage = Math.ceil(parseInt(total) / 16); 160 | 161 | if(queryname == 0) { 162 | $yjpreviousbox.addClass("disabled"); 163 | 164 | if(allpage>1){ 165 | $yjnextbox.removeClass("disabled"); 166 | }else{ 167 | $yjnextbox.addClass("disabled"); 168 | } 169 | 170 | } else if(queryname == allpage) { 171 | $yjpreviousbox.removeClass("disabled"); 172 | $yjnextbox.addClass("disabled"); 173 | } else { 174 | $yjpreviousbox.removeClass("disabled"); 175 | $yjnextbox.removeClass("disabled") 176 | } 177 | 178 | $yjpreviousbox.attr("name", parseInt(queryname) - 1); 179 | $yjnextbox.attr("name", parseInt(queryname) + 1); 180 | 181 | } 182 | 183 | 184 | 185 | //----------------ajax------------ 186 | //个人全部帖子 187 | function showUserTongue(page,name) { 188 | var i = ""; 189 | $.ajax({ 190 | type: "get", 191 | url: "/doshowUserTongue", 192 | data: "page=" + page+"&name="+name, 193 | async: false, 194 | dataType: "json", 195 | success: function(result) { 196 | i = result; 197 | } 198 | }); 199 | return i; 200 | } 201 | 202 | 203 | //显示帖子总数 204 | function doTotal(name) { 205 | var i = ""; 206 | $.ajax({ 207 | type: "get", 208 | url: "/doUserTotal", 209 | data: "name="+name, 210 | async: false, 211 | dataType: "json", 212 | success: function(result) { 213 | i = result; 214 | } 215 | }); 216 | return i; 217 | } 218 | 219 | }) -------------------------------------------------------------------------------- /router/router.js: -------------------------------------------------------------------------------- 1 | var formidable = require("formidable"); 2 | var db = require("../model/db.js"); 3 | var md5 = require("../model/md5.js"); 4 | var file = require("../model/file.js"); 5 | var fun = require("../model/fun.js"); 6 | 7 | var path = require("path"); 8 | 9 | //-----------首页页面----------- 10 | exports.showIndex = function (req, res, next) { 11 | res.render("index", { 12 | "login": req.session.login == 300 ? true : false, 13 | "username": req.session.login == 300 ? req.session.username : "" 14 | }); 15 | } 16 | 17 | //提交说说 18 | exports.doPublish = function (req, res, next) { 19 | 20 | //得到前台 用户填写的东西 21 | var form = new formidable.IncomingForm(); 22 | 23 | form.parse(req, function (err, fields, files) { 24 | //得到表单之后做的事情 25 | var title = fields.title; 26 | var content = fields.content; 27 | //时间 28 | var time = fun.getNowFormatDate(); 29 | 30 | //添加帖子 31 | db.insertOne("posts", { 32 | "title": title, 33 | "content": content, 34 | "name": req.session.username, 35 | "time": time, 36 | "ids": fun.postids().toString(), 37 | }, function (err, result) { 38 | if (err) { 39 | // 插入数据错误 40 | res.send("104") 41 | return; 42 | } 43 | //返回 201 告诉前台 添加成功 44 | res.send("201"); 45 | 46 | }) 47 | }); 48 | } 49 | //显示说说 50 | exports.doShowTongue = function (req, res, next) { 51 | 52 | var page = req.query.page; 53 | 54 | //查询所有的说说 55 | db.find("posts", {}, { 56 | "pageamount": 16, 57 | "page": page, 58 | "sort": { 59 | "ids": -1 60 | } 61 | }, function (err, result) { 62 | if (err) { 63 | // 查询出错 返回110 64 | res.send("110") 65 | return; 66 | } 67 | 68 | var postsjson = result; 69 | if (postsjson.length != 0) { 70 | //查询说说 的用户 71 | for (let i = 0; i < postsjson.length; i++) { 72 | db.find("users", { 73 | "username": postsjson[i].name, 74 | }, function (err, result) { 75 | if (err) { 76 | // 查询用户错误 返回111 77 | res.send("111"); 78 | return; 79 | } 80 | postsjson[i].img = result[0].headName; 81 | 82 | if ((i + 1) == postsjson.length) { 83 | //返回数据 84 | res.send(postsjson); 85 | } 86 | }); 87 | } 88 | 89 | } else { 90 | // 没有数据 91 | res.send("201"); 92 | return; 93 | } 94 | 95 | }); 96 | 97 | } 98 | 99 | //帖子总数 100 | exports.doTotal = function (req, res, next) { 101 | db.getAllCount("posts", function (results) { 102 | res.send(results.toString()); 103 | return; 104 | }); 105 | } 106 | 107 | //----------注册页面------------- 108 | exports.showRegister = function (req, res, next) { 109 | res.render("register"); 110 | } 111 | 112 | //注册业务 113 | exports.doRegister = function (req, res, next) { 114 | //得到前台 用户填写的东西 115 | var form = new formidable.IncomingForm(); 116 | 117 | form.parse(req, function (err, fields, files) { 118 | //得到表单之后做的事情 119 | var username = fields.username; 120 | var password = fields.password; 121 | 122 | //查询当前用户是否重名 123 | db.find("users", { 124 | "username": username 125 | }, function (err, result) { 126 | if (err) { 127 | // 查询出错 128 | res.send("103") 129 | return; 130 | } 131 | // 查到该用户 132 | if (result.length != 0) { 133 | //返回 101 告诉前台 该用户名已被占用 134 | res.send("101") 135 | return; 136 | } 137 | 138 | //设置MD5 加密 139 | password = md5(md5(password) + "treey"); 140 | 141 | var imgname = path.normalize("/avatar/mr.png"); 142 | 143 | //添加用户 144 | db.insertOne("users", { 145 | "username": username, 146 | "password": password, 147 | "headName": imgname, 148 | }, function (err, result) { 149 | if (err) { 150 | // 插入数据错误 151 | res.send("104") 152 | return; 153 | } 154 | //写入session 155 | req.session.login = "300"; 156 | req.session.username = username; 157 | 158 | //返回 200 告诉前台 该用户名可以被使用 159 | res.send("200"); 160 | 161 | }) 162 | 163 | }) 164 | 165 | }); 166 | 167 | } 168 | 169 | //----------登录页面------------- 170 | exports.showlogin = function (req, res, next) { 171 | res.render("login"); 172 | } 173 | //登录业务 174 | exports.doLogin = function (req, res, next) { 175 | //得到前台 用户填写的东西 176 | var form = new formidable.IncomingForm(); 177 | 178 | form.parse(req, function (err, fields, files) { 179 | //得到表单之后做的事情 180 | var username = fields.username; 181 | var password = fields.password; 182 | // console.log(username, password) 183 | 184 | //设置MD5 加密 185 | password = md5(md5(password) + "treey"); 186 | 187 | //查询当前用户是否存在 188 | db.find("users", { 189 | "username": username 190 | }, function (err, result) { 191 | if (err) { 192 | // 查询出错 返回110 193 | res.send("110") 194 | return; 195 | } 196 | // 查该用户 197 | if (result.length == 0) { 198 | //返回 101 告诉前台 该用户名不存在 199 | res.send("101") 200 | return; 201 | } 202 | //判断该用户 密码是否正确 203 | if (password == result[0].password) { 204 | 205 | //写入session 206 | req.session.login = "300"; 207 | req.session.username = username; 208 | req.session.imgname = result[0].headName; 209 | 210 | //返回 201 告诉前台 登录成功 211 | res.send("201") 212 | return; 213 | } else { 214 | //返回 102 告诉前台 密码错误 215 | res.send("102") 216 | return; 217 | } 218 | 219 | }); 220 | 221 | }); 222 | 223 | } 224 | 225 | //----------个人信息页面------------- 226 | exports.showPersonal = function (req, res, next) { 227 | 228 | //获取session 229 | var sessionlogin = req.session.login; 230 | 231 | var qqname = ""; 232 | var phone = ""; 233 | var email = ""; 234 | var sex = ""; 235 | var imgURL = ""; 236 | 237 | //获取是否登录 238 | if (sessionlogin == 300) { 239 | 240 | //查询当前用户 241 | db.find("users", { 242 | "username": req.session.username 243 | }, function (err, result) { 244 | if (err) { 245 | // 查询出错 返回110 246 | res.send("110") 247 | return; 248 | }; 249 | 250 | if (result.length != 0) { 251 | qqname = result[0].qqname; 252 | phone = result[0].phone; 253 | email = result[0].email; 254 | sex = result[0].sex; 255 | imgURL = result[0].headName; 256 | } 257 | 258 | //如果登录--显示个人信息 259 | res.render("personal", { 260 | "username": req.session.login == 300 ? req.session.username : "", 261 | "imgaddress": imgURL, 262 | "phone": phone, 263 | "email": email, 264 | "sex": sex, 265 | "qqname": qqname, 266 | 267 | }); 268 | 269 | }) 270 | 271 | } else { 272 | //如果没有登录--调到登录页面 273 | res.redirect("/login"); 274 | } 275 | 276 | } 277 | 278 | //个人信息业务 279 | exports.doPersonal = function (req, res, next) { 280 | 281 | //得到前台 用户填写的东西 282 | var form = new formidable.IncomingForm(); 283 | //获取当前用户的名字 284 | //当前用户的名字是唯一 285 | var username = req.session.username; 286 | var imgname = req.session.imgname; 287 | 288 | form.parse(req, function (err, fields, files) { 289 | 290 | //得到表单之后做的事情 291 | var qqname = fields.qqname; 292 | var phone = fields.phone; 293 | var email = fields.email; 294 | var sex = fields.sex; 295 | var dataURL = fields.dataURL; 296 | 297 | var headName = ""; 298 | 299 | //如果上传了头像就保存头像 300 | file.addFile(dataURL, function (err, textname) { 301 | 302 | if (err) { 303 | // 创建临时文件错误 返回110 304 | res.send("110") 305 | return; 306 | } 307 | 308 | //头像地址 309 | if (textname == null || "") { 310 | headName = imgname; 311 | } else { 312 | headName = "/avatar/user/" + textname; 313 | } 314 | 315 | //修改信息 316 | db.updateMany("users", { 317 | "username": username, 318 | }, { 319 | $set: { 320 | 'qqname': qqname, 321 | 'phone': phone, 322 | 'sex': sex, 323 | 'email': email, 324 | 'headName': headName 325 | }, 326 | }, function (err, result) { 327 | if (err) { 328 | // 更新出错 返回110 329 | res.send("110") 330 | return; 331 | } 332 | 333 | if (result.length == 0) { 334 | //修改失败 335 | res.send("101"); 336 | return; 337 | } else { 338 | //修改成功 339 | res.send("201"); 340 | return; 341 | } 342 | 343 | }) 344 | 345 | }) 346 | 347 | }); 348 | 349 | } 350 | 351 | //----------个人信息页面------------- 352 | 353 | //个人页面显示 354 | exports.showUser = function (req, res, next) { 355 | 356 | //获取当前点击的用户名的姓名 357 | var username = req.params.username; 358 | 359 | //获取是否登录 360 | if (req.session.login == 300) { 361 | //查询点击的用户名的姓名 362 | db.find("users", { 363 | "username": username 364 | }, function (err, result) { 365 | 366 | if (err) { 367 | next(); 368 | } 369 | // 查到该用户 370 | if (result.length != 0) { 371 | //该用户存在 372 | res.render("user", { 373 | "login": req.session.login == 300 ? true : false, 374 | "sessionname": req.session.login == 300 ? req.session.username : "", 375 | "username": result[0].username != "" ? result[0].username : "", 376 | "imgname": result[0].headName != null ? result[0].headName : "", 377 | "qqname": result[0].qqname != null ? result[0].qqname : "未填写", 378 | "phone": result[0].phone != null ? result[0].phone : "未填写", 379 | }); 380 | } else { 381 | res.render("404"); 382 | return; 383 | } 384 | }) 385 | 386 | } else { 387 | //如果没有登录--调到登录页面 388 | res.redirect("/login"); 389 | } 390 | 391 | }; 392 | 393 | //个人页面全部帖子 394 | exports.doshowUserTongue = function (req, res, next) { 395 | 396 | //得到表单之后做的事情 397 | var page = req.query.page; 398 | var name = req.query.name; 399 | //查询所有的说说 400 | db.find("posts", { 401 | "name": name 402 | }, { 403 | "pageamount": 16, 404 | "page": page, 405 | "sort": { 406 | "time": -1 407 | } 408 | }, function (err, result) { 409 | if (err) { 410 | // 查询出错 返回110 411 | res.send("110") 412 | return; 413 | } 414 | if (result.length != 0) { 415 | //返回数据 416 | res.send(result); 417 | 418 | } else { 419 | //没有数据 420 | res.send("201"); 421 | return; 422 | } 423 | 424 | }); 425 | } 426 | 427 | //个人页面全部帖子总数 428 | exports.doUserTotal = function (req, res, next) { 429 | var name = req.query.name; 430 | 431 | db.getPartCount("posts", { 432 | "name": name 433 | }, function (results) { 434 | 435 | res.send(results.toString()); 436 | return; 437 | }); 438 | } 439 | 440 | //-----------评论------------- 441 | exports.showPost = function (req, res, next) { 442 | 443 | // res.render("post"); 444 | 445 | //获取当前点击的用户名的id 446 | var postid = req.params.postid; 447 | console.log(postid) 448 | 449 | //获取是否登录 450 | if (req.session.login == 300) { 451 | db.find("posts", { 452 | "ids": postid 453 | }, function (err, result) { 454 | 455 | if (err) { 456 | next(); 457 | } 458 | if (result.length != 0) { 459 | res.render("post", { 460 | "login": req.session.login == 300 ? true : false, 461 | "sessionname": req.session.login == 300 ? req.session.username : "", 462 | "userids": req.session.login == 300 ? postid : "", 463 | "username": result[0].name != "" ? result[0].name : "", 464 | "time": result[0].time != "" ? result[0].time : "", 465 | "content": result[0].content != "" ? result[0].content : "", 466 | }); 467 | } 468 | 469 | }); 470 | 471 | } else { 472 | //如果没有登录--调到登录页面 473 | res.redirect("/login"); 474 | } 475 | 476 | } 477 | //提交评论 478 | exports.doPostcomment = function (req, res, next) { 479 | 480 | //得到前台 用户填写的东西 481 | var form = new formidable.IncomingForm(); 482 | //获取当前用户的名字 483 | //当前用户的名字是唯一 484 | var username = req.session.username; 485 | var imgname = req.session.imgname; 486 | 487 | form.parse(req, function (err, fields, files) { 488 | 489 | //得到表单之后做的事情 490 | var content = fields.content; 491 | var ids = fields.ids; 492 | //修改信息 493 | db.updateMany("posts", { 494 | "ids": ids, 495 | }, { 496 | $push: { 497 | 'contents': { 498 | "postname": username, 499 | "postimgname": imgname, 500 | "posttime": fun.getNowFormatDate(), 501 | "postcontents": content, 502 | } 503 | }, 504 | }, function (err, result) { 505 | if (err) { 506 | // 更新出错 返回110 507 | res.send("110") 508 | return; 509 | } 510 | 511 | if (result.length == 0) { 512 | //修改失败 513 | res.send("101"); 514 | return; 515 | } else { 516 | //修改成功 517 | res.send("200"); 518 | return; 519 | } 520 | 521 | }) 522 | }) 523 | 524 | } 525 | 526 | //评论数据 527 | exports.showComment = function (req, res, next) { 528 | //得到前台 用户填写的东西 529 | var form = new formidable.IncomingForm(); 530 | 531 | form.parse(req, function (err, fields, files) { 532 | //得到表单之后做的事情 533 | var postid = fields.ids; 534 | 535 | db.find("posts", { 536 | "ids": postid 537 | }, function (err, result) { 538 | if (err) { 539 | next(); 540 | } 541 | 542 | if (result.length != 0) { 543 | //查询成功 返回查询数据 544 | res.send(result[0].contents); 545 | return; 546 | } else { 547 | //查询失败 返回101 548 | res.send("110"); 549 | return; 550 | } 551 | }); 552 | 553 | }) 554 | 555 | } 556 | 557 | 558 | 559 | //-------------成员列表显示------------------- 560 | exports.showMemberlist = function (req, res, next) { 561 | //获取是否登录 562 | if (req.session.login == 300) { 563 | 564 | res.render("memberlist", { 565 | "login": req.session.login == 300 ? true : false, 566 | "username": req.session.login == 300 ? req.session.username : "" 567 | }); 568 | } else { 569 | //如果没有登录--调到登录页面 570 | res.redirect("/login"); 571 | } 572 | 573 | 574 | } 575 | 576 | 577 | //用户信息用户总数 578 | exports.doListTotal = function (req, res, next) { 579 | db.getAllCount("users", function (results) { 580 | res.send(results.toString()); 581 | return; 582 | }); 583 | } 584 | 585 | //所有用户信息 586 | exports.doShowList = function (req, res, next) { 587 | var page = req.query.page; 588 | 589 | //查询所有的说说 590 | db.find("users", {}, { 591 | "pageamount": 16, 592 | "page": page, 593 | "sort": { 594 | "time": -1 595 | } 596 | }, function (err, result) { 597 | if (err) { 598 | // 查询出错 返回110 599 | res.send("110") 600 | return; 601 | } 602 | if (result.length != 0) { 603 | //返回数据 604 | res.send(result); 605 | return; 606 | } else { 607 | // 没有数据 608 | res.send("201"); 609 | return; 610 | } 611 | 612 | }); 613 | } 614 | 615 | 616 | 617 | //-------------404-------------- 618 | exports.show404 = function (req, res) { 619 | res.render("404") 620 | } -------------------------------------------------------------------------------- /settings.js: -------------------------------------------------------------------------------- 1 | 2 | module.exports = { 3 | "dburl" : "mongodb://192.168.1.71:27017/talk" 4 | } -------------------------------------------------------------------------------- /views/404.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 百舌之声 14 | 15 | 16 | 17 | 18 | 19 |

404

20 | 21 |
22 |
23 |
24 |
25 |
26 |
27 | 28 | 29 | 30 | 31 | 68 | 69 | -------------------------------------------------------------------------------- /views/index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 百舌之声 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 91 | 92 | 93 |
94 | 95 | <%if(!login){%> 96 | 97 |
98 |

你好, 欢迎来到百舌!

99 |

100 | 百舌! 百舌之声,这是一个可以说出你们的心声的平台。在这里你可以说出你现在的心情,说出你对当前实事的看法,说出你日常。 101 |

102 |

103 | 登录 » 104 |

105 |
106 | 107 | <% } else{%> 108 | 109 |
110 |
111 | 112 | 113 | <%=username%> 114 | 115 |
116 | 119 |

120 | 121 |

122 | 123 |
124 | 发表 125 |
126 | 127 |
128 | <% }%> 129 | 130 |
131 | 132 |
133 | 134 |
135 |
136 | 137 | 138 | 139 | 149 | 150 |
151 | 152 |
153 |

© 2017 Personal, Inc.

154 |
155 |
156 | 157 | 158 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | -------------------------------------------------------------------------------- /views/login.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 登录--百舌之声 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 |
30 | 31 | 66 | 67 |
68 | 69 |
70 | 71 |
72 | 73 | 74 | 75 |
76 |
77 | 78 | 79 | 80 |
81 |
82 | 83 |
84 |
85 | 86 |
87 | 88 |
89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 166 | 167 | 168 | 169 | -------------------------------------------------------------------------------- /views/memberlist.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 百舌之声 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 83 | 84 | 85 | 86 | 87 |
88 | 89 |
90 | 91 |
92 | 93 | 94 | 95 | 105 | 106 |
107 | 108 |
109 |

© 2017 Personal, Inc.

110 |
111 |
112 | 113 | 114 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | -------------------------------------------------------------------------------- /views/personal.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 个人信息--百舌之声 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 66 | 67 |
68 | 71 | 72 | 73 |
74 |
75 |
76 | 77 |
78 | 79 |
80 | 上传文件 81 | 82 |
83 |
84 | 85 |
86 |
87 | 88 | 89 | 90 |
91 |
92 | 93 | 94 | 95 |
96 | 97 |
98 | 99 | 100 |
101 |
102 | 103 | 109 |
110 | 111 |
112 | 113 |
114 | 116 | 修改 117 |
118 | 119 |
120 |
121 | 122 |
123 | 124 | 127 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | -------------------------------------------------------------------------------- /views/post.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | <%=username%>- 百舌之声 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 64 | 65 | 66 |
67 | 68 |
69 | 75 | 76 | 77 | <%=time%> 78 | 79 |

80 | <%=content%> 81 |

82 | 83 |
84 | 85 |
86 | 87 |
88 | 89 |
90 | 91 | 92 | 104 | 105 |
106 | 107 | 108 | 109 |
110 | 111 | 112 |

113 | 提交 114 |

115 |
116 |
117 |
118 |

© 2017 Personal, Inc.

119 |
120 |
121 | 122 | 123 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | -------------------------------------------------------------------------------- /views/register.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 注册--百舌之声 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 61 | 62 |
63 | 66 | 67 | 68 |
69 |
70 |
71 | 72 | 73 | 74 |
75 |
76 | 77 | 78 | 79 |
80 | 81 |
82 | 83 | 84 |
85 | 86 |
87 | 90 |
91 | 92 | 93 | 94 | 注册 95 |
96 |
97 | 98 |
99 | 100 |
101 | 102 | 105 | 107 | 108 | 109 | 110 | 111 | 220 | 221 | 222 | 223 | -------------------------------------------------------------------------------- /views/user.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | <%=username%>- 百舌之声 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 63 | 64 | 65 |
66 | 67 |
68 |
69 | 70 |
71 | 72 |
73 |

74 | <%=username%>的个人主页 75 |

76 |

Phone:<%=phone%>

77 |

QQ:<%=qqname%>

78 |
79 | 80 |
81 | 82 |
83 | 84 |
85 | 86 |
87 | 88 | 103 | 104 |
105 | 106 | 107 | 108 | 118 | 119 |
120 | 121 |
122 |

© 2017 Personal, Inc.

123 |
124 |
125 | 126 | 127 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | --------------------------------------------------------------------------------