├── .csslintrc ├── .eslintignore ├── .eslintrc.json ├── .gitignore ├── .htmlhintrc ├── .tern-project ├── .travis.yml ├── CNAME ├── Gruntfile.js ├── LICENSE ├── README.md ├── css ├── wd.css ├── wd.resume.css └── wd.timeline.css ├── favicon.svg ├── index.html ├── js ├── bsz-page-footer.js ├── data.js ├── fork-me-github.js ├── main.js ├── resume.js └── timeline.js └── package.json /.csslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "order-alphabetical": false, 3 | "ids": false , 4 | "box-model": false, 5 | "outline-none": false, 6 | "box-sizing": false 7 | } 8 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | favicon.ico 3 | LICENSE 4 | CNAME 5 | *.html 6 | *.css 7 | *.md 8 | *.json 9 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "jquery": true 5 | }, 6 | "extends": "eslint:recommended", 7 | "rules": { 8 | "indent": [ 9 | "error", 10 | 2, 11 | { 12 | "SwitchCase": 1, 13 | "VariableDeclarator": {"var": 2, "let": 2, "const": 3} 14 | } 15 | ], 16 | "linebreak-style": [ 17 | "error", 18 | "unix" 19 | ], 20 | "quotes": [ 21 | "error", 22 | "single" 23 | ], 24 | "semi": [ 25 | "error", 26 | "always" 27 | ], 28 | "no-console": [ 29 | "error", 30 | { "allow": ["error"] } 31 | ] 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (http://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # Typescript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | dist/ 61 | -------------------------------------------------------------------------------- /.htmlhintrc: -------------------------------------------------------------------------------- 1 | { 2 | "tagname-lowercase": true, 3 | "attr-lowercase": true, 4 | "attr-value-double-quotes": true, 5 | "attr-value-not-empty": false, 6 | "attr-no-duplication": true, 7 | "doctype-first": true, 8 | "tag-pair": true, 9 | "tag-self-close": false, 10 | "spec-char-escape": true, 11 | "id-unique": true, 12 | "src-not-empty": true, 13 | "title-require": true, 14 | "alt-require": true, 15 | "doctype-html5": true, 16 | "id-class-value": "dash", 17 | "style-disabled": false, 18 | "inline-style-disabled": false, 19 | "inline-script-disabled": false, 20 | "space-tab-mixed-disabled": "space", 21 | "id-class-ad-disabled": false, 22 | "href-abs-or-rel": false, 23 | "attr-unsafe-chars": true, 24 | "head-script-disabled": true 25 | } 26 | -------------------------------------------------------------------------------- /.tern-project: -------------------------------------------------------------------------------- 1 | { 2 | "libs": ["browser", "jquery"], 3 | "plugins": { 4 | "node": {} 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "10" 4 | 5 | after_script: 6 | - npm run build 7 | - cp CNAME ./dist 8 | - cp favicon.svg ./dist 9 | - grunt upload 10 | - cd ./dist 11 | - git init 12 | - git config user.name "${USER_NAME}" 13 | - git config user.email "${USER_EMAIL}" 14 | - git add . 15 | - git commit -m "publish wet site" 16 | - git push --force --quiet "https://${ACC_TOKEN}@${GH_REF}" master:${BRANCH} 17 | 18 | branches: 19 | only: 20 | - master 21 | -------------------------------------------------------------------------------- /CNAME: -------------------------------------------------------------------------------- 1 | i.wangding.co 2 | -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | /* global module: true */ 2 | module.exports = function (grunt) { 3 | grunt.initConfig({ 4 | eslint: { 5 | options: { 6 | configFile: '.eslintrc.json' 7 | }, 8 | target: ['./js/*.js'] 9 | }, 10 | csslint: { 11 | options: { 12 | csslintrc: '.csslintrc' 13 | }, 14 | src: 'css/*.css' 15 | }, 16 | htmlhint: { 17 | options: { 18 | htmlhintrc: '.htmlhintrc' 19 | }, 20 | src: '*.html' 21 | }, 22 | htmlmin: { 23 | options: { 24 | collapseWhitespace: true, 25 | preserveLineBreaks: false 26 | }, 27 | files: { 28 | src: 'dist/index.html', 29 | dest: 'dist/index.html' 30 | } 31 | }, 32 | qiniu_qupload: { 33 | default_options: { 34 | options: { 35 | ak: 'QINIU_AK', 36 | sk: 'QINIU_SK', 37 | bucket: 'app-i', 38 | assets: [{src: 'dist', prefix: ''}] 39 | } 40 | } 41 | }, 42 | copy: { 43 | html: { 44 | src: './index.html', 45 | dest: './dist/index.html' 46 | } 47 | }, 48 | concat: { 49 | js: { 50 | src: ['js/*.js'], 51 | dest: 'dist/js/bundle.js' 52 | }, 53 | css: { 54 | src: ['css/*.css'], 55 | dest: 'dist/css/bundle.css' 56 | } 57 | }, 58 | uglify: { 59 | 'dist/js/bundle.min.js': 'dist/js/bundle.js', 60 | 'dist/js/fork-me-github.js': 'js/fork-me-github.js', 61 | 'dist/js/bsz-page-footer.js': 'js/bsz-page-footer.js' 62 | }, 63 | cssmin: { 64 | 'dist/css/bundle.min.css': 'dist/css/bundle.css' 65 | }, 66 | useminPrepare: { 67 | html: 'index.html', 68 | options: { 69 | dest: 'dist' 70 | } 71 | }, 72 | usemin: { 73 | html: ['dist/index.html'] 74 | }, 75 | clean: { 76 | end: ['dist/css/bundle.css', 'dist/js/bundle.js', '.tmp'] 77 | } 78 | }); 79 | 80 | grunt.loadNpmTasks('grunt-contrib-csslint'); 81 | grunt.loadNpmTasks('grunt-htmlhint'); 82 | grunt.loadNpmTasks('grunt-contrib-concat'); 83 | grunt.loadNpmTasks('grunt-contrib-uglify'); 84 | grunt.loadNpmTasks('grunt-contrib-cssmin'); 85 | grunt.loadNpmTasks('grunt-contrib-copy'); 86 | grunt.loadNpmTasks('grunt-contrib-clean'); 87 | grunt.loadNpmTasks('grunt-contrib-htmlmin'); 88 | grunt.loadNpmTasks('grunt-eslint'); 89 | grunt.loadNpmTasks('grunt-usemin'); 90 | grunt.loadNpmTasks('@wangding/grunt-qiniu-qupload'); 91 | 92 | grunt.registerTask('lint', ['htmlhint', 'csslint', 'eslint']); 93 | grunt.registerTask('build', ['copy:html', 'useminPrepare', 'concat', 'uglify', 'cssmin', 'usemin', 'htmlmin', 'clean:end']); 94 | grunt.registerTask('upload', ['qiniu_qupload']); 95 | }; 96 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 王顶 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # i 2 | 3 | 王顶的个人简历 4 | -------------------------------------------------------------------------------- /css/wd.css: -------------------------------------------------------------------------------- 1 | /* 2 | * wd.css 3 | * Root namespace styles 4 | */ 5 | 6 | /* Begin reset */ 7 | div { 8 | margin: 0; 9 | padding: 0; 10 | -webkit-box-sizing: border-box; 11 | -moz-box-sizing: border-box; 12 | box-sizing: border-box; 13 | } 14 | h1, h2, h3, h4, h5, h6, p { margin-bottom: 10px; } 15 | ol, ul, dl { list-style-position: inside; } 16 | /* End reset */ 17 | 18 | /* Begin standard selectors */ 19 | body { 20 | font: 13px 'Trebuchet MS', Verdana, Helvetica, Arial, sans-serif; 21 | color: #444; 22 | background-color: #333; 23 | } 24 | 25 | a { text-decoration: none; } 26 | a:link, a:visited { color: inherit; } 27 | a:hover { text-decoration: underline; } 28 | 29 | strong { 30 | font-size: 24px; 31 | color: #000; 32 | } 33 | /* End standard selectors */ 34 | -------------------------------------------------------------------------------- /css/wd.resume.css: -------------------------------------------------------------------------------- 1 | /* 2 | * wd.resume.css 3 | * resume namespace styles 4 | */ 5 | 6 | /* Begin resume namespace selectors */ 7 | #wd-resume { 8 | width: 1000px; 9 | margin: 10px auto; 10 | padding: 10px 0; 11 | min-width: 500px; 12 | overflow: visible; 13 | font-family: "Microsoft Yahei"; 14 | font-size: 15px; 15 | line-height: 26px; 16 | background-color: #fff; 17 | border-radius: 8px 8px 8px 8px; 18 | } 19 | 20 | #wd-resume-logo { 21 | width: 250px; 22 | height: 250px; 23 | margin: 30px auto; 24 | border-radius: 125px; 25 | background-repeat: no-repeat; 26 | background-position: center; 27 | background-image: url('http://sample.wangding.co/images/wangding-250.jpeg'); 28 | } 29 | 30 | #wd-resume-slogan { 31 | height: 125px; 32 | margin: 10px 0; 33 | padding: 10px; 34 | text-align: center; 35 | background-color: #eee; 36 | } 37 | 38 | #wd-resume-info-title { 39 | height: 170px; 40 | margin: 10px 0; 41 | padding: 10px; 42 | } 43 | 44 | #wd-resume-info, #wd-resume-contact { 45 | width: 50%; 46 | float: left; 47 | text-align: right; 48 | padding: 0 10px; 49 | } 50 | 51 | #wd-resume-title, #wd-resume-skills { 52 | width: 50%; 53 | float: right; 54 | padding: 0 10px; 55 | } 56 | 57 | #wd-resume-contact-skills { 58 | height: 170px; 59 | margin: 10px 0; 60 | padding: 10px; 61 | background-color: #eee; 62 | } 63 | 64 | .wd-resume-title { 65 | font-weight: bold; 66 | } 67 | -------------------------------------------------------------------------------- /css/wd.timeline.css: -------------------------------------------------------------------------------- 1 | .timeline { 2 | position: relative; 3 | width: 660px; 4 | margin: 0 auto; 5 | margin-top: 20px; 6 | padding: 1em 0; 7 | list-style-type: none; 8 | } 9 | 10 | .timeline:before { 11 | position: absolute; 12 | left: 50%; 13 | top: 0; 14 | content: ' '; 15 | display: block; 16 | width: 6px; 17 | height: 100%; 18 | margin-left: -3px; 19 | background: rgb(80,80,80); 20 | background: -moz-linear-gradient(top, rgba(80,80,80,0) 0%, rgb(80,80,80) 8%, rgb(80,80,80) 92%, rgba(80,80,80,0) 100%); 21 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(30,87,153,1)), color-stop(100%,rgba(125,185,232,1))); 22 | background: -webkit-linear-gradient(top, rgba(80,80,80,0) 0%, rgb(80,80,80) 8%, rgb(80,80,80) 92%, rgba(80,80,80,0) 100%); 23 | background: -o-linear-gradient(top, rgba(80,80,80,0) 0%, rgb(80,80,80) 8%, rgb(80,80,80) 92%, rgba(80,80,80,0) 100%); 24 | background: -ms-linear-gradient(top, rgba(80,80,80,0) 0%, rgb(80,80,80) 8%, rgb(80,80,80) 92%, rgba(80,80,80,0) 100%); 25 | background: linear-gradient(to bottom, rgba(80,80,80,0) 0%, rgb(80,80,80) 8%, rgb(80,80,80) 92%, rgba(80,80,80,0) 100%); 26 | z-index: 5; 27 | } 28 | 29 | .timeline li { 30 | padding: 1em 0; 31 | } 32 | 33 | .timeline li:after { 34 | content: ""; 35 | display: block; 36 | height: 0; 37 | clear: both; 38 | visibility: hidden; 39 | } 40 | 41 | .direction-l { 42 | position: relative; 43 | width: 300px; 44 | float: left; 45 | text-align: right; 46 | } 47 | 48 | .direction-r { 49 | position: relative; 50 | width: 300px; 51 | float: right; 52 | } 53 | 54 | .flag-wrapper { 55 | position: relative; 56 | display: inline-block; 57 | text-align: center; 58 | } 59 | 60 | .flag { 61 | position: relative; 62 | display: inline; 63 | background: rgb(248,248,248); 64 | padding: 6px 10px; 65 | border-radius: 5px; 66 | 67 | font-weight: 600; 68 | text-align: left; 69 | } 70 | 71 | .direction-l .flag { 72 | -webkit-box-shadow: -1px 1px 1px rgba(0,0,0,0.15), 0 0 1px rgba(0,0,0,0.15); 73 | -moz-box-shadow: -1px 1px 1px rgba(0,0,0,0.15), 0 0 1px rgba(0,0,0,0.15); 74 | box-shadow: -1px 1px 1px rgba(0,0,0,0.15), 0 0 1px rgba(0,0,0,0.15); 75 | } 76 | 77 | .direction-r .flag { 78 | -webkit-box-shadow: 1px 1px 1px rgba(0,0,0,0.15), 0 0 1px rgba(0,0,0,0.15); 79 | -moz-box-shadow: 1px 1px 1px rgba(0,0,0,0.15), 0 0 1px rgba(0,0,0,0.15); 80 | box-shadow: 1px 1px 1px rgba(0,0,0,0.15), 0 0 1px rgba(0,0,0,0.15); 81 | } 82 | 83 | .direction-l .flag:before, 84 | .direction-r .flag:before { 85 | position: absolute; 86 | top: 50%; 87 | right: -40px; 88 | content: ' '; 89 | display: block; 90 | width: 12px; 91 | height: 12px; 92 | margin-top: -10px; 93 | background: #fff; 94 | border-radius: 10px; 95 | border: 4px solid rgb(255,80,80); 96 | z-index: 10; 97 | } 98 | 99 | .direction-r .flag:before { 100 | left: -40px; 101 | } 102 | 103 | .direction-l .flag:after { 104 | content: ""; 105 | position: absolute; 106 | left: 100%; 107 | top: 50%; 108 | height: 0; 109 | width: 0; 110 | margin-top: -8px; 111 | border: solid transparent; 112 | border-left-color: rgb(248,248,248); 113 | border-width: 8px; 114 | pointer-events: none; 115 | } 116 | 117 | .direction-r .flag:after { 118 | content: ""; 119 | position: absolute; 120 | right: 100%; 121 | top: 50%; 122 | height: 0; 123 | width: 0; 124 | margin-top: -8px; 125 | border: solid transparent; 126 | border-right-color: rgb(248,248,248); 127 | border-width: 8px; 128 | pointer-events: none; 129 | } 130 | 131 | .direction-l { 132 | float: left; 133 | } 134 | 135 | .direction-r { 136 | float: right; 137 | } 138 | 139 | .desc { 140 | margin: 1em 0.75em 0 0; 141 | 142 | font-size: 0.77777em; 143 | font-style: italic; 144 | line-height: 1.5em; 145 | } 146 | 147 | .direction-r .desc { 148 | margin: 1em 0 0 0.75em; 149 | } 150 | 151 | /* ================ Timeline Media Queries ================ */ 152 | 153 | @media screen and (max-width: 660px) { 154 | 155 | .timeline { 156 | width: 100%; 157 | padding: 4em 0 1em 0; 158 | } 159 | 160 | .timeline li { 161 | padding: 2em 0; 162 | } 163 | 164 | .direction-l, 165 | .direction-r { 166 | float: none; 167 | width: 100%; 168 | 169 | text-align: center; 170 | } 171 | 172 | .flag-wrapper { 173 | text-align: center; 174 | } 175 | 176 | .flag { 177 | background: rgb(255,255,255); 178 | z-index: 15; 179 | } 180 | 181 | .direction-l .flag:before, 182 | .direction-r .flag:before { 183 | position: absolute; 184 | top: -30px; 185 | left: 50%; 186 | content: ' '; 187 | display: block; 188 | width: 12px; 189 | height: 12px; 190 | margin-left: -9px; 191 | background: #fff; 192 | border-radius: 10px; 193 | border: 4px solid rgb(255,80,80); 194 | z-index: 10; 195 | } 196 | 197 | .direction-l .flag:after, 198 | .direction-r .flag:after { 199 | content: ""; 200 | position: absolute; 201 | left: 50%; 202 | top: -8px; 203 | height: 0; 204 | width: 0; 205 | margin-left: -8px; 206 | border: solid transparent; 207 | border-bottom-color: rgb(255,255,255); 208 | border-width: 8px; 209 | pointer-events: none; 210 | } 211 | 212 | .direction-l { 213 | float: none; 214 | } 215 | 216 | .direction-r { 217 | float: none; 218 | } 219 | 220 | .desc { 221 | position: relative; 222 | margin: 1em 0 0 0; 223 | padding: 1em; 224 | background: rgb(245,245,245); 225 | -webkit-box-shadow: 0 0 1px rgba(0,0,0,0.20); 226 | -moz-box-shadow: 0 0 1px rgba(0,0,0,0.20); 227 | box-shadow: 0 0 1px rgba(0,0,0,0.20); 228 | 229 | z-index: 15; 230 | } 231 | 232 | .direction-l .desc, 233 | .direction-r .desc { 234 | position: relative; 235 | margin: 1em 1em 0 1em; 236 | padding: 1em; 237 | 238 | z-index: 15; 239 | } 240 | } 241 | -------------------------------------------------------------------------------- /favicon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 王顶 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /js/bsz-page-footer.js: -------------------------------------------------------------------------------- 1 | /* exported $bszPageFooter */ 2 | var $bszPageFooter = (function() { 3 | var $DOM = $('' 4 | + '' 7 | + ''); 8 | 9 | function show(container) { 10 | var $ctn = $(container), 11 | pst = $ctn.css('position'); 12 | 13 | if(pst === 'static') $ctn.css('position', 'relative'); 14 | 15 | $ctn.append($DOM); 16 | } 17 | 18 | return {show: show}; 19 | }()); 20 | -------------------------------------------------------------------------------- /js/data.js: -------------------------------------------------------------------------------- 1 | /* 2 | * data.js 3 | * resume data module for SPA 4 | */ 5 | 6 | /* 数据模板 7 | { 8 | 'class' : '', 9 | 'date' : '', 10 | 'event' : '', 11 | 'href' : '' 12 | }, 13 | */ 14 | 15 | /* exported data */ 16 | var wd = {}; 17 | wd.data = { 18 | 'timeline' : [ 19 | { 20 | 'class' : 'l', 21 | 'date' : '2020年6月8日', 22 | 'event' : '制作并上线了 Node.js 自动化测试', 23 | 'href' : 'https://study.163.com/course/introduction/1210126425.htm' 24 | }, 25 | { 26 | 'class' : 'l', 27 | 'date' : '2020年6月1日', 28 | 'event' : '制作并上线了 SPA 富应用开发', 29 | 'href' : 'https://www.bilibili.com/video/BV1o7411L7L1' 30 | }, 31 | { 32 | 'class' : 'l', 33 | 'date' : '2020年3月18日', 34 | 'event' : '制作并上线了 Node.js 代码调试', 35 | 'href' : 'https://ke.sifou.com/course/1650000021972874' 36 | }, 37 | { 38 | 'class' : 'r', 39 | 'date' : '', 40 | 'event' : '2020 年', 41 | 'href' : '' 42 | }, 43 | { 44 | 'class' : 'l', 45 | 'date' : '2019年9月12日', 46 | 'event' : '制作并上线了 SeIDE 自动化测试(上)', 47 | 'href' : 'https://www.bilibili.com/video/BV1fJ411w7mk' 48 | }, 49 | { 50 | 'class' : 'l', 51 | 'date' : '2019年8月19日', 52 | 'event' : '制作并上线了思维导图实战课程', 53 | 'href' : 'https://www.bilibili.com/video/BV1rE411f7SY' 54 | }, 55 | { 56 | 'class' : 'l', 57 | 'date' : '2019年6月10日', 58 | 'event' : '制作并上线了 gitbook-plugin-gtalk', 59 | 'href' : 'https://www.npmjs.com/package/gitbook-plugin-gtalk' 60 | }, 61 | { 62 | 'class' : 'l', 63 | 'date' : '2019年5月28日', 64 | 'event' : '制作并上线了 gitbook-plugin-bsz', 65 | 'href' : 'https://www.npmjs.com/package/gitbook-plugin-bsz' 66 | }, 67 | { 68 | 'class' : 'l', 69 | 'date' : '2019年4月24日', 70 | 'event' : '制作并上线了 jsnotepad', 71 | 'href' : 'https://np.wangding.co/' 72 | }, 73 | { 74 | 'class' : 'r', 75 | 'date' : '2019年4月24日', 76 | 'event' : '开通 B 站账户', 77 | 'href' : 'https://space.bilibili.com/420780095' 78 | }, 79 | { 80 | 'class' : 'l', 81 | 'date' : '2019年3月30日', 82 | 'event' : '制作并上线了矩形计算器', 83 | 'href' : 'https://wangding.github.io/rectangle/' 84 | }, 85 | { 86 | 'class' : 'l', 87 | 'date' : '2019年2月26日', 88 | 'event' : '给经贸数统学院上信息科学基础', 89 | 'href' : '' 90 | }, 91 | { 92 | 'class' : 'l', 93 | 'date' : '2019年2月26日', 94 | 'event' : '给师大软件学院上 SPA 富应用开发', 95 | 'href' : '' 96 | }, 97 | { 98 | 'class' : 'l', 99 | 'date' : '2019年2月25日', 100 | 'event' : '给经贸数统学院上管理信息系统', 101 | 'href' : '' 102 | }, 103 | { 104 | 'class' : 'r', 105 | 'date' : '2019年2月19日', 106 | 'event' : '柏林禅寺受三皈五戒', 107 | 'href' : '' 108 | }, 109 | { 110 | 'class' : 'r', 111 | 'date' : '', 112 | 'event' : '2019 年', 113 | 'href' : '' 114 | }, 115 | { 116 | 'class' : 'l', 117 | 'date' : '2018年12月17日', 118 | 'event' : '制作并上线了 SPA 课程在线通关任务', 119 | 'href' : 'https://spa.wangding.co' 120 | }, 121 | { 122 | 'class' : 'l', 123 | 'date' : '2018年9月11日', 124 | 'event' : '给软件学院上 Node.js 应用开发课程', 125 | 'href' : '' 126 | }, 127 | { 128 | 'class' : 'l', 129 | 'date' : '2018年9月4日', 130 | 'event' : '给经贸数统学院上软件测试课程', 131 | 'href' : '' 132 | }, 133 | { 134 | 'class' : 'r', 135 | 'date' : '2018年8月20日', 136 | 'event' : '按照 Taiguanglin 禅修法开始修行', 137 | 'href' : '' 138 | }, 139 | { 140 | 'class' : 'l', 141 | 'date' : '2018年6月17日', 142 | 'event' : '制作并上线了信息科学基础在线实验', 143 | 'href' : 'https://info-lab.wangding.co' 144 | }, 145 | { 146 | 'class' : 'l', 147 | 'date' : '2018年6月4日', 148 | 'event' : '制作并上线了 Node.js 开发在线通关任务', 149 | 'href' : 'https://nodejs.wangding.co' 150 | }, 151 | { 152 | 'class' : 'l', 153 | 'date' : '2018年5月22日', 154 | 'event' : '制作并上线了 SPA 课程案例网站', 155 | 'href' : 'https://fe.wangding.co' 156 | }, 157 | { 158 | 'class' : 'l', 159 | 'date' : '2018年4月25日', 160 | 'event' : '制作并上线了信息科学基础在线实验手册', 161 | 'href' : 'https://manual.wangding.co' 162 | }, 163 | { 164 | 'class' : 'l', 165 | 'date' : '2018年3月7日', 166 | 'event' : '给经贸数统学院上管理信息系统', 167 | 'href' : '' 168 | }, 169 | { 170 | 'class' : 'l', 171 | 'date' : '2018年3月6日', 172 | 'event' : '给师大软件学院上 SPA 富应用开发', 173 | 'href' : '' 174 | }, 175 | { 176 | 'class' : 'l', 177 | 'date' : '2018年3月6日', 178 | 'event' : '给经贸数统学院上信息科学基础', 179 | 'href' : '' 180 | }, 181 | { 182 | 'class' : 'r', 183 | 'date' : '', 184 | 'event' : '2018 年', 185 | 'href' : '' 186 | }, 187 | { 188 | 'class' : 'l', 189 | 'date' : '2017年12月31日', 190 | 'event' : '参与 reformat-markdown-table 项目', 191 | 'href' : 'https://reformat.wangding.co' 192 | }, 193 | { 194 | 'class' : 'r', 195 | 'date' : '2017年11月29日', 196 | 'event' : '加入中科佰融', 197 | 'href' : '' 198 | }, 199 | { 200 | 'class' : 'l', 201 | 'date' : '2017年11月21日', 202 | 'event' : '制作并上线了个人简介网站', 203 | 'href' : 'https://i.wangding.co' 204 | }, 205 | { 206 | 'class' : 'r', 207 | 'date' : '2017年10月24日', 208 | 'event' : '开通 SegmentFault 网站账户', 209 | 'href' : 'https://sf.gg/u/wngding' 210 | }, 211 | { 212 | 'class' : 'l', 213 | 'date' : '2017年10月1', 214 | 'event' : 'node.js 应用开发(中)视频课程上线', 215 | 'href' : 'https://ke.qq.com/course/252061' 216 | }, 217 | { 218 | 'class' : 'l', 219 | 'date' : '2017年9月11日', 220 | 'event' : '给师大软件学院上 Node.js 应用开发', 221 | 'href' : '' 222 | }, 223 | { 224 | 'class' : 'l', 225 | 'date' : '2017年9月5日', 226 | 'event' : 'node.js 应用开发(上)视频课程上线', 227 | 'href' : 'https://ke.qq.com/course/244604' 228 | }, 229 | { 230 | 'class' : 'l', 231 | 'date' : '2017年9月4日', 232 | 'event' : '给经贸数统学院上软件测试基础', 233 | 'href' : '' 234 | }, 235 | { 236 | 'class' : 'l', 237 | 'date' : '2017年8月11日', 238 | 'event' : '搭建 Git 服务器视频课程上线', 239 | 'href' : 'https://ke.qq.com/course/232908' 240 | }, 241 | { 242 | 'class' : 'l', 243 | 'date' : '2017年8月7日', 244 | 'event' : '百度脑图入门视频课程上线', 245 | 'href' : 'https://www.bilibili.com/video/BV1R4411G7hb' 246 | }, 247 | { 248 | 'class' : 'l', 249 | 'date' : '2017年7月10日', 250 | 'event' : 'Jekyll 静态站视频课程上线', 251 | 'href' : 'https://ke.qq.com/course/229345' 252 | }, 253 | { 254 | 'class' : 'r', 255 | 'date' : '2017年7月1日', 256 | 'event' : '从物联网研究院离职,入职软件学院', 257 | 'href' : '' 258 | }, 259 | { 260 | 'class' : 'l', 261 | 'date' : '2017年6月25日', 262 | 'event' : 'Linux Bash 入门(下)视频课程上线', 263 | 'href' : 'https://ke.qq.com/course/230595' 264 | }, 265 | { 266 | 'class' : 'l', 267 | 'date' : '2017年5月28日', 268 | 'event' : 'JavaScript 异步编程视频课程上线', 269 | 'href' : 'https://ke.qq.com/course/230601' 270 | }, 271 | { 272 | 'class' : 'l', 273 | 'date' : '2017年5月19日', 274 | 'event' : 'Linux Bash 入门(上)视频课程上线', 275 | 'href' : 'https://ke.qq.com/course/230588' 276 | }, 277 | { 278 | 'class' : 'l', 279 | 'date' : '2017年5月4日', 280 | 'event' : 'Mocha 自动化测试(下)视频课程上线', 281 | 'href' : 'https://ke.qq.com/course/231595' 282 | }, 283 | { 284 | 'class' : 'l', 285 | 'date' : '2017年4月28日', 286 | 'event' : 'Mocha 自动化测试(上)视频课程上线', 287 | 'href' : 'https://ke.qq.com/course/231593' 288 | }, 289 | { 290 | 'class' : 'l', 291 | 'date' : '2017年4月17日', 292 | 'event' : 'how-to-markdown 视频课程上线', 293 | 'href' : 'https://ke.qq.com/course/227010' 294 | }, 295 | { 296 | 'class' : 'l', 297 | 'date' : '2017年4月10日', 298 | 'event' : '信息科学基础习题课(下)视频课程上线', 299 | 'href' : 'http://edu.51cto.com/course/course_id-8836.html' 300 | }, 301 | { 302 | 'class' : 'l', 303 | 'date' : '2017年3月19日', 304 | 'event' : 'GitBook 视频课程上线', 305 | 'href' : 'https://ke.qq.com/course/227227' 306 | }, 307 | { 308 | 'class' : 'l', 309 | 'date' : '2017年3月13日', 310 | 'event' : 'stylish 网站换肤视频课程上线', 311 | 'href' : 'https://ke.qq.com/course/226828' 312 | }, 313 | { 314 | 'class' : 'l', 315 | 'date' : '2017年3月7日', 316 | 'event' : '信息科学基础习题课(上)视频课程上线', 317 | 'href' : 'http://edu.51cto.com/course/course_id-8511.html' 318 | }, 319 | { 320 | 'class' : 'l', 321 | 'date' : '2017年2月21日', 322 | 'event' : '给经贸数统学院上管理信息系统', 323 | 'href' : '' 324 | }, 325 | { 326 | 'class' : 'l', 327 | 'date' : '2017年2月20日', 328 | 'event' : '给经贸数统学院上信息科学基础', 329 | 'href' : '' 330 | }, 331 | { 332 | 'class' : 'l', 333 | 'date' : '2017年2月20日', 334 | 'event' : 'Git 团队协作视频课程上线', 335 | 'href' : 'https://ke.qq.com/course/226121' 336 | }, 337 | { 338 | 'class' : 'l', 339 | 'date' : '2017年2月14日', 340 | 'event' : 'Git 进阶视频课程上线', 341 | 'href' : 'https://ke.qq.com/course/226116' 342 | }, 343 | { 344 | 'class' : 'l', 345 | 'date' : '2017年2月31日', 346 | 'event' : 'MarkDown 视频课程上线', 347 | 'href' : 'https://ke.qq.com/course/225259' 348 | }, 349 | { 350 | 'class' : 'l', 351 | 'date' : '2017年1月26日', 352 | 'event' : 'how-to-markdown 软件汉化', 353 | 'href' : 'https://github.com/workshopper/how-to-markdown/graphs/contributors' 354 | }, 355 | { 356 | 'class' : 'l', 357 | 'date' : '2017年1月22日', 358 | 'event' : 'Git 入门视频课程上线', 359 | 'href' : 'https://ke.qq.com/course/225248' 360 | }, 361 | { 362 | 'class' : 'r', 363 | 'date' : '', 364 | 'event' : '2017 年', 365 | 'href' : '' 366 | }, 367 | { 368 | 'class' : 'l', 369 | 'date' : '2016年12月26日', 370 | 'event' : 'Vimperator 上网工具视频课程上线', 371 | 'href' : 'https://ke.qq.com/course/231600' 372 | }, 373 | { 374 | 'class' : 'l', 375 | 'date' : '2016月12月19日', 376 | 'event' : 'Selenium IDE 案例实战视频课程上线', 377 | 'href' : 'https://ke.qq.com/course/233031' 378 | }, 379 | { 380 | 'class' : 'l', 381 | 'date' : '2016年11月27日', 382 | 'event' : 'Selenium IDE(下)视频课程上线', 383 | 'href' : 'https://ke.qq.com/course/232711' 384 | }, 385 | { 386 | 'class' : 'l', 387 | 'date' : '2016年11月6日', 388 | 'event' : 'Selenium IDE(中)视频课程上线', 389 | 'href' : 'https://ke.qq.com/course/232657' 390 | }, 391 | { 392 | 'class' : 'l', 393 | 'date' : '2016年10月11日', 394 | 'event' : 'Selenium IDE(上)视频课程上线', 395 | 'href' : 'https://ke.qq.com/course/232231' 396 | }, 397 | { 398 | 'class' : 'l', 399 | 'date' : '2016年9月12日', 400 | 'event' : '在线思维导图进阶视频课程上线', 401 | 'href' : 'https://ke.qq.com/course/232900' 402 | }, 403 | { 404 | 'class' : 'l', 405 | 'date' : '2016年8月23日', 406 | 'event' : '信息科学基础(上)视频课程上线', 407 | 'href' : 'http://edu.51cto.com/course/course_id-6578.html' 408 | }, 409 | { 410 | 'class' : 'l', 411 | 'date' : '2016年7月14日', 412 | 'event' : 'ProcessOn 在线思维导图视频课程上线', 413 | 'href' : 'https://ke.qq.com/course/232896' 414 | }, 415 | { 416 | 'class' : 'l', 417 | 'date' : '2016年7月3日', 418 | 'event' : '界面原型设计视频课程上线', 419 | 'href' : 'https://ke.qq.com/course/234713' 420 | }, 421 | { 422 | 'class' : 'l', 423 | 'date' : '2016年6月30日', 424 | 'event' : '产品设计简介视频课程上线', 425 | 'href' : 'https://ke.qq.com/course/234708' 426 | }, 427 | { 428 | 'class' : 'r', 429 | 'date' : '', 430 | 'event' : '2016 年', 431 | 'href' : '' 432 | }, 433 | { 434 | 'class' : 'r', 435 | 'date' : '2014年2月', 436 | 'event' : '开通 51CTO 学院讲师账户', 437 | 'href' : 'https://edu.51cto.com/lecturer/8606427.html' 438 | }, 439 | { 440 | 'class' : 'r', 441 | 'date' : '', 442 | 'event' : '2014 年', 443 | 'href' : '' 444 | }, 445 | { 446 | 'class' : 'l', 447 | 'date' : '2012年12月', 448 | 'event' : '参与 iSchool 项目', 449 | 'href' : '' 450 | }, 451 | { 452 | 'class' : 'r', 453 | 'date' : '2012年12月', 454 | 'event' : '加入河北师范大学移动物联网研究院', 455 | 'href' : '' 456 | }, 457 | { 458 | 'class' : 'l', 459 | 'date' : '2012年3月', 460 | 'event' : '软件测试管理图书出版', 461 | 'href' : 'http://product.china-pub.com/59771' 462 | }, 463 | { 464 | 'class' : 'r', 465 | 'date' : '', 466 | 'event' : '2012 年', 467 | 'href' : '' 468 | }, 469 | { 470 | 'class' : 'l', 471 | 'date' : '2010年1月28日', 472 | 'event' : 'C语言与程序设计大学教程图书出版', 473 | 'href' : 'http://product.china-pub.com/49727' 474 | }, 475 | { 476 | 'class' : 'r', 477 | 'date' : '', 478 | 'event' : '2010 年', 479 | 'href' : '' 480 | }, 481 | { 482 | 'class' : 'r', 483 | 'date' : '2008年10月9日', 484 | 'event' : '儿子王辰鑫出生', 485 | 'href' : '' 486 | }, 487 | { 488 | 'class' : 'r', 489 | 'date' : '', 490 | 'event' : '2008 年', 491 | 'href' : '' 492 | }, 493 | { 494 | 'class' : 'r', 495 | 'date' : '2007年9月10日', 496 | 'event' : '加入河北师大软件学院', 497 | 'href' : '' 498 | }, 499 | { 500 | 'class' : 'l', 501 | 'date' : '2007年9月10日', 502 | 'event' : '数字图像处理原理与应用图书出版', 503 | 'href' : 'http://product.china-pub.com/36136' 504 | }, 505 | { 506 | 'class' : 'r', 507 | 'date' : '', 508 | 'event' : '2007 年', 509 | 'href' : '' 510 | }, 511 | { 512 | 'class' : 'l', 513 | 'date' : '2005年5月', 514 | 'event' : '给中国网通河北分公司培训项目管理', 515 | 'href' : '' 516 | }, 517 | { 518 | 'class' : 'r', 519 | 'date' : '', 520 | 'event' : '2005 年', 521 | 'href' : '' 522 | }, 523 | { 524 | 'class' : 'r', 525 | 'date' : '2003年11月', 526 | 'event' : '从佳诚公司离职', 527 | 'href' : '' 528 | }, 529 | { 530 | 'class' : 'l', 531 | 'date' : '2003年4月', 532 | 'event' : '参与中国平安手机投保项目', 533 | 'href' : '' 534 | }, 535 | { 536 | 'class' : 'r', 537 | 'date' : '', 538 | 'event' : '2003 年', 539 | 'href' : '' 540 | }, 541 | { 542 | 'class' : 'l', 543 | 'date' : '2002年9月', 544 | 'event' : '参与河北省委移动办公项目', 545 | 'href' : '' 546 | }, 547 | { 548 | 'class' : 'l', 549 | 'date' : '2002年8月', 550 | 'event' : '参与河北省委邮件服务器迁移项目', 551 | 'href' : '' 552 | }, 553 | { 554 | 'class' : 'l', 555 | 'date' : '2002年7月', 556 | 'event' : '给省网通培训 Windows 2000 AD', 557 | 'href' : '' 558 | }, 559 | { 560 | 'class' : 'l', 561 | 'date' : '2002年7月7日', 562 | 'event' : '给微软全国 CTEC 教师培训 .net 技术', 563 | 'href' : '' 564 | }, 565 | { 566 | 'class' : 'r', 567 | 'date' : '', 568 | 'event' : '2002 年', 569 | 'href' : '' 570 | }, 571 | { 572 | 'class' : 'l', 573 | 'date' : '2001年7月', 574 | 'event' : '给全通公司培训 VB6.0 和 MSF', 575 | 'href' : '' 576 | }, 577 | { 578 | 'class' : 'l', 579 | 'date' : '2001年4月', 580 | 'event' : '给核工业航测遥感中心集体培训', 581 | 'href' : '' 582 | }, 583 | { 584 | 'class' : 'l', 585 | 'date' : '2001年3月', 586 | 'event' : '给省测绘局培训 VB6.0 程序开发', 587 | 'href' : '' 588 | }, 589 | { 590 | 'class' : 'r', 591 | 'date' : '2001年1月11日', 592 | 'event' : '获得 MCT 证书', 593 | 'href' : '' 594 | }, 595 | { 596 | 'class' : 'r', 597 | 'date' : '', 598 | 'event' : '2001 年', 599 | 'href' : '' 600 | }, 601 | { 602 | 'class' : 'l', 603 | 'date' : '2000年12月', 604 | 'event' : '给省建行培训 NT4.0 企业技术', 605 | 'href' : '' 606 | }, 607 | { 608 | 'class' : 'r', 609 | 'date' : '2000年6月', 610 | 'event' : '进入佳诚公司', 611 | 'href' : '' 612 | }, 613 | { 614 | 'class' : 'r', 615 | 'date' : '2000年5月25日', 616 | 'event' : '获得 MCSE 证书', 617 | 'href' : '' 618 | }, 619 | { 620 | 'class' : 'r', 621 | 'date' : '', 622 | 'event' : '2000 年', 623 | 'href' : '' 624 | }, 625 | { 626 | 'class' : 'r', 627 | 'date' : '1998年7月1日', 628 | 'event' : '入职河北经贸大学统计系', 629 | 'href' : '' 630 | }, 631 | { 632 | 'class' : 'r', 633 | 'date' : '1994年9月1日', 634 | 'event' : '上海铁道大学入学', 635 | 'href' : '' 636 | }, 637 | { 638 | 'class' : 'r', 639 | 'date' : '1991年9月1日', 640 | 'event' : '石家庄第十七中学入学', 641 | 'href' : '' 642 | }, 643 | { 644 | 'class' : 'r', 645 | 'date' : '1988年9月1日', 646 | 'event' : '石家庄第三十八中学入学', 647 | 'href' : '' 648 | }, 649 | { 650 | 'class' : 'r', 651 | 'date' : '1983年9月1日', 652 | 'event' : '国营胜利机械厂子弟小学入学', 653 | 'href' : '' 654 | }, 655 | { 656 | 'class' : 'r', 657 | 'date' : '1977年4月30日', 658 | 'event' : '出生', 659 | 'href' : '' 660 | }, 661 | ], 662 | 663 | 'slogan' : [ 664 | '王顶', 665 | 'WANGDING', 666 | 'MCSE, MCP, MCT', 667 | '互联网技术的爱好者,开源技术的实践者' 668 | ], 669 | 670 | 'info' : [ 671 | '基本信息', 672 | '男', 673 | '1977年4月30日', 674 | '石家庄', 675 | '机械设计与制造', 676 | '上海铁道大学' 677 | ], 678 | 679 | 'title' : [ 680 | '担任职位', 681 | '河北经贸大学讲师', 682 | '河北师范大学软件学院讲师', 683 | '河北师范大学物联网研究院技术总监', 684 | '河北师范大学数信学院企业研究生导师', 685 | '河北省数字教育协同创新中心执行副主任' 686 | ], 687 | 688 | 'contact' : [ 689 | '联系方式', 690 | '408 542 507', 691 | '135 8202 7613', 692 | '408552507@qq.com', 693 | 'https://sf.gg/u/wngding', 694 | 'https://github.com/wangding' 695 | ], 696 | 697 | 'skills' : [ 698 | '技术背景', 699 | 'Linux Bash', 700 | 'JavaScript 前端开发', 701 | 'Node.js 后端应用开发', 702 | 'Git 分布式版本控制系统', 703 | 'Selenium webdriver 自动化测试' 704 | ] 705 | }; 706 | -------------------------------------------------------------------------------- /js/fork-me-github.js: -------------------------------------------------------------------------------- 1 | /* exported $forkMeGH */ 2 | var $forkMeGH = (function () { 3 | //'
' 4 | 5 | function show(url) { 6 | var $box = document.createElement('div'); 7 | $box.innerHTML = 'Fork me on GitHub'; 8 | $box.className = 'fork-me-github'; 9 | $box.style = 'position: absolute; top: 0; right: 0; z-index: 20;'; 10 | document.body.append($box); 11 | } 12 | 13 | return {show: show}; 14 | })(); 15 | -------------------------------------------------------------------------------- /js/main.js: -------------------------------------------------------------------------------- 1 | /* 2 | * main.js 3 | * root module for SPA 4 | */ 5 | 6 | /* global $forkMeGH $resume $bszPageFooter */ 7 | $(function() { 8 | $resume.show($('#wd-resume')); 9 | $forkMeGH.show('https://github.com/wangding/i'); 10 | $bszPageFooter.show('#wd-resume-timeline'); 11 | }); 12 | -------------------------------------------------------------------------------- /js/resume.js: -------------------------------------------------------------------------------- 1 | /* 2 | * resume.js 3 | * resume module for SPA 4 | */ 5 | 6 | /* global wd $timeline: true */ 7 | /* exported $resume */ 8 | var $resume = (function() { 9 | var $container, 10 | data = ['info', 'title', 'contact', 'skills']; 11 | 12 | var fillSlogan = function() { 13 | wd.data.slogan[0] = '' + wd.data.slogan[0] + ''; 14 | $container.find('#wd-resume-slogan').html(wd.data.slogan.join('
')); 15 | }; 16 | 17 | var fillData = function() { 18 | data.forEach(function(id) { 19 | wd.data[id][0] = '' + wd.data[id][0] + ''; 20 | $container.find('#wd-resume-' + id).html(wd.data[id].join('
')); 21 | }); 22 | }; 23 | 24 | var show = function(container) { 25 | $container = container; 26 | fillSlogan(); 27 | fillData(); 28 | $timeline.show($container.find('#wd-resume-timeline')); 29 | }; 30 | 31 | return { show: show }; 32 | }()); 33 | -------------------------------------------------------------------------------- /js/timeline.js: -------------------------------------------------------------------------------- 1 | /* 2 | * timeline.js 3 | * timeline module for SPA 4 | */ 5 | 6 | /* global wd: true */ 7 | /* exported $timeline */ 8 | var $timeline = (function() { 9 | var items = '', 10 | item = '' 11 | + '
  • ' 12 | + '
    ' 13 | + '
    $
    ' 14 | + '
    #
    ' 15 | + '
    ' 16 | + '
  • '; 17 | 18 | function show(container) { 19 | wd.data.timeline.forEach(function(e) { 20 | var ev_items = item; 21 | ev_items = ev_items.replace('#', e.date); 22 | if(e.class === 'l') ev_items = ev_items.replace('direction-r', 'direction-l'); 23 | if(e.href === '') { 24 | ev_items = ev_items.replace('$','' + e.event +''); 25 | } else { 26 | ev_items = ev_items.replace('$', '' + e.event + ''); 27 | } 28 | items += ev_items; 29 | }); 30 | 31 | var $ul = $('').append(items); 32 | container.append($ul); 33 | } 34 | 35 | return { show: show }; 36 | }()); 37 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "i", 3 | "version": "1.0.0", 4 | "description": "王顶的个人简历", 5 | "scripts": { 6 | "test": "grunt lint", 7 | "build": "grunt build" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/wangding/i.git" 12 | }, 13 | "author": "wangding", 14 | "license": "MIT", 15 | "bugs": { 16 | "url": "https://github.com/wangding/i/issues" 17 | }, 18 | "homepage": "https://github.com/wangding/i#readme", 19 | "devDependencies": { 20 | "grunt": "^1.0.1", 21 | "grunt-contrib-clean": "^1.1.0", 22 | "grunt-contrib-concat": "^1.0.1", 23 | "grunt-contrib-copy": "^1.0.0", 24 | "grunt-contrib-csslint": "^2.0.0", 25 | "grunt-contrib-cssmin": "^2.2.1", 26 | "grunt-contrib-htmlmin": "^2.4.0", 27 | "grunt-contrib-uglify": "^3.3.0", 28 | "grunt-eslint": "^21.0.0", 29 | "grunt-htmlhint": "^0.9.13", 30 | "@wangding/grunt-qiniu-qupload": "^0.2.1", 31 | "grunt-usemin": "^3.1.1" 32 | } 33 | } 34 | --------------------------------------------------------------------------------