├── .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 | 
32 | 
33 | 
34 | 
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 |
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 |
2 | div#app
3 | transition(name="fade")
4 | router-view
5 |
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 |
2 | canvas#star-flow
3 |
4 |
5 |
--------------------------------------------------------------------------------
/src/components/auth/auth.vue:
--------------------------------------------------------------------------------
1 |
2 | div#auth
3 | star-flow
4 | div#auth-input
5 | el-row(:gutter="20")
6 | el-col(:span="8", :offset="8")
7 | el-tooltip(:disabled="disabled", :content="errorTip", placement="bottom-start", effect="light")
8 | el-input(placeholder="请输入密码", v-model="password", type="password")
9 | template(slot="append")
10 | el-button(@click="signin") Go
11 |
12 |
13 |
50 |
51 |
--------------------------------------------------------------------------------
/src/components/main/Main.vue:
--------------------------------------------------------------------------------
1 |
2 | div#main
3 | div#header
4 | el-row(:gutter="20")
5 | el-col(:span="1", :offset="1")
6 | i.el-icon-time#logo
7 | el-col(:span="2", :offset="12")
8 | router-link.header-item(to="timeline", active-class="header-item-active") 时光轴
9 | el-col(:span="2")
10 | router-link.header-item(to="time-slide", active-class="header-item-active") 时光展
11 | el-col(:span="2")
12 | router-link.header-item(to="management", active-class="header-item-active") 管理
13 | el-col(:span="2")
14 | span.header-item(@click="lockScreen") 锁屏
15 | div#body
16 | router-view
17 |
18 |
19 |
35 |
36 |
--------------------------------------------------------------------------------
/src/components/main/management/EditTimeRecord.vue:
--------------------------------------------------------------------------------
1 |
2 | div#edit-time-record
3 | el-card
4 | el-row(:gutter="5")
5 | el-col(:span="6")
6 | h3 编辑时间记录
7 | el-col(:span="8", :offset="6")
8 | el-date-picker#edit-time-record-date(v-model="date", type="date", placeholder="选择日期", :editable="false")
9 | el-row(:gutter="10", v-for="(record, index) in records")
10 | el-col(:span="1")
11 | span {{ index + 1 }}.
12 | el-col(:span="14")
13 | el-input#content(v-model="record.content", placeholder="内容")
14 | el-col(:span="4")
15 | el-input(type="number", v-model="record.time", :step="0.1", :min="0.1", :max="24")
16 | el-col(:span="4", :offset="1")
17 | el-dropdown(@command="handleCommand")
18 | span {{ record.type }}
19 | el-dropdown-menu(slot="dropdown")
20 | el-dropdown-item(:command="'学习-' + index") 学习
21 | el-dropdown-item(:command="'工作-' + index") 工作
22 | el-dropdown-item(:command="'休闲-' + index") 休闲
23 | el-dropdown-item(:command="'娱乐-' + index") 娱乐
24 | el-dropdown-item(:command="'运动-' + index") 运动
25 | el-dropdown-item(:command="'其他-' + index") 其他
26 | el-row(:gutter="10")
27 | el-col(:span="3", :offset="7")
28 | el-tooltip(content="添加条目", placement="top")
29 | el-button(type="primary", icon="plus", @click="addRecord")
30 | el-col(:span="3")
31 | el-tooltip(content="删除条目", placement="top")
32 | el-button(type="primary", icon="minus", @click="removeRecord")
33 | el-col(:span="3")
34 | el-tooltip(content="提交记录", placement="top")
35 | el-button(type="primary", icon="check", @click="submitRecords")
36 |
37 | el-dialog(title="提示:", v-model="dialogVisible", size="tiny")
38 | span {{ dialogContent }}
39 | span(slot="footer")
40 | el-button(@click="dialogVisible = false") 确定
41 |
42 |
43 |
114 |
115 |
--------------------------------------------------------------------------------
/src/components/main/management/Management.vue:
--------------------------------------------------------------------------------
1 |
2 | div#management
3 | div#content-wrapper
4 | el-row(:gutter="10")
5 | el-col(:span="12", :offset="1")
6 | time-analysis-per-month
7 | time-analysis-per-year
8 | el-col(:span="10")
9 | time-analysis-by-type
10 | edit-time-record
11 |
12 |
13 |
29 |
30 |
--------------------------------------------------------------------------------
/src/components/main/management/TimeAnalysisByType.vue:
--------------------------------------------------------------------------------
1 |
2 | div#time-analysis-by-type
3 | el-card
4 | div#pie-chart
5 | el-row(:gutter="20")
6 | el-col(:span="8", :offset="2")
7 | el-date-picker(v-model="month", type="month", placeholder="选择月份", @change="drawChart")
8 | el-col(:span="8", :offset="4")
9 | el-input(:value="'Total: ' + totalTime", :disabled="true", placeholder="Total:")
10 |
11 |
12 |
132 |
133 |
--------------------------------------------------------------------------------
/src/components/main/management/TimeAnalysisPerMonth.vue:
--------------------------------------------------------------------------------
1 |
2 | div#time-analysis-per-month
3 | el-card
4 | div#bar-chart-month
5 | el-row(:gutter="20")
6 | el-col(:span="7", :offset="1")
7 | el-date-picker(v-model="month", type="month", placeholder="选择月份", @change="drawChart")
8 | el-col(:span="6", :offset="2")
9 | el-input(:value="'Total: ' + totalTime", :disabled="true", placeholder="Total:")
10 | el-col(:span="6", :offset="1")
11 | el-input(:value="'AVG: ' + (totalTime / (chartData.filter(x => Number.parseInt(x) !== 0).length)).toFixed(1)", :disabled="true", placeholder="AVG:")
12 |
13 |
14 |
118 |
119 |
--------------------------------------------------------------------------------
/src/components/main/management/TimeAnalysisPerYear.vue:
--------------------------------------------------------------------------------
1 |
2 | div#time-analysis-per-year
3 | el-card
4 | div#bar-chart-year
5 | el-row(:gutter="20")
6 | el-col(:span="7", :offset="1")
7 | el-date-picker(v-model="year", type="year", placeholder="选择年份", @change="drawChart")
8 | el-col(:span="6", :offset="2")
9 | el-input(:value="'Total: ' + totalTime", :disabled="true", placeholder="Total:")
10 | el-col(:span="6", :offset="1")
11 | el-input(:value="'AVG: ' + (totalTime / (chartData.filter(x => Number.parseInt(x) !== 0).length)).toFixed(1)", :disabled="true", placeholder="AVG:")
12 |
13 |
14 |
111 |
112 |
--------------------------------------------------------------------------------
/src/components/main/time_show/TimeSlide.vue:
--------------------------------------------------------------------------------
1 |
2 | div#time-slide
3 | div.slide(v-for="(record, i) in $store.state.timeRecords", :class="'slide-bg-' + Number.parseInt(i % 10)")
4 | div.record-info
5 | h2 {{ record.year + '年' + record.month + '月' + record.date + '日' }}
6 | h3 {{ days[record.day] }}
7 | p(v-for="(item, index) in record.items") {{ index + 1 + '. ' + item.content + ', ' + item.time + 'h.' }}
8 |
9 |
10 |
28 |
29 |
--------------------------------------------------------------------------------
/src/components/main/time_show/Timeline.vue:
--------------------------------------------------------------------------------
1 |
2 | div#timeline
3 | div.timeline-wrapper
4 | div.timeline
5 | div.timeline-records(v-for="(record, i) in this.$store.state.timeRecords")
6 | div.side-info
7 | span.year {{ record.year }}
8 | div.timeline-icon(:class="iconBg[Number.parseInt(i%12)]")
9 | div.month {{ record.month }} 月
10 | span.date {{ record.date }}
11 | div.timeline-content
12 | h2.day {{ days[record.day] }}
13 | div.details
14 | p(v-for="(item, index) in record.items") {{ index + 1 + '. ' + item.content + ', ' + item.time + 'h.' }}
15 |
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":"运动"}]}]
--------------------------------------------------------------------------------