├── public ├── favicon.ico ├── caches │ ├── .gitkeep │ └── .gitignore ├── .gitignore └── static │ ├── images │ ├── todo │ │ ├── done.png │ │ ├── todo.png │ │ ├── done-2x.png │ │ ├── search.png │ │ ├── todo-2x.png │ │ └── search-2x.png │ ├── demo │ │ ├── browser.png │ │ ├── video.jpg │ │ ├── html-icon.png │ │ ├── logo-mask.png │ │ ├── browser-2x.png │ │ ├── logo-mask-2x.png │ │ ├── browser-author.jpg │ │ ├── browser-pic-1.jpg │ │ ├── browser-pic-2.jpg │ │ ├── browser-pic-3.jpg │ │ ├── browser-pic-4.jpg │ │ ├── browser-pic-5.jpg │ │ └── browser-pic-6.jpg │ ├── footer │ │ └── logo.png │ ├── login │ │ ├── icon.png │ │ ├── imac.png │ │ └── imac-2x.png │ ├── switch │ │ ├── mask.png │ │ └── mask-square.png │ ├── tile │ │ ├── ribbon.png │ │ └── ribbon-2x.png │ ├── video │ │ ├── pause.png │ │ ├── play.png │ │ ├── poster.jpg │ │ ├── pause-2x.png │ │ ├── play-2x.png │ │ ├── fullscreen.png │ │ ├── volume-full.png │ │ ├── volume-off.png │ │ ├── fullscreen-2x.png │ │ ├── volume-off-2x.png │ │ └── volume-full-2x.png │ └── icons │ │ ├── png │ │ ├── Book.png │ │ ├── Chat.png │ │ ├── Mail.png │ │ ├── Map.png │ │ ├── Compas.png │ │ ├── Pensils.png │ │ ├── Pocket.png │ │ ├── Watches.png │ │ ├── Calendar.png │ │ ├── Clipboard.png │ │ ├── Gift-Box.png │ │ ├── Retina-Ready.png │ │ ├── Toilet-Paper.png │ │ └── Infinity-Loop.png │ │ └── svg │ │ ├── loop.svg │ │ ├── paper-bag.svg │ │ ├── clocks.svg │ │ ├── mail.svg │ │ ├── chat.svg │ │ ├── toilet-paper.svg │ │ ├── book.svg │ │ ├── map.svg │ │ ├── retina.svg │ │ ├── clipboard.svg │ │ ├── pencils.svg │ │ ├── compas.svg │ │ ├── calendar.svg │ │ └── gift-box.svg │ └── fonts │ ├── Flat-UI-Icons.eot │ ├── Flat-UI-Icons.ttf │ ├── Flat-UI-Icons.woff │ ├── lato │ ├── lato-black-webfont.eot │ ├── lato-black-webfont.ttf │ ├── lato-bold-webfont.eot │ ├── lato-bold-webfont.ttf │ ├── lato-bold-webfont.woff │ ├── lato-light-webfont.eot │ ├── lato-light-webfont.ttf │ ├── lato-black-webfont.woff │ ├── lato-italic-webfont.eot │ ├── lato-italic-webfont.ttf │ ├── lato-italic-webfont.woff │ ├── lato-light-webfont.woff │ ├── lato-regular-webfont.eot │ ├── lato-regular-webfont.ttf │ ├── lato-bolditalic-webfont.eot │ ├── lato-bolditalic-webfont.ttf │ ├── lato-regular-webfont.woff │ └── lato-bolditalic-webfont.woff │ ├── glyphicons-halflings-regular.eot │ ├── glyphicons-halflings-regular.ttf │ ├── glyphicons-halflings-regular.woff │ ├── Flat-UI-Icons.svg │ └── Flat-UI-Icons.dev.svg ├── server.js ├── .nodemonignore ├── .gitignore ├── app ├── assets │ ├── css │ │ ├── general.styl │ │ ├── index.styl │ │ ├── schedule.styl │ │ └── availables.styl │ └── js │ │ └── index.js ├── index.js ├── resources.js └── passport.js ├── models ├── user.js ├── calendar_item.js └── index.js ├── routes ├── api │ ├── confirmed.js │ └── calendar.js └── index.js ├── lib └── sise │ ├── parsers │ ├── profile.js │ ├── login.js │ ├── schedule.js │ └── courses.js │ └── index.js ├── README.md ├── Makefile ├── package.json ├── views ├── index.jade └── signin.jade └── LICENSE /public/favicon.ico: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/caches/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/.gitignore: -------------------------------------------------------------------------------- 1 | assets 2 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | require('./app') 2 | -------------------------------------------------------------------------------- /public/caches/.gitignore: -------------------------------------------------------------------------------- 1 | *.json 2 | -------------------------------------------------------------------------------- /.nodemonignore: -------------------------------------------------------------------------------- 1 | /public/* 2 | /app/assets/* 3 | /views/* 4 | -------------------------------------------------------------------------------- /public/static/images/todo/done.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/todo/done.png -------------------------------------------------------------------------------- /public/static/images/todo/todo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/todo/todo.png -------------------------------------------------------------------------------- /public/static/fonts/Flat-UI-Icons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/fonts/Flat-UI-Icons.eot -------------------------------------------------------------------------------- /public/static/fonts/Flat-UI-Icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/fonts/Flat-UI-Icons.ttf -------------------------------------------------------------------------------- /public/static/images/demo/browser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/demo/browser.png -------------------------------------------------------------------------------- /public/static/images/demo/video.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/demo/video.jpg -------------------------------------------------------------------------------- /public/static/images/footer/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/footer/logo.png -------------------------------------------------------------------------------- /public/static/images/login/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/login/icon.png -------------------------------------------------------------------------------- /public/static/images/login/imac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/login/imac.png -------------------------------------------------------------------------------- /public/static/images/switch/mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/switch/mask.png -------------------------------------------------------------------------------- /public/static/images/tile/ribbon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/tile/ribbon.png -------------------------------------------------------------------------------- /public/static/images/todo/done-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/todo/done-2x.png -------------------------------------------------------------------------------- /public/static/images/todo/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/todo/search.png -------------------------------------------------------------------------------- /public/static/images/todo/todo-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/todo/todo-2x.png -------------------------------------------------------------------------------- /public/static/images/video/pause.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/video/pause.png -------------------------------------------------------------------------------- /public/static/images/video/play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/video/play.png -------------------------------------------------------------------------------- /public/static/images/video/poster.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/video/poster.jpg -------------------------------------------------------------------------------- /public/static/fonts/Flat-UI-Icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/fonts/Flat-UI-Icons.woff -------------------------------------------------------------------------------- /public/static/images/demo/html-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/demo/html-icon.png -------------------------------------------------------------------------------- /public/static/images/demo/logo-mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/demo/logo-mask.png -------------------------------------------------------------------------------- /public/static/images/icons/png/Book.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/icons/png/Book.png -------------------------------------------------------------------------------- /public/static/images/icons/png/Chat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/icons/png/Chat.png -------------------------------------------------------------------------------- /public/static/images/icons/png/Mail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/icons/png/Mail.png -------------------------------------------------------------------------------- /public/static/images/icons/png/Map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/icons/png/Map.png -------------------------------------------------------------------------------- /public/static/images/login/imac-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/login/imac-2x.png -------------------------------------------------------------------------------- /public/static/images/tile/ribbon-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/tile/ribbon-2x.png -------------------------------------------------------------------------------- /public/static/images/todo/search-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/todo/search-2x.png -------------------------------------------------------------------------------- /public/static/images/video/pause-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/video/pause-2x.png -------------------------------------------------------------------------------- /public/static/images/video/play-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/video/play-2x.png -------------------------------------------------------------------------------- /public/static/images/demo/browser-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/demo/browser-2x.png -------------------------------------------------------------------------------- /public/static/images/demo/logo-mask-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/demo/logo-mask-2x.png -------------------------------------------------------------------------------- /public/static/images/icons/png/Compas.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/icons/png/Compas.png -------------------------------------------------------------------------------- /public/static/images/icons/png/Pensils.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/icons/png/Pensils.png -------------------------------------------------------------------------------- /public/static/images/icons/png/Pocket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/icons/png/Pocket.png -------------------------------------------------------------------------------- /public/static/images/icons/png/Watches.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/icons/png/Watches.png -------------------------------------------------------------------------------- /public/static/images/video/fullscreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/video/fullscreen.png -------------------------------------------------------------------------------- /public/static/images/video/volume-full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/video/volume-full.png -------------------------------------------------------------------------------- /public/static/images/video/volume-off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/video/volume-off.png -------------------------------------------------------------------------------- /public/static/images/demo/browser-author.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/demo/browser-author.jpg -------------------------------------------------------------------------------- /public/static/images/demo/browser-pic-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/demo/browser-pic-1.jpg -------------------------------------------------------------------------------- /public/static/images/demo/browser-pic-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/demo/browser-pic-2.jpg -------------------------------------------------------------------------------- /public/static/images/demo/browser-pic-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/demo/browser-pic-3.jpg -------------------------------------------------------------------------------- /public/static/images/demo/browser-pic-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/demo/browser-pic-4.jpg -------------------------------------------------------------------------------- /public/static/images/demo/browser-pic-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/demo/browser-pic-5.jpg -------------------------------------------------------------------------------- /public/static/images/demo/browser-pic-6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/demo/browser-pic-6.jpg -------------------------------------------------------------------------------- /public/static/images/icons/png/Calendar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/icons/png/Calendar.png -------------------------------------------------------------------------------- /public/static/images/icons/png/Clipboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/icons/png/Clipboard.png -------------------------------------------------------------------------------- /public/static/images/icons/png/Gift-Box.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/icons/png/Gift-Box.png -------------------------------------------------------------------------------- /public/static/images/switch/mask-square.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/switch/mask-square.png -------------------------------------------------------------------------------- /public/static/images/video/fullscreen-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/video/fullscreen-2x.png -------------------------------------------------------------------------------- /public/static/images/video/volume-off-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/video/volume-off-2x.png -------------------------------------------------------------------------------- /public/static/fonts/lato/lato-black-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/fonts/lato/lato-black-webfont.eot -------------------------------------------------------------------------------- /public/static/fonts/lato/lato-black-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/fonts/lato/lato-black-webfont.ttf -------------------------------------------------------------------------------- /public/static/fonts/lato/lato-bold-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/fonts/lato/lato-bold-webfont.eot -------------------------------------------------------------------------------- /public/static/fonts/lato/lato-bold-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/fonts/lato/lato-bold-webfont.ttf -------------------------------------------------------------------------------- /public/static/fonts/lato/lato-bold-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/fonts/lato/lato-bold-webfont.woff -------------------------------------------------------------------------------- /public/static/fonts/lato/lato-light-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/fonts/lato/lato-light-webfont.eot -------------------------------------------------------------------------------- /public/static/fonts/lato/lato-light-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/fonts/lato/lato-light-webfont.ttf -------------------------------------------------------------------------------- /public/static/images/icons/png/Retina-Ready.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/icons/png/Retina-Ready.png -------------------------------------------------------------------------------- /public/static/images/icons/png/Toilet-Paper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/icons/png/Toilet-Paper.png -------------------------------------------------------------------------------- /public/static/images/video/volume-full-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/video/volume-full-2x.png -------------------------------------------------------------------------------- /public/static/fonts/lato/lato-black-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/fonts/lato/lato-black-webfont.woff -------------------------------------------------------------------------------- /public/static/fonts/lato/lato-italic-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/fonts/lato/lato-italic-webfont.eot -------------------------------------------------------------------------------- /public/static/fonts/lato/lato-italic-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/fonts/lato/lato-italic-webfont.ttf -------------------------------------------------------------------------------- /public/static/fonts/lato/lato-italic-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/fonts/lato/lato-italic-webfont.woff -------------------------------------------------------------------------------- /public/static/fonts/lato/lato-light-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/fonts/lato/lato-light-webfont.woff -------------------------------------------------------------------------------- /public/static/fonts/lato/lato-regular-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/fonts/lato/lato-regular-webfont.eot -------------------------------------------------------------------------------- /public/static/fonts/lato/lato-regular-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/fonts/lato/lato-regular-webfont.ttf -------------------------------------------------------------------------------- /public/static/images/icons/png/Infinity-Loop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/images/icons/png/Infinity-Loop.png -------------------------------------------------------------------------------- /public/static/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /public/static/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /public/static/fonts/lato/lato-bolditalic-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/fonts/lato/lato-bolditalic-webfont.eot -------------------------------------------------------------------------------- /public/static/fonts/lato/lato-bolditalic-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/fonts/lato/lato-bolditalic-webfont.ttf -------------------------------------------------------------------------------- /public/static/fonts/lato/lato-regular-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/fonts/lato/lato-regular-webfont.woff -------------------------------------------------------------------------------- /public/static/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /public/static/fonts/lato/lato-bolditalic-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xingrz/biaozi/HEAD/public/static/fonts/lato/lato-bolditalic-webfont.woff -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | lib-cov 2 | *.seed 3 | *.log 4 | *.csv 5 | *.dat 6 | *.out 7 | *.pid 8 | *.gz 9 | 10 | pids 11 | logs 12 | results 13 | 14 | npm-debug.log 15 | node_modules 16 | 17 | .DS_Store 18 | -------------------------------------------------------------------------------- /app/assets/css/general.styl: -------------------------------------------------------------------------------- 1 | * { 2 | border-radius: 0 !important; 3 | } 4 | 5 | .navbar { 6 | padding: 0 20px; 7 | margin: 0; 8 | } 9 | 10 | .brand { 11 | color: #fff; 12 | line-height: 50px; 13 | margin: 0; 14 | } 15 | 16 | .logged { 17 | color: #ccc; 18 | font-size: 75%; 19 | line-height: 50px; 20 | margin: 0; 21 | } 22 | //end 23 | -------------------------------------------------------------------------------- /models/user.js: -------------------------------------------------------------------------------- 1 | module.exports = function (seq, T) { 2 | var User = seq.define('User', { 3 | username : { type: T.STRING, unique: true } 4 | , password : { type: T.STRING } 5 | , salt : { type: T.STRING } 6 | , key : { type: T.STRING } 7 | }, { 8 | associate: function (models) { 9 | User.hasMany(models.CalendarItem) 10 | } 11 | }) 12 | 13 | return User 14 | } 15 | -------------------------------------------------------------------------------- /routes/api/confirmed.js: -------------------------------------------------------------------------------- 1 | var User = require('../../models').User 2 | 3 | var sise = require('../../lib/sise') 4 | 5 | exports.show = function (req, res, error) { 6 | sise.confirmed(req.user.key, function (err, confirmed) { 7 | if (err) { 8 | return error(err) 9 | } 10 | 11 | if (!confirmed) { 12 | return res.send(404) 13 | } 14 | 15 | return res.json(200, confirmed) 16 | }) 17 | } 18 | -------------------------------------------------------------------------------- /models/calendar_item.js: -------------------------------------------------------------------------------- 1 | module.exports = function (seq, T) { 2 | var CalendarItem = seq.define('CalendarItem', { 3 | code : { type: T.STRING } 4 | , klass : { type: T.STRING } 5 | , subklass: { type: T.STRING } 6 | , status : { type: T.ENUM, values: ['confirmed', 'favored'] } 7 | }, { 8 | associate: function (models) { 9 | CalendarItem.belongsTo(models.User) 10 | } 11 | }) 12 | 13 | return CalendarItem 14 | } 15 | -------------------------------------------------------------------------------- /routes/index.js: -------------------------------------------------------------------------------- 1 | // deps 2 | var passport = require('passport') 3 | 4 | exports.signin = function (req, res, error) { 5 | return res.render('signin') 6 | } 7 | 8 | exports.authenticate = passport.authenticate('local', { 9 | successReturnToOrRedirect: '/' 10 | , failureRedirect: '/signin' 11 | }) 12 | 13 | exports.signout = function (req, res, error) { 14 | req.logout() 15 | res.redirect('/') 16 | } 17 | 18 | exports.show = function (req, res, error) { 19 | return res.render('index') 20 | } 21 | -------------------------------------------------------------------------------- /lib/sise/parsers/profile.js: -------------------------------------------------------------------------------- 1 | var $ = require('cheerio') 2 | 3 | exports.confirmed = function (html) { 4 | return $(html).find('table.table tr:has(td)').map(function (row) { 5 | var cells = $(this).find('td') 6 | if (cells.length == 10) { 7 | return { code: $(cells[1]).text().trim(), remarks: $(cells[8]).text().trim() } 8 | } else if (cells.length == 9) { 9 | return { code: $(cells[0]).text().trim(), remarks: $(cells[7]).text().trim() } 10 | } 11 | }).filter(function (i) { 12 | return !~['', '已选'].indexOf(i.remarks) 13 | }).map(function (i) { 14 | return i.code 15 | }) 16 | } 17 | -------------------------------------------------------------------------------- /public/static/images/icons/svg/loop.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/static/images/icons/svg/paper-bag.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /models/index.js: -------------------------------------------------------------------------------- 1 | var readdirSync = require('fs').readdirSync 2 | , join = require('path').join 3 | , Sequelize = require('sequelize') 4 | , extend = require('lodash').extend 5 | 6 | var config = require('../package.json').config.mysql 7 | if ('production' != process.env.NODE_ENV) { 8 | config.database += '_dev' 9 | } 10 | 11 | var sequelize = new Sequelize(config.database, config.username) 12 | , db = {} 13 | 14 | readdirSync(__dirname).forEach(function (file) { 15 | if (file.indexOf('.') !== 0 && file !== 'index.js') { 16 | var model = sequelize.import(join(__dirname, file)) 17 | db[model.name] = model 18 | } 19 | }) 20 | 21 | Object.keys(db).forEach(function(modelName) { 22 | if (db[modelName].options.hasOwnProperty('associate')) { 23 | db[modelName].options.associate(db) 24 | } 25 | }) 26 | 27 | module.exports = extend(db, { 28 | sequelize: sequelize, 29 | Sequelize: Sequelize 30 | }) 31 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 排课神器 2 | ====== 3 | 4 | ## 运行环境 5 | 6 | * [NodeJS](http://nodejs.org) 0.10.X 7 | * [MariaDB](http://mariadb.org)(建议) 或 [MySQL](http://www.mysql.com) 8 | 9 | ## 安装 10 | 11 | ``` 12 | $ git clone https://github.com/xingrz/biaozi.git 13 | $ cd biaozi 14 | $ npm install 15 | ``` 16 | 17 | ## 调试 18 | 19 | ``` 20 | $ make debug 21 | ``` 22 | 23 | ## 上线 24 | 25 | ``` 26 | $ make 27 | $ cd .. 28 | $ NODE_ENV=production PORT=8080 pm2 start biaozi 29 | ``` 30 | 31 | ## 贡献 32 | 33 | 这个只是我利用空闲时间写出来的小项目,难免存在许多 BUG 和不足。欢迎各位小伙伴提出意见或帮忙实现功能。 34 | 35 | 上报错误、提建议或者咨询请[新建 Issue](https://github.com/xingrz/biaozi/issues/new)。 36 | 37 | 目前已知错误以及因为时间等原因尚未实现的功能详见[此处](https://github.com/xingrz/biaozi/issues?state=open),提交 Pull Request 时请尽量顺便引用一下原 Issue。 38 | 39 | 本项目仅提供预先制定选课计划的功能,不能用于也永远不会提供抢课、非法选课等违反校规之用途。任何违规功能的提交都会被拒绝合并。 40 | 41 | ## 协议 42 | 43 | 本项目基于 GPL v2 协议开源,总的来说就是你可以下载、修改或重新发布它的源代码,但需要继续将你修改的版本开源并维持原有协议。详情请见 [LICENSE](LICENSE) 文件。 44 | -------------------------------------------------------------------------------- /public/static/images/icons/svg/clocks.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /public/static/images/icons/svg/mail.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/static/images/icons/svg/chat.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/static/images/icons/svg/toilet-paper.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | TESTS = test/*.test.js 2 | REPORTER = spec 3 | TIMEOUT = 5000 4 | MOCHA_OPTS = 5 | NODE_MODULES = ./node_modules 6 | BIN = $(NODE_MODULES)/.bin 7 | 8 | build: build-css build-js 9 | 10 | build-css: install 11 | rm -rf public/assets/css 12 | mkdir -p public/assets/css 13 | $(BIN)/stylus \ 14 | -c \ 15 | -o public/assets/css \ 16 | -u $(NODE_MODULES)/nib \ 17 | app/assets/css/* 18 | 19 | build-js: install 20 | rm -rf public/assets/js 21 | mkdir -p public/assets/js 22 | cd app/assets/js && for i in *.js; do (\ 23 | ../../../$(BIN)/uglifyjs $$i \ 24 | --mangle \ 25 | --compress \ 26 | --output ../../../public/assets/js/$$i \ 27 | ); done 28 | 29 | install: build 30 | @npm install 31 | 32 | debug: 33 | @NODE_ENV=development DEBUG=@:* nodemon 34 | 35 | start: install 36 | @NODE_ENV=production node server 37 | 38 | test: install test-unit test-cov 39 | 40 | test-unit: install 41 | @NODE_ENV=test $(BIN)/mocha \ 42 | --bail \ 43 | --reporter $(REPORTER) \ 44 | --timeout $(TIMEOUT) \ 45 | $(MOCHA_OPTS) \ 46 | $(TESTS) 47 | 48 | test-cov: 49 | @rm -f coverage.html 50 | @$(MAKE) test-unit MOCHA_OPTS='--require blanket' REPORTER=html-cov > coverage.html 51 | @$(MAKE) test-unit MOCHA_OPTS='--require blanket' REPORTER=travis-cov 52 | 53 | clean: 54 | rm -f coverage.html 55 | rm -rf public/assets 56 | 57 | .PHONY: build install debug start test test-unit test-cov clean 58 | -------------------------------------------------------------------------------- /public/static/images/icons/svg/book.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/static/images/icons/svg/map.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "biaozi" 3 | , "version": "0.1.0" 4 | , "private": true 5 | , "description": "" 6 | , "main": "server.js" 7 | , "dependencies": { 8 | "async": "latest" 9 | , "cheerio": "latest" 10 | , "connect-ensure-login": "latest" 11 | , "connect-redis": "1.4.7" 12 | , "debug": "latest" 13 | , "eventproxy": "latest" 14 | , "express": "3.X" 15 | , "iconv-lite": "latest" 16 | , "jade": "latest" 17 | , "mysql": "2.X" 18 | , "nib": "latest" 19 | , "passport": "0.1.X" 20 | , "passport-local": "0.1.X" 21 | , "request": "2.X" 22 | , "sequelize": "2.X" 23 | , "stylus": "0.40.0" 24 | , "lodash": "latest" 25 | , "tough-cookie": "*" 26 | } 27 | , "devDependencies": { 28 | "mocha": "latest" 29 | , "should": "latest" 30 | , "blanket": "latest" 31 | , "travis-cov": "latest" 32 | , "supertest": "latest" 33 | , "muk": "latest" 34 | , "uglify-js": "latest" 35 | } 36 | , "engines": { 37 | "node": "0.10.X" 38 | } 39 | , "scripts": { 40 | "test": "make test" 41 | , "start": "node server.js" 42 | , "blanket": { 43 | "pattern": "//^((?!(node_modules|test)).)*$/" 44 | , "data-cover-flags": { 45 | "debug": false 46 | }} 47 | , "travis-cov": { "threshold": 80 } 48 | } 49 | , "author": "XiNGRZ " 50 | , "repository": { 51 | "type": "git" 52 | , "url": "https://github.com/xingrz/biaozi.git" 53 | } 54 | , "config": { 55 | "redis": { "prefix": "biaozi:session:" } 56 | , "mysql": { "username": "biaozi", "database": "biaozi" } 57 | , "cookie": { "secret": "6278ef12964caa125c3fc194513dffd3" } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /public/static/images/icons/svg/retina.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /views/index.jade: -------------------------------------------------------------------------------- 1 | doctype html 2 | html 3 | head 4 | title 内啥 5 | 6 | meta(charset='utf-8') 7 | meta(name='viewport', content='width=device-width, initial-scale=1.0') 8 | 9 | link(rel='stylesheet', href='//cdn.staticfile.org/twitter-bootstrap/3.0.3/css/bootstrap.min.css') 10 | link(rel='stylesheet', href='/static/css/flat-ui.css') 11 | 12 | link(rel='stylesheet', href='/assets/css/general.css') 13 | link(rel='stylesheet', href='/assets/css/index.css') 14 | 15 | script(src='//cdn.staticfile.org/jquery/2.0.3/jquery.min.js') 16 | script(src='//cdn.staticfile.org/lodash.js/2.4.1/lodash.min.js') 17 | script(src='//cdn.staticfile.org/eventproxy/0.2.5/eventproxy.min.js') 18 | 19 | script(src='/assets/js/index.js') 20 | 21 | body 22 | div#loading 23 | .progress.progress-striped.active 24 | .progress-bar 25 | p 请稍候,系统玩命加载中... 26 | 27 | div.navbar.navbar-inverse 28 | p.brand.pull-left 内啥:排课神器 29 | p.logged.pull-right 30 | | #{logged.username} 31 | |   32 | a(href='/signout') 注销 33 | 34 | ul#availables.palette-peter-river 35 | 36 | div#schedule 37 | table 38 | tr 39 | th 40 | th(width='18%') 周一 41 | th(width='18%') 周二 42 | th(width='18%') 周三 43 | th(width='18%') 周四 44 | th(width='18%') 周五 45 | 46 | times = [ '09:00 - 10:20', '10:40 - 12:00', '12:30 - 13:50', '14:00 - 15:20', '15:30 - 16:50', '17:00 - 18:20', '19:00 - 20:20', '20:30 - 21:50' ] 47 | 48 | each timeName, time in times 49 | tr(data-time='#{time}') 50 | th 51 | div #{time * 2 + 1} - #{time * 2 + 2} 52 | div #{timeName} 53 | - for (var day = 0; day < 5; day++) 54 | td(data-day='#{day}'): ul 55 | -------------------------------------------------------------------------------- /public/static/images/icons/svg/clipboard.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/index.js: -------------------------------------------------------------------------------- 1 | var join = require('path').join 2 | , pkg = require('../package.json') 3 | 4 | var express = require('express') 5 | , RedisStore = require('connect-redis')(express) 6 | , app = module.exports = express() 7 | 8 | 9 | app.set('host', '0.0.0.0') 10 | app.set('port', process.env.PORT || 3000) 11 | 12 | if ('production' == app.get('env')) { 13 | app.set('host', '127.0.0.1') 14 | } 15 | 16 | 17 | // set template engine 18 | app.set('views', join(__dirname, '../views')) 19 | app.set('view engine', 'jade') 20 | 21 | // trust proxy 22 | app.enable('trust proxy') 23 | 24 | 25 | // serves default or specified favicon.ico 26 | app.use(express.favicon(join(__dirname, '../public/favicon.ico'))) 27 | 28 | // handles error 29 | app.use(express.errorHandler()) 30 | 31 | // parses post body 32 | app.use(express.bodyParser()) 33 | 34 | // cookie & session 35 | app.use(express.cookieParser(pkg.config.cookie.secret)) 36 | app.use(express.session({ 37 | secret: pkg.config.cookie.secret 38 | , cookie: { httpOnly: true, maxAge: 24 * 60 * 60 * 1000 } 39 | , store: new RedisStore({ prefix: pkg.config.redis.prefix }) 40 | , proxy: true 41 | })) 42 | 43 | if ('development' == app.get('env')) { 44 | // enables jade pretty html output 45 | app.locals.pretty = true 46 | 47 | // prints logs in dev level 48 | app.use(express.logger('dev')) 49 | } 50 | 51 | if ('production' == app.get('env')) { 52 | // prints logs in prod level 53 | app.use(express.logger()) 54 | } 55 | 56 | // authentication 57 | require('./passport')(app) 58 | 59 | // resources 60 | require('./resources')(app) 61 | 62 | 63 | require('../models').sequelize 64 | .sync() 65 | .complete(function(err) { 66 | if (err) { 67 | return console.error(err.stack || err) 68 | } 69 | 70 | app.listen(app.get('port'), app.get('host'), function (err) { 71 | if (err) { 72 | return console.error(err.stack || err) 73 | } 74 | 75 | console.log('express started') 76 | console.log(require('util').inspect(app.settings, { colors: true })) 77 | }) 78 | }) 79 | -------------------------------------------------------------------------------- /public/static/images/icons/svg/pencils.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /views/signin.jade: -------------------------------------------------------------------------------- 1 | doctype html 2 | html 3 | head 4 | title 内啥 5 | 6 | meta(charset='utf-8') 7 | meta(name='viewport', content='width=device-width, initial-scale=1.0') 8 | 9 | link(rel='stylesheet', href='//cdn.staticfile.org/twitter-bootstrap/3.0.3/css/bootstrap.min.css') 10 | link(rel='stylesheet', href='/static/css/flat-ui.css') 11 | 12 | style. 13 | .container { 14 | max-width: 970px !important; 15 | padding-top: 100px; 16 | } 17 | 18 | * { 19 | border-radius: 0 !important; 20 | } 21 | 22 | .login-icon > h4 { 23 | line-height: 1.2; 24 | text-align: right; 25 | } 26 | 27 | body { 28 | background: #F39C12; 29 | } 30 | 31 | .login-form { 32 | float: right; 33 | width: 400px; 34 | margin: 20px; 35 | } 36 | 37 | article { 38 | color: #000; 39 | } 40 | 41 | article h1 { 42 | font-size: 60px; 43 | font-weight: normal; 44 | } 45 | 46 | article ul { 47 | margin: 30px 0; 48 | padding: 0 2em; 49 | } 50 | 51 | article ul li { 52 | font-size: 20px; 53 | line-height: 50px; 54 | } 55 | 56 | footer { 57 | background: none; 58 | position: fixed; 59 | bottom: 0; 60 | font-weight: normal; 61 | color: #000; 62 | font-size: 14px; 63 | } 64 | 65 | body 66 | div.container 67 | form.login-form(method='post') 68 | div.form-group 69 | input(name='username', type='text', placeholder='学号', required, autofocus).form-control.login-field#login-name 70 | label.login-field-icon.fui-user(for='login-name') 71 | 72 | div.form-group 73 | input(name='password', type='password', placeholder='MYSISE 密码', required).form-control.login-field#login-pass 74 | label.login-field-icon.fui-lock(for='login-pass') 75 | 76 | button.btn.btn-info.btn-lg.btn-block(type='submit') 登录 77 | 78 | article 79 | h1 排课神器 80 | ul 81 | li 直观的上课周数显示 82 | li 自动筛选上课时间 83 | li 智能选课顺序提示 84 | 85 | footer 86 | p 2014 © BestNG 87 | -------------------------------------------------------------------------------- /app/resources.js: -------------------------------------------------------------------------------- 1 | var ensureLogin = require('connect-ensure-login') 2 | , ensureLoggedIn = ensureLogin.ensureLoggedIn('/signin') 3 | , ensureNotLoggedIn = ensureLogin.ensureNotLoggedIn() 4 | 5 | var express = require('express') 6 | , join = require('path').join 7 | 8 | module.exports = function (app) { 9 | var index = require('../routes/index') 10 | app.all('/' , ensureLoggedIn, index.show) 11 | app.all('/signout' , ensureLoggedIn, index.signout) 12 | app.get('/signin' , ensureNotLoggedIn, index.signin) 13 | .post('/signin' , ensureNotLoggedIn, index.authenticate) 14 | 15 | var calendarApi = require('../routes/api/calendar') 16 | app.get('/api/calendar' , ensureLoggedIn, calendarApi.index) 17 | //.put('/api/calendar/:code' , ensureLoggedIn, calendarApi.modify) 18 | //.del('/api/calendar/:code' , ensureLoggedIn, calendarApi.remove) 19 | 20 | app.del('/api/calendar/:code/confirmed' , ensureLoggedIn, calendarApi.deny) 21 | .post('/api/calendar/:code/confirmed' , ensureLoggedIn, calendarApi.confirm) 22 | 23 | app.del('/api/calendar/:code/favored/:klass' , ensureLoggedIn, calendarApi.bore) 24 | .del('/api/calendar/:code/favored/:klass/:subklass', ensureLoggedIn, calendarApi.bore) 25 | .post('/api/calendar/:code/favored' , ensureLoggedIn, calendarApi.favor) 26 | 27 | var confirmedApi = require('../routes/api/confirmed') 28 | app.get('/api/confirmed', ensureLoggedIn, confirmedApi.show) 29 | 30 | // serves stylus compiled css 31 | var stylus = require('stylus') 32 | , nib = require('nib') 33 | 34 | var dev = 'development' == app.get('env') 35 | 36 | app.use('/assets/css', stylus.middleware({ 37 | src: join(__dirname, './assets/css') 38 | , dest: join(__dirname, '../public/assets/css') 39 | , compile: function (str, path) { 40 | return stylus(str) 41 | .set('filename', path) 42 | .set('compress', !dev) 43 | .set('firebug', !dev) 44 | .set('linenos', !dev) 45 | .use(nib()) 46 | } 47 | })) 48 | 49 | if (dev) { 50 | app.use('/assets/js', express.static(join(__dirname, './assets/js'))) 51 | } 52 | 53 | // serves general static files 54 | app.use(express.static(join(__dirname, '../public'))) 55 | 56 | } 57 | -------------------------------------------------------------------------------- /app/assets/css/index.styl: -------------------------------------------------------------------------------- 1 | h2 { 2 | font-size 120% 3 | font-weight normal 4 | color #fff 5 | padding 10px 20px 6 | margin 0 7 | } 8 | 9 | #loading { 10 | position absolute 11 | left 0 12 | top 0 13 | right 0 14 | bottom 0 15 | z-index 1000 16 | 17 | background #fff 18 | text-align center 19 | padding 200px 100px 20 | 21 | .progress { 22 | max-width 500px 23 | margin 0 auto 24 | 25 | .progress-bar { 26 | width 100% 27 | } 28 | } 29 | 30 | p { 31 | margin-top 10px 32 | font-size 14px 33 | } 34 | } 35 | 36 | @import availables 37 | @import schedule 38 | 39 | 40 | @media(max-width: 720px) { 41 | body { 42 | background #F39C12 43 | } 44 | 45 | .navbar { 46 | display none 47 | } 48 | 49 | #schedule { 50 | display none 51 | } 52 | 53 | #availables { 54 | position initial 55 | width initial 56 | left initial 57 | top initial 58 | bottom initial 59 | background transparent !important 60 | 61 | li:not(.confirmed):not(.favored) { 62 | display none 63 | } 64 | 65 | > li.confirmed, 66 | > li.favored { 67 | height auto 68 | background transparent !important 69 | color #000 70 | 71 | > strong { 72 | font-weight bold 73 | cursor default 74 | 75 | &::before { 76 | display none 77 | } 78 | 79 | p { 80 | color inherit 81 | display inline 82 | padding-left 1em 83 | line-height inherit 84 | } 85 | } 86 | 87 | ul { 88 | background none 89 | 90 | li.confirmed, 91 | li.favored { 92 | color #000 93 | cursor default 94 | 95 | > .fui-heart, 96 | > .fui-check { 97 | color rgba(0, 0, 0, 0.5) 98 | 99 | &:hover { 100 | color rgba(0, 0, 0, 0.7) 101 | } 102 | } 103 | } 104 | 105 | li.confirmed > .fui-check { 106 | display none 107 | } 108 | 109 | li.favored > .fui-heart::before { 110 | content '\e00b' 111 | } 112 | } 113 | } 114 | 115 | } 116 | } 117 | //end 118 | -------------------------------------------------------------------------------- /app/assets/css/schedule.styl: -------------------------------------------------------------------------------- 1 | 2 | #schedule { 3 | position absolute 4 | left 200px 5 | top 50px 6 | right 0 7 | bottom 0 8 | color #000 9 | font-size 90% 10 | overflow-y scroll 11 | } 12 | 13 | #schedule table { 14 | width 100% 15 | table-layout fixed 16 | } 17 | 18 | #schedule th { 19 | text-align center 20 | padding 5px 21 | border 1px solid #eee 22 | font-weight normal 23 | vertical-align top 24 | white-space nowrap 25 | overflow hidden 26 | } 27 | 28 | #schedule tr:nth-child(even) { 29 | background #fcfdff 30 | } 31 | 32 | #schedule tr:nth-child(odd) { 33 | background #fff 34 | } 35 | 36 | #schedule td { 37 | border 1px solid #eee 38 | vertical-align top 39 | } 40 | 41 | #schedule h3 { 42 | font-size inherit 43 | } 44 | 45 | #schedule p { 46 | font-size inherit 47 | } 48 | 49 | #schedule ul { 50 | list-style none 51 | margin 0 52 | padding 0 53 | min-height 80px 54 | } 55 | 56 | @-webkit-keyframes pending { 57 | 0% { color rgba(0, 0, 0, 0.10) } 58 | 50% { color rgba(0, 0, 0, 0.75) } 59 | 100% { color rgba(0, 0, 0, 0.10) } 60 | } 61 | 62 | #schedule ul li { 63 | display block 64 | margin 0 65 | padding 0 66 | height 40px 67 | 68 | &.twinkling { 69 | -webkit-animation pending linear 1s infinite 70 | } 71 | 72 | &.preview { 73 | opacity 0.5 74 | } 75 | 76 | &.confirmed, 77 | &.favored { 78 | > h3::before { 79 | color rgba(0, 0, 0, 0.2) 80 | float right 81 | font-family 'Flat-UI-Icons' 82 | -webkit-font-smoothing antialiased 83 | } 84 | } 85 | 86 | &.confirmed > h3::before { 87 | content '\e00a' 88 | } 89 | 90 | &.favored > h3::before { 91 | content '\e007' 92 | } 93 | } 94 | 95 | #schedule ul li h3 { 96 | margin 0 97 | position relative 98 | z-index 1 99 | line-height 20px 100 | height 20px 101 | padding 0 5px 102 | white-space nowrap 103 | overflow hidden 104 | text-overflow ellipsis 105 | } 106 | 107 | #schedule ul li .details { 108 | margin 0 109 | position relative 110 | z-index 1 111 | line-height 20px 112 | height 20px 113 | padding 0 5px 114 | white-space nowrap 115 | overflow hidden 116 | text-overflow ellipsis 117 | } 118 | 119 | #schedule ul li .details span { 120 | margin-right 1em 121 | } 122 | 123 | #schedule ul li .graph { 124 | white-space nowrap 125 | font-size 0 126 | margin 0 127 | position relative 128 | top -40px 129 | height 40px 130 | } 131 | 132 | #schedule ul li .graph i { 133 | display inline-block 134 | height 100% 135 | width 5% 136 | background #fff 137 | opacity 0.9 138 | } 139 | 140 | #schedule ul li .graph i.y { 141 | opacity 0.6 142 | } 143 | //end 144 | -------------------------------------------------------------------------------- /public/static/images/icons/svg/compas.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /lib/sise/parsers/login.js: -------------------------------------------------------------------------------- 1 | var $ = require('cheerio') 2 | , vm = require('vm') 3 | 4 | var debug = require('debug')('@:lib:sise:loginParser') 5 | 6 | var compiled = null 7 | , cache = null 8 | 9 | exports.form = function (html) { 10 | /** 11 | * 如果 HTML 没变,就直接返回之前的结果 12 | */ 13 | 14 | if (html === cache) { 15 | return compiled 16 | } 17 | 18 | var form = $(html).find('form') 19 | 20 | if (!form) { 21 | debug('tag
not found') 22 | return null 23 | } 24 | 25 | /** 26 | * DOM 静态分析,提取出 CSRF 字段 27 | */ 28 | 29 | var csrf = form.find('input[type="hidden"]') 30 | 31 | if (!csrf) { 32 | debug('csrf field not found') 33 | return null 34 | } 35 | 36 | var csrfKey = csrf.attr('name') 37 | , csrfValue = csrf.attr('value') 38 | 39 | if (!csrfKey || !csrfValue) { 40 | debug('csrf field key or value parse failed') 41 | return null 42 | } 43 | 44 | debug('parsed csrf %s = %s', csrfKey, csrfValue) 45 | 46 | var action = form.attr('action') 47 | if (!action) { 48 | /** 49 | * 脚本动态分析,提取出表单提交目标 50 | */ 51 | 52 | var script = $(html).find('script') 53 | 54 | if (!script) { 55 | debug('tag