├── .babelrc ├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── .postcssrc.js ├── LICENSE ├── README.md ├── _config.yml ├── app.js ├── build ├── build.js ├── check-versions.js ├── logo.png ├── utils.js ├── vue-loader.conf.js ├── webpack.base.conf.js ├── webpack.dev.conf.js └── webpack.prod.conf.js ├── client.js ├── config ├── dev.env.js ├── index.js ├── prod.env.js └── proxy.js ├── dist ├── favicon.ico ├── hot │ └── index.html ├── index.html ├── now │ └── index.html └── static │ ├── css │ ├── app.8f75c41be5c651e364e7697874bdbebb.css │ └── app.8f75c41be5c651e364e7697874bdbebb.css.map │ └── js │ ├── 0.b52b0373ff6b3a580820.js │ ├── 0.b52b0373ff6b3a580820.js.map │ ├── 1.17756f7ae31222eae231.js │ ├── 1.17756f7ae31222eae231.js.map │ ├── 2.418619809e7e438d6206.js │ ├── 2.418619809e7e438d6206.js.map │ ├── 3.811c14d3fc363f56f053.js │ ├── 3.811c14d3fc363f56f053.js.map │ ├── 4.d12b786ae98a68fdb5f0.js │ ├── 4.d12b786ae98a68fdb5f0.js.map │ ├── app.dc8137b45381d871d00a.js │ ├── app.dc8137b45381d871d00a.js.map │ ├── manifest.4276fa394328a9f55052.js │ ├── manifest.4276fa394328a9f55052.js.map │ ├── vendor.a0ae2a66fe262215a11b.js │ └── vendor.a0ae2a66fe262215a11b.js.map ├── index.html ├── index.template.html ├── jsconfig.json ├── package-lock.json ├── package.json ├── server.js ├── src ├── App.vue ├── api │ ├── ajax.js │ └── index.js ├── assets │ ├── chat.svg │ └── logo.png ├── common │ ├── css │ │ └── border.css │ └── stylus │ │ ├── base.styl │ │ ├── index.styl │ │ ├── mixin.styl │ │ ├── reset.styl │ │ └── variable.styl ├── components │ ├── HelloWorld.vue │ ├── footer │ │ └── footer.vue │ ├── hot │ │ └── hot.vue │ ├── list │ │ └── list.vue │ ├── listDetail │ │ └── listDetail.vue │ ├── loading │ │ ├── loading.gif │ │ └── loading.vue │ ├── nodes │ │ └── nodeList.vue │ ├── now │ │ └── now.vue │ ├── scroll │ │ └── scroll.vue │ └── userDetail │ │ ├── index.js │ │ └── userDetail.vue ├── entry-client.js ├── entry-server.js ├── main.js ├── responsive.js ├── router │ └── index.js ├── server-app.js └── server-router.js └── static └── .gitkeep /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["env", { 4 | "modules": false, 5 | "targets": { 6 | "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] 7 | } 8 | }], 9 | "stage-2" 10 | ], 11 | "plugins": ["transform-vue-jsx", "transform-runtime"] 12 | } 13 | -------------------------------------------------------------------------------- /.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/ 2 | /config/ 3 | /dist/ 4 | /*.js 5 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | // http://eslint.org/docs/user-guide/configuring 2 | // 3 | 4 | // const globalVas = ['$', '_','DF', 'createjs', 'TweenMax', 'THREE', 'd3', 'require', 'window', 'document', 'test', 'expect', 'process', 'describe', 'Velocity'] 5 | // const getEslintVarsGlobals = () => { 6 | // let gObj = {}; 7 | // globalVas.map(v => { 8 | // gObj[v] = true 9 | // }) 10 | // return gObj 11 | // } 12 | 13 | const eslintConfig = { 14 | root: true, 15 | parser: 'babel-eslint', 16 | parserOptions: { 17 | ecmaVersion: 2017, 18 | sourceType: 'module', 19 | ecmaFeatures: { 20 | experimentalObjectRestSpread: true, 21 | jsx: true 22 | } 23 | }, 24 | env: { 25 | browser: true, 26 | node: true, 27 | es6: true, 28 | }, 29 | // extends: 'vue', 30 | // required to lint *.vue files 31 | plugins: [ 32 | 'html' 33 | ], 34 | // add your custom rules here 35 | 'rules': { 36 | // 强制行的最大长度 默认80个 37 | "max-len": [1, { 38 | "code": 150 39 | }], 40 | // 变量引号 41 | "quotes": [1, "single", { 42 | "allowTemplateLiterals": true 43 | }], 44 | // 缩进4个空格 swtich case缩进 45 | "indent": [2, 4, { 46 | "SwitchCase": 1, 47 | "VariableDeclarator": 1 48 | }], 49 | // 要求或禁止使用分号代替 50 | "semi": [0, "always"], 51 | // 不允许非空数组里面有多余的空格 52 | "array-bracket-spacing": [2, "never"], 53 | // 不允许函数括号之间存在空格 54 | "space-before-function-paren": ["error", "never"], 55 | // 强制 getter 和 setter 在对象中成对出现 56 | "accessor-pairs": 1, 57 | // 强制 要求箭头函数的箭头之前或之后有空格 58 | "arrow-spacing": 2, 59 | // 块语句作用域中禁止使用var 先声明再在块里使用 60 | "block-scoped-var": 2, 61 | // 大括号风格要求 62 | "brace-style": [1, "1tbs", { 63 | "allowSingleLine": true 64 | }], 65 | // 对象属性中禁止使用空格 obj[foo ] obj[ 'foo'] 66 | "computed-property-spacing": 2, 67 | // 要求使用骆驼拼写法 68 | "camelcase": 0, 69 | // 对象字面量项尾不能有逗号 70 | "comma-dangle": [2, "never"], 71 | // 逗号前后的空格 72 | "comma-spacing": [2, { 73 | "before": false, 74 | "after": true 75 | }], 76 | // this别名 that ,self ,me 77 | "consistent-this": [1, "me"], 78 | // 要求 switch 语句中有 default 分支 79 | "default-case": 2, 80 | // 点号操作符应该和属性在同一行 81 | "dot-location": [2, "property"], 82 | // 要求使用 === 和 !== (比较两个字面量的 、 比较 typeof 的值 、与 null 进行比较 可以) 83 | "eqeqeq": [1, "smart"], 84 | // 要求使用函数声明 而不是函数表达式 避免作用域提升 85 | "func-style": [1, "declaration", { 86 | "allowArrowFunctions": true 87 | }], 88 | // 强制块语句的最大可嵌套深度 最大4层 89 | "max-depth": 2, 90 | // 限制函数定义中最大参数个数 4个最多 91 | "max-params": [2, 5], 92 | // 要求调用无参构造函数时带括号 93 | "new-parens": 2, 94 | // 禁止alert 95 | "no-alert": 2, 96 | // 禁止使用 Array 构造函数 因为容易全局层面被重写 97 | "no-array-constructor": 2, 98 | // 禁止位操作符 99 | "no-bitwise": 2, 100 | // 禁用 arguments.caller 或 arguments.callee 101 | "no-caller": 2, 102 | // 禁止箭头函数 中使用 三元表达式 103 | "no-confusing-arrow": 2, 104 | // console不禁用 105 | "no-console": 0, 106 | // 禁止使用看起来像除法的正则表达式 107 | "no-div-regex": 2, 108 | // 禁止debuuger 生产模式中 109 | "no-debugger": process.env.NODE_ENV !== 'production' ? 0 : 2, 110 | // 禁止一个模块 重复导入 111 | "no-duplicate-imports": 2, 112 | // 禁止 if 语句中 return 语句之后有 else 块 113 | "no-else-return": 2, 114 | // 禁止label 115 | "no-empty-label": 0, 116 | // 禁止空的块级代码 117 | "no-empty": 2, 118 | // 禁eval 119 | "no-eval": 2, 120 | // 禁止扩展原生对象 121 | "no-extend-native": 2, 122 | // 禁止不必要的函数绑定 123 | "no-extra-bind": 2, 124 | // 禁止冗余的括号 125 | "no-extra-parens": 2, 126 | // 禁止浮点小数 缩写写法 例如.3 、 2. => 0.3 、2.0 127 | "no-floating-decimal": 2, 128 | // 禁止使用类似 eval() 的方法 129 | "no-implied-eval": 2, 130 | // 禁止使用内联注释 131 | "no-inline-comments": 2, 132 | // 禁用 __iterator__ 属性 133 | "no-iterator": 2, 134 | // 禁用不必要的嵌套块 135 | "no-lone-blocks": 2, 136 | // 禁止循环中存在函数 137 | "no-loop-func": 2, 138 | // 禁止 require 调用与普通变量声明混合使用 139 | "no-mixed-requires": 2, 140 | // 禁止使用嵌套的三元表达式 141 | "no-nested-ternary": 0, 142 | // 禁用Function构造函数 new Function() 143 | "no-new-func": 2, 144 | // 禁止使用 Object 构造函数 直接 var obj = {} 145 | "no-new-object": 2, 146 | // 禁止调用 require 时使用 new 操作符 147 | "no-new-require": 2, 148 | // 禁止原始包装实例 new String('abc') => String('abc') 149 | "no-new-wrappers": 2, 150 | // 禁止new实例后 不赋值 151 | "no-new": 2, 152 | // 禁止在字符串字面量中使用八进制转义序列 153 | "no-octal-escape": 2, 154 | // 当使用 _dirname 和 _filename 时不允许字符串拼接 155 | "no-path-concat": 2, 156 | // 禁用__proto__ 正确: var a = Object.getPrototypeOf(obj); 157 | "no-proto": 2, 158 | // 禁用 Node.js 模块 159 | "no-restricted-modules": 2, 160 | // 禁止在 return 语句中使用赋值语句 161 | "no-return-assign": 2, 162 | // 禁止自身比较 163 | "no-self-compare": 2, 164 | // 禁止使用逗号运算符 165 | "no-sequences": 2, 166 | // 禁止赋值关键字 167 | "no-shadow-restricted-names": 2, 168 | // 禁止在构造函数中,在调用 super() 之前使用 this 或 super 169 | "no-this-before-super": 2, 170 | // 禁止抛出字面量错误 throw "error"; 171 | "no-throw-literal": 2, 172 | // 禁用行尾空白 173 | "no-trailing-spaces": 2, 174 | // 禁止将变量初始化为 undefined 175 | "no-undef-init": 2, 176 | // 禁止 更简单的可替代的 表达式时使用三元操作符 isYes = answer === 1 ? true : false; 177 | "no-unneeded-ternary": 2, 178 | // 禁止未使用过的表达式 179 | "no-unused-expressions": [2, { 180 | "allowTernary": true 181 | }], 182 | // 禁止未使用过的变量 183 | "no-unused-vars": [1, { 184 | "vars": "all", 185 | "argsIgnorePattern": "\(h\)", 186 | "args": "after-used" // 最后一个参数必须使用。如:一个函数有两个参数,你使用了第二个参数,ESLint 不会报警告。 187 | }], 188 | // 禁止定义前使用 189 | "no-use-before-define": 2, 190 | // 禁用不必要的 .call() 和 .apply() 191 | "no-useless-call": 2, 192 | // 禁止没有必要的字符拼接 193 | "no-useless-concat": 2, 194 | // 禁用 void 操作符 195 | "no-void": 2, 196 | // 要求对象字面量简写语法 es6 标准 197 | "object-shorthand": ["off", "always", { 198 | "avoidQuotes": true 199 | }], 200 | // 要求或禁止尽可能地简化赋值操作 201 | "operator-assignment": 2, 202 | // 强制操作符使用一致的换行符风格 203 | "operator-linebreak": [2, "after"], 204 | // 要求使用 const 声明那些声明后不再被修改的变量 205 | "prefer-const": 0, 206 | // 建议使用扩展运算符而非.apply() 207 | "prefer-spread": 2, 208 | // parseInt必须带第二个参数 209 | "radix": 2, 210 | // 变量排序 211 | "sort-vars": 0, 212 | // 要求正则表达式被包裹起来 213 | "wrap-regex": 2, 214 | // 要求箭头函数的参数使用圆括号 "as-needed" 当只有一个参数时允许省略圆括号。 215 | "arrow-parens": [2, "as-needed"], 216 | } 217 | } 218 | 219 | 220 | module.exports = eslintConfig 221 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | npm-debug.log* 4 | yarn-debug.log* 5 | yarn-error.log* 6 | 7 | # Editor directories and files 8 | .idea 9 | .vscode 10 | *.suo 11 | *.ntvs* 12 | *.njsproj 13 | *.sln 14 | -------------------------------------------------------------------------------- /.postcssrc.js: -------------------------------------------------------------------------------- 1 | // https://github.com/michael-ciniawsky/postcss-load-config 2 | 3 | module.exports = { 4 | "plugins": { 5 | // "postcss-import": {}, 6 | // "postcss-url": {}, 7 | // to edit target browsers: use "browserslist" field in package.json 8 | "autoprefixer": {}, 9 | "postcss-pxtorem": { 10 | "rootValue": 100, 11 | "propWhiteList": [] 12 | } 13 | // "postcss-aspect-ratio-mini": {}, 14 | // "postcss-write-svg": { 15 | // utf8: false 16 | // }, 17 | // "postcss-cssnext": {}, 18 | // "postcss-px-to-viewport": { 19 | // viewportWidth: 750, 20 | // viewportHeight: 1334, 21 | // unitPrecision: 3, 22 | // viewportUnit: 'vw', 23 | // selectorBlackList: ['.ignore', '.hairlines'], 24 | // minPixelValue: 1, 25 | // mediaQuery: false 26 | // }, 27 | // "postcss-viewport-units": {}, 28 | // "cssnano": { 29 | // preset: "advanced", 30 | // autoprefixer: false, 31 | // "postcss-zindex": false 32 | // } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 hangzou 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 | # v2ex-vue 2 | 3 | > A Vue.js project 4 | 5 | ## Build Setup 6 | 7 | ``` bash 8 | # install dependencies 9 | npm install 10 | 11 | # serve with hot reload at localhost:8080 12 | npm run dev 13 | 14 | # build for production with minification 15 | npm run build 16 | 17 | # build for production and view the bundle analyzer report 18 | npm run build --report 19 | 20 | # 注意,需要启动node服务 21 | 22 | node server.js 23 | ``` 24 | #### 项目已经部署在[heroku.com](https://v2ex-vue.herokuapp.com/) 25 | **[访问leanapp.cn,更快](http://v2er.leanapp.cn/#/now)** 26 | - [x] 主要技术为 vue全家桶,stylus,v-lazy,better-scroll;实现下拉刷新,懒加载功能 27 | - [x] 后端为express,实现了express转发接口,跨域,实现接口自定义。 28 | - [x] 使用vh,vw + postcss 实现移动端适配,rem适配方案升级版 29 | - [ ] 分页(未实现,目前的思路为,在server.js通过切割数组来模拟) 30 | - [ ] 上拉加载(未实现) 31 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-cayman -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | const Vue = require('vue') 2 | 3 | module.exports = function(context) { 4 | return new Vue({ 5 | data: { 6 | url: context.url 7 | }, 8 | template: `
访问的 URL 是: {{ url }}
` 9 | }) 10 | } 11 | -------------------------------------------------------------------------------- /build/build.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | require('./check-versions')() 3 | 4 | process.env.NODE_ENV = 'production' 5 | 6 | const ora = require('ora') 7 | const rm = require('rimraf') 8 | const path = require('path') 9 | const chalk = require('chalk') 10 | const webpack = require('webpack') 11 | const config = require('../config') 12 | const webpackConfig = require('./webpack.prod.conf') 13 | 14 | const spinner = ora('building for production...') 15 | spinner.start() 16 | 17 | rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { 18 | if (err) throw err 19 | webpack(webpackConfig, (err, stats) => { 20 | spinner.stop() 21 | if (err) throw err 22 | process.stdout.write(stats.toString({ 23 | colors: true, 24 | modules: false, 25 | children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build. 26 | chunks: false, 27 | chunkModules: false 28 | }) + '\n\n') 29 | 30 | if (stats.hasErrors()) { 31 | console.log(chalk.red(' Build failed with errors.\n')) 32 | process.exit(1) 33 | } 34 | 35 | console.log(chalk.cyan(' Build complete.\n')) 36 | console.log(chalk.yellow( 37 | ' Tip: built files are meant to be served over an HTTP server.\n' + 38 | ' Opening index.html over file:// won\'t work.\n' 39 | )) 40 | }) 41 | }) 42 | -------------------------------------------------------------------------------- /build/check-versions.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const chalk = require('chalk') 3 | const semver = require('semver') 4 | const packageConfig = require('../package.json') 5 | const shell = require('shelljs') 6 | 7 | function exec (cmd) { 8 | return require('child_process').execSync(cmd).toString().trim() 9 | } 10 | 11 | const versionRequirements = [ 12 | { 13 | name: 'node', 14 | currentVersion: semver.clean(process.version), 15 | versionRequirement: packageConfig.engines.node 16 | } 17 | ] 18 | 19 | if (shell.which('npm')) { 20 | versionRequirements.push({ 21 | name: 'npm', 22 | currentVersion: exec('npm --version'), 23 | versionRequirement: packageConfig.engines.npm 24 | }) 25 | } 26 | 27 | module.exports = function () { 28 | const warnings = [] 29 | 30 | for (let i = 0; i < versionRequirements.length; i++) { 31 | const mod = versionRequirements[i] 32 | 33 | if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { 34 | warnings.push(mod.name + ': ' + 35 | chalk.red(mod.currentVersion) + ' should be ' + 36 | chalk.green(mod.versionRequirement) 37 | ) 38 | } 39 | } 40 | 41 | if (warnings.length) { 42 | console.log('') 43 | console.log(chalk.yellow('To use this template, you must update following to modules:')) 44 | console.log() 45 | 46 | for (let i = 0; i < warnings.length; i++) { 47 | const warning = warnings[i] 48 | console.log(' ' + warning) 49 | } 50 | 51 | console.log() 52 | process.exit(1) 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /build/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouhangwithsweet/v2ex-vue/56128fef943f77c3da6dbde88ee2f37bff3b9488/build/logo.png -------------------------------------------------------------------------------- /build/utils.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const path = require('path') 3 | const config = require('../config') 4 | const ExtractTextPlugin = require('extract-text-webpack-plugin') 5 | const packageConfig = require('../package.json') 6 | 7 | exports.assetsPath = function (_path) { 8 | const assetsSubDirectory = process.env.NODE_ENV === 'production' 9 | ? config.build.assetsSubDirectory 10 | : config.dev.assetsSubDirectory 11 | 12 | return path.posix.join(assetsSubDirectory, _path) 13 | } 14 | 15 | exports.cssLoaders = function (options) { 16 | options = options || {} 17 | 18 | const cssLoader = { 19 | loader: 'css-loader', 20 | options: { 21 | sourceMap: options.sourceMap 22 | } 23 | } 24 | 25 | const postcssLoader = { 26 | loader: 'postcss-loader', 27 | options: { 28 | sourceMap: options.sourceMap 29 | } 30 | } 31 | 32 | // generate loader string to be used with extract text plugin 33 | function generateLoaders (loader, loaderOptions) { 34 | const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader] 35 | 36 | if (loader) { 37 | loaders.push({ 38 | loader: loader + '-loader', 39 | options: Object.assign({}, loaderOptions, { 40 | sourceMap: options.sourceMap 41 | }) 42 | }) 43 | } 44 | 45 | // Extract CSS when that option is specified 46 | // (which is the case during production build) 47 | if (options.extract) { 48 | return ExtractTextPlugin.extract({ 49 | use: loaders, 50 | fallback: 'vue-style-loader' 51 | }) 52 | } else { 53 | return ['vue-style-loader'].concat(loaders) 54 | } 55 | } 56 | 57 | // https://vue-loader.vuejs.org/en/configurations/extract-css.html 58 | return { 59 | css: generateLoaders(), 60 | postcss: generateLoaders(), 61 | less: generateLoaders('less'), 62 | sass: generateLoaders('sass', { indentedSyntax: true }), 63 | scss: generateLoaders('sass'), 64 | stylus: generateLoaders('stylus'), 65 | styl: generateLoaders('stylus') 66 | } 67 | } 68 | 69 | // Generate loaders for standalone style files (outside of .vue) 70 | exports.styleLoaders = function (options) { 71 | const output = [] 72 | const loaders = exports.cssLoaders(options) 73 | 74 | for (const extension in loaders) { 75 | const loader = loaders[extension] 76 | output.push({ 77 | test: new RegExp('\\.' + extension + '$'), 78 | use: loader 79 | }) 80 | } 81 | 82 | return output 83 | } 84 | 85 | exports.createNotifierCallback = () => { 86 | const notifier = require('node-notifier') 87 | 88 | return (severity, errors) => { 89 | if (severity !== 'error') return 90 | 91 | const error = errors[0] 92 | const filename = error.file && error.file.split('!').pop() 93 | 94 | notifier.notify({ 95 | title: packageConfig.name, 96 | message: severity + ': ' + error.name, 97 | subtitle: filename || '', 98 | icon: path.join(__dirname, 'logo.png') 99 | }) 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /build/vue-loader.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const utils = require('./utils') 3 | const config = require('../config') 4 | const isProduction = process.env.NODE_ENV === 'production' 5 | const sourceMapEnabled = isProduction 6 | ? config.build.productionSourceMap 7 | : config.dev.cssSourceMap 8 | 9 | module.exports = { 10 | loaders: utils.cssLoaders({ 11 | sourceMap: sourceMapEnabled, 12 | extract: isProduction 13 | }), 14 | cssSourceMap: sourceMapEnabled, 15 | cacheBusting: config.dev.cacheBusting, 16 | transformToRequire: { 17 | video: ['src', 'poster'], 18 | source: 'src', 19 | img: 'src', 20 | image: 'xlink:href' 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /build/webpack.base.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const path = require('path') 3 | const utils = require('./utils') 4 | const config = require('../config') 5 | const vueLoaderConfig = require('./vue-loader.conf') 6 | 7 | function resolve (dir) { 8 | return path.join(__dirname, '..', dir) 9 | } 10 | 11 | const createLintingRule = () => ({ 12 | test: /\.(js|vue)$/, 13 | loader: 'eslint-loader', 14 | enforce: 'pre', 15 | include: [resolve('src'), resolve('test')], 16 | options: { 17 | formatter: require('eslint-friendly-formatter') 18 | // emitWarning: !config.dev.showEslintErrorsInOverlay 19 | } 20 | }) 21 | 22 | module.exports = { 23 | context: path.resolve(__dirname, '../'), 24 | entry: { 25 | app: './src/main.js' 26 | }, 27 | output: { 28 | path: config.build.assetsRoot, 29 | filename: '[name].js', 30 | publicPath: process.env.NODE_ENV === 'production' 31 | ? config.build.assetsPublicPath 32 | : config.dev.assetsPublicPath 33 | }, 34 | resolve: { 35 | extensions: ['.js', '.vue', '.json'], 36 | alias: { 37 | 'vue$': 'vue/dist/vue.esm.js', 38 | '@': resolve('src'), 39 | 'components': resolve('src/components'), 40 | 'api': resolve('src/api') 41 | } 42 | }, 43 | module: { 44 | rules: [ 45 | ...(config.dev.useEslint ? [createLintingRule()] : []), 46 | { 47 | test: /\.vue$/, 48 | loader: 'vue-loader', 49 | options: vueLoaderConfig 50 | }, 51 | { 52 | test: /\.js$/, 53 | loader: 'babel-loader', 54 | include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')] 55 | }, 56 | { 57 | test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, 58 | loader: 'url-loader', 59 | options: { 60 | limit: 10000, 61 | name: utils.assetsPath('img/[name].[hash:7].[ext]') 62 | } 63 | }, 64 | { 65 | test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, 66 | loader: 'url-loader', 67 | options: { 68 | limit: 10000, 69 | name: utils.assetsPath('media/[name].[hash:7].[ext]') 70 | } 71 | }, 72 | { 73 | test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, 74 | loader: 'url-loader', 75 | options: { 76 | limit: 10000, 77 | name: utils.assetsPath('fonts/[name].[hash:7].[ext]') 78 | } 79 | } 80 | ] 81 | }, 82 | node: { 83 | // prevent webpack from injecting useless setImmediate polyfill because Vue 84 | // source contains it (although only uses it if it's native). 85 | setImmediate: false, 86 | // prevent webpack from injecting mocks to Node native modules 87 | // that does not make sense for the client 88 | dgram: 'empty', 89 | fs: 'empty', 90 | net: 'empty', 91 | tls: 'empty', 92 | child_process: 'empty' 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /build/webpack.dev.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const utils = require('./utils') 3 | const webpack = require('webpack') 4 | const config = require('../config') 5 | const merge = require('webpack-merge') 6 | const path = require('path') 7 | const baseWebpackConfig = require('./webpack.base.conf') 8 | const CopyWebpackPlugin = require('copy-webpack-plugin') 9 | const HtmlWebpackPlugin = require('html-webpack-plugin') 10 | const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') 11 | const portfinder = require('portfinder') 12 | const axios = require('axios') 13 | const proxyConf = require('../config/proxy') 14 | const qs = require('qs') 15 | 16 | const HOST = process.env.HOST 17 | const PORT = process.env.PORT && Number(process.env.PORT) 18 | 19 | const devWebpackConfig = merge(baseWebpackConfig, { 20 | module: { 21 | rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true }) 22 | }, 23 | // cheap-module-eval-source-map is faster for development 24 | devtool: config.dev.devtool, 25 | 26 | // these devServer options should be customized in /config/index.js 27 | devServer: { 28 | clientLogLevel: 'warning', 29 | historyApiFallback: { 30 | rewrites: [ 31 | { from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') }, 32 | ], 33 | }, 34 | hot: true, 35 | contentBase: false, // since we use CopyWebpackPlugin. 36 | compress: true, 37 | host: HOST || config.dev.host, 38 | port: PORT || config.dev.port, 39 | open: config.dev.autoOpenBrowser, 40 | overlay: config.dev.errorOverlay 41 | ? { warnings: false, errors: true } 42 | : false, 43 | publicPath: config.dev.assetsPublicPath, 44 | proxy: config.dev.proxyTable, 45 | before(app) { 46 | // const headerConf = { 47 | // referer: 'https://www.v2ex.com', 48 | // host: 'www.v2ex.com' 49 | // } 50 | // for (let k in proxyConf) { 51 | // app.get(k, function(req, res) { 52 | // axios.get(proxyConf[k], { 53 | // headers: headerConf, 54 | // params: req.query 55 | // }).then(response => { 56 | // res.json(response.data) 57 | // }).catch(e => { 58 | // console.log(e) 59 | // }) 60 | // }) 61 | // } 62 | // app.get('/api/now', function(req, res) { 63 | // var url = 'https://www.v2ex.com/api/topics/latest.json' 64 | // axios.get(url, { 65 | // headers: headerConf 66 | // }).then((response) => { 67 | // res.json(response.data) 68 | // }).catch((e) =>{ 69 | // console.log(e) 70 | // }) 71 | // }) 72 | }, 73 | quiet: true, // necessary for FriendlyErrorsPlugin 74 | watchOptions: { 75 | poll: config.dev.poll, 76 | } 77 | }, 78 | plugins: [ 79 | new webpack.optimize.CommonsChunkPlugin({ 80 | name: 'vendor', 81 | minChunks: ({ resource }) => ( 82 | resource && 83 | resource.indexOf('node_modules') >= 0 && 84 | resource.match(/\.js$/) 85 | ) 86 | }), 87 | new webpack.DefinePlugin({ 88 | 'process.env': require('../config/dev.env') 89 | }), 90 | new webpack.HotModuleReplacementPlugin(), 91 | new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update. 92 | new webpack.NoEmitOnErrorsPlugin(), 93 | // https://github.com/ampedandwired/html-webpack-plugin 94 | new HtmlWebpackPlugin({ 95 | filename: 'index.html', 96 | template: 'index.html', 97 | inject: true 98 | }), 99 | // copy custom static assets 100 | new CopyWebpackPlugin([ 101 | { 102 | from: path.resolve(__dirname, '../static'), 103 | to: config.dev.assetsSubDirectory, 104 | ignore: ['.*'] 105 | } 106 | ]) 107 | ] 108 | }) 109 | 110 | module.exports = new Promise((resolve, reject) => { 111 | portfinder.basePort = process.env.PORT || config.dev.port 112 | portfinder.getPort((err, port) => { 113 | if (err) { 114 | reject(err) 115 | } else { 116 | // publish the new Port, necessary for e2e tests 117 | process.env.PORT = port 118 | // add port to devServer config 119 | devWebpackConfig.devServer.port = port 120 | 121 | // Add FriendlyErrorsPlugin 122 | devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({ 123 | compilationSuccessInfo: { 124 | messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`], 125 | }, 126 | onErrors: config.dev.notifyOnErrors 127 | ? utils.createNotifierCallback() 128 | : undefined 129 | })) 130 | 131 | resolve(devWebpackConfig) 132 | } 133 | }) 134 | }) 135 | -------------------------------------------------------------------------------- /build/webpack.prod.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const path = require('path') 3 | const utils = require('./utils') 4 | const webpack = require('webpack') 5 | const config = require('../config') 6 | const merge = require('webpack-merge') 7 | const baseWebpackConfig = require('./webpack.base.conf') 8 | const CopyWebpackPlugin = require('copy-webpack-plugin') 9 | const HtmlWebpackPlugin = require('html-webpack-plugin') 10 | const ExtractTextPlugin = require('extract-text-webpack-plugin') 11 | const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin') 12 | const UglifyJsPlugin = require('uglifyjs-webpack-plugin') 13 | // const PrerenderSpaPlugin = require('prerender-spa-plugin') 14 | 15 | const env = require('../config/prod.env') 16 | 17 | const webpackConfig = merge(baseWebpackConfig, { 18 | module: { 19 | rules: utils.styleLoaders({ 20 | sourceMap: config.build.productionSourceMap, 21 | extract: true, 22 | usePostCSS: true 23 | }) 24 | }, 25 | devtool: config.build.productionSourceMap ? config.build.devtool : false, 26 | output: { 27 | path: config.build.assetsRoot, 28 | filename: utils.assetsPath('js/[name].[chunkhash].js'), 29 | chunkFilename: utils.assetsPath('js/[id].[chunkhash].js') 30 | }, 31 | plugins: [ 32 | // http://vuejs.github.io/vue-loader/en/workflow/production.html 33 | new webpack.DefinePlugin({ 34 | 'process.env': env 35 | }), 36 | new UglifyJsPlugin({ 37 | uglifyOptions: { 38 | compress: { 39 | warnings: false 40 | } 41 | }, 42 | sourceMap: config.build.productionSourceMap, 43 | parallel: true 44 | }), 45 | // extract css into its own file 46 | new ExtractTextPlugin({ 47 | filename: utils.assetsPath('css/[name].[contenthash].css'), 48 | // Setting the following option to `false` will not extract CSS from codesplit chunks. 49 | // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack. 50 | // It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`, 51 | // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110 52 | allChunks: true, 53 | }), 54 | // Compress extracted CSS. We are using this plugin so that possible 55 | // duplicated CSS from different components can be deduped. 56 | new OptimizeCSSPlugin({ 57 | cssProcessorOptions: config.build.productionSourceMap 58 | ? { safe: true, map: { inline: false } } 59 | : { safe: true } 60 | }), 61 | // generate dist index.html with correct asset hash for caching. 62 | // you can customize output by editing /index.html 63 | // see https://github.com/ampedandwired/html-webpack-plugin 64 | new HtmlWebpackPlugin({ 65 | filename: config.build.index, 66 | template: 'index.html', 67 | inject: true, 68 | minify: { 69 | removeComments: true, 70 | collapseWhitespace: true, 71 | removeAttributeQuotes: true 72 | // more options: 73 | // https://github.com/kangax/html-minifier#options-quick-reference 74 | }, 75 | // necessary to consistently work with multiple chunks via CommonsChunkPlugin 76 | chunksSortMode: 'dependency' 77 | }), 78 | // keep module.id stable when vendor modules does not change 79 | new webpack.HashedModuleIdsPlugin(), 80 | // enable scope hoisting 81 | new webpack.optimize.ModuleConcatenationPlugin(), 82 | // split vendor js into its own file 83 | new webpack.optimize.CommonsChunkPlugin({ 84 | name: 'vendor', 85 | minChunks (module) { 86 | // any required modules inside node_modules are extracted to vendor 87 | return ( 88 | module.resource && 89 | /\.js$/.test(module.resource) && 90 | module.resource.indexOf( 91 | path.join(__dirname, '../node_modules') 92 | ) === 0 93 | ) 94 | } 95 | }), 96 | // extract webpack runtime and module manifest to its own file in order to 97 | // prevent vendor hash from being updated whenever app bundle is updated 98 | new webpack.optimize.CommonsChunkPlugin({ 99 | name: 'manifest', 100 | minChunks: Infinity 101 | }), 102 | // This instance extracts shared chunks from code splitted chunks and bundles them 103 | // in a separate chunk, similar to the vendor chunk 104 | // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk 105 | new webpack.optimize.CommonsChunkPlugin({ 106 | name: 'app', 107 | async: 'vendor-async', 108 | children: true, 109 | minChunks: 3 110 | }), 111 | 112 | // copy custom static assets 113 | new CopyWebpackPlugin([ 114 | { 115 | from: path.resolve(__dirname, '../static'), 116 | to: config.build.assetsSubDirectory, 117 | ignore: ['.*'] 118 | } 119 | ]), 120 | // new PrerenderSpaPlugin({ 121 | // staticDir: path.join(__dirname, '../dist'), 122 | 123 | // // Optional - The path your rendered app should be output to. 124 | // // (Defaults to staticDir.) 125 | // // outputDir: path.join(__dirname, 'prerendered'), 126 | 127 | // // Optional - The location of index.html 128 | // // indexPath: path.join(__dirname, 'dist', 'index.html'), 129 | 130 | // // Required - Routes to render. 131 | // routes: ['/', '/now', '/hot'] 132 | // }) 133 | ] 134 | }) 135 | 136 | if (config.build.productionGzip) { 137 | const CompressionWebpackPlugin = require('compression-webpack-plugin') 138 | 139 | webpackConfig.plugins.push( 140 | new CompressionWebpackPlugin({ 141 | asset: '[path].gz[query]', 142 | algorithm: 'gzip', 143 | test: new RegExp( 144 | '\\.(' + 145 | config.build.productionGzipExtensions.join('|') + 146 | ')$' 147 | ), 148 | threshold: 10240, 149 | minRatio: 0.8 150 | }) 151 | ) 152 | } 153 | 154 | if (config.build.bundleAnalyzerReport) { 155 | const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin 156 | webpackConfig.plugins.push(new BundleAnalyzerPlugin()) 157 | } 158 | 159 | module.exports = webpackConfig 160 | -------------------------------------------------------------------------------- /client.js: -------------------------------------------------------------------------------- 1 | const createApp = require('./app') 2 | const server = require('express')() 3 | const renderer = require('vue-server-renderer').createRenderer({ 4 | template: require('fs').readFileSync('./index.template.html', 'utf-8') 5 | }) 6 | 7 | const context = { 8 | title: '666', 9 | meta: ` 10 | 11 | 12 | ` 13 | } 14 | 15 | server.get('*', (req, res) => { 16 | const context = { 17 | url: req.url 18 | } 19 | const app = createApp(context) 20 | renderer.renderToString(app, (err, html) => { 21 | if (err) { 22 | console.log(err) 23 | res.status(500).end('Internal Server Error') 24 | return 25 | } 26 | res.setHeader('Content-Type', 'text/html;charset=UTF-8') 27 | res.end(html) 28 | }) 29 | }) 30 | 31 | server.listen(9527) -------------------------------------------------------------------------------- /config/dev.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const merge = require('webpack-merge') 3 | const prodEnv = require('./prod.env') 4 | 5 | module.exports = merge(prodEnv, { 6 | NODE_ENV: '"development"', 7 | MOCK_URL: '"http://127.0.0.1:5000/api"', 8 | TRUE_URL: '"https://www.v2ex.com/api"' 9 | }) 10 | -------------------------------------------------------------------------------- /config/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | // Template version: 1.3.1 3 | // see http://vuejs-templates.github.io/webpack for documentation. 4 | 5 | const path = require('path') 6 | 7 | module.exports = { 8 | dev: { 9 | 10 | // Paths 11 | assetsSubDirectory: 'static', 12 | assetsPublicPath: '/', 13 | proxyTable: { 14 | // '/api': { //将www.exaple.com印射为/apis 15 | // target: 'http://127.0.0.1:5000', // 接口域名 16 | // changeOrigin: true, //是否跨域 17 | // secure: false 18 | // } 19 | }, 20 | 21 | // Various Dev Server settings 22 | host: '0.0.0.0', // can be overwritten by process.env.HOST 23 | port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined 24 | autoOpenBrowser: false, 25 | errorOverlay: true, 26 | notifyOnErrors: true, 27 | poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions- 28 | 29 | // Use Eslint Loader? 30 | // If true, your code will be linted during bundling and 31 | // linting errors and warnings will be shown in the console. 32 | useEslint: true, 33 | // If true, eslint errors and warnings will also be shown in the error overlay 34 | // in the browser. 35 | showEslintErrorsInOverlay: false, 36 | 37 | /** 38 | * Source Maps 39 | */ 40 | 41 | // https://webpack.js.org/configuration/devtool/#development 42 | devtool: 'cheap-module-eval-source-map', 43 | 44 | // If you have problems debugging vue-files in devtools, 45 | // set this to false - it *may* help 46 | // https://vue-loader.vuejs.org/en/options.html#cachebusting 47 | cacheBusting: true, 48 | 49 | cssSourceMap: true 50 | }, 51 | 52 | build: { 53 | // Template for index.html 54 | index: path.resolve(__dirname, '../dist/index.html'), 55 | 56 | // Paths 57 | assetsRoot: path.resolve(__dirname, '../dist'), 58 | assetsSubDirectory: 'static', 59 | assetsPublicPath: '/', 60 | 61 | /** 62 | * Source Maps 63 | */ 64 | 65 | productionSourceMap: true, 66 | // https://webpack.js.org/configuration/devtool/#production 67 | devtool: '#source-map', 68 | 69 | // Gzip off by default as many popular static hosts such as 70 | // Surge or Netlify already gzip all static assets for you. 71 | // Before setting to `true`, make sure to: 72 | // npm install --save-dev compression-webpack-plugin 73 | productionGzip: false, 74 | productionGzipExtensions: ['js', 'css'], 75 | 76 | // Run the build command with an extra argument to 77 | // View the bundle analyzer report after build finishes: 78 | // `npm run build --report` 79 | // Set to `true` or `false` to always turn it on or off 80 | bundleAnalyzerReport: process.env.npm_config_report 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /config/prod.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | module.exports = { 3 | NODE_ENV: '"production"', 4 | MOCK_URL: '"/api"', 5 | TRUE_URL: '"https://www.v2ex.com/api"' 6 | } 7 | -------------------------------------------------------------------------------- /config/proxy.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '/api/now': 'https://www.v2ex.com/api/topics/latest.json', 3 | '/api/topics/latest.json': 'https://www.v2ex.com/api/topics/latest.json', 4 | '/api/hot': 'https://www.v2ex.com/api/topics/hot.json', 5 | '/api/topics/hot.json': 'https://www.v2ex.com/api/topics/hot.json', 6 | '/api/node': 'https://www.v2ex.com/api/nodes/show.json', 7 | '/api/userinfo': 'https://www.v2ex.com/api/members/show.json', 8 | '/api/replies/show.json': 'https://www.v2ex.com/api/replies/show.json', 9 | '/api/topics/show.json': 'https://www.v2ex.com/api/topics/show.json', 10 | '/api/members/show.json': 'https://www.v2ex.com/api/members/show.json' 11 | } 12 | -------------------------------------------------------------------------------- /dist/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouhangwithsweet/v2ex-vue/56128fef943f77c3da6dbde88ee2f37bff3b9488/dist/favicon.ico -------------------------------------------------------------------------------- /dist/hot/index.html: -------------------------------------------------------------------------------- 1 | v2ex-vue

正在载入...

-------------------------------------------------------------------------------- /dist/index.html: -------------------------------------------------------------------------------- 1 | v2ex-vue
-------------------------------------------------------------------------------- /dist/now/index.html: -------------------------------------------------------------------------------- 1 | v2ex-vue

正在载入...

-------------------------------------------------------------------------------- /dist/static/css/app.8f75c41be5c651e364e7697874bdbebb.css: -------------------------------------------------------------------------------- 1 | .v-header{height:.44rem;-ms-flex-pack:center;justify-content:center;font-size:.36rem;font-weight:700;color:#000;z-index:99999}.footer,.v-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;background-color:#fff}.footer{-ms-flex-pack:justify;justify-content:space-between;position:fixed;height:.96rem;bottom:0;left:0;right:0;z-index:200}.footer .footer-item{-ms-flex:1;flex:1;height:100%;display:-ms-flexbox;display:flex;-ms-flex-pack:distribute;justify-content:space-around;-ms-flex-align:center;align-items:center;-ms-flex-direction:column;flex-direction:column;font-size:.2rem;color:#333}.footer .footer-item.router-link-active{color:#42b983}.v-list{width:100%;background-color:#eee;position:relative}.v-list .v-list__item{height:2.4rem;margin-bottom:.08rem;padding:0 .2rem;background-color:#fff}.v-list .v-list__item .v-list__detail{position:relative;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;height:1.2rem;padding-top:.2rem}.v-list .v-list__item .v-list__detail .v-list__img{width:1.1rem;height:1.1rem;border-radius:50%;margin-right:.2rem}.v-list .v-list__item .v-list__detail .v-list__desc{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:distribute;justify-content:space-around;height:100%}.v-list .v-list__item .v-list__detail .v-list__desc .v-list__desc--name{font-size:.36rem;color:#101010}.v-list .v-list__item .v-list__detail .v-list__desc .v-list__desc--time{font-size:.28rem;color:#b1b1b1}.v-list .v-list__item .v-list__node{position:absolute;top:.2rem;right:0}.v-list .v-list__item .v-list__node .v-list__node--title{border-radius:.04rem;background-color:#eee}.v-list .v-list__item .v-list__node .v-list__node--count,.v-list .v-list__item .v-list__node .v-list__node--title{display:inline-block;padding:.08rem;font-size:.24rem;color:#b7b7b7}.v-list .v-list__item .v-list__node .v-list__node--count img{width:.28rem;height:.28rem;position:relative;top:.04rem}.v-list .v-list__item .v-list__content{width:100%;height:1rem;padding-top:.2rem;line-height:1.25;font-size:.28rem;color:#101010;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2}.scroll-wrapper{position:fixed;top:0;bottom:.88rem;left:0;right:0}.loading{width:100%;text-align:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;height:.5rem}.loading .desc{line-height:.2rem;font-size:.24rem;color:#b7b7b7}@svg 1px-border{height:.02rem;@rect{fill:#eee;width:100%;height:50%}}.back{position:fixed;z-index:200;color:#000;border-bottom:.01rem solid #eee}.loading-wrapper{height:.5rem;overflow:hidden;transition:all .2s}.content-wrapper{overflow:hidden;top:.44rem;bottom:.88rem;padding:0 .2rem}.detail-header{height:.44rem;-ms-flex-pack:center;justify-content:center;position:relative;top:0;background-color:#fff;color:#777;padding:0 .2rem}.detail-header,.detail-header .icon-wrapper{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;width:100%}.detail-header .icon-wrapper{height:100%}.list-detail{position:fixed;top:0;bottom:0;right:0;left:0;background:#fff}.list-detail .detail-title{font-size:.36rem;color:#000;padding:.2rem 0}.list-detail .detail-user{display:-ms-flexbox;display:flex}.list-detail .detail-user .user-avatar{width:.96rem;height:.96rem;border-radius:50%;margin-right:.1rem}.list-detail .detail-user .user-info{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:distribute;justify-content:space-around;padding:.1rem 0}.list-detail .detail-user .user-info .user-name{color:#000;font-size:.32rem}.list-detail .detail-user .user-info .user-node{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;font-size:.24rem;color:#b1b1b1}.list-detail .detail-content{padding:.1rem 0;font-size:.3rem;color:#000;line-height:1.5}.list-detail .detail-content p{margin-bottom:.2rem}.list-detail .detail-content img{max-width:100%}.list-detail .detail-reply{padding:.2rem 0}.list-detail .detail-reply .reply-item{position:relative;padding:.2rem 0;color:#000}.list-detail .detail-reply .reply-item .reply-content{padding:.1rem 0 .1rem 1.06rem;font-size:.28rem;line-height:1.5}.list-detail .detail-reply .reply-item .reply-content img{width:80%}.list-detail .detail-reply .reply-item .icon-heart{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;position:absolute;top:.2rem;right:0;color:red}.list-detail .detail-reply .reply-item .icon-heart .heart-count{display:inline-block;margin-left:.1rem;font-size:.24rem;color:#b1b1b1}.slider-enter-active,.slider-leave-active{transition:all .3s}.slider-enter,.slider-leave-to{transform:translate3d(100%,0,0)}.node-list{padding:.05rem .2rem}.node-list .node-name{width:100%;height:1rem;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.1rem .2rem 0;background-color:#eee;font-size:.32rem;color:#000}.node-list .node-childList{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.2rem;color:#b1b1b1;font-size:.28rem}.node-list .node-childList .child-item{padding:.1rem;margin-right:.2rem;margin-bottom:.2rem;background-color:#eee;border-radius:.04rem}.node-detail{position:absolute;overflow:hidden;width:100%;top:0;bottom:0;background-color:#fff}.node-detail .v-list{top:.44rem;bottom:.88rem}.node-detail .loading-wrapper{overflow:hidden}.node-detail .v-header{position:relative}.node-detail .v-header .icon-wrapper{position:absolute;top:50%;left:.2rem;transform:translateY(-50%);width:.8rem}.fade-enter-active,.fade-leave-active{transition:all .3s}.fade-enter,.fade-leave-to{opacity:0}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,html,i,iframe,img,input,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{margin:0;padding:0;border:0;font-size:100%;font-weight:400;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,menu,nav,section{display:block}body{line-height:1}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:none}table{border-collapse:collapse;border-spacing:0}a{color:#7e8c8d;-webkit-backface-visibility:hidden;text-decoration:none}li{list-style:none}body{-webkit-text-size-adjust:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}body,html{line-height:1;font-family:PingFang SC,STHeitiSC-Light,Helvetica-Light,arial,sans-serif;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;background:#fff;color:#37c6c0}*,:after,:before{box-sizing:border-box}img{content:normal!important}@media (-webkit-min-device-pixel-ratio:1.5),(min-device-pixel-ratio:1.5){.border-1px:after{transform:scaleY(.7)}}@media (-webkit-min-device-pixel-ratio:2),(min-device-pixel-ratio:2){.border-1px:after{transform:scaleY(.5)}}.border-1px{border-top:.01rem solid #eee}.border-1px-b{border-bottom:.01rem solid #eee}.fa-icon{display:inline-block;fill:currentColor}.fa-flip-horizontal{transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-spin{animation:fa-spin 1s 0s infinite linear}.fa-inverse{color:#fff}.fa-pulse{animation:fa-spin 1s infinite steps(8)}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.user-wrapper{position:fixed;top:0;left:0;bottom:0;right:0;z-index:9999;background-color:#fff}.user-wrapper .user-close{position:absolute;width:.4rem;height:.4rem;top:.2rem;right:.2rem;color:#42b983}.user-wrapper .user-inner{display:-ms-flexbox;display:flex;width:100%;padding-top:1.4rem;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.user-wrapper .user-inner .user-avatar{border-radius:50%}.user-wrapper .user-inner .user-time{margin-top:.4rem;color:#000;font-size:.3rem}.open-enter-active,.open-leave-active{transition:all .3s}.open-enter,.open-leave-to{opacity:0} 2 | /*# sourceMappingURL=app.8f75c41be5c651e364e7697874bdbebb.css.map */ -------------------------------------------------------------------------------- /dist/static/css/app.8f75c41be5c651e364e7697874bdbebb.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["app.8f75c41be5c651e364e7697874bdbebb.css"],"names":[],"mappings":"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","file":"app.8f75c41be5c651e364e7697874bdbebb.css","sourcesContent":["\n.v-header {\n height: 0.44rem;\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n font-size: 0.36rem;\n font-weight: 700;\n color: #000;\n background-color: #fff;\n z-index: 99999;\n}\n.footer {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-pack: justify;\n -ms-flex-pack: justify;\n justify-content: space-between;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n position: fixed;\n height: 0.96rem;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 200;\n background-color: #fff;\n}\n.footer .footer-item {\n -webkit-box-flex: 1;\n -ms-flex: 1;\n flex: 1;\n height: 100%;\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-pack: distribute;\n justify-content: space-around;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n -webkit-box-orient: vertical;\n -webkit-box-direction: normal;\n -ms-flex-direction: column;\n flex-direction: column;\n font-size: 0.2rem;\n color: #333;\n}\n.footer .footer-item.router-link-active {\n color: #42b983;\n}\n.loading-wrapper {\n height: 0.5rem;\n overflow: hidden;\n -webkit-transition: all 0.2s;\n transition: all 0.2s;\n}\n.v-list {\n width: 100%;\n background-color: #eee;\n position: relative;\n}\n.v-list .v-list__item {\n height: 2.4rem;\n margin-bottom: 0.08rem;\n padding: 0 0.2rem;\n background-color: #fff;\n}\n.v-list .v-list__item .v-list__detail {\n position: relative;\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n height: 1.2rem;\n padding-top: 0.2rem;\n}\n.v-list .v-list__item .v-list__detail .v-list__img {\n width: 1.1rem;\n height: 1.1rem;\n border-radius: 50%;\n margin-right: 0.2rem;\n}\n.v-list .v-list__item .v-list__detail .v-list__desc {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-orient: vertical;\n -webkit-box-direction: normal;\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-pack: distribute;\n justify-content: space-around;\n height: 100%;\n}\n.v-list .v-list__item .v-list__detail .v-list__desc .v-list__desc--name {\n font-size: 0.36rem;\n color: #101010;\n}\n.v-list .v-list__item .v-list__detail .v-list__desc .v-list__desc--time {\n font-size: 0.28rem;\n color: #b1b1b1;\n}\n.v-list .v-list__item .v-list__node {\n position: absolute;\n top: 0.2rem;\n right: 0;\n}\n.v-list .v-list__item .v-list__node .v-list__node--title {\n display: inline-block;\n padding: 0.08rem;\n font-size: 0.24rem;\n border-radius: 0.04rem;\n color: #b7b7b7;\n background-color: #eee;\n}\n.v-list .v-list__item .v-list__node .v-list__node--count {\n display: inline-block;\n padding: 0.08rem;\n font-size: 0.24rem;\n color: #b7b7b7;\n}\n.v-list .v-list__item .v-list__node .v-list__node--count img {\n width: 0.28rem;\n height: 0.28rem;\n position: relative;\n top: 0.04rem;\n}\n.v-list .v-list__item .v-list__content {\n width: 100%;\n height: 1rem;\n padding-top: 0.2rem;\n line-height: calc(80 / 64);\n font-size: 0.28rem;\n color: #101010;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n}\n.scroll-wrapper {\n position: fixed;\n top: 0;\n bottom: 0.88rem;\n left: 0;\n right: 0;\n}\n.loading {\n width: 100%;\n text-align: center;\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n height: 0.5rem;\n}\n.loading .desc {\n line-height: 0.2rem;\n font-size: 0.24rem;\n color: #b7b7b7;\n}\n@svg 1px-border {\n height: 0.02rem;\n@rect {\n fill: #eee;\n width: 100%;\n height: 50%;\n}\n}\n.back {\n position: fixed;\n z-index: 200;\n color: #000;\n border-bottom: 0.01rem solid #eee;\n}\n.loading-wrapper {\n height: 0.5rem;\n overflow: hidden;\n -webkit-transition: all 0.2s;\n transition: all 0.2s;\n}\n.content-wrapper {\n overflow: hidden;\n top: 0.44rem;\n bottom: 0.88rem;\n padding: 0 0.2rem;\n}\n.detail-header {\n height: 0.44rem;\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n -webkit-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n width: 100%;\n position: relative;\n top: 0;\n background-color: #fff;\n color: #777;\n padding: 0 0.2rem;\n}\n.detail-header .icon-wrapper {\n width: 100%;\n height: 100%;\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n}\n.list-detail {\n position: fixed;\n top: 0;\n bottom: 0;\n right: 0;\n left: 0;\n background: #fff;\n}\n.list-detail .detail-title {\n font-size: 0.36rem;\n color: #000;\n padding: 0.2rem 0;\n}\n.list-detail .detail-user {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n}\n.list-detail .detail-user .user-avatar {\n width: 0.96rem;\n height: 0.96rem;\n border-radius: 50%;\n margin-right: 0.1rem;\n}\n.list-detail .detail-user .user-info {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-orient: vertical;\n -webkit-box-direction: normal;\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-pack: distribute;\n justify-content: space-around;\n padding: 0.1rem 0;\n}\n.list-detail .detail-user .user-info .user-name {\n color: #000;\n font-size: 0.32rem;\n}\n.list-detail .detail-user .user-info .user-node {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n font-size: 0.24rem;\n color: #b1b1b1;\n}\n.list-detail .detail-content {\n padding: 0.1rem 0;\n font-size: 0.3rem;\n color: #000;\n line-height: 1.5;\n}\n.list-detail .detail-content p {\n margin-bottom: 0.2rem;\n}\n.list-detail .detail-content img {\n max-width: 100%;\n}\n.list-detail .detail-reply {\n padding: 0.2rem 0;\n}\n.list-detail .detail-reply .reply-item {\n position: relative;\n padding: 0.2rem 0;\n color: #000;\n}\n.list-detail .detail-reply .reply-item .reply-content {\n padding: 0.1rem 0 0.1rem 1.06rem;\n font-size: 0.28rem;\n line-height: 1.5;\n}\n.list-detail .detail-reply .reply-item .reply-content img {\n width: 80%;\n}\n.list-detail .detail-reply .reply-item .icon-heart {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n position: absolute;\n top: 0.2rem;\n right: 0;\n color: #f00;\n}\n.list-detail .detail-reply .reply-item .icon-heart .heart-count {\n display: inline-block;\n margin-left: 0.1rem;\n font-size: 0.24rem;\n color: #b1b1b1;\n}\n.slider-enter-active,\n.slider-leave-active {\n -webkit-transition: all 0.3s;\n transition: all 0.3s;\n}\n.slider-enter,\n.slider-leave-to {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n}\n.node-list {\n padding: 0.05rem 0.2rem;\n}\n.node-list .node-name {\n width: 100%;\n height: 1rem;\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n padding: 0.1rem 0.2rem 0;\n background-color: #eee;\n font-size: 0.32rem;\n color: #000;\n}\n.node-list .node-childList {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n padding: 0.2rem;\n color: #b1b1b1;\n font-size: 0.28rem;\n}\n.node-list .node-childList .child-item {\n padding: 0.1rem;\n margin-right: 0.2rem;\n margin-bottom: 0.2rem;\n background-color: #eee;\n border-radius: 0.04rem;\n}\n.node-detail {\n position: absolute;\n overflow: hidden;\n width: 100%;\n top: 0;\n bottom: 0;\n background-color: #fff;\n}\n.node-detail .v-list {\n top: 0.44rem;\n bottom: 0.88rem;\n}\n.node-detail .loading-wrapper {\n overflow: hidden;\n}\n.node-detail .v-header {\n position: relative;\n}\n.node-detail .v-header .icon-wrapper {\n position: absolute;\n top: 50%;\n left: 0.2rem;\n -webkit-transform: translateY(-50%);\n transform: translateY(-50%);\n width: 0.8rem;\n}\n.fade-enter-active,\n.fade-leave-active {\n -webkit-transition: all 0.3s;\n transition: all 0.3s;\n}\n.fade-enter,\n.fade-leave-to {\n opacity: 0;\n}html,\nbody,\ndiv,\nspan,\napplet,\nobject,\niframe,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\np,\nblockquote,\npre,\na,\nabbr,\nacronym,\naddress,\nbig,\ncite,\ncode,\ndel,\ndfn,\nem,\nimg,\nins,\nkbd,\nq,\ns,\nsamp,\nsmall,\nstrike,\nstrong,\nsub,\nsup,\ntt,\nvar,\nb,\nu,\ni,\ncenter,\ndl,\ndt,\ndd,\nol,\nul,\nli,\nfieldset,\nform,\nlabel,\nlegend,\ntable,\ncaption,\ntbody,\ntfoot,\nthead,\ntr,\nth,\ntd,\narticle,\naside,\ncanvas,\ndetails,\nembed,\nfigure,\nfigcaption,\nfooter,\nheader,\nmenu,\nnav,\noutput,\nruby,\nsection,\nsummary,\ntime,\nmark,\naudio,\nvideo,\ninput {\n margin: 0;\n padding: 0;\n border: 0;\n font-size: 100%;\n font-weight: normal;\n vertical-align: baseline;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nmenu,\nnav,\nsection {\n display: block;\n}\nbody {\n line-height: 1;\n}\nblockquote,\nq {\n quotes: none;\n}\nblockquote:before,\nblockquote:after,\nq:before,\nq:after {\n content: none;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\na {\n color: #7e8c8d;\n -webkit-backface-visibility: hidden;\n text-decoration: none;\n}\nli {\n list-style: none;\n}\nbody {\n -webkit-text-size-adjust: none;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\nbody,\nhtml {\n line-height: 1;\n font-family: 'PingFang SC', 'STHeitiSC-Light', 'Helvetica-Light', arial, sans-serif, 'Droid Sans Fallback';\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n -webkit-tap-highlight-color: transparent;\n background: #fff;\n color: #37c6c0;\n}\n*,\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n}\nimg {\n content: normal !important;\n}\n@media (-webkit-min-device-pixel-ratio: 1.5), (min-device-pixel-ratio: 1.5) {\n .border-1px::after {\n -webkit-transform: scaleY(0.7);\n transform: scaleY(0.7);\n }\n}\n@media (-webkit-min-device-pixel-ratio: 2), (min-device-pixel-ratio: 2) {\n .border-1px::after {\n -webkit-transform: scaleY(0.5);\n transform: scaleY(0.5);\n }\n}\n/*# sourceMappingURL=src/common/stylus/index.css.map *//* @svg 1px-border { \n height: 2px; \n @rect { \n fill: var(--color, black); \n width: 100%; \n height: 50%; \n } \n} */\n\n.border-1px { \n border-top: 0.01rem solid #eee; \n /* border-image: svg(1px-border param(--color #eee)) 2 2 stretch; */\n}\n\n.border-1px-b {\n border-bottom: 0.01rem solid #eee; \n /* border-image: svg(1px-border param(--color #eee)) 2 2 stretch; */\n}\n.fa-icon {\n display: inline-block;\n fill: currentColor;\n}\n.fa-flip-horizontal {\n -webkit-transform: scale(-1, 1);\n transform: scale(-1, 1);\n}\n.fa-flip-vertical {\n -webkit-transform: scale(1, -1);\n transform: scale(1, -1);\n}\n.fa-spin {\n -webkit-animation: fa-spin 1s 0s infinite linear;\n animation: fa-spin 1s 0s infinite linear;\n}\n.fa-inverse {\n color: #fff;\n}\n.fa-pulse {\n -webkit-animation: fa-spin 1s infinite steps(8);\n animation: fa-spin 1s infinite steps(8);\n}\n@-webkit-keyframes fa-spin {\n0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n}\n100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n}\n}\n@keyframes fa-spin {\n0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n}\n100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n}\n}\n\n.user-wrapper {\n position: fixed;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n z-index: 9999;\n background-color: #fff;\n}\n.user-wrapper .user-close {\n position: absolute;\n width: 0.4rem;\n height: 0.4rem;\n top: 0.2rem;\n right: 0.2rem;\n color: #42b983;\n}\n.user-wrapper .user-inner {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n width: 100%;\n padding-top: 1.4rem;\n -webkit-box-orient: vertical;\n -webkit-box-direction: normal;\n -ms-flex-direction: column;\n flex-direction: column;\n -webkit-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n}\n.user-wrapper .user-inner .user-avatar {\n border-radius: 50%;\n}\n.user-wrapper .user-inner .user-time {\n margin-top: 0.4rem;\n color: #000;\n font-size: 0.3rem;\n}\n.open-enter-active,\n.open-leave-active {\n -webkit-transition: all 0.3s;\n transition: all 0.3s;\n}\n.open-enter,\n.open-leave-to {\n opacity: 0;\n}"]} -------------------------------------------------------------------------------- /dist/static/js/1.17756f7ae31222eae231.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([1],{gyKk:function(t,e){},zI3V:function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var s=n("Xxa5"),r=n.n(s),a=n("exGp"),i=n.n(a),o=n("Z7ab"),c=n("qqiS"),u=n("gyMJ"),f={data:function(){return{dataList:[],isLoad:!0}},mounted:function(){this.fetchList()},methods:{listDetail:function(t){this.$router.push({path:"/hot/"+t})},refresh:function(){var t=this;return i()(r.a.mark(function e(){return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.fetchList();case 2:t.$refs.listBase.scroll.finishPullDown();case 3:case"end":return e.stop()}},e,t)}))()},fetchList:function(){var t=this;return i()(r.a.mark(function e(){var n;return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(u.a)();case 2:n=e.sent,t.dataList=n,t.$refs.listBase.refresh();case 5:case"end":return e.stop()}},e,t)}))()},debounce:function(t,e){var n=void 0;return function(){for(var s=this,r=arguments.length,a=Array(r),i=0;i\n
\n \n \n \n
\n\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/hot/hot.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{ref:\"now\",staticClass:\"now\"},[_c('list-base',{ref:\"listBase\",attrs:{\"dataList\":_vm.dataList},on:{\"pullDown\":_vm.refresh,\"select\":_vm.listDetail}}),_vm._v(\" \"),_c('router-view')],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-5479c288\",\"hasScoped\":false,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/hot/hot.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-5479c288\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!stylus-loader?{\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./hot.vue\")\n}\nvar normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./hot.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./hot.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-5479c288\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./hot.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/hot/hot.vue\n// module id = null\n// module chunks = "],"sourceRoot":""} -------------------------------------------------------------------------------- /dist/static/js/2.418619809e7e438d6206.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([2],{"2za1":function(e,s){},"7E45":function(e,s,n){"use strict";Object.defineProperty(s,"__esModule",{value:!0});var t=n("Xxa5"),i=n.n(t),a=n("exGp"),c=n.n(a),d=n("Z7ab"),o=n("qqiS"),r=n("gyMJ"),l={data:function(){return{tech:{name:"技术",childrenList:[{programmer:"程序员",name:"programmer",desc:"程序员"},{Python:"Python",name:"Python",desc:"Python"},{iDev:"iDev",name:"iDev",desc:"iDev"},{Android:"Android",name:"Android",desc:"Android"},{Linux:"Linux",name:"Linux",desc:"Linux"},{"node.js":"node.js",name:"nodejs",desc:"node.js"},{cloud:"云计算",name:"cloud",desc:"云计算"},{name:"bb",desc:"宽带症候群"}]},creative:{name:"创意",childrenList:[{desc:"分享创造",name:"create"},{desc:"设计",name:"design"},{desc:"奇思妙想",name:"ideas"}]},play:{name:"好玩",childrenList:[{desc:"分享发现",name:"share"},{desc:"游戏",name:"games"},{desc:"游戏",name:"games"},{desc:"电影",name:"movie"},{desc:"音乐",name:"music"}]},work:{name:"酷工作",childrenList:[{desc:"工作",name:"jobs"},{desc:"求职",name:"cv"},{desc:"职场话题",name:"career"}]},name:"",nodeListShow:!1,dataList:[]}},methods:{back:function(){this.nodeListShow=!1},refresh:function(){var e=this;return c()(i.a.mark(function s(){return i.a.wrap(function(s){for(;;)switch(s.prev=s.next){case 0:return s.next=2,e.fetchNodeDetail(e.name);case 2:e.$refs.listBase.scroll.finishPullDown();case 3:case"end":return s.stop()}},s,e)}))()},go:function(e){this.name=e.name,this.fetchNodeDetail(e.name),this.nodeListShow=!0},fetchNodeDetail:function(e){var s=this;return c()(i.a.mark(function n(){var t;return i.a.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:return s.dataList=[],n.next=3,Object(r.c)({node_name:e});case 3:t=n.sent,s.dataList=t,s.$refs.listBase.refresh();case 6:case"end":return n.stop()}},n,s)}))()},listDetail:function(e){this.$router.push({path:"/nodes/"+e})}},components:{listBase:d.a,loading:o.a}},m={render:function(){var e=this,s=e.$createElement,n=e._self._c||s;return n("div",{staticClass:"node"},[n("div",{staticClass:"node-list"},[n("div",{staticClass:"node-item"},[n("div",{staticClass:"node-name"},[e._v(e._s(e.tech.name))]),e._v(" "),n("ul",{staticClass:"node-childList"},e._l(e.tech.childrenList,function(s,t){return n("li",{key:t,staticClass:"child-item",on:{click:function(n){e.go(s)}}},[e._v("\n "+e._s(s.desc)+"\n ")])}))]),e._v(" "),n("div",{staticClass:"node-item"},[n("div",{staticClass:"node-name"},[e._v(e._s(e.creative.name))]),e._v(" "),n("ul",{staticClass:"node-childList"},e._l(e.creative.childrenList,function(s,t){return n("li",{key:t,staticClass:"child-item",on:{click:function(n){e.go(s)}}},[e._v("\n "+e._s(s.desc)+"\n ")])}))]),e._v(" "),n("div",{staticClass:"node-item"},[n("div",{staticClass:"node-name"},[e._v(e._s(e.play.name))]),e._v(" "),n("ul",{staticClass:"node-childList"},e._l(e.play.childrenList,function(s,t){return n("li",{key:t,staticClass:"child-item",on:{click:function(n){e.go(s)}}},[e._v("\n "+e._s(s.desc)+"\n ")])}))]),e._v(" "),n("div",{staticClass:"node-item"},[n("div",{staticClass:"node-name"},[e._v(e._s(e.work.name))]),e._v(" "),n("ul",{staticClass:"node-childList"},e._l(e.work.childrenList,function(s,t){return n("li",{key:t,staticClass:"child-item",on:{click:function(n){e.go(s)}}},[e._v("\n "+e._s(s.desc)+"\n ")])}))])]),e._v(" "),n("transition",{attrs:{name:"fade"}},[n("div",{directives:[{name:"show",rawName:"v-show",value:e.nodeListShow,expression:"nodeListShow"}],staticClass:"node-detail"},[n("div",{staticClass:"v-header"},[n("div",{staticClass:"icon-wrapper",on:{click:e.back}},[n("icon",{attrs:{name:"angle-left",scale:"1.5"}})],1),e._v("\n v2er\n ")]),e._v(" "),n("list-base",{ref:"listBase",attrs:{dataList:e.dataList},on:{pullDown:e.refresh,select:e.listDetail}}),e._v(" "),n("router-view")],1)])],1)},staticRenderFns:[]};var u=n("VU/8")(l,m,!1,function(e){n("2za1")},null,null);s.default=u.exports}}); 2 | //# sourceMappingURL=2.418619809e7e438d6206.js.map -------------------------------------------------------------------------------- /dist/static/js/2.418619809e7e438d6206.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///src/components/nodes/nodeList.vue","webpack:///./src/components/nodes/nodeList.vue?50a4","webpack:///./src/components/nodes/nodeList.vue"],"names":["nodeList","Python","_this","this","name","finishPullDown","_this2","resp","refresh","id","listBase","list","loading","nodes_nodeList","render","_vm","_h","$createElement","_c","_self","staticClass","_v","_s","tech","_l","item","index","key","on","click","$event","go","desc","creative","play","work","attrs","directives","rawName","value","expression","back","scale","ref","dataList","pullDown","select","listDetail","staticRenderFns","Component","__webpack_require__","normalizeComponent","ssrContext","__webpack_exports__"],"mappings":"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","file":"static/js/2.418619809e7e438d6206.js","sourcesContent":["\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/nodes/nodeList.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"node\"},[_c('div',{staticClass:\"node-list\"},[_c('div',{staticClass:\"node-item\"},[_c('div',{staticClass:\"node-name\"},[_vm._v(_vm._s(_vm.tech.name))]),_vm._v(\" \"),_c('ul',{staticClass:\"node-childList\"},_vm._l((_vm.tech.childrenList),function(item,index){return _c('li',{key:index,staticClass:\"child-item\",on:{\"click\":function($event){_vm.go(item)}}},[_vm._v(\"\\n \"+_vm._s(item.desc)+\"\\n \")])}))]),_vm._v(\" \"),_c('div',{staticClass:\"node-item\"},[_c('div',{staticClass:\"node-name\"},[_vm._v(_vm._s(_vm.creative.name))]),_vm._v(\" \"),_c('ul',{staticClass:\"node-childList\"},_vm._l((_vm.creative.childrenList),function(item,index){return _c('li',{key:index,staticClass:\"child-item\",on:{\"click\":function($event){_vm.go(item)}}},[_vm._v(\"\\n \"+_vm._s(item.desc)+\"\\n \")])}))]),_vm._v(\" \"),_c('div',{staticClass:\"node-item\"},[_c('div',{staticClass:\"node-name\"},[_vm._v(_vm._s(_vm.play.name))]),_vm._v(\" \"),_c('ul',{staticClass:\"node-childList\"},_vm._l((_vm.play.childrenList),function(item,index){return _c('li',{key:index,staticClass:\"child-item\",on:{\"click\":function($event){_vm.go(item)}}},[_vm._v(\"\\n \"+_vm._s(item.desc)+\"\\n \")])}))]),_vm._v(\" \"),_c('div',{staticClass:\"node-item\"},[_c('div',{staticClass:\"node-name\"},[_vm._v(_vm._s(_vm.work.name))]),_vm._v(\" \"),_c('ul',{staticClass:\"node-childList\"},_vm._l((_vm.work.childrenList),function(item,index){return _c('li',{key:index,staticClass:\"child-item\",on:{\"click\":function($event){_vm.go(item)}}},[_vm._v(\"\\n \"+_vm._s(item.desc)+\"\\n \")])}))])]),_vm._v(\" \"),_c('transition',{attrs:{\"name\":\"fade\"}},[_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.nodeListShow),expression:\"nodeListShow\"}],staticClass:\"node-detail\"},[_c('div',{staticClass:\"v-header\"},[_c('div',{staticClass:\"icon-wrapper\",on:{\"click\":_vm.back}},[_c('icon',{attrs:{\"name\":\"angle-left\",\"scale\":\"1.5\"}})],1),_vm._v(\"\\n v2er\\n \")]),_vm._v(\" \"),_c('list-base',{ref:\"listBase\",attrs:{\"dataList\":_vm.dataList},on:{\"pullDown\":_vm.refresh,\"select\":_vm.listDetail}}),_vm._v(\" \"),_c('router-view')],1)])],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-4d9911c0\",\"hasScoped\":false,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/nodes/nodeList.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-4d9911c0\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!stylus-loader?{\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./nodeList.vue\")\n}\nvar normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./nodeList.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./nodeList.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-4d9911c0\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./nodeList.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/nodes/nodeList.vue\n// module id = null\n// module chunks = "],"sourceRoot":""} -------------------------------------------------------------------------------- /dist/static/js/3.811c14d3fc363f56f053.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([3],{UXSY:function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var s=n("Xxa5"),r=n.n(s),a=n("exGp"),i=n.n(a),o=n("Z7ab"),c=n("qqiS"),u=n("gyMJ"),f={data:function(){return{dataList:[],isLoad:!0}},mounted:function(){this.fetchList()},methods:{listDetail:function(t){this.$router.push({path:"/now/"+t})},refresh:function(){var t=this;return i()(r.a.mark(function e(){return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.fetchList();case 2:t.$refs.listBase.scroll.finishPullDown();case 3:case"end":return e.stop()}},e,t)}))()},fetchList:function(){var t=this;return i()(r.a.mark(function e(){var n;return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(u.d)();case 2:n=e.sent,t.dataList=n,t.$refs.listBase.refresh();case 5:case"end":return e.stop()}},e,t)}))()},debounce:function(t,e){var n=void 0;return function(){for(var s=this,r=arguments.length,a=Array(r),i=0;i\n
\n \n \n \n
\n\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/now/now.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{ref:\"now\",staticClass:\"now\"},[_c('list-base',{ref:\"listBase\",attrs:{\"dataList\":_vm.dataList},on:{\"pullDown\":_vm.refresh,\"select\":_vm.listDetail}}),_vm._v(\" \"),_c('router-view')],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-2654814e\",\"hasScoped\":false,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/now/now.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-2654814e\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!stylus-loader?{\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./now.vue\")\n}\nvar normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./now.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./now.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-2654814e\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./now.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/now/now.vue\n// module id = null\n// module chunks = "],"sourceRoot":""} -------------------------------------------------------------------------------- /dist/static/js/4.d12b786ae98a68fdb5f0.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([4],{"3GUi":function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var s=a("woOf"),r=a.n(s),i=a("Xxa5"),n=a.n(i),l=a("exGp"),c=a.n(l),d=a("qqiS"),o=a("bh5B"),v=a("gyMJ"),u={created:function(){this.fetchHeader(),this.fetchReply()},data:function(){return{detail:{},ready:!1,replyReady:!1,replyList:[],page_size:100,page:1}},computed:{timerline:function(){var e=parseInt(this.detail.created+"000",10),t=(Date.now()-e)/1e3;return t<60?Math.round(Math.max(t,1))+"秒前":t>60&&t<36e3?Math.round(t/60)+"分钟前":Math.round(t/60/60)+"小时前"}},methods:{back:function(){this.$router.go(-1)},fetchReply:function(){var e=this;return c()(n.a.mark(function t(){var a;return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return e.replyReady=!0,t.next=3,Object(v.b)({topic_id:e.$route.params.id,page_size:e.page_size,page:e.page});case 3:a=t.sent,e.replyList=a,e.$refs.content.scroll.refresh(),e.replyReady=!1;case 7:case"end":return t.stop()}},t,e)}))()},fetchHeader:function(){var e=this;return c()(n.a.mark(function t(){var a;return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return e.ready=!0,t.next=3,Object(v.c)({id:e.$route.params.id});case 3:a=t.sent,e.detail=r()({},a[0]),e.ready=!1;case 6:case"end":return t.stop()}},t,e)}))()}},filters:{normalizeTime:function(e){var t=parseInt(e+"000",10),a=new Date(t);return a.getFullYear()+"-"+((a.getMonth()+1<10?"0"+(a.getMonth()+1):a.getMonth()+1)+"-")+(a.getDate()<10?"0"+a.getDate():a.getDate())}},components:{loading:d.a,scroller:o.a}},m={render:function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("transition",{attrs:{name:"slider"}},[a("div",{staticClass:"list-detail",on:{click:function(e){e.stopPropagation()},touch:function(e){e.stopPropagation()}}},[a("div",{staticClass:"detail-header border-1px-b"},[a("div",{staticClass:"icon-wrapper",on:{click:e.back}},[a("icon",{attrs:{name:"angle-left",scale:"1.5"}})],1)]),e._v(" "),a("loading",{directives:[{name:"show",rawName:"v-show",value:e.ready,expression:"ready"}]}),e._v(" "),a("scroller",{directives:[{name:"show",rawName:"v-show",value:!e.ready,expression:"!ready"}],ref:"content",staticClass:"content-wrapper"},[a("div",[a("div",{staticClass:"detail-title"},[e._v("\n "+e._s(e.detail.title)+"\n ")]),e._v(" "),a("div",{staticClass:"detail-user"},[a("img",{staticClass:"user-avatar",attrs:{src:e.detail.member?e.detail.member.avatar_normal:""}}),e._v(" "),a("div",{staticClass:"user-info"},[a("div",{staticClass:"user-name"},[e._v(e._s(e.detail.member?e.detail.member.username:""))]),e._v(" "),a("div",{staticClass:"user-node"},[a("div",{staticClass:"node-name"},[e._v(e._s(e.detail.node?e.detail.node.title:""))]),e._v(" "),a("div",{staticClass:"user-divid"},[e._v("|")]),e._v(" "),a("div",{staticClass:"user-created"},[e._v(e._s(e.timerline))])])])]),e._v(" "),a("div",{staticClass:"detail-content border-1px-b",domProps:{innerHTML:e._s(e.detail.content_rendered)}}),e._v(" "),a("div",{staticClass:"detail-reply"},[a("loading",{directives:[{name:"show",rawName:"v-show",value:e.replyReady,expression:"replyReady"}]}),e._v(" "),a("ul",e._l(e.replyList,function(t,s){return a("li",{key:s,staticClass:"reply-item border-1px-b"},[a("div",{staticClass:"detail-user"},[a("img",{directives:[{name:"lazy",rawName:"v-lazy",value:t.member?t.member.avatar_large:"",expression:"item.member ? item.member.avatar_large : ''"}],staticClass:"user-avatar"}),e._v(" "),a("div",{staticClass:"user-info"},[a("div",{staticClass:"user-name"},[e._v(e._s(t.member?t.member.username:""))]),e._v(" "),a("div",{staticClass:"user-node"},[a("div",{staticClass:"node-name"},[e._v("第"+e._s(s+1)+"楼")]),e._v(" "),a("div",{staticClass:"user-divid"},[e._v("|")]),e._v(" "),a("div",{staticClass:"user-created"},[e._v(e._s(e._f("normalizeTime")(t.created)))])])])]),e._v(" "),a("div",{staticClass:"reply-content",domProps:{innerHTML:e._s(t.content_rendered)}}),e._v(" "),a("div",{directives:[{name:"show",rawName:"v-show",value:t.thanks>0,expression:"item.thanks > 0"}],staticClass:"icon-heart"},[a("icon",{attrs:{name:"heart",scale:"0.8"}}),e._v(" "),a("span",{staticClass:"heart-count"},[e._v(e._s(t.thanks))])],1)])}))],1)])])],1)])},staticRenderFns:[]};var p=a("VU/8")(u,m,!1,function(e){a("z9QQ")},null,null);t.default=p.exports},z9QQ:function(e,t){}}); 2 | //# sourceMappingURL=4.d12b786ae98a68fdb5f0.js.map -------------------------------------------------------------------------------- /dist/static/js/4.d12b786ae98a68fdb5f0.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///src/components/listDetail/listDetail.vue","webpack:///./src/components/listDetail/listDetail.vue?25a5","webpack:///./src/components/listDetail/listDetail.vue"],"names":["listDetail","fetchHeader","fetchReply","_this","this","id","page_size","page","resp","refresh","_this2","_time","getDate","loading","scroller","scroll_scroll","listDetail_listDetail","render","_vm","_h","$createElement","_c","_self","attrs","name","staticClass","on","click","$event","stopPropagation","touch","back","scale","_v","directives","rawName","value","expression","ready","ref","_s","detail","title","src","member","avatar_normal","username","node","timerline","domProps","innerHTML","content_rendered","_l","item","index","key","avatar_large","_f","created","thanks","staticRenderFns","Component","__webpack_require__","normalizeComponent","ssrContext","__webpack_exports__"],"mappings":"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","file":"static/js/4.d12b786ae98a68fdb5f0.js","sourcesContent":["\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/listDetail/listDetail.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('transition',{attrs:{\"name\":\"slider\"}},[_c('div',{staticClass:\"list-detail\",on:{\"click\":function($event){$event.stopPropagation();},\"touch\":function($event){$event.stopPropagation();}}},[_c('div',{staticClass:\"detail-header border-1px-b\"},[_c('div',{staticClass:\"icon-wrapper\",on:{\"click\":_vm.back}},[_c('icon',{attrs:{\"name\":\"angle-left\",\"scale\":\"1.5\"}})],1)]),_vm._v(\" \"),_c('loading',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.ready),expression:\"ready\"}]}),_vm._v(\" \"),_c('scroller',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.ready),expression:\"!ready\"}],ref:\"content\",staticClass:\"content-wrapper\"},[_c('div',[_c('div',{staticClass:\"detail-title\"},[_vm._v(\"\\n \"+_vm._s(_vm.detail.title)+\"\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"detail-user\"},[_c('img',{staticClass:\"user-avatar\",attrs:{\"src\":_vm.detail.member ? _vm.detail.member.avatar_normal : ''}}),_vm._v(\" \"),_c('div',{staticClass:\"user-info\"},[_c('div',{staticClass:\"user-name\"},[_vm._v(_vm._s(_vm.detail.member ? _vm.detail.member.username : ''))]),_vm._v(\" \"),_c('div',{staticClass:\"user-node\"},[_c('div',{staticClass:\"node-name\"},[_vm._v(_vm._s(_vm.detail.node ? _vm.detail.node.title : ''))]),_vm._v(\" \"),_c('div',{staticClass:\"user-divid\"},[_vm._v(\"|\")]),_vm._v(\" \"),_c('div',{staticClass:\"user-created\"},[_vm._v(_vm._s(_vm.timerline))])])])]),_vm._v(\" \"),_c('div',{staticClass:\"detail-content border-1px-b\",domProps:{\"innerHTML\":_vm._s(_vm.detail.content_rendered)}}),_vm._v(\" \"),_c('div',{staticClass:\"detail-reply\"},[_c('loading',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.replyReady),expression:\"replyReady\"}]}),_vm._v(\" \"),_c('ul',_vm._l((_vm.replyList),function(item,index){return _c('li',{key:index,staticClass:\"reply-item border-1px-b\"},[_c('div',{staticClass:\"detail-user\"},[_c('img',{directives:[{name:\"lazy\",rawName:\"v-lazy\",value:(item.member ? item.member.avatar_large : ''),expression:\"item.member ? item.member.avatar_large : ''\"}],staticClass:\"user-avatar\"}),_vm._v(\" \"),_c('div',{staticClass:\"user-info\"},[_c('div',{staticClass:\"user-name\"},[_vm._v(_vm._s(item.member ? item.member.username : ''))]),_vm._v(\" \"),_c('div',{staticClass:\"user-node\"},[_c('div',{staticClass:\"node-name\"},[_vm._v(\"第\"+_vm._s(index+1)+\"楼\")]),_vm._v(\" \"),_c('div',{staticClass:\"user-divid\"},[_vm._v(\"|\")]),_vm._v(\" \"),_c('div',{staticClass:\"user-created\"},[_vm._v(_vm._s(_vm._f(\"normalizeTime\")(item.created)))])])])]),_vm._v(\" \"),_c('div',{staticClass:\"reply-content\",domProps:{\"innerHTML\":_vm._s(item.content_rendered)}}),_vm._v(\" \"),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(item.thanks > 0),expression:\"item.thanks > 0\"}],staticClass:\"icon-heart\"},[_c('icon',{attrs:{\"name\":\"heart\",\"scale\":\"0.8\"}}),_vm._v(\" \"),_c('span',{staticClass:\"heart-count\"},[_vm._v(_vm._s(item.thanks))])],1)])}))],1)])])],1)])}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-1abd3ba8\",\"hasScoped\":false,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/listDetail/listDetail.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-1abd3ba8\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!stylus-loader?{\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./listDetail.vue\")\n}\nvar normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./listDetail.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./listDetail.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-1abd3ba8\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./listDetail.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/listDetail/listDetail.vue\n// module id = null\n// module chunks = "],"sourceRoot":""} -------------------------------------------------------------------------------- /dist/static/js/app.dc8137b45381d871d00a.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([6],{"0HFF":function(t,n){},"34KM":function(t,n){},"5AqT":function(t,n){},"7Otq":function(t,n){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OTk2QkI4RkE3NjE2MTFFNUE4NEU4RkIxNjQ5MTYyRDgiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OTk2QkI4Rjk3NjE2MTFFNUE4NEU4RkIxNjQ5MTYyRDgiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NjU2QTEyNzk3NjkyMTFFMzkxODk4RDkwQkY4Q0U0NzYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NjU2QTEyN0E3NjkyMTFFMzkxODk4RDkwQkY4Q0U0NzYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5WHowqAAAXNElEQVR42uxda4xd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"},Cvds:function(t,n){},D4uH:function(t,n,e){"use strict";var i={},r={name:"icon",props:{name:{type:String,validator:function(t){return t?t in i||(console.warn('Invalid prop: prop "name" is referring to an unregistered icon "'+t+'".\nPlease make sure you have imported this icon before using it.'),!1):(console.warn('Invalid prop: prop "name" is required.'),!1)}},scale:[Number,String],spin:Boolean,inverse:Boolean,pulse:Boolean,flip:{validator:function(t){return"horizontal"===t||"vertical"===t}},label:String},data:function(){return{x:!1,y:!1,childrenWidth:0,childrenHeight:0,outerScale:1}},computed:{normalizedScale:function(){var t=this.scale;return t=void 0===t?1:Number(t),isNaN(t)||t<=0?(console.warn('Invalid prop: prop "scale" should be a number over 0.',this),this.outerScale):t*this.outerScale},klass:function(){return{"fa-icon":!0,"fa-spin":this.spin,"fa-flip-horizontal":"horizontal"===this.flip,"fa-flip-vertical":"vertical"===this.flip,"fa-inverse":this.inverse,"fa-pulse":this.pulse}},icon:function(){return this.name?i[this.name]:null},box:function(){return this.icon?"0 0 "+this.icon.width+" "+this.icon.height:"0 0 "+this.width+" "+this.height},ratio:function(){if(!this.icon)return 1;var t=this.icon,n=t.width,e=t.height;return Math.max(n,e)/16},width:function(){return this.childrenWidth||this.icon&&this.icon.width/this.ratio*this.normalizedScale||0},height:function(){return this.childrenHeight||this.icon&&this.icon.height/this.ratio*this.normalizedScale||0},style:function(){return 1!==this.normalizedScale&&{fontSize:this.normalizedScale+"em"}},raw:function(){if(!this.icon||!this.icon.raw)return null;var t=this.icon.raw,n={};return t=t.replace(/\s(?:xml:)?id=(["']?)([^"')\s]+)\1/g,function(t,e,i){var r="fa-"+(a++).toString(16);return n[i]=r,' id="'+r+'"'}),t=t.replace(/#(?:([^'")\s]+)|xpointer\(id\((['"]?)([^')]+)\2\)\))/g,function(t,e,i,r){var a=e||r;return a&&n[a]?"#"+n[a]:t}),t}},mounted:function(){var t=this;if(!this.icon){this.$children.forEach(function(n){n.outerScale=t.normalizedScale});var n=0,e=0;this.$children.forEach(function(t){n=Math.max(n,t.width),e=Math.max(e,t.height)}),this.childrenWidth=n,this.childrenHeight=e,this.$children.forEach(function(t){t.x=(n-t.width)/2,t.y=(e-t.height)/2})}},register:function(t){for(var n in t){var e=t[n];e.paths||(e.paths=[]),e.d&&e.paths.push({d:e.d}),e.polygons||(e.polygons=[]),e.points&&e.polygons.push({points:e.points}),i[n]=e}},icons:i},a=870711;var o={render:function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("svg",{class:t.klass,style:t.style,attrs:{version:"1.1",role:t.label?"img":"presentation","aria-label":t.label,x:t.x,y:t.y,width:t.width,height:t.height,viewBox:t.box}},[t._t("default",[t.icon&&t.icon.paths?t._l(t.icon.paths,function(n,i){return e("path",t._b({key:"path-"+i},"path",n,!1))}):t._e(),t._v(" "),t.icon&&t.icon.polygons?t._l(t.icon.polygons,function(n,i){return e("polygon",t._b({key:"polygon-"+i},"polygon",n,!1))}):t._e(),t._v(" "),t.icon&&t.icon.raw?[e("g",{domProps:{innerHTML:t._s(t.raw)}})]:t._e()])],2)},staticRenderFns:[]};var s=e("VU/8")(r,o,!1,function(t){e("5AqT")},null,null);n.a=s.exports},NHnr:function(t,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var i=e("7+uW"),r={render:function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("div",{staticClass:"footer border-1px"},[e("div",{staticClass:"example"}),t._v(" "),e("router-link",{staticClass:"footer-item",attrs:{to:"/hot",tag:"div"}},[e("icon",{attrs:{name:"fire",scale:"1.5"}}),t._v(" "),e("span",[t._v("最热")])],1),t._v(" "),e("router-link",{staticClass:"footer-item",attrs:{to:"/now",tag:"div"}},[e("icon",{attrs:{name:"clock-o",scale:"1.5"}}),t._v(" "),e("span",[t._v("最新")])],1),t._v(" "),e("router-link",{staticClass:"footer-item",attrs:{to:"/nodes",tag:"div"}},[e("icon",{attrs:{name:"location-arrow",scale:"1.5"}}),t._v(" "),e("span",[t._v("节点")])],1)],1)},staticRenderFns:[]};var a={name:"App",components:{"v-footer":e("VU/8")({data:function(){return{icons:["fire","clock-o","location-arrow"]}}},r,!1,function(t){e("fFT8")},null,null).exports}},o={render:function(){var t=this.$createElement,n=this._self._c||t;return n("div",{staticClass:"main"},[n("keep-alive",[n("router-view")],1),this._v(" "),n("v-footer")],1)},staticRenderFns:[]};var s=e("VU/8")(a,o,!1,function(t){e("0HFF")},null,null).exports,c=e("/ocq"),l=function(){return Promise.all([e.e(0),e.e(4)]).then(e.bind(null,"3GUi"))};i.a.use(c.a);var u=new c.a({mode:"history",routes:[{path:"/",redirect:"/now"},{path:"/now",name:"最新",component:function(){return Promise.all([e.e(0),e.e(3)]).then(e.bind(null,"UXSY"))},children:[{path:":id",component:l}]},{path:"/hot",name:"最热",component:function(){return Promise.all([e.e(0),e.e(1)]).then(e.bind(null,"zI3V"))},children:[{path:":id",component:l}]},{path:"/nodes",name:"节点",component:function(){return Promise.all([e.e(0),e.e(2)]).then(e.bind(null,"7E45"))},children:[{path:":id",component:l}]}]}),h=e("cTzj"),d=e.n(h),f=(e("34KM"),e("Cvds"),e("D/PP"),e("D4uH")),m=e("v5o6"),p=e.n(m),v=e("Xxa5"),g=e.n(v),I=e("exGp"),w=e.n(I),y=e("gyMJ"),C={name:"userDetail",data:function(){return{avatar:"",name:"",show:!1,closed:!1,onClose:null,url:"",createTime:"",ready:!1}},created:function(){this.fetchUserInfo()},watch:{closed:{deep:!0,handler:function(t){t&&(this.show=!1,this.$el.addEventListener("transitionend",this.destroyElement))}}},methods:{close:function(){this.closed=!0,"function"==typeof this.onClose&&this.onClose(this)},destroyElement:function(){this.$el.removeEventListener("transitionend",this.destroyElement),this.$destroy(!0),this.$el.parentNode.removeChild(this.$el)},fetchUserInfo:function(){var t=this;return w()(g.a.mark(function n(){var e;return g.a.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:return t.ready=!1,n.next=3,Object(y.e)({username:t.name});case 3:e=n.sent,t.avatar=e.avatar_large,t.createTime=e.created,t.url=e.url,t.ready=!0;case 8:case"end":return n.stop()}},n,t)}))()}},filters:{normalizeTime:function(t){var n=parseInt(t+"000",10),e=new Date(n);return e.getFullYear()+"-"+((e.getMonth()+1<10?"0"+(e.getMonth()+1):e.getMonth()+1)+"-")+(e.getDate()<10?"0"+e.getDate():e.getDate())}}},b={render:function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("transition",{attrs:{name:"open"}},[e("div",{directives:[{name:"show",rawName:"v-show",value:t.show,expression:"show"}],staticClass:"user-wrapper"},[e("div",{staticClass:"user-close",on:{click:t.close}},[e("icon",{attrs:{name:"times",scale:"1.5"}})],1),t._v(" "),e("div",{directives:[{name:"show",rawName:"v-show",value:t.ready,expression:"ready"}],staticClass:"user-inner"},[e("img",{staticClass:"user-avatar",attrs:{src:t.avatar}}),t._v(" "),e("div",{staticClass:"user-time"},[t._v(t._s(t.name))]),t._v(" "),e("div",{staticClass:"user-time"},[t._v("加入时间:"+t._s(t._f("normalizeTime")(t.createTime)))]),t._v(" "),e("div",{staticClass:"user-time"},[t._v("url: "+t._s(t.url))]),t._v(" "),e("ul",{staticClass:"user-info"},[e("li",{staticClass:"info-tei"},[e("span",{staticClass:"info-name"}),t._v(" "),e("span",{staticClass:"info-desc"})])])])])])},staticRenderFns:[]};var k=e("VU/8")(C,b,!1,function(t){e("oir+")},null,null).exports,R=i.a.extend(k),E=void 0,z=[],W=1;function N(t){"string"==typeof(t=t||{})&&(t={name:t});var n="user_"+W++;(E=new R({data:t})).id=n,E.vm=E.$mount(),document.body.appendChild(E.vm.$el),E.vm.show=!0,z.push(E)}var U=function(t){t.prototype.$user=N};e("cI2h");i.a.component("icon",f.a),p.a.attach(document.body),i.a.use(U),i.a.use(d.a,{loading:e("7Otq")}),i.a.config.productionTip=!1,new i.a({el:"#app",router:u,components:{App:s},render:function(t){return t(s)}})},cI2h:function(t,n){!function(t,n){function e(){var i=t.innerWidth;i>t.screen.width?t.requestAnimationFrame(e):(i>720&&(i=720),n.documentElement.style.fontSize=1e4/750+"vw",n.body.style.opacity=1)}"loading"!==n.readyState?e():n.addEventListener("DOMContentLoaded",e),t.addEventListener("resize",e)}(window,document)},fFT8:function(t,n){},gyMJ:function(t,n,e){"use strict";var i=e("//Fk"),r=e.n(i),a=e("woOf"),o=e.n(a),s=e("mtWM"),c=e.n(s),l=(e("mw3O"),c.a.create({baseURL:"/api",timeout:18e4})),u=function(t,n,e){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a=o()({},i,{url:n,method:t,data:e});return a.headers=a.headers||{},new r.a(function(t,n){l.request(a).then(function(n){var e=n.data;200===n.status&&t(e),t(e)}).catch(function(t){n(t)})})},h=function(t,n){return u("get",t,null,n)};e.d(n,"a",function(){return d}),e.d(n,"d",function(){return f}),e.d(n,"e",function(){return m}),e.d(n,"c",function(){return p}),e.d(n,"b",function(){return v});var d=function(){return h("/topics/hot.json")},f=function(){return h("/topics/latest.json")},m=function(t){return h("/members/show.json",{params:t})},p=function(t){return h("/topics/show.json",{params:t})},v=function(t){return h("/replies/show.json",{params:t})}},"oir+":function(t,n){}},["NHnr"]); 2 | //# sourceMappingURL=app.dc8137b45381d871d00a.js.map -------------------------------------------------------------------------------- /dist/static/js/manifest.4276fa394328a9f55052.js: -------------------------------------------------------------------------------- 1 | !function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,a,c){for(var i,u,f,s=0,l=[];s 2 | 3 | 4 | 5 | 7 | v2ex-vue 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /index.template.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 666 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "experimentalDecorators": true 4 | } 5 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "v2ex-vue", 3 | "version": "1.0.0", 4 | "description": "A Vue.js project", 5 | "author": "zouhang <1102639563@qq.com>", 6 | "private": true, 7 | "scripts": { 8 | "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", 9 | "start": "node server.js", 10 | "lint": "eslint --ext .js,.vue src --fix", 11 | "build": "node build/build.js" 12 | }, 13 | "dependencies": { 14 | "axios": "^0.18.0", 15 | "better-scroll": "^1.12.4", 16 | "connect-history-api-fallback": "^1.5.0", 17 | "cssnano": "^3.10.0", 18 | "express": "^4.16.2", 19 | "fastclick": "^1.0.6", 20 | "mand-mobile": "^1.3.3", 21 | "postcss-aspect-ratio-mini": "0.0.2", 22 | "postcss-cssnext": "^3.1.0", 23 | "postcss-px-to-viewport": "0.0.3", 24 | "postcss-viewport-units": "^0.1.3", 25 | "postcss-write-svg": "^3.0.1", 26 | "vue": "^2.5.16", 27 | "vue-awesome": "^2.3.5", 28 | "vue-lazyload": "^1.2.1", 29 | "vue-router": "^3.0.1", 30 | "vue-server-renderer": "^2.5.16" 31 | }, 32 | "devDependencies": { 33 | "autoprefixer": "^7.1.2", 34 | "babel-core": "^6.22.1", 35 | "babel-eslint": "^8.2.1", 36 | "babel-helper-vue-jsx-merge-props": "^2.0.3", 37 | "babel-loader": "^7.1.1", 38 | "babel-plugin-syntax-jsx": "^6.18.0", 39 | "babel-plugin-transform-runtime": "^6.22.0", 40 | "babel-plugin-transform-vue-jsx": "^3.5.0", 41 | "babel-preset-env": "^1.3.2", 42 | "babel-preset-stage-2": "^6.22.0", 43 | "chalk": "^2.0.1", 44 | "copy-webpack-plugin": "^4.0.1", 45 | "css-loader": "^0.28.0", 46 | "eslint": "^4.15.0", 47 | "eslint-config-standard": "^10.2.1", 48 | "eslint-config-vue": "^2.0.2", 49 | "eslint-friendly-formatter": "^3.0.0", 50 | "eslint-loader": "^1.7.1", 51 | "eslint-plugin-html": "^4.0.2", 52 | "eslint-plugin-import": "^2.7.0", 53 | "eslint-plugin-node": "^5.2.0", 54 | "eslint-plugin-promise": "^3.4.0", 55 | "eslint-plugin-standard": "^3.0.1", 56 | "eslint-plugin-vue": "^4.0.0", 57 | "extract-text-webpack-plugin": "^3.0.0", 58 | "file-loader": "^1.1.4", 59 | "friendly-errors-webpack-plugin": "^1.6.1", 60 | "html-webpack-plugin": "^2.30.1", 61 | "node-notifier": "^5.1.2", 62 | "optimize-css-assets-webpack-plugin": "^3.2.0", 63 | "ora": "^1.2.0", 64 | "portfinder": "^1.0.13", 65 | "postcss-import": "^11.0.0", 66 | "postcss-loader": "^2.0.8", 67 | "postcss-pxtorem": "^4.0.1", 68 | "postcss-url": "^7.2.1", 69 | "prerender-spa-plugin": "^3.1.0", 70 | "rimraf": "^2.6.0", 71 | "semver": "^5.3.0", 72 | "shelljs": "^0.7.6", 73 | "stylus": "^0.54.5", 74 | "stylus-loader": "^3.0.2", 75 | "uglifyjs-webpack-plugin": "^1.1.1", 76 | "url-loader": "^0.5.8", 77 | "vue-loader": "^13.3.0", 78 | "vue-style-loader": "^3.0.1", 79 | "vue-template-compiler": "^2.5.16", 80 | "webpack": "^3.6.0", 81 | "webpack-bundle-analyzer": "^2.9.0", 82 | "webpack-dev-server": "^2.9.1", 83 | "webpack-merge": "^4.1.0" 84 | }, 85 | "engines": { 86 | "node": ">= 6.0.0", 87 | "npm": ">= 3.0.0" 88 | }, 89 | "browserslist": [ 90 | "> 1%", 91 | "last 2 versions", 92 | "not ie <= 8" 93 | ] 94 | } 95 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const path = require('path') 3 | const axios = require('axios') 4 | const app = express() 5 | const history = require('connect-history-api-fallback') 6 | // 引入第三方路由 7 | const proxyConf = require('./config/proxy') 8 | const headerConf = { 9 | // referer: 'https://www.v2ex.com', 10 | // host: 'www.v2ex.com' 11 | } 12 | 13 | let apiRoutes = express.Router() 14 | 15 | for (let k in proxyConf) { 16 | app.get(k, function(req, res) { 17 | // console.log(proxyConf[k]) 18 | axios.get(proxyConf[k], { 19 | headers: headerConf, 20 | params: req.query 21 | }).then(response => { 22 | res.setHeader('Access-Control-Allow-Origin', '*') 23 | res.json(response.data) 24 | }).catch(e => { 25 | console.log(e) 26 | }) 27 | }) 28 | } 29 | app.use(history()) 30 | app.use('/', apiRoutes) 31 | app.use(express.static(path.join(__dirname, 'dist'))) 32 | 33 | const port = process.env.PORT || 5000 34 | app.listen(port) 35 | console.log('server started ' + port) 36 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 19 | 20 | 32 | -------------------------------------------------------------------------------- /src/api/ajax.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | import qs from 'qs' 3 | 4 | const service = axios.create({ 5 | baseURL: process.env.MOCK_URL, 6 | timeout: 180000 7 | }) 8 | 9 | /** 10 | * 通用request封装 11 | * @param method 12 | * @param url 13 | * @param data 14 | * @param config 15 | * @returns {Promise} 16 | */ 17 | const request = (method, url, data, config = {}) => { 18 | const options = Object.assign({}, config, { 19 | url, 20 | method, 21 | data 22 | }) 23 | options.headers = options.headers || {} 24 | return new Promise((resolve, reject) => { 25 | service.request(options) 26 | .then(res => { 27 | const data = res.data 28 | const status = res.status 29 | if (status === 200) { 30 | resolve(data) 31 | } 32 | // if (data.HasError) { 33 | // reject(data) 34 | // } 35 | resolve(data) 36 | }).catch(res => { 37 | reject(res) 38 | }) 39 | }) 40 | } 41 | 42 | export const ajax = { 43 | get(url, config) { 44 | return request('get', url, null, config) 45 | }, 46 | delete(url, data, config) { 47 | return request('delete', url, data, config) 48 | }, 49 | head(url, config) { 50 | return request('head', url, null, config) 51 | }, 52 | post(url, data, config = {}) { 53 | if (!config.headers) { 54 | config.headers = { 55 | 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' 56 | } 57 | } 58 | return request('post', url, qs.stringify(data), config) 59 | }, 60 | put(url, data, config = {}) { 61 | config.headers = { 62 | 'Content-Type': 'application/json; charset=UTF-8' 63 | } 64 | return request('put', url, data, config) 65 | }, 66 | patch(url, data, config) { 67 | return request('path', url, qs.stringify(data), config) 68 | }, 69 | setCommonHeader(key, value) { 70 | service.defaults.headers.common[key] = value 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/api/index.js: -------------------------------------------------------------------------------- 1 | import { ajax } from './ajax' 2 | 3 | //最热主题 4 | export const getHotList = () => ajax.get('/topics/hot.json') 5 | 6 | //最新主题 7 | export const getNowList = () => ajax.get('/topics/latest.json') 8 | 9 | //节点信息 10 | export const getNodesList = ops => ajax.get(`/nodes/show.json?name=${ops}`) 11 | 12 | //用户主页 13 | export const getUserInfo = ops => ajax.get('/members/show.json', { params: ops }) 14 | 15 | //帖子内容 16 | export const getListHeader = ops => ajax.get('/topics/show.json', { params: ops }) 17 | 18 | //帖子回复详情 19 | export const getListDetail = ops => ajax.get('/replies/show.json', { params: ops }) 20 | -------------------------------------------------------------------------------- /src/assets/chat.svg: -------------------------------------------------------------------------------- 1 | 2 | Svg Vector Icons : http://www.sfont.cn 3 | 4 | -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouhangwithsweet/v2ex-vue/56128fef943f77c3da6dbde88ee2f37bff3b9488/src/assets/logo.png -------------------------------------------------------------------------------- /src/common/css/border.css: -------------------------------------------------------------------------------- 1 | /* @svg 1px-border { 2 | height: 2px; 3 | @rect { 4 | fill: var(--color, black); 5 | width: 100%; 6 | height: 50%; 7 | } 8 | } */ 9 | 10 | .border-1px { 11 | border-top: 1px solid #eee; 12 | /* border-image: svg(1px-border param(--color #eee)) 2 2 stretch; */ 13 | } 14 | 15 | .border-1px-b { 16 | border-bottom: 1px solid #eee; 17 | /* border-image: svg(1px-border param(--color #eee)) 2 2 stretch; */ 18 | } -------------------------------------------------------------------------------- /src/common/stylus/base.styl: -------------------------------------------------------------------------------- 1 | @import "variable.styl" 2 | 3 | body, html 4 | line-height: 1 5 | font-family: 'PingFang SC', 'STHeitiSC-Light', 'Helvetica-Light', arial, sans-serif, 'Droid Sans Fallback' 6 | user-select: none 7 | -webkit-tap-highlight-color: transparent 8 | background: $color-background 9 | color: $color-text 10 | *, *:before, *:after 11 | box-sizing border-box 12 | img 13 | content: normal !important 14 | 15 | @media (-webkit-min-device-pixel-ratio: 1.5),(min-device-pixel-ratio: 1.5) 16 | .border-1px 17 | &::after 18 | -webkit-transform: scaleY(0.7) 19 | transform: scaleY(0.7) 20 | 21 | @media (-webkit-min-device-pixel-ratio: 2),(min-device-pixel-ratio: 2) 22 | .border-1px 23 | &::after 24 | -webkit-transform: scaleY(0.5) 25 | transform: scaleY(0.5) -------------------------------------------------------------------------------- /src/common/stylus/index.styl: -------------------------------------------------------------------------------- 1 | @import "./reset.styl" 2 | @import "./base.styl" -------------------------------------------------------------------------------- /src/common/stylus/mixin.styl: -------------------------------------------------------------------------------- 1 | // 背景图片 2 | bg-image($url) 3 | background-image: url($url + "@2x.png") 4 | @media (-webkit-min-device-pixel-ratio: 3),(min-device-pixel-ratio: 3) 5 | background-image: url($url + "@3x.png") 6 | 7 | // 不换行 8 | no-wrap() 9 | text-overflow: ellipsis 10 | overflow: hidden 11 | white-space: nowrap 12 | 13 | // 扩展点击区域 14 | extend-click() 15 | position: relative 16 | &:before 17 | content: '' 18 | position: absolute 19 | top: -10px 20 | left: -10px 21 | right: -10px 22 | bottom: -10px -------------------------------------------------------------------------------- /src/common/stylus/reset.styl: -------------------------------------------------------------------------------- 1 | /** 2 | * Eric Meyer's Reset CSS v2.0 (http://meyerweb.com/eric/tools/css/reset/) 3 | * http://cssreset.com 4 | */ 5 | html, body, div, span, applet, object, iframe, 6 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 7 | a, abbr, acronym, address, big, cite, code, 8 | del, dfn, em, img, ins, kbd, q, s, samp, 9 | small, strike, strong, sub, sup, tt, var, 10 | b, u, i, center, 11 | dl, dt, dd, ol, ul, li, 12 | fieldset, form, label, legend, 13 | table, caption, tbody, tfoot, thead, tr, th, td, 14 | article, aside, canvas, details, embed, 15 | figure, figcaption, footer, header, 16 | menu, nav, output, ruby, section, summary, 17 | time, mark, audio, video, input 18 | margin: 0 19 | padding: 0 20 | border: 0 21 | font-size: 100% 22 | font-weight: normal 23 | vertical-align: baseline 24 | 25 | /* HTML5 display-role reset for older browsers */ 26 | article, aside, details, figcaption, figure, 27 | footer, header, menu, nav, section 28 | display: block 29 | 30 | body 31 | line-height: 1 32 | 33 | blockquote, q 34 | quotes: none 35 | 36 | blockquote:before, blockquote:after, 37 | q:before, q:after 38 | content: none 39 | 40 | table 41 | border-collapse: collapse 42 | border-spacing: 0 43 | 44 | /* custom */ 45 | 46 | a 47 | color: #7e8c8d 48 | -webkit-backface-visibility: hidden 49 | text-decoration: none 50 | 51 | li 52 | list-style: none 53 | 54 | body 55 | -webkit-text-size-adjust: none 56 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0) 57 | -------------------------------------------------------------------------------- /src/common/stylus/variable.styl: -------------------------------------------------------------------------------- 1 | // 颜色定义规范 2 | $color-background = #ffffff 3 | $color-background-d = rgba(1, 25, 53, 0.3) 4 | $color-highlight-background = rgb(3, 82, 90) 5 | $color-dialog-background = #376956 6 | $color-theme = #1db0b8 7 | $color-theme-d = rgba(55, 198, 192, 0.8) 8 | $color-sub-theme = #d93f30 9 | $color-text = #37c6c0 10 | $color-text-d = rgba(255, 255, 255, 0.3) 11 | $color-text-l = rgba(255, 255, 255, 0.5) 12 | $color-text-ll = rgba(255, 255, 255, 0.8) 13 | $color-active = #42b983 14 | 15 | //字体定义规范 16 | $font-size-small-s = 10px 17 | $font-size-small = 12px 18 | $font-size-medium = 14px 19 | $font-size-medium-x = 16px 20 | $font-size-large = 18px 21 | $font-size-large-x = 22px -------------------------------------------------------------------------------- /src/components/HelloWorld.vue: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouhangwithsweet/v2ex-vue/56128fef943f77c3da6dbde88ee2f37bff3b9488/src/components/HelloWorld.vue -------------------------------------------------------------------------------- /src/components/footer/footer.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 32 | 33 | 57 | -------------------------------------------------------------------------------- /src/components/hot/hot.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 57 | 58 | 77 | -------------------------------------------------------------------------------- /src/components/list/list.vue: -------------------------------------------------------------------------------- 1 | 27 | 28 | 82 | 83 | 149 | -------------------------------------------------------------------------------- /src/components/listDetail/listDetail.vue: -------------------------------------------------------------------------------- 1 | 57 | 58 | 130 | 131 | 226 | -------------------------------------------------------------------------------- /src/components/loading/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouhangwithsweet/v2ex-vue/56128fef943f77c3da6dbde88ee2f37bff3b9488/src/components/loading/loading.gif -------------------------------------------------------------------------------- /src/components/loading/loading.vue: -------------------------------------------------------------------------------- 1 | 7 | 17 | 31 | -------------------------------------------------------------------------------- /src/components/nodes/nodeList.vue: -------------------------------------------------------------------------------- 1 | 52 | 53 | 194 | 195 | 244 | -------------------------------------------------------------------------------- /src/components/now/now.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 58 | 59 | 65 | -------------------------------------------------------------------------------- /src/components/scroll/scroll.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 150 | 151 | 160 | -------------------------------------------------------------------------------- /src/components/userDetail/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import user from './userDetail.vue' 3 | 4 | let UserDetailConstructor = Vue.extend(user) 5 | 6 | let instance 7 | let instances = [] 8 | let seed = 1 9 | 10 | function UserDetail(options) { 11 | options = options || {} 12 | if (typeof options === 'string') { 13 | options = { 14 | name: options 15 | } 16 | } 17 | let id = 'user_' + seed++ 18 | instance = new UserDetailConstructor({ 19 | data: options 20 | }) 21 | instance.id = id 22 | instance.vm = instance.$mount() 23 | document.body.appendChild(instance.vm.$el) 24 | instance.vm.show = true 25 | instances.push(instance) 26 | } 27 | const install = Vue => { 28 | Vue.prototype.$user = UserDetail 29 | } 30 | 31 | export default install 32 | -------------------------------------------------------------------------------- /src/components/userDetail/userDetail.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 88 | 89 | 123 | 124 | -------------------------------------------------------------------------------- /src/entry-client.js: -------------------------------------------------------------------------------- 1 | import { createApp } from './app' 2 | 3 | // 客户端特定引导逻辑…… 4 | 5 | const { app } = createApp() 6 | 7 | // 这里假定 App.vue 模板中根元素具有 `id="app"` 8 | app.$mount('#app') 9 | -------------------------------------------------------------------------------- /src/entry-server.js: -------------------------------------------------------------------------------- 1 | import { createApp } from './app' 2 | 3 | export default context => { 4 | const { app, router } = createApp() 5 | router.push(context.url) 6 | router.onReady(() => { 7 | const matchedComponents = router.getMatchedComponents() 8 | // 匹配不到的路由,执行 reject 函数,并返回 404 9 | if (!matchedComponents.length) { 10 | return reject({ code: 404 }) 11 | } 12 | // Promise 应该 resolve 应用程序实例,以便它可以渲染 13 | resolve(app) 14 | }, reject) 15 | } 16 | -------------------------------------------------------------------------------- /src/main.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 App from './App.vue' 5 | import router from './router/index.js' 6 | import lazyload from 'vue-lazyload' 7 | // import mandMobile from 'mand-mobile' 8 | // Vue.use(mandMobile) 9 | 10 | // 引入css 11 | import './common/stylus/index.styl' 12 | import './common/css/border.css' 13 | // 引入Icon图库 14 | import 'vue-awesome/icons' 15 | import Icon from 'vue-awesome/components/Icon' 16 | Vue.component('icon', Icon) 17 | 18 | import fastclick from 'fastclick' 19 | fastclick.attach(document.body) 20 | 21 | import UserDetail from './components/userDetail/index' 22 | Vue.use(UserDetail) 23 | 24 | // response 25 | import './responsive.js' 26 | 27 | 28 | // 懒加载图片 29 | Vue.use(lazyload, { 30 | loading: require('@/assets/logo.png') 31 | }) 32 | Vue.config.productionTip = false 33 | 34 | /* eslint-disable no-new */ 35 | new Vue({ 36 | el: '#app', 37 | router, 38 | components: { App }, 39 | render: h => h(App) 40 | }) 41 | -------------------------------------------------------------------------------- /src/responsive.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | (function (window, document) { 3 | function resize () { 4 | var ww = window.innerWidth 5 | if (ww > window.screen.width) { 6 | window.requestAnimationFrame(resize) 7 | } else { 8 | if (ww > 720) { 9 | ww = 720 10 | } 11 | document.documentElement.style.fontSize = 100 * 100 / 750 + 'vw' 12 | document.body.style.opacity = 1 13 | } 14 | } 15 | 16 | if (document.readyState !== 'loading') { 17 | resize() 18 | } else { 19 | document.addEventListener('DOMContentLoaded', resize) 20 | } 21 | 22 | window.addEventListener('resize', resize) 23 | })(window, document) 24 | -------------------------------------------------------------------------------- /src/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | const now = () => import('components/now/now') 4 | const hot = () => import('components/hot/hot') 5 | const listDetail = () => import('components/listDetail/listDetail') 6 | const nodes = () => import('components/nodes/nodeList') 7 | 8 | Vue.use(Router) 9 | 10 | export default new Router({ 11 | mode: 'history', 12 | routes: [ 13 | { 14 | path: '/', 15 | redirect: '/now' 16 | }, 17 | { 18 | path: '/now', 19 | name: '最新', 20 | component: now, 21 | children: [ 22 | { 23 | path: ':id', 24 | component: listDetail 25 | } 26 | ] 27 | }, 28 | { 29 | path: '/hot', 30 | name: '最热', 31 | component: hot, 32 | children: [ 33 | { 34 | path: ':id', 35 | component: listDetail 36 | } 37 | ] 38 | }, 39 | { 40 | path: '/nodes', 41 | name: '节点', 42 | component: nodes, 43 | children: [ 44 | { 45 | path: ':id', 46 | component: listDetail 47 | } 48 | ] 49 | } 50 | ] 51 | }) 52 | -------------------------------------------------------------------------------- /src/server-app.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import App from './App.vue' 3 | import { createRouter } from './router' 4 | 5 | // 导出一个工厂函数,用于创建新的 6 | // 应用程序、router 和 store 实例 7 | export function createApp() { 8 | const router = createRouter() 9 | const app = new Vue({ 10 | // 注入 router 到根 Vue 实例 11 | router, 12 | // 根实例简单的渲染应用程序组件。 13 | render: h => h(App) 14 | }) 15 | return { app, router } 16 | } 17 | -------------------------------------------------------------------------------- /src/server-router.js: -------------------------------------------------------------------------------- 1 | // router.js 2 | import Vue from 'vue' 3 | import Router from 'vue-router' 4 | 5 | Vue.use(Router) 6 | 7 | export function createRouter() { 8 | return new Router({ 9 | mode: 'history', 10 | routes: [ 11 | // ... 12 | ] 13 | }) 14 | } 15 | -------------------------------------------------------------------------------- /static/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zouhangwithsweet/v2ex-vue/56128fef943f77c3da6dbde88ee2f37bff3b9488/static/.gitkeep --------------------------------------------------------------------------------