├── .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 |
6 |
7 |
8 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
{{updateTime | time-diff}}前更新过
21 |
22 |
23 |
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\n \n \n\n\n
\n \n
\n
\n
\n
{{updateTime | time-diff}}前更新过
\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\\n \\n
\\n\\n\\n
\\n \\n
\\n
\\n
\\n
{{updateTime | time-diff}}前更新过
\\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\\n \\n
\\n\\n\\n
\\n \\n
\\n
\\n
\\n
{{updateTime | time-diff}}前更新过
\\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":""}
--------------------------------------------------------------------------------