├── .gitignore ├── __build__ ├── styles.8d2ae658.css.map ├── styles.8d2ae658.css ├── layout.html ├── 2.09f6781b.js ├── app.24b5d33b.js ├── 1.0ce212e3.js ├── 2.09f6781b.js.map ├── app.24b5d33b.js.map └── 1.0ce212e3.js.map ├── tsconfig.json ├── client ├── com.chezhil.cookbook │ ├── main.css │ ├── states │ │ ├── cookbook-list │ │ │ ├── value.js │ │ │ ├── style.css │ │ │ ├── template.html │ │ │ └── route.js │ │ └── cookbook │ │ │ ├── template.html │ │ │ └── route.js │ ├── main.js │ └── service │ │ └── cookbook.service.js ├── filter │ ├── date.filter.ts │ ├── date.filter.js │ └── date.filter.js.map └── lib │ └── cm-plugin.js ├── server ├── lib │ ├── vueServerFactory.ts │ ├── vueServerFactory.js │ ├── vueServerFactory.js.map │ ├── apiService.js.map │ ├── apiService.ts │ └── apiService.js ├── typings │ ├── cookie-parser │ │ └── cookie-parser.d.ts │ ├── tsd.d.ts │ ├── mime │ │ └── mime.d.ts │ ├── method-override │ │ └── method-override.d.ts │ ├── errorhandler │ │ └── errorhandler.d.ts │ ├── request-promise │ │ └── request-promise.d.ts │ ├── serve-static │ │ └── serve-static.d.ts │ ├── body-parser │ │ └── body-parser.d.ts │ ├── request │ │ └── request.d.ts │ └── mongodb │ │ └── mongodb.d.ts ├── routes │ ├── index.js.map │ ├── cookbook.js.map │ ├── cookbookDetail.js.map │ ├── cookbookDetail.js │ ├── cookbookDetail.ts │ ├── index.js │ ├── index.ts │ ├── cookbook.ts │ └── cookbook.js └── views │ ├── dist │ └── layout.html │ └── dev │ └── layout.html ├── env.js ├── webpack.dev.config.js ├── README.md ├── webpack.base.config.js ├── package.json ├── tsd.json ├── webpack.prod.config.js ├── server.js ├── server.ts └── server.js.map /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | bower_components 3 | node_modules 4 | #__build__ 5 | .DS_Store 6 | Thumbs.db -------------------------------------------------------------------------------- /__build__/styles.8d2ae658.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":[],"names":[],"mappings":"","file":"styles.8d2ae658.css","sourceRoot":""} -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "sourceMap": true 5 | }, 6 | "files": [ 7 | "./server/typings/tsd.d.ts", 8 | "./server.ts" 9 | ] 10 | } -------------------------------------------------------------------------------- /client/com.chezhil.cookbook/main.css: -------------------------------------------------------------------------------- 1 | h2{ 2 | font-size: 1rem; 3 | } 4 | p{ 5 | font-size: .8rem; 6 | } 7 | img{ 8 | max-width: 100%; 9 | } 10 | 11 | div::-webkit-scrollbar{ 12 | width: 0; 13 | height: 0; 14 | } -------------------------------------------------------------------------------- /server/lib/vueServerFactory.ts: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | import {config} from '../../env' 3 | let vueServer = require('vue-server') 4 | let Vue = new vueServer.renderer(); 5 | Vue.config.debug = !(config.NODE_ENV == 'product'); 6 | Vue.config.silent = (config.NODE_ENV == 'product'); 7 | 8 | 9 | export default Vue; -------------------------------------------------------------------------------- /client/com.chezhil.cookbook/states/cookbook-list/value.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | let value = { 3 | cookbookClasses : [], 4 | id : 0, 5 | page : 1, 6 | title : '菜谱列表', 7 | cookbookItems : [], 8 | maxItems : -1, 9 | updateTime : '', 10 | valOptions : [], 11 | } 12 | 13 | export default value; -------------------------------------------------------------------------------- /server/lib/vueServerFactory.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var env_1 = require('../../env'); 3 | var vueServer = require('vue-server'); 4 | var Vue = new vueServer.renderer(); 5 | Vue.config.debug = !(env_1.config.NODE_ENV == 'product'); 6 | Vue.config.silent = (env_1.config.NODE_ENV == 'product'); 7 | exports.__esModule = true; 8 | exports["default"] = Vue; 9 | //# sourceMappingURL=vueServerFactory.js.map -------------------------------------------------------------------------------- /server/lib/vueServerFactory.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"vueServerFactory.js","sourceRoot":"","sources":["vueServerFactory.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AACZ,oBAAqB,WACrB,CAAC,CAD+B;AAChC,IAAI,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;AACrC,IAAI,GAAG,GAAG,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;AACnC,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,YAAM,CAAC,QAAQ,IAAI,SAAS,CAAC,CAAC;AACnD,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,YAAM,CAAC,QAAQ,IAAI,SAAS,CAAC,CAAC;AAGnD;qBAAe,GAAG,CAAC"} -------------------------------------------------------------------------------- /env.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var env = { 3 | PORT : '3000', 4 | NODE_ENV : 'test', 5 | SELF_HOST : '127.0.0.1:3000', 6 | APIStore : { 7 | api_key : 'a369f43a6392605426433831e10765ec', 8 | news_host : 'http://apis.baidu.com', 9 | }, 10 | PATH_COOKBOOK : __dirname+'/client/com.chezhil.cookbook', 11 | PATH_BUILD : __dirname+'/__build__', 12 | 13 | API_BASE_HOST : 'http://', 14 | API_WX_HOST : 'http://' 15 | 16 | } 17 | 18 | exports.config = env; -------------------------------------------------------------------------------- /server/typings/cookie-parser/cookie-parser.d.ts: -------------------------------------------------------------------------------- 1 | // Type definitions for cookie-parser v1.3.4 2 | // Project: https://github.com/expressjs/cookie-parser 3 | // Definitions by: Santi Albo 4 | // Definitions: https://github.com/borisyankov/DefinitelyTyped 5 | 6 | /// 7 | 8 | declare module "cookie-parser" { 9 | import express = require('express'); 10 | function e(secret?: string, options?: any): express.RequestHandler; 11 | namespace e{} 12 | export = e; 13 | } -------------------------------------------------------------------------------- /__build__/styles.8d2ae658.css: -------------------------------------------------------------------------------- 1 | h2{font-size:1rem}p{font-size:.8rem}img{max-width:100%}div::-webkit-scrollbar{width:0;height:0}#class_tab{padding:0;width:100%;overflow-x:auto;z-index:3999;background:#fff;box-shadow:0 .05rem .1rem rgba(0,0,0,.3)}#class_tab .button{display:inline;color:#5f646e;font-size:.8rem;width:100%;height:2.2rem;line-height:1.6rem;padding-bottom:.5rem;-webkit-box-flex:1;-ms-flex:1;border:0;border-bottom:2px solid transparent;border-radius:0}#class_tab .button.active{color:#0894ec;border-color:#0894ec}#class_tab>a{background:#fff}.cookbook-box{padding-bottom:2.5rem} 2 | /*# sourceMappingURL=styles.8d2ae658.css.map*/ -------------------------------------------------------------------------------- /client/com.chezhil.cookbook/states/cookbook/template.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | 5 |

{{cookbookDetail.name}}

6 |
7 | 8 | 9 |
10 |
11 |

12 | {{{cookbookDetail.message}}} 13 |
14 |
15 |
-------------------------------------------------------------------------------- /server/typings/tsd.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | /// 4 | /// 5 | /// 6 | /// 7 | /// 8 | /// 9 | /// 10 | /// 11 | /// 12 | -------------------------------------------------------------------------------- /server/typings/mime/mime.d.ts: -------------------------------------------------------------------------------- 1 | // Type definitions for mime 2 | // Project: https://github.com/broofa/node-mime 3 | // Definitions by: Jeff Goddard 4 | // Definitions: https://github.com/borisyankov/DefinitelyTyped 5 | 6 | // Imported from: https://github.com/soywiz/typescript-node-definitions/mime.d.ts 7 | 8 | declare module "mime" { 9 | export function lookup(path: string): string; 10 | export function extension(mime: string): string; 11 | export function load(filepath: string): void; 12 | export function define(mimes: Object): void; 13 | 14 | interface Charsets { 15 | lookup(mime: string): string; 16 | } 17 | 18 | export var charsets: Charsets; 19 | } 20 | -------------------------------------------------------------------------------- /webpack.dev.config.js: -------------------------------------------------------------------------------- 1 | var webpack = require('webpack') 2 | var config = require('./webpack.base.config') 3 | var HtmlWebpackPlugin = require('html-webpack-plugin') 4 | var ExtractTextPlugin = require("extract-text-webpack-plugin"); 5 | 6 | config.devtool = 'source-map' 7 | 8 | config.output.filename = '[name].js' 9 | config.output.chunkFilename = '[id].[hash:8].js' 10 | 11 | config.plugins = (config.plugins || []).concat([ 12 | new ExtractTextPlugin("styles.css",{allChunks: true}), 13 | new webpack.optimize.CommonsChunkPlugin({ 14 | name: "vendor", 15 | filename: "[name].js", 16 | minChunks: Infinity, 17 | }), 18 | new webpack.optimize.UglifyJsPlugin({ 19 | compressor: { 20 | warnings: false 21 | } 22 | }) 23 | ]) 24 | 25 | module.exports = config -------------------------------------------------------------------------------- /client/com.chezhil.cookbook/states/cookbook-list/style.css: -------------------------------------------------------------------------------- 1 | #class_tab{ 2 | padding: 0; 3 | width: 100%; 4 | overflow-x: auto; 5 | z-index: 3999; 6 | background: #fff; 7 | box-shadow: 0 .05rem .1rem rgba(0,0,0,.3); 8 | } 9 | /*安卓版微信浏览器 不兼容flex布局*/ 10 | #class_tab .button{ 11 | display: inline; 12 | color: #5f646e; 13 | font-size: .8rem; 14 | width: 100%; 15 | height: 2.2rem; 16 | line-height: 1.6rem; 17 | padding-bottom: .5rem; 18 | -webkit-box-flex: 1; 19 | -ms-flex: 1; 20 | border: 0; 21 | border-bottom: 2px solid transparent; 22 | border-radius: 0; 23 | } 24 | #class_tab .button.active{ 25 | color: #0894ec; 26 | border-color: #0894ec; 27 | } 28 | #class_tab>a{ 29 | background: #fff; 30 | } 31 | 32 | .cookbook-box{ 33 | padding-bottom: 2.5rem; 34 | } -------------------------------------------------------------------------------- /server/routes/index.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,IAAO,SAAS,WAAW,YAAY,CAAC,CAAA;AAMxC,IAAI,GAAG,GAAG,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;AAEnC,eAAsB,GAAoB,EAAE,GAAqB;IAE7D,GAAG,CAAC,SAAS,CAAC,GAAG,EAAC;QACd,UAAU,EAAC,aAAa;KAC3B,CAAC,CAAC;IACH,GAAG,CAAC,GAAG,EAAE,CAAC;IAEV,mBAAmB;IACnB,eAAe;IACf,qBAAqB;IACrB,EAAE;IACF,aAAa;IACb,oBAAoB;IACpB,+EAA+E;IAC/E,iBAAiB;IACjB,SAAS;IACT,gBAAgB;IAChB,wBAAwB;IACxB,sDAAsD;IACtD,OAAO;IACP,IAAI;IACJ,0CAA0C;IAC1C,EAAE;IACF,2CAA2C;IAC3C,+BAA+B;IAC/B,wBAAwB;IACxB,8BAA8B;IAC9B,8GAA8G;IAC9G,sBAAsB;IACtB,iCAAiC;IACjC,2CAA2C;IAC3C,eAAe;IACf,aAAa;IACb,OAAO;IACP,2DAA2D;IAC3D,+BAA+B;IAC/B,+BAA+B;IAC/B,2BAA2B;IAC3B,+CAA+C;IAC/C,qCAAqC;IACrC,iEAAiE;IACjE,oBAAoB;IACpB,YAAY;IACZ,SAAS;IACT,EAAE;IACF,KAAK;AAET,CAAC;AA/Ce,aAAK,QA+CpB,CAAA;AAAA,CAAC"} -------------------------------------------------------------------------------- /server/lib/apiService.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"apiService.js","sourceRoot":"","sources":["apiService.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;;;;;;;;;AAEZ,IAAY,OAAO,WAAM,iBACzB,CAAC,CADyC;AAC1C,IAAO,WAAW,WAAW,aAAa,CAAC,CAAC;AAE5C,QAAQ;AACR;;QACI,IAAI,OAAO,GAAG;YACV,MAAM,EAAE,KAAK;YACb,GAAG,EAAE,4CAA4C,GAAC,WAAW,CAAC,SAAS,CAAC;gBACpE,EAAE,EAAG,CAAC;aACT,CAAC;YACF,OAAO,EAAE;gBACL,cAAc;gBACd,QAAQ,EAAE,kCAAkC;aAC/C;YACD,IAAI,EAAG,IAAI;SACd,CAAC;QAEF,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;IACtC,CAAC;;AAdqB,wBAAgB,mBAcrC,CAAA;AAED,YAAY;AACZ,yBAAsC,WAAW;;QAC7C,IAAI,OAAO,GAAG;YACV,MAAM,EAAE,KAAK;YACb,GAAG,EAAE,wCAAwC,GAAC,WAAW,CAAC,SAAS,CAAC;gBAChE,EAAE,EAAG,WAAW;gBAChB,IAAI,EAAG,CAAC;gBACR,IAAI,EAAG,EAAE;aACZ,CAAC;YACF,OAAO,EAAE;gBACL,cAAc;gBACd,QAAQ,EAAE,kCAAkC;aAC/C;YACD,IAAI,EAAG,IAAI;SACd,CAAC;QAEF,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;IACtC,CAAC;;AAhBqB,uBAAe,kBAgBpC,CAAA"} -------------------------------------------------------------------------------- /server/typings/method-override/method-override.d.ts: -------------------------------------------------------------------------------- 1 | // Type definitions for method-override 2 | // Project: https://github.com/expressjs/method-override 3 | // Definitions by: Santi Albo 4 | // Definitions: https://github.com/borisyankov/DefinitelyTyped 5 | 6 | /// 7 | 8 | declare module Express { 9 | export interface Request { 10 | originalMethod?: string; 11 | } 12 | } 13 | 14 | declare module "method-override" { 15 | import express = require('express'); 16 | 17 | namespace e { 18 | export interface MethodOverrideOptions { 19 | methods: string[]; 20 | } 21 | } 22 | 23 | function e(getter?: string, options?: e.MethodOverrideOptions): express.RequestHandler; 24 | function e(getter?: (req: express.Request, res: express.Response) => string, options?: e.MethodOverrideOptions): express.RequestHandler; 25 | 26 | export = e; 27 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 使用node.js+Vue.js+webpack 2 | 3 | 用node当前端服务器和后台服务器通讯和渲染页面,使用vue,vue-server,vue-router来实现SPA应用. 4 | 5 | 解决了SPA应用的SEO缺点,访问的第一个页面,使用vue-server来服务端渲染.使用vue-router+webpack实现APP模块懒加载 6 | 7 | 这只是一个快速开发框架. 8 | 9 | ### 一个简单的demo 10 | 11 | 12 | ### 1.安装 13 | 14 | npm install 15 | 16 | ### 2.typescript依赖安装 (需全局安装tsd) 17 | 18 | tsd install 19 | 20 | ### 3.编译ts文件 (需全局安装tsc) 21 | tsc 22 | 23 | ### 4.启动服务 24 | 25 | node server 或 npm run dev 26 | ### 版本 V0.2.0 27 | * 删除多余文件 28 | * 服务端使用 async函数 获取API数据 29 | * babel 升级(5升6) 30 | 31 | ### 版本 V0.1.1 32 | * 增加env文件 33 | 34 | ### 版本 V0.1.0 35 | * 分环境webpack打包 36 | * 新增模块化css打包 37 | * 新增车型选择功能 38 | * 新增城市选择功能 39 | 40 | ### 版本 V0.0.8 41 | * 去除侧边栏 为单独一页 42 | * 新增 搜索页面 43 | * 新增 sui-picker指令 44 | 45 | ### 版本 V0.0.7 46 | * 去掉vue-resource使用zepto的ajax (兼容性原因) 47 | 48 | ### 版本 V0.0.6 49 | * 分离service层 50 | * 兼容微信浏览器中Promise.all保错 引入Q.js 51 | 52 | 53 | ### 版本 V0.0.5 54 | 新增侧边栏,登陆页面,localStorage缓存 55 | 56 | ### 版本 V0.0.4 57 | 仿网易新闻操作方式(安卓微信中有少许BUG) 58 | 59 | -------------------------------------------------------------------------------- /webpack.base.config.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var webpack = require('webpack') 3 | var ExtractTextPlugin = require("extract-text-webpack-plugin"); 4 | 5 | module.exports = { 6 | 7 | devtool: 'source-map', 8 | 9 | entry: { 10 | app: "./client/com.chezhil.cookbook/main.js", 11 | //公共库 12 | vendor : [ 13 | 'vue', 14 | 'vue-router', 15 | 'q', 16 | './env' 17 | ] 18 | }, 19 | 20 | output: { 21 | path: __dirname + '/__build__', 22 | filename: '[name].[chunkhash:8].js', 23 | chunkFilename: '[id].[chunkhash:8].js', 24 | publicPath: '/__build__/' 25 | }, 26 | 27 | module: { 28 | loaders: [ 29 | { test: /\.js$/, 30 | exclude: /node_modules/, 31 | loader: 'babel' , 32 | query: { 33 | cacheDirectory: true, 34 | presets: ['es2015','stage-3'], 35 | // plugins: ['transform-runtime'] 36 | } 37 | }, 38 | { test: /\.html$/, loader: 'raw' }, 39 | { test: /\.css$/, loader: ExtractTextPlugin.extract('style-loader','css-loader') } 40 | ] 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /client/filter/date.filter.ts: -------------------------------------------------------------------------------- 1 | 2 | //计算时间差 3 | export default function(Vue){ 4 | Vue.filter('time-diff',function(dateTime){ 5 | var date1=new Date(dateTime); //开始时间 6 | var date2=new Date(); //结束时间 7 | 8 | var date3=date2.getTime()-date1.getTime() //时间差的毫秒数 9 | 10 | 11 | //计算出相差天数 12 | var days=Math.floor(date3/(24*3600*1000)) 13 | 14 | //计算出小时数 15 | var leave1=date3%(24*3600*1000) //计算天数后剩余的毫秒数 16 | var hours=Math.floor(leave1/(3600*1000)) 17 | 18 | //计算相差分钟数 19 | var leave2=leave1%(3600*1000) //计算小时数后剩余的毫秒数 20 | var minutes=Math.floor(leave2/(60*1000)) 21 | 22 | //计算相差秒数 23 | var leave3=leave2%(60*1000) //计算分钟数后剩余的毫秒数 24 | var seconds=Math.round(leave3/1000) 25 | 26 | if(days>0){ 27 | return days+'天' 28 | }else if(hours > 0){ 29 | return hours+'小时' 30 | }else if(minutes > 0){ 31 | return minutes+'分钟' 32 | }else if(seconds > 0 ){ 33 | return seconds+'秒' 34 | }else{ 35 | return '刚刚' 36 | } 37 | }); 38 | } -------------------------------------------------------------------------------- /server/lib/apiService.ts: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | import {config} from '../../env' 3 | import * as request from 'request-promise' 4 | import queryString = require('querystring'); 5 | 6 | //获取菜谱分类 7 | export async function getCookbookClass(){ 8 | let options = { 9 | method: 'GET', 10 | url: 'http://apis.baidu.com/tngou/cook/classify?'+queryString.stringify({ 11 | id : 0, 12 | }), 13 | headers: { 14 | //百度API的开放接口凭证 15 | 'apikey': 'a369f43a6392605426433831e10765ec' 16 | }, 17 | json : true 18 | }; 19 | 20 | return request(options).promise(); 21 | } 22 | 23 | //获取菜谱分类中的列表 24 | export async function getCookbookList(cookbook_id){ 25 | let options = { 26 | method: 'GET', 27 | url: 'http://apis.baidu.com/tngou/cook/list?'+queryString.stringify({ 28 | id : cookbook_id, 29 | page : 1, 30 | rows : 20 31 | }), 32 | headers: { 33 | //百度API的开放接口凭证 34 | 'apikey': 'a369f43a6392605426433831e10765ec' 35 | }, 36 | json : true 37 | }; 38 | 39 | return request(options).promise(); 40 | } 41 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "webapp.chezhil.com", 3 | "version": "0.0.1", 4 | "private": true, 5 | "scripts": { 6 | "dev": "node server --harmony", 7 | "build": "rm -rf ./__build__ && webpack --progress --hide-modules --config webpack.prod.config.js" 8 | }, 9 | "dependencies": { 10 | "babel-core": "6.7.6", 11 | "babel-loader": "6.2.4", 12 | "babel-preset-es2015": "6.6.0", 13 | "babel-preset-stage-3": "6.5.0", 14 | "body-parser": "^1.14.1", 15 | "cookie-parser": "^1.4.1", 16 | "ejs": ">= 0.5.0", 17 | "errorhandler": "^1.4.2", 18 | "express": "^4.13.3", 19 | "method-override": "^2.3.5", 20 | "q": "^1.4.1", 21 | "raw-loader": "^0.5.1", 22 | "request": "^2.69.0", 23 | "request-promise": "^2.0.1", 24 | "vue": "^1.0.15", 25 | "vue-router": "^0.7.10", 26 | "vue-server": "^0.4.2", 27 | "webpack": "^1.4.13", 28 | "webpack-dev-middleware": "^1.2.0" 29 | }, 30 | "devDependencies": { 31 | "css-loader": "^0.23.1", 32 | "extract-text-webpack-plugin": "^1.0.1", 33 | "html-webpack-plugin": "^2.8.2", 34 | "less": "^2.6.0", 35 | "less-loader": "^2.2.2", 36 | "style-loader": "^0.13.0" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /server/typings/errorhandler/errorhandler.d.ts: -------------------------------------------------------------------------------- 1 | // Type definitions for errorhandler 2 | // Project: https://github.com/expressjs/errorhandler 3 | // Definitions by: Santi Albo 4 | // Definitions: https://github.com/borisyankov/DefinitelyTyped 5 | 6 | /// 7 | 8 | declare module "errorhandler" { 9 | import express = require('express'); 10 | 11 | function errorHandler(options?: errorHandler.Options): express.ErrorRequestHandler; 12 | 13 | namespace errorHandler { 14 | interface LoggingCallback { 15 | (err: Error, str: string, req: express.Request, res: express.Response): void; 16 | } 17 | 18 | interface Options { 19 | /** 20 | * Defaults to true. 21 | * 22 | * Possible values: 23 | * true : Log errors using console.error(str). 24 | * false : Only send the error back in the response. 25 | * A function : pass the error to a function for handling. 26 | */ 27 | log: boolean | LoggingCallback; 28 | } 29 | } 30 | 31 | export = errorHandler; 32 | } 33 | -------------------------------------------------------------------------------- /client/filter/date.filter.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | //计算时间差 3 | function default_1(Vue) { 4 | Vue.filter('time-diff', function (dateTime) { 5 | var date1 = new Date(dateTime); //开始时间 6 | var date2 = new Date(); //结束时间 7 | var date3 = date2.getTime() - date1.getTime(); //时间差的毫秒数 8 | //计算出相差天数 9 | var days = Math.floor(date3 / (24 * 3600 * 1000)); 10 | //计算出小时数 11 | var leave1 = date3 % (24 * 3600 * 1000); //计算天数后剩余的毫秒数 12 | var hours = Math.floor(leave1 / (3600 * 1000)); 13 | //计算相差分钟数 14 | var leave2 = leave1 % (3600 * 1000); //计算小时数后剩余的毫秒数 15 | var minutes = Math.floor(leave2 / (60 * 1000)); 16 | //计算相差秒数 17 | var leave3 = leave2 % (60 * 1000); //计算分钟数后剩余的毫秒数 18 | var seconds = Math.round(leave3 / 1000); 19 | if (days > 0) { 20 | return days + '天'; 21 | } 22 | else if (hours > 0) { 23 | return hours + '小时'; 24 | } 25 | else if (minutes > 0) { 26 | return minutes + '分钟'; 27 | } 28 | else if (seconds > 0) { 29 | return seconds + '秒'; 30 | } 31 | else { 32 | return '刚刚'; 33 | } 34 | }); 35 | } 36 | exports.__esModule = true; 37 | exports["default"] = default_1; 38 | //# sourceMappingURL=date.filter.js.map -------------------------------------------------------------------------------- /server/routes/cookbook.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"cookbook.js","sourceRoot":"","sources":["cookbook.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;;;;;;;AAEb,IAAO,EAAE,WAAW,IAAI,CAAC,CAAC;AAC1B,2BAA+C,mBAC/C,CAAC,CADiE;AAClE,iCAAgB,yBAChB,CAAC,CADwC;AACzC,4BAAqB,iCACrB,CAAC,CADqD;AACtD,oBAAqB,WAErB,CAAC,CAF+B;AAEhC,eAA4B,GAAoB,EAAE,GAAqB;;QAEnE,IAAI,WAAW,GAAU,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAEvC,IAAI,EAAE,CAAC;QAEP,IAAI,CAAC;YAED,IAAI,SAAO,GAAG,MAAM,6BAAgB,EAAE,CAAC;YACvC,IAAI,MAAI,GAAG,MAAM,4BAAe,CAAC,WAAW,CAAC,CAAC;YAG9C,wBAAQ,CAAC,6BAAG,CAAC,CAAC;YACd,EAAE,GAAG,IAAI,6BAAG,CAAC;gBACT,OAAO,EAAG,KAAK;gBACf,QAAQ,EAAG,EAAE,CAAC,YAAY,CAAC,YAAM,CAAC,aAAa,GAAC,qCAAqC,EAAC,OAAO,CAAC;gBAC9F,IAAI,EAAG;oBACH,eAAe,EAAG,SAAO,CAAC,KAAK;oBAC/B,KAAK,EAAG,MAAM;oBACd,aAAa,EAAE,MAAI,CAAC,KAAK;oBACzB,EAAE,EAAI,WAAW;oBACjB,IAAI,EAAG,CAAC;oBACR,QAAQ,EAAG,MAAI,CAAC,KAAK;oBACrB,UAAU,EAAG,EAAE;oBACf,UAAU,EAAG,EAAE;iBAClB;aACJ,CAAC,CAAC;YACH,EAAE,CAAC,GAAG,CAAC,qBAAqB,EAAE,UAAS,IAAW;gBAC9C,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAC;oBAChB,WAAW,EAAC,IAAI;oBAChB,WAAW,EAAC,kGAEgB,IAAI,CAAC,SAAS,CAAC,SAAO,CAAC,KAAK,CAAC,+GAEhC,IAAI,CAAC,SAAS,CAAC,MAAI,CAAC,KAAK,CAAC,yCACnC,WAAW,iFAEN,MAAI,CAAC,KAAK,kIAGzB;iBACT,CAAC,CAAA;YACN,CAAC,CAAC,CAAC;QAEP,CAAC;QAAA,KAAK,CAAA,CAAC,GAAG,CAAC,CAAA,CAAC;YACR,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,EAAE,CAAC;QACd,CAAC;IACL,CAAC;;AAhDqB,aAAK,QAgD1B,CAAA;AAAA,CAAC"} -------------------------------------------------------------------------------- /server/typings/request-promise/request-promise.d.ts: -------------------------------------------------------------------------------- 1 | // Type definitions for request-promise v0.4.2 2 | // Project: https://www.npmjs.com/package/request-promise 3 | // Definitions by: Christopher Glantschnig , Joe Skeen 4 | // Definitions: https://github.com/borisyankov/DefinitelyTyped 5 | 6 | // Change [0]: 2015/08/20 - Aya Morisawa 7 | 8 | /// 9 | /// 10 | 11 | declare module 'request-promise' { 12 | import request = require('request'); 13 | import http = require('http'); 14 | 15 | interface RequestPromise extends request.Request { 16 | then(onFulfilled: Function, onRejected?: Function): Promise; 17 | catch(onRejected: Function): Promise; 18 | finally(onFinished: Function): Promise; 19 | promise(): Promise; 20 | } 21 | 22 | interface RequestPromiseOptions extends request.OptionalOptions { 23 | simple?: boolean; 24 | transform?: (body: any, response: http.IncomingMessage) => any; 25 | resolveWithFullResponse?: boolean; 26 | } 27 | 28 | var requestPromise: request.RequestAPI; 29 | export = requestPromise; 30 | } 31 | -------------------------------------------------------------------------------- /tsd.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "v4", 3 | "repo": "borisyankov/DefinitelyTyped", 4 | "ref": "master", 5 | "path": "server/typings", 6 | "bundle": "server/typings/tsd.d.ts", 7 | "installed": { 8 | "mime/mime.d.ts": { 9 | "commit": "fc341765ebbb04b7109981a25dced01f488f4d94" 10 | }, 11 | "serve-static/serve-static.d.ts": { 12 | "commit": "fc341765ebbb04b7109981a25dced01f488f4d94" 13 | }, 14 | "express/express.d.ts": { 15 | "commit": "fc341765ebbb04b7109981a25dced01f488f4d94" 16 | }, 17 | "node/node.d.ts": { 18 | "commit": "fc341765ebbb04b7109981a25dced01f488f4d94" 19 | }, 20 | "method-override/method-override.d.ts": { 21 | "commit": "fc341765ebbb04b7109981a25dced01f488f4d94" 22 | }, 23 | "errorhandler/errorhandler.d.ts": { 24 | "commit": "fc341765ebbb04b7109981a25dced01f488f4d94" 25 | }, 26 | "body-parser/body-parser.d.ts": { 27 | "commit": "fc341765ebbb04b7109981a25dced01f488f4d94" 28 | }, 29 | "cookie-parser/cookie-parser.d.ts": { 30 | "commit": "fc341765ebbb04b7109981a25dced01f488f4d94" 31 | }, 32 | "request/request.d.ts": { 33 | "commit": "fc341765ebbb04b7109981a25dced01f488f4d94" 34 | }, 35 | "request-promise/request-promise.d.ts": { 36 | "commit": "fc341765ebbb04b7109981a25dced01f488f4d94" 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /webpack.prod.config.js: -------------------------------------------------------------------------------- 1 | var webpack = require('webpack') 2 | var config = require('./webpack.base.config') 3 | var HtmlWebpackPlugin = require('html-webpack-plugin') 4 | var ExtractTextPlugin = require("extract-text-webpack-plugin"); 5 | 6 | config.devtool = 'source-map' 7 | 8 | config.output.filename = '[name].[chunkhash:8].js' 9 | config.output.chunkFilename = '[id].[chunkhash:8].js' 10 | 11 | config.plugins = (config.plugins || []).concat([ 12 | //把所有独立样式的CSS打包成一个style.css 13 | new ExtractTextPlugin("styles.[hash:8].css",{allChunks: true}), 14 | new webpack.optimize.CommonsChunkPlugin({ 15 | name: "vendor", 16 | 17 | filename: "[name].[hash:8].js", 18 | // (Give the chunk a different name) 19 | 20 | minChunks: Infinity, 21 | // (with more entries, this ensures that no other module 22 | // goes into the vendor chunk) 23 | }), 24 | new webpack.optimize.UglifyJsPlugin({ 25 | compressor: { 26 | warnings: false 27 | } 28 | }), 29 | new HtmlWebpackPlugin({ 30 | name:'layout', 31 | template: './server/views/dist/layout.html', 32 | filename: 'layout.html', 33 | inject: 'body', 34 | chunks: ['vendor', 'app'], 35 | minify:{ //压缩HTML文件 36 | removeComments:true, //移除HTML中的注释 37 | collapseWhitespace:false //删除空白符与换行符 38 | } 39 | }) 40 | ]) 41 | 42 | module.exports = config -------------------------------------------------------------------------------- /server/routes/cookbookDetail.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"cookbookDetail.js","sourceRoot":"","sources":["cookbookDetail.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,IAAO,SAAS,WAAW,YAAY,CAAC,CAAA;AACxC,IAAO,EAAE,WAAW,IAAI,CAAC,CAAA;AACzB,IAAO,OAAO,WAAW,SAAS,CAAC,CAAC,CAAC,cAAc;AACnD,IAAO,WAAW,WAAW,aAAa,CAAC,CAAC,CAAC,YAAY;AACzD,oBAAqB,WAErB,CAAC,CAF+B;AAEhC,IAAI,GAAG,GAAG,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;AAEnC,eAAsB,GAAoB,EAAE,GAAqB;IAE7D,IAAI,WAAW,GAAU,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;IAEvC,IAAI,EAAY,EACZ,CAAQ,EACR,OAAc,CAAC;IAEnB,OAAO,GAAG;QACN,MAAM,EAAE,KAAK;QACb,GAAG,EAAE,wCAAwC,GAAC,WAAW,CAAC,SAAS,CAAC;YAChE,EAAE,EAAG,WAAW;SACnB,CAAC;QACF,OAAO,EAAE;YACL,cAAc;YACd,QAAQ,EAAE,kCAAkC;SAC/C;KACJ,CAAC;IACF,OAAO,CAAC,OAAO,EAAC,UAAS,GAAG,EAAC,IAAI,EAAC,IAAI;QAClC,qBAAqB;QACrB,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC,CAAC;YACjC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACnB,EAAE,GAAG,IAAI,GAAG,CAAC;gBACT,OAAO,EAAG,KAAK;gBACf,QAAQ,EAAG,EAAE,CAAC,YAAY,CAAC,YAAM,CAAC,aAAa,GAAC,gCAAgC,EAAC,OAAO,CAAC;gBACzF,IAAI,EAAG;oBACH,cAAc,EAAG,CAAC;iBACrB;aACJ,CAAC,CAAC;QACP,CAAC;QACD,EAAE,CAAC,GAAG,CAAC,qBAAqB,EAAE,UAAS,IAAW;YAC9C,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAC;gBAChB,WAAW,EAAC,IAAI;gBAChB,WAAW,EAAC,sDACqB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAG;aACvD,CAAC,CAAA;QACN,CAAC,CAAC,CAAC;IAEP,CAAC,CAAC,CAAC;AAIP,CAAC;AA3Ce,aAAK,QA2CpB,CAAA;AAAA,CAAC"} -------------------------------------------------------------------------------- /server/views/dist/layout.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Vue Router Example 7 | 8 | 9 | 26 | 27 | 28 |
29 | 30 | 31 | <%-server_html%> 32 | 33 | 34 |
35 | 38 | 39 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /client/com.chezhil.cookbook/main.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | import './main.css' 3 | import Vue from 'vue' 4 | import VueRouter from 'vue-router' 5 | import plugin from '../lib/cm-plugin' 6 | import timeDiff from '../filter/date.filter' 7 | 8 | //Vue.config.debug = true; 9 | //Vue.config.silent = true;//取消 Vue.js 所有的日志与警告。 10 | Vue.use(VueRouter); 11 | Vue.use(plugin); 12 | 13 | timeDiff(Vue); //定义过滤器 14 | 15 | var router = new VueRouter({ 16 | history: true, //html5模式 去掉锚点 17 | saveScrollPosition: true //记住页面的滚动位置 html5模式适用 18 | }) 19 | 20 | //定义路由 21 | router.map({ 22 | '/cookbook/:id': { 23 | component: function(resolve){ 24 | //webpack自带功能 实现异步加载路由 25 | require.ensure([], function() { 26 | let route = require('./states/cookbook-list/route').default; 27 | resolve(route); 28 | }) 29 | } 30 | }, 31 | '/cookbookDetail/:id': { 32 | component: function(resolve){ 33 | //webpack自带功能 实现异步加载路由 34 | require.ensure([], function() { 35 | let route = require('./states/cookbook/route').default; 36 | resolve(route); 37 | }) 38 | } 39 | } 40 | }) 41 | router.redirect({ 42 | '*': '/cookbook/1' 43 | }) 44 | 45 | var App = Vue.extend({}) 46 | 47 | //启动APP 48 | router.start(App, '#app'); 49 | 50 | console.log('本地存储用了',JSON.stringify(localStorage).length/1024,'K'); -------------------------------------------------------------------------------- /client/filter/date.filter.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"date.filter.js","sourceRoot":"","sources":["date.filter.ts"],"names":[],"mappings":";AACA,OAAO;AACP,mBAAwB,GAAG;IACvB,GAAG,CAAC,MAAM,CAAC,WAAW,EAAC,UAAS,QAAQ;QACpC,IAAI,KAAK,GAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAE,MAAM;QACrC,IAAI,KAAK,GAAC,IAAI,IAAI,EAAE,CAAC,CAAI,MAAM;QAE/B,IAAI,KAAK,GAAC,KAAK,CAAC,OAAO,EAAE,GAAC,KAAK,CAAC,OAAO,EAAE,CAAA,CAAE,SAAS;QAGpD,SAAS;QACT,IAAI,IAAI,GAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAC,CAAC,EAAE,GAAC,IAAI,GAAC,IAAI,CAAC,CAAC,CAAA;QAEzC,QAAQ;QACR,IAAI,MAAM,GAAC,KAAK,GAAC,CAAC,EAAE,GAAC,IAAI,GAAC,IAAI,CAAC,CAAA,CAAI,aAAa;QAChD,IAAI,KAAK,GAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAC,CAAC,IAAI,GAAC,IAAI,CAAC,CAAC,CAAA;QAExC,SAAS;QACT,IAAI,MAAM,GAAC,MAAM,GAAC,CAAC,IAAI,GAAC,IAAI,CAAC,CAAA,CAAQ,cAAc;QACnD,IAAI,OAAO,GAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAC,CAAC,EAAE,GAAC,IAAI,CAAC,CAAC,CAAA;QAExC,QAAQ;QACR,IAAI,MAAM,GAAC,MAAM,GAAC,CAAC,EAAE,GAAC,IAAI,CAAC,CAAA,CAAM,cAAc;QAC/C,IAAI,OAAO,GAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAC,IAAI,CAAC,CAAA;QAEnC,EAAE,CAAA,CAAC,IAAI,GAAC,CAAC,CAAC,CAAA,CAAC;YACP,MAAM,CAAC,IAAI,GAAC,GAAG,CAAA;QACnB,CAAC;QAAA,IAAI,CAAC,EAAE,CAAA,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA,CAAC;YAChB,MAAM,CAAC,KAAK,GAAC,IAAI,CAAA;QACrB,CAAC;QAAA,IAAI,CAAC,EAAE,CAAA,CAAC,OAAO,GAAG,CAAC,CAAC,CAAA,CAAC;YAClB,MAAM,CAAC,OAAO,GAAC,IAAI,CAAA;QACvB,CAAC;QAAA,IAAI,CAAC,EAAE,CAAA,CAAC,OAAO,GAAG,CAAE,CAAC,CAAA,CAAC;YACnB,MAAM,CAAC,OAAO,GAAC,GAAG,CAAA;QACtB,CAAC;QAAA,IAAI,CAAA,CAAC;YACF,MAAM,CAAC,IAAI,CAAA;QACf,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC;AAnCD;8BAmCC,CAAA"} -------------------------------------------------------------------------------- /__build__/layout.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Vue Router Example 7 | 8 | 9 | 26 | 27 | 28 |
29 | 30 | 31 | <%-server_html%> 32 | 33 | 34 |
35 | 38 | 39 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /server/routes/cookbookDetail.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var vueServer = require("vue-server"); 3 | var fs = require('fs'); 4 | var request = require('request'); //第3方http请求的插件 5 | var queryString = require('querystring'); //转换get参数的插件 6 | var env_1 = require('../../env'); 7 | var Vue = new vueServer.renderer(); 8 | function index(req, res) { 9 | var cookbook_id = req.params.id; 10 | var vm, b, options; 11 | options = { 12 | method: 'GET', 13 | url: 'http://apis.baidu.com/tngou/cook/show?' + queryString.stringify({ 14 | id: cookbook_id 15 | }), 16 | headers: { 17 | //百度API的开放接口凭证 18 | 'apikey': 'a369f43a6392605426433831e10765ec' 19 | } 20 | }; 21 | request(options, function (err, resp, body) { 22 | //这个接口 没有返回这个ID的title 23 | if (!err && resp.statusCode == 200) { 24 | b = JSON.parse(body); 25 | console.log(b.img); 26 | vm = new Vue({ 27 | replace: false, 28 | template: fs.readFileSync(env_1.config.PATH_COOKBOOK + '/states/cookbook/template.html', 'utf-8'), 29 | data: { 30 | cookbookDetail: b 31 | } 32 | }); 33 | } 34 | vm.$on('vueServer.htmlReady', function (html) { 35 | res.render('layout', { 36 | server_html: html, 37 | server_data: "\n window.cm_cookbookDetail = " + JSON.stringify(b) 38 | }); 39 | }); 40 | }); 41 | } 42 | exports.index = index; 43 | ; 44 | //# sourceMappingURL=cookbookDetail.js.map -------------------------------------------------------------------------------- /server/views/dev/layout.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Vue Router Example 7 | 8 | 9 | 25 | 26 | 27 |
28 | 29 | 30 | <%-server_html%> 31 | 32 | 33 |
34 | 37 | 38 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /server/routes/cookbookDetail.ts: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | import express = require("express") 3 | import vueServer = require("vue-server") 4 | import fs = require('fs') 5 | import request = require('request'); //第3方http请求的插件 6 | import queryString = require('querystring'); //转换get参数的插件 7 | import {config} from '../../env' 8 | 9 | var Vue = new vueServer.renderer(); 10 | 11 | export function index(req: express.Request, res: express.Response) { 12 | 13 | let cookbook_id:number = req.params.id; 14 | 15 | let vm:vueServer, 16 | b:Object, 17 | options:Object; 18 | 19 | options = { 20 | method: 'GET', 21 | url: 'http://apis.baidu.com/tngou/cook/show?'+queryString.stringify({ 22 | id : cookbook_id, 23 | }), 24 | headers: { 25 | //百度API的开放接口凭证 26 | 'apikey': 'a369f43a6392605426433831e10765ec' 27 | } 28 | }; 29 | request(options,function(err,resp,body){ 30 | //这个接口 没有返回这个ID的title 31 | if (!err && resp.statusCode == 200) { 32 | b = JSON.parse(body); 33 | console.log(b.img); 34 | vm = new Vue({ 35 | replace : false, 36 | template : fs.readFileSync(config.PATH_COOKBOOK+'/states/cookbook/template.html','utf-8'), 37 | data : { 38 | cookbookDetail : b 39 | } 40 | }); 41 | } 42 | vm.$on('vueServer.htmlReady', function(html:string) { 43 | res.render('layout',{ 44 | server_html:html, 45 | server_data:` 46 | window.cm_cookbookDetail = ${JSON.stringify(b)}` 47 | }) 48 | }); 49 | 50 | }); 51 | 52 | 53 | 54 | }; -------------------------------------------------------------------------------- /server/routes/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var vueServer = require("vue-server"); 3 | var Vue = new vueServer.renderer(); 4 | function index(req, res) { 5 | res.writeHead(301, { 6 | 'Location': '/cookbook/1' 7 | }); 8 | res.end(); 9 | //let vm:vueServer, 10 | // b:Object, 11 | // options:Object; 12 | // 13 | //options = { 14 | // method: 'GET', 15 | // url: 'http://apis.baidu.com/tngou/cook/classify?'+queryString.stringify({ 16 | // id : 0, 17 | // }), 18 | // headers: { 19 | // //百度API的开放接口凭证 20 | // 'apikey': 'a369f43a6392605426433831e10765ec' 21 | // } 22 | //}; 23 | //request(options,function(err,resp,body){ 24 | // 25 | // if (!err && resp.statusCode == 200) { 26 | // b = JSON.parse(body); 27 | // vm = new Vue({ 28 | // replace : false, 29 | // template : fs.readFileSync(config.PATH_COOKBOOK+'/states/cookbook-class/template.html','utf-8'), 30 | // data : { 31 | // title : '菜谱首页', 32 | // cookbookClasses: b.tngou, 33 | // } 34 | // }); 35 | // } 36 | // vm.$on('vueServer.htmlReady', function(html:string) { 37 | // res.render('layout',{ 38 | // server_html:html, 39 | // server_data:` 40 | // window.cm_cookbookClasses = { 41 | // title : '菜谱首页', 42 | // cookbookClasses: ${JSON.stringify(b.tngou)} 43 | // }` 44 | // }) 45 | // }); 46 | // 47 | //}); 48 | } 49 | exports.index = index; 50 | ; 51 | //# sourceMappingURL=index.js.map -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var express = require("express"); 3 | var bodyParser = require("body-parser"); 4 | var errorHandler = require("errorhandler"); 5 | var methodOverride = require("method-override"); 6 | var cookieParser = require('cookie-parser'); 7 | var env_1 = require('./env'); 8 | var index = require("./server/routes/index"); 9 | var cookbook = require("./server/routes/cookbook"); 10 | var cookbookDetail = require('./server/routes/cookbookDetail'); 11 | var app = express(); 12 | // Configuration 13 | var env = env_1.config.NODE_ENV || 'development'; 14 | if (env === 'development') { 15 | var webpack = require('webpack'); 16 | var webpackDevMiddleware = require('webpack-dev-middleware'); 17 | var WebpackConfig = require('./webpack.dev.config'); 18 | app.use(errorHandler()); 19 | app.use(webpackDevMiddleware(webpack(WebpackConfig), { 20 | publicPath: '/__build__/', 21 | stats: { 22 | colors: true 23 | } 24 | })); 25 | app.set('views', __dirname + '/server/views/dev'); 26 | } 27 | else { 28 | app.set('views', env_1.config.PATH_BUILD); 29 | } 30 | app.set('view engine', 'html'); 31 | app.engine('.html', require('ejs').__express); 32 | app.use(bodyParser.urlencoded({ extended: true })); 33 | app.use(bodyParser.json()); 34 | app.use(methodOverride()); 35 | app.use(cookieParser()); 36 | app.use(express.static(__dirname)); 37 | // Routes 38 | app.get('/', index.index); 39 | app.get('/cookbook', index.index); 40 | app.get('/cookbook/:id', cookbook.index); 41 | app.get('/cookbookDetail/:id', cookbookDetail.index); 42 | app.listen(env_1.config.PORT, function () { 43 | console.log("Demo Express server listening on port %d in %s mode", env_1.config.PORT, env_1.config.NODE_ENV); 44 | }); 45 | exports.App = app; 46 | //# sourceMappingURL=server.js.map -------------------------------------------------------------------------------- /server.ts: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | import * as express from "express"; 3 | import * as bodyParser from "body-parser"; 4 | import errorHandler = require("errorhandler"); 5 | import methodOverride = require("method-override"); 6 | import * as cookieParser from 'cookie-parser'; 7 | import {config} from './env' 8 | 9 | 10 | import * as index from "./server/routes/index"; 11 | import * as cookbook from "./server/routes/cookbook"; 12 | import * as cookbookDetail from './server/routes/cookbookDetail'; 13 | 14 | 15 | var app = express(); 16 | 17 | // Configuration 18 | var env = config.NODE_ENV || 'development'; 19 | if (env === 'development') { 20 | var webpack = require('webpack'); 21 | var webpackDevMiddleware = require('webpack-dev-middleware'); 22 | var WebpackConfig = require('./webpack.dev.config'); 23 | app.use(errorHandler()); 24 | app.use(webpackDevMiddleware(webpack(WebpackConfig), { 25 | publicPath: '/__build__/', 26 | stats: { 27 | colors: true 28 | } 29 | })); 30 | app.set('views',__dirname + '/server/views/dev'); 31 | }else{ 32 | app.set('views',config.PATH_BUILD); 33 | } 34 | 35 | app.set('view engine', 'html'); 36 | app.engine('.html', require('ejs').__express) 37 | 38 | app.use(bodyParser.urlencoded({ extended: true })); 39 | app.use(bodyParser.json()); 40 | app.use(methodOverride()); 41 | app.use(cookieParser()); 42 | app.use(express.static(__dirname)); 43 | 44 | 45 | // Routes 46 | app.get('/', index.index); 47 | app.get('/cookbook', index.index); 48 | app.get('/cookbook/:id', cookbook.index); 49 | app.get('/cookbookDetail/:id', cookbookDetail.index); 50 | 51 | 52 | app.listen(config.PORT, function(){ 53 | console.log("Demo Express server listening on port %d in %s mode", config.PORT, config.NODE_ENV); 54 | }); 55 | 56 | export var App = app; -------------------------------------------------------------------------------- /server.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"server.js","sourceRoot":"","sources":["server.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AACZ,IAAY,OAAO,WAAM,SAAS,CAAC,CAAA;AACnC,IAAY,UAAU,WAAM,aAAa,CAAC,CAAA;AAC1C,IAAO,YAAY,WAAW,cAAc,CAAC,CAAC;AAC9C,IAAO,cAAc,WAAW,iBAAiB,CAAC,CAAC;AACnD,IAAY,YAAY,WAAM,eAAe,CAAC,CAAA;AAC9C,oBAAqB,OAGrB,CAAC,CAH2B;AAG5B,IAAY,KAAK,WAAM,uBAAuB,CAAC,CAAA;AAC/C,IAAY,QAAQ,WAAM,0BAA0B,CAAC,CAAA;AACrD,IAAY,cAAc,WAAM,gCAAgC,CAAC,CAAA;AAGjE,IAAI,GAAG,GAAG,OAAO,EAAE,CAAC;AAEpB,gBAAgB;AAChB,IAAI,GAAG,GAAG,YAAM,CAAC,QAAQ,IAAI,aAAa,CAAC;AAC3C,EAAE,CAAC,CAAC,GAAG,KAAK,aAAa,CAAC,CAAC,CAAC;IACxB,IAAI,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACjC,IAAI,oBAAoB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAC7D,IAAI,aAAa,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACpD,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;IACxB,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;QACjD,UAAU,EAAE,aAAa;QACzB,KAAK,EAAE;YACH,MAAM,EAAE,IAAI;SACf;KACJ,CAAC,CAAC,CAAC;IACJ,GAAG,CAAC,GAAG,CAAC,OAAO,EAAC,SAAS,GAAG,mBAAmB,CAAC,CAAC;AACrD,CAAC;AAAA,IAAI,CAAA,CAAC;IACF,GAAG,CAAC,GAAG,CAAC,OAAO,EAAC,YAAM,CAAC,UAAU,CAAC,CAAC;AACvC,CAAC;AAED,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;AAC/B,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAA;AAE7C,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACnD,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;AAC3B,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC;AAC1B,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;AACxB,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;AAGnC,SAAS;AACT,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;AAC1B,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;AAClC,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzC,GAAG,CAAC,GAAG,CAAC,qBAAqB,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;AAGrD,GAAG,CAAC,MAAM,CAAC,YAAM,CAAC,IAAI,EAAE;IACpB,OAAO,CAAC,GAAG,CAAC,qDAAqD,EAAE,YAAM,CAAC,IAAI,EAAE,YAAM,CAAC,QAAQ,CAAC,CAAC;AACrG,CAAC,CAAC,CAAC;AAEQ,WAAG,GAAG,GAAG,CAAC"} -------------------------------------------------------------------------------- /server/routes/index.ts: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | import express = require("express") 3 | import vueServer = require("vue-server") 4 | import fs = require('fs') 5 | import request = require('request'); //第3方http请求的插件 6 | import queryString = require('querystring'); //转换get参数的插件 7 | import {config} from '../../env' 8 | 9 | var Vue = new vueServer.renderer(); 10 | 11 | export function index(req: express.Request, res: express.Response) { 12 | 13 | res.writeHead(301,{ 14 | 'Location':'/cookbook/1' 15 | }); 16 | res.end(); 17 | 18 | //let vm:vueServer, 19 | // b:Object, 20 | // options:Object; 21 | // 22 | //options = { 23 | // method: 'GET', 24 | // url: 'http://apis.baidu.com/tngou/cook/classify?'+queryString.stringify({ 25 | // id : 0, 26 | // }), 27 | // headers: { 28 | // //百度API的开放接口凭证 29 | // 'apikey': 'a369f43a6392605426433831e10765ec' 30 | // } 31 | //}; 32 | //request(options,function(err,resp,body){ 33 | // 34 | // if (!err && resp.statusCode == 200) { 35 | // b = JSON.parse(body); 36 | // vm = new Vue({ 37 | // replace : false, 38 | // template : fs.readFileSync(config.PATH_COOKBOOK+'/states/cookbook-class/template.html','utf-8'), 39 | // data : { 40 | // title : '菜谱首页', 41 | // cookbookClasses: b.tngou, 42 | // } 43 | // }); 44 | // } 45 | // vm.$on('vueServer.htmlReady', function(html:string) { 46 | // res.render('layout',{ 47 | // server_html:html, 48 | // server_data:` 49 | // window.cm_cookbookClasses = { 50 | // title : '菜谱首页', 51 | // cookbookClasses: ${JSON.stringify(b.tngou)} 52 | // }` 53 | // }) 54 | // }); 55 | // 56 | //}); 57 | 58 | }; -------------------------------------------------------------------------------- /server/routes/cookbook.ts: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | import express = require("express"); 3 | import fs = require('fs'); 4 | import {getCookbookClass,getCookbookList} from '../lib/apiService' 5 | import Vue from '../lib/vueServerFactory' 6 | import timeDiff from '../../client/filter/date.filter' 7 | import {config} from '../../env' 8 | 9 | export async function index(req: express.Request, res: express.Response) { 10 | 11 | let cookbook_id:number = req.params.id; 12 | 13 | let vm; 14 | 15 | try { 16 | 17 | let classes = await getCookbookClass(); 18 | let list = await getCookbookList(cookbook_id); 19 | 20 | 21 | timeDiff(Vue); 22 | vm = new Vue({ 23 | replace : false, 24 | template : fs.readFileSync(config.PATH_COOKBOOK+'/states/cookbook-list/template.html','utf-8'), 25 | data : { 26 | cookbookClasses : classes.tngou, 27 | title : '菜谱列表', 28 | cookbookItems: list.tngou, 29 | id : cookbook_id, 30 | page : 1, 31 | maxItems : list.total, 32 | updateTime : '', 33 | valOptions : [], 34 | } 35 | }); 36 | vm.$on('vueServer.htmlReady', function(html:string) { 37 | res.render('layout',{ 38 | server_html:html, 39 | server_data:` 40 | window.cm_cookbookItems = { 41 | cookbookClasses : ${JSON.stringify(classes.tngou)}, 42 | title : '菜谱列表', 43 | cookbookItems: ${JSON.stringify(list.tngou)}, 44 | id : ${cookbook_id}, 45 | page : 2, 46 | maxItems : ${list.total}, 47 | updateTime : new Date().getTime(), 48 | valOptions : [] 49 | }` 50 | }) 51 | }); 52 | 53 | }catch(err){ 54 | res.writeHead(500); 55 | res.end(); 56 | } 57 | }; -------------------------------------------------------------------------------- /server/lib/apiService.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 3 | return new (P || (P = Promise))(function (resolve, reject) { 4 | function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } 5 | function rejected(value) { try { step(generator.throw(value)); } catch (e) { reject(e); } } 6 | function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } 7 | step((generator = generator.apply(thisArg, _arguments)).next()); 8 | }); 9 | }; 10 | var request = require('request-promise'); 11 | var queryString = require('querystring'); 12 | //获取菜谱分类 13 | function getCookbookClass() { 14 | return __awaiter(this, void 0, void 0, function* () { 15 | var options = { 16 | method: 'GET', 17 | url: 'http://apis.baidu.com/tngou/cook/classify?' + queryString.stringify({ 18 | id: 0 19 | }), 20 | headers: { 21 | //百度API的开放接口凭证 22 | 'apikey': 'a369f43a6392605426433831e10765ec' 23 | }, 24 | json: true 25 | }; 26 | return request(options).promise(); 27 | }); 28 | } 29 | exports.getCookbookClass = getCookbookClass; 30 | //获取菜谱分类中的列表 31 | function getCookbookList(cookbook_id) { 32 | return __awaiter(this, void 0, void 0, function* () { 33 | var options = { 34 | method: 'GET', 35 | url: 'http://apis.baidu.com/tngou/cook/list?' + queryString.stringify({ 36 | id: cookbook_id, 37 | page: 1, 38 | rows: 20 39 | }), 40 | headers: { 41 | //百度API的开放接口凭证 42 | 'apikey': 'a369f43a6392605426433831e10765ec' 43 | }, 44 | json: true 45 | }; 46 | return request(options).promise(); 47 | }); 48 | } 49 | exports.getCookbookList = getCookbookList; 50 | //# sourceMappingURL=apiService.js.map -------------------------------------------------------------------------------- /client/com.chezhil.cookbook/states/cookbook/route.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | import Vue from 'vue' 3 | import Tpl from './template.html' 4 | import cookbookService from '../../service/cookbook.service' 5 | 6 | let Index = Vue.extend({ 7 | //replace : false, //必须注释掉 不然动画失效 8 | template : Tpl, 9 | ready : function(){ 10 | 11 | }, 12 | data : ()=>{ 13 | return { 14 | cookbookDetail : { 15 | img : '', 16 | } 17 | } 18 | }, 19 | methods: { 20 | goBack(){ 21 | try{ 22 | let from = this.$route.router._currentTransition.from 23 | if(typeof from.path != 'undefined'){ 24 | this.$router.go(from.path); 25 | }else{ 26 | this.$router.go('cookbook/1'); 27 | } 28 | }catch(e){ 29 | this.$router.go('cookbook/1'); 30 | } 31 | } 32 | }, 33 | route : { 34 | data : function(transition){ 35 | //如果是服务端渲染的,应该设置全局变量,那么客户端就不用异步请求数据了 36 | if(window.cm_cookbookDetail && window.cm_cookbookDetail.id == transition.to.params.id){ 37 | this.$data = { 38 | cookbookDetail:window.cm_cookbookDetail 39 | }; 40 | transition.next(); 41 | }else{ 42 | let qa_id = transition.to.params.id; 43 | $.showIndicator() 44 | cookbookService.getCookbookDetail(qa_id).then((response)=>{ 45 | if(response.status){ 46 | this.$data = { 47 | cookbookDetail : response 48 | }; 49 | transition.next(); 50 | }else{ 51 | transition.abort(); 52 | } 53 | }).catch(()=>{ 54 | transition.abort(); 55 | }).finally(()=>{ 56 | $.hideIndicator(); 57 | }) 58 | } 59 | } 60 | } 61 | }) 62 | 63 | export default Index -------------------------------------------------------------------------------- /client/com.chezhil.cookbook/states/cookbook-list/template.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |

菜谱demo

5 |
6 | 7 | 8 |
9 | {{item.title}} 12 |
13 | 14 | 15 |
16 | 17 |
18 |
19 |
20 |
{{updateTime | time-diff}}前更新过
21 |
22 | 23 |
24 | 25 |
26 |
27 |
28 |
29 |
    30 |
  • 31 |
    32 | 33 |
    34 |
    35 |
    36 |
    {{item.name}}
    37 |
    38 |
    {{item.food}}
    39 |
    40 |
  • 41 |
42 |
43 |
44 |
45 | 46 |
47 |
48 |
49 |
50 |
51 |
52 | 53 |
-------------------------------------------------------------------------------- /server/routes/cookbook.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 3 | return new (P || (P = Promise))(function (resolve, reject) { 4 | function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } 5 | function rejected(value) { try { step(generator.throw(value)); } catch (e) { reject(e); } } 6 | function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } 7 | step((generator = generator.apply(thisArg, _arguments)).next()); 8 | }); 9 | }; 10 | var fs = require('fs'); 11 | var apiService_1 = require('../lib/apiService'); 12 | var vueServerFactory_1 = require('../lib/vueServerFactory'); 13 | var date_filter_1 = require('../../client/filter/date.filter'); 14 | var env_1 = require('../../env'); 15 | function index(req, res) { 16 | return __awaiter(this, void 0, void 0, function* () { 17 | var cookbook_id = req.params.id; 18 | var vm; 19 | try { 20 | var classes_1 = yield apiService_1.getCookbookClass(); 21 | var list_1 = yield apiService_1.getCookbookList(cookbook_id); 22 | date_filter_1["default"](vueServerFactory_1["default"]); 23 | vm = new vueServerFactory_1["default"]({ 24 | replace: false, 25 | template: fs.readFileSync(env_1.config.PATH_COOKBOOK + '/states/cookbook-list/template.html', 'utf-8'), 26 | data: { 27 | cookbookClasses: classes_1.tngou, 28 | title: '菜谱列表', 29 | cookbookItems: list_1.tngou, 30 | id: cookbook_id, 31 | page: 1, 32 | maxItems: list_1.total, 33 | updateTime: '', 34 | valOptions: [] 35 | } 36 | }); 37 | vm.$on('vueServer.htmlReady', function (html) { 38 | res.render('layout', { 39 | server_html: html, 40 | server_data: "\n window.cm_cookbookItems = {\n cookbookClasses : " + JSON.stringify(classes_1.tngou) + ",\n title : '\u83DC\u8C31\u5217\u8868',\n cookbookItems: " + JSON.stringify(list_1.tngou) + ",\n id : " + cookbook_id + ",\n page : 2,\n maxItems : " + list_1.total + ",\n updateTime : new Date().getTime(),\n valOptions : []\n }" 41 | }); 42 | }); 43 | } 44 | catch (err) { 45 | res.writeHead(500); 46 | res.end(); 47 | } 48 | }); 49 | } 50 | exports.index = index; 51 | ; 52 | //# sourceMappingURL=cookbook.js.map -------------------------------------------------------------------------------- /__build__/2.09f6781b.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([2],{13:function(o,t,e){"use strict";function a(o){return o&&o.__esModule?o:{"default":o}}function n(o,t){return r["default"].Promise(function(e,a){$.ajax({type:"GET",url:"http://apis.baidu.com/tngou/cook/list",data:{id:o,page:t},headers:{apikey:"a369f43a6392605426433831e10765ec"},success:function(n){if(n.status){if(1==t)localStorage.setItem("cookbook_list_"+o,JSON.stringify({id:o,updateTime:(new Date).getTime(),page:2,cookbookItems:n.tngou,maxItems:n.total}));else{for(var i=JSON.parse(localStorage.getItem("cookbook_list_"+o)),c=0;c\n \n
\n \n

{{cookbookDetail.name}}

\n
\n\n \n
\n
\n

\n {{{cookbookDetail.message}}}\n
\n
\n'}}); 2 | //# sourceMappingURL=2.09f6781b.js.map -------------------------------------------------------------------------------- /__build__/app.24b5d33b.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([0],[function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}o(1);var r=o(2),a=n(r),i=o(4),c=n(i),l=o(5),u=n(l),f=o(6),s=n(f);a["default"].use(c["default"]),a["default"].use(u["default"]),(0,s["default"])(a["default"]);var d=new c["default"]({history:!0,saveScrollPosition:!0});d.map({"/cookbook/:id":{component:function(e){o.e(1,function(){var t=o(7)["default"];e(t)})}},"/cookbookDetail/:id":{component:function(e){o.e(2,function(){var t=o(14)["default"];e(t)})}}}),d.redirect({"*":"/cookbook/1"});var g=a["default"].extend({});d.start(g,"#app"),console.log("本地存储用了",JSON.stringify(localStorage).length/1024,"K")},function(e,t){},,,,function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e},n={};n.install=function(e,t){e.cookie=function(e,t,o){var n,r,a,i;return arguments.length>1&&"[object Object]"!==String(t)?(o=$.extend({},o),null!==t&&void 0!==t||(o.expires=-1),"number"==typeof o.expires&&(n=24*o.expires*60*60*1e3,r=o.expires=new Date,r.setTime(r.getTime()+n)),t=String(t),document.cookie=[encodeURIComponent(e),"=",o.raw?t:encodeURIComponent(t),o.expires?"; expires="+o.expires.toUTCString():"","; path=/",o.domain?"; domain="+o.domain:"",o.secure?"; secure":""].join("")):(o=t||{},i=o.raw?function(e){return e}:decodeURIComponent,(a=new RegExp("(?:^|; )"+encodeURIComponent(e)+"=([^;]*)").exec(document.cookie))?i(a[1]):null)},e.prototype.goBack=function(e){var t=void 0;try{t=e.$router._currentTransition.from.path,t?t.match("member")&&!$.localStorage.getItem("webapp_userInfo")?e.$router.replace("/cookbook/1"):window.history.back():e.$router.replace("/cookbook/1")}catch(o){console.log(o),e.$router.replace("/cookbook/1")}},e.prototype.$device=function(e){return $.device[e]},$.localStorage={getItem:function(e){if("object"===("undefined"==typeof localStorage?"undefined":o(localStorage)))try{return JSON.parse(localStorage.getItem(e))}catch(t){alert("本站无痕浏览模式,请关闭后再试!")}},setItem:function(e,t){if("object"===("undefined"==typeof localStorage?"undefined":o(localStorage)))try{return localStorage.setItem(e,JSON.stringify(t))}catch(n){alert("请关闭[无痕浏览]模式后再试!")}},removeItem:function(e){if("object"===("undefined"==typeof localStorage?"undefined":o(localStorage)))try{return localStorage.removeItem(e)}catch(t){alert("请关闭[无痕浏览]模式后再试!")}},getUseSize:function(){if("object"===("undefined"==typeof localStorage?"undefined":o(localStorage)))try{return JSON.stringify(localStorage).length}catch(e){alert("请关闭[无痕浏览]模式后再试!")}}},$.ajaxSettings.timeout=5e3,$.ajaxSettings.complete=function(e,t){if("abort"==t)$.toast("请求失败");else if("timeout"==t)$.toast("请求超时");else if("error"==t)try{var o=JSON.parse(e.responseText);$.toast(o.message)}catch(n){$.toast("服务器错误")}},Date.prototype.Format=function(e){var t={"M+":this.getMonth()+1,"d+":this.getDate(),"H+":this.getHours(),"m+":this.getMinutes(),"s+":this.getSeconds(),"q+":Math.floor((this.getMonth()+3)/3),S:this.getMilliseconds()};/(y+)/.test(e)&&(e=e.replace(RegExp.$1,(this.getFullYear()+"").substr(4-RegExp.$1.length)));for(var o in t)new RegExp("("+o+")").test(e)&&(e=e.replace(RegExp.$1,1==RegExp.$1.length?t[o]:("00"+t[o]).substr((""+t[o]).length)));return e}},t["default"]=n},function(e,t){"use strict";function o(e){e.filter("time-diff",function(e){var t=new Date(e),o=new Date,n=o.getTime()-t.getTime(),r=Math.floor(n/864e5),a=n%864e5,i=Math.floor(a/36e5),c=a%36e5,l=Math.floor(c/6e4),u=c%6e4,f=Math.round(u/1e3);return r>0?r+"天":i>0?i+"小时":l>0?l+"分钟":f>0?f+"秒":"刚刚"})}t.__esModule=!0,t["default"]=o}]); 2 | //# sourceMappingURL=app.24b5d33b.js.map -------------------------------------------------------------------------------- /server/typings/serve-static/serve-static.d.ts: -------------------------------------------------------------------------------- 1 | // Type definitions for serve-static 1.7.1 2 | // Project: https://github.com/expressjs/serve-static 3 | // Definitions by: Uros Smolnik 4 | // Definitions: https://github.com/borisyankov/DefinitelyTyped 5 | 6 | /* =================== USAGE =================== 7 | 8 | import * as serveStatic from "serve-static"; 9 | app.use(serveStatic("public/ftp", {"index": ["default.html", "default.htm"]})) 10 | 11 | =============================================== */ 12 | 13 | /// 14 | /// 15 | 16 | declare module "serve-static" { 17 | import * as express from "express"; 18 | 19 | /** 20 | * Create a new middleware function to serve files from within a given root directory. 21 | * The file to serve will be determined by combining req.url with the provided root directory. 22 | * When a file is not found, instead of sending a 404 response, this module will instead call next() to move on to the next middleware, allowing for stacking and fall-backs. 23 | */ 24 | function serveStatic(root: string, options?: { 25 | /** 26 | * Set how "dotfiles" are treated when encountered. A dotfile is a file or directory that begins with a dot ("."). 27 | * Note this check is done on the path itself without checking if the path actually exists on the disk. 28 | * If root is specified, only the dotfiles above the root are checked (i.e. the root itself can be within a dotfile when when set to "deny"). 29 | * The default value is 'ignore'. 30 | * 'allow' No special treatment for dotfiles 31 | * 'deny' Send a 403 for any request for a dotfile 32 | * 'ignore' Pretend like the dotfile does not exist and call next() 33 | */ 34 | dotfiles?: string; 35 | 36 | /** 37 | * Enable or disable etag generation, defaults to true. 38 | */ 39 | etag?: boolean; 40 | 41 | /** 42 | * Set file extension fallbacks. When set, if a file is not found, the given extensions will be added to the file name and search for. 43 | * The first that exists will be served. Example: ['html', 'htm']. 44 | * The default value is false. 45 | */ 46 | extensions?: string[]; 47 | 48 | /** 49 | * By default this module will send "index.html" files in response to a request on a directory. 50 | * To disable this set false or to supply a new index pass a string or an array in preferred order. 51 | */ 52 | index?: boolean|string|string[]; 53 | 54 | /** 55 | * Enable or disable Last-Modified header, defaults to true. Uses the file system's last modified value. 56 | */ 57 | lastModified?: boolean; 58 | 59 | /** 60 | * Provide a max-age in milliseconds for http caching, defaults to 0. This can also be a string accepted by the ms module. 61 | */ 62 | maxAge?: number|string; 63 | 64 | /** 65 | * Redirect to trailing "/" when the pathname is a dir. Defaults to true. 66 | */ 67 | redirect?: boolean; 68 | 69 | /** 70 | * Function to set custom headers on response. Alterations to the headers need to occur synchronously. 71 | * The function is called as fn(res, path, stat), where the arguments are: 72 | * res the response object 73 | * path the file path that is being sent 74 | * stat the stat object of the file that is being sent 75 | */ 76 | setHeaders?: (res: express.Response, path: string, stat: any) => any; 77 | }): express.Handler; 78 | 79 | import * as m from "mime"; 80 | 81 | module serveStatic { 82 | var mime: typeof m; 83 | } 84 | 85 | export = serveStatic; 86 | } 87 | -------------------------------------------------------------------------------- /client/com.chezhil.cookbook/service/cookbook.service.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | import Q from 'q' 3 | 4 | function getCookbookList(id,page){ 5 | return Q.Promise((success,error)=>{ 6 | $.ajax({ 7 | type : 'GET', 8 | url : 'http://apis.baidu.com/tngou/cook/list', 9 | data : { 10 | id : id , 11 | page : page 12 | }, 13 | headers : { 14 | apikey : 'a369f43a6392605426433831e10765ec' 15 | }, 16 | success : function(response){ 17 | if(response.status){ 18 | //拿第一页的时候保存到本地 19 | if(page == 1){ 20 | localStorage.setItem('cookbook_list_'+id,JSON.stringify({ 21 | id : id, 22 | updateTime : new Date().getTime(), 23 | page : 2, 24 | cookbookItems : response.tngou, 25 | maxItems : response.total 26 | })); 27 | }else{ 28 | let oldValue = JSON.parse(localStorage.getItem('cookbook_list_'+id)); 29 | for(let i=0;i{ 51 | 52 | let classes = $.localStorage.getItem('cookbook_classes') 53 | if(classes){ 54 | success(classes); 55 | }else{ 56 | $.ajax({ 57 | type : 'GET', 58 | url : 'http://apis.baidu.com/tngou/cook/classify', 59 | data : { 60 | id : 0 61 | }, 62 | headers : { 63 | apikey : 'a369f43a6392605426433831e10765ec' 64 | }, 65 | success : function(response){ 66 | if(response.status){ 67 | localStorage.setItem('cookbook_classes',JSON.stringify(response.tngou)); 68 | success(response) 69 | }else{ 70 | error('请求失败!') 71 | } 72 | }, 73 | error : function(xhr, errorType){ 74 | error('请求失败') 75 | } 76 | }); 77 | 78 | } 79 | 80 | }) 81 | } 82 | 83 | function getCookbookDetail(id){ 84 | return Q.Promise((success,error)=>{ 85 | $.ajax({ 86 | type : 'GET', 87 | url : 'http://apis.baidu.com/tngou/cook/show', 88 | data : { 89 | id : id 90 | }, 91 | headers : { 92 | apikey : 'a369f43a6392605426433831e10765ec' 93 | }, 94 | success : function(response){ 95 | if(response.status){ 96 | success(response) 97 | }else{ 98 | error('请求失败') 99 | } 100 | }, 101 | error : function(xhr, errorType){ 102 | error('请求失败') 103 | } 104 | }); 105 | }) 106 | } 107 | let cookbookService = { 108 | getCookbookList : getCookbookList, 109 | getCookbookClass : getCookbookClass, 110 | getCookbookDetail: getCookbookDetail 111 | }; 112 | 113 | export default cookbookService; -------------------------------------------------------------------------------- /client/lib/cm-plugin.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | var MyPlugin = {}; 4 | MyPlugin.install = function (Vue, option) { 5 | 6 | // 设置cookie 7 | Vue.cookie = function (key, value, options) { 8 | var days, time, result, decode; 9 | 10 | if (arguments.length > 1 && String(value) !== "[object Object]") { 11 | // Enforce object 12 | options = $.extend({}, options) 13 | 14 | if (value === null || value === undefined) options.expires = -1 15 | 16 | if (typeof options.expires === 'number') { 17 | days = (options.expires * 24 * 60 * 60 * 1000) 18 | time = options.expires = new Date() 19 | 20 | time.setTime(time.getTime() + days) 21 | } 22 | 23 | value = String(value) 24 | 25 | return (document.cookie = [ 26 | encodeURIComponent(key), '=', 27 | options.raw ? value : encodeURIComponent(value), 28 | options.expires ? '; expires=' + options.expires.toUTCString() : '', 29 | '; path=/', 30 | options.domain ? '; domain=' + options.domain : '', 31 | options.secure ? '; secure' : '' 32 | ].join('')) 33 | } 34 | 35 | // Key and possibly options given, get cookie 36 | options = value || {} 37 | 38 | decode = options.raw ? function (s) { return s } : decodeURIComponent 39 | 40 | return (result = new RegExp('(?:^|; )' + encodeURIComponent(key) + '=([^;]*)').exec(document.cookie)) ? decode(result[1]) : null 41 | }; 42 | 43 | // 返回上一页 44 | Vue.prototype.goBack = function(_this){ 45 | let path; 46 | try{ 47 | path = _this.$router._currentTransition.from.path; 48 | if(path){ 49 | if(path.match('member') && !$.localStorage.getItem('webapp_userInfo')){ 50 | _this.$router.replace('/cookbook/1') 51 | }else{ 52 | window.history.back(); 53 | } 54 | }else{ 55 | _this.$router.replace('/cookbook/1') 56 | } 57 | }catch (e){ 58 | console.log(e) 59 | _this.$router.replace('/cookbook/1') 60 | } 61 | }; 62 | 63 | // 判断设备环境 64 | Vue.prototype.$device = function(key){ 65 | return $.device[key]; 66 | }; 67 | 68 | // 简单封装本地存储 69 | $.localStorage = { 70 | getItem : function(key){ 71 | if (typeof localStorage === 'object') { 72 | try { 73 | return JSON.parse(localStorage.getItem(key)); 74 | } catch (e) { 75 | alert('本站无痕浏览模式,请关闭后再试!'); 76 | } 77 | } 78 | }, 79 | setItem : function(key,value){ 80 | if (typeof localStorage === 'object') { 81 | try { 82 | return localStorage.setItem(key,JSON.stringify(value)); 83 | } catch (e) { 84 | alert('请关闭[无痕浏览]模式后再试!'); 85 | } 86 | } 87 | }, 88 | removeItem : function(key){ 89 | if (typeof localStorage === 'object') { 90 | try { 91 | return localStorage.removeItem(key); 92 | } catch (e) { 93 | alert('请关闭[无痕浏览]模式后再试!'); 94 | } 95 | } 96 | }, 97 | getUseSize : function(){ 98 | if (typeof localStorage === 'object') { 99 | try { 100 | return JSON.stringify(localStorage).length; 101 | } catch (e) { 102 | alert('请关闭[无痕浏览]模式后再试!'); 103 | } 104 | } 105 | } 106 | }; 107 | 108 | //全局ajax设置 109 | $.ajaxSettings.timeout = 5000; 110 | 111 | $.ajaxSettings.complete = function(xhr, status){ 112 | //console.log('status=',status) 113 | if(status == 'abort'){ 114 | $.toast('请求失败'); 115 | }else if(status == 'timeout'){ 116 | $.toast('请求超时'); 117 | }else if(status == 'error'){ 118 | try { 119 | let error = JSON.parse(xhr.responseText); 120 | $.toast(error.message); 121 | }catch(e){ 122 | $.toast('服务器错误'); 123 | } 124 | } 125 | }; 126 | 127 | Date.prototype.Format = function (fmt) { //author: meizz 128 | var o = { 129 | "M+": this.getMonth() + 1, //月份 130 | "d+": this.getDate(), //日 131 | "H+": this.getHours(), //小时 132 | "m+": this.getMinutes(), //分 133 | "s+": this.getSeconds(), //秒 134 | "q+": Math.floor((this.getMonth() + 3) / 3), //季度 135 | "S": this.getMilliseconds() //毫秒 136 | }; 137 | if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); 138 | for (var k in o) 139 | if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); 140 | return fmt; 141 | } 142 | 143 | }; 144 | export default MyPlugin; -------------------------------------------------------------------------------- /server/typings/body-parser/body-parser.d.ts: -------------------------------------------------------------------------------- 1 | // Type definitions for body-parser 2 | // Project: http://expressjs.com 3 | // Definitions by: Santi Albo , VILIC VANE , Jonathan Häberle 4 | // Definitions: https://github.com/borisyankov/DefinitelyTyped 5 | 6 | /// 7 | 8 | declare module "body-parser" { 9 | import * as express from "express"; 10 | 11 | /** 12 | * bodyParser: use individual json/urlencoded middlewares 13 | * @deprecated 14 | */ 15 | 16 | function bodyParser(options?: { 17 | /** 18 | * if deflated bodies will be inflated. (default: true) 19 | */ 20 | inflate?: boolean; 21 | /** 22 | * maximum request body size. (default: '100kb') 23 | */ 24 | limit?: any; 25 | /** 26 | * function to verify body content, the parsing can be aborted by throwing an error. 27 | */ 28 | verify?: (req: express.Request, res: express.Response, buf: Buffer, encoding: string) => void; 29 | /** 30 | * only parse objects and arrays. (default: true) 31 | */ 32 | strict?: boolean; 33 | /** 34 | * passed to JSON.parse(). 35 | */ 36 | receiver?: (key: string, value: any) => any; 37 | /** 38 | * parse extended syntax with the qs module. (default: true) 39 | */ 40 | extended?: boolean; 41 | }): express.RequestHandler; 42 | 43 | module bodyParser { 44 | export function json(options?: { 45 | /** 46 | * if deflated bodies will be inflated. (default: true) 47 | */ 48 | inflate?: boolean; 49 | /** 50 | * maximum request body size. (default: '100kb') 51 | */ 52 | limit?: any; 53 | /** 54 | * request content-type to parse, passed directly to the type-is library. (default: 'json') 55 | */ 56 | type?: any; 57 | /** 58 | * function to verify body content, the parsing can be aborted by throwing an error. 59 | */ 60 | verify?: (req: express.Request, res: express.Response, buf: Buffer, encoding: string) => void; 61 | /** 62 | * only parse objects and arrays. (default: true) 63 | */ 64 | strict?: boolean; 65 | /** 66 | * passed to JSON.parse(). 67 | */ 68 | receiver?: (key: string, value: any) => any; 69 | }): express.RequestHandler; 70 | 71 | export function raw(options?: { 72 | /** 73 | * if deflated bodies will be inflated. (default: true) 74 | */ 75 | inflate?: boolean; 76 | /** 77 | * maximum request body size. (default: '100kb') 78 | */ 79 | limit?: any; 80 | /** 81 | * request content-type to parse, passed directly to the type-is library. (default: 'application/octet-stream') 82 | */ 83 | type?: any; 84 | /** 85 | * function to verify body content, the parsing can be aborted by throwing an error. 86 | */ 87 | verify?: (req: express.Request, res: express.Response, buf: Buffer, encoding: string) => void; 88 | }): express.RequestHandler; 89 | 90 | export function text(options?: { 91 | /** 92 | * if deflated bodies will be inflated. (default: true) 93 | */ 94 | inflate?: boolean; 95 | /** 96 | * maximum request body size. (default: '100kb') 97 | */ 98 | limit?: any; 99 | /** 100 | * request content-type to parse, passed directly to the type-is library. (default: 'text/plain') 101 | */ 102 | type?: any; 103 | /** 104 | * function to verify body content, the parsing can be aborted by throwing an error. 105 | */ 106 | verify?: (req: express.Request, res: express.Response, buf: Buffer, encoding: string) => void; 107 | /** 108 | * the default charset to parse as, if not specified in content-type. (default: 'utf-8') 109 | */ 110 | defaultCharset?: string; 111 | }): express.RequestHandler; 112 | 113 | export function urlencoded(options?: { 114 | /** 115 | * if deflated bodies will be inflated. (default: true) 116 | */ 117 | inflate?: boolean; 118 | /** 119 | * maximum request body size. (default: '100kb') 120 | */ 121 | limit?: any; 122 | /** 123 | * request content-type to parse, passed directly to the type-is library. (default: 'urlencoded') 124 | */ 125 | type?: any; 126 | /** 127 | * function to verify body content, the parsing can be aborted by throwing an error. 128 | */ 129 | verify?: (req: express.Request, res: express.Response, buf: Buffer, encoding: string) => void; 130 | /** 131 | * parse extended syntax with the qs module. (default: true) 132 | */ 133 | extended?: boolean; 134 | }): express.RequestHandler; 135 | } 136 | 137 | export = bodyParser; 138 | } -------------------------------------------------------------------------------- /__build__/1.0ce212e3.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([1],[,,,,,,,function(o,t,e){"use strict";function i(o){return o&&o.__esModule?o:{"default":o}}Object.defineProperty(t,"__esModule",{value:!0});var s=e(2),n=i(s),a=e(8),c=i(a);e(9);var l=e(10),r=i(l),d=e(11),u=i(d),f=e(13),m=i(f),k=n["default"].extend({template:c["default"],ready:function(){var o=this,t=!1;$(".infinite-scroll-bottom").on("infinite",function(){t||(t=!0,m["default"].getCookbookList(o.id,o.page).then(function(e){o.page+=1;for(var i=0;i<=e.tngou.length;i++)e.tngou[i]&&o.cookbookItems.push(e.tngou[i]);-1==o.maxItems&&(o.maxItems=e.total),t=!1})["catch"](function(){console.error("出错啦")})["finally"](function(){o.isShowLoad||($.detachInfiniteScroll($(".infinite-scroll")),$(".infinite-scroll-preloader").remove())}))}),$(".pull-to-refresh-content").on("refresh",function(){t||(t=!0,o.page=1,m["default"].getCookbookList(o.id,o.page).then(function(e){o.page+=1,o.updateTime=(new Date).getTime(),o.cookbookItems=e.tngou,o.maxItems>0&&(o.maxItems=e.total),t=!1,$.pullToRefreshDone(".pull-to-refresh-content")})["catch"](function(){console.error("出错啦"),$.pullToRefreshDone(".pull-to-refresh-content")}))}),$.init(),setTimeout(function(){o.scrollTabBtn(o.id)},300)},data:function(){return r["default"]},methods:{goCookbook:function(o){this.$router.go("/cookbook/"+o),this.scrollTabBtn(o)},goCookbookDetail:function(o){this.$router.go("/cookbookDetail/"+o)},goBack:function(){this.$router.go("/cookbook/1")},goRoute:function(o){$("body").removeClass("with-panel-left-reveal"),this.$router.go(o)},openPanel:function(o){$.openPanel("#"+o)},scrollTabBtn:function(o){var t=o,e=$(".button.class_"+t),i=e[0];if(0!=e.length){var s=i.offsetLeft-i.parentNode.offsetLeft,n=$("#class_tab")?$("#class_tab")[0].scrollLeft:0;if($.device.android&&$.device.isWeixin)$("#class_tab").scrollLeft(s-50);else if(0>n-s)for(var a=function(o){!function(){setTimeout(function(){$("#class_tab").scrollLeft(Math.abs(n+(s-n)/50*o)-o)},5*o)}()},c=0;50>c;c++)a(c);else for(var l=function(o){!function(){setTimeout(function(){$("#class_tab").scrollLeft(s-(n-s)/50*o-o)},5*o)}()},r=0;50>r;r++)l(r)}}},computed:{isShowLoad:function(){return!this.maxItems||!this.cookbookItems||this.maxItems>this.cookbookItems.length}},route:{data:function(o){var t=this;this.title="菜谱列表","string"==typeof localStorage.getItem("cookbook_classes")&&(this.cookbookClasses=JSON.parse(localStorage.getItem("cookbook_classes"))),window.cm_cookbookItems&&window.cm_cookbookItems.id==o.to.params.id&&(console.log("应该只进入一次"),this.$data=window.cm_cookbookItems,$.localStorage.setItem("cookbook_list_"+o.to.params.id,{id:o.to.params.id,updateTime:(new Date).getTime(),page:2,cookbookItems:window.cm_cookbookItems.cookbookItems,maxItems:window.cm_cookbookItems.maxItems}),window.cm_cookbookItems=null);var e=$.localStorage.getItem("cookbook_list_"+o.to.params.id);this.id==o.to.params.id?setTimeout(function(){$(".content").scrollTop(t.scrollTop)}):e&&e.cookbookItems.length>=10?(this.id=e.id,this.page=e.page,this.cookbookItems=e.cookbookItems,this.maxItems=e.maxItems,this.updateTime=e.updateTime):!function(){$.showIndicator();var e=o.to.params.id,i=[m["default"].getCookbookList(e,1)];"string"!=typeof localStorage.getItem("cookbook_classes")&&i.push(m["default"].getCookbookClass()),u["default"].all(i).then(function(i){var s=i[0];s.status?(t.id=e,t.page=2,t.cookbookItems=s.tngou,t.maxItems=s.total):o.abort(),i.length>1&&(t.cookbookClasses=i[1].tngou)})["catch"](function(o){$.toast("操作失败")})["finally"](function(){$.hideIndicator()}),o.next()}()},canReuse:!0,activate:function(o){var t=this;window.cm_cookbookItems&&(this.cookbookClasses=window.cm_cookbookItems.cookbookClasses),!this.cookbookClasses.length>0&&m["default"].getCookbookClass().then(function(o){o.length>0&&(t.cookbookClasses=o.tngou)}),o.next()},deactivate:function(o){o.next()}}});t["default"]=k},function(o,t){o.exports='
\n \n
\n

菜谱demo

\n
\n\n \n \n\n\n
\n \n
\n
\n
\n
{{updateTime | time-diff}}前更新过
\n
\n\n
\n \n
\n
\n
\n
\n
    \n
  • \n
    \n \n
    \n
    \n
    \n
    {{item.name}}
    \n
    \n
    {{item.food}}
    \n
    \n
  • \n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n\n
'},function(o,t){},function(o,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var e={cookbookClasses:[],id:0,page:1,title:"菜谱列表",cookbookItems:[],maxItems:-1,updateTime:"",valOptions:[]};t["default"]=e},,,function(o,t,e){"use strict";function i(o){return o&&o.__esModule?o:{"default":o}}function s(o,t){return l["default"].Promise(function(e,i){$.ajax({type:"GET",url:"http://apis.baidu.com/tngou/cook/list",data:{id:o,page:t},headers:{apikey:"a369f43a6392605426433831e10765ec"},success:function(s){if(s.status){if(1==t)localStorage.setItem("cookbook_list_"+o,JSON.stringify({id:o,updateTime:(new Date).getTime(),page:2,cookbookItems:s.tngou,maxItems:s.total}));else{for(var n=JSON.parse(localStorage.getItem("cookbook_list_"+o)),a=0;a, bonnici , Bart van der Schoor , Joe Skeen 4 | // Definitions: https://github.com/borisyankov/DefinitelyTyped 5 | 6 | // Imported from: https://github.com/soywiz/typescript-node-definitions/d.ts 7 | 8 | /// 9 | /// 10 | 11 | declare module 'request' { 12 | import stream = require('stream'); 13 | import http = require('http'); 14 | import FormData = require('form-data'); 15 | import url = require('url'); 16 | import fs = require('fs'); 17 | 18 | namespace request { 19 | export interface RequestAPI { 20 | defaults(options: TOptions): RequestAPI; 21 | (uri: string, options?: TOptions, callback?: RequestCallback): TRequest; 22 | (uri: string, callback?: RequestCallback): TRequest; 23 | (options?: RequiredOptions & TOptions, callback?: RequestCallback): TRequest; 24 | 25 | get(uri: string, options?: TOptions, callback?: RequestCallback): TRequest; 26 | get(uri: string, callback?: RequestCallback): TRequest; 27 | get(options: RequiredOptions & TOptions, callback?: RequestCallback): TRequest; 28 | 29 | post(uri: string, options?: TOptions, callback?: RequestCallback): TRequest; 30 | post(uri: string, callback?: RequestCallback): TRequest; 31 | post(options: RequiredOptions & TOptions, callback?: RequestCallback): TRequest; 32 | 33 | put(uri: string, options?: TOptions, callback?: RequestCallback): TRequest; 34 | put(uri: string, callback?: RequestCallback): TRequest; 35 | put(options: RequiredOptions & TOptions, callback?: RequestCallback): TRequest; 36 | 37 | head(uri: string, options?: TOptions, callback?: RequestCallback): TRequest; 38 | head(uri: string, callback?: RequestCallback): TRequest; 39 | head(options: RequiredOptions & TOptions, callback?: RequestCallback): TRequest; 40 | 41 | patch(uri: string, options?: TOptions, callback?: RequestCallback): TRequest; 42 | patch(uri: string, callback?: RequestCallback): TRequest; 43 | patch(options: RequiredOptions & TOptions, callback?: RequestCallback): TRequest; 44 | 45 | del(uri: string, options?: TOptions, callback?: RequestCallback): TRequest; 46 | del(uri: string, callback?: RequestCallback): TRequest; 47 | del(options: RequiredOptions & TOptions, callback?: RequestCallback): TRequest; 48 | 49 | forever(agentOptions: any, optionsArg: any): TRequest; 50 | jar(): CookieJar; 51 | cookie(str: string): Cookie; 52 | 53 | initParams: any; 54 | debug: boolean; 55 | } 56 | 57 | interface UriOptions { 58 | uri: string; 59 | } 60 | 61 | interface UrlOptions { 62 | url: string; 63 | } 64 | 65 | interface OptionalOptions { 66 | callback?: (error: any, response: http.IncomingMessage, body: any) => void; 67 | jar?: any; // CookieJar 68 | formData?: any; // Object 69 | form?: any; // Object or string 70 | auth?: AuthOptions; 71 | oauth?: OAuthOptions; 72 | aws?: AWSOptions; 73 | hawk?: HawkOptions; 74 | qs?: any; 75 | json?: any; 76 | multipart?: RequestPart[] | Multipart; 77 | agentOptions?: any; 78 | agentClass?: any; 79 | forever?: any; 80 | host?: string; 81 | port?: number; 82 | method?: string; 83 | headers?: Headers; 84 | body?: any; 85 | followRedirect?: boolean | ((response: http.IncomingMessage) => boolean); 86 | followAllRedirects?: boolean; 87 | maxRedirects?: number; 88 | encoding?: string; 89 | pool?: any; 90 | timeout?: number; 91 | proxy?: any; 92 | strictSSL?: boolean; 93 | gzip?: boolean; 94 | preambleCRLF?: boolean; 95 | postambleCRLF?: boolean; 96 | key?: Buffer; 97 | cert?: Buffer; 98 | passphrase?: string; 99 | ca?: Buffer; 100 | har?: HttpArchiveRequest; 101 | } 102 | 103 | export type RequiredOptions = UriOptions | UrlOptions; 104 | export type Options = RequiredOptions & OptionalOptions; 105 | 106 | export interface RequestCallback { 107 | (error: any, response: http.IncomingMessage, body: any): void; 108 | } 109 | 110 | export interface HttpArchiveRequest { 111 | url?: string; 112 | method?: string; 113 | headers?: NameValuePair[]; 114 | postData?: { 115 | mimeType?: string; 116 | params?: NameValuePair[]; 117 | } 118 | } 119 | 120 | export interface NameValuePair { 121 | name: string; 122 | value: string; 123 | } 124 | 125 | export interface Multipart { 126 | chunked?: boolean; 127 | data?: { 128 | 'content-type'?: string, 129 | body: string 130 | }[]; 131 | } 132 | 133 | export interface RequestPart { 134 | headers?: Headers; 135 | body: any; 136 | } 137 | 138 | export interface Request extends stream.Stream { 139 | readable: boolean; 140 | writable: boolean; 141 | 142 | getAgent(): http.Agent; 143 | //start(): void; 144 | //abort(): void; 145 | pipeDest(dest: any): void; 146 | setHeader(name: string, value: string, clobber?: boolean): Request; 147 | setHeaders(headers: Headers): Request; 148 | qs(q: Object, clobber?: boolean): Request; 149 | form(): FormData.FormData; 150 | form(form: any): Request; 151 | multipart(multipart: RequestPart[]): Request; 152 | json(val: any): Request; 153 | aws(opts: AWSOptions, now?: boolean): Request; 154 | auth(username: string, password: string, sendInmediately?: boolean, bearer?: string): Request; 155 | oauth(oauth: OAuthOptions): Request; 156 | jar(jar: CookieJar): Request; 157 | 158 | on(event: string, listener: Function): Request; 159 | 160 | write(buffer: Buffer, cb?: Function): boolean; 161 | write(str: string, cb?: Function): boolean; 162 | write(str: string, encoding: string, cb?: Function): boolean; 163 | write(str: string, encoding?: string, fd?: string): boolean; 164 | end(): void; 165 | end(chunk: Buffer, cb?: Function): void; 166 | end(chunk: string, cb?: Function): void; 167 | end(chunk: string, encoding: string, cb?: Function): void; 168 | pause(): void; 169 | resume(): void; 170 | abort(): void; 171 | destroy(): void; 172 | toJSON(): Object; 173 | } 174 | 175 | export interface Headers { 176 | [key: string]: any; 177 | } 178 | 179 | export interface AuthOptions { 180 | user?: string; 181 | username?: string; 182 | pass?: string; 183 | password?: string; 184 | sendImmediately?: boolean; 185 | bearer?: string; 186 | } 187 | 188 | export interface OAuthOptions { 189 | callback?: string; 190 | consumer_key?: string; 191 | consumer_secret?: string; 192 | token?: string; 193 | token_secret?: string; 194 | verifier?: string; 195 | } 196 | 197 | export interface HawkOptions { 198 | credentials: any; 199 | } 200 | 201 | export interface AWSOptions { 202 | secret: string; 203 | bucket?: string; 204 | } 205 | 206 | export interface CookieJar { 207 | setCookie(cookie: Cookie, uri: string | url.Url, options?: any): void 208 | getCookieString(uri: string | url.Url): string 209 | getCookies(uri: string | url.Url): Cookie[] 210 | } 211 | 212 | export interface CookieValue { 213 | name: string; 214 | value: any; 215 | httpOnly: boolean; 216 | } 217 | 218 | export interface Cookie extends Array { 219 | constructor(name: string, req: Request): void; 220 | str: string; 221 | expires: Date; 222 | path: string; 223 | toString(): string; 224 | } 225 | } 226 | var request: request.RequestAPI; 227 | export = request; 228 | } 229 | -------------------------------------------------------------------------------- /client/com.chezhil.cookbook/states/cookbook-list/route.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | import Vue from 'vue' 3 | import Tpl from './template.html' 4 | import './style.css' 5 | import value from './value' 6 | import Q from 'q' 7 | import cookbookService from '../../service/cookbook.service' 8 | 9 | let Index = Vue.extend({ 10 | //replace : true, //必须注释掉 不然动画失效 11 | template : Tpl, 12 | ready : function(){ //做浏览器判断 和 兼容 13 | let loading = false; 14 | //$('#class_tab').attr('data-offset',$('header.bar.bar-nav')[0].offsetHeight-1) 15 | //绑定无限滚动事件 16 | $('.infinite-scroll-bottom').on('infinite',()=>{ 17 | if(loading){ return; } 18 | loading = true; 19 | 20 | cookbookService.getCookbookList(this.id,this.page).then((data)=>{ 21 | this.page += 1; 22 | for(let i=0;i<=data.tngou.length;i++){ 23 | if(data.tngou[i]){ 24 | this.cookbookItems.push(data.tngou[i]) 25 | } 26 | } 27 | if(this.maxItems == -1){ 28 | this.maxItems = data.total; 29 | } 30 | loading = false; 31 | }).catch(()=>{ 32 | console.error('出错啦'); 33 | }).finally(()=>{ 34 | if(!this.isShowLoad){ 35 | //解绑无限加载事件 36 | $.detachInfiniteScroll($('.infinite-scroll')); 37 | // 删除加载提示符 38 | $('.infinite-scroll-preloader').remove(); 39 | } 40 | }) 41 | 42 | }); 43 | 44 | //绑定下拉刷新事件 45 | $('.pull-to-refresh-content').on('refresh',()=>{ 46 | if(loading){ return; } 47 | loading = true; 48 | 49 | this.page = 1; 50 | cookbookService.getCookbookList(this.id,this.page).then((data)=>{ 51 | this.page += 1; 52 | this.updateTime = new Date().getTime(); 53 | this.cookbookItems = data.tngou; 54 | if(this.maxItems > 0){ 55 | this.maxItems = data.total; 56 | } 57 | loading = false; 58 | // 加载完毕需要重置 59 | $.pullToRefreshDone('.pull-to-refresh-content'); 60 | }).catch(()=>{ 61 | console.error('出错啦'); 62 | //加载完毕需要重置 63 | $.pullToRefreshDone('.pull-to-refresh-content'); 64 | }) 65 | }); 66 | 67 | //需要初始化一下,不然监听不到infinite事件 68 | $.init(); 69 | 70 | setTimeout(()=>{ 71 | this.scrollTabBtn(this.id); 72 | },3e2); 73 | 74 | }, 75 | data : ()=>{ 76 | return value 77 | }, 78 | methods: { 79 | goCookbook(id){ 80 | this.$router.go('/cookbook/'+id); 81 | this.scrollTabBtn(id); 82 | }, 83 | goCookbookDetail(id){ 84 | this.$router.go('/cookbookDetail/'+id); 85 | }, 86 | goBack(){ 87 | this.$router.go('/cookbook/1'); 88 | }, 89 | goRoute(route){ 90 | //$.closePanel(); 91 | $('body').removeClass('with-panel-left-reveal'); 92 | //setTimeout(()=>{ 93 | this.$router.go(route); 94 | //},5e2) 95 | }, 96 | openPanel(panel_id){ 97 | $.openPanel('#'+panel_id) 98 | }, 99 | scrollTabBtn(id){ 100 | let class_id = id; 101 | let $el = $('.button.class_'+class_id); 102 | let el = $el[0]; 103 | if($el.length == 0 ){ 104 | return; 105 | } 106 | 107 | let scrollLeft = el.offsetLeft - el.parentNode.offsetLeft; 108 | let scrollLeft_active = $('#class_tab')?$('#class_tab')[0].scrollLeft:0; 109 | 110 | 111 | if($.device.android && $.device.isWeixin){ 112 | $('#class_tab').scrollLeft(scrollLeft-50); 113 | }else{ 114 | if(scrollLeft_active - scrollLeft < 0){ 115 | for(let i=0;i<50;i++){ 116 | (function(){ 117 | setTimeout(()=>{ 118 | $('#class_tab').scrollLeft(Math.abs(scrollLeft_active+(scrollLeft-scrollLeft_active)/50*i)-i); 119 | },5*i) 120 | })() 121 | } 122 | }else{ 123 | for(let i=0;i<50;i++){ 124 | (function(){ 125 | setTimeout(()=>{ 126 | $('#class_tab').scrollLeft(scrollLeft-(scrollLeft_active-scrollLeft)/50*i-i); 127 | },5*i) 128 | })() 129 | } 130 | } 131 | } 132 | 133 | } 134 | }, 135 | computed : { 136 | isShowLoad : function(){ 137 | return (!this.maxItems || !this.cookbookItems || this.maxItems > this.cookbookItems.length); 138 | } 139 | }, 140 | route : { 141 | data : function(transition){ 142 | this.title = '菜谱列表'; 143 | 144 | if(typeof localStorage.getItem('cookbook_classes') == 'string'){ 145 | this.cookbookClasses = JSON.parse(localStorage.getItem('cookbook_classes')); 146 | } 147 | //如果是服务端渲染的,应该设置全局变量,那么客户端就不用异步请求数据了 148 | if(window.cm_cookbookItems && window.cm_cookbookItems.id == transition.to.params.id){ 149 | console.log('应该只进入一次'); 150 | this.$data = window.cm_cookbookItems; 151 | $.localStorage.setItem('cookbook_list_'+transition.to.params.id,{ 152 | id : transition.to.params.id, 153 | updateTime : new Date().getTime(), 154 | page : 2, 155 | cookbookItems : window.cm_cookbookItems.cookbookItems, 156 | maxItems : window.cm_cookbookItems.maxItems 157 | }); 158 | window.cm_cookbookItems = null; 159 | } 160 | let cookbook = $.localStorage.getItem('cookbook_list_'+transition.to.params.id); 161 | //缓存里面还有数据 162 | if(this.id == transition.to.params.id){ 163 | setTimeout(()=>{ 164 | $('.content').scrollTop(this.scrollTop); 165 | }); 166 | } 167 | else if(cookbook && cookbook.cookbookItems.length >= 10){ 168 | //本地如果有数据的话拿本地数据 169 | this.id = cookbook.id; 170 | this.page = cookbook.page; 171 | this.cookbookItems = cookbook.cookbookItems; 172 | this.maxItems = cookbook.maxItems; 173 | this.updateTime = cookbook.updateTime; 174 | 175 | } 176 | else{ 177 | $.showIndicator() 178 | //没有本地数据再去请求数据 179 | let qa_id = transition.to.params.id; 180 | 181 | let promise = [ 182 | cookbookService.getCookbookList(qa_id,1) 183 | ]; 184 | if(typeof localStorage.getItem('cookbook_classes') != 'string'){ 185 | promise.push(cookbookService.getCookbookClass()); 186 | } 187 | 188 | Q.all(promise).then((data)=>{ 189 | let data0 = data[0]; 190 | if(data0.status){ 191 | this.id = qa_id; 192 | this.page = 2; 193 | this.cookbookItems = data0.tngou; 194 | this.maxItems = data0.total; 195 | }else{ 196 | transition.abort(); 197 | } 198 | if(data.length > 1){ 199 | this.cookbookClasses = data[1].tngou; 200 | } 201 | }).catch((e)=>{ 202 | $.toast("操作失败"); 203 | }).finally(()=>{ 204 | $.hideIndicator() 205 | }) 206 | 207 | transition.next(); 208 | } 209 | }, 210 | canReuse: true, //可以被重用,跳转到其他cookbook/? 页面时触发. 设置为True跳转失败会无限跳转 211 | activate : function(transition){ 212 | if(window.cm_cookbookItems){ 213 | this.cookbookClasses = window.cm_cookbookItems.cookbookClasses; 214 | } 215 | if(!this.cookbookClasses.length > 0){ 216 | cookbookService.getCookbookClass().then((data)=>{ 217 | if(data.length > 0){ 218 | this.cookbookClasses = data.tngou; 219 | } 220 | }) 221 | } 222 | transition.next(); 223 | }, 224 | deactivate: function(transition){ 225 | transition.next(); 226 | } 227 | } 228 | }) 229 | 230 | export default Index -------------------------------------------------------------------------------- /__build__/2.09f6781b.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///2.09f6781b.js","webpack:///./client/com.chezhil.cookbook/service/cookbook.service.js?e793","webpack:///./client/com.chezhil.cookbook/states/cookbook/route.js","webpack:///./client/com.chezhil.cookbook/states/cookbook/template.html"],"names":["webpackJsonp",13,"module","exports","__webpack_require__","_interopRequireDefault","obj","__esModule","default","getCookbookList","id","page","_q2","Promise","_success","_error","$","ajax","type","url","data","headers","apikey","success","response","status","localStorage","setItem","JSON","stringify","updateTime","Date","getTime","cookbookItems","tngou","maxItems","total","oldValue","parse","getItem","i","length","push","error","xhr","getCookbookClass","_success2","_error2","classes","errorType","getCookbookDetail","_success3","_error3","Object","defineProperty","value","_q","cookbookService",14,"_vue","_vue2","_template","_template2","_cookbook","_cookbook2","Index","extend","template","ready","cookbookDetail","img","methods","goBack","from","this","$route","router","_currentTransition","path","$router","go","e","route","transition","_this","window","cm_cookbookDetail","to","params","$data","next","qa_id","showIndicator","then","abort","hideIndicator",15],"mappings":"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","file":"2.09f6781b.js","sourcesContent":["webpackJsonp([2],{\n\n/***/ 13:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _q = __webpack_require__(11);\n\t\n\tvar _q2 = _interopRequireDefault(_q);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction getCookbookList(id, page) {\n\t return _q2.default.Promise(function (_success, _error) {\n\t $.ajax({\n\t type: 'GET',\n\t url: 'http://apis.baidu.com/tngou/cook/list',\n\t data: {\n\t id: id,\n\t page: page\n\t },\n\t headers: {\n\t apikey: 'a369f43a6392605426433831e10765ec'\n\t },\n\t success: function success(response) {\n\t if (response.status) {\n\t //拿第一页的时候保存到本地\n\t if (page == 1) {\n\t localStorage.setItem('cookbook_list_' + id, JSON.stringify({\n\t id: id,\n\t updateTime: new Date().getTime(),\n\t page: 2,\n\t cookbookItems: response.tngou,\n\t maxItems: response.total\n\t }));\n\t } else {\n\t var oldValue = JSON.parse(localStorage.getItem('cookbook_list_' + id));\n\t for (var i = 0; i < response.tngou.length; i++) {\n\t oldValue.cookbookItems.push(response.tngou[i]);\n\t }\n\t oldValue.page = ++page;\n\t oldValue.maxItems = response.total;\n\t localStorage.setItem('cookbook_list_' + id, JSON.stringify(oldValue));\n\t }\n\t _success(response);\n\t } else {\n\t _error('请求失败');\n\t }\n\t },\n\t error: function error(xhr) {\n\t _error('请求失败');\n\t }\n\t });\n\t });\n\t}\n\t\n\tfunction getCookbookClass() {\n\t\n\t return _q2.default.Promise(function (_success2, _error2) {\n\t\n\t var classes = $.localStorage.getItem('cookbook_classes');\n\t if (classes) {\n\t _success2(classes);\n\t } else {\n\t $.ajax({\n\t type: 'GET',\n\t url: 'http://apis.baidu.com/tngou/cook/classify',\n\t data: {\n\t id: 0\n\t },\n\t headers: {\n\t apikey: 'a369f43a6392605426433831e10765ec'\n\t },\n\t success: function success(response) {\n\t if (response.status) {\n\t localStorage.setItem('cookbook_classes', JSON.stringify(response.tngou));\n\t _success2(response);\n\t } else {\n\t _error2('请求失败!');\n\t }\n\t },\n\t error: function error(xhr, errorType) {\n\t _error2('请求失败');\n\t }\n\t });\n\t }\n\t });\n\t}\n\t\n\tfunction getCookbookDetail(id) {\n\t return _q2.default.Promise(function (_success3, _error3) {\n\t $.ajax({\n\t type: 'GET',\n\t url: 'http://apis.baidu.com/tngou/cook/show',\n\t data: {\n\t id: id\n\t },\n\t headers: {\n\t apikey: 'a369f43a6392605426433831e10765ec'\n\t },\n\t success: function success(response) {\n\t if (response.status) {\n\t _success3(response);\n\t } else {\n\t _error3('请求失败');\n\t }\n\t },\n\t error: function error(xhr, errorType) {\n\t _error3('请求失败');\n\t }\n\t });\n\t });\n\t}\n\tvar cookbookService = {\n\t getCookbookList: getCookbookList,\n\t getCookbookClass: getCookbookClass,\n\t getCookbookDetail: getCookbookDetail\n\t};\n\t\n\texports.default = cookbookService;\n\n/***/ },\n\n/***/ 14:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _vue = __webpack_require__(2);\n\t\n\tvar _vue2 = _interopRequireDefault(_vue);\n\t\n\tvar _template = __webpack_require__(15);\n\t\n\tvar _template2 = _interopRequireDefault(_template);\n\t\n\tvar _cookbook = __webpack_require__(13);\n\t\n\tvar _cookbook2 = _interopRequireDefault(_cookbook);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar Index = _vue2.default.extend({\n\t //replace : false, //必须注释掉 不然动画失效\n\t template: _template2.default,\n\t ready: function ready() {},\n\t data: function data() {\n\t return {\n\t cookbookDetail: {\n\t img: ''\n\t }\n\t };\n\t },\n\t methods: {\n\t goBack: function goBack() {\n\t try {\n\t var from = this.$route.router._currentTransition.from;\n\t if (typeof from.path != 'undefined') {\n\t this.$router.go(from.path);\n\t } else {\n\t this.$router.go('cookbook/1');\n\t }\n\t } catch (e) {\n\t this.$router.go('cookbook/1');\n\t }\n\t }\n\t },\n\t route: {\n\t data: function data(transition) {\n\t var _this = this;\n\t\n\t //如果是服务端渲染的,应该设置全局变量,那么客户端就不用异步请求数据了\n\t if (window.cm_cookbookDetail && window.cm_cookbookDetail.id == transition.to.params.id) {\n\t this.$data = {\n\t cookbookDetail: window.cm_cookbookDetail\n\t };\n\t transition.next();\n\t } else {\n\t var qa_id = transition.to.params.id;\n\t $.showIndicator();\n\t _cookbook2.default.getCookbookDetail(qa_id).then(function (response) {\n\t if (response.status) {\n\t _this.$data = {\n\t cookbookDetail: response\n\t };\n\t transition.next();\n\t } else {\n\t transition.abort();\n\t }\n\t }).catch(function () {\n\t transition.abort();\n\t }).finally(function () {\n\t $.hideIndicator();\n\t });\n\t }\n\t }\n\t }\n\t});\n\t\n\texports.default = Index;\n\n/***/ },\n\n/***/ 15:\n/***/ function(module, exports) {\n\n\tmodule.exports = \"
\\n \\n
\\n \\n

{{cookbookDetail.name}}

\\n
\\n\\n \\n
\\n
\\n

\\n {{{cookbookDetail.message}}}\\n
\\n
\\n
\"\n\n/***/ }\n\n});\n\n\n/** WEBPACK FOOTER **\n ** 2.09f6781b.js\n **/","'use strict';\nimport Q from 'q'\n\nfunction getCookbookList(id,page){\n return Q.Promise((success,error)=>{\n $.ajax({\n type : 'GET',\n url : 'http://apis.baidu.com/tngou/cook/list',\n data : {\n id : id ,\n page : page\n },\n headers : {\n apikey : 'a369f43a6392605426433831e10765ec'\n },\n success : function(response){\n if(response.status){\n //拿第一页的时候保存到本地\n if(page == 1){\n localStorage.setItem('cookbook_list_'+id,JSON.stringify({\n id : id,\n updateTime : new Date().getTime(),\n page : 2,\n cookbookItems : response.tngou,\n maxItems : response.total\n }));\n }else{\n let oldValue = JSON.parse(localStorage.getItem('cookbook_list_'+id));\n for(let i=0;i{\n \n let classes = $.localStorage.getItem('cookbook_classes')\n if(classes){\n success(classes);\n }else{\n $.ajax({\n type : 'GET',\n url : 'http://apis.baidu.com/tngou/cook/classify',\n data : {\n id : 0\n },\n headers : {\n apikey : 'a369f43a6392605426433831e10765ec'\n },\n success : function(response){\n if(response.status){\n localStorage.setItem('cookbook_classes',JSON.stringify(response.tngou));\n success(response)\n }else{\n error('请求失败!')\n }\n },\n error : function(xhr, errorType){\n error('请求失败')\n }\n });\n\n }\n \n })\n}\n\nfunction getCookbookDetail(id){\n return Q.Promise((success,error)=>{\n $.ajax({\n type : 'GET',\n url : 'http://apis.baidu.com/tngou/cook/show',\n data : {\n id : id\n },\n headers : {\n apikey : 'a369f43a6392605426433831e10765ec'\n },\n success : function(response){\n if(response.status){\n success(response)\n }else{\n error('请求失败')\n }\n },\n error : function(xhr, errorType){\n error('请求失败')\n }\n });\n })\n}\nlet cookbookService = {\n getCookbookList : getCookbookList,\n getCookbookClass : getCookbookClass,\n getCookbookDetail: getCookbookDetail\n};\n\nexport default cookbookService;\n\n\n/** WEBPACK FOOTER **\n ** ./client/com.chezhil.cookbook/service/cookbook.service.js\n **/","'use strict';\nimport Vue from 'vue'\nimport Tpl from './template.html'\nimport cookbookService from '../../service/cookbook.service'\n\nlet Index = Vue.extend({\n //replace : false, //必须注释掉 不然动画失效\n template : Tpl,\n ready : function(){\n \n },\n data : ()=>{\n return {\n cookbookDetail : {\n img : '',\n }\n }\n },\n methods: {\n goBack(){\n try{\n let from = this.$route.router._currentTransition.from\n if(typeof from.path != 'undefined'){\n this.$router.go(from.path);\n }else{\n this.$router.go('cookbook/1');\n }\n }catch(e){\n this.$router.go('cookbook/1');\n }\n }\n },\n route : {\n data : function(transition){\n //如果是服务端渲染的,应该设置全局变量,那么客户端就不用异步请求数据了\n if(window.cm_cookbookDetail && window.cm_cookbookDetail.id == transition.to.params.id){\n this.$data = {\n cookbookDetail:window.cm_cookbookDetail\n };\n transition.next();\n }else{\n let qa_id = transition.to.params.id;\n $.showIndicator()\n cookbookService.getCookbookDetail(qa_id).then((response)=>{\n if(response.status){\n this.$data = {\n cookbookDetail : response\n };\n transition.next();\n }else{\n transition.abort();\n }\n }).catch(()=>{\n transition.abort();\n }).finally(()=>{\n $.hideIndicator();\n })\n }\n }\n }\n})\n\nexport default Index\n\n\n/** WEBPACK FOOTER **\n ** ./client/com.chezhil.cookbook/states/cookbook/route.js\n **/","module.exports = \"
\\n \\n
\\n \\n

{{cookbookDetail.name}}

\\n
\\n\\n \\n
\\n
\\n

\\n {{{cookbookDetail.message}}}\\n
\\n
\\n
\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./client/com.chezhil.cookbook/states/cookbook/template.html\n ** module id = 15\n ** module chunks = 2\n **/"],"sourceRoot":""} -------------------------------------------------------------------------------- /__build__/app.24b5d33b.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///app.24b5d33b.js","webpack:///./client/com.chezhil.cookbook/main.js","webpack:///./client/lib/cm-plugin.js","webpack:///./client/filter/date.filter.js"],"names":["webpackJsonp","module","exports","__webpack_require__","_interopRequireDefault","obj","__esModule","default","_vue","_vue2","_vueRouter","_vueRouter2","_cmPlugin","_cmPlugin2","_date","_date2","use","router","history","saveScrollPosition","map","/cookbook/:id","component","resolve","e","route","/cookbookDetail/:id","redirect","*","App","extend","start","console","log","JSON","stringify","localStorage","length","Object","defineProperty","value","_typeof","Symbol","iterator","constructor","MyPlugin","install","Vue","option","cookie","key","options","days","time","result","decode","arguments","String","$","undefined","expires","Date","setTime","getTime","document","encodeURIComponent","raw","toUTCString","domain","secure","join","s","decodeURIComponent","RegExp","exec","prototype","goBack","_this","path","$router","_currentTransition","from","match","getItem","replace","window","back","$device","device","parse","alert","setItem","removeItem","getUseSize","ajaxSettings","timeout","complete","xhr","status","toast","error","responseText","message","Format","fmt","o","M+","this","getMonth","d+","getDate","H+","getHours","m+","getMinutes","s+","getSeconds","q+","Math","floor","S","getMilliseconds","test","$1","getFullYear","substr","k","default_1","filter","dateTime","date1","date2","date3","leave1","hours","leave2","minutes","leave3","seconds","round"],"mappings":"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","file":"app.24b5d33b.js","sourcesContent":["webpackJsonp([0],[\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t__webpack_require__(1);\n\t\n\tvar _vue = __webpack_require__(2);\n\t\n\tvar _vue2 = _interopRequireDefault(_vue);\n\t\n\tvar _vueRouter = __webpack_require__(4);\n\t\n\tvar _vueRouter2 = _interopRequireDefault(_vueRouter);\n\t\n\tvar _cmPlugin = __webpack_require__(5);\n\t\n\tvar _cmPlugin2 = _interopRequireDefault(_cmPlugin);\n\t\n\tvar _date = __webpack_require__(6);\n\t\n\tvar _date2 = _interopRequireDefault(_date);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t//Vue.config.debug = true;\n\t//Vue.config.silent = true;//取消 Vue.js 所有的日志与警告。\n\t_vue2.default.use(_vueRouter2.default);\n\t_vue2.default.use(_cmPlugin2.default);\n\t\n\t(0, _date2.default)(_vue2.default); //定义过滤器\n\t\n\tvar router = new _vueRouter2.default({\n\t history: true, //html5模式 去掉锚点\n\t saveScrollPosition: true //记住页面的滚动位置 html5模式适用\n\t});\n\t\n\t//定义路由\n\trouter.map({\n\t '/cookbook/:id': {\n\t component: function component(resolve) {\n\t //webpack自带功能 实现异步加载路由\n\t __webpack_require__.e/* nsure */(1, function () {\n\t var route = __webpack_require__(7).default;\n\t resolve(route);\n\t });\n\t }\n\t },\n\t '/cookbookDetail/:id': {\n\t component: function component(resolve) {\n\t //webpack自带功能 实现异步加载路由\n\t __webpack_require__.e/* nsure */(2, function () {\n\t var route = __webpack_require__(14).default;\n\t resolve(route);\n\t });\n\t }\n\t }\n\t});\n\trouter.redirect({\n\t '*': '/cookbook/1'\n\t});\n\t\n\tvar App = _vue2.default.extend({});\n\t\n\t//启动APP\n\trouter.start(App, '#app');\n\t\n\tconsole.log('本地存储用了', JSON.stringify(localStorage).length / 1024, 'K');\n\n/***/ },\n/* 1 */\n/***/ function(module, exports) {\n\n\t// removed by extract-text-webpack-plugin\n\n/***/ },\n/* 2 */,\n/* 3 */,\n/* 4 */,\n/* 5 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\t\n\tvar MyPlugin = {};\n\tMyPlugin.install = function (Vue, option) {\n\t\n\t // 设置cookie\n\t Vue.cookie = function (key, value, options) {\n\t var days, time, result, decode;\n\t\n\t if (arguments.length > 1 && String(value) !== \"[object Object]\") {\n\t // Enforce object\n\t options = $.extend({}, options);\n\t\n\t if (value === null || value === undefined) options.expires = -1;\n\t\n\t if (typeof options.expires === 'number') {\n\t days = options.expires * 24 * 60 * 60 * 1000;\n\t time = options.expires = new Date();\n\t\n\t time.setTime(time.getTime() + days);\n\t }\n\t\n\t value = String(value);\n\t\n\t return document.cookie = [encodeURIComponent(key), '=', options.raw ? value : encodeURIComponent(value), options.expires ? '; expires=' + options.expires.toUTCString() : '', '; path=/', options.domain ? '; domain=' + options.domain : '', options.secure ? '; secure' : ''].join('');\n\t }\n\t\n\t // Key and possibly options given, get cookie\n\t options = value || {};\n\t\n\t decode = options.raw ? function (s) {\n\t return s;\n\t } : decodeURIComponent;\n\t\n\t return (result = new RegExp('(?:^|; )' + encodeURIComponent(key) + '=([^;]*)').exec(document.cookie)) ? decode(result[1]) : null;\n\t };\n\t\n\t // 返回上一页\n\t Vue.prototype.goBack = function (_this) {\n\t var path = void 0;\n\t try {\n\t path = _this.$router._currentTransition.from.path;\n\t if (path) {\n\t if (path.match('member') && !$.localStorage.getItem('webapp_userInfo')) {\n\t _this.$router.replace('/cookbook/1');\n\t } else {\n\t window.history.back();\n\t }\n\t } else {\n\t _this.$router.replace('/cookbook/1');\n\t }\n\t } catch (e) {\n\t console.log(e);\n\t _this.$router.replace('/cookbook/1');\n\t }\n\t };\n\t\n\t // 判断设备环境\n\t Vue.prototype.$device = function (key) {\n\t return $.device[key];\n\t };\n\t\n\t // 简单封装本地存储\n\t $.localStorage = {\n\t getItem: function getItem(key) {\n\t if ((typeof localStorage === 'undefined' ? 'undefined' : _typeof(localStorage)) === 'object') {\n\t try {\n\t return JSON.parse(localStorage.getItem(key));\n\t } catch (e) {\n\t alert('本站无痕浏览模式,请关闭后再试!');\n\t }\n\t }\n\t },\n\t setItem: function setItem(key, value) {\n\t if ((typeof localStorage === 'undefined' ? 'undefined' : _typeof(localStorage)) === 'object') {\n\t try {\n\t return localStorage.setItem(key, JSON.stringify(value));\n\t } catch (e) {\n\t alert('请关闭[无痕浏览]模式后再试!');\n\t }\n\t }\n\t },\n\t removeItem: function removeItem(key) {\n\t if ((typeof localStorage === 'undefined' ? 'undefined' : _typeof(localStorage)) === 'object') {\n\t try {\n\t return localStorage.removeItem(key);\n\t } catch (e) {\n\t alert('请关闭[无痕浏览]模式后再试!');\n\t }\n\t }\n\t },\n\t getUseSize: function getUseSize() {\n\t if ((typeof localStorage === 'undefined' ? 'undefined' : _typeof(localStorage)) === 'object') {\n\t try {\n\t return JSON.stringify(localStorage).length;\n\t } catch (e) {\n\t alert('请关闭[无痕浏览]模式后再试!');\n\t }\n\t }\n\t }\n\t };\n\t\n\t //全局ajax设置\n\t $.ajaxSettings.timeout = 5000;\n\t\n\t $.ajaxSettings.complete = function (xhr, status) {\n\t //console.log('status=',status)\n\t if (status == 'abort') {\n\t $.toast('请求失败');\n\t } else if (status == 'timeout') {\n\t $.toast('请求超时');\n\t } else if (status == 'error') {\n\t try {\n\t var error = JSON.parse(xhr.responseText);\n\t $.toast(error.message);\n\t } catch (e) {\n\t $.toast('服务器错误');\n\t }\n\t }\n\t };\n\t\n\t Date.prototype.Format = function (fmt) {\n\t //author: meizz\n\t var o = {\n\t \"M+\": this.getMonth() + 1, //月份\n\t \"d+\": this.getDate(), //日\n\t \"H+\": this.getHours(), //小时\n\t \"m+\": this.getMinutes(), //分\n\t \"s+\": this.getSeconds(), //秒\n\t \"q+\": Math.floor((this.getMonth() + 3) / 3), //季度\n\t \"S\": this.getMilliseconds() //毫秒\n\t };\n\t if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + \"\").substr(4 - RegExp.$1.length));\n\t for (var k in o) {\n\t if (new RegExp(\"(\" + k + \")\").test(fmt)) fmt = fmt.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : (\"00\" + o[k]).substr((\"\" + o[k]).length));\n\t }return fmt;\n\t };\n\t};\n\texports.default = MyPlugin;\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t//计算时间差\n\t\n\tfunction default_1(Vue) {\n\t Vue.filter('time-diff', function (dateTime) {\n\t var date1 = new Date(dateTime); //开始时间\n\t var date2 = new Date(); //结束时间\n\t var date3 = date2.getTime() - date1.getTime(); //时间差的毫秒数\n\t //计算出相差天数\n\t var days = Math.floor(date3 / (24 * 3600 * 1000));\n\t //计算出小时数\n\t var leave1 = date3 % (24 * 3600 * 1000); //计算天数后剩余的毫秒数\n\t var hours = Math.floor(leave1 / (3600 * 1000));\n\t //计算相差分钟数\n\t var leave2 = leave1 % (3600 * 1000); //计算小时数后剩余的毫秒数\n\t var minutes = Math.floor(leave2 / (60 * 1000));\n\t //计算相差秒数\n\t var leave3 = leave2 % (60 * 1000); //计算分钟数后剩余的毫秒数\n\t var seconds = Math.round(leave3 / 1000);\n\t if (days > 0) {\n\t return days + '天';\n\t } else if (hours > 0) {\n\t return hours + '小时';\n\t } else if (minutes > 0) {\n\t return minutes + '分钟';\n\t } else if (seconds > 0) {\n\t return seconds + '秒';\n\t } else {\n\t return '刚刚';\n\t }\n\t });\n\t}\n\texports.__esModule = true;\n\texports[\"default\"] = default_1;\n\t//# sourceMappingURL=date.filter.js.map\n\n/***/ }\n]);\n\n\n/** WEBPACK FOOTER **\n ** app.24b5d33b.js\n **/","'use strict';\nimport './main.css'\nimport Vue from 'vue'\nimport VueRouter from 'vue-router'\nimport plugin from '../lib/cm-plugin'\nimport timeDiff from '../filter/date.filter'\n\n//Vue.config.debug = true;\n//Vue.config.silent = true;//取消 Vue.js 所有的日志与警告。\nVue.use(VueRouter);\nVue.use(plugin);\n\ntimeDiff(Vue); //定义过滤器\n\nvar router = new VueRouter({\n history: true, //html5模式 去掉锚点\n saveScrollPosition: true //记住页面的滚动位置 html5模式适用\n})\n\n//定义路由\nrouter.map({\n '/cookbook/:id': {\n component: function(resolve){\n //webpack自带功能 实现异步加载路由\n require.ensure([], function() {\n let route = require('./states/cookbook-list/route').default;\n resolve(route);\n })\n }\n },\n '/cookbookDetail/:id': {\n component: function(resolve){\n //webpack自带功能 实现异步加载路由\n require.ensure([], function() {\n let route = require('./states/cookbook/route').default;\n resolve(route);\n })\n }\n }\n})\nrouter.redirect({\n '*': '/cookbook/1'\n})\n\nvar App = Vue.extend({})\n\n//启动APP\nrouter.start(App, '#app');\n\nconsole.log('本地存储用了',JSON.stringify(localStorage).length/1024,'K');\n\n\n/** WEBPACK FOOTER **\n ** ./client/com.chezhil.cookbook/main.js\n **/","'use strict'\n\nvar MyPlugin = {};\nMyPlugin.install = function (Vue, option) {\n \n // 设置cookie\n Vue.cookie = function (key, value, options) {\n var days, time, result, decode;\n\n if (arguments.length > 1 && String(value) !== \"[object Object]\") {\n // Enforce object\n options = $.extend({}, options)\n\n if (value === null || value === undefined) options.expires = -1\n\n if (typeof options.expires === 'number') {\n days = (options.expires * 24 * 60 * 60 * 1000)\n time = options.expires = new Date()\n\n time.setTime(time.getTime() + days)\n }\n\n value = String(value)\n\n return (document.cookie = [\n encodeURIComponent(key), '=',\n options.raw ? value : encodeURIComponent(value),\n options.expires ? '; expires=' + options.expires.toUTCString() : '',\n '; path=/',\n options.domain ? '; domain=' + options.domain : '',\n options.secure ? '; secure' : ''\n ].join(''))\n }\n\n // Key and possibly options given, get cookie\n options = value || {}\n\n decode = options.raw ? function (s) { return s } : decodeURIComponent\n\n return (result = new RegExp('(?:^|; )' + encodeURIComponent(key) + '=([^;]*)').exec(document.cookie)) ? decode(result[1]) : null\n };\n \n // 返回上一页\n Vue.prototype.goBack = function(_this){\n let path;\n try{\n path = _this.$router._currentTransition.from.path;\n if(path){\n if(path.match('member') && !$.localStorage.getItem('webapp_userInfo')){\n _this.$router.replace('/cookbook/1')\n }else{\n window.history.back();\n }\n }else{\n _this.$router.replace('/cookbook/1')\n }\n }catch (e){\n console.log(e)\n _this.$router.replace('/cookbook/1')\n }\n };\n\n // 判断设备环境\n Vue.prototype.$device = function(key){\n return $.device[key];\n };\n\n // 简单封装本地存储\n $.localStorage = {\n getItem : function(key){\n if (typeof localStorage === 'object') {\n try {\n return JSON.parse(localStorage.getItem(key));\n } catch (e) {\n alert('本站无痕浏览模式,请关闭后再试!');\n }\n }\n },\n setItem : function(key,value){\n if (typeof localStorage === 'object') {\n try {\n return localStorage.setItem(key,JSON.stringify(value));\n } catch (e) {\n alert('请关闭[无痕浏览]模式后再试!');\n }\n }\n },\n removeItem : function(key){\n if (typeof localStorage === 'object') {\n try {\n return localStorage.removeItem(key);\n } catch (e) {\n alert('请关闭[无痕浏览]模式后再试!');\n }\n }\n },\n getUseSize : function(){\n if (typeof localStorage === 'object') {\n try {\n return JSON.stringify(localStorage).length;\n } catch (e) {\n alert('请关闭[无痕浏览]模式后再试!');\n }\n }\n }\n };\n\n //全局ajax设置\n $.ajaxSettings.timeout = 5000;\n \n $.ajaxSettings.complete = function(xhr, status){\n //console.log('status=',status)\n if(status == 'abort'){\n $.toast('请求失败');\n }else if(status == 'timeout'){\n $.toast('请求超时');\n }else if(status == 'error'){\n try {\n let error = JSON.parse(xhr.responseText);\n $.toast(error.message);\n }catch(e){\n $.toast('服务器错误');\n }\n }\n };\n\n Date.prototype.Format = function (fmt) { //author: meizz\n var o = {\n \"M+\": this.getMonth() + 1, //月份\n \"d+\": this.getDate(), //日\n \"H+\": this.getHours(), //小时\n \"m+\": this.getMinutes(), //分\n \"s+\": this.getSeconds(), //秒\n \"q+\": Math.floor((this.getMonth() + 3) / 3), //季度\n \"S\": this.getMilliseconds() //毫秒\n };\n if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + \"\").substr(4 - RegExp.$1.length));\n for (var k in o)\n if (new RegExp(\"(\" + k + \")\").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : ((\"00\" + o[k]).substr((\"\" + o[k]).length)));\n return fmt;\n }\n\n};\nexport default MyPlugin;\n\n\n/** WEBPACK FOOTER **\n ** ./client/lib/cm-plugin.js\n **/","\"use strict\";\n//计算时间差\nfunction default_1(Vue) {\n Vue.filter('time-diff', function (dateTime) {\n var date1 = new Date(dateTime); //开始时间\n var date2 = new Date(); //结束时间\n var date3 = date2.getTime() - date1.getTime(); //时间差的毫秒数\n //计算出相差天数\n var days = Math.floor(date3 / (24 * 3600 * 1000));\n //计算出小时数\n var leave1 = date3 % (24 * 3600 * 1000); //计算天数后剩余的毫秒数\n var hours = Math.floor(leave1 / (3600 * 1000));\n //计算相差分钟数\n var leave2 = leave1 % (3600 * 1000); //计算小时数后剩余的毫秒数\n var minutes = Math.floor(leave2 / (60 * 1000));\n //计算相差秒数\n var leave3 = leave2 % (60 * 1000); //计算分钟数后剩余的毫秒数\n var seconds = Math.round(leave3 / 1000);\n if (days > 0) {\n return days + '天';\n }\n else if (hours > 0) {\n return hours + '小时';\n }\n else if (minutes > 0) {\n return minutes + '分钟';\n }\n else if (seconds > 0) {\n return seconds + '秒';\n }\n else {\n return '刚刚';\n }\n });\n}\nexports.__esModule = true;\nexports[\"default\"] = default_1;\n//# sourceMappingURL=date.filter.js.map\n\n\n/** WEBPACK FOOTER **\n ** ./client/filter/date.filter.js\n **/"],"sourceRoot":""} -------------------------------------------------------------------------------- /server/typings/mongodb/mongodb.d.ts: -------------------------------------------------------------------------------- 1 | // Type definitions for MongoDB 2 | // Project: https://github.com/mongodb/node-mongodb-native 3 | // Definitions by: Boris Yankov 4 | // Definitions: https://github.com/borisyankov/DefinitelyTyped 5 | 6 | // Documentation : http://mongodb.github.io/node-mongodb-native/ 7 | 8 | /// 9 | 10 | declare module "mongodb" { 11 | 12 | // Class documentation : http://mongodb.github.io/node-mongodb-native/api-generated/mongoclient.html 13 | export class MongoClient{ 14 | constructor(serverConfig: any, options: any); 15 | 16 | static connect(uri: string, options: any, callback: (err: Error, db: Db) => void): void; 17 | static connect(uri: string, callback: (err: Error, db: Db) => void): void; 18 | } 19 | 20 | // Class documentation : http://mongodb.github.io/node-mongodb-native/api-generated/server.html 21 | export class Server { 22 | constructor (host: string, port: number, opts?: ServerOptions); 23 | 24 | public connect(): any; 25 | } 26 | 27 | // Class documentation : http://mongodb.github.io/node-mongodb-native/api-generated/db.html 28 | export class Db { 29 | constructor (databaseName: string, serverConfig: Server, dbOptions?: DbCreateOptions); 30 | 31 | public db(dbName: string): Db; 32 | 33 | public open(callback: (err : Error, db : Db) => void ): void; 34 | public close(forceClose?: boolean, callback?: (err: Error, result: any) => void ): void; 35 | public admin(callback: (err: Error, result: any) => void ): any; 36 | public collectionsInfo(collectionName: string, callback?: (err: Error, result: any) => void ): void; 37 | public collectionNames(collectionName: string, options: any, callback?: (err: Error, result: any) => void ): void; 38 | 39 | public collection(collectionName: string): Collection; 40 | public collection(collectionName: string, callback: (err: Error, collection: Collection) => void ): Collection; 41 | public collection(collectionName: string, options: MongoCollectionOptions, callback: (err: Error, collection: Collection) => void ): Collection; 42 | 43 | public collections(callback: (err: Error, collections: Collection[]) => void ): void; 44 | public eval(code: any, parameters: any[], options?: any, callback?: (err: Error, result: any) => void ): void; 45 | //public dereference(dbRef: DbRef, callback: (err: Error, result: any) => void): void; 46 | 47 | public logout(options: any, callback?: (err: Error, result: any) => void ): void; 48 | public logout(callback: (err: Error, result: any) => void ): void; 49 | 50 | public authenticate(userName: string, password: string, callback?: (err: Error, result: any) => void ): void; 51 | public authenticate(userName: string, password: string, options: any, callback?: (err: Error, result: any) => void ): void; 52 | 53 | public addUser(username: string, password: string, callback?: (err: Error, result: any) => void ): void; 54 | public addUser(username: string, password: string, options: any, callback?: (err: Error, result: any) => void ): void; 55 | 56 | public removeUser(username: string, callback?: (err: Error, result: any) => void ): void; 57 | public removeUser(username: string, options: any, callback?: (err: Error, result: any) => void ): void; 58 | 59 | public createCollection(collectionName: string, callback?: (err: Error, result: Collection) => void ): void; 60 | public createCollection(collectionName: string, options: CollectionCreateOptions, callback?: (err: Error, result: any) => void ): void; 61 | 62 | public command(selector: Object, callback?: (err: Error, result: any) => void ): void; 63 | public command(selector: Object, options: any, callback?: (err: Error, result: any) => void ): void; 64 | 65 | public dropCollection(collectionName: string, callback?: (err: Error, result: any) => void ): void; 66 | public renameCollection(fromCollection: string, toCollection: string, callback?: (err: Error, result: any) => void ): void; 67 | 68 | public lastError(options: Object, connectionOptions: any, callback: (err: Error, result: any) => void ): void; 69 | public previousError(options: Object, callback: (err: Error, result: any) => void ): void; 70 | 71 | // error = lastError 72 | // lastStatus = lastError 73 | 74 | public executeDbCommand(command_hash: any, callback?: (err: Error, result: any) => void ): void; 75 | public executeDbCommand(command_hash: any, options: any, callback?: (err: Error, result: any) => void ): void; 76 | 77 | public executeDbAdminCommand(command_hash: any, callback?: (err: Error, result: any) => void ): void; 78 | public executeDbAdminCommand(command_hash: any, options: any, callback?: (err: Error, result: any) => void ): void; 79 | 80 | public resetErrorHistory(callback?: (err: Error, result: any) => void ): void; 81 | public resetErrorHistory(options: any, callback?: (err: Error, result: any) => void ): void; 82 | 83 | public createIndex(collectionName: any, fieldOrSpec: any, options: IndexOptions, callback: Function): void; 84 | public ensureIndex(collectionName: any, fieldOrSpec: any, options: IndexOptions, callback: Function): void; 85 | 86 | public cursorInfo(options: any, callback: Function): void; 87 | 88 | public dropIndex(collectionName: string, indexName: string, callback: Function): void; 89 | public reIndex(collectionName: string, callback: Function): void; 90 | public indexInformation(collectionName: string, options: any, callback: Function): void; 91 | public dropDatabase(callback: (err: Error, result: any) => void ): void; 92 | 93 | public stats(options: any, callback: Function): void; 94 | public _registerHandler(db_command: any, raw: any, connection: any, exhaust: any, callback: Function): void; 95 | public _reRegisterHandler(newId: any, object: any, callback: Function): void; 96 | public _callHandler(id: any, document: any, err: any): any; 97 | public _hasHandler(id: any): any; 98 | public _removeHandler(id: any): any; 99 | public _findHandler(id: any): { id: string; callback: Function; }; 100 | public __executeQueryCommand(self: any, db_command: any, options: any, callback: any): void; 101 | 102 | public DEFAULT_URL: string; 103 | 104 | public connect(url: string, options: { uri_decode_auth?: boolean; }, callback: (err: Error, result: any) => void ): void; 105 | 106 | public addListener(event: string, handler:(param: any) => any): any; 107 | } 108 | 109 | // Class documentation : http://mongodb.github.io/node-mongodb-native/api-bson-generated/objectid.html 110 | // Last update: doc. version 1.3.13 (28.08.2013) 111 | export class ObjectID { 112 | constructor (s?: string); 113 | 114 | // Returns the ObjectID id as a 24 byte hex string representation 115 | public toHexString() : string; 116 | 117 | // Compares the equality of this ObjectID with otherID. 118 | public equals(otherID: ObjectID) : boolean; 119 | 120 | // Returns the generation date (accurate up to the second) that this ID was generated. 121 | public getTimestamp(): Date; 122 | 123 | // Creates an ObjectID from a second based number, with the rest of the ObjectID zeroed out. Used for comparisons or sorting the ObjectID. 124 | // time – an integer number representing a number of seconds. 125 | public static createFromTime(time: number): ObjectID; 126 | 127 | // Creates an ObjectID from a hex string representation of an ObjectID. 128 | // hexString – create a ObjectID from a passed in 24 byte hexstring. 129 | public static createFromHexString(hexString: string): ObjectID; 130 | 131 | // Checks if a value is a valid bson ObjectId 132 | // id - Value to be checked 133 | public static isValid(id: string): Boolean; 134 | 135 | // Generate a 12 byte id string used in ObjectID's 136 | // time - optional parameter allowing to pass in a second based timestamp 137 | public generate(time?: number): string; 138 | } 139 | 140 | // Class documentation : http://mongodb.github.io/node-mongodb-native/api-bson-generated/binary.html 141 | export class Binary { 142 | constructor (buffer: Buffer, subType?: number); 143 | 144 | // Updates this binary with byte_value 145 | put(byte_value: any): void; 146 | 147 | // Writes a buffer or string to the binary 148 | write(buffer: any, offset: number): void; 149 | 150 | // Reads length bytes starting at position. 151 | read(position: number, length: number): Buffer; 152 | 153 | // Returns the value of this binary as a string. 154 | value(): string; 155 | 156 | // The length of the binary. 157 | length(): number; 158 | } 159 | 160 | export interface SocketOptions { 161 | //= set seconds before connection times out default:0 162 | timeout?: number; 163 | //= Disables the Nagle algorithm default:true 164 | noDelay?: boolean; 165 | //= Set if keepAlive is used default:0 , which means no keepAlive, set higher than 0 for keepAlive 166 | keepAlive?: number; 167 | //= ‘ascii’|’utf8’|’base64’ default:null 168 | encoding?: string; 169 | } 170 | 171 | export interface ServerOptions { 172 | // - to reconnect automatically, default:false 173 | auto_reconnect?: boolean; 174 | // - specify the number of connections in the pool default:1 175 | poolSize?: number; 176 | // - a collection of pr socket settings 177 | socketOptions?: any; 178 | } 179 | 180 | export interface PKFactory { 181 | counter: number; 182 | createPk: () => number; 183 | } 184 | 185 | // See : http://mongodb.github.io/node-mongodb-native/api-generated/db.html 186 | // Current definition by documentation version 1.3.13 (28.08.2013) 187 | export interface DbCreateOptions { 188 | // the write concern for the operation where < 1 is no acknowlegement of write and w >= 1, w = ‘majority’ or tag acknowledges the write. 189 | w?: any; 190 | 191 | // set the timeout for waiting for write concern to finish (combines with w option). 192 | wtimeout?: number; 193 | 194 | // write waits for fsync before returning. default:false. 195 | fsync?: boolean; 196 | 197 | // write waits for journal sync before returning. default:false. 198 | journal?: boolean; 199 | 200 | // the prefered read preference. use 'ReadPreference' class. 201 | readPreference?: string; 202 | 203 | // use c++ bson parser. default:false. 204 | native_parser?: boolean; 205 | 206 | // force server to create _id fields instead of client. default:false. 207 | forceServerObjectId?: boolean; 208 | 209 | // custom primary key factory to generate _id values (see Custom primary keys). 210 | pkFactory?: PKFactory; 211 | 212 | // serialize functions. default:false. 213 | serializeFunctions?: boolean; 214 | 215 | // peform operations using raw bson buffers. default:false. 216 | raw?: boolean; 217 | 218 | // record query statistics during execution. default:false. 219 | recordQueryStats?: boolean; 220 | 221 | // number of miliseconds between retries. default:5000. 222 | retryMiliSeconds?: number; 223 | 224 | // number of retries off connection. default:5. 225 | numberOfRetries?: number; 226 | 227 | // an object representing a logger that you want to use, needs to support functions debug, log, error. default:null. 228 | logger?: Object 229 | 230 | // force setting of SlaveOk flag on queries (only use when explicitly connecting to a secondary server). default:null. 231 | slaveOk?: number; 232 | 233 | // when deserializing a Long will fit it into a Number if it’s smaller than 53 bits. default:true. 234 | promoteLongs?: boolean; 235 | } 236 | 237 | export class ReadPreference { 238 | public static PRIMARY: string; 239 | public static PRIMARY_PREFERRED: string; 240 | public static SECONDARY: string; 241 | public static SECONDARY_PREFERRED: string; 242 | public static NEAREST: string; 243 | } 244 | 245 | // See : http://mongodb.github.io/node-mongodb-native/api-generated/collection.html 246 | // Current definition by documentation version 1.3.13 (28.08.2013) 247 | export interface CollectionCreateOptions { 248 | // the prefered read preference. use 'ReadPreference' class. 249 | readPreference?: string; 250 | 251 | // Allow reads from secondaries. default:false. 252 | slaveOk?: boolean; 253 | 254 | // serialize functions on the document. default:false. 255 | serializeFunctions?: boolean; 256 | 257 | // perform all operations using raw bson objects. default:false. 258 | raw?: boolean; 259 | 260 | // object overriding the basic ObjectID primary key generation. 261 | pkFactory?: PKFactory; 262 | } 263 | 264 | // Documentation: http://docs.mongodb.org/manual/reference/command/collStats/ 265 | export interface CollStats { 266 | // Namespace. 267 | ns: string; 268 | 269 | // Number of documents. 270 | count: number; 271 | 272 | // Collection size in bytes. 273 | size: number; 274 | 275 | // Average object size in bytes. 276 | avgObjSize: number; 277 | 278 | // (Pre)allocated space for the collection in bytes. 279 | storageSize: number; 280 | 281 | // Number of extents (contiguously allocated chunks of datafile space). 282 | numExtents: number; 283 | 284 | // Number of indexes. 285 | nindexes: number; 286 | 287 | // Size of the most recently created extent in bytes. 288 | lastExtentSize: number; 289 | 290 | // Padding can speed up updates if documents grow. 291 | paddingFactor: number; 292 | flags: number; 293 | 294 | // Total index size in bytes. 295 | totalIndexSize: number; 296 | 297 | // Size of specific indexes in bytes. 298 | indexSizes: { 299 | _id_: number; 300 | username: number; 301 | }; 302 | } 303 | 304 | // Documentation : http://mongodb.github.io/node-mongodb-native/api-generated/collection.html 305 | export interface Collection { 306 | new (db: Db, collectionName: string, pkFactory?: Object, options?: CollectionCreateOptions): Collection; // is this right? 307 | /** 308 | * @deprecated use insertOne or insertMany 309 | * Documentation : http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#insert 310 | */ 311 | insert(query: any, callback: (err: Error, result: any) => void): void; 312 | insert(query: any, options: { safe?: any; continueOnError?: boolean; keepGoing?: boolean; serializeFunctions?: boolean; }, callback: (err: Error, result: any) => void): void; 313 | 314 | // Documentation : http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#insertOne 315 | insertOne(doc:any, callback: (err: Error, result: any) => void) :void; 316 | insertOne(doc: any, options: { w?: any; wtimeout?: number; j?: boolean; serializeFunctions?: boolean; forceServerObjectId?: boolean }, callback: (err: Error, result: any) => void): void; 317 | 318 | // Documentation : http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#insertMany 319 | insertMany(docs: any, callback: (err: Error, result: any) => void): void; 320 | insertMany(docs: any, options: { w?: any; wtimeout?: number; j?: boolean; serializeFunctions?: boolean; forceServerObjectId?: boolean }, callback: (err: Error, result: any) => void): void; 321 | /** 322 | * @deprecated use deleteOne or deleteMany 323 | * Documentation : http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#remove 324 | */ 325 | remove(selector: Object, callback?: (err: Error, result: any) => void): void; 326 | remove(selector: Object, options: { safe?: any; single?: boolean; }, callback?: (err: Error, result: any) => void): void; 327 | 328 | // Documentation : http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#deleteOne 329 | deleteOne(filter: any, callback: (err: Error, result: any) => void): void; 330 | deleteOne(filter: any, options: { w?: any; wtimeout?: number; j?: boolean;}, callback: (err: Error, result: any) => void): void; 331 | 332 | // Documentation : http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#deleteMany 333 | deleteMany(filter: any, callback: (err: Error, result: any) => void): void; 334 | deleteMany(filter: any, options: { w?: any; wtimeout?: number; j?: boolean;}, callback: (err: Error, result: any) => void): void; 335 | 336 | rename(newName: String, callback?: (err: Error, result: any) => void): void; 337 | 338 | save(doc: any, callback : (err: Error, result: any) => void): void; 339 | save(doc: any, options: { w?: any; wtimeout?: number; j?: boolean;}, callback : (err: Error, result: any) => void): void; 340 | /** 341 | * @deprecated use updateOne or updateMany 342 | * Documentation : http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#update 343 | */ 344 | update(selector: Object, document: any, callback?: (err: Error, result: any) => void): void; 345 | update(selector: Object, document: any, options: { safe?: boolean; upsert?: any; multi?: boolean; serializeFunctions?: boolean; }, callback: (err: Error, result: any) => void): void; 346 | 347 | // Documentation : http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#updateOne 348 | updateOne(filter: Object, update: any, callback: (err: Error, result: any) => void): void; 349 | updateOne(filter: Object, update: any, options: { upsert?: boolean; w?: any; wtimeout?: number; j?: boolean;}, callback: (err: Error, result: any) => void): void; 350 | 351 | // Documentation : http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#updateMany 352 | updateMany(filter: Object, update: any, callback: (err: Error, result: any) => void): void; 353 | updateMany(filter: Object, update: any, options: { upsert?: boolean; w?: any; wtimeout?: number; j?: boolean;}, callback: (err: Error, result: any) => void): void; 354 | 355 | distinct(key: string, query: Object, callback: (err: Error, result: any) => void): void; 356 | distinct(key: string, query: Object, options: { readPreference: string; }, callback: (err: Error, result: any) => void): void; 357 | 358 | count(callback: (err: Error, result: any) => void): void; 359 | count(query: Object, callback: (err: Error, result: any) => void): void; 360 | count(query: Object, options: { readPreference: string; }, callback: (err: Error, result: any) => void): void; 361 | 362 | drop(callback?: (err: Error, result: any) => void): void; 363 | /** 364 | * @deprecated use findOneAndUpdate, findOneAndReplace or findOneAndDelete 365 | * Documentation : http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#findAndModify 366 | */ 367 | findAndModify(query: Object, sort: any[], doc: Object, callback: (err: Error, result: any) => void): void; 368 | findAndModify(query: Object, sort: any[], doc: Object, options: { safe?: any; remove?: boolean; upsert?: boolean; new?: boolean; }, callback: (err: Error, result: any) => void): void; 369 | /** 370 | * @deprecated use findOneAndDelete 371 | * Documentation : http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#findAndRemove 372 | */ 373 | findAndRemove(query : Object, sort? : any[], callback?: (err: Error, result: any) => void): void; 374 | findAndRemove(query : Object, sort? : any[], options?: { safe: any; }, callback?: (err: Error, result: any) => void): void; 375 | 376 | // Documentation : http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#findOneAndDelete 377 | findOneAndDelete(filter: any, callback: (err: Error, result: any) => void): void; 378 | findOneAndDelete(filter: any, options: { projection?: any; sort?: any; maxTimeMS?: number; }, callback: (err: Error, result: any) => void): void; 379 | 380 | // Documentation : http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#findOneAndReplace 381 | findOneAndReplace(filter: any, replacement: any, callback: (err: Error, result: any) => void): void; 382 | findOneAndReplace(filter: any, replacement: any, options: { projection?: any; sort?: any; maxTimeMS?: number; upsert?: boolean; returnOriginal?: boolean }, callback: (err: Error, result: any) => void): void; 383 | 384 | // Documentation : http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#findOneAndUpdate 385 | findOneAndUpdate(filter: any, update: any, callback: (err: Error, result: any) => void): void; 386 | findOneAndUpdate(filter: any, update: any, options: { projection?: any; sort?: any; maxTimeMS?: number; upsert?: boolean; returnOriginal?: boolean }, callback: (err: Error, result: any) => void): void; 387 | 388 | find(callback?: (err: Error, result: Cursor) => void): Cursor; 389 | find(selector: Object, callback?: (err: Error, result: Cursor) => void): Cursor; 390 | find(selector: Object, fields: any, callback?: (err: Error, result: Cursor) => void): Cursor; 391 | find(selector: Object, options: CollectionFindOptions, callback?: (err: Error, result: Cursor) => void): Cursor; 392 | find(selector: Object, fields: any, options: CollectionFindOptions, callback?: (err: Error, result: Cursor) => void): Cursor; 393 | find(selector: Object, fields: any, skip: number, limit: number, callback?: (err: Error, result: Cursor) => void): Cursor; 394 | find(selector: Object, fields: any, skip: number, limit: number, timeout: number, callback?: (err: Error, result: Cursor) => void): Cursor; 395 | 396 | findOne(callback?: (err: Error, result: any) => void): Cursor; 397 | findOne(selector: Object, callback?: (err: Error, result: any) => void): Cursor; 398 | findOne(selector: Object, fields: any, callback?: (err: Error, result: any) => void): Cursor; 399 | findOne(selector: Object, options: CollectionFindOptions, callback?: (err: Error, result: any) => void): Cursor; 400 | findOne(selector: Object, fields: any, options: CollectionFindOptions, callback?: (err: Error, result: any) => void): Cursor; 401 | findOne(selector: Object, fields: any, skip: number, limit: number, callback?: (err: Error, result: any) => void): Cursor; 402 | findOne(selector: Object, fields: any, skip: number, limit: number, timeout: number, callback?: (err: Error, result: any) => void): Cursor; 403 | 404 | createIndex(fieldOrSpec: any, callback: (err: Error, indexName: string) => void): void; 405 | createIndex(fieldOrSpec: any, options: IndexOptions, callback: (err: Error, indexName: string) => void): void; 406 | 407 | ensureIndex(fieldOrSpec: any, callback: (err: Error, indexName: string) => void): void; 408 | ensureIndex(fieldOrSpec: any, options: IndexOptions, callback: (err: Error, indexName: string) => void): void; 409 | 410 | indexInformation(options: any, callback: Function): void; 411 | dropIndex(name: string, callback: Function): void; 412 | dropAllIndexes(callback: Function): void; 413 | // dropIndexes = dropAllIndexes 414 | 415 | reIndex(callback: Function): void; 416 | mapReduce(map: Function, reduce: Function, options: MapReduceOptions, callback: Function): void; 417 | group(keys: Object, condition: Object, initial: Object, reduce: Function, finalize: Function, command: boolean, options: {readPreference: string}, callback: Function): void; 418 | options(callback: Function): void; 419 | isCapped(callback: Function): void; 420 | indexExists(indexes: string, callback: Function): void; 421 | geoNear(x: number, y: number, callback: Function): void; 422 | geoNear(x: number, y: number, options: Object, callback: Function): void; 423 | geoHaystackSearch(x: number, y: number, callback: Function): void; 424 | geoHaystackSearch(x: number, y: number, options: Object, callback: Function): void; 425 | indexes(callback: Function): void; 426 | aggregate(pipeline: any[], callback: (err: Error, results: any) => void): void; 427 | aggregate(pipeline: any[], options: {readPreference: string}, callback: (err: Error, results: any) => void): void; 428 | stats(options: {readPreference: string; scale: number}, callback: (err: Error, results: CollStats) => void): void; 429 | stats(callback: (err: Error, results: CollStats) => void): void; 430 | 431 | hint: any; 432 | } 433 | 434 | export interface MapReduceOptions { 435 | out?: Object; 436 | query?: Object; 437 | sort?: Object; 438 | limit?: number; 439 | keeptemp?: boolean; 440 | finalize?: any; 441 | scope?: Object; 442 | jsMode?: boolean; 443 | verbose?: boolean; 444 | readPreference?: string; 445 | } 446 | 447 | export interface IndexOptions { 448 | w?: any; 449 | wtimeout?: number; 450 | fsync?: boolean; 451 | journal?: boolean; 452 | unique?: boolean; 453 | sparse?: boolean; 454 | background?: boolean; 455 | dropDups?: boolean; 456 | min?: number; 457 | max?: number; 458 | v?: number; 459 | expireAfterSeconds?: number; 460 | name?: string; 461 | } 462 | 463 | // Class documentation : http://mongodb.github.io/node-mongodb-native/api-generated/cursor.html 464 | // Last update: doc. version 1.3.13 (29.08.2013) 465 | export class Cursor { 466 | // INTERNAL TYPE 467 | // constructor (db: Db, collection: Collection, selector, fields, skip, limit, sort, hint, explain, snapshot, timeout, tailable, batchSize, slaveOk, raw, read, returnKey, maxScan, min, max, showDiskLoc, comment, awaitdata, numberOfRetries, dbName, tailableRetryInterval, exhaust, partial); 468 | // constructor(db: Db, collection: Collection, selector, fields, options); 469 | 470 | rewind() : Cursor; 471 | toArray(callback: (err: Error, results: any[]) => any) : void; 472 | each(callback: (err: Error, item: any) => void) : void; 473 | count(applySkipLimit: boolean, callback: (err: Error, count: number) => void) : void; 474 | 475 | sort(keyOrList: any, callback? : (err: Error, result: any) => void): Cursor; 476 | 477 | // this determines how the results are sorted. "asc", "ascending" or 1 for asceding order while "desc", "desceding or -1 for descending order. Note that the strings are case insensitive. 478 | sort(keyOrList: String, direction : string, callback : (err: Error, result: any) => void): Cursor; 479 | limit(limit: number, callback?: (err: Error, result: any) => void): Cursor; 480 | setReadPreference(preference: string, callback?: Function): Cursor; 481 | skip(skip: number, callback?: (err: Error, result: any) => void): Cursor; 482 | batchSize(batchSize: number, callback?: (err: Error, result: any) => void): Cursor; 483 | 484 | nextObject(callback: (err: Error, doc: any) => void) : void; 485 | explain(callback: (err: Error, result: any) => void) : void; 486 | 487 | stream(): CursorStream; 488 | 489 | close(callback: (err: Error, result: any) => void) : void; 490 | isClosed(): boolean; 491 | 492 | public static INIT: number; 493 | public static OPEN: number; 494 | public static CLOSED: number; 495 | public static GET_MORE: number; 496 | } 497 | 498 | // Class documentation : http://mongodb.github.io/node-mongodb-native/api-generated/cursorstream.html 499 | // Last update: doc. version 1.3.13 (29.08.2013) 500 | export class CursorStream { 501 | constructor(cursor: Cursor); 502 | 503 | public pause(): any; 504 | public resume(): any; 505 | public destroy(): any; 506 | } 507 | 508 | export interface CollectionFindOptions { 509 | limit?: number; 510 | sort?: any; 511 | fields?: Object; 512 | skip?: number; 513 | hint?: Object; 514 | explain?: boolean; 515 | snapshot?: boolean; 516 | timeout?: boolean; 517 | tailtable?: boolean; 518 | tailableRetryInterval?: number; 519 | numberOfRetries?: number; 520 | awaitdata?: boolean; 521 | oplogReplay?: boolean; 522 | exhaust?: boolean; 523 | batchSize?: number; 524 | returnKey?: boolean; 525 | maxScan?: number; 526 | min?: number; 527 | max?: number; 528 | showDiskLoc?: boolean; 529 | comment?: String; 530 | raw?: boolean; 531 | readPreference?: String; 532 | partial?: boolean; 533 | } 534 | 535 | export interface MongoCollectionOptions { 536 | safe?: any; 537 | serializeFunctions?: any; 538 | strict?: boolean; 539 | raw?: boolean; 540 | pkFactory?: any; 541 | readPreference?: string; 542 | } 543 | } 544 | -------------------------------------------------------------------------------- /__build__/1.0ce212e3.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///1.0ce212e3.js","webpack:///./client/com.chezhil.cookbook/states/cookbook-list/route.js","webpack:///./client/com.chezhil.cookbook/states/cookbook-list/template.html","webpack:///./client/com.chezhil.cookbook/states/cookbook-list/value.js","webpack:///./client/com.chezhil.cookbook/service/cookbook.service.js"],"names":["webpackJsonp","module","exports","__webpack_require__","_interopRequireDefault","obj","__esModule","default","Object","defineProperty","value","_vue","_vue2","_template","_template2","_value","_value2","_q","_q2","_cookbook","_cookbook2","Index","extend","template","ready","_this","this","loading","$","on","getCookbookList","id","page","then","data","i","tngou","length","cookbookItems","push","maxItems","total","console","error","isShowLoad","detachInfiniteScroll","remove","updateTime","Date","getTime","pullToRefreshDone","init","setTimeout","scrollTabBtn","methods","goCookbook","$router","go","goCookbookDetail","goBack","goRoute","route","removeClass","openPanel","panel_id","class_id","$el","el","scrollLeft","offsetLeft","parentNode","scrollLeft_active","device","android","isWeixin","_loop","Math","abs","_loop2","_i","computed","transition","_this2","title","localStorage","getItem","cookbookClasses","JSON","parse","window","cm_cookbookItems","to","params","log","$data","setItem","cookbook","scrollTop","showIndicator","qa_id","promise","getCookbookClass","all","data0","status","abort","e","toast","hideIndicator","next","canReuse","activate","_this3","deactivate","valOptions","Promise","_success","_error","ajax","type","url","headers","apikey","success","response","stringify","oldValue","xhr","_success2","_error2","classes","errorType","getCookbookDetail","_success3","_error3","cookbookService"],"mappings":"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","file":"1.0ce212e3.js","sourcesContent":["webpackJsonp([1],[\n/* 0 */,\n/* 1 */,\n/* 2 */,\n/* 3 */,\n/* 4 */,\n/* 5 */,\n/* 6 */,\n/* 7 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _vue = __webpack_require__(2);\n\t\n\tvar _vue2 = _interopRequireDefault(_vue);\n\t\n\tvar _template = __webpack_require__(8);\n\t\n\tvar _template2 = _interopRequireDefault(_template);\n\t\n\t__webpack_require__(9);\n\t\n\tvar _value = __webpack_require__(10);\n\t\n\tvar _value2 = _interopRequireDefault(_value);\n\t\n\tvar _q = __webpack_require__(11);\n\t\n\tvar _q2 = _interopRequireDefault(_q);\n\t\n\tvar _cookbook = __webpack_require__(13);\n\t\n\tvar _cookbook2 = _interopRequireDefault(_cookbook);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar Index = _vue2.default.extend({\n\t //replace : true, //必须注释掉 不然动画失效\n\t template: _template2.default,\n\t ready: function ready() {\n\t var _this = this;\n\t\n\t //做浏览器判断 和 兼容\n\t var loading = false;\n\t //$('#class_tab').attr('data-offset',$('header.bar.bar-nav')[0].offsetHeight-1)\n\t //绑定无限滚动事件\n\t $('.infinite-scroll-bottom').on('infinite', function () {\n\t if (loading) {\n\t return;\n\t }\n\t loading = true;\n\t\n\t _cookbook2.default.getCookbookList(_this.id, _this.page).then(function (data) {\n\t _this.page += 1;\n\t for (var i = 0; i <= data.tngou.length; i++) {\n\t if (data.tngou[i]) {\n\t _this.cookbookItems.push(data.tngou[i]);\n\t }\n\t }\n\t if (_this.maxItems == -1) {\n\t _this.maxItems = data.total;\n\t }\n\t loading = false;\n\t }).catch(function () {\n\t console.error('出错啦');\n\t }).finally(function () {\n\t if (!_this.isShowLoad) {\n\t //解绑无限加载事件\n\t $.detachInfiniteScroll($('.infinite-scroll'));\n\t // 删除加载提示符\n\t $('.infinite-scroll-preloader').remove();\n\t }\n\t });\n\t });\n\t\n\t //绑定下拉刷新事件\n\t $('.pull-to-refresh-content').on('refresh', function () {\n\t if (loading) {\n\t return;\n\t }\n\t loading = true;\n\t\n\t _this.page = 1;\n\t _cookbook2.default.getCookbookList(_this.id, _this.page).then(function (data) {\n\t _this.page += 1;\n\t _this.updateTime = new Date().getTime();\n\t _this.cookbookItems = data.tngou;\n\t if (_this.maxItems > 0) {\n\t _this.maxItems = data.total;\n\t }\n\t loading = false;\n\t // 加载完毕需要重置\n\t $.pullToRefreshDone('.pull-to-refresh-content');\n\t }).catch(function () {\n\t console.error('出错啦');\n\t //加载完毕需要重置\n\t $.pullToRefreshDone('.pull-to-refresh-content');\n\t });\n\t });\n\t\n\t //需要初始化一下,不然监听不到infinite事件\n\t $.init();\n\t\n\t setTimeout(function () {\n\t _this.scrollTabBtn(_this.id);\n\t }, 3e2);\n\t },\n\t data: function data() {\n\t return _value2.default;\n\t },\n\t methods: {\n\t goCookbook: function goCookbook(id) {\n\t this.$router.go('/cookbook/' + id);\n\t this.scrollTabBtn(id);\n\t },\n\t goCookbookDetail: function goCookbookDetail(id) {\n\t this.$router.go('/cookbookDetail/' + id);\n\t },\n\t goBack: function goBack() {\n\t this.$router.go('/cookbook/1');\n\t },\n\t goRoute: function goRoute(route) {\n\t //$.closePanel();\n\t $('body').removeClass('with-panel-left-reveal');\n\t //setTimeout(()=>{\n\t this.$router.go(route);\n\t //},5e2)\n\t },\n\t openPanel: function openPanel(panel_id) {\n\t $.openPanel('#' + panel_id);\n\t },\n\t scrollTabBtn: function scrollTabBtn(id) {\n\t var class_id = id;\n\t var $el = $('.button.class_' + class_id);\n\t var el = $el[0];\n\t if ($el.length == 0) {\n\t return;\n\t }\n\t\n\t var scrollLeft = el.offsetLeft - el.parentNode.offsetLeft;\n\t var scrollLeft_active = $('#class_tab') ? $('#class_tab')[0].scrollLeft : 0;\n\t\n\t if ($.device.android && $.device.isWeixin) {\n\t $('#class_tab').scrollLeft(scrollLeft - 50);\n\t } else {\n\t if (scrollLeft_active - scrollLeft < 0) {\n\t var _loop = function _loop(i) {\n\t (function () {\n\t setTimeout(function () {\n\t $('#class_tab').scrollLeft(Math.abs(scrollLeft_active + (scrollLeft - scrollLeft_active) / 50 * i) - i);\n\t }, 5 * i);\n\t })();\n\t };\n\t\n\t for (var i = 0; i < 50; i++) {\n\t _loop(i);\n\t }\n\t } else {\n\t var _loop2 = function _loop2(_i) {\n\t (function () {\n\t setTimeout(function () {\n\t $('#class_tab').scrollLeft(scrollLeft - (scrollLeft_active - scrollLeft) / 50 * _i - _i);\n\t }, 5 * _i);\n\t })();\n\t };\n\t\n\t for (var _i = 0; _i < 50; _i++) {\n\t _loop2(_i);\n\t }\n\t }\n\t }\n\t }\n\t },\n\t computed: {\n\t isShowLoad: function isShowLoad() {\n\t return !this.maxItems || !this.cookbookItems || this.maxItems > this.cookbookItems.length;\n\t }\n\t },\n\t route: {\n\t data: function data(transition) {\n\t var _this2 = this;\n\t\n\t this.title = '菜谱列表';\n\t\n\t if (typeof localStorage.getItem('cookbook_classes') == 'string') {\n\t this.cookbookClasses = JSON.parse(localStorage.getItem('cookbook_classes'));\n\t }\n\t //如果是服务端渲染的,应该设置全局变量,那么客户端就不用异步请求数据了\n\t if (window.cm_cookbookItems && window.cm_cookbookItems.id == transition.to.params.id) {\n\t console.log('应该只进入一次');\n\t this.$data = window.cm_cookbookItems;\n\t $.localStorage.setItem('cookbook_list_' + transition.to.params.id, {\n\t id: transition.to.params.id,\n\t updateTime: new Date().getTime(),\n\t page: 2,\n\t cookbookItems: window.cm_cookbookItems.cookbookItems,\n\t maxItems: window.cm_cookbookItems.maxItems\n\t });\n\t window.cm_cookbookItems = null;\n\t }\n\t var cookbook = $.localStorage.getItem('cookbook_list_' + transition.to.params.id);\n\t //缓存里面还有数据\n\t if (this.id == transition.to.params.id) {\n\t setTimeout(function () {\n\t $('.content').scrollTop(_this2.scrollTop);\n\t });\n\t } else if (cookbook && cookbook.cookbookItems.length >= 10) {\n\t //本地如果有数据的话拿本地数据\n\t this.id = cookbook.id;\n\t this.page = cookbook.page;\n\t this.cookbookItems = cookbook.cookbookItems;\n\t this.maxItems = cookbook.maxItems;\n\t this.updateTime = cookbook.updateTime;\n\t } else {\n\t (function () {\n\t $.showIndicator();\n\t //没有本地数据再去请求数据\n\t var qa_id = transition.to.params.id;\n\t\n\t var promise = [_cookbook2.default.getCookbookList(qa_id, 1)];\n\t if (typeof localStorage.getItem('cookbook_classes') != 'string') {\n\t promise.push(_cookbook2.default.getCookbookClass());\n\t }\n\t\n\t _q2.default.all(promise).then(function (data) {\n\t var data0 = data[0];\n\t if (data0.status) {\n\t _this2.id = qa_id;\n\t _this2.page = 2;\n\t _this2.cookbookItems = data0.tngou;\n\t _this2.maxItems = data0.total;\n\t } else {\n\t transition.abort();\n\t }\n\t if (data.length > 1) {\n\t _this2.cookbookClasses = data[1].tngou;\n\t }\n\t }).catch(function (e) {\n\t $.toast(\"操作失败\");\n\t }).finally(function () {\n\t $.hideIndicator();\n\t });\n\t\n\t transition.next();\n\t })();\n\t }\n\t },\n\t canReuse: true, //可以被重用,跳转到其他cookbook/? 页面时触发. 设置为True跳转失败会无限跳转\n\t activate: function activate(transition) {\n\t var _this3 = this;\n\t\n\t if (window.cm_cookbookItems) {\n\t this.cookbookClasses = window.cm_cookbookItems.cookbookClasses;\n\t }\n\t if (!this.cookbookClasses.length > 0) {\n\t _cookbook2.default.getCookbookClass().then(function (data) {\n\t if (data.length > 0) {\n\t _this3.cookbookClasses = data.tngou;\n\t }\n\t });\n\t }\n\t transition.next();\n\t },\n\t deactivate: function deactivate(transition) {\n\t transition.next();\n\t }\n\t }\n\t});\n\t\n\texports.default = Index;\n\n/***/ },\n/* 8 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \"
\\n \\n
\\n

菜谱demo

\\n
\\n\\n \\n \\n\\n\\n
\\n \\n
\\n
\\n
\\n
{{updateTime | time-diff}}前更新过
\\n
\\n\\n
\\n \\n
\\n
\\n
\\n
\\n
    \\n
  • \\n
    \\n \\n
    \\n
    \\n
    \\n
    {{item.name}}
    \\n
    \\n
    {{item.food}}
    \\n
    \\n
  • \\n
\\n
\\n
\\n
\\n \\n
\\n
\\n
\\n
\\n
\\n
\\n\\n
\"\n\n/***/ },\n/* 9 */\n/***/ function(module, exports) {\n\n\t// removed by extract-text-webpack-plugin\n\n/***/ },\n/* 10 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\tvar value = {\n\t cookbookClasses: [],\n\t id: 0,\n\t page: 1,\n\t title: '菜谱列表',\n\t cookbookItems: [],\n\t maxItems: -1,\n\t updateTime: '',\n\t valOptions: []\n\t};\n\t\n\texports.default = value;\n\n/***/ },\n/* 11 */,\n/* 12 */,\n/* 13 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _q = __webpack_require__(11);\n\t\n\tvar _q2 = _interopRequireDefault(_q);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction getCookbookList(id, page) {\n\t return _q2.default.Promise(function (_success, _error) {\n\t $.ajax({\n\t type: 'GET',\n\t url: 'http://apis.baidu.com/tngou/cook/list',\n\t data: {\n\t id: id,\n\t page: page\n\t },\n\t headers: {\n\t apikey: 'a369f43a6392605426433831e10765ec'\n\t },\n\t success: function success(response) {\n\t if (response.status) {\n\t //拿第一页的时候保存到本地\n\t if (page == 1) {\n\t localStorage.setItem('cookbook_list_' + id, JSON.stringify({\n\t id: id,\n\t updateTime: new Date().getTime(),\n\t page: 2,\n\t cookbookItems: response.tngou,\n\t maxItems: response.total\n\t }));\n\t } else {\n\t var oldValue = JSON.parse(localStorage.getItem('cookbook_list_' + id));\n\t for (var i = 0; i < response.tngou.length; i++) {\n\t oldValue.cookbookItems.push(response.tngou[i]);\n\t }\n\t oldValue.page = ++page;\n\t oldValue.maxItems = response.total;\n\t localStorage.setItem('cookbook_list_' + id, JSON.stringify(oldValue));\n\t }\n\t _success(response);\n\t } else {\n\t _error('请求失败');\n\t }\n\t },\n\t error: function error(xhr) {\n\t _error('请求失败');\n\t }\n\t });\n\t });\n\t}\n\t\n\tfunction getCookbookClass() {\n\t\n\t return _q2.default.Promise(function (_success2, _error2) {\n\t\n\t var classes = $.localStorage.getItem('cookbook_classes');\n\t if (classes) {\n\t _success2(classes);\n\t } else {\n\t $.ajax({\n\t type: 'GET',\n\t url: 'http://apis.baidu.com/tngou/cook/classify',\n\t data: {\n\t id: 0\n\t },\n\t headers: {\n\t apikey: 'a369f43a6392605426433831e10765ec'\n\t },\n\t success: function success(response) {\n\t if (response.status) {\n\t localStorage.setItem('cookbook_classes', JSON.stringify(response.tngou));\n\t _success2(response);\n\t } else {\n\t _error2('请求失败!');\n\t }\n\t },\n\t error: function error(xhr, errorType) {\n\t _error2('请求失败');\n\t }\n\t });\n\t }\n\t });\n\t}\n\t\n\tfunction getCookbookDetail(id) {\n\t return _q2.default.Promise(function (_success3, _error3) {\n\t $.ajax({\n\t type: 'GET',\n\t url: 'http://apis.baidu.com/tngou/cook/show',\n\t data: {\n\t id: id\n\t },\n\t headers: {\n\t apikey: 'a369f43a6392605426433831e10765ec'\n\t },\n\t success: function success(response) {\n\t if (response.status) {\n\t _success3(response);\n\t } else {\n\t _error3('请求失败');\n\t }\n\t },\n\t error: function error(xhr, errorType) {\n\t _error3('请求失败');\n\t }\n\t });\n\t });\n\t}\n\tvar cookbookService = {\n\t getCookbookList: getCookbookList,\n\t getCookbookClass: getCookbookClass,\n\t getCookbookDetail: getCookbookDetail\n\t};\n\t\n\texports.default = cookbookService;\n\n/***/ }\n]);\n\n\n/** WEBPACK FOOTER **\n ** 1.0ce212e3.js\n **/","'use strict';\nimport Vue from 'vue'\nimport Tpl from './template.html'\nimport './style.css'\nimport value from './value'\nimport Q from 'q'\nimport cookbookService from '../../service/cookbook.service'\n\nlet Index = Vue.extend({\n //replace : true, //必须注释掉 不然动画失效\n template : Tpl,\n ready : function(){ //做浏览器判断 和 兼容\n let loading = false;\n //$('#class_tab').attr('data-offset',$('header.bar.bar-nav')[0].offsetHeight-1)\n //绑定无限滚动事件\n $('.infinite-scroll-bottom').on('infinite',()=>{\n if(loading){ return; }\n loading = true;\n\n cookbookService.getCookbookList(this.id,this.page).then((data)=>{\n this.page += 1;\n for(let i=0;i<=data.tngou.length;i++){\n if(data.tngou[i]){\n this.cookbookItems.push(data.tngou[i])\n }\n }\n if(this.maxItems == -1){\n this.maxItems = data.total;\n }\n loading = false;\n }).catch(()=>{\n console.error('出错啦');\n }).finally(()=>{\n if(!this.isShowLoad){\n //解绑无限加载事件\n $.detachInfiniteScroll($('.infinite-scroll'));\n // 删除加载提示符\n $('.infinite-scroll-preloader').remove();\n }\n })\n\n });\n\n //绑定下拉刷新事件\n $('.pull-to-refresh-content').on('refresh',()=>{\n if(loading){ return; }\n loading = true;\n\n this.page = 1;\n cookbookService.getCookbookList(this.id,this.page).then((data)=>{\n this.page += 1;\n this.updateTime = new Date().getTime();\n this.cookbookItems = data.tngou;\n if(this.maxItems > 0){\n this.maxItems = data.total;\n }\n loading = false;\n // 加载完毕需要重置\n $.pullToRefreshDone('.pull-to-refresh-content');\n }).catch(()=>{\n console.error('出错啦');\n //加载完毕需要重置\n $.pullToRefreshDone('.pull-to-refresh-content');\n })\n });\n\n //需要初始化一下,不然监听不到infinite事件\n $.init();\n \n setTimeout(()=>{\n this.scrollTabBtn(this.id);\n },3e2);\n\n },\n data : ()=>{\n return value\n },\n methods: {\n goCookbook(id){\n this.$router.go('/cookbook/'+id);\n this.scrollTabBtn(id);\n },\n goCookbookDetail(id){\n this.$router.go('/cookbookDetail/'+id);\n },\n goBack(){\n this.$router.go('/cookbook/1');\n },\n goRoute(route){\n //$.closePanel();\n $('body').removeClass('with-panel-left-reveal');\n //setTimeout(()=>{\n this.$router.go(route);\n //},5e2)\n },\n openPanel(panel_id){\n $.openPanel('#'+panel_id)\n },\n scrollTabBtn(id){\n let class_id = id;\n let $el = $('.button.class_'+class_id);\n let el = $el[0];\n if($el.length == 0 ){\n return;\n }\n\n let scrollLeft = el.offsetLeft - el.parentNode.offsetLeft;\n let scrollLeft_active = $('#class_tab')?$('#class_tab')[0].scrollLeft:0;\n\n\n if($.device.android && $.device.isWeixin){\n $('#class_tab').scrollLeft(scrollLeft-50);\n }else{\n if(scrollLeft_active - scrollLeft < 0){\n for(let i=0;i<50;i++){\n (function(){\n setTimeout(()=>{\n $('#class_tab').scrollLeft(Math.abs(scrollLeft_active+(scrollLeft-scrollLeft_active)/50*i)-i);\n },5*i)\n })()\n }\n }else{\n for(let i=0;i<50;i++){\n (function(){\n setTimeout(()=>{\n $('#class_tab').scrollLeft(scrollLeft-(scrollLeft_active-scrollLeft)/50*i-i);\n },5*i)\n })()\n }\n }\n }\n\n }\n },\n computed : {\n isShowLoad : function(){\n return (!this.maxItems || !this.cookbookItems || this.maxItems > this.cookbookItems.length);\n }\n },\n route : {\n data : function(transition){\n this.title = '菜谱列表';\n\n if(typeof localStorage.getItem('cookbook_classes') == 'string'){\n this.cookbookClasses = JSON.parse(localStorage.getItem('cookbook_classes'));\n }\n //如果是服务端渲染的,应该设置全局变量,那么客户端就不用异步请求数据了\n if(window.cm_cookbookItems && window.cm_cookbookItems.id == transition.to.params.id){\n console.log('应该只进入一次');\n this.$data = window.cm_cookbookItems;\n $.localStorage.setItem('cookbook_list_'+transition.to.params.id,{\n id : transition.to.params.id,\n updateTime : new Date().getTime(),\n page : 2,\n cookbookItems : window.cm_cookbookItems.cookbookItems,\n maxItems : window.cm_cookbookItems.maxItems\n });\n window.cm_cookbookItems = null;\n }\n let cookbook = $.localStorage.getItem('cookbook_list_'+transition.to.params.id);\n //缓存里面还有数据\n if(this.id == transition.to.params.id){\n setTimeout(()=>{\n $('.content').scrollTop(this.scrollTop);\n });\n }\n else if(cookbook && cookbook.cookbookItems.length >= 10){\n //本地如果有数据的话拿本地数据\n this.id = cookbook.id;\n this.page = cookbook.page;\n this.cookbookItems = cookbook.cookbookItems;\n this.maxItems = cookbook.maxItems;\n this.updateTime = cookbook.updateTime;\n\n }\n else{\n $.showIndicator()\n //没有本地数据再去请求数据\n let qa_id = transition.to.params.id;\n\n let promise = [\n cookbookService.getCookbookList(qa_id,1)\n ];\n if(typeof localStorage.getItem('cookbook_classes') != 'string'){\n promise.push(cookbookService.getCookbookClass());\n }\n\n Q.all(promise).then((data)=>{\n let data0 = data[0];\n if(data0.status){\n this.id = qa_id;\n this.page = 2;\n this.cookbookItems = data0.tngou;\n this.maxItems = data0.total;\n }else{\n transition.abort();\n }\n if(data.length > 1){\n this.cookbookClasses = data[1].tngou;\n }\n }).catch((e)=>{\n $.toast(\"操作失败\");\n }).finally(()=>{\n $.hideIndicator()\n })\n \n transition.next();\n }\n },\n canReuse: true, //可以被重用,跳转到其他cookbook/? 页面时触发. 设置为True跳转失败会无限跳转\n activate : function(transition){\n if(window.cm_cookbookItems){\n this.cookbookClasses = window.cm_cookbookItems.cookbookClasses;\n }\n if(!this.cookbookClasses.length > 0){\n cookbookService.getCookbookClass().then((data)=>{\n if(data.length > 0){\n this.cookbookClasses = data.tngou;\n }\n })\n }\n transition.next();\n },\n deactivate: function(transition){\n transition.next();\n }\n }\n})\n\nexport default Index\n\n\n/** WEBPACK FOOTER **\n ** ./client/com.chezhil.cookbook/states/cookbook-list/route.js\n **/","module.exports = \"
\\n \\n
\\n

菜谱demo

\\n
\\n\\n \\n \\n\\n\\n
\\n \\n
\\n
\\n
\\n
{{updateTime | time-diff}}前更新过
\\n
\\n\\n
\\n \\n
\\n
\\n
\\n
\\n
    \\n
  • \\n
    \\n \\n
    \\n
    \\n
    \\n
    {{item.name}}
    \\n
    \\n
    {{item.food}}
    \\n
    \\n
  • \\n
\\n
\\n
\\n
\\n \\n
\\n
\\n
\\n
\\n
\\n
\\n\\n
\"\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./client/com.chezhil.cookbook/states/cookbook-list/template.html\n ** module id = 8\n ** module chunks = 1\n **/","'use strict';\nlet value = {\n cookbookClasses : [],\n id : 0,\n page : 1,\n title : '菜谱列表',\n cookbookItems : [],\n maxItems : -1,\n updateTime : '',\n valOptions : [],\n}\n\nexport default value;\n\n\n/** WEBPACK FOOTER **\n ** ./client/com.chezhil.cookbook/states/cookbook-list/value.js\n **/","'use strict';\nimport Q from 'q'\n\nfunction getCookbookList(id,page){\n return Q.Promise((success,error)=>{\n $.ajax({\n type : 'GET',\n url : 'http://apis.baidu.com/tngou/cook/list',\n data : {\n id : id ,\n page : page\n },\n headers : {\n apikey : 'a369f43a6392605426433831e10765ec'\n },\n success : function(response){\n if(response.status){\n //拿第一页的时候保存到本地\n if(page == 1){\n localStorage.setItem('cookbook_list_'+id,JSON.stringify({\n id : id,\n updateTime : new Date().getTime(),\n page : 2,\n cookbookItems : response.tngou,\n maxItems : response.total\n }));\n }else{\n let oldValue = JSON.parse(localStorage.getItem('cookbook_list_'+id));\n for(let i=0;i{\n \n let classes = $.localStorage.getItem('cookbook_classes')\n if(classes){\n success(classes);\n }else{\n $.ajax({\n type : 'GET',\n url : 'http://apis.baidu.com/tngou/cook/classify',\n data : {\n id : 0\n },\n headers : {\n apikey : 'a369f43a6392605426433831e10765ec'\n },\n success : function(response){\n if(response.status){\n localStorage.setItem('cookbook_classes',JSON.stringify(response.tngou));\n success(response)\n }else{\n error('请求失败!')\n }\n },\n error : function(xhr, errorType){\n error('请求失败')\n }\n });\n\n }\n \n })\n}\n\nfunction getCookbookDetail(id){\n return Q.Promise((success,error)=>{\n $.ajax({\n type : 'GET',\n url : 'http://apis.baidu.com/tngou/cook/show',\n data : {\n id : id\n },\n headers : {\n apikey : 'a369f43a6392605426433831e10765ec'\n },\n success : function(response){\n if(response.status){\n success(response)\n }else{\n error('请求失败')\n }\n },\n error : function(xhr, errorType){\n error('请求失败')\n }\n });\n })\n}\nlet cookbookService = {\n getCookbookList : getCookbookList,\n getCookbookClass : getCookbookClass,\n getCookbookDetail: getCookbookDetail\n};\n\nexport default cookbookService;\n\n\n/** WEBPACK FOOTER **\n ** ./client/com.chezhil.cookbook/service/cookbook.service.js\n **/"],"sourceRoot":""} --------------------------------------------------------------------------------