├── .babelrc ├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── README.md ├── build ├── build.js ├── check-versions.js ├── dev-client.js ├── dev-server.js ├── utils.js ├── webpack.base.conf.js ├── webpack.dev.conf.js └── webpack.prod.conf.js ├── config ├── dev.env.js ├── index.js └── prod.env.js ├── image-for-readme ├── 1.png ├── 2.png ├── 3.png └── 4.png ├── index.html ├── package.json ├── server ├── app.js ├── controller │ └── index.js ├── model │ └── index.js ├── server.js ├── static │ ├── css │ │ ├── app.c7e23efc85a8721dd88a0f50dd1c860e.css │ │ └── app.c7e23efc85a8721dd88a0f50dd1c860e.css.map │ ├── data │ │ ├── data-generator.js │ │ └── data.json │ ├── fonts │ │ ├── element-icons.a61be9c.eot │ │ └── element-icons.b02bdc1.ttf │ ├── img │ │ ├── auth-bg.eecd130.jpg │ │ ├── element-icons.09162bc.svg │ │ ├── main-bg.dd44841.jpg │ │ ├── slide-bg-0.799e6bb.jpg │ │ ├── slide-bg-1.bb2871b.jpg │ │ ├── slide-bg-2.6218b3b.jpg │ │ ├── slide-bg-3.e8439ee.jpg │ │ ├── slide-bg-4.68bbb97.jpg │ │ ├── slide-bg-5.f7ee61d.jpg │ │ ├── slide-bg-6.946d147.jpg │ │ ├── slide-bg-7.d624d95.jpg │ │ ├── slide-bg-8.52a375d.jpg │ │ └── slide-bg-9.e32a001.jpg │ └── js │ │ ├── app.ef351a235c2fca488adb.js │ │ ├── app.ef351a235c2fca488adb.js.map │ │ ├── manifest.8ab29990a8dbbd47c2ea.js │ │ ├── manifest.8ab29990a8dbbd47c2ea.js.map │ │ ├── vendor.981981282e9405fce695.js │ │ └── vendor.981981282e9405fce695.js.map └── views │ └── index.html ├── src ├── App.vue ├── assets │ ├── auth-bg.jpg │ ├── logo.png │ ├── main-bg.jpg │ ├── slide-bg-0.jpg │ ├── slide-bg-1.jpg │ ├── slide-bg-2.jpg │ ├── slide-bg-3.jpg │ ├── slide-bg-4.jpg │ ├── slide-bg-5.jpg │ ├── slide-bg-6.jpg │ ├── slide-bg-7.jpg │ ├── slide-bg-8.jpg │ └── slide-bg-9.jpg ├── components │ ├── auth │ │ ├── StarFlow.vue │ │ └── auth.vue │ └── main │ │ ├── Main.vue │ │ ├── management │ │ ├── EditTimeRecord.vue │ │ ├── Management.vue │ │ ├── TimeAnalysisByType.vue │ │ ├── TimeAnalysisPerMonth.vue │ │ └── TimeAnalysisPerYear.vue │ │ └── time_show │ │ ├── TimeSlide.vue │ │ └── Timeline.vue ├── entry.js ├── router │ └── index.js └── store │ ├── actions.js │ ├── index.js │ └── mutations.js └── static └── data ├── data-generator.js └── data.json /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["es2015", "stage-2"], 3 | "plugins": ["transform-runtime"], 4 | "comments": false, 5 | "env": { 6 | "test": { 7 | "plugins": [ "istanbul" ] 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | build/*.js 2 | config/*.js 3 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | parser: 'babel-eslint', 4 | parserOptions: { 5 | sourceType: 'module' 6 | }, 7 | // https://github.com/feross/standard/blob/master/RULES.md#javascript-standard-style 8 | extends: 'standard', 9 | // required to lint *.vue files 10 | plugins: [ 11 | 'html' 12 | ], 13 | // add your custom rules here 14 | 'rules': { 15 | // allow paren-less arrow functions 16 | 'arrow-parens': 0, 17 | // allow async-await 18 | 'generator-star-spacing': 0, 19 | // allow debugger during development 20 | 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | npm-debug.log 4 | sessions/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Timeline-X 2 | 3 | > A Simple Timeline Application. SPA. Powered By Vue/Vue-router/Vuex. 4 | 5 | ## 一、项目构建启动 6 | 7 | ``` bash 8 | # 安装依赖 9 | npm install 10 | 11 | # 生成伪数据(开发用) 12 | npm run fake-data 13 | 14 | # API服务器,localhost:8081 15 | # 启动后端之前需要先完成构建得到前端的资源 16 | # 验证密码为"hongchh",可以在/server/controller/index.js里面修改密码 17 | # 应用比较简单故没有使用到数据库,所有数据都为文件存储,项目主要关注前端开发 18 | npm run back-end 19 | 20 | # 前端开发,localhost:8080 21 | # dev-server已经使用http-proxy完成跟后端API的对接 22 | # 在num run dev之前必须先启动服务器,即在另一个命令行窗口下执行npm run back-end 23 | # 浏览器页面缩放请保持在100% 24 | npm run dev 25 | 26 | # 构建最终产品 27 | npm run build 28 | ``` 29 | 30 | ## 二、成品展示 31 | ![1](image-for-readme/1.png) 32 | ![2](image-for-readme/2.png) 33 | ![3](image-for-readme/3.png) 34 | ![4](image-for-readme/4.png) 35 | 36 | ## 三、基本需求 37 | ### 1、时间记录 38 | * 添加每一天的时间记录,修改某天的时间记录(因为可能记错或者忘了记某项活动) 39 | * 每天的记录可以有多项活动,每项活动有对应的时间 40 | * 每项活动划分到特定的类型 41 | 42 | ```txt 43 | 2016-01-20,星期五 44 | 1. 学习Vue, 5h,[学习] 45 | 2. 跑步,0.5h,[运动] 46 | 3. 看霹雳布袋戏,2h,[休闲] 47 | ``` 48 | 49 | ### 2、数据分析 50 | * 按照月份统计每天的总时间,按照年份统计每月的总时间,按照分类统计各项内容的总时间 51 | * 以图表形式展示月份时间支出和年份时间支出的变化情况 52 | * 以图表形式展示各种类型的活动的时间支出情况 53 | * 计算总时间和平均时间 54 | 55 | ### 3、时光展示 56 | * 时光轴形式进行活动记录展示,便于回顾总结 57 | * ~~轮播图形式进行活动记录展示,便于回顾总结~~ 58 | * 图片展示活动记录,不使用轮播图,轮播图在记录太多的时候会影响页面流畅程度 59 | 60 | ### 4、数据模型 61 | ```json 62 | { 63 | "items": [{ 64 | "content": "string", 65 | "time": "number", 66 | "type": "string" 67 | }], 68 | "year": "number", 69 | "month": "number", 70 | "date": "number", 71 | "day": "number" 72 | } 73 | ``` 74 | 75 | 数据项示例 76 | ```json 77 | { 78 | "items": [{ 79 | "content": "学习Vue", 80 | "time": "5", 81 | "type": "学习" 82 | }, { 83 | "content": "跑步", 84 | "time": "0.5", 85 | "type": "运动" 86 | }, { 87 | "content": "看霹雳布袋戏", 88 | "time": "2", 89 | "type": "休闲" 90 | }], 91 | "year": "2016", 92 | "month": "01", 93 | "date": "20", 94 | "day": "5" 95 | } 96 | ``` 97 | 98 | ## 四、开发思路 99 | ### 1、界面构成 100 | * 整个应用分成2个主要界面:【主界面】,【权限界面】 101 | * 【权限界面】用于用户登录,也是应用的启动界面 102 | * 【主界面】包含3个子界面:【管理】,【时光轴】,【时光展】 103 | * 【时光轴】和【时光展】用于时光展示 104 | * 【管理】用于展示数据分析结果以及编辑时光记录(添加/修改) 105 | 106 | ### 2、跳转关系 107 | * 【权限界面】验证成功之后跳转到【主界面】 108 | * 【主界面】默认展示【时光轴】界面 109 | * 【主界面】顶栏可以选择跳转到【管理】、【时光轴】或【时光展】界面 110 | * 【主界面】顶栏选择“锁屏”之后回到【权限界面】 111 | 112 | ### 3、组件划分 113 | ```txt 114 | └─App:挂载整个应用 115 | ├─Auth:【权限界面】 116 | │ └─StarFlow:【权限界面】底部的动画 117 | └─Main:【主界面】的基本结构 118 | ├─Management:【管理】 119 | │ ├─TimeAnalysisPerMonth:月份时间分析组件 120 | │ ├─TimeAnalysisPerYear:年份时间分析组件 121 | │ ├─TimeAnalysisByType:分类时间分析组件 122 | │ └─EditTimeRecord:时间记录编辑组件 123 | ├─Timeline:【时光轴】 124 | └─TimeSlide:【时光展】 125 | ``` 126 | 127 | ### 4、文件结构 128 | ```txt 129 | └─build:构建用到的相关文件 130 | ├─config:构建的配置文件 131 | ├─server:应用的服务器源码 132 | │ ├─controller:服务端业务逻辑 133 | │ ├─model:数据存储逻辑 134 | │ ├─static:静态文件 135 | │ ├─views:应用的视图文件 136 | │ ├─app.js:express服务器配置文件 137 | │ └─server.js:服务器启动文件 138 | ├─src:前端开发源码 139 | │ ├─assets:图片等静态资源 140 | │ ├─components:前端组件 141 | │ ├─router:前端路由 142 | │ ├─store:vuex的store 143 | │ ├─App.vue:应用的外层结构 144 | │ └─entry.js:应用的入口文件 145 | └─static:前端开发过程中用到的静态文件 146 | └─data:存放伪数据以及伪数据生成器 147 | ``` 148 | -------------------------------------------------------------------------------- /build/build.js: -------------------------------------------------------------------------------- 1 | // https://github.com/shelljs/shelljs 2 | require('./check-versions')() 3 | require('shelljs/global') 4 | env.NODE_ENV = 'production' 5 | 6 | var path = require('path') 7 | var config = require('../config') 8 | var ora = require('ora') 9 | var webpack = require('webpack') 10 | var webpackConfig = require('./webpack.prod.conf') 11 | 12 | console.log( 13 | ' Tip:\n' + 14 | ' Built files are meant to be served over an HTTP server.\n' + 15 | ' Opening index.html over file:// won\'t work.\n' 16 | ) 17 | 18 | var spinner = ora('building for production...') 19 | spinner.start() 20 | 21 | var assetsPath = path.join(config.build.assetsRoot, config.build.assetsSubDirectory) 22 | rm('-rf', assetsPath) 23 | mkdir('-p', assetsPath) 24 | cp('-R', 'static/*', assetsPath) 25 | 26 | webpack(webpackConfig, function (err, stats) { 27 | spinner.stop() 28 | if (err) throw err 29 | process.stdout.write(stats.toString({ 30 | colors: true, 31 | modules: false, 32 | children: false, 33 | chunks: false, 34 | chunkModules: false 35 | }) + '\n') 36 | }) 37 | -------------------------------------------------------------------------------- /build/check-versions.js: -------------------------------------------------------------------------------- 1 | var semver = require('semver') 2 | var chalk = require('chalk') 3 | var packageConfig = require('../package.json') 4 | var exec = function (cmd) { 5 | return require('child_process') 6 | .execSync(cmd).toString().trim() 7 | } 8 | 9 | var versionRequirements = [ 10 | { 11 | name: 'node', 12 | currentVersion: semver.clean(process.version), 13 | versionRequirement: packageConfig.engines.node 14 | }, 15 | { 16 | name: 'npm', 17 | currentVersion: exec('npm --version'), 18 | versionRequirement: packageConfig.engines.npm 19 | } 20 | ] 21 | 22 | module.exports = function () { 23 | var warnings = [] 24 | for (var i = 0; i < versionRequirements.length; i++) { 25 | var mod = versionRequirements[i] 26 | if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { 27 | warnings.push(mod.name + ': ' + 28 | chalk.red(mod.currentVersion) + ' should be ' + 29 | chalk.green(mod.versionRequirement) 30 | ) 31 | } 32 | } 33 | 34 | if (warnings.length) { 35 | console.log('') 36 | console.log(chalk.yellow('To use this template, you must update following to modules:')) 37 | console.log() 38 | for (var i = 0; i < warnings.length; i++) { 39 | var warning = warnings[i] 40 | console.log(' ' + warning) 41 | } 42 | console.log() 43 | process.exit(1) 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /build/dev-client.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | require('eventsource-polyfill') 3 | var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true') 4 | 5 | hotClient.subscribe(function (event) { 6 | if (event.action === 'reload') { 7 | window.location.reload() 8 | } 9 | }) 10 | -------------------------------------------------------------------------------- /build/dev-server.js: -------------------------------------------------------------------------------- 1 | require('./check-versions')() 2 | var config = require('../config') 3 | if (!process.env.NODE_ENV) process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV) 4 | var path = require('path') 5 | var express = require('express') 6 | var webpack = require('webpack') 7 | var opn = require('opn') 8 | var proxyMiddleware = require('http-proxy-middleware') 9 | var webpackConfig = require('./webpack.dev.conf') 10 | 11 | // default port where dev server listens for incoming traffic 12 | var port = process.env.PORT || config.dev.port 13 | // Define HTTP proxies to your custom API backend 14 | // https://github.com/chimurai/http-proxy-middleware 15 | var proxyTable = config.dev.proxyTable 16 | 17 | var app = express() 18 | var compiler = webpack(webpackConfig) 19 | 20 | var devMiddleware = require('webpack-dev-middleware')(compiler, { 21 | publicPath: webpackConfig.output.publicPath, 22 | quiet: true 23 | }) 24 | 25 | var hotMiddleware = require('webpack-hot-middleware')(compiler, { 26 | log: () => {} 27 | }) 28 | // force page reload when html-webpack-plugin template changes 29 | compiler.plugin('compilation', function (compilation) { 30 | compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) { 31 | hotMiddleware.publish({ action: 'reload' }) 32 | cb() 33 | }) 34 | }) 35 | 36 | // proxy api requests 37 | Object.keys(proxyTable).forEach(function (context) { 38 | var options = proxyTable[context] 39 | if (typeof options === 'string') { 40 | options = { target: options } 41 | } 42 | app.use(proxyMiddleware(context, options)) 43 | }) 44 | 45 | // handle fallback for HTML5 history API 46 | app.use(require('connect-history-api-fallback')()) 47 | 48 | // serve webpack bundle output 49 | app.use(devMiddleware) 50 | 51 | // enable hot-reload and state-preserving 52 | // compilation error display 53 | app.use(hotMiddleware) 54 | 55 | // serve pure static assets 56 | var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory) 57 | app.use(staticPath, express.static('./static')) 58 | 59 | var uri = 'http://localhost:' + port 60 | 61 | devMiddleware.waitUntilValid(function () { 62 | console.log('> Listening at ' + uri + '\n') 63 | }) 64 | 65 | module.exports = app.listen(port, function (err) { 66 | if (err) { 67 | console.log(err) 68 | return 69 | } 70 | 71 | // when env is testing, don't need open it 72 | if (process.env.NODE_ENV !== 'testing') { 73 | opn(uri) 74 | } 75 | }) 76 | -------------------------------------------------------------------------------- /build/utils.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var config = require('../config') 3 | var ExtractTextPlugin = require('extract-text-webpack-plugin') 4 | 5 | exports.assetsPath = function (_path) { 6 | var assetsSubDirectory = process.env.NODE_ENV === 'production' 7 | ? config.build.assetsSubDirectory 8 | : config.dev.assetsSubDirectory 9 | return path.posix.join(assetsSubDirectory, _path) 10 | } 11 | 12 | exports.cssLoaders = function (options) { 13 | options = options || {} 14 | // generate loader string to be used with extract text plugin 15 | function generateLoaders (loaders) { 16 | var sourceLoader = loaders.map(function (loader) { 17 | var extraParamChar 18 | if (/\?/.test(loader)) { 19 | loader = loader.replace(/\?/, '-loader?') 20 | extraParamChar = '&' 21 | } else { 22 | loader = loader + '-loader' 23 | extraParamChar = '?' 24 | } 25 | return loader + (options.sourceMap ? extraParamChar + 'sourceMap' : '') 26 | }).join('!') 27 | 28 | // Extract CSS when that option is specified 29 | // (which is the case during production build) 30 | if (options.extract) { 31 | return ExtractTextPlugin.extract('vue-style-loader', sourceLoader) 32 | } else { 33 | return ['vue-style-loader', sourceLoader].join('!') 34 | } 35 | } 36 | 37 | // http://vuejs.github.io/vue-loader/en/configurations/extract-css.html 38 | return { 39 | css: generateLoaders(['css']), 40 | postcss: generateLoaders(['css']), 41 | less: generateLoaders(['css', 'less']), 42 | sass: generateLoaders(['css', 'sass?indentedSyntax']), 43 | scss: generateLoaders(['css', 'sass']), 44 | stylus: generateLoaders(['css', 'stylus']), 45 | styl: generateLoaders(['css', 'stylus']) 46 | } 47 | } 48 | 49 | // Generate loaders for standalone style files (outside of .vue) 50 | exports.styleLoaders = function (options) { 51 | var output = [] 52 | var loaders = exports.cssLoaders(options) 53 | for (var extension in loaders) { 54 | var loader = loaders[extension] 55 | output.push({ 56 | test: new RegExp('\\.' + extension + '$'), 57 | loader: loader 58 | }) 59 | } 60 | return output 61 | } 62 | -------------------------------------------------------------------------------- /build/webpack.base.conf.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var config = require('../config') 3 | var utils = require('./utils') 4 | var projectRoot = path.resolve(__dirname, '../') 5 | 6 | var env = process.env.NODE_ENV 7 | // check env & config/index.js to decide whether to enable CSS source maps for the 8 | // various preprocessor loaders added to vue-loader at the end of this file 9 | var cssSourceMapDev = (env === 'development' && config.dev.cssSourceMap) 10 | var cssSourceMapProd = (env === 'production' && config.build.productionSourceMap) 11 | var useCssSourceMap = cssSourceMapDev || cssSourceMapProd 12 | 13 | module.exports = { 14 | entry: { 15 | app: './src/entry.js' 16 | }, 17 | output: { 18 | path: config.build.assetsRoot, 19 | publicPath: process.env.NODE_ENV === 'production' ? config.build.assetsPublicPath : config.dev.assetsPublicPath, 20 | filename: '[name].js' 21 | }, 22 | resolve: { 23 | extensions: ['', '.js', '.vue', '.json'], 24 | fallback: [path.join(__dirname, '../node_modules')], 25 | alias: { 26 | 'vue$': 'vue/dist/vue.common.js', 27 | 'src': path.resolve(__dirname, '../src'), 28 | 'assets': path.resolve(__dirname, '../src/assets'), 29 | 'components': path.resolve(__dirname, '../src/components') 30 | } 31 | }, 32 | resolveLoader: { 33 | fallback: [path.join(__dirname, '../node_modules')] 34 | }, 35 | module: { 36 | preLoaders: [ 37 | { 38 | test: /\.vue$/, 39 | loader: 'eslint', 40 | include: [ 41 | path.join(projectRoot, 'src') 42 | ], 43 | exclude: /node_modules/ 44 | }, 45 | { 46 | test: /\.js$/, 47 | loader: 'eslint', 48 | include: [ 49 | path.join(projectRoot, 'src') 50 | ], 51 | exclude: /node_modules/ 52 | } 53 | ], 54 | loaders: [ 55 | { 56 | test: /\.vue$/, 57 | loader: 'vue' 58 | }, 59 | { 60 | test: /\.js$/, 61 | loader: 'babel', 62 | include: [ 63 | path.join(projectRoot, 'src') 64 | ], 65 | exclude: /node_modules/ 66 | }, 67 | { 68 | test: /\.json$/, 69 | loader: 'json' 70 | }, 71 | { 72 | test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, 73 | loader: 'url', 74 | query: { 75 | limit: 10000, 76 | name: utils.assetsPath('img/[name].[hash:7].[ext]') 77 | } 78 | }, 79 | { 80 | test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, 81 | loader: 'url', 82 | query: { 83 | limit: 10000, 84 | name: utils.assetsPath('fonts/[name].[hash:7].[ext]') 85 | } 86 | } 87 | ] 88 | }, 89 | eslint: { 90 | formatter: require('eslint-friendly-formatter') 91 | }, 92 | vue: { 93 | loaders: utils.cssLoaders({ sourceMap: useCssSourceMap }), 94 | postcss: [ 95 | require('autoprefixer')({ 96 | browsers: ['last 2 versions'] 97 | }) 98 | ] 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /build/webpack.dev.conf.js: -------------------------------------------------------------------------------- 1 | var config = require('../config') 2 | var webpack = require('webpack') 3 | var merge = require('webpack-merge') 4 | var utils = require('./utils') 5 | var baseWebpackConfig = require('./webpack.base.conf') 6 | var HtmlWebpackPlugin = require('html-webpack-plugin') 7 | var FriendlyErrors = require('friendly-errors-webpack-plugin') 8 | 9 | // add hot-reload related code to entry chunks 10 | Object.keys(baseWebpackConfig.entry).forEach(function (name) { 11 | baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name]) 12 | }) 13 | 14 | module.exports = merge(baseWebpackConfig, { 15 | module: { 16 | loaders: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap }) 17 | }, 18 | // eval-source-map is faster for development 19 | devtool: '#eval-source-map', 20 | plugins: [ 21 | new webpack.DefinePlugin({ 22 | 'process.env': config.dev.env 23 | }), 24 | // https://github.com/glenjamin/webpack-hot-middleware#installation--usage 25 | new webpack.optimize.OccurrenceOrderPlugin(), 26 | new webpack.HotModuleReplacementPlugin(), 27 | new webpack.NoErrorsPlugin(), 28 | // https://github.com/ampedandwired/html-webpack-plugin 29 | new HtmlWebpackPlugin({ 30 | filename: 'index.html', 31 | template: 'index.html', 32 | inject: true 33 | }), 34 | new FriendlyErrors() 35 | ] 36 | }) 37 | -------------------------------------------------------------------------------- /build/webpack.prod.conf.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var config = require('../config') 3 | var utils = require('./utils') 4 | var webpack = require('webpack') 5 | var merge = require('webpack-merge') 6 | var baseWebpackConfig = require('./webpack.base.conf') 7 | var ExtractTextPlugin = require('extract-text-webpack-plugin') 8 | var HtmlWebpackPlugin = require('html-webpack-plugin') 9 | var env = config.build.env 10 | 11 | var webpackConfig = merge(baseWebpackConfig, { 12 | module: { 13 | loaders: utils.styleLoaders({ sourceMap: config.build.productionSourceMap, extract: true }) 14 | }, 15 | devtool: config.build.productionSourceMap ? '#source-map' : false, 16 | output: { 17 | path: config.build.assetsRoot, 18 | filename: utils.assetsPath('js/[name].[chunkhash].js'), 19 | chunkFilename: utils.assetsPath('js/[id].[chunkhash].js') 20 | }, 21 | vue: { 22 | loaders: utils.cssLoaders({ 23 | sourceMap: config.build.productionSourceMap, 24 | extract: true 25 | }) 26 | }, 27 | plugins: [ 28 | // http://vuejs.github.io/vue-loader/en/workflow/production.html 29 | new webpack.DefinePlugin({ 30 | 'process.env': env 31 | }), 32 | new webpack.optimize.UglifyJsPlugin({ 33 | compress: { 34 | warnings: false 35 | } 36 | }), 37 | new webpack.optimize.OccurrenceOrderPlugin(), 38 | // extract css into its own file 39 | new ExtractTextPlugin(utils.assetsPath('css/[name].[contenthash].css')), 40 | // generate dist index.html with correct asset hash for caching. 41 | // you can customize output by editing /index.html 42 | // see https://github.com/ampedandwired/html-webpack-plugin 43 | new HtmlWebpackPlugin({ 44 | filename: config.build.index, 45 | template: 'index.html', 46 | inject: true, 47 | minify: { 48 | removeComments: true, 49 | collapseWhitespace: true, 50 | removeAttributeQuotes: true 51 | // more options: 52 | // https://github.com/kangax/html-minifier#options-quick-reference 53 | }, 54 | // necessary to consistently work with multiple chunks via CommonsChunkPlugin 55 | chunksSortMode: 'dependency' 56 | }), 57 | // split vendor js into its own file 58 | new webpack.optimize.CommonsChunkPlugin({ 59 | name: 'vendor', 60 | minChunks: function (module, count) { 61 | // any required modules inside node_modules are extracted to vendor 62 | return ( 63 | module.resource && 64 | /\.js$/.test(module.resource) && 65 | module.resource.indexOf( 66 | path.join(__dirname, '../node_modules') 67 | ) === 0 68 | ) 69 | } 70 | }), 71 | // extract webpack runtime and module manifest to its own file in order to 72 | // prevent vendor hash from being updated whenever app bundle is updated 73 | new webpack.optimize.CommonsChunkPlugin({ 74 | name: 'manifest', 75 | chunks: ['vendor'] 76 | }) 77 | ] 78 | }) 79 | 80 | if (config.build.productionGzip) { 81 | var CompressionWebpackPlugin = require('compression-webpack-plugin') 82 | 83 | webpackConfig.plugins.push( 84 | new CompressionWebpackPlugin({ 85 | asset: '[path].gz[query]', 86 | algorithm: 'gzip', 87 | test: new RegExp( 88 | '\\.(' + 89 | config.build.productionGzipExtensions.join('|') + 90 | ')$' 91 | ), 92 | threshold: 10240, 93 | minRatio: 0.8 94 | }) 95 | ) 96 | } 97 | 98 | module.exports = webpackConfig 99 | -------------------------------------------------------------------------------- /config/dev.env.js: -------------------------------------------------------------------------------- 1 | var merge = require('webpack-merge') 2 | var prodEnv = require('./prod.env') 3 | 4 | module.exports = merge(prodEnv, { 5 | NODE_ENV: '"development"' 6 | }) 7 | -------------------------------------------------------------------------------- /config/index.js: -------------------------------------------------------------------------------- 1 | // see http://vuejs-templates.github.io/webpack for documentation. 2 | var path = require('path') 3 | 4 | module.exports = { 5 | build: { 6 | env: require('./prod.env'), 7 | index: path.resolve(__dirname, '../server/views/index.html'), 8 | assetsRoot: path.resolve(__dirname, '../server'), 9 | assetsSubDirectory: 'static', 10 | assetsPublicPath: '/', 11 | productionSourceMap: true, 12 | // Gzip off by default as many popular static hosts such as 13 | // Surge or Netlify already gzip all static assets for you. 14 | // Before setting to `true`, make sure to: 15 | // npm install --save-dev compression-webpack-plugin 16 | productionGzip: false, 17 | productionGzipExtensions: ['js', 'css'] 18 | }, 19 | dev: { 20 | env: require('./dev.env'), 21 | port: 8080, 22 | assetsSubDirectory: 'static', 23 | assetsPublicPath: '/', 24 | proxyTable: { 25 | '/api': 'http://localhost:8081' 26 | }, 27 | // CSS Sourcemaps off by default because relative paths are "buggy" 28 | // with this option, according to the CSS-Loader README 29 | // (https://github.com/webpack/css-loader#sourcemaps) 30 | // In our experience, they generally work as expected, 31 | // just be aware of this issue when enabling this option. 32 | cssSourceMap: false 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /config/prod.env.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | NODE_ENV: '"production"' 3 | } 4 | -------------------------------------------------------------------------------- /image-for-readme/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongchh/timeline-x/e2984a1acaa6e662815dd33f344f442ee1747354/image-for-readme/1.png -------------------------------------------------------------------------------- /image-for-readme/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongchh/timeline-x/e2984a1acaa6e662815dd33f344f442ee1747354/image-for-readme/2.png -------------------------------------------------------------------------------- /image-for-readme/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongchh/timeline-x/e2984a1acaa6e662815dd33f344f442ee1747354/image-for-readme/3.png -------------------------------------------------------------------------------- /image-for-readme/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongchh/timeline-x/e2984a1acaa6e662815dd33f344f442ee1747354/image-for-readme/4.png -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | timeline-x 6 | 7 | 8 |
9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "timeline-x", 3 | "version": "1.0.0", 4 | "description": "A Simple Timeline Application", 5 | "author": "hongchh ", 6 | "private": true, 7 | "scripts": { 8 | "dev": "node build/dev-server.js", 9 | "build": "node build/build.js", 10 | "lint": "eslint --ext .js,.vue src", 11 | "fake-data": "node ./static/data/data-generator.js", 12 | "back-end": "node ./server/server.js" 13 | }, 14 | "dependencies": { 15 | "axios": "^0.15.3", 16 | "body-parser": "^1.16.0", 17 | "connect-history-api-fallback": "^1.3.0", 18 | "cookie-parser": "^1.4.3", 19 | "echarts": "^3.4.0", 20 | "element-ui": "^1.1.5", 21 | "express": "^4.14.0", 22 | "express-session": "^1.15.0", 23 | "session-file-store": "^1.0.0", 24 | "vue": "^2.1.0", 25 | "vue-router": "^2.1.3", 26 | "vuex": "^2.1.1" 27 | }, 28 | "devDependencies": { 29 | "autoprefixer": "^6.4.0", 30 | "babel-core": "^6.0.0", 31 | "babel-eslint": "^7.0.0", 32 | "babel-loader": "^6.0.0", 33 | "babel-plugin-transform-runtime": "^6.0.0", 34 | "babel-preset-es2015": "^6.0.0", 35 | "babel-preset-stage-2": "^6.0.0", 36 | "babel-register": "^6.0.0", 37 | "chalk": "^1.1.3", 38 | "connect-history-api-fallback": "^1.1.0", 39 | "css-loader": "^0.25.0", 40 | "eslint": "^3.7.1", 41 | "eslint-config-standard": "^6.1.0", 42 | "eslint-friendly-formatter": "^2.0.5", 43 | "eslint-loader": "^1.5.0", 44 | "eslint-plugin-html": "^1.3.0", 45 | "eslint-plugin-promise": "^3.4.0", 46 | "eslint-plugin-standard": "^2.0.1", 47 | "eventsource-polyfill": "^0.9.6", 48 | "express": "^4.13.3", 49 | "extract-text-webpack-plugin": "^1.0.1", 50 | "file-loader": "^0.9.0", 51 | "friendly-errors-webpack-plugin": "^1.1.2", 52 | "function-bind": "^1.0.2", 53 | "html-webpack-plugin": "^2.8.1", 54 | "http-proxy-middleware": "^0.17.2", 55 | "jade": "^1.11.0", 56 | "json-loader": "^0.5.4", 57 | "node-sass": "^4.3.0", 58 | "opn": "^4.0.2", 59 | "ora": "^0.3.0", 60 | "sass-loader": "^4.1.1", 61 | "semver": "^5.3.0", 62 | "shelljs": "^0.7.4", 63 | "url-loader": "^0.5.7", 64 | "vue-loader": "^10.0.0", 65 | "vue-style-loader": "^1.0.0", 66 | "vue-template-compiler": "^2.1.0", 67 | "webpack": "^1.13.2", 68 | "webpack-dev-middleware": "^1.8.3", 69 | "webpack-hot-middleware": "^2.12.2", 70 | "webpack-merge": "^0.14.1" 71 | }, 72 | "engines": { 73 | "node": ">= 4.0.0", 74 | "npm": ">= 3.0.0" 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /server/app.js: -------------------------------------------------------------------------------- 1 | let express = require('express') 2 | let path = require('path') 3 | let cookieParser = require('cookie-parser') 4 | let bodyParser = require('body-parser') 5 | let session = require('express-session') 6 | let FileStore = require('session-file-store')(session) 7 | let history = require('connect-history-api-fallback') 8 | let controller = require('./controller') 9 | 10 | let app = express() 11 | 12 | app.set('views', path.join(__dirname, 'views')) 13 | app.use(bodyParser.json()) 14 | app.use(bodyParser.urlencoded({ extended: false })) 15 | app.use(cookieParser()) 16 | app.use(session({ 17 | store: new FileStore(), 18 | secret: 'hongchh', 19 | resave: false, 20 | saveUninitialized: false 21 | })); 22 | app.use(history()) 23 | app.use('/static', express.static(path.join(__dirname, './static'))) 24 | app.use('/', controller) 25 | 26 | module.exports = app -------------------------------------------------------------------------------- /server/controller/index.js: -------------------------------------------------------------------------------- 1 | let index = require('express').Router() 2 | let html = require('fs').readFileSync(__dirname + '/../views/index.html') 3 | let model = require('../model') 4 | const PASSWORD = 'hongchh' 5 | 6 | index.post('/api/add', (req, res) => { // 添加记录 7 | try { 8 | model.set(req.body) 9 | res.json({ err: false }) 10 | } catch (e) { 11 | res.json({ err: true }) 12 | } 13 | }) 14 | 15 | index.post('/api/check', (req, res) => { // 验证密码解除锁屏 16 | if (req.body.password === PASSWORD) { 17 | res.json({ err: false }) 18 | } else { 19 | res.json({ err: true }) 20 | } 21 | }) 22 | 23 | index.get('/api/records', (req, res) => { // 获取所有记录 24 | res.json(model.get()) 25 | }) 26 | 27 | index.get('*', (req, res) => { 28 | res.status(200).end(html) 29 | }) 30 | 31 | module.exports = index -------------------------------------------------------------------------------- /server/model/index.js: -------------------------------------------------------------------------------- 1 | let fs = require('fs') 2 | let data = fs.readFileSync(__dirname + '/../static/data/data.json') 3 | let int = Number.parseInt 4 | 5 | data = JSON.parse(data) 6 | 7 | const saveIntoFile = () => { 8 | fs.writeFileSync(__dirname + '/../static/data/data.json', JSON.stringify(data)) 9 | } 10 | 11 | model = { 12 | get () { 13 | return data 14 | }, 15 | 16 | set (newRecord) { 17 | for (let record of data) { 18 | if (int(record.year) === int(newRecord.year) && 19 | int(record.month) === int(newRecord.month) && 20 | int(record.date) === int(newRecord.date)) { // 更新已有记录 21 | record.items = newRecord.items 22 | saveIntoFile() 23 | return 24 | } 25 | } 26 | data.push(newRecord) // 添加新纪录 27 | data.sort((a, b) => { // 按照时间排序 28 | let t1 = new Date(a.year + '-' + a.month + '-' + a.date) 29 | let t2 = new Date(b.year + '-' + b.month + '-' + b.date) 30 | if (t1.getTime() < t2.getTime()) return 1 31 | if (t1.getTime() > t2.getTime()) return -1 32 | return 0 33 | }) 34 | saveIntoFile() 35 | } 36 | } 37 | 38 | module.exports = model -------------------------------------------------------------------------------- /server/server.js: -------------------------------------------------------------------------------- 1 | let http = require('http') 2 | let app = require('./app') 3 | let port = '8081' 4 | 5 | app.set('port', port) 6 | http.createServer(app).listen(port) 7 | 8 | console.log(" > server start to listen at localhost:" + port) 9 | -------------------------------------------------------------------------------- /server/static/data/data-generator.js: -------------------------------------------------------------------------------- 1 | let fs = require('fs') 2 | 3 | let dateTime = new Date('2016-08-31') 4 | let types = ['学习', '工作', '运动'] 5 | let fakeContent = ['上课', '做作业', '跑步'] 6 | let fakeTime = [ 7 | (() => 4 + Math.random() * 4), 8 | (() => 2 + Math.random() * 6), 9 | (() => 0.5) 10 | ] 11 | 12 | let format = (date) => { 13 | let t = {} 14 | t.year = date.getFullYear() 15 | t.month = (date.getMonth() + 1) 16 | if (t.month < 10) t.month = '0' + t.month 17 | t.date = date.getDate() 18 | if (t.date < 10) t.date = '0' + t.date 19 | t.day = date.getDay() 20 | return t 21 | } 22 | 23 | let data = [] 24 | 25 | for (let i = 0; i < 145; ++i) { 26 | dateTime = new Date(dateTime.getTime() + 86400000) 27 | let t = format(dateTime) 28 | let items = [] 29 | for (j = 0; j < 3; ++j) { 30 | items.push({ 31 | content: fakeContent[j], 32 | time: fakeTime[j]().toFixed(1), 33 | type: types[j] 34 | }) 35 | } 36 | data.push({ 37 | year: t.year, 38 | month: t.month, 39 | date: t.date, 40 | day: t.day, 41 | items: items 42 | }) 43 | } 44 | 45 | fs.writeFileSync(__dirname + '/data.json', JSON.stringify(data.reverse())) -------------------------------------------------------------------------------- /server/static/data/data.json: -------------------------------------------------------------------------------- 1 | [{"year":2017,"month":2,"date":23,"day":4,"items":[{"content":"test","time":8,"type":"学习"}]},{"year":2017,"month":2,"date":22,"day":3,"items":[{"content":"test","time":8,"type":"学习"}]},{"year":2017,"month":2,"date":21,"day":2,"items":[{"content":"test","time":10,"type":"学习"}]},{"year":2017,"month":2,"date":20,"day":1,"items":[{"content":"233333","time":11.5,"type":"工作"}]},{"year":2017,"month":2,"date":19,"day":0,"items":[{"content":"66666","time":3,"type":"休闲"},{"content":"javascript","time":4,"type":"工作"},{"content":"跑步","time":0.5,"type":"运动"}]},{"year":2017,"month":"01","date":23,"day":1,"items":[{"content":"上课","time":"6.2","type":"学习"},{"content":"做作业","time":"6.6","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":22,"day":0,"items":[{"content":"上课","time":"7.4","type":"学习"},{"content":"做作业","time":"2.2","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":21,"day":6,"items":[{"content":"上课","time":"8.0","type":"学习"},{"content":"做作业","time":"6.4","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":20,"day":5,"items":[{"content":"上课","time":"7.4","type":"学习"},{"content":"做作业","time":"3.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":19,"day":4,"items":[{"content":"上课","time":"6.5","type":"学习"},{"content":"做作业","time":"5.6","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":18,"day":3,"items":[{"content":"上课","time":"7.8","type":"学习"},{"content":"做作业","time":"2.4","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":17,"day":2,"items":[{"content":"上课","time":"6.0","type":"学习"},{"content":"做作业","time":"3.3","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":16,"day":1,"items":[{"content":"上课","time":"6.9","type":"学习"},{"content":"做作业","time":"4.6","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":15,"day":0,"items":[{"content":"上课","time":"5.4","type":"学习"},{"content":"做作业","time":"7.5","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":14,"day":6,"items":[{"content":"上课","time":"5.6","type":"学习"},{"content":"做作业","time":"2.3","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":13,"day":5,"items":[{"content":"上课","time":"4.4","type":"学习"},{"content":"做作业","time":"4.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":12,"day":4,"items":[{"content":"上课","time":"4.4","type":"学习"},{"content":"做作业","time":"7.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":11,"day":3,"items":[{"content":"上课","time":"4.9","type":"学习"},{"content":"做作业","time":"4.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":10,"day":2,"items":[{"content":"上课","time":"5.0","type":"学习"},{"content":"做作业","time":"4.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":"09","day":1,"items":[{"content":"上课","time":"4.9","type":"学习"},{"content":"做作业","time":"6.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":"08","day":0,"items":[{"content":"上课","time":"7.4","type":"学习"},{"content":"做作业","time":"3.1","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":"07","day":6,"items":[{"content":"上课","time":"4.8","type":"学习"},{"content":"做作业","time":"7.7","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":"06","day":5,"items":[{"content":"上课","time":"4.8","type":"学习"},{"content":"做作业","time":"3.2","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":"05","day":4,"items":[{"content":"上课","time":"6.1","type":"学习"},{"content":"做作业","time":"3.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":"04","day":3,"items":[{"content":"上课","time":"5.3","type":"学习"},{"content":"做作业","time":"4.1","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":"03","day":2,"items":[{"content":"上课","time":"4.2","type":"学习"},{"content":"做作业","time":"5.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":"02","day":1,"items":[{"content":"上课","time":"7.9","type":"学习"},{"content":"做作业","time":"4.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":"01","day":0,"items":[{"content":"上课","time":"4.9","type":"学习"},{"content":"做作业","time":"2.7","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":31,"day":6,"items":[{"content":"上课","time":"7.6","type":"学习"},{"content":"做作业","time":"4.1","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":30,"day":5,"items":[{"content":"上课","time":"4.9","type":"学习"},{"content":"做作业","time":"3.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":29,"day":4,"items":[{"content":"上课","time":"6.6","type":"学习"},{"content":"做作业","time":"7.2","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":28,"day":3,"items":[{"content":"上课","time":"6.2","type":"学习"},{"content":"做作业","time":"6.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":27,"day":2,"items":[{"content":"上课","time":"4.5","type":"学习"},{"content":"做作业","time":"4.3","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":26,"day":1,"items":[{"content":"上课","time":"5.2","type":"学习"},{"content":"做作业","time":"6.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":25,"day":0,"items":[{"content":"上课","time":"4.4","type":"学习"},{"content":"做作业","time":"4.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":24,"day":6,"items":[{"content":"上课","time":"6.2","type":"学习"},{"content":"做作业","time":"4.1","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":23,"day":5,"items":[{"content":"上课","time":"5.5","type":"学习"},{"content":"做作业","time":"6.3","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":22,"day":4,"items":[{"content":"上课","time":"7.2","type":"学习"},{"content":"做作业","time":"2.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":21,"day":3,"items":[{"content":"上课","time":"5.3","type":"学习"},{"content":"做作业","time":"5.2","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":20,"day":2,"items":[{"content":"上课","time":"4.8","type":"学习"},{"content":"做作业","time":"7.2","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":19,"day":1,"items":[{"content":"上课","time":"7.5","type":"学习"},{"content":"做作业","time":"7.3","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":18,"day":0,"items":[{"content":"上课","time":"4.5","type":"学习"},{"content":"做作业","time":"7.1","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":17,"day":6,"items":[{"content":"上课","time":"5.6","type":"学习"},{"content":"做作业","time":"6.7","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":16,"day":5,"items":[{"content":"上课","time":"4.7","type":"学习"},{"content":"做作业","time":"3.6","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":15,"day":4,"items":[{"content":"上课","time":"5.3","type":"学习"},{"content":"做作业","time":"5.4","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":14,"day":3,"items":[{"content":"上课","time":"6.3","type":"学习"},{"content":"做作业","time":"4.1","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":13,"day":2,"items":[{"content":"上课","time":"5.3","type":"学习"},{"content":"做作业","time":"3.1","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":12,"day":1,"items":[{"content":"上课","time":"7.9","type":"学习"},{"content":"做作业","time":"6.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":11,"day":0,"items":[{"content":"上课","time":"5.9","type":"学习"},{"content":"做作业","time":"6.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":10,"day":6,"items":[{"content":"上课","time":"6.0","type":"学习"},{"content":"做作业","time":"4.7","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":"09","day":5,"items":[{"content":"上课","time":"7.4","type":"学习"},{"content":"做作业","time":"6.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":"08","day":4,"items":[{"content":"上课","time":"5.1","type":"学习"},{"content":"做作业","time":"3.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":"07","day":3,"items":[{"content":"上课","time":"7.7","type":"学习"},{"content":"做作业","time":"7.2","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":"06","day":2,"items":[{"content":"上课","time":"4.4","type":"学习"},{"content":"做作业","time":"7.2","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":"05","day":1,"items":[{"content":"上课","time":"5.2","type":"学习"},{"content":"做作业","time":"5.4","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":"04","day":0,"items":[{"content":"上课","time":"4.1","type":"学习"},{"content":"做作业","time":"7.6","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":"03","day":6,"items":[{"content":"上课","time":"7.7","type":"学习"},{"content":"做作业","time":"2.5","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":"02","day":5,"items":[{"content":"上课","time":"5.9","type":"学习"},{"content":"做作业","time":"3.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":"01","day":4,"items":[{"content":"上课","time":"7.2","type":"学习"},{"content":"做作业","time":"6.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":30,"day":3,"items":[{"content":"上课","time":"7.7","type":"学习"},{"content":"做作业","time":"4.6","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":29,"day":2,"items":[{"content":"上课","time":"4.4","type":"学习"},{"content":"做作业","time":"3.4","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":28,"day":1,"items":[{"content":"上课","time":"5.5","type":"学习"},{"content":"做作业","time":"3.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":27,"day":0,"items":[{"content":"上课","time":"7.3","type":"学习"},{"content":"做作业","time":"6.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":26,"day":6,"items":[{"content":"上课","time":"5.8","type":"学习"},{"content":"做作业","time":"2.1","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":25,"day":5,"items":[{"content":"上课","time":"4.9","type":"学习"},{"content":"做作业","time":"7.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":24,"day":4,"items":[{"content":"上课","time":"4.2","type":"学习"},{"content":"做作业","time":"2.3","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":23,"day":3,"items":[{"content":"上课","time":"6.8","type":"学习"},{"content":"做作业","time":"7.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":22,"day":2,"items":[{"content":"上课","time":"6.7","type":"学习"},{"content":"做作业","time":"7.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":21,"day":1,"items":[{"content":"上课","time":"4.1","type":"学习"},{"content":"做作业","time":"7.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":20,"day":0,"items":[{"content":"上课","time":"4.1","type":"学习"},{"content":"做作业","time":"4.1","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":19,"day":6,"items":[{"content":"上课","time":"5.2","type":"学习"},{"content":"做作业","time":"5.7","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":18,"day":5,"items":[{"content":"上课","time":"7.7","type":"学习"},{"content":"做作业","time":"7.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":17,"day":4,"items":[{"content":"上课","time":"4.2","type":"学习"},{"content":"做作业","time":"4.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":16,"day":3,"items":[{"content":"上课","time":"7.6","type":"学习"},{"content":"做作业","time":"7.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":15,"day":2,"items":[{"content":"上课","time":"5.5","type":"学习"},{"content":"做作业","time":"3.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":14,"day":1,"items":[{"content":"上课","time":"7.1","type":"学习"},{"content":"做作业","time":"7.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":13,"day":0,"items":[{"content":"上课","time":"6.7","type":"学习"},{"content":"做作业","time":"2.7","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":12,"day":6,"items":[{"content":"上课","time":"5.8","type":"学习"},{"content":"做作业","time":"2.1","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":11,"day":5,"items":[{"content":"上课","time":"7.6","type":"学习"},{"content":"做作业","time":"6.7","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":10,"day":4,"items":[{"content":"上课","time":"6.4","type":"学习"},{"content":"做作业","time":"3.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":"09","day":3,"items":[{"content":"上课","time":"4.1","type":"学习"},{"content":"做作业","time":"5.2","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":"08","day":2,"items":[{"content":"上课","time":"6.4","type":"学习"},{"content":"做作业","time":"7.4","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":"07","day":1,"items":[{"content":"上课","time":"5.1","type":"学习"},{"content":"做作业","time":"6.1","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":"06","day":0,"items":[{"content":"上课","time":"6.9","type":"学习"},{"content":"做作业","time":"7.7","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":"05","day":6,"items":[{"content":"上课","time":"4.5","type":"学习"},{"content":"做作业","time":"3.6","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":"04","day":5,"items":[{"content":"上课","time":"4.5","type":"学习"},{"content":"做作业","time":"4.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":"03","day":4,"items":[{"content":"上课","time":"5.5","type":"学习"},{"content":"做作业","time":"7.6","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":"02","day":3,"items":[{"content":"上课","time":"4.7","type":"学习"},{"content":"做作业","time":"2.7","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":"01","day":2,"items":[{"content":"上课","time":"4.4","type":"学习"},{"content":"做作业","time":"3.3","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":31,"day":1,"items":[{"content":"上课","time":"7.6","type":"学习"},{"content":"做作业","time":"3.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":30,"day":0,"items":[{"content":"上课","time":"4.2","type":"学习"},{"content":"做作业","time":"2.5","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":29,"day":6,"items":[{"content":"上课","time":"5.3","type":"学习"},{"content":"做作业","time":"6.5","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":28,"day":5,"items":[{"content":"上课","time":"4.2","type":"学习"},{"content":"做作业","time":"2.4","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":27,"day":4,"items":[{"content":"上课","time":"6.5","type":"学习"},{"content":"做作业","time":"5.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":26,"day":3,"items":[{"content":"上课","time":"7.3","type":"学习"},{"content":"做作业","time":"6.4","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":25,"day":2,"items":[{"content":"上课","time":"6.4","type":"学习"},{"content":"做作业","time":"3.3","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":24,"day":1,"items":[{"content":"上课","time":"5.4","type":"学习"},{"content":"做作业","time":"7.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":23,"day":0,"items":[{"content":"上课","time":"6.5","type":"学习"},{"content":"做作业","time":"5.5","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":22,"day":6,"items":[{"content":"上课","time":"7.5","type":"学习"},{"content":"做作业","time":"2.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":21,"day":5,"items":[{"content":"上课","time":"7.3","type":"学习"},{"content":"做作业","time":"3.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":20,"day":4,"items":[{"content":"上课","time":"4.2","type":"学习"},{"content":"做作业","time":"5.6","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":19,"day":3,"items":[{"content":"上课","time":"7.1","type":"学习"},{"content":"做作业","time":"2.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":18,"day":2,"items":[{"content":"上课","time":"7.9","type":"学习"},{"content":"做作业","time":"2.2","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":17,"day":1,"items":[{"content":"上课","time":"6.2","type":"学习"},{"content":"做作业","time":"5.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":16,"day":0,"items":[{"content":"上课","time":"4.7","type":"学习"},{"content":"做作业","time":"4.2","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":15,"day":6,"items":[{"content":"上课","time":"5.5","type":"学习"},{"content":"做作业","time":"3.2","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":14,"day":5,"items":[{"content":"上课","time":"7.7","type":"学习"},{"content":"做作业","time":"4.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":13,"day":4,"items":[{"content":"上课","time":"4.1","type":"学习"},{"content":"做作业","time":"2.7","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":12,"day":3,"items":[{"content":"上课","time":"7.9","type":"学习"},{"content":"做作业","time":"7.5","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":11,"day":2,"items":[{"content":"上课","time":"4.5","type":"学习"},{"content":"做作业","time":"3.1","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":10,"day":1,"items":[{"content":"上课","time":"5.7","type":"学习"},{"content":"做作业","time":"2.5","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":"09","day":0,"items":[{"content":"上课","time":"5.3","type":"学习"},{"content":"做作业","time":"2.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":"08","day":6,"items":[{"content":"上课","time":"5.7","type":"学习"},{"content":"做作业","time":"4.6","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":"07","day":5,"items":[{"content":"上课","time":"4.7","type":"学习"},{"content":"做作业","time":"7.2","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":"06","day":4,"items":[{"content":"上课","time":"7.9","type":"学习"},{"content":"做作业","time":"3.4","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":"05","day":3,"items":[{"content":"上课","time":"6.2","type":"学习"},{"content":"做作业","time":"6.4","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":"04","day":2,"items":[{"content":"上课","time":"7.7","type":"学习"},{"content":"做作业","time":"4.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":"03","day":1,"items":[{"content":"上课","time":"4.6","type":"学习"},{"content":"做作业","time":"4.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":"02","day":0,"items":[{"content":"上课","time":"6.1","type":"学习"},{"content":"做作业","time":"7.6","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":"01","day":6,"items":[{"content":"上课","time":"6.3","type":"学习"},{"content":"做作业","time":"6.5","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":30,"day":5,"items":[{"content":"上课","time":"5.5","type":"学习"},{"content":"做作业","time":"7.1","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":29,"day":4,"items":[{"content":"上课","time":"6.1","type":"学习"},{"content":"做作业","time":"7.3","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":28,"day":3,"items":[{"content":"上课","time":"5.9","type":"学习"},{"content":"做作业","time":"4.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":27,"day":2,"items":[{"content":"上课","time":"4.7","type":"学习"},{"content":"做作业","time":"7.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":26,"day":1,"items":[{"content":"上课","time":"4.9","type":"学习"},{"content":"做作业","time":"5.7","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":25,"day":0,"items":[{"content":"上课","time":"6.5","type":"学习"},{"content":"做作业","time":"5.1","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":24,"day":6,"items":[{"content":"上课","time":"6.2","type":"学习"},{"content":"做作业","time":"2.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":23,"day":5,"items":[{"content":"上课","time":"6.7","type":"学习"},{"content":"做作业","time":"3.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":22,"day":4,"items":[{"content":"上课","time":"4.5","type":"学习"},{"content":"做作业","time":"5.1","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":21,"day":3,"items":[{"content":"上课","time":"4.1","type":"学习"},{"content":"做作业","time":"2.1","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":20,"day":2,"items":[{"content":"上课","time":"5.5","type":"学习"},{"content":"做作业","time":"5.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":19,"day":1,"items":[{"content":"上课","time":"7.0","type":"学习"},{"content":"做作业","time":"5.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":18,"day":0,"items":[{"content":"上课","time":"7.7","type":"学习"},{"content":"做作业","time":"2.2","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":17,"day":6,"items":[{"content":"上课","time":"5.2","type":"学习"},{"content":"做作业","time":"7.6","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":16,"day":5,"items":[{"content":"上课","time":"5.6","type":"学习"},{"content":"做作业","time":"2.7","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":15,"day":4,"items":[{"content":"上课","time":"6.1","type":"学习"},{"content":"做作业","time":"8.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":14,"day":3,"items":[{"content":"上课","time":"5.6","type":"学习"},{"content":"做作业","time":"3.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":13,"day":2,"items":[{"content":"上课","time":"5.6","type":"学习"},{"content":"做作业","time":"4.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":12,"day":1,"items":[{"content":"上课","time":"6.9","type":"学习"},{"content":"做作业","time":"4.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":11,"day":0,"items":[{"content":"上课","time":"4.8","type":"学习"},{"content":"做作业","time":"2.6","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":10,"day":6,"items":[{"content":"上课","time":"6.9","type":"学习"},{"content":"做作业","time":"6.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":"09","day":5,"items":[{"content":"上课","time":"7.8","type":"学习"},{"content":"做作业","time":"4.4","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":"08","day":4,"items":[{"content":"上课","time":"4.2","type":"学习"},{"content":"做作业","time":"4.2","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":"07","day":3,"items":[{"content":"上课","time":"6.1","type":"学习"},{"content":"做作业","time":"7.3","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":"06","day":2,"items":[{"content":"上课","time":"6.0","type":"学习"},{"content":"做作业","time":"3.6","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":"05","day":1,"items":[{"content":"上课","time":"6.2","type":"学习"},{"content":"做作业","time":"2.7","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":"04","day":0,"items":[{"content":"上课","time":"7.1","type":"学习"},{"content":"做作业","time":"3.3","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":"03","day":6,"items":[{"content":"上课","time":"6.7","type":"学习"},{"content":"做作业","time":"2.4","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":"02","day":5,"items":[{"content":"上课","time":"7.1","type":"学习"},{"content":"做作业","time":"5.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":"01","day":4,"items":[{"content":"上课","time":"5.1","type":"学习"},{"content":"做作业","time":"2.4","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]}] -------------------------------------------------------------------------------- /server/static/fonts/element-icons.a61be9c.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongchh/timeline-x/e2984a1acaa6e662815dd33f344f442ee1747354/server/static/fonts/element-icons.a61be9c.eot -------------------------------------------------------------------------------- /server/static/fonts/element-icons.b02bdc1.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongchh/timeline-x/e2984a1acaa6e662815dd33f344f442ee1747354/server/static/fonts/element-icons.b02bdc1.ttf -------------------------------------------------------------------------------- /server/static/img/auth-bg.eecd130.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongchh/timeline-x/e2984a1acaa6e662815dd33f344f442ee1747354/server/static/img/auth-bg.eecd130.jpg -------------------------------------------------------------------------------- /server/static/img/element-icons.09162bc.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Created by FontForge 20120731 at Tue Sep 6 12:16:07 2016 6 | By admin 7 | 8 | 9 | 10 | 24 | 26 | 28 | 30 | 32 | 36 | 38 | 40 | 42 | 44 | 46 | 48 | 50 | 52 | 54 | 57 | 60 | 63 | 66 | 69 | 72 | 75 | 77 | 79 | 83 | 85 | 87 | 90 | 93 | 96 | 99 | 101 | 104 | 107 | 109 | 112 | 117 | 121 | 125 | 128 | 131 | 134 | 138 | 142 | 145 | 146 | 147 | -------------------------------------------------------------------------------- /server/static/img/main-bg.dd44841.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongchh/timeline-x/e2984a1acaa6e662815dd33f344f442ee1747354/server/static/img/main-bg.dd44841.jpg -------------------------------------------------------------------------------- /server/static/img/slide-bg-0.799e6bb.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongchh/timeline-x/e2984a1acaa6e662815dd33f344f442ee1747354/server/static/img/slide-bg-0.799e6bb.jpg -------------------------------------------------------------------------------- /server/static/img/slide-bg-1.bb2871b.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongchh/timeline-x/e2984a1acaa6e662815dd33f344f442ee1747354/server/static/img/slide-bg-1.bb2871b.jpg -------------------------------------------------------------------------------- /server/static/img/slide-bg-2.6218b3b.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongchh/timeline-x/e2984a1acaa6e662815dd33f344f442ee1747354/server/static/img/slide-bg-2.6218b3b.jpg -------------------------------------------------------------------------------- /server/static/img/slide-bg-3.e8439ee.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongchh/timeline-x/e2984a1acaa6e662815dd33f344f442ee1747354/server/static/img/slide-bg-3.e8439ee.jpg -------------------------------------------------------------------------------- /server/static/img/slide-bg-4.68bbb97.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongchh/timeline-x/e2984a1acaa6e662815dd33f344f442ee1747354/server/static/img/slide-bg-4.68bbb97.jpg -------------------------------------------------------------------------------- /server/static/img/slide-bg-5.f7ee61d.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongchh/timeline-x/e2984a1acaa6e662815dd33f344f442ee1747354/server/static/img/slide-bg-5.f7ee61d.jpg -------------------------------------------------------------------------------- /server/static/img/slide-bg-6.946d147.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongchh/timeline-x/e2984a1acaa6e662815dd33f344f442ee1747354/server/static/img/slide-bg-6.946d147.jpg -------------------------------------------------------------------------------- /server/static/img/slide-bg-7.d624d95.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongchh/timeline-x/e2984a1acaa6e662815dd33f344f442ee1747354/server/static/img/slide-bg-7.d624d95.jpg -------------------------------------------------------------------------------- /server/static/img/slide-bg-8.52a375d.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongchh/timeline-x/e2984a1acaa6e662815dd33f344f442ee1747354/server/static/img/slide-bg-8.52a375d.jpg -------------------------------------------------------------------------------- /server/static/img/slide-bg-9.e32a001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongchh/timeline-x/e2984a1acaa6e662815dd33f344f442ee1747354/server/static/img/slide-bg-9.e32a001.jpg -------------------------------------------------------------------------------- /server/static/js/app.ef351a235c2fca488adb.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([2,0],{0:function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{default:t}}var r=n(7),o=a(r),i=n(270),s=a(i);n(283),n(214),n(207),n(231),n(230),n(225);var l=n(295),c=a(l),d=n(147),u=a(d),f=n(72),h=a(f);o.default.use(s.default),new o.default({el:"#app",template:"",components:{App:c.default},render:function(t){return t(c.default)},router:u.default,store:h.default})},72:function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var r=n(7),o=a(r),i=n(318),s=a(i),l=n(148),c=a(l),d=n(149),u=a(d);o.default.use(s.default);var f=new s.default.Store({state:{lockScreen:!0,timeRecords:[]},mutations:u.default,actions:c.default});e.default=f},147:function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var r=n(7),o=a(r),i=n(317),s=a(i),l=n(296),c=a(l),d=n(298),u=a(d),f=n(300),h=a(f),p=n(305),m=a(p),v=n(304),y=a(v),w=n(72),_=a(w);o.default.use(s.default);var g=new s.default({mode:"history",routes:[{path:"/auth",component:c.default},{path:"/main",component:u.default,children:[{path:"management",component:h.default},{path:"timeline",component:m.default},{path:"time-slide",component:y.default},{path:"",redirect:"timeline"}]},{path:"/",redirect:"/auth"}]});g.beforeEach(function(t,e,n){"/"===t.path?n("/auth"):"/auth"!==t.path||_.default.state.lockScreen?"/auth"!==t.path&&_.default.state.lockScreen?n("/auth"):n():n("/main")}),e.default=g},148:function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var r=n(129),o=a(r);e.default={unlockScreen:function(t,e){var n=t.commit;return o.default.post("/api/check",{password:e}).then(function(t){return!(t&&200===t.status&&!t.data.err)||(n("UNLOCK"),!1)})},addRecord:function(t,e){var n=t.commit;return o.default.post("/api/add",e).then(function(t){return!(t&&200===t.status&&!t.data.err)||(n("UPDATE_RECORD",e),!1)})},fatchData:function(t){var e=t.commit;o.default.get("/api/records").then(function(t){200===t.status&&e("FATCH_DATA",t.data)})}}},149:function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var r=n(73),o=a(r),i=n(32),s=a(i),l=s.default;e.default={UNLOCK:function(t){t.lockScreen=!1},LOCK:function(t){t.lockScreen=!0},UPDATE_RECORD:function(t,e){var n=!0,a=!1,r=void 0;try{for(var i,s=(0,o.default)(t.timeRecords);!(n=(i=s.next()).done);n=!0){var c=i.value;if(l(c.year)===l(e.year)&&l(c.month)===l(e.month)&&l(c.date)===l(e.date))return void(c.items=e.items)}}catch(t){a=!0,r=t}finally{try{!n&&s.return&&s.return()}finally{if(a)throw r}}t.timeRecords.push(e),t.timeRecords.sort(function(t,e){var n=new Date(t.year+"-"+t.month+"-"+t.date),a=new Date(e.year+"-"+e.month+"-"+e.date);return n.getTime()a.getTime()?-1:0})},FATCH_DATA:function(t,e){t.timeRecords=e}}},150:function(t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default={name:"app"}},151:function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var r=n(297),o=a(r);e.default={name:"auth",components:{StarFlow:o.default},data:function(){return{password:"",disabled:!0,errorTip:""}},methods:{setTip:function(t){var e=this;this.errorTip=t,this.disabled=!1,setTimeout(function(){e.disabled=!0,e.errorTip=""},1500)},signin:function(){var t=this;this.password?this.$store.dispatch("unlockScreen",this.password).then(function(e){e?t.setTip("密码错误"):t.$router.replace("/main")}):this.setTip("密码不能为空")}}}},152:function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var r=n(73),o=a(r),i=n(163),s=a(i),l=n(164),c=a(l),d=function(){function t(e,n){(0,s.default)(this,t),this.initProperties(e,n)}return(0,c.default)(t,[{key:"initProperties",value:function(t,e){this.position={x:Math.random()*t,y:100*Math.random()+e},this.alpha=.5+.3*Math.random(),this.scale=.1+.3*Math.random(),this.velocity=1.5*Math.random()}},{key:"move",value:function(){this.position.y-=this.velocity,this.alpha-=.001}}]),t}(),u=function(){function t(){var e=this;(0,s.default)(this,t),this.width=window.innerWidth,this.height=window.innerHeight,this.canvas=document.querySelector("#star-flow"),this.canvas.width=this.width,this.canvas.height=this.height,this.ctx=this.canvas.getContext("2d"),this.stars=[];for(var n=0;n<.5*this.width;++n)this.stars.push(new d(this.width,this.height));window.addEventListener("resize",function(){e.width=window.innerWidth,e.height=window.innerHeight,e.canvas.width=e.width,e.canvas.height=e.height})}return(0,c.default)(t,[{key:"flowing",value:function(){this.ctx.clearRect(0,0,this.width,this.height);var t=!0,e=!1,n=void 0;try{for(var a,r=(0,o.default)(this.stars);!(t=(a=r.next()).done);t=!0){var i=a.value;i.alpha<=0&&i.initProperties(this.width,this.height),i.move(),this.ctx.beginPath(),this.ctx.arc(i.position.x,i.position.y,10*i.scale,0,2*Math.PI,!1),this.ctx.fillStyle="rgba(255, 255, 255, "+i.alpha+")",this.ctx.fill()}}catch(t){e=!0,n=t}finally{try{!t&&r.return&&r.return()}finally{if(e)throw n}}window.requestAnimationFrame(this.flowing.bind(this))}}]),t}();e.default={name:"star-flow",mounted:function(){(new u).flowing()}}},153:function(t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default={name:"main",methods:{lockScreen:function(){this.$store.commit("LOCK"),this.$router.replace("/auth")}},created:function(){0===this.$store.state.timeRecords.length&&this.$store.dispatch("fatchData")}}},154:function(t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default={name:"edit-time-record",data:function(){return{date:"",dialogVisible:!1,dialogContent:"",records:[{content:"",time:"0.1",type:"学习"}]}},methods:{handleCommand:function(t){t=t.split("-"),this.records[t[1]].type=t[0]},addRecord:function(){this.records.push({content:"",time:"0.1",type:"学习"})},removeRecord:function(){this.records.length<2||this.records.pop()},submitRecords:function(){var t=this;if(""===this.date)return this.dialogVisible=!0,void(this.dialogContent="请选择日期");var e=[];if(this.records.forEach(function(t){t.content&&e.push(t)}),0===e.length)return this.dialogVisible=!0,void(this.dialogContent="请输入相应的事项记录");var n=new Date(this.date);this.$store.dispatch("addRecord",{year:n.getFullYear(),month:n.getMonth()+1,date:n.getDate(),day:n.getDay(),items:e}).then(function(e){t.dialogVisible=!0,t.dialogContent=e?"提交失败":"提交成功",e||(t.records=[{content:"",time:"0.1",type:"学习"}])})}}}},155:function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var r=n(299),o=a(r),i=n(301),s=a(i),l=n(302),c=a(l),d=n(303),u=a(d);e.default={name:"management",components:{EditTimeRecord:o.default,TimeAnalysisByType:s.default,TimeAnalysisPerMonth:c.default,TimeAnalysisPerYear:u.default}}},156:function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var r=n(162),o=a(r),i=n(48),s=a(i),l=n(32),c=a(l),d=n(3),u=a(d);e.default={name:"time-analysis-by-type",data:function(){return{month:this.format(new Date((new Date).getTime()-864e5))}},mounted:function(){this.drawChart()},computed:{chartData:function(){var t=this;"string"!=typeof this.month&&(this.month=this.format(this.month));var e={"学习":{value:0,name:"学习",itemStyle:{normal:{color:"#c5ef84"}}},"工作":{value:0,name:"工作",itemStyle:{normal:{color:"#f9ba2c"}}},"运动":{value:0,name:"运动",itemStyle:{normal:{color:"#3aecf5"}}},"休闲":{value:0,name:"休闲",itemStyle:{normal:{color:"#68f53a"}}},"娱乐":{value:0,name:"娱乐",itemStyle:{normal:{color:"#e0a6f3"}}},"其他":{value:0,name:"其他",itemStyle:{normal:{color:"#e0a6a3"}}}};return this.$store.state.timeRecords.filter(function(e){return(0,c.default)(e.year)===(0,c.default)(t.month.split("-")[0])&&(0,c.default)(e.month)===(0,c.default)(t.month.split("-")[1])}).forEach(function(t){t.items.forEach(function(t){e[t.type].value+=(0,s.default)(t.time)})}),e=(0,o.default)(e),e.forEach(function(t){return t.value=t.value.toFixed(1)}),e},totalTime:function(){var t=0;return this.chartData.forEach(function(e){return t+=(0,s.default)(e.value)}),t.toFixed(1)}},methods:{format:function(t){var e=t.getMonth()+1;return e<10&&(e="0"+e),t.getFullYear()+"-"+e},drawChart:function(t){var e={title:{text:"分类时间统计",subtext:"单位:小时",x:"center",textStyle:{color:"white"},subtextStyle:{color:"white"}},tooltip:{trigger:"item",formatter:"{b} : {c} 小时 ({d}%)"},legend:{orient:"vertical",left:"5%",top:"5%",data:["学习","工作","运动","休闲","娱乐","其他"],textStyle:{color:"white"}},series:[{name:"时间比重",type:"pie",radius:"60%",center:["50%","60%"],data:this.chartData,itemStyle:{emphasis:{shadowBlur:10,shadowOffsetX:0,shadowColor:"rgba(0, 0, 0, 0.5)"}}}]},n=u.default.init(document.querySelector("#pie-chart"));n.setOption(e)}}}},157:function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var r=n(48),o=a(r),i=n(32),s=a(i),l=n(3),c=a(l);e.default={name:"time-analysis-per-month",data:function(){return{month:this.format(new Date((new Date).getTime()-864e5))}},mounted:function(){this.drawChart()},computed:{chartData:function(){var t=this;"string"!=typeof this.month&&(this.month=this.format(this.month));var e=new Array(31).fill(0);this.$store.state.timeRecords.filter(function(e){return(0,s.default)(e.year)===(0,s.default)(t.month.split("-")[0])&&(0,s.default)(e.month)===(0,s.default)(t.month.split("-")[1])}).forEach(function(t){t.items.forEach(function(n){e[(0,s.default)(t.date)-1]+=(0,o.default)(n.time)})});for(var n=0;ntimeline-x
-------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | 13 | 30 | -------------------------------------------------------------------------------- /src/assets/auth-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongchh/timeline-x/e2984a1acaa6e662815dd33f344f442ee1747354/src/assets/auth-bg.jpg -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongchh/timeline-x/e2984a1acaa6e662815dd33f344f442ee1747354/src/assets/logo.png -------------------------------------------------------------------------------- /src/assets/main-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongchh/timeline-x/e2984a1acaa6e662815dd33f344f442ee1747354/src/assets/main-bg.jpg -------------------------------------------------------------------------------- /src/assets/slide-bg-0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongchh/timeline-x/e2984a1acaa6e662815dd33f344f442ee1747354/src/assets/slide-bg-0.jpg -------------------------------------------------------------------------------- /src/assets/slide-bg-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongchh/timeline-x/e2984a1acaa6e662815dd33f344f442ee1747354/src/assets/slide-bg-1.jpg -------------------------------------------------------------------------------- /src/assets/slide-bg-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongchh/timeline-x/e2984a1acaa6e662815dd33f344f442ee1747354/src/assets/slide-bg-2.jpg -------------------------------------------------------------------------------- /src/assets/slide-bg-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongchh/timeline-x/e2984a1acaa6e662815dd33f344f442ee1747354/src/assets/slide-bg-3.jpg -------------------------------------------------------------------------------- /src/assets/slide-bg-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongchh/timeline-x/e2984a1acaa6e662815dd33f344f442ee1747354/src/assets/slide-bg-4.jpg -------------------------------------------------------------------------------- /src/assets/slide-bg-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongchh/timeline-x/e2984a1acaa6e662815dd33f344f442ee1747354/src/assets/slide-bg-5.jpg -------------------------------------------------------------------------------- /src/assets/slide-bg-6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongchh/timeline-x/e2984a1acaa6e662815dd33f344f442ee1747354/src/assets/slide-bg-6.jpg -------------------------------------------------------------------------------- /src/assets/slide-bg-7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongchh/timeline-x/e2984a1acaa6e662815dd33f344f442ee1747354/src/assets/slide-bg-7.jpg -------------------------------------------------------------------------------- /src/assets/slide-bg-8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongchh/timeline-x/e2984a1acaa6e662815dd33f344f442ee1747354/src/assets/slide-bg-8.jpg -------------------------------------------------------------------------------- /src/assets/slide-bg-9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongchh/timeline-x/e2984a1acaa6e662815dd33f344f442ee1747354/src/assets/slide-bg-9.jpg -------------------------------------------------------------------------------- /src/components/auth/StarFlow.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /src/components/auth/auth.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 50 | 51 | -------------------------------------------------------------------------------- /src/components/main/Main.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 35 | 36 | -------------------------------------------------------------------------------- /src/components/main/management/EditTimeRecord.vue: -------------------------------------------------------------------------------- 1 | 42 | 43 | 114 | 115 | -------------------------------------------------------------------------------- /src/components/main/management/Management.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 29 | 30 | -------------------------------------------------------------------------------- /src/components/main/management/TimeAnalysisByType.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 132 | 133 | -------------------------------------------------------------------------------- /src/components/main/management/TimeAnalysisPerMonth.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 118 | 119 | -------------------------------------------------------------------------------- /src/components/main/management/TimeAnalysisPerYear.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 111 | 112 | -------------------------------------------------------------------------------- /src/components/main/time_show/TimeSlide.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 28 | 29 | -------------------------------------------------------------------------------- /src/components/main/time_show/Timeline.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 49 | 50 | -------------------------------------------------------------------------------- /src/entry.js: -------------------------------------------------------------------------------- 1 | // The Vue build version to load with the `import` command 2 | // (runtime-only or standalone) has been set in webpack.base.conf with an alias. 3 | import Vue from 'vue' 4 | import ElementUI from 'element-ui' 5 | import 'element-ui/lib/theme-default/index.css' 6 | 7 | import 'echarts/lib/chart/pie' 8 | import 'echarts/lib/chart/bar' 9 | import 'echarts/lib/component/tooltip' 10 | import 'echarts/lib/component/title' 11 | import 'echarts/lib/component/legend' 12 | 13 | import App from './App' 14 | import router from './router' 15 | import store from './store' 16 | 17 | Vue.use(ElementUI) 18 | 19 | /* eslint-disable no-new */ 20 | new Vue({ 21 | el: '#app', 22 | template: '', 23 | components: { App }, 24 | render: h => h(App), 25 | router, 26 | store 27 | }) 28 | -------------------------------------------------------------------------------- /src/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | 4 | Vue.use(Router) 5 | 6 | import Auth from '../components/auth/Auth' 7 | import Main from '../components/main/Main' 8 | import Management from '../components/main/management/Management' 9 | import Timeline from '../components/main/time_show/Timeline' 10 | import TimeSlide from '../components/main/time_show/TimeSlide' 11 | 12 | import store from '../store' 13 | 14 | const router = new Router({ 15 | mode: 'history', 16 | routes: [ 17 | { path: '/auth', component: Auth }, 18 | { 19 | path: '/main', 20 | component: Main, 21 | children: [ 22 | { path: 'management', component: Management }, 23 | { path: 'timeline', component: Timeline }, 24 | { path: 'time-slide', component: TimeSlide }, 25 | { path: '', redirect: 'timeline' } 26 | ] 27 | }, 28 | { path: '/', redirect: '/auth' } 29 | ] 30 | }) 31 | 32 | router.beforeEach((to, from, next) => { // 对特定路径进行验证,增强锁屏功能 33 | if (to.path === '/') { 34 | next('/auth') 35 | } else if (to.path === '/auth' && !store.state.lockScreen) { 36 | next('/main') 37 | } else if (to.path !== '/auth' && store.state.lockScreen) { 38 | next('/auth') 39 | } else { 40 | next() 41 | } 42 | }) 43 | 44 | export default router 45 | -------------------------------------------------------------------------------- /src/store/actions.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | 3 | export default { 4 | unlockScreen ({commit}, password) { // 验证密码,接触锁屏 5 | return axios.post('/api/check', { 6 | password: password 7 | }).then((res) => { 8 | if (!res || res.status !== 200 || res.data.err) { 9 | return true 10 | } else { 11 | commit('UNLOCK') 12 | return false 13 | } 14 | }) 15 | }, 16 | 17 | addRecord ({commit}, record) { // 添加记录 18 | return axios.post('/api/add', record).then((res) => { 19 | if (!res || res.status !== 200 || res.data.err) { 20 | return true 21 | } else { 22 | commit('UPDATE_RECORD', record) 23 | return false 24 | } 25 | }) 26 | }, 27 | 28 | fatchData ({commit}) { // 获取数据 29 | axios.get('/api/records').then((res) => { 30 | if (res.status === 200) { 31 | commit('FATCH_DATA', res.data) 32 | } 33 | }) 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | import actions from './actions' 4 | import mutations from './mutations' 5 | 6 | Vue.use(Vuex) 7 | 8 | const store = new Vuex.Store({ 9 | state: { 10 | lockScreen: true, 11 | timeRecords: [] 12 | }, 13 | mutations, 14 | actions 15 | }) 16 | 17 | export default store 18 | -------------------------------------------------------------------------------- /src/store/mutations.js: -------------------------------------------------------------------------------- 1 | const int = Number.parseInt 2 | 3 | export default { 4 | UNLOCK (state) { 5 | state.lockScreen = false 6 | }, 7 | 8 | LOCK (state) { 9 | state.lockScreen = true 10 | }, 11 | 12 | UPDATE_RECORD (state, newRecord) { // 更新记录状态 13 | for (let record of state.timeRecords) { 14 | if (int(record.year) === int(newRecord.year) && 15 | int(record.month) === int(newRecord.month) && 16 | int(record.date) === int(newRecord.date)) { // 对原有记录的更新 17 | record.items = newRecord.items 18 | return 19 | } 20 | } 21 | state.timeRecords.push(newRecord) // 插入新纪录 22 | state.timeRecords.sort((a, b) => { // 按照时间排序 23 | let t1 = new Date(a.year + '-' + a.month + '-' + a.date) 24 | let t2 = new Date(b.year + '-' + b.month + '-' + b.date) 25 | if (t1.getTime() < t2.getTime()) return 1 26 | if (t1.getTime() > t2.getTime()) return -1 27 | return 0 28 | }) 29 | }, 30 | 31 | FATCH_DATA (state, data) { 32 | state.timeRecords = data 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /static/data/data-generator.js: -------------------------------------------------------------------------------- 1 | let fs = require('fs') 2 | 3 | let dateTime = new Date('2016-08-31') 4 | let types = ['学习', '工作', '运动'] 5 | let fakeContent = ['上课', '做作业', '跑步'] 6 | let fakeTime = [ 7 | (() => 4 + Math.random() * 4), 8 | (() => 2 + Math.random() * 6), 9 | (() => 0.5) 10 | ] 11 | 12 | let format = (date) => { 13 | let t = {} 14 | t.year = date.getFullYear() 15 | t.month = (date.getMonth() + 1) 16 | if (t.month < 10) t.month = '0' + t.month 17 | t.date = date.getDate() 18 | if (t.date < 10) t.date = '0' + t.date 19 | t.day = date.getDay() 20 | return t 21 | } 22 | 23 | let data = [] 24 | 25 | for (let i = 0; i < 145; ++i) { 26 | dateTime = new Date(dateTime.getTime() + 86400000) 27 | let t = format(dateTime) 28 | let items = [] 29 | for (j = 0; j < 3; ++j) { 30 | items.push({ 31 | content: fakeContent[j], 32 | time: fakeTime[j]().toFixed(1), 33 | type: types[j] 34 | }) 35 | } 36 | data.push({ 37 | year: t.year, 38 | month: t.month, 39 | date: t.date, 40 | day: t.day, 41 | items: items 42 | }) 43 | } 44 | 45 | fs.writeFileSync(__dirname + '/data.json', JSON.stringify(data.reverse())) -------------------------------------------------------------------------------- /static/data/data.json: -------------------------------------------------------------------------------- 1 | [{"year":2017,"month":"01","date":23,"day":1,"items":[{"content":"上课","time":"6.2","type":"学习"},{"content":"做作业","time":"6.6","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":22,"day":0,"items":[{"content":"上课","time":"7.4","type":"学习"},{"content":"做作业","time":"2.2","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":21,"day":6,"items":[{"content":"上课","time":"8.0","type":"学习"},{"content":"做作业","time":"6.4","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":20,"day":5,"items":[{"content":"上课","time":"7.4","type":"学习"},{"content":"做作业","time":"3.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":19,"day":4,"items":[{"content":"上课","time":"6.5","type":"学习"},{"content":"做作业","time":"5.6","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":18,"day":3,"items":[{"content":"上课","time":"7.8","type":"学习"},{"content":"做作业","time":"2.4","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":17,"day":2,"items":[{"content":"上课","time":"6.0","type":"学习"},{"content":"做作业","time":"3.3","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":16,"day":1,"items":[{"content":"上课","time":"6.9","type":"学习"},{"content":"做作业","time":"4.6","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":15,"day":0,"items":[{"content":"上课","time":"5.4","type":"学习"},{"content":"做作业","time":"7.5","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":14,"day":6,"items":[{"content":"上课","time":"5.6","type":"学习"},{"content":"做作业","time":"2.3","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":13,"day":5,"items":[{"content":"上课","time":"4.4","type":"学习"},{"content":"做作业","time":"4.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":12,"day":4,"items":[{"content":"上课","time":"4.4","type":"学习"},{"content":"做作业","time":"7.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":11,"day":3,"items":[{"content":"上课","time":"4.9","type":"学习"},{"content":"做作业","time":"4.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":10,"day":2,"items":[{"content":"上课","time":"5.0","type":"学习"},{"content":"做作业","time":"4.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":"09","day":1,"items":[{"content":"上课","time":"4.9","type":"学习"},{"content":"做作业","time":"6.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":"08","day":0,"items":[{"content":"上课","time":"7.4","type":"学习"},{"content":"做作业","time":"3.1","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":"07","day":6,"items":[{"content":"上课","time":"4.8","type":"学习"},{"content":"做作业","time":"7.7","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":"06","day":5,"items":[{"content":"上课","time":"4.8","type":"学习"},{"content":"做作业","time":"3.2","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":"05","day":4,"items":[{"content":"上课","time":"6.1","type":"学习"},{"content":"做作业","time":"3.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":"04","day":3,"items":[{"content":"上课","time":"5.3","type":"学习"},{"content":"做作业","time":"4.1","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":"03","day":2,"items":[{"content":"上课","time":"4.2","type":"学习"},{"content":"做作业","time":"5.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":"02","day":1,"items":[{"content":"上课","time":"7.9","type":"学习"},{"content":"做作业","time":"4.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2017,"month":"01","date":"01","day":0,"items":[{"content":"上课","time":"4.9","type":"学习"},{"content":"做作业","time":"2.7","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":31,"day":6,"items":[{"content":"上课","time":"7.6","type":"学习"},{"content":"做作业","time":"4.1","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":30,"day":5,"items":[{"content":"上课","time":"4.9","type":"学习"},{"content":"做作业","time":"3.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":29,"day":4,"items":[{"content":"上课","time":"6.6","type":"学习"},{"content":"做作业","time":"7.2","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":28,"day":3,"items":[{"content":"上课","time":"6.2","type":"学习"},{"content":"做作业","time":"6.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":27,"day":2,"items":[{"content":"上课","time":"4.5","type":"学习"},{"content":"做作业","time":"4.3","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":26,"day":1,"items":[{"content":"上课","time":"5.2","type":"学习"},{"content":"做作业","time":"6.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":25,"day":0,"items":[{"content":"上课","time":"4.4","type":"学习"},{"content":"做作业","time":"4.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":24,"day":6,"items":[{"content":"上课","time":"6.2","type":"学习"},{"content":"做作业","time":"4.1","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":23,"day":5,"items":[{"content":"上课","time":"5.5","type":"学习"},{"content":"做作业","time":"6.3","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":22,"day":4,"items":[{"content":"上课","time":"7.2","type":"学习"},{"content":"做作业","time":"2.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":21,"day":3,"items":[{"content":"上课","time":"5.3","type":"学习"},{"content":"做作业","time":"5.2","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":20,"day":2,"items":[{"content":"上课","time":"4.8","type":"学习"},{"content":"做作业","time":"7.2","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":19,"day":1,"items":[{"content":"上课","time":"7.5","type":"学习"},{"content":"做作业","time":"7.3","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":18,"day":0,"items":[{"content":"上课","time":"4.5","type":"学习"},{"content":"做作业","time":"7.1","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":17,"day":6,"items":[{"content":"上课","time":"5.6","type":"学习"},{"content":"做作业","time":"6.7","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":16,"day":5,"items":[{"content":"上课","time":"4.7","type":"学习"},{"content":"做作业","time":"3.6","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":15,"day":4,"items":[{"content":"上课","time":"5.3","type":"学习"},{"content":"做作业","time":"5.4","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":14,"day":3,"items":[{"content":"上课","time":"6.3","type":"学习"},{"content":"做作业","time":"4.1","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":13,"day":2,"items":[{"content":"上课","time":"5.3","type":"学习"},{"content":"做作业","time":"3.1","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":12,"day":1,"items":[{"content":"上课","time":"7.9","type":"学习"},{"content":"做作业","time":"6.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":11,"day":0,"items":[{"content":"上课","time":"5.9","type":"学习"},{"content":"做作业","time":"6.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":10,"day":6,"items":[{"content":"上课","time":"6.0","type":"学习"},{"content":"做作业","time":"4.7","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":"09","day":5,"items":[{"content":"上课","time":"7.4","type":"学习"},{"content":"做作业","time":"6.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":"08","day":4,"items":[{"content":"上课","time":"5.1","type":"学习"},{"content":"做作业","time":"3.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":"07","day":3,"items":[{"content":"上课","time":"7.7","type":"学习"},{"content":"做作业","time":"7.2","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":"06","day":2,"items":[{"content":"上课","time":"4.4","type":"学习"},{"content":"做作业","time":"7.2","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":"05","day":1,"items":[{"content":"上课","time":"5.2","type":"学习"},{"content":"做作业","time":"5.4","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":"04","day":0,"items":[{"content":"上课","time":"4.1","type":"学习"},{"content":"做作业","time":"7.6","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":"03","day":6,"items":[{"content":"上课","time":"7.7","type":"学习"},{"content":"做作业","time":"2.5","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":"02","day":5,"items":[{"content":"上课","time":"5.9","type":"学习"},{"content":"做作业","time":"3.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":12,"date":"01","day":4,"items":[{"content":"上课","time":"7.2","type":"学习"},{"content":"做作业","time":"6.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":30,"day":3,"items":[{"content":"上课","time":"7.7","type":"学习"},{"content":"做作业","time":"4.6","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":29,"day":2,"items":[{"content":"上课","time":"4.4","type":"学习"},{"content":"做作业","time":"3.4","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":28,"day":1,"items":[{"content":"上课","time":"5.5","type":"学习"},{"content":"做作业","time":"3.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":27,"day":0,"items":[{"content":"上课","time":"7.3","type":"学习"},{"content":"做作业","time":"6.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":26,"day":6,"items":[{"content":"上课","time":"5.8","type":"学习"},{"content":"做作业","time":"2.1","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":25,"day":5,"items":[{"content":"上课","time":"4.9","type":"学习"},{"content":"做作业","time":"7.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":24,"day":4,"items":[{"content":"上课","time":"4.2","type":"学习"},{"content":"做作业","time":"2.3","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":23,"day":3,"items":[{"content":"上课","time":"6.8","type":"学习"},{"content":"做作业","time":"7.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":22,"day":2,"items":[{"content":"上课","time":"6.7","type":"学习"},{"content":"做作业","time":"7.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":21,"day":1,"items":[{"content":"上课","time":"4.1","type":"学习"},{"content":"做作业","time":"7.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":20,"day":0,"items":[{"content":"上课","time":"4.1","type":"学习"},{"content":"做作业","time":"4.1","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":19,"day":6,"items":[{"content":"上课","time":"5.2","type":"学习"},{"content":"做作业","time":"5.7","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":18,"day":5,"items":[{"content":"上课","time":"7.7","type":"学习"},{"content":"做作业","time":"7.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":17,"day":4,"items":[{"content":"上课","time":"4.2","type":"学习"},{"content":"做作业","time":"4.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":16,"day":3,"items":[{"content":"上课","time":"7.6","type":"学习"},{"content":"做作业","time":"7.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":15,"day":2,"items":[{"content":"上课","time":"5.5","type":"学习"},{"content":"做作业","time":"3.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":14,"day":1,"items":[{"content":"上课","time":"7.1","type":"学习"},{"content":"做作业","time":"7.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":13,"day":0,"items":[{"content":"上课","time":"6.7","type":"学习"},{"content":"做作业","time":"2.7","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":12,"day":6,"items":[{"content":"上课","time":"5.8","type":"学习"},{"content":"做作业","time":"2.1","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":11,"day":5,"items":[{"content":"上课","time":"7.6","type":"学习"},{"content":"做作业","time":"6.7","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":10,"day":4,"items":[{"content":"上课","time":"6.4","type":"学习"},{"content":"做作业","time":"3.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":"09","day":3,"items":[{"content":"上课","time":"4.1","type":"学习"},{"content":"做作业","time":"5.2","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":"08","day":2,"items":[{"content":"上课","time":"6.4","type":"学习"},{"content":"做作业","time":"7.4","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":"07","day":1,"items":[{"content":"上课","time":"5.1","type":"学习"},{"content":"做作业","time":"6.1","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":"06","day":0,"items":[{"content":"上课","time":"6.9","type":"学习"},{"content":"做作业","time":"7.7","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":"05","day":6,"items":[{"content":"上课","time":"4.5","type":"学习"},{"content":"做作业","time":"3.6","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":"04","day":5,"items":[{"content":"上课","time":"4.5","type":"学习"},{"content":"做作业","time":"4.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":"03","day":4,"items":[{"content":"上课","time":"5.5","type":"学习"},{"content":"做作业","time":"7.6","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":"02","day":3,"items":[{"content":"上课","time":"4.7","type":"学习"},{"content":"做作业","time":"2.7","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":11,"date":"01","day":2,"items":[{"content":"上课","time":"4.4","type":"学习"},{"content":"做作业","time":"3.3","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":31,"day":1,"items":[{"content":"上课","time":"7.6","type":"学习"},{"content":"做作业","time":"3.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":30,"day":0,"items":[{"content":"上课","time":"4.2","type":"学习"},{"content":"做作业","time":"2.5","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":29,"day":6,"items":[{"content":"上课","time":"5.3","type":"学习"},{"content":"做作业","time":"6.5","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":28,"day":5,"items":[{"content":"上课","time":"4.2","type":"学习"},{"content":"做作业","time":"2.4","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":27,"day":4,"items":[{"content":"上课","time":"6.5","type":"学习"},{"content":"做作业","time":"5.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":26,"day":3,"items":[{"content":"上课","time":"7.3","type":"学习"},{"content":"做作业","time":"6.4","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":25,"day":2,"items":[{"content":"上课","time":"6.4","type":"学习"},{"content":"做作业","time":"3.3","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":24,"day":1,"items":[{"content":"上课","time":"5.4","type":"学习"},{"content":"做作业","time":"7.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":23,"day":0,"items":[{"content":"上课","time":"6.5","type":"学习"},{"content":"做作业","time":"5.5","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":22,"day":6,"items":[{"content":"上课","time":"7.5","type":"学习"},{"content":"做作业","time":"2.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":21,"day":5,"items":[{"content":"上课","time":"7.3","type":"学习"},{"content":"做作业","time":"3.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":20,"day":4,"items":[{"content":"上课","time":"4.2","type":"学习"},{"content":"做作业","time":"5.6","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":19,"day":3,"items":[{"content":"上课","time":"7.1","type":"学习"},{"content":"做作业","time":"2.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":18,"day":2,"items":[{"content":"上课","time":"7.9","type":"学习"},{"content":"做作业","time":"2.2","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":17,"day":1,"items":[{"content":"上课","time":"6.2","type":"学习"},{"content":"做作业","time":"5.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":16,"day":0,"items":[{"content":"上课","time":"4.7","type":"学习"},{"content":"做作业","time":"4.2","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":15,"day":6,"items":[{"content":"上课","time":"5.5","type":"学习"},{"content":"做作业","time":"3.2","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":14,"day":5,"items":[{"content":"上课","time":"7.7","type":"学习"},{"content":"做作业","time":"4.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":13,"day":4,"items":[{"content":"上课","time":"4.1","type":"学习"},{"content":"做作业","time":"2.7","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":12,"day":3,"items":[{"content":"上课","time":"7.9","type":"学习"},{"content":"做作业","time":"7.5","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":11,"day":2,"items":[{"content":"上课","time":"4.5","type":"学习"},{"content":"做作业","time":"3.1","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":10,"day":1,"items":[{"content":"上课","time":"5.7","type":"学习"},{"content":"做作业","time":"2.5","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":"09","day":0,"items":[{"content":"上课","time":"5.3","type":"学习"},{"content":"做作业","time":"2.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":"08","day":6,"items":[{"content":"上课","time":"5.7","type":"学习"},{"content":"做作业","time":"4.6","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":"07","day":5,"items":[{"content":"上课","time":"4.7","type":"学习"},{"content":"做作业","time":"7.2","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":"06","day":4,"items":[{"content":"上课","time":"7.9","type":"学习"},{"content":"做作业","time":"3.4","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":"05","day":3,"items":[{"content":"上课","time":"6.2","type":"学习"},{"content":"做作业","time":"6.4","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":"04","day":2,"items":[{"content":"上课","time":"7.7","type":"学习"},{"content":"做作业","time":"4.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":"03","day":1,"items":[{"content":"上课","time":"4.6","type":"学习"},{"content":"做作业","time":"4.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":"02","day":0,"items":[{"content":"上课","time":"6.1","type":"学习"},{"content":"做作业","time":"7.6","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":10,"date":"01","day":6,"items":[{"content":"上课","time":"6.3","type":"学习"},{"content":"做作业","time":"6.5","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":30,"day":5,"items":[{"content":"上课","time":"5.5","type":"学习"},{"content":"做作业","time":"7.1","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":29,"day":4,"items":[{"content":"上课","time":"6.1","type":"学习"},{"content":"做作业","time":"7.3","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":28,"day":3,"items":[{"content":"上课","time":"5.9","type":"学习"},{"content":"做作业","time":"4.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":27,"day":2,"items":[{"content":"上课","time":"4.7","type":"学习"},{"content":"做作业","time":"7.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":26,"day":1,"items":[{"content":"上课","time":"4.9","type":"学习"},{"content":"做作业","time":"5.7","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":25,"day":0,"items":[{"content":"上课","time":"6.5","type":"学习"},{"content":"做作业","time":"5.1","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":24,"day":6,"items":[{"content":"上课","time":"6.2","type":"学习"},{"content":"做作业","time":"2.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":23,"day":5,"items":[{"content":"上课","time":"6.7","type":"学习"},{"content":"做作业","time":"3.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":22,"day":4,"items":[{"content":"上课","time":"4.5","type":"学习"},{"content":"做作业","time":"5.1","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":21,"day":3,"items":[{"content":"上课","time":"4.1","type":"学习"},{"content":"做作业","time":"2.1","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":20,"day":2,"items":[{"content":"上课","time":"5.5","type":"学习"},{"content":"做作业","time":"5.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":19,"day":1,"items":[{"content":"上课","time":"7.0","type":"学习"},{"content":"做作业","time":"5.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":18,"day":0,"items":[{"content":"上课","time":"7.7","type":"学习"},{"content":"做作业","time":"2.2","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":17,"day":6,"items":[{"content":"上课","time":"5.2","type":"学习"},{"content":"做作业","time":"7.6","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":16,"day":5,"items":[{"content":"上课","time":"5.6","type":"学习"},{"content":"做作业","time":"2.7","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":15,"day":4,"items":[{"content":"上课","time":"6.1","type":"学习"},{"content":"做作业","time":"8.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":14,"day":3,"items":[{"content":"上课","time":"5.6","type":"学习"},{"content":"做作业","time":"3.9","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":13,"day":2,"items":[{"content":"上课","time":"5.6","type":"学习"},{"content":"做作业","time":"4.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":12,"day":1,"items":[{"content":"上课","time":"6.9","type":"学习"},{"content":"做作业","time":"4.0","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":11,"day":0,"items":[{"content":"上课","time":"4.8","type":"学习"},{"content":"做作业","time":"2.6","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":10,"day":6,"items":[{"content":"上课","time":"6.9","type":"学习"},{"content":"做作业","time":"6.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":"09","day":5,"items":[{"content":"上课","time":"7.8","type":"学习"},{"content":"做作业","time":"4.4","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":"08","day":4,"items":[{"content":"上课","time":"4.2","type":"学习"},{"content":"做作业","time":"4.2","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":"07","day":3,"items":[{"content":"上课","time":"6.1","type":"学习"},{"content":"做作业","time":"7.3","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":"06","day":2,"items":[{"content":"上课","time":"6.0","type":"学习"},{"content":"做作业","time":"3.6","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":"05","day":1,"items":[{"content":"上课","time":"6.2","type":"学习"},{"content":"做作业","time":"2.7","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":"04","day":0,"items":[{"content":"上课","time":"7.1","type":"学习"},{"content":"做作业","time":"3.3","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":"03","day":6,"items":[{"content":"上课","time":"6.7","type":"学习"},{"content":"做作业","time":"2.4","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":"02","day":5,"items":[{"content":"上课","time":"7.1","type":"学习"},{"content":"做作业","time":"5.8","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]},{"year":2016,"month":"09","date":"01","day":4,"items":[{"content":"上课","time":"5.1","type":"学习"},{"content":"做作业","time":"2.4","type":"工作"},{"content":"跑步","time":"0.5","type":"运动"}]}] --------------------------------------------------------------------------------